(一)改错题

序列求和:输入一个正实数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 从一个函数中传递值到另一个函数

    一个函数的调用大家都会用 我今天在调接口的时候突然发现需要引用个另一个函数中拿到的值 举个栗子 刚开始 我是这样调用的 alert弹出的是 hello world . 但是我a函数内部还有一个函数 画 ...

  2. VMware虚拟机,从厚置备改成精简置备,并减小硬盘的实际占用空间

    工作中由于前期规划不足,导致磁盘空间分配较大,而且是厚置备.后期不再需要时,无法把用不到的空间释放出来,造成空间浪费.经过摸索和实验验证,总结出来一套方法. 风险提示:这个方法在我的环境中验证通过了, ...

  3. elk调试环境

    http://10.110.22.30:9100/

  4. C# 文件的一些基本操作

    近期程序中经常用到一些文件的操作,现在大致整理一下. 一. 获取文件或文件夹基本信息 1.获取文件信息,组成一个DataTable信息. /// <summary> /// 获取指定目录下 ...

  5. 详解Ajax请求(一)前言——同步请求的原理

    我们知道,ajax是一种异步请求的方式,想要了解异步请求,就必须要先从同步请求说起.常见的同步请求的方式是form表单的提交,我们先从一种同步请求的示例说起. 我们希望输入姓名可以从后台得到身份证号. ...

  6. mysql 索引学习--多条件等值查询,顺序不同也能应用联合索引啦

    以前学习这一块的时候,是说:假设建立了联合索引a+b,那么查询语句也一定要是这个顺序才能应用该索引. 那么实际是怎样呢,经过mysql这么多次版本升级,相信mysql已经给我们做了某些优化. 下面是我 ...

  7. 关于CheckStyle在eclipse出现的问题

    今天在公司换了一个CheckStyle xml文件.那么我尝试直接import进去新的文件. 在我Check code的时候就爆了下面的错误 o: Failed during checkstyle c ...

  8. hdu1060 Leftmost Digit---求N的N次方的首位(对数)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1060 题目描述:求N的N次方的第一位. 思路: 第一次做这种类型的题目,学到了如何运用对数. 首先推 ...

  9. .Net中Web增加加密狗管理

    由于业务中最近需要使用到加密狗,增加对Web代码的管控,所以需要进行加密狗使用的研究 首先,对于没有接触使用过加密狗的人需要有个大致的认识,加密狗分为 MasterDog, 1.下载加密狗的开发套件, ...

  10. angularjs中的run()方法使用

    run方法用于初始化全局的数据,仅对全局作用域起作用. 举个栗子吧:<script type="text/javascript"> var m1 = angular.m ...