标签:习惯性 htm amp ges 随机数 turn lag mat 解决办法
(一)改错题
错误信息(1):
错误原因:用do while循环语句在while后面要加分号,这个语句特殊需牢记
改正方法:在while后面加上分号
错误信息(2):
错误原因:item = 1/ n;次语句中n定义为整型,所以1/n不会出现小数
改正方法:把 item = 1/ n; 改为 item = (double)1/ n;
错误信息(3):
错误原因: }while( item < eps);此语句错误;因为该循环语句中的循环条件是当 item < esp 条件满足是输出,而源代码中误解为item > esp时输出
改正方法:把}while( item < eps);改为}while( item > eps);
错误信息(4):
错误原因:题干中要求把最后一项小于eps的那一项也加上
改正方法:在循环语句结束后输出语句前加上该语句s = s + flag * item;
错误信息(5):
错误原因: double变量的输入引号内,如果是小数,输出用%f,而输入用%lf
改正方法:把 scanf("%f",&eps);语句改为 scanf("%lf",&eps);
(二)学习总结
1.语句while(1)和for(;;)是什么意思?,如何保证这种循环能正常执行?
答:都是无限循环;在循环语句中if语句后面加上break;就可以正常跳出,从而正常执行了
2.一般情况下,设计循环结构时,使用for、while、do while三种语句都可以,并且三种语句可以相互转换,但是,在某些特定情况下,我们应该优先选择某种语句来快速实现循环设计。如果有如下情况:
(1)循环次数已知
(2)循环次数未知,但循环条件在进入循环时明确
(3)循环次数未知,且循环条件在进入循环时未知,需要在循环体中明确
针对上面三种情况,分别采用什么循环语句实现比较好?对每种情况,用我们完成的两次循环结构作业中的题目加以说明。
答:(1)循环次数已知使用for循环语句实现比较好
(2)循环次数未知,但循环条件在进入循环时明确使用while循环语句实现比较好
(3)循环次数未知,且循环条件在进入循环时未知,需要在循环体中明确使用do while循环语句实现比较好
①用for的循环结构来写。例如:
循环结构(1)中 7-2 统计学生平均成绩与及格人数, 7-3 奇偶分家 7-8 找出最小值,给出7-3的源程序:
#include <stdio.h>
int main(void)
{
int N,i,n,a = 0,b = 0;
scanf("%d",&n);
for(i = 0;i < n;i++)
{
scanf("%d",&N);
if(N % 2 == 0)
{
a++;
}
else
{
b++;
}
}
printf("%d %d",b,a);
return 0;
}
②可以用while和do while的循环结构来写。例如:循环结构(2)中 7-5爬动的蠕虫,循环结构(1)中 7-4 到底是不是太胖了 给出7-5的源程序:
#include <stdio.h>
int main(void)
{
int N,U,D,head=1,time=0;
scanf("%d %d %d",&N,&U,&D);
while(1)
{
head+=U;
time++;
if(head>N)break;
head-=D;
time++;
}
printf("%d",time);
return 0;
}
③可以用do while的循环结构来写。例如:循环结构(2)中 7-1 求给定精度的简单交错序列部分和 7-3 求奇数和,给出7-3的源程序:
#include <stdio.h>
int main()
{
int n = 0, sum = 0;
do
{
scanf("%d", &n);
if (n % 2 == 1)
sum += n;
} while (n > 0);
printf("%d\n", sum);
return 0;
}
3.有如下问题:输入一批学生成绩,以-1作为结束,计算学生的平均成绩。
要求分别用for语句、while语句、do while语句三种循环语句实现,并说明你认为哪种形式更合适?
答:while好些。结束条件直接写在括号里就行,而且一上来就可以结束
4.运行下面程序,输入1到10,结果分别是什么?为什么?
(1)
(2)
答:这俩个源程序看上去基本一样,但是不同的地方就是第一个用的是break,而第二个用的是continue。结果一个输出1,一个输出25,因为第一个就执行一次s=s+n,而s为0,n为1,当第一次输入1的时候就直接跳出循环就进行s=s+n,所以最后输出1;而第二个流程图用continue俩控制循环条件,他进行判断后不会跳出而是直接进行下一个,并且把能整除2的数过滤掉,所以最后输出的是25。
(三)实验总结
(1) 题目
7-1 求给定精度的简单交错序列部分和
(2) 流程图
(3)源代码
#include <stdio.h>
#include <math.h>
int main(){
int i=1,k=1;
double sum=0,t,n;
scanf("%lf",&n);
do{
t=k*1.0/(3*i-2);
sum+=t;
k=-k;
i++;
}while(fabs(t)>n);
printf("sum = %f\n", sum);
return 0;
}
(4)实验分析
问题1:答案错误,输入0.02经常不对
原因:循环判断条件出问题
解决办法:fabs(t)>n,不是>=
(5)本题PTA提交列表
(1) 题目:
7-2 猜数字游戏
(2) 流程图
(3) 源代码
#include <stdio.h>
int main(void) {
int number, n;
int count = 0;
int value;
scanf("%d%d", &number, &n);
while(count <= n) {
scanf("%d", &value);
if(value < 0) {
printf("Game Over\n");
break;
}
++count;
if(value > number)
printf("Too big\n");
else if(value < number)
printf("Too small\n");
else {
if(count == 1)
printf("Bingo!\n");
else if(count <= 3)
printf("Lucky You!\n");
else if(count <= n)
printf("Good Guess!\n");
break;
}
}
if(count > n)
printf("Game Over\n");
return 0;
}
(4) 实验分析
错误信息:一开始输入产生随机数,用了数学函数rand(),但是结果输出错误。
原因:理解题意错误,不用函数就可以,直接输入俩个数再进行循环就可以。
需要注意的:循环结束可以用break来实现。在本题需要定义一个量flag=0,如果后面的跟前面所定义的相等就判断为真,如果不相等就判断为假,并且在break的条件下进行跳出进行下一步的运算。
(5)本题PTA提交列表
(1) 题目
7-3 求奇数和
(2) 流程图
(3)源代码
# include <stdio.h>
int main()
{
int x,sum = 0;
do
{
scanf("%d",&x);
if(x%2)
{
sum = sum + x;
}
}while(x > 0);
x = -x;
if(x%2)
{
sum = sum + x;
printf("%d",sum);
}
else
{
sum = sum;
printf("%d",sum);
}
return 0;
}
(4)实验分析
问题1:答案错误
原因:if里判断条件习惯性写得shu*1.0/2!=0
解决办法:改成shu%2!=0
(5)本题PTA提交列表
(四)博客互评
(1)http://www.cnblogs.com/bilililili/p/7842022.html
(2)http://www.cnblogs.com/wsd-lian/p/7860213.html
(3)http://www.cnblogs.com/zxh980818/p/7842242.html
标签:习惯性 htm amp ges 随机数 turn lag mat 解决办法
原文地址:http://www.cnblogs.com/longv587/p/7858221.html