C语言程序设计第五次作业
(一)改错题
输出华氏摄氏温度转换表:输入两个整数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:
错误原因1:for语句格式错误
改正方法1:应该用分号";",不应该用逗号"," 并且for语句括号后不应该有分号";"
错误信息2:
错误原因2:fahr是整型,应用%d,而输出是double类型,并且celsius应保留一位小数
改正方法2:将printf("%3.f%6.1f\n")改为printf("%d%.1f\n"),在5/9前加上(double)
错误信息3:
错误原因3:for语句循环条件没有加上{ },无法循环
改正方法3:将celsius = 5 /9 * (fahr - 32.0);
printf("%3.0f %6.1f\n", fahr, celsius); 用{ }括起来
错误信息4:
错误原因4:题中要求每次增加2℉,所以fahr++是不对的
改正方法4:将fahr++改为fahr=fahr+2
编译后正确
输入样例1:
输入样例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;
}
详细描述程序的执行过程,即说明程序的每一步是执行的哪条代码,执行顺序如何。循环需描述前两次循环和最后一次循环的详细执行过程。最后说明程序实现的功能是什么。
①定义整型变量 i,num,odd,even
②将odd,even赋值为0
③i赋值为1,输入一个数字,将数字放在num里,判断数字和2求余是否等于0,如果等于0,even加1,否则,odd加1
④i加1等于2<10,再次进入循环,重复上面步骤,使再次输入一个数字,放在num里面,判断数字和2求余是否等于0,等于0,even加1,否则,odd加1
⑤一共输入10个数字,放在num里面,重复上面步骤,直到i>10,循环结束,输出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;
}
输出结果如下:
i和j输出都为3,结果都加1
增量运算符在单独使用时没有区别,都是表示加1
(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;
}
输出结果如下:
第一条输出语句时先执行i,再执行i+1,第二条输出语句是先执行j+1,再输出j的值
说明在代码中前缀和后缀是有区别的,前缀是先执行加的命令再输出,而后缀就是先输出再执行加的命令
执行此段代码后,i=2,j=3
3.有些循环语句后面有{},有些没有,有些语句有缩进,运行下面的四个小程序,运行结果有什么不同?循环体的认定与缩格形式是否有关?与{}是否有关?那么,应该如何正确判断一个循环语句中的循环体?下面的程序中,哪几种格式是正确的缩进格式。
(1)
#include <stdio.h>
int main()
{
int i;
for(i = 1;i <= 5;i++)
printf("*");
printf("\n");
return 0;
}
程序1运行结果:
(2)
#include <stdio.h>
int main()
{
int i;
for(i = 1;i <= 5;i++)
printf("*");
printf("\n");
return 0;
}
程序2运行结果:
(3)
#include <stdio.h>
int main()
{
int i;
for(i = 1;i <= 5;i++)
{
printf("*");
printf("\n");
}
return 0;
}
程序3运行结果:
(4)
#include <stdio.h>
int main()
{
int i;
for(i = 1;i <= 5;i++)
{
printf("*");
}
printf("\n");
return 0;
}
程序4运行结果:
结果不同在"*"的排列方式不同
循环体的认定与缩格形式无关,与{ }有关
应该将循环体用{ }括起来
第1个和第4个源程序都是正确的,输出结果符合预期。但第4个源程序却更加的规范。
第3个源程序很规范也很正确,以后不管循环体有几条,都要加上{ },这是一种很好的习惯。
4.对其他你认为需要进行总结的内容进行总结。
在for语句中,要注意循环的括号中应该用; 隔开,而不是用 , 隔开。
并且由于现在定义变量变多了,程序也逐渐复杂,需要在一行代码后面加上注释,帮助我们更清楚的看明白程序。
for语句的一般格式是
for(表达式1;表达式2;表达式3)
{
循环体(表达式)
}
其中,表达式1为循环变量赋初值
表达式2为循环条件,若判断循环条件为真,则执行循环体,否则跳出循环
表达式3为循环条件的新赋值表达式,然后转回第二步循环
(三)实验总结(我的学号末位为奇数,总结1,3,5,7题)
1.求奇数分之一序列前N项和
(1)题目:本题要求编写程序,计算序列 1 + 1/3 + 1/5 + ... 的前N项之和。
(2)流程图:
(3)源代码:
#include <stdio.h>
int main(void)
{
int i,N;
double sum,s;
scanf("%d",&N);
sum = 0;
for(i = 1;i<=N;i = i+1)
{
sum = sum+1.0/(i*2-1);
}
s = sum;
printf("sum = %.6f",s);
return 0;
}
(4)实验分析
要记住给sum赋初值
(5)本题PTA提交列表
2.奇偶分家
(1)题目:给定N个正整数,请统计奇数和偶数各有多少个
(2)流程图:
(3)源代码:
#include <stdio.h>
int main(void)
{
int i,n,a,ou,ji;
scanf("%d",&n);
ji = 0;
ou = 0;
for(i=1;i<=n;i++)
{
scanf("%d",&a);
if(a%2!=0)
{
ji++;
}
else
{
ou++;
}
}
printf("%d %d",ji,ou);
return 0;
}
(4)实验分析
这道题难点在于在循环语句中嵌套判断语句,应注意声明变量ji和ou都是初值为0的
(5)本题PTA提交列表
3.统计字符
(1)题目:本题要求编写程序,输入10个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。
(2)流程图:
(3)源代码:
#include <stdio.h>
int main (void)
{
int i,letter=0,blank=0,digit=0,other=0;
char a;
for(i=1;i<=10;i++)
{
scanf("%c",&a);
if(a>='a' && a<='z' || a>='A' && a<='Z')
{
letter++;
}
else if(a==' ' || a=='\n')
{
blank++;
}
else if(a>='0' && a<='9')
{
digit++;
}
else
{
other++;
}
}
printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
return 0;
}
(4)实验分析
问题1:输出之后答案错误
原因1:没有注意到a时字符型变量,应该用' ' 扩起来
解决方法1:将字符,数字和空格还有回车用单引号括起来,并且注意回车的表示方法
(5)本题PTA提交列表
4.求交错序列前N项和
(1)题目:本题要求编写程序,计算交错序列 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;
double sum;
scanf("%d",&N);
sum = 0;
for(i=1;i<=N;i++)
{
sum = sum+i/(2.0*i-1)*pow((-1),i-1);
}
printf("%.3f",sum);
return 0;
}
(4)实验分析
此题要注意的是每一项是正负相错开的,不知道为什么流程图中不能用pow函数,最后只能用flag,并且要注意flag变号是在赋值语句之前还是之后。
(5)本题PTA提交列表
(四)博客互评
李晓晓:(http://www.cnblogs.com/Reloaded/p/7795161.html)
李晓晓同学的改错题中的错误都用红笔勾出来了,这点值得我们学习,而学习总结中的实验分析for循环的步骤也很清楚,让我更加理解for循环的内容。
曲儿说:(http://www.cnblogs.com/abc15369938639/p/7810952.html)
我觉得曲儿说同学的错误可以改为截图错误部位,而不是把所有代码和错误原因放在一起,这样可能会更清楚,但是他的流程图部分做的很清楚。
luck you 😦http://www.cnblogs.com/LYFRRS/p/7807056.html)
这名同学的改错题将图中错误标识出来,我认为比李晓晓同学用红笔标出来更加清楚,但是源代码部分希望不要用截图方式,而是用markdown模式,具体如何使用老师已经做了详细介绍了。
T磊:(http://www.cnblogs.com/8426224ll/p/7813670.html)
学习总结中写for循环过程的那道题,思路很清晰,结构也非常整洁,但是建议改错题的错误全部改正完毕后再输入样例,测试结果是否正确。