C语言程序设计第五次作业——循环结构(1)
(一)改错题
将源程序进行编译,发现有误
错误信息1:
错误原因:第13行for语句后面加了;
改正方法:去掉;
错误信息2:
错误原因:第14行公式书写有误,按从左到右的顺序算,5/9=0,不能得出正确结果
改正方法:将5改成5.0
错误信息3:
错误原因:for语句中三条语句应用;隔开而不是,
改正方法:将,换成;
编译结果无误,运行结果不对
错误信息4:
错误原因:题目中要求每次加2fahr,而他给出的却是fahr++
改正方法:将fahr++改成fahr=fahr+2
错误信息5:
错误原因:定义华氏度为int类型,输出时却用%3.0f表示浮点型
改正方法:将%3.0f改成%3d
运行结果仍然不对
错误信息6:
错误原因:for语句后有多个语句却未用{}
改正方法:在13和17行分别加上{}
再次运行,结果正确
改正后代码为
#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=fahr+2)
{
celsius = 5.0 /9 * (fahr - 32.0);
printf("%3d %6.1f\n", fahr, celsius);
}
return 0;
}
(二)学习总结
1.执行步骤如下
①定义整型变量i,num,odd,even,
②给odd,even赋初值均为0,
③执行for的循环语句,表达式1为i=1,表达式2为i<=10,表达式3为i++,i=1符合i<=10语句,循环条件为真,执行循环体,
④输入一个变量num,
⑤判断此值能否被2整除
⑥若能,执行even++语句,若不能,执行else语句,即odd++,
⑦回到for语句,此时i=2,判断条件为真,
⑧继续输入num,
⑨执行选择语句,若能被2整除,执行even++语句,若不能,执行else语句,即odd++,
………………
⑩当循环到i=11,不符合循环条件,跳出循环体语句,输出此时even和odd的值
该程序实现的功能是:判断输入的10个数的奇偶性并统计奇偶数的个数。
2.增量运算符
(1)运行所给程序,得结果
由结果可知,增量运算符在单独使用时,前缀和后缀形式没有区别。
(2)运行所给程序,得结果
此代码说明增量运算符的前缀与后缀影响运算结果,由于i为后缀形式,因此输出,再对i增量,所以b的值输出为2,而j为前缀形式,因此首先对j增量,再输出,因此j输出的值为3。
3.有些循环语句后面有{},有些没有,有些语句有缩进,循环体的认定与缩格形式是否有关?与{}是否有关?那么,应该如何正确判断一个循环语句中的循环体?下面的程序中,哪几种格式是正确的缩进格式。
程序一运行结果
程序二运行结果
程序三运行结果
程序四运行结果
由上面四个结果对比可知,只有第三个运行结果为5行每行一个,其余三套程序运行结果都为一行5个。
对比结果及源程序可得:
程序1、 2 之间的差别为缩格的不同,结果二者完全相同,因此说明循环体的认定与缩格没有关系。
程序2、 3之间的差别为有无{},结果二者完全不同,二者的区别在于大括号括起的位置不同,所以认为循环体的认定与{}有关系。
程序3、 4之间的差别为{}的位置不同,结果导致程序4的输出结果没有换行
问题总结:
循环是此门课程的一大难点,需要理清的问题也很多
1.要注意前后缀的使用问题
2.for语句括号中必须有第二条表达式语句和它前后的两个;
3.while语句先判断表达式真假再执行,可以进行无限循环
4.do——while语句,也要能符合while里的条件才执行do下面的语句
5.注意复合赋值运算符,如:a+=b即为a=a+b
6.逗号运算符的有限值低于赋值运算符,基本为最低
(三)实验总结
(1)题目: 统计学生平均成绩与及格人数
(2)流程图:
(3)源代码
#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 ;
}
(4)实验分析:
问题:输出count结果不对
原因:一开始循环语句中else语句下写的count=0,及当不符合条件时count又恢复为0
解决办法:将其改为count=count
(5)本题PTA提交列表:
(1)题目: 到底是不是太胖了
(2)流程图:
(3)源代码
#include<stdio.h>
#include<math.h>
int main (void)
{
int N,H,W,i,standard,a;
scanf("%d",&N);
standard=0;
a=0;
for(i=1;i<=N;i++)
{
scanf("%d %d",&H,&W);
standard = (H-100)*0.9*2;
a = W-standard;
if(a<standard*0.1&&a>-standard*0.1)
{
printf("You are wan mei!\n");
}
else if (a>=standard*0.1)
{
printf("You are tai pang le!\n");
}
else
{
printf("You are tai shou le!\n");
}
}
return 0 ;
}
(4)实验分析:
问题1:结果在极值总是有误差
原因:浮点型在等于时候总是有误差
解决办法:避免用浮点型的格式
(5)本题PTA提交列表:
(1)题目:统计学生成绩
(2)流程图:
(3)源代码:
#include<stdio.h>
#include<math.h>
int main (void)
{
int N,A,B,C,D,E,i;
double grade;
A=B=C=D=E=0;
scanf("%d",&N);
for(i=1;i<=N;i++)
{
scanf("%lf",&grade);
if(grade>=90&&grade<=100)
{
A++;
}
else if (grade<90&&grade>=80)
{
B++;
}
else if (grade<80&&grade>=70)
{
C++;
}
else if (grade<70&&grade>=60)
{
D++;
}
else
{
E++;
}
}
printf("%d %d %d %d %d",A,B,C,D,E);
return 0 ;
}
(4)实验分析:
问题:判断结果不准确
原因:switch语句的表达式书写有误,应该除以10再比较会方便
解决办法:让grade/10
(5)本题PTA提交列表:
(1)题目:找出最小值
(2)流程图:
(3)源代码:
#include<stdio.h>
#include<math.h>
int main (void)
{
int n,i,b;
double min,t;
scanf("%d%lf",&n,&min);
for(i=1;i<=n-1;i++)
{
scanf("%d",&b);
if(min>=b)
{
t=b;
b=min;
min=t;
}
else
{
min=min;
}
}
printf("min = %.0f",min);
return 0 ;
}
(4)实验分析:
问题:刚读到题时有点蒙,不知从哪儿下手
解决办法:经过上课老师讲授,豁然开朗
(5)本题PTA提交列表:
博客互评
http://www.cnblogs.com/fkh1/p/7812032.html
http://www.cnblogs.com/dsy7777777/p/7818827.html
http://www.cnblogs.com/lyw7777777/p/7817394.html