bokee.net

其他职业博客

正文 更多文章

1.1 数字的转换和存储——第五课

1.1.1          课前小结

到目前为止,我们学习的C语言知识有

(1)语言的三要素:语法、语义和语用

(2)六个数学运算符,包括五个双目运算符+ - * / %,一个单目运算符-

(3)六个比较运算符(关系运算符)==    !=    <    >    <=     >=

(4)简单赋值运算符= 复合赋值运算符 += -=  *=  /=  %=

(5)自增和自减运算符

课前练习一

(6)定义三种基本类型的变量:int char float

(7)使用四种文字常量:

      整型文字常量,又包括十进制、八进制、十六进制

浮点型文字常量

字符型文字常量

字符串文字常量

(8)标识符的语法和起名风格

(9)函数的声明和实现

(10)形参和实参

(11)函数和表达式的返回值、返回类型

(12)注释的语法和风格

课堂练习二 编译CircleArea_error.c文件,改正其中的编译错误。

(13)if语句的基本语法形式

if (判断条件)

   语句块;

(14)语句和语句块的概念

1.1.2          逻辑运算符

(1)  && 表示逻辑与,a && b只有ab均为真时才返回真,其他情况返回假。

(2)  || 叫逻辑或, a || b 只要ab有一个为真时即为真,只有ab都为假时才返回假

(3) ! 将逻辑结果取反,类似一元的-运算符。a为真时,!a为假. a为假时,!a为真。

课堂练习1 x=4, y=-2,分别求下列逻辑表达式的值,(假定真值为1,假值为0

   (x< 0) && (y >0 );  0

(x%y ==0) && ( (x+y) >0 )  1

(x<0) || ( y<0)  

(x>5 ) || ( y>0)

! (x>0)

! (y>0)

! (x%y == 0)

1.1.3          if语句的第二种形式

if (判断条件)

   语句块1;

else

   语句块2;

当条件成立时,执行语句块1,不成立时则执行语句块2

课堂练习二  编译relation4.c文件,并运行三次,分别用正数、0和负数做测试数据,查看程序的运行结果。体会ifelse的用法。

但是要注意,ifelse之间只能是一条语句或者用{}括起来的大括号,因此下面的代码是不合法的

1         if (x>0)

2            printf("x is greater than zero!");

3         x += 2;  /*多余的错误代码*/

4         else

5            printf("x is not greater than zero!"");

正确的做法:或者去掉第三行的x+=2, 或者用{}将第二行和第三行包围起来变成一个语句块。如下所示。

1         if (x>0)

2         {

3            printf("x is greater than zero!");

4            x += 2;  /*现在被包围在语句块中,可以编译通过了*/

5         }

6         else

7            printf("x is not greater than zero!"");

课堂练习三  编译relation5.c文件,并运行三次,分别用正数、0和负数做测试数据,查看程序的运行结果。体会语句块的用法。

1.1.4          数制的转换(一)——非十进制转换成十进制

课堂练习四 计算下列表达式的值

(1)103, 23, 82, 100, 80

(2)1*103+9*102+8*101+9*100

(3)1*82+2*81+5*80

(4)3*161+5*160

n进制的数字一般为0n-1,如十进制的数字为0-9,八进制为0-7,二进制为01。十六进制则有0-9和字母A-F组成。

对十六进制,10以上的数字用字母A-F表示,如下表

A  -    10

B  -    11

C  -    12

D  -    13

E  -    14

F  -    15

一般的记忆方法:记住两头的AF分别为1015,然后C=A+2= 12,E=F-1 = 14, D=F-2=13, B= A+1 = 11

设一个n进制数Am位。表达形式为

am-1 am-2 ...a1 a0

那么A = am-1* n m-1 + am-2* n m-2  + ...+ + a1* n+a0

其中n的幂叫做对应的权(power)

如对任何一个四位数,从右往左看,第一位的权是1,第二位的权是10,第三位的权是100,第四位的权是100

上面的公式用文字来说就是

各位的系数与该位的权的乘积之和。

课堂练习五,计算下列 C语言表达式对应的十进制数字,注意0打头的是八进制,0x打头的是十六进制

-25*10

010

0x10

-025

-0xF2

1.1.5          数制的转换(二)——十进制转换成非十进制

      这里就要用到前面说的/%运算,先看一个实际的例子,将1989转换为8进制,

分别计算1989/81989%8。可得

  1989/8=248,  1989%8 = 5;

 说明1989 = 248*8+5, 因此结果右边的第一个数(即类似于十进制的个位)就是5

由于上一步的商248依然大于8,继续计算 248/8, 248 %8,

  248 /8 = 31 ,248 %8=0,因此十位数字是0

第二步的商31依然大于8,继续计算 31/8, 31 %8,

  31 /8 = 3 ,31 %8=7,因此百位数字是7

第三步得到的商3已经小于8,把它作为千位数字,计算结束

所以最后所求的八进制数字是03705

上面的过程叫做辗转相除法。它其实就是下面的数学等式的变形

1989 = 248 *8+5 = (31*8+0)*8+5 = ((3*8+7)*8)+0)*8+5

= ((3*8+7)*8)*8+0*8+5 = ((3*8+7)*82+0*8+5 = 3*83+7*82+0*81+5*80

反过来看,八进制的03705转成10进制的数字1989,就是上面的等式的逆过程。

一般算法:将一个十进制的数A转换成n进制的数y,过程如下:

定义两个变量cr,分别存储商和余数。即

  c = A/n, r = A%n, 得到最右边的数y0 = r;

判断c是否小于y, 如果是的,则最左边的数为c,计算结束.否则执行。

如果c > y,将c作为新的A执行第一步。

将计算过程中得到的余数和最后一步的商从右到左写出,形式为

c...y1 y0

即为所求的结果。

可以很直观的看出,总有一步会得到c < y ,因此本算法总有一步会结束。

课堂练习六

将十进制的2008分别化成8 进制和16进制。
      
课堂练习七

将十进制的34转化成二进制。

 

 

1.1.6          八进制和十六进制的输出

   %o 将数字以八进制形式输出

   %x 将数字以十进制形式输出

课堂练习八

编写一个程序,将输入的十进制数字分别以八进制和十六进制输出。测试数据可以用刚才的2008,以及自己随便想的数字。

 

 

补充:

1、关于上标:

word里格式->字体->上标可以标上标。在程序里不能写上标,只能以*代替,10*10*10,或者你可以用power函数,一般我们和人文字交流时,用power(10,3)表示103次方,power是标准C库提供的一个程序。5*103次方,写成5*power(10,3)

 

2、关于分号:

只要是语句就一定要加分号,但是语句分很多种,目前只学习了声明语句和表达式语句,所有表达式如果想构成语句就必须加分号。一、像if里的判断条件只是一个表达式,后面不用加,因为语句还没结束,加了意思就变了,相当于什么也不做,因为判断只是第一步,此时语句还没结束。if (x>0) ;你加分号的话,相当于执行了;空语句,就什么也没做,继续往下执行了。if (x>0)
   printf("hello");
这么写是当x>0时才输出helloif (x>0) ;printf("hello");这么写不管你的x等于几,都会输出hello。因为;本身也是一条完整的语句,叫空语句,就是什么也不做,继续往下走。二、float CalArea(float radius) 这个是因为马上就是函数的实现了,如果是单独的函数声明,后面就必须加,看它下面是不是立刻接着函数体,以后如果分开,那么声明语句后面就得加。函数体里都是语句,每条语句都必须以;结尾,这个你写多了自然就知道了。目前表达式\声明\返回语句都是语句,都得加分号。大括号用来指明函数的边界,它本身不是语句了,大括号里面的才是一行行语句,每行语句要以;结束。比如我有两个文件fun.hfun.p
fun.h
的内容如下
int f();   /*
这里的单独的函数声明,必须以;结尾*/
int g();   /*
这里也是单独的函数声明,必须以;结尾*/

fun.c文件的内容如下
int f()
{
  return 0;
}

int g()
{
  return 0;
}

当函数的声明和实现分开时,声明语句就必须以;结尾。实际上我现在教给你们的都是函数的实现,声明了一个函数g,返回类型是int

 

3、函数:和变量声明类似,都是先说明类型,然后起名字,然后是()和形参列表。

 

4、整数:大于0的整数。int x;   x>0;

   偶数:能被2整除的整数。 如果 x %2 == 0x为偶数。

   奇数:不能被2整除的整数。 x%2==1的就是奇数(这个有疑问:如果X是负数呢?)

 

5&&是并且的意思;||是或者的意思。

 

6、要求奇偶性不同时输出yes,否则输出no

   int x;

   if ((x%2==0 && y%2==1) || (x%2==1 && y%2==0))

   if (x%2 != y%2)

   注意:两种写法表达的是一个意思!——xy奇偶性不同。

   (x%2 ==0)&&(y%2==0)表示xy同为偶数。

 

分享到:

上一篇:C代码模版

下一篇:1.1 数字的转换和存储——第六课