第四次作业

第四次作业


(一)改错题

源程序(有错误的程序)

 #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:

错误原因:后面没有加括号。

改正方法:在后面加括号。

错误信息2:

错误原因:else没有对应的if

改正方法:在if和else后面加一对大括号。

编译正确:

错误信息 3:

错误原因 :在if条件括号中用了或者“||”,应该是和“&&”的关系。
改正方法:把“||”改成“&&”。
输出正确!

(二)学习总结


if-else语句的一般格式为:

if(表达式)
   {
   语句1;
   }    
else
{
    语句2;
}

else-if语句是实现多分支的方法,其一般形式为:

if(表达式1)
{
    语句1;
}
else if(表达式2)
{
    语句2;
}
...
else if(表达式n-1)
{
    语句n-1;
}
else
{
    语句n;
}

switch语句的一般形式为:

switch(表达式)
{
    case 常亮表达式1:语句段1;break;
    case 常亮表达式2:语句段2;break;
    ...
    case 常亮表达式n:语句段n;break;
    default:语句段n+1;break;
}

在switch语句中,表达式和常量表达式的值一般是整型和字符型,所有的常量表达式的值都不相等,每个语句段可以包括一条或多条语句,也可以为空语句。default可以省略,如果省略了default,当表达式的值与任何一个常量的表达式的值都不相等时,就什么都不执行。

switch建议判断固定值的时候用;
if建议判断区间或范围的时候用;
用switch能做的,用if都能做,单反过来则不行。

  1. 两者本质的区别是 if-else语句更适合于对区间(范围)的判断,而switch语句更适合于对离散值的判断
  1. 示例
    判断65分到85分之间的学生有哪些适合用if-else语句,因为[65,85]是区间,而判断一个学生的班级是一班、二班还是三班适合用switch语句,因为一班、二、三班是离散值。
  1. 所有的switch语句都可以用if-else语句来替换(因为if-else语句只需对每个离散值分别做判断即可),而并不是所有的if-else语句都可以用switch语句来替(因为区间里值的个数是无限的并且switch所接受的值只能是整型或枚举型,所以不能用case来一一列举)。

链接:if和else if和switch的区别

对其他内容进行总结:

1.字符常量和字符变量,字符数据的输入和输出。在输入字符的时候我们如果遇到了字符串的格式应该加""直接输入,让scanf去处理就行。

(三)实验总结

(1).

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

大于等于90分为A;

小于90且大于等于80为B;

小于80且大于等于70为C;

小于70且大于等于60为D;

小于60为E。
(2)流程图

(3)源代码

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

(4)实验分析

问题1:

原因:没有判断100这个数 输出错误

解决办法:在switch后面判断加上case10这样就可以判断100这个数。

(2).

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

(2)流程图


(3)源代码

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

(4)实验分析

问题1:在PTA中提交总是部分正确

原因:输出的格式和题目中的不一样。

解决办法:应该把(L=%.2f, A=%.2f)改成(L = %.2f, A = %.2f)。

(3).

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

(2)流程图


(3)源代码

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
	int a,b,c;
	char op;
	b!=0;
	scanf("%d %c %d",&a,&op,&b);
	switch(op)
	{
		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:

原因:输出结果和给出的格式不一样

解决办法:
在printf后面加一个exit(0)强制性输出。

(4).

(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<stdlib.h>
#include<math.h>
int main()
{
    double a, b, c;
    scanf("%lf%lf%lf", &a, &b, &c);
    double d, del, ans1, ans2;
      d = b * b - 4.0 * a * c;
    if(a == b && a == c && a == 0)
         printf("Zero Equation\n");
    else if(a == b && a == 0 && c != 0)
         printf("Not An Equation\n");
    else if(d == 0)
     {
         ans1 = (-b) / (2.0*a);
         printf("%.2f\n", ans1);
     }
    else if(a == 0)
             printf("%.2f\n", (-c) / b);
    else if(d > 0)
     {
         del = sqrt(d);
         ans1 = (-b+del) / (2.0*a);
         ans2 = (-b-del) / (2.0*a);
         printf("%.2f\n%.2f\n", ans1, ans2);
     }
    else if(d < 0)
     {
         del = sqrt(-d);
         if(b != 0)
             ans1 = (-b) / (2.0*a);
         else
             ans1 = 0;
         ans2 = del / (2.0*a);
         printf("%.2f+%.2fi\n%.2f-%.2fi\n", ans1, ans2, ans1, ans2);
     }
   return 0;
}

(4)实验分析

问题1:输出结果总是部分正确。

原因:没有考虑清楚纯虚根的情况。

解决办法:纯虚根的情况,即有虚根的时候,如果实部为0,则实部应该输出0.00.然后输出虚部,不能只输出虚部而没有实部的内容。

(5)本题PTA提交列表



(四)博客互评

1.

针对人满为患的博客园,我首先用厉害来形容。整体看起来很流畅,有许多新的格式,更加的增加了博客的美观性。

在源代码上我觉得应该向你学习,每一个加入一个题注,这样方便我们更好的清楚自己在写什么。

问题:在实验总结下面应该按照老师给的格式来写,例如:


问题:

原因:

解决方法:


总体还是很棒的我们要向你多学习学习!^ - ^ 。

2.

针对 怪人的博客园首先用平淡来形容格式很普通。
问题1:在每个实验总结后面都是写着没有问题,这样就是不负责任的写作业,在写程序的过程中不可能出现问题,不能及时的记录自己的问题就不能很快的提高。
问题2:PTA的提交列表中没有按照老师的正常格式,就是一整篇的截图下来,不能够很好的看清楚每道题提交的次数,这样会被扣分的。
问题3:在截图的时候尽量截完整图,这样看起来比较整齐,这次作业有的截图比较不好。

最后希望能够继续努力

3.

对于幕曦的博客园,首先得界面就比较吸引人,这和他在博客园中体现的一样,比较整齐,让人看了很舒服。
在源程序中写的比较详细,值得我们学习。多多努力。

posted @ 2017-11-02 00:22  一只猫の磊☀  阅读(302)  评论(14编辑  收藏  举报