158329YLL

(一) 改错题
计算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)测试数据及运行结果:

                                         ![](http://images2017.cnblogs.com/blog/1242160/201710/1242160-20171029091614383-1666955433.png)

(5)实验分析
问题

      原因:没有判断余数是否为0
      解决方法:![](http://images2017.cnblogs.com/blog/1242160/201710/1242160-20171029114907742-1841069734.png)

(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:![](http://images2017.cnblogs.com/blog/1242160/201710/1242160-20171029112411664-501930904.png)


      原因:s、area、perimeter误输成int类型
      解决方法:将s、area、perimeter改为double类型
      问题3:![](http://images2017.cnblogs.com/blog/1242160/201710/1242160-20171029112411664-501930904.png)


      原因:double类型输出应为%f,保留两位小数用%.2f
      解决方法:将%d改为%.2f
      问题4:![](http://images2017.cnblogs.com/blog/1242160/201710/1242160-20171029112411664-501930904.png)


      原因:不用判断“任意两数之差大于第三边”
      解决方法:去掉对“任意两数之差大于第三边”的判断

(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提交列表

分类:

技术点:

相关文章: