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后面不能有语句
解决方法:删去else后的语句
错误信息4:

错误原因:缺少“,”
解决方法:“x y”之间加上“,”,“x”前加上“,”
错误信息5:

错误原因一:格式符错误
解决办法:将%f改为%lf
错误原因二:1/x的结果为整数
解决办法改成1.0/x
错误原因三:scanf中x前面没有&
改正方法:在x前面加上&
错误原因四:if(x = 10)只有一个等号,一个等号代表赋值
改为if(x == 10)
错误原因五:scanf("=%lf", &x);中的等号会影响输入
改正方法:删去等号
错误原因六: printf("f(%.2f) = %.lf\n",x,y); y应该保留一位小数
改正方法:改为 printf("f(%.2f) = %.1lf\n",x,y);
最终结果:

符合要求。

二 学习总结

1.if(a)if(b) x=x+1;else y=y+1; 的确切含义是什么?这个else应该和哪个if配对?如何明确表达这种配对方法?将该段代码按照规范化的格式进行书写。
(1)含义:如果a成立则判断b是否成立,b成立则x=x+1不成立则y=y+1。
(2)else应该和最近的if配对。
(3)规范格式:

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

2.C语言的表达式 (-10< x <10)能够表达x在区间(-10,10)吗?为什么?如果不能,正确的表达式应该怎么写?
不能。因为C语言中会先计算“-10<x”,然后结果是0或1,再与10进行比较。
正确表达式:-10<x && 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是整形的,应该是整数,所以不会读入a,而b没有输入,输出的b为随机数。
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,n皆为int类型的,而输入的只有123 45符合要求而scanf会输出符合要求的个数,即为2。
修改程序(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.对其他你认为需要进行总结的内容进行总结。
有些差不多的内容会记混,应该多熟悉尽量分清。学过的内容要多回顾,这样才能牢牢记住。
三 实验总结
3.
(1) 回文数
判断一个5位数是不是回文数。例如12321是一个回文数,即它的个位与万位相同,十位与千位相同。。
(2)流程图

(3)源代码

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

(4)测试数据及运行结果

(5)实验分析
问题1:某一位上的数计算错误。
原因:每一位数的方法都不一样,不能记混,但方法也不是唯一的,尽量多掌握几种。
问题2:if语句错误。
注意if语句括号中符号的改变。
5.
(1)
计算火车运行时间
本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。
(2)流程图

(3)源代码

#include <stdio.h>
int main(void) 
{
    int a, b,c,d,e,f; 
    scanf("%d%d", &a,&b);
    e = a / 100 * 60  + a % 100;
    f =b / 100 * 60 + b % 100;
    c = (f - e) / 60;
    d = (f - e) % 60;
printf("%02d:%02d",c,d)    ;
    return 0;
}

(4)测试数据及运行结果

(5)实验分析
问题1:时间间隔计算错误
解决方法:要注意将四位数分成小时和分钟部分,1分钟是60秒。
7
(1)
三天打鱼两天晒网
中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?
(2)流程图

(3)源代码

#include<stdio.h>
int main()
{
    int N,x;
    scanf("%d",&N);
    x-N%10;
    if(x == 0 || x == 4 || x == 5 || x == 9)
    {
	    printf("Drying in day %d",N);
    }
    else
    {
	    printf("Fishing in day %d",N);
    }
    return 0;
}

(4)测试数据及运行结果

(5)实验分析
不要把问题想的太复杂,打鱼和晒网是循环的,把握好什么时候应该干什么,可以先写下来找找规律。
9
(1)
阶梯电价
为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。
(2)流程图

(3)源代码

#include<stdio.h>
int main()
{
  int a;
  double b;
  scanf("%d",&a);
  if(a<0)
  {
    printf("Invalid Value!");
  }
  else if(a<=50)
  {
    b=0.53*a;
    printf("cost = %.2f",b);
  }
      else
      {
        b=0.53*50+(a-50)*0.58;
        printf("cost = %.2f",b);
      }
  
      return 0;
}    

(4)测试数据及运行结果

(5)实验分析
问题1:计算错误
解决方法:先把数学问题弄清楚,不然结果不可能正确。
问题2:由于有好几个if语句,导致大括号的对应错误。
解决方法:大括号应该一一对应,并且要运用正确。
四PTA提交列表

posted @ 2017-10-29 11:23  计科1702冯亚杰  阅读(365)  评论(0编辑  收藏  举报