一、PTA實驗作業
題目1:計算分段函數
1.實驗代碼
double x,y;
scanf("%lf",&x);
if(x>=0){
y=sqrt(x);
}
else{
y=pow(x+1,2)+2*x+1/x;
}
printf ("f(%.2f) = %.2f\n",x,y);
2 設計思路
- 1.定義兩個雙精度浮點型變量x,y
- 2.輸入x的值
- 3.判斷x是否大於等於0
- 4.若是,則y=sqrt(x),若否,則y=pow(x+1,2)+2*x+1/x
- 5.輸出y的值
3.本題調試過程碰到問題及解決辦法
-
(1)編譯問題:定義了變量x和f(x)
-
解決辦法:從錯誤提示中知道不能用f(x),百度后得知c語言中表達式的左邊不可以有變量,故不能用f(x),只能重新設變量y
4.本題PTA提交列表(要提交列表,不是結果)
題目2:7-4 輸出三角形面積和周長##
本題要求編寫程序,根據輸入的三角形的三條邊a、b、c,計算並輸出面積和周長。注意:在一個三角形中, 任意兩邊之和大於第三邊。三角形面積計算公式:area=√s(s−a)(s−b)(s−c),其中s=(a+b+c)/2。
1.實驗代碼
int a,b,c;
double s,area,perimeter; //area代表三角形的面積,perimeter代表三角形的周長
scanf("%d %d %d",&a,&b,&c);
if(a+b>c&b+c>a&a+c>b) //檢驗abc三邊是否能構成三角形
{
s=(a+b+c)/2.0;
area=sqrt(s*(s-a)*(s-b)*(s-c));
perimeter=a+b+c;
printf("area = %.2f; perimeter = %.2f",area,perimeter);
}
else{
printf("These sides do not correspond to a valid triangle");
2 設計思路
- 1.定義三個整數型變量a,b,c來存放三角形的三條邊,定義三個雙精度浮點型變量s,area,perimeter
- 2.輸入三條邊的大小a,b,c
- 3.判斷輸入的a,b,c是否能構成三角形
- 4.若能,則 s=(a+b+c)/2.0, area=sqrt(s(s-a)(s-b)*(s-c)) , perimeter=a+b+c;並輸出area和perimeter的值
- 5.若不能,則輸出錯誤提示-These sides do not correspond to a valid triangle
3.本題調試過程碰到問題及解決辦法
-
1.sqrt函數的使用錯誤導致編譯錯誤
-
2.解決方法:上網百度DevC++的錯誤提示得知是sprt函數的使用錯誤並且知道了sqrt的使用對象必須是double或是float型的數據
-
3.同時也反思了:盡管一開始定義s是double型,但是一開始是用s=(a+b+c)/2 得來的,又忽略了整數除以整數等於整數這個易錯點
所以要得到double型的s,必須用s=(a+b+c)/2.0
4.本題PTA提交列表(要提交列表,不是結果)
題目3:7-6 出租車計價##
本題要求根據某城市普通出租車收費標准編寫程序進行車費計算。具體標准如下:
起步里程為3公里,起步費10元;
超起步里程后10公里內,每公里2元;
超過10公里以上的部分加收50%的回空補貼費,即每公里3元;
營運過程中,因路阻及乘客要求臨時停車的,按每5分鍾2元計收(不足5分鍾則不收費)。
1.實驗代碼
double s,money; //路程和路費
int time; //等待時間
scanf("%lf%d",&s,&time);
if(s<=3){ //判斷距離
money=10;
}
else if(s>3&&s<=10){
money=10+(s-3)*2;
}
else{
money=10+7*2+(s-10)*3;
}
if(time<5){ //判斷時間
money=money+0;
}
else{
money=money+time/5*2;
}
printf("%.lf",money); //%.lf可用於取整
2 設計思路
- 1.定義兩個雙精度浮點型變量s,money分別來存放路程和路費,定義一個整數型變量time來存放路途中耽誤的時間
- 2.判斷距離是否大於3,若不是,則money=10,若是,則money=10+72+(s-10)3
- 3.判斷時間是否大於5,若不是,則money=money+0;若是,則 money=money+time/5*2
- 4.輸出money
3.本題調試過程碰到問題及解決辦法
- (1)編譯錯誤:強行用%d來輸出double型的money來實現輸出整數型
解決方法:上網百度到double型變量想要四舍五入成整數輸出的方法是%.1f - (2)答案錯誤:誤認為路程也要四舍五入導致結果錯誤
解決方法:多次試用題目數據后重新審題發現沒有提及路程需要四舍五入,反思認真審題別解讀過度 - (3)部分答案錯誤:因為想要把money變成整數型然后利用int函數使它變成整數型,然后輸出時又用了 %.1f來實現double轉變成整數型
解決方法:多次錯誤后發現自己把它認真地取整了兩次,並且上網做了int函數的功能:向下取整為最接近的整數 ,所以利用int(money+0.5)來實現四舍五入也是錯誤
4.本題PTA提交列表(要提交列表,不是結果)
題目4:7-8 程序設計聯考
自從湖南農業大學、吉首大學和懷化學院組織程序設計課程聯考以后,舉辦聯考的經驗越來豐富。尤其是在使用PTA系統作為考試平台之后,聯考工作得到了很多學校的認可和支持。所以,現在參與聯考的學校比較多。為了便於區分考生,考生賬號的第一位是學校代號。1代表Hunan Agricultural University,2代表Jishou University,3代表Huaihua University,4代表Aerospace University,5代表Ocean University。 請編寫程序根據考生的賬號區分考生的學校。
1.實驗代碼
int account,x; //account代表學號,x代表學號的首位數字
scanf("%d",&account);
x=account/100000;
switch(x){
case 1:printf("Hunan Agricultural University");break;
case 2:printf("Jishou University");break;
case 3:printf("Huaihua University");break;
case 4:printf("Aerospace University");break;
case 5:printf("Ocean University");break;
default:printf("Other University");break;
}
2 設計思路
- 1.定義兩個整數型變量account,x 分別來存放學號和學號的首位數字
- 2.判斷x的數值大小
- 3.利用switch語句實現多分支結構,根據用戶輸入的account得到的x,用switch語句將相應的學校輸出
3.本題調試過程碰到問題及解決辦法
- (1)部分答案錯誤:題目中的Other University是分行寫的誤認為兩個單詞之間沒有空格
- 解決的方法:認真對一遍題目后覺得other university應該跟上面的格式一致,便加了空格就通過啦~~~
4.本題PTA提交列表(要提交列表,不是結果)
二、截圖本周題目集的PTA最后排名。
三、本周學習總結
1.你學會了什么?
- 1.我對分支結構中的if-else語句的使用更加的清楚:(1)
if(表達式) 語句1;else 語句2;
其中的語句1,2都必須是一條語句,若是多個表達式則用復合語句,注意復合語句是一條語句 (2)if后面不是非要跟上else的,視情況可不加 ,else后面也可以是空語句 (3)else總是與它向上最近的if相配對,注意不要搞錯邏輯關系 - 2.學會了switch語句來實現多分支結構,
switch(表達式){ case 常量表達式:語句段1 case 常量表達式:語句段2 ··· default 語句段}
在switch語句中常遇到的易錯點:(1)switch(x)中的x必須是整型 (2)case后面應該是一個常量表達式,且必須要有一個空格 (3)switch中每個語句段的末尾使用break才能跳出switch否則執行其后的所有語句段 ······ - 3.學習了字符型數據:(1)字符型數據包括字符型變量op和字符型常量‘a' '+''-''*'和’/'等(必須要有單引號) (2)字符型變量在定義時用類型名是char,在函數調用的格式控制字符串中相應的格式控制說明是 %c (3)字符輸入函數getchar()從鍵盤輸入一個字符 ,字符輸出函數putchar()輸出一個字符
- 4.邏輯運算:!代表非,&&代表與,||代表或 注意:-3<=x<=7是錯誤的表達,將是個恆真命題,正確:-3<=x&&x<=7
2.本周的內容,你還不會什么?
- 1.對getchar和putchar的使用還不熟練
- 2.不太會利用if和getchar相結合來實現輸入多個字符的程序
- 3.還有利用if語句來實現判斷是否為數字字符和字母字符的程序也不熟練
- 4.對於含有多層嵌套型if-else的語句程序的理解不夠迅速
- 5.對於switch,if-else,getchar等等的易錯點的了解還不夠完整
- 6.課本P55中的自動售貨機程序還不太明白
3.你碰到什么困難,打算如何解決?
- 1.從這次的PTA中我發現自己仍然存在着各種細節錯誤,eg:scanf中的 "; 輸成 ;"
- 解決方法:擼起袖子加油干!!!繼續沉迷在代碼中,每晚打兩個小時代碼,等到熟練到一定的程度后找錯誤成為了一種條件反射(想想就很美滋滋······)
- 2.設計程序的思路不夠准確和迅速:看到題目后沒有迅速的反應而且容易出現偏差
- 解決方法:多看課文經典的例題並且掌握它,然后多打代碼題多看題型,緊跟着老師的進度一步一步向前進
- 3.對Dev-C++的調試還不夠熟練
- 在今后的題目中遇到問題要盡量學會自己去找出錯誤,學會利用Dev-C++調試一步步發現自己的錯誤,終歸還是Practice makes perfect和題海戰術~~~
- 4.對易錯點的總結目前還不夠完整
- 養成對老師所講到的易錯點,自己遇到的易錯點利用學長安利的app或者自己的筆記本及時記錄下來的好習慣然后慢慢從總結中進步~~