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;        
}

错误信息1:

错误原因1:第13行中的初始括号没有扩回
改正方法1:将括号扩回
错误信息2:

错误原因2:else上方的if语句没有{ }
改正方法2:在if语句下方加上{ }
继续编译,无错误

继续运行

与示例1相同


与示例2不符
经检查,发现为判断是否为三角形的语句错误

应修改为

再次编译运行

与示例2相同,运行结果正确

(二)学习总结
1.在编程解决问题的过程中,我们会用到多个if语句,if...else if... 语句以及switch语句,查阅资料,总结一下这三种情况的区别何在,并分别举例加以说明。给出你参考的资料链接。
①.if和else if
if是条件判断语句,只有当if条件成立时,才会执行if下面的程序,否则执行else语句
如果有多个if和else语句,需要if和else语句一一配对,否则会出现编译错误.并且if语句可以提高编程效率
②.if和else if后面都需要跟条件语句,而else后面不用跟
(2)if和switch
if每次执行语句时都要判断条件表达式是否为真,若为真,则执行if语句,若为假,则执行else语句
switch语句只需要在入口处计算表达式的值,然后执行对应语句,否则为default
区别一:
switch...case...只用于case值为常量的分支结构,而if...else...更加灵活多变
区别二:
switch是判断一次之间执行到底的语句,而if...else是需要有几种判断条件,就判断几次
区别三:
分支较多时,用switch更加效率高
参考链接:(https://zhidao.baidu.com/question/332651860.html)
2.对其他你认为需要进行总结的内容进行总结。
字符型变量只能存放字符变量,并且一次只能存放一个字符,一个字符变量占一个字节,字符型变量需要用单引号括起来,但字符型变量和整型可以相互转换,既可以用字符型%c,也可以用%d。
在switch语句中default后面不需要加入case,就像if..else...中的else后不需要加判断语句一样,并且在写关于时间的代码时,要加入stdlib.h的头文件,这是将时间作为种子的方法。并且一定要弄明白或,且,非这几种逻辑的用法,以及什么时候该用,不然会造成很大的麻烦。

(三)实验总结(我的学号为单号,需总结1,5,7,9题)
第一题:成绩转换
(1)题目:本题要求编写程序将一个百分制成绩转换为五分制成绩。
(2)流程图

(3)源代码

include <stdio.h>

int main(void)
{
int s,A,B,C,D,E;
scanf("%d",&s);
switch(s/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:PTA中成绩须转换判定
原因1:switch语句中需要在0-10之间判断
方法1:对输入的成绩除以10
(5)本题PTA提交列表

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

(3)源代码

include<stdio.h>

include<math.h>

int main(void)
{
double x1 = 0.0,y1 = 0.0,x2 = 0.0,y2 = 0.0,x3 = 0.0,y3 = 0.0,a = 0.0,b = 0.0,c = 0.0,L = 0.0,A = 0.0,M = 0.0;
scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3);
a = pow((pow(x1 - x2,2)+pow(y1 - y2,2)),0.5);
b = pow((pow(x1 - x3,2)+pow(y1 - y3,2)),0.5);
c = pow((pow(x3 - x2,2)+pow(y3 - y2,2)),0.5);
if(a + b > c && a + c > b && b + c > a)
{
L = a + b + c;
M = L / 2.0;
A = pow(M * (M - a) * (M - b) * (M - c),0.5);
printf("L = %.2f, A = %.2f",L,A);
}
else
{
printf("Impossible");
}
return 0;
}

(4)实验分析
问题1:坐标中求三角形面积的求法
原因1:公式记不清
方法1:背过公式
问题2:编译错误
原因2:sqrt公式中少了一个括号扩回
方法2:将括号扩回
(5)本题PTA提交列表

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

(3)源代码

include <stdio.h>

include <stdlib.h>

int main(void)
{
int a,b,result;
char c;
scanf("%d %c%d",&a,&c,&b);
switch(c)
{
case'+':
result = a+b;
break;
case'-':
result = a-b;
break;
case'':
result = a
b;
break;
case'/':
result = a/b;
break;
case'%':
result = a%b;
break;
default:
printf("ERROR");
exit(0);
}
printf("%d",result);
return 0;
}

(4)实验分析
问题1:当除数为0时
原因1:除数为0没有意义
方法1:用判断条件排除除数为0时的情况
(5)本题PTA提交列表

第四题:求一元二次方程的根
(1)题目:本题目要求一元二次方程的根,结果保留2位小数。
(2)流程图:

(3)源代码:

include<stdio.h>

include<math.h>

int main(void)
{
double a = 0.0,b = 0.0,c = 0.0,t = 0.0, x1 = 0.0,x2 = 0.0,m = 0.0;
scanf("%lf%lf%lf",&a,&b,&c);
t = b*b - 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(t > 0 && a != 0)
{
x1 = (sqrt(t) - b) / (2 * a);
x2 = (-b - sqrt(t)) / (2 * a);
printf("%.2f\n%.2f",x1,x2);
}
else if(t == 0 && a !=0)
{
x1 = -b / (2 * a);
printf("%.2f",x1);
}
else if(t < 0 && a != 0 && b != 0)
{
b = -b / ( a * 2);
t = fabs(t);
x1 = sqrt(t) / (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(t < 0 && b == 0 && a !=0)
{
t = fabs(t);
x1 = sqrt(t) / 2;
printf("0.00+%.2fi\n",x1);
printf("0.00-%.2fi",x1);
}

return 0;

}

(4)实验分析
一元二次方程和实数虚数根的问题没有弄懂,先做流程图可能会让我写C语言更容易一些,思维更加清楚,因为一元二次求根分类很多,还包括了复数求根
(5)本题PTA提交列表

(四)博客互评
对李攀同学的博客作业的建议:
对于switch case语句的分析对我很有帮助,让我更加理解了switch语句的用法,但if和switch语句的区别让我不是很明白,希望下一次可以语言更加简练。第二题的流程图和我的先后顺序有一点不一样,让我想到了还可以这样做,但是你的看上去有点长了,也许可以横向发展一下(http://www.cnblogs.com/lipan123/p/7778208.html)

对赵培硕同学的博客作业的建议:
作业条理很清晰,并且总结中还举例说明了switch和if的区别,让别人读起来更加明白。思维很严谨,但有时可能会犯一些不该有的小错误,导致结果错误。他的严谨思维和作业风格我需要学习,并加以改正。(http://www.cnblogs.com/abc15369938639/p/7773975.html)

对永恒破碎同学的博客作业的建议:
每道题后面最好加上实验分析及总结,毕竟我们不能只做题不分析总结,这样我们是没有办法进步的。分析总结可以让我们对于上一周学过的知识再巩固一遍,更加记忆深刻。你的学习总结其实可以再丰富一些的,比如可以拓展一下自己的知识面。(http://www.cnblogs.com/zhaochenyu/p/7769166.html)

posted @ 2017-11-03 21:39  王映丹  阅读(831)  评论(9编辑  收藏  举报