《C程序结构和步骤控制.ppt》由会员分享,可在线阅读,更多相关《C程序结构和步骤控制.ppt(83页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第3章 程序结构和流程控制语句,目的与要求 3.1 程序的三种基本结构和语句 3.2 分支语句 3.3 循环语句 3.4 控制执行顺序的语句 3.5 程序设计举例(习题课) 本章小结,目的与要求,通过本章学习,应掌握程序的三种基本结构,即顺序结构、分支结构和循环结构,并掌握C+语言中实现这三种基本结构的控制语句的格式、功能和执行过程。能使用这些控制语句编写具有顺序、分支和循环三种基本结构的程序。,3.1 程序的三种基本结构和语句,3.1.1 程序的三种基本结构 1.顺序结构,2.分支结构,多分支结构,3.循环结构,直到型循环结构,三种基本结构都具有下列的共同特征,(1)单入口和单出口,即只有一
2、个入口和一个出口; (2)没有无用的部分,即结构中所有部分都有被执行的机会; (3)不存在“死循环”(无终止的循环),即执行时间是有限的。 已有人从理论上证明了,由三种基本结构顺序组合构成的程序能处理任何复杂的问题。,3.1.2 C+程序的组成,3.1.3 C+程序的语句,C+程序的语句可以分成以下六大类: 1.说明语句 2.控制语句 3.函数调用语句 4.表达式语句 5.空语句 6.复合语句,3.2 分支语句,分支语句用于实现分支结构程序设计。 分支程序有两路分支结构和多路分支结构,两路分支结构可用if语句实现,多路分支结构可用嵌套的if语句和switch语句实现。,3.2.1 if语句,1
3、.if语句的三种形式 ( 1)单选条件语句 单选条件语句的格式为: if () 【例3.1】 输入两个整数a和b,输出其中较大的一个数。 例程,if语句的三种形式,(2)双选条件语句 双选条件语句的格式为: if () else 【例3.2】 输入两个整数a和b,输出其中较大的一个数。例程,if语句的三种形式,(3)多选条件语句 多选条件语句的格式为: if () else if () else if () . else if () else ,【例3.3】有下列分段函数: 编一程序,输入x,输出y的值。,例程,2.if语句的嵌套,在if语句中又包含一个或多个if语句称为if语句的嵌套。 其一
4、般格式为: if () if () else else if () else ,【例3.5】 求三个整数a、b、c中的最大者,a、b、c由键盘输入。 注意:if语句嵌套使用时,应当注意else与if的配对关系。C+规定:else总是与其前面最近的还没有配对的if进行配对。,例程,3.2.2 条件运算符和条件表达式,(1)条件运算符: ? : (2)条件表达式: ?: (3)执行过程: if (表达式1) 条件表达式=表达式2 else 条件表达式=表达式3; (4)优先级 条件运算符的优先级高于赋值运算符和逗号运算符,低于算术运算符、关系运算符和逻辑运算符。,3.2.3 switch语句,1s
5、witch语句(开关语句) (1)作用: switch语句即开关语句,它根据给定的条件,决定执行多个分支程序段中的某一个分支程序段。 (2)格式: switch () case : case : . case : default: 【例3.7】 输入06的整数,将其转换成对应的星期几。,例程,2break语句在switch语句中的作用,(1)作用: 中止当前语句的执行,并跳转到下一条语句处执行。 (2)格式: break; 【例3.8】 商店打折售货。购货金额数量越大,折扣越大。具体标准为(m:购货金额,d:折扣率): m250(元)d=0% 250m500d=5% 500m1000d=7.5
6、% 1000m2000 d=10% m2000d=15% 从键盘输入购货金额,计算实付的金额。,例程,3.3 循环语句,所谓循环结构就是在给定条件成立的情况下,重复执行一个程序段;当给定条件不成立时,退出循环,再执行循环下面的程序。 实现循环结构的语句称为循环语句。在C+中,循环语句有while语句、dowhile语句和for语句。,3.3.1 while语句,(1)作用: 实现“当型”循环结构。 (2)格式: while () (3)执行过程: 先计算表达式的值,当表达 式的值为非0时,重复执行指定 的语句;当表达式的值为0时, 结束循环。 【例3.9】用while语句计算:S=1+2+3+
7、4+n。 【例3.10】用while语句计算T=n!,即求连乘积:T=1234n。,例程,例程,3.3.2 dowhile语句,(1)作用: 实现“直到型”循环结构。 (2)格式: do while (); (3)执行过程: 先执行语句,然后计算 表达式的值,当表达式的值 为非0时, 就重复执行指定 的语句;当表达式的值为0时, 结束循环。 【例3.11】用dowhile语句计算S=1+2+3+4+n。 【例3.12】 用dowhile语句计算T=n!,即求连乘积:T=1234n。,例程,例程,3.3.3 for语句,1.for语句格式: for (;) 2.for语句的执行过程:,for语句
8、,【例3.13】用for 语句计算: S=1+2+3+4+n。 【例3.14】 用for 语句计算T=n!,即求T=1234n。 【例3.15】计算S= ,即求:,例程,例程,例程,3.3.4 三种循环语句的比较,(1)while与for语句为先判断后执行(当型:可能一次也不执行循环体); dowhile语句是先执行后判断(直到型:循环体至少执行一次)。 (2)三种语句都是循环条件为真时执行循环体,为假时结束循环。 (3)在循环体至少执行一次的情况下,三种循环语句构成的循环结构可以相互转换。 实际上,用得最多的是for语句,其次是while语句,而dowhile语句相对于前两种语句则用得较少。
9、,3.3.5 循环语句的嵌套,循环语句中又包含有循环语句的结构称为循环语句的嵌套。 【例3.16】 求出100200之间的所有素数,输出时一行打印五个素数。,例程,3.4 控制执行顺序的语句,3.4.1 break语句 (1)作用: 终止switch语句与单循环语句的执行; 对多重循环循环语句,可从内循环体跳到外循环体。 (2)格式: break;,3.4.2 continue语句,(1)作用: 在循环语句中,结束本次循环,重新开始下一次循环。 (2)格式: continue; 【例3.17】 输入10个整数,统计其中正数的和及正数的个数。,例程,3.4.3 语句标号和goto语句,1.语句标
10、号 (1)作用: 指示语句在程序中的位置,常常作为转移语句(goto语句)的转移目标。 (2)格式: : 语句标号用标识符来表示,它的命名规则与标识符的命名相同。 2.goto语句 (1)作用: 改变程序的流程,无条件地转移到指定语句标号的语句处去执行。 (2)格式: goto ;,3.4.4 exit( )和abort( )函数,1.exit( )函数 (1)作用: 无条件正常终止程序的执行,并将控制返回给操作系统。 (2)格式: exit(); 2.abort( )函数 (1)作用: 用于异常终止程序的执行。 (2)格式: abort( );,3.5 程序设计举例(习题课),程序设计有三种
11、基本结构,即顺序结构、分支结构和循环结构。 分支结构程序主要是用分支语句(if、switch)实现的,而循环结构程序则主要是用循环语句(while、do while、for)语句实现。 本节重点对分支与循环语句的应用编程举例。,3.5.1 分支语句应用举例,分支语句用于实现分支结构程序设计。 能够用分支结构程序解决的常见问题有:比较数的大小、找出若干数中最大值与最小值、分段函数、解一元二方程、判断闫年、多分支问题。 分支语句有if语句和switch语句。,(1)if 语句,if语句又有单选、双选与多选if语句,格式分别为: 单选if语句 双选if语句 多选if语句 if () if () if
12、 () else else if else if语句可以嵌套使用,但应当注意else与if的配对关系。C+规定:else总是与其前面最近的还没有配对的if进行配对。,if 语句,【例3.19】 编写程序,求一元二次方程ax2+bx+c=0的解。 C+程序设计的一般步骤为: l进行数学分析建立求解数学模型; l 根据数学模型确定程序框架及所用语句; l 根据数学模型确定所要定义的变量及其数据类型; l给变量输入数据; l 编写计算程序,执行程序得到运算结果; l输出运算结果。,例程,(2)switch语句,switch语句的格式为: switch () case : . case : defau
13、lt: 注意:在执行switch语句的过程中,一般用break语句结束switch语句的执行 【例3.20】 输入某一年的年份和月份,计算该月的天数。,例程,3.5.2 循环语句应用举例,循环语句用于实现循环结构程序设计。 能够用循环结构程序解决的常见问题有:累加和、连乘积、求一批数的和及最大值与最小值、求数列的前n项、判素数、求两个整数的最大公约数和最小公倍数、用迭代法求平方根、用穷举法求不定方程组的整数解、打印图形等等。 循环语句有while语句、dowhile语句和for语句。,循环语句格式,while语句、dowhile语句和for语句的格式如下: while语句 dowhile语句
14、while () do ; while (); for语句 for (;) ; 应注意三种循环语句的特点、它们间的区别及由三种循环语句构成的嵌套循环结构。,循环语句应用举例,【例3.21】 用公式 ,即: 求自然对数底e的近似值(n=10)。 分别用while语句、dowhile语句和for语句三种语句实现。 【例3.22】 ,用累加和的方法求s值,直到 最后一项 0.00001为止。 【例3.23】 裴波那契数列的前几个数为1,1,2,3,5,8,其规律为: f1=1(n=1) f2=1(n=2) fn=fn-1+fn-2(n3) 编写程序求此数列的前面40个数。,例程,例程,例程,循环语句
15、应用举例,【例3.24】 有100个学生种100棵树,其中高中生每人种3棵树,初中生每人种2棵树,小学生每3人种1棵树,问高中生、初中生、小学生各有多少人? 【例3.25】 编写程序,按下列格式打印九九表。 * 1 2 3 4 5 6 7 8 9 1 1 2 2 4 3 3 6 9 4 4 8 12 16 5 5 10 15 20 25 6 6 12 18 24 30 36 7 7 14 21 28 35 42 49 8 8 16 24 32 40 48 56 64 9 9 18 27 36 45 54 63 72 81,例程,例程,本章小结,一个C+程序由若干个源程序文件组成,一个源程序文件
16、可以有若干个函数和编译预处理命令组成,一个函数由函数说明部分和函数执行部分组成,函数执行部分由数据定义和若干个执行语句组成。语句是组成程序的基本单元。,程序的三种基本结构和C+语句,1.程序的三种基本结构 组成C+程序的函数是由若干个基本结构组合而成的。有三种基本结构,即顺序结构、分支结构和循环结构。各种控制结构是通过语句来实现的。 2.C+中的语句 C+语言的语句可以分成六大类,即说明语句、控制语句、函数调用语句、表达式语句、空语句和复合语句。其中控制语句主要有分支语句与循环语句。,3.分支语句,分支语句用于实现分支结构程序设计。分支语句有if语句和switch语句。 (1)if浯句 if语
17、句的格式为: if () else if语句可以嵌套使用,但应当注意else与if的配对关系。C+规定:else总是与其前面最近的还没有配对的if进行配对。,(2)条件运算符和条件表达式,由条件运算符(? :)构成的条件表达式的一般格式为: ?:,(3)switch语句,switch语句的格式为: switch () case : case : . case : default: ,分支结构程序解决的常见问题,注意:在执行switch语句的过程中,每当执行完一个case后面的语句后,程序会不加判断地自动执行下一个case后面的语句。如果要结束switch语句的执行,可用break语句来实现。
18、能够用分支结构程序解决的常见问题有:比较数的大小、找出若干数中最大值与最小值、分段函数、解一元二方程、判断闫年、多分支问题。,4.循环语句,循环语句用于实现循环结构程序设计。循环语句有while语句、dowhile语句和for语句。 (1)while语句 while语句用来实现“当型”循环结构,其格式为: while () ( 2)dowhile语句 dowhile语句用来实现“直到型”循环结构,其格式为: do while ();,(3)for语句,for语句是功能较强的一种循环语句,其格式为: for (;) 应注意三种循环语句的特点、它们间的区别及由三种循环语句构成的嵌套循环结构。,循环
19、结构程序解决的常见问题,能够用循环结构程序解决的常见问题有:累加和、连乘积、求一批数的和及最大值与最小值、求数列的前n项、判素数、求两个整数的最大公约数和最小公倍数、用迭代法求平方根、用穷举法求不定方程组的整数解、打印图形等等。,5.控制执行顺序的语句,(1)break语句 break语句的格式为: break; break语句只能用在循环语句和switch语句中,其功能是终止循环语句和switch语句的执行。 (2)continue语句 continue语句的格式为: continue; continue语句只能用在循环语句中,其功能是结束本次循环,重新开始下一次循环。,(3)goto语句,
20、C+允许语句前带有一个标号,称为语句标号。 C+中带标号语句的格式为: : goto语句的格式为: goto ; goto语句的功能是改变程序的执行流程,无条件地转移到指定语句标号的语句处去执行。从程序设计的角度出发,在程序设计时应尽量避免使用goto语句。,例3.1,#include void main(void) int a,b,max; coutab; max=a; if (bmax) max=b; coutmax=maxendl; ,返回,程序执行后提示: Input a,b: 3 8 max=8,例3.2,#include void main(void) int a,b,max; c
21、outab; if (ab) max=a; else max=b; coutmax=maxendl; ,返回,程序执行后提示: Input a,b: 3 8 max=8,例3.3,#include void main(void) float x,y; coutx; if (x0) y=x+1; else if (x10) y=x*x-5; else y=x*x*x; couty=yendl; ,程序执行后提示: Input x: 3 y=4,返回,例 3.5,#include void main() int a,b,c,max; coutabc; if (ab) if (ac) max=a;
22、else max=c;,else if (bc) max=b; else max=c; coutmax=maxendl; 程序执行后提示: Input a,b,c:1 4 5 max=5,返回,例 3.7(A),#include void main() int a; couta; switch (a) case 0:coutSundayn; case 1:coutMondayn; case 2:coutTuesdayn; case 3:coutWednesdayn; case 4:coutThursdayn; case 5:coutFridayn; case 6:coutSaturdayn;
23、default:coutInput data error.n; ,返回,例 3.7(B),#include void main() int a; couta; switch (a) case 0:coutSundayn;break; case 1:coutMondayn;break; case 2:coutTuesdayn;break; case 3:coutWednesdayn;break; case 4:coutThursdayn;break; case 5:coutFridayn;break; case 6:coutSaturdayn;break; default:coutInput d
24、ata error.n; ,返回,例3.8,#include void main() int m,c; float d,f; coutm; if (m=2000) c=8; else c=m/250; switch (c) case 0:d=0;break; case 1:d=5;break; case 2: case 3:d=7.5;break; case 4:,case 5: case 6: case 7:d=10;break; case 8:d=15;break; f=m*(1-d/100.0); coutf=fendl; 程序执行后提示: Input m:500 f=462.5,返回,
25、例3.9,#include void main() int i,n,sum; coutn; sum=0; i=1; while (i=n) sum=sum+i; i+; coutsum=sumendl; ,程序执行后提示: Input an integer:5 sum=15,返回,例3.10,#include void main() int i,n; float t; coutn; t=1.0; i=1; while (i=n) t=t*i; i+; coutt=tendl; ,程序执行后提示: Input an integer:5 t=120,返回,例3.11,#include void m
26、ain() int i,n,sum; coutn; sum=0; i=1; do sum=sum+i; i+; while (i=n); coutsum=sumendl; ,返回,例3.12,#include void main() int i,n; float t; coutn; t=1.0; i=1; do t=t*i; i+; while (i=n); coutt=tendl; ,返回,例3.13,#include void main(void) int i,n,sum; coutn; sum=0; for (i=1;i=n;i+) sum=sum+i; coutsum=sumendl;
27、 ,返回,例3.14,#include void main() int i,n; float t; coutn; t=1.0; for (i=1;i=n;i+) t=t*i; coutt=tendl; ,返回,例3.15,#include void main(void) int i; float t,sum; sum=0; for (i=1;i=20;i+) t=1.0/(i*(i+1); sum=sum+t; coutS=sumendl; ,程序执行后输出: s=0.952381,返回,例3.16,#include #include #include void main(void) int
28、a,k,i,n; n=0; for (a=100;a=200;a+) k=sqrt(a); for (i=2;i=k;i+) if (a%i=0) break;,if (ik) coutsetw(12)a; n=n+1; if (n%5=0) coutendl; coutendl; ,程序运行后,输出: 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199,返回,例3.17,#include void main() int a,i,k=0,s=0; couta; if (a=0)
29、continue; k+; s+=a; coutk=kts=sn; ,程序执行后提示: Input 10 integer:1 2 3 4 5 6 7 8 9 0 k=9 s=45,返回,例3.19(1),#include #include void main(void) float a,b,c,d,t1,t1,x1,x2; coutabc; if (a=0.0) if(b=0.0) coutInput data error!endl; else x1=c/b; coutSingle root:x1endl; else, d=b*b4*a*c; t1=b/(2*a); t2=sqrt(fabs(
30、d)/(2*a); if (d=0.0) x1=t1; cout0.0) x1=t1+t2; x2=t1t2; coutTwo distinct real roots:x1,x2endl; else coutComplex roots:; coutt1+t2i,t1t2iendl; ,例3.19(2),例3.19(3),程序运行后,提示: Input a,b,c:2 -5 3 输出: Two distinct real roots:1.5,1,返回,例3.20(1),#include void main() int year,month,day; coutyearmonth; switch (
31、month) case 1: case 3: case 5: case 7: case 8: case 10: case 12:day=31;break;,例3.20(2),case 4: case 6: case 9: case 11:day=30;break; case 2:if (year%400=0 | year%4=0 ,例3.20(3),程序运行后,提示: Input year and month:2002 1 输出: The day of 2002,1 is 31,返回,例3.21(1) (用while语句编程),#include void main(void) int i=1;
32、 float s=1.0,t=1,p; while(i=10) t=t*i; p=1/t; s=s+p; i+; coute=sendl; 程序执行输出: e=2,例3.21(2) (用dowhile语句编程),#include void main(void) int i=1; float s=1.0,t=1,p; do t=t*i; p=1/t; s=s+p; i+; while(i=10); coute=sendl; 程序执行输出: e=2,例3.21(3) (用for语句编程),#include void main(void) int i; float s=1.0,t=1,p; for(
33、i=1;i=10;i+) t=t*i; p=1/t; s=s+p; coute=sendl; 程序执行输出: e=2,例3.21(4),在本例中,程序运算输出结果e=2与自然对数的底e=2.71828误差较大。为了使误差控制在规定的范围之内,应要求数列中最后一项的值小于。即: 若取=0.00001,则循环的结束条件为p=0.00001。上述程序可改为如下形式。,例3.21(5) (用while语句编程),#include void main(void) int i=1; float s=1.0,t=1,p=1; while(p=0.00001) t=t*i; p=1/t; s=s+p; i+;
34、 coute=sendl; 程序执行输出: e=2.71828,例3.21(6) (用dowhile语句编程),#include void main(void) int i=1; float s=1.0,t=1,p=1; do t=t*i; p=1/t; s=s+p; i+; while(p=0.00001); coute=sendl; 程序执行输出: e=2.71828,例3.21(7) (用for语句编程),#include void main(void) int i; float s=1.0,t=1,p=1; for(i=1;p=0.00001;i+) t=t*i; p=1/t; s=s
35、+p; coute=sendl; 程序执行输出: e=2.71828,返回,例3.22,#include void main(void) int i,t1=1; float s=1.0,t=1,p; i=1; do t=t*i; t1=(-1)*t1; p=t1/t; s=s+p; i+; while(1/t0.00001);,返回,couts=sendl 程序执行后输出: s=0.367879,例3.23(1),#include #include void main() long int f1,f2; int i; f1=1;f2=1; for (i=1;i=20;i+) coutsetw(
36、12)f1setw(12)f2; if (i%2=0) coutendl; f1=f1+f2; f2=f2+f1; ,例3.23(2),程序运行后,输出: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 39088169 63245986 102334155,返回,例3.24,#include void main(void) int i,j,k; for (i=1;i=33;i+) for (j=1;j=50;j+) k=100-i-j; if (k%3=0) ,程序运行后,输出: 5 32 63 10 24 66 15 16 69 20 8 72,返回,例3.25,#include void main() int i,j; cout*t; for (i=1;i=9;i+) coutit; coutendl; for (i=1;i=9;i+) coutit; for (j=1;j=i;j+) couti*jt; coutendl; ,返回,