C语言程序设计第3版何钦铭颜晖第4章循环结构
- 格式:doc
- 大小:54.00 KB
- 文档页数:15
第4章循环结构【练习 4-1】在例 4-1 程序中,如果对 item 赋初值 0,运行结果是什么?为什么?如果将精度改为 10-3,运行结果有变化吗?为什么?解答:如果对 item 赋初值 0,则程序运行结果是 pi=0,因为 item 为 0 时不满足 while 循环的执行条件,即不执行循环,故 pi 值为 0。
如果将精度改为10-3,运行结果会有变化,因为精度改变意味着 while 循环的条件改变,精度变大使得 while 循环次数减少,必然影响到π的值。
【练习 4-2】运行例 4-2 程序时,如果将最后一个输入数据改为-2,运行结果有变化吗?如果第一个输入数据是 -1,运行结果是什么?为什么?解答:如果将最后一个输入数据改为-2,运行结果没有变化,因为最后一个负数是一结束标志,不进行统计,故任意一个负数都可以。
如果第一个输入数据是-1,运行结果是:Grade averageis 0,因为第一个输入就是-1,则 while 循环条件不成立,不执行循环体。
【练习 4-3】序列求和(1-1/4+1/7-1/10+1/13-1/16+…):输入一个正实数 eps,计算序列1-1/4+1/7-1/10+1/13-1/16+…的值,精确到最后一项的绝对值小于eps(保留6位小数)。
试编写相应程序。
解答:#include <stdio.h>#include <math.h>int main(void){int denominator, flag;double item, s,eps;printf(“Input eps:”);scanf(“%lf”,&eps);flag = 1;denominator = 1 ;item = 1.0;s = 0;while(fabs (item) >= eps) {item = flag * 1.0 / denominator;s = s + item;flag = -flag;denominator = denominator +3;}printf ( “s = %f\n”, s);return 0;}【练习 4-4】如果将例 4-3 程序中的 do-while 语句改为下列 while 语句,会影响程序的功能吗?为什么?再增加一条什么语句,就可以实现同样的功能?while(number != 0){number = number / 10;count ++;}解答:会有影响,因为当输入数据 number 为 0 时,上述 while 循环将不执行,count 值仍为 0,故输出为 0,不符合题目要求。
学习手册(1)循环结构的基本流程及应用了解循环结构的意义和基本实现语句正确利用while语句进行循环程序设计能够根据流程图编写C语言程序while语句在循环结构中的应用循环的三个要素学习方法先完成一个简单实例,求1-100累计和,学习while语句和循环程序设计的算法和结构。
拓展程序求10!,然后以求12个月的煤气费用综合为例,总结循环结构的三个要素。
学习过程1. 回想现实生活中哪些是循环的例子?2.以前面所学的顺序结构为基础,求1至100之间数的累计和。
3.拓展:n! = 1 * 2 * 3 * …n4.计算一个住户一年的煤气费用的总和(每月煤气费由键盘输入)5.讨论:编写程序,计算满足:1+2+3+……..n<1000的最大n值。
学生容易出错的地方循环语句的执行次数写循环语句时不知道怎样选取循环变量问题与讨论循环控制语句有几种实现方式?while循环的一般格式和执行过程。
回顾以下内容1.循环的3个要点循环变量的初始值、循环条件和循环变量的增量。
2.while语句的一般形式while(表达式){循环体语句;}其中表达式为循环条件,循环体语句为要反复执行的操作。
课后任务编写程序,求1!+2!+3! (10)(2):循环结构的嵌套应用Do-While语句的标准格式for语句的标准格式Do-while语句与while语句的区别能够根据流程图编写C语言程序灵活使用三种语句编写C语言程序学习方法每个程序都争取用三种循环方式写出画出流程图教学过程1. 求1至100之间数的累计和。
以do-while语句和for语句的格式实现。
2. 某班同学上体育课,从1开始报数,共有38人,老师要求报数时凡是3的倍数的同学往前一步走,试编程将这些同学的序号打印出来。
在循环体中使用条件语句分别用for语句、while语句、do-while语句实现。
3. 通过读程序理解continue语句与break语句的作用。
4.练一练:两个同学之间通信,但是不想让别人知道通信的内容,于是相互约定:将a转化为c,b转化为d……x转化为z,y转化为a,z转化为b。
C语言程序设计循环结构程序设计循环结构是一种重复执行特定任务的程序设计方法,它可以节省代码量,提高代码的复用性和可读性。
C语言提供了多种循环结构,如for循环、while循环和do-while循环。
在本文中,将介绍C语言程序设计中循环结构的应用。
首先,我们来介绍for循环。
for循环是一种在已知循环次数的情况下使用的循环结构。
它的基本语法如下:```for (初始化表达式; 循环条件表达式; 循环后操作表达式)代码块```其中,初始化表达式用于初始化计数器变量,循环条件表达式用于判断是否继续执行循环,循环后操作表达式用于更新计数器变量的值。
具体代码示例如下:```c#include <stdio.h>int maiint i;for (i=0; i<5; i++)printf("Hello, World!\n");}return 0;```上述代码会打印"Hello, World!"五次。
在for循环中,初始化表达式会在循环开始前执行一次,循环条件表达式会在每次循环开始时判断,如果为真则执行循环体中的代码块,然后执行循环后操作表达式,然后再次判断循环条件表达式,依此类推,直到循环条件表达式为假时循环结束。
接下来,我们介绍while循环。
while循环是一种在不知道循环次数的情况下使用的循环结构。
它的基本语法如下:```while (循环条件表达式)代码块```具体代码示例如下:```c#include <stdio.h>int maiint i = 0;while (i < 5)printf("Hello, World!\n");i++;}return 0;```上述代码与前面的示例效果相同,都会打印"Hello, World!"五次。
在while循环中,循环条件表达式会在每次循环开始时判断,如果为真则执行循环体中的代码块,然后再次判断循环条件表达式,依此类推,直到循环条件表达式为假时循环结束。
#include <stdio.h>#include <math.h>void main(){double eps,s,item,flag,denominator;s=0;item=1;flag=1;denominator=1;printf("Enter eps: ");scanf("%lf",&eps);while(fabs(item)>=eps){item=flag/denominator;s=s+item;flag=-flag;denominator=denominator+3;}printf("s=%lf\n",s);}练习4-4#include <stdio.h>void main(){int num,n;float score,total=0;num=0;n=0;printf("Please input score # 1 :");scanf("%f",&score);while(score>=0){if(score<60)num++;total=total+score;n++;printf("Please input score #%d(0~100): ",n+1);scanf("%f",&score);}printf("The average score is %.2f.\n",total/n);printf("The numbers between 0 and 59 is %d.\n",num); }#include <stdio.h>void main(){int i,j,n,num;printf("Enter n : ");scanf("%d",&n);for(i=1;i<=n;i++){printf("Please input an integer : ");scanf("%d",&num);for(j=2;j<=num-1;j++)if(i%j==0)break;if(j>num-1 && num!=1)printf("%d is a prime.\n",num);else printf("%d is not a prime.\n",num);}}练习4-8#include <stdio.h>void main(){int i,j,n;double e,product;e=1;printf("Enter n : ");scanf("%d",&n);for(i=1;i<=n;i++){product=1;for(j=1;j<=i;j++)product=product*j;e=e+1/product;}printf("e=%.2lf\n",e);}练习4-11#include <stdio.h>void main(){int i,n,min,num;printf("Enter n : ");scanf("%d",&n);for(i=1;i<=n;i++){printf("Enter an integer : ");scanf("%d",&num);if(i==1)min=num;else if(num<min)min=num;}printf("The Min number is %d.\n",min); }练习4-12#include <stdio.h>void main(){int num1,num2=0,flag=1;printf("Enter an integer : ");scanf("%d",&num1);if(num1<0){flag=-1;num1=-num1;}while(num1!=0){num2=num2*10+num1%10;num1=num1/10;}num2=flag*num2;printf("The new number is %d.\n",num2); }练习4-13#include <stdio.h>void main(){int i,j,count=0;for(i=100;i<=200;i++){for(j=2;j<=i-1;j++)if(i%j==0)break;if(j>i-1){count++;if(count%8==0)printf("%8d\n",i);else printf("%8d",i);}}printf("\n");}练习4-14#include <stdio.h>void main(){int i,f1=1,f2=1,f;printf("%8d\n",f1);printf("%8d\n",f2); /*输出前两项*/for(i=3;i<=20;i++){f=f2;f2=f1+f2;f1=f;printf("%8d\n",f2);}printf("\n");}习题4-1#include <stdio.h>void main(){int num=1,sum=0;while(num>0){printf("Enter an integer :");scanf("%d",&num);if(num<=0)break;if(num%2==0)sum=sum+num;}printf("The sum is %d.\n",sum); }习题4-2#include <stdio.h>#include <math.h>double fact(int n);void main(){int i=1;double x,item,s=0;printf("Enter x :");scanf("%lf",&x);item=x;while(fabs(item)>=0.00001){s=s+item;i++;item=pow(x,i)/fact(i);}printf("The sum is %lf.\n",s);}double fact(int n){int i;double product=1;for(i=1;i<=n;i++)product=product*i;return product;}习题4-3#include <stdio.h>void main(){int num,sum=0,count=0;printf("Enter an integer :");scanf("%d",&num);if(num<0)num=-num;while(num>0){sum=sum+num%10;num=num/10;count++;}printf("The sum is %d.\n",sum);printf("The count is %d.\n",count);}习题4-4#include <stdio.h>void main(){int i,n;double a,b,x,sum;a=2;b=1;sum=0; /*a为分子,b为分母*/ printf("Enter an integer : "); /*输入项数*/scanf("%d",&n);for(i=1;i<=n;i++) /*求前n项之和*/{sum=sum+a/b;x=a+b;b=a;a=x;}printf("The sum is %lf.\n",sum); /*输出和*/}习题4-5#include <stdio.h>void main(){int i,j,a,n;double item,sum; /*item为项变量,sum为累加和变量*/sum=0;printf("Enter two integers a and n : ");scanf("%d%d",&a,&n);for(i=1;i<=n;i++) /*求前n项之和*/{item=0;for(j=1;j<=i;j++) /*求第i项*/item=item*10+a;sum=sum+item;}printf("The sum is %lf.\n",sum); /*输出和*/}习题4-6#include <stdio.h>void main(){int i,j,k,count; /*count为换法种数,i为1分的硬币数,j为2分的硬币数,k为5分的硬币数*/count=0;for(i=1;i<=100;i++)for(j=1;j<=50;j++)for(k=1;k<=20;k++)if(i+2*j+5*k==100){printf("1分=%d, 2分=%d, 5分=%d\n",i,j,k);count++;}printf("换法种数=%d\n",count);}习题4-7#include <stdio.h>void main(){int i,m,digit,sum; /*sum为各位数字的立方和变量*/for(i=1;i<=10000;i++){/*求整数i中各位数字的立方和*/m=i;sum=0;while(m!=0){digit=m%10;sum=sum+digit*digit*digit;m=m/10;}if(i==sum)printf("%d\n",i); /*输出满足条件的整数i*/}}习题4-8#include <stdio.h>int prime(int n);void main(){int m,i;for(m=6;m<=100;m=m+2)for(i=2;i<=m-1;i++)if(prime(i) && prime(m-i)){printf("%d=%d+%d\n",m,i,m-i);break;}}int prime(int n) /*判定n是否素数的函数,返回1表示素数,返回0表示非素数*/{int i,flag;flag=1; /*初值为1*/for(i=2;i<=n-1;i++)if(n%i==0){flag=0;break;} /*置flag为0,表示非素数*/ return flag;}习题4-9#include <stdio.h>void main(){long int m,n,pow,digit; /*m为长整数变量,pow为m的幂*/printf("Enter a long integer :"); /*输入一个长整数m*/scanf("%ld",&m);/*求长整数m的幂,存放在pow变量中*/n=m;pow=1;while(n!=0){n=n/10;pow=pow*10;}pow=pow/10;/*从m的最高位开始,逐位输出各数位上的数字*/while(m!=0){digit=m/pow; /*求最高位数字*/m=m%pow;pow=pow/10; /*幂pow缩小10倍*/printf("%d ",digit);}printf("\n");}习题4-10#include <stdio.h>void main(){int i,m,n;printf("Enter an integer m :"); /*输入一个正整数m*/ scanf("%d",&m);n=m/2;printf("%d=1",m);for(i=2;i<=n;i++)while(m%i==0){printf("*%d",i);m=m/i;}printf("\n");}习题4-11#include <stdio.h>void main(void){int m, n, j, k; /* j表示最小公倍数,k表示最大公约数*/printf("Input two integer m and n : ");scanf("%d%d",&m,&n);j = m;while(j % n != 0) /* 求最小公倍数,存放在j变量中*/j = j + m;k = (m * n) / j; /* 求最大公约数,存放在k变量中*/printf("最小公倍数是%d \n最大公约数是%d\n ", j, k);}习题4-12#include <stdio.h>void main(void){int i;double h,s; /* h为高度,s为总路程*/h=100;s=100; /* 赋初值*/for(i=1;i<10;i++) /* 循环9次,求出第10次落地的总路程*/{h=0.5*h;s=s+2*h;}h=0.5*h; /* 第10次反弹的高度*/printf("第10次落地的总路程是%lf, 第10次反弹的高度是%lf\n ", s, h); }习题4-13#include <stdio.h>void main(void){int i,j;for(i=1;i<=7;i++){if(i<=4) /* 输出图形的上4行*/{for(j=1;j<=20-2*i;j++)printf(" "); /* 输出行前的空格*/for(j=1;j<=2*i-1;j++)printf("* "); /* 输出一行中的* */ }else /* 输出图形的下3行*/{for(j=1;j<=12+2*(i-4);j++)printf(" "); /* 输出行前的空格*/for(j=1;j<=2*(8-i)-1;j++)printf("* "); /* 输出一行中的* */ }printf("\n"); /* 换行*/}}习题4-14#include <stdio.h>void main(void){int x1,x2,i;x2=1; /* 赋初值:第10天的桃子数*/for(i=1;i<=9;i++) /* 循环9次,求出第1天的桃子数*/{x1=2*(x2+1);x2=x1;}printf("total=%d\n",x2); /* 输出第1天的桃子数*/}。
第4章循环结构【练习 4-1】在例 4-1 程序中,如果对 item 赋初值 0,运行结果就是什么?为什么?如果将精度改为 10-3,运行结果有变化不?为什么?解答:如果对 item 赋初值 0,则程序运行结果就是 pi=0,因为 item 为 0 时不满足 while 循环的执行条件,即不执行循环,故 pi 值为 0。
如果将精度改为10-3,运行结果会有变化,因为精度改变意味着 while 循环的条件改变,精度变大使得 while 循环次数减少,必然影响到π的值。
【练习 4-2】运行例 4-2 程序时,如果将最后一个输入数据改为-2,运行结果有变化不?如果第一个输入数据就是 -1,运行结果就是什么?为什么?解答:如果将最后一个输入数据改为-2,运行结果没有变化,因为最后一个负数就是一结束标志,不进行统计,故任意一个负数都可以。
如果第一个输入数据就是-1,运行结果就是:Grade averageis 0,因为第一个输入就就是-1,则 while 循环条件不成立,不执行循环体。
【练习 4-3】序列求与(1-1/4+1/7-1/10+1/13-1/16+…):输入一个正实数 eps,计算序列1-1/4+1/7-1/10+1/13-1/16+…的值,精确到最后一项的绝对值小于eps(保留6位小数)。
试编写相应程序。
解答:#include <stdio、h>#include <math、h>int main(void){int denominator, flag;double item, s,eps;printf(“Input eps:”);scanf(“%lf”,&eps);flag = 1;denominator = 1 ;item = 1、0;s = 0;while(fabs (item) >= eps) {item = flag * 1、0 / denominator;s = s + item;flag = -flag;denominator = denominator +3;}printf ( “s = %f\n”, s);return 0;}【练习 4-4】如果将例 4-3 程序中的 do-while 语句改为下列 while 语句,会影响程序的功能不?为什么?再增加一条什么语句,就可以实现同样的功能?while(number != 0){number = number / 10;count ++;}解答:会有影响,因为当输入数据 number 为 0 时,上述 while 循环将不执行,count 值仍为 0,故输出为 0,不符合题目要求。
可增加一条 if 语句来解决上面的问题,在 while 循环前加上语句“if ( number==0) count=1; ”。
【练习 4-5】例 4-4 程序中的第 9~15 行可以用下列 for 语句替代不?为什么?for( i = 2; i <= m/2; i++)if( m%i == 0 ) printf("No!\n");else printf("%d is prime number!\n",m);解答:不能代替,因为只用一个数来除不足以判断该数就是否就是素数。
【练习4-6】猜数字游戏:先输入2个不超过100的正整数,分别就是被猜数mynumber与允许猜测的最大次数n,再输入您所猜的数yournumber,与被猜数mynumber进行比较,若相等,显示猜中,;若不等,显示与被猜数的大小关系,最多允许猜n次。
如果1次就猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但不超过n次猜到该数,则提示“Good Guess!”;如果超过n次都没有猜到,则提示“Game Over”;如果在到达n次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。
试编写相应程序。
解答:#include<stdio、h>int main(void){int mynumber,n,yournumber,i;printf("Input mynumber:");scanf("%d",&mynumber);printf("Input n:");scanf("%d",&n);for(i=1;i<=n;i++){printf("Input yournumber:");scanf("%d",&yournumber);if(i==1&&yournumber==mynumber){printf("Bingo!");break; }if((i==2||i==3)&&yournumber==mynumber){printf("Lucky you!");break;}if((i>3&&i<=n)&&yournumber==mynumber){printf("Good Guess!");break;}if((i==n&&mynumber!=yournumber)||mynumber<0||yournumber<0){ printf("Game Over!");break;}}return 0;}【练习 4-7】求e的值:输入 1 个正整数 n,计算下式求出 e 的值(保留 2 位小数),要求使用嵌套循环。
试编写相应程序。
e = 1 + 1/1!+1/ 2!+1/ 3!+…+1/n!解答:#include<stdio、h>int main(void){int i, j, n;double e, t;printf("Input n: ");scanf("%d", &n);e = 1;for (i = 1; i <= n; i++){t=1;for(j=1;j<=i;j++)t = t * j;e = e + 1、0/t;}printf("e = %0、2f\n", e);return 0;}【练习 4-8】运行例 4-8 的源程序 1 时,如果先输入 0,即输入数据个数 n=0,表示不再输入任何成绩,运行结果就是什么?如何修改程序以应对这种情况?解答:当输入数据个数 n=0 时,由于在 for 循环外首先得输入一个成绩,故程序仍将等待输入第一个人的成绩,这与输入个数 n=0 矛盾,可修改如下:#include <stdio、h>int main(void){int i, mark, max, n;printf("Enter n: ");scanf ("%d", &n);if (n>0) {printf("Enter %d marks: ", n);scanf ("%d", &mark); /* 读入第一个成绩 */max = mark; /* 假设第一个成绩就是最高分 */for (i = 1; i < n; i++ ){scanf ("%d", &mark);if (max < mark)max = mark;}printf("Max = %d\n", max);}return 0;}【练习 4-9】运行例 4-8 的源程序 2 时,如果输入的第一个数就就是负数,表示不再输入任何成绩,运行结果就是什么?如何修改程序以应对这种情况?解答:当输入的第一个数就就是负数时,将不执行 while 循环,程序运行结果就就是输出所输入的负数。
【练习 4-10】找出最小的值:输入一个正整数 n, 再输入 n 个整数,输出最小值。
试编写相应程序。
解答:#include <stdio、h>int main(void){int i , min, n, x;printf("inputr n: ");scanf("%d", &n);printf("input numbers: ");scanf("%d", &x);min = x;for (i = 1; i < n; i++){scanf("%d", &x);if (min > x)min = x;}printf("min = %d\n", min);return 0;}【练习 4-11】统计素数并求与:输入2个正整数m与n(1≤m≤n≤500),统计并输出m与n之间素数的个数以及这些素数的与。
素数就就是只能被 1 与自身整除的正整数,1 不就是素数,2 就是素数。
试编写相应程序。
解答:#include<stdio、h>#include<math、h>int main(void){int i,m,n,j,count;double sum;printf("Enter m:");scanf("%d",&m);printf("Enter n:");scanf("%d",&n);count=0;sum=0;for(;m<=n;m++){j=sqrt(m);for(i=2;i<=j;i++)if(m%i==0)break;if(i>j&&m!=1){sum=sum+m;count++;}}printf("count=%d\nsum=%、0lf",count,sum);return 0;}习题4一.选择题1.C 语言中 while 与 do-while 循环的主要区别就是 A 。
A.do-while 的循环体至少无条件执行一次B.while 的循环控制条件比 do-while 的循环控制条件严格C.do-while 允许从外部转到循环体内D.do-while 的循环体不能就是复合语句2.下列叙述中正确的就是 C 。
A.break语句只能用于switch语句体中B.continue语句的作用就是使程序的执行流程跳出包含它的所有循环C.break语句只能用在循环体内与switch语句体内D.在循环体内使用break语句与continue语句的作用相同3.下列叙述中正确的就是 D 。