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

(一)改错题

输出三角形的面积和周长,输入三角形的三条边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

源程序(有错误的程序)

    #include <stdio.h>
    #include <math.h>
    int main(void)
    {
        double a,b,c;
        double area,perimeter,s;

        printf("Enter 3 sides of the triangle: ");
        scanf( "%lf%lf%lf",&a,&b,&c );

        if( a + b > c || b + c > a || a + c > b) 
            s = ( a + b + c ) / 2;
            area = sqrt( s * ( s - a ) * ( s - b ) * ( s - c );
            perimeter = a + b + c;
            printf("area = %.2f; perimeter = %.2f\n",area,perimeter);
    
        else
            printf("These sides do not correspond to a valid triangle\n");

        return 0;        
    }

对源程序进行编译,采用每次修改第一个错误并重新编译的方法,记录每个错误的错误信息、分析错误原因并给出正确的语句。
改错题采用如下格式
  错误信息:

编译显示存在两个错误
  错误原因:area语句末缺少)
  改正方法:加上)
  错误原因:if语句末缺少大括号
  改正方法:加上大括号
  错误信息:
  
错误原因:if判断语句条件错误
改正方法:应将||都改为&&
改正后的代码:

#include <stdio.h>
#include <math.h>
int main(void)
{
    double a,b,c;
    double area,perimeter,s;
    printf("Enter 3 sides of the triangle: ");
    scanf( "%lf%lf%lf",&a,&b,&c );
    if( a + b > c && b + c > a && a + c > b)
	{ 
    s = ( a + b + c ) / 2;
    area = sqrt( s * ( s - a ) * ( s - b ) * ( s - c ));
    perimeter = a + b + c;
    printf("area = %.2f; perimeter = %.2f\n",area,perimeter);
    }
    else
    {
    printf("These sides do not correspond to a valid triangle\n");
    }
    return 0;        
    }

运行结果:

(二)学习总结

1.在编程解决问题的过程中,我们会用到多个if语句,if...else if...语句以及switch语句,查阅资料,总结一下这三种情况的区别何在,并分别举例加以说明。禁止大段复制,要自己对资料进行归纳总结,并给出你参考的资料链接。
(1)在效率上,switch语句是效率最高的,其次是if...else if...,最后是多个if语句。
(2)因为swicth语句是要用检查表的方式来查找,所以说,当分支较少时,if...else if...反而会更快。
2.对其他你认为需要进行总结的内容进行总结。
(1)swicth语句中为了保持各语句的正常运行,最后必须加上break.
(2)记住常用的ASCII码值
(3)判断是不是数字时可以用下面的方式

#include <stdio.h>
int main()
{   
char c;
c = getchar();//读取一个字符。
if(c >='0' && c<='9')printf("是数字\n");
else  if(c >='a' && c<='z' ||  c >='A' && c<='Z'))printf("是字母\n");
else printf("是特殊字符\n");
return 0;
}

(三)实验总结

1.成绩转换

(1)题目

本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:

大于等于90分为A;
小于90且大于等于80为B;
小于80且大于等于70为C;
小于70且大于等于60为D;
小于60为E。
(2)流程图

(3)源代码

#include <stdio.h>
int main()
{
    int grade;
    scanf("%d",&grade);
    switch(grade/10)
    {
        case 10:
        case 9:
        printf("A\n");
        break;
        case 8:
        printf("B\n");
        break;
        case 7:
        printf("C\n");
        break;
        case 6:
        printf("D\n");
        break;
        default:
        printf("E\n");
    }
    return 0;
}

(4)实验分析

问题1:第一次提交时,复制粘贴时,丢了最后的大括号

原因:相当粗心

解决办法:十个俯卧撑(梦中)

问题2:第二次提交时,case后面 54321都打了出来,显示错误,E不能正常表达

原因:0时没有结果

解决办法:改为6时就先停止,6之后就输出E
(5)本题PTA提交列表

2.三角形判断

(1)题目

给定平面上任意三个点的坐标(x1 ,y1)、(x2,y2)、(x3,y3),检验它们能否构成三角形。

(2)流程图

(3)源代码

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

(4)实验分析

真没错。。PTA一遍过

(5)本题PTA提交列表

3.两个数的简单计算器

(1)题目

本题要求编写一个简单计算器程序,可根据输入的运算符,对2个整数进行加、减、乘、除或求余运算。题目保证输入和输出均不超过整型范围。

(2)流程图

(3)源代码

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a,b,d;
    char c;
    scanf("%d %c %d",&a,&c,&b);
    if(c == '+')
    {
        d=a+b;
    }
    else if(c == '-')
    {
        d=a-b;
    }
    else if(c == '*')
    {
        d=a*b;
    }
    else if(c == '/')
    {
        if(b != 0)
        {
            d=a/b;
        }
        else 
            {
            printf("输入错误!"); 
            exit(0);
            }
        }
    else if(c == '%')
    {
        d=a%b;
    }
    else
    {
        printf("ERROR");
        exit(0);
    }
    printf("%d",d);
    return 0;
}

(4)实验分析

错误1:程序测试时,无论如何输入正确的数据都显示ERROR

原因:在输入字符c时将%c写成了%d

解决办法:将%d改成%c

(5)本题PTA提交列表

4.求一元二次方程的根

(1)题目

本题目要求一元二次方程的根,结果保留2位小数。

(2)流程图

(3)源代码

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

(4)实验分析

问题1:不会求复数根,程序不完整
原因:数学没有跟上C的进度
解决办法:百度搜索复数根求解公式

(5)本题PTA提交列表

四、博客互评

1.赵星蕊
(思念诠释你我的距离
内容很工整,但是图片的链接不是太好,下次可以试试换行插图片
2.赵晓辉
(赵晓辉
晓辉写的非常认真,文本 内容 图片都用的非常好,向晓辉同志学习!
3.吉炎臣
(吉炎臣
吉同学,我想说,你的博客皮肤。。。真的很难受 尤其是右边,博客内容中代码没有插好 内容写的很好

最后

周日才发现 我没有发表随笔 失了智

posted @ 2017-11-05 12:45  怀瑾握瑜兮丶  阅读(304)  评论(0编辑  收藏  举报