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; 
     }

对源程序进行编译,采用每次修改第一个错误并重新编译的方法,记录每个错误的错误信息、分析错误原因并给出正确的语句。

  错误信息:
1242358-20171027104611086-1959219584.png
  错误原因:if语句后接了;,使else语句找不到对应的if.
  改正方法:去掉;
  错误信息:
1242358-20171027104816211-1838445752.png
  错误原因:缺少;,语句无法停止。
  改正方法:在y = 1/x后加;
  错误信息:
1242358-20171027105031383-345541326.png
错误原因:else后加了判断语句,读取错误.
改正方法:删除判断语句
错误信息:
1242358-20171027105607164-1985528509.png
错误原因:""与x之间缺少,
改正方法:加,
错误信息:
1242358-20171027105717086-612529462.png
错误原因:xy之间缺少,
改正方法:加上,
错误信息:
1242358-20171027111239351-940006294.png
错误原因:x前缺少&
改正方法:加上&
错误信息:
1242358-20171027111345414-1790290840.png
错误原因:输出语句中变量 x 对应的为 %.2f 。
改正方法:把输出语句中的 %.2f 改为 %.1f 。
错误信息:
1242358-20171027111512148-1891295570.png
错误原因:\n使ENTER x: 与输入数据没有在同一行
改正方法:删去\n
错误信息:
1242358-20171027111654976-1713259160.png
错误原因:输出语句中变量 y 对应的为 %.lf
改正方法:输出语句中的 %.lf 改为 %.1f
正确:
1242358-20171027111937211-454015891.png
but:!!!!!!!!!!!!!!!!!!!!!!!!
1242358-20171027112146664-1689837630.png
错误原因:判断语句中的等于为 =
改正方法:判断语句中的 = 改为 ==
错误消息:
1242358-20171027121125211-50095480.png
错误原因:scanf语句中=%f应为%lf
改正方法:改为%lf
1242358-20171027121521695-2044290538.png
1242358-20171027121555226-1447610667.png

(二)学习总结

1.if(a)if(b) x=x+1;else y=y+1; 的确切含义是什么?这个else应该和哪个if配对?如何明确表达这种配对方法?将该段代码按照规范化的格式进行书写。
答:(1)确切含义为如果符合条件a则往后运行,再符合b则运行x=x+1。若不符合b则运行y=y+1
(2)else应与离他最近且没有else配对的if配对
(3)每个if、else后均加上大括号。
(4)

if(a)
{
    if(b)
    {
        x=x+1;
    }
}
else
{
    y=y+1;
}

2.C语言的表达式 (-10< x <10)能够表达x在区间(-10,10)吗?为什么?如果不能,正确的表达式应该怎么写?
答:
(1)不能
(2)因为小于是从左到右运行,(-10<x)若正确则值为1,错误则为2。然后再与10进行比较。
(3)正确表达式为:
(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;
}

答:输出结果为 a = 123, b = 1
答因为a,b为int型,并不是字符,所以系统不能读取,便认为输入已停止,给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;
}

答:输出结果为n = 2和n = 1,因为返回值是成功读取变量的个数,所以当输入“123 45”的时候,因为两个数都是整形,可以读出两个数据,所以n=2;当输入“123a”的时候因为“a”是字符,为非法数据,不能赋值,所以只将“123”赋值给了a,程序只读出一个数据,所以n=1
4.对其他你认为需要进行总结的内容进行总结。
(1)if类型语句要注意保持同样的缩进,尤其是大括号
(2)逻辑运算的短路特性
(3)等于号是==

三、实验总结

1.回文数
(1)题目
判断一个5位数是不是回文数。例如12321是一个回文数,即它的个位与万位相同,十位与千位相同。
(2)流程图
1242358-20171028230254851-1692068611.png
(3)源代码

#include <stdio.h>
int main()
{
    int n,a,b,c,d;
    scanf("%d",&n);
    a=n/10000;
    b=n/1000%10;
    c=n%100/10; 
    d=n%10; 
    if(a==d && b==c)
    {
        printf("yes");
    }
    else
    {
        printf("no");
    }

    return 0;
}

(4)测试数据及运行结果
运行结果1:
1242358-20171028223118430-1479595336.png
运行结果2:
1242358-20171028223154305-1597532257.png
(5)实验分析
问题:输入第二次数据时,65432,显示为回文数
解决办法:重新编译,试了几次就正常了

  1. 计算火车运行时间
    (1)题目
    本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。
    (2)流程图
    1242358-20171028230434070-857746950.png
    (3)源代码
#include <stdio.h>
int main()
{
    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)测试数据及运行结果
运行结果1:
1242358-20171028223349461-55333244.png
运行结果2:
1242358-20171028223439508-485295744.png
(5)实验分析
问题:减法需要考虑借位
解决办法:15:12要借位改为14:72

  1. 三天打鱼两天晒网
    (1)题目
    中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?
    (2)流程图
    1242358-20171028230523055-607410352.png
    (3)源代码
#include <stdio.h>
int main()
{
    int N,a;
    scanf("%d",&N);
    a=N%5;
    if(a>=1 && a<=3)
    {
        printf("Fishing in day %d",N);
    }
    else
    {
        printf("Drying in day %d",N);
    }
    return 0;
}

(4)测试数据及运行结果
运行结果1:
1242358-20171028223546555-1333864747.png
运行结果2:
1242358-20171028224033351-676337085.png
(5)实验分析
问题1:程序无法运行
解决办法:源代码中scanf("%d",&N);写成了scanf("%d",N),在N的前面加上&

  1. 阶梯电价
    (1)题目
    为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。
    (2)流程图
    1242358-20171028230713930-1177861792.png
    (3)源代码
#include <stdio.h>
int main()
{
    double d,cost;
    scanf("%lf",&d);
    if(d<0)
    {
        printf("Invalid Value!");
    }
    else if(d>=0 && d<=50)
    {
        cost=d*0.53;
        printf("cost = %.2f",cost);
    }
        else if(d>50)
    {
        cost=26.5+0.58*(d-50);
        printf("cost = %.2f",cost);
    }
    return 0;
}

(4)测试数据及运行结果
运行结果1:
1242358-20171028224143523-947754733.png
运行结果2:
1242358-20171028224253992-2006979171.png
(5)实验分析
问题:输出结果格式错误
解决方法:定义d是double类型,却将输入格式写成%d,将%d改成&lf

四、PTA提交列表

1242358-20171028224403289-1485705563.png

转载于:https://www.cnblogs.com/hfaq/p/7748277.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值