(一)改錯題
輸出三角形的面積和周長,輸入三角形的三條邊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;
}
對源程序進行編譯,采用每次修改第一個錯誤並重新編譯的方法,記錄每個錯誤的錯誤信息、分析錯誤原因並給出正確的語句。
錯誤信息:
錯誤原因:area = sqrt( s * ( s - a ) * ( s - b ) * ( s - c ); 最后面丟掉了半個括號
改正方法:area = sqrt( s * ( s - a ) * ( s - b ) * ( s - c ));
錯誤信息:
錯誤原因:if與else中的語句沒有加括號
改正方法:在每一個條件前后加括號
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");
}
錯誤信息:
錯誤原因:三角形判定兩邊之和大於第三邊判定關系有誤
改正方法:三角形兩邊之和大於第三邊應該是並且的關系用&&連接而不是||, if( a + b > c && b + c > a && a + c > b)
以下是我改正后的程序:
#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.在編程解決問題的過程中,我們會用到多個if語句,if...else if... 語句以及switch語句,查閱資料,總結一下這三種情況的區別何在,並分別舉例加以說明。禁止大段復制,要自己對資料進行歸納總結,並給出你參考的資料鏈接。
答:1.if與if else
①if是條件判斷語句,只有if的條件成立(表達式的值為真)后,才會執行if部分的代碼,否則將會執行else的代碼。
如果是if...else if,則滿足第一個if執行第一個if里的代碼,如果不滿足第一個if,而滿足第二個if,則執行第二個if(即else if)的代碼,如果都不滿足,就不執行,如果后面有else(不帶if的else),則只要前面的if和else if都沒執行,就執行最后一個else。
②if,else if都需要接判斷表達式。else不需要判斷表達式。
使用else if和else,必須緊跟在if之后,形參if-esle if組或if-else對。 沒有對應的if語句,else if和else語句都會在編譯時報錯。
if(condition1) /*如果滿足條件1*/
{
}
else if(condition2)/*否則,如果滿足條件2*/
{
}
else/*否則*/
{
}
2.if與switch
if語句每執行一次都要先判斷條件表達式是true還是false,為true時執行相應語句,若為false則繼續判斷下一個表達式,直到最后一個else結束。線性執行。
switch語句只需在入口時計算表達式的值,然后查找跳轉表,執行對應語句,否則default。
區別一:
switch…case…只能用於case值為常量的分支結構,而if…else…更加靈活。
區別二:
if判斷條件為邏輯表達式,可以是布爾類型的合法表達式、可以是常量、枚舉等。而switch 通常處理算術表達式,或字符。。
區別三:
switch 進行一次條件判斷后直接執行到程序的條件語句。而if…else 有幾種條件,就得判斷多少次。
區別四:
相比if語句,switch語句是以空間換時間的分支結構。因為它要生成跳轉表,所以占用較多的代碼空間。當case常量分布范圍很大但實際有效值又比較少的情況, switch…case的空間利用率將變得很低。
區別五:
分支較多時,使用switch的效率高於if,除非第一個if條件就為真。。
其次,當分支較多時,使用if…else…代碼可讀性不如switch…case…高。
if…else…
if (表達式1)
{
語句1;
}
else if (表達式2)
{
語句2;
}
else if (表達式3)
{
語句3;
}
else if (表達式4)
{
語句4;
}
...
else
{
語句n+1;
}
switch…case…
switch (表達式)
{
case 值1:語句1;break;
case 值2:語句2;break;
case 值3:語句3;break;
case 值4:語句4;break;
case 值5:語句5;break;
...
default:語句n+1;break;
}
參考鏈接:http://bbs.itheima.com/thread-3126-1-1.html
2.對其他你認為需要進行總結的內容進行總結。
答:在switch中,有些情況不需要每個case后邊都加break,比如計算一年至今有多少天。 有一些截圖在此無法上傳成功,仍是一串字符,目前還無法解決,只能尋找替代品。
(三)實驗總結
本次實驗總結,學號末位數是單數的同學完成選擇結構(2)中的1、5、7、9題,學號末位數是雙數的同學完成選擇結構(2)中的2、4、6、8題。
- 比較大小
(1)題目
本題要求將輸入的任意3個整數從小到大輸出。
(2)流程圖

(3)源代碼
#include<stdio.h>
int main()
{
int a,b,c,n,max,min;
scanf("%d %d %d",&a,&b,&c);
if(a>=b&&b>=c)
{
max = a;
n = b;
min = c;
}
else if(a>b&&b<c&&a>c)
{
max = a;
n = c;
min = b;
}
else if(b>a&&a>c)
{
max = b;
n = a;
min = c;
}
else if(b>a&&c>a&&b>c)
{
max = b;
n = c;
min = a;
}
else if(a>b&&b<c&&a<c)
{
max = c;
n = a;
min = b;
}
else if(b>a&&c>a&&b<c)
{
max = c;
n = b;
min = a;
}
else if(c>a&&a>b)
{
max = c;
n = a;
min = b;
}
else if(c>a&&a<b&&c>b)
{
max = c;
n = b;
min = a;
}
else if(c>a&&a<b&&c<b)
{
max = b;
n = c;
min = a;
}
printf("%d->%d->%d",min,n,max);
return 0;
}
(4)實驗分析
問題1:此實驗一開始輸入格式沒有讀懂。
原因:來才發現格式單純的只是“->”
解決辦法:只需按題目輸出即可。
問題2:編程忘記了a=b=c的情況。
解決辦法:在if中加入a=b=c條件即可。
問題:在流程圖里邊我無法在輸出用數字以及->輸出。
解決辦法:只能用字母加->表示。
(5)本題PTA提交列表

4.高速公路超速處罰
(1)題目
按照規定,在高速公路上行使的機動車,超出本車道限速的10%則處200元罰款;若超出50%,就要吊銷駕駛證。請編寫程序根據車速和限速自動判別對該機動車的處理。
(2)流程圖

(3)源代碼
# include <stdio.h>
int main(void)
{
int a,b;
double c;
scanf("%d %d",&a,&b);
if(b*110<=100*a&&a*100<b*150)
{
c=(a-b)*100.0/b;
printf("Exceed %.f%%. Ticket 200",c);
}
else if(b*150<=a*100)
{
c=(a-b)*100.0/b;
printf("Exceed %.f%%. License Revoked",c);
}
else
{
printf("OK");
}
return 0;
}
(4)實驗分析
問題1:當b=150時,輸出的是Exceed %.f%%. Ticket 200",c,
原因:b的范圍沒有弄清楚。
解決辦法:b=150應該放在下邊那個判斷條件里。
(5)本題PTA提交列表

6.計算油費
(1)題目
現在90號汽油6.95元/升、93號汽油7.44元/升、97號汽油7.93元/升。為吸引顧客,某自動加油站推出了“自助服務”和“協助服務”兩個服務等級,分別可得到5%和3%的折扣。
本題要求編寫程序,根據輸入顧客的加油量a,汽油品種b(90、93或97)和服務類型c(m - 自助,e - 協助),計算並輸出應付款。
(2)流程圖

(3)源代碼
# include <stdio.h>
int main(void)
{
int a,b;
char op;
double money;
scanf("%d %d %c",&a,&b,&op);
switch(b)
{
case 90:
money=6.95*a;
break;
case 93:
money=7.44*a;
break;
case 97:
money=7.93*a;
break;
}
if(op=='m')
{
money=money*0.95;
}
else
{
money=money*0.97;
}
printf("%.2f",money);
return 0;
}
(3)實驗分析
問題1:
原因:在一開始編程序的時候忘記了字符變量是什么。
解決方法:現在知道了字符型變量if里邊應該用單引號,應該切忌;
問題2:在流程圖里邊服務類型的選擇我有一些搞不懂。
原因:服務類型如果用選擇的話,選擇條件不知道如何寫。
解決方法:把選擇去掉,直接對服務類型賦值。
(5)本題PTA提交列表

8.12-24小時制
(1)題目
編寫一個程序,要求用戶輸入24小時制的時間,然后顯示12小時制的時間。
(2)流程圖

(3)源代碼
# include <stdio.h>
int main(void)
{
int a,b;
scanf("%d:%d",&a,&b);
if(a>12)
{
if(a==24)
{
printf("0:%d AM",b);
}
else
{
a=a-12;
printf("%d:%d PM",a,b);
}
}
else
{
if(a==12)
{
printf("%d:%d PM",a,b);
}
else
printf("%d:%d AM",a,b);
}
return 0;
}
(4)實驗分析
問題1:流程圖里邊輸出是還是無法表示數字,比如我令m=分鍾,輸出的時候還是m這個字母。
原因:可能這個軟件就無法輸出數字。
解決方法:就只能看左邊的紅色的字符表示。
(5)本題PTA提交列表

(四)博客互評
每個同學至少評論三篇其他同學的博客作業,依次列出你所評論的博客地址。對於同學對你的博客作業提出的問題,應積極進行回答,存在的錯誤應及時改正。希望大家能夠在互評的過程中取長補短,共同進步。
http://www.cnblogs.com/yiqiekaoziji/p/7772484.html 我們不一樣(徐振剛)
http://www.cnblogs.com/zhaochenyu/p/7769166.html 永恆破碎(趙晨宇)
http://www.cnblogs.com/yjy751522356/p/7773477.htm l 幕曦
