首页 c5循环结构程序设计

c5循环结构程序设计

举报
开通vip

c5循环结构程序设计null第五章 循环结构程序设计第五章 循环结构程序设计教学目标 掌握while语句、do-while语句和for语句的使用; 掌握循环嵌套的运用; 掌握设计循环程序的递推法和穷举法; 了解goto语句和用goto语句构成循环结构的方法; 了解break语句和contiune语句在循环体中的作用。 基本要求 能够正确地理解和描述控制循环的表达式,能够正确地使用for、while和do-while这三种循环来解决实际问题。 null 循环结构的特点: 在给定条件(循环条件)成...

c5循环结构程序设计
null第五章 循环结构程序 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 第五章 循环结构程序设计教学目标 掌握while语句、do-while语句和for语句的使用; 掌握循环嵌套的运用; 掌握设计循环程序的递推法和穷举法; 了解goto语句和用goto语句构成循环结构的 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 ; 了解break语句和contiune语句在循环体中的作用。 基本要求 能够正确地理解和描述控制循环的表达式,能够正确地使用for、while和do-while这三种循环来解决实际问题。 null 循环结构的特点: 在给定条件(循环条件)成立时,反复执行某程序段(循环体),直到给定条件不成立时为止。 循环的实现方式: 1. 用goto语句和if语句构成循环。 2. 用while循环语句。 3. 用do-while循环语句。 4. 用for循环语句。 5.1 goto语句及用goto语句构成循环 5.1 goto语句及用goto语句构成循环 1. 语句标号 语句标号就是给程序中的某一个语句定义的标号,可以是任意合法的标识符(注意:不能用整数)。 C程序中的任何一个可执行语句之前都可以加上语句标号。例如: stop: printf("END\n"); 语句标号和语句之间用冒号分隔。 语句标号常用作为goto语句的转向目标。如: goto stop; 如果程序中没有用goto语句改变程序的执行顺序,也就没有必要出现语句标号。 2. goto语句 2. goto语句 goto语句称为无条件转向语句。 一般形式为:goto 语句标号; 作用:把程序的执行转移到语句标号所在的位置。注意:这个语句标号必须与此goto语句在同一个 函数 excel方差函数excelsd函数已知函数     2 f x m x mx m      2 1 4 2拉格朗日函数pdf函数公式下载 之内。 goto语句不符合结构化程序设计的原则,一般应避免使用。 主要用途: 1. 与if语句一起构成循环结构。 2. 能够大大地提高程序的执行效率时。 3 . 用goto语句构成的循环结构 3 . 用goto语句构成的循环结构 #include "stdio.h" main() {int n= 0; char ch; printf("input a string\n"); loop: ch= getchar(); n++; if(ch!='\n') goto loop; n=n-1; /*不要字符'\n'*/ printf("%d",n); } goto语句通常与条件语句配合构成条件转移语句,用来实现构成循环或跳出循环等功能。 例5.1 统计从键盘输入的一行字符的个数。例5.2 输入一组数据求和 例5.2 输入一组数据求和 #include main() { int number, sum=0; loop: scanf("%d", &number); sum+=number; if(number!=0) goto loop; printf("The total sum is %d\n", sum); } 从键盘输入完一组数据后,再输入一个0作为结束输入数据的标志。 5.2 while循环语句5.2 while循环语句由while语句构成的循环称为“当型” 循环。 while循环的一般形式如下: while(表达式) 循环体语句while语句的执行过程: 先计算while表达式的值,当表达式的值为非零时,便执行循环体语句,之后再计算该表达式的值,由此构成循环,直到有一次求得表达式的值为零时才结束循环,并继续执行循环体语句之外的后续语句。用while语句改写例5.1的程序#include main() {int n=0; char ch; printf("input a string:\n"); ch= getchar(); while(ch!='\n') {n++; ch= getchar();} printf("%d",n); } 用while语句改写例5.1的程序统计从键盘输入的一行字符的个数。说明:(1)while语句中的表达式可以是任意合法的C表达式。 (2)如果循环体语句是复合语句,一定要用{ }括起来。 (3) 在循环体语句中应该包含能够使循环趋于结束的操作,以避免出现死循环。 例5.3 编程求1+2+3+…+100的值。例5.3 编程求1+2+3+…+100的值。 这是一个求累加和的问题。设置2个变量: i:循环控制变量(也作为加数),初值为1,每循环一次i的值增1,一直循环到i的值超过100为止。 sum:存放这100个数的和值,先求0+1的和并将其放在sum中,然后把sum中的数加上2再存放在sum中,依次类推。 sum累加的过程要放在循环体中,由计算机来判断所加的数是否已经超过100。 例5.3程序,求1+2+3+…+100的值 main() { int i, sum; i=1; sum=0; while(i<=100) {sum= sum + i ; i++; /* 变量i既作为循环变量,控制循环次数,*/ /* 同时又作为实际变量(加数)使用。 */ } printf("sum=%d\n", sum); } 程序运行后的输出结果: sum=5050 例5.3程序,求1+2+3+…+100的值5.3 用do-while语句构成的循环 5.3 用do-while语句构成的循环 由do-while语句构成的循环称为“直到型”循环。 do-while语句的一般形式: do 循环体语句 while(表达式); do-while语句的执行过程: 先执行循环体语句,再求表达式的值,若表达式的值为“真”(非0)则再执行循环体语句,由此构成循环,直到表达式的值为“假” (0)时结束循环。如图5.3所示。 do-while语句和while语句的区别在于do-while是先执行循环体语句,后判断循环条件,因此do-while至少要执行一次循环体。用do-while语句改写例5.3的程序main() { int i, sum; i=1; sum=0; do { sum= sum+i; i++; }while(i<=100); printf("sum=%d\n", sum); } 用do-while语句改写例5.3的程序题目:求1+2+3+…+100的值注意:N_S流程图的直到型循环结构的循环条件的描述方法与C语言的do-while语句的循环条件的测试方法稍有不同。i<=100时继续执行循环和i>100时结束循环是同一概念的两种描述方式。这里一定要有一个分号5.4 for语句和用for语句构成的循环 5.4 for语句和用for语句构成的循环 for语句的一般形式为: for (表达式1;表达式2;表达式3) 循环体语句for语句的常规使用方法for语句非常适合计数循环,其常规使用方法为: “表达式1”用来给循环变量赋初值或做一些初始工作; “表达式2”用来作为判断循环是否结束的条件; “表达式3”用来修改循环变量的值,使得循环能够趋于结束。for语句的常规使用方法main() /*程序1 */ { int i, sum; for (i=1,sum=0; i<=100; i++) sum= sum + i ; printf("sum=%d\n", sum); }for语句的非常规使用方法 从语法上来讲,三个表达式都可以是任意合法的C表达式,各表达式之间用“;”隔开,并且这三个表达式都是任选项。 如下几种形式的for循环语句,都能正确地求出1+2+3+…+100的值。 for语句的非常规使用方法for语句的非常规使用方法2for语句的非常规使用方法2注意在循环体语句之前不能有分号注意在循环体语句之前不能有分号main() { int i, sum=0; for (i=1 ; i<=100; i++) ; sum= sum + i ; printf("sum=%d\n", sum); } 运行结果为: sum=101 循环体语句是一个空语句! sum= sum + i ; 只在循环结束以后才被执行到。例5.4 求n!。即计算1×2×3×…×n的值。 例5.4 求n!。即计算1×2×3×…×n的值。 分析:该题的算法与累加求和的算法基本相同。 注意:多个数相乘的结果可能会很大,所以在程序中采用长整型变量来存放乘积的值。 main() { int i, n; long s=1; printf("Enter n: "); scanf("%d",&n); for(i=1; i<=n; i++ ) s=s*i; printf("%d!=%ld\n", n,s); } 程序运行结果为: Enter n: 6 6!=720例5.5 编程计算多个圆的面积 例5.5 编程计算多个圆的面积 圆的半径从0.5mm开始,按增1 mm的规律递增。 直接用半径r作为for语句的循环控制变量,每循环一次使r的值增1,直到r大于5.5为止。main( ) {float r, s ; for(r=0.5; r<=5.5; r++) { s=3.14159*r*r ; printf("r=%f,s=%f\n", r, s); } } 变量r具有双重功能,它既是循环控制变量,又是圆的半径值。循环体共执行6次,当r增到6.5时,条件表达式r<=5.5的值为0,从而退出循环。程序运行结果为: r=0.500000 s=0.785398 r=1.500000 s=7.068577 r=2.500000 s=19.634937 r=3.500000 s=38.484478 r=4.500000 s=63.617199 r=5.500000 s=95.033096 5.5 循环结构的嵌套 5.5 循环结构的嵌套 在一个循环语句的循环体内又完整地包含了另一个循环语句,称为循环嵌套。例5.6 循环嵌套的应用--输出九九乘法表。 为了增加程序的可读性,循环嵌套的 关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf 写尽量采用缩进形式。例5.6 循环嵌套的应用--输出九九乘法表。main ( ) { int i, j; for(i=1; i<=9; i++) { for(j=1; j<= i; j++) printf("%1d*%1d =%2d ", i, j , i*j); printf("\n"); } } 例5.6程序输出的九九乘法表程序的运行结果为: 1*1= 1 2*1= 2 2*2= 4 3*1= 3 3*2= 6 3*3= 9 4*1= 4 4*2= 8 4*3=12 4*4=16 5*1= 5 5*2=10 5*3=15 5*4=20 5*5=25 6*1= 6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 7*1= 7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 8*1= 8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 9*1= 9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 例5.6程序输出的九九乘法表5.6 break语句和continue语句5.6 break语句和continue语句 break语句在循环控制中的作用是强行结束该语句所在的整个循环结构,转向执行循环体语句后的下一条语句(减少循环的执行次数)。 continue语句的作用是提前结束多次循环中的某一次循环,即跳过循环体语句中位于continue语句之后的其余语句,从而进入下一次循环(循环的执行次数没有变化,但某一次循环的循环体语句没有全部执行)。 1. break语句 1. break语句 当break语句用在switch语句中时,可以使流程跳出由switch语句构成的多分支结构。 当break语句用在do-while、for或while循环语句中时, 也可以使程序终止循环,跳出循环结构。通常break语句总是与if语句配合使用,即当满足某个给定的条件要求时便跳出循环。 例5.7 在循环体中使用break语句。 例5.7 在循环体中使用break语句。 main() {int i, s; s=0; for(i=1; i<=10; i++) {s= s+i; if(s>5) break; printf("s=%d\n", s); } }程序的输出结果如下: s=1 s=3 程序中的循环语句本应循环10次,但是,当循环进行到第3次时,i的值为3,s的值为6,if语句中的表达式s>5的值为1,于是执行break语句,跳出for循环,从而提前终止了循环的执行。 在循环体中使用break语句。 在循环体中使用break语句。 注意 只能在do-while、for、while循环语句或switch语句体内使用break语句,其作用是使程序提前终止它所在的语句结构,转去执行下一条语句;若程序中有上述四种结构语句的嵌套使用,则break语句只能终止它所在的最内层的语句结构。 main() { int a=0, i; for (i=1; i<5; i++) {switch (i) {case 1: a+=2; case 3: break; case 2: a+=1; default: a+=2; } printf("%d",a); } } 运行结果: 25572. continue语句 2. continue语句 例5.8 在循环体中使用continue语句。 main() { int i, s=0; for(i=1; i<=8; i++) { s= s+i; printf("\ni=%d ", i); if(i%2==0) continue; printf("s=%d\n", s); } } continue语句只能在do-while、for和while循环语句中使用,其作用是提前结束多次循环中的某一次循环。运行结果: i=1 s=1 i=2 i=3 s=6 i=4 i=5 s=15 i=6 i=7 s=28 i=8 在执行的8次循环中,当i的值为偶数时,执行continue语句,其作用是跳过printf(“s=%d\n”, s); 语句,继续执行下一次循环。 5.7 循环结构程序举例 5.7 循环结构程序举例 常用的循环处理算法 穷举法 递推法 1. 穷举法 “穷举法”也称为“枚举法”或“试凑法”, 即采用循环结构将所有可能出现的情况一一进行测试,判断是否满足给定的条件。 例5.9 极值问题 题目:从键盘输入全班的学习成绩,统计出最高分、最低分和平均分。 分析:由于不知道学生人数,程序中用一个负数来作为结束输入成绩的标志。例5.9 极值问题 main() {int x, max, min, n; float sum=0; max=x; min=x; n=0; printf("Enter x(-1 to end): "); scanf("%d",&x); while(x>=0) {sum = sum + x; n= n+1; if(x>max) max = x; if(x0) printf("max=%d, min=%d, aver=%f\n", max, min, sum/n); } 运行结果如下: Enter x(-1 to end): 87 76 53 99 58 -1 max=99, min=53, aver=74.599998 例5.10 素数问题 例5.10 素数问题 程序如下: main() { int m, i, flag; printf("Enter a integer : "); scanf("%d", &m); flag=1; /*先假定m是素数*/ for(i=2; i<=m-1; i++) if(m%i==0) {flag=0; break; } printf("%d:", m); if(flag) printf(" YES!\n"); else printf("NO!\n"); } 素数是一个大于2,且只能被1和它自己整除的整数。编程求输入的某个正整数是否为素数。若是,输出YES,若不是,输出NO。 分析:判别某数m是否为素数的最简单方法是:穷举出所有可能的除数2、3、4、…一直到m-1,分别判定m能否被它们整除,只要有一个能整除,m就不是素数;只有全部都不能整除时,m才是素数。运行结果如下: Enter a integer : 157 157: YES! 实际上只要试除到m/2或sqrt(m)就足够了。例5.11 百钱买百鸡问题 例5.11 百钱买百鸡问题 “鸡翁一,值钱三;鸡母一,值钱五;鸡雏三,值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?”。 分析:设鸡翁x只、鸡母y只、鸡雏z只。解题的思路是:鸡翁数x的值可能是[0,33]中的任何一个值;鸡母数y的值可能是[0,20]中的任何一个值;将所有可能出现的情况都一一进行测试,若满足要求就把这种情况输出,作为可能的一个解。 main() {int x, y, z; for(x=0; x<=33; x++) for (y=0; y<=20; y++) {z=100-x-y; if(x*3.0+y*5.0+z/3.0==100.0) printf("x=%d, y=%d, z=%d\n", x, y, z); } } 该程序能从七百多种可能的组合情况中挑选出四种满足要求的答案。运行结果如下: x=4, y=12, z=84 x=11, y=8, z=81 x=18, y=4, z=78 x=25, y=0, z=75 例5.12 长 材料 关于××同志的政审材料调查表环保先进个人材料国家普通话测试材料农民专业合作社注销四查四问剖析材料 截取短料的最优化方法例5.12 长材料截取短料的最优化方法 题目: 有一根长度为323米的钢材料,要将它截取成两种规格a、b的长度分别为17米和27米的短料, 每种至少1段, 问分隔成a, b各多少段后,剩余的残料 r 最少? 分析: 规格a的钢材料的个数na可能为: 1、2、3、……(321-27)/17。main( ) {int na, nb, a, b, r, rmin; na=1; nb=1; rmin=323-17-27; for (na=1; na<=(323-27)/17; na++) { nb=(323-na*17)/27; r =323-na*17-nb*27; if (r< rmin) {rmin=r; a=na; b=nb; } } printf("a=%d, b=%d, min=%d\n", a, b, rmin ); }运行结果如下: a=11, b=5, min=1 2. 递推法2. 递推法 “递推法”又称为“迭代法”,其基本思想是把一个复杂的计算过程转化为简单过程的多次重复。例5.13 猴子吃桃问题:小猴在某天摘桃若干个,当天吃掉一半,觉得还不过瘾,又多吃了一个。第二天吃了剩下的桃子的一半又多一个;以后每天都这样吃下去,直到第8天要吃时只剩下一个桃子了,问小猴子第一天共摘下了多少个桃子? 分析:这是一个“递推”问题,先从最后一天的桃子数推出倒数第二天的桃子数,再从倒数第二天的桃子数推出倒数第三天的桃子数……。设第n天的桃子为xn,那么它是前一天的桃子数的xn-1 的一半减1,递推公式为:xn=xn-1/2 – 1 。即: xn-1 =( xn+1)×2。 例5.13 猴子吃桃问题的程序 例5.13 猴子吃桃问题的程序 main() {int tao,n; tao=1; /*已知第8天的桃子数*/ for (n=7;n>=1;n=n-1) tao=(tao+1)*2; printf("tao(1)=%d\n",tao); } 程序执行后输出结果如下: tao(1)=382 例5.14 斐波那契数列:1,1,2,3,5,8… 例5.14 斐波那契数列:1,1,2,3,5,8… 此数列的第一项和第二项为1,从第三项开始,每一项的值是前两项的值之和;编程输出该数列的前15项。每行输出5个数。 分析:斐波那契数列的递推公式为:fn=fn-1+fn-2,用第1项和第2项的值求出第3项的值以后,再用第2项和第3项的值求出第4项的值,…… main() { int i, f1=1, f2=1, f3; printf("\n%5d%5d",f1,f2); for(i=3; i<=15; i++ ) {f3=f1+f2; printf("%5d",f3); if(i%5==0) printf("\n"); f1=f2; f2=f3; } }程序执行后输出结果如下: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 例5.15 求pi的近似值例5.15 求pi的近似值 分析: 本题的递推公式比上面的两个例子复杂,只能将分子和分母分别递推出新的值后再做除法运算。其递推方法和求解的步骤如下: 1. 分母n的初值为1,递推公式:n=n+2; 2. 分子s的初值为1.0,递推公式:s=(-1)*s; 3. 公式中某项的值为: t=s/n。 从以上求pi的公式来看,不能决定n的最终值应该是多少;但可以用最后一项t=s/n的绝对值小于0.0001来作为循环的结束条件。 题目: 用公式 pi/4=1-1/3+1/5-1/7… 求pi的近似值,直到最后一项的绝对值小于10-4为止。 pi/4=1-1/3+1/5-1/7+1/9……#include "math.h" main( ) {int n; float t, s, pi; pi=0; /*变量pi用来存放累加和*/ n=1; /*第一项的分母值为1*/ s=1.0; /*第一项的分子值为+1*/ t= s/n; /*先求出第一项的值*/ while (fabs(t)>=0.0001) { pi=pi+t; n+=2; s= -1* s; t= s/n; /*递推出下一项的值*/ } printf("pi=%f\n", pi*4) ; }程序执行后输出以下结果。 pi=3.141397pi/4=1-1/3+1/5-1/7+1/9……例5.16 求两个正整数的最大公约数 分析:求最大公约数的迭代步骤如下: (1) 输入两个正整 数m,n; (2) 用m除以n得到 一个余数r ; (3) 若r=0,则n为最大公约数,程序结束;否则用n取代m,用r取代n,转去执行第(2)步。 例5.16 求两个正整数的最大公约数程序如下: main( ) {int m, n, r ; printf("Enter m, n: "); scanf("%d,%d", &m, &n); r= m%n; while(r!=0) {m=n ; n=r ; r = m%n ;} printf("gcd=%d\n", n); } 程序执行后输出结果如下: Enter m,n:14,8 gcd=2用穷举法求最大公约数分析:两个数的最大公约数肯定不会比其中的小者大。用穷举法求最大公约数main( ) {int m, n, r ; printf("Enter m, n: "); scanf("%d,%d", &m, &n); r=m1) {if(m % r==0 && n % r==0 ) break; /*找到r即为最大公约数,中止循环。*/ r = r-1; /*从大到小穷举出所有可能的数*/ } printf("gcd(%d,%d)=%d\n",m,n, r); }例5.17 高次方程求根。 例5.17 高次方程求根。 二分法的递推方法如下: (1) 输入两个点的x坐标值a,b, 使f(a)* f(b)<0,即确保在区间[a,b]内有一根。 (2) 求区间[a,b]的中点c= (a+b)/2。 (3) 计算f(c)的值,若该值小于给定的精度要求,则 c为求 得的近似根,程序结束;否则执行步骤(4)。 (4) 若f(a)与f(c)同号,则[a,c]无根,用c代替a;否则[c,b] 无根,用c代替b;使求根区间缩小一半,并重复上述 步骤(2)~(4),直到求出近似根为止。 例5.17 求高次方程3x3- 4x2- 5x+13=0的根 #include "math.h" main( ) {float a,b,c,fa,fb,fc; do {printf("Enter a,b:"); scanf("%f,%f",&a,&b); fa=3*a*a*a-4*a*a-5*a+13; fb=3*b*b*b-4*b*b-5*b+13; }while(fa*fb>0); do {c=(a+b)/2; fc=3*c*c*c-4*c*c-5*c+13; if (fa*fc>0) a=c; else b=c; }while(fabs(fc)>0.0001); printf("3*x*x*x-4*x*x-5*x+13=0\nx=%f, y=%f\n",c,fc); }例5.17 求高次方程3x3- 4x2- 5x+13=0的根 程序执行后输出结果如下: Enter a,b:1,8 Enter a,b:-5,8 3*x*x*x-4*x*x-5*x+13=0 x=-1.548908,f=0.000039
本文档为【c5循环结构程序设计】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_863231
暂无简介~
格式:ppt
大小:602KB
软件:PowerPoint
页数:0
分类:其他高等教育
上传时间:2012-12-04
浏览量:11