代码改变世界

C语言程序设计第五次作业——循环结构(1)

2017-11-12 14:56  李志伟  阅读(1149)  评论(1编辑  收藏  举报

(一)改错题

输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉。计算公式如下:
c = 5×(f-32)/9
其中,c表示摄氏温度,f表示华氏温度。
输入输出样例1:
  Enter lower:32
  Enter upper:35
  fahr celsius
  32 0.0
  34 1.1
输入输出样例2:
  Enter lower:40
  Enter upper:30
  fahr celsius
源程序(有错误的程序)

#include <stdio.h>
int main(void)
{    
    int fahr , lower, upper;  /* fahr表示华氏度 */
    double celsius;        /* celsius表示摄氏度 */ 

    printf("Enter lower:");
    scanf("%d",&lower);
    printf("Enter upper:");
    scanf("%d",&upper);
    printf("fahr  celsius\n");             /* 显示表头 */
    /* 温度转换 */
    for (fahr = lower , fahr <= upper, fahr ++) ;
        celsius = 5 /9 * (fahr - 32.0); 
        printf("%3.0f %6.1f\n", fahr, celsius); 

   return 0; 
}

错误信息1:

错误原因:for后面多加了分号。
改正方法:去掉for后面的分号。、
错误信息2:

错误原因:for后面括号中的逗号使用错误。
改正方法:将for后面括号里的逗号改成分号。
错误信息3:

错误原因:fahr定义的为整形,而输出的为浮点型,celsius输出格式错误。
改正方法:将fahr的输出符号改成%d,将celsius的输出符号改成%.1f。
错误信息4:

错误原因:celsius定义的为double型,而for后面的celsius为整形。
改正方法:将for后面的celsius转换为double型。
错误信息5:

错误原因:for的循环语句没有加大括号。
改正方法:将for的循环语句加上大括号。
错误信息6:

错误原因:题目中fahr每次增加2,而此程序中fahr每次只增加1.
改正方法:将for后面的fahr++改成fahr=fahr+2.
(二)学习总结

1.有如下程序:

#include <stdio.h>
int main()
{    
int i,num,odd,even;
odd = 0;
even = 0;    
for(i = 1; i <= 10;i++)
{
    scanf("%d",&num);
    if(num % 2 == 0)
    {
        even++;
    }
    else
    {
        odd++;
    }       
}   
printf("%d %d",even,odd);

return 0;
}

详细描述程序的执行过程,即说明程序的每一步是执行的哪条代码,执行顺序如何。循环需描述前两次循环和最后一次循环的详细执行过程。最后说明程序实现的功能是什么。
(1)录入odd=0,even=0.
(2)录入i=1.
(3)i<=10成立。
(4)输入num。
(5)如果num%20则even的值加1,否则odd的值加1.
(6)然后执行i++,即i=2.
(7)然后执行i<=10此时成立。
(8)输入num。
(9)如果num%2
0则even的值加1,否则odd的值加1.
.
.
.
(10)当i++后i=10,判断i<=10成立。
(11)输入num。
(12)如果num%2==0则even的值加1,否则odd的值加1.
(13)执行i++,即此时i=11.
(14)执行i<=10,不成立,跳出循环。
(15)输出 even odd的值。
功能:输入10个整数,判断输入的奇数和偶数的个数。
2.增量运算符
(1)运行下面程序,结果是什么?增量运算符在单独使用时,前缀和后缀形式有区别吗?

#include <stdio.h>
int main()
{    
int i,j;
i = 2;
j = 2;
i++;
++j;
printf("i = %d\n",i);
printf("j = %d\n",j);   
return 0; 
}

结果:

增量运算符在单独使用时,前缀和后缀形式没有区别。
(2)运行下面的程序,结果是什么?两条输出语句的执行过程是怎样的?说明什么问题?这两条输出语句执行完后,i和j的值分别是多少?

#include <stdio.h>
int main()
{    
int i,j;
i = 2;
j = 2;  
printf("%d\n",i++);
printf("%d\n",++j);     
return 0; 
}

1>结果:

2>两条输出语句的执行过程是怎样的?
答:第一条输出语句是先输出后执行加1,第二条语句是先执行加1再输出。
3>说明什么问题?
答:在输出的语句中前缀和后缀是有区别的。
4>这两条输出语句执行完后,i和j的值分别是多少?
答;i和j的值均为3.
3.有些循环语句后面有{},有些没有,有些语句有缩进,运行下面的四个小程序,运行结果有什么不同?循环体的认定与缩格形式是否有关?与{}是否有关?那么,应该如何正确判断一个循环语句中的循环体?下面的程序中,哪几种格式是正确的缩进格式。
(1)

#include <stdio.h>
int main()
{    
int i;
for(i = 1;i <= 5;i++)
    printf("*");
printf("\n");   
return 0; 
}

运行结果:

(2)

#include <stdio.h>
int main()
{    
int i;
for(i = 1;i <= 5;i++)
    printf("*");
    printf("\n");   
return 0; 
}

运行结果:

(3)

#include <stdio.h>
int main()
{    
int i;
for(i = 1;i <= 5;i++)
{
    printf("*");
    printf("\n");
}
return 0; 
}

运行结果:

(4)

#include <stdio.h>
int main()
{    
int i;
for(i = 1;i <= 5;i++)
{
    printf("*");
} 
printf("\n");
return 0; 
}

运行结果:

1>循环体的认定与缩格形式是无关。
2>循环体的认定与{}有关。
3>判断一个循环语句中的循环体找大括号中的语句。
4.对其他你认为需要进行总结的内容进行总结。
for后面括号里用分号而不是用逗号;循环语句应放在大括号内;在输入输出各种变量时要明确是int型还是double型。
(三)实验总结
1.统计学生平均成绩与及格人数(10 分)
(1)题目
本题要求编写程序,计算学生们的平均成绩,并统计及格(成绩不低于60分)的人数。题目保证输入与输出均在整型范围内。
输入格式:
输入在第一行中给出非负整数N,即学生人数。第二行给出N个非负整数,即这N位学生的成绩,其间以空格分隔。
输出格式:
按照以下格式输出:
average = 成绩均值
count = 及格人数
其中平均值精确到小数点后一位。
输入样例:
5
77 54 92 73 60
输出样例:
average = 71.2
count = 4
(2)流程图

(3)源代码

# include<stdio.h>
int main()
{
int N,grade,sum,count,i;
double average;
sum = 0;
count = 0;
i = 1;
scanf("%d",&N);
if(N != 0)
{
	for(i = 1;i <= N;i++)
	{
		scanf("%d",&grade);
		sum = sum + grade;
		if(grade >= 60)
		{
			count = count + 1;
		}
	}
	average = (double)sum/N;
	printf("average = %.1f\n",average);
	printf("count = %d",count);	
}
else
{
	printf("average = 0.0\n");
	printf("count = 0");
}

return 0;
}

(4)实验分析
问题1:当输入N的值为0时,运行结果错误。
原因:没有加入判读语句。
解决办法:加入if语句,当N不等于0时在执行循环语句。
(5)本题PTA提交列表

2.到底是不是太胖了(10 分)
(1)题目
据说一个人的标准体重应该是其身高(单位:厘米)减去100、再乘以0.9所得到的公斤数。真实体重与标准体重误差在10%以内都是完美身材(即 | 真实体重 − 标准体重 | < 标准体重×10%)。已知市斤是公斤的两倍。现给定一群人的身高和实际体重,请你告诉他们是否太胖或太瘦了。
输入格式:
输入第一行给出一个正整数N(≤ 20)。随后N行,每行给出两个整数,分别是一个人的身高H(120 < H < 200;单位:厘米)和真实体重W(50 < W ≤ 300;单位:市斤),其间以空格分隔。
输出格式:
为每个人输出一行结论:如果是完美身材,输出You are wan mei!;如果太胖了,输出You are tai pang le!;否则输出You are tai shou le!。
输入样例:
3
169 136
150 81
178 155
输出样例:
You are wan mei!
You are tai shou le!
You are tai pang le!
(2)流程图

(3)源代码

# include<stdio.h>
# include<math.h>
int main()
{
int N,H,i,W;
double E,SW;
scanf("%d",&N);
for(i = 1;i <= N;i++)
{
	scanf("%d %d",&H,&W);
	SW = (H -100) * 0.9*2;
	if(fabs(W - SW) < SW *0.1)
	{
		printf("You are wan mei!\n");
	}
	else if(W > SW)
	{
		printf("You are tai pang le!\n");
	}
	else
	{
		printf("You are tai shou le!\n");
	}
}

return 0;
}

(4)实验分析
问题1:输出结果一支不对。
原因:太胖和太瘦的取值范围错误。
解决办法:查找资料。
(5)本题PTA提交列表

3.统计学生成绩(10 分)
(1)题目
本题要求编写程序读入N个学生的百分制成绩,统计五分制成绩的分布。百分制成绩到五分制成绩的转换规则:
• 大于等于90分为A;
• 小于90且大于等于80为B;
• 小于80且大于等于70为C;
• 小于70且大于等于60为D;
• 小于60为E。
输入格式:
输入在第一行中给出一个正整数N(≤1000),即学生人数;第二行中给出N个学生的百分制成绩,其间以空格分隔。
输出格式:
在一行中输出A、B、C、D、E对应的五分制成绩的人数分布,数字间以空格分隔,行末不得有多余空格。
输入样例:
7
77 54 92 73 60 65 69
输出样例:
1 0 2 3 1
(2)流程图

(3)源代码

# include <stdio.h>
int main()
{
int N,i,grade,A = 0,B = 0,C = 0, D = 0,E = 0;
scanf("%d",&N);
for(i = 1;i <= N;i++)
{
	scanf("%d",&grade);
	if(grade >= 90)
	{
		A = A + 1;
	}
	else if(grade < 90 && grade >=80)
	{
		B = B + 1;
	}
	else if(grade < 80 && grade >=70)
	{
		C = C + 1;
	}
	else if(grade < 70 && grade >=60)
	{
		D = D + 1;
	}
	else
	{
		E = E + 1;
	}
}
printf("%d %d %d %d %d",A,B,C,D,E);

return 0;
}

(4)实验分析
没有问题。
(5)本题PTA提交列表

4.找出最小值
(1)题目
本题要求编写程序,找出给定一系列整数中的最小值。
输入格式:
输入在一行中首先给出一个正整数n,之后是n个整数,其间以空格分隔。
输出格式:
在一行中按照“min = 最小值”的格式输出n个整数中的最小值。
输入样例:
4 -2 -123 100 0
输出样例:
min = -123
(2)流程图

(3)源代码

# include<stdio.h>
#include <limits.h>
int main()
{
int n,i,A,min,max = INT_MAX;
scanf("%d",&n);
for(i = 1;i <= n;i++)
{
	scanf("%d",&A);
	if(A <= max)
	{
		min = A;
	}
	else
	{
		min = max;
	}
	max = min;
}
printf("min = %d",min);

return 0;
}

(4)实验分析
问题1:定义最大值错误。
原因:没有定义函数。
解决方案:在程序开头定义limits。
(5)本题PTA提交列表

(四)博客互评
http://www.cnblogs.com/hfh0420/
http://www.cnblogs.com/lrxlrz/
http://www.cnblogs.com/dsy7777777/