代码改变世界

C语言程序设计第三次作业——选择结构(1)

2017-10-28 21:21  李志伟  阅读(1213)  评论(0编辑  收藏  举报

(一)改错题
计算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:

错误原因:缺少分号。
改正方法:在y = 1 / x后加分号。
错误信息2:

错误原因:else后面加语句。
改正方法:将else后面语句删除。
错误信息3:

错误原因:if后等号输入错误。
改正方法:将“x=10”改成“x==10”
错误信息4:

错误原因:scanf输入时x前没有取地址符。
改正方法:在x前加&。
错误信息5:

错误原因:if语句后加分号。
改正方法:将if语句后的分号去掉。
错误信息6:

错误原因:没有用逗号分开
改正方法:在双引号和x后加逗号。
错误信息7:

错误原因:输入时换行。
改正方法:将"Enter x: \n"里面的\n去掉。
错误信息8:

错误原因:scanf后加“=”。
改正方法:将("=%f", x)里的等号去掉。
错误信息9:

错误原因:x属于double类型,输入的不符。
改正方法:将"%f"改成"%lf"。
错误信息10:

错误原因:保留的小数不正确。
改正方法:将"f(%.2f) = %.lf\n"改成"f(%.1f) = %.1f\n"。
(二)学习总结
1.if(a)if(b) x=x+1;else y=y+1; 的确切含义是什么?这个else应该和哪个if配对?如何明确表达这种配对方法?将该段代码按照规范化的格式进行书写。
⑴输入时如果是a且b则执行x=x+1语句,否则执行y=y+1。
⑵else和if(b)配对。

if(a&&b)
{
x=x+1;
}
else
{
y=y+1;
}

2.C语言的表达式 (-10< x <10)能够表达x在区间(-10,10)吗?为什么?如果不能,正确的表达式应该怎么写?
⑴不能。
⑵(-10< x <10在c语言中从左到右运算,运算的结果为0或1.
⑶正确表达为(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为非法字符,遇到a时输入结束。而在输出是b将随机产生一个随机数。
scanf()函数的返回值是成功读入数据的个数,如果没有读取任何数据,则返回0。运行程序(2),分别输入123 45和123a,看看输出结果是什么?为什么?
程序(2)

#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。
结果:

原因:n表示输入数据的个数,当输入123 45 时为两个数据,所以输出n=2.当输入123a时,a为非法字符,遇到a即输入结束,所以输出n=1.
修改程序(1)

#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.对其他你认为需要进行总结的内容进行总结。
如果定义double变量时在输入时应用%lf,在输入输出时不要忘记逗号,根据题目给出的格式来确定输入输出时的格式。if和else后面不加分号。
(三)实验总结
1.计算分段函数
(1)题目
本题目要求计算下列分段函数f(x)的值:

注:可在头文件中包含math.h,并调用sqrt函数求平方根,调用pow函数求幂。
输入格式:
输入在一行中给出实数x。
输出格式:
在一行中按“f(x) = result”的格式输出,其中x与result都保留两位小数。
输入样例1:
10
输出样例1:
f(10.00) = 3.16
输入样例2:
-0.5
输出样例2:
f(-0.50) = -2.75
(2)流程图

(3)源代码

#include <stdio.h>
#include <math.h>
int main(void) 
{
    double x,result;
    scanf("%lf",&x);
    if(x<0)
    {
	    result=pow((x+1),2)+2*x+1/x;
	    printf("f(%.2f) = %.2f",x,result);
    }
    else
    {
	    result=sqrt(x);
	    printf("f(%.2f) = %.2f",x,result);
    }

    return 0;
}

(4)测试数据及运行结果


(5)实验分析
问题1:输出结果错误。
原因:忘记定义math函数。
2.算术入门之加减乘除
(1)题目
对于输入的两个整数,按照要求输出其和差积商。
输入格式:
在一行内输入两个不超过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,f;
    double g;
    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",a,b,a/b);
    }
    else
    {
	    printf("%d / %d = %.2f",a,b,(double)a/b);
    }

    return 0;
}

(4)测试数据及运行结果


(5)实验分析
没有问题。
3.输出三角形面积和周长
(1)题目
本题要求编写程序,根据输入的三角形的三条边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);
    if(a + b > c && a + c > b && b + c > a)
    {
    perimeter = a + b + c;
    s = (double)perimeter / 2;
    area = sqrt((s * (s - a)*(s - b)*(s - c)));
    printf("area = %.2f; perimeter = %.2f",area,perimeter);
    }
    else
    {
    printf("These sides do not correspond to a valid triangle");
    }

    return 0;
}

(4)测试数据及运行结果


(5)实验分析
问题1:程序格式错误
原因:s = (double)perimeter / 2第一次将括号放在了后面。
4.出租车计价
(1)题目
本题要求根据某城市普通出租车收费标准编写程序进行车费计算。具体标准如下:
• 起步里程为3公里,起步费10元;
• 超起步里程后10公里内,每公里2元;
• 超过10公里以上的部分加收50%的回空补贴费,即每公里3元;
• 营运过程中,因路阻及乘客要求临时停车的,按每5分钟2元计收(不足5分钟则不收费)。
输入格式:
输入在一行中给出输入行驶里程(单位为公里,精确到小数点后1位)与等待时间(整数,单位为分钟),其间以空格分隔。
输出格式:
在一行中输出乘客应支付的车费(单位为元),结果四舍五入,保留到元。
输入样例1:
2.6 2
输出样例1:
10
输入样例2:
5.1 4
输出样例2:
14
输入样例3:
12.5 9
输出样例3:
34
(2)流程图

(3)源代码

#include <stdio.h>
int main(void)
{
    int M;
double S,A;
scanf ("%lf %d",&S,&M);
if(M<5)
{
	if(S<=3)
	{
		printf("10");
	}
	else if(S>3 && S<=10)
	{
		A = 10 + (S - 3) * 2;
		printf("%d",(int)(A + 0.5));
	}
	else
	{
		A = 10 + 2 * 7 + (S -10) * 3;
		printf("%d",(int)(A + 0.5));
	}
}
else
{
	if(S<=3)
	{
		A = 10 + M / 5 * 2;
		printf("%d",(int)(A + 0.5));
	}
	else if(S>3 && S<=10)
	{
		A = 10 + (S - 3) * 2 + M / 5 * 2;
		printf("%d",(int)(A + 0.5));
	}
	else
	{
		A = 10 + 2 * 7 + (S -10) * 3.0 + M / 5 * 2;
		printf("%d",(int)(A + 0.5));
	}
}

return 0;
}

(4)测试数据及运行结果



(5)实验分析
问题1:不清楚四舍五入
原因:经网上搜索可以是(int)(A + 0.5),老师讲的是%d自己为四舍五入。
(四)PTA提交列表