C语言程序设计第六次作业--循环结构(2)

(一)改错题

序列求和:输入一个正实数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%2
0满足条件进行下一个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

posted @ 2017-11-19 21:49  善感👄  阅读(437)  评论(1编辑  收藏  举报