《C程序设计课件.ppt》由会员分享,可在线阅读,更多相关《C程序设计课件.ppt(346页珍藏版)》请在三一办公上搜索。
1、C程序设计(第二版),信息工程学院 软件教研室,课程内容:C语言程序设计任课班级:电4-4、5课时安排:理论讲解48学时上机实验24学时,教材:C程序设计 谭浩强 清华大学出版社C程序设计题解与上机指导,目 录,第1章 算法第2章 C语言概述第3章 数据类型、运算符与表达式第4章 顺序程序设计第5章 选择结构程序设计第6章 循环控制 第10章 指针第7章 数组 第11章 结构体与共用体第8章 函数 第12章 位运算第9章 预处理命令 第13章 文件,第一章 程序的灵魂算法,1.1算法的概念概念:为了解决一个问题而采取的方法和步骤。(是解决一个问题方法的精确描述)数据结构+算法=程序程序=算法+
2、数据结构+设计方法+语言工具 数值运算计算机算法:非数值运算,1.2简单算法举例例1:有A、B两杯,分别盛有酒和醋,要求它们互换(需借一空杯C),A,B,C,酒,醋,酒,A-C 酒,B-A 醋,C-B 酒,这就是以后经常会用到的两变量值交换的算法,例2:从十个数中挑选出最大的数来。选任意一数放入A中,设一计数器N=0(表示比较的次数)将下一数与A相比,大者放在A中,且N=N+1 此时须判断N是否9,是则执行,如N9(表示比较了9次)则停止循环。思考:如果题目要求为1000个数,将如何改动程序?,例3:求n!初始化:S=1,T=1使S=ST使T=T+1如果Tn,则返回执行,如果Tn,则停止循环,
3、此时S中值为n!。思考:如果题目改成奇数相乘,应如何改动程序?若将的终止条件改成T11,结果将会怎样?结果将是:13579,例4:对一个大于或等于3的正整数,判断它是不是一个素数。S1:输入n的值 S2:i=2 S3:n被i除,得余数r S4:如果r=0,表示n能被i整除,则打印n“不是素数”,算法结束;否则执行S5 S5:i=i+1 S6:如果in-1,返回S3;否则打印n“是素数”。然后结束。或 S6:如果i,返回S3;否则算法结束。,1.3算法的特点 1、有穷性 2、确定性 3、没有或有多个输入 4、有一个或多个输出 5、有效性,1.4算法的表示 一、自然语言 人们常用的语言,可以是汉字
4、或英语或其它文字,通俗易懂。缺点:1、冗长繁锁 2、歧义性 3、适合描述顺序执行,而不适合描述判断性,转移及循环语句。二、流程图 用一些图框表示各种操作。采用ANSI标准,开始,A=C,B=A,C=B,结束,开始,输入数A,N=0,输入数B,AB?,B=A,N=N+1,N9?,打印A,结束,Y,N,Y,N,优点:1、逻辑清楚,形象化易理解。2、流程线一目了然,占地较大,不适合复杂算法。切记:不要忘记画箭头或画反了箭头!三、伪代码 是一种介于自然语言及计算机语言之间的文字与符号来描述,无图形,结构紧凑。例如:要打印x的绝对值。if x positive then if x为正数 then pri
5、nt x 或者 打印 x else else print x 打印-x,四、三种基本结构1、顺序结构:,2、选择结构:,依先后顺序依次执行,依是否满足条件P,选择执行A或B,3、循环结构:当型(while型)直到型(do-while型),先判断P1,满足时反复执行A;一旦不满足则不执行A。,先执行A,然后判断P2,不满足时反复执行A,直到满足P2为止。不执行A,区别:while until 先判断,后执行 先执行,后判断可能一次也不执行循环体;至少执行一次循环体三种结构的共同特点:1、只有一个入口2、只有一个出口(指整个结构讲)3、结构内每一部分都有机会被执行4、不应有死循环由以上三种基本结构
6、所构成的算法属于“结构化”的算法。,五、N-S结构流程图,顺序结构,选择结构,当循环,直到循环,第二章 C语言概述,2.1 C语言出现的历史背景C语言是当今国际上最流行的、最有发展前途的计算机高级语言,它集计算与软件开发于一身,即有高级语言的可读性,又有低级汇编语言的软件开发功能,是一种编译语言。尽管当初C语言是为编写UNIX操作系统而设计的,但却不依赖于UNIX操作系统,可在多种操作系统的环境下运行。,C语言的发展年代 语言名称 改进功能 设计人或国家地址1960ALGOL 面向问题(远离硬件)1963CPL 部分驱动硬件 英国剑桥大学1967BCPL 直接驱动硬件,但太简单 英国剑桥大学1
7、970B 简单、接近硬件,写出了第一个UNIX 美国贝尔实验室1972-1973 C 直接驱动硬件,功能强大 美国贝尔实验室C+面向对象VC 可视化编程C#基于.net平台上快速开发大量应用程序,2.2 C语言的特点1、语言简洁、紧凑、使用方便、灵活(32个关键字、9种控制语句)2、运算符十分丰富(34个)3、数据结构丰富4、有结构化控制语句5、语法限止不太严格,程序设计自由度大6、允许直接访问物理地址、位操作(位操作、可直接写汇编语句,加asm做前缀)7、生成目标代码质量高,程序执行效率高(.exe、.com效率高)8、可移植性好(对于机器型号、操作系统要求不高,可转换成其它语言),2.3
8、简单的C程序介绍 例1:输出一句话 main()printf(“this is a C program.n”);例2:计算123+456的值,并输出 main()int a,b,sum;a=123;b=456;sum=a+b;printf(“sum is%dn”,sum);,例3:比较两个数的大小,输出大的值 mian()int a,b,c;scanf(“%d,%d”,对子函数max()的调用,max()函数的定义,C语言的规则1、C程序由函数构成。其中至少有一个函数main()可使用库函数(printf、scanf)也可以自定义函数(max)2、函数的两个组成部分:说明部分、函数体说明部分:
9、包括函数类型、名字、属性、形参、形参类型函数体:即 中部分,包括变量定义、执行部分3、C程序总是从main函数开始执行,不论其位置4、书写格式自由,一行可写几个语句,一个语句可写在几行上。5、每个语句间用;分隔开,最后一句也须写上;6、输入输出也用库函数printf()、scanf()7、/*/表示注释信息,2.4C程序的上机步骤一、步骤1、输入与编辑源程序2、编译3、连接库函数4、运行目标程序二、Turbo C2.0主要工作文件Tc.exe集成编译器Tcconfig.tc环境设置文件*.H头文件*.BGI图形显示驱动程序*.LIB库文件*.OBJ模式启动代码文件具体步骤见实际操作,第三章 数
10、据类型、运算符与表达式,3.1 C语言的数据类型 整型(int)整型 短整型(short)长整型(long)基本数据类型 无符号整型(unsigned int)字符型(char)实型 单精度型(float)数据类型 双精度型(double)枚举型 数组类型 构造类型 结构体类型 共同体类型 指针类型 空类型,3.2 常量与变量一、常量:在程序运行的过程中,其值不能被改变的量称为常量。整型常量:12、0、-8 实型常量:4.6、1.23、-0.9 字符型常量:a、B、#、3、=符号常量:#define PRICE 30 例3.1 一般情况下这种符号常量使用大写字母表示!,二、变量:在程序运行过程
11、中,其值能被改变的量。1、每个变量都有两个特点:任一变量都有一个名字;任一变量都占据一块内存单元。,2、变量起名原则:变量所起的名字不可与32个保留字重名(P375上部)必须以字母或下划线开头,由字母、数字或下划线组成的长度不超过32的字符串。应本着见名知义的原则。大写字母与小写字母意义不同,被认为是两个不同的字符。一般变量名用小写字母表示。,15,学生,二教三阶,a,412,1001H,变量名,变量地址,变量值,存储单元,判断以下变量名是否合法:year Day# a_12$100 _abcdef 199Y a=b 1_2_3 u-n int,3、变量要先定义后使用要用到的变量,必须先对其进
12、行定义,才可以使用。如果是未经定义的变量,在编译时会检查出来。会给出提示信息:undefined symbol 变量名 in function main.,判断以下变量名是否合法:year Day# a_12$100 _abcdef 199Y a=b 1_2_3 u-n int,3.3 整型数据一、整型常量1、十进制数:234、-123等。每数位都可以是0-9。2、八进制数:以0开头,(128)10=0200。每数位都可以是0-7。3、十六进制数:以0 x开头,(128)16=0 x80。每数位都可以是0-9、A-F。二、整型变量1、整型量在内存中的存放形式例如10、-10:10在内存中的存放
13、形式:,2、整型变量的分类在C中,为了更精确描述整型数据,又进一步分为六种类型,区别主要是在表示整数的范围不同。,-10在内存中的存放形式:,Signed int 基本整型 16-32768+32767 216Short int 短整型 16-32768+32767 216Long int 长整型 32-21亿+21亿 232Unsinged int 无符号整型16 065535 216Unsinged short int 无符号短整型 16 065535 216Unsinged long int 无符号长整型 32 042亿 2323、整型变量的定义格式应为:变量1,变量2,变量3;例3.2
14、 注:一般在函数的开头就进行定义。4、整型数据的溢出在运算的过程中,若变量的值超过该类型的范围,则会产生溢出。例3.3,a:32767b:-32768,三、如何判断整型常量的类型。要根据给定的常量的大小,符合哪个类型的范围就赋给哪个类型的变量。例如50000 如果该常量后面加了一个字母l或L,则一定要认为是long int型的常量,即要赋给long int型的变量。例如432L,3.4 实型数据一、实型常量1、十进制小数:由整数部分、小数点和小数部分组成。例如:1.24-0.345.222-234.0 333.0.0等2、指数形式:由实数部分、E(e)和整数部分组成。用于表示一些比较大的数值。
15、例如:123*1022-123E22注意:E之前必须要有数字,E之后数字必须为整数。e12 4.4e1.5.e5都是不合法的。二、实型变量1、实型数据在内存中的存放形式(按指数形式)314.15926,2、实型变量的分类float 单精度 32 6-7 10-37-1038double 双精度 64 15-16 10-307-10308long double 长双精度 128 18-19 10-4931-1049323、实型数据的舍入误差 例3.4三、实型常量的类型 一个实型常量赋值给一个实型变量时,只根据实型变量表示的有效数字的位数,在实型常量中按从左向右的方向截取数据。,3.5 字符型数据
16、一、字符型常量1、在C语言中字符型常量是用单引号括起来的一个字符。如:a、A、3、?、$等。2、以“”开头的转义字符,101(65)代表字母A,012(10)代表换行,x20(32)代表空格字符。例如:main()printf(“abctderftgn”);printf(“htibbjk”);结果为:f a b c g d e h j k,二、字符变量 char c1,c2;c1=a;c2=b;在内存中占一个字节的空间,三、字符数据在内存中的存储形式 字符的ASCII码存入内存。在内存中所有的数据又是以二进制的形式存放的。例如字符a的ASCII码为97,b的ASCII码为98。C1 C2 C1
17、 C2,所以使得在C语言有效的范围中字符数据和整型数据之间通用(0127)例3.6,main()char c=130;printf(“%d,%c”,c,c);,结果为:-126,因为(130)10=(10000010)2=(-126)补,四、字符串常量字符串常量是由双引号括起来的字符序列。如:“how do you do”,“CHINA”,“a”,“134323.54”每一个字符串的结尾都有一个字符的结束标志:0,它占一个字节的宽度。在C语言中没有变量来存放字符串常量,须用字符数组来存放。“a”和a是有本质的区别的,a在内存中只占一个字节的宽度,而“a”在内存中占两字节的宽度。,例:已知字母a
18、的ASCII码为十进制数97,且设ch为字符型变量,则表达式ch=a+8-3的值为()。,f或102,3.6 变量赋初值一、什么是对变量赋初值变量赋初值就是在定义变量的同时,给变量赋一个值。二、如何进行赋初值 定义的同时赋值:float y=4.6;char z=a;定义之后赋值:int a,b,c;a=20;b=10;c=30;三、在赋初值过程中的问题1、int x,y,z=3;x,y没有初值,其初值也不是0,而是一个不确定的值 2、int a=b=c=3;()应写成int a=3,b=3,c=3;或定义abc之后再赋值!,3.7 各类数值型数据间的混合运算原则:在运算过程中,不同的数据类型
19、要先转换成同一类型后,才能进行运算,int,char,short,unsigned,long,double,float,低,高,1、在运算中,先进行水平方向上的转换。2、在进行了水平方向上的转换后,如果仍然存在不同类型的数据,就要进行纵向的类型转换。,例如:3+1+0.1/3-5.3/3L(运算结果的类型和本式子中最高级别的类型是一样的),设有说明:char w;int x;float y;double z;则表达式w*x+z-y值的数据类型为(),double,3.8 算术运算符和算术表达式一、算术运算符(+-*/%)使用“/”时注意:1/5=0,而不是0.2,但是1.0/5=0.2 使用“
20、%”时注意:该运算符的两边只能是整型数据二、算术表达式和算符的优先级与结合性1、算术表达式定义:用算术运算符号和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子,称为算术表达式。运算对象包括常量、变量、函数等。例如3+4.5*a-b*4/3+max(c,d)a*b/c-1.5+a2、优先级和结合性+-的优先级是4级,*/%的优先级是3级,它们的结合性都是从左至右的,即左结合的。,三、强制类型转换运算符(优先级2级,右结合)功能:将一个表达式转换成所需类型,其格式为:(类型)(表达式)例如:(float)x(int)x+y(int)(x+y)(double)36(float)(5%3
21、)注意:在强制类型转换时,要产生的是一个临时数据,这个临时数据的类型是指定的类型,而原始数据的类型不会发生改变。例3.8四、自增、自减运算符(+、-)+是自增运算符。+k或k+都是让变量k的值加1。-是自减运算符。-k或k-都是让变量k的值减1。,+K含义:先使用K值加上1,再使用K值。K+含义:先使用K值,然后再将K值加上1。例如:k=1;k=1;j=+k;j=k+;,k=2 j=2,k=2 j=1,使用时需注意:1、这两种、运算符只能用于变量,而不能用于常量或表达式。,2、+、-运算符的优先相同,但比算术运算符优先级要高。其结合性是“从右至左”的。i=3;j=-i+;i=3;j=+i;pr
22、intf(“%d,%d”,i,j);printf(“%d,%d”,i,j);结果是:4,-3 结果是:4,4,3、要避免发生歧义i=3;i=3;j=(i+)+(i+)+(i+);k=(+i)+(+i)+(+i);在某些C中是i=6 j=12 k=15而在TC、MSC中i=6 j=9 k=184、如何组合多个运算符i+j应理解为:(i+)+j而不是i+(+j)5、注意程序的写法i=3;i=3;j=i+;printf(“%d,%d”,i,i+);printf(“%d,%d”,j,i);结果为:4,3结果为:3,4,练习:i=3;p=3;求3+5*8%2+10/5-i+p-的值:,5,3.9 赋值运
23、算符和赋值表达式一、赋值运算符(优先级14,右结合)“=”就是赋值运算符。格式:变量=表达式二、赋值过程中遇到的问题1、实型-整型 舍弃小数部分 int i=3.6;/*i中只存放整数3*/2、整型-实型 数值不变,补足有效位数 float x=3;/*x中存放3.000000*/double y=12345;/*y 中存放12345.0000000000*/3、double-float 截取前面7位有效数字,其余舍弃 float-double 数值不变,有效位扩展到16位4、字符型-整型 保持数值不变且进行带符号扩展 int x=0;/*x中存放整数48*/int y=xFE/*y中存放整数
24、-2*/原最高位若为0则高8位全补0,是1则高8位全补1。,5、int,short,long-char 只保留低8位,截断 int i=289;char c=i;/*c的值为33,字符为!*/6、int-long 保持数值不变且进行符号扩展 long-int 只保留低16位,截断7、unsigned int-long 不需按符号扩展,将高位补08、非unsigned-同样长度的unsigned 原样赋值,连同符号位也看作是数值一起传送。三、复合的赋值运算符(优先级14,右结合)定义:在赋值运算符之前加上其它运算符。例如:x+=3相当于x=x+3 x*=(y+z)相当于x=x*(y+z)所以A+
25、=B解释为:将“A+”移到“=”右侧得到“=A+B”,然后在左侧填上“A”就得到了“A=A+B”。共有10种复合运算符:+=、-=、*=、/=、%=、=、=、&=、=、|=,四、赋值表达式格式为:a=b=c=5/*a=5,b=5,c=5*/a=5+(c=6)/*a=11,c=6*/x=(y=4)+(z=3)/*x=7,y=4,z=3*/x=(y=4)/(z=3)/*x=1,y=4,z=3*/例1:x=6;x+=x*=x/=3;例2:a=12;a+=a-=a*a;例3:b=3;printf(“%d”,a=b);,x=8,a=-264,输出应为3,3.10 逗号运算符和逗号表达式一、逗号运算符(优
26、先级15,左结合)“,”格式为:表达式1,表达式2求解过程是:先求表达式1,再求表达式2。整个表达式的值是表达式2的值。如:3*3,4*4结果应为16。x=8*2,x*4值为:64 x=16 x=(z=5,5*2)值为:10 z=5(x=8*2,x*4),x*2值为:32 x=16程序中并不是所有的逗号都要看成逗号运算符,尤其是在函数调用时,各个参数是用逗号隔开的,这时逗号就不是逗号运算符。如:printf(%d,%d,%d,x,y,z);,第四章 顺序程序设计,4.1 C语句的概述 C程序 源程序1 源程序i 源程序n 预编译命令 函数1函数n 说明部分 执行部分(语句),1、复合语句:用大
27、括号括起来的一些语句。这些语句被看成一个整体。例如:t=x;x=y;y=t;注意:复合语句的大括号后面没有分号,如果复合语句中只有一条语句,那么大括号可以省略。,2、控制语句:用来规定语句的执行顺序。if(条件)else 条件语句for(条件)循环语句while(条件)循环语句do while;循环语句continue;结束本次循环语句break;结束循环语句或结束switch语句switch(表达式)多分支选择语句goto 标号;转向语句return(表达式);从函数返回语句其中表示循环体或叫内嵌语句,可以用复合语句来表示。,3、函数调用语句:由一个函数调用加一个分号构成函数调用语句。例如:
28、printf(“max=%d”,c);c=max(a,b);4、表达式语句:在任何一个表达式后加一个分号就构成一条表达式语句。例如:x=3;注意:赋值表达式可以放置在任何可以放置表达式的地方也就是说可以放在某些语句中,而赋值语句只能作为一条语句单独存在。如:if(x=y)6)y=6;若是if(x=y;)6)y=6;则是错误的。5、空语句:仅由一个分号构成的语句。例如:;表示这里有一条什么也不做的语句。,4.2 数据输入输出的概念及在C语言中的实现C语言本身不提供输入输出语句输入和输出操作是由函数来实现的在C语言中没提供输入和输出语句的目的是使C语言编译系统更简单,因为C语言是翻译语言,没有输入
29、输出语句就避免在编译时还需处理一些硬件的问题,这样增强程序的通用性,可移植性。在C语言函数库中有一批“标准输入输出函数”,在不同的计算机系统内都可以被调用的。P381在使用到C语言库函数时,要用预编译命令“#include”将有关的“头文件”包括到用户源文件中。,4.3 字符数据的输入输出一、putchar()(原形在stdio.h中)这个函数的作用是将给定的一个字符常量或一个字符变量输出到终端。例如:putchar(A);putchar(33);putchar(x);这里x可以是整型或字符型变量。例4.1putchar(n);输出一个换行回车putchar(101);Aputchar();p
30、utchar(015);输出回车,不换行。,二、getchar()(原形在stdio.h中)从终端输入一个字符。该函数无参数。例如:#include main()char c;c=getchar();putchar(c);输入A,输出也为A。注意:输入时需键入回车后,才可处理。,printf(“%c”,getchar();,putchar(getchar();,4.4 格式输入与输出一、printf(格式输出函数)(原形在stdio.h中)作用是向终端输出任意类型的数据。格式为:printf(格式控制字符串,若干表达式);1、格式控制符:是用双引号括起来的字符串,包括两种信息:1)普通字符进行
31、原样输出:printf(“this is my book!”);printf(“x=%d,y=%d”,x,y);2)起格式说明作用,用来控制对应表达式的输出格式(必须小写)%d、%f、%c、%o、%x、%s、%e、%g、%、%u,2、格式字符具体说明:1)%d格式符%d是按实际长度进行输出。printf(“x=%d,y=%d”,83,35);,结果为:x=83,y=35,%md是按照m指定的宽度进行输出,且数据右靠齐。如果实际宽度要大于m,则按数据的实际宽度进行显示输出。x=123;y=12345;printf(“%4d,%-4d,%4d”,x,x,y);,结果为:123,123,12345,
32、%ld是将其对应的表达式的值按照长整数方式输出。x=76543;printf(“x=%ld,x=%d”,x,x);,结果为:x=76543,x=11007,注意:长整型数据一定要用%ld的形式输出。,%mldx=76543;printf(“x=%7ld,x=%4ld”,x,x);结果:x=76543,x=765432)%o格式符:以八进制数形式输出整数。输出的数不带符号。int a=-1;printf(“%d,%o”,a,a);结果为:-1,1777777因为-1的补码形式是:1111 1111 1111 1111,所以是177777同样,也可以使用l、m作为说明符。3)%x格式符:以十六进制
33、形式输出整数。也没有负数形式。x=-1;printf(“x=%x,x=%d”,x,x);结果为:FFFF,-1同样,%x也可以使用l、m、-l作为说明符。,4)%u格式符:用来以十进制形式输出无符号数int a=-2;unsigned int b=65535;printf(“a=%d,%o,%x,%un”,a,a,a,a);printf(“b=%d,%o,%x,%un”,b,b,b,b);结果为:a=-2,177776,FFFE,65534 b=-1,177777,FFFF,65535其中:(-2)补(65535)补同样,%u也可以使用l、m、-l作为说明符。5)%c格式符:用来输出一个字符。
34、Printf(“x=%c,y=%c”,A,66);结果为:x=A,y=BPrintf(“x=%5c”,66);结果为:x=B同样,%c也可以使用m作为说明符。,6)%s格式符:用来输出一个字符串。%s printf(“%s”,”china”);china%ms printf(“%8s”,”china”);chian%-ms printf(“%-8s,%s”,”china”,”is good”);chinaisgood%m.nsprintf(“%7.2s,%.4s”,”china”,”china”);ch,chin%-m.ns printf(“%-5.3s”,”china”);chi7)%f格式
35、符:用来输出实数,以小数形式输出。%f整数部分全部输出,小数部分保留6位,需注意有效位数!,printf(“%f,%f”,x,y);%m.nf指定输出的数据共占m位,小数为n位。float f=123.456;printf(“%f,%10f,%10.2f,%.2f,%-10.2fn”,f,f,f,f,f);123.456001,123.456001,123.46,123.46,123.468)e格式符:以指数形式输出实数。%e固定小数部分占5位,整数占1位,小数点占1位,E占1位,指数占2位,指数符号占1位。整体只占11位!printf(“%e”,123.456);结果为:1.23456e+0
36、2,%m.ne指定输出的数据共占m位,小数为n位。printf(“%e,%10e,%10.2e,%.2e,%-10.2e”,f,f,f,f,f);1.23456e+02,1.23456e+02,1.2e+02,1.2e+02,1.2e+029)g格式符:自动选择实数输出的f或g格式,且不输出无意义的零。f=123.456;printf(“%f,%e,%g”,f,f,f);结果为:123.456001,1.23456e+02,123,45610)%格式符:作用是输出一个%printf(“这个月的出勤率是96%”);注意:除了xX,eE,gG以外,都不可以使用大写,只可以用小写表示。其中可以使用转
37、义字符。,二、scanf()函数(原形在stdio.h中)其使用格式为:scanf(格式控制符,地址表列)例如:scanf(“%d%d”,注意:输入时不须用分隔符将各字母分开。若输入abc 则得到:c1=a,c2=,c3=b,4)%o,%x用于输入八进制,十六进制的数scanf(“%o%x”,7)*表示空过一个数据。scanf(“%d%*d%d”,应输入input the number 3才能使x得到3这个值。,scanf(“%d,%d”,3)某一数据输入时,遇到下列输入则认为当前输入结束。遇到空格、回车、跳格键到达指定宽度时结束,如%3d则只取3列,遇非法输入时,如下面的例子:scanf(“
38、%d%c%f”,输入为:1234k543o.22则得到:x=1234,y=k,z=543遇到o认为数据到此结束了。,4.5 顺序结构程序设计举例例1:输入三角形的三边长,求三角形面积可以利用海伦公式:其面积为:例4.10,例3:求 方程的根。a,b,c由用户键盘输入,设。例4.12方程的根是,可以表示为:,,例2:从键盘输入一个大写字母,要求改用小写字母输出。例4.11,#include main()float a,b,c,disc,x1,x2,p,q;scanf(“a=%f,b=%f,c=%f”,第五章 选择结构程序设计,5.1 关系运算符和关系表达式一、关系运算符及优先级,=,a+b ab
39、=c a=bbc,c(a+b),(ab)=c,a=(bc),(ab)c,二、关系表达式定义:用关系运算符将两个表达式(算术表达式、关系表达式、逻辑表达式、赋值表达式、字符表达式)连接起来的式子,称为关系表达式。ab,a+bb+c,(a=3)(b=5),ab)(bb ab=c b+cb 则d=f=abc 则f=,1,1,0,1,0,5.2 逻辑运算符和逻辑表达式 一、逻辑运算符及其优先级!(非)2级,右结合,单目运算符&(与)|(或)11,12级,左结合,双目运算符逻辑运算真值表,二、逻辑表达式1、逻辑表达式的值只有两个:真(1)假(0),2、而在判断一个量真假时原则如下:0为假,非0为真例如:
40、53&2|8b)&(n=cd)求m,n的值是多少?,m=0,n=1,main()int a,x,y,z;a=0;x=1;y=1;z=1;a=(x=2),1,2,2,2,0,0,1,1,1,2,1,1,1,0,2,1,1,0,1,2,分别写出a,x,y,z的值,5.3 if语句一、if语句格式:if(条件)语句一 else 语句二当条件成立时执行语句一,条件不成立时执行语句二。注意:1、条件是个逻辑表达式,两边必须有括号()。2、语句一和语句二是if的内嵌语句,与if看成一条语句3、如语句一、二不只是一句话,而是多句,则须用 括起来。4、else语句二可以省略。5、语句一、语句二中还可包含另外一
41、个if-else语句。6、else总是和它上面的if(未曾配对的)配对。,例如:if(3)printf(“OK”);if(xy)printf(“%d”,x);else printf(“%d”,y);if(xy)输入3个数a,b,c,要求按由小到大的顺序输出。例5.2,二、if语句的嵌套在if语句中又包含一个或多个if语句称为if语句的嵌套。if(条件)if(条件)语句1 else 语句2else if(条件)语句3 else 语句4 对于容易产生错误的嵌套语句,最好加上 if()if()语句1 else if()语句2 else 语句3,例:有一函数:-1(x0)main()int x,y;s
42、canf(“%d”,if(x=0)if(x0)y=1;else y=0;else y=-1;,三、条件运算符(优先级是13级,右结合,三目运算符)格式:(表达式一)?表达式二:表达式三if(ab)max=a;else max=b;max=(ab)?a:bxy?x:zd?z:d=xy?x:(zd?z:d)xy?x:y+2=(xy)?x:(y+2),y=-1;if(x!=0)if(x0)y=1;else y=0;,y=0;if(x=0)if(x0)y=1;else y=-1;,在输入x=0时会出错,应该如何改?,在进行混合运算时应注意:xy?1:1.5当xy时,表达式的值为1.0,当x=A,5.4
43、 switch语句语句格式:switch(表达式)case 常量表达式1:语句1 case 常量表达式2:语句2:case 常量表达式n:语句n default:语句n+1 注意:1、switch后表达式可以为整型、字符型等。,2、每个case后常量表达式只能是常量组成的表达式。当switch后表达式值与某一常表达式值一致时,则执行此case后语句。如无一常量表达式值与switch值一致,则执行default后的语句。3、每个case语句后常量表达式值不应一致,否则程序会出错。4、case语句的次序不影响执行结果,一般情况下尽量使出现机率大的case放在前面。5、执行了一个case语句后,程序
44、就会执行以下case的以及default的语句,除非遇到了break语句停止,执行switch以后的语句。6、default这一行可以省略。7、多个case可以共用一段程序。,例:输入一个学生的成绩,打印出相应的等级。main()float grade;int x;scanf(“%f”,练习题:表示x(int型)取值在1,10或200,210范围内为真,表达式为:()判断char c1是否大写字母的表达式为:()1、写出程序输出结果:main()int a=100,x=10,y=20,ok1=5,ok2=0;if(xy)if(y!=0)if(!ok1)a=1;else if(ok2)a=10;
45、a=-1;printf(“%dn”,a);,x=1&x=200&x=210,ch1=A&ch1=Z,-1,2、main()int x=2,y=-1,z=2;if(x12?x+10:x-12;printf(“%dn”,y);输入为:12,4、main()int a=-1,b=3,c=3;int s=0,w=0,t=0;if(c0)s=a+b;if(a0)if(c0)w=a-b;else t=c;printf(“%d,%d,%d”,s,w,t);,5、main()int a=2,b=7,c=5;switch(a0)case 1:switch(b0)case 1:printf(“”);break;c
46、ase 2:printf(“!”);break;case 0:switch(c=5)case 0:printf(“*”);break;case 1:printf(“#”);break;defualu:printf(“#”);break;defualt:printf(“,5.5 程序举例1、输入一年份,判断是否为闰年 例5.5能被4整除,但不能被100整除的和能被100整除又能被400整除的2、求 方程的解。例5.63、运输公司对用户计算运费。路程(s)越远,每公里运费越低。标准如下:s/250 s250km 没有折扣 0 250s500 2%折扣 1 500s1000 5%折扣 2,31000
47、s2000 8%折扣 4,5,6,72000s3000 10%折扣 8,9,10,113000s 15%折扣 12及12以上所以运费的计算是:f=p*w*s*(1-d)例5.7,第六章 循环控制,6.1 goto语句一、命令格式:goto 语句标号主要用途:和if构成循环;从循环体内跳到循环体外。例:求1+2+3+100的值main()int i,sum=0;i=1;loop:if(i=100)sum=sum+i;i+;goto loop;pirntf(“sum is%d”,sum);,6.2 while语句一、格式:while(表达式)循环语句例:求1+2+3+100的值main()int
48、i,sum=0;i=1;while(i=100)sum=sum+i;i+;printf(“%dn”,sum);注意:1、循环体语句若是多条语句必须用 括上。2、循环体中应有使循环趋于结束的语句。,6.3 do-while语句一、格式:do 循环语句 while(表达式);main()int i,sum=0;i=1;do sum=sum+i;i+;while(i=100);printf(“%d”,sum);注意:必须在while(表达式)后加一个“;”,表示do-while语句的结束。,在do-while和while的使用上,结果一般是相同的,区别是:while do-while 先判断,后执行
49、 先执行,后判断 可能一次也不执行循环体 至少执行一次循环体 例:main()main()int sum=0,i;int sum=0,i;scanf(“%d”,6.4 for语句一、格式:for(表达式1;表达式2;表达式3)循环语句,for(循环变量初值;循环条件;循环变量增量)循环语句,main()int i,sum=0;for(i=1;i=100;i+)sum=sum+i;printf(“%d”,sum);,for(i=100;i=0;i-)sum=sum+i;,二、for语句的变形:1、表达式1或表达式3省略,但分号“;”不能省略。i=1;for(;i100)break;3、for语句
50、中三个表达式的类型不限int i,sum;for(sum=1,i=1;i=100;sum+=i,i+);printf(“%d”,sum);,for(i=0;(c=getchar()!=n;i+=c);作用是每输入一个字符就将其ASCII码值累加到变量i中,直到输入回车为止。char c;for(;(c=getchar()!=n;)printf(“%c”,c);作用是输入一个字符给c,判断是否为回车,不是则输出,是则停止输入,停止循环。若输入是:abcdefg回车结果应为:abcdefg练习题:,#includemain()int c;for(;(c=getchar()!=n;)switch(c