C语言程序设计第六次作业--循环结构(2)
(一)改错题
序列求和:输入一个正实数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)的更多相关文章
- C语言程序设计第六次作业——循环结构(2)
C语言程序设计第六次作业--循环结构(2) 之前的博客园图片没处理好,对大家说一声抱歉.希望大家能够多多指出我的错误,我来认真修改 ^ - ^ !. (1)改错题 序列求和:输入一个正实数eps,计算 ...
- C语言程序设计第六次作业--循环结构2
(一)改错题 序列求和:输入一个正实数eps,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... ,精确到最后一项的绝对值小于eps(保留6位小数). 输入输出样例: Input e ...
- C语言程序设计第五次作业——循环结构
(一)改错题 1.题目:输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉.计算公式如下: c = 5 ...
- C语言程序设计第五次作业——循环结构(1)
一.改错题 1.题目 输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉.计算公式如下:c = 5×( ...
- C语言程序设计第五次作业--循环结构(1)
(一)改错题 输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉.计算公式如下: c = 5×(f-3 ...
- C语言程序设计第五次作业——循环结构1
(一)改错题 输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉.计算公式如下: c = 5×(f-3 ...
- C语言程序设计第六次作业
同学们,本周我们已经学完了顺序结构.选择结构和循环结构,你都理解并掌握了吗?现在就好好理理思路,做个阶段总结吧.本周的知识点总结要求大家在理解的基础上对结构化程序设计的三种基本结构做一个全面的总结. ...
- C语言程序设计第三次作业--选择结构(1)
Deadline: 2017-10-29 22:00 一.学习要点 掌握关系运算符和关系表达式 掌握如何判断两个实数相等 掌握常用数学函数的使用 掌握逻辑运算符和逻辑表达式 理解逻辑运算的短路特性 掌 ...
- C语言程序设计第四次作业--选择结构(2)
(一)改错题 输出三角形的面积和周长,输入三角形的三条边a.b.c,如果能构成一个三角形,输出面积area和周长perimeter(保留2位小数):否则,输出"These sides do ...
随机推荐
- Django REST framework+Vue 打造生鲜超市(二)
三.Models设计 3.1.项目初始化 (1)进虚拟环境下安装 django2.0.2 djangorestframework和相关依赖mark,filter pillow 图片处理 pip in ...
- SQL Server 实现递归查询
基础数据/表结构 Sql 语句 ;With cte(id,pid,TName)As ( Select id,pid,TName Union All Select B.i ...
- Python内置函数(47)——vars
英文文档: vars([object]) Return the __dict__ attribute for a module, class, instance, or any other objec ...
- SpringCloud的DataRest(一)
一.概念与定义 Spring Data Rest 基于Spring Data的repository,可以把 repository 自动输出为REST资源, 这样做的好处: 可以免去大量的 contro ...
- 两款不同应用场景的Wpf分页控件
简介 今天给大家分享两个Wpf分页控件,本篇博客主要介绍一些实现思路和使用方法,具体实现和应用代码请参考文末的Demo链接 废话不多说,先看一下效果~ (两款控件显示效果是一样的) 实现思路 一款控件 ...
- Python/零起点(一、数字及元组)
Python/零起点(一.数字及元组) int整型 int()强行转换成整型数据类型 int整型是不可变,且是不可迭代的对象 一.整型数字用二进制位数表示案例: age=7 #设定一个数字赋值给age ...
- 正则-匹配IP地址
>>> re.search(r'[aeiouAEIOU]','I love FishC.com!') 中括号里面的任意一个字符匹配成功就会返回数值 <_sre.SRE_Matc ...
- create-keyframe-animation-js实现css3动画
使用JavaScript在浏览器中动态生成CSS关键帧动画. enter(el, done) { // 设置动画帧数 let animation = { 0: { transform: `transl ...
- Linux服务器SSH无法通过DSA证书登录的解决方法
从openssh7.0开始,ssh-dss密钥被默认禁用. 修改服务器端的openssh设置重新开启 # vim /etc/sshd/sshd_config添加以下选项PubkeyAcceptedKe ...
- 使用 Docker 一步搞定 ZooKeeper 集群的搭建
背景 原来学习 ZK 时, 我是在本地搭建的伪集群, 虽然说使用起来没有什么问题, 但是总感觉部署起来有点麻烦. 刚好我发现了 ZK 已经有了 Docker 的镜像了, 于是就尝试了一下, 发现真是爽 ...