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;
}
对源程序进行编译
1242734-20171026153036305-1581965647.png
(1)错误信息:1242734-20171026153244726-2023467535.png
错误原因:在第九行y = 1 / x后缺;
改正方法:在y = 1 / x后加;
(2)错误信息:1242734-20171026155455289-260944812.png
错误原因:else后不能加东西
改正方法:去掉(x != 10)
(3)错误信息:1242734-20171026161042601-567332869.png
错误原因:if(x==10)后边不能加“;”。
改正方法:去掉if后的(x==10)
(4)错误原因:1242734-20171026165146992-1904392557.png

1242734-20171026165139336-1081460790.png

错误信息:xy中间缺少“,”
改正方法:x y 改为,x,y
1242734-20171026171412445-834965152.png
没有错误但发现如下错误
(5)错误原因:1242734-20171026171121180-1593826138.png
错误信息:x没有取地址符
改正方法:x前加“&”

1242734-20171026172034586-1551076413.png

(6)错误原因:1242734-20171026172644226-665386693.png
错误信息:输出处为%.lf
改正方法:改成%.1f
(7)错误信息:1242734-20171026173542758-1276670031.png
错误原因:if后为(x = 10)为赋值语句
改正方法:if(x=10)改为if(x == 10)
1242734-20171026174013242-1166395982.png
修改完成

(二)学习总结

(1)if(a)if(b) x=x+1;else y=y+1; 的确切含义是什么?这个else应该和哪个if配对?如何明确表达这种配对方法?将该段代码按照规范化的格式进行书写。
if(a)
if(b)
{
x=x+1;
}
else
{
y=y+1;
}
上图的确切含义是什么?
如果条件是满足a和b的话则输出x=x+1;否则输出y=y+1
这个else应该和哪个if配对?
else应该和第二个if配对
如何明确表达这种配对方法?
在if的每个选择语句后都要加{}将内容扩住。
将该段代码按照规范化的格式进行书写。

1242734-20171026214220914-2005277331.png

(2)C语言的表达式 (-10< x <10)能够表达x在区间(-10,10)吗?为什么?如果不能,正确的表达式应该怎么写?
不能表达
这种只能比较大小,而且只能输出0和1,并不能来限制x的区间
正确的方式:x > -10 && x < 10

程序(1)C语言中输入数据时,如果遇到非法字符,则认为输入结束。运行程序(1),输入123a,看看输出结果是什么?你能解释是为什么吗?
#include <stdio.h>
int main()
{
int a, b,n;
n = scanf("%d %d", &a, &b);
printf("n = %d\n", n);
return 0;
}
输出结果是什么?

1242734-20171026215620586-483211068.png

为什么?因为输入的格式不对,输入字母为非法数据,这是会抱错,且b会输出毫无意义的1数字。若将第二个输入时的%d改为%c则正常
程序(2)scanf()函数的返回值是成功读入数据的个数,如果没有读取任何数据,则返回0。运行程序(2),分别输入123 45和123a,看看输出结果是什么?为什么?
#include <stdio.h>
int main()
{
int a, b;
scanf("%d %d", &a, &b);
printf("a = %d, b = %d\n", a, b);
return 0;
}
scanf()函数的返回值是成功读入数据的个数,成功读入两个所以读出n=2。如果只读出一个n=1。如果没有读取任何数据,则读出n=0。
修改程序(1)
#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;
}
1242734-20171027101609476-1312592310.png
1242734-20171027103447180-1918832198.png
(4)

(1)if语句中的表达式可以是关系表达式,逻辑表达式,甚至是数值表达式,返回的是一个逻辑值,即真或假。要注意每个判断语句后不能加;否则不进入判断框中。
(2)if语句写在多行上,都是一个整体,属于一个语句。不要误认为if部分是一个语句,else部分是另一个语句。所以要放在一个{}中
(3)if后的下的语句都要加{}否则知识进行第一行的执行,对第二行以下都没有影响。

(三)实验总结

本次实验总结,学号末位数是单数的同学完成选择结构(1)中的3、5、7、9题,学号末位数是双数的同学完成选择结构(1)中的2、4、6、8题。

3.(1)题目

计算符号函数的值(10 分)
对于任一整数n,符号函数sign(n)的定义如下:
1242734-20171027104919367-1061469769.jpg
请编写程序计算该函数对任一输入整数的值

(2)流程图

1242734-20171027130823680-843082499.png

(3)源代码
#include <stdio.h>
int main(void)
{
int n,a,b,c,d;
scanf("%d",&n);
a=n/10000;
b=n%10000/1000;
c=n%100/10;
d=n%10;
if(a==d,b==c)
{
printf("yes");
}
else
{
printf("no");
}
return 0;
}
(4)测试数据及运行结果

1242734-20171027133450039-1113545588.png

(5)实验分析
问题1:输出的答案老是不对
原因:搞不懂%与/在c语言里的运用方法
解决办法:要熟练理解“%”和“/”的运用方法
5.(1)题目

计算火车运行时间(10 分)
本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。

(2)流程图

1242734-20171027205210836-150995488.png

(3)源代码
#include <stdio.h>
int main()
{
int t1,t2,h1,m1,h2,m2,h3,m3;
scanf("%d %d",&t1,&t2);
h1 = t1/100;
m1 = t1%100;
h2 = t2/100;
m2 = t2%100;
if((m2-m1)< 0)
{
h3=h2-1-h1;
m3=m2+60-m1;
}
else
{
h3=h2-h1;
m3=m2-m1;
}
printf("%02d:%02d",h3,m3);
}
(4)测试数据及运行结果

1242734-20171027133759336-776381807.png

(5)实验分析
问题1:可能结果会出现负数
原因:由于没有判断分钟的大小关系
解决办法:用if语句设置两个状况,在h2大于h1时,和h2小于h1时两种情况
7. (1)三天打鱼两天晒网(10 分)

中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?

(2)流程图

1242734-20171027140452117-1700280869.png

(3)源代码
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
if(n % 5 <= 3 && n % 5 != 0)
{
printf("Fishing in day %d",n);
}
else
{
printf("Drying in day %d",n);
}
}
(4)测试数据及运行结果

1242734-20171027140802023-235401401.png
1242734-20171027140804367-1529803318.png

(5)实验分析
本题没有错误
9.(1) 题目阶梯电价(10 分)

为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。

(2)流程图

1242734-20171027205356226-33151565.png

(3)源代码
#include <stdio.h>
int main(void)
{
double x,cost;
scanf("%lf",&x);
if(x < 0)
{
printf("Invalid Value!");
}
else if(x <= 50)
{
cost=x*0.53;
printf("cost = %.2f",cost);
}
else
{
cost=26.5+(x-50)*0.58;
printf("cost = %.2f",cost);
}
return 0;
}
(4)测试数据及运行结果

1242734-20171027145202664-1446177736.png

1242734-20171027145210273-719707486.png

(5)实验分析
问题1:输出的一直位数不对
原因:没有不能限制位数
改正方法:输出是格式为%.2f格式正确
(四)PTA提交列表

1242734-20171027150543601-512535154.png
1242734-20171027150731336-1598681084.png
1242734-20171027150834539-1508706202.png
1242734-20171027150846867-409943346.png

转载于:https://www.cnblogs.com/lipan123/p/7745176.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值