C语言第六次作业
(一)改错题:
源程序(有错误的程序)
#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;
}
①错误信息:
错误原因:格式错误
改正方法:在 }while( item < eps)后面加;
②错误信息:
错误原因:精度错误在double中的item不能除整数
改正方法:将1变成1.0
③错误信息:
错误原因:循环表达错误,while中成立才循环
改正方法:将while中的<改为>=
④错误信息:
错误原因:输入格式错误
改正方法:将scanf()中的%f改为%lf
(二)学习总结:
1.语句while(1)和for(;;)是什么意思?,如何保证这种循环能正常执行?
while和for都是循环语句,while相对for来说个人感觉比较简洁,没有for的条条框框,循环条件也简单只要while()中的成立时,循环就一直进行,然后就可以在循环{}中改变条件使条件不满足时跳出循环,而for的循环中就要注意循环语句是两个分号中间的才是循环语句,for语句是计制循环体,满足循环语句则循环正常进行。
2.一般情况下,设计循环结构时,使用for、while、do while三种语句都可以,并且三种语句可以相互转换,但是,在某些特定情况下,我们应该优先选择某种语句来快速实现循环设计。如果有如下情况:
(1)循环次数已知
(2)循环次数未知,但循环条件在进入循环时明确
(3)循环次数未知,且循环条件在进入循环时未知,需要在循环体中明确
针对上面三种情况,分别采用什么循环语句实现比较好?对每种情况,用我们完成的两次循环结构作业中的题目加以说明。
(1)循环次数已知:当循环次数已知时,for丶while丶do while这三种语句都是可以的,三种语句是可以互相转换。如:7-5 统计字符(15 分)
本题要求编写程序,输入10个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。就是典型的循环次数已知,在这种情况下,三种语句是可以相互转换的。
(2)循环次数未知,但循环条件在进入循环时明确:当这种情况是,是在循环条件明确下,三种都可以使用,但是通常都是同for和while来进行编写,如:7-1 求奇数分之一序列前N项和(10 分)本题要求编写程序,计算序列 1 + 1/3 + 1/5 + ... 的前N项之和。这种就是循环条件明确,循环条件就是输入N以N来进行循环。
(3)循环次数未知,且循环条件在进入循环时未知,需要在循环体中明确:在这种情况下就是只能用do while来进行循环,如:7-2 猜数字游戏(20 分)
猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。这个题就是典型的先执行后判断的题。
3.有如下问题:输入一批学生成绩,以-1作为结束,计算学生的平均成绩。
要求分别用for语句、while语句、do while语句三种循环语句实现,并说明你认为哪种形式更合适?
我认为输入一批学生成绩未知学生人数,无法确定循环次数,而且循环结束语句是以-1结束在只种情况下,do while更合适,因为do while和while都是无限循环,而在我的个人的习惯是比较喜欢do while,在do while的语句中,插入if语句进行判断,先进行if(变量==-1)判断,当判断成立时,进行break;结束循环输出学生的平均成绩。
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;
}
执行结果:
当输入1~10时,单次循环中,if语句判断的是,当输入数字是偶数时,break是结束循环,程序是输入奇数时进行加和,输入偶数时,结束循环。
(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时,continue是跳出循环,当输入数字是奇数时,进行加和,当输入数字是偶数时,跳出循环,总体程序是将输入的奇数数字进行加和。
前面程序基本相同,而break和continue的不同导致程序结果不同。break是结束循环,continue是跳出单次循环。
(三)实验总结:
(1)题目:7-1 求给定精度的简单交错序列部分和(10 分)
本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一项的绝对值不大于给定精度eps。
(2)流程图:
(3)源代码:
#include<stdio.h>
#include<math.h>
int main()
{
int n = 1;
double eps,a = 1.0,S = 1.0,sum = 0.0;
scanf("%lf",&eps);
do
{
a = 1.0 / (S* pow(-1,n+1));
S = S + 3 ;
sum = sum + a;
n++;
}
while(fabs(a) > eps);
printf("sum = %lf",sum);
return 0;
}
(4)实验分析:
问题1:精度输出问题
原因:精度导致循环提前结束,输出结果不对。
改正方法:查看精度临界差值,
(5)本题PTA提交列表:
(1)题目:
7-2 猜数字游戏(20 分)
猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。
(2)流程图:
(3)源代码:
#include<stdio.h>
int main()
{
int M,N,n = 0,math;
scanf("%d%d",&M,&N);
do
{
n++;
scanf("%d",&math);
if(math<0)
{
printf("Game Over");
break;
}
else if(n>N)
{
printf("Game Over");
break;
}
else if(math==M)
{
if(n==1)
{
printf("Bingo!");
break;
}
else if(n==2||n==3)
{
printf("Lucky You!");
break;
}
else
{
printf("Good Guess!");
break;
}
}
else if(math<M)
{
printf("Too small\n");
}
else if(math>M)
{
printf("Too big\n");
}
}
while(1);
return 0;
}
(4)实验分析:
问题2:多重语句的套构
原因:不同语句的顺序问题导致输出问题
改正方法:多次尝试改正顺序
(5)本题PTA提交列表:
(1)题目:
7-3 求奇数和(10 分)
本题要求计算给定的一系列正整数中奇数的和。
(3)源代码:
#include<stdio.h>
int main()
{
int sum=0,n;
do
{
scanf("%d",&n);
if(n<=0)
{
break;
}
else if(n%2!=0)
{
sum=sum+n;
}
}
while(1);
printf("%d",sum);
return 0;
}
(4)实验分析:
本题无问题。
(5)本题PTA提交列表:
博客互评:
李晓晓:
http://www.cnblogs.com/Reloaded/p/7825734.html
许天笑:
http://www.cnblogs.com/snxtx/p/7824427.html
郭展旭:
http://www.cnblogs.com/1234569ss/p/7824423.html