首页 > 其他 > 详细

第三次作业

时间:2018-11-30 00:13:47      阅读:309      评论:0      收藏:0      [点我收藏+]

第三次作业

作业要求: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)    然后a=b    ,  接着在使用   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个字,但是让我做了一个多小时才把这个题目写出来,不断的修改)

 

编程思路:

  首先还是打出程序框架,定义变量,手动输入M,N,然后我把待会肯定会用到的循环放在条件语句if(1<=M<=N<=500)中,因为输入格式要求1<=M<=N<=500,接着我是这么想的,题目让我判断M到N的所有素数,于是我就先写一个小循环用来判断一个数是不是素数,并且在小循环前面先自己定义sb=1,假定它是素数,小循环如下(  如果这个数除以从2开始的数,都不等于0那么,就不会输出sb=0,即这个数不是素数),

for(i=2;i<=x/2;i++){
  if(x%i==0){
    sb=0;
    break;
  }
}

但是如果碰到M=1的情况那么就尴尬了,所以在小for循环内部我先写了一个条件if(M=1){M=2;}在遇到M=1的情况主动把2赋给M;接着就是在小for和遇到M=1的外面再套上一个for循环,使其将数从M开始不断判断到N,一个接一个;然后就再写一个条件语句将其和之前定义的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

第三次作业

原文:https://www.cnblogs.com/159357www/p/10003543.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!