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

编译
1242739-20171027145820258-572410521.png
错误
错误信息:(1)
1242739-20171027145820258-572410521.png
改正方法:讲if语句后的“,”去掉。
错误信息:(2)
1242739-20171027150815430-1340930947.png
改正方法:
在y=1/x语句后加上“;”
错误信息:(3)
1242739-20171027150850023-1968360528.png
改正方法:去掉else语句后的(x!=10)
错误信息:(4)
1242739-20171027145948211-1844510026.png
改正方法:在printf的 \n后边加上“,”在x y中间加上“,”
编译正确:
1242739-20171027150020992-1754764911.png
运行
1242739-20171027150037726-132188193.png
发现运行结果不正确,对程序进行修改。
修改1
运行格式不对
去掉printf里的\n,将scanf里的“=”去掉。
1242739-20171027161257664-115394444.png
运行结果
1242739-20171027161318461-1641203519.png
发现还是不对,继续修改。
修改2
将%f改为%lf,在x前加上取地址符
1242739-20171027161449992-1116291307.png
运行结果
1242739-20171027161519758-1428665490.png
依然不对,需要继续修改。
修改3
发现printf后的%.1f错写成了%.lf。
1242739-20171027154428226-1908077488.png
运行结果
1242739-20171027154752508-978072409.png
1242739-20171027154844148-805224482.png
发现输入10.0时结果正确,但234时结果不对,继续修改。
修改4
x=10处不对,应该改为x==10。
1242739-20171027162000680-1188478271.png
运行结果
1242739-20171027162036211-1111192313.png
1242739-20171027162050445-338464103.png
发现还是不符要求,还需继续修改。
修改5
将f(%.2f)改为(%.1f)
1242739-20171027155917851-287027721.png
运行结果
1242739-20171027160006258-1260735464.png
1242739-20171027161944226-1566740350.png
发现符合要求。
(二)学习总结
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;
}
输出结果
1242739-20171027212633414-1262403911.png
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;
}

输出结果
1242739-20171027215836680-2017517420.png
1242739-20171027215854445-1795525884.png
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;
}

运行结果
1242739-20171027223059336-532142730.png
4.对其他你认为需要进行总结的内容进行总结。
在做第一题改错的时候,通过改错就发现了自己的许多不足,比如,改错题中x前没有加取地址符就一直没有找出这个错误,还是通过问其他同学才改正过来,其实像这种比较低级的错误,是不应该犯的。还有在使用if else 语句时,总是忘记if下加上大括号,导致编译总出错。总之,在这些细致的知识点处应该多加注意。而且对switch case语句应用很不熟练,应该多加练习。
(三)实验总结

本次实验总结,学号末位数是单数的同学完成选择结构(1)中的3、5、7、9题,学号末位数是双数的同学完成选择结构(1)中的2、4、6、8题。
3.回文数
(1)题目
判断一个5位数是不是回文数。例如12321是一个回文数,即它的个位与万位相同,十位与千位相同。。
(2)流程图
1242739-20171028134022742-1942917941.png
(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)测试数据及运行结果
1242739-20171028134804633-351080001.png
1242739-20171028134853867-1403556081.png
(5)实验分析
问题1:
总是输不出想要的值。
原因:对求余应用的不太好,if后的语句没有加两个等号。
解决办法:
像同学求助,解决问题。

  1. 计算火车运行时间
    (1)题目
    本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。
    (2)流程图
    1242739-20171028135728101-1063404642.png
    (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)测试数据及运行结果
1242739-20171028140152648-500179464.png
1242739-20171028140653430-1962079360.png
(5)实验分析
问题1:在f<d时,求不出所希望的值。
原因:忘记了时间是60进制的
解决办法:仔细检查,解决问题。
7.三天打鱼两天晒网
(1)题目
中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?
(2)流程图
1242739-20171028140958008-1981286502.png
(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)测试数据及运行结果
1242739-20171028150504023-1906793805.png
1242739-20171028150520523-343897051.png

(5)实验分析
改题比较简单,没有太大问题
9.阶梯电价
(1)题目
为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。
(2)流程图
1242739-20171028143838789-242096825.png
(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)测试数据及运行结果
1242739-20171028144106351-826382491.png
1242739-20171028144125133-1809977180.png
(5)实验分析
问题1:算不出数。
原因:有数学函数时,要定义数学类型的。
解决办法向同学请教,解决问题。
(四)PTA提交列表
1242739-20171028145122023-1790587840.png
1242739-20171028144845726-1980053434.png
1242739-20171028144902805-683501118.png
1242739-20171028144921664-380957242.png

转载于:https://www.cnblogs.com/luyu0322-/p/7743755.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值