C语言程序设计第五次作业
1 改错题
输出华氏摄氏温度转换表,对源程序进行编译,采用每次修改第一个错误并重新编译的方法,记录每个错误的错误信息、分析错误原因并给出正确的语句。
错误信息:
错误原因:for语句中符号使用错误,运行时for语句是出现编译错误。
改正方法:把for语句后的“,"改为”;"即可。
继续运行出现如下错误:
错误原因:本人发现for语句后的断句出现了问题如下图:
改正方法:删去for语句后的";"即可。 继续编译运行未提示错误,但运行结果依然如上图错误,经检查发现如下
错误信息:
公式的表达错误。
改正方法:改为如下图格式即可:
继续运行发现如下错误:
经检查发现for语句执行条件未用大括号"{}"括起来。
改正方法:把"for"语句的执行条件用"{}"括起来即可。如下图:
继续执行出现下图错误:
与题目所要求的每隔两度输出一次形式不符如下图部分的错误:
改正方法:应把"fahr++"改为"fahr+=2"即可。 再进行对题目所给输出输出进行检测如下图:
均符合预期,而由于之前几次的错误,本人想到了临界值的符合与否会造成程序的错误,于是测试了一组临界值进行测试,如下图:
可见并未出现错误,改错任务完成。下面是改正后的源程序:
#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+=2)
{
celsius = 5 * (fahr - 32.0)/9;
printf("%d %.1f\n", fahr, celsius);
}
return 0;
}
2学习总结
说明所给程序的每一步是执行的哪条代码,执行顺序如何。循环需描述前两次循环和最后一次循环的详细执行过程。最后说明程序实现的功能是什么。
由条件得知依次输入一到十的数字,于是得到如下结果:
步骤如下:
(1).定义整形变量
(2)初始化变量奇数偶数个数为0.
(3)判断是否执行循环语句满足条件i初始值为1小于等于10时进入循环,每次循环i进行自增。
(4)循环表达式2内容:输入整形变量num,并进行判断。
(5)执行选择语句
(6)如果num能被2整除则为偶数
(7)否则为奇数
(8)输出两个整形变量,奇数偶数的个数。
(9)函数值返回0,程序结束。
2.增量运算符
(1)运行下面程序,结果是什么?增量运算符在单独使用时,前缀和后缀形式有区别吗?
按照题目所给程序输出结果如图所示:
改为如图的方式结果如图:
由此可见自增自减运算符作为单独算式子时不会影响运算结果。只是纯粹的作为单独式子时才不会才产生影响。
(2)运行下面的程序,结果是什么?两条输出语句的执行过程是怎样的?说明什么问题?这两条输出语句执行完后,i和j的值分别是多少?
执行如下图程序
可得到如下结果:
显然与上述结果不同,此处就体现出了自增自减运算符的特性,作为表达式的一部分时,自增自减运算符在前时,遵从先加再使用的原则,而在后面时,遵从先使用再加的原则,上述程序自增自减运算符在后面所以先使用,而后再进行自增自减运算,得到的结果就与之前的结果不同。此时系统会先进行算数运算再进行自增自减,才会得到如上结果。
3.有些循环语句后面有{},有些没有,有些语句有缩进,运行下面的四个小程序,运行结果有什么不同?循环体的认定与缩格形式是否有关?与{}是否有关?那么,应该如何正确判断一个循环语句中的循环体?下面的程序中,哪几种格式是正确的缩进格式。
(1)运行第一个程序结果如图:
第二个结果如图:
第三个结果如图:
第四个结果如图:
由此可见除了第三个与其他程序结果不同之外其他程序运行结果相同。
经过第一个第二个比较可以证明循环体认定与缩进无关,第一第二个程序都没有加大括号,使for语句循环只执行下面的一句,全部输出""后才输出回车,实际上第一第二个程序与第四个程序原理是一样的。第四个程序用大括号括起来要循环的语句达到只输出""的目的,最后输出回车。而第三个程序则执行输出"*" "\n"的指令,是这两个指令的循环,结果自然与其他三个不同。
4.其他总结:(1)for 语句的应用形式:for语句后的条件表达式可以省略,但是切记";"不可以省略,同时表达式二不可省略,否则for语句会进入无限循环,还值得注意的是,for语句中的表达式可以是任意有效的语言表达式。
(2)关于自增自减运算符:首先,自增自减运算符作为单独的表达式时,运算符在前在后对结果无影响,但一旦作为表达式的一部分时,在前就表示先加后使用,在后表示先使用后加,例如:
k=++i
就代表
i=i+1
k=i
而自增自减运算符在后就不同了例如:
k=i++
就代表
k=i
i=i+1
可能有人想到我们为什么要用自增自减运算符呢,直接用赋值运算不就好了吗,其实自增自减运算符可以使生成代码效率更高。具体有关自增自减运算符的知识可以参考如下本人给出的博文链接:
http://blog.csdn.net/lianghui0811/article/details/48736109
此外,通过对循环结构的进一步了解,在课外书上了解到了for语句的灵活性,下面的式子说明了如何在for循环的第三个控制表达式中完成一个计算:
#include <stdio.h>
int main(void)
{
unsigned long long sum = 0LL;
unsigned int count = 0;
printf("\nEnter the number of integers you want to sum: ");
scanf("%u",&count);
for(unsigned int i = 1 ; i <= count ; sum+=i++);
printf("\nTotal of the first %u number is %llu\n",count,sum);
return 0;
}
输出结果如下:
和通常for语句的唯一区别是,在循环的第三个控制表达式中汇总:
for(unsigned int i = 1 ; i <= count ; sum+=i++);
循环语句是空的,在闭括号后面是一个分号,循环的第三个控制表达式将i的值加到sum中,再递增i,准备下一次迭代,它是以这个方式运作的,因为这里使用了递增运算符的后置形式,而如果使用前置形式将会得到错误答案,因为肃穆
的值包含了第一次迭代时的值count+1,而不是count。
3实验总结
1.统计学生平均成绩与及格人数
流程图:
源程序:
#include <stdio.h>
int main()
{
int N=0,count=0,grade=0,sum=0,i=1;
scanf("%d",&N);
if(N==0)
{
count=0,sum=0;
}
else
{
for(i=0;i<N;i++)
{
scanf("%d",&grade);
sum+=grade;
if(grade>=60)
{
count++;
}
}
}
printf("average = %.1f\ncount = %d",(double)sum/i,count);
return 0;
}
问题:在最初因初始化的原因给i初始化为0,同时由于计算平均数的两个变量都是整形变量导致出现如下图的问题:
解决方法:由于本人在算式中使i作为分母,所以将i初始化为1,并且把结果强制转换成double型即可。
PTA提交列表:
2.到底是不是太胖了
流程图:
源程序:
#include <stdio.h>
#include <math.h>
int main()
{
int a=0,i = 0;
double SW = 0.0,H = 0.0,W = 0.0;
scanf("%d",&a);
for(i = 1;i <= a;i++)
{
scanf("%lf%lf",&H,&W);
SW=(H - 100) * 0.9 * 2;
if(fabs(SW - W) < SW * 0.1)
{
printf("You are wan mei!\n");
}
else if(SW - W < SW * 0.1)
{
printf("You are tai pang le!\n");
}
else
{
printf("You are tai shou le!\n");
}
}
return 0;
}
问题:最初由于忘记市斤与公斤的转换而导致运行结果错误。
解决方法:在定义标准体重的计算式中给结果乘以2即可。
问题:运行过程中由于标准体重和实际体重的正负号问题导致错误,如下图:
导致在本该为太瘦了的结果处出现错误结果。
解决方法:让标准体重作为减数即可。如图:
算出的数据与标准体重的百分之十作比较,超出为太瘦了,否则为太胖了,这一点需要注意。
3. 统计学生成绩
流程图:
源程序如图
#include <stdio.h>
int main()
{
int N=0,m=0,i=0,A=0,B=0,C=0,D=0,E=0;
scanf("%d",&N);
for(i=1;i<=N;i++)
{
scanf("%d",&m);
switch(m/10)
{
case 10:
case 9:A++;break;
case 8:B++;break;
case 7:C++;break;
case 6:D++;break;
default :E++;
}
}
printf("%d %d %d %d %d",A,B,C,D,E);
return 0;
}
此处运用了switch语句,由于本人掌握比较熟练所以此题没有出现其他问题。
PTA提交列表:
4. 找出最小值
流程图:
源程序:
#include <stdio.h>
#include <limits.h>
int main()
{
int n=0,i=0,a=0,min=0;
a=INT_MAX;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&min);
if(min<=a)
{
a=min;
}
}
printf("min = %d",a);
return 0;
}
问题:在运行程序定义的最大值与输入数值交换错误,导致错误如图:
解决方法:将min与a位置交换即可。
PTA提交列表:
4博客互评
许天笑:http://www.cnblogs.com/snxtx/p/7812139.html
任佳鹏:http://www.cnblogs.com/rjp123/p/7816862.html
李晓晓:http://www.cnblogs.com/Reloaded/p/7795161.html