第3章 C程序控制结构.ppt_第1页
第3章 C程序控制结构.ppt_第2页
第3章 C程序控制结构.ppt_第3页
第3章 C程序控制结构.ppt_第4页
第3章 C程序控制结构.ppt_第5页
已阅读5页,还剩129页未读 继续免费阅读

下载本文档

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

文档简介

2020/5/30,1,第3章C程序控制结构,2020年5月30日星期六,2020/5/30,2,3.1C语句概述3.2顺序结构3.3选择结构语句3.4循环结构的流程控制3.5循环的嵌套3.6辅助控制语句3.7循环结构程序举例,2020/5/30,3,所有的流程控制都是由执行语句实现,不同的执行语句具有不同的语法格式,用来完成不同的操作,实现不同的功能。任何一个计算机程序,按其执行时的流程控制,在逻辑结构上可划分为3种基本结构:顺序结构、选择结构、循环结构,可以通过这3种基本结构的嵌套实现复杂程序的流程控制。,2020/5/30,4,3.1C语句概述,C语言的执行语句可分为以下几类:简单语句:表达式语句、空语句复合语句流程控制语句,2020/5/30,5,3.1.1简单语句1表达式语句在C语言中,任何一个表达式后面加上一个分号就构成一个语句。其一般形式为:表达式;,2020/5/30,6,下列是否是合法的表达式语句:x=y=z=5;printf(结果是:%d,70+50);x=5缺少分号,称为赋值表达式,下列是否是合法的表达式:(a=6)+(b=7)(a=6;)+(b=7;),2020/5/30,7,2空语句空语句用一个分号表示,其一般形式为:;,2020/5/30,8,3.1.2复合语句把多条语句用括号括起来组成的一个语句称复合语句。复合语句在语法上等价于一条简单语句,它们用来将一组逻辑相关的语句组织起来,常用在流程控制语句中。,例如:if(x=(大于或等于)=(等于)!=(不等于),说明:关系运算符的优先级低于算术运算符关系运算符的优先级高于赋值运算符,例ca+b/c(a+b)ab!=c/(ab)!=ca=bc/a=(bc),2020/5/30,19,2.关系表达式用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符表达式)连接起来的式子,称关系表达式例:ab,a+bb+c,(a=3)(b=5),ab)(bb”的值为“真”,表达式的值为1。,C语言中没有专用的逻辑值,1代表真,0代表假,例inta=3,b=2,c=1,d,f;ab(ab)=cb+cbf=abc,例inta=3,b=2,c=1,d,f;ab/1(ab)=c/1b+cb/d=1f=abc/f=0,2020/5/30,20,2关系表达式关系表达式是用关系运算符将两个表达式连接起来的有意义的式子。关系表达式的结果要么是“1”(真),要么是“0”(假)。,关系运算符的优先级低于算术运算符,高于赋值运算符。,若a=3,b=20,c=10,则f=ay)printf(“%d”,x);elseprintf(“%d”,y);,2020/5/30,38,【例3.5】判断一个数是奇数还是偶数。分析:一个数如果能被2整除,说明该数是偶数,否则是奇数。#includeintmain()intx,rem;printf(输入一个正整数:);scanf(%d,2020/5/30,39,【例3.6】计算下列分段函数的值。5x+3x010 xb)if(bc)printf(最大值是:%d,a);,2、if(b!=15)if(!v1)x=1;elsex=10;,3、if(a0)y=1;Elseelsey=0;If(x=0)y=0;elsey=-1;Elsey=1;程序3:程序4:Y=-1;y=0;If(x!=0)if(x=0)If(x0)y=1;if(x0)y=1;Elsey=0;Elsey=-1;,正确,正确,错误,错误,2020/5/30,48,【例3.7】从键盘任意输入3个整数,用if语句的嵌套实现从小到大顺序输出。,2020/5/30,49,#includeintmain()inta,b,c;printf(请输入三个整数:);scanf(%d%d%d,2020/5/30,50,【例3.8】输入一个字符判断其是数字、字母,还是其他字符。分析:根据ASCII码值来判别输入字符的类型。由ASCII码表可知ASCII值在0和9之间的为数字字符,在A和Z之间的为在大写字母,在a和z之间为小写字母,其余则为其它字符。这是一个多分支选择的问题,用if的嵌套实现。,2020/5/30,51,#includeintmain()charch;printf(请输入一个字符:);ch=getchar();if(ch=0,2020/5/30,52,3.3.4条件运算符和条件表达式条件运算符含有问号(?)和冒号(:),它是C语言提供的唯一的三元运算符,该运算符允许根据表达式的值来确定取两个值中的一个。使用格式如下:表达式1?表达式2:表达式3,2020/5/30,53,条件运算符的求解过程是:先计算表达式1的值,若表达式1的值为非0(真),则求解表达式2,表达式2的值就是整个条件表达式的值;若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。使用场合:若在语句中,当被判别的表达式的值为“真”或“假”时,都执行一个赋值语句且向同一个变量赋值时,可以用一个条件运算符来处理。,2020/5/30,54,例:()=;当ab时将a的值赋给max,当ab时将b的值赋给max,可以看到无论ab是否满足,都是向同一个变量赋值。可以用下面的条件运算符来处理:()?;,例求a+|b|printf(“a+|b|=%dn”,b0?a+b:a-b);,2020/5/30,55,下列表达式表示什么意思?(x=0)?x:-x结果为x的绝对值t?printf(%d,t):printf(zeroentered)如果变量t的值不是0则输出该数;若为0则输出字符串printf(n%3=0?%4dn:%4d,x),2020/5/30,56,说明:(1)条件运算符的优先级高于赋值运算符,低于算术运算符、关系运算符、逻辑运算符。,(2)条件运算符的结合方向为“自右向左”。,例如:ch=(c=aelsex=b;,2020/5/30,57,3.3.5switch语句使用格式如下:switch(表达式)case常量表达式1:语句1case常量表达式2:语句2.case常量表达式n:语句ndefault:语句n+1,2020/5/30,58,2020/5/30,59,switch语句,例:要求按照考试成绩的等级输出百分制分数段,用switch语句实现:switch(grade)caseprintf();caseprintf();caseprintf();caseprintf();default(printf);,2020/5/30,60,【例3.10】输入17的数,输出对应的星期英文说明。#includeintmain()intchoise;printf(请输入一个(17)的数:);scanf(%d,演示有无break的效果,2020/5/30,61,注意:(1)switch圆括号里面的表达式是一个整型或字符型表达式,不能是浮点型和字符串。(2)case后的各常量表达式的值不能相同,否则会出现错误。(3)case后的语句组可以是任意数量的语句,且这些语句不需要用和括起来。这些语句的最后常常有break;语句。(4)若每个case及default子句都有break;语句,则各case和default子句的先后顺序可以变动,不会影响程序的执行结果,但习惯上把default放在最后面。,2020/5/30,62,(5)多个case可共用一个语句组。caseA:caseB:caseC:printf(60n);break;(6)case后面只能有一个常量表达式,不能有两个或多个。(7)default子句可以省略不用。(8)可以把一个switch语句作为另一个switch语句序列中的一部分,这称为switch语句嵌套。在switch语句嵌套中,内部和外部switch语句中的case常数可以具有相同的值,它们不会发生冲突。,2020/5/30,63,(9)执行完一个case后面的语句后,流程控制转移到下一个case继续执行。“case常量表达式”只是起语句标号作用,并不是在条件判断。在执行switch语句时,根据switch后面表达式的值找到匹配的入口标号,就从此标号开始执行下去,不再进行判断。应该在执行一个case分支后,可以用一个break语句来终止switch语句的执行。,2020/5/30,64,如:switch(grade)caseprintf(85-100);break;caseprintf(70-84);break;caseprintf(60-69);break;caseprintf();break;default(printf);break;,2020/5/30,65,【例3.11】运输公司对用户计算运费。路程(s)越远,每公理运费越低。标准如下:s250没有折扣250s10002%折扣1000s20005%折扣2000s8%折扣设每公里每吨货物的基本运费为p,货物重为w,距离为s,折扣为d,则总运费f的计算公式为:f=p*w*s(1-d),2020/5/30,66,分析:折扣的变化是有规律的,不同路程有不同的折扣量。本程序若switch实现多路选择,由于switch只能进行相等判断,我们必须将路程区间转变为一个具体的整数。分析路程的区间,它的变化是有规律的,即变化点都是250的倍数。利用这一特点,将路程s除以250后,对不同的路程区间,得到结果具体整数,如下所示。对于2000s这种情况,指派一个上面区间转换后没有的值,例如8。,2020/5/30,67,#includeintmain()intc,s;floatp,w,d,f;printf(输入基本运费、货物重量及距离:);scanf(%f%f%d,2020/5/30,68,3.4循环结构的流程控制,在许多问题中需要用到循环,其特点是:在给定条件成立时,反复执行某程序段,直到条件不成立为止。反复执行的程序段称为循环体,给定的条件称为循环条件,循环条件中常有一个用于控制循环进行的变量称为循环变量。,C语言提供了3种结构化循环语句:while语句dowhile语句for,2020/5/30,69,3.4.1自增自减运算符使用形式为:+-例如:x+等价于x=x+1x-等价于x=x-1,(在使用之前,先使的值加(减),(在使用之后,使的值加(减),2020/5/30,70,注意:(1)这两个运算符都是一元运算符。(2)自增自减运算符的运算对象只能是变量,不能是常量,也不能是表达式。如5+,(a+b)+(3)和的结合方向是“自右至左”。例:i=3;printf(“%d”,-i+);,(在使用之前,先使的值加(减),(在使用之后,使的值加(减),2020/5/30,71,3.8算术运算符和算术表达式,i+与+i的区别:是先执行后,再使用的值;是先使用的值后,再执行。例如:i=3;;i的值先变成4,再赋给,j的值为;先将i的值3赋给,的值为,然后变为,2020/5/30,72,2020/5/30,73,i=4;printf(“%d”,+i);i=4;printf(“%d”,i+);,例j=3;k=+j;j=3;k=j+;j=3;printf(“%d”,+j);j=3;printf(“%d”,j+);a=3;b=5;c=(+a)*b;a=3;b=5;c=(a+)*b;,/k=4,j=4,/k=3,j=4,/4,/3,/c=20,a=4,/c=15,a=4,2020/5/30,74,【例3.12】自增运算和自减运算举例。#includeintmain()inta=25,aa;a+;aa=+a;printf(a=%d,aa=%dn,a,aa);+a;aa=a+;printf(a=%d,aa=%dn,a,aa);return0;,272928,2020/5/30,75,练习:设a,b,c为整型数,且a=2,b=3,c=4,则执行完以下语句后,a的值是()a*=16+(b+)-(+c);,答案为28,2020/5/30,76,执行程序后输出结果是?【例1】#includevoidmain()inta=0;0|(a+);printf(%d,a);,【例2】#includevoidmain()inti=1,j=1,k=2;if(j+|k+),1,2,2,2,2020/5/30,77,循环的概念,什么是循环?为什么要使用循环?,问题:,在许多问题中需要用到循环控制。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。要构成一个有效的循环,应当指定两个条件:(1)需要重复执行的操作,这称为循环体;(2)循环结束条件,即在什么情况下停止重复的操作;,循环就是在满足一定条件时重复执行一段程序。,2020/5/30,78,3.4.2while语句使用格式如下:while(表达式)循环体语句;,while循环语句的特点是:先判断后执行,因此循环体语句有可能一次也不执行。,2020/5/30,79,说明:循环体有可能一次也不执行循环体可为任意类型语句下列情况,退出while循环a)条件表达式不成立(为零);b)循环体内遇break;,2020/5/30,80,【例3.13】用while语句实现1+2+3+100。分析:这是一个典型的求和程序,也称为累加过程。编程时一般设计一个累加器,其初值为0,程序流程如图3.6所示。,2020/5/30,81,#includeintmain()inti,s;i=1;/*循环初始值*/s=0;/*累加器清0*/while(i=100)/*循环判断条件*/s=s+i;/*累加*/i+;/*循环变量修正*/printf(1+2+3+100=%d,s);return0;,说明:(1)循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现.(2)在循环体中应有使循环趋向于结束的语句.,2020/5/30,82,读程序:#includevoidmain()intn,k,s;printf(entern:);scanf(%d,2020/5/30,83,读程序:#includevoidmain()intn,k,t;printf(“entern:”);scanf(“%d”,intn,k,t,s=0;,此句改为,插入此句,s+=t;,此句改为,printf(“s=%d”,s);,t=n!,s=1!+2!+.+n!,2020/5/30,84,3.4.3dowhile语句一般格式为:do循环体语句while(表达式);,dowhile语句的特点是:先执行后判断。因此循环体至少执行一次。注意:dowhile语句while后的分号绝对不能少。,2020/5/30,85,【例3.14】用dowhile语句实现1+2+3+100。#includeintmain()inti=1,s=0;dos=s+i;i+;while(i=100);printf(1+2+3+100=%d,s);return0;,2020/5/30,86,while语句和用do-while语句的比较:在一般情况下,用while语句和用do-while语句处理同一问题时,若二者的循环体部分是一样的,它们的结果也一样。但是如果while后面的表达式一开始就为假(0值)时,两种循环的结果是不同的。,2020/5/30,87,例while和do-while循环的比较(1)#include(2)#includevoidmain()voidmain()intsum=0,i;intsum=0,i;scanf(“%d,,运行结果:1sum=55再运行一次:11sum=0,运行结果:1sum=55再运行一次:11sum=11,说明:当while后面的表达式的第一次的值为“真”时,两种循环得到的结果相同。否则,二者结果不相同。,2020/5/30,88,3.4.4for语句逗号运算符和逗号表达式逗号运算符用于把几个表达式连接起来构成一个新的表达式,称之为逗号表达式。逗号表达式的一般形式为(结合方式从左到右):把最右边表达式的值作为整个逗号表达式的值。表达式1,表达式2,表达式n,例如:x=y=3,y+1整个表达式的值是第二个表达式的值4,2020/5/30,89,【例3.15】逗号运算举例。#includeintmain()inta,b;b=(a=3+10,a*4),a+=-6);printf(a=%d,b=%d,a,b);return0;结果a=7b=7,2020/5/30,90,2for语句for语句是C语言循环结构中用得较多的一种结构控制语句。for循环一般用在“计数”的循环中。其一般格式为:for(表达式1;表达式2;表达式3)循环体语句,2020/5/30,91,6.4用for语句实现循环,for语句的执行过程:(1)先求解表达式1。(2)求解表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌语句,然后执行下面第(3)步。若为假(值为0),则结束循环,转到第(5)步。(3)求解表达式3。(4)转回上面第(2)步骤继续执行(5)循环结束,执行for语句下面的一个语句,2020/5/30,92,6.5用for语句实现循环,循环初始条件,循环控制条件,循环体,for语句等价于下列语句:表达式1;while(表达式2)语句;表达式3;,2020/5/30,93,6.5用for语句实现循环,for语句最简单的形式:for(循环变量赋初值;循环条件;循环变量增值),例如:for(i=1;i=100;i+)sum=sum+i;,相当于:i=1;while(i=100)sum=sum+i;i+;,用for语句简单、方便。,2020/5/30,94,语句执行过程:当程序遇到for关键字后,首先计算表达式1,然后计算表达式2,并以该表达式值作为循环控制条件。即当表达式2的值为非0时,循环条件成立,执行循环体语句;当表达式2的值为0时,表示循环条件不成立,结束for循环,执行for的下一条语句。循环体语句执行后,将计算表达式3的值,然后又转到计算表达式2的值,由其值决定是否进入下一轮循环。,2020/5/30,95,【例3.16】用for语句实现1+2+3+100。#includeintmain()inti,s;for(i=0,s=0;i0;i-)printf(theiis%dn,i);,2020/5/30,103,#includeintmain()intscore;for(;scanf(%d,2020/5/30,104,读程序:#includevoidmain()inti,s,n;printf(请输入变量n的值);scanf(%d,2020/5/30,105,【例3.18】求n!=123n,其中n的值从键盘输入。分析:这种题型称为累乘。累乘的变量初值应是1。C语言描述:sum=1;sum=sum*2;sum=sum*3;sum=sum*4;sum=sum*n。核心算式是:sum=sum*i,其中i从1变化到n。:,2020/5/30,106,#includeintmain()inti,n,sum;printf(Pleaseinputanumber(110):);scanf(%d,2020/5/30,107,例:输出100200以内被7整除但不能被5整除的所有数,输出时5个一行。#includevoidmain()intx,count=0;for(x=100;x=200;x+)if(x%5!=0,for(x=105;x=200;x+=7)if(x%5!=0),2020/5/30,108,3.4.5三种循环的比较1三种循环可以互相代替,2020/5/30,109,2while语句和dowhile语句的比较,#includeintmain()inti,sum=0;scanf(%d,#includeintmain()inti,sum=0;scanf(%d,2020/5/30,110,3.5循环的嵌套,循环嵌套:指一个循环体内包含另一个循环。,2020/5/30,111,前面介绍的3种循环结构可以相互嵌套。例如:,不管循环语句如何搭配,编写循环嵌套结构时均要注意以下几点:(1)必须是外层循环“包含”

温馨提示

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

评论

0/150

提交评论