上海海事大学自动化专业C语言课程代码参考(第六周)
在擺爛了兩周之后終于跟上版本了,感人!
話不多說,直接看題吧
目錄
上機實驗
3-11 比較大小
輸入格式:
輸出格式:
輸入樣例:
輸出樣例:
3-12 輸出三角形面積和周長
輸入格式:
輸出格式:
輸入樣例1:
輸出樣例1:
輸入樣例2:
輸出樣例2:
3-13 計算電費
輸入格式:
輸出格式:
輸入樣例1:
輸出樣例1:
輸入樣例2:
輸出樣例2:
輸入格式:
輸出格式:
輸入樣例1:
輸出樣例1:
輸入樣例2:
輸出樣例2:
輸入樣例3:
輸出樣例3:
3-15 計算個人所得稅
輸入格式:
輸出格式:
輸入樣例1:
輸出樣例1:
輸入樣例2:
輸出樣例2:
輸入樣例3:
輸出樣例3:
輸入樣例4:
輸出樣例4:
輸入樣例5:
輸出樣例5:
3-16 計算油費
輸入格式:
輸出格式:
輸入樣例:
輸出樣例:
3-17 計算絕對值(二)
輸入格式:
輸出格式:
輸入樣例1:
輸出樣例1:
輸入樣例2:
輸出樣例2:
3-18 四則運算(二)
輸入格式:
輸出格式:
輸入樣例1:
輸出樣例1:
輸入樣例2:
輸出樣例2:
3-19 成績轉換(三)
輸入格式:
輸出格式:
輸入樣例:
輸出樣例:
3-20 計算天數
輸入格式:
輸出格式:
輸入樣例1:
輸出樣例1:
輸入樣例2:
輸出樣例2:
結語
上機實驗
很欣慰這次終于沒有書上的題了
3-11 比較大小
本題要求編寫程序,將輸入的任意3個整數從小到大輸出。
輸入格式:
輸入在一行中給出3個整數,其間以空格分隔。
輸出格式:
在一行中將3個整數從小到大輸出,其間以“->”相連。
輸入樣例:
529
輸出樣例:
2 -> 5 -> 9
排序是非常經典的算法,要講的話可以有很多能說道的東西。但這道題只需要給三個數排序,簡單比較大小就行。不過作為第一道排序題,還是得重點關注一下排序的邏輯。
先看代碼吧
#include <stdio.h>int main() {int a, b, c, x;scanf("%d%d%d", &a, &b, &c);if(a > b){x = a;a = b;b = x;if(b > c){x = c;c = b;b = x;}}else if(b > c){x = c;c = b;b = x;}//將最大的數放到了cif(a > b){x = a;a = b;b = x;}//進行ab的排序printf("%d -> %d -> %d", a, b, c);return 0; }考慮到這么講解可能會很難理解,我將debug錄成了視頻,大家看視頻內a b c的數據變化或許會更好理解。視頻如下
C語言課程代碼參考(第六周)3-11debug視頻
視頻被csdn壓縮過了,非常模糊(悲。需要原視頻的可以私聊我
3-12 輸出三角形面積和周長
本題要求編寫程序,根據輸入的三角形的三條邊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 41
輸出樣例2:
These sides do not correspond toa valid triangle
這與之前的算三角形面積相比只多了一個參數合法性判斷,即兩邊之和大于第三邊。
在這里我想教大家一個小技巧,就是使用寫過的代碼,不要重復造輪子。這可以大大減少我們寫代碼的量。比如這一題,若我們直接寫,就是這樣
#include <stdio.h> #include <math.h>int main() {int a, b, c;float s;scanf("%d%d%d", &a, &b, &c);if(a + b > c&& a + c > b&& b + c > a){s = (a + b + c) / 2;printf("area = %.2f, perimeter = %.2f\n", sqrt(s * (s - a) * (s - b) * (s - c)), 2 * s);}elseprintf("These sides do not correspond to a valid triangle\n");return 0; }但如果我們先用上一題的代碼排序,需要寫另外寫的東西就少了很多。只要寫成這樣就行
#include <stdio.h> #include <math.h>int main() {int a, b, c, x;float s;scanf("%d%d%d", &a, &b, &c);if(a > b){x = a;a = b;b = x;if(b > c){x = c;c = b;b = x;}}else if(b > c){x = c;c = b;b = x;}//將最大的數放到了cif(a > b){x = a;a = b;b = x;}//進行ab的排序// printf("%d -> %d -> %d", a, b, c);//上一題,這題用不到/**************新寫的代碼***************/if(a + b > c){s = (a + b + c) / 2;printf("area = %.2f, perimeter = %.2f\n", sqrt(s * (s - a) * (s - b) * (s - c)), 2 * s);}elseprintf("These sides do not correspond to a valid triangle\n");return 0; }乍一看好像代碼量變多了,實際上都是調用之前的代碼,新寫的只有最后的幾行。相比第一種辦法直接上if判斷,第二種的if就相對簡單一些。
3-13 計算電費
本題要求編寫程序,為了提倡居民節約用電,某省電力公司執行“階梯電價”,安裝一戶一表的居民用戶電價分為兩個“階梯”:月用電量50千瓦時(含50千瓦時)以內的,電價為0.53元/千瓦時;超過50千瓦時的,超出部分的用電量,電價上調0.05元/千瓦時,若用電量小于0,則輸出"Invalid Value!"。要求計算電費。
輸入格式:
輸入在一行中給出某用戶的月用電量(單位:千瓦時)。
輸出格式:
在一行中輸出該用戶應支付的電費(元),結果保留兩位小數,格式如:“cost = 應付電費值”;若用電量小于0,則輸出"Invalid Value!"。
輸入樣例1:
10
輸出樣例1:
cost = 5.30
輸入樣例2:
100
輸出樣例2:
cost = 55.50
這題并沒有前面的幾題復雜,在此直接列出代碼
#include <stdio.h>int main() {float a;scanf("%f", &a);if(a < 0)printf("Invalid Value!");else if(a <= 50)printf("cost = %.2f", a * 0.53);elseprintf("cost = %.2f", 50 * 0.53 + (a - 50) * 0.58);return 0; }3-14 出租車計價
本題要求根據某城市普通出租車收費標準編寫程序進行車費計算。具體標準如下:
- 起步里程為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:
34
#include <stdio.h>int main() {float a;int b;scanf("%f%d", &a, &b);if (a < 3)printf("%d", 10 + 2 * (b / 5));else if (a <= 10)printf("%.0f", (a - 3) * 2 + 10 + 2 * (b / 5));elseprintf("%.0f", 24 + (a - 10) * 3 + 2 * (b / 5));return 0; }計算稍微復雜,邏輯還是很簡單的。
為什么這個出租車這么貴啊!
3-15 計算個人所得稅
本題要求編寫程序,計算應繳的所得稅。假設個人所得稅為:稅率×(工資?1600),其中稅率定義為:
- 當工資不超過1600時,稅率為0;
- 當工資在區間(1600, 2500]時,稅率為5%;
- 當工資在區間(2500, 3500]時,稅率為10%;
- 當工資在區間(3500, 4500]時,稅率為15%;
- 當工資超過4500時,稅率為20%。
輸入格式:
輸入在一行中給出非負工資。
輸出格式:
在一行輸出個人所得稅,精確到小數點后2位。
輸入樣例1:
1600
輸出樣例1:
0.00
輸入樣例2:
1601
輸出樣例2:
0.05
輸入樣例3:
3000
輸出樣例3:
140.00
輸入樣例4:
4000
輸出樣例4:
360.00
輸入樣例5:
5000
輸出樣例5:
680.00
邏輯并不復雜,直接看代碼吧
#include <stdio.h>int main() {float a, b;scanf("%f", &a);if (a <= 1600)b = 0;else if (a <= 2500)b = 0.05;else if (a <= 3500)b = 0.1;else if (a <= 4500)b = 0.15;elseb = 0.2;printf("%.2f", b * (a - 1600));return 0; }3-16 計算油費
現在92號汽油6.95元/升、95號汽油7.44元/升、97號汽油7.93元/升。為吸引顧客,某自動加油站推出了“自助服務”和“協助服務”兩個服務等級,分別可得到5%和3%的折扣。(現在明明不是這個價
本題要求編寫程序,根據輸入顧客的加油量a,汽油品種b(92、95或97)和服務類型c(m - 自助,e - 協助),計算并輸出應付款。
輸入格式:
輸入在一行中給出兩個整數和一個字符,分別表示顧客的加油量a,汽油品種b(92、95或97)和服務類型c(m - 自助,e - 協助)。
輸出格式:
在一行中輸出應付款額,保留小數點后2位。
輸入樣例:
40 97 m
輸出樣例:
301.34
直接看代碼吧
#include <stdio.h>int main() {float dis, pri;int a, b;char c;scanf("%d%d%c%c", &a, &b, &c, &c);switch (c){case 'm':dis = 0.95;break;case 'e':dis = 0.97;break;}switch (b){case 92:pri = 6.95;break;case 95:pri = 7.44;break;case 97:pri = 7.93;break;}printf("%.2f", (float)a * pri * dis);return 0; }注意這里的scanf()會將空格識別為一個字符,所以進行了兩次賦值
3-17 計算絕對值(二)
本題目要求計算下列分段函數 y=|x|的值(利用條件運算符實現)
輸入格式:
輸入在一行中給出實數x。
輸出格式:
在一行中按“|x| = y”的格式輸出,
輸入樣例1:
7
輸出樣例1:
|7.0| = 7.0
輸入樣例2:
-3
輸出樣例2:
|-3.0| = 3.0?
先看看啥是條件運算符
這東西…真的有人用嗎…
直接拿之前代碼的if改就好了,直接看代碼
#include <stdio.h>int main() {float a;scanf("%f", &a);(a >= 0)?printf("|%.1f| = %.1f", a, a):printf("|%.1f| = %.1f", a, -a);return 0; }直接寫一行讀起來麻煩,分行寫也沒有if簡潔直觀
3-18 四則運算(二)
本題要求編寫一個簡單計算器程序,可根據輸入的運算符,對2個整數進行加、減、乘、除運算。題目保證輸入和輸出均不超過整型范圍。
輸入格式:
輸入在一行中依次輸入操作數1、運算符、操作數2、=,操作數的數據類型為整型,且保證除法的分母非零。
輸出格式:
當運算符為+、-、*、/時,在一行輸出相應的運算結果。若輸入是非法符號(即除了加、減、乘、除四種運算符以外的其他符號)則輸出ERROR。
輸入樣例1:
7/2=
輸出樣例1:
3
輸入樣例2:
2&7=
輸出樣例2:
ERROR
只要善用%d, %c這些字符,這題也可以比較簡單地做出來。看代碼
#include <stdio.h>int main() {int a, b;char c;scanf("%d%c%d", &a, &c, &b);switch (c){case '+':printf("%d", a + b);break;case '-':printf("%d", a - b);break;case '*':printf("%d", a * b);break;case '/':printf("%d", a / b);break;default:printf("ERROR");break;}return 0; }3-19 成績轉換(三)
本題要求編寫程序,將一個百分制成績轉換為五分制成績。(利用switch語句實現),轉換規則:
- 大于等于90分為A;
- 小于90且大于等于80為B;
- 小于80且大于等于70為C;
- 小于70且大于等于60為D;
- 小于60為E。
輸入格式:
輸入在一行中給出一個整數的百分制成績。
輸出格式:
在一行中輸出對應的五分制成績。
輸入樣例:
95
輸出樣例:
A
那個啥…咱上次好像就是用switch case實現的…?所以上次是得用if是吧。不過無所謂了,直接拷上次的代碼來就行
#include <stdio.h>int main() {int a;scanf("%d", &a);a /= 10;switch (a){case 9:printf("A");break;case 8:printf("B");break;case 7:printf("C");break;case 6:printf("D");break;default:printf("E");break;}return 0; }3-20 計算天數
本題要求編寫程序計算某年某月某日是該年中的第幾天。(利用switch語句實現)
輸入格式:
輸入在一行中按照格式“yyyy/mm/dd”(即“年/月/日”)給出日期。注意:閏年的判別條件是該年年份能被4整除但不能被100整除、或者能被400整除。閏年的2月有29天。
輸出格式:
在一行輸出日期是該年中的第幾天。
輸入樣例1:
2009/03/05
輸出樣例1:
64
輸入樣例2:
2000/03/07
輸出樣例2:
67
咱先復習一下小學二年級學過的口訣 “一三五七八十臘,三十一天永不差”、“四年一閏,百年不閏,四百年又潤”
#include <stdio.h>int main() {int year, month, day;int leap = 28;char c;scanf("%d%c%d%c%d", &year, &c, &month, &c, &day);if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)//閏年判斷leap = 29;for (c = 1; c < month; c++)//遍歷每個月, 本月不計入{switch (c){case 1:case 3:case 5:case 7:case 8:case 10:case 12:day += 31;break;case 2:day += leap;break;default:day += 30;break;}}printf("%d", day);return 0; }可能會有同學有疑惑,為什么能將char類型的c作為整形使用?這個其實問題不大啦,實際上char本身就是存儲-128~127的整形,所以混用也沒啥關系(但最好不要)。
結語
本周作業部分題目有一點難度,可以仔細研究一下,不是很理解的可以在評論區提問哦。
呼~終——于!寫完了!好不容易趕上版本。不過這周不是學習的循環嗎,為什么作業還是以條件判斷為主。另外條件判斷語句,那個"?",感覺真的沒咋用過,剛看到題目的時候都沒反應過來是啥
總結
以上是生活随笔為你收集整理的上海海事大学自动化专业C语言课程代码参考(第六周)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英语基础太差,能学好编程吗?
- 下一篇: MVC与模板概念的理解