C语言程序设计第五次作业
(一)改错题
1.输出华氏摄氏温度转换表:输入两个整数lower和upper,输出一张华氏摄氏温度转换表,华氏温度的取值范围是{lower,upper},每次增加2℉。计算公式如下:
c = 5×(f-32)/9
其中,c表示摄氏温度,f表示华氏温度。
错误信息1:
错误原因1:for语句后不能加分号。
改正方法:将if后的分号去掉
错误信息2:
错误原因2:for循环内语句大于一句时要加{}
改正方法:将for内语句用{}括起
错误信息3:
错误原因3:for内的语句要用;间隔
改正方法3:将for内的逗号改为;
编译错误!
仔细查看程序后,发现变量输入输出格式并不匹配
错误信息4:fahr变量定义为整型,但输出确是以浮点型输出
改正方法4:将%3.0f改为%d
错误信息5:
错误信息5:celsius为double型,与计算结果不匹配
改正方法5:在5/9前加强制类型转换(double)
运行正确!
二.学习总结:
1.详细描述程序的执行过程,即说明程序的每一步是执行的哪条代码,执行顺序如何。循环需描述前两次循环和最后一次循环的详细执行过程。最后说明程序实现的功能是什么。
答:①定义了四个整形常量i num odd even
②分别给odd和even赋初值0
③进入for循环,i=1,条件为真
④输出一个整数num,判断num的奇偶性,并给相应的统计奇偶的个数的数值加一,此为第一次循环
⑤执行i++,此时i=2,条件为真,开始第二次循环
⑥输入一个整数num,判断奇偶性并给统计其个数的数值加一,此为第二次循环
⑦重复执行
⑧当i=11时,条件为假,无法执行该循环,故循环结束
实现功能:输入任意的10个整型数,分别统计其中奇数的个数和偶数的个数
2.增量运算符
(1)运行下面程序,结果是什么?增量运算符在单独使用时,前缀和后缀形式有区别吗?
结果为
该增量运算符本身是有不同的,++i指先让i自加,而后执行语句,i++指先执行语句,而后i自加,但在本程序中,增量运算符在单独使用时,前缀和后缀并没有影响。
(2)运行下面的程序,结果是什么?两条输出语句的执行过程是怎样的?说明什么问题?这两条输出语句执行完后,i和j的值分别是多少?
结果为
第一条输出语句printf("%d\n",i++);是先输入i的值,而后i的值加一;第二条输出语句printf("%d\n",++j); 是先讲j的值加一,而后输出。说明增量运算符在语句运行时是有一定区别的。两条输出语句执行完后,i和j的值均为3.
3.有些循环语句后面有{},有些没有,有些语句有缩进,运行下面的四个小程序,运行结果有什么不同?循环体的认定与缩格形式是否有关?与{}是否有关?那么,应该如何正确判断一个循环语句中的循环体?下面的程序中,哪几种格式是正确的缩进格式。
1、
2、
3、
4、
结合1,2来分析,缩进的格式并不相同,但结果是一样的,因此循环体与缩格并无关系。
结合2,3来分析,很明显3多了{},输出结果不同;结合3,4都有{},但是里边所含的语句个数不同,输出结果也不同,因此与{}有关。
第二种缩进不正确
4.对其他你认为需要进行总结的内容进行总结。
1、要注意增量符i++与++i的区别,正确使用。
2、for语句中的判断条件是否成立应用“==”来表示,“=”为赋值不要混淆。
三.实验总结
1.(1)题目
求奇数分之一序列前N项和
本题要求编写程序,计算序列 1 + 1/3 + 1/5 + ... 的前N项之和。
(2)流程图
(3)源代码
#include<stdio.h>
int main()
{
int i,N,x=1;
double y,S=0.0;
scanf("%d",&N);
for(i=1;i<=N;i++)
{
y=(double)1/x;
S=S+y;
x=x+2;
}
printf("sum = %.6f",S);
return 0;
}
(4)实验分析:
问题:把“sum = sum + 1.0 / i”写成了“sum = sum + 1 / i”
原因:精确度不准确,导致结果错误
解决办法:把“sum = sum + 1 / i”改为“sum = sum + 1.0 / i”
(5)本题PTA提交列表
3. (1)题目:奇偶分家
给定N个正整数,请统计奇数和偶数各有多少个?
(2)流程图
(3)源代码
#include<stdio.h>
int main()
{
int N,i,x,count1=0,count2=0;
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%d",&x);
if(x%2==1)
count1++;
else
count2++;
}
printf("%d %d",count1,count2);
}
(4)实验分析
问题:if语句内的判断只写了一个等号
原因:=为赋值,if内==才是判断
改正方法:改为==
(5)本题PTA提交列表
5.(1)题目:统计字符
本题要求编写程序,输入10个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。
(2)流程图
(3)源代码
#include <stdio.h>
#include <string.h>
#define N 10
int main()
{
int letter=0,blank=0,digit=0,other=0,i;
char x;
for(i=0;i<N;i++)
{
scanf("%c",&x);
if((x>='a'&&x<='z')||(x>='A'&&x<='Z'))
{
letter++;
}
else if(x==' '||x=='\n')
{
blank++;
}
else if(x>='0'&&x<='9')
{
digit++;
}
else
{
other++;
}
}
printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other);
return 0;
}
(4)实验分析
问题:if((a >= "a"&& a <="z")||(a >= "A"&& a <= "Z"))
原因:判断的是字符,要用‘’
改正方法:if((a >= 'a' && a <= 'z')||(a >= 'A' && a <= 'Z'))
(5)本题PTA提交列表
7.(1)题目:求交错序列前N项和
本题要求编写程序,计算交错序列 1-2/3+3/5-4/7+5/9-6/11+... 的前N项之和。
(2)流程图
(3)源代码
#include<stdio.h>
int main()
{
int i,j=3,N;
double a=1,b;
scanf("%d",&N);
if(N!=1)
{
for(i=2;i<=N;i++)
{
b=(double)i/j;
if(i%2==0)
{
b=-b;
}
a=a+b;
j=j+2;
}
}
printf("%.3f",a);
return 0;
}
(4)实验分析
发现运行结果i数据不精确时,要仔细检查,常常是要使用强制类型转换的!
(5)本题PTA提交列表
四.博客互评
http://www.cnblogs.com/zrx--/p/7814055.html
http://www.cnblogs.com/ziluo/p/7819483.html
http://www.cnblogs.com/xiaoqi1/p/7821666.html