C语言第三次作业
一:改错题
先将源代码复制到devc++中
如图
现进行编译寻找错误
发现错误信息(1)如图
错误原因:根据所给错误信息提示可以发现,在第七行的if语句后,多添加了一个“;”导致编译错误。
改正方法:将多余“;”去掉。
现进行第二次编译
发现另有错误信息(2)如图
错误原因:在scanf语句中,x前缺少取地址符“&”。
改正方法:在x前添加取地址符“&”。
现进行第三次编译
发现另有错误信息(3)如图
错误原因:经过检查发现,在if语句中,“y = 1/ x”后缺少“;”导致编译错误。
改正方法:补全所缺“;”。
进行第四次编译
发现另有错误信息(4)如图
错误原因:在else语句后添加了条件语句,导致编译错误。
改正方法:将“else”后的条件去掉。
进行第五次编译
发现仍有错误信息(5)如图
错误原因:printf语句中“"”与变量之间,变量x,y,之间均缺少“,”导致编译错误。
改正方法:将缺少的“,”补齐。
进行第六次编译发现没有提示错误,进行运行指令
发现有错误信息(6)如图
错误原因:在源代码的scanf语句中多了一个转义字符“/n”。
改正方法:去掉多余的转义字符“/n”。
进行第七次编译运行
发现错误信息(7)运行结果如下并不符合预期
错误原因:if后面的条件语句等于误用为赋值语句
改正方法:将“x = 10”改为“x == 10”
进行第八次编译运行
运行结果如图,并不符合预期,发现错误信息(8)
错误原因:double变量的输入格式字符串用了f
改正方法:将“%f”改为“%lf”
进行第九次编译,运行
发现并不符合预期,存在第(9)个错误
错误原因:输出语句中“1f”错写成了“lf”
改正方法:将“l”改为“1”
进行第十次编译,运行
发现仍存在第(10)处错误如图
错误原因:输出语句中,应为一位小数,.2f是两位小数。
改正方法:将第15行的“%.2f”改为“%.1f”。
进行第十一次编译,运行
发现符合预期,错误改正完毕。
该整改后代码如图
二:学习总结
1.if(a)if(b) x=x+1;else y=y+1; 的确切含义是什么?这个else应该和哪个if配对?如何明确表达这种配对方法?将该段代码按照规范化的格式进行书写。
答:它的含义为如果a是真则判断b,b是真则给x+1,b是假则给y+1
和第二个 “if”配对。
2.C语言的表达式 (-10< x <10)能够表达x在区间(-10,10)吗?为什么?如果不能,正确的表达式应该怎么写?
答:通过实践发现,并不能。
若想把两个条件语句不能写成一句应用“&&”
(x<10&&x>-10)
3.C语言中输入数据时,如果遇到非法字符,则认为输入结束。运行程序(1),输入123a,看看输出结果是什么?你能解释是为什么吗?
答:先将给的源代码复制到devc中,进行编译,并无错误提示,进行运行,输入“123a”发现运行结果如下
观察发现,b被赋予的数字“1”。
结合题目所给信息可以得知,在输入123时,我们继续输入“a”,因为定义的整形数据,系统发现非法数据“a”,便认为输入已经停止,所以赋予了b的值为1.
scanf()函数的返回值是成功读入数据的个数,如果没有读取任何数据,则返回0。运行程序(2),分别输入123 45和123a,看看输出结果是什么?为什么?
答:n=2,n=1
把scanf赋值给变量时,scanf的值是输入的合法字符的个数
修改程序(1)如图
4.对其他你认为需要进行总结的内容进行总结。
这次作业个人认为需要总结的内容有如下几点:
1'if else结构,需搞清楚if ,else if,else,三者之间的关系,if和else if 后可跟条件语句,而else后不可跟条件语句,弄清楚执行 if else 语句的先后顺序以及运算符的优先级关系。
2'需牢记各种小细节如在判断关系时等号要用“==”而不是“=”
3'在实验课中需用到数学函数才能解决问题如绝对值函数:fabs(x)为绝对值函数,sqrt(x)为平方根函数,pow(x,n)为幂函数,exp(x)为指数函数,这些对于我们解决实际问题都相当重要。
4'遇到问题不能放弃,持之以恒的态度才能解决,所以坚持下去就能成功。
三:实验总结
(1):判断一个5位数是不是回文数。例如12321是一个回文数,即它的个位与万位相同,十位与千位相同。。
(2):
(3):
include<stdio.h>
int main(void)
{
int x,a,b,c,d;
scanf("%d",&x);
a=x/10000;
b=x%10000/1000;
c=x%100/10;
d=x%10;
if (ad&&bc)
{
printf("yes");
}
else
{
printf("no");
}
return 0;
}
(4):
(5):
问题:把求万位数和百位数搞混了
解决方法:实验课中通过请求老师帮助解决
(1):输入在一行中给出2个4位正整数,其间以空格分隔,分别表示火车的出发时间和到达时间。每个时间的格式为2位小时数(00-23)和2位分钟数(00-59),假设出发和到达在同一天内。
(2):
(3):
include <stdio.h>
int main(void)
{
int start, end;
int hour, minute;
scanf("%d%d", &start, &end);
start = start / 100 * 60 + start % 100;
end = end / 100 * 60 + end % 100;
hour = (end - start) / 60;
minute = (end -start) % 60;
printf("%02d:%02d\n", hour, minute);
return 0;
}
(4):
(5):
问题:想不出小时分钟转换的思路
解决方法:请教同学解决了问题
(1):中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?
(2):
(3):#include<stdio.h>
int main(void)
{
int a,N;
scanf("%d",&N);
a=N%5;
if(a1||a2||a==3)
{
printf("Fishing in day %d",N);
}
else
{
printf("Drying in day %d",N);
}
return 0;
}
(4):
(5):本实验没有出现问题
(1):为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。
(2):
(3):
include<stdio.h>
int main(void)
{
int a,b;
double yuan;
scanf("%d",&a);
if(a<0)
{
printf("Invalid Value!");
}
else if(a<=50)
{
yuan=a0.53;
printf("cost = %.2f",yuan);
}
else
{
yuan=(a-50)0.58+50*0.53;
printf("cost = %.2f",yuan);
}
return 0;
}
(4):
(5):
问题:yuan开始没定义为double类型
解决:通过观察结果发现不符合题意,反复检查发现错误并改正。
四:PTA提交列表
本次作业如上