C语言程序设计第三次作业——选择结构(1)
一 改错题
计算f(x)的值:输入实数x,计算并输出下列分段函数f(x)的值,输出时保留1位小数。
输入输出样例1:
Enterr x: 10.0
f(10.0) = 0.1
输入输出样例2:
Enter x: 234
f(234.0) = 234.0
源程序(有错误的程序)
#include <stdio.h>
int main(void)
{
double x,y;
printf("Enter x: \n");
scanf("=%f", x);
if(x = 10);
{
y = 1 / x
}
else (x != 10)
{
y = x;
}
printf("f(%.2f) = %.lf\n" x y);
return 0;
}
错误信息1:
错误原因:if后面有分号
解决方法:删去分号
错误信息2:
错误原因:语句后面缺少分号
解决方法:在“y = 1/x”后面加上分号
错误信息3:
错误原因:else后面不能有语句
解决方法:删去else后的语句
错误信息4:
错误原因:缺少“,”
解决方法:“x y”之间加上“,”,“x”前加上“,”
错误信息5:
错误原因一:格式符错误
解决办法:将%f改为%lf
错误原因二:1/x的结果为整数
解决办法改成1.0/x
错误原因三:scanf中x前面没有&
改正方法:在x前面加上&
错误原因四:if(x = 10)只有一个等号,一个等号代表赋值
改为if(x == 10)
错误原因五:scanf("=%lf", &x);中的等号会影响输入
改正方法:删去等号
错误原因六: printf("f(%.2f) = %.lf\n",x,y); y应该保留一位小数
改正方法:改为 printf("f(%.2f) = %.1lf\n",x,y);
最终结果:
符合要求。
二 学习总结
1.if(a)if(b) x=x+1;else y=y+1; 的确切含义是什么?这个else应该和哪个if配对?如何明确表达这种配对方法?将该段代码按照规范化的格式进行书写。
(1)含义:如果a成立则判断b是否成立,b成立则x=x+1不成立则y=y+1。
(2)else应该和最近的if配对。
(3)规范格式:
if(a)
{
if(b)
{
x=x+1;
}
else{
y=y+1;
}
}
2.C语言的表达式 (-10< x <10)能够表达x在区间(-10,10)吗?为什么?如果不能,正确的表达式应该怎么写?
不能。因为C语言中会先计算“-10<x”,然后结果是0或1,再与10进行比较。
正确表达式:-10<x && x<10。
3.C语言中输入数据时,如果遇到非法字符,则认为输入结束。运行程序(1),输入123a,看看输出结果是什么?你能解释是为什么吗?,
程序(1):
#include <stdio.h>
int main()
{
int a, b;
scanf("%d %d", &a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
运行结果:
原因:因为a是整形的,应该是整数,所以不会读入a,而b没有输入,输出的b为随机数。
scanf()函数的返回值是成功读入数据的个数,如果没有读取任何数据,则返回0。运行程序(2),分别输入123 45和123a,看看输出结果是什么?为什么?
程序(2):
#include <stdio.h>
int main()
{
int a, b,n;
n = scanf("%d %d", &a, &b);
printf("n = %d\n", n);
return 0;
}
运行结果:
原因:a,b,n皆为int类型的,而输入的只有123 45符合要求而scanf会输出符合要求的个数,即为2。
修改程序(1),当输入非法数据时,输出“Input error!".样例如下:
正确源代码:
#include <stdio.h>
int main()
{
int a,b,n;
n = scanf("%d%d",&a,&b);
if(n == 2)
{
printf("a = %d, b = %d\n", a, b);
}
else
{
printf("Input error!");
}
return 0;
}
4.对其他你认为需要进行总结的内容进行总结。
有些差不多的内容会记混,应该多熟悉尽量分清。学过的内容要多回顾,这样才能牢牢记住。
三 实验总结
3.
(1) 回文数
判断一个5位数是不是回文数。例如12321是一个回文数,即它的个位与万位相同,十位与千位相同。。
(2)流程图
(3)源代码
# include <stdio.h>
int main()
{
int a,b,c,d,x;
scanf("%d",&x);
a = x / 10000;
b = x / 1000 % 10;
c = x / 10 % 10;
d = x % 10;
if(a == d && b == c)
{printf("yes");
}
else
{printf("no");
}
return 0;
}
(4)测试数据及运行结果
(5)实验分析
问题1:某一位上的数计算错误。
原因:每一位数的方法都不一样,不能记混,但方法也不是唯一的,尽量多掌握几种。
问题2:if语句错误。
注意if语句括号中符号的改变。
5.
(1)
计算火车运行时间
本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。
(2)流程图
(3)源代码
#include <stdio.h>
int main(void)
{
int a, b,c,d,e,f;
scanf("%d%d", &a,&b);
e = a / 100 * 60 + a % 100;
f =b / 100 * 60 + b % 100;
c = (f - e) / 60;
d = (f - e) % 60;
printf("%02d:%02d",c,d) ;
return 0;
}
(4)测试数据及运行结果
(5)实验分析
问题1:时间间隔计算错误
解决方法:要注意将四位数分成小时和分钟部分,1分钟是60秒。
7
(1)
三天打鱼两天晒网
中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?
(2)流程图
(3)源代码
#include<stdio.h>
int main()
{
int N,x;
scanf("%d",&N);
x-N%10;
if(x == 0 || x == 4 || x == 5 || x == 9)
{
printf("Drying in day %d",N);
}
else
{
printf("Fishing in day %d",N);
}
return 0;
}
(4)测试数据及运行结果
(5)实验分析
不要把问题想的太复杂,打鱼和晒网是循环的,把握好什么时候应该干什么,可以先写下来找找规律。
9
(1)
阶梯电价
为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。
(2)流程图
(3)源代码
#include<stdio.h>
int main()
{
int a;
double b;
scanf("%d",&a);
if(a<0)
{
printf("Invalid Value!");
}
else if(a<=50)
{
b=0.53*a;
printf("cost = %.2f",b);
}
else
{
b=0.53*50+(a-50)*0.58;
printf("cost = %.2f",b);
}
return 0;
}
(4)测试数据及运行结果
(5)实验分析
问题1:计算错误
解决方法:先把数学问题弄清楚,不然结果不可能正确。
问题2:由于有好几个if语句,导致大括号的对应错误。
解决方法:大括号应该一一对应,并且要运用正确。
四PTA提交列表