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语句后的(x!=10)
错误信息:(4)
改正方法:在printf的 \n后边加上“,”在x y中间加上“,”
编译正确:
运行
发现运行结果不正确,对程序进行修改。
修改1
运行格式不对
去掉printf里的\n,将scanf里的“=”去掉。
运行结果
发现还是不对,继续修改。
修改2
将%f改为%lf,在x前加上取地址符
运行结果
依然不对,需要继续修改。
修改3
发现printf后的%.1f错写成了%.lf。
运行结果
发现输入10.0时结果正确,但234时结果不对,继续修改。
修改4
x=10处不对,应该改为x==10。
运行结果
发现还是不符要求,还需继续修改。
修改5
将f(%.2f)改为(%.1f)
运行结果
发现符合要求。
(二)学习总结
1.if(a)if(b) x=x+1;else y=y+1; 的确切含义是什么?这个else应该和哪个if配对?如何明确表达这种配对方法?将该段代码按照规范化的格式进行书写。
他的确切含义是,判断如果是a和b,则输出x=x+1,如果不是则输出y=y+1。else应该与离着else最近的if配对。在与else配对的if下面加上大括号。
规范化的格式为
if(a && b)
{
x=x+1
}
else
{
y=y+1
}
2.C语言的表达式 (-10< x <10)能够表达x在区间(-10,10)吗?为什么?如果不能,正确的表达式应该怎么写?
不能,因为在C语言中,只有0和1,如果这种格式,若x>-10,则为真命题,会输出1,同理1<10,也为真命题,则最后结果为1。不能表示x在区间(-10,10)这个区间内。
正确表达式的写法为
(x>-10 && 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;
}
输出结果
b被赋予一个没有意义的数字,所以输入123a,a是非法字符,所以会输出a=123,b=1。
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都是整型数据,当输入123 45时,会成功读入数据的个数,123 45是两个数据,所以会输出2。但当输入123a时,a是非法字符,123是一个能够成功读入的数据,所以会输出1。
修改程序(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.对其他你认为需要进行总结的内容进行总结。
在做第一题改错的时候,通过改错就发现了自己的许多不足,比如,改错题中x前没有加取地址符就一直没有找出这个错误,还是通过问其他同学才改正过来,其实像这种比较低级的错误,是不应该犯的。还有在使用if else 语句时,总是忘记if下加上大括号,导致编译总出错。总之,在这些细致的知识点处应该多加注意。而且对switch case语句应用很不熟练,应该多加练习。
(三)实验总结
本次实验总结,学号末位数是单数的同学完成选择结构(1)中的3、5、7、9题,学号末位数是双数的同学完成选择结构(1)中的2、4、6、8题。
3.回文数
(1)题目
判断一个5位数是不是回文数。例如12321是一个回文数,即它的个位与万位相同,十位与千位相同。。
(2)流程图
(3)源代码
# include<stdio.h>
int main()
{
int a,m,n,p,q;
scanf("%d",&a);
m=a/10000;
n=(a%10000)/1000;
p=(a/1000)%10;
q=(a%100)%10;
if(m==q && n==p)
{printf("yes");}
else
{printf("no");}
return 0;
}
(4)测试数据及运行结果
(5)实验分析
问题1:
总是输不出想要的值。
原因:对求余应用的不太好,if后的语句没有加两个等号。
解决办法:
像同学求助,解决问题。
5. 计算火车运行时间
(1)题目
本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。
(2)流程图
(3)源代码
# include <stdio.h>
int main(void)
{
int a,b,c,d,e,f,minute,hour;
scanf("%d %d",&a,&b);
c=a/100;
d=a%100;
e=b/100;
f=b%100;
if(f>=d)
{
hour = e-c;
minute = f-d;
}
else
{
hour = e-c-1;
minute = 60-(d-f);
}
printf("%02d:%02d",hour,minute);
return 0;
}
(4)测试数据及运行结果
(5)实验分析
问题1:在f<d时,求不出所希望的值。
原因:忘记了时间是60进制的
解决办法:仔细检查,解决问题。
7.三天打鱼两天晒网
(1)题目
中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?
(2)流程图
(3)源代码
# include <stdio.h>
int main(void)
{
int N,a;
scanf("%d",&N);
a=N%5;
if(a==1 || a==2 || a==3)
{
printf("Fishing in day %d",N);
}
else if(a==4 || a==0)
{
printf("Drying in day %d",N);
}
return 0;
}
(4)测试数据及运行结果
(5)实验分析
改题比较简单,没有太大问题
9.阶梯电价
(1)题目
为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。
(2)流程图
(3)源代码
# include <stdio.h>
# include <math.h>
int main(void)
{
double q,c;
scanf("%lf",&q);
if(q>=0 && q<=50)
{
c=0.53*q;
printf("cost = %.2f",c);
}
else if(q>50)
{
c=0.53*50+(q-50)*0.58;
printf("cost = %.2f",c);
}
else if(q<0)
{
printf("Invalid Value!");
}
return 0;
}
(4)测试数据及运行结果
(5)实验分析
问题1:算不出数。
原因:有数学函数时,要定义数学类型的。
解决办法向同学请教,解决问题。
(四)PTA提交列表