C语言程序第三次作业

(一)改错题
计算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:

错误原因1:%前有=,输入里面的x 没有取地址符
改正方法1:
scanf("Enter x : %f", &x);

错误信息2:

错误原因2:if 后面有分号
改正方法2:将if后面的分号去掉

错误信息3:

错误原因3:if 里面的执行语句没有加分号
改正方法3:将y=1/x后面加上分号

错误信息4:

错误原因4:else后面有语句
改正方法4:将else括号里面的语句删掉

错误信息5:

错误原因5:发现分号后面和x y中间都没有逗号
改正方法5:在分号后面和x y中间加上逗号
执行编译命令,编译成功
错误信息6:

错误原因6:printf语句里加入了转义字符/n
改正方法6:去掉转义字符/n

错误信息7:

错误原因7:发现在if语句中只有一个“=”,使运算符变成了赋值符
改正方法7:再加上一个“=”

错误信息8:结果如上图

错误原因8:scanf中输入的为float型,但定义x,y为double型,并且第15行中的printf语句中“=”后面的%.1f被误写为%.lf,而且f(x)的x部分也被误写为%.2f,保留了两位小数
改正方法8:将%.lf和%.2f都改为%.1f
输出样式正确,如下图

此为改正后的源程序

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

include<stdio.h>

int main(void)
{
int x,y,a,b;
scanf("%d %d",&x,&y);
if(a)
{
if(b)
{
x = x+1;
}
else
{
y =y+1;
}
}
return 0;
}
2.C语言的表达式 (-10< x <10)能够表达x在区间(-10,10)吗?为什么?如果不能,正确的表达式应该怎么写?
不能,因为表达式 (-10< x <10)虽然是合法的,但是不等价于(x>-10&&x<10),而区间(-10,10)表示的是(x>-10&&x<10)
正确的表达式:(x>-10&&x<10)
3.
(1)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被赋予一个无意义数字,由题可知,当输入123后,继续输入a,系统认为输入非法字符,输出停止,%d定义为整型变量,而a是字符型变量,所以无法输出

(2)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时

由题可知,返回值是成功读入数据的个数,第一次输入123 45时,都为整型变量,所以数据读入成功,n为2,而第二次输入123a时,a为字符型变量,不应用%d表示,应用%c表示,a无法输出,所以返回值是1
修改程序(1),当输入非法数据时,输出“Input error!".
程序如下图

(3)其他总结
(1)要熟记各个运算符之间的优先级关系,避免不必要的麻烦
(2)要区分赋值符“=”和等于符号“==”之间的区别
(3)注意switch语句中每条语句结束要有break
(4)注意double int float 和char之间的不同,double是用%lf来定义,int是用%d来定义,float是用%f来定义,而char是用%c来定义
(5)要注意如果题中要用数学公式来计算,要加上一个#include <math.h>头文件

(三)实验总结(我的学号末尾是单号,总结的题号为3,5,7,9)
第一题:
(1)题目
判断一个5位数是不是回文数。例如12321是一个回文数,即它的个位与万位相同,十位与千位相同。
(2)流程图:

(3)源代码:

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


(5)实验分析
问题1:十位与千位不等,但也输出了"yes"
原因1:没有在else语句下方加上花括号
解决方法1:在else语句下方加上花括号,把printf("No")扩进去

第二题
(1)题目
本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。
(2)流程图

(3)源代码

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

(5)实验分析
问题1:输出数据与示范样例不符
原因1:时间的进制是60,而不是100
解决方法1:将m2 - m1后面再加60,表示进一小时

第三题
(1)题目
三天打鱼两天晒网
(2)流程图

(3)源代码

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


(5)实验分析
问题1:输出数据错误
原因1:if语句里的n=4||n=0中的“||”错写为"&&"
解决方法1:将“||"改正确

第四题
(1)题目
阶梯电价
(2)流程图

(3)源代码

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

(5)实验分析
问题1:电量是负数会输出两次
原因1:因为输出电量的语句放到了最后
解决方法1:将输出电量的语句放到else语句里面

(四)PTA提交列表



posted @ 2017-10-27 16:56  王映丹  阅读(465)  评论(0编辑  收藏  举报