首页 > 技术文章 > 第七周作业

blueblog6 2017-11-11 11:41 原文

1,题目一:求1到100的和
1.实验代码

#include<stdio.h>
int main()
{
  int i=1 ,sum=0;
  while(i<=100){
    sum=sum+i;
    i++;
  }
  printf("sum = %d",sum);
}

2.设计思路。
第一步,写好程序基本框架。
第二步,定义两个变量i和sum,采用while循环语句,当i<=100,一直进行sum=sum+i;i++;的循环,这就可以求得1到100之间的自然数之和。
第三步,输出1到100和的值。
(1)主要描述题目算法。
(2)流程图。

3.本题调试过程碰到问题及解决办法。
这题比较简单,没问题。
4,提交记录

2,题目二:求奇数分之一序列前N项和
1.实验代码。

#include<stdio.h>
int main()
{
  int i,n;
  double sum;
  scanf("%d",&n);
  for(i=1;i<=n;i++){
    sum=sum+1.0/(2*i-1);
  }

printf("sum = %.6f",sum);
return 0;
}

2.设计思路。
第一步,写好程序基本框架。
第二步,因为题目是计算序列 1 + 1/3 + 1/5 + ... 的前N项之和,根据这类题型的经验可以推算出要用到循环语句。则要定义i,n,sum,(经验三定义),输入n的值来确定循环的次数。
第三步,采用for语句,当i<=n时,一直进行sum=sum+1.0/(2*i-1);i++;的循环。这就可以求奇数分之一序列前N项和。
第四步,按照题目要求输出sum的值。
(1)主要描述题目算法。
(2)流程图。

3.本题调试过程碰到问题及解决办法。
这题没问题。
4,提交记录

3,题目三:求交错序列前N项和
1.实验代码

#include<stdio.h>
int main()
{
  int i,n,flag=1;
  double sum;
  scanf("%d",&n);
  for(i=1;i<=n;i++){
    sum=sum+flag*i*1.0/(2*i-1);
    flag=-flag;
  }
  printf("%.3f",sum);
  return 0;
  }

2.设计思路。
(1)主要描述题目算法。
第一步,写好程序基本框架。
第二步,我看到求和题型一般都认为可能要用到循环语句,定义i,n,sum,输入n的值来确定循环的次数。
第三步,采用for语句,当i<=n时,一直进行sum=sum+1.0/(2*i-1);i++;的循环。但因为出现了正负号,则要加一个flag=1, flag=-flag这样一个转换才能保证带正负号数据轮流出现。
第四步,按照题目要求输出sum的值。
(2)流程图。

3.本题调试过程碰到问题及解决办法
<1>,一开始我没想到如何改变数列的正负号,在上课时看到了在加了一个flag,然后我就加了flag,但还是不对,如下图所示。

<2>,我一开始以为flag是字符,然后我将它改成int整数型变量,还是不对。于是我就趴在桌上好好向了一下,再仔细看看程序到底哪里出错了。我突然发现,flag如果要加入等式中,那它必须是一个数字才能使输出的结果也是一个数字。所以flag必须要付一个数据,那如果要不影响等式的结果,1是最好的选择。所以将1复制给flag,然后提交就对了。如下图所示:

4,提交记录

4,题目四: 找出最小值
1.实验代码。

#include<stdio.h>
int main(void)
{
 int n,i,l,min;
 scanf("%d",&n);
 scanf("%d",&l);
 min=l;
 for(i=1;i<n;i++)
 {
  scanf("%d",&l);
  if(min>l)
  min=l;
 } 
 printf("min = %d",min);
 return 0;
}

2.设计思路。
(1)主要描述题目算法。
第一步,写好程序基本框架。
第二步,定义i,n,sum,输入n的值来确定循环的次数。输入第一个将要比较的数据L,然后将L的值赋给min,这时min就得到了第一个初始值,。
第三步,采用for语句,当i<=n时,一直循环输入要比较的数据,如果接下来输入的L比min小,则将此时L的值赋给min,这样min就变成一个更小的值。否则,第一个L的值就是最小的,则输出的值就最小的。
第四步,将最小的值输出(按照题目要求输出min的值。)。
(2)流程图。

3.本题调试过程碰到问题及解决办法
<1>下图是我最开始的编译方式,但出现的错误是当n=1,最小值为正数时有问题。

<2>然后我改了一下,却出现了相反的错误,我就有点头晕了。

<3>然后我就又改了一下,却出现了下面的错误。

<4>我发现不仅是当n=1时的情况不对,当n>1,且min<L时,将L的值赋给min(min=L)是选出最大的min,而不是最小的min。一个小时即将过去,我有点不耐烦了,只好到网上看看了。然后找到了代码。
<5>虽然找到了代码,可我还有一点不明,如我发给老师的图所示。

<6>如题目所给的输入样例,如果n=4,则还要输入4个数据。可如正确代码所示,在输入n的下面还要输入L,那前前后后就要输入6个数据,那肯定是错误的,可答案却是正确的,我非常不理解。老师没有给我直接的答案,而是叫我先思考。突然我发现在for后面的括号里少了一个等号,也就是for(i=1;i<n;i++)中是i<n,而不是i<=n;因为我们通常都是加等号的,所以一下子没发现原因。在for语句中,如果n=4,在i<=n的情况下总共要循环6次,而在i<n的情况下要循环4次,所以正确代码一共只需输入5次代码就行。这题搞懂了。
4,提交记录

5,题目五: 统计学生平均成绩与及格人数
1.实验代码。

#include<stdio.h>
int main()
{
  int i,n,grade,count;
   double  sum,average;
  scanf("%d",&n);
  if(n!=0)
  {
  for(i=1;i<=n;i++)
  {
    scanf("%d",&grade);
    sum=sum+grade;
    if(grade>=60)
    count++;
  } 
  average=sum/n;
  printf("average = %.1f\n",average);
  printf("count = %d",count);
  }
   else if(n==0){
      printf("average = %.1f\n",0.0);
  printf("count = %d",0);
  }
 
  return 0;
}

2.设计思路。
(1)主要描述题目算法。
第一步,写好程序基本框架。
第二步,定义i,n,sum,输入n的值来确定循环的次,采用if,else if句式讨论n的值。当n不等于0时,采用for循环语句求得所有成绩总和,并得出及格人数。并根据题目要求输出average,和count的值。
第三步,当n等于0时,直接根据题目要求输出average,和count的值。
(2)流程图。

3.本题调试过程碰到问题及解决办法
<1>一开始出现的错误提示是答案错误,然后我就放在c++上用实例演算,就发现答案确实不对。如下图所示。



<2>想了三十多分钟也没弄明白自己到底哪里错了,然后就去访问互联网,突然发现自己没有对n进行讨论。当n=0时,i<=n是错误的,这就导致我为什么一直对不了了。
4,提交记录

6,我的GIT地址
https://git.coding.net/AI1452349541/H.K.2.1.git
上传截图:

本周学习总结
<1>学习内容:
1,本周学习了for循环语句。虽然它们的结构看似简单,但运用到具体题目中还是有一定难度的。当我遇到困难时,我会有不解决它不罢休的念头(我感觉我有强迫症),这就导致我效率低下,花了大量的时间却还没有解决问题。我决定改变这个毛病,先做会做的,最后再来解决难得。
<2>个人收获:
1,经过练题,我对三大循环语句有了更深的理解,做起题来不会像刚学时那么吃力。
<3>难点:
1,在for语句的应用上我觉的比较难,比如说第七周作业当中的第四题和第五题,我忽视了讨论某些变量的不同的取值情况。这又让我觉得编程是数学的应用,数学学不好,做题有困难。
<4>不明白的知识点:
暂时还没有。

点评同学:
孙美玲:http://www.cnblogs.com/sunmeiling/p/7827950.html
马宇欣:http://www.cnblogs.com/mayuxin/p/7834515.html
赵升起:http://www.cnblogs.com/boke2017boke/p/7856300.html

8,本周学习进度

这是第八周学习内容总结链接
http://www.cnblogs.com/blueblog6/p/7825449.html

推荐阅读