第三次作业

博客链接: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】

                   https://www.cnblogs.com/wafx/p/9998306.html【作者:jornor】

                      https://www.cnblogs.com/xiaofengqaq/p/9959905.html【作者:十魇】

posted @ 2018-11-21 20:20  李浩正  阅读(373)  评论(19编辑  收藏  举报