(一)改错题

序列求和:输入一个正实数eps,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... ,精确到最后一项的绝对值小于eps(保留6位小数)。

  输入输出样例:

  Input eps:1E-4

  s = 0.835699

  

源程序(有错误的程序)

#include<stdio.h>
int main()
{
int flag,n;
double eps,item,s; printf("Input eps: ");
scanf("%f",&eps);
flag = 1;
s = 0;
n = 1;
do{
item = 1/ n;
s = s + flag * item;
flag = -flag;
n = n + 3;
}while( item < eps)
printf( "s = %f\n",s); return 0;
}

错误1:





错误原因:

此程序运用的do...while的格式,在这个格式的情况下while括号后面的条件之后+“;”结束

改正方法:

在17行最后加上一个分号。

错误2:

错误原因:

esp定义的时double类型,再输入时应该是%lf

改正方法:

把%f改成%lf

错误3:



错误原因:

输出结果错误,跟题目不符合。应该输出  s = 0.835699。经过检查发现在



整数除整数还是整数,把1改成1.0结果为double类型的

改正方法:

把1/n改成1.0/n。

错误4:



错误原因:

改正后发现还是不对。经检查发现题目说是



而代码中却是



改正方法:

把18行语句

改成



因为使用了数学函数,所以要在标题上面加上#include<math.h>

改完上述问题后最后得出正确代码及结果:

 #include<stdio.h>
#include<math.h>
int main()
{
int flag,n;
double eps,item,s; printf("Input eps: ");
scanf("%lf",&eps);
flag = 1;
s = 0;
n = 1;
do{
item = 1.0/ n;
s = s + flag * item;
flag = -flag;
n = n + 3;
}while( fabs(item) >= eps);
printf( "s = %f\n",s); return 0;
}



结果正确。

(二)学习总结

1.语句while(1)和for(;;)是什么意思?,如何保证这种循环能正常执行?

解:都是无限循环的意思,while(1)的意思:1就是真(条件成立),0就是假(条件不成立),while(1) 永远都是真,如果内部没有跳出语句,那就是个死循环。

for(;;)的意思:for后的圆括号中,第一个分号前的内容是执行第一次循环前执行的,第二个分号前的内容是每次执行前都要判断的(如果该处表达式的值为真,那么执行循环体,如果为假,那么就跳出循环体),第二个分号后的内容是每执行完一次循环体后执行的 。这里中间没有限制条件(第2个分号前)(有限制条件也要该条件必然会变成真,循环才会停止),所以不会停。另一种停止的方法在循环体中使用break跳出循环体。

2.一般情况下,设计循环结构时,使用for、while、do while三种语句都可以,并且三种语句可以相互转换,但是,在某些特定情况下,我们应该优先选择某种语句来快速实现循环设计。如果有如下情况:

(1)循环次数已知

(2)循环次数未知,但循环条件在进入循环时明确

(3)循环次数未知,且循环条件在进入循环时未知,需要在循环体中明确

针对上面三种情况,分别采用什么循环语句实现比较好?对每种情况,用我们完成的两次循环结构作业中的题目加以说明。

解:(1)循环次数已知

已知循环次数用for语句来执行

循环(1)7-2 统计学生平均成绩与及格人数

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

(2)循环次数未知,但循环条件在进入循环时明确

用whlie语句

比如在第二次循环中的7-1 求给定精度的简单交错序列部分和

# include<stdio.h>
# include<math.h>
int main()
{
int n;
double eps,flag,S;
n=1,S=0,flag=1;
scanf("%lf",&eps);
while(1)
{
S=S+flag/n; if(fabs(flag/n)<=eps)
break;
n+=3;
flag=-flag;
}
printf("sum = %.6f",S); return 0;
}

(3)循环次数未知,且循环条件在进入循环时未知,需要在循环体中明确

用do while语句,比如用do while语句。

比如第二次循环中的7-5 爬动的蠕虫

#include<stdio.h>
#include<math.h>
int main()
{
int N,U,D,pra,time;
pra=0;
time=0;
scanf("%d%d%d",&N,&U,&D); do{
pra=pra+U;
time++;
if(pra>=N)
{
printf("%d",time);
break;
}
pra=pra-D;
time++;
if(pra>=N)
{
printf("%d",time);
break;
}
}while(pra<N); return 0; }

3.有如下问题:输入一批学生成绩,以-1作为结束,计算学生的平均成绩。

要求分别用for语句、while语句、do while语句三种循环语句实现,并说明你认为哪种形式更合适?

解:

for语句:

#include<stdio.h>
#include<math.h>
int main ()
{
int s,i,n;
double gra,ave;
s=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%lf",&gra);
if(gra!=-1)
{
s=s+gra;
}
else
{ break;
} }
ave=(double)s/n;
printf("%f",ave);
return 0 ;
}

while语句:

#include<stdio.h>
#include<math.h>
int main ()
{
int peo,n;
double ave,gra;
gra=0;
peo=0;
while(1)
{
scanf("%d",&n);
if(n==-1)
{
break;
}
else
{
gra=gra+n;
peo++;
}
}
ave=(double)gra/peo;
printf("%f",ave);
return 0 ;
}

do while 语句:

#include<stdio.h>
#include<math.h>
int main ()
{
int peo,sum;
double ave,gra;
sum=0;
scanf("%d",&peo);
do
{
scanf("%lf",&gra);
sum=sum+gra; }while(gra!=-1);
ave=(double)sum/peo;
printf("%f",ave);
return 0 ; }

4.运行下面程序,输入1到10,结果分别是什么?为什么?

(1)

#include<stdio.h>
int main()
{
int n,s,i;
s = 0;
for(i = 1; i <= 10; i++)
{
scanf("%d",&n);
if(n % 2 == 0)
break;
s = s + n;
}
printf("s = %d\n",s);
return 0;
}

(2)

#include<stdio.h>
int main()
{
int n,s,i;
s = 0;
for(i = 1; i <= 10; i++)
{
scanf("%d",&n);
if(n % 2 == 0)
continue;
s = s + n;
}
printf("s = %d\n",s);
return 0;
}

解:

分别输入1到10(1)结果为



(2)结果为



因为(1)代码中第一个是1,输入1在执行条件判断时1%2不等于0往下执行,当输入第二个值时为2 2%20满足条件进行下一个break语句,跳出循环,直接输出s的值,此时该值为1

(2)代码

代码中第一个是1,输入1在执行条件判断时1%2不等于0往下执行,当输入第二个值时为2 2%20满足条件进行下一个continue语句,这时跳过s=s+n这个语句,但是仍然进行着循环语句,也就是说不加偶数让奇数相加。当循环语句结束时输出的s的值,此时s=25。

(三)实验总结

1、题目

7-1 求给定精度的简单交错序列部分和

2、流程图

3、源代码

# include<stdio.h>
# include<math.h>
int main()
{
int n;
double eps,flag,S;
n=1,S=0,flag=1;
scanf("%lf",&eps);
while(1)
{
S=S+flag/n; if(fabs(flag/n)<=eps)
break;
n+=3;
flag=-flag;
}
printf("sum = %.6f",S); return 0;
}



4、实验分析

问题1:





原因:

没有给初始值,相当于前面没有定义,寻找不到结果。

解决办法:

在循环钱=前先给定初始值。

5、pta提交结果



1、题目

7-2 猜数字游戏

2、流程图



3、源代码

#include<stdio.h>
#include<math.h>
int main (void)
{
int random,N,i,guess;
scanf("%d%d\n",&random,&N);
i=1;
while(1)
{
scanf("%d\n",&guess);
if(guess<0)
{
printf("Game Over");
break;
}
else
{
if(guess==random)
{
if(i==1)
{
printf("Bingo!\n");
break;
}
else if (i<=3)
{
printf("Lucky You!\n");
break;
}
else if (i>3&&i<=N)
{
printf("Good Guess!\n");
break;
} }
else if(guess>random&&i<=N)
{
printf("Too big\n");
}
else if(guess<random&&i<=N)
{
printf("Too small\n"); }
else if (i>N)
{
printf("Game Over");
break;
}
i++; } } return 0 ;
}



4、实验分析

问题:

在使用raptor时定义一个变量时如果字母多了就不能定义了

原因:

不太清楚,查找了资料也没有具体地指出说明。

解决办法:

就比如random我就简写成了ran,guess同理。

5、pta提交列表

1、题目

7-3 求奇数和

2、流程图

3、源代码

#include<stdio.h>
#include<math.h>
int main ()
{
int a,sum;
sum=0;
while(1)
{
scanf("%d",&a);
if(a<=0)
{
sum=sum;
printf("%d",sum);
break;
}
else
{
if(a%2!=0)
{
sum=sum+a;
}
else
{
sum=sum;
}
}
}
return 0 ;
}



4、实验分析

问题:

运行不出结果,多种错误。

原因:

因为该题不知道最后的次数,不知道运行多少次,不应该使用for语句,一开始没有考虑使用了for语句。

改正:

把for语句改成了while(1)死循环的会简单很多。

5、pta提交结果



(四)博客互评

1、范凯华http://www.cnblogs.com/fkh1/p/7845653.html

2、田彩http://www.cnblogs.com/english123-/p/7853709.html

3、赵星蕊http://www.cnblogs.com/karry-5201314/p/7846648.html

C语言程序设计第六次作业--循环结构(2)的更多相关文章

  1. C语言程序设计第六次作业——循环结构(2)

    C语言程序设计第六次作业--循环结构(2) 之前的博客园图片没处理好,对大家说一声抱歉.希望大家能够多多指出我的错误,我来认真修改 ^ - ^ !. (1)改错题 序列求和:输入一个正实数eps,计算 ...

  2. C语言程序设计第六次作业--循环结构2

    (一)改错题 序列求和:输入一个正实数eps,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... ,精确到最后一项的绝对值小于eps(保留6位小数). 输入输出样例: Input e ...

  3. C语言程序设计第五次作业——循环结构

    (一)改错题 1.题目:输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉.计算公式如下: c = 5 ...

  4. C语言程序设计第五次作业——循环结构(1)

    一.改错题 1.题目 输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉.计算公式如下:c = 5×( ...

  5. C语言程序设计第五次作业--循环结构(1)

    (一)改错题 输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉.计算公式如下: c = 5×(f-3 ...

  6. C语言程序设计第五次作业——循环结构1

    (一)改错题 输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉.计算公式如下: c = 5×(f-3 ...

  7. C语言程序设计第六次作业

    同学们,本周我们已经学完了顺序结构.选择结构和循环结构,你都理解并掌握了吗?现在就好好理理思路,做个阶段总结吧.本周的知识点总结要求大家在理解的基础上对结构化程序设计的三种基本结构做一个全面的总结. ...

  8. C语言程序设计第三次作业--选择结构(1)

    Deadline: 2017-10-29 22:00 一.学习要点 掌握关系运算符和关系表达式 掌握如何判断两个实数相等 掌握常用数学函数的使用 掌握逻辑运算符和逻辑表达式 理解逻辑运算的短路特性 掌 ...

  9. C语言程序设计第四次作业--选择结构(2)

    (一)改错题 输出三角形的面积和周长,输入三角形的三条边a.b.c,如果能构成一个三角形,输出面积area和周长perimeter(保留2位小数):否则,输出"These sides do ...

随机推荐

  1. js前端对后台数据的获取,如果是汉字则需要添上引号

    js前端对后台数据的获取,如果是汉字则需要添上引号

  2. Mego开发文档 - 快速开始

    Mego 快速开始 我们将创建一个简单的数据新增及查询来演示 Mego 的使用过程.演示中都是使用 Visual Studio 2017 作为开发工具,SQL Server 2012 作为数据库. 创 ...

  3. Mego开发文档 - 基本保存操作

    基本保存操作 在Mego中没有更改跟踪,也就是说所有的新增.更新及删除都需要开发者自行判断.Mego会最为实际的将各个数据操作提交给数据库并执行. 添加数据 using (var db = new O ...

  4. 新概念英语(1-a)句子集锦

  5. Python基础数据类型之集合以及其他和深浅copy

    一.基础数据类型汇总补充 list  在循环一个列表时,最好不要删除列表中的元素,这样会使索引发生改变,从而报错(可以从后向前循环删除,这样不会改变未删元素的索引). 错误示范: lis = [,,, ...

  6. python之路1

    python之路 http协议 html HTML2 CSS选择器 CSS属性操作 CSS属性操作/下 JavaScript(js)/上 JavaScript的对象 JavaScript的对象/下 前 ...

  7. 生成器以及yield语句

    生成器以及yield语句最初的引入是为了让程序员可以更简单的编写用来产生值的序列的代码. 以前,要实现类似随机数生成器的东西,需要实现一个类或者一个模块,在生成数据的同时 保持对每次调用之间状态的跟踪 ...

  8. IdentityServer4-介绍大纲(译文)

    简介 IdentityServer4是一个基于ASP.NET CORE2使用OAuth2.0协议和OpenID Connect的框架 特性如下: Authentiaction作为一个Service 集 ...

  9. Java集合框架之四大接口、常用实现类

    Java集合框架 <Java集合框架的四大接口> Collection:存储无序的.不唯一的数据:其下有List和Set两大接口. List:存储有序的.不唯一的数据: Set:存储无序的 ...

  10. bootstrap——bootstrap-table(1)

    前言: 特地纪念一下,自己参加这份工作刚好满一年.依旧乐在其中 言归正传:之前小接触过bootstrap,只是之后用得少了就生疏了,恰好现在的工作使用到了它,就再拿出来认真研究一下. 过程: 一直以来 ...