第三次作业
第三次作业
作业要求:https://edu.cnblogs.com/campus/hljkj/CS201801/homework/2359
第一题
7-3 统计学生平均成绩与及格人数
本题要求编写程序,计算学生们的平均成绩,并统计及格(成绩不低于60分)的人数。题目保证输入与输出均在整型范围内。
输入格式:
输入在第一行中给出非负整数N,即学生人数。第二行给出N个非负整数,即这N位学生的成绩,其间以空格分隔。
#include<stdio.h> int main() { int i=1; int grade=0,total=0; int count=0; double average=0,N=0; scanf("%lf",&N); for(i=1;i<=N;i++){ scanf("%d",&grade); total=total+grade; average=1.0*total/N; if(grade>=60){ count++; } } printf("average = %.1f\n",average); printf("count = %d\n",count); return 0; }
编程思路:
第一:定义整型变量i=1,grade=0,total=0;定义浮点型变量average=0,N=0。
第二:输入所要统计的学生人数。
第三:使用for循环,使其循环输入成绩,并叠加成绩求平均值。在for循环中嵌套if语句,若成绩及格则使及格人数+1。
第四:输出平均数,并保留一位小数;输出及格人数。
流程图:
调试运行过程:
一开始运行就发现成绩可以不断输入,不输出结果;
接着我判断是循环语句出现毛病;
于是进行调试;
经调试发现与想象的一样;
经过修改,成功输出结果。
调试过程中发现 i 不产生变化
经修改发现是表达式3(i=i++)有误,修改过后为(i++)正确输出。
因为这次经验,我发现,原来一个小小的错误就能使程序不能产生所预期的效果,以后应该更小心谨慎。
第二题
7-1 求整数的位数及各位数字之和
对于给定的正整数N,求它的位数及其各位数字之和。
编程思路:
一开始我是这么想的,在for循环语句中找额外两个数字来作为取余(eg:a=x%10),和进位 (eg;b=x/10),然后把b的值赋给a ;
然后就是用算法 sum=sum+a 来求各数字之和;
第三步就是该数字位数的计算(count++),但又感觉哪里不对,想了想发现for循环中{ y=x%10; x=x/10; sum=sum+y;count++; }可以少定义一个变量;
最后就是输出位数count和位数和sum。
(自己应该多注意一下算法,学好了算法,相同功能的程序可以减少不少的代码。)
编程代码:
#include<stdio.h> #include<math.h> int main() { int x=0,y=0; int count=0,num=0; scanf("%d",&x); for(;x<=10^9&&x>0;){ y=x%10; x=x/10; num=num+y; count++; } printf("%d %d",count,num); return 0; }
流程图:
编译过程:
运行了一下,结果正确
接下来进行调试看变量的变化,一开始我就已经把要查看的变量都添加了,下面是调试到输入x的一张截图
最后运行正确
第三题
7-1 统计素数并求和
本题要求统计给定整数M和N区间内素数的个数并对它们求和。
输入格式:
输入在一行中给出两个正整数M和N(1<=M<=N<=500)。
小抱怨(题目很简单,加上标点符号也就28个字,但是让我做了一个多小时才把这个题目写出来,不断的修改)
编程思路:
首先还是打出程序框架,定义变量x,i,sum,count,M和N,手动输入M,N的值;
其次先写一个for循环(用来循环从数字M到N)放在条件语句if(1<=M<=N<=500)中,这是因为输入格式要求1<=M<=N<=500;
然后在之前那个for循环就管它叫大for中嵌套一个条件语句若M=1,则把2赋给M(这是因为1不是素数,我就主动跳过1);
接着我是这么想的,题目让我判断M到N的所有素数,于是我就写一个小循环嵌套在大for循环中来判断x是不是素数,并且在小循环前,在条件语句if(M==1)后先自己定义变量sb并把值1赋给它,用来假定它是素数,如果x%i==(i为从2开始到x/2的数),就把0赋给sb,并断开这个小循环;
倒数第二就是再写一个条件语句放在小for后面将其和之前定义的sb配合起来使用,里面用count++;与sum=sum+x;来计算素数个数与素数的和;
最后输出count与sum;结束。
编程代码:
#include<stdio.h> int main() { int M=0,N=0; int sum=0,count=0; int i=0,x=0; scanf("%d %d",&M,&N); if(1<=M<=N<=500){ if(M==1){ M=2; } for(x=M;x<=N;x++){ int sb=1; for(i=2;i<=x/2;i++){ if(x%i==0){ sb=0; break; } } if(sb==1){ count++; sum=sum+x; } } } printf("%d %d",count,sum); return 0; }
流程图:
调试过程:
第一遍把代码敲好了以后,出现了这种情况,输出素数个数对,但是和错了,怀疑是判断错素数了
一番调试后,发现是素数判断错了,如图下(具体是else判断错误,然后把1赋给sb)
于是我又进行修改,修改判断素数的小for循环,但是这次又多了一个毛病,1不是素数,程序也判断1为素数,
其他的没毛病
多增加了一个条件语句,如果M=1,就把2赋给M(调试成功)
总结:
上次写博客园到这次,之间初步认识了循环,然后有点入门,到现在老师给的题目基本上一给脑袋就有思路,然后就能敲出代码,但是会有小瑕疵,程序经常会漏东西,然后答案经常离正确答案差一点,应该就是逻辑思维能力还有算法的问题,自己把老师上课教的都能都应用,但是有一些理论的东西还是没有学好,给同学讲题的时候,就会出现专业术语,还有表露不清晰 。
接下来我应该看点理论书,还是多看看翁凯老师的慕课。
遇到困难基本上都是先自己琢磨,然后把自己整废了,再去上网搜或是和同学讨论,向别人请教。
循环很好用,也很难。这次又多学了函数,学到的越多越感觉自己和别人的差距越大。
点评博客:
https://www.cnblogs.com/zduangduang/p/10022227.html