C语言程序设计第三次作业——选择结构(1)
(一)改错题
计算f(x)的值:输入实数x,计算并输出下列分段函数f(x)的值,输出时保留1位小数。
(错误一)
错误原因及改正:第九行语句结尾缺少半角分号,添加分号即可改正
(错误二)
错误原因及改正:第七行if语句末尾加了分号,导致else语句没有配对的if,删去if语句后的分号即可
(错误三)
错误原因及改正:else语句后面不能加条件,删除即可
(错误四)
错误原因及改正:printf语句中格式化输出语句与变量之间缺少逗号,增加即可
(错误五)
错误原因及改正:scanf语句中,百分号前等号多余,删除
(错误六)
错误原因及改正:scanf语句中,未添加取地址符
(错误七)
错误原因及改正:if语句中,等于的表示需要同时用两个等号
(错误八)
错误原因及改正:printf语句中,保留小数表达错误,改为%.1f
(二)学习总结
1.if(a)if(b) x=x+1;else y=y+1; 的确切含义是什么?这个else应该和哪个if配对?如何明确表达这种配对方法?将该段代码按照规范化的格式进行书写。
本题所给的这段代码"if(a)if(b) x=x+1;else y=y+1"的含义是:在同时满足a和b的情况下,才会执行x=x+1语句,否则就会执行y=y+1语句。为且条件,符号用&&表示;根据if else的就近配对原则,代码段里的else是和后一个if配对;用规范的格式表示这段代码,如下图:
2.C语言的表达式 (-10< x <10)能够表达x在区间(-10,10)吗?为什么?如果不能,正确的表达式应该怎么写?
C语言的表达式 (-10< x <10)不能够表达x在区间(-10,10),因为在C语言里面,逻辑运算符的运行顺序是从左至右的顺序,而 (-10< x <10)这种形式,-10会与输入的数据比较,输出正确与否,即0或1。正确的表达式如下:
(x >-10 && x < 10);
3.C语言中输入数据时,如果遇到非法字符,则认为输入结束。运行程序(1),输入123a,看看输出结果是什么?你能解释是为什么吗?
程序(一)
#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.
在a后继续输入数字 如图
scanf()函数的返回值是成功读入数据的个数,如果没有读取任何数据,则返回0。运行程序(2),分别输入123 45和123a,看看输出结果是什么?为什么?
程序(二)
#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这一非法数据,系统默认终止输入,所以无论后面输入多少数据,都不会读入,即无效
修改程序(1),当输入非法数据时,输出“Input error!".样例如下:
修改的程序如下:
#include <stdio.h>
int main()
{
int a, b,n;
scanf("%d %d", &a, &b);
if(a == 2)
{
printf("a = %d, b = %d\n", a, b);
}
else
{
printf("Input error!");
}
return 0;
}
4.对其他你认为需要进行总结的内容进行总结。
首先,第一点,运用if和else语句的时候,一定要考虑配对问题,一定要对应好,否则编译就会出现错误,多个if和else的程序中if和else的对应很容易出错,还有就是if和else的就近原则,else是和离它最近的if对应的。还要记得编写程序的时候if语句不是一个完整的语句,所以后面不能加分号,同样else语句后面不能够加括号,而else if可以加括号。所以,细节方面的一定要记清楚,可能一点小小的错误,就会导致整个程序无法进行。还有就是我们编写的时候要懂得变通,一条路行不通的时候,就应该停下来想一想自己是不是错了,重新换一条路子。
(三)实验总结
1.计算函数值
(1)题目
要求计算下列分段函数f(x)的值:
(2)流程图
(3)源代码
#include <stdio.h>
#include <math.h>
int main(void)
{
double x,f;
scanf("%lf",&x);
if(x >= 0)
{
f = sqrt(x);
}
if(x < 0)
{
f = pow(x + 1,2) + 2 * x + 1 / x;
}
printf("f(%.2f) = %.2f",x,f);
return 0;
}
(4)测试数据及运行结果
(5)实验分析
问题及解决办法:本题写作顺利,设置程序框图也未遇到问题。
2.算数问题
(1)题目
算术入门之加减乘除,对于输入的两个整数,按照要求输出其和差积商。
(2)流程图
(3)源代码
#include<stdio.h>
int main( )
{
int m,n;
scanf("%d %d",&m,&n);
printf("%d + %d = %d\n",m,n,m+n);
printf("%d - %d = %d\n",m,n,m-n);
printf("%d * %d = %d\n",m,n,m*n);
if(m % n == 0)
{
printf("%d / %d = %d\n",m,n,m/n);
}
else
{
printf("%d / %d = %.2lf\n",m,n,(double)m/n);
}
return 0;
}
(4)测试数据及运行结果
(5)实验分析
问题及解决办法:因为对ab定义的为整形变量,所以除法计算时结果出现错误,将整型变量强制转换为double型,解决了问题。
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,aera,perimeter;
scanf("%d%d%d",&a,&b,&c);
if((a + b > c) && (a + c > b) && (b + c > a))
{
perimeter = a + b + c;
s = ((double)a + b + c) / 2.0;
aera = sqrt(s * (s - a) * (s - b) * (s - c));
printf("area = %.2f; perimeter = %.2f",aera,perimeter);
}
else
{
printf("These sides do not correspond to a valid triangle");
}
return 0;
}
(4)测试数据及运行结果
(5)实验分析
问题及解决办法:输出结果不对,因为本题涉及很多除法及开方运算,所以会出现很多浮点数,将整形定义为double型解决了问题
4.出租车计价
(1)题目
本题要求根据某城市普通出租车收费标准编写程序进行车费计算。具体标准如下:
起步里程为3公里,起步费10元;
超起步里程后10公里内,每公里2元;
超过10公里以上的部分加收50%的回空补贴费,即每公里3元;
营运过程中,因路阻及乘客要求临时停车的,按每5分钟2元计收(不足5分钟则不收费)。
(2)流程图
(3)源代码
#include <stdio.h>
int main(void)
{
double journey,money1,money2,money3;
int time;
scanf("%lf%d",&journey,&time);
if (journey <= 3)
{
money1 = 10;
}
else if(journey > 3 && journey <= 10)
{
money1 = 10 + 2 * (journey - 3);
}
if(journey > 10 && time < 5)
{
money1 = 10 + (journey - 3) * 2 + (journey - 10);
}
if(journey > 10 && time >= 5)
{
money1 = 10 + (journey - 3) * 2 + (journey - 10);
}
if (time >= 5)
{
money2 = (time / 5)* 2;
}
else
{
money2 = 0;
}
money3 = money1 + money2;
printf("%.0f\n",money3);
return 0;
}
(4)测试数据及运行结果
(5)实验分析
问题及解决办法:时间收费与里程收费的结合遇到问题,和同学讨论后解决
(四) pta提交列表