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提交列表



posted @ 2017-10-28 15:10  vahalla  阅读(4791)  评论(0编辑  收藏  举报