(一) 改错题
计算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:
错误原因:样本案例所示Enter x:与数字在一行
改正方法:将\n去掉
错误信息2:
错误原因:样本案例所示Enter x:与数字之间没有等于号
改正方法:将“=”去掉
错误信息3:
错误原因:double类型%lf中的l输出是可以省,输入时不能省,
改正方法:在%与f之间加一个l
错误信息4:
错误原因:输入时必须有&,输出时没有
改正方法:在x前加一个&
错误信息5:
错误原因:在c++中“=”表示赋值,“==”表示等于
改正方法:在10之前加一个=
错误信息6:
错误原因:if语句后面有分号,使if不能与else搭配
改正方法:去掉if语句后面的分号
错误信息7:
错误原因:语句结束要有“;”
改正方法:在x后面加上“;”
错误信息8:
错误原因:本题只有两种情况,所以else后面的条件不用写
改正方法:去掉“(x!=10)"
错误信息9:
错误原因:样本案例所示f(x)中x保留一位小数
改正方法:将”%.2f改为%.1f
错误信息10:
错误原因:x与y之前都少加了“,”
改正方法:在x、y之前分别加上“,”
(二) 学习总结
1.if(a)if(b) x=x+1;else y=y+1; 的确切含义是什么?这个else应该和哪个if配对?如何明确表达这种配对方法?将该段代码按照规范化的格式进行书写
答: (1)确切含义:此题如果a和b同时成立时输出x=x+1.否则输出y=y+1
(2)else和第二个if配对。
(3)正确格式:
if(a && b)
{
x = x+1;
}
else
{
y = y+1;
}
2.C语言的表达式 (-10< x <10)能够表达x在区间(-10,10)吗?为什么?如果不能,正确的表达式应该怎么写?
答:不能。
关系运算符结合方向:自左向右 ;
正确形式: x>-10&&x<10
3.(1)C语言中输入数据时,如果遇到非法字符,则认为输入结束。运行程序(1),输入123a,看看输出结果是什么?你能解释是为什么吗?
答:
原因: a 定义的是整数,输入123a中a为非法字符,所以a之前输入结束,所以a被赋值为123,非法字符不能被赋值所以b被系统赋值1。
(2)scanf()函数的返回值是成功读入数据的个数,如果没有读取任何数据,则返回0。运行程序(2),分别输入123 45和123a,看看输出结果是什么?为什么?
答:
原因:因为a为非法字符所以输入终止,成功读入的数据为1。
(3)修改程序(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",a,b);
}
else
{
printf("Input error!");
}
return 0;
}
4.对其他你认为需要进行总结的内容进行总结。
(1).是逻辑值“真”或“假”,用1和0表示
(2).注意区分“=”与“= =”
(3).在实数比较时只能使用< 和 >
(4).数学函数时,一定有文件包含命令
include <math.h>
(5).根据表达式的结果,寻找匹配的case,并执行case后面的语句,直到break为止。所有的case都不匹配,则执行default后面的语句
(6).if ~ else 配对原则:缺省{ }时,else总是和它上面离它最近的未配对的if配对
(三)实验总结
2.
(1)题目:计算分段函数[2](10 分)
本题目要求计算下列分段函数f(x)的值:
注:可在头文件中包含math.h,并调用sqrt函数求平方根,调用pow函数求幂。
输入格式:
输入在一行中给出实数x。
输出格式:
在一行中按“f(x) = result”的格式输出,其中x与result都保留两位小数。
(2)流程图:
(3)源代码:
# include <stdio.h>
# include <math.h>
int main(void)
{
double x,f;
scanf("%lf",&x);
if(x>=0){
f=sqrt(x);
}
else{
f=pow((x+1),2)+2*x+1/x;
}
printf("f(%.2f) = %.2f",x,f);
return 0;
}
(4)测试数据及运行结果:
(5)实验分析
问题:无
原因:无
解决方法:无
4.
(1)题目: 算术入门之加减乘除(10 分)
对于输入的两个整数,按照要求输出其和差积商。
输入格式:
在一行内输入两个不超过100的非负整数a和b,中间以一个空格间隔,且保证b不为0。
输出格式:
共四行,格式是:
[a] + [b] = [a+b]
[a] - [b] = [a-b]
[a] * [b] = [a*b]
[a] / [b] = [a/b]
其中,带有方括号的内容(如[a]、[b]、[a+b]等)表示相应整数或运算结果的值,在输出时要用实际的值代替。
并且:如果a能够被b整除,那么a/b应输出为整数格式,否则a/b输出为带两位小数的格式。
提示:注意表达式中的空格。
(2)流程图:
(3)源代码:
#include <stdio.h>
int main (void)
{
int a,b,c,d,e,g;
double f;
scanf("%d %d",&a,&b);
c=a+b;
d=a-b;
e=a*b;
printf("%d + %d = %d\n%d - %d = %d\n%d * %d = %d\n",a,b,c,a,b,d,a,b,e);
f=(double)a/b;
g=a%b;
if (g==0)
{
printf("%d / %d = %.0f",a,b,f);
}
else
{
printf("%d / %d = %.2f",a,b,f);
}
return 0;
}
(4)测试数据及运行结果:

(5)实验分析
问题
原因:没有判断余数是否为0
解决方法:
(1)题目:输出三角形面积和周长(10 分)
本题要求编写程序,根据输入的三角形的三条边a、b、c,计算并输出面积和周长。注意:在一个三角形中, 任意两边之和大于第三边。三角形面积计算公式:area=√s(s−a)(s−b)(s−c),其中s=(a+b+c)/2。
输入格式:
输入为3个正整数,分别代表三角形的3条边a、b、c。
输出格式:
如果输入的边能构成一个三角形,则在一行内,按照
area = 面积; perimeter = 周长
的格式输出,保留两位小数。否则,输出
These sides do not correspond to a valid triangle
(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)实验分析
问题1:
原因:perimeter与s位置输反,且s表达式错误
解决方法:将s表达式改为s=perimeter/2,并置于perimeter之后
问题2:
原因:s、area、perimeter误输成int类型
解决方法:将s、area、perimeter改为double类型
问题3:
原因:double类型输出应为%f,保留两位小数用%.2f
解决方法:将%d改为%.2f
问题4:
原因:不用判断“任意两数之差大于第三边”
解决方法:去掉对“任意两数之差大于第三边”的判断
(1)题目: 出租车计价(15 分)
本题要求根据某城市普通出租车收费标准编写程序进行车费计算。具体标准如下:
• 起步里程为3公里,起步费10元;
• 超起步里程后10公里内,每公里2元;
• 超过10公里以上的部分加收50%的回空补贴费,即每公里3元;
• 营运过程中,因路阻及乘客要求临时停车的,按每5分钟2元计收(不足5分钟则不收费)。
输入格式:
输入在一行中给出输入行驶里程(单位为公里,精确到小数点后1位)与等待时间(整数,单位为分钟),其间以空格分隔。
输出格式:
在一行中输出乘客应支付的车费(单位为元),结果四舍五入,保留到元。
(2)流程图:
(3)源代码:
# include <stdio.h>
int main(void)
{
int t;
double a,b;
scanf("%lf %d",&a,&t);
if(a<=3)
{
b=10;
}
else if(a<=10)
{
b=10+2*(a-3);
}
else if(a>10)
{
b=10+(10-3)*2+(a-10)*3;
}
if(t>=5)
{
b=b+t/5*2;
}
else
{
b=b;
}
printf("%.0f",b);
return 0;
}
(4)测试数据及运行结果:
(5)实验分析
问题:无
原因:无
解决方法:无
(四)PTA提交列表