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

(一)改错题
计算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:
错误原因:第七行的语句最后加上了分号。
改正方法:把第七行的语句的最后加上分号。
正确语句:if(x = 0)
错误信息3:
错误原因:第十一行的 else 后加上了判断语句。
改正方法:把第十一行的 else 后的判断语句删掉。
正确语句:else
错误信息4:
错误原因:第十五行的输出语句中,后引号与变量 x 之间没有逗号。
改正方法:在第十五行的输出语句中,在后引号与变量 x 之间加上逗号。
正确语句:printf("f(%.2f) = %.lf\n", x y);
错误信息5:
错误原因:第十五行的输出语句中,变量 x 与变量 y 之间没有逗号。
改正方法:在第十五行的输出语句中,在变量 x 与变量 y 之间加上逗号。
正确语句:printf("f(%.2f) = %.lf\n", x, y);
错误信息6:


错误原因:源程序的第五行的输入语句中有 \n,导致输入的数与 Entter: 没有在同一行。
改正方法:把源程序第五行的输入语句中的 \n 去掉。
正确语句:printf("Enter x: ");
错误信息7:


错误原因:源程序的第十五行的输出语句中变量 x 对应的为 %.2f 。
改正方法:把源程序的第十五行的输出语句中的变量 x 对应的 %.2f 改为 %.1f 。
正确语句:printf("f(%.1f) = %.lf\n" ,x, y);
错误信息8:


错误原因:源程序的第六行的输入语句中, x 前没有区地址符。
改正方法:在源程序的第六行的输入语句的 x 前加上区地址符。
正确语句:scanf("=%f", &x);
错误信息9:


错误原因:源程序的第十五行的输出语句中变量 y 对应的为 %.lf 。
改正方法:把源程序的第十五行的输出语句中的变量 y 对应的 %.lf 改为 %.1f 。
正确语句:printf("f(%.1f) = %.1f\n" ,x, y);
错误信息9:
错误原因:第六行的输入语句中 &x 对应的为 =%f。
改正方法:把第六行的输入语句中 &x 对应的 =%f 改为 %lf。
正确语句:scanf("%lf", &x);
错误信息10:


错误原因:源程序的第七行的判断语句中的等于为 = 。
改正方法:把源程序的第七行的判断语句中的 = 改为 == 。
正确语句:if(x == 10)
运行样例1和2:


均正确,其源程序为:

(二)学习总结
1.if(a)if(b) x=x+1;else y=y+1; 的确切含义是什么?这个else应该和哪个if配对?如何明确表达这种配对方法?将该段代码按照规范化的格式进行书写。
答:(1)确切含义为如果条件符合a则往后运行,再符合b则运行x=x+1。若不符合a则运行y=y+1。
(2) 这个else应该与第二个if配对。
(3)每个if、else后均加上大括号。
(4)

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

2.C语言的表达式 (-10< x <10)能够表达x在区间(-10,10)吗?为什么?如果不能,正确的表达式应该怎么写?
答:不能,因为小于是从左到右运行,(-10<x)若正确则值为1,错误则为2。然后再与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 = 123, b = 1。因为scanf()函数有返回值且为int型。 scanf()函数返回的值为:正确按指定格式输入变量的个数;也即能正确接收到值的变量个数。scanf("%d%d", &a, &b);如果只有a被成功读入,返回值为1。
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;
}

答:输出结果为n = 2和n = 1。因为scanf()函数有返回值且为int型。 scanf()函数返回的值为:正确按指定格式输入变量的个数;也即能正确接收到值的变量个数。scanf("%d%d", &a, &b);如果a和b都被成功读入,那么scanf的返回值就是2如果只有a被成功读入,返回值为1。
程序1:



4.对其他你认为需要进行总结的内容进行总结。
总结:(1)应熟练掌握和运用 if...else 语句,其作用是用来判定所给定的条件是否满足,根据判定的结果(真或假)决定执行给出的两种操作之一。
(2)应牢记关系运算符及其性质,关系运算符有六种: < <= = >= > !=。其结合方向为自左向右。
(3)在实数比较时只能使用<和>。
(4)应牢记数学函数,数学函数所在的头文件为math.h。绝对值函数为:fabs(x);平方根函数为:sqrr(x);幂函数为:pow(x,n);指数函数为:exp(x)。
(5)应牢记逻辑运算符,有三种: ! 非, && 且, || 或。
(三)实验总结
3 回文数
(1)题目
判断一个5位数是不是回文数。例如12321是一个回文数,即它的个位与万位相同,十位与千位相同。
(2)流程图

(3)源代码

# include <stdio.h>
int main()
{
   	int a,b,c,d,e,m;

scanf("%d",&m);
a = m/10000;
b = m/1000%10;
c = m/100%100;
d = m%100/10;
e = m%10;

if (a == e)
{
	if(b == d)
	{
		printf("yes");
	}
}
else
{
    printf("no");
}


return 0;
}

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


(5)实验分析
问题:


原因:源程序第13和15行的逻辑运算符错误。
解决办法:把源程序第13和15行的 = 改为 == 。
5 计算火车运行时间
(1)题目
本题要求根据火车的出发时间和达到时间,编写程序计算整个旅途所用的时间。
(2)流程图

(3)源代码

# include <stdio.h>
int main()
{
int a,b,c,d,s,f,m,n;
scanf("%d %d",&m,&n);
a = m/100;
b = n/100;
c = m%100;
d = n%100;
f = (b-a)*60+(d-c);
s = f/60;
f = f%60;
if(0<s<10)
{
	if(0<f<10)
	{
		printf("%02d:%02d",s,f);
	}
	else
	{
		printf("%02d:%d",s,f);
	}
}
else
{
	if(24>=s>=10)
	{
		if(0<f<10)
		{
			printf("%d:%02d",s,f);
		}
		else
		{
			printf("%d:%d",s,f);
		}
	}
}

return 0;
}

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

(5)实验分析
问题:
原因:在判断小时的时候,关系运算应包括边界。应考虑分钟小于10的情况。
解决办法:

	if(s<10)
{
	printf("%02d:%d",s,f);
}
else
{
	printf("%d:%d",s,f);
}

改为

if(0<s<10)
{
	if(0<f<10)
	{
		printf("%02d:%02d",s,f);
	}
	else
	{
		printf("%02d:%d",s,f);
	}
}
else
{
	if(24>=s>=10)
	{
		if(0<f<10)
		{
			printf("%d:%02d",s,f);
		}
		else
		{
			printf("%d:%d",s,f);
		}
	}
}

7 三天打鱼两天晒网
(1)题目
中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?
(2)流程图

(3)源代码

# include <stdio.h>
int main()
{
int N,m;

scanf("%d",&N);
m = N%5;
    if (1000>=N && N>0);
    {
    	if(m==0)
    	{
    		printf("Drying in day %d",N);
	}
	else
	{
		if(m<=3)
		{
			printf("Fishing in day %d",N);
		}
		else
		{
			printf("Drying in day %d",N);
		}
	}
}

return 0;
}

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


(5)实验分析
问题:
原因:天数与5的余数的归类不清。
解决办法:

	if (N<=1000)
	{
		if (m<=3)
		{
			printf("Fishing in day %d",N);
		}
		else
		{
			printf("Drying in day %d",N);
		}
	}

改为

	      	if(m==0)
    	{
		    printf("Drying in day %d",N);
	}
	else
	{
		if(m<=3)
		{
			printf("Fishing in day %d",N);
		}
		else
		{
			printf("Drying in day %d",N);
		}
	}

9 阶梯电价
(1)题目
为了提倡居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电价分为两个“阶梯”:月用电量50千瓦时(含50千瓦时)以内的,电价为0.53元/千瓦时;超过50千瓦时的,超出部分的用电量,电价上调0.05元/千瓦时。请编写程序计算电费。
(2)流程图

(3)源代码

# include <stdio.h>
int main()
{
int d;
double q;

scanf("%d",&d);
if(d>=0)
{
	if(d<=50)
	{
		q = d*0.53;
		printf("cost = %.2f",q);
	}
	else
	{
		q = 50*0.53+(d-50)*0.58;
		printf("cost = %.2f",q);
	}
}
else
{
	printf("Invalid Value!");
}


return 0;
}

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


(5)实验分析
问题:
原因:把输出电费的语句放到了最后,导致如果电量是负数则会输出两次。
解决办法:

if(d>=0)
{
	if(d<=50)
	{
		q = d*0.53;
	}
	else
	{
		q = 50*0.53+(d-50)*0.58;
	}
}
else
{
	printf("Invalid Value!");
}
printf("cost = %.2f",q);

改为

if(d>=0)
{
	if(d<=50)
	{
		q = d*0.53;
		printf("cost = %.2f",q);
	}
	else
	{
		q = 50*0.53+(d-50)*0.58;
		printf("cost = %.2f",q);
	}
}
else
{
	printf("Invalid Value!");
}

(四)PTA提交列表


posted @ 2017-10-27 10:16  曲儿说  阅读(399)  评论(0编辑  收藏  举报