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);
}
(4)实验分析
问题:运行超时
原因:没有考虑结尾为0
解决办法:if条件语句中将a<0,改为a<=0
(5)本题PTA提交列表

(四)博客互评

风里你在:http://www.cnblogs.com/GX201701-/p/7828562.html
许天笑:http://www.cnblogs.com/snxtx/p/7824427.html
ShizukaiRi:http://www.cnblogs.com/Reloaded/p/7825734.html
posted @ 2017-11-15 09:23  孤寂一粒沙  阅读(427)  评论(10编辑  收藏  举报