C語言程序設計第四次作業


C語言程序設計第四次作業

(一)改錯題

源程序:

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

錯誤信息:

錯誤原因:sqrt后面的括號不完整,使這個開平方根函數無法正常運行
改正:在sqrt( s * ( s - a ) * ( s - b ) * ( s - c ),最后面再加一個“)”

錯誤信息:

錯誤原因:else沒有找到與之對應的if,對此我又寫了一個類似的錯誤

但是我把if后面的printf語句去掉程序就正確了

因為在if后面沒花括號{}輸出if后面的語句后程序停止不再繼續向下進行

改正:在if后加上{}框住if后面的語句到else前面
編譯正確
錯誤信息:

錯誤原因:這明顯不符合實際情況,關鍵在於if語句中的判斷條件“||”這是或的意思只要有一個條件成立就可以執行下面的語句,這里應該是“&&”與就是這些條件全部是真才能繼續下面的語句
改正:把 if( a + b > c || b + c > a || a + c > b)中“||”改為“&&”
運行及測試結果:

(二)學習總結

1、 if語句,if...else if... 語句以及switch語句都屬於流程控制語句,

if語句和if...else if語句有很大區別,多個if是所有的if都會進行判斷 if ...else if是只要有滿足條件的,就不再對之后的else if進行判斷
if...else if語句和switch語句的區別是switch...case會生成一個跳轉表來指示實際的case分支的地址,有種指哪打哪的感覺,快准恨。
所有的switch語句都可以用if...else if替換,而並不是所有的if-else語句都可以用switch語句來替換。
在判斷條件較多時可以用switch case語句提高運行效率,有些情況下switch語句中的不加break的穿透現象會有不俗的效果。
參考資料地址:http://www.cnblogs.com/wankun/p/4989831.html

2 、在做改錯題的時候發現一個問題s = ( a + b + c ) / 2;這里有沒有必要做強制轉型,我想單純這樣計算結果會損失很多數據,我就把2改成了2.0可是運算結束是一樣的。后來我就把那一段單獨寫了一下

結果就不一樣了
2.0的時候是

2的時候是

我很是納悶,到底哪不一樣最后發現前面聲明的類型就不一樣改錯題中2或者2.0之所以對是在聲明時 a,b,c;
就聲明成了double類型所以s = ( a + b + c ) / 2;自然也就是double類的了,而我提出這段程序時用的int類型定義的a,b,c所以2和2.0就會有區別了。
switch語句中要有break;否則程序無法跳出。

(三)實驗總結

1.成績轉換

(1)題目:本題要求編寫程序將一個百分制成績轉換為五分制成績。

轉換規則:
大於等於90分為A;
小於90且大於等於80為B;
小於80且大於等於70為C;
小於70且大於等於60為D;
小於60為E;

(2)流程圖

(3)源代碼

#include<stdio.h>
int main()
{
int g;
scanf("%d",&g);
switch(g/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");
}
}

(4)實驗分析

問題:結果正確就是運算效率低

原因:沒有理解switch語句的優勢所在,不明確switch語句和if。。else。語句的區別

解決:把if...else if 語句換成switch語句

(5)本題PTA提交列表

5、三角形判斷

(1)題目:給定平面上任意三個點的坐標(x1,y1)、(x2,y2)、(x3,y3​​),檢驗它們能否構成三角形。

(2)流程圖

(3)源代碼

#include<stdio.h>
#include<math.h>
int main()
{

double x,v,k,L,A,m,t,a,b,c,d,e,f,z;
scanf("%lf %lf %lf %lf %lf %lf",&a,&b,&c,&d,&e,&f,&z);


k=(a-c)*(a-c)+(b-d)*(b-d);
k=sqrt(k);
x=(a-e)*(a-e)+(b-f)*(b-f);
x=sqrt(x);
v=(c-e)*(c-e)+(d-f)*(d-f);
v=sqrt(v);

if(k+x>v&&k+v>x&&v+x>k)
{
	L=x+v+k;
	m=L/2;
	t=m*(m-k)*(m-x)*(m-v);
	A=sqrt(t);
	printf("L = %.2f, A = %.2f",L,A);
}
else
{
	printf("Impossible");
}

}

(4)實驗分析

問題1:

原因:

%f 代表輸入float, 是實數;
%d 代表輸入int, 是整數;
根據題目要求應該輸入的是一個實數

改正:把所有變量改為double或者float類型

(5)本題PTA提交列表

7、兩個數的簡單計算器

(1)題目:本題要求編寫一個簡單計算器程序,可根據輸入的運算符,對2個整數進行加、減、乘、除或求余運算。題目保證輸入和輸出均不超過整型范圍。

(2)流程圖

(3)源代碼

#include<stdio.h>
#include<stdlib.h>
int main()
{
int a,b,c;
char op;
scanf("%d %c %d",&a,&op,&b);
if(op=='+')
{
	c=a+b;
  printf("%d",c);
}
else if(op=='-')
{
	c=a-b;
  printf("%d",c);
}
else if(op=='*')
{
	c=a*b;
  printf("%d",c);
}
else if(op=='/')
{
	if(b==0)
{
	printf("除數不能為零\n");
           exit(0);	
}
else
{
	c=a/b;
	printf("%d",c);
}
}
else if(op=='%')
{
	c=a%b;
printf("%d",c);
}

else
{
	printf("ERROR");
}
    }

(4)實驗分析

問題:

這樣7-5輸入程序沒有問題,但是加上空格后7 - 5就不一樣了

這樣程序就不對了。

原因:

人們在輸入時會有時會加上空格而空格也算是一個字符,使得op變量無法正確被賦值

改正:

在%d %c %d中間插入空格留作緩沖使用

(5)本題PTA提交列表

9、求一元二次方程的根

(1)題目:本題目要求一元二次方程的根,結果保留2位小數

(2)流程圖

(3)源代碼

#include<stdio.h>
#include<math.h>
int main()
{
float a,b,c,x1,x2,s,m;
scanf("%f %f %f",&a,&b,&c);
	s=b*b-4*a*c;
if(a==0&&b==0&&c==0)
{
	printf("Zero Equation");
}
else if(a==0&&b==0&&c!=0)
{
	printf("Not An Equation");
}
else if(a==0&&b!=0&&c!=0)
{
	x1=-c/b;
 printf("%.2f\n",-c/b);raptor_OUTPUT
}
else if(a!=0&&b==0&&c==0)
{
	printf("0.00");
 } 

else
{
	 if(s>0)
  {
  	m=sqrt(s);
  	x1=(-b+m)/(2*a);
  	x2=(-b-m)/(2*a);
  	if(x1>x2)
  	{
  		printf("%.2lf\n",x1);
  		printf("%.2lf\n",x2);
  	}
  			 if(x1<x2)
  			{
  				printf("%.2lf\n",x2);
  				printf("%.2lf\n",x1);
			 }
	
  }
   if(s<0)
  {
  	
  	if(a!=0&&b==0&&c!=0)
  	{
	  m=sqrt(-s);
  		x2=m/(a*2);
  	printf("0.00+%.2lfi\n",x2);
  	printf("0.00-%.2lfi\n",x2);	
	  }
	else
	{
	m=sqrt(-s);
	x1=-b/(2*a);
  	x2=m/(2*a);
  	printf("%.2lf+%.2lfi\n",x1,x2);
  	printf("%.2lf-%.2lfi\n",x1,x2);
	}

  }
   if(s==0)
  {
  	m=-b/(2*a);
  	printf("%.2lf\n",m);
  }
}

}

(4)實驗分析

問題:

原因:忽略了一種情況沒有考慮方程是純虛根

解決:

問題:編譯錯誤

原因:在調試時忘記刪除原來的一些內容

解決:刪掉else if

(5)本題PTA提交列表

(四)博客互評

人滿為患 http://www.cnblogs.com/liukaixuan/

怪人、http://www.cnblogs.com/LLIU/

T磊? http://www.cnblogs.com/8426224ll/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM