《C语言程序设计》教案32.docx
- 文档编号:18205812
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:19
- 大小:60.34KB
《C语言程序设计》教案32.docx
《《C语言程序设计》教案32.docx》由会员分享,可在线阅读,更多相关《《C语言程序设计》教案32.docx(19页珍藏版)》请在冰点文库上搜索。
《C语言程序设计》教案32
C语言程序设计教案
编号:
C程序设计3-2制订日期:
2011-3-2
课程名称
第3章数据类型、运算符
(2)
授课形式
讲授
授课班级
2010级软件工程
授课时数
2学时
授课日期
2011.02.00-02.00 第2 周
授课地点
公1#512、#513
教学目标与要求:
1.掌握算术运算符、关系与逻辑运算符
2.掌握赋值语句(重点)
教学重点、难点:
1.变量自加(难点);
2.交换二个变量值的算法(重点)
教学准备:
1.采用多媒体教学。
2.教学参考资料:
C++语言程序设计与实践——张思民著清华大学出版社
3.制作多媒体课件,讲稿。
教学过程与时间分配
备注
一.复习上次课内容
1、简单数据类型
2、变量声明、常量的定义。
二.授课内容
3.3表达式和运算符
3.3.1表达式与运算符
表达式是由运算符、操作数和方法调用按照语言的语法构造而成的符号序列。
表达式可用于计算一个公式、为变量赋值以及帮助控制程序执行流程。
只有一个运算对象的运算符称为一元运算符。
例如++a是一个一元运算符,它是对运算对象a自增加1。
需要两个运算对象的运算符号称为二元运算符。
比如赋值号(=)就是一个二元运算符,它将右边的运算对象赋给左边的运算对象。
可以将运算符分成以下几类:
(1)算术运算符;
(2)关系和条件运算符;
(3)移位和逻辑运算符;
(4)赋值运算符;
(5)其他的运算符。
下面逐一进行介绍。
3.3.2算术运算符
C++语言支持所有的浮点型和整型数值进行各种算术运算。
这些运算符为+(加)、-(减)、*(乘)、/(除)以及%(取模)。
算术运算符的使用基本上与数学中的加减乘除一样,也是先乘除后加减,必要时加上括号表示运算的先后顺序。
例如:
1+2*3
(1+2)*3
编译器在读取程序代码时是由左往右读取的,而初学者往往容易犯一个错误,例如
(1+2+3)/4。
由于在数学运算上习惯将分子写在上面,而分母写在下面的方式,使得初学者往往将之写成了:
1+2+3/4
这个程序事实上进行的是这样的运算:
1+2+(3/4)。
为了避免这样的错误,必须给表达式加上括号。
例如:
(double)(1+2+3)/4
注意:
在上面的程序代码中使用了double限定类型转换,如果不加上这个限定,程序的输出会是1而不是1.5,这是因为在这个C程序中,1、2、3、4这四个数值都是整数,程序运算(1+2+3)后的结果还是整数类型,若此时除以整数4,会自动去除小数点之后的数字再进行输出,而加上double限定,表示要将(1+2+3)运算后的值转换为double数据类型,这样再除以4,小数点之后的数字才被保留下来。
同样地,看看下面这段程序会得出什么结果:
intx=10;
printf(“x/3=%d\n”,x/3);
答案不是3.3333而是3,小数点之后的部分被自动消去了,这是因为x是整数,而除数3也是整数,运算出来的程序被自动转换为整数了。
为了解决这个问题,可以使用下面的方法:
intx=10;
printf(“x/3=%f\n”,x/3.0);//第一种方式,使用浮点数
printf(“x/3=%d\f”,(double)x/3);//第二种方式,“限定类型转换”
上面这个程序片段示范了两种解决方式:
如果表达式中有一个浮点数,则程序就会先转换使用浮点数来运算,这是第一段语句所使用的方式;第二种方式称为“限定类型转换”,您使用double告诉程序先将x的值转换为double,然后再进行除法运算,所以得到的结果会是正确的3.3333。
类型转换的限定关键词就是定义变量时所使用的int、float等关键词。
%运算符也称作取余运算符,它要求操作数必须是整数或字符型数值。
“x%y”的计算结果是x被y除的余数。
例如:
18%6,18被6除,余数为0,所以其结果是0;
15%6,15被6除,余数为3,所以其结果是3。
下面的一个程序定义了两个整型数和两个双精度的浮点数,并且使用5种算术运算符来完成不同的运算操作。
【例3-9】运算符示例。
源程序如下:
1 #include
2
3voidmain()
4{
注释语句
5//定义几个变量并赋值
6inta=41;
定义二个整型变量a,b和二个双精度实数变量x,y
7intb=21;
8doublex=6.4;
9doubley=3.22;
10printf("变量数值:
\n");
11printf("a=%d\tb=%d,\tx=%f,\ty=%f\n",a,b,x,y);
12//加法
13printf("加:
\n");
14printf("a+b=%d\tx+y=%f\n",a+b,x+y);
15}
将程序保存为t3_9.c。
程序的运行结果如下:
变量数值:
a=41b=21x=6.400000y=3.220000
加:
a+b=62x+y=9.620000
++(自加)、――(自减)是C++语言中常用的两个运算符。
不管是++还是--都可能出现在运算对象的前面(前置形式)或者后面(后置形式),但它们的作用是不一样的。
前置形式为:
(++操作数)或(--操作数),它实现的是在加/减之后才计算运算对象的数值;而后置形式为:
(操作数++)或(操作数--),它实现的是在加/减之前就计算运算对象的数值。
表3-4总结了自加/自减运算符。
表3-4自增/自减运算符
运算符
用法
描述
++
(操作数++)
自加1;操作数在自加之前先进行计算
++
(++操作数)
自加1;操作数在自加之后再进行计算
--
(操作数--)
自减1;操作数在自减之前先进行计算
--
(--操作数)
自减1;操作数在自减之后再进行计算
例如:
(1)intx=2;
X首先自加1,然后再乘以5,即3*5
inty=(++x)*5;
执行结果:
x=3,y=15
(2)intx=2;
X首先进行乘以5的运算,即2*5后,x再自加1
inty=(x++)*5;
执行结果:
x=3,y=10
注意,在书写运算表达式时,有时采用简写方式:
x+=y;等效于:
x=x+y;
x*=y;等效于:
x=x*y;
3.3.3关系与逻辑运算符
关系运算符用于比较两个值并决定它们的关系,然后给出相应的取值。
在C++中,关系运算的条件成立时以true表示(其返回值为1),关系运算的条件不成立时以false表示(其返回值为0),比如“!
=”在两个运算对象不相等的情况下返回true。
表3-5列出了全部的关系运算符。
表3-5关系运算符
运算符
运算
用法
返回true的情况
>
大于
x1>x2
x1大于x2
>=
不小于
x1>=x2
x1大于或等于x2
<
小于
x1 x1小于x2 <= 不大于 x1<=x2 x1小于或等于x2 == 等于 x1==x2 x1等于x2 ! = 不等于 x1! =x2 x1不等于x2 比较运算在使用时有一个即使是程序设计老手也可能犯的错误,且不容易发现,也就是等于运算符==。 它由两个连续的等号=所组成,而不是一个等号,一个等号是赋值运算,这一点必须特别注意。 例如,若有两个变量x与y要比较是否相等,应该是写成x==y,而不是写成x=y,后者的作用是将y的值指定给x,而不是比较x与y是否相等。 C++语言中有三个逻辑运算符,它们是: &&(逻辑与)、 ||(逻辑或)、 ! (逻辑非) 下面是几个逻辑运算的例子: a&&b当a和b都为真时,a&&b为真。 a||b当a、b中有一个为真时,a||b为真。 ! a 当a为真时,! a为假,当a为假时,! a为真。 【例3-10】程序定义了三个整型数并且用关系运算符来比较它们。 源程序如下: 1 #include 2 3voidmain() 4{ 5//定义若干整型数 6inti=37; 定义三个整型变量i,j,k,并赋值 7intj=42; 8intk=42; 9printf("变量数值: \n"); 10printf("i=%d\n",i); 输出三个变量i,j,k的值 11printf("j=%d\n",j); 12printf("k=%d\n",k); 13//大于运算 14printf("大于: \n"); 15printf("i>j=%d",i>j);//结果为0,即false 大于关系 16printf("j>i=%d",j>i);//结果为1,即true 17printf("k>j=%d",k>j);//结果为0,即false 18//大于等于运算 19printf("大于等于: \n"); 20printf("i>=j=%d",i>=j);//结果为0,即false 不小于关系 21printf("j>=i=%d",j>=i);//结果为1,即true 22printf("k>=j=%d",k>=j);//结果为1,即true 23//小于运算 24printf("小于: \n"); 小于关系 25printf("i 26printf("j 27printf("k 28//小于等于运算 29printf("小于等于: \n"); 30printf("i<=j=%d",i<=j);//结果为1,即true 不大于关系 31printf("j<=i=%d",j<=i);//结果为0,即false 32printf("k<=j=%d",k<=j);//结果为0,即false 33//等于运算 34printf("等于: \n"); 等于关系 35printf("i==j=%d",i==j);//结果为0,即false 36printf("k==j=%d",k==j);//结果为1,即true 37//不等于运算 38printf("不等于: \n"); 不等于关系 39printf("i! =j=%d",i! =j);//结果为1,即true 40printf("k! =j=%d",k! =j);//结果为0,即false 41} 42} 将程序保存为t2_10.c。 程序运行时,其结果false的返回值为0,true的返回值为1。 程序的运行结果如下: 3.3.4位运算符 位运算符是对操作数以二进制位为单位进行的操作和运算,其结果均为整型量。 位运算符分为: 移位运算符和位逻辑运算符。 表3-6总结了C++中的位运算符。 表3-6移位和位逻辑运算符 运算符 运算 用法 运算规则 (设x=11010110,y=01011001,n=2) 运算结果 << 左移 x< 将x各比特位左移n位,右边补0 01011000 >> 右移 x>>n 将x各位右移n位,左边按符号补0或补1 11110101 >>> 无符号右移 x>>>n 将x右移n位(无符号的),左边补0 00110101 & 与 x&y 将x,y按位与操作 01010000 | 或 x|y 将x,y按位或操作 11011111 ^ 异或 x^y 将x,y按位异或操作 10001111 ~ 位反 ~x 将x各比特位按位取反 00101001 表3-6给出了C语言提供的四种运算符来对它们的运算对象执行按位操作。 1、左移运算 左移运算符“<<”将一个数的二进制位序列全部左移若干位,高位左移后溢出舍弃,不起作用,左移后右边原来低位则补0。 例如,a=00000011(十进制3),左移1位后为00000110(十进制3)。 运算过程如图3.2所示: 图3.2 左移1位运算 再如: a=00000011(十进制3),左移4位后为00110000(十进制48)。 运算过程如图2.3所示: 图3.3a<<4的运算过程 2、右移运算 右移运算符“>>”将一个数的二进制位序列全部右移若干位,移出右端的低位被舍弃,最高位则移入原来高位的值。 例如: a=00110111,则由于最高位是0,因此, a>>2=00001101 b=11010011,则由于最高位是1,因此, b>>2=11110100 当移位运算符通过对运算对象左移位或者右移位来对数据执行位操作时,一个数每左移1位,相当于这个数乘以2,每右移1位,相当于除以2。 例如,设x=8, 则 x<<1表示左移1位,相当于作x×21的运算,其结果为16。 x<<2表示左移2位,相当于作x×22的运算,其结果为32。 而 x>>1表示右移1位,相当于作x÷21的运算,其结果为4, x>>2表示右移2位,相当于作x÷22的运算,其结果为2。 一般地: x< x>>n表示右移n位,相当于作x÷2n的运算。 3、无符号右移 逻辑右移运算符“>>>”将一个数的二进制位右移若干位,右端移出的低位被舍弃,最高位也是补0,这点与“>>”不同。 4、按位&运算 当运算对象为数字的时候,“&”运算符为每一个运算对象的每位执行按位与功能。 它在两个运算对象的对应位为1时结果才为1,反之结果都为0。 即: 0&0=0 、0&1=0 、1&0=0 、1&1=1 假如要对数13和12作按位与操作,如: 13&12。 运算的结果为12,因为12的二进制为1100,13的二进制为1101,具体运算过程如下所示: 1101//13的二进制 &1100//12的二进制 1100 //12的二进制 5、按位或运算 “|”运算符执行或操作。 当两个操作对象都是数字的时候,或操作只要有一个运算对象为1结果就为1。 即: 0|0=0 、0|1=1 、1|0=1 、1|1=1 例如: 9|5可写算式如下: 00001001 |00000101 00001101(十进制为13), 可见9|5=13。 6、按位异或运算 “^”运算符执行异或操作。 异或是指当运算对象不同时结果才为1,否则结果为0。 即: 0^0=0 、0^1=1 、1^0=1 、1^1=0 例如9^5可写成算式如下: 00001001 ^00000101 00001100(十进制为12)。 如果 c=a^b 那么 a=c^b 即 a=(a^b)^b 用同一个数b对数a进行二次异或运算的结果仍是数a。 7、求反运算 运算符号“~”是将运算对象的每一位取反,即如果原来的位是1则结果就为0,如果原来的位是0则结果为1。 例如,~9的运算为: ~(0000000000001001)结果为: 111111*********0。 【例3-11】程序给出了一个异或运算的应用示例。 源程序如下: 1 #include 2 3voidmain() 4{ 5//字符 6chara1='b',a2='o',a3='o',a4='k',b1,b2,b3,b4; 7//密鈅 8charpasswd='x'; 9//异或运算加密 a1,a2,a3,a4分别用passwd进行异或运算 10a1=(char)(a1^passwd);a2=(char)(a2^passwd); 11a3=(char)(a3^passwd);a4=(char)(a4^passwd); 12//再一次异或运算解密 进行二次异或运算,得到原值 13b1=(char)(a1^passwd);b2=(char)(a2^passwd); 14b3=(char)(a3^passwd);b4=(char)(a4^passwd); 15printf("加密后的密文: %c%c%c%c\n",a1,a2,a3,a4); 16printf("解密后得到原文: %c%c%c%c\n",b1,b2,b3,b4); 17} 将程序保存为t2_11.c。 程序运行结果为: 加密后的密文: 解密后得到原文: 3.4赋值语句 赋值语句是给变量提供数据的最简单形式,它是程序中使用最多的语句之一,几乎所有的程序都要用到它。 其一般格式为: 变量=表达式; 赋值语句的功能是把赋值号“=”右边表达式的值赋给左边的变量,它的意义与等号不同。 【例3-14】求一元二次方程2x2+8x+6的根。 根据求根公式x1,2= ,先对常量a、b、c赋值,然后再计算x1和x2,其源程序如下: 1#include 2#include 3 4voidmain() 5{ 给变量赋初值 6inta=2,b=8,c=6; 7doublex1,x2; 把表达式的计算结果赋值给变量 8x1=(-b+sqrt(b*b–4*a*c))/(2*a); 9x2=(-b-sqrt(b*b–4*a*c))/(2*a); 10printf("x1=%f\tx2=%f\n",x1,x2);; 11} 【例3-15】交换两个变量的值。 在编写程序时,有时需要把两个变量的值互换,交换值的运算需要用到一个中间变量。 例如,要将a与b的值互换,就可用下面这样一段程序: 设temp为中间变量 inta,b,temp; 第一步: 把a的值放到中间变量temp中 temp=a; 第二步: 把b的值放到变量a中,这时变量a中存放的是b的值 a=b; 第三步: 把temp中原a的值放到变量b中,这时变量b中得到的是原a的值 b=temp; 其中,temp是中间变量,它仅起过渡作用。 交换过程如图3.4所示。 图3.4a、b两数的交换 源程序如下: 1 #include 2 3main() 4{ 5inta=3,b=5,temp; 6temp=a; 交换a、b两变量的值 7a=b; 8b=temp; 9printf("a=%d\tb=%d\n",a,b); 10} 三.总结强调重要的知识点 熟练掌握表达式的表示方法 熟练掌握交换二个变量值的算法 四.课后作业 1、求出下列算术表达式的值: (1)x+a%3*(int)(x+y)%2/4设x=2.5,y=4.7,a=7 (2)(float)(a+b)/2-(int)x%(int)y设a=2,b=3,x=3.5,y=2.5 (3)‘a’+x%3+5/2–‘\24’设x=8 2、将下列数学表达式写成C程序中的算术表达式。 (1) (2) (3) (4) 3、设有变量说明: inta=3,b=2,c=1,求出下列表达式的值: (1)a>b (2)a<=b (3)a! =b(4)(a>b)==c (5)a–b==c 4、设a和b的值分别为6和7,指出分别运算下列表达式后a,b,c,d的值。 (1)c=d=a (2)b+=b (3)c=b/=a(4)d=(c=a/b+15) 5、设a,b,c的值分别为5,8,9,指出分别运算下列表达式后x和y的值。 (1)y=(a+b,b+c,c+a) (2)x=a,y=x+b 更新、补充、删 节 内 容 无 教学反思 授课教师: 张思民
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C语言程序设计 语言程序设计 教案 32