C语言程序设计课件完整.ppt

上传人:ni****g 文档编号:571985814 上传时间:2024-08-12 格式:PPT 页数:175 大小:2.29MB
返回 下载 相关 举报
C语言程序设计课件完整.ppt_第1页
第1页 / 共175页
C语言程序设计课件完整.ppt_第2页
第2页 / 共175页
C语言程序设计课件完整.ppt_第3页
第3页 / 共175页
C语言程序设计课件完整.ppt_第4页
第4页 / 共175页
C语言程序设计课件完整.ppt_第5页
第5页 / 共175页
点击查看更多>>
资源描述

《C语言程序设计课件完整.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计课件完整.ppt(175页珍藏版)》请在金锄头文库上搜索。

1、C语言程序设计主讲人:汪洋主讲人:汪洋第一章 C语言概述& C语言的发展与特点& C语言的基本程序结构& C语言程序的开发过程& C语言的基本词法& 算法1.1 C语言出现的历史背景l汇编语言依赖于计算机硬件,程序的可读性和可移植性差;l一般高级语言难以实现汇编语言的某些功能如对内存地址的操作、位操作等。1.2 C语言的发展史l1960年 ALGOL 60;l1963年 英国剑桥大学提出CPL语言;l1967年 Matin Richards提出BCPL语言;l1970年 Ken Thompson提出B语言;l1972-1973 Dennis.M.Ritchie提出C语言;lBrian W.Ke

2、rnighan 和D.M.Ritchie介绍标准C;l1987年美国国家标准化协会提出ANSI C。1.3 C语言的特点l简洁、紧凑,使用方便、灵活;l允许直接访问地址,能进行位操作;l运算符丰富;l数据类型丰富;l结构化程序语言,便于实现程序的模块化;l程序执行效率高,可移植性好。1.4 C语言的基本程序结构lC程序是由函数构成的,每个C程序有且只有一个主函数(main),可包含若干其他函数;l每个函数由首部与函数体组成; 首部包括函数类型、函数名、函数参数(形参)、参数类型, int max(int x,int y) 函数体包括声明部分和执行部分。lmain函数位置任意,但总是从main函

3、数开始执行,在main函数中结束;lC程序书写自由,每个语句后需加一个分号;l主函数可调用任何非主函数,非主函数之间可互相调用,但不能调用主函数;lC语言本身没有输入输出语句;l用/*/进行注释。1.5 C语言程序的开发过程l编辑l编译l链接 计算机只能识别和执行由0和1组成的二进制的指令,为了使计算机能执行高级语言源程序,必须先用“编译程序”把源程序翻译成二进制形式的“目标程序”,然后将该目标程序与系统的函数库和其他目标程序连接成为可执行的目标程序。1.6 C语言的基本词法l字符集:包括大小写英文字母52个、数字10个、键盘符号33个、转义字符。l标识符:是用户自定义的一组字符序列,用来表示

4、程序中需要辨认的对象名称,如符号常量、变量、数组、函数。 规定:n 标识符是由字母或下划线开头的字母、数字、下划线组成的一串符号,最长不能超过32个字符;n大小写字母有区别,大写字母只用来定义宏名,其他都采用小写字母表示。l保留字:32个,有特殊含义,主要用于构成语句,进行存储类型和数据类型的定义,不允许用户作为自定义标识符使用;l词类:常量、变量、运算符、函数、表达示、保留字;l语句:完成特定的操作,语句的有机组合序列完成指定的功能;语句的种类l赋值语句;l函数调用语句;l表达式语句;l流程控制语句;l复合语句;l空语句;1.7 算法著名计算机科学家沃思提出公式:程序=数据结构+算法v数据结

5、构:对数据的描述即指定数据的类型和数据的组织形式;v算法:对操作的描述即操作步骤。1.7.1 简单算法举例判定2000-2500年中的每一年是否闰年。设定y为被检测的年份。算法如下:lS1:2000=ylS2:若y不能被4整除,则输出y“不是闰年”,然后转至S6lS3:若y能被4整除,不能被100整除,则输出y“是闰年”,然后转至S6lS4:若y能被100整除,又能被400整除,输出y“是闰年”;否则输出y“不是闰年”,然后转至S6lS5:输出y“不是闰年”lS6:y+1=ylS7:当y2500,算法停止;1.7.2 算法的特点l有穷性;l确定性;l有零个或多个输入;l有一个或多个输出;l有效

6、性1.7.3 算法的表示l用流程图表示算法;l用伪代码表示算法;l用计算机语言表示算法。第二章 C语言的数据类型、运算符与表达式& C语言的数据类型;& C语言的运算符与表达式;2.1 C语言的数据类型数据类型数据类型基本类型基本类型构造类型构造类型指针类型指针类型空类型空类型(void)整型整型 (int)字符型字符型(char)实型(浮点型)实型(浮点型)数组类型数组类型结构体类型结构体类型(struct)共用体类型(联合类型)共用体类型(联合类型)(union)枚举类型枚举类型单精度型单精度型(float)双精类型双精类型(double)2.2 常量 在程序运行过程中,其值不能被改变的量

7、称为常量。 C语言中规定的常量类型有以下五种:整型常量、实型常量、字符常量、字符串常量和符号常量。2.2.1 整型常量 1. 整型常量的表示方法:l十进制整数:无前缀,数码取值为09,如123,-456。l八进制整数:前缀为0,数码取值为07,如0123,-011 。八进制数与十进制数的转换方法如下:(0123)8 =1* 82+2*81+3*80=64+16+3=(83)10l十六进制整数:前缀0X或0x,数码取值为09,AF或af,如0x2A,-0x12。十六进制数与十进制数转换方法:(-0x12)16=-(1*161+2*160)=-(16+2)=(-18)102.整型常量的后缀:l加后

8、缀L或l,表示长整型数。l加后缀u,表示无符号数。2.2.2 实型常量n实型常量即实数又称为浮点数,C语言中实数只采用十进制,有两种表示形式:l小数形式:由数码09和小数点组成(注意必须有小数点),如.123,-123.4567;l指数形式:由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数),如 -2.1e2,2.1e-2。2.2.3 字符常量C语言中,字符常量是用单引号括起来的单个字符,如a,$等。转义字符是一种特殊形式的字符常量,它是以一个“”开头的字符序列。表表2.12.1转义字符及其含义转义字符及其含义字符形式含义n换行,将当前位置移到下一行开头t水平制表(跳到下一个tab位置

9、)b退格,将当前位置移到前一列r回车,将当前位置移到本行开头f换页,将当前位置移到下页开头反斜杠字符“”单引号字符”双引号字符ddd1到3位8进制数所代表的ASC字符xhh1到2位16进制数所代表的ASC 字符例2.1转义字符的使用main()printf(“abctderftgn”); printf(“htibbjk”);例2.1结果 程序运行后在打印机上得到以下结果:fabcgdehjik 注意在显示屏上最后看到结果以与上述打印结果不同,是:fgdehjk2.2.4 字符串常量 C语言中,字符串变量是由一对双引号括起来的字符序列,如“China”,“$3.232”。注意:不要将字符常量与字

10、符串常量混淆。注意:不要将字符常量与字符串常量混淆。字符常量与字符串常量的区别l字符常量是由单引号括起来的,字符串常量是由双引号括起来的;l字符常量只能是单个字符,字符串常量则可是零个或多个字符;l可把一个字符常量赋予一个字符变量,但不能把一个字符串变量赋予一个字符变量,C语言中没有相应的字符串变量,可用字符数组来存放字符串常量;l字符常量占一个字节的内存,字符串常量占的内存字节数等于字符串中字节数加1,最后一个字节存放字符0作为字符串结束标志。2.2.5 符号常量 C语言中,可用一个标识符来表示一个常量,称为符号常量又称为宏定义,使用前须先定义,其定义规则为:#define 标识符 常量例2

11、.2 符号常量的使用#define PRICE 30main()int num,total;num=10;total=num*PRICE;printf(“total=%d”,total);使用符号常量的好处:使用符号常量的好处:含义清楚;含义清楚;在需要改变一个常量在需要改变一个常量时能做到时能做到“一改全改一改全改”;2.3 变量 变量是指在程序运行中其值是变化的量。 一个变量应该有一个变量名,在内存中占据一定的存储单元,在该存储单元中存放变量的值。3变量值变量值a变量名变量名存储单元存储单元图图2.1语言中,要求对变量作强制定义,即“先定义,后使用”。l便于发现错误;l为每一个变量指定确定

12、类型,在编译时就能为其分配相应的存储单元。整型数据在内存中的存储方式 整型数据在内存中是以二进制形式存放的。若定义了一个整型变量i:int i=10; 图3.2(a)是数据存放的示意图,图3.2(b)是数据在内存中实际存放的情况;i10(a)i0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0(b)图图2.2 实际上,整型数值是以补码表示的。一个正数的补码与其原码相同,求负数的补码方法:将该数的绝对值的二进制形式按位取反再加1。例如求-10的补码:0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 01 1 1 1 1 1 1 1 1 1 1 1 0 1 0 11 1 1

13、1 1 1 1 1 1 1 1 1 0 1 1 010的原码的原码取反取反再加再加1得得-10的的补码补码.3.1 整型变量l有符号基本整型signed intl有符号短整型 signed short intl有符号长整型 signed long intl无符号基本型 unsigned intl无符号短整型 unsigned short intl无符号长整形 unsigned long int.整型变量的分类:类型说明符数的取值范围字节数signed int-3276832767 即 -215(215-1)2unsigned int065535 即 0(216-1)2signed short

14、int-3276832767 即 -215(215-1)2unsigned short int065535 即 0(216-1)2signed long int-21474836482147483647 即 -231(231-1)4unsigned long int04294967295 即 0(232-1)4表表2.1整型数据的所占的内存字节数与取值范围整型数据的所占的内存字节数与取值范围2.整型变量的说明 类型说明符 变量名标识符,变量名标识符,.;如:int a,b,c; unsigned short x,y;例2.3 整型变量的定义和运算见教材P34例2.32.3.2 实型变量l单精度

15、型 float 占4个字节内存,提供7位有效数字,l双精度型 double 占8个字节内存,提供16位有效数字。整数没有误差,实数有精度,有误差,提供6位小数,7位有效数字。2.实型变量的说明格式和书写规则同整型变量说明相同,如:float s,t; double h,k;例例2.4实型数据的舍入误差实型数据的舍入误差main()float a,b;a=123456.789e5;b=a+20;printf(“%f,%f”,a,b);结果:结果:12345678848.000000,12345678848.000000误差原因分析误差原因分析 b的理论值应是12345678920,而一个实型变量

16、只能保证的有效数字是7位有效数字,后面的数字是无意义的,并不准确表示该数,从结果看出,把20加在后几位上,是无意义的,应当避免将一个很大的数与一个很小的数直接相加减,否则就会“丢失”小的数。与此类似,用程序计算1.0/3*3的结果并不等于1。2.3.3 字符变量 字符变量用来存放字符常量,只能存放一个字符,占用1个字节内存。 字符变量定义如下: char c1,c2;l1. 字符数据在内存中的存储字符数据在内存中的存储 将一个字符常量放到一个字符变量中,不是把该字符本身放到内存单元中,而是将该字符的相应的ASC 代码存放在存储单元中,如字符a的ASC 代码为97 ,b为98,9798c1c20

17、 1 1 0 0 0 0 10 1 1 0 0 0 1 0c1c1图图2.3 在内存中,字符数据以ASC码存储,它的存储形式与整数存储形式类似,C语言允许对整型变量赋以字符值,也允许对字符变量赋以整型量。在输出时,允许把字符变量按整型量输出,也允许把整型变量按字符型量输出。 注意:当整形变量按字符型量处理时,只有低八位参与处理。例2.5 向字符型变量赋以整型值main()char c1,c2;c1=97;c2=98;printf(“%c,%cn”,c1,c2);printf(“%d,%dn”,c1,c2);结果:a,b97,982. 补充补充 Turbo C将字符变量中的最高位作为符号位,也就

18、是将字符处理成带符号的整数,即signed char型。它的取值范围是-128127。如果使用ASC码为0127间的字符,由于字节中最高位为0,因此用%d输出时,输出一个正整数。如果使用ASC码为128255间的字符,由于在字节中最高位为1,用%d格式符输出时,就会得到一个负整数。例如:main()char c=130;printf(“%d”,c); 得到-126。如果不想按有符号处理,可以将变量定义为unsigned char类型,这时其取值范围是0255。signed char和unsigned char 相仿,但它只有一个字节。例2.6main()char c1=130; unsigne

19、d char c2=130; printf(“c1=%d,c2=%dn”,c1,c2);结果:结果:c1=-126,c2=1302.3.4 变量赋初值 程序中常需要对一些变量预先设置初值。C语言允许在定义变量的同时使变量初始化,如int a=3;float f=3.56;char c=a; 也可以使被定义的变量的一部分赋初值,如:int a,b,c=5; 如果对几个变量赋予初值3,应写成int a=3,b=3,c=3; 不能写成:int a=b=c=3;int a=3;相当于:int a;a=3;2.4 运算符和表达式运算符和表达式l运算符是一些特定的符号,它用来对数据进行某些特定的操作;l运

20、算对象(操作数)是用来进行运算的数据,包括常量、变量等;l表达式是用运算符将运算对象连接起来的式子。如1+2,1和2为运算对象,而1+2就是表达式。2.4.1 运算符种类、优先级和结合性运算符种类、优先级和结合性l算术运算符算术运算符 用于各类数值计算。运算符有:加(+)、减(-)、乘(*)、除(/)、求余(或称模运运算,%)、自增(+)、自减(-)。l关系运算符关系运算符 用于比较运算。运算符主要有:大于()、小于(=)、小于等于(=)和不等于(!=)。1. 运算符的种类运算符的种类l逻辑运算符逻辑运算符 用于逻辑运算。运算符有:与(&)、或(|)、非(!)。l位操作运算符位操作运算符 参与

21、运算的量,按二进制位进行运算。运算符有:按位与(&)、按位或(|)、取反()、按位异或()、左移()。l赋值运算符赋值运算符 用于赋值运算。赋值运算符有:简单赋值(=)、复合算术赋值(+=,-=,*=,/=,%=)、复合位运算赋值(&=,|=,=,=)等三类。l条件运算符条件运算符 是一个三目运算符,用于条件求值。运算符有:(?:)。l逗号运算符逗号运算符 用于把若干表达式组合成一个表达式。运算符有:(,)。l指针运算符指针运算符 用于取内容(*)和取地址(&)两种运算。l求字节运算符求字节运算符 用于数据类型所占的字节数(sizeof)。l强制类型转换运算符强制类型转换运算符 可以利用强制类

22、型转换运算符将一个表 达式转换成所需类型。其一般形式为: (类型名)(表达式) 如(double)a; (int)(x+y); (float)(5%3)l其他运算符其他运算符 其他运算符有:括号()、数组下标、成员运算符.和用指针访问结构体成员的指向运算符-。2.运算符的运算优先级运算符的运算优先级 C语言中,运算符的运算优先级共分为15级。1级最高,15级最低。在表达式中,优先级较高的先于优先级低的进行运算。如求表达式x+y*z的值: y的值左侧为加号,右侧为乘号,而乘号优先于加号,因此相当于x+(y*z),即先进行乘法运算,然后再进行加法运算。3. 运算符的结合性运算符的结合性 C语言的运

23、算符不仅具有不同的优先级,还有结合性的问题。在表达式的运算过程中,各运算对象参与运算的先后顺序不仅要遵循运算符优先级别的规定,还要受运算符结合性的制约,当一个运算对象两侧的运算符优先级别相同时,需按运算符的结合性来处理,以便确定是自左向右进行运算还是自右向左进行运算。 C语言中运算符的结合性分为两种:即左结合性(自左向右)和右结合性(自右向左)。例如:算术运算符就是左结合性的运算符算术运算符就是左结合性的运算符 表达式:x-y+z,运算对象y的左侧运算符“-”和右侧运算符“+”优先级相同,应按结合性来进行自左向右的运算,即先执行x-y运算,再执行+z的运算。 赋值运算符是右结合性的运算符赋值运

24、算符是右结合性的运算符 表达式:x=y=z,由于赋值运算符“=”的右结合性,所以先执行y=z运算,再执行x=(y=z)运算。优先级别运算符运算形式结合方向含义1().-(e)aex.yp-x自左至右圆括号数组下标运算符结构体成员运算符指向结构体成员运算符2-+ -! (t)*&sizeof-e+x或x+!et(t)e*p&xsizeof(t)自右至左负号运算符自增运算符和自减运算符逻辑非运算符按位取反运算符强制类型转换运算符指针运算符,由地址求内容求变量地址的运算符求某类型变量的长度运算符3* / %e1*e2自左至右乘、除、求余运算符表表2.2 C语言各运算符的优先级别与结合方向语言各运算符

25、的优先级别与结合方向4+ -e1+e2自左至右加法、减法运算符5e1e2自左至右左移、右移运算符6 =e1= 单目单目运算符算术运算符算术运算符关系运算符运算符逻辑运算符逻辑运算符(不包括不包括!)条件运算符条件运算符赋值运算符赋值运算符逗号运算符逗号运算符 优先级别由上到下递减。优先级别由上到下递减。特殊运算符优先级最高,逗特殊运算符优先级最高,逗号运算符优先级最低。位运号运算符优先级最低。位运算符的优先级比较分散算符的优先级比较分散(有有的在算术运算符之前的在算术运算符之前(如如),有的在关系运算符之前有的在关系运算符之前(如如),有的在关系运算符有的在关系运算符之后之后(如如&、|)。2

26、.4.2 算术运算符和算术表达式算术运算符和算术表达式l 1.1.基本的算术运算符基本的算术运算符 基本的算术运算符有:加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)五种。 两个整数相除的结果为整数,如5/3的结果为1,舍去小数部分。但是,如果除数或被除数中有一个为负值,多数机器采取“向零取整”的方法,即5/3=1,-5/3=-1,取整后向零靠拢。 求余运算符“%”要求参与运算的量均为整型,运算结果等于两数相除后的余数,余数的符号取决于被除数的符号,如-100%3余数为-1,100%-3余数为1。l 2.自增自减运算符自增自减运算符+i ,-i 在使用i之前,先使i的值加(减)

27、1i+, i- 在使用i之后,再使i的值加(减)1 粗略地看,+i和i+的作用相当于i=i+1,但+i和i+不同之处在于+i是先执行i=i+1后,再使用i的值;而i+是先使用i的值后,再执行i=i+1。例2.6 如果i的原值等于3,执行下面的赋值语句: j=+i;(i的值先变为4,再赋给j,j的值为4)j=i+;(先将i的值3赋给j,j的值变为3,然后i的值变为4)例2.7P35例2.5main()int c=5;printf(“%d,%d,%dn”,c+=c+,c+8,+c);printf(“%dn”,c+=c+,c+8,+c);注意注意:Turbo C规定,规定,printf()函数中出现

28、多个表达式输函数中出现多个表达式输出项时,先按从右到左的顺序计算各表达式的值,然后出项时,先按从右到左的顺序计算各表达式的值,然后再从左到右输出结果。本例中先计算再从左到右输出结果。本例中先计算+c,得得c=6, 然后计然后计算算c+8得得14,最后计算,最后计算c+=c+,得得c=13。l1.有如下两个程序,试比较结果 main() int i=3; printf(“%d,%dn”,(i+)+(i+)+(i+),i); main() int i=3,k; k=(i+)+(i+)+(i+); printf(“%d,%dn”,k,i);补充:补充:结果:结果:12,312,3结结果:果:9,69

29、,6l2.当出现难以区分的若干个+或-组成运算符串时,C语言规定,自左向右取尽可以多的符号组成运算符。 例如:设整型变量x,y均为3,则: x+y 应理解为(x+)+y,结果为6,x值 为4,y值不变 x-y 应理解为(x-)-y,结果为0,x值 为2,y值不变3.算术运算符的优先规则算术运算符的优先规则单目算术运算符(-、+、-)优先于*、/、%算术运算符优先于+、-算术运算符;同级单目算术运算符的结合性自右向左;同级双目算术运算符的结合性自左向右。l 4.算术表达式算术表达式 用算术运算符和括号将运算对象连接起来的式子,称为算术表达式。例如下面的表达式为算术表达式: a*b/c-1.5+a

30、 如果一个算术运算符的两侧的数据类型不同,则按下面所述的内容先自动进行类型转换,使二者具有同一类型,然后再进行运算。各类数值型数据间的混合运算各类数值型数据间的混合运算 整型(包括 int, short, long, unsigned int, unsigned short, unsigned long)和实型(包括 float, double)数据可以混合运算。而字符型数据可以与整型通用,因此整型、实型和字符型数据间可以混合运算,在进行运算时,不同类型 的数据要先换成同一类型,然后进行运算,转换规则如下图所示:doublefloatlongunsignedintchar, short高高低低

31、 图中横向向左的箭头表示必须的转换,如字符数据必须先转图中横向向左的箭头表示必须的转换,如字符数据必须先转换为整数,换为整数,short型转换为型转换为int,float型数据在运算时一律先转换型数据在运算时一律先转换为为double型,以提高精度型,以提高精度(即使是两个即使是两个float型数据相加,也先型数据相加,也先都化成都化成double型,然后再相加型,然后再相加)。 纵向的箭头表示当运算为不同类型时转换的方向。例如纵向的箭头表示当运算为不同类型时转换的方向。例如int型与型与double型数据进行运算,先将型数据进行运算,先将int型数据转换为型数据转换为double型,型,然后

32、在两个同类型然后在两个同类型(double型型)数据间进行运算,结果为数据间进行运算,结果为double型。注意箭头方向只表示数据类型级别的高低,由低型。注意箭头方向只表示数据类型级别的高低,由低向高转换。不要理解为向高转换。不要理解为int型先转换为型先转换为unsigned int型,再转成型,再转成long型,再转成型,再转成double型。如果一个型。如果一个int型数据与一个型数据与一个double型型数据运算,是直接将数据运算,是直接将int型转换成型转换成double型。型。例2.8 假设已指定i为int型变量,f为float型变量,d为double型变量,e为long型变量,有

33、以下式子: 10+a+i*f-d/e在计算机执行时从左至右扫描,运算次序为:在计算机执行时从左至右扫描,运算次序为:进行进行10+a的运算,先将的运算,先将a转换为整数转换为整数97,运算结果为运算结果为107;由于由于“* *”比比“+”优先,先进行优先,先进行i* *f的运算。先将的运算。先将i与与f都转换成都转换成double型,运算结果为型,运算结果为double型;型;整数整数107与与i* *f的结果相加。先将整数的结果相加。先将整数107转换成转换成double型,再相型,再相加,结果为加,结果为double型;型;将变量将变量e化为化为double型,型,d/e结结果为果为do

34、uble型;型;将将10+a+i* *f的结果与的结果与d/e的商相减,的商相减,结果为结果为double型型。main()float x; int i; x=3.6; i=(int)x; printf(“x=%f,i=%d”,x,i);结果:结果:x=3.600000,i=3 上述类型转换由系统自动进行的,另一种类型转上述类型转换由系统自动进行的,另一种类型转换为强制类型转换。换为强制类型转换。 需要说明的是在强制类型转换时,得到一个所需需要说明的是在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化。如:类型的中间变量,原来变量的类型未发生变化。如:(int)x;如果如果

35、x原来指定为原来指定为float型,进行强制类型运算型,进行强制类型运算后得一一个后得一一个int型的中间变量,它的值等于型的中间变量,它的值等于x 的整数部的整数部分,而分,而x的类型不变的类型不变(仍为仍为float型型)。见下例。见下例2.9:2.4.3 关系运算符和关系表达式关系运算符和关系表达式所谓“关系运算”实际上是“比较运算”。将两个值进行比较,判断其比较的结果是否符合给定的条件。例如,a3是一个关系表达式,大于号()是一个关系运算符,如果a的值为5,则满足给定的“a3” 条件,因此关系表达式的值为逻辑值“真”(即“条件满足”),用整数“1”来表示;如果a的值为2,不满足“a3”

36、的条件,则称关系表达式的值为逻辑值“假”,用整数“0”来表示。l l1. 关系运算符及其优先次序关系运算符及其优先次序C语言提供下面语言提供下面6种关系运算符:种关系运算符: (小于小于) (大于大于)= (大于等于大于等于)= (等于等于)!= (不等于不等于)优先级相同优先级相同(高)高)优先级相同优先级相同(低)低)关于优先顺序:关于优先顺序: 前前4 4种关系运算符种关系运算符( (、=)的优先级别相同,后的优先级别相同,后2种也相同。前种也相同。前4种高于后种高于后2种;种; 关系运算符的优先级低于算术运算符;关系运算符的优先级低于算术运算符; 关系运算符的优先级高于赋值运算符。关系

37、运算符的优先级高于赋值运算符。例2.10例如:ca+b 等效于c(a+b)ab=c 等效于(ab)=ca=bc 等效于a=(bc 等效于a=(bc) 用关系运算符将两个表达式(可以是算术表达式、关系表达式、逻辑表达式、赋值表达式、字符表达式)连接起来的式子,称为关系表达式。 关系表达式的值是一个逻辑值,即“真”或“假”。例如,关系表达式“5=3”的值为“假”,“5=0”的值为“真”。C语言没有逻辑型数据类型,以1代表“真”,以0代表“假”。l2. 关系表达式关系表达式例2.11a=3,b=2,c=1,则:则: 关系表达式“ab”的值为“真”,表达式的值为1; 关系表达式“(ab)=c”的值为“

38、真”(因为ab的值为1,等于c的值),表达式的值为1; 关系表达式“b+cb d的值为1 f=abc f 的值为0(因为“”运算符是自左向 右的结合方向,先执行“ab”得值为 1,再执行关系 运算“1c”,得值 0,赋给f)。例2.12 P36例2.6main()int a=5,b=3; float x=3.14,y=6.53;printf(“%d,%dn”,a+b!=a-b,xb)&(xy), (ay)。“!”是单目运算符,只要求有一个运算量,如!(ab)。l1.逻辑运算符及其优先次序逻辑运算符及其优先次序逻辑运算举例如下:a&b 若a、b为真,则a&b为真。a|b 若a、b之一为真,则a|

39、b为真。!a 若a为真,则!a为假。ab!a!ba&ba|b真真假假真真真假假真假真假真真假假真假假真真假假表表2.3逻辑运算的真值表逻辑运算的真值表 在一个逻辑表达式中如果包含多个逻辑运算符,如!a&b|xy&c, 按以下的优先顺序和结合性:!优先于双目算术运算符优先于关系运算符优先于&优先于|;单目逻辑运算符!和单目算术运算符同级别,结合性自右向左;双目逻辑运算符的结合性是自左向右。l2.逻辑表达式逻辑表达式 如前所述,逻辑表达式的值应该是一个逻辑量“真”或“假”。C语言编译系统给出逻辑运算结果时,以数值1代表“真”,以0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表

40、“真”。即将一个非0的数值认作“真”。例如:若a=4,则!a的值为0。因为a的值为非0,被认作“真”,对它进行“非”运算,得“假”,“假”以0来代表。若a=4,b=5,则a&b的值为1。因为a和b均为非0,被认为是“真”,因此a&b的值也为“真”,值为1。a、b值同前,a|b的值为a、b值同前,!a|b的值为4&0|2的值为 结论:由系统给出的逻辑运算结果不是就是1,不可能是其他数值。而在逻辑表达式中作为参加逻辑运算的运算对象可以是0(“假”)或任何非0的数值(按“真”)对待。如果在一个表达式中不同位置上出现数值,应区分哪些是作为数值运算或关系运逄的对象,哪些作为逻辑运算的对象。例如11153

41、&83”(因为关系运算符优先于&)。在关系运算符两侧的5和3作为数值参加关系运算,“53”的值为1。再进行“1&84-!0”运算,8的左侧为“&”,右侧为“”运算符,根据优先规则,应先进行“”的运算,即先进行“84-!0”的运算。现在4的左侧为“”,右侧为“-”运算符,而“-”优先于“”,因此应先进行“4-!0”的运算,由于“!”级别高,因此先进行“!0”的运算,得到结果1。然后进行“4-1”的运算,得结果3,再进行“8x)&(b=yz); printf(“a=%d,b=%d,c=%dn”,a,b,c);结果:a=0,b=6,c=0main()int m,n,l,a,b,c,d; m=n=a=

42、b=c=d=0; l=(m=a= =b)|(n=c= =d); printf(“m=%d,n=%d,l=%dn”,m,n,l);结果:m=1,n=0,l=12.4.5赋值运算符和赋值表达式赋值运算符和赋值表达式l1.简单赋值运算符简单赋值运算符 赋值符号“=”就是赋值运算符,它的作用是将一个数据赋给一个变量。如“a=3”的作用就是执行一次赋值运算,把常量3赋给变量a。也可以将一个表达式的值赋给一个变量。如:x=a+b*c。l2.复合赋值运算符复合赋值运算符 在赋值符“=”之前加上某些二目运算符可构成复合赋值运算符。 复合算术赋值运算符有:+=、-=、*=、/=、%=五种。 复合位运算赋值运算符

43、有:=、&=、=、|=五种。l3.赋值表达式赋值表达式 由赋值运算符将一个变量和一个表达式连接起来的的式子称为“赋值表达式”。其一般形式为: 赋值表达式的求解过程:将赋值运算符右侧的“表达式”的值赋给左侧的变量,赋值表达式的值就是被赋值的变量的值。如“a=5”这个赋值表达式的值为5(变量a的值也为5)。 上述赋值表达式的一般形式中的“表达式”,又可以是一个赋值表达式。如a=(b=5),括号内的“b=5”是一个赋值表达式,它的值等于5。“a=(b=5)”相当于“ b=5”和“a=b”两个赋值表达式,因此a的值等于5,整个赋值表达式的值也等于5。 我们知道赋值运算符按照“自右向左”的结合顺序,因此

44、,“b=5”外面的括号可以不要,即“a=(b=5)”和“a=b=5”等价,都是先求“b=5”的值(得5),然后再赋给a,下面举几个例子:a=b=c=5 (赋值表达式值为5,a、b、c 值均为5)a=5+(c=6) (表达式值为11,a值为11,c 值为6)a=(b=4)+(c=6) (表达式值为10,a值为10, b值为4,c 值为 6)a=(b=10)/(c=2) (表达式值为5,a值为5,b 值为10,值为2) 赋值表达式中可包含复合的赋值运算符。如:a+=a-=a*a,如果a的初值为12,此赋值表达式的求解步骤如下: a)先进行“a-=a*a”运算,它相当于 a=a-a*a=12-144

45、=-132; b)再进行“a+=-132”运算,相当于 a=a+(-132)=-132-132=-264。 补充 如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换。I.将实型数据(包括单、双精度)赋给整型变量时,舍弃实数的小数部分。如i为整型变量,执行“i=3.56”的结果是使i的值为3,在内存中以整数形式存储。II.将整型数据赋给单、双精度变量时,数值不变,但以浮点数形式存储到变量中,如将23赋给float变量f,即f=23,先将23转换成23.00000,再存储在f中。如将23赋给double型变量d,即d=23,则将23补足有效位数字为23.00000000

46、000000, 然后以双精度浮点数形式存储到d中。III.将一个double型数据赋给float变量时,截取前面7位有效数字,存放到float变量的存储单元中,但应注意数值取值范围不以溢出。IV.字符型数据赋给整型变量时,由于字符只占有1个字节,而整型变量占2个字节,因此将字符数据(8位)放到整型变量低8位中,整型变量高8位有两种情况: 若是将unsigned char数据赋给整型变量, 高8位补0。 若是将char数据赋给整型变量,如果字符最高位为0(0127),则整型变量高8位补0;如果字符最高位为1(-128-1),则整型变量高8 位补1。V.将一个int、short、long型数据赋给

47、一个char型变量时,只将其8位原封不动地送到char型变量(即截断)。VI.将int型数据赋给long型变量时,要进行符号扩展,将整型数据的16位送到long型低16位中,如果int型数据为正值(符号位为0),则long型变量的高16位补0;如果int型变量为负值(符号位为1),则long型变量的高16位补1,以保持数值不变。VII.将unsigned int型数据赋给long型变量时,不存在符号扩展问题,只需将高位补0。VIII.将一个unsigned 类型数据赋给一个占字节数相同的signed 变量(如:unsigned int=int, unsigned long=long, unsi

48、gned short=short, unsigned char=char),将unsigned型数据的IX.内存中各位原样送到signed型变量中,若unsigned 类型数据未超过要赋值的变量的范围,则signed型变量值与unsigned型数据值相同;若超过,要根据补码知识进行转换。如:main()unsigned int a=65535; int b;b=a; printf(“%d”,b);结果输出-1 将signed型数据赋给所占字节相同的unsigned型变量,同样将signed型数据所占内存的各位原样送到unsigned型变量内存中,若signed型数据为非负值,则unsigned

49、型变量值与signed型数据值相同;若为负值,要根据补码知识进行转换。如: main()unsigned a; int b=-1;a=b; printf(“%u”,a); 结果输出65535。2.4.6 条件运算符和条件表达式条件运算符和条件表达式l1.条件运算符条件运算符 条件运算符要求有3个操作对象,它是C语言中唯一的三目运算符。条件运算符的优先级规则:其他运算符优先于条件运算符,条件运算符优先于赋值运算符和逗号运算符;条件运算符的结合性是自右向左。2.条件表达式条件表达式 用条件运算符构成的表达式称为条件表达式,其一般形式为:表达式表达式1?表达式?表达式2:表达式:表达式3 条件表达式

50、的执行顺序是:先计算表达式1的值,若值为非0(真),则计算表达式2的值,并将表达式2的值作为整个条件表达式的结果;若表达式1的值为0(假),则计算表达式3的值,并将表达式3的值作为整个条件表达式的结果。例2.14main()int a=1,b=2,c=3,d=4,e; e=ab?a:cb?a:cd?c:d相当于ab?a:(cd?c:d)。2.4.7 逗号运算符和逗号表达式逗号运算符和逗号表达式l C语言中提供了一种特殊的运算符逗号运算符。它用来将两个表达式连接起来组成一个表达式,如3+5,6+8 称为逗号表达式。其一般形式为: 表达式表达式1,表达式,表达式2 其求解过程是:先求解表达式1,再

51、求解表达式2,并将表达式2的值作为整个逗号表达式的值。如上面的逗号表达式“3+5,6+8”的值为14,又如a=3*5,a*4 由表2.2可知:赋值运算符的优先级别高于逗号运算符,因此应先求解a=3*5这个赋值表达式,计算得这个赋值表达式值为15,再求解a*4这个表达式,得60,整个逗号表达式的值为60。l一个逗号表达式又可以与另一个表达式组成一个新的表达式,所以逗号表达式的一般形式可扩展为: 表达式表达式1,表达式,表达式2,表达式,表达式3表达式表达式n n 顺序求解这n个表达式,整个表达式值为表达式n的值。l请注意并不是任何地方出现的逗号都是作为逗号运算符,例如 变量说明:int a,b,

52、c;函数参数:printf(“%d,%d,%d”,a,b,c);其中的“a,b,c”并不是一个逗号表达式,它是printf函数的3个参数。2.4.8 位运算符和位运算位运算符和位运算l1.“按位与按位与”运算符运算符(&)参与运算的两个数,按二进位进行“与”运算。如果两个相应的二进位都为1,则该位的结果值为1,否则为0。即:0&0=0;0&1=0;1&0=0;1&1=1l2.“按位或按位或”运算符运算符(|) 参与运算的两个数,按二进位进行“或”运算。如果两个相应的二进位只要一个为1,则该位的结果值为1,即:0&0=0;0&1=1;1&0=1;1&1=1l3.“按位异或按位异或”运算符运算符(

53、) 异或运算符也称XOR运算符。它的规则是若参加运算的两个二进位相异时,结果位为1。 即00=0;01=1;10=1;11=02.4.8 位运算符和位运算位运算符和位运算l4.“按按位取反位取反”运算符运算符()是一个单目运算符,用来对一个二进制数按位取反,即将0变为1,1变为0。例2.15教材P37例2.9第三章 输入和输出 所谓输入输出是以计算机主机为主体而言的,从计算机向外部输出设备(如显示屏、打印机、磁盘等)输出数据称为“输出”,从外部由输入设备(如键盘、磁盘、光盘、扫描仪等)输入数据称为“输入”。 一个完整的程序都应该有数据的输入输出功能,没有输出功能是无用的,因为程序运行的结果看不

54、见;没有输入功能则程序缺乏灵活性,每次运行都只能对相同的数据执行操作,所以输入输出是程序中不可缺少的部分。 C语言中输入和输出都是由函数来实现的,C提供的函数以库的形式存放在系统中(如输入输出函数库、数学函数库、字符函数库、字符串函数库等),每个函数库含有若干个函数,C语言提供了一批标准输入输出函数,其中有putchar(输出字符)、getchar(输入字符)、printf(格式输出) 、scanf(格式输入) 、puts(输出字符串)、gets(输入字符串),本章中介绍前四个最基本的输入输出函数。 在使用C语言库函数时,要用文件包含命令“#include”将有关的“头文件”包括到用户的源文件

55、中,在头文件中包含了要用到的函数有关的一些信息,如变量的定义和宏定义。例如使用标准输入输出库函数时,要用到“stdio.h”文件,stdio是standard input&output的缩写,文件后缀“h”是head的缩与,#include命令都是放在程序的开头,因些这类文件又被称为“头文件”,在调用标准输入输出库函数时,程序开头应用以下文件包含命令:#include 考虑到printf和scanf函数使用频繁,系统允许在使用这两个函数时可不加#include命令。3.1字符的输入输出函数字符的输入输出函数 C语言提供了两个标准的字符字符输入输出函数putchar和getchar,在使用这两个

56、函数时,在程序的头部一定要加上下面的文件包含命令: #include3.1.1字符输出函数字符输出函数(putchar) putchar函数的作用是向终端(显示屏)输出一个字符一个字符,其一般形式为 putchar(ch); 意思是在显示屏上输出括号内字符变量ch所代表的字符,ch可以是字符数据(常量或变量)和整型数据(常量或变量)。例3.1教材P49例3.7#includemain()char a=Y;b=e;putchar(a);putchar(b); putchar(s);putchar(n);putchar(141);Yesa结果:3.1.2字符输入函数字符输入函数(getchar)

57、getchar函数的作用是从终端(键盘)设入一个字符一个字符。其一般形式为: getchar(); getchar()只能接收一个字符,该字符可以赋给一个字符变量或整型变量,也可以不赋给任何变量,作为表达式的一个运算对象参加表达式的运算处理。例3.2教材P50例3.8#includemain()char c;c=getchar();putchar(c);例3.3教材P50例3.9#includemain()int c;c=getchar(); c=a&cb) t=a;a=b;b=a; printf(“%d,%dn”,a,b);l2、if(表达式) 语句1; else 语句2;表达式真语句1假语

58、句2例4.2用if-else语句重写例4.1。main()int a,b; scanf(“%d,%d”,&a,&b); if(ab) printf(“%d,%dn”,a,b); else printf(“%d,%dn”,b,a);l3、if(表达式1) 语句1; else if(表达式2) 语句2; else if(表达式3) 语句3; . else if(表达式m) 语句m; else 语句n;语句n表达式1真语句1假表达式2真假语句2表达式3真真语句3假表达式m真假语句m例4.3P62例4.3#includemain()char c; printf(“input a character:”

59、;c=getchar();if(c=0&c=A&c=a&c=60n”);break; case E:printf(“=604.3 循环结构循环结构1*1+2*2+3*3=?int s;s=1*1+2*2+3*3; 引入循环结构就可以简化程序中大量的重复操作。 在C语言中,循环结构是由while语句,do while语句和for语句来实现的。为了更方便地控制程序流程,C语言还提供了两个循环辅助语句:break语句和continue语句。1*1+2*2+3*3+100*100=?4.3.1 while语句语句while(表达式) 语句;表达式循环体真假while语句的工作过程是: 首先计算括号中的

60、测试表达式,如果表达式的值为真,则执行循环体。循环体中的语句执行完后,返回while 处,重新计算测试表达式。如果测试表达式的值还为真,则继续执行循环体。依此循环,直至测试表达式的值为假,跳出while循环。#include main( ) /*定义循环变量i和sum变量*/ int i,sum; i=1;/*循环变量赋值1*/ sum=0;/*sum赋值0*/ while(i=100)/*计算100次*/ sum=sum+i; /*循环变量参与运算后,自加1*/ i+; /*运算100次后,打印最后结果 sum值*/ printf(“1+2+3+100=%d”,sum);循环结构的术语循环条

61、件循环条件循环体循环体循环控制变量循环控制变量 循环条件是循环结 构中的测试表达式。 如源程序中的 while(i=100)。 循环体是在每个循环周期均要执行一次的语句序列。 如源程序中while语句下面用花括号括起来的复合语句。 循环控制变量是在循环条件中控制条件是真是假的变量。 如源程序中的变量i。 要写出一个正确的循环结构,对控制变量要做三方面工作:一是控制变量赋初值;二是把控制变量写入正确的循环条件;三是控制变量的更新、调整。例 求自然数1到5的平方和。#includemain() int i,s ; s=0; i=1; while(i6) s=s+i*i; i+; printf(“1

62、*1+2*2+5*5=%d”,s);4.3.2 do while语句语句do 循环体语句;while(表达式);表达式循环体真假 do while语句的工作过程是: 首先执行一次do下面的循环体语句,然后计算测试表达式,如果表达式的值为真,则返回do语句处,继续执行循环体,如此反复,直到表达式的值为假,退出do和while构成的循环结构,执行do while语句下面的语句。 从流程图可以看出:不管开始的时侯测试条件是真是假,do while语句的循环体都要执行一次,因为循环体是先于测试条件执行的。这是do while循环与while循环的主要区别。因此,do while循环常用在需要至少执行一

63、次循环体的地方。 现在我们来看一个do while循环的例子。 这是一个猜数游戏。程序借助do while结构,可以让你探索出隐藏在程序中的一个“神秘数字”。#include #define GOAL 39main( )int date,count=0; do printf(“Please input an integer:”); scanf(“%d”,&data); if(dateGOAL) printf(“%d too big,please try again!n”,date); else if(dataGOAL) printf (“%d too big,please try again!

64、n”,date); elselse printf(“You get it!n”); count+; while(data!=GOAL); printf(“You need %d times when you get it!n”,count);4.3.3 for语句语句 我们前面已经说明,要正确表达循环结构应注意三方面的问题:控制变量的初始化、循环条件和控制变量的更新。 for语句在书写形式上正好体现了这种紧密的逻辑关系。for(表达式1;表达式2;表达式3) 循环体语句;for语句的工作过程是:首先计算表达式1,然后计算表达式2,如果表达式2的值为真,则执行循环体;否则,退出for循环,执行f

65、or循环下面的语句。如果执行了循环体,则循环体执行完后,将计算表达式3,然后重新计算表达式2。如此反复,直至表达式2的值为假,退出循环。表达式2循环体真假表达式1表达式3例:求自然数1到5的平方和。#include main() int i,s; s=0; for(i=1;i6;i+) s=s+i*i; printf(“1*1+2*2+5*5=%d”,s);4.3.4 while ,do while,for语句的选择语句的选择一、如果循环次数在执行循环体之前就已确定,一般用for语句;如果循环次数是根据循环体的执行情况确定的,一般用while语句或者do while语句。/*循环次数已确定*/

66、for(i=0;i10;i+) printf(“*”);char c;/*循环次数不确定*/*只有当用户输入了字符h才结束循环*/do/*等待用户输入一个字符*/c=getchar();printf(“%c”,c);while(c!=h) 同一个问题,可以用while语句来解决,也可用do while语句或者for语句来解决。但在实际应用中,我们要根据具体情况来选用不同的循环语句。选用的一般原则如下:二、当循环体至少执行一次时,用do while 语句;反之,如果循环体可能一次也不执行时,用while语句。char c;/*循环体至少执行一次*/*用户输入的每个字符都被打印*/do /*等待用

67、户输入一个 字符*/ c=getchar(); printf(“%c”,c);while(c!=h);char c;c=getchar();/*循环体可能一次也不执行*/*只有不是h的字符才被 打印*/while(c!=h) printf(“%c”,c); /*等待用户输入一个字符*/ c=getchar(); 4.3.5 循环嵌套循环嵌套例:在屏幕上打印一个8行7列的星号矩形#includemain() int i; /*打印第1行星号*/ for(i=0;i7;i+); printf(“*”); printf(“n”);/*换行*/ /*打印第2行星号*/ for(i=0;i7;i+);

68、printf(“*”); printf(“n”);/*换行*/ . . . /*打印第8行星号*/ for(i=0;i7;i+) printf(“*”); printf(“n”);/*换行*/* 一个循环的循环体中套有另一个循环叫循环嵌套。这种嵌套过程可以一直重复下去。 一个循环外面仅包围一层循环称二重循环 一个循环外面包围两层循环称为三重循环 一个循环外面包围多层循环称为多重循环 前几节所学的三种循环结构:while、do while、for可以互相嵌套自由组合。什么是循环嵌套?什么是循环嵌套?#include/*打印8行7列星号矩形*/main() int i,k; /*外循环控制星号矩形

69、的行*/ for(i=0;i8;i+) /*内循环打印每一行的7个 星号*/ for(k=0;k7;k+) printf(“*”); printf(“n”);/*换行*/ 把上页程序中的“k7”改成“k=i”,就可以打印星号三角形。#include/*打印星号三角形*/main() int i,k; /*外循环控制星号三角形的行*/ for(i=0;i8;i+) /*内循环控制星号三角形的列*/ for(k=0;k=i;k+) printf(“*”); printf(“n”);/*换行*/ *循环的辅助语句 有时,我们需要在循环体中提前跳出循环,或者在满足某种条件下,不执行循环体中的所有语句而

70、提前开始下一轮循环。这时候我们就要用到两个循环的辅助语句:break语句和continue语句。/*使用break语句的例子*/#include #define PI 3.14159/*打印半径为1到10的圆的面积,如果面积超过100,则不予打印。*/main()int r;float area; for(i=1;r100.0) break; printf(面积等于%fn”,area); printf(“现在r=%dn”,r);/*使用continue语句的例子*/#include /*计算用户输入的所有正数的和,用户输入0时结束*/main()float f,s; s=0; do scanf

71、(“%f”,&f); if(f0) continue; s=s+f; while(f!=0.0);lbreak语句语句 在学习switch结构时,我们就接触过break语句,那时它使程序跳出switch结构。在循环结构中,break语句可以使程序提前跳出循环体,结束循环。 如果在嵌套循环中使用了break语句,它只影响包含它的最内层循环。lcontinue语句语句 continue语句只能用在循环结构中。一旦执行了continue语句,程序就跳过循环体中位于该语句的所有语句,提前结束本次循环周期并开始下一个循环周期。 同break语句一样,如果continue语句用在嵌套循环中,那么它只影响包含它的最内层循环。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号