C语言程序设计第五次作业
一.改错题:
错误信息1:
错误原因:for语句后不能加分号。
改正方法:将for后的分号去掉。
错误信息2:
错误原因:for语句中条件判断应用分号隔开,且for语句后应有大括号。
改正方法:将逗号改为分号,且加上大括号。
错误信息3:编译无错误,运行结果错误。
错误原因:输出与定义不符。
改正方法:fahr定义整形,所以输出的时候应该用 %d.
celsius输出一位小数,所以在输出的时候写成 %.1f。
错误信息4:
错误原因:celsius定义的是double类型的,所以计算的时候要进行强制性的转换。
改正方法:在for循环体中计算celsius时,5前面要加上(double)。
错误信息5:
错误原因:题目要求输入两行,运行输出四行。
改正方法:for后面的fahr++ 改成 fahr=fahr+2。
正确:
二.学习总结:
1.程序的详细执行过程
(1)先定义声明变量num ,odd ,even;
(2).给odd,even赋初值,使其均为零;
(3)进入for循环,i= 1,判断条件为真;
(4)输入第一个数,看与二求余是否为零,判断其奇偶性,然后在相应的奇数偶数后面加一,结束第一次循环;
(5)回到for循环。i=2.条件为真;
(6)输入第二个数,看与二求余是否为零,判断其奇偶性,然后在相应的奇数偶数后面加一,结束第二次循环;
(7)......
(8)当输入i = 11时,不符合for循环的条件,输出even以及odd的值,程序终止。
实现功能:
用户输入10个整型数据,通过几次循环,计算出十个数中偶数与奇数的个数。
2.增量运算符
(1)运行下面程序,结果是:
增量运算符在单独使用时,前缀和后缀不构成影响。
(2)运行下面的程序,结果是
第一条语句是先执行再加一,第二条语句是先加一再运行。所以第一个结果是没有加一直接输出的。
运行问题:在某些程序中前缀和后缀在语句运行中是有区别。前缀形式的增、减量运算符,运算时,先执行操作再后续运算,而后缀则相反,先执行其他运算,再将变量的值执行增/减量操作。因此在确定运算时一定要分清其区别,合理运用前后缀。
结果:这两条输出语句执行完后,i和j的值应均是3。
3.运行下面的四个小程序,运行结果分别为:
(1)
(2)
(3)
(4)
分析:(1)和(2)的主要区别在于缩格不同,但是输出结果相同,因此循环体与缩格并没有关系;
(1)(2)与(3)(4)比较,以及(3)(4)比较,证明大括号的有无,以及位置会对结果产生影响。
第四个为正确的缩进格式。
4.其他总结:
(1)for循环内的条件应为分号而不是逗号。
(2)浮点类型的计算会有误差,所以最好将式子的值赋给一个量,用量来表示式子。
(3)循环时要弄清楚循环次数与输入次数的关系,避免混淆。
(4)for语句中的等于应该用“==”来表示,“=”为赋值。
三.实验总结
1.(1)题目
求奇数分之一序列前N项和
本题要求编写程序,计算序列 1 + 1/3 + 1/5 + ... 的前N项之和。
(2)流程图
(3)源代码
# include<stdio.h>
int main(void)
{
int N,i;
double sum;
scanf("%d",&N);
for(i=1,sum=0 ;i<=2*N-1 ; i+=2)
{
sum = sum+1.0/i;
}
printf("sum = %.6f",sum);
return 0;
}
(4)实验分析:
问题1:for后的括号中缺少分号,或将分号误用为逗号。
原因:与输出语句混淆,记忆错误。
解决办法:记住for括号后有两个分号,可以没有表达式,但一定要有分号。
问题2:循环次数出现错误,导致结果错误。
原因:没有理清楚for循环的次数。
解决办法:将题意进行正确的理解。
(5)本题PTA提交列表
3. (1)题目:奇偶分家
给定N个正整数,请统计奇数和偶数各有多少个?
(2)流程图
(3)源代码
# include<stdio.h>
int main(void)
{
int N,i,odd,even,number;
N<=100;
odd=0;
even=0;
scanf("%d",&N);
for(i=1 ;i<=N ;i++)
{
scanf("%d",&number);
if(number%2!=0)
{
odd=odd+1;
}
else
{
even=even+1;
}
}
printf("%d %d",odd,even);
return 0;
}
(4)实验分析
问题1:运行结果错误。
原因:没有给变量赋初值,导致出现随机数,结果错误。
解决办法:定义变量后首先对其进行赋初值的操作。
(5)本题PTA提交列表
5.(1)题目:统计字符
本题要求编写程序,输入10个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。
(2)流程图
(3)源代码
# include<stdio.h>
int main(void)
{
int i,letter,blank,digit,other;
char op;
letter=0,blank=0,digit=0,other=0;
for(i=1 ;i<=10 ;i++)
{
scanf("%c",&op);
if((op>='a'&&op<='z')||(op>='A'&&op<='Z'))
{
letter=letter+1;
}
else if((op==' ')||(op=='\n'))
{
blank=blank+1;
}
else if(op>='0'&&op<='9')
{
digit=digit+1;
}
else
{
other=other+1;
}
}
printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
return 0;
}
(4)实验分析
问题:
原因:边界值错误,且字符表示错误。
解决办法:将边界改为>=,且将字母用单引号引起。
(5)本题PTA提交列表
7.(1)题目:求交错序列前N项和
本题要求编写程序,计算交错序列 1-2/3+3/5-4/7+5/9-6/11+... 的前N项之和。
(2)流程图
(3)源代码
# include<stdio.h>
# include<math.h>
int main(void)
{
int N,i,k;
double sum;
scanf("%d",&N);
for(i=1,k=0,sum=0 ;i<=N ;i++,k++)
{
if(k%2==0)
{
sum=sum+(double)i/(2*i-1);
}
else
{
sum=sum-(double)i/(2*i-1);
}
}
printf("%.3f",sum);
return 0;
}
(4)实验分析
问题:
原因:浮点数的计算有误差所以最后编译错误。
解决办法:将式子用一个具体的新定义的量代替,避免错误。
(5)本题PTA提交列表
四.博客互评
1.马阳光 http://www.cnblogs.com/myg123/p/7802056.html
评价:整体给人一种很清晰的感觉,用特殊的颜色标记,能够清楚的看到程序中的错误,这一点做得很棒。
有一点不好的是,在实验总结时,没有用正确的方式将源代码表示出来,格式上出现错误,相信你以后一定可以避免,继续加油!
2.刘苗苗 http://www.cnblogs.com/liumiaomiao520/p/7795587.html
评价:对截图做了处理,是人可以清楚的看到所表示的部分,对问题的回答很详细,这些都是值得我学习的地方。如果可以将小标题与正文明显区别开,就更完美了。
3.卢玉 http://www.cnblogs.com/luyu0322-/p/7809912.html
评价:第一个没有按照格式来写,需要小小的修改一下,流程图上有运行结果,一眼望去就知道对不对,这点做得很好。