程序控制结构精品课件_第1页
程序控制结构精品课件_第2页
程序控制结构精品课件_第3页
程序控制结构精品课件_第4页
程序控制结构精品课件_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

1、程序控制结构第1页,共40页,2022年,5月20日,11点56分,星期五3.1 C 语言结构化程序设计基础程序的控制结构(黑箱)单入口单出口的控制结构易于理解三种基本控制结构:顺序、分支、循环控制结构可以嵌套,以构成更复杂的控制结构程序的结构化三种基本控制结构可以构造任何复杂的结构化算法结构化程序设计原则:自顶向下,逐步求精结构化程序设计过程:首先对任务进行功能分解,然后使用结构化程序设计思想逐一解决各个子问题,最后构造原始问题的解好处:逻辑性强,可读性好,维护方便第2页,共40页,2022年,5月20日,11点56分,星期五3.2 顺序结构顺序结构的含义由一组顺序执行的处理块组成,每个处理

2、块可能包含一条或一组语句,完成一项任务顺序结构是最基本的算法结构语句与复合语句(语句块)三种语句结构:单语句(表达式;)、空语句(;)、复合语句(语句序列)第3页,共40页,2022年,5月20日,11点56分,星期五顺序结构程序示例分别输入两个复数的实部与虚部,计算两个复数的和、差、积、商并输出结果#include int main() float a, b, c, d, real, imaginary; printf(“Input reals and imaginaries of two complexesn”); scanf(“%f,%f,%f,%f”, &a, &b, &c, &d);

3、 printf(“Sum: %f + %fin”, a + c, b + d); printf(“Difference: %f + %fin”, a c, b d); real = a * c b * d; imaginary = a * d + b * c; printf(“Product: %f + %fin”, real, imaginary); real = (a*c + b*d) / (c*c + d*d); imaginary = (b*c a*d) / (c*c + d*d); printf(“Quotient: %f + %fin”, real, imaginary); ret

4、urn 0;实际需要输入4个实数第4页,共40页,2022年,5月20日,11点56分,星期五3.3 分支结构分支结构(选择结构)的含义根据某一条件的判断结果,确定程序的流程,即选择哪一个程序分支中的处理块去执行最基本的分支结构是二路分支结构以条件判断为起点,如果判断结果为真,则执行A处理块的操作,否则执行B处理块的操作第5页,共40页,2022年,5月20日,11点56分,星期五if-else 语句语句格式:if(表达式) 语句1 else 语句2表达式必须位于括号内,一般为关系或逻辑表达式先计算表达式值,若为真则执行语句1,否则执行语句2语句1与语句2可以为复合语句语句1与语句2只能有一个

5、被执行如果仅仅用于确定某条语句是否执行,else分支可以省略第6页,共40页,2022年,5月20日,11点56分,星期五if-else 语句示例一输入一个字符,判断它是否为09之间的数字#include int main() char c; printf(“Input a character: ”); c = getchar(); if(c = 48 & c = 57) printf(“It is a number.n”); else printf(“No, it is not a number.n”); return 0;因:字符以ASCII码值存储且数字的ASCII码值4857故:比较A

6、SCII码值第7页,共40页,2022年,5月20日,11点56分,星期五if-else 语句示例二输入一个整数,输出其绝对值#include int main() int n, abs; printf(“Enter integer: ”); scanf(“%d”, &n); abs = n; if(abs 0) abs = abs; printf(“Original integer: %d, absolute value: %dn”, n, abs); return 0;第8页,共40页,2022年,5月20日,11点56分,星期五if-else if-else 语句语句格式if(表达式1)

7、 语句1 else if(表达式2) 语句2 else 语句n第9页,共40页,2022年,5月20日,11点56分,星期五if-else if-else 示例根据百分制成绩给出优秀、通过或不通过成绩#include int main() float score; printf(“Input score: “); scanf(“%f“, &score); if(score = 85 & score = 60 & score = 0 & score 50) if(sal 50) if(sal 50) if(sal 500) sal += 200;else sal += 300;第11页,共40页

8、,2022年,5月20日,11点56分,星期五条件分支嵌套示例求方程 ax2 + bx + c = 0 的根#include #include / 由于用到平方根函数,要用此头文件int main() float a, b, c, x1, x2, p, q, m; / 定义实型变量 printf(“Enter 3 coefficients: “) ; scanf(“%f,%f,%f“, &a, &b, &c); / 从键盘读入方程的三个系数 if( a = 0.0 & b = 0 & c = 0 ) / 分支1:三个系数全为0 printf(“any valuen“); else if( a

9、= 0 & b != 0 ) / 分支2:系数a为0,解一元一次方程 printf(“x1 = x2 = %fn, c / b); else / 分支3:解一元二次方程的两个根 m = b * b 4.0 * a * c;第12页,共40页,2022年,5月20日,11点56分,星期五条件分支嵌套示例 if( m = 0 ) / 解实根 x1 = ( b + sqrt(m) ) / ( 2.0 * a ); x2 = ( b sqrt(m) ) / ( 2.0 * a ); printf(“x1 = %fn“, x1 ); / 输出两个实根 printf(“x2 = %fn“, x2 ); e

10、lse / 解虚根 p = b / ( 2.0 * a ); q = sqrt(m) / ( 2.0 * a ); printf(“x1 = %f + %fin“, p, q); printf(“x2 = %f %fin“, p, q); return 0;第13页,共40页,2022年,5月20日,11点56分,星期五switch 分支语法计算过程先计算表达式的值依次与一组常量比较若相同则执行该分支否则转向default分支退出switch语句说明switch后面的表达式必须为整型、字符型或枚举型case后面必须为常量表达式,则各个case值必须不同如果没有default子句,且没有case

11、子句匹配,则不执行case分支中的语句可以有多条,不需要花括号switch( 表达式 ) case 常量表达式1: 语句组1 case 常量表达式2: 语句组2 case 常量表达式n: 语句组n default: 语句组第14页,共40页,2022年,5月20日,11点56分,星期五switch 分支流程图第15页,共40页,2022年,5月20日,11点56分,星期五switch 分支示例一根据输入的成绩等级,打印相应分数段#include int main() char grade; printf(“Input the grade(A,B,C,D,E):“); scanf(“%c“, &

12、grade); switch( grade ) case A: printf(“90-100n“); break; case B: printf(“80-89n“); break; case C: printf(“70-79n“); break; case D: printf(“60-69n“); break; case E: printf(“0-59n“); break; default: printf(“Errorn“); return 0;第16页,共40页,2022年,5月20日,11点56分,星期五switch 分支示例一根据输入的成绩等级,打印相应分数段#include int m

13、ain() char grade; printf(“Input the grade(A,B,C,D,E):“); scanf(“%c“, &grade); switch( grade ) case A: printf(“90-100n“); case B: printf(“80-89n“); case C: printf(“70-79n“); case D: printf(“60-69n“); case E: printf(“0-59n“); default: printf(“Errorn“); return 0;break的目的是终止switch语句的执行。如果没有break语句,则程序会从

14、指定的case分支开始,并在该分支结束后继续执行下去。除非switch语句结束,后面的其他case分支或default分支中的语句都会得到执行第17页,共40页,2022年,5月20日,11点56分,星期五switch 分支示例二根据输入的成绩等级,打印是否通过信息#include int main() char grade; printf(“Input the grade(A,B,C,D,E):“); scanf(“%c“, &grade); switch( grade ) case A: case B: case C: case D: printf(“Passn“); break; cas

15、e E: printf(“Failn“); break; default: printf(“Errorn“); return 0;如果逻辑上确实如此,则不同的case分支可以使用同一个语句组,这也许是特意不在某些case分支中使用break的唯一正当理由第18页,共40页,2022年,5月20日,11点56分,星期五3.4 循环结构循环结构的含义根据某一条件的判断结果,反复执行某一处理块的过程最基本的循环结构是当循环进入循环结构,判断循环条件,如果循环条件的结果为真,则执行A处理块的操作,即循环一次,然后再次判断循环条件,当循环条件为假时,循环结束第19页,共40页,2022年,5月20日,1

16、1点56分,星期五while 循环while 循环格式:while(表达式) 循环体while 循环流程先判断后执行:表达式为真时,执行一遍循环体(一次迭代),返回重新计算表达式的值以确定是否重复执行循环体;若表达式为假,则终止循环为保证循环终止,循环体内应有能改变表达式值的语句第20页,共40页,2022年,5月20日,11点56分,星期五while 循环示例使用 while 循环求两个正整数的最小公倍数#include int main() int m, n, result; printf(“Input two positive integers m, n:“); scanf(“%d,%d

17、“, &m, &n); if(m 0 & n 0) result = m n ? n : m; while(result % m != 0 | result % n != 0) result+; printf(“The least common multiple of m and n is %d.n“, result); else printf(“the number m or n is not a positive integer.n“); return 0;第21页,共40页,2022年,5月20日,11点56分,星期五do-while 循环do-while 循环格式:do 循环体 whi

18、le(表达式);do-while 循环流程先执行后判断:先执行一遍循环体(一次迭代),计算表达式的值,表达式为真时重复执行循环体,否则终止循环(循环体至少执行一次,这与while循环不同)为保证循环终止,循环体内应有能改变表达式值的语句第22页,共40页,2022年,5月20日,11点56分,星期五do-while 循环示例反复求两个正整数的最小公倍数,直到输入的两个数均为1时结束#include int main() int m, n, result; do printf(“Input two positive integers m, n:“); scanf(“%d,%d“, &m, &n)

19、; if(m 0 & n 0) result = m n ? n : m; while(result%m != 0 | result%n != 0) result+; printf(“The least common multiple of m and n is %d.n“, result); else printf(“the number m or n is not a positive integer.n“); while(m != 1 | n != 1); return 0;第23页,共40页,2022年,5月20日,11点56分,星期五for 循环for 循环格式for(表达式1; 表

20、达式2; 表达式3) 循环体for 循环流程先判断后执行:先执行表达式1(循环初始化),再计算表达式2以根据其结果决定是否执行一遍循环体(为真时执行),计算表达式3的值(循环再次“初始化”),返回重新计算表达式2的值以确定循环是否终止第24页,共40页,2022年,5月20日,11点56分,星期五for 循环示例一计算#include int main() int result, k; result = 0; / 累加器变量,设置初始值(本例设为0) for( k = 1; k = 100; k+ ) / 循环计算 result += k * k; / 累加 printf(“The resul

21、t: %dn“, result); return 0;第25页,共40页,2022年,5月20日,11点56分,星期五三种循环结构的比较三种循环结构可以互换使用for 循环与 while 循环常见,do-while 循环少见while 循环常用于不需要或很少需要初始化的场合for 循环常用于需要简单初始化和通过递增递减运算控制循环体执行的场合for 循环将所有循环控制因素都放在循环头部,循环结构最清晰通过省略循环头部的一个或多个表达式,for 循环也可能非常复杂第26页,共40页,2022年,5月20日,11点56分,星期五for 循环示例二程序读入一个字符串,然后反向打印输出#include

22、 #include int main( ) char s50, c; int i, j; printf(“Input a string: “); scanf(“%s“, s); for( i = 0, j = strlen(s) 1; i j; i+, j ) c = si; si = sj; sj = c; printf(“%sn“, s); return 0;第27页,共40页,2022年,5月20日,11点56分,星期五for 循环示例三打印九九乘法表#include int main() int i, j, k; for( i = 1; i = 9; i+ ) for( j = i;

23、j = 9; j+ ) k = i * j; printf(“%d%d = %dt“, i, j, k); printf(“n“) ; return 0;如果一个循环体内包含另一个循环则称循环嵌套或多重循环三种循环都可以嵌套,但嵌套时内外层循环不能发生交叉发生嵌套时,内层循环经常需要使用外层循环的某些值作为控制条件第28页,共40页,2022年,5月20日,11点56分,星期五循环控制转移: break 语句输出5行、每行10个随机数,若随机数大于20,000,本行输出结束#include #include #include int main() int i, j, r; srand( tim

24、e(NULL) ); for( i = 1; i = 5; i+ ) for( j = 1; j 20000) break; printf(“n“); return 0;srand():设置随机数种子的函数time():获取时间的函数rand():产生随机数的函数break终止当前循环的执行,在存在循环嵌套的场合,它并不能终止外层循环的执行第29页,共40页,2022年,5月20日,11点56分,星期五循环控制转移: continue 语句输入一串字符,以回车结束输入,程序统计并输出其中小写字母的个数#include int main() char c; int num = 0; printf

25、(“Enter a string: n“); while( (c = getchar() != n ) if(c 122) continue; / 非小写字母,本次循环结束 num+; printf(“%dn“, num); return 0;continue终止的是当前循环的当前一次迭代,而不是整个循环,当前循环的下一次迭代仍会执行第30页,共40页,2022年,5月20日,11点56分,星期五结构化程序设计注意事项要保证结构的完整性不允许结构层次间的交叉!要保证操作的完整性一个基本结构就是一个完整的操作单元,程序只能从入口进出口出程序最好不要有多入口多出口,尤其不能从外部进入循环或条件分支

26、内部第31页,共40页,2022年,5月20日,11点56分,星期五3.5 结构化程序设计应用示例一打印小于n的所有个位不等于9的素数,n的具体值由用户输入,要求分行输出,每行输出10个数#include int main() int i, j, n, line = 0; printf(“Please input n:“); scanf(“%d“, &n); if(n = 1) printf(“No number to output!n“); return 1; for(i = 2; i = n; i+) / 逐一取出待查数据 for( j = 2; j i; j+) if(i % j = 0

27、) break; / 该数非素数,终止内层循环 if(i = j & i % 10 != 9) / 若该数为素数且个位不等于9,打印输出 printf(“%d, “, i); line+; if(line = 10) printf(“n“); line = 0; printf(“n“); return 0; 使用for循环第32页,共40页,2022年,5月20日,11点56分,星期五3.5 结构化程序设计应用示例一#include int main() int i, j, n, line = 0; printf(“Please input n:“); scanf(“%d“, &n); if(

28、n = 1) printf(“No number to output!n“); return 1; i = 2; while(i = n) / 逐一取出待查数据 j = 2; while(j i & i % j != 0) j+; / 求该数的约数 if(i = j & i % 10 != 9) / 若该数为素数且个位不等于9,打印输出 printf(“%d, “, i); line+; if(line = 10) printf(“n“); line = 0; i+; printf(“n“); return 0; 使用while循环第33页,共40页,2022年,5月20日,11点56分,星期

29、五3.5 结构化程序设计应用示例二百元买百鸡(穷举):已知公鸡每只5元,母鸡每只3元,小鸡1元3只,可买公鸡、母鸡、小鸡几只#include int main() int x, y, z; for(x = 0; x = 100; x+) for(y = 0; y = 100; y+) for(z = 0; z = 100; z+) if( x + y + z =100 & 15 * x + 9 * y + z = 300) printf(“x = %d, y = %d, z = %dn“, x, y, z);设x、y、z分别表示可买的公鸡、母鸡、小鸡的个数,有不定方程组:第34页,共40页,2

30、022年,5月20日,11点56分,星期五3.5 结构化程序设计应用示例二百元买百鸡(穷举):已知公鸡每只5元,母鸡每只3元,小鸡1元3只,可买公鸡、母鸡、小鸡几只#include int main() int x, y, z; for(x = 0; x = 20; x+) for(y = 0; y = 33; y+) for(z = 0; z = 100; z+) if( x + y + z =100 & 15 * x + 9 * y + z = 300) printf(“x = %d, y = %d, z = %dn“, x, y, z);设x、y、z分别表示可买的公鸡、母鸡、小鸡的个数,

31、有不定方程组:#include int main() int x, y, z; for(x = 0; x = 100; x+) for(y = 0; y = 100; y+) for(z = 0; z = 100; z+) if( x + y + z =100 & 15 * x + 9 * y + z = 300) printf(“x = %d, y = %d, z = %dn“, x, y, z);第35页,共40页,2022年,5月20日,11点56分,星期五3.5 结构化程序设计应用示例三输出裴波那契数列前30项值(递推)#include int main() int n1, n2, n, count; n1 = 0; n2 = 1; printf(“%10d%10d“, n1, n2); for(count = 3; count = 30; count+) n = n1 + n2; printf(“%10d“, n); if(count % 5 = 0) printf(“n“); / 控制每行输出5个数

温馨提示

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

评论

0/150

提交评论