您的位置:首页 > 其它

第七周作业

2017-11-11 11:41 253 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: