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/