C语言程序设计第三次作业
C语言程序设计第三次作业
(一)改错题
计算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;
}
错误信息:
错误原因:if语句后面加了引号使程序无法继续向下运行
改正:把if();中分号去掉
错误信息:
错误原因:y = 1 / x后面没有分号使程序无法正常结束
改正:在x后面加分号
错误信息:
错误原因:else后面还加了判断条件,else是对if的补充而已,不符合if就一定会跳转到else
改正:去掉(x != 10)或者改成else if语句
错误信息:
错误原因:输出语句中x,y前面没有逗号隔开
改正:在x,y前面加上逗号
错误信息:
错误原因:输出语句中f(%.2f)是保留了两位小数按题目要求应该保留一位
改正:应改为f(%.1f)
错误信息:
错误原因:if()中=是赋值的==才能进行判断使用
改正:if(x = 10)改为if(x == 10)
错误信息:
错误原因:在scanf语句中没有取地址符
改正:在x前加&
错误信息:
错误原因:scanf语句中去掉=然后定义的是double类型应该改为%lf
错误信息:
错误原因:输出格式不对根据题目要求printf("Enter x:\n");中不用换行
改正:去掉\n
运行测试结果:
(二)学习总结
1.if(a)if(b) x=x+1;else y=y+1; 的确切含义是什么?这个else应该和哪个if配对?如何明确表达这种配对方法?将该段代码按照规范化的格式进行书写。
判断是否同时符合a,b两个条件,如果符合就将x+1的值赋给x有一个条件不符合就将y+1的值赋给y。这个else和后面的if配对
正确写法:
if(a&&b)
{
x=x+1;
}
else
{
y=y+1;
}
为避免发生类似if和else配对错误往往在写程序时在if,else if后面加上{}
2.C语言的表达式 (-10< x <10)能够表达x在区间(-10,10)吗?为什么?如果不能,正确的表达式应该怎么写?
不能这样表示按逻辑运算符从左到右的顺序,假如输入的是5那么这样输出的结果是1,5>-10正确输出1,1<10正确最后输出1。正确来写:(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;
}
输入123a后:
程序在遇到非法运算符时会停止赋值将非法运算符前面的数值赋给a将1赋给b。
验证:输入1265m55程序会将1265给a,b=1
在输入a,b两个值时用空格分开,但如果输入的是12b2 16那么就是a=12,b=1。因为遇到非法运算符了程序停止16不能正常赋给b,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;
}
输入123 45
输入123a
输入123a的时候遇到了非法运算符a无法继续读取你所输入的值所以只正确读取一次n=1
修改程序(1),当输入非法数据时,输出“Input error!"
修改后:
#include <stdio.h>
int main()
{
int a, b,n;
n = scanf("%d %d", &a, &b);
if(n==1)
{
printf("Input error!");
}
else
{
printf("n = %d\n", n);
}
return 0;
}
测试:
4.总结:通过本次作业我了解到了非法运算符的后果以及赋值规律,对于那些编译通过输出结果有误的一定要有耐心,要考虑周全。对于一些我经常遇到的编译运行错误做一下小总结
错误信息:C:\Users\lt\Desktop\collect2.exe [Error] ld returned 1 exit status 出现这种情况不是写的程序有问题这时需要关掉运行窗口从新编译运行。
错误信息:
这种情况有时也会出现这是由于输入语句中没有取地址符&
还有一点就是else后面如果只有一条语句也可不加{}。但为了清晰起见,最好加上,这样更明白些,省的出错。if语句中()判断一定是是否相等是==
(三)实验总结
(1)题目:回文数,要求:判断一个5位数是不是回文数。例如12321是一个回文数,即它的个位与万位相同,十位与千位相同
(2)流程图 :
(3)源代码 :
#include<stdio.h>
int main()
{
int a,b,c,d,e,f,g;
scanf("%d",&a);
b=a/10000;/*万位*/
c=a/1000;
d=c%10;/*千位*/
e=a%100;
f=e/10;/*十位*/
g=a%10;/*个位*/
if(b==g&&d==f)
{
printf("yes");
}
else
{
printf("no");
}
}
(4)测试数据及运行结果:
(5)实验分析:
本题没有遇到问题,但值得一提的是本题中需要算一个数5位数的万位、千位、十位、个位难免在后面判断时有点混乱加上注释是个不错的选择。
(1)题目: 计算火车运行时间,要求:本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。
(2)流程图 :
(3)源代码 :
#include<stdio.h>
#include<math.h>
int main()
{
int a,b,c,d,l,f,h,g,k,z,m;
scanf("%d %d",&a,&b);
c=a/100;//小时
d=b/100;
f=a%100;//分钟
g=b%100;
m=c*60+f;
h=d*60+g;
k=fabs(m-h);
z=k/60;
l=k%60;
printf("%02d:%02d",z,l);
}
(4)测试数据及运行结果:
(5)实验分析:
问题:
上面按照题目给出的测试数据结果是正确的但是如果给出别的时间那么它就不符合实际了
原因:反了常识性问题分钟和小时之间是60进一的关系
解决办法:先把时间全部换算成分钟然后进行减法运算最后除以60就是小时和60求余就是分钟
(1)题目:三天打鱼两天晒网,要求:中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?
(2)流程图 :
(3)源代码 :
#include<stdio.h>
int main()
{
int c,n;
scanf("%d",&n);
c=n%5;
if(c<=3&&c!=0)
{
printf("Fishing in day %d",n);
}
else
{
printf("Drying in day %d",n);
}
}
(4)测试数据及运行结果:
(5)实验分析:
问题:
原因:考虑问题不够全面导致结果不符合实际情况
解决:要对c=0这种情况分析把if语句改成if(c<=3&&c!=0)
(1)题目:阶梯电价,要求:为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。
(2)流程图 :
(3)源代码 :
#include<stdio.h>
int main()
{
double d,m,k;
scanf("%lf",&d);
if(d>0&&d<=50)
{
m=d*0.53;
printf("cost = %.2lf",m);
}
else if(d<=0)
{
printf("Invalid Value!");
}
else
{
k=50*0.53+(d-50)*0.58;
printf("cost = %.2lf",k);
}
}
(4)测试数据及运行结果:
(5)实验分析:
问题:
原因:如果if后面依然有判断条件那么后面肯定是else if最后else,else后面不能加()
改正:把中间的if改正else if