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:
 错误原因:第9行最后没加分号。
 改正方法:在“x”后加分号。
 错误信息2:
 错误原因:第7行的if括号里的语句后加了分号,无法与else配对。
 改正方法:去掉if一行中的分号。
 错误信息3:
 错误原因:else后边不能加语句。
 改正方法:去掉else后括号里的语句。
 错误信息4:
 错误原因:输语句中引号后要加逗号。
 改正方法:在15行的“x”前加逗号。
 错误信息5:
 错误原因:x与y两个变量之间要用逗号隔开。
 改正方法:在x与y之间加上逗号。
 错误信息6:
 错误原因:题目要求输出时保留一位小数,且把“l”错写成“1”。
 改正方法:将“%.lf”改为“%.1f”。
 错误信息7:
 错误原因:if后不用赋值单等号而用等于双等号。
 改正方法:将单等号改为双等号。
错误信息8:
错误原因:输入语句里不能有等号。
改正方法:去掉等号。
错误信息9:
错与原因:输入语句中要加地址符。
改正方法:在x前加&。
错误信息10:
错与原因:运行后发现输入10.0后,括号里是10.00。
改正方法:将第15行的括号里的“%.2f”改为“%.1f”。
错误信息11:
错与原因:运行后发现格式与所给示例不同,换行了,“\n”多余。
改正方法:将“\n”去掉。
错误信息12:
错误原因:第一个输入示例运行正确后,输入第二个事例结果错误,x,y定义为double型,输入语句里应用“%lf”。
改正方法:输入语句里将“%f”改为“%lf”。
改正后运行结果正确,如图:


正确源程序为:

(二)学习总结
1.if(a)if(b) x=x+1;else y=y+1; 的确切含义是什么?这个else应该和哪个if配对?如何明确表达这种配对方法?将该段代码按照规范化的格式进行书写。
答:此程序段的确切含义是若a且b,则执行x=x+1;否则,则执行y=y+1。else应和第二个if配对。
正确表达:

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

2.C语言的表达式 (-10< x <10)能够表达x在区间(-10,10)吗?为什么?如果不能,正确的表达式应该怎么写?
答:不能,C语言中自左向右判断,所以先判断x>-10是否正确,而无法判断x<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;
}

答:输入后得到结果如图:

当输入123a时,a为非法字符,输入结束,则a=123,而b被赋值为1。若想b=a,则输入输出语句中d所对应的%d改为%c。如图:
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;
}

答:输出结果如图:

输入123 45后n=2,说明成功读入2个数据,scanf()函数的返回值为2。

输入123a后n=1,说明只成功读入1个数据,因为有一个非法字符a,所以停止输入,所以只有一个数据。
修改程序(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;
}

输入123 45和123a后结果如图:


4.总结:
(1)判断条件是否成立要用到关系运算符,关系运算符的结合方向为自左向右,关系运算符的优先级低于算术运算符,高于赋值运算符。
(2)逻辑运算符中“且”用“&&”表示,“或”用“||”表示。
(3)复合语句的分支中要使用花括号,使if与else一 一对应。
(4)字符常量用来存放字符常量,只能放一个字符,用char声明,输入输出时用“%c”表示。
(三)实验总结
1.计算分段函数[2]
(1)题目
本题目要求计算下列分段函数f(x)的值:

(2)流程图

(3)源代码

#include <stdio.h>
#include <math.h>
int main (void)
{
    double x,relust;
    scanf("%lf",&x);
    if (x>=0)
    {
	    relust=pow(x,0.5);
    }
    else
    {
	    relust=pow((x+1),2)+2*x+1/x;
    }
    printf("f(%.2f) = %.2f",x,relust);
    return 0;
}

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


(5)实验分析
问题:流程图中无法赋值。
原因:流程图与源程序的算术运算符弄混了。
解决办法:记牢流程图与源程序运算符的区别。
2.算术入门之加减乘除
(1)题目
对于输入的两个整数,按照要求输出其和差积商。
(2)流程图

(3)源代码

#include <stdio.h>
int main (void)
{
    int a,b,c,d,f,h;
    double g;
    scanf("%d %d",&a,&b);
    c=a+b;
    d=a-b;
    f=a*b;
    printf("%d + %d = %d\n%d - %d = %d\n%d * %d = %d\n",a,b,c,a,b,d,a,b,f);
    g=(double)a/b;
    h=a%b;
    if (h==0)
    {
        printf("%d / %d = %.0f",a,b,g);
    }
    else
    {
        printf("%d / %d = %.2f",a,b,g);
    }
    return 0;
}

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


(5)实验分析
问题:a与b的商为小数。
原因:没有判断a/b的余数是否为0。
解决办法:注意判断a/b的余数是否为0。
3.输出三角形面积和周长
(1)题目
本题要求编写程序,根据输入的三角形的三条边a、b、c,计算并输出面积和周长。注意:在一个三角形中, 任意两边之和大于第三边。三角形面积计算公式:area=√s(s−a)(s−b)(s−c),其中s=(a+b+c)/2。
(2)流程图

(3)源代码

#include <stdio.h>
#include <math.h>
int main (void)
{
    int a,b,c;
    double s,area,perimeter;
    scanf("%d %d %d",&a,&b,&c);
    perimeter=a+b+c;
    s=perimeter/2;
    area=sqrt(s*(s-a)*(s-b)*(s-c));
    if ((a+b>c)&&(a+c>b)&&(b+c>a))
    {
        printf("area = %.2f; perimeter = %.2f",area,perimeter);
    }
    else
    {
        printf("These sides do not correspond to a valid triangle");
    }
    return 0;
}

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


(5)实验分析
问题:输入第二个示例后,运行结果与示例不同。
原因:是否为三角形的条件应用&&而不是||。
解决办法:将||改为&&。
4.出租车计价
(1)题目
本题要求根据某城市普通出租车收费标准编写程序进行车费计算。具体标准如下:
• 起步里程为3公里,起步费10元;
• 超起步里程后10公里内,每公里2元;
• 超过10公里以上的部分加收50%的回空补贴费,即每公里3元;
• 营运过程中,因路阻及乘客要求临时停车的,按每5分钟2元计收(不足5分钟则不收费)。
(2)流程图

(3)源代码

#include <stdio.h>
int main (void)
{
    int t;
    double x,y;
    scanf("%lf %d",&x,&t);
    if (x<=3)
    {
        y=10;
    }
    else if (x<=10)
    {
        y=10+2*(x-3);
    }
    else if (x>10)
    {
        y=10+(10-3)*2+(x-10)*3;
    }
    if (t>=5)
    {
        y=y+t/5*2;
    }
    else
    {
        y=0+y;
    }
    printf("%.0f",y);
    return 0;
}

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



(5)实验分析
问题:流程图过于复杂。
原因:判断完x<=10后多加了一个选择框,判断是否x>10。
解决办法:去掉判断是否x>10的选择框。
(四)PTA提交列表
PTA中完成选择结构(1)习题集的提交列表截图。
如图:

posted @ 2017-10-29 00:10  楠有乔木  阅读(1776)  评论(0编辑  收藏  举报