d03
•C语言的基本语句•上机调试程序的方法•基本的程序设计方法•输出简单图形•穷举法110页
第2页
第三章程序流程控制语句第一节C语言语句概述
第二节第三节注释语句复合语句
第四节第五节选择语句循环语句
第六节第七节转移语句
简单应用综合举例
110页
第3页
§3-1 C语言语句概述
按照C语言语句的作用分类:
◆◆◆说明语句注释语句声明变量名称、数据类型及其存储属性的说明性语句
编程者对程序本身的解释是“可执行”的语句,程序流程控制语句构成程序的主体控制语句函数调用语句表达式语句空语句复合语句控制程序的走向(流程)由一个函数调用加一个分号赋值表达式加分号只有一个分号;一对{ }括起来的语句序列110页第4页
按照C语言语句的功能分类:◆◆◆◆◆§3-1 C语言语句概述-语句分类表达式语句赋值表达式+分号(;)选择语句if -elseswitchforwhile
do -whilebreakcontinuegotoreturncasedefault标号
返回110页
第5页
循环语句转移语句标号语句§3-1 C语言语句概述-简单实例#include 表达式语句{ c=a+b;句 printf(”%d\\n”,c);}函数调用语句复合语句 else; 空语句返}C的语句以分号(;)结束回110页 第6页 §3-2 注释语句 注释语句格式 以“/*”开头、以“*/”结尾的说明性文字说明(注释)信息可以是中文,也可以是英文 注释语句的目的 备忘作用◆增加程序的可读性,便于编程者和其它程序阅读者理解程序◆ 注释语句的使用方法 可以注释程序的功能、变量的含义、函数间接口关系、编程使用的算法和技巧等信息110页 第7页 §3-2注释语句-实例 实例 #include \"stdio.h\"main( ){ printf(\"Hello !\\n\");/*printf(\"Thanks !\\n\"); */ } 合法的注释 x = y+5;x = 10 +/*x is integer number, x是整型*//*合法的注释但不是好的注释*/5; 不合法的注释 swi/*不能在标识符中间插入注释*/tch(c) {.../*this is an outer commentx = y/a;/*注释不允许嵌套*/*/ 110页 第8页 §3-3 复合语句 复合语句格式用{和} 括起来的若干合法的C语句。复合语句的目的 语法上等价于单一语句。因此在C语言中,凡是可以使用单一语句的地方,均可使用复合语句。◆明确层次关系◆ 复合语句的使用方法 复合语句允许嵌套,且嵌套层次没有限制◆对于复合语句,右花括号“}”的后面不必再跟一个分号(;)◆110页 第9页 §3-3 复合语句-实例 例C3_3001.C: 判断输入整数的正负性和奇偶性。1.main( )2.{int x; 3. printf(\"Enter a integer:\"); scanf(\"%d\4.if (x!=0)5. {/* 处理x不等于0的情况*/6. if(x>0) /* 若x大于0成立*/7. {x = x%2; /* 则计算x除以2的余数*/8. if (x==0) printf(”Is a plus even.\\n\"); 9. else printf(”Is a plus odd number\\n\");10. } 11. else /* 否则,处理x为负数的情况*/12. {x = x%2; /* 计算x除以2的余数*/13. if (x==0) printf(”Is a minus even.\\n\"); 14. Else printf(”Is a minus odd number\\n\");15. }16.} 17.elseprintf (\"This integer is zero.\\n\");18.} 110页 第10页 §3-4 选择语句 提出问题 根据学生分数判断是否及格?根据学生分数如何进行分级? 如何解决? 自然语言:如果… 那么…否则…C语言:分支语句二重分支的条件语句 if 多重分支的条件语句switch 110页 第11页 §3-4-1 选择语句-if语句 if语句格式 格式1:if(表达式)语句;格式2:if(表达式)语句1;else语句2; if语句的执行流程 流程1:分支条件表达式成立不成立成立流程2:表达式不成立执行语句执行语句1执行语句2110页第12页§3-4-1 选择语句-if语句 例C3_4101.C:求a和b两数中较大的一个。#include 第13页 §3-4-1 选择语句-if语句 例C3_4101.C:求a和b两数中较大的一个。#include §3-4-1 选择语句-if语句 例C3_4102.C:从键盘输入被除数a和除数b,求商。 main( ){ int a,b;printf(\"Enter two numbers: \");scanf(\"%d%d\if (b!=0) printf(\"%d\\n\else printf(\"cannot divide by zero.\\n\");}if(b) printf(\"%d\\n\elseprintf(”error.\\n\"); b?非00等价! printf...printf ...110页 第15页 §3-4-1 选择语句-if语句 if语句嵌套义:在if语句的“语句1”或“语句2”中又包含着if语句 例C3_4103.C:比较两个整数的之间的关系(大小/相等)。#include 说明:在if-else语句中,一般采用“缩进”的书写形式来表示“语句1”或“语句2”所属的层次。注意:缩进仅是一种书写的形式,不具有逻辑意义110页 第16页 §3-4-1 选择语句-if语句 嵌套if-else语句的配对关系例:if(a>b)/*………………………………1 */if(a>c)/*………………………………2*/if(a>d) flag=1;/*………………………………3*/else flag=2;/*………………………………4*/else flag=3;/*………………………………5*/问题:第四行和第五行的else语句和那一个if语句相匹配呢? 分析:匹配方案可以有很多中,(2-4,1-5),(3-4,2-5),(1-4,…)… 匹配规则:在嵌套的if-else语句中,else子句总是与上面的、离它最近的、且在同一复合语句中还没有配对的if子语配对。110页 第17页 §3-4-1 选择语句-if语句1、if(a>b)if(a>c)if (a>d) flag=1;else flag=2;elseflag=3;程序含义:当c>a>b 时,flag=32、if (a>b) {if(a>c)if (a>d) flag=1;elseflag=2;}/* 以上是一个完整的复合语句*/elseflag=3;程序含义:当a<=b 时,flag=3110页 第18页 §3-4-1 选择语句-if语句3、if (a==b)if (b==c) printf(\"a=b=c\\n\");else printf(”a!=b\\n”);尽管书写格式如此,真实的正确的含义是:if(a==b)if(b==c) printf(\"a=b=c\\n\");elseprintf(“a!=b\\n”);通过加{ },可以改变配对关系:if(a==b){if(b==c) printf(\"a=b=c\\n\");} elseprintf(”a!=b\\n”);110页 第19页 §3-4-1 选择语句-if语句 例C3_4104.C:已知银行整存整取存款月息利率分别为: 一年期:0.63% 二年期:0.66%三年期:0.69% 五年期:0.75%八年期:0.84% 其他:0要求输入存钱的本金和期限,求到期时利息与本金合计。银行到期利息计算公式: 利息=本金×月息利率×12×存款年限程序中应当根据存款的年限确定利率 110页第20页 §3-4-1 选择语句-if语句#include §3-4-1 选择语句-if语句 采用if-else if结构改写。 #include 第22页 §3-4-1 选择语句-if语句 例C3_4105.C:通过键盘输入字符,将输入的字符分为控制、数字、大写字母、•小写字母和其他字符等五类。 ASCII码表中的前32个字符为控制字符,‘0’∼‘9’为数字,• ‘A’∼‘Z’为大写字母, ‘a’∼‘z’为小写字母,其它。 #include 第23页 §3-4-1 选择语句-if语句 if语句与条件运算的关系例:求一个数字的绝对值if( y<0 )x=-y;elsex=y; 等价 (y<0) ? x=-y : x=y; 等 价 说明:if else可以完成与条件运算符( ? : )完全相同的任务,并且可以进行相应的转换。 x = (y<0) ? –y : y;110页第24页 §3-4-1 选择语句-if语句 if语句与条件运算的区别:条件运算符的形式比较简单,有较强的灵活性,可以替代部分if语句。例:if( cans==1 ) printf(”You need 1canof paint.”);elseprintf(”You need 2cansof paint. ”); 转换:(cans==1)? printf(”You need 1 canof paint.”): printf(”You need 2 cansof paint.”);转换:printf(cans==1?”You need 1 canof paint.” :”You need 2 cansof paint.”); 转换:printf (”You need %d%sof paint.”, cans, cans==1?”can”:”cans”); 可以在函数中方便地使用条件运算110页 第25页 §3-4-2 选择语句-switch语句 switch语句格式switch (表达式)计算表达式的值{ 相等case常量1:=常量1?语句序列1不相等break; case常量2:相等=常量2?语句序列2不相等break;……有有default?default: 没有语句序列n+1} 执行语句序列1break执行语句序列2break执行语句序列n+1110页第26页 §3-4-2 选择语句-switch语句switch (number){case 1:statement 1; break; 当number case 2:statement 2; 的值为2时break; case 3:statement 3; break; default:statement 4;}statement 5;110页 第27页 §3-4-2 选择语句-switch语句 switch语句使用注意事项 1.switch语句与if语句不同,仅能判断一种关系:是否恒等。2.switch语句中case子句的常量可以是整型常量、字符型常量、枚举型数据,或是整型常量表达式,不允许是变量。3.在同一个switch中,case子句的常量不能相同;在嵌套的switch语句中,不同层次的switch之间,可有相同的常量。4.default子句可以省略。5.case 和default 子句只能在switch语句中使用,且case和default 只起标号作用,可出现在switch中的任何位置。6.case和default子句后面的语句序列允许由多个可执行语句组成,且不必用“{}”括起来,也可以为空语句。7.switch语句中可省略break语句,但省略后会改变流程。110页 第28页 §3-4-2 选择语句-switch语句 例C3_4104.C:计算存款本利。采用switch改写。 #include total = money + money * rate *12 * year;printf(\" Total = %.2f\\n\}110页第29页 §3-4-2 选择语句-switch语句 例C3_4203.C:输入year年份和月month,求该月天数。 如何判断闰年?闰年:能够被4整除且不能被100整除的年份或能够被400整除的年份例如:1996年是闰年 1900年是平年2000年是闰年 判断闰年的C语言公式 year%4==0 &&year%100!=0 ||year%400==0当year=1996时,结果为1 当year=1997时,结果为0若为闰年:结果为1当year=1900时,结果为0 若为平年:结果为0当year=2000时,结果为1 110页 第30页 §3-4-2 选择语句-switch语句main( )省略case子句之后的语句{ int year, month, days;scanf(\"%d%d\switch (month){case1: case3: case5: case7:case8: case10: case12: /* 处理“大”月*/ days=31; break;case 4: case 6: case 9: case 11:/* 处理“小”月*/ days=30; break;case 2:/* 处理“平”月*/ if( year%4==0 && year%100!=0 || year%400==0 )days=29; /* 如果是闰年*/else days=28; /* 不是闰年*/break;default:/* 月份错误*/ printf(\"Input error!\\n\");days=0;} if(days!=0) printf(”%d,%d is %ddays\\n\}110页第31页 §3-4-2 选择语句-switch语句 省略break语句flag=-1; /* error marker */switch(i){case1: case2: case3:flag=0; /* no error */break;case4: flag=1; /* error #1 */case5: error(flag); /* error process */break;default: flag=2; /* other error */} /* 假定函数error是出错处理函数*/当i=1,2,3 时:flag=0;退出。 当i=5 时:flag=-1;调用erorr(flag);退出。当i=4 时:flag=1;调用error(flag);退出。 110页 第32页 §3-4-2 选择语句-switch语句 例C3_4202.C:请编写一个程序计算表达式:data1 op data2的值。main ( ) {float data1, data2;char op;/* 定义操作数、操作符变量*/printf(\"Enter your expression:\"); scanf (”%f%c%f”, &data1, &op, &data2); /* 输入表达式*/ switch( op) /* 根据操作符分别进行处理*/{case’+’: /* 处理加法*/ printf(\"%.2f+%.2f=%.2f\\n\break;case’-’: /* 处理减法*/printf (\"%.2f-%.2f=%.2f\\n\break;case’*’:/* 处理乘法*/printf (\"%.2f*%.2f=%.2f\\n\break;case’/’:/* 处理除法*/if ( data2==0 )/* 若除数为0*/ printf (\"Division by zero.\\n\");elseprintf (\"%.2f/%.2f=%.2f\\n\break;default:/* 输入其它运算符*/printf (\"Unknown operater.\\n\");例C3_4202} 110页 第33页 §3-5 循环语句 提出问题 提问:从键盘上输入10个整数并求和,怎么编程? 回答:在程序中写入10个scanf( )语句。 提问:从键盘上输入500个整数并求和,怎么编程?回答:这个,嗯……??? 不会让我写500个...... 老师:让我们换一个角度来看待这些问题,以上问题的实质是:将scanf函数重复执行N遍。学生:对!好象是这么回事......老师:我们可以引出一个概念“循环”,简单而言:循 环就是不断反复地执行同一段程序。学生:这就是我们今天要学的新东西?110页 第34页 §3-5 循环语句循环 反复执行同一段程序,直到满足一定的条件后才停止执行该段程序。C语言中控制循环的语句: ◆◆◆whilefor do-while 110页第35页 §3-5-1 while语句 while语句格式 while ( 表达式) 语句;说明:语句部分可以是简单语句,也可以是复合语句。 while语句的执行流程 表达式?成立不成立循环控制条件循环体 执行语句执行while循环之后的语句110页 第36页 §3-5-1 while语句-实例 例C3_5101.C 从键盘输入10个整数,求这10个整数的和。例C3_5101#include count=0; total=0; /* total:存放累加和*/while( count<10) /* 循环控制条件*/{count ++; /* 循环体*/ printf (\"Enter the No.%d=\scanf (\"%dotal += num; /* 计算累加和*/} printf(\"Total=%d\\n\}110页 第37页 §3-5-1 while语句-实例例:分析程序的运行结果例C3_51011#include printf(”That\\’s all this program does.\\n”);}结果:程序将不停的打印“n is 0”,直至终止程序 无法正常终止的程序,称为“死循环”。 结论:在while语句循环体中,一定要有能够对循环控制条件产生影响的语句。避免出现“死循环”现象。 110页 第38页 §3-5-1 while语句-实例 例1:分析下列程序段index=1; while ( index < 5 ) printf(”Good morning!\\n”); 分析:程序段将无限制打印这条问候语句。因为循环中没有任何语句可以改变循环控制变量index的初值1例2:分析下列程序段 index=1; while( --index < 5 ) printf(”Good morning!\\n”); 分析:仍有问题,程序改变了index的值,但方向错了。 在index达到系统能够处理的最大负数时,将会产生下溢而终止程序。 结论:循环体中必须有能够使循环正常停止的条件。 110页 第39页 §3-5-1 while语句-实例 例C3_5103.C:从键盘中读入一系列字符,直到输入字母a时才停止。 分析:由于不知道要输入的字符数量,只知道停止条件是输入字母a,则只能将循环控制条件设为ch!='a'。#include main( ){ char ch='';while (ch!='a') putchar(ch = getch( )); }例C3_5103改写: #include 例C3_51031循环体为空语句main( ){ char ch;while ((ch = getch( ))!='a');}110页 第40页 §3-5-1 while语句-实例 例C3_5104.C:对输入的行和字符进行计数。例C3_5104分析:\\n作为行结束标记的,DOS中有[CTRL+Z]作为文件结束标记 定义文件结束标记 #define EOF -1#include printf(\"chars=%d, lines=%d\\n\}110页第41页 §3-5-1 while语句-实例 例3:求1到100的之和。main ( ){ int total=0, i=1;while( i <= 100){total = total + i;i ++;} printf(”Total=%d\\n\}变形1:while( i <= 100) total += i++;==> total+=i;++i 变形2:int i=0; while( ++i <= 100) ==> ++i; 判断i<=100total += i; 变形3:int i=0; while( i++ <100) ==> 判断i<100;i++total += i; 变形4:int i=0; while( i< 100)total += ++i;==> ++i; total+=i 110页 例C3_51041第42页 §3-5-1 while语句-实例 循环嵌套 在循环体中,又包含有循环语句,构成循环嵌套。例C3_5107.C:输出下三角形乘法九九表。 1 2 3 4 5 6 7 8 9---------------------------------------1i=62 43 6 9j=54 8 12 16i*j5 10 15 20 256 12 18 24 30 367 14 21 28 35 42 498 16 24 32 40 48 56 649 18 27 36 45 54 63 72 81(1<=i<=9),列号为j(1<=j<=i)假设:行号为i 则:第i行中要输出j 个乘积 110页 第43页 §3-5-1 while语句-实例#include printf ( \"%4d\i++ ); printf (\"\\n------------------------------------\\n\");i=1;while( i<= 9 ){j= 1; /* 列计数器置1 */ while ( j<=i) /* 嵌套的二重循环。输出第i行*/{printf (\"%4d\i*j );j++; /* 列计数器+1 */}printf (\"\\n\"); /* 一行输出结束后,输出\\n */i++; /* 行计数器+1 */} 外层循环体执行1次,内层循环要完整执行1次}110页第44页§3-5-1 while语句-实例 while使用注意 1.while (0) { .... } 由于循环的条件表达式恒等于0,循环体永远也不会执行,是编程者的错误。2.while (1) { .... } 由于循环的条件表达式恒 等于1,所以不可能通过循环控制条件来结束循环体的执行,称为“死循环”。 3.为了保证循环正常运行,应该特别注意: ◆◆◆循环控制条件控制条件的初始状态(初始值)循环体内部对控制条件的影响 110页 第45页 §3-5-2 for语句 for语句格式 for (表达式1;表达式2;表达式3) 语句;for语句的执行流程 执行表达式1表达式2?成立不成立循环初始条件循环控制条件循环体 for语句等价于下列语句:表达式1;while (表达式2){语句; 表达式3; 110页第46页} 执行语句执行表达式3执行for循环之后的语句§3-5-2 for语句-实例例C3_5203例C3_5203.C:求1到10的阶乘。递推公式:n! = 1当n=1 时 n! = (n-1)! * n当n>1 时 #include {n = n * i; /* 求N! */ printf ( \"%2d!=%ld\\n\}}for语句最常用的形式 for (初值;控制条件;增量)语句; 110页 第47页 §3-5-2 for语句-实例 例C3_5202.C:用for语句实现打印乘法九九表。#include for( j=1;j<=i;j++)printf ( (j==i) ?\"%4d\\n\":\"%4d\", i*j);} 输出函数printf中使用了“?”操作,含义相当于: if( j==i ) printf (\"%4d\\n\", i*j );else printf (\"%4d\", i*j );110页 第48页 §3-5-2 for语句 for语句的变化形式for语句中的三个表达式中的任意一个都是可以省略的,但是分号不能省略。1.省略表达式2,则: for(表达式1;;表达式3)就形成了一个死循环。 2.省略表达式1和表达式3,则: 就等同于: for(;表达式2;)while(表达式) 据此结论:所有用while语句实现的循环都可以用for语句实现。 3.表达式1、2、3全省略,则: 就等同于: for( ; ; )while(1) 110页 第49页 §3-5-2 for语句-实例 例C3_5204.C:数列1、1、2、3、5、8、13、21、…是著名的菲波那奇数列,其递推通项公式为: U1=U2=1 Un=Un-1+Un-2(n>=3) 为求出第N项的值,请编写程序。 根据递推通项公式,可用递推法编写程序,计算第N项的值。 递推法:由初始的已知条件开始,先计算出第(N-1)步的结果,再利用前面已知的(N-1)项结果,按照递推公式(或遵照递推规则),推出第N步结果。 递推法是程序设计中最常用的方法之一,使用递推法必须有明确的递推初始值和递推规则(递推公式)。 110页 第50页 §3-5-2 for语句-实例 例C3_5204.C程序#include printf (\"No. %d is %d\\n\}110页 第51页 例C3_5204§3-5-2 for语句-实例 语句中的逗号(,)运算逗号(,)运算常见的三种用途是: 1.在变量说明表中用来分隔变量,起分隔符的作用。如: int i,j,k,m[3],*p;2.在函数的参数表中分隔参数。如: printf (\"n=%d, x=%d\\n\",n,x);3.在语句中使用。其形式是: 表达式n1,表达式n2; 用逗号分隔开的表达式从左到右进行计算,结果的类型和值是最右边表达式的类型和值。110页第52页 §3-5-2 for语句-实例 例C3_5205.C:用逗号运算输出下列字符串。az by cx dw ev f ug th si rj qk pl om n分析:奇数位上的字符从'a'开始逐次递增,偶数位上的字符从'z'开始逐次递减 #include /* i从’a’开始逐次递增,j从’z’开始逐次递减*/ for ( i='a', j='z'; i §3-5-3 do-while语句 do-while语句格式 do 语句while (表达式) ; do-while语句的执行流程 执行语句成立循环体 表达式?不成立循环控制条件 执行while子句之后的语句110页 第54页 §3-5-3 do-while语句 do-while语句特点 do-while与while和for的最大区别: do-while语句先执行循环体然后再判断循环控制条件,而while和for却是先判断条件之后再执行循环体。 使用do-while构成的循环,循环体部分至少要执行一次;而采用while和for构成的循环,循环体部分有可能一次也不会执行。 110页第55页 §3-5-3 do-while语句-实例 例C3_5301.C:输入一个正整数,要求以相反的顺序输出该数。例如:输入12345,则输出为54321。 基本思路:可以从个位开始,按位输出整数的每一位main( ){ unsigned int number;例C3_5301printf (\"Input the number:\");scanf (\"%d\do { printf(\"%d\number/=10; /* number缩小10倍*/} while(number!=0);}思考:使用while或for语句,如何实现?例C3_53011两个程序有何区别?前面的程序可以处理数字0,后面的程序不能处理110页 第56页 §3-5-3 do-while语句-实例 例C3_5302.C 从键盘输入任意的字符,按下列规则进行分类计数。 第一类第二类第三类 '0','1','2','3','4','5','6','7','8','9''+','-','*','/','%','='其它字符当输入字符'\\'时先计数然后停止接收输入。110页第57页 §3-5-3 do-while语句-实例main( )例C3_5302{ int class1=0, class2=0, class3=0; char ch;do{putchar( ch=getch( ) ); switch(ch) { case’0’: case’1’: case’2’: case’3’:case’4’: case ’5’: case’6’: case ’7’:case’8’: case’9’: class1++; break; /* 对分类1计数*/case’+’: case ’-’: case’*’: case’/’:case ’%’: case’=’: class2++; break; /* 对分类2计数*/default: class3++; break;/* 对分类3计数*/}} while(ch != ’\\\\’); printf(\"class1=%d, class2=%d, class3=%d\\n\ class1, class2, class3); } 110页 第58页 §3-5-4 循环语句小结 C语言提供了三种循环语句:for、while、do-while。特点如下: 1、for和while先判断循环条件后执行循环体,do-while语句先执行循环体后判断循环条件。 2、while和do-while语句的条件表达式只有一个,for语句有三个。 3、while、do-while、for可以相互替换使用。 4、while语句多用于不需要赋初值的或循环次数不定的情况。 for语句多用于要赋初值或循环次数固定的情况。do-while语句多用于至少要运行一次的循环控制。5、循环语句可以嵌套,循环可以并列,但不能交叉。 110页 第59页 §3-5-4 循环语句小结 为了保证循环体正常运行,应该特别注意: ◆◆◆循环控制条件控制条件的初始状态(初始值)循环体内部对控制条件的影响 以上三个方面相互配合,相互影响,共同完成循环控制110页第60页 §3-6 转移语句 转移语句的作用 改变程序的运行流程。C语言转移语句 ◆◆◆◆breakcontinuegotoreturn 110页第61页 §3-6-1 break语句 格式 break; break语句的功能 1.在switch语句中结束case子句,使控制转到switch语句之外。 2.在循环语句的循环体中使用,结束循环过程,使控制转移到整个循环语句之外的下一条语句处。 110页第62页 §3-6-1 break语句 break语句的执行流程while语句for语句执行表达式1表达式?成立不成立do-while语句表达式2?成立不成立breakbreakbreak表达式?执行表达式3成立不成立执行后续语句执行后续语句执行后续语句110页 第63页 §3-6-1 break语句-实例 例C3_6101.C:求555555的约数中最大的三位数是多少? main( )例C3_6101{int j; long n;printf(\"Please input number:\");scanf(\"%ld\/*所求的约数的可能取值是从999到100,j从大到小*/for(j=999; j>=100; j--)if ( n%j==0 ) /* 若能够整除j,则j是约数*/{printf(”3 digits in %ld=%d\\n”, n, j );break; /* 控制退出循环*/}}110页 第64页 §3-6-1 break语句-实例 break语句使用注意: 1、在嵌套循环中,break语句仅能退出一层(当前)循环。 2、若在循环语句中包含了switch语句,那么switch语句中的break语句仅能使控制退出switch语句。3、break语句并不是程序设计中必不可少的语句,可以通过改变程序的结构去掉。 110页第65页 §3-6-2 continue语句 continue语句格式 continue; continue语句的功能 continue语句仅能在循环语句中使用. 它的作用不是结束循环,而是开始一次新的循环。对于for语句,将控制转到执行表达式3和条件测试部分对于while和do-while语句,将控制转到条件测试部分从逻辑上讲,改变if语句的条件表达式所表示的条件,就可以不需要使用continue语句。 110页 第66页 §3-6-2 continue语句 continue语句的执行流程 执行表达式1表达式?成立不成立表达式2?成立不成立continuecontinuecontinue表达式?执行表达式3成立不成立执行后续语句执行后续语句执行后续语句110页 第67页 §3-6-2 continue语句-实例 例C3_6201.C:输入10个整数,求其中正数的个数及平均值,精确到小数点后两位。例C3_6201main ( ){ int i, count=0, j, sum=0;改变if语句的条件for( i=1; i<=10; i++)表达式,可以不需{printf (\"Input integer:\");要使用continue。scanf (\"%d\if(j<=0)continue; /* 结束本次循环,不进行后续操作*/count ++; /* 计数器*/sum += j; /* 求累加和*/} if ( count )printf(\"Plus numer:%d,average value:%.2f\count, 1.0*sum/count);elseprintf(\"Plus numer: 0, average value: 0\");}110页 第68页 §3-6-3 goto语句 goto语句格式 goto标号; goto语句的功能 1、将控制转移到标号所指定的语句处继续执行。2、标号的唯一功能就是作为goto语句的目标。标号的作用域是它所在的整个函数。 goto语句的使用说明 在C语言中,goto语句并不是必不可少的,使用goto语句的地方都可以用C的其他控制流程语句改写。 110页第69页 §3-6-3 goto语句-实例 例C3_6301.C:已知一首项大于0的等差数列的前四项和为26,前四项的积为880,求这数列。设数列的第一项为a(a>0),公差为d(d>0)。则该数列满足条件:a+(a+d)+(a+2*d)+(a+3*d) = 4*a+6*d = 26a*(a+d)*(a+2*d)*(a+3*d) = 880则可以推出,首项a和公差d的取值范围为:1 <= a <=5 1 <= d <=3 可以使用穷举的方法,在首项a和公差d的取值范围内进行判断。110页 第70页 §3-6-3 goto语句-实例main( ) { int a, b, c, d, i; for(a=1; a<=5; ++a) /* 在a的范围内穷举*/ for(d=1; d<=3; ++d) /* 在d的范围内穷举*/{ b=a+(a+d)+(a+2*d)+(a+3*d); /* 前四项的和*/ c=a*(a+d)*(a+2*d)*(a+3*d); /* 前四项的积*/if(b==26 && c==880) /* 若满足条件*/ gotoout; /* 退出二重循环*/ } out:for (i=0; i<=20; ++i) /* 输出运行结果*/ printf(\"%d,\ } 110页 第71页 §3-6-4 return语句 retunrn语句格式 格式一:return; 格式二:return (表达式); return语句的功能 1.return语句使程序从被调用函数中返回到调用函数的调用处继续运行。 2.如果return后跟一表达式,则该表达式的值会从被调用函数中带回到调用它的函数,称为返回值。110页 第72页 §3-7 综合举例介绍程序设计的基本思想掌握穷举法输出简单图形110页第73页 §3-7-1 程序设计的一般步骤 明确问题的性质,分析题意 ◆数值问题/非数值问题数学模型/过程模型 数学问题:数值分析 建立问题的描述模型 ◆设计/确定算法 ◆◆非数学问题: 数据结构/算法分析与设计一般方法:穷举/递推/递归/分治/回溯/…... 编程调试 分析运行结果 110页 第74页 §3-7-2 典型数值问题-例1 例1:怎样存钱利最大 假设银行整存整取存款不同期限的月息利率分别为:0.63% 期限=一年0.66% 期限=二年0.69% 期限=三年0.75% 期限=五年0.84% 期限=八年 利息=本金×月息利率×12×存款年限 现在某人手中有2000元,请通过计算选择一种存钱方案,使得钱存入银行二十年后得到的利息最多(假定银行对超过存款期限的那部分时间不付利息)。110页 第75页 §3-7-2 典型数值问题-例1 问题分析与算法设计为了得到最多的利息,存入银行的钱应在到期时马上转存。由于存款的利率不同,所以不同的存款方法(年限组合)得到的利息也是不一样的。设2000元存20年,其中1年存i1次,2年存i2次,3年存i3次,5年存i5次,8年存i8次,则到期时应得的本利合计: 2000*(1+r1)i1*(1+r2)i2*(1+r3)i3*(1+r5)i5*(1+r8)i8 根据题意还可得到以下限制条件: 0 <= i8 <= 20 <= i5 <= (20-8*i8)/50 <= i3 <= (20-8*i8-5*i5)/30 <= i2 <= (20-8*i8-5*i5-3*i3)/20 <= i1 = 20-8*i8-5*i5-3*i3-2*i2 可用穷举法穷举所有的i8、i5、i3、i2和i1的组合。 110页 第76页 §3-7-2 典型数值问题-例1#include { int i8,i5,i3,i2,i1,n8,n5, n3,n2,n1; float max=0, term; for(i8=0; i8<3; i8++ ) /* 穷举全部可能的存款方式*/ for ( i5=0; i5<=(20-8*i8)/5; i5++ ) for ( i3=0; i3<=(20-8*i8-5*i5)/3; i3++ ) for( i2=0; i2<=(20-8*i8-5*i5-3*i3)/2; i2++ ){i1 = 20-8*i8-5*i5-3*i3-2*i2; term=2000.0 * pow(1+0.0063*12,(double)i1) * pow(1+0.0066*12,(double)i2)* pow(1+0.0069*12,(double)i3)* pow(1+0.0075*12,(double)i5)* pow(1+0.0084*12,(double)i8); if( term>max ) {max=term; n1=i1; n2=i2; n3=i3; n5=i5; n8=i8;}} printf(\"%d,%d,%d,%d,%d\\n\printf(\"Total: %.2f\\n\ 110页第77页 } §3-7-2 典型数值问题-例2 例2:从键盘上任意输入一个正整数,要求判断该正整数是否是另一个整数的平方。问题分析与算法设计 设:输入的正整数为i,若i满足: i == m*m (m为整数>0) 则i 为整数的平方。 #include ”srdio.h”main ( ) { int i, m; scanf (”%d”, &i); for( m=1; m*mprintf (“%d*%d=%d\\n”, m, m, i); } 110页 第78页 §3-7-2 典型数值问题-例3 例3:一辆卡车违犯交通规则,撞人后逃跑。现场 有三人目击事件,但都没有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同;丙是位数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。 问题分析与算法设计 按照题目的要求造出一个前两位数(i)相同、后两位数(j)相同且相互间又不同的整数。01100*i+11*j= m*m (m为整数>=31) 110页 第79页 §3-7-2 典型数值问题-例3#include ”stdio.h\"main( ){int i, j, k, m;for(i=1; i<=9; i++) /* i:车号前二位的取值for (j=0; j<=9; j++) /* j:车号后二位的取值if( i!=j ) {/* 判断两位数字是否相异k=i*1000+i*100+j*10+j;for ( m=31; m*m */*/*/*/运行结果:Lorry_No. is 7744. 110页 第80页 §3-7-2 典型数值问题-例4 例4:百钱百鸡问题。中国古代数学家张丘建在他的 《算经》中提出了著名的“百钱百鸡问题”:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何? 问题分析与算法设计 设:要买x只公鸡,y只母鸡,z只小鸡,可得到方程: x+y+z=100 ① 5x+3y+z/3=100 ② 取值范围:0 <= x、y、z <= 100可以采用穷举法求解。 110页 第81页 §3-7-2 典型数值问题-例4#include 1: cock= 0 hen=25 chicken=752: cock= 3 hen=20 chicken=773: cock= 4 hen=18 chicken=784: cock= 7 hen=13 chicken=805: cock= 8 hen=11 chicken=816: cock=11 hen= 6 chicken=837: cock=12 hen= 4 chicken=84110页第82页 §3-7-2 典型数值问题-例4 丢失重要条件:z应该能够被3整除。#include if( z%3==0&& x+y+z==100 &&5*x+3*y+z/3==100 )printf(\"%2d:cock=%2d hen=%2d chicken=%2d\\n\++j,x,y,z); } 运行程序,正确的结果: 1: cock= 0 hen=25 chicken=752: cock= 4 hen=18 chicken=783: cock= 8 hen=11 chicken=814: cock=12 hen= 4 chicken=84110页第83页 §3-7-2 典型数值问题-例4 优化程序:for(x=0; x<=20; x++)for(z=0; z<100; z+=3){ y =100-x-z;if( 5*x+3*y+z/3==100)printf(\"%2d:cock=%2d hen=%2d chicken=%2d\\n\++j,x,y,z);}优化程序: for(x=0; x<=20; x++) for(y=0; y<=(100-5*x)/3; y++){ z =100-x-y;if( z%3==0 && 5*x+3*y+z/3==100)printf(\"%2d:cock=%2d hen=%2d chicken=%2d\\n\++j,x,y,z);}110页 第84页 §3-7-2 典型数值问题-穷举法的关键 数学模型 适宜进行穷举的数学模型◆决定程序是否正确 ◆ 穷举的范围 明确的穷举终止条件 ◆决定穷举的效率,范围过大,则效率太低。 ◆110页第85页 §3-7-3 典型非数值(图型)问题-例1例1:打印边长为m的正方型要求:从键盘输入m值,输出m行每行m个*号。 例:输入m=4,输出的图形如下: * * * ** * * ** * * ** * * * 算法分析与设计: 1. 输入m , 2. 重复打印m 行,每行打印m 个*;加细: 1. 输入m ; 2. for ( k=1; k<=m; k++) 打印一行中的m个*; 110页 第86页 §3-7-3 典型非数值(图型)问题-例1加细: 1. 输入m; 2. for ( k=1; k<=m; k++) {打印m 个* ; 换新行;}加细:1.输入m; 2. for ( k=1; k<=m; k++) {for ( j=1; j<=m; j++ ) printf (”*”);printf(”\\n”) ;} 110页 第87页 §3-7-3 典型非数值(图型)问题-例1 整理,得到程序如下: #include {for ( j=1; j<=m; j++ ) /* 打印一行中的m个*号*/ printf (”*”);printf(”\\n”);}} 分析方法 逐步求精法。对于复杂问题,不可能一下得到程序,可以先将简单的部分明确出来,再逐步对复杂部分进行细化,一步一步推出程序。110页 第88页 §3-7-3 典型非数值(图型)问题-例2 例3:从键盘输入h值,输出h行用*号组成等腰三角形。例:输入h=4,输出的图形如下: 1 **2 * * ** * *3 * * * * ** * * * *4 * * * * * * * 分析: 程序的关键是:找出每一行中输出空格的数量和*的数量对于第k行(1<=k<=h):要输出h-k 个空格和2k-1 个* 110页 第89页 §3-7-3 典型非数值(图型)问题-例2 分析: 要输出h-k 个空格和2k-1 个*算法设计1.输入h; 2.重复打印h行,每行h-k个空格和2k-1个*加细: 2. for ( k=1; k<=h; k++ ) /* h行*/{ 重复打印h-k个空格; 重复打印2k-1 个*;换行;}110页第90页 §3-7-3 典型非数值(图型)问题-例2 程序:例C3_7302#include { int h, k, j; scanf (”%d”, &h); for( k=1; k<=h; k++) /* 控制打印h行*/{for( j=1; j<=h-k; j++) /* 打印空格*/ printf (””); for( j=1; j<=2*k-1; j++) /* 打印*号*/ printf (”*”);printf(”\\n”) ;}} 110页 第91页 §3-7-3 典型非数值(图型)问题-例2** * ** * * * * * * * * * * * h=4 换一个思路分析: 对于第k 行( 1<=k<=h ):要输出h+k-1个空格或*号 对于第j个字符,若j<=h-k 输出空格 若j< h+k-1 输出* 算法设计 for ( k=1; k<=h; k++) /* 重复打印h行*/{for ( j=1; j<=h+k-1; j++)if (j<=h-k) 打印空格;else 打印*号;换行;} 110页 第92页 §3-7-3 典型非数值(图型)问题-例2 程序:例C3_73021#include { int h, k, j; scanf (”%d”, &h); for( k=1; k<=h; k++) /* 控制打印h行*/{for (j=1;j<=h+k-1;j++) /* 控制行内字符*/ if(j<=h-k) printf (\" \");elseprintf (\"*\");printf(”\\n”) ;}} 110页 第93页 §3-7-3 典型非数值(图型)问题-例3 例3:从键盘输入h 值,输出h 行用*号组成的菱形。例:输入h=4,输出的图形如下: *1空格* * *2* * * * * 3* * * * * * * 4* * * * *5* * *6*7 3 *号1 2 31 50 71 52 33 1 分析: 1. h为上三角形的高度,总行数为2h-1。 2. 对于第j 行,要输出m 个空格和n 个*号。 h-j n=2j-13. 当j<=h 时,为上三角,则:m= , 4. 当h = 2h-1 -2(j-h) = 4h-1-2j110页第94页 §3-7-3 典型非数值(图型)问题-例3 算法设计for (j=1; j<=2*h-1; j++)控制打印行{ 若为上三角j<=h则:m= h-j;n = 2j-1否则:m= j-h;n = 4h-1-2j重复打印m个空格重复打印n个*;换行;} 加细循环体{ if(j<=h) {m=h-j; n=2*j-1; } else{m=j-h; n=4*h-1-2*j; }for(k=1; k<=m; k++) printf (\" \");for(k=1; k<=n; k++) printf (\"*\");printf(\"\\n\");} 110页第95页 §3-7-3 典型非数值(图型)问题-例3 程序:#include else{m=j-h; n=4*h-1-2*j; } for(k=1; k<=m; k++) /*打印空格*/ printf (\" \");for (k=1; k<=n; k++) /* 打印**/ printf (\"*\");printf(\"\\n\");}}110页 例C3_7303第96页 §3-7-3 典型非数值(图型)问题-例4 例4:打印数字魔方。要求:从键盘输入m,输出m行的数字方阵。例:输入m=5,输出的图形如下:1 2 3 4 5 2 3 4 5 13 4 5 1 2输出项aij与行i、4 5 1 2 3 列j的关系5 1 2 3 4 分析: 1.重复打印m行。2.第j行的第一个数字为j,之后依次递增,但以m为模:aij= ( i+ j-2 ) %m + 1 110页 第97页 §3-7-3 典型非数值(图型)问题-例4 程序:例C3_7304#include printf(\" %d\m+ 1 );printf(\"\\n\");}}110页 第98页 §3-7-3 典型非数值(图型)问题-例5 例5:打印回形方阵 要求:从键盘输入边长m,输出回形方阵。例:输入m=5,m=6,输出的图形如下:1 1 1 1 112 2 21 1 2 321 1 2 2 21m=51 1 1 1 1 1 1 1 1 1 112 2 2 211 2 3 321 12 3 32 1 m=61 2 2 2 211 1 1 1 1 1 分析:关键是找出aij 与行i 和列j 的关系 110页 第99页 §3-7-3 典型非数值(图型)问题-例5将图形分为四个区:1.i<=(m+1)/2j<=(m+1)/2,min(i,j)2.i<=(m+1)/21.i<=(m+1)/2j>(m+1)/2j<=(m+1)/2,min(i,m-j+1)min(i,j)1 1 11 11 2 22 11 2 32 11 2 2 2 11 1 11 13.3.i>(m+1)/2i>(m+1)/2j<=(m+1)/2min(m-i+1,j)min(i,j)m=51 1 11 1 11 2 22 2 11 2 33 2 11 2 33 2 11 2 2 2 2 11 1 11 1 1m=64.i>(m+1)/24.i>(m+1)/2j<=(m+1)/2j>(m+1)/2min(i,j)min(m-i+1,m-j+1)110页第100页§3-7-3 典型非数值(图型)问题-例5#define min(x,y) ( (x)<(y) ? (x) : (y) )例C3_7305main(){intk,j,m;printf(\"EnterM:\");scanf(\"%d\&m);for(k=1;k<=m;k++)/*控制打印m行*/{for(j=1;j<=m;j++)/*控制打印行中的数字*/ if(k<=(m+1)/2)if(j<=(m+1)/2)printf(\"%d\min(k,j));elseprintf(\"%d\min(k,m-j+1));else if(j<=(m+1)/2)printf(\"%d\min(m-k+1,j));elseprintf(\"%d\min(m-k+1,m-j+1));printf(\"\\n\");}}110页 第101页 §3-7-3 典型非数值(图型)问题-例6 例6:打印数字三角形。输入高m,输出如下图形:m=6 123456 1 3 6 10 15 212 5 9 14 204 8 13 197 12 1811 1716 1 2 3 4 5 6 递推公式a1,1 = 1当:i,j>=1时ai+1,1 = ai,1+iai,j+1 = ai,j+i+j 分析: 1.第i行打印m-i+1个数字; 2.若:a1,1=1 则:ai+1,1= (i>=1) ai,1+i例:a21=a11+1=1+1=2 ,a61=a51+5=11+5=163.若: 已知ai,1,则:ai,j+1=ai,j+i+j 例:a22=a21+2+1=2+2+1=5 ,a23=a22+2+2=5+2+2=9a62=a61+6+1=16+6+1=23 , a63=a62+6+2=23+6+2=31110页 第102页 §3-7-3 典型非数值(图型)问题-例6 递推公式:a1,1 = 1ai+1,1 = ai,1+i (i,j>=1)ai,j+1 = ai,j+i+j 程序 例C3_7306main(){inti,j,m,n,k=1;/*k是第一列元素的值 scanf(\"%d\&m);for(i=1;i<=m;i++){n=k;/*n第i行中第1个元素的值 for(j=1;j<=m-i+1;j++)/*输出行中的数字{printf(\"%3d\n);n=n+i+j;/*计算同行下一个元素的值} printf(\"\\n\");k=k+i;/*计算下一行中第1个元素}}110页 */*/*/*/*/ 第103页 §3-7-3 典型非数值(图型)问题-例7 例7:打印0-360度的sin(x) 曲线 ---------------------------------------*-------------------------------------|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|** *|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|*|* 110页 第104页 §3-7-3 典型非数值(图型)问题-例7算法分析: 1、坐标的x 轴沿列自顶向下,y 轴自左向右增加2、屏幕每行为80 列,y 轴以第40 列为0 点3、sin(x) 的值在-1~1 之间,图形中对应以40 列为中心的10~70 列4、将角度0~360 度以10 度为一个步长等分,只考察37 个点sin(x) 函数对应点的位置,即图形总共打印37 行算法设计: 设定义i、j分别控制行和列 1、则行对应的角度为:i*10/180*PAI2、每行打印四种字符:空格、|、*、\\n3、行对应的sin值的位置,及* 的位置为: 40 + 30 * sin(i*10/180*PAI)| 在40列,\\n 要视*、| 的位置决定 110页 第105页 §3-7-3 典型非数值(图型)问题-例7#define PAI 3.14159 例C3_7307main( ) { double x; int y, i, yy; for(i=1; i<80; i++) /* 打印图形的第一行*/ if(i==40) printf(\"*\");else printf(\"-\");printf(\"\\n\"); for(x=10.0; x<=360.0; x+=10.)/* 从10度到360度*/{y = 40+30*sin(x*PAI/180.0); /* 计算对应的列*/ yy = 40>y ? 40 : y; /* 下一行要打印的字符总数*/for (i=1; i<=yy; i++)/* 控制输出图形中的一行*/{ if(i==y) printf(\"*\");/* i控制打印的列位置*/ elseif(i==40) printf(\"|\");/* 打印中心的竖线*/ else printf(\" \"); } printf(\"\\n\");}} 110页 第106页 §3-7-3 典型非数值(图型)问题-例8 例8:打印cos(x)曲线 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 110页第107页 §3-7-3 典型非数值(图型)问题-例8算法分析1、从图形看,x轴自左向右与行平行,y轴自下向上与列平行2、在0~360度区间内每一个y 值有两个点,必须在1 行中输出2 个*。利用图形的对称性,我们只考虑0~180 度的情况3、若定义图形的总宽度为62 列,对应0~360 度的x 轴 算法设计 1、程序中利用反余弦函数acos 计算坐标(x,y)的对应关系。2、对x点的坐标m,则在同一行与之对称的180~360度的y 点的坐标就应为62-m。 3、图中的y知从1~ -1 (自上向下),我们以0.1为一个步长,共考察21个y坐标,即打印21行。4、每一行打印的字符可以分为5 部分 第一个‘*’号以前的空格、第一个‘*’号、第一个‘*’号到第二个‘*’号中间的空格、第二个‘*’号回车符110页 第108页 §3-7-3 典型非数值(图型)问题-例8#include { double y; int x, m; for(y=1; y>=-1; y-=0.1)/* y为列方向,1到-1 */{m = acos(y)*10; /* 计算y对应的弧度m */ for (x=1; x printf(\"*\"); /* 控制打印左侧的*号*/for (; x<62-m; x++) printf(\" \"); printf(\"*\\n\"); /* 控制打印同一行中对称的右侧*号*/}} 110页 第109页 §3-7-3 典型非数值(图型)问题-例9 例9:打印空心圆形算法设计 例C3_7309利用图形的左右对称性。根据圆的方程:R×R=X×X+Y×Y 可以计算出圆上每一点行和列的对应关系。#include for(x=1;x<30-m;x++)printf(\"\");/*左侧空白控制*/printf(\"*\");/*圆的左侧*/for(;x<30+m;x++)printf(\"\");/*空心部分控制*/printf(\"*\\n\");/*圆的右侧*/}}110页第110页 因篇幅问题不能全部显示,请点此查看更多更全内容