第四次作業
(一)改錯題
源程序(有錯誤的程序)
#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都能做,單反過來則不行。
- 兩者本質的區別是 if-else語句更適合於對區間(范圍)的判斷,而switch語句更適合於對離散值的判斷
- 示例
判斷65分到85分之間的學生有哪些適合用if-else語句,因為[65,85]是區間,而判斷一個學生的班級是一班、二班還是三班適合用switch語句,因為一班、二、三班是離散值。
- 所有的switch語句都可以用if-else語句來替換(因為if-else語句只需對每個離散值分別做判斷即可),而並不是所有的if-else語句都可以用switch語句來替(因為區間里值的個數是無限的並且switch所接受的值只能是整型或枚舉型,所以不能用case來一一列舉)。
對其他內容進行總結:
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,中間用空格分開。
輸出格式:
根據系數情況,輸出不同結果:
-
如果方程有兩個不相等的實數根,則每行輸出一個根,先大后小;
-
如果方程有兩個不相等復數根,則每行按照格式“實部+虛部i”輸出一個根,先輸出虛部為正的,后輸出虛部為負的;
-
如果方程只有一個根,則直接輸出此根;
-
如果系數都為0,則輸出"Zero Equation";
-
如果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.
對於幕曦的博客園,首先得界面就比較吸引人,這和他在博客園中體現的一樣,比較整齊,讓人看了很舒服。
在源程序中寫的比較詳細,值得我們學習。多多努力。

