C语言程序设计第三次作业——选择结构(1)

(一)改错题
1、 #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:

错误原因:x为double类型,所以在输入时应该是%lf,同时在后面的x前面没有&
改正如图:

错误信息2:

错误原因: y = 1 / x后面无分号直接进行下面的不正确
改正如图 :

错误信息3:

错误原因:else后面没有括号,应该去掉括号及里边内容,或者改成else if
改正如图:

错误信息4:

错误原因:在输出后面对应的两个语句没有用逗号隔开同时x y也没有用逗号隔开
改正如图:


错误信息5:

错误原因:一个等号是赋值,两个等号才是相等。
改正如图:

错误信息6:

错误原因:if语句后不能加分号
改正如图:

错误信息7:

错误原因:scanf后引号中内容不加等号
修改如图;

错误信息8:


错误原因:输出格式不对根据题目要求printf("Enter x:\n");中不用换行,“\n”是换行标志。
改正如图:


错误信息9;


错误原因:前后应该保持一致,保留一位小数。
改正如图:


错误信息10:

错误原因:输出分号与变量没有用逗号隔开
改正如图:

最终改成正确的为:

编译正确,运行结果为:

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

判断是否同时符合a,b两个条件,如果符合就将x+1的值赋给x有一个条件不符合就将y+1的值赋给y。这个else和后面的if配对
正确写法:

include

int main
{
if(a&&b)
{
x=x+1;
}
else
{
y=y+1;
}
return 0;
}
为避免发生类似if和else配对错误往往在写程序时在if,else if后面加上{ },使条理清晰。
2.C语言的表达式 (-10< x <10)能够表达x在区间(-10,10)吗?为什么?如果不能,正确的表达式应该怎么写?

不能这样表示,按逻辑运算符从左到右的顺序,假如输入的是3那么这样输出的结果是1,3>-10正确输出1,1<10正确最后输出1。正确写法应为:(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将1赋给b。
验证:输入1234m55程序会将1234赋值给a,b=1

在输入a,b两个值时用空格分开,但如果输入的是36b6 12那么就是a=36,b=1。如图

因为遇到非法运算符了程序停止16不能正常赋给b,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;
}
输入123 45
运行结果如图:

输入123a
运行结果如图:

输入123a的时候遇到了非法运算符a无法继续读取所输入的值所以只正确读取一次则使n=1。

修改程序(1),当输入非法数据时,输出“Input error!"
修改后:

include <stdio.h>

int main()
{
int a, b,n;
n = scanf("%d %d", &a, &b);
if(n==1)
{
printf("Input error!");
}
else
{
printf("n = %d\n", n);
}

return 0;
}
验证如图:

4.总结:通过本次作业我了解到了非法运算符的后果,即使编译正确也会造成输出不正确,以后遇到类似情况应该仔细检查一下是否出现了非法运算运算符,要注意全面思考问题,要对待问题有耐心,不要因为结果总不正确就放弃,多想想多检查并多总结,尤其注意是否有非法运算符出现。if后不能出现的错误也应该注意,不能总是犯这种低级错误,还有就是自己写程序编译总是不正确的时候,不要抓狂,要坚持下去耐心找错,及时记录自己犯的错误,争取不要再出现相似错误。还有就是注意赋值与相等的区别,最后,希望自己好好努力学习这门语言,既然选择了远方,便只顾风雨兼程。
(三)实验总结
(1)题目:回文数,要求:判断一个5位数是不是回文数。例如12321是一个回文数,即它的个位与万位相同,十位与千位相同

(2)流程图 :

(3)源代码 :

include<stdio.h>

int main()
{
int a,b,c,d,e,f,g;
scanf("%d",&a);
b=a/10000;
c=a/1000;
d=c%10;
e=a%100;
f=e/10;
g=a%10;
if(bg&&df)
{
printf("yes");
}
else
{
printf("no");
}
}
(4)测试数据及运行结果如图:

实验分析:注意位数,更应该注意是该用求余还是除,做此类题在纸上写好流程就会简单方便很多,不要怕麻烦。
(1)题目: 计算火车运行时间,要求:本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。

(2)流程图 :

(3)源代码 :

include<stdio.h>

int main(void)
{
int a,b,c,d,e,f,g,h ;
scanf("%d%d",&a,&b);
c = a / 100;
d = a % 100;
e = b / 100;
f = b % 100;
g = e - c;
h = f - d;
if(f<d)
{
g = g - 1;
h = 60 + h;
}
printf("%02d:%02d",g,h);

 return 0;

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

(5)实验分析:要注意时和分的换算,仔细仔细再仔细!

(1)题目:三天打鱼两天晒网,要求:中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?

(2)流程图 :

(3)测试数据及结果如图:

(4)实验分析:

还是忽略了赋值和等号的区别,以后一定要记得死死的,为此还想了个记住的方法,赋值短,相等长。
改正方法:将if语句中的等号改为双等号就妥了。
(1)题目:阶梯电价,要求:为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。

(2)流程图 :

(3)源代码

include<stdio.h>

int main(void)
{
int e = 0;
double c = 0.0;
scanf("%d",&e);
if(e >= 0&&e <=50)
{
c = 0.53 * e;
printf("cost = %.2f",c);
}
else if(e > 50)
{
c = 50 * 0.53 + (e - 50) * 0.58;
printf("cost = %.2f",c);
}
else
{
printf("Invalid Value!");
}

return 0;

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

(5)实验分析:
本题基本没有什么问题,因为第五题的经验,把流程先列出来,再注意赋值和相等的区别。

(四)PTA提交列表

posted @ 2017-10-29 01:46  浅温  阅读(351)  评论(0编辑  收藏  举报