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

(一)改错题
输出三角形的面积和周长,输入三角形的三条边a、b、c,如果能构成一个三角形,输出面积area和周长perimeter(保留2位小数);否则,输出“These sides do not correspond to a valid triangle”。
输入输出样例1:
  Enter 3 sides of the triangle: 5 5 3
  area = 7.15; perimeter = 13.00
输入输出样例2:
  Enter 3 sides of the triangle: 1 4 1
  These sides do not correspond to a valid triangle
源程序(有错误的程序)

对源程序进行编译:
错误信息1:

错误原因:少了一个括号
改正方法:添加上括号。
继续进行编译:
错误信息2:

错误原因:if else语句中没有加入{ }花括号
改正方法:在将if语句加上{ } 再将else的语句加上{ }。

继续编译:输入第一个值:
输入第二个值:
与预计的答案不相符说明有错误。
错误信息3:输入第二个值与答案不相同
错误原因:判断是否为三角形时条件编写错误
改正方法:把或改成且
(二)学习总结
1.在编程解决问题的过程中,我们会用到多个if语句,if...else if... 语句以及switch语句,查阅资料,总结一下这三种情况的区别何在,并分别举例加以说明。禁止大段复制,要自己对资料进行归纳总结,并给出你参考的资料链接。
(1)switch与if语句的效率区别
if else if 与switch语句的区别
如果纯粹比较数字或字符,建议使用
switch,因为它只会在一开始的switch括号中取出变量值一次,然后将这个值与下面所设定的case比较,但如果使用if,每次遇到条件式时,都要取出变量值,效率的差异就 在这儿。
例如:
 
 
 
if(a == 1) 
 
//... 
 
else if(a == 2) 
 
//... 
 
else if(a == 3) 
 
//...

如果换成
switch

 
 
 
switch(a) 
 

 
case 1: 
 
//... 
 
break; 
 
case 2: 
 
//... 
 
break; 
 
case 3: 
 
//... 
 
break; 
 

(2)switch...case语句与if...else性能比较
1.case后面一定要是常量就是一个不可变的量)
2.当条件的分支很多时(通常超过六个)使用switch...case的效率将高于多重if_else语句(在汇编层switch...case是查找表,if语句是跳转:)  
https://wenku.baidu.com/view/a22a85442b160b4e767fcf7b.html
if else 与switch的使用
A:if语句的格式:
  if(比较表达式1) {
     语句体1;
  }else if(比较表达式2) {
     语句体2;
  }else if(比较表达式3) {
     语句体3;
  }
     ...
  else {
    语句体n+1;
  }
例如:

B:switch格式:
  switch(表达式) {
        case 值1:
      语句体1;
      break;
       case 值2:
      语句体2;
      break;
          …
       default:
      语句体n+1;
      break;
        }

例如:
总结:switch建议判断固定值的时候用
  if建议判断区间或范围的时候用    
  *用switch能做的,用if都能做,单反过来则不行
http://www.cnblogs.com/bluesky365/p/5631517.html
其他个人总结:(1)无论如何都要保持程序的健壮性。
(2)记住条件运算符,复合语句的表达形式
(3)swith语句的穿透性
(4)记住PPT里的switch语句常见错误
(三)实验总结
1.成绩转换
(1)题目:
本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:
大于等于90分为A;
小于90且大于等于80为B;
小于80且大于等于70为C;
小于70且大于等于60为D;
小于60为E。
(2)流程图:
(3)源程序:

    #include<stdio.h>
    int main()
    {
int a;
scanf("%d",&a);
if(a>=90)
{
	printf("A");
}
else if(a<=90 && a>=80)
{
	printf("B");
}
else if(a<=80 && a>=70)
{
	printf("C");
}
else if(a<=70 && a>=60)
{
	printf("D");
}
else
{
	printf("E");
}
return 0;
    }

(4)实验分析:
问题1:对于&&和||搞不太清楚。
原因:粗心
解决办法:认真一点。
(5)本题PTA提交列表

5.三角形判断
(1)题目:给定平面上任意三个点的坐标(x1,y1)、(x2,y2)、(x3,y3),检验它们能否构成三角形。
(2)流程图:

(3)源程序:

#include<stdio.h>
#include<math.h>
int main()
{
double x1,y1,x2,y2,x3,y3,a,b,c,s,L,A;
scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3);
a=sqrt(pow(x1-x2,2)+pow(y2-y1,2));
b=sqrt(pow(x2-x3,2)+pow(y2-y3,2));
c=sqrt(pow(x1-x3,2)+pow(y3-y1,2));
if(a+b>c&&a+c>b&&b+c>a)
{
L=a+b+c;
s=(a+b+c)/2;
A=sqrt(s*(s-a)*(s-b)*(s-c));
printf("L = %.2f, A = %.2f",L,A);
}
else
{printf("Impossible");}

return 0;
}

(4)实验分析:本题没有问题但是有一些需要注意的地方。
1.

要注意自己所定义的是double还是int类型。以及输出时需要用到的格式。
2.
熟练运用数学函数 以及&&和||的用法。
(5)本题PTA提交列表

7简单的计算器
(1)题目:本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加、减、乘、除或求余运算。题目保证输入和输出均不超过整型范围。
输入格式:
输入在一行中依次输入操作数1、运算符、操作数2,其间以1个空格分隔。操作数的数据类型为整型,且保证除法和求余的分母非零。
输出格式:
当运算符为+、-、*、/、%时,在一行输出相应的运算结果。若输入是非法符号(即除了加、减、乘、除和求余五种运算符以外的其他符号)则输出ERROR。
(2)流程图:
运行结果:



(3)源程序:

    #include<stdio.h>
    #include<stdlib.h>
    int main()
    {
int a,b,c;
char d;
scanf("%d %c%d",&a,&d,&b);
switch(d)
{
	case '+':
		c = a + b;
		break;
	case '-':
		c = a - b;
		break;
	case '*':
		c = a * b;
		break;
	case '/':
		c = a / b;
		break;
	case '%':
		c = a % b;
		break;
	default :
		printf("ERROR");
		exit(0);
}
printf("%d",c);
return 0;
    }

(4)实验分析:这个题真的很让人费劲哦!!!!!
问题1:
原因:“%c”输入时,空格字符和“转义字符”作为有效字符输入。
解决办法:在%c前边加一个空格。
问题2:无法强制结束
原因:缺少头文件#include<stdlib.h> 和exit(0);
解决办法:添加上
(5)本题PTA提交列表:
本题虽然都是正确的,但是在C++上运行和整改了好多次。
9.求一元二次方程的根
(1)题目:本题目要求一元二次方程的根,结果保留2位小数。
输入格式:
输入在一行中给出3个浮点系数a、b、c,中间用空格分开。
输出格式:
根据系数情况,输出不同结果:
1)如果方程有两个不相等的实数根,则每行输出一个根,先大后小;
2)如果方程有两个不相等复数根,则每行按照格式“实部+虚部i”输出一个根,先输出虚部为正的,后输出虚部为负的;
3)如果方程只有一个根,则直接输出此根;
4)如果系数都为0,则输出"Zero Equation";
5)如果a和b为0,c不为0,则输出"Not An Equation"。
(2)流程图:
(3)源程序:

            #include<stdio.h>
            #include<math.h>
            int main()
            {
        double a,b,c,x,y,q,w,e;
        scanf("%lf%lf%lf",&a,&b,&c);
        if(a==0&&b!=0)
        {
	y=(0-c)/b;
	printf("%.2f",y);
        }
        else
        {
	x=((0-b)+sqrt(b*b-4*a*c))/(2*a);
	y=((0-b)-sqrt(b*b-4*a*c))/(2*a);
	if(a==0&&b==0&&c==0)
	{
		printf("Zero Equation");
	}
	else if(a==0&&b==0)
	{
		printf("Not An Equation");
	}
	else if(b*b-4*a*c==0)
	{
		printf("%.2f",x);
	}
	else if(b*b-4*a*c<0)
	{
		q=(0-b)/(2*a);
		w=sqrt(4*a*c-b*b)/(2*a);
	printf("%.2f+%.2fi\n",q,w);
	printf("%.2f-%.2fi\n",q,w);
	}
	else if(x!=y)
	{
	  if(x<y)
	  {e=x;x=y;y=e;}
	  else
	  printf("%.2f\n%.2f",x,y);
	}
	return 0;
        }
            }

(4)实验分析:这个题可以说是我做实验来最麻烦的一个,也是让我最头疼的一个。恐怖!
问题:结果不完全正确。
原因:没有考虑纯虚根
改正方法:纯虚根的情况,即有虚根的时候,如果实部为0,则实部应该输出0.00.然后输出虚部,不能只输出虚部而没有实部的内容。
C++里无数次的改正,整了一个小时。
(5)本题PTA提交列表

(四)博客互评
1.吴晗
2.刘长森
3.贺博涛

posted on 2017-11-03 11:44  春风Rz  阅读(2363)  评论(11编辑  收藏  举报