第三次作业
博客链接:https://edu.cnblogs.com/campus/hljkj/CS201802/homework/2360
第十一周:
【第七次作业】7-1 统计学生平均成绩与及格人数
1、实验代码
# include<stdio.h> int main (void) { int count,i,N; double average,grade,total; scanf("%d",&N); total=0; count=0; for(i=1;i<=N;i++){ scanf("%lf",&grade); total=total+grade; if(grade>=60){ count++; } } if(N>0){average=total/N;} else{average=0;} printf("average = %.1lf\n",average); printf("count = %d\n",count); return 0; }
2、解题思路
(1)题目算法
第一步:输入学生人数N,并判断i与N的大小以决定是否进入for循环
第二步:进入for循环后,输入成绩grade,并计算总成绩total;判断grade是否大于或等于60以计数
第三步:运算平均数,并输出结果。
(2)流程图
3、调试过程遇到的问题及其解决方法:
初次平均数average的计算未进入if语句,导致结果只有“没有学生”时正确,提供截图:
3
当我把average的运算语句放在for循环外面时,前两部正确,但是因为N为分母,所以N!=0,导致最后一步没有学生(即N=0)时答案错误。
(调试结果)↓
最后我使用if语句来判断当N是否等于0时的情况:
当N!=0时,average=total/N;而当N取零时,average=0。
第十二周:
【第九次作业】7-4 计算圆周率
1、实验代码
//for循环 #include<stdio.h> int main(void){ int N; double e,f,numerator=1,denominator=1,sum=0,total; N=0; scanf("%lf",&e); for(f=1;f>=e;N++){ if(N == 0) {numerator=1;} else{ numerator=numerator*N; denominator=denominator*(2.0*N+1.0); } f=numerator/denominator; sum+=f; } total=2.0*sum; printf("%.6f\n",total); return 0; }
//while #include<stdio.h> int main(void){ int N; double e,f,numerator=1,denominator=1,sum=0,total; N=0; scanf("%lf",&e); f=1; while(f>=e){ if(N == 0) {numerator=1;} else{ numerator=numerator*N; denominator=denominator*(2.0*N+1.0); } f=numerator/denominator; sum+=f; N++; } total=2.0*sum; printf("%.6f\n",total); return 0; }
//do-while #include<stdio.h> int main(void){ int N; double e,f,numerator=1,denominator=1,sum=1,total; N=1; scanf("%lf",&e); f=1; do{ numerator=numerator*N; denominator=denominator*(2.0*N+1.0); N++; f=numerator/denominator; sum+=f; total=2.0*sum;} while(f>=e); printf("%.6f\n",total); return 0; }
2、解题思路
(1)题目算法
第一步:以for循环为例,根据题意设定变量,输入e,当f(分数)>=e时进入for循环;
第二步:判断N的数值,若N的数值不为零,则numerator(分子)为原值与N的乘积;denominator(分母)=denominator*(2.0*N+1.0);
第三步:根据运算公式算出f的值并求和,再次判定条件以再次进入for循环;
第四步:跳出循环后由(total=2.0*sum)计算出total并输出结果。
(2)流程图(第一种方式,for循环)
3、调试过程遇到的问题及其解决方法:
将for循环改为while时while的括号内无误添加“;”导致编译错误↓
本题用do-while,for循环以及while均可得出正确答案,就我个人而言认为for循环更好理解,在思考题目是
可以更完整的吧条件写入for()中,而while略加琐碎,编写do-while时由于条件写在最后因此思路不是很
清晰,因此我先编写出for循环,而后再将其修改为while以及do-while另两种格式。
第十三周:
【第十次作业】7-1 统计素数并求和
1、实验代码
#include<stdio.h> int main(void){ int M,N,i,x,isprime=0; int sum=0,count=0; scanf("%d %d",&M,&N); for(i=M;i<=N;i++){ isprime=1; for(x=2;x<=i/2;x++){ if(i%x==0){ isprime=0; break;} } if(isprime==1&&i!=1){ count++; sum=sum+i; } } printf("%d %d",count,sum); return 0; }
2、解题思路
(1)题目算法
第一步:设置变量,输入M,N;
第二步:当i<=N时进入for循环,当x<=i时进入内嵌for循环,并判断是否进入if语句;
第三步:若i%x==0,则i不是素数,跳出for循环,进入下一if语句,若不为零,则继续for循环;
第四步:输出M,N
(2)流程图
3、调试过程遇到的问题及其解决方法:
当M与N的值相等时,结果错误:
将内嵌for循环中的条件“x<i”修改成“x<=i/2”后答案正确。
个人总结
本周主要学习循环语句,难度比之前学的的知识点略大,平时在编码是=时更偏向于for循环以及while,个人更
习惯优先考虑条件。其次是在做题时应该先理清运算顺序,由局部到整体。这样思路会更加清晰。
附图表:
所评论博客:https://www.cnblogs.com/liuweiliuwei/p/10016885.html【作者:刘伟lw】