c语言第六次作业
(一)改错题
错误信息1:
错误原因: do while的形式最后的while的后面有;
改正方法: 在while后面加一个;
错误信息2:
错误原因: 1是整形n是整形所以得数是0或1
改正方法: 把1改为1.0
错误信息3:
错误原因:%f与%lf精确度有差
改正方法:将%f改为%lf
(二)学习总结
1.语句while(1)和for(;;)是什么意思?,如何保证这种循环能正常执行?
while(1)和for(;;)表示的是无限循环,
2.一般情况下,设计循环结构时,使用for、while、do while三种语句都可以,并且三种语句可以相互转换,但是,在某些特定情况下,我们应该优先选择某种语句来快速实现循环设计。如果有如下情况:
(1)循环次数已知
(2)循环次数未知,但循环条件在进入循环时明确
(3)循环次数未知,且循环条件在进入循环时未知,需要在循环体中明确
针对上面三种情况,分别采用什么循环语句实现比较好?对每种情况,用我们完成的两次循环结构作业中的题目加以说明。
第一个应该用for循环
1>for循环:适合于循环次数是已知的。
第二个应该用while循环
2>while:适合于循环次数是未知的。
第三个应该用do while循环
3>do while:适合于循环至少执行一次的。
3.有如下问题:输入一批学生成绩,以-1作为结束,计算学生的平均成绩。
(要求分别用for语句、while语句、do while语句和无限循环四种循环语句实现,并说明你认为哪种形式更合适?)
#include <stdio.h>
int main()
{
int x,i=0;
double t,sum=0;
for(;1;)
{
scanf("%d",&x);
if(x==-1)
{
break;
}
else
{
sum=sum+x;
i++;
}
}
t=sum/i;
printf("%f",t);
}
#include <stdio.h>
int main()
{
int x,i=0;
double t,sum=0;
while(1)
{
scanf("%d",&x);
if(x==-1)
{
break;
}
else
{
sum=sum+x;
i++;
}
}
t=sum/i;
printf("%f",t);
}
#include <stdio.h>
int main()
{
int x,i=0;
double t,sum=0;
do{
scanf("%d",&x);
sum=sum+x;
i++;
}while(x!=-1);
sum=sum-x;
i=i-1;
t=sum/i;
printf("%f",t);
}
用do...while语句比较好,至少执行一次。
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:
break是执行完上边语句后直接跳出不再运行。<1>输入1时不符合if语句,执行了s=s+n,<2>输入2时运行if语句,结束语句,后面的数输入无效。所以s=1.
结果2:
continue是不执行后面的语句,直接再重新运行。<1>输入奇数时不符合if语句,执行了s=s+n,<2>偶数全部从新执行循环语句。
(三)实验总结
7-1 求给定精度的简单交错序列部分和(10 分)
(1)题目
本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一项的绝对值不大于给定精度eps。
(2)流程图
(3)源代码
#include <stdio.h>
#include<math.h>
int main()
{
int i,m,n;
double sum=0,eps,t;
n=1;
i=1;
scanf("%lf",&eps);
while(1.0/i>eps)
{
t=pow((-1),n+1);
sum=sum+1.0/i*t;
n=n+1;
i=i+3;
}
t=pow((-1),n+1);
sum=sum+1.0/i*t;
printf("sum = %.6f",sum);
}
(4)实验分析
问题1:最后输出为0.000000
原因: i是整形直接用1/i最后结果为0.
解决办法:将1改为1.0
问题2:输出结果不对
原因: 式子错误,t的正负错误。
解决办法:t=pow((-1),n);改为t=pow((-1),n+1);
(5)本题PTA提交列表
7-2 猜数字游戏(20 分)
(1)题目
猜数字游戏是令游戏机随机产生一个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 i,n=0,a,N;
scanf("%d",&i);
scanf("%d",&N);
while(n<=N)
{
scanf("%d",&a);
n=n+1;
if(a<0)
{
printf("Game Over\n");
break;
}
if(i>a)
{
printf("Too small\n");
}
else if(i<a)
{
printf("Too big\n");
}
else
{
if(n==1)
{
printf("Bingo!\n");
break;
}
else if(n>1&&n<=3)
{
printf("Lucky You!\n");
break;
}
else if(n>3&&n<=N)
{
printf("Good Guess!\n");
break;
}
else
{
printf("Game Over\n");
break;
}
}
}
}
(4)实验分析
问题:格式错误
原因: 每一个输出语句最后没有加“\n”
解决办法:输出语句中加“\n”
(5)本题PTA提交列表
7-3 求奇数和(10 分)
(1)题目
本题要求计算给定的一系列正整数中奇数的和。
(2)流程图
(3)源代码
#include <stdio.h>
int main()
{
int a,sum;
sum=0;
while(1)
{
scanf("%d",&a);
if(a<=0)
break;
if(a%2==1)
{
sum=sum+a;
}
}
printf("%d",sum);
}