第三次作业

第三次作业

作业要求: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

https://www.cnblogs.com/yangzhenghui/p/10022270.html

https://www.cnblogs.com/chengxu230921/p/10017973.html

posted @ 2018-11-29 23:27  梓航  阅读(567)  评论(6编辑  收藏  举报