版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第3章 程序和流程控制3.1 C+程序的版式及语句3.2 结构化程序设计和流程控制3.3 if语句3.4 switch多分支选择语句 3.5 循环控制3.6 辅助控制语句3.7 典型程序编写方法举例3.8 小结123.1 C+程序的版式及语句3.1.1 从程序设计思路的角度理解C+程序的版式3.1.2 C+语言的语句33.1.1 从程序设计思路的角度理解C+程序的版式 在第一章基础上,从程序设计思路的角度出发,从理解程序的模块化框架出发,进一步深入说明程序的版式。 首先来看一个简单的C语言程序的例子,从键盘上输入二个整数,在屏幕上输出它们的和。14/* 求二整数之和的程序 */#includ
2、e int main( ) auto int a,b; auto int sum; scanf(%d%d,&a,&b); sum = a + b ; printf(sum=%d,sum); return 0;这是一个典型的只包含单个函数(即main( ))的程序,编写单个函数的程序是整个编程的基础和入门预处理信息输出变量定义数据输入算法部分函数定义模板3为方便代码维护,函数的分界符和应独占一行并且位于同一列; 之内的代码块在右边数格处左对齐。 如果出现嵌套的,则使用缩进对齐,如: 5 编写C语言程序一般应包含如下几个部分(1)注释部分:格式为:*注释内容* 用于注释多行或 /注释内容用于注释一
3、行源文件开始处,说明函数的功能,输入/输出接口规则,版权信息等。养成边写代码边注释的习惯。(3)函数定义部分,包括函数返回值类型,函数名及参数定义表,函数main为入口函数,C+标准指定其返回值类型为int,当然定义成void也很常见,无参数输入时,main()内参数表为空。(2)预处理块、外部存储类变量说明、函数原型说明等。(参见后面章节)36(4)变量定义部分,对函数内部使用的变量进行定义说明;(5)数据输入部分,对要使用的变量赋初值,可人机交互输入或直接赋值,有些是在第(4)部分完成(即变量定义时直接初始化);(6)执行部分,它是整个程序的核心,一般是对程序算法用结构化程序设计方法进行描
4、述,然后将其转化成对应的C+语言语句;(7)信息输出部分,根据要求通过人机交互显示输出信息或由return返回结果;有些是在第(6)部分一边执行一边输出。17支持代码可重用,将程序的执行部分封装为新的函数例3.2 改写求二整数之和的程序 #include /预处理int add(int x,int y); /函数原型void main( ) /函数定义 auto int a,b; /变量定义 auto int sum; scanf(%d%d,&a,&b); /数据输入 sum = ; /算法部分 printf(sum=%d,sum); /信息输出/*求和函数,输入参数为二整数,返回值为其和*/
5、int add( ) /函数定义 auto int z; z = x + y; /算法部分 return z; /信息输出输入:7 8 该程序的运行结果为:sum=15add(a, b)变量定义变量定义5算法部分可以独立封装形成新的函数定义,实现重复使用a+bint x, int y其他函数四个部分int x, y;/会出现什么情况?!注重接口定义的分析x = ay = bz请思考!8 C+语句是程序基本指令单位,语句以分号结束 根据语句的作用可以把语句分成定义/说明语句和执行语句两大类。3.1.2 C+语言的语句191. 定义/说明语句 定义语句的格式为 数据类型 变量名列表; 例如: au
6、to int i, j ; 执行语句中所使用的每一个变量都必须在此前定义过。 定义语句也可以初始化(或赋初值),如: static char ch =H; auto unsigned long y = 0 x356847L ;用来对程序中所使用的各类型变量进行定义/说明说明语句:1、外部存储类型变量说明:extern long id;2、函数原型说明:extern int max(int x , int y); 二者有区别二者有区别3可以省略extern不能省略extern102. 执行语句 (1)表达式语句 表达式;/表达式语句 ;/空语句 带函数调用的表达式语句 一般包含四大类,分别是:
7、表达式语句(包括空语句) 复合语句 流程控制语句 if,switch,for, 辅助控制语句break,continue sum = add( a , b) ; printf( “hello !”) ; 311 (2)复合语句 ( auto存储类型初探 ) 将若干语句用括号 括起来就构成了复合语句,复合语句在语法上相当于一个语句,在程序结构上是以整体出现,相当于程序块(BLOCK),当一个功能必须用多条语句才能完成时,就需要使用复合语句。复合语句的一般格式为: 定义/说明语句; 可执行语句; 在C中复合语句里只写执行语句,而定义语句统一放在函数开始的几行,说明语句位置没有限定。 在C中允许就近
8、定义变量; 流程控制语句、辅助控制语句将在下一节介绍。2void main(void) float x,y=9; if(y!=0) /复合语句 /C不允许C+允许 z =x =y; float z;/C规定12内定义的auto变量是局部变量,它只在范围内有效,换句话说,离开范围就不可能再使用它。auto 变量的存储空间是在栈内存区分配。栈空间的特性就是动态分配、动态回收(又叫按需分配) 被回收的栈空间可以被再分配给下一个需要栈的变量。栈空间的利用率很高。具体分配过程如下:执行到复合语句,在栈里分配(construct)内存空间(称为变量实体),离开复合语句的瞬间,对应于该变量的栈空间将被回收(
9、destroy). 由于变量对复合语句来说是局部的,即无法在一个复合语句中访问另一个复合语句中定义的变量(即使内嵌的复合语句也是如此!)。由于这些特点,不同复合语句中可定义同名的变量,而不必担心有什么冲突和意想不到的变故。auto变量的实体存在时间(生存期)短,可以引用该变量实体的执行语句范围(程序代码空间)(作用域)窄。联想:酒店的普通客房联想:两个教室不会有同一个学生,但可以有两个同名定义的学生13 C+语言规定只要作用域存在不重叠,都可以使用同名变量,而不至于冲突。对于复合语句存在嵌套的情况,在内外层中都可以定义同名变量。#include int max(int x , int y) i
10、nt z; z =(xy)?x:y ; return ( z ); void main() int x , y , z; x=1; y =8; printf(“x=%d,y=%dn”,x,y); z =max(x,y); printf(“max=%d n”, z ); 当执行到内层时规定只能访问就近定义的内层同名变量,外层同名变量在内层作用域内不可见,一旦执行离开内层复合语句,则内层同名变量无效,此时进入外层作用域,外层同名变量可见,因此,访问外层定义的同名变量。同名变量同名变量函数作用域函数作用域14#include void main() int x ; x =1; printf(“x=%
11、dn”,x ); int x =8; printf(“x=%dn”,x ); printf(“x=%dn”,x ); x +; printf(“x=%dn”,x );复合语句中变量作用域举例:输出结果:x=1x=9x=8x=2函数作用域1复合语句作用域2复合语句作用域3int x =9;输出结果改为:x=1x=8x=8x=2方法:同名变量加编号221111133不同作用域同名变量不打架原则去掉x3定义,将出现什么现象?!?2向上、向外寻找定义的就近原则15小 结我们设计的代码是由多个函数组成的,每个函数都可以分解成:变量定义、部分变量赋值、核心算法执行、信息输出四部分初步了解存储类型的重要性,
12、它决定了变量的使用区域(作用域scope),auto存储类变量在栈内分配,动态分配和回收同名变量,遵循就近访问原则163.2 结构化程序设计和流程控制3.2.1 结构化程序设计3.2.2 流程控制语句和辅助控制语句173.2.1 结构化程序设计三种基本结构: 由三种基本结构经过反复嵌套构成的程序称为结构化程序顺序结构1选择结构循环结构顺序结构选择结构循环结构183.2.2 流程控制语句和辅助控制语句 图3.4 C/C+提供的流程控制语句193.3 if语句3.3.1 if语句的标准形式3.3.2 条件分支嵌套203.3.1 if语句的标准形式if-else条件分支语句的标准使用形式,它的流程和
13、语句形式如下:图3.5标准if-else的流程和语句 1if(a=0) printf(come on ,baby!); else printf(go away!); 加,养成好的习惯21if(表达式A) 语句1; 语句2;else 语句3;if分支是if-else分支的缺省情况,即缺省else时的条件分支。 图3.6缺省else时的条件分支的流程和语句 例如: if ( i=90) grade= A ; else if (i=70) grade=B ; else if (i=60) grade=C ; else grade=D ; i=70&i=60&i0时,有x1,x2两个不等实根; 当b2
14、-4ac0时,有x1=x2两个相同的实根 当b2-4ac0时,有两个共轭的虚根;实部x3和虚部x4125 程序如下: #include #include void main( ) float a,b,c; float x1,x2; float x3,x4; printf(input the numbers: a ,b ,c:); scanf(%f%f%f,&a,&b,&c); if ( a = 0) printf(the input is errorn); return ; if ( b*b 4*a*c) x1 = (-b+sqrt(b*b-4*a*c)/(2*a); x2 = (-b-sqr
15、t(b*b-4*a*c)/(2*a); printf(x1=%.2f,x2=%.2fn,x1,x2); else if ( b*b = 4*a*c) x1 = x2 = (-b)/(2*a); printf(x1=x2=%.2fn,x1); else x3 = -b/(2*a); x4 = sqrt(4*a*c- b*b)/(2*a); printf(x1=%.2f+%.2f in,x3,x4); printf(x2=%.2f-%.2f in,x3,x4); fabs(a)=1e-9)fabs(b*b-4*a*c)=1e-9)3实型表达式a,与零值恒等比较 if (fabs(a)= 1e-9
16、) 按照四步骤函数版式来完成代码设计变量定义变量赋值执行算法同时信息输出26 该程序的运行结果(分四种情况)为:(1) 0 1 4 /输入 the input is error /输出(2) 1 4 3 /输入 x1= -1.00 ,x2= -3.00 /输出(3) 1 4 4 /输入 x1=x2=-2.00 /输出 (4) 1 2 4 /输入 x1=-1+1.73 i /输出 x2=-1-1.73 i测试数据需要注意完备性27另一种嵌套方式:if if elseelse配对的二义性判断准则 C语言规定:else 总是与上面最近的一个尚未配对的 if 语句相配对。128#include voi
17、d main(void) int n; printf(“n=”); scanf(“%d”, &n); if (n0) if (n%2=0)/或!(n%2) printf(“Positiven”); else ; else printf(“Notn”);正确【例】编程,若一个整数为正数且是偶数,输出提示“Positive & even”,若为负数,则输出“Not positive”。#include void main(void) int n; printf(“n=”); scanf(“%d”, &n); if (n0)/ if (n%2=0) / printf(“Positive &evenn
18、”); else printf(“Not positiven”);错误:else与if相配对。而不是期望的与if配对。即使采用缩进的方法也不行,C的缩进法只是为了易读,而不影响编译程序的工作。#include void main(void) int n; printf(“n=”); scanf(“%d”, &n); if (n0) if (n%2=0)/或!(n%2) printf(“Positiven”); else printf(“Notn”); 正确3293.4 switch多分支选择语句 图3.8 switch语句的流程控制30对应的语句形式如下:switch(表达式p) case 常
19、量表达式值p1: 语句组1; break; case 常量表达式值p2: 语句组2; break; case 常量表达式值 pn: 语句组n; break; default: 语句组n+1; break; /可选最多只有一次匹配的机会标号的作用联想:三叉路口看路牌default作用标号31#define ESC 0 x011b#define F1 0 x3b00 /F1键的键值为0 x3b00#define F2 0 x3c00#define F3 0 x3d00#define F4 0 x3e00#define F5 0 x3f00#define F6 0 x4000#include #in
20、clude int main( ) unsigned int key_value; key_value = bioskey(0); switch (key_value) case F1: puts(“F1功能处理程序”); break; case F2: puts(“F2功能处理程序”); break; case F3: puts(“F3功能处理程序”); break; case F4: puts(“F4功能处理程序”); break; case F5: puts(“F5功能处理程序”); break; case F6: puts(“F6功能处理程序”); break; / default:
21、puts(“相应处理程序”); break;/可以不要 return 0; 例3.5 编一示意性的菜单处理程序, 按下某功能键, 执行响应的功能处理。2例bioskey2kbhit.cpp关于VC6完成键盘扫描功能32上述程序中bioskey()是一库函数,其函数的原型说明包含在头文件中,故在程序前面的文件包含预处理有#include ; bioskey(0)的功能是等待从键盘按下一键,并返回其键值,键值是一无符号整型值,如按下F1键则返回键值0 x3b00,上述示意程序是编写键盘交互程序最常用方法。 关于switch语句,注意以下几点:1.switch ( )后面圆括号中的表达式要求结果是整
22、数类类型,各个case的判断值要求是整形文字量4.当表达式的结果值与所有的case的判断值都不一致时,程序执行default部分的语句组。但default部分不是必须的。2.各个case和default及其下面的语句组的顺序是任意的,但各个case后面的判断值必须是不同的值。3.多个分支语句组的break语句起着退出switch-case结构的作用,若无此语句,程序将顺序执行直到处。5. 表达式的多个结果值可以对应相同的执行语句组,相当于多个case重叠。case a:case b:case c: printf(“right!n”);break;default: printf(“error!n
23、”);【常见错误】 case和常量表达式之间忘记空格。4例specialswitch.cpp关于switch语句执行盲点重要对应无break情况33不带break的形式:表达式p的值执行语句组1执行语句组2执行语句组n+1值p1值p2都不是.134# include void main ( ) char grade ; cout Input grade of score (a-d) : grade ; switch ( grade ) case a : cout 85_100 n ; case b : cout 70_84 n ; case c : cout 60_69 n ; case d
24、: cout 60 n ; default : cout error n ; 写出下列代码的输出结果: (输入字母a) ?演示输入a输出85_10070_8460_6960error输出85_10070_8460_6960error输出85_10070_8460_6960error输出85_10070_8460_6960error输出85_10070_8460_6960error如果输入字母c呢?!35例3.6 我们在数学中经常遇到下面的计算式,输入一个数值x,请计算结果。 36#include#include/process.hint main( ) long double x, y; co
25、utx; switch (int) x) case 0: case 1: y = x + 1; break; case 2: case 3: y = 2 * x + 2; break; case 4: case 5: y = 3 * x + 3; break; case 6: case 7: y = 4 * x + 4; break; default: couterror in input datan; exit(0);/exit status is success /break; cout“y = “ yn; return 0;利用switch语句实现上述功能,我们可以写成如下形式: 2 P
26、 int(x) vs. (int)(x)没有exit(0)会有什么结果?37switch ( int (E1) ) case 1 : S1 ; break ; case 0 : S2 ;if 与 switch 语句互换if ( E1) S1 ;else S2 ; 关系或逻辑表达式取值表达式不止1和0的其他表达式?!(E1!=0)int(E1) Vs (int)(E1)383.5 循环控制3.5.1 while语句3.5.2 for语句3.5.3 do-while语句3.5.4 从一重循环到多重循环393.5.1 while语句循环结构是在给定条件时,反复执行某个程序段,反复执行的程序叫循环体。
27、C语言有三种循环流程控制。while循环,for循环,do-while循环。while 循环的程序流程和程序形式:图3.9 while语句的流程及语句形式140例3.7用 while循环语句编写一程序求1299100的值;#include int main( ) int i ; int sum ; sum = 0; i = 1; while ( i 1000直至 i 20 i = 0; while(+i=100) sum += i;/1+2+.100触发器3 可以写成: sum + = i ; i + + ; 或: sum + = i + + ;如果写成: sum + = + + i ; 会有
28、什么问题?出口形式上不变,即语义不变但内容在变413.5.2 for语句for 循环是功能上比while循环更强的一种循环结构图3.10 for语句的流程和语句形式242例3.8 我们还是用上一节的例子,利用for循环语句编写一程序求 的值;#include int main( ) int i ; int sum ; for (i = 1 , sum = 0 ; i = 100; i +) sum += i ; printf(sum = %d n, sum); return 0;该程序的运行结果为:sum =50501;? 此处分号多此一举,for语句将把分号当做“空语句”后视作 循环体处理!
29、while() 格式也是如此这个通常没有!43【说明】:1.当条件表达式的值为真(非零)时,执行循环体,为假(等于0)则循环结束; 2.循环体可以为空3.循环语句应有出口4. 触发器判断标准由“假”变为“真”5.for(初值;终值;步长) 循环体 6. for( ; ; )等同于 for( ; 非0 ; )建议空语句单独一行。1如: while(ch=getchar()!=A) ;for(int i=0 ; i10000 ; i+) /起延迟一段时间的作用终值当做“出口”判断使用步长当做“触发器”使用443.5.3 do-while语句do-while循环程序流程和程序形式为:图3.11 do
30、-while语句的流程与语句形式1这个可以有!45例3.9 利用dowhile循环编写程序求#include int main( ) int i ; int sum ; sum = 0; i = 1; do sum = sum + i ; i +; while ( i=100); printf(sum = %d n, sum); return 0;该程序的运行结果为:sum =5050对比例3.7while型: sum = 0; i = 1; while ( i = 100) sum = sum + i ; i +; 46 当循环体部分的功能无法用顺序和选择结构而必须用循环结构来实现时,上述的
31、结构就变成如下的形式: while(条件表达式1) while(条件表达式2) 循环体部分2; 3.5.4 从一重循环到多重循环即外层循环体每执行一轮次,内层循环就必须完成一次遍历。 依此类推如果循环体部分2的功能无法用顺序和选择结构而必须用循环结构来实现时, 上述结构就变成了三重循环。47用上述的道理再考虑for循环, 在只考虑二重循环的情况下有如下几种形式:(1). while( ) (2).while( ) while( ) for( ; ; ) (3).for( ; ; ) (4).for( ; ; ) for ( ; ; ) while( ) 1还有结合dowhile();的多种组合
32、 P 48程序如下:#include void main( ) int i,j; for ( i = 0 ; i 6 ; i +) printf(n); for(j = 0 ; j 5-i ; j +) printf( ); for(j=0 ; j2*i+1 ; j+) printf(*); 例 xunhuan1.cppconst int N=6;void main( ) int i,j; for ( i = 0 ; i N ; i +) printf(n); for(j = 0 ; j =N-i&j=N+i) printf(*); else printf( ); puts();4辅助自学案例
33、编程输出如下所示的三角形 * * * * * * * * * * * *输出每行空格符输出每行星号符循环变量j当做列号来看待循环变量j不当做列号看待493.6 辅助控制语句3.6.1 break语句3.6.2 continue语句3.6.3 goto 语句和标号503.6.1 break语句 【适用范围】:循环体语句和switch语句内部 【功能】:从switch结构和三种循环体内部跳出 注意: break语句只能跳出一层循环或switch。通过使用break 语句可不必等待循环条件起作用,而直接使循环退出或使switch 语句结束,这样做在很多情况下是十分必要的。513.6.2 contin
34、ue语句【适用范围】:循环结构【功能】:结束本轮次循环,即跳过循环体内尚未执行的语句,直接进行下一轮次是否执行循环的判定。注意:二者区别:continue语句只是结束本轮次循环,而不是中止整个循环,而break语句则是结束并跳出整个循环。152break 与 continue 语句比较while ( E1 ) 语句 1 if ( E2 ) break ; 语句 2while ( E1 ) 语句 1 if ( E2 ) continue ; 语句 2 语句2 E 1 语句1 E2 下一语句 break 语句2 E 1 语句1 E 2 下一语句 continue假假真真 P 53【例】:将316表
35、示为2个数的和,其中一数为13的倍数,另一数是11的倍数。 思路:设第一个数为i*13,i为正整数,则第二个数必为316i*13,可令i从1开始递增,若316i*13能被11整除则表示找到了答案并结束循环。#include int main() int i; for(i=1; ; i+) if( (316-i*13)%11 = 0 ) break ; printf(“%d +%d =316n”,i*13,316i*13); return 0;【应用说明】常与if语句连用,适用于do_while,while,for,switch语句, break是跳出包含它的最内层的上述四种语句中任一个。试数法
36、3!(316-i*13)%11)54当程序执行到continue语句时,将跳过循环体中后面还没有执行的语句,并到达循环体的末尾的前面一遇到continue语句,立即测试表达式是否成立。注意:通常while语句的触发器是放在循环体的末尾执行,而continue语句将跳过末尾端的触发器,因此在这种情况下,continue前必须加上触发器。一遇到continue语句,立即计算表达式3,而后测试表达式2,表达式3常作触发器使用。while(表达式) . continue ; .for(式1;式2;式3 ) . continue ; .3表达式式355例3.13 把0100之间能被5整除的数输出。程序如
37、下: void main( ) int n; for(n=0;n=100;n+) if(n%5!=0) continue; printf(%dt,n); void main( ) int n=0; while(n=100) if(n%5!=0) n+; continue; printf(%dt,n); n+; 56goto 语句和标号 程序中使用goto语句时要求和标号配合,一般形式: goto 标号; 标号: 语句; goto 语句的功能是,把程序控制转移到同一函数内标号指定的语句处。即执行goto语句之后,程序从指定标号处的语句继续执行。 注意: goto语句常用的用法是用它退出多重循环。
38、 用goto语句设计程序存在的问题: 1. 破坏结构化设计风格。 2. goto语句经常带来错误或隐患。 所以我们不提倡使用goto语句573.7 典型程序编写方法举例本章我们强调了程序的风格和结构的规范化,但是当我们面对一个较为复杂的编程问题时。是不可能立即编写出风格和结构具佳的程序的,一般的方法是采用自顶向下逐步求精的模块化,结构化的方法进行分析和设计,把一个复杂问题分解成若干便于实现的小问题,本章讲述的是单个程序的编写,即是如何编写这些便于实现的小问题的程序,下面针对几类问题进行分析和实现。258一 典型问题1例3.15 求序列:1, 3, 5, 7, 9.的前二十项之和。分析: 我们可
39、以由上面的数列观察得出如下规律: 第i+1项 =第i项 + 2由此我们可以先编写出程序然后再进行分析程序如下所示:#include int main( ) int i; int sum, t ; /sum代表和, t代表某项 sum = 0 ; t = 1 ; for (i=1 ; i=20 ; i+) sum + = t; t += 2; printf( sum = %d,sum); return 0;该程序的运行结果为:sum =400259分析上面的程序我们不难得出该程序的结构大致如下:头文件部分 int main() 变量定义部分; 初始化 ( 累加和清零, 项变量初始化得第一项) 循
40、环( 根据条件决定) 累加当前项; 根据当前项计算下一项; 输出结果; return 0;260 例3.18 计算 ,并使最后一项的绝对值小于1e-6为止。 分析:相对于上例, 本数列的项除了可以拆分成分子和分母外还包含符号。 第i+1项分子: ai+1=ai * x * x; 分母: bi+1= bi* (2*i)*(2*i+1); 符号: s = s * (-1) ;261相应程序如下:#include#include int main( void ) int i;/ a为分子,b为分母 float x, sum, a, b; char s; printf(please input x:)
41、; scanf(%f, &x); s = 1; sum = 0; a = x;/ 分子赋初值 b = 1;/ 分母赋初值 for (i = 1; fabs(a/b) =1e-6; i+) sum = sum + s * a / b a = a * x * x; b = b * 2 * i * (2 * i + 1); s *= -1; printf( sum = %fn, sum); return 0;该程序的运行结果为:please input x:2 sum =0.909297262【例】求Sn=a+aa+aaa+.+aaa.a之值,最后一项有n个a,其中a是一个数字,如:2+22+222
42、+2222+22222(此时n=5),n由键盘输入。#include void main( ) long a, sn,tn; int n,i; printf(“Please input a & n:n”); scanf(“%ld %d”,&a,&n); for(i=1,sn =0,tn=a; i=n; i+ ) sn +=tn; tn +=a *=10; printf(“a+aa+aaa+.=%ldn”,sn);累加的每一项都可以表示为前一项数据加上a*10n,如:222=22+2*1002222=222+2*1000.因此用tn表示任意一项,该项用前一项加上a*10n来表示也可以用前一项数据
43、*10+a来表示后一项数据。即:tn =tn*10+a;sn +=tn;63二 典型问题二 例3.19 求100999之间所有的水仙花数,所谓水仙花数就是说数的百位。十位和个位数的立方和恰好等于它本身。程序如下:#include void main( ) int i,a,b,c; for (i=100;i=999; i+) a = i/100 ; /求百位数 b =( i- a*100)/10; /求十位数 c = i%10; /求个位数 if( a*a*a + b*b*b +c*c*c = = i) printf( %6d, i ); 该程序的运行结果为:153 370 371 407b=i
44、%100/10;b=i/10%10;2试数法64程序的结构大致如下:头文件部分 int main() 变量说明部分; 初始化 (可缺省); 循环( 根据条件决定) 先期处理(可缺省); 根据条件判断输出所得结果(也可能是包含循环的程序结构); return 0; 165例3.21 求已知两个正整数的最大公约数。程序如下: #include int main( ) int i; int a, b ; printf(please input a ,b:); scanf(%d%d, &a,&b); for ( i= a0 ; i-) / i初值为a,b中的较小值 if( a%i =0 & b%i=0
45、) printf(the max = %d , i ); break; return 0; 2该程序的运行结果为:please input a ,b:6 4 the max =266【例】将1元钱兑换成1分、2分、5分的硬币,有多少种不同的换法。【分析】: 设1分硬币数量为n1、2分硬币数量为n2、5分硬币数量为n5,则 凡满足n1 + 2*n2 + 5*n5 = 100 条件的值即为其解。 n1,n2和n5有一定任意性。但有限制,其取值范围分别为: n1:0100 n2:050 n5:020 最简单的算法:for (n1=0; n1=100; n1+) for (n2=0; n2=50; n
46、2+) for (n5=0; n5=20; n5+) if (n1+2*n2+5*n5=100) 进一步分析, n1,n2,n5 3 个数中,仅2个任意。n2*2=100-n1-n5*52#include void main( ) int n1, n5, count=0; for (n1=0; n1=100; n1+) for (n5=0; n5=0 & (100-n1-5*n5)%2=0) printf(%d, %d, %dn, n1, (100-n1-5*n5)/2, n5);count +; printf(count=%dn, count); 上面的程序,由于n1,n5都是给的最大值,而
47、其中只有在n1等于0的时候,n5才有可能取最大值20,其余n1取值从1100,n5都不可能取到20,可见循环次数里面有一大部分是浪费了的。实际上的循环次数为101*21=2121次。即使最外层循环对n2,第二层循环对n5, 循环体内对n1,循环次数也有51*21=1071次。进一步分析, n1,n2,n5 3 个数中,已知其中之一,即可求得另外两个的总和,再假定另外两个中的一个,即可求出最后一个,从而得到一个组合。#include int main( ) int n1, n2,n5, count=0; for (n5=0; n5=20; n5+) for (n2=0; n2=(100 n5*5
48、)/2; n2+) n1 =100-n5*5-n2*2;printf(%d, %d, %dn, n1, n2, n5);count +; printf(count=%dn, count); return 0;循环次数为541次。67【例】求从1开始。查找一个能同时满足条件:用3除余2;用5除余3; 用7除余2的整数 。#include int main(void) int i=1; while ( (i%3=2) & (i%5=3) & (i%7=2)=0 ) i+; printf(“i = %dn, i); return 0;输出结果:i = 23试数法2 P !(i%3=2) & (i%5
49、=3) & (i%7=2)68#include #define TRUE 1 / 宏定义or改为常量const int TRUE =1,FALSE =0;#define FALSE 0int main(void) int i=0, flag=FASLE;/flag是一个判别标志,初始值为FALSE表示没找到。 do i +; / 该循环块至少执行一次 if (i%3=2) & (i%5=3) & (i%7=2) printf(“i = %dn”, i); flag = TRUE;/触发器 while (flag != TRUE); return 0; 269(三) 典型问题三 在程序设计中,有
50、关条件选择或多重条件选择的问题相对是比较容易的;如输入学生成绩显示其等级,这些问题之所以我们能很快编写出程序的原因是这些给定的条件是显式的,我们一看题目就知道怎么做。而事实上很多问题都是根据输入或已知条件进行判断和处理的,而初学者往往对这类问题束手无策,原因何在呢?往往是因为这类问题条件的给定是隐式的,所以我们遇到这类问题时要善于发现其隐式给定的条件。这个问题解决了其他问题就迎刃而解了。70 例3.25 编一程序实现一个最简单的计算器的功能,如输入3+5回车显示3+5=8;输错就退出(输入的不是加减乘除的运算就算错) 分析: 1)上述问题从总体上看是个循环,循环退出的条件也很清楚 2)而看具体的处理过程,我们发现这是一个隐式的多重条件选择问题:即根据输入表达式的操作符来判断该做那类运算; 271#include #include void main() float a, b, s; char op; while (1) scanf(%f%c%f, &a, &op, &b); if (op !=+) & (op !=-) & (op != *)& (op != /) puts(“operator is error!,please re_input:”); cont
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年榆林能源科技职业学院马克思主义基本原理概论期末考试笔试题库
- 2025年宁德职业技术学院马克思主义基本原理概论期末考试笔试真题汇编
- 甘肃省兰州市2025年七年级上学期期末考试英语试题附答案
- 2024年华东师范大学马克思主义基本原理概论期末考试笔试题库
- 2025年河北艺术职业学院马克思主义基本原理概论期末考试笔试真题汇编
- 2024年威海职业学院马克思主义基本原理概论期末考试真题汇编
- 2024年山西电子科技学院马克思主义基本原理概论期末考试笔试题库
- 2025年怀化工商职业技术学院马克思主义基本原理概论期末考试参考题库
- 2025年湖州职业技术学院马克思主义基本原理概论期末考试笔试真题汇编
- 应聘沟通技巧培训课件教学
- 粮油产品授权书
- 加氢裂化装置技术问答
- 广东省东莞市东华中学2023-2024学年数学九上期末考试试题含解析
- 关于安吉物流市场的调查报告
- 抑郁病诊断证明书
- 维克多高中英语3500词汇
- 病理生理学复习重点缩印
- 第五届全国辅导员职业能力大赛案例分析与谈心谈话试题(附答案)
- 《大数的认识》复习教学设计
- GB/T 3513-2018硫化橡胶与单根钢丝粘合力的测定抽出法
- GB/T 34590.3-2017道路车辆功能安全第3部分:概念阶段
评论
0/150
提交评论