C语言程序控制结构.ppt
《C语言程序控制结构.ppt》由会员分享,可在线阅读,更多相关《C语言程序控制结构.ppt(100页珍藏版)》请在装配图网上搜索。
第4章 程序控制结构,,主要内容,4.1 C语言的执行语句 4.2 顺序结构 4.3 选择结构 4.4 循环结构,4.1C语言的执行语句,C语言的语句分为声明语句和执行语句。第3章介绍的变量定义语句是最常见的声明语句,声明语句在编译时处理,在程序运行时不产生相应的操作。执行语句的作用是在程序运行时向计算机系统发出操作命令,使计算机执行特定的操作. C语句:以“;”作结束符,编译后产生机器指令。 C语句分类: 表达式语句 空语句 控制语句 复合语句,4.1.1表达式语句,表达式语句是在表达式的末尾加上分号构成的语句。 z=x+sin(y); a-=a*a; 赋值语句 i++; 自增1语句 x=0,y=1; 逗号表达式语句 x+y; 无意义 printf(“This is a C program.\n”); 函数调用语句 赋值语句和函数调用语句是使用最多的表达式语句,如: printf(“This is a C statement.“); func(a,5); y=max(a,b);,4.1.2空语句,仅由一个“;”构成的语句 只是在逻辑上起到一个语句的作用,在编译时不产生任何指令,在执行时不产生任何操作。 作用: 构成标号语句,标示流程的转向点; 构成循环语句中空循环体。 例如:while(getchar()!=‘\n’) ; 只要从键盘上输入的字符不是回车则重新输入。,4.1.3复合语句,用 { }括起来的一组语句。 一般形式: { 执行语句; },说明: “}”后不加分号 其中最后一个语句后也要加分号 语法上和单一语句相同 复合语句可嵌套,如: { z=x+y; t=z/100; printf(“%f“,t); },如: { z=x+y; { t=z/100; printf(“%f“,t); } },4.1.4控制语句,控制语句:完成一定的控制功能。,如: if (xy) z=x; else z=y;,4.2顺序结构,流程图 流程图是表示算法的一种工具,用一些图框来表示各种操作。 一个流程图包括以下几部分 : 表示相应操作的框; 带箭头的流程线; 框内外必要的文字说明。,顺序结构,常用的流程图符号:,N-S流程图:完全去掉了流程线,算法的每一步都用矩形框描述,把一个个矩形框按执行的次序连接起来就是一个完整的算法描述。,顺序结构,结构化程序的三种基本结构 顺序结构:按书写顺序执行的语句构成的程序段,选择结构 循环结构,,例4.1 输入任意两个整数,求它们的和及平均值。要求平均值取两位小数输出。,//例4.1 #include #include void main() { int num1, num2; float sum, aver; printf(“Please input two integers: \n“); scanf(“%d,%d“, },运行情况: 30000,5005 sum=35005, aver= 17502.50,例4.2 给定一个三位正整数,分别输出其个位数、十位数和百位数。,#include void main() { int m,m0,m1,m2; printf(“Input a number(100~999):”); scanf(“%d“, },运行结果: Input a number(100~999):263 输出: 3,6,2,,例4.3 取一个16位的二进制数a的7、6、5、4四个位,如图4-2中加阴影的部分。,void main() { unsigned a,b,c,d; scanf(“%x“, /*以十六进制输出a和结果d*/ },例4.4 求ax2+bx+c=0方程的根。 a,b,c由键盘输入,设 >0。 一元二次方程式的根为 x1= x2= 可以将上面的分式分为两项: p= , q= ,则 x1=p+q,x2=p-q。,顺序结构,,#include #include void main ( ) { float a,b,c,disc,x1,x2,p,q; scanf(“a=%f,b=%f,c=%f“, },运行情况: 输入: a=1, b=3, c=2 输出: x1=-1.00 x2=-2.00,4.3选择结构,选择结构是指在程序执行过程中,根据指定条件的当前值在两条或多条路径中选择一条执行。 C语言的选择控制语句有两条: 条件选择语句:if语句 开关分支语句:switch语句,4.3.1 if语句,1、if 格式(单分支语句) if (判断表达式) 语句1; 语句 1可以是一条语句或复合语句。 注意:满足条件时想要执行多条语句一定要用复合语句,当判断表达式值不为零(即”真”), 则执行语句1, 再执行其后继语句; 否则, 不执行语句 1, 执行其后继语句。,单分支语句,判断表达式应该是具有一定意义、有实用价值的表达式,因此,最常用关系表达式和逻辑表达式来表达,例如: if(a==b) if(a==0) 等价于if(!a) if(a!=0) 等价于if(a) if(a=5&&a=10),例:输入一个整数,求绝对值. main( ) { int i ; scanf(“%d“, },例:执行下列程序段后 a 的值是____。 int a=3; if (2) a=5;,单分支语句,#include main( ) { char c; printf(“input a letter:“); c=getchar(); if(c='A' },例4.5 从键盘输入一个字母,以小写字母形式输出该字母,单分支语句,例4.6从键盘输入两个整数,按升序输出这两个数。,#include void main( ) { int a,b,t; scanf(“%d%d“, },例:输入三个数a,b,c,要求按由小到大的顺序输出。,If ab 将a和b对换 If ac 将a和c对换 If bc 将b和c对换,单分支语句,单分支语句,#include void main ( ) { float a,b,c,t; scanf(“%f%f%f“, },{ }必不可少,否则,会出现逻辑错误!,2、if(表达式) 语句1 else 语句2,双分支if-else语句,例:if (xy) printf(“%d”,x); else printf(“%d”,y);,双分支if-else语句,说明:在if和else后面可以只含有一条语句,也可以含有用花括号{ }括起来的复合语句。如: if ((a+b)c,例: 输入两个数并判断两数是否相等。,#include void main( ) { int a,b; printf(“Enter integer a:“); scanf(“%d“, },运行结果: Enter integer a:12 Enter integer b:12 a==b,运行结果: Enter integer a:12 Enter integer b:9 a!=b,双分支if-else语句,分析以下程序的输出结果:,(1) #include void main ( ) { int a,b; scanf(“%d“, },(2) #include void main ( ) {int a,b,t; scanf(“%d%d“, },(3)#include void main ( ) { int x,y; scanf(“%d“, },(4)程序输出结果 #include void main( ) { int x,y; scanf(“%d“, },3.多分支语句,几种形式:,3、if(表达式1)语句1 else if(表达式2)语句2 else if(表达式3)语句3 …… else if(表达式m)语句m else 语句n,多分支语句,例: if (number500)cost=0.15; else if(number300)cost=0.10; else if(number100)cost=0.075; else if(number50)cost=0.05; else cost=0;,多分支语句,多分支语句,匹配规则: Else总是与它上面的,最近的,统一复合语句中的,未配 对的if语句配对。,当if和else数目不同时,可以加花括号来确定配对关系。,例: if (a==b) if(b==c) printf(“a==b==c”); else printf(“a!=b”);,修改: if (a==b) { if(b==c) printf(“a==b==c”); } else printf(“a!=b”);,-1 (x0) 算法1: 算法1: 输入x 输入x 若x0,则y=1 若x=0,则y=0 输出y 若x0,则y=1 输出y,,多分支语句,,程序 #include void main( ) { int x,y; scanf(“%d”, },程序1: 程序2: if(x=0) y=-1; if(x0) y=1; else else y=0; if(x==0) y=0; else y=-1; else y=1; 程序3: 程序4: y=-1; y=0; if(x!=0) if(x=0) if(x0) y=1; if(x0) y=1; else y=0; else y=-1;,正 确,正 确,上例中的程序段有四个,请判断哪个是正确的?,X0时,y=0,X=0时,y=-1,多分支语句,例4.7:输入百分制成绩,要求输出相应的五级制成绩。百分制成绩与五级制成绩之间的转换标准为: 90分以上为“A”, 80-89分为“B”, 70-79分为“C”, 60-69分为“D”, 60分以下为“E”。,If语句嵌套,void main ( ) { int score; printf(“\nPlease input the score(0-100):“); scanf(“%d“, },多分支语句,例4.8 分段函数定义如右: 根据所输入的x的值,求函数值。 main ( ) { float x,y; scanf(“%f“, },4.3.2 switch语句,switch语句的格式: switch (表达式) {case 常量表达式1:语句1 [break;] case 常量表达式2:语句2 [break;] … case 常量表达式n:语句n [break;] default :语句n+1 },执行过程: 当表达式的值与某一个case后面的常量表达式的值相等时,就从此case后面的语句开始执行下去,若所有的case中的常量表达式的值都没有与表达式的值匹配的,就执行default后面的语句。,switch语句,switch语句,执行流程: 首先计算switch圆括号中表达式的值,然后将结果值按前后顺序依次与各个case后的常量表达式进行比较。 当表达式的值与某一个case后面的常量表达式的值相等时,就执行该case后边的语句组k,接着如果遇到break语句, 则结束整个switch语句(即退出switch)。如果不遇到break语句,则按顺序执行下面其他case后边的语句组, 直至遇到break语句或最后边的“}”为止, 才结束switch语句 当结果值与常量表达式k的值都不相等时, 若有default, 则执行其后语句;若无default, 则什么都没执行,switch语句,说明: 1)switch关键字,case也是关键字,与其后面的常量表达式合称case语句标号,常量表达式类型必须与switch后面表达式类型相匹配,且各case语句标号的值各不相同,不能重复;default也是关键字,起语句标号的作用,代表除了以上所有case标号之外的那些标号; 2)语句1、语句2可以是一条语句,也可以是若干条,在必要时, case语句标号后的语句可以省略不写; 3) switch的表达式通常是一个整型或字符型变量,也允许枚举型变量,其结果为相应的整数、字符或枚举常量; 4)break语句不是一定需要加上,执行完一个case后面的语句,若没有遇到break,就自动进入下一个case继续执行,而不再判断是否与之匹配。,当程序在执行时,如果输入的是′A′,#include “stdio.h“ main() {char a; a=getchar(); switch(a) { case 65: printf(“%c“,′A′); case 66: printf(“%c“,′B′); default :printf(“%s\n“,“other“); } },运行结果: ABother,当程序在执行时,屏幕上输出为:,#include “stdio.h“ main() { int k=2; switch(k) { case 1: printf(“%d\n“,k++);break; case 2: printf(“%d“,k++); case 3: printf(“%d\n“,k++);break; cade 4: printf(“%d\n“,k++); default :printf(“Full!\n“); } },运行结果: 2 3,switch语句,例:要求按照考试成绩的等级输出百分制分数段,用switch语句实现,应写为: switch(grade) { case 'A': printf(“85~100\n“); break; case 'B': printf (“70~84\n“); break; case 'C': printf (“60~69\n“); break; case 'D': printf (“60\n“); break; default: printf(“error\n“); },补充例:输入成绩, 用A、B、C、D、F、R分别表示优、良、中、及格、不及格、补考、缺考。,grade=getchar( ); switch (grade) { case 'A': case 'a': printf(“优“);break; case 'B': case 'b': printf(“良“);break; case 'C': case 'c': printf(“中“);break; case 'D': case 'd': printf(“及格“);break; case 'F ': case 'f ': printf(“不及格“); /* 此处没有break语句 */ case 'R': case 'r': printf(“请补考“);break; default: printf(“输入错“); },switch语句,例:某幼儿园只收2至6岁的儿童。2~3岁入小班,4岁入中班,5~6岁入大班。根据输入的年龄,求应入的班级。 分析:设年龄为age,当age为2和3时,应输出同样的内容“入小班”,age为5和6时输出同样的内容“入大班”。该题算法比较简单。,switch语句,#include void main() { int age; printf(“Please enter age: “); scanf(“%d“, } },void main() { int x,y,a=0,b=0; scanf(“x=%d,y=%d“, },运行结果: 输入:x=1,y=0 输出:a=2 b=2,switch语句的嵌套,选择结构程序举例,例4.13 输入一个字符,判别该字符是数字、英文大写字母、小写字母还是其它字符。 #include void main() { char c; printf(“input a char: “); c=getchar(); if (c='0' },选择结构程序举例,例4.14 输入三角形三边长,求三角形面积。 #include void main() { float a,b,c,s,area; scanf(“%f,%f,%f“, },选择结构程序举例,例4.15 输入a、b、c三个整数,输出最大数和最小数。 void main() { int a,b,c,max,min; printf(“input three numbers: “); scanf(“%d,%d,%d“, },课堂练习,1.以下程序的运行结果是( )。 main( ) { int n=5; if(n++=6) printf(“%d\n“, n); else printf(“%d\n“, ++n); } 2.对于整型变量a,赋值语句 a=(a%3==0?1:0); 与( )语句不等价。 (A) if (a%3==0) a=1; else a=0; (B) if (a%3!=0) a=0; else a=1; (C) if (a%3) a=0; else a=1; (D) if (a%3) a=1; else a=0;,课堂练习,3.以下程序的运行结果是( )。 main() { int n='c'; switch(n++) { default: printf(“error “); break; case 'a': case 'b': printf(“good “); break; case 'c': printf(“pass “); case 'd': printf(“warn “); } },循环结构,在许多问题中需要用到循环控制。循环结构是结构化程序设计的基本结构之一,它和顺序结构、选择结构共同作为各种复杂程序的基本构造单元。 特点:当给定的条件成立时, 反复执行某个程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体, 它由C的语句构成。 C语言提供了3种循环结构: while语句; do-while语句; for语句,4.4.1用while语句实现循环,while语句用来实现“当型”循环结构。 一般形式: while (表达式) 语句 当表达式为非0值时,执行while语句中的内嵌语句。 其特点是:先判断表达式,后执行语句。,(1) 与 if 的区别, if 只一次, while反复判断, 反复执行; (2) while 语句中通常有改变表达式的值的语句。,用while语句实现循环,例4.18 计算1+2+…+100。 main() { int i=1, s=0; while ( i=100) { s+=i; i++; } printf(“%d, %d“, i, s); getch(); },1.如果缺少i++这一行会出现什么情况? 2.若计算:n!该程序应如何修改?,,例4.19 根据公式 计算π的值。,#include void main() { int i=1, n; double pi=0; printf(“Input an integer:\n“); scanf(“%d“, },用while语句实现循环,例4.21 猴子吃桃问题:猴子摘下了一堆桃子,第一天吃总数的一半多一个,第二天吃剩下的一半多一个,以后每天都吃前一天剩下的一半多一个,到第十天想再吃时剩一个,求猴子摘了多少个桃子?,算法分析: 设第 i 天未吃前有 x i 个桃子, 由题意得: x1/2-1=x2 x2/2-1=x3 … x9/2-1=x10 已知x10=1, 我们有: x10=1 xn-1=(xn+1)*2,void main( ) { int k,x1,x2; k=1; x2=1; while(k=9) { x1=(x2+1)*2; x2=x1; k++; } printf(“Total number=%d\n“,x1); },用while语句实现循环,补充1. 统计从键盘输入的字符个数。(以回车结束),补充2. 从键盘输入一个整数(至少大于9), 求最高位的数字.,#include main( ) { int count=0; while (getchar() !='\n') count++; printf(“count=%d“,count); } 这种结构的循环次数是不确定的。,while (d9) d=d/10; /* 反复执行d=d/10 */ printf(“最高位是%d“,d); 也可写成: while ((d/=10)9); /* 空循环体,反复执行d=d/10 */ printf(“最高位是%d“,d);,4.4.2用do-while实现循环,do-while语句的特点:先执行循环体,然后判断循环条件是否成立。一般形式: do { 循环体语句 } while (表达式);,执行过程:先执行一次指定的循环体语句,然后判别表达式,当表达式的值为非零(“真”) 时,返回重新执行循环体语句,如此反复,直到表达式的值等于0为止,此时循环结束。,用do-while实现循环,用do-while计算 : 1+2+…+100。 main() { int i=1, s=0; do { s=s+i; i++; } while ( i=100); printf(“%d, %d“, i, s); getch(); },计算:1-3+5-7…+101 main() { int i=1,s=0; int s=1,t=1; do { s=s+t*i; i=i+2 t=-t; }while(i=101); printf(“%d\t“,s); },用do-while实现循环,例4.22 利用格里高公式: 求π,直到最后一项的值小于10-6。 void main() { int s=1; float n=1.0, t=1, pi=0; do { pi=pi+t; n=n+2; /*分母每循环一次增加2*/ s=-s; /*单项的正负号交替变化*/ t=s/n; /*下一项的值*/ } while (fabs (t)1e-6); pi=pi*4; printf(“pi=%10.6f\n“, pi); },while和do…while循环的比较,上述程序的功能是什么? 比较:输入5和11时两个程序的输出结果如何?,#include void main( ) { int i,sum=0; scanf(“%d“, },#include void main( ) { int i,sum=0; scanf(“%d“, },当型循环最少执行次数是多少? 直到型循环,最少执行次数是多少?,4.4.3用for语句实现循环,C语言中的for语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替while语句。 一般形式: for(表达式1;表达式2;表达式3) 循环体 也可写作: for(循环变量赋初值;循环条件;循环变量增值)循环体,for语句等价于如下的while循环形式: 表达式1; while (表达式2) { 语句 表达式3; },用for语句实现循环,for语句的执行过程: (1) 先求解表达式1。 (2) 求解表达式2,若其值为真(值为非0),则执行for语句中指定的内嵌语句,然后执行下面第(3)步。若为假(值为0),则结束循环,转到第(5)步。 (3) 求解表达式3。 (4) 转回上面第(2)步骤继续执行。 (5) 循环结束,执行for语句下面的一个语句,用for循环计算 : 1+2+…+100。 main( ) { int i, s=0; for (i=1; i=100; i++) /* 注意括号后没有分号 */ s=s+i; /* 求和: 1+2+3+…+100 */ printf(“%d“, s); },变量i用于控制循环次数, 我们称其为循环控制变量。,1. 最后i的值是多少? 2. 从1加到10000或更多呢?,用for语句实现循环,说明:,表达式1,表达式2和表达式3之间必须用分号隔开,但表达式3后面不能加分号。 循环体如果包含一个以上的语句,应该用花括弧括起来,以复合语句形式出现。 循环体有可能一次也不执行。 循环体可以为空。 表达式1和表达式3都可以为逗号表达式。(例) 表达式1,表达式2和表达式3都可省略,但不鼓励省略表达式2和表达式3。(例:省略表达式1) for语句循环与while循环可以互相转换,但for循环的结构更简洁。,for语句的省略形式,例(1): i=1; for ( ; i=1000; i++) sum=sum+i ;,例(2): for (i=1; i=1000; ) { sum=sum+i ; i++; },例(3): for (i=1; ;i++) { if (i1000) break ;sum=sum+i ;},1)表达式1可省略,但分号不能省,在for语句前为变量赋初值; 2)表达式3也可省略,但应把其放入循环体内,否则for无法正常结束; 3)表达式2省略后,for语句将无限循环下去。可在循环体内加退出循环的语句,for语句的省略形式,4)表达式1和表达式3可以是一个简单的表达式,也可以是一个逗号表达式,表达式1和表达式3也可以是与循环无关的任意表达式; 5)三个表达式全省略,无终止执行循环体,分号不能省; 6)把循环体内容放到表达式3,循环体为空语句。尽量避免此写法,例(4): i=1,sum=0; for (p=0 ; i=100;p+=1) {sum=sum+i ;i++;},例(6): for (i=1, sum=0; i1000; sum=sum+i, i++) ;,例(5): i=1,sum=0; for (; ; ) { sum=sum+i ; i++; if (i100) break; },用for语句实现循环,例4.25 求1!+2!+…+10!的值。 void main() { int i, n=10; long s, t; for(i=1, t=1, s=0; i=n; i++) { t*=i; /*t为上一个数i-1的阶乘值,再乘以i,即i!=(i-1)!*i*/ s+=t; /*累加i!*/ } printf (“s=%ld\n“, s); },用for语句实现循环,例4.27 编程输出“斐波那契数列”的前20项。 “斐波那契数列”是意大利中世纪数学家列昂纳多·斐波那契以兔子繁殖为例子而引入的,故又称为“兔子数列”。 main() { int i, x1=1, x2=1; for(i=1; i=10; i++) /*每次生成并输出两项,所以循环10次*/ { printf(“%10d %10d “, x1, x2); if(i%2==0) printf(“\n“); /*当i为偶数时换行,即每四个换行*/ x1=x1+x2; x2=x2+x1; } },用for语句实现循环,最简单的写法: main() { int i, j, k=10000; for (i=1, j=0; i=k; i=i+j, j=i-j) printf(“ %d“,i ); } 这里: i 表示fibonacci(n) i=i+j; 即 第n项=第n-1项+第n-2项 j=i-j; 即 第n-1项=第n项-第n-2项 使i存放当前项, j存放前一项,程序运行结果为: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765,4.4.4 continue语句和break语句,1. break语句 (1)在while、 for、 do~while语句的循环体或switch语句的语句组中, 使用break语句可使程序立即退出该结构。故有中断语句之称。 其语法格式如下: break; (2)功能:用在循环语句或switch语句中,使得跳出循环体或分支,提前结束循环或分支。,continue语句和break语句,#include void main() { int i; for (i=1 ; ; i++) if (!((512-i*15)%13))break; printf(“%d+%d=512\n“, i*15, 512-i*15); },例4.28 将数字512表示成两个数的和,这两个数分别为15和13的倍数。,运行结果: 135+377=512,continue语句和break语句,说明 break只能终止并跳出最近一层的循环结构。 break不能用于循环语句和switch语句之外的任何其它语句之中。 在循环语句中,break总是与选择语句配合使用。,main() { int i, s; s=0; for (i=1;i5) break; printf(“%d\n“, s); } },运行结果: 1 3,continue语句和break语句,2. continue语句 一般形式: continue; 功能:用在循环语句中,使得结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判定。 补充例题: for (i=1; i=10; i++) { if ( i%2==0 ) continue; printf(“%d”, i); } 该程序的功能是:只打印出单数,continue语句和break语句,说明: continue只能终止本次循环,而不是终止整个循环的执行。 continue不能用于循环语句之外的任何其它语句之中. continue总是与选择语句配合使用。,//例4.29 #include void main( ) {int i,n=0; for(i=100;i=200;i++) {if((i%7!=0) } },例4.29 输出100~200之间所有能被7或9整除的数。,continue语句和break语句,补充例:计算输入的10个整数中正数的个数及正数平均值。 main() { int i,n,a; float s=0.0; printf(“请输入10个整数:\n“); for (n=0,i=0;i0) 下两句要加{ } */ s+=a; n++; } printf(“共有%d个正数.其平均值为%f。\n“,n,s/n); },,3. continue和break的区别: continue语句只是结束本次循环,而不是终止整个循环的执行,而break语句则是结束整个循环过程,不再判断条件是否成立。,continue语句和break语句,main() { int i, a=0, b=0, c=0, d=0; for (i=1;i=4;i++) { switch(i) { case 1 : a=1; continue; case 2 : b=2; case 3 : c=3; break; case 4 : d=4; } printf(“%d%d%d%d\n“, a, b, c, d); } },main() { int i, s; s=0; for (i=1;i5) break; printf(“%d\n“, s); } },continue语句和break语句,main() { int k=4,n=0; clrscr(); for (;nk;) { n++; if(n%3!=0) break; k--; } printf(“%d,%d\n“, k,n); },运行结果: 4, 1,将break改为continue 运行结果: 3, 3,4.4.5循环的嵌套,循环的嵌套:一个循环体内又包含另一个完整的循环结构。 多层循环:内嵌的循环中还可以嵌套循环。 三种循环(while循环、do-while循环和for循环)可以互相嵌套,层数不限。循环嵌套形式举例:,(1) while( ) (2) do (3) for(;;) { … { … { … while( ) do for(;;) {…} {… } {… } … while( ); … } } } while( );,循环的嵌套,(4) while( ) (5) for(;;) (6) do { … { … { … do while( ) for(;;) {…} { } { } while( ) … … … } } } while( ),外层循环可包含两个以上内循环,但不能相互交叉。 嵌套循环的执行流程 例:for(i=1; i=n; i++) for(j=1; j=5; j++) s=i*j;,例4.30 在屏幕上输出如下图形:,main() { int i, j, k; for(i=8; i=1; i--) /*总共要输出8行星号*/ { for(j=1; j=8-i; j++) printf(“ “); /*控制每行星号前面显示的空格*/ for(k=1; k=2*i-1; k++) printf(“*“); /*控制每行星号的个数*/ printf(“\n“); /*控制输出每行星号后换行*/ } },循环的嵌套,例4.31 改写例4.25 求1!+2!+…+10!的程序,用嵌套的循环结构来实现。,main() { int i, n=10, j; long s=0, t; for(i=1; i=n; i++) { for(t=1, j=1; j=i; j++) t*=j; /*每次循环都重新计算i!*/ s+=t; /*累加i!*/ } printf (“s=%ld\n“,s); },程序举例—穷举法,,例4.32 三位自方幂数又称水仙花数,用穷举法求出所有水仙花数。如:13+53+33=153,main() { int i,j,k,m1,m2; printf(“narcissus numbers are: “); for(i=1;i=9;i++) for(j=0;j=9;j++) for(k=0;k=9;k++) { m1=i*100+j*10+k; m2=i*i*i+j*j*j+k*k*k; if (m1==m2) printf(“%4d“,m1); } printf(“\n“); },程序举例—数的分离,例4.33 编写一个程序,输入1~32767之间的整数,把这个整数显示为一系列数字,每组数字都是用两个空格分开。例如,整数1234应该显示为:1 2 3 4。,main() { int i,num,counter,temp; counter=1; printf(“Enter an integer: “); scanf(“%d“, },,程序举例—方程求根,例4.34 用二分法求非线性方程f(x)=x3+1.1x2+0.9x-1.4=0的根。,,,void main() { float x, x1, x2, y1, y2, y; do { printf(“Input x1,x2: \n“); scanf(“%f,%f“, },程序举例—多项式计算,例4.35 编程计算多项式 的值。,void main() { float sum, term, x; int n, k, sign; printf(“Input n, x: \n“); scanf(“%d,%f“, },程序举例—数的判别,例4.36 输入一个数,判断这个数是否为素数。,void main() { int m, i, k; printf(“Enter an integer:\n“); scanf(“%d“, },,程序举例—辗转相除法,例4.37 用辗转相除法求两个数的最大公约数和最小公倍数。,void main() { int a,b,m,n,temp,c,d; printf(“Please enter 2 integers n,m:\n“); scanf(“%d,%d“, },,程序举例—统计问题,例4.38 输入十个数,求出最大数、最小数和奇数、偶数个数。,void main() { int i,max,min,oldn=0,even=0,x; for(i=1; imax) max=x; if (xmin) min=x; } printf(“max=%d,mix=%d\n“,max,min); printf(“There are %d even numbers.\n“,even); printf(“There are %d old numbers.\n“,oldn); },,程序举例—面积问题,例如:求曲线 y2=x 在3=x=15间围成如右图的阴影部分面积.,曲线方程可转化为:,而求阴影部分的面积其实就是求下式积分的问题:,也就是接近将区域微分为足够多的小矩形的面积和。当然,一种方法就是从数学上求出它的积分;另一种可与C语言来描述:,程序举例—面积问题,#include main() { double x,area=0.0; for (x=3; x15; x=x+0.01) area=area+sqrt(x)*0.01; printf(“area is:%f\n“,area); getch(); },课 堂 练 习,1.以下程序的运行结果是( )。 void main() { int sum = 0, item = 0; while (item =6) break; } printf(“%d\n“,sum); },2.以下程序的运行结果是( )。 void main() { int sum = 0, item = 0; while (item 5) { item++; if (item == 2) continue; sum += item; } printf(“%d\n“,sum); },牛顿迭代法,方程f(x)=0,若满足下列三个条件可使用牛顿迭代法: f(x)在区间[a,b]上的f '(x)及f ''(x) 都存在… f(a)f(b)0. 则可以使用牛顿迭代公式 f(xn-1) xn = xn-1 – f '(xn-1),,牛顿迭代法,#include main() { float x,x0,f,f1; x=2; do { x0=x; f=x0*x0*x0+4*x0*x0-10; f1=3*x0*x0+8*x0; x=x0-f/f1; } while (fabs(x-x0)=1e-6); printf(“the root is: %5.2f\n“,x); },作 业,编写程序计算:,2. P121 4.22 3. P122 4.25,课后习题,4.22 “鸡兔同笼”是一个中国古算题,最早出现在《孙子算经》中。笼中有若干只鸡和兔子,它们共有88个头,244只脚,问鸡和兔各有多少只? 4.25求1-999之间的所有同构数。一个数出现在它的平方数的右端,这个数称为同构数。如: 5出现在25右侧 5是同构数 25出现在625右侧 25也是同构数,课后习题,补充下面程序,该程序的功能是求满足以下条件的最大的n。 1+2+3+。。。+n≤1000 void main() { int n,s; /**/ /**/ while (s=1000) { n++; s=s+/**/ /**/; } printf(“n=%d\n“,n); getch(); },- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 程序控制 结构

链接地址:https://www.zhuangpeitu.com/p-1855151.html