一、PTA實驗作業
題目1計算分段函數[2]
輸入格式:
輸入在一行中給出實數x。
輸出格式:
在一行中按“f(x) = result”的格式輸出,其中x與result都保留兩位小數。
輸入樣例1:
10
輸出樣例1:
f(10.00) = 3.16
輸入樣例2:
-0.5
輸出樣例2:
f(-0.50) = -2.75
1.實驗代碼
double x,y;
scanf("%lf",&x);
if(x>=0){
y=sqrt(x);
}
else{
y=pow(x+1,2)+2*x+pow(x,-1);
}
printf("f(%.2f) = %.2f",x,y);
2.設計思路
- 第一步:定義倆個浮點型變量x,y
- 第二步:輸入x
- 第三步:運用if-else語句,如果x>=0,執行y=sqrt(x);否則,y=pow(x+1.2)+2*x+pow(x,-1)
- 第四步:輸出f(x),注意輸出結果為倆位小數點,利用%。2f實現
3.本題調試過程碰到問題及解決辦法
問題:格式錯誤
解決辦法:再次讀題后增添等號左右的空格,提交后答案正確
4.本題PTA提交列表
題目2輸出三角形面積和周長
本題要求編寫程序,根據輸入的三角形的三條邊a、b、c,計算並輸出面積和周長。注意:在一個三角形中, 任意兩邊之和大於第三邊。三角形面積計算公式:area=√
s(s−a)(s−b)(s−c)
,其中s=(a+b+c)/2。
輸入格式:
輸入為3個正整數,分別代表三角形的3條邊a、b、c。
輸出格式:
如果輸入的邊能構成一個三角形,則在一行內,按照
area = 面積; perimeter = 周長
的格式輸出,保留兩位小數。否則,輸出
These sides do not correspond to a valid triangle
輸入樣例1:
5 5 3
輸出樣例1:
area = 7.15; perimeter = 13.00
輸入樣例2:
1 4 1
輸出樣例2:
These sides do not correspond to a valid triangle
1.實驗代碼
int a,b,c;
double s,area,perimeter;
scanf("%d%d%d",&a,&b,&c);
s=(a+b+c)/2.0;
area=sqrt(s(s-a)(s-b)*(s-c));
perimeter=a+b+c;
if(a+b>c&&a+c>b&&b+c>a){
printf("area = %.2f; perimeter = %.2f",area,perimeter);
}
else{
printf("These sides do not correspond to a valid triangle");
}
2.設計思路
- 第一步:定義整型變量a,b,c,分別代表三邊邊長
- 第二步:定義浮點型變量s,area,perimeter
- 第三步:輸入a,b,c
- 第四步:計算s,s=(a+b+c)/2.0
- 第五步:計算area,area=sqrt(s(s-a)(s-b)*(s-c)),
- 第六步:計算perimeter,perimeter=a+b+c
- 第七步:利用倆邊之和大於第三邊判斷a,b,c能不能組成三角形
- 第八步:如果能,輸出area和perimeter,注意小數位數;若不能,輸出These sides do not correspond to a valid triangle
3.本題調試過程碰到問題及解決辦法
問題:(1)s=(a+b+c)/2.0 除數一定要用浮點數2.0,否則整型除整型得到的結果是整型,可能會改變s的值,導致后面結果錯誤
(2)又忘記空格了導致格式錯誤
解決辦法:(1)將2改為2.0
(2)增加等號左右空格
4.本題PTA提交列表
題目3
出租車計價
本題要求根據某城市普通出租車收費標准編寫程序進行車費計算。具體標准如下:
起步里程為3公里,起步費10元;
超起步里程后10公里內,每公里2元;
超過10公里以上的部分加收50%的回空補貼費,即每公里3元;
營運過程中,因路阻及乘客要求臨時停車的,按每5分鍾2元計收(不足5分鍾則不收費)。
輸入格式:
輸入在一行中給出輸入行駛里程(單位為公里,精確到小數點后1位)與等待時間(整數,單位為分鍾),其間以空格分隔。
輸出格式:
在一行中輸出乘客應支付的車費(單位為元),結果四舍五入,保留到元。
輸入樣例1:
2.6 2
輸出樣例1:
10
輸入樣例2:
5.1 4
輸出樣例2:
14
輸入樣例3:
12.5 9
輸出樣例3:
1.實驗代碼
double kilometre,price1,price;
int time,price2;
scanf("%lf%d",&kilometre,&time);
if(kilometre<=3){
price1=10;
}
else {
if(kilometre<=10){
price1=10+(kilometre-3)*2;
}
else{price1=24+(kilometre-10)*3;
}
}
price2=(time/5)*2;
price=price1+price2;
printf("%.0f",price);
2.設計思路
- 第一步:定義浮點型變量kilometer,price1,price
- 第二步:定義變量time,price2
- 第三步:分三段范圍,求price1的值。當kilometer<=3時,price1=10,;kilometer>3&&kilometer<=10時,price2=10+(kilometre-3)2;kilometer>10時,price1=24+(kilometre-10)3
- 第四步:利用price2=(time/5)*2 (用到整型除整型等於整型)
- 第五步:計算: price=price1+price2
- 第六步:輸出price,小數位為0,這樣會自動對小數部分四舍五入
3.本題調試過程碰到問題及解決辦法
(1)題目中有:輸入行駛里程(單位為公里,精確到小數點后1位)所以我在輸入時將%lf改成了%.1f
結果:
運行時不能進入正確的if語句,price1計算結果不對,解決方法:%.nf是輸出時用來控制輸出位數的,用於printf語句中而不是scanf語句,所以我將%.0f改回%lf,再次運行就能正確執行相應if語句了
(2)我開始的算法是打算計算出小數部分,然后用if語句判斷與0.5的大小,大於0.5,price整數部分就加一,然后輸出,而且在計算price2時再次使用了if-else語句,算法看上去很麻煩,而且運行結果不對
如圖:
解決辦法:通過對price1,price2的輸出發現,因為我定義的變量都是浮點型,price2得到的結果就不是整型的了,導致price數值可能變大,最終影響輸出結果。另外發現price2的計算不需要if結構,而且%.0f有四舍五入的作用,所以對代碼進行了刪減,最終運行得到正確結果
4.本題PTA提交列表
題目4程序設計聯考
自從湖南農業大學、吉首大學和懷化學院組織程序設計課程聯考以后,舉辦聯考的經驗越來豐富。尤其是在使用PTA系統作為考試平台之后,聯考工作得到了很多學校的認可和支持。所以,現在參與聯考的學校比較多。為了便於區分考生,考生賬號的第一位是學校代號。1代表Hunan Agricultural University,2代表Jishou University,3代表Huaihua University,4代表Aerospace University,5代表Ocean University。 請編寫程序根據考生的賬號區分考生的學校。
輸入格式:
在一行中給出1個6位的正整數account。
輸出格式:
在一行中輸出account的學校。注意:如果不清楚學校代號是哪個學校,則輸出"OtherUniversity"。
輸入樣例:
123456
輸出樣例:
Hunan Agricultural University
1.實驗代碼
int account,number;
scanf("%d",&account);
number=account/100000;
switch(number){
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.設計思路
- 第一步:定義浮點型變量account,number
- 第二步:輸入account
- 第三步:計算number,number=account/100000
- 第四步:switch結構,根據number的值輸出相應語句,若number=1,輸出Hunan Agricultural University
- 第五步:若number=2,輸出Jishou University
- 第六步:若number=3,輸出Huaihua University
- 第七步:若number=4,輸出Aerospace University
- 第八步:若number=5,輸出Ocean University
- 第九步:若number為其他數字,輸出Other University
3.本題調試過程碰到問題及解決辦法
這題沒有遇到什么問題,覺得如何計算number是一個思考的地方,其他都很簡單了,另外break是一個注意點,別漏了
4.本題PTA提交列表
二、截圖本周題目集的PTA最后排名
三、本周學習總結
1.你學會了什么
-
1.幾種分支結構
(1)if-else語句,一般形式:
if(表達式)
語句1;
else
語句2;
【也有省略else的if語句】
(2)else-if語句,一般形式:
if(表達式1)
語句1;
else if(表達式2)
語句2;
···
else if(表達式n-1)
語句n-1;
else
語句n;
(3)switch語句,一般形式:
switch(表達式){
case常量表達式1:語句段1;break;
case常量表達式2:語句段2;break;
...
case常量表達式n:語句段n;break;
default: 語句段n+1;break;
}
注意 1.default可省略,當表達式與任意一個常量表達式的值不相等時,就什么都不執行
2.語句段后加break,如果沒有break,會繼續執行下去,直到可以輸出
(4)嵌套的if語句,一般形式:
if(表達式1)
if(表達式2)語句1;
else 語句2;
else
if(表達式3)語句3;
else 語句4;
重點:else和if的匹配原則:else與最靠近它的,沒有與其他else語句匹配的if匹配
- 2.控制精度是在printf語句實現,不能用在scanf語句
- 3.學會一個題目:
int a=5;
printf("%d",a=5);
printf("%d",a5);
第一個是賦值,輸出結果為5,第二個是判斷a5是不是對的,是對的,輸出1,是錯的,輸出0 - 4.字符型數據的輸入與輸出,注意:調用一次函數,只能輸入或輸出一個字符
2.本周的內容,你還不會什么?
字符型數據的輸入和輸出還不熟練,沒有遇到涉及到的題目
3.你碰到什么困難,打算如何解決?
寫的代碼太繁瑣了,慣性思維,像車費那題不需要用if判斷的時候,我也用了,調試的時候找錯誤就很麻煩了。多練練,調試的時候修改代碼,對了,先寫算法很重要。