版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第3章 程序结构 C 语言程序设计 2022/7/203.4 顺序结构程序设计3.4.1 顺序结构程序的一般算法描述变量定义变量赋值运算处理输出结果可用:变量初始化赋值语句输入函数调用语句注意各个语句的顺序2022/7/203.4.2 顺序结构程序设计举例 【例3.3】数据交换。从键盘输入a、b的值,输出交换以后的值。 思路:在计算机中交换变量a和b的值,不能只写下面两个赋值语句a=b ; b=a ; ?正确的交换方法:c=a ; a=b ; b=c;或者a=ab; b=ba; a=ab;2022/7/20程序:main( ) int a,b,c; printf(ninput a, b: );
2、 scanf(%d,%d,&a,&b); printf(nbefore exchange:a=%d b=%dn,a,b); c=a; a=b; b=c; printf(after exchange: a=%d b=%dn,a,b);程序运行情况如下:input a, b: 32, 57 before exchange: a=32 b=57 after exchange: a=57 b=32 2022/7/20举例: 【例3.4】已知三条边a、b、c,求三角形面积。计算三角形面积的海伦公式: 其中:设定义:整型变量 a、b、c实型变量 s 、 area2022/7/20程序如下: #includ
3、e math.hmain( ) int a,b,c; float s,area ; scanf(%d, %d, %d,&a,&b,&c); s =1.0/2*(a+b+c) ; area = sqrt(s*(s-a)*(s-b)*(s-c) ; printf(area = %8.3f n,area) ;程序运行情况如下:3,4,5 area = 6.000 实际上还需要判断a、b、c是否能构成三角形,即应该进行选择判断处理 2022/7/203.5.1简单分支语句语句一般格式 if (表达式) 语句功能:计算表达式的值,如果是一个非0值(即逻辑真),就执行内嵌语句,否则(即逻辑假)跳过内嵌语句
4、,顺序执行后续语句。 内嵌语句,可为:赋值语句函数调用语句控制语句复合语句空语句可为算术、关系、逻辑、赋值等表达式3.5 分支结构程序设计2022/7/20简单分支语句的算法:例如: if (x0) m+; if ( ab ) c=a; a=b; b=c; 表达式非0 T F 语句N-S结构图语句流程图NY表达式非0?2022/7/20双重分支语句 语句一般格式if (表达式) 语句1 else 语句2 功能:计算表达式的值,如果它的值是一个非0值(逻辑真),就执行内嵌语句1,之后跳过内嵌语句2,执行后续语句;否则跳过内嵌语句1,执行内嵌语句2,之后执行后续语句。 2022/7/20双重分支语
5、句的算法:例如: if (x0) m+; else m-; if ( ch= a & ch= z ) ch=ch-32 ; printf( %cn,ch); else printf( %cn,ch) ; 表达式非0 T F 语句1 语句2N-S结构图 语句1 语句2流程图NY表达式非0?2022/7/20多重分支语句 语句一般格式if (表达式1) 语句1 else if (表达式2) 语句2 else if (表达式m) 语句m else 语句 n功能:依次计算并判断表达式i,为非0时执行后面的语句,都为0时,执行语句n无论执行完那个语句分支,都转到后续语句2022/7/20多重分支语句的算
6、法流程图表达式2?表达式1?语句n 语句1 语句2 语句mYNYNNY表达式m ?2022/7/20多重分支语句的算法N-S结构图 表达式1? T F 表达式2? 语句1 T F 语句2 表达式m? T F 语句m 语句n例如:if (a=A & ch=65 & ch =A & ch=A & ch=Z ? ch+32:ch);putchar ( n)2022/7/203.5.2 if语句的嵌套如果if的内嵌语句中又使用了一个if语句,则构成if语句的嵌套。 【例6】比较两个整数的关系。#include main( ) int x, y; printf (Enter integer X and
7、Y:); scanf (%d%d, &x, &y); if ( x != y ) if ( x y ) printf (XYn); else printf (XYn); else printf (X=Yn);应该正确判断:if的内嵌语句if和else的配对提倡缩格书写有利于阅读程序2022/7/20 if语句嵌套的形式简单if语句的嵌套形式 if (表达式) if 语句双重(或多重)分支if语句的嵌套形式 if (表达式) if 语句 else if 语句 可以是各种形式的if语句可以是各种形式的if语句如果是简单if语句,必须用“ ”括起2022/7/20例如: if (c=50) prin
8、tf(50=c=100n); if (c=50) printf(50=c=100n);else printf(c50n);else if (c=150) printf(100c150n); if (c=50) printf(50=c=100n);else printf(cb) if(ac)if(ad) m=1; else m=2; else m=3;问题:哪一个 else 和哪一个 if 相匹配?规则:在嵌套的ifelse语句中,else总是与上面的离它最近的尚未配对的if 配对。2022/7/20举例 【例7】输入一个数,判断它是奇数还是偶数,如果是奇数则进一步判断它是否为5的倍数。 定义变
9、量x输入x的值 x是奇数 T F 输出“odd” x是5的倍数 输出“even” T F是5的倍数2022/7/20程序:main( ) int x; scanf (%d,&x); if (x%2 != 0) printf(%d is an odd n,x) ; if (x%5=0) printf(%d is the times of 5 n,x) ; else printf(%d is an even n,x) ; 思考:如果没有,算法和输出如何?2022/7/20学习if语句的难点if else 语句的配对正确用表达式描述条件例如:当x大于5小于10时令x自增 if ( 5x10 ) x+
10、;正确判断内嵌语句例如:if(x5 & x 0时,方程有两个不相等的实根:x1=(-b+sqrt(d)/(2*a) x2=(-b-sqrt(d)/(2*a) 当d 0 计算重根 T F 输出重根 计算实根 计算虚根 输出实根 输出虚根2022/7/20程序:#include math.hmain( ) float a,b,c,d,x1,x2,lp,ip; scanf(%f%f%f,&a,&b,&c); printf(the equation ); if (fabs(a)1e-6) printf(is not quadratic); else d=b*b-4*a*c; if (fabs(d)1e
11、-6) /* 不相等的实根 */ x1=(-b+sqrt(d)/(2*a); x2=(-b-sqrt(d)/(2*a); printf(has two real roots:n) ; printf(x1=%8.4f, x2=%8.4fn,x1,x2); else /* 虚根 */ lp=-b/(2*a);ip=sqrt(-d)/(2*a); printf(has two complex roots: n); printf(x1=%8.4f+%8.4fin,lp,ip); printf(x2=%8.4f-%8.4fin,lp,ip); 2022/7/20举例(续):【例10】输入年份,判别该年是
12、否为闰年。 思路:年份year为闰年的条件为 能够被4整除,但不能被100整除的年份; 能够被400整除的年份。只要满足任意一个就可以确定它是闰年。例如:1996年、2000年是闰年1998年、1900年不是闰年设定标志变量leap,只要符合其中一个条件的就是闰年,令 leap =1;否则令 leap=0 2022/7/20算法:定义变量year、leap 输入年份year 能被4整除且 不能被100整除? T F 能被400整除? leap=1 T F leap = 1 leap = 0 leap=1? T F 是闰年 不是闰年year%400=0year%4=0 & year%100 !=
13、02022/7/20程序:main( ) int year, leap ; scanf(%d, &year); if (year%4=0 & year%100!=0) leap=1; else if (year%400=0) leap=1; else leap=0; if (leap = 1) printf(%d is a leap year n, year); else printf(%d is not a leap year n, year); 2022/7/20循环结构中涉及到的三个基本概念循环条件:控制循环开始或结束的条件 for(n=1;n=100;n+) s=s+n;循环变量:用来
14、确定循环条件的变量循环体:程序中需要重复执行的语句3.6 循环结构程序设计 2022/7/203.6.1 while循环控制 语句一般格式 while (表达式) 循环体语句 一般为关系表达式或逻辑表达式,也可以是C语言其他类型的合法表达式 用来控制循环体是否执行称为内嵌语句,可以是基本语句、控制语句,也可以是复合语句是循环重复执行的部分 2022/7/20功能: 计算表达式的值,为非0(逻辑真)时,重复执行内嵌语句,每执行一次,就判断一次表达式的值,直到表达式的值为0 时结束循环,转去执行while后面的语句。 当表达式为真 语句N-S结构图NY流程图表达式非0?语句循环控制条件循环体202
15、2/7/20例如:【例11】编写程序,求100个自然数的和即: s=1+2+3+ +100 思路:寻找加数与求和的规律 加数i从1变到100,每循环一次,使i增1,直到i的值超过100。i的初值设为1。求和设变量 sum 存放和,循环求sum=sum+i,直至i超过100。 2022/7/20算法和程序:main( ) int i,sum; i=1; sum=0; while (i=100) sum=sum+i; i+; printf(sum=%dn,sum);程序输出结果:sum=5050i: 循环控制变量sum: 累加器 i=1,sum=0 当i = 100 sum=sum+i i+输出s
16、um2022/7/20注意: 如果while的 (表达式) 值为0,则循环体一次也不执行 (例如当i的初值=101) 。在循环体中必须有使循环趋向结束的操作,否则循环将无限进行(死循环)。 在循环体中,语句的先后位置必须符合逻辑,否则会影响运算结果。 思考程序段的输出? while (i=100) i+; sum=sum+i; 运行后,输出:sum=5150原因是什么? 2022/7/20注意(续):为了保证循环正常运行,应该特别注意: 循环控制条件的描述:可以是关系表达式(i=100)或逻辑表达式(ab&x0)个数,求其和2022/7/20while循环举例(续) main() int i,
17、 n, k, sum; i=1; sum=0; printf(Input n: ); scanf(%d, &n); while(i=n) scanf(%d, &k); sum=sum+k; i+; printf(nsum is: %dn, sum); 运行结果: Input n: 612 34 2 11 9 5sum is: 732022/7/203.6.2 do-while语句语句一般格式 do 循环体语句 while (表达式); 功能:先执行内嵌语句(循环体),之后计算表达式的值,不为0(逻辑真)时,再执行循环体并判断条件,直到表达式的值为 0 结束循环,转去执行while下面的语句。2
18、022/7/20 do-while循环的算法 循环体当表达式为真N-S结构图NY循环体表达式非0?流程图main( ) int i=1,sum=0; do sum=sum+i; i+; while (i=100); printf(%dn,sum);用do-while语句求100个自然数的和 2022/7/20说明: while和do-while都能实现循环控制,while结构程序通常都可以转换成do-while结构区别:do- while 语句先执行循环体再判断条件,循环体至少执行一次; while 语句先判断条件再执行循环体,循环体有可能一次也不执行dowhile循环体中一定要有能使表达式值
19、趋于0的操作(如i+),否则会出现死循环。 2022/7/20while与do while举例:求解1100的累计和while(i=100) sum+=i; i+;dosum+=i; i+;while(i=100)注意:当i=10、i=11时查看结果2022/7/20do-while语句的简单应用 【例12】用辗转相除法求m和n的最大公约数定义m、n、rmnT F m和n交换r=m%nm=nn=r 当r != 0时输出最大公约数m2022/7/20算法和程序:main( ) int m,n,r; scanf(%d, %d,&m,&n); if (mn) r=m; m=n; n=r; do r=
20、m%n; m=n; n=r; while(r!=0); printf(%dn,m); 程序运行情况如下:24, 60122022/7/20do-while举例 例 利用dowhile语句重做前例。2022/7/203.6.3 for语句 语句一般格式 for (表达式1;表达式2;表达式3) 语句 功能:计算表达式1的值,再判断表达式2,如果其值为非0(逻辑真),则执行内嵌语句(循环体),并计算表达式3;之后再去判断表达式2,一直到其值为0时结束循环,执行后续语句。循环初始条件循环控制条件循环体2022/7/20for语句的算法N-S结构图for (表达式1;表达式2;表达式3) 语句NY流程
21、图计算表达式1 语句计算表达式3表达式2为真?例如:main( ) int i,sum; sum=0; for ( i=1; i=100; i+) sum=sum+i; printf(sum=%dn,sum);可部分或全部省略,但“;”不可省略2022/7/20省略for语句的表达式 表达式1、2、3全省略,即: for ( ; ; ) 就等同于:while (1),会无限循环(死循环)注意:在省略某个表达式时,应在适当位置进行循环控制的必要操作,以保证循环的正确执行 省略表达式1和表达式3,即: for(;表达式2;) 就等同于:while( 表达式2 ) 省略表达式2,即: for(表达式
22、1; ;表达式3) 就等同于:表达式1; while(1)表达式3;2022/7/20例如: i=1; for ( ; i100) for (i=1; i100) i+; 2022/7/20说明:所有用 while 语句实现的循环都可以用for 语句实现。 等价于:for(表达式1;表达式2 ;表达式3) 语句;表达式1;while (表达式2) 语句; 表达式3; 2022/7/20for语句的简单应用【例13】求n! ,即计算p=123n的值。 思路:求阶乘与求累加的运算处理过程类似,只要将“+”变为“*”。设置:乘数i ,初值为1,终值为n(n是循环控制终值,需要从键盘输入)累乘器 p
23、,每次循环令p = p*i2022/7/20程序:main( ) int i, n; long p; p=1; printf(Enter n:); scanf(%d,&n); for (i=1; i=n; i+) p = p * i; printf(p = %ld n,p);思考:如何输出1!, 2!, , n! ?如何求s =1!+ 2!+ + n! ? 2022/7/20熟悉几个循环语句while (!x) x+; 当 x=0 时,执行循环体x+; while (c=getchar( ) != n) n=n+1; n 称为计数器,作用是统计输入字符的个数while (num+5); 先执行
24、循环体x*=-3,再判断条件(x5) for (n=0; n26; n+) printf(%c , n+A); 作用是输出26个大写字母for (sum=0, i=1; i=100; sum=sum+i, i+=2) ;作用是计算100以内的奇数和 2022/7/20for循环举例1例 计算1至50中是7的倍数的数值之和main() int i, sum=0; for (i=1; i=50; i+) if (i%7=0) sum+=i; printf(sum=%dn, sum); 运行结果: sum=196 2022/7/20for循环举例2#includestdio.hmain() int
25、n=0; printf(input a string:n); for(;getchar()!=n;n+) ; /*空语句*/ printf(您共输入了%d个字符n,n);说明:只要不是回车符就统计2022/7/20几种循环语句的比较(包括结构的设计)while和do-while语句的表达式只有一个,for语句有三个。while 和for先判断循环条件后执行循环体,do-while语句先执行循环体后判断循环条件。while语句多用于循环次数不定的情况do-while语句多用于至少要运行一次的情况for语句多用于要赋初值或循环次数固定的情况2022/7/203.6.4 用goto语句实现循环有兴趣
26、的同学自学不提倡使用goto语句注意:goto语句能实现程序无条件转移,为编程提供了便利。但是无限制地使用,会破坏程序的结构化程度。因此应限制使用。2022/7/203.6.5 循环结构中的跳转语句有如下三种语句实现跳转:continue语句break语句goto语句在循环语句的循环体中使用,可以进行循环的流程控制2022/7/20后续语句continue; YN表达式?后续语句continue;表达式?YN(1) continue语句及应用 功能:中断循环体的本次执行(即跳过循环体中尚未执行的语句),立即开始执行下一次循环。while语句do-while语句后续语句计算表达式3计算表达式1c
27、ontinue;表达式2?YNfor语句2022/7/20例如: int x,n=0,s=0;while (n10) scanf(%d,&x); if (x0) continue; s+=x; n+; ; int x,n=0,s=0;do scanf(%d,&x); if (x0) continue; s+=x; n+; while (n10); for (n=0,s=0; n10; n+) scanf(%d,&x); if (x0) continue; s+=x; 2022/7/20应用举例 【例14】把100200之间能被7整除的数,以十个数为一行的形式输出,最后输出一共有多少个这样的数。
28、 for (n=100; n=200; n+) n不能被7整除 T F 终止本次循环 输出n 输出10个数 T F 换行2022/7/20算法和程序main( ) int n,j=0; for(n=100;n=200;n+) if (n%7!=0) continue; /不能被7整除,继续下一个数 printf(%6d,n); j+; if (j%10=0) printf(n); printf( n j=%dn,j); 2022/7/20运行结果2022/7/20continue举例 例 把100到150之间的不能被3整除的数输出,要求一行输出10 个数。 main() int n, i=0;
29、 for (n=100; n=150; n+) if (n%3=0) continue; printf(%4d, n); i+; if (i%10=0) printf (n); 2022/7/20后续语句break;YN表达式?后续语句break;表达式?YN(2) 循环中break的应用功能:利用break语句能够强迫终止本层循环,转到后续语句执行。while语句do-while语句后续语句计算表达式3计算表达式1break;表达式2?YNfor语句2022/7/20例如: int x,n=0,s=0;while (n10) scanf(%d,&x); if (x0) break; s+=x
30、; n+; ; int x,n=0,s=0;do scanf(%d,&x); if (x0) break; s+=x; n+; while (n10); for (n=0,s=0; n10; n+ ) scanf(%d,&x); if (x0) break; s+=x; 2022/7/20break举例 例 计算r=1到r=10时的圆面积,直到面积area大于100为止。 #define PI 3.1415926 main() int r; float area; for (r=1; r100) break; printf(r: %d area is: %fn, r, area); 2022/
31、7/20运行结果2022/7/20break举例续运行结果: r: 1 area is: 3.1415930r: 2 area is: 12.566370r: 3 area is: 28.274334r: 4 area is: 50.265480r: 5 area is: 78.539818 2022/7/203.6.6 循环的嵌套如果循环语句的循环体内又包含了另一条循环语句,则称为循环的嵌套例如: /乘法表#include main( ) int i, j; for ( i=1; i10; i+ ) for ( j=1; j=i; j+ ) printf (j=i)?%4dn:%4d,i*j
32、); 外循环语句内循环语句2022/7/20运行结果2022/7/20注意:while、do-while、for循环语句可以并列,也可以相互嵌套,但要层次清楚,不能出现交叉。多重循环程序执行时,外层循环每执行一次,内层循环都需要循环执行多次。例如:for(a=1;a=10;a+) for (b=0;b2)fn= 设变量f1、f2和f3,并为f1和f2赋初值1,令f3=f1+f2得到第3项;将f1f2, f2f3,再求f3=f1+f2得到第4项;依此类推求第5项、第6项这是一种递推算法应采用循环实现2022/7/20算法和程序#define N 20main( ) int i,f1,f2,f3;
33、 f1=f2=1; printf(n%8d%8d,f1,f2); for (i=3; i=N; i+) f3=f1+f2; f1=f2; f2=f3; printf(%8d,f3); if (i%5=0) printf(n); f1=1,f2=1并输出for (i=3; i=20; i+) f3=f2+f1 f1=f2,f2=f3 输出f3 输出5个数 T F 换行2022/7/20运行结果2022/7/20举例【例16】判断输入的某个数m是否为素数。若是素数,输出“YES”,若不是,输出“NO”。 思路:素数是指只能被1和它本身整除的数,如5、7、11、17、等。 分别用2、3、,m-1尝试
34、能否整除整数m。如果m能被某个数整除,则m就不是素数。这是一种穷举算法设除数为j,从2循环到m-12022/7/20算法和程序:#include math.hmain( ) int j,m,k; printf(Enter an integer number: ); scanf(%d,&m); for (j=2; j=m) printf(YESn); else printf(NOn); 输入一个数mfor (j=2; j=m T F输出YES 输出NO2022/7/20运行结果2022/7/20程序的优化对于穷举法来说,为了提高程序的效率,就要减少尝试次数。#include math.hmain
35、( ) int j,m,k; printf(Enter an integer number: ); scanf(%d,&m); k=sqrt(m); for (j=2; j=k+1) printf(YESn); else printf(NOn);思考:如何输出100200中所有的素数 2022/7/20举例【例17】用牛顿迭代法求方程 2x3+4x2-7x-6=0 在x=1.5附近的根。 思路:设xn为一个接近xa的近似根,过(xn, f(xn) 点做切线,切线方程为:即:xnxn+1xy0f(x)(xn, f(xn)(xn+1, f(xn+1) xa 方程的根牛顿迭代公式 2022/7/20思路:过(xn, f(xn) 点做切线,切线方程为:即:xnxn+1xy0f(x)(xn, f(xn)(xn+1, f(xn+1) xa 方程的根牛顿迭代公式 2022/7/20算法基本步骤: 先设一个方程近似根x0,求出方程f的值和方程导数f1的值;f=2x03+4x
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023年家政服务项目融资计划书
- 零食行业蓝皮书
- 电力电缆模拟习题+参考答案
- 养老院老人生活设施维修人员管理制度
- 养老院老人访客管理制度
- 2024年旅游产品销售与推广合同3篇
- 散装白酒代销合同范本(2篇)
- 《王安石变法yong》课件
- 2024年版项目部安全生产职责合同版B版
- 2024年教育机构联合招生合作合同版B版
- 金融数据分析-以Python为工具 课件 一、金融数据分析概览
- 佛山市、三水区2022-2023学年七年级上学期期末地理试题【带答案】
- 财政投资评审咨询服务预算和结算评审项目投标方案(技术标)
- 理工英语3-01-国开机考参考资料
- 绵绵用力久久为功-坚持每天进步一点点初中期末动员班会-2023-2024学年初中主题班会课件
- 2024届湖北高三元月调考数学试卷含答案
- 视频会议系统保障方案
- 西方园林史智慧树知到期末考试答案章节答案2024年内蒙古农业大学
- 湖北省麻城市白鸭山矿区Ⅴ号矿段Ⅴ-1、Ⅶ号矿段Ⅶ-1、Ⅶ-5矿体饰面用花岗岩矿矿产资源开发利用与生态复绿方案
- 转基因的科学-基因工程智慧树知到期末考试答案章节答案2024年湖南师范大学
- 小学英语时态练习大全附答案
评论
0/150
提交评论