杨若彤

导航

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

(一)改错题

输出三角形的面积和周长,输入三角形的三条边a、b、c,如果能构成一个三角形,输出面积area和周长perimeter(保留2位小数);否则,输出“These sides do not correspond to a valid triangle”。
错误信息1:

错误原因:面积公式少与开方对应的半个括号
改正方法:在分号前加上半个括号
错误信息2:

错误原因:if语句与else语句后都没有大括号
改正方法:在if和else语句后分别加上大括号
错误信息3:编译无错运行出问题
错误原因:if语句括号里的条件之间的关系不对,应是且的关系而不是或的关系
改正方法:将或的符号改为且的符号



二)学习总结

1.在编程解决问题的过程中,我们会用到多个if语句,if...else if... 语句以及switch语句,查阅资料,总结一下这三种情况的区别何在,并分别举例加以说明
if语句,if else if语句和switch 语句都属于流程控制语句。在只需要判断一个条件的时候,使用if语句方便有效;但是当判断条件很多的时候,我们可以使用多个if语句或者if...else if语句或者switch case语句。对于这三者的选择,下面将做一些具体分析;对于后两者的选择,又将涉及到程序执行效率的问题。if...else if语句和多个if语句的区别还是很大的,if...else if在任何一个环节满足条件的时候就将会终止判断,只处理一个满足条件的情况;而对于多个if语句,将会对每一个判断条件进行判断,自然而然会导致程序的执行效率降低。在多个判断条件的情况下,使用if...else if语句相对于使用多个if语句而言,可以减少程序的判断次数,提高效率。在多个判断条件的情况下,不仅可以使用if...else if语句,还可以使用switch case语句。一般情况下,当判断条件较多的情况下,使用switch case语句的效率会高于使用if...else if语句。switch...case与if...else if的根本区别在于,switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳 转表的索引号与switch变量的值是相等的。从而switch...case不用像if...else if那样遍历条件分支直到命中条件,而只需访问对应 索引号的表项从而到达定位分支的目的。所以从效率上来说由于if...else if的遍历性,代码执行效率是不高的。

#include<stdio.h>
#include<math.h>
int main(void)
{
    double a,b,c,d,x1,x2,m;
    scanf("%lf %lf %lf",&a,&b,&c);
    d = pow(b,2) - 4 * a * c;
    if(a == 0 && b == 0 && c == 0)
    {
	    printf("Zero Equation");
    }
    if(a == 0 && b == 0 && c != 0)
    {
	    printf("Not An Equation");
    }
    if(d > 0 && a != 0)
    {
    x1 = (-b+sqrt(d)) / (2 * a);
    x2 = (-b - sqrt(d)) / (2 * a);
    printf("%.2f\n%.2f",x1,x2);
    }
    else if(d == 0 && a !=0)
    {
	    x1 = -b / (2 * a);
	    printf("%.2f",x1);
    }
    else if(d < 0 && a != 0 && b != 0)
    {
	    b = -b / ( a * 2);
	    d = fabs(d);
	    x1 = sqrt(d) / (a * 2);
	    printf("%.2f+%.2fi\n",b,x1);
	    printf("%.2f-%.2fi",b,x1);
    }
    else if(a == 0 && b != 0)
    {
	    x1 = -c / b;
	    printf("%.2f",x1);
    }
    else if(d < 0 && b == 0 && a!=0)
    {
	    d = fabs(d);
	    x1 = sqrt(d) / 2;
	    printf("0.00+%.2fi\n",x1);
	    printf("0.00-%.2fi",x1);
    }

    return 0;

}


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


# include<stdio.h>
# include<math.h> 
int main(void)
{
    int y,m,d;
    scanf("%d/%d/%d",&y,&m,&d);	
    switch(m-1)
    {
    case 11:d=30+d;
    case 10:d=31+d;
    case 9:d=30+d;
    case 8:d=31+d;
    case 7:d=31+d;
    case 6:d=30+d;
    case 5:d=31+d;
    case 4:d=30+d;
    case 3:d=31+d;
    case 2:if(y%4==0&&y%100!=0||y%400==0)
    {
    d=29+d;	
    }
    else 
    {
    d=28+d;		
    }
    case 1:d=31+d;
    case 0:d=d;
    printf("%d",d);
    }
    return 0;	
}

2.对其他你认为需要进行总结的内容进行总结。
(1)需掌握的:①字符常量②字符串常量和字符变量③switch语句④字符型数据的输入输出⑤复合语句
(2)需注意的:①在if和else后面总要用到{ }②当使用switch语句时,用break语句跳出。③“%c”输入时,空格字符和“转义字符”作为有效字符输入。在“%c”前加一个空格,忽略缓冲区内的空白字符(空格、回车、tab键)。
(三)实验总结
1.比较大小
(1)题目
本题要求将输入的任意3个整数从小到大输出。
(2)流程图


(3)源代码

# include<stdio.h>
int main(void)
{
    int a,b,c,t;
    scanf("%d %d %d",&a,&b,&c);
    if(a>b)
    { t = a; a = b; b = t;} 
    if(a>c)
    {t = a; a = c; c = t;}  
    if(b>c)
    {t = b; b = c; c = t;}   
    printf("%d->%d->%d",a,b,c);
    return 0;
}

(4)实验分析
比较简单,没有问题
(5)本题PTA提交列表

2.高速公路超速处罚
(1)题目
按照规定,在高速公路上行使的机动车,超出本车道限速的10%则处200元罚款;若超出50%,就要吊销驾驶证。请编写程序根据车速和限速自动判别对该机动车的处理。
(2)流程图


(3)源代码

#include<stdio.h>
#include<math.h>
int main (void)
{
    double v,a,b;
    scanf("%lf%lf",&v,&a);
    if((v-a)/a*100<10)
    {
	    printf("OK");
    }
    if((v-a)/a*100>=10&&(v-a)/a*100<50)
    {
	    b=(double)(v-a)/a*100;
	    printf("Exceed %.0f%%. Ticket 200",b); 
    }
    if((v-a)/a*100>=50)
    {
	    b=(double)(v-a)/a*100.00;
	    printf("Exceed %.0f%%. License Revoked",b);
    }

    return 0;
}

(4)实验分析
问题1:流程图运行错误
原因:框图不对
解决办法:重新修改框图
(5)本题PTA提交列表

3.计算油费
(1)题目
现在90号汽油6.95元/升、93号汽油7.44元/升、97号汽油7.93元/升。为吸引顾客,某自动加油站推出了“自助服务”和“协助服务”两个服务等级,分别可得到5%和3%的折扣。
本题要求编写程序,根据输入顾客的加油量a,汽油品种b(90、93或97)和服务类型c(m - 自助,e - 协助),计算并输出应付款。
(2)流程图


(3)源代码

#include<stdio.h>
#include<math.h>
int main(void)
{
    int a,b;
    char c;
    double yuan;
    scanf("%d%d %c",&a,&b,&c); 
    if(c == 'm')
    {
	    if(b == 90)
	    {
		    yuan = a*6.95*0.95;
		    printf("%.2f",yuan);
	    }
	    if(b == 93)
	    {
		    yuan = a*7.44*0.95;
		    printf("%.2f",yuan);
	    }
	    if(b == 97)
	    {
		    yuan = a*7.93*0.95;
		    printf("%.2f",yuan);
	    }
    }           
    if(c == 'e')
    {
	    if(b == 90)
	    {
		    yuan = a*6.95*0.97;
		    printf("%.2f",yuan);
	    }
	    if(b == 93)
	    {
		    yuan = a*7.44*0.97;
		    printf("%.2f",yuan);
	    }
	    if(b == 97)
	    {
		    yuan = a*7.93*0.97;
		    printf("%.2f",yuan);
	    }
    }
	    return 0 ;
}

(4)实验分析
问题1:pta部分正确
原因:中间步骤拼写错误
解决办法:把错的拼写改正
(5)本题PTA提交列表

4.12-24小时制
(1)题目
编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。
(2)流程图


(3)源代码

#include <stdio.h>
int main (void)
{
    int hour,minute,a; 
    char op;
    scanf("%d%c%d",&hour,&op,&minute);
    if(hour<12)
    {
         printf("%d%c%d AM",hour,op,minute);
     } 
     else if (hour==12)
     {
 	    printf("%d%c%d PM",hour,op,minute);
     }
     else if (hour>12)
     {
 	    a=hour%12;
 	    printf("%d%c%d PM",a,op,minute);
     }
     return 0 ;
}

(4)实验分析
没有问题
(5)本题PTA提交列表

(四)博客互评
http://www.cnblogs.com/luyu0322-/p/7765830.html
http://www.cnblogs.com/karry-5201314/p/7779360.html
http://www.cnblogs.com/wangqi1998/p/7777066.html

posted on 2017-11-05 11:04  yrt晴天  阅读(371)  评论(0)    收藏  举报