C语言程序设计流程控制语句学习教案

上传人:莉**** 文档编号:110293223 上传时间:2022-06-18 格式:PPTX 页数:65 大小:557.31KB
返回 下载 相关 举报
C语言程序设计流程控制语句学习教案_第1页
第1页 / 共65页
C语言程序设计流程控制语句学习教案_第2页
第2页 / 共65页
C语言程序设计流程控制语句学习教案_第3页
第3页 / 共65页
点击查看更多>>
资源描述
会计学1C语言程序设计流程控制语言程序设计流程控制(kngzh)语句语句第一页,共65页。4-1 选择(xunz)结构语句4.1.1 if语句 程序设计过程中,常常需要根据某一条件是否满足来判断做或者(huzh)不做某件事。这种结构在c中是通过if语句实现的。第1页/共65页第二页,共65页。例如(lr):If (xy) printf( “%d”, x);第2页/共65页第三页,共65页。否表达式语句真否流程图执行过程:先计算表达式的值,如果(rgu)表达式的值为非零,则执行语句;如果(rgu)值为零,则跳过if语句执行其后续语句。第3页/共65页第四页,共65页。例4.1 一个猜字游戏程序。程序运行时,要求游戏者从键盘输入一个数,如果(rgu)猜对了,屏幕显示“*Right*”;否则屏幕不显示任何信息。举例(j l) 第4页/共65页第五页,共65页。#include main() int magic=123; int guess; printf(“Enter your guess:); scanf(“%d,&guess); if (guess=magic) printf(“*Right*n); 第5页/共65页第六页,共65页。例如(lr):If (xy) printf “%d”, x);Else printf(“%d”,y);第6页/共65页第七页,共65页。真(非0)假(0)表达式成立吗?语句序列1语句序列2执行过程:先计算表达式的值,如果(rgu)表达式的值为非零,则执行语句1后跳过语句2而执行后续语句;如果(rgu)值为零,则跳过语句1执行语句2。第7页/共65页第八页,共65页。注意:1.c语言每条语句必须以分号结束,因此else之前有一分号,整个(zhngg)语句结束处有一分号。例:if(ab) printf(“%d”,a); else printf (“%d”,b); 正确if(ab) printf(“%d”,a) else printf (“%d”,b); 错误2.语句1与语句2不能同时执行。第8页/共65页第九页,共65页。第9页/共65页第十页,共65页。#include main() int magic=123; int guess; printf(Enter your guess:); scanf(%d,&guess); if (guess=magic) printf(*Right*n); else printf(*Wrong*n); 第10页/共65页第十一页,共65页。if 语句(yj)的三种形式(3)形式(xngsh)三: if (表达式1) 语句1;else if (表达式2) 语句(yj)2; else if (表达式3) 语句3;.else if (表达式n) 语句序列n;else 语句序列n+1;第11页/共65页第十二页,共65页。 这种形式可以(ky)实现多分支选择的功能,既在多种条件下的不同分支中选择一个分支来执行。 它的执行过程为:若表达式1的值为真(非零),则执行语句1;否则,若表达式2的值为真,则执行语句2;.若上述表达式的值都为0时,执行语句n+1.以下为流程图:第12页/共65页第十三页,共65页。例如(lr):表达式1成立吗?真(非0)语句序列1语句序列2真(非0)语句序列3真(非0)语句序列n真(非0)表达式2成立吗?假(0)表达式3成立吗?假(0)表达式n成立吗?假(0)语句序列n+1假(0)if (x0) y=1;else if (x=0) y=0; else y=-1;第13页/共65页第十四页,共65页。例4.3 例4.2再扩充,即当游戏者猜错时,屏幕除显示(xinsh)“*Wrong*”外,还告诉游戏者是猜大了还是猜小了。举例(j l) 第14页/共65页第十五页,共65页。#include main() int magic=123; int guess; printf(Enter your guess:); scanf(%d,&guess); if (guess=magic) printf(*Right*n); else if(guessmagic) printf(*Wrong*nToo high*n) else printf(*Wrong*nToo low*n);第15页/共65页第十六页,共65页。第16页/共65页第十七页,共65页。在每个表达式之后不应有任何标点符号,而在每个语句之后都要有“;” 不要误认为else 语句和if语句是两个语句,else 是if语句的一部分。只能与 if 配对使用。仅 else 本身不能单独作为一个语句使用 每个语句又都可以由若干C语言的语句组成,如果由两个以上语句构成语句序列,则应用(yngyng)大括号括起来构成一个复合语句。括号之外不再加 “;”.如:if(a+bc&b+ca&c+ab) s=0.5*(a+b+c);area=sqrt(s*(s-a)*(s-b)*(s-c); printf(“area=%6.2f”,area); else printf(“it is wrong”);内是一个完整的复合语句,不需另附分号。第17页/共65页第十八页,共65页。例:输入两个实数,按代数值(shz)有小到大次序输出这两个数。main()float a,b,t;scanf(“%f,%f”,&a,&b);if(ab)t=a;a=b;b=t;printf(“%5.2f, %5.2f”,a,b);运行情况(qngkung)如下:3.6,-3.2-3.20,3.60第18页/共65页第十九页,共65页。例如:求a,b,c三个数中最大值if (a=b) if (a=c) max=a; else max=c;else if (b=c) max=b; else max=c;内嵌if内嵌if第19页/共65页第二十页,共65页。二义性:if (表达式1) if (表达式2) 语句(yj)序列2;else 语句(yj)序列3;应如何(rh)理解?有两种理解(lji)方式:if (表达式1) if (表达式2) 语句序列2; else 语句序列3;if (表达式1) if (表达式2) 语句序列2;else 语句序列3;语言规定:else总是与它前面最近的且未曾配对的if配对。if (表达式1) if (表达式2) 语句序列2; else 语句序列3; if (表达式1) if (表达式2) 语句序列2;else 语句序列3;第20页/共65页第二十一页,共65页。举例(j l) 用嵌套if结构(jigu)代替例4.3中的 if-else-if结构(jigu)。第21页/共65页第二十二页,共65页。#include main() int magic=123; int guess; printf(“Enter your guess:”); scanf(“%d”,&guess); if (guess=magic) printf(“*Right*n”); else printf(“*Wrong*”); if (guessmagic) printf(“Too high*n”); else printf(“Too low*n”); 第22页/共65页第二十三页,共65页。第23页/共65页第二十四页,共65页。说明:1.条件运算符要求(yoqi)有三个操作对象。2.条件运算符优先于赋值运算符,因此上面赋值表达式的求解过程是先求解条件表达式,再将它的值赋给c.条件运算符的优先级别比关系运算符和算术运算符都低 max=(ab)?a:b 括号可以不要: max=ab?a:b如果有:ab?a:b+1相当于:ab?a:(b+1)第24页/共65页第二十五页,共65页。3.条件运算符的结合方向为“自右向左”,若有: ab?a:cd?c:d相当 于: ab?a:(cd?c:d)若:a=1,b=2,c=3,d=4 则条件表达式值为4。4.条件表达式不能取代一般的if语句,只有if语句中内嵌的的语句为赋值语句(且两个分支都给同一个变量赋值)时才能代替(dit)if语句。如: if(ab) printf(“%d”,a); else printf(“%d”,a);无法用条件表达式代替(dit)但可以用下面语句代替(dit): printf(“%d”,ab?a:b); /将条件表达式的值输出/第25页/共65页第二十六页,共65页。5.条件表达式中,表达式1的类型可以与表达式2和表达式3不同。如: x? a : bx是整形变量,若x=0,则条件表达式的值为b表达式2和表达式3的类型也可以不同。此时条件表达式的值的类型为二者中较高的类型。如: xy?1:1.5如果xy,则表达式的值为1.5。若xy,值应为1,由于(yuy)1.5是实型比整型高,因此应转换为1.0第26页/共65页第二十七页,共65页。用条件(tiojin)表达式代替例4.3中的if-else。举例(j l) 第27页/共65页第二十八页,共65页。#include main() int magic=123; int guess; printf(“ Enter your guess: ”); scanf(“ %d ”,&guess); if (guess=magic) printf(“ *Right*n ”); else printf(“ *Wrong* ”); guessmagic?printf(“ Too highn ”) :printf(“Too lown”); 第28页/共65页第二十九页,共65页。语句(yj)n+1表达式语句1语句2语句n常量表达式2常量表达式1常量表达式n其它 if-else-if结构或嵌套的if语句可以解决多分支的选择问题,但若判断条件太多,关系就不够清晰,switch可解决。第29页/共65页第三十页,共65页。说明:1.switch后面括弧内的“表达式”和case常量表达式,可以是任何类型。2.当表达式的值与某一个case后面的常量表达式的值相等时,就执行此case后面的语句,若所有的case中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句。3.每一个case的常量表达式的值必须(bx)不相等,否则就会出现矛盾的现象(对表达式的同一个值,有多种执行方案)第30页/共65页第三十一页,共65页。【例】 从键盘输入不同的字母,显示不同的国家(guji)名称。 #include main() char ch; ch=getchar(); switch(ch) case a: printf(“American”); case b: printf(“Britainn”); case c: printf(“Chinan”); case d: printf(“Denmarkn”); default: printf(“Japann”); 4.执行完一个case后面的语句后,流程控制转移到下一个case继续执行。 “case常量表达式”只是起语句标号的作用,并不在该处进行条件(tiojin)判断。第31页/共65页第三十二页,共65页。注意(zh y),case及default的位置直接影响到程序的运行结果。#include main() char ch; ch=getchar(); switch(ch) default: printf(“Japann”); case a: printf(“American”); case b: printf(“Britainn”); case c: printf(“Chinan”); case d: printf(“Denmarkn”); 第32页/共65页第三十三页,共65页。程序运行时,从键盘输入字母(zm)“a”,显示: America Britai China Denmark Japan如果输入(shr)字母“b”,显示:“Japan”。 Britain China Denmark Japan如果输入a、b、c、d以外(ywi)的字母,显示: Japan第33页/共65页第三十四页,共65页。5.case后面虽然(surn)包括一个以上语句,但可以不必用花括弧括起来,会自动顺序执行本case后所有的语句。7.多个case可以共用一组执行语句。如: . . . case A: case B: case C: printf(“60n”);break; . . .值为A,B,或C时都执行同一组语句。第34页/共65页第三十五页,共65页。2. break语句(yj)break与switch联用,强迫控制立即退出switch防止从一个case下落到另一个case中防止因case和default位置的改变而影响程序的运行结果第35页/共65页第三十六页,共65页。【例】 在例4.6程序(chngx)中加入break。#include main() char ch; ch=getchar(); switch(ch) case a: printf(“American”);break; case b: printf(“Britainn”);break; case c: printf(“Chinan”);break; case d: printf(“Denmarkn”);break; default: printf(“Japann”);break;第36页/共65页第三十七页,共65页。switch和break语句的使用 如果(rgu)每个case和default中都有break语句,那么,case和default出现的次序 不会影响程序的运行结果。第37页/共65页第三十八页,共65页。4.2 循环(xnhun)结构语句循环是对同一程序重复执行若干次,被重复执行的部分称为循环体.每循环一次需要进行判断一决定是继续循环还是中止循环.决定循环继续还是中止的判断条件是循环中止条件,循环体和循环中止条件组成循环语句.在语言(yyn)中,可用以下语句实现循环:(1)用for语句。(2)用do-while语句。(3)用while语句。(4)用goto语句和if语句构成循环。第38页/共65页第三十九页,共65页。4.2.1 使用if/goto构成循环goto为无条件转向条件,他的一般形式: goto 语句标号语句功能(gngnng):执行完本句后,无条件跳转到语句标号所标示的语句去执行。语句标号也是标识符。语句标号和语句之间以“:”分隔。goto语句主要用途:1.与if语句一起构成循环语句。2.从循环体内跳转到循环体外。第39页/共65页第四十页,共65页。求1100的累计和。根据已有的知识,可以用“1+2+100”来求解,但显然很繁琐。现在换个思路来考虑:首先设置一个(y )累计器sum,其初值为0,利用sum += n来计算(n依次取1、2、100),只要解决以下3个问题即可: (1)将n的初值置为1; (2)每执行1次“sum += n”后,n增1; (3)当n增到101时,停止计算。此时,sum的值就是1100的累计和。main() int n=1, sum=0; loop: sum += n; n+; if (n=100) goto loop; printf(“sum=%dn”, sum);其中“loop:”为语句标号(格式:标号: 语句行),其命名遵循标识符命名规则。goto语句格式:goto 标号,功能为:使系统(xtng)转向标号所在的语句行执行。第40页/共65页第四十一页,共65页。4.2.2 while循环也称为“当型”循环,一般形式为: while(循环继续条件(tiojin) 循环体语句组;执行过程: 1)求解“循环继续条件(tiojin)”表达式。如果其值为非0,转2);否则转3)。2)执行循环体语句组,然后转1)。3)推出while循环。特点: 先判断表达式,后执行语句。表达式语句非00第41页/共65页第四十二页,共65页。案例5.3 用while语句求1100的累计和。main() int i=1,sum=0; /*初始化循环控制变量i和累计器sum*/ while( i=100 ) sum += i;/*实现累加*/ i+;/*循环控制变量i增1*/ printf(“sum=%dn”,sum); 程序运行情况如下: sum=5050若循环体改为(i wi):while( i=100 ) i+; sum += i; 则结果为:sum=5150少加了第一项的值1,多加了最后一项101表达式i=1sum=sum+ii=i+1真假循环体若包含一个以上(yshng)语句,应用花括号括起来第42页/共65页第四十三页,共65页。4.2.3 do-while循环1一般格式 do 循环体语句组; while(循环继续条件);/*本行的分号不能缺省*/当循环体语句组仅由一条语句构成时,可以不使用复合语句形式。2执行过程执行过程如图5-3所示。(1)执行循环体语句组。(2)计算“循环继续条件”表达式。如果(rgu)“循环继续条件”表达式的值为非 0(真),则转向(1)继续执行;否则,转向(3)。(3)退出循环。do-while循环语句的特点是:先执行循环体语句组,然后再判断循环条件。第43页/共65页第四十四页,共65页。do-while循环和while循环十分相似,他们的重要区别是:While循环的控制出现在循环体之前,只有while后面的表达式的值为非零时,才可能执行(zhxng)循环体;在do-while循环中,总是先执行(zhxng)一次循环体后再求表达式的值,因此,无论表达式的值为0或非0,循环体都至少要执行(zhxng)一次。案例 用do-while语句求解1100的累计和。main() int i=1, sum=0; /*定义(dngy)并初始化循环控制变量,以及累计器*/ do sum += i; /*累加*/ i+; while(i=100);/*循环继续条件:i=100*/ printf(“sum=%dn”,sum); 说明: while (表达式)后的分号不能丢,他表示do-while 语句的结束。第44页/共65页第四十五页,共65页。4.2.4 for循环1for语句的一般格式 for(变量赋初值;循环继续条件;循环变量增值) 循环体语句组;2for语句的执行过程执行过程如图5-1所示。(1)求解“变量赋初值”表达式。(2)求解“循环继续条件”表达式。如果其值非0,执行(3);否则,转至(4)。(3)执行循环体语句组,并求解“循环变量增值”表达式,然后转向(zhunxing)(2)。(4)退出循环。第45页/共65页第四十六页,共65页。3说明(1)“变量赋初值”、“循环继续条件”和“循环变量增值”部分均可缺省,1) “变量赋初值”可省略,此时应在for语句前给循环控制变量赋初值。例: k=1; for(;k=100;k+) sum+=k;2) “循环继续条件”可省略,此时系统认为其始终为真,循环将无限循环下去,除非循环体内有break语句。3) “循环变量增值”可以省略,此时应在循环体内修改循环变量,使循环能正常结束。例: for(k=1;k=100;) sum+=k; k+甚至全部缺省,但其间的分号不能省略。三个都省略时,因为缺少(qusho)条件判断,循环将会无限执行。第46页/共65页第四十七页,共65页。2)当循环体语句组仅由一条语句构成时,可以不使用复合语句形式。(3)“循环变量赋初值”表达式,既可以是给循环变量赋初值的赋值表达式,也可以是与此无关的其它表达式(如逗号表达式)。例如,for(sum=0;i=100;i+) sum += i; for(sum=0,i=1;i=100;i+) sum += i;(4)“循环继续条件”部分是一个逻辑(lu j)量,除一般的关系(或逻辑(lu j))表达式外,也允许是数值(或字符)表达式。案例 求1100的累计和。main() int i,sum=0; /*将累加器sum初始化为0*/ for(i=1; i=100; i+) sum += i;/*实现累加*/ printf(sum=%dn,sum); 第47页/共65页第四十八页,共65页。案例 求n的阶乘(ji chn)n!(n!=1*2*n)。main() int i, n; long fact=1; /*将累乘器fact初始化为1*/ printf(“Input n: ”); scanf(“%d”, &n); for(i=1; i=n; i+) fact *= i;/*实现累乘*/ printf(%d ! = %ldn, n, fact); 程序运行情况如下:Input n: 5 5 ! = 120第48页/共65页第四十九页,共65页。4.2.5 几种循环(xnhun)的比较1.四种循环一般情况(qngkung)下可相互替代,但不提倡用goto构成的循环。2.while和do-while循环只有在条件第一次就不满足时才有区别,for循环功能强,能用while循环完成得也能用for完成。3.用while和do-while循环时,循环变量初始化应该在while和do-while语句之前完成,而for语句循环变量的初始化可以放在(语句1)中4. While,do-while循环和for循环都可以用break跳出循环,用continue结束本次循环,但对goto和if构成的循环则失效。第49页/共65页第五十页,共65页。一个循环体内(t ni)又包含另一个完整的循环结构,称为循环嵌套。内层的循环中还可以嵌套循环,构成多重循环。三种循环可以相互嵌套。while ( ) while ( ) while ( ) for ( ; ; ) for ( ; ; ) for ( ; ; ) for ( ; ; ) do while( ); do do while ( ); while ( );while ( ) do while( ); 第50页/共65页第五十一页,共65页。1. 一个二重循环的例子(l zi)【例4.12】 打印六以内的乘法表。 main() int i,j; for (i=1;i=6;i+) for (j=1;j=6;j+) printf(“%d*%d=%2d”,i,j,i*j); printf(“n”); 第51页/共65页第五十二页,共65页。程序运行结果(ji gu)是:1*1= 1 1*2= 2 1*3= 3 1*4= 4 1*5= 5 1*6= 6 2*1= 2 2*2= 4 2*3= 6 2*4= 8 2*5=10 2*6=12 . . .6*1= 6 6*2=12 6*3=18 6*4=246 6*5=30 6*6=36 如果将程序中的内外层循环终止条件改成9,就可以打印九九乘法表。第52页/共65页第五十三页,共65页。2. 嵌套循环的使用1) 内层循环必须完全包含在外层循环中,二者不能使用相同的循环变量,不能出现交叉(jioch)。2) 循环嵌套的层数没有限制,但层数太多,可读性变差。3) 为了使嵌套的层次关系清晰明了,建议采用缩排格式书写程序。第53页/共65页第五十四页,共65页。4.2.7 break语句(yj)和continue语句(yj)第54页/共65页第五十五页,共65页。break用在循环(xnhun)中,只能退出它所在的那一层循环(xnhun),即 for (.) . while (.) . if (.) break; do . if () break; while (.); . . 不能期望用break从最内层循环(xnhun)一下子退出最外层循环(xnhun)第55页/共65页第五十六页,共65页。2. contiune 语句(yj)第56页/共65页第五十七页,共65页。for (.) . if (.) . continue; . 第57页/共65页第五十八页,共65页。【例】continue语句(yj)的应用示例。 main() int i=1; while (i=100) if (i%3!=0) i+; continue; printf(“%d”,i); i+; printf(“n”); 第58页/共65页第五十九页,共65页。判断(pndun)某一年是否为闰年举例(j l)第59页/共65页第六十页,共65页。例:判断某一年是否(sh fu)为闰年。year被4整除假leap=0真year被100整除假leap=1真year被400整除假leap=0真leap=1leap真输出(shch)“闰年”假输出(shch)“非闰年”(year%4=0 & year%100!=0) | (year%400=0)第60页/共65页第六十一页,共65页。main() int year; scanf(“%d”,&year); if(year%4=0 & year%100!=0) | (year%400=0) printf(“%d is a lead yearn”,year); else printf(“%d is not a lead yearn”,year”); 例2:判断(pndun)m是否是素数第61页/共65页第六十二页,共65页。问题分析:令k=m-1,让m被2到k除,如果不能被其中的任何一个整数整除,则m为素数。数学证明:k= m时同样成立。 算法设计:如果m能被其中的第i个整数整除,则循环提前结束,此时的i一定小于或等于k;如果m不能被之中的任何一个整数整除,则在完成最后一次循环后i还加1,因此i=k+1,然后才退出循环。在循环之后通过判断的的值是否大于或等于k+1,就知道i是否被整除过.第62页/共65页第六十三页,共65页。程序(chngx)如下: #include main() int m,i,k; scanf(“%d”,&m); k=sqrt(m); for(i=2;i=k+1) printf(“%d is a prime numbern”,m); else printf(“%d is not a prime numbern”,m); 第63页/共65页第六十四页,共65页。第64页/共65页第六十五页,共65页。
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!