C语言程序设计第三次作业——选择结构(1)
(一)改错题
1.计算f(x)的值:输入实数x,计算并输出下列分段函数f(x)的值,输出时保留1位小数。
错误信息1:

错误原因:第7行if条件语句括号后出现分号
改正方法:去掉分号
错误信息2:

错误原因:第9行语句语句结束没有分号
改正方法:在语句后加上分号
错误信息3:

错误原因:第11行else语句,else后附加条件没有写if
改正方法:在else后写上if
错误信息4:

错误原因:第15行输出语句格式不对
改正方法:在引号后加逗号,在x,y之间加逗号
错误信息5:

错误原因:输入格式不对
改正方法:删去等号,修改成%lf
错误信息6:

错误原因:输入语句,未加取地址符
改正方法:在x前加取地址符
错误信息7:

错误原因:if条件句等于等号写两个
改正方法:在等号后再加一个等号
错误信息8:

错误原因:第一个输出语句格式不对
改正方法:删去换行符
错误信息9:

错误原因:第二个输出语句格式不对
改正方法:将%.2f改成%.1f,将%.lf改成%.1f
正确语句:

输出结果1;

输出结果2;

(二)学习总结
1.if(a)if(b) x=x+1;else y=y+1; 的确切含义是什么?这个else应该和哪个if配对?如何明确表达这种配对方法?将该段代码按照规范化的格式进行书写。
确切含义是·输入a,b都执行x=x+1这条语句,否则执行y=y+1.这个else和就近的配对也就是第二个输入b的这个。因为a,b是并且的关系所以说a,b应该用&&连接代码应改为:
if(a&&b)
{
x = x + 1;
}
else
{
y = y + 1;
}
2.C语言的表达式 (-10< x <10)能够表达x在区间(-10,10)吗?为什么?如果不能,正确的表达式应该怎么写?
不能,因为在C语言中都是<一个级别的,所以是是依次从左向右进行,x大于-10,那么前面的语句是对的,则输出的是1,1,一定是小于10的,所以是个恒成立的问题。如果x小于等于-10,那么输出的是0,0,也是一个恒小于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;
}
输出结果:

原因:因为a是int类型的,应该是整数,所以不会读入a,而b没有输入,输出的b为随机数
scanf()函数的返回值是成功读入数据的个数,如果没有读取任何数据,则返回0。运行程序(2),分别输入123 45和123a,看看输出结果是什么?为什么?
程序(2)


原因:因为返回值是成功读取变量的个数,所以当输入“123 45”的时候,因为两个数都是整形,可以读出两个数据,所以n=2;当输入“123a”的时候因为“a”是字符,为非法数据,不能赋值,所以只将“123”赋值给了a,程序只读出一个数据,所以n=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.对其他你认为需要进行总结的内容进行总结。
需掌握的:①关系运算符和关系表达式②如何判断两实数相等③常用数学函数的使用④逻辑算符和逻辑表达式⑤逻辑运算的短路特性⑥if...else语句和if语句的嵌套⑦条件运算符
需注意的细节:①if()里的等于号应该是两个不是一个②要注意是字符数据的输入还是实数或整形的输入③使用数学函数时一定要有头文件包含命令“#include<math.h>
(三)实验总结
1.计算分段函数[2]
(1)题目
本题目要求计算下列分段函数f(x)的值:
(2)流程图


(3)源代码
# include<stdio.h>
# include<math.h>
int main(void)
{
double x,y,z;
scanf("%lf",&x);
if(x>=0)
{
y=sqrt(x);
printf("f(%.2f) = %.2f",x,y);
}
else if(x<0)
{
z=pow(x+1,2)+2*x+1/x;
printf("f(%.2f) = %.2f",x,z);
}
return 0;
}
(4)测试数据及运行结果


(5)实验分析
比较简单,没有问题。
2.算术入门之加减乘除
(1)题目
对于输入的两个整数,按照要求输出其和差积商。
(2)流程图


(3)源代码
# include <stdio.h>
int main(void)
{
int a,b;
scanf("%d %d",&a,&b);
printf("%d + %d = %d\n",a,b,a+b);
printf("%d - %d = %d\n",a,b,a-b);
printf("%d * %d = %d\n",a,b,a*b);
if(a%b==0)
{
printf("%d / %d = %d\n",a,b,a/b);
}
else
{
printf("%d / %d = %.2f\n",a,b,(double)a/b);
}
return 0;
}
(4)测试数据及运行结果


(5)实验分析
问题1:编译无错,运行错误
原因:if括号里丢等号
解决办法:加等号
3.输出三角形面积和周长
(1)题目
本题要求编写程序,根据输入的三角形的三条边a、b、c,计算并输出面积和周长。
(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);
s=(double)(a+b+c)/2.0;
area=sqrt(s*(s-a)*(s-b)*(s-c));
perimeter=a+b+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)实验分析
问题1:流程图无法运行
原因:公式错误
解决办法:修改公式
4.出租车计价
(1)题目
本题要求根据某城市普通出租车收费标准编写程序进行车费计算。
(2)流程图


(3)源代码
#include<stdio.h>
#include<math.h>
int main (void)
{
int t,g;
double km,yuan;
scanf("%lf %d",&km,&t);
g=t/5*2;
if(km<=3)
{
yuan=10+g;
printf("%.0lf",yuan);
}
if(km>3&&km<=10)
{
yuan=10+(km-3)*2+g;
printf("%.0f",yuan);
}
else if(km>10)
{
yuan=10+14+(km-10)*3+g;
printf("%.0f",yuan);
}
return 0 ;
}
(4)测试数据及运行结果



(5)实验分析
比较简单,没有问题
(四)PTA提交列表



浙公网安备 33010602011771号