(一)改错题

序列求和:输入一个正实数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. Linux "零拷贝" sendfile函数中文说明及实际操作

    Sendfile函数说明 #include ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count); sendfile ...

  2. LeetCode & Q26-Remove Duplicates from Sorted Array-Easy

    Descriptions: Given a sorted array, remove the duplicates in place such that each element appear onl ...

  3. B树和B+树的插入、删除图文详解

    简介:本文主要介绍了B树和B+树的插入.删除操作.写这篇博客的目的是发现没有相关博客以举例的方式详细介绍B+树的相关操作,由于自身对某些细节也感到很迷惑,通过查阅相关资料,对B+树的操作有所顿悟,写下 ...

  4. JAVA 中的 反射

    CLASS类 1) 在面向对象的世界里,万事万物皆对象. 在java中有两样东西不是面向对象 1.普通的数据类型(java中有封装类来弥补它) 2. java中静态的东西 2) 类是对象吗? 类是对象 ...

  5. Mego开发文档 - 事务

    事务 事务允许以原子方式处理多个数据库操作.如果事务已提交,则所有操作都已成功应用于数据库.如果事务回滚,则没有任何操作应用于数据库. 默认行为 默认情况下,如果数据库提供程序支持事务,则单次的提交操 ...

  6. golang微信公众号请求获取信息

    初次用golang在公众号中获取信息,记录一下 看了下文档,粗略的写了个demo,如下: func HttpGet(c*gin.Context) { var param GetType if er:= ...

  7. tar命令-vi编辑器-磁盘分区及格式化-软链接及硬链接文件

    一.tar命令 1.将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) [root@localhost  /] #  cat  /etc/passwd  /etc/group ...

  8. 如何把百度统计代码放入JS文件中?百度统计的JS脚本原理分析

    <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script&quo ...

  9. POJ-2923 Relocation---01背包+状态压缩

    题目链接: https://vjudge.net/problem/POJ-2923 题目大意: 有n个货物,给出每个货物的重量,每次用容量为c1,c2的火车运输,问最少需要运送多少次可以将货物运完 思 ...

  10. javascript获取表单的各项值

    何谓表单? 表单是html页面中负责数据采集功能的部件,它往往由三个部分组成: 表单标签:<form></form> 用于声明表单的范围,位于表单标签中的元素将被提交.属性有m ...