C语言第三次程序设计作业

(一)改错题

计算f(x)的值:输入实数x,计算并输出下列分段函数f(x)的值,输出时保留1位小数。
1)源程序(有错误的程序)

  #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)错误信息:
1253780-20171027201906648-1445410037.png
错误原因:经过检查发现,在if语句中,“y = 1/ x”后缺少“;”
改正方法:加上“;”
2)错误信息:
1253780-20171027201941836-734810947.png
错误原因:在源代码第七行的if语句后,多添加了一个“;”
改正方法:去掉;
3)错误信息:1253780-20171027202114398-1576848597.png
错误原因:else后不能有 (x != 10)
改正方法:去掉(x != 10)
4)错误信息:
1253780-20171027202159867-1884499060.png
错误原因:在printf语句中缺两个逗号
改正方法:写为printf("f(%.2f) = %.lf\n", x,y);
5)可进行编译,执行编译命令,编译成功。输入所给样例,但在输入前,首先发现输入格式不对,如图
错误信息:1253780-20171027203100836-63086650.png
错误原因:在源代码的scanf语句中多了一个转义字符“/n”
改正方法:去掉“/n”
6)错误信息:
1253780-20171027204226023-1390381632.png
错误原因:首先发现在scanf语句中多了一个“=”,在第七行的if语句中,所给比较条件“x == 10”被写成“x = 10”,缺少一个“=”导致条件运算符变为赋值运算符,导致比较时出错。
改正方法:将“x = 10”改为“x == 10”。
7)错误信息:1253780-20171027205742461-387473863.png
错误原因:首先发现,在scanf语句中,所取用的数型为float型,而x,y的定义均为double型,虽然这并不是造成错误的主要原因,但谨慎起见,仍改为“%lf”,进一步检查发现,在第15行的printf语句中,“=”后的部分的“%.1f”被误写成“%lf”,可以认定,这是造成错误的主要原因,而f(x)部分的“x”,也写成了“%.2f”,因而被保留了两位小数。
改正方法:将第15行的“%.2f”改为“%.1f”;“%.lf”改为“%.1f”。
8)错误原因:scanf语句中x前没有&
改正方法:x前加上&
1253780-20171027211808805-1640515802.png
符合题目
改后正确代码为:
1253780-20171027212034305-501874164.png
二:学习总结:

(1)对于所给代码段的理解:
所给代码段“if(a)if(b) x=x+1;else y=y+1”本身应为判断是否为a并且b,若为真,则执行“x = x + 1”这段语句,若为假,则执行后面的“y = y + 1”。
该语句的else在此处应与第二个if语句配对。若要明确表达这种配对方式,应在每一个if 或else if或else后添加“{}”(花括号),同时要时刻注意if else配对的优先顺序。
改正后的代码段应为
if(a&&b)
{
x = x + 1;
}
else
{
y = y + 1;
}
(2)C语言中对于范围的表达:
不能。因为在C语言中,逻辑运算符的顺序是从左至右的,判断结果为0或1,即“true,false”。而以题设的“ (-10< x <10)”而言,当x大于-10为真时,x的值便被转换为1,根据结合性,x与右侧的10继续比较,显然成立。但若输入大于10的数,先与左侧的-10比较,显然为真,x被赋值为1,再与10比较,为真,但显然不符合逻辑。因此,只要输入任意大于-10的值,得到的结果都只能为真。因此无法表示(-10,10)这一区间。
正确表达方式如下:
(x >-10 && x < 10);
即添加逻辑运算符,即可得到所要效果。
(3)非法字符的问题:
1.首先将所给代码输入编译器,可以编译。运行,输入所给数据“123a”,得到结果如下:
1253780-20171027213216648-2006107349.png
系统发现输入的123a中a是非法数据,便认为输入已经停止,用1来表示,想输出整形数据,定义时就用int型以及输入输出用%d,而字符要用%c。
2..首先将所给代码输入编译器,可以编译。运行,输入所给数据“123 45”,和“123a”,得到结果如下:
1253780-20171027231438961-1768801144.png

1253780-20171027214500648-211507991.png
该函数的返回值为成功读取变量的个数。在该程序中,a,b均为整型变量,在scanf中,对应的格式化输入符号也为整型,所以在输入“123 45”,即均为整型时,均为合法数据,因此被读入,返回值为2.而输入“123a”,其中包含了非法数据“a”,结合上题,可以得知输入被终止,所以只将123赋给了a,b未能成功被赋值,因此返回值是1。所以,也能佐证上题分析正确。
3.修改程序1.若输入数值均为合法数值,则会被正常读取,scanf的返回值会为2,否则均说明未能正常读入数据,即含有非法数据,源代码如下:

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.总结:
函数运用不熟练,之后好好看书,尽快自学完成。

1.(1)题目
7-2 计算分段函数[2],本题目要求计算下列分段函数f(x)的值:
(2)流程图
1253780-20171029121101430-1927876055.png

(3)源代码

include<stdio.h>

include<math.h>

main()
{
float x,y;
scanf("%f",&x);
if(x>=0)
y=sqrt(x);
else
y=(x+1)(x+1)+2x+1/x;
printf("f(%.2f) = %.2f",x,y);
}
(4)测试数据及运行结果
1253780-20171027215714930-1066910691.png
(5)实验分析
问题:调用pow函数不太会用,总有错误。
原因:没有听过这部分内容。
解决办法:用普通赋值法进行求解。
2.(1)题目
7-4 算术入门之加减乘除,对于输入的两个整数,按照要求输出其和差积商。
(2)流程图
1253780-20171029120745117-1742419043.png

(3)源代码

include<stdio.h>

int main()
{
int a,b,c,d,e;
scanf("%d %d",&a,&b);
if(a%b==0)
{int f;
c=a+b;d=a-b;e=ab;f=a/b;
printf("%d + %d = %d\n%d - %d = %d\n%d
%d = %d\n%d / %d = %d\n",a,b,c,a,b,d,a,b,e,a,b,f);}
else
{ float f;
c=a+b;d=a-b;e=ab;f=(float)a/b;
printf("%d + %d = %d\n%d - %d = %d\n%d
%d = %d\n%d / %d = %.2f\n",a,b,c,a,b,d,a,b,e,a,b,f);}
return 0;
}

(4)测试数据及运行结果
1253780-20171027221512398-2038930449.png
(5)实验分析
问题:做除法运算时总会出现结果为0错误的情况。
原因:除法结果定义类型时没按照除不除的尽分清数据类型
解决办法:用选择结构来分类余数是否为0的数据类型
3.(1)题目
7-6 输出三角形面积和周长。本题要求编写程序,根据输入的三角形的三条边a、b、c,计算并输出面积和周长。注意:在一个三角形中, 任意两边之和大于第三边。
(2)流程图
1253780-20171029120902773-942667168.png

(3)源代码

include<stdio.h>

include<math.h>

int main()
{
int a,b,c;
float S,s,C;
scanf("%d %d %d",&a,&b,&c);
if(a+b>c&&a+c>b&&b+c>a)
{
s=(a+b+c)/2;
S=sqrt(s(s-a)(s-b)*(s-c));
C=a+b+c;
printf("area = %.2f; perimeter = %.2f",S,C) ;
}

else
printf("These sides do not correspond to a valid triangle");
return 0;

}
(4)测试数据及运行结果
1253780-20171027223134648-950699522.png
(5)实验分析
无问题
4.(1)题目
7-8 出租车计价
本题要求根据某城市普通出租车收费标准编写程序进行车费计算。具体标准如下:
起步里程为3公里,起步费10元;
超起步里程后10公里内,每公里2元;
超过10公里以上的部分加收50%的回空补贴费,即每公里3元;
营运过程中,因路阻及乘客要求临时停车的,按每5分钟2元计收(不足5分钟则不收费)。
(2)流程图
1253780-20171029120943789-1239444899.png

(3)源代码

include<stdio.h>

int main()
{
float a,b;
int x,y,c;
scanf("%f %d",&a,&x);
y=(x/5)2;
if(a<=3.0)
{
b=10+y;
c=(int)(b+0.5);
printf("%d",c);
}
else if(a>3&&a<10)
{
b=10+(a-3)
2+y;
c=(int)(b+0.5);
printf("%d",c);
}
else
{

b=10+14+3*(a-10)+y;
c=(int)(b+0.5);
printf("%d",c);

}
return 0;
}
(4)测试数据及运行结果
1253780-20171027223454476-303539651.png
PTA提交列表:
1253780-20171027224510101-1205374174.png

转载于:https://www.cnblogs.com/xiaoqi1/p/7745534.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值