C语言程序设计第五次作业
C语言第五次作业。
(一)改错题。
(1)输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉。计算公式如下:c = 5×(f-32)/9
,其中,c表示摄氏温度,f表示华氏温度。
1,源程序。
#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;
}
2.错误及改正。
- 错误信息1:
- 错误原因:for语句中的几个循环条件之间应该用
;
链接。 - 改正方法:将for语句中的几个条件之间加上分号。
改正并编译。
- 编译正确,进行输入输出实验,结果如下。
- 输出结果与实际值不符合,继续检查。
- 错误信息2:经检查发现在进行公式运算时未按照指定步骤来做,将除9移到了5后边。
- 错误原因:未理解清公式每步的意义,应该按照指定顺序来做,以得出正确结果。
- 改正方法:
编译并运行
- 结果仍未达到预期,继续检查错误。
- 错误信息2:据题意可得,每次增加2℉,而在源程序循环的判断条件下f每次增加1.
- 错误原因:对题意理解不清。
- 改正方法:将循环条件中的
f++
改为f+=2
;
编译并运行。
- 结果仍未达到预期,继续检查。
- 错误信息3: for语句后未加大括号。
- 错误原因:对for循环语句的构成不清楚
- 改正方法:在循环语句前后加上大括号,使其成为一个模块。
编译并运行。
- 结果仍未达到预期,继续检查。
- 错误信息4:对fahr声明的是int变量,而输出语句中却用的
%f
. - 改正方法:将fahr声明为double类型。
编译并运行。
- 结果仍未达到预期
- 错误信息5:for后面并没有分号。
- 错误原因:对for循环的认识不清。
- 改正方法:将分号去掉。
编译并运行。
- 结果正确,附上正确程序。
#include <stdio.h>
int main(void)
{
int lower, upper; /* fahr表示华氏度 */
double celsius,fahr; /* celsius表示摄氏度 */
printf("Enter lower:");
scanf("%d",&lower);
printf("Enter upper:");
scanf("%d",&upper);
printf("fahr celsius\n"); /* 显示表头 */
/* 温度转换 */
for (fahr = lower ; fahr <= upper; fahr = fahr + 2)
{
celsius = 5 * (fahr-32.0) / 9;
printf("%3.0f %6.1f\n", fahr, celsius);
}
return 0;
}
(二)学习总结
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).输入1到10之间的数字,输出以下语句。
(2).执行过程。
1.最开始定义了四个整形变量i,num,odd,even
,以及偶数和奇数的初值。
2.在i=1
的限制条件下判断为真,遂进入循环结构。
3.在for循环语句下,输入一个变量num
,
4.进入if
选择语句,判断是否能被2整除。
5.若能被2整除,则进入even++
阶段,否则进入odd++
阶段;前者在奇数量上加一,后者在偶数量上加一,
- 如在本人的输入当中,最开始输入数字1,应该执行
else
中的代码,即even++
,然后奇数量加一,再次进入循环,此时i=1; - 第二次输入数字2,执行
if
中的代码,即odd++
,然后再次进入循环,此时i=2。
6.继续输入值,直到i>10
,此时i值不符合循环条件,执行for
语句后的语句。
7.在循环结构结束后,进行下一步输出,例如按照本人的输入,输出则为odd=5,even=5
。
本程序实现的是输出十个整形数字内的奇数与偶数个数。
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;
}
- 1.运行结果:
- 2.结论:在本题中,输出的只是i与j的值,前缀与后缀没有影响输出结果,但在涉及到其他运算时应该是有影响的。
(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.结论:先声明两个整形常量
i,j
,然后分别赋值2,第一个输出语句中++
在i后面,所以是先输出变量i,再执行加1的语句;第二个输出语句中因为++
为前缀,所以是先执行加1的语句再输出变量j的值。 - 3.说明问题:前缀类型与后缀类型均会影响到最终输出的变量值,在例题中所体现出来的就是对于i,j两个变量的先输出还是先运算的问题,有前缀时,程序会先输出再计算,而后缀时会先计算再输出,最终体现出来的
i=2``j=3
,但最终的i与j的值仍然是都进行了计算后的i=3,j=3
。
3.有些循环语句后面有{},有些没有,有些语句有缩进,运行下面的四个小程序,运行结果有什么不同?循环体的认定与缩格形式是否有关?与{}是否有关?那么,应该如何正确判断一个循环语句中的循环体?下面的程序中,哪几种格式是正确的缩进格式。
(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)
#include <stdio.h>
int main()
{
int i,j;
i = 2;
j = 2;
printf("%d\n",i++);
printf("%d\n",++j);
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
语句只将第一个分号前的语句纳入循环结构,故第一二个程序都只将第一个输出语句纳入了循环结构;所以输出结果都一样。
对于{}的判断,比如说第一个而程序所出现的只把分号前的语句纳入循环结构范围内,如果加入{}
.,可以使其成为一个代码块,两条语句都可以被纳入for
的循环语句中来,这样可以使代码块变得更加完整,我们所学习的循环结构的构建,中间很重要的一步就是嵌套结构,它所包含的代码是否正确对我们来说是非常重要的。
第一三四个程序都是正确的缩进格式。
4.其他内容的总结。
- 在做这次作业总结之时,我们已经学习了
for
循环,作为我们学习的第一个循环,这其中有很多新知识值得我们去总结和研究。 - 1.for的应用:通常用于计数控制,同时要注意
;
的使用,千万不能将;
错用为,
,否则循环程序将无法运行。 - 2.要考虑清楚循环的运行条件,如果循环体内有多条需要执行的语句,需要在for中加入
{}
。 - 3.熟练运用嵌套,在
for
循环中使用各种其他类型的语句来实现编程的目的。 - 4.
for
语句的更改,例如,给出一个源程序,
for(i=1;i<=N;i++)
{
S=S+1.0/(i*2-1);
}
- 可以更改为,
i=1; /*在for语句之前给循环变量赋初值*/
for(i=1;i<=N;i++)
{
S=S+1.0/(i*2-1);
}
- 还可以继续更改,
i=1 /*在for语句之前给循环变量赋初值*/
for(;i<=N;)
{
S=S+1.0/(i*2-1);
i++ /*修改循环控制变量*/
}
- 将for后面的括号内所有的语句删除,只留下两个分号,
i=1 /*在for语句之前给循环变量赋初值*/
for(;i<=N;)
{
S=S+1.0/(i*2-1);
i++; /*修改循环控制变量*/
if(i<=N)break
}
(二)实验总结
题目1:输入学生数量以及成绩求成绩均值与及格人数。
1.源程序:
#include<stdio.h>
int main()
{
int N,ia,count,sum,i;
float average;
scanf("%d",&N);
sum=0;
count=0;
average=0;
for(i=0;i<N;i++)
{
scanf("%d",&ia);
sum=sum+ia;
if(ia>=60)
{
count++;
}
}
if(N==0)
{
printf("average = 0.0\n");
}
else if(N>0)
{
average=sum/(float)N;
printf("average = %.1f\n",average);
}
printf("count = %d\n",count);
return 0;
}
2.流程图
3.实验分析
- 本题难点主要在容易忽视一些隐藏的条件,比如说如果N=0的情况未考时会出现答案错误。
- 错误信息1:输入之后显示答案错误。
- 错误原因:未考虑N=0的情况,对题意理解不清。
- 改正方法:加入以下语句。
if(N==0)
{
printf("average = 0.0\n");
}
提交列表:
题目2:判断到底是不是太胖了:
1源程序:
#include <math.h>
int main(void)
{
int height = 0,market = 0,N =0;
double weight = 0.0,std_weight = 0.0,difference = 0.0,deviation = 0.0;
scanf("%d",&N);
for(unsigned int i = 1;i <= N;i++)
{
scanf("%d%d",&height,&market);
weight = market / 2.0;
std_weight = (height - 100)*0.9;
difference = weight - std_weight;
deviation = (fabs(difference)/std_weight) * 100;
if(deviation < 10)
{
printf("You are wan mei!\n");
}
else if(difference > 0.0)
{
printf("You are tai pang le!\n");
}
else
{
printf("You are tai shou le!\n");
}
}
return 0;
}
2.流程图
3实验分析
- 题中所给市斤与公斤之间的关系应该搞清楚,同时清楚绝对值的用法
fabs
,向同学请教了标准一词的用法。 - 错误信息1:输出结果未分行。
- 错误原因:未在每个输出语句后加
\n
. - 改正后未出现问题。
提交列表:
题目3:本题要求编写程序读入N个学生的百分制成绩,统计五分制成绩的分布。百分制成绩到五分制成绩的转换规则:
- 大于等于90分为A;
- 小于90且大于等于80为B;
- 小于80且大于等于70为C;
- 小于70且大于等于60为D;
- 小于60为E。
(1)源程序:
#include<stdio.h>
int main(void)
{
int N;
int i,x;
int a=0,b=0,c=0,d=0,e=0;
while(scanf("%d",&N)!=EOF){
for(i=0;i<N;i++){
scanf("%d",&x);
if(x>=90){
a++;
}else if(x>=80){
b++;
}else if(x>=70){
c++;
}else if(x>=60){
d++;
}else{
e++;
}
}
printf("%d %d %d %d %d\n",a,b,c,d,e);
}
return 0;
}
(2)流程图
(3)实验分析
- 本题引入了一个
EOF
,作为我自己的一个小实验,EOF
为文件结束符,是End of life的缩写。 - 其他好像真的没有什么问题...
提交列表
题目4:本题要求编写程序,找出给定一系列整数中的最小值。
(1).源程序
#include<stdio.h>
int main(void)
{
int n,i,l,min;
scanf("%d",&n);
scanf("%d",&l);
min=l;
for(i=1;i<n;i++){
scanf("%d",&l);
if(min>l)
min=l;
}
printf("min = %d",min);
return 0;
}
(2)流程图
(3)实验分析
- 错误信息1:
- 错误原因:将
for
循环内的;
写成了,
- 改正方法:将逗号改为分号。