
第四部分程序流程控制语句ppt课件.ppt
75页第四章第四章 程序流程控制程序流程控制语句句• C C言语的根本语句言语的根本语句• 上机调试程序的方法上机调试程序的方法• 根本的程序设计方法根本的程序设计方法• 输出简单图形输出简单图形• 穷举法穷举法本本 章章 要要 点点第四章第四章 程序流程控制程序流程控制语句句第一第一节 C C言言语语句概述句概述第四章第四章第二第二节 注注释语句句第四章第四章第三第三节 复合复合语句句第四章第四章第四第四节 选择语句句第五章第五章第五第五节 循循环语句句第六章第六章第六第六节 转移移语句句第六章第六章第七第七节 简单运用运用综合合举例例§4-1 C§4-1 C言言语语句概述句概述l按照按照C言言语语句的作用分句的作用分类::l阐明明语句句l注注释语句句l程序流程控制程序流程控制语句句声明声明变量称号、数据量称号、数据类型及型及其存其存储属性的属性的阐明性明性语句句编程者程者对程序本身的解程序本身的解释是是““可可执行〞的行〞的语句,构句,构成程序的主体成程序的主体§4-1 C§4-1 C言言语语句概述句概述- -语句分句分类选择语句句if - elseswitchforwhiledo - while循循环语句句转移移语句句breakcontinuegotoreturn标号号语句句表达式表达式语句句casedefault标标号号赋值表达式表达式+分号分号(;)§4-1 C§4-1 C言言语语句概述句概述- -语句分句分类l按照按照C言言语语句的功能分句的功能分类::l控制控制语句句l 函数函数调用用语句句l 表达式表达式语句句l 空空语句句l 复合复合语句句控制程序的走向〔流程〕控制程序的走向〔流程〕由一个函数由一个函数调用加一个分号用加一个分号赋值表达式加分号表达式加分号只需一个分号只需一个分号 ;;一一对{ }括起来的括起来的语句序列句序列§4-1 C§4-1 C言言语语句概述句概述- -简单实例例#include
句l复合复合语句的目的句的目的l语法上等价于法上等价于单一一语句因此在C言句因此在C言语中,中,凡是可以运用凡是可以运用单一一语句的地方,均可运用句的地方,均可运用复合复合语句l明确明确层次关系次关系l复合复合语句的运用方法句的运用方法l复合复合语句允句允许嵌套,且嵌套嵌套,且嵌套层次没有限制次没有限制l对于复合于复合语句,右花括号句,右花括号“}〞的后面不}〞的后面不用再跟一个分号〔;〕用再跟一个分号〔;〕§4-3 §4-3 复合复合语句句- -实例例l例例C3_3001.C: C3_3001.C: 判别输入整数的正负性和奇偶性判别输入整数的正负性和奇偶性l1.main( )1.main( )l2.{2.{int x;int x;l3. 3. printf("Enter a integer:"); scanf("%d",&x); printf("Enter a integer:"); scanf("%d",&x); l4.4.if (x!=0)if (x!=0)l5. 5. { /* { /* 处置处置x x不等于不等于0 0的情的情况况 */ */l6. if (x>0) /* 6. if (x>0) /* 假设假设x x大于大于0 0成成立立 */ */l7. { x = x%2; /* 7. { x = x%2; /* 那么计算那么计算x x除以除以2 2的余的余数数 */ */l8. if (x==0) printf(8. if (x==0) printf(〞〞Is a plus even.\n");Is a plus even.\n");l9. else printf(9. else printf(〞〞Is a plus odd Is a plus odd number\n");number\n");l10. }10. }l11. else /* 11. else /* 否那么,处置否那么,处置x x为负数的情为负数的情况况 */ */l12. { x = x%2; /* 12. { x = x%2; /* 计算计算x x除以除以2 2的余数的余数 */*/l13. if (x==0) printf(13. if (x==0) printf(〞〞Is a minus even.\n");Is a minus even.\n");l14. else printf(14. else printf(〞〞Is a minus odd Is a minus odd number\n");number\n");l15. }15. }l16.16.} }l17.17.else printf ("This integer is zero.\n");else printf ("This integer is zero.\n");l18.}18.}§4-4 §4-4 选择语句句l提出提出问题l二重分支的条件二重分支的条件语句句 ifl多重分支的条件多重分支的条件语句句 switch根据学生分数判别能否及格?根据学生分数判别能否及格?根据学生分数如何进展分级?根据学生分数如何进展分级?如何处理如何处理?自然言自然言语:假:假设… 那么那么… 否那么否那么…C言言语:: 分支分支语句句§4-4-1 §4-4-1 选择语句句-if-if语句句lif语语句格式句格式l 格式格式1::if (表达式表达式) 语语句;句;l 格式格式2::if (表达式表达式) 语语句句1;;lelse 语语句句2;;lif语语句的句的执执行流程行流程l流程流程1:: 流程流程2::表达式表达式执行语句执行语句成立成立不成立不成立表达式表达式执行语句执行语句2执行语句执行语句1成立成立不成立不成立分支条件分支条件§4-4-1 §4-4-1 选择语句句-if-if语句句l 例例C3_4101.CC3_4101.C:求:求a a和和b b两数中两数中较大的一个。
大的一个l#include
大的一个l#include 求商l main( ) main( )l{ int a,b;{ int a,b;l printf("Enter two numbers: "); printf("Enter two numbers: ");l scanf("%d%d", &a, &b); scanf("%d%d", &a, &b);l if (b!=0) printf("%d\n", a/b); if (b!=0) printf("%d\n", a/b);l else printf("cannot divide by else printf("cannot divide by zero.\n");zero.\n");l} }b?printf ...printf...非非 00if (b) printf("%d\n", a/b);if (b) printf("%d\n", a/b);else printf(else printf(〞〞error.\n");error.\n");等价!等价!§4-4-1 §4-4-1 选择语句句-if-if语句句lifif语语句嵌套句嵌套义义:在:在ifif语语句的句的““语语句句1 1〞或〞或““语语句句2 2〞〞中又包含着中又包含着ifif语语句句l例例C3_4103.CC3_4103.C:比:比较较两个整数的之两个整数的之间间的关系的关系〔 〔大小大小/ /相等相等〕 〕。 l #include 次l留意:留意:缩进仅是一种是一种书写的方式,不具有写的方式,不具有逻辑意意义§4-4-1 §4-4-1 选择语句句-if-if语句句l嵌套嵌套if-elseif-else语句的配句的配对关系关系l 例:例:if(a>b)if(a>b) /*………………………………1 *//*………………………………1 */l if(a>c) if(a>c) /*………………………………2 *//*………………………………2 */l if(a>d) flag=1; if(a>d) flag=1;/*………………………………3 *//*………………………………3 */l else flag=2; else flag=2;/*………………………………4 *//*………………………………4 */l else flag=3; else flag=3;/*………………………………5 *//*………………………………5 */l 问题:第四行和第五行的:第四行和第五行的elseelse语句与哪一句与哪一个个ifif语句相匹配呢句相匹配呢? ?l 分析:匹配方案可以有很多种分析:匹配方案可以有很多种,(2-4,1-,(2-4,1-5),(3-4,2-5),(1-4,…)…5),(3-4,2-5),(1-4,…)…l匹配匹配规那么:在嵌套的那么:在嵌套的if-elseif-else语句中,句中,elseelse子句子句总是与上面的、离它最近的、且在同一是与上面的、离它最近的、且在同一复合复合语句中句中还没有配没有配对的的ifif子子语配配对。 §4-4-1 §4-4-1 选择语句句-if-if语句句1 1、、if (a>b)if (a>b)if (a>c)if (a>c) if (a>d) flag=1; if (a>d) flag=1; else flag=2; else flag=2;else flag=3;else flag=3;程序含程序含义:当:当 c>=a>b c>=a>b 时,,flag=3flag=32 2、、if (a>b)if (a>b) { { if (a>c) if (a>c) if (a>d) flag=1; if (a>d) flag=1; else flag=2; else flag=2;} } /* /* 以上是一个完好的复合以上是一个完好的复合语句句 */ */else flag=3;else flag=3;程序含程序含义:当:当 a<=b a<=b 时,,flag=3 flag=3 §4-4-1 §4-4-1 选择语句句-if-if语句句3 3、、if (a==b)if (a==b) if (b==c) printf("a=b=c\n"); if (b==c) printf("a=b=c\n"); else printf( else printf(〞〞a!=b\na!=b\n〞〞); ); 虽然然书写格式如此,真写格式如此,真实的正确的含的正确的含义是:是: if (a==b) if (a==b) if (b==c) printf("a=b=c\n"); if (b==c) printf("a=b=c\n"); else printf("a!=b\n else printf("a!=b\n〞〞); ); 经过加加{ }{ },可以改,可以改动配配对关系:关系: if (a==b) if (a==b) { if (b==c) printf("a=b=c\n"); { if (b==c) printf("a=b=c\n"); } } else printf( else printf(〞〞a!=b\na!=b\n〞〞); ); §4-4-1 §4-4-1 选择语句句-if-if语句句l例例C3_4104.CC3_4104.C:知:知银行整存整取存款月息利率行整存整取存款月息利率分分别为::l 一年期:一年期:0.63% 0.63% 二年期:二年期:0.66%0.66%l 三年期:三年期:0.69% 0.69% 五年期:五年期:0.75%0.75%l 八年期:八年期:0.84% 0.84% 其它:其它:0 0l 要求要求输入存入存钱的本金和期限,求到期的本金和期限,求到期时利利息与本金合息与本金合计。 银行到期利息行到期利息计算公式:算公式:l利息=本金利息=本金××月息利率月息利率×12××12×存款年限存款年限l 程序中程序中该当根据存款的年限确定利率当根据存款的年限确定利率§4-4-1 §4-4-1 选择语句句-if-if语句句 #include 构造改写l #include lASCIIASCII码表中的前表中的前3232个字符个字符为控制字符,控制字符,‘0’‘0’~~‘9’‘9’为数数字字, ‘A’, ‘A’~~‘Z’‘Z’为大写字母大写字母, ‘a’, ‘a’~~‘z’‘z’为小写字母,其它小写字母,其它l #include §4-4-1 §4-4-1 选择语句句-if-if语句句lifif语语句与条件运算的区句与条件运算的区别别:条件运算符方式比:条件运算符方式比较简单较简单,,有有较较强强的灵敏性,可以替代部分的灵敏性,可以替代部分ifif语语句l例:例:if ( cans==1 )if ( cans==1 )l printf( printf(〞〞You need 1 can of paint.You need 1 can of paint.〞〞););l else else printf( printf(〞〞You need 2 cans of paint. You need 2 cans of paint. 〞〞););l 转换转换::(cans==1)? printf((cans==1)? printf(〞〞You need 1 can of You need 1 can of paint.paint.〞〞) ) : printf( : printf(〞〞You need 2 You need 2 cans of paint.cans of paint.〞〞););l 转换转换::printf(cans==1? printf(cans==1? 〞〞You need 1 can of You need 1 can of paint.paint.〞〞l : : 〞〞You need 2 You need 2 cans of paint.cans of paint.〞〞););l 转换转换::printf (printf (〞〞You need %d %s of paint.You need %d %s of paint.〞〞, , cans , cans==1 ? cans , cans==1 ? 〞〞cancan〞〞 : : 〞〞canscans〞〞 ); );l可以在函数中方便地运用条件运算可以在函数中方便地运用条件运算§4-4-2 §4-4-2 选择语句句-switch-switch语句句lswitch语语句格式句格式l switch (表达表达式式)l{lcase 常量常量1:l 语语句句序列序列1l break; lcase 常量常量2:l 语语句序列句序列2l break;l …… l default: l 语语句句序列序列n+1 l}执行语句序列1=常量常量1??计算表达式的值计算表达式的值相等相等不相等不相等break执行语句序列2=常量常量2??相等相等不相等不相等break执行语句序列n+1有有default?有有没有没有§4-4-2 §4-4-2 选择语句句-switch-switch语句句switch (number){ case 1: statement 1;break;case 2: statement 2;break;case 3: statement 3;break;default: statement 4;}statement 5;当当number的的值为2时§4-4-2 §4-4-2 选择语句句-switch-switch语句句lswitch语语句运用本卷句运用本卷须须知知l1.switch语语句与句与if语语句不同,句不同,仅仅能判能判别别一种一种关系:能否恒等。 关系:能否恒等l2.switch语语句中句中case子句的常量可以是整型子句的常量可以是整型常量、字符型常量、枚常量、字符型常量、枚举举型数据,或是整型常型数据,或是整型常量表达式,不允量表达式,不允许许是是变变量l3.在同一个在同一个switch中,中,case子句的常量不能子句的常量不能一一样样;在嵌套的;在嵌套的switch语语句中,不同句中,不同层层次的次的switch之之间间,可有一,可有一样样的常量l4.default子句可以省略子句可以省略l5.case 和和 default 子句只能在子句只能在switch语语句中句中运用,且运用,且 case和和 default 只起只起标标号作用,可出号作用,可出如今如今switch中的任何位置中的任何位置l6.case 和和 default 子句后面的子句后面的语语句序列允句序列允许许由多个可由多个可执执行行语语句句组组成,且不用用成,且不用用“{{ }〞括}〞括起来,也可以起来,也可以为为空空语语句l7.switch语语句中可省略句中可省略break语语句,但省略句,但省略后会改后会改动动流程§4-4-2 §4-4-2 选择语句句-switch-switch语句句l例例C3_4104.CC3_4104.C::计算存款本利。 采用算存款本利采用switchswitch改写l #include 月天数l如何判如何判别闰年?年?l 闰年:可以被年:可以被4 4整除且不能被整除且不能被100100整除的年份整除的年份l 或或 可以被可以被400400整除的年份整除的年份l 例如:例如:20192019年、年、19801980年是年是闰年年l 1970 1970年、年、19001900年是平年年是平年l 2000 2000年是年是闰年年l判判别闰年的年的C C言言语公式公式lyear%4==0 && year%100!=0 || year%400==0year%4==0 && year%100!=0 || year%400==0l 当当year=2019year=2019时,,结果果为1 1l 当当year=2019year=2019时,,结果果为0 0l 当当year=1900year=1900时,,结果果为0 0l 当当year=2000year=2000时,,结果果为1 1 假设为闰年:结果为假设为闰年:结果为1假设为平年:结果为假设为平年:结果为0§4-4-2 §4-4-2 选择语句句-switch-switch语句句 main( ) main( ){ int year, month, days;{ int year, month, days; scanf("%d%d", &year, &month); scanf("%d%d", &year, &month); switch (month) switch (month) { case 1: case 3: case 5: case 7: { case 1: case 3: case 5: case 7: case 8: case 10: case 12: /* case 8: case 10: case 12: /* 处置置““大〞月大〞月 */ */ days=31; break; days=31; break; case 4: case 6: case 9: case 11: /* case 4: case 6: case 9: case 11: /* 处置置““小〞月小〞月 */ */ days=30; break; days=30; break; case 2: /* case 2: /* 处置置““平〞月平〞月 */ */ if ( year%4==0 && year%100!=0 || year%400==0 ) if ( year%4==0 && year%100!=0 || year%400==0 ) days=29; /* days=29; /* 假假设是是闰年年 */ */ else else days=28; /* days=28; /* 不是不是闰年年 */ */ break; break; default: /* default: /* 月份月份错误 */ */ printf("Input error!\n"); printf("Input error!\n"); days=0; days=0; } } if (days!=0) printf( if (days!=0) printf(〞〞%d,%d is %ddays\n",year,month,days);%d,%d is %ddays\n",year,month,days);} }省略省略case子句之后的语句子句之后的语句§4-4-2 §4-4-2 选择语句句-switch-switch语句句l省略省略breakbreak语句句l 例如:某程序段中,例如:某程序段中,errorerror是是进展出展出错处置的函数。 置的函数l flag=-1; /* error marker flag=-1; /* error marker */*/lswitch (i)switch (i)l{ case 1: case 2: case 3:{ case 1: case 2: case 3:l flag=0; /* no error */flag=0; /* no error */l break;break;l case 4: case 4: flag=1; /* error #1 */flag=1; /* error #1 */l case 5: case 5: error(flag); /* error process error(flag); /* error process */*/l break;break;l default: default: flag=2; /* other error */flag=2; /* other error */l} } /* /* 假定函数假定函数errorerror是出是出错处置函数置函数 */ */l当当 i=1 i=1,,2 2,,3 3 时::flag=0flag=0;退出。 退出l当当 i=5 i=5 时::flag = -1flag = -1;;调用用erorr(flag)erorr(flag);退出l当当 i=4 i=4 时::flag = 1flag = 1;;调用用 error(flag) error(flag);退出§4-4-2 §4-4-2 选择语句句-switch-switch语句句l例例C3_4202.CC3_4202.C::请编写一个程序写一个程序计算表达式:算表达式:data1 op data2data1 op data2的的值l main ( ) main ( )l { {float data1, data2;char op;float data1, data2;char op; /* /* 定定义操作数、操作符操作数、操作符变量量 */ */lprintf("Enter your expression:");printf("Enter your expression:");lscanf (scanf (〞〞%f%c%f%f%c%f〞〞, &data1, &op, &data2); /* , &data1, &op, &data2); /* 输入表入表达式达式 */ */lswitch ( op ) switch ( op ) /* /* 根据操作符分根据操作符分别进展展处置置 */ */l{ case ’+’ : { case ’+’ : /* /* 处置置加法加法 */ */l printf("%.2f+%.2f=%.2f\n", data1, data2, printf("%.2f+%.2f=%.2f\n", data1, data2, data1+data2);break;data1+data2);break;l case ’-’ : case ’-’ : /* /* 处置置减法减法 */ */lprintf ("%.2f-%.2f=%.2f\n", data1, data2, data1-printf ("%.2f-%.2f=%.2f\n", data1, data2, data1-data2);break;data2);break;l case ’*’ : case ’*’ : /* /* 处置乘法置乘法 */ */lprintf ("%.2f*%.2f=%.2f\n", data1, data2, printf ("%.2f*%.2f=%.2f\n", data1, data2, data1*data2);break;data1*data2);break;l case ’/’ : case ’/’ : /* /* 处置除法置除法 */ */lif ( data2==0 )if ( data2==0 ) /* /* 假假设除除数数为00 */ */l printf ("Division by zero.\n"); printf ("Division by zero.\n");lelseelsel printf ("%.2f/%.2f=%.2f\n", data1, data2, printf ("%.2f/%.2f=%.2f\n", data1, data2, data1/data2);data1/data2);l break; break;l default: default: /* /* 输入其它运入其它运算符算符 */ */l printf ("Unknown operater.\n");printf ("Unknown operater.\n");l } }l } }例例例例C3_4202C3_4202C3_4202C3_4202§4-5 §4-5 循循环语句句l提出提出问题提提问:从:从键盘上上输入入10个整数并求和,怎个整数并求和,怎样编程?程?回答:在程序中写入回答:在程序中写入10个个scanf( )语句。 句提提问:从:从键盘上上输入入500个整数并求和,怎个整数并求和,怎样编程?程?回答:回答:这个,个,嗯……??? 不会不会让我写我写500个个......教教师::让我我们换一个角度来一个角度来对待待这些些问题,, 以上以上问题的本的本质是:将是:将scanf函数反复函数反复执行行N遍学生:学生:对!好象是!好象是这么回事么回事......教教师:我:我们可以引出一个概念可以引出一个概念“循循环〞,〞,简单而言:循而言:循环就是不断反复地就是不断反复地执行同一段程序行同一段程序学生:学生:这就是我就是我们今天要学的新今天要学的新东西?西?§4-5 §4-5 循循环语句句l循循环l 反复反复执行同一段程序,直到行同一段程序,直到满足足一定的条件后才停一定的条件后才停顿执行行该段程序lC言言语中控制循中控制循环的的语句:句:l whilel forl do-while§4-5-1 while§4-5-1 while语句句lwhile语语句格式句格式lwhile ( 表达式表达式 ) 语语句;句;l阐阐明:明:语语句部分可以是句部分可以是简单语简单语句,也可句,也可以是复合以是复合语语句。 句lwhile语语句的句的执执行流程行流程表达式表达式?执行语句成立成立不成立不成立执行while循环之后的语句循环控制条件循环控制条件循环体循环体§4-5-1 while§4-5-1 while语句句- -实例例l例例C3_5101.C C3_5101.C 从从键盘输入入1010个整数,求个整数,求这1010个整数个整数的和l #include 〞l结论::while语句循句循环体中,一定要有可以体中,一定要有可以对循循环控控制条件制条件产生影响的生影响的语句防止出句防止出现“死循死循环〞景象例例例例C3_51011C3_51011C3_51011C3_51011{}§4-5-1 while§4-5-1 while语句句- -实例例l例例1:分析以下程序段:分析以下程序段l index=1;lwhile ( index < 5 )lprintf(〞〞Good morning!\n〞〞);l分析:分析:l 程序段将无限制打印字符串程序段将无限制打印字符串l 由于循由于循环中没有任何中没有任何语句可以改句可以改动循循环控制控制变量量index的初的初值1§4-5-1 while§4-5-1 while语句句- -实例例l例例2 2:分析以下程序段:分析以下程序段l index=1; index=1;lwhile( -- index < 5 )while( -- index < 5 )lprintf(printf(〞〞Good morning!\nGood morning!\n〞〞););l分析:分析:l 仍有仍有问题,程序改,程序改动了了indexindex,但方向,但方向错了。 了l 在在indexindex到达系到达系统可以可以处置的最大置的最大负数数时,,将会将会产生下溢而生下溢而终止程序l结论::l 循循环体中必需有可以使循体中必需有可以使循环正常停正常停顿的条件§4-5-1 while§4-5-1 while语句句- -实例例l例例C3_5103.CC3_5103.C:从:从键盘中中读入一系列字符,直到入一系列字符,直到输入字入字母母a a时才停才停顿l分析:由于不知道要分析:由于不知道要输入的字符数量,只知停入的字符数量,只知停顿条条件是件是输入字母入字母a a,那么只能将循,那么只能将循环控制条件控制条件设为ch!='a'ch!='a'l #include 数l分析:分析:\n\n作作为行行终了了标志的,志的,DOSDOS中有中有[CTRL+Z][CTRL+Z]作作为文件文件终了了标志志l #define EOF -1 #define EOF -1l#include 的之和l main ( ) main ( )l{ int total=0, i=1; { int total=0, i=1; l while ( i <= 100 ) while ( i <= 100 )l { {total = total + i;total = total + i;l i ++;i ++;l } }l printf( printf(〞〞Total=%d\n", total);Total=%d\n", total);l} }例例例例C3_51041C3_51041C3_51041C3_51041 变形形1 1::while ( i <= 100 )while ( i <= 100 ) total += i++; total += i++;==> total+=i; ++i==> total+=i; ++i 变形形2 2::int i=0;int i=0; while ( ++i <= 100 ) while ( ++i <= 100 ) ==> ++i; ==> ++i; 判判别i<=100i<=100 total += i; total += i; 变形形3 3::int i=0;int i=0; while ( i++ < 100 ) while ( i++ < 100 ) ==> ==> 判判别i<100i<100;;i++i++ total += i; total += i; 变形形4 4::int i=0;int i=0; while ( i < 100 ) while ( i < 100 ) total += ++i; total += ++i;==> ++i; total+=i==> ++i; total+=i§4-5-1 while§4-5-1 while语句句- -实例例l循循环嵌套嵌套l 在循在循环体中,又包含有循体中,又包含有循环语句,构成循句,构成循环嵌套。 嵌套l例例C3_5107.C::输出下三角形乘法九九表出下三角形乘法九九表l 1 2 3 4 5 6 7 8 9l---------------------------------------l 1l 2 4l 3 6 9l 4 8 12 16l 5 10 15 20 25l 6 12 18 24 30 36l 7 14 21 28 35 42 49l 8 16 24 32 40 48 56 64l 9 18 27 36 45 54 63 72 81l 假假设:行号:行号为i ,列号,列号为ji=6i=6j=5j=5i*ji*j(1<=i<=9)(1<=i<=9)(1<=j<=i)(1<=j<=i) 那么:第那么:第 i i 行中一共要行中一共要输出出 i i 个乘个乘积§4-5-1 while§4-5-1 while语句句- -实例例 #include 输出第出第i i行行 */ */ { printf ("%4d", i*j ); { printf ("%4d", i*j ); j ++; /* j ++; /* 列列计数器数器+1 */+1 */ } } printf ("\n"); /* printf ("\n"); /* 一行一行输出出终了后,了后,输出出\n */\n */ i ++; /* i ++; /* 行行计数器数器+1 */+1 */ } }} }例例例例C3_5107C3_5107C3_5107C3_5107外外层循循环体体执行行1次,内次,内层循循环要完好要完好执行行1次次§4-5-1 while§4-5-1 while语句句- -实例例lwhile运用留意运用留意l 1.while (0) { .... } 由于循由于循环环的条件表达式恒的条件表达式恒等于等于0,循,循环环体永体永远远也不会也不会执执行,是行,是编编程者的程者的错误错误。 l 2.while (1) { .... } 由于循由于循环环的条件表达式恒的条件表达式恒等于等于1,所以不能,所以不能够经过够经过循循环环控制条件来控制条件来终终了了循循环环体的体的执执行,称行,称为为“死循死循环环〞l 3.为为了保了保证证循循环环正常运正常运转转,,应该应该特特别别留意:留意:l 循循环环控制条件控制条件l 控制条件的初始形状控制条件的初始形状〔 〔初始初始值值〕 〕l 循循环环体内部体内部对对控制条件的影响控制条件的影响§4-5-2 for§4-5-2 for语句句lfor语语句格式句格式lfor (表达式表达式1;表达式;表达式2;表达式;表达式3) 语语句;句;lfor语语句的句的执执行流程行流程循循环初始条件初始条件循循环控制条件控制条件表达式表达式2?执行语句成立成立不成立不成立执行for循环之后的语句执行表达式3执行表达式1循循环体体forfor语语句等价于以下句等价于以下语语句:句:表达式表达式1 1;;while while 〔 〔表达式表达式2 2〕 〕{ { 语语句;句; 表达式表达式3 3;;} }§4-5-2 for§4-5-2 for语句句- -实例例l例例C3_5203.CC3_5203.C:求:求1 1到到1010的的阶乘。 乘l递推公式:推公式:n! = 1n! = 1 当当 n=1 n=1 时ln! = (n-1)! * nn! = (n-1)! * n当当 n>1 n>1 时l #include 打印乘法九九表l #include 都是可以省略的,但是分号不能省略l1.1.省略表达式省略表达式2 2,那么:,那么:lforfor〔表达式〔表达式1 1;; ;表达式;表达式3 3〕〕l 就构成了一个死循就构成了一个死循环l2.2.省略表达式省略表达式1 1和表达式和表达式3 3,那么:,那么:lforfor〔;表达式〔;表达式2 2;〕;〕l 等同于:等同于: while while〔〔 表达式表达式 〕〕l 据此据此结论:一切用:一切用whilewhile语句句实现的循的循环都可以用都可以用forfor语句句实现l3.3.表达式表达式1 1、、2 2、、3 3全省略,那么:全省略,那么:lfor ( ; ; )for ( ; ; )l 等同于:等同于: while (1) while (1)§4-5-2 for§4-5-2 for语句句- -实例例l例例C3_5204.CC3_5204.C:数列:数列1 1、、1 1、、2 2、、3 3、、5 5、、8 8、、1313、、2121、、……是著名的菲波那奇数列,其是著名的菲波那奇数列,其递推通推通项公式公式为::lUU1 1 == UU2 2 =1=1lUUn n == UUn-1 n-1 ++ UUn-2n-2〔〔n>=3n>=3〕〕l为求出第求出第N N项的的值,,请编写程序。 写程序l 根据根据递推通推通项公式,可用公式,可用递推法推法编写程序,写程序,计算第算第N N项的的值l递推法:由初始的知条件开推法:由初始的知条件开场,先,先计算出第算出第(N(N--1)1)步步的的结果,再利用前面知的果,再利用前面知的(N(N--1)1)项结果,按照果,按照递推公推公式〔或遵照式〔或遵照递推推规那么〕,推出第那么〕,推出第N N步步结果l递推法是程序推法是程序设计中最常用的方法之一,运用中最常用的方法之一,运用递推法必需有明确的推法必需有明确的递推初始推初始值和和递推推规那么〔那么〔递推公推公式〕§4-5-2 for§4-5-2 for语句句- -实例例l例例C3_5204.CC3_5204.C程序程序l#include 量,起分隔符的作用l 如:如:lint i, j, k, m[3], *pint i, j, k, m[3], *p;;l2.2.在函数的参数表中分隔参数在函数的参数表中分隔参数l 如:如:lprintf ("n=%d, x=%d\n", n, x)printf ("n=%d, x=%d\n", n, x);;l3.3.在在语句中运用其方式是:句中运用其方式是:l表达式表达式n1n1,表达式,表达式n2n2;;l 用逗号分隔开的表达式从左到右用逗号分隔开的表达式从左到右进展展计算,算,结果果的的类型和型和值是最右是最右边表达式的表达式的类型和型和值§4-5-2 for§4-5-2 for语句句- -实例例l例例C3_5205.CC3_5205.C:用逗号运算:用逗号运算输出以下字符串出以下字符串la z b y c x d w e v f u g t h s i r j q k p l o a z b y c x d w e v f u g t h s i r j q k p l o m nm nl 分析:奇数位上的字符从分析:奇数位上的字符从'a''a'开开场逐次逐次递增,偶数位上增,偶数位上的字符从的字符从'z''z'开开场逐次逐次递减减l #include 体l 运用运用do-while构成的循构成的循环环,循,循环环体部分体部分至少要至少要执执行一次;行一次;l 而采用而采用while和和for构成的循构成的循环环,循,循环环体体部分有能部分有能够够一次也不会一次也不会执执行§4-5-3 do-while§4-5-3 do-while语句句- -实例例l例例C3_5301.CC3_5301.C::输入一个入一个 >=0 >=0 的整数,要求以相反的的整数,要求以相反的顺序序输出出该数例如:数例如:输入入1234512345,那么,那么输出出为5432154321l 根本思根本思绪:可以从个位开:可以从个位开场,按位,按位输出整数的每一出整数的每一位位l main( ) main( )l{ unsigned int number;{ unsigned int number;l printf ("Input the number:"); printf ("Input the number:");l scanf ("%d", &number); scanf ("%d", &number);ldo {do {l printf("%d", number%10); printf("%d", number%10);l number/=10; /* number number/=10; /* number减少减少1010倍倍 */ */l} while (number!=0);} while (number!=0);l} }例例例例C3_5301C3_5301C3_5301C3_5301 思索:运用思索:运用whilewhile或或forfor语句,如何句,如何实现??例例例例C3_53011C3_53011C3_53011C3_53011两个程序有何区两个程序有何区别??前面的程序可以前面的程序可以处置数字置数字0 0,后面的程序不能,后面的程序不能处置置§4-5-3 do-while§4-5-3 do-while语句句- -实例例l例例C3_5302.C C3_5302.C 从从键盘输入恣意的字符,按以下入恣意的字符,按以下规那么那么进展分展分类计数。 数l第一第一类 '0','1','2','3','4','5','6','7','8','9' '0','1','2','3','4','5','6','7','8','9'l第二第二类 '+','-','*','/','%','=' '+','-','*','/','%','='l第三第三类 其它字符其它字符l当当输入字符入字符'\''\'时先先计数然后停数然后停顿接接纳输入§4-5-3 do-while§4-5-3 do-while语句句- -实例例 main( ) main( ) { int class1=0, class2=0, class3=0; char ch; { int class1=0, class2=0, class3=0; char ch; do{ putchar( ch=getch( ) ); /* do{ putchar( ch=getch( ) ); /* 函数的嵌套函数的嵌套调用用 */*/ switch (ch) switch (ch) { case ’0’: case ’1’: case ’2’: case { case ’0’: case ’1’: case ’2’: case ’3’:’3’: case ’4’: case ’5’: case ’6’: case case ’4’: case ’5’: case ’6’: case ’7’:’7’: case ’8’: case ’9’: case ’8’: case ’9’: class1++; break; /* class1++; break; /* 对分分类1 1计数数 */*/ case ’+’: case ’-’: case ’*’: case case ’+’: case ’-’: case ’*’: case ’/’:’/’: case ’%’: case ’=’: case ’%’: case ’=’: class2++; break; /* class2++; break; /* 对分分类2 2计数数 */*/ default: class3++; break;/* default: class3++; break;/* 对分分类3 3计数数 */*/ } } } while (ch != ’\\’); } while (ch != ’\\’); printf("class1=%d, class2=%d, class3=%d\n", printf("class1=%d, class2=%d, class3=%d\n", class1, class2, class3); class1, class2, class3); } }例例例例C3_5302C3_5302C3_5302C3_5302§4-5-4 §4-5-4 循循环语句小句小结lC C言言语语提供了三种循提供了三种循环语环语句:句:forfor、、whilewhile、、do-whiledo-while。 特点如下:特点如下:l 1 1、、forfor和和whilewhile先判先判别别循循环环条件后条件后执执行循行循环环体,体,do-whiledo-while语语句先句先执执行循行循环环体后判体后判别别循循环环条件l 2 2、、whilewhile和和do-whiledo-while语语句的条件表达式只需一句的条件表达式只需一个,个,forfor语语句有句有3 3个l 3 3、、whilewhile、、do-whiledo-while、、forfor可以相互交可以相互交换换运用l 4 4、、whilewhile语语句多用于不需求句多用于不需求赋赋初初值值的或循的或循环环次次数不定的情况数不定的情况l for for语语句多用于要句多用于要赋赋初初值值或循或循环环次数固定的情次数固定的情况l do-while do-while语语句多用于至少要运句多用于至少要运转转一次的循一次的循环环l 5 5、循、循环语环语句可以嵌套,可以并列,但不能交叉句可以嵌套,可以并列,但不能交叉§4-5-4 §4-5-4 循循环语句小句小结l为了保了保证循循环体正常运体正常运转,,应该特特别留意:留意:l 循循环控制条件控制条件l 控制条件的初始形状〔初始控制条件的初始形状〔初始值〕〕l 循循环体内部体内部对控制条件的影响控制条件的影响l 以上三个方面相互配合,相互影响,以上三个方面相互配合,相互影响,共同完成循共同完成循环控制控制§4-6 §4-6 转移移语句句l转移移语句的作用句的作用l 改改动程序的运程序的运转流程。 流程lC言言语转移移语句句l breakl continuel gotol return§4-6-1 break§4-6-1 break语句句l格式格式lbreak;;lbreak语句的功能句的功能l 1.在在switch语句中句中终了了case子句,使控制子句,使控制转到到switch语句之外l 2.在循在循环语句的循句的循环体中运用,体中运用,终了循了循环过程,使控制程,使控制转移到整个循移到整个循环语句之外的下句之外的下一条一条语句句处表达式2?成立成立不成立不成立执行后续语句执行表达式3执行表达式1§4-6-1 break§4-6-1 break语句句lbreak语句的句的执行流程行流程表达式?成立成立不成立不成立执行后续语句breakbreak表达式?成立成立不成立不成立执行后续语句breakwhile语语句句for语语句句do-while语语句句§4-6-1 break§4-6-1 break语句句- -实例例l例例C3_6101.CC3_6101.C:求:求555555555555的的约数中最大的三位数是多数中最大的三位数是多少?少?l main( ) main( )l{int j; long n;{int j; long n;l printf("Please input number:"); printf("Please input number:");l scanf("%ld", &n); scanf("%ld", &n);l /* /*所求的所求的约数的能数的能够取取值是从是从999999到到100100,,j j从大到小从大到小*/*/l for (j=999; j>=100; j--) for (j=999; j>=100; j--)l if ( n%j==0 ) /* if ( n%j==0 ) /* 假假设可以整除可以整除j j,那么,那么j j是是约数数 */ */l{ printf({ printf(〞〞3 digits in %ld=%d\n3 digits in %ld=%d\n〞〞, n, , n, j );j );l break; /* break; /* 控制退控制退出循出循环 */ */l } }l} }例例例例C3_6101C3_6101C3_6101C3_6101§4-6-1 break§4-6-1 break语句句- -实例例lbreakbreak语语句运用留意:句运用留意:l 1 1、在嵌套循、在嵌套循环环中,中,breakbreak语语句句仅仅能退能退出一出一层层( (当前当前) )循循环环。 l 2 2、假、假设设在循在循环语环语句中包含了句中包含了switchswitch语语句,那么句,那么switchswitch语语句中的句中的 break break 语语句句仅仅能使能使控制退出控制退出switchswitch语语句l 3 3、、break break 语语句并不是程序句并不是程序设计设计中必不中必不可少的可少的语语句,可以句,可以经过经过改改动动程序的构造去掉程序的构造去掉§4-6-2 continue§4-6-2 continue语句句lcontinue语语句格式句格式lcontinue;;lcontinue语语句的功能句的功能l continue语语句句仅仅能在循能在循环语环语句中运用句中运用.l 它的作用不是它的作用不是终终了循了循环环,而是开,而是开场场一次新一次新的循的循环环l 对对于于for语语句,将控制句,将控制转转到到执执行表达式行表达式3和条件和条件测试测试部分;部分;l 对对于于while和和do-while语语句,将控制句,将控制转转到到条件条件测试测试部分;部分;l 从从逻辑逻辑上上讲讲,改,改动动if语语句的条件表达式所句的条件表达式所表示的条件,就可以不需求运用表示的条件,就可以不需求运用continue语语句。 句§4-6-2 continue§4-6-2 continue语句句lcontinue语句的句的执行流程行流程表达式2?continue成立成立不成立不成立执行后续语句执行表达式3执行表达式1表达式?continue成立成立不成立不成立执行后续语句表达式?continue成立成立不成立不成立执行后续语句§4-6-2 continue§4-6-2 continue语句句- -实例例l例例C3_6201.CC3_6201.C::输入入1010个整数,求其中正数的个数及平均个整数,求其中正数的个数及平均值,准确到小数点后两位准确到小数点后两位l main ( ) main ( )l{ int i, count=0, j, sum=0;{ int i, count=0, j, sum=0;l for ( i=1; i<=10; i++) for ( i=1; i<=10; i++)l { printf ("Input integer:"); { printf ("Input integer:");l scanf ("%d", &j); scanf ("%d", &j);l if (j<=0) if (j<=0)l continue; /* continue; /* 终了本次循了本次循环,不,不进展后展后续操作操作 */ */l count ++; /* count ++; /* 计数器数器 */ */l sum += j; /* sum += j; /* 求累加和求累加和 */ */l } }l if ( count ) if ( count )l printf("Plus numer:%d,average value:%.2f", printf("Plus numer:%d,average value:%.2f",l count, count, 1.0*sum/count);1.0*sum/count);l else printf("Plus numer: 0, average value: 0"); else printf("Plus numer: 0, average value: 0");l} }例例例例C3_6201C3_6201C3_6201C3_6201改改动ifif语句的条件句的条件表达式,可以不需表达式,可以不需求运用求运用continuecontinue。 §4-6-3 goto§4-6-3 goto语句句lgoto语语句格式句格式lgoto 标标号;号;lgoto语语句的功能句的功能l1、将控制、将控制转转移到移到标标号所指定的号所指定的语语句句处继续执处继续执行l2、、标标号的独一功能就是作号的独一功能就是作为为goto语语句的目的句的目的标标号的作用域是它所在的整号的作用域是它所在的整个函数lgoto语语句的运用句的运用阐阐明明l 在在C言言语语中,中,goto语语句并不是必句并不是必不可少的,运用不可少的,运用goto语语句的地方都可以句的地方都可以用用C的其它控制流程的其它控制流程语语句改写§4-6-3 goto§4-6-3 goto语句句- -实例例l例例C3_6301.CC3_6301.C:知一首:知一首项大于0的等差数列的前四大于0的等差数列的前四项和和为2626,前四,前四项的的积为880880,求,求这数列l 设数列的第一数列的第一项为a(a>0)a(a>0),公差,公差为d(d>0)d(d>0)那么那么该数列数列满足条件:足条件:l a+(a+d)+(a+2*d)+(a+3*d) = 4*a+6*d = 26 a+(a+d)+(a+2*d)+(a+3*d) = 4*a+6*d = 26l a*(a+d)*(a+2*d)*(a+3*d) = 880 a*(a+d)*(a+2*d)*(a+3*d) = 880l 那么可以推出,首那么可以推出,首项a a和公差和公差d d的取的取值范范围为::l 1 <= a <=5 1 <= d <=3 1 <= a <=5 1 <= d <=3l 可以运用可以运用穷举的方法,在的方法,在 首首项a a 和和 公差公差d d 的的取取值范范围内内进展判展判别。 §4-6-3 goto§4-6-3 goto语句句- -实例例main( )main( ){ int a, b, c, d, i;{ int a, b, c, d, i; for (a=1; a<=5; ++a) /* for (a=1; a<=5; ++a) /* 在在a a的范的范围围内内穷举穷举 */ */ for (d=1; d<=3; ++d) /* for (d=1; d<=3; ++d) /* 在在d d的范的范围围内内穷举穷举 */ */ { b=a+(a+d)+(a+2*d)+(a+3*d); /* { b=a+(a+d)+(a+2*d)+(a+3*d); /* 前四前四项项的和的和 */ */ c=a*(a+d)*(a+2*d)*(a+3*d); /* c=a*(a+d)*(a+2*d)*(a+3*d); /* 前四前四项项的的积积 */ */ if (b==26 && c==880) /* if (b==26 && c==880) /* 假假设满设满足条件足条件 */*/ goto out; /* goto out; /* 退出二重循退出二重循环环 */ */ } } out: for (i=0; i<=20; ++i) /* out: for (i=0; i<=20; ++i) /* 输输出运出运转结转结果果 */ */ printf("%d,", a+i*d); printf("%d,", a+i*d);} }§4-6-3 goto§4-6-3 goto语句句- -实例例main( )main( ){ int a, b, c, d, i, flag=1; /* flag{ int a, b, c, d, i, flag=1; /* flag::标标志志变变量量 */ */ for (a=1; a<=5 && flag; ++a) /* flag!=0 for (a=1; a<=5 && flag; ++a) /* flag!=0是是进进展循展循环环 */ */ for (d=1; d<=3 && flag; ++d) for (d=1; d<=3 && flag; ++d) { b=a+(a+d)+(a+2*d)+(a+3*d); /* { b=a+(a+d)+(a+2*d)+(a+3*d); /* 前四前四项项的和的和 */ */ c=a*(a+d)*(a+2*d)*(a+3*d); /* c=a*(a+d)*(a+2*d)*(a+3*d); /* 前四前四项项的的积积 */ */ if (b==26 && c==880) /* if (b==26 && c==880) /* 假假设满设满足条件足条件 */ */ { for (i=0; i<=20; ++i) /* { for (i=0; i<=20; ++i) /* 输输出出结结果果 */ */ printf("%d,", a0+i*d0); printf("%d,", a0+i*d0); flag = 0; /* flag = 0; /* 控制退出二重循控制退出二重循环环 */ */ } } } }} }经过添加添加标志志变量可以有效控制循量可以有效控制循环§4-6-4 return§4-6-4 return语句句lretunrn语语句格式句格式l格式一:格式一:return;;l格式二:格式二:return (表达式表达式〕 〕;;lreturn语语句的功能句的功能l 1.return语语句使程序从被句使程序从被调调用函数中用函数中前往到前往到调调用函数的用函数的调调用途用途继续继续运运转转。 l 2.假假设设return后跟一表达式,那么后跟一表达式,那么该该表达式的表达式的值值会从被会从被调调用函数中用函数中带带回到回到调调用它的函数,称用它的函数,称为为前往前往值值。
