C语言程序设计第4章.ppt_第1页
C语言程序设计第4章.ppt_第2页
C语言程序设计第4章.ppt_第3页
C语言程序设计第4章.ppt_第4页
C语言程序设计第4章.ppt_第5页
已阅读5页,还剩74页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章 控制结构 2 本章要点 n关系运算符和逻辑运算符 nif语句和switch语句 nwhile语句、do while语句和for语句 nbreak语句和continue语句 3 本章学习目标 n了解结构化程序设计的基本思想 n掌握C语言的基本控制结构和基本控制语句的 使用方法 n熟练掌握使用基本控制语句进行结构化程序设 计的方法 n掌握break语句和continue语句的使用方法 n掌握一些常用的算法 4 4.1 关系运算符和关系表达式 n4.1.1 关系运算符 n用于判断两个数据之间的某个关系是否成立。 nC语言提供了六种关系运算符: 大于 = 大于等于 = 等于 != 不等于 n关系运算的结果是逻辑值:成立(真)或不成 立(假)。 53 运算结果为真,35 运算结果为假 5 使用关系运算符需要注意 n(1)注意书写格式 n“=“判断两个数据是否相等,一定要和赋值 运算符“=“区分开。 n(2)关系运算符均是二元运算符,一个关系 运算符的两个操作数类型要相同,如果类型不 一致,系统将自动进行类型转换。 A=65 运算结果为真 0=0 运算结果为假 6 n(3)注意运算符优先级和结合性 n“,“=“,“b+ca(b+c) a=bca=(bc) a=bca=(bc) 算术运算符 高 关系运算符 赋值运算符 低 7 4.1.2 关系表达式 n利用关系运算符将表达式连接起来的式子。 n关系运算的结果为逻辑值,由于C语言中没有 逻辑类型,因此当运算结果为真时,用整数1 表示,当运算结果为假时,用整数0表示。 n关系表达式的值也是一个逻辑值,即1或0。 8 假设变量已如下定义: int a=3,b=2,c=1,d=5,f; ab 表达式值为1 ab=c 等价于(ab)=c,表达式的值为1 b+cb 等价于d=(ab),d的值为1 f=abcd 等价于f=(ab)c)d),f的值为0 注意:这里任意改变a、b、c的值,会影响整个表 达式的值吗?为什么? 4.1.2 关系表达式 9 4.2 逻辑运算符和逻辑表达式 n4.2.1 逻辑运算符 n逻辑与运算 b=5; !a 表达式值为0 a k=(m=a+b) printf(“Please input the value of x:“); scanf(“%d“, if(x0) y=1; printf(“ the value of y is %d n“, y); 20 4.3.1 if语句 n注意,小括号后面是单独一条语句,而不是多 条语句。如果当表达式为真时,需要执行多条 语句应该使用复合语句。 n复合语句的格式为: 若干条语句 如:i+; sum+=i; n其中的每条语句均以分号结束,而复合语句本 身没有分号。 21 4.3.2 else子句 if(表达式) 语句1 else 语句2 n如果括号内的表达式为真,则执行括号后面的 语句1。如果表达式值为假,则执行else后面的 语句2;语句1和语句2只能有一个被执行。 表达式 语句1 假真 语句2 22 4.3.2 else子句 n【例4-2】输入两个整数,将较大者输出。 /*程序4-2*/ #include void main () int a, b, max; printf(“Please input the data a and b:“); scanf(“%d, %d“, if(a=b) max=a; else max=b; printf(“The max is %dn“, max); 23 4.3.3 if语句嵌套 n如果需要根据多个不同的条件,分别去执行不 同操作,就要用嵌套的if语句来实现。 n在if语句内部和else子句内部可以包含任何类型 的语句,通过在if语句和else子句内部嵌套其它 if语句可以形成if语句的嵌套。 24 两级if语句嵌套的一般格式 n执行过程 n如果表达式1成立,并且表达式 2成立,则执行语句1,然后执 行语句5; n如果表达式1成立,并且表达式 2不成立,则执行语句2,然后 执行语句5; n如果表达式1不成立,并且表达 式3成立,则执行语句3 ,然后 执行语句5; n如果表达式1不成立,并且表达 式3不成立,则执行语句4 ,然 后执行语句5; if(表达式1) if(表达式2) 语句1; else 语句2; else if(表达式3) 语句3; else 语句4; 语句5; 25 4.3.3 if语句嵌套 n【例4-3】编写程序,要求从键盘输入一个字符 ,判断其类型,将字符分为四种类型:小写字 母、大写字母、数字或者其他字符。 /*程序4-3*/ #include void main() char ch; printf(“Please input a letter:“); scanf(“%c“, if(ch=A printf(“Please input a number:“); scanf(“%d“, gw=num%10; /*把个位取出赋值给变量gw*/ sw=num/10%10; /*把十位取出赋值给变量sw*/ bw=num/100%10; /*把百位取出赋值给变量bw*/ qw=num/1000; /*把千位取出赋值给变量qw*/ if(qw!=0) printf(“四位数n“); else if(bw!=0) printf(“三位数n“); else if(sw!=0) printf(“二位数n“); else printf(“一位数n“); 27 n在程序4-3和程序4-4中,我们都是在else子句内 部嵌套if语句,这种嵌套形式通常称为级联式if 语句。许多程序员在书写级联式if语句时,通 常不采用缩进的格式,例如程序4-4可以修改为 下面的程序。 /*程序4-5*/ #include void main() int num,gw,sw,bw,qw; printf(“Please input a number:“); scanf(“%d“, gw=num%10; /*把个位取出赋值给变量gw*/ sw=num/10%10; /*把十位取出赋值给变量sw*/ bw=num/100%10; /*把百位取出赋值给变量bw*/ qw=num/1000; /*把千位取出赋值给变量qw*/ if(qw!=0) printf(“四位数n“); else if(bw!=0) printf(“三位数n“); else if(sw!=0) printf(“二位数n“); else printf(“一位数n“); 28 4.3.4使用if语句应注意的问题 n(1)在(表达式)后面或else关键字后面加分号 通常会导致出现语义错误。 n单独使用一个分号表示一个空语句 void main() int x; x=1; if(x=1) ; /*这里多加了个分号*/ printf(“x等于1n“); else printf(“x不等于1n“); 当尝试对该程序进行编译时,C语言编译器会报告 “illegal else without matching if“的语法错误。 29 4.3.4使用if语句应注意的问题 void main() int x; x=1; if(x=1) printf(“x等于1n“); else ; /*这里多加了个分号*/ printf(“x不等于1n“); 该程序运行后的输出结果为: x等于1 x不等于1 不是我们所期望得到的输出结果 30 4.3.4使用if语句应注意的问题 n(2)如果if语句内部或else子句内部需要放置 多条语句,必须将这多条语句构成一个复合语 句,这样才能符合if语句的语法格式。 n【例4-5】输入三个整数,将其降序排序后 输出。 /*程序4-6*/ #include void main() int a,b,c,t; printf(“input the data:“); scanf(“%d,%d,%d“, if (ab) max=a; else max=b; max=(ab)?a:b; if(ab) printf(“%d“,a); else printf(“%d“,b); printf(“%d“,(ab)?a:b); 35 4.3.5 条件运算符和条件表达式 n条件表达式的求值过程 n首先计算表达式1的值。 n如果表达式的值为真,则计算表达式的 值,并将该值作为整个条件表达式的值;表 达式3不计算。 n如果表达式的值为假,则计算表达式的 值,并将该值作为整个条件表达式的值;表 达式2不计算。 36 4.3.5 条件运算符和条件表达式 n条件运算符的优先级高于赋值运算符和逗号运 算符,低于所有其它运算符。其结合方向为自 右向左。 x0?1:x0?1:(xb?(m=cb): (n=bd) k=ac?(m=cb): (n=bd) k=ab?d: bc?(m=cb): (n=bd) k=ab?d: bb): (n=bd) k=0 m=5 n=0 k=4 m=5 n=6 k=0 m=5 n=0 k=1 m=1 n=6 例 输入一个字符。判别它是否大写字母,如果 是,将其转换为小写,否则不转换。然后输出 最后得到的字符。 #include void main() char ch; scanf(“%c“, ch = (ch = A printf(“please input a digit “); scanf(“%d“, switch (day) case 1: printf(“Mondayn“);break; case 2: printf(“Tuesdayn“); break; case 3: printf(“Wednesdayn“); break; case 4: printf(“Thursdayn“); break; case 5: printf(“Fridayn“); break; case 6: printf(“Saturdayn“); break; case 7: printf(“Sundayn“); break; default: printf(“data errorn“); 43 4.3.6 break语句 n在switch语句中,每个分支标号后的一组语句 中的最后一条语句通常是break语句。 n从程序4-7可以看出,break语句的作用是使程 序跳出switch语句,继续执行switch语句后面 的其它语句。 n如果程序4-7中去掉了break语句,我们将得到 不合理的执行结果。 /*程序4-7*/ #include void main() int day; printf(“please input a digit “); scanf(“%d“, switch (day) case 1: printf(“Mondayn“); case 2: printf(“Tuesdayn“); case 3: printf(“Wednesdayn“); case 4: printf(“Thursdayn“); case 5: printf(“Fridayn“); case 6: printf(“Saturdayn“); case 7: printf(“Sundayn“); default: printf(“data errorn“); 假设输入3,程序 会输出: Wednesday Thursday Friday Saturday Sunday data error 44 4.3.6 switch语句 n产生这种的结果的原因在于switch语句是一种“ 基于比较的转移“。当控制表达式的值与某个 常量表达式的值相等时,程序便转移到相应的 分支标号处,开始执行分支标号后的语句(这 里,分支标号仅起到标识目标语句位置的作用 ,不能实现对多个处理分支的分割)。当执行 完一个处理分支内的语句后,如果没有break 语句,程序将直接进入下一个处理分支,然后 继续执行下一个分支内的语句。 45 4.3.6 switch语句 n有时我们可以利用这个特点,使得多个处理分 支可以共享一组语句。 n【例4-7】输入1至7中的一个数值,然后打印出 该数值对应工作日或休息日。 /*程序4-8*/ #include void main() int day; printf(“please input a digit “); scanf(“%d“, switch (day) case 1: case 2: case 3: case 4: case 5: printf(“Workdayn“); break; case 6: case 7: printf(“Holidayn“); break; default: printf(“data errorn“); n【例4-8】 输入学生的百分制成绩,输出该学 生的成绩等级,大于等于90分为“A“ ;80分至 89分为“B“;70分至79分为“C“;60分至69分 为“D“;60分以下为“E“。 n第一种解决方法,用if语句实现。 n第二种解决方法,使用switch语句实现。 n需要改进 ? 46 4.3.7 应用实例 /*程序4-9*/ #include void main() int score; printf(“input the score:“); scanf(“%d“, if(score=90) printf(“A“); else if(score=80) printf(“B“); else if(score=70) printf(“C“); else if(score=60) printf(“D“); else printf(“E“); /*程序4-10*/ #include void main() int score; int d; printf(“input the score:“); scanf(“%d“, d=score/10; switch(d) case 10: case 9: printf(“A“);break; case 8: printf(“B“);break; case 7: printf(“C“);break; case 6: printf(“D“);break; default: printf(“E“);break; 若有定义: float w; int a, b;并且w,a,b已经被正确赋值, 则下面哪个switch语句是合法的: A.switch(w) case 1.0: printf(“*n“); case 2.0: printf(“*n“); B. switch(a) case 1 printf(“*n“); case 2 printf(“*n“); C. switch(b) case 1: printf(“*n“); default: printf(“#n“); case 1+2: printf(“*n“); case 2: printf(“#n“); D. switch(a+b) case 1: printf(“*n“); case 2: printf(“*n“); default: printf(“#n“); 错:少冒号 错:常量表达式为1或2 对 对 4.3.7 应用实例 #include “stdio.h“ main() int x=1,y=0,a=0,b=0; switch(x) case 1: switch(y) case 0:a+;break; case 1:b+; break; case 2: a+;b+;break; printf(“a=%d, b=%dn“,a, b); 写出下列程序的执行结果: break; 执行结果: a=2, b=1 执行结果: a=1, b=0 4.3.7 应用实例 49 4.4 循环结构 n循环结构是结构化程序设计中的三种基本结构 之一,也是程序设计的基础。 n循环结构的特点是, 在给定条件成立时,反复 执行一组语句,直到条件不成立为止。 n给定的条件称为循环条件,反复执行的一组语 句称为循环体。 n C语言提供了三种循环语句:while语句、do while语句和for语句。 n语法格式: while (表达式) 语句 n其中小括号中的表达式用于描述循环条件, 小括号后面的语句为循环体。 n表达式两边的小括号是必需的。 n当循环体内需要包含一条以上的语句时,应 用大括号括起来,构成复合语句。 50 4.4.1 while语句 51 nwhile语句执行过程 (1)计算表达式的值,如果其 值不为0(即为真值),转向 (2);否则转向(3)。 (2)执行循环体后转向(1) 。 (3)循环过程停止,程序转移 到while语句后面的语句。 4.4.1 while语句 表达式 循环体 假(0) 真(非0) 循环体中应有使循环趋向于结束的语句。 52 n【例4-9】求整数1100的累加和 /*程序4-11*/ #include void main() int i,sum=0; i=1; while(i void main() char c; int letter=0,space=0,digit=0,other=0; printf(“Input a string:n“); while(c=getchar()!=n) if(c=a /*定义并初始化变量*/ do sum += i; /*累加*/ i+; while(i void main() int m, a ; int n=0 ; printf (“请输入一个正整数:“); scanf (“%d“ , a=m; do a=a/10; n+ ; while(a0) ; printf (“%d是%d位数n“ , m, n); 4.4.2 do while语句 57 n我们将程序4-14中的do while语句直接改为 while语句,看一下会产生什么结果。 4.4.2 do while语句 #include void main() int m, a ; int n=0 ; printf (“请输入一个正整数:“); scanf (“%d“ , a=m; while(a0) a=a/10; n+ ; printf (“%d是%d位数n“ , m, n); 输入整数0,程序 输出: 0是0位数 n产生这种结果的原因在于,while语句先判断循 环条件,当a=0时,循环条件不成立,循环体 一次也不执行。为了避免这个问题,需要对特 殊情况做一下处理。 /*程序4-15*/ #include void main() int m,a; int n=0 ; printf (“请输入一个正整数:“); scanf(“%d“ , if(m=0) /*此处对m=0的特殊情况做了单独处理*/ n=1; else a=m; while(a0) a=a/10; n+ ; printf (“%d是%d位数n“ , m, n); 58 4.4.2 do while语句 n执行过程: (1)计算表达式1的值。 (2)计算表达式2的值,如果值 为真,则转向(3);否则终止循 环,转移到for语句后面的语句。 (3)执行循环体,然后计算表达 式3的值,然后转向(2)。 59 表达式2 循环体 假(0) 真(非0) 表达式1 表达式3 4.4.3 for语句 n语法格式: for(表达式1; 表达式2; 表达式3) 语句 n表达式1和2后面的分号是必需的, 表达式3后面没有分号。 n下面是一个for语句的例子: for(i=1;i void main() int i,sum=0; for(i=1;i void main() long t1, t2, t3; int i; t1=t2=1; printf(“%10ld%10ld“, t1,t2); for(i=3; i100) break; 例、sum=0; for(i=1; ;i+) sum+=i; 或:sum=0; i=1; for( ; ; ) sum+=i; 此为死循环。 68 n通过在for语句的表达式1或表达式3中使用逗号 表达式,可以同时对多个变量进行初始化或同 时使多个变量自增/自减。 /*程序4-18*/ #include void main() int i,sum; for(sum=0,i=1;i void main() int m,i; printf(“Input m:“); scanf(“%d“, for(i=2;i void main() int i,j; for(i=0;i void main() int i, j; for(i=1; i void main() int i, j, n=0; for(i=1; i0) n+; printf(“合理的兑换方法有%d种n“, n); 4.4.7 应用实例 74 4.4.7 应用实例

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论