版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第1、2章回想C程序构造: C程序由main函数和假设干个其他子函数规范函数和自定义函数等构成。函数包括函数头和函数体,C程序语句以分号作为终了标志。语法单位单词:关键字、标识符、分隔符、常量、变量、运算符。数据类型的规定以及表达式运算规那么。输入输出函数getchar,putchar,scanf,printf的运用。第3章 程序和流程控制3.1 C言语程序的版式及语句3.2 构造化程序设计和流程控制3.3 if语句3.4 switch多分支选择语句 3.5 循环控制3.6 辅助控制语句3.7 典型程序编写方法举例3.8 小结C言语流程控制语句3.1 C言语程序的版式及语句3.1.1 C言语程
2、序的版式3.1.2 C言语的语句例3.1 /* 求二整数之和的程序 */#include /预处置void main( ) /函数定义 int a,b; /变量阐明 int sum; scanf(%d%d,&a,&b); / 数据输入 sum = a + b ; /执行部分 printf(sum=%d,sum); /信息输出该程序的运转结果为:7 8 /输入sum=153.1.1 C言语程序的版式特征程序设计主要义务输入处置输出 编写C言语程序普通应包含如下几个部分 1注释部分:格式为*注释内容*或/注释内容;在函数的最上端,普通都应有一段注释信息,主要阐明函数的功能,输入、输出及其限制;如是
3、商品软件还应包含版权信息,在程序的其他部分也可加注释。编程者要养成一边编程序、一边加注释的习惯。普通长段的注释用*注释内容*方式,短段的注释用/注释内容方式。 2预处置块、全局变量阐明等。参见后面章节 3函数定义部分,包括函数类型,函数名及参数表,由于只需一个函数故取名main,由于无前往值故类型为void,无参数输入时,main内参数表为空。 4变量阐明部分,对所用的变量进展阐明; 5数据输入部分,对要运用的变量赋初值,可直接或间接输入,有些是在第4部分完成即变量直接初始化; 6执行部分,它是整个程序的中心,普通是对程序算法用构造化程序设计方法进展描画,然后将其转化成对应的C言语语句; 7信
4、息输出部分,根据要求输出所求的信息或前往结果;有些是在第6部分一边执行一边输出。如上述程序的执行部分采用函数调用那么上述程序应为例3.2 /* 求二整数之和的程序 */#include /预处置int add(int x,int y); /函数声明void main( ) /函数定义 int a,b; /变量阐明 int sum; scanf(%d%d,&a,&b); /数据输入 sum = add(a, b) ; /执行部分 printf(sum=%d,sum); /信息输出/*求和函数,输入参数为二整数,前往值为其和*/int add(int x, int y) /函数定义 int z;
5、/ 变量阐明 z = x + y; /执行部分 return z; /前往结果输入:7 8 该程序的运转结果为:sum=15语句是C言语程序的根本元素,语句以分号为终了标志。程序中的各函数模块都是由一定含义的语句组成的。 例: char ch =H;/*分号为语句终了标志*/ int y= 7 ; c=a+b; printf( “hello !) ;语句的分类:阐明语句 用来对程序中所运用的各种类型变量及属性进展阐明,按其所起作用有时也称为定义语句。执行语句 包括表达式语句、流程控制语句、函数调用语句等完成一定运算操作功能的语句。3.1.2 C言语的语句阐明语句 用来对程序中所运用的各种类型变
6、量进展阐明,也称为定义语句。 阐明语句的格式: 数据类型 变量名列表; 例: int i, j ; /阐明了两个整型变量i和j 阐明语句同时也可以进展初始化赋值,如: char ch =H; unsigned long y = 0 x35847412 ;执行语句中所运用的每一个变量都必需在此前阐明过。 2. 执行语句。普通包含四大类: 表达式语句包括空语句 复合语句 流程控制语句 辅助控制语句 (1)表达式语句 任何一个表达式加上一个分号就是一条表达式语句; /表达式语句,通常是赋值表达式或函数调用表达式。 例: c=a+b; sum = add( a , b) ; /赋值语句 printf(
7、 “hello !) ; /函数调用语句 ; /空语句 (2)复合语句 将假设干语句用一对大括号 括起来就构成了复合语句。复合语句的普通格式为: 阐明语句; 可执行语句; 复合语句在程序构造上是以整体出现,相当于程序块BLOCK,当一个功能必需用多条语句才干完成时,就需求运用复合语句。采用 可以明晰地表达程序的层次构造。3.2 构造化程序设计和流程控制3.2.1 构造化程序设计3.2.2 C言语的流程控制语句和辅助控制语句3.2.1 构造化程序设计 构造化程序设计的根本思想,任何程序都可以用三种根本构造表示: 顺序构造 选择构造 循环构造。 采用这三种根本构造编写程序的设计风格称为构造化程序设
8、计。图3.1顺序构造表示图顺序构造: 按语句顺序依次执行。/经过语句书写顺序自然实现 int a,b; /变量阐明 int sum; scanf(“%d%d,&a,&b);/输入 sum = a + b ; /执行运算 printf(“sum=%d,sum); /输出 选择构造根据条件选择两支或多支程序中的一支执行。 图3.2选择构造表示图由两分支选择构造可以派生出另一种根本构造,多分支选择构造。/if,switch语句,选择运算符实现 if(a=0) printf(come in !); else printf(go away!); 循环构造 在判别条件成立的情况下,反复执行某个程序段。图3
9、.3循环构造表示图/while,do while以及/ for语句来实现while ( i =90&a=90&a=100) printf(“A !); else printf(“b!);2 if单路分支方式选择性执行语该分支) scanf(“%f,&i); if ( i60) printf(“不及格); printf(“%f,i);在C言语程序中,还常用如下书写方式: if(x) 等价于 if(x!=0) if(!x) 等价于 if(x=0) 如变量x为float或double实型变量,那么与0比较的if语句建议如下: if (fabs(x)=90)grade= A ; else if (i=
10、70) grade=B ; else if (i=60) grade=C ; else if (i=0) grade=D ; putchar(grade); /输出该生成果等级 也可用 printf(“%c/n,grade); 90100分A7090分B6070分C060分D 例3.3 给某班学生的一次考试成果分等级. 90分以上的为A,70分到90分之间的为B,60分到70分之间的为C,60分以下的得D。Sample-3-3-1.c算法2: ; float i; /定义i表示学生成果, char grade; /grade表示等级。 scanf(“%f,&i); /输入学生成果 if (i6
11、0)grade= D ; else if (i70) grade=C ; else if (i=90)grade= A ; else if (i=70) grade=B ; else if (i=60) grade=C ; else if (i=0) grade=D ; putchar(grade); /输出该生成果等级 也可用 printf(“%c/n,grade); 90100分A7090分B6070分C060分D 例3.3 给某班学生的一次考试成果分等级. 90分以上的为A,70分到90分之间的为B,60分到70分之间的为C,60分以下的得D。Sample-3-3-1.c 例3.4 求一
12、元二次方程 ax2+bx+c=0的根,实系数a,b,c从终端输入。 算法分析: 先判别输入的系数能否满足方程是二次方程,判别a能否为0。接着应思索两个不同实根,一样实根,和复根三种情况讨论: 当b2-4ac0时,有两个不同的实根,其中x1,x2为其两个根; 当b2-4ac0时,有两个一样的实根,其中x1,x2为其两个等根; 当b2-4ac0时,有两个共轭的虚根;我们把虚根的实部x3和虚部x4分成两部份分开计算,后来再组合在一同。 程序如下: #include #include void main( ) float a,b,c; float x1,x2; float x3,x4; printf(
13、input numbers: a ,b ,c:); scanf(%f%f%f,&a,&b,&c); if ( a = 0) if ( b=0) printf(error input n); else printf(“x=%.2fn,-c/b); /return ; else if ( b*b 4*a*c) x1 = (-b+sqrt(b*b-4*a*c)/(2*a); x2 = (-b-sqrt(b*b-4*a*c)/(2*a); printf(x1=%.2f,x2=%.2fn,x1,x2); else if ( b*b = 4*a*c) x1 = x2 = (-b+sqrt(b*b-4*a*
14、c)/(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); Sample-3-4.c 该程序的运转结果分5种情况为:1 0 1 4 /输入 x=-4 /输出2 0 0 4 /输入 the input is error /输出3 1 4 3 /输入 x1= -1.00 ,x2= -3.00 /输出4 1 4 4 /输入 x1=x2=-2.00 /输出 5 1 2 4 /
15、输入 x1=-1+1.73 i /输出 x2=-1-1.73 iif多条件分支下的流程控制if 语句的缺乏条件表达式的结果只需真或假两种结果,由一个条件语句只能提供两个分支供选择。多重if语句可以实现多重分支,但程序构造显得繁琐,欠明晰,执行效率也比较低。图3.8 switch语句的流程控制3.4 switch多分支选择语句 switch分支选择语句,它可以构造明晰地直接表达多分支选择, 执行效率更高。switch(表达式) case 判别值1: 语句组1; break; case 判别值2: 语句组2; break; case 判别值 n: 语句组n; default: 语句组n+1; br
16、eak;printf(“the end);运用switch语句本卷须知 1. switch ( )后面圆括号中的表达式要求结果是整数,各个case判别值要求是整形常量; switch语句比较表达式的值与某个case后常量值相等,那么从该case后面的第一个语句开场依次执行 2. 各个case和及其下面的语句组的顺序是恣意的,但各个case后面的判别值必需是不同值,default后无判别值,其功能相当与if语句中的else 。 switch语句方式switch(表达式) case 判别值1: 语句组1; break; case 判别值2: 语句组2; break; case 判别值 n-1: c
17、ase 判别值 n: 语句组n; default: 语句组n+1; break;printf(“the end);switch语句运用本卷须知3. break语句起着退出switch-case构造的作用,假设无此语句,程序将顺序执行下一个case语句组。当表达式的结果值与一切的case的判别值都不一致时,程序才执行default部分的语句组。default部分不是必需的。5.对于表达式的多个结果值执行一样语句组时,程序的方式是多个case重叠。switch语句方式#include void main( ) float a,b,c; int n; printf(“请输入两数据:); scanf(
18、“%f%f,&a,&b); printf(“请选择运算种类:1 加法;2 减法;3 乘法;4 除法); scanf(“%d,&n); switch (n) case 1: c=a+b; break; case 2: c=a-b; break; case 3: c=a*b; break; case 4: if(b!=0) c=a/b; else printf(“data error); break; default: printf(“选择无效); printf(“结果为:%.2f,c); 例3.5.0 编程实现:用户输入两个数据,选择执行某种四那么运算,输出结果。Sample 3-5-0.c#d
19、efine ESC 0 x11b;#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 #include void main( ) unsigned int key_value; key_value = bioskey(0); switch (key_value) case F1: F1功能处置程序; break; case F2: F2功能处置程序; break; cas
20、e F3: case F4: F3,F4一样功能处置程序; break; case F5: F5功能处置程序; break; case F6: F6功能处置程序; break; default: 默许处置程序; break; 例3.5 编一表示性的菜单处置程序, 按下一功能键, 执行呼应的功能处置。例3.6 分段函数计算,输入变量数值x,计算结果。 留意:面对问题,应按计算机程序设计的方式来思索对问题的描画和处理方案: 思索变量的定义(几个变量,数据类型), 流程控制语句的选用, 再编程实现.#include void main( ) float x,y; printf(input the n
21、umber x=); scanf(%f,&x); if( x = 0 & x=2&x= 4 & x = 6 & x8) y= 4*x + 4; else printf(error in input datan); printf(y=.2f,y); 该程序的运转结果为: 1.00 /输入2.00 /输出分析:利用多分支的if 语句方式来编写:#includevoid main() float x, y; printf(input the number x=); scanf(%f, &x); switch (int) x) case 0: case 1: y = x + 1; break; cas
22、e 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: printf(error input datan); printf(y = %.2f , y);Sample3-6-2.cpp利用switch语句同样可以实现上述功能: /输入学生成果,判别所属等级Sample-3-3-2.c#includevoid main() float x, y; printf(input the number x=); scanf(
23、%f, &x); switch ( (int) x / 2 ) case 0: y = x + 1; break; case 1: y = 2 * x + 2; break; case 2: y = 3 * x + 3; break; case 3: y = 4 * x + 4; break; default: printf(error input datan); break; printf(y = %.2f , y);更精巧的程序: 3.5 循环语句3.5.1 while语句3.5.2 for语句3.5.3 do-while语句3.5.4 循环语句的嵌套(多重循环 )循环控制构造是在条件成立
24、时,反复执行循环体内的程序段.C言语中三种循环流程控制语句:3.5.1 while语句while循环语句是首先判别循环执行条件,当其成立(非0值)时,那么反复执行循环体内的程序段.图3.9 while语句的流程及语句方式while循环的表达式是循环进展的条件。当条件表达式值为真(非零)时,执行循环体,为假(等于0)那么循环终了;while(x)等价于while(x!=0);while(!x)等价于while(x = = 0); 条件表达式中普通包括一个可以改动表达式的变量,这个变量称为循环变量。对于循环变量的初始化应在while( )语句之前进展。3. 当循环体不需求实现任何功能时,可用空语句
25、作为循环体。while(ch=getchar( )!=A) ;4. 循环语句应有出口。(经过循环语句的条件判别或循环体中break语句退出循环)。6. while语句中条件表达式与if语句中条件表达式都可以为各种表达式。int i , sum; sum = 0; i = 1;while ( i = 100) sum = sum + i ; i +; While语句运用本卷须知例3.7用 while循环语句编写一求和程序 #include void main( ) int i , sum; sum = 0; i = 1; while ( i = 100) sum = sum + i ; i +;
26、 printf(sum = %dn , sum); 该程序的运转结果为:sum =5050要求1.n之和?奇数之和?十位数为3的数之和?并输出这些数?Sample-3-73.5.3 do-while语句图3.11 do-while语句的流程与语句方式先执行一次循环体再判别能否循环下一次!例: int i=0; do printf(%3d , i+) ; while(i5);输出: 0 1 2 3 4while语句: int i=0; while(i5); printf(%3d , i+) ; 输出: 0 1 2 3 4当int i=6; while语句do.while语句分别输出: ?1do-
27、while循环类似于while循环,区别在于循环条件判别位置不同。do-while是在执行一次循环体终了时判别能否继续循环。2能用while循环和for循环描画的程序大多数情况下都能用do-while循环描画, 比如上节中的例子也可用do-while来编写。3能用do-while循环描画的程序一定能用while和for循环描画。do-while语句与while的比较例3.9 利用dowhile循环编写求和程序#include void main( ) int i=1 , sum =0; do sum = sum + i ; i +; while ( i=100); printf(sum = %
28、d n, sum);该程序的运转结果为:sum =50503.5.2 for语句图3.10 for语句的流程和语句方式运用阐明:for ( i=0 ; i100; i+=5) printf(%dn,i);等价于:i=0;for (; i100;) printf(%dn,i); i+=5;for循环通常用于描画循环范围比较明确。循环变量变化满足 “初值、终值、步长型变化规律.如: for ( i=0 ; i100; i+=5) printf(%dn,i);for循环中表达式1和表达式3还可包含逗号运算表达式。如: for ( a=0,b=10; a100; a+=b) printf(%dn,a)
29、;for(表达式1; 表达式2; 表达式3) 语句本卷须知: 表达式1,表达式2和表达式3可以全部或部分省掉,但是分号不能省,当省略表达式2时相当于永真条件条件永远成立,即for( ; ; )等同于 for( ; 1 ; ),此种情况下,只需经过循环体中运用break或return语句来控制循环的终了。 当for语句省略了表达式1和3时,等效于while(表达式2)循环.(2) 循环体也可以为空语句,起延迟一段时间的作用;如: for(int i=0 ; i10000 ; i+) ;或for(int i=0 ; i10000 ; i+) (3) 在for 循环体内普通不要操作循环变量,以防fo
30、r 循环失控。(4) 留意for语句循环量取值区间以及条件表达式2的终止循环条件。Sample-3-7如下2种写法功能是一样的,都是循环N次,。for (x=0,a=0 ; xN ; x+) a+=x;for (x=0,a=0 ; x=N-1 ;x+) a+=x;例如(a) 循环变量属于半开半闭区间 例如(b) 循环变量属于闭区间for (x=1,a=0; x=N ; x+) a+=x;循环语句编程留意:条件表达式的初始形状和终止条件,在编写程序时应仔细琢磨, 验算程序执行到此处时各有关参数取值情况.例3.8 我们还是用上一节的例子,利用for循环语句编写程序求1到100 的和;#includ
31、e void main( ) int i ; int sum ; for (i = 1 , sum = 0 ; i = 100; i +) sum += i ; printf(sum = %d n, sum);i=1,sum=0;for ( ; i = 100; ) sum += i ; i+; i=1,sum=0;while ( i = 100 ) sum += i ; i+; Sample-3-7.cpp修正得循环体部分又包含循环构造时,就构成了多重循环.例如while循环语句如下: while(条件表达式) 循环体部分; 多重循环: while(条件表达式1) while(条件表达式2)
32、 循环体部分2; 3.5.4 循环语句的嵌套-多重循环循环语句组合构成二重循环的几种方式:(1) while( ) (2) while( ) while( ) for( ; ; ) (3) for( ; ; ) (4) for( ; ; ) for ( ; ; ) while( ) 编写多重循环时应留意以下问题:(1) 对于多重循环,特别要留意循环有关的变量赋初值的位置:只需执行一次的赋初值操作应放在最外层循环开场执行之前。(2) 内外循环变量不应该同名,否那么将呵斥循环控制混乱,导致死循环或计算结果错误。(3) 正确地域分内外循环体,在内循环执行的一切语句必需用 括起来组成复合语句作为内层循
33、环体;属于外循环的语句应放在内层循环体之外,外循环之中。(4) 不应该在循环中执行的操作应放在最外层循环进入之前或最外层循环终了后。 例:输出以下由 * 组成的图案*Sample 3-10-0例3.10编程显示输出如下所示的三角形的程序 * * * * * *算法分析:输出6行*,循环i=16逐行输出字符个数2*i-1字符前空格数6-i#include void main( ) int i,j; for ( i = 0 ; i 6 ; i +) /共输出n行*字符 printf(“n); /回车换行 for(j = 0 ; j 5-i ; j +) /每行先输出n-i个空格 printf( )
34、; for(j=0 ; j2*i+1 ; j+) /输出2i+1个字符* printf(*); Sample3-10例3.11打印九九乘法表 page77 Sample3-113.6 辅助控制语句3.6.1 break语句3.6.2 continue语句 goto 语句和标号 return语句3.6.1 break语句break语句用于循环语句和switch语句。 可使流程跳出switch构造或循环体,执行后面的语句。break语句只能跳出一层循环。break语句不能用于循环体语句和switch 语句之外的任何其它语句。for(int i=1;i=5;i+) sum2=0 for(int j=
35、i;j32767) break; sum1+=sum2; if(sum232767|sum132767) break;3.6.2 continue语句终了本次循环,即跳过循环体后续的语句,进展下一次的循环断定。continue语句和break语句的区别是: continue语句只终了本次循环体后续语句的执行,而不是跳出循环。break语句那么是终了整个循环语句,执行程序中后续语句。for(int i=1;i32767) break;printf( “ End);for(int i=1;i32767) sum2=0; continue; printf( “ End);例3.13 把0100之间能
36、被5整除的数输出。 void main( ) int n; for(n=0;n=100;n+) /n从数字0到100逐个进展测试 if(n%5!=0) /能否能整除 continue; /不能整除那么执行下一次循环 printf(%dt,n); printf(“n the end); if(n%5=0) printf(%dt,n);Sample 3-13 例3.14.输入一个圆的半径,输出圆的面积。要求: (1).允许反复的输入半径,计算并显示圆的面积,直到输入的半径是0时为止; (2).对输入的半径进展检查,假设发现是负数将提示操作者重新输入。#include#include #define
37、 PI 3.1415926void main() double r, area; while (1) printf(input the radius:); scanf(%lf, &r); if (fabs(r) 1e-5) break; else if (r 0) printf(the input is errorn); continue; area = PI * r * r; printf(the area is:%lfn, area); 该程序的运转结果为: input the radius:-1/输入 the input is error input the radius:1 3.141
38、5926 input the radius:0 /退出整个do-while循环。Sample 3-14.cppgoto 语句和标号 page81 程序中运用goto语句时要求和标号配合,普通方式: goto 标号; 标号: 语句; goto 语句的功能是,把程序控制转移到标号指定的语句处。既执行goto语句之后,程序从指定标号处的语句继续执行。 留意: goto语句常用的用法是用它退出多重循环。 用goto语句设计程序存在的问题: 1. 破坏构造化设计风格。 2. goto语句经常带来错误或隐患。 所以不提倡运用goto语句3.7 典型问题程序设计举例程序设计目的:构造化程序设计是经过三种流程
39、控制语句的组合来处理将各种问题. 算法设计灵敏多样,要熟练掌握和运用C言语规那么。详细编程思绪:分析问题中涉及的数据信息,设计数据输入接口定义所需变量;再设计数据处置程序流程, 选择适宜的语句书写程序;最后输出处置结果定义变量时留意数据类型取值范围,运算处置过程也要留意数据类型的自动转换等规那么,算法设计要灵敏运用三种流程构造的组合、嵌套。一 典型问题1-(求数列和)例3.15 1, 3, 5, 7, 9.前二十项之和。算法分析:循环求和运算规律: 第1项知,第i+1项 =第i项 + 2循环条件:前20项,适宜用for语句实现.#include void main( ) int i , sum
40、, t ; /sum代表和, t代表某项 sum = 0 ; t = 1 ; for (i=1 ; i=20 ; i+) sum + = t; /累加 t += 2; /求下一项 printf( sum = %d,sum);该程序的运转结果为:sum =400Sample 3-15 例3.16 求序列: 1!, 2!, 3!, 4!.的前八项之和.算法分析: 循环求和运算 数列项变化规律: 第i+1项 =第i项 * (i+1) ; 循环条件:适宜采用for语句,8项#include void main( ) int i; long sum, t ; /sum代表和, t代表某项,留意数据类型
41、sum = 0 ; t = 1 ; for (i=1 ; i=8 ; i+) sum + = t; /求和 t *= (i+1); /求下一项t=(i+1)! printf( sum = %ld,sum); 该程序的运转结果为:sum =46233Sample3-16.c用for语句双重循环实现: int i; long sum, t ; /sum代表和, t为某项阶乘 sum = 0 ; for (i=1 ; i=8 ; i+) t = 1; for(int j=1; j=1e-6 的数据项之和。 算法分析: 数列求和 数列项变化规律: 第i项分子: ai=ai-1 + 2; 分母: bi=
42、bi-1* 2; 循环条件: 数据项=1e-6,适宜采用while语句#include void main() int i; float sum=0, a, b; / sum代表和,a为分子,b为分母 a = 1, b = 2; / 分子、分母赋初值 while (a / b = 1e-6) sum = sum + a / b; / 累加一项 a = a + 2; / 求下一项的分子 b = b * 2; / 求下一项的分母 printf( sum = %f, sum);该程序的运转结果为:sum =2.999999 (浮点数的舍入误差呵斥的景象) 例3.18 计算 并使最后一项的绝对值小于1
43、e-6为止。 分析:本数列的项变化包括分子、分母以及符号。算法分析: 循环求和 数列项变化规律: 第i项分子: ai=x2i-1=ai-1 * x * x; 分母: bi= (2i+1)!=bi-1* 2i*(2i+1); 符号: s = s * (-1) ; 循环条件: 数据项=1e-6, 可采用for语句也可采用while语句用for语句相应程序如下:#include#includevoid main() int i; / sum代表和,a为分子,b为分母 float x, sum, a, b; char s; /s代表符号 printf(please input x:); scanf(%
44、f, &x); s = 1; sum = 0; a = x;/ 分子赋初值 b = 1;/ 分母赋初值 for (i = 1; 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);该程序的运转结果为:please input x:2 sum =0.9092974用while语句相应程序如下:#include#includevoid main() int i; / sum代表和,a为分子,b为分母 flo
45、at x, sum, a, b; char s; /s代表符号 printf(please input x:); scanf(%f, &x); s = 1; sum = 0; a = x;/ 分子赋初值 b = 1;/ 分母赋初值 i = 1; /数列项数 while (a / b = 1e-6) sum = sum + s * a / b a = a * x * x; b = b * 2 * i * (2 * i + 1); s *= -1; i+; printf( sum = %fn, sum);该程序的运转结果为:please input x:2 sum =0.9092974二 典型问题
46、二 (试数法)给定了数据区间,求符合条件的数,可以采用逐个数据进展测试能否符合条件,称为试数法。例3.19 求100999之间一切水仙花数。算法分析:从100到999之间循环判别能否符合水仙花数条件#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 407 例3.20 加法算
47、式 a b c c b a 1 3 3 3 a,b,c为一位数,试编程求一切能够a,b,c的值算法分析:算法1:可将abc整体代表的数i作为目的来求符合条件的解;那么i的取值范围为100999,(根据特征可定更小范围300999);算法2:将a,b,c作为运算目的来求符合条件的各值,取值范围为09,根据算式特征可确定更小范围a (39), b (16), c 39)算法1:整数i=abc作为关键运算对象void main( ) int i; /定义循环变量 i int a, b ,c; /定义变量保管各位数字 for ( i=100 ; i=999; i+) a = i/100 ; b =(
48、i- a*100)/10; c = i%10; if( 1333 = = a*101+b*20 + 101*c) printf(a= %d b=%d c=%dn, a,b,c); 运转结果:a=4,b=1,c=9a=5,b=1,c=8a=6,b=1,c=7a=7,b=1,c=6a=8,b=1,c=5a=9,b=1,c=4算法2:个位数a、b、c作为关键运算对象void main( ) int i; /定义循环变量 i int a, b ,c; /定义变量保管个位数字 for ( a=3 ; a=9; a+) for ( b=0 ; b=9; b+) for ( c=3 ; c=9; c+) i
49、f( 1333 = a*101+b*20 + 101*c) printf(a= %d b=%d c=%dn, a,b,c); Sample 3-20.c例3.21 求知两个正整数的最大公约数。#include void main( ) int i, 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) printf(the result = %d , i ); break; 例3.22 3.23判别能否素数的问题,类似解法,判
50、别能否能被其他数整除 例3.24 百钱买百鸡问题,用100元钱买100只鸡,其中母鸡每只3元,公鸡每只2元,小鸡1元3只,且每种鸡至少买一只,编程选择购买方案。分析:设母鸡、公鸡、小鸡各买a,b,c只, 钱的总数和鸡的总数必需为100void main() int a, b , c; /a,b,c分别代表母鸡,公鸡和小鸡数,能够买1-98只 for ( a=1; a=98;a+) for (b=1;b=98;b+) for(c=1;c=98;c+) if(a+b+c=100)&(a*3+b*2+c/3=100)&( c%3=0) printf(母鸡数:%d 公鸡数:%d 小鸡数:%dn,a,b,c); Sample3-24, 24-0,1(三) 典型问题三 (隐式判别条件处置) 在前面两类问题中,标题里根本上都明显给出了循环范围条件,相对是比较容易的;而实践问题大多都是根据输入信息进展判别和处置的,这类问题条件的给定是隐式的,所以我们遇到这类问题时要擅长发现其隐式给定的条件
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论