C Turnin作業2
國立屏東大學 資訊工程系 程式設計(一)
每次Turnin作業會包含多個程式題目(p1、p2、…、pN),每題將提供其題目、檔案命名規定、功能要求以及參考的執行結果。建議同學可以為每次的Turnin作業建立一個資料夾以便於管理,例如本次的作業可以使用mkdir hw2
指令來建立一個名為hw2的資料夾,並在該資料夾裡編寫此次作業的程式檔案。另外要注意的是,每一題都必須依據題目要求為程式檔案命名,例如此次turnin作業的p1,其檔案名稱要求命名為MemSizeOfFloatings.c,請務必注意大小寫一致,任何錯誤的檔案命名都將不予計分。
請注意每次turnin作業都必須在截止時間前完成繳交,逾時不候且不得補交。以此次作業為例,其turnin code為c.hw2,當你完成p1的程式碼撰寫,並經編譯執行確認無誤後,可以使用下列指令完成繳交(請特別注意是否在正確的資料夾裡操作):
[7:17 user@ws in hw1] turnin▴c.hw2▴MemSizeOfFloatings.c↵
後續還可以使用同樣的方式,將p2、p3、…、p10的程式檔案加以繳交。當然,你也可以等到所有小題都作答完成後,再整批地將資料夾下的所有作業上傳:
[7:17 user@ws in hw1] turnin▴c.hw2▴.↵
註:本文使用▴及↵代表空白字元與Enter換行字元,並且將使用者輸入的部份使用灰階方式
顯示。
請設計一個C語言的程式MemSizeOfFloatings.c,將float、double與long double等浮點數型態所佔用的記憶體空間(單位為位元組)輸出,其執行結果可參考以下的畫面:
[7:17 user@ws in p1] ./a.out↵
float:▴memory▴space▴=▴4▴bytes.↵
double:▴memory▴space▴=▴8▴bytes.↵
long▴double:▴memory▴space▴=▴16▴bytes.↵
[7:17 user@ws in p1]
請設計一個C語言的程式MemAddress.c,宣告一個int型態的變數x,並將其所分配到的記憶體位址(包含開始的位元組位址到結束的位元組位址)輸出,其執行結果可參考以下的畫面:
[7:17 user@ws in p2] ./a.out↵
x▴is▴allocated▴at▴memory▴address▴0x7ffda2f128f4-0x7ffda2f128f7.↵
[7:17 user@ws in p2]
【提示:上述執行結果僅供參考,變數實際分配到的記憶體位址將依作業系統分配而定,每次執行結果並不相同。你可以使用&x來取得x所分配到的記憶體空間的起始位址,再利用sizeof(int)或sizeof(x)來取得一個int整數變數所占用的記憶體空間為多少後(此處為unsigned long int型態之數值),計算出所分配到的記憶體空間的結束位址為何。但是一個記憶體位址與int整數型態的數值不能直接進行運算,所以必須先將&x轉型讓它和sizeof(int)的傳回值型態一致,才能正確地進行運算,也就是必須將其寫做「(unsigned long)(&x)+sizeof(int)-1」才對。最後還要提醒同學的是,此題要求輸出的是記憶體位址,因此你還必須將該整數改以16進位的方式輸出 — 使用 %lx 來將一個unsigned long的整數以16進制輸出。】
請設計一個C語言的程式NumberConverter.c,要求使用者輸入一個十進制與一個八進制的整數,並將這兩個整數轉換為十六進制後輸出,其執行結果可參考以下的畫面:
[7:17 user@ws in p3] ./a.out↵
Please▴input▴an▴integer:▴100↵
Decimal(100)▴=▴Hexadecimal(64).↵
↵
Please▴input▴an▴integer▴in▴octal:▴77↵
Octal(77)▴=▴Hexadecimal(3f).↵
[7:17 user@ws in p3]
請設計一個C語言的程式ASCII.c,要求使用者輸入一個字元,並將該字元所對應的ASCII數值以十進制的整數輸出,其執行結果可參考以下的畫面:
[7:17 user@ws in p4] ./a.out↵
Please▴input▴a▴character:▴A↵
ASCII▴code▴=▴65.↵
[7:17 user@ws in p4]
請設計一個C語言程式SquareMeter2Ping.c,讓使用者以平方公尺為單位輸入一筆土地面積(可包含小數),將其轉換為對應的坪數(台灣慣用的面積單位)後輸出。注意,此題請以 double型態 的浮點數進行計算,並以 1平方公尺 = 0.3025坪 進行計算。本題的執行結果可參考以下的畫面:
[7:17 user@ws in p5] ./a.out↵
Please▴input▴an▴area▴in▴square▴meters:▴100↵
100.000000▴square▴meters▴=▴30.250000▴ping.↵
[7:17 user@ws in p5] ./a.out↵
Please▴input▴an▴area▴in▴square▴meters:▴12.5↵
12.500000▴square▴meters▴=▴3.781250▴ping.↵
[7:17 user@ws in p5]
請設計一個C語言程式Rounded.c,接受使用者所輸入的一個浮點數,將其小數部份四捨五入後輸出,其執行結果可參考如下:
[7:17 user@ws in p6] ./a.out↵
Floating▴point▴number:▴13.14↵
The▴rounded▴value▴is▴13.↵
[7:17 user@ws in p6] ./a.out↵
Floating▴point▴number:▴38.5832↵
The▴rounded▴value▴is▴39.↵
[7:17 user@ws in p6] ./a.out↵
Floating▴point▴number:▴8↵
The▴rounded▴value▴is▴8.↵
[7:17 user@ws in p6]
【提示:C語言的浮點數轉型為整數時,小數點後的數值將會被無條件捨去,而非進行四捨五入。例如我們將一個float變數fval=3.54強制轉型為int整數後(也就是「(int)fval」),其數值將會是3,而不是進位為4。筆者提供兩種C語言實現四捨五入的方法:
round()傳回值的型態被設計為double而不是int來很多理由,其中主要的理由是double型態可以表達的整數範圍比int還大,所以可以避免轉換後數值失真。因此,round()必須被視為是「數值轉換」的函式,而非「型態轉換」。】
計算三角形面積的公式有很多種,海龍公式(Heron's formula)便是其中一種,只要知道一個三角形三個邊的邊長就能透過海龍公式求取面積。假設三角形的三個邊長為a、b與c,海龍公式如下: \[ 半周長s = \frac{a + b + c}{2} \]
\[ 面積A = \sqrt{s(s-a)(s-b)(s-c)} \]
請設計一個C語言程式HeronFormula.c,讓使用者輸入三邊之長(皆爲整數),將面積四捨五入到小數第三位後輸出。注意,此題如有浮點數運算需求,請使用double型態。本題的執行結果可參考以下的畫面:
[7:17 user@ws in p7] ./a.out↵
Please▴input▴the▴lengths▴of▴the▴three▴sides▴of▴the▴triangle(a,b,c):▴2,2,2↵
Area▴of▴the▴triangle▴=▴1.732.↵
[7:17 user@ws in p7] ./a.out↵
Please▴input▴the▴lengths▴of▴the▴three▴sides▴of▴the▴triangle(a,b,c):▴3,4,5↵
Area▴of▴the▴triangle▴=▴6.000.↵
[7:17 user@ws in p7]
【提示:關於海龍公式開平方根的部分,假設存在一個變數$x = 4$,同學們可以使用定義在 “math.h” 中的 “sqrt($x$)“ 或是 “pow($x$,0.5)“ 的方式取得開根號的值。注意:如果使用了 “math.h” 的函式,在編譯的時候記得加上 ”-lm” 參數,如:“cc HeronFormula.c -lm”。】
Alan 是一個 KungFood Panda 的外送員,因爲在工作的時候需要撥打非常多的電話,所以正在尋找一個划算的資費方案。碰巧的是台灣大鴿大有一個通話費率很低的資費方案,每秒只需要 0.045 元。
請設計一個C語言程式PhoneBill.c,協助 Alan 試算電話費。Alan 將會輸入通話時間,通話時間包含小時數、分鐘數(0-59分)以及秒數(0-59秒),請將電話費的計算結果輸出至小數第一位(第二位後無條件捨棄)後輸出。本題的執行結果可參考以下的畫面:
[7:17 user@ws in p8] ./a.out↵
Please▴input▴total▴duration▴of▴the▴call(HH:MM:SS):▴1:12:5↵
The▴total▴duration▴of▴your▴call▴is▴01:12:05,▴and▴your▴phone▴bill▴is▴194.6▴dollars.↵
[7:17 user@ws in p8] ./a.out↵
Please▴input▴total▴duration▴of▴the▴call(HH:MM:SS):▴7:02:13↵
The▴total▴duration▴of▴your▴call▴is▴07:02:13,▴and▴your▴phone▴bill▴is▴1139.9▴dollars.↵
[7:17 user@ws in p8]
世界各地的日期表達方式不盡相同,以美國和英國為例,其慣用的表示法分別為MM/DD/YYYY與DD/MM/YYYY(也就是美式的月/日/年,以及英式的日/月/年)。
請設計一個C語言程式DateUK2US.c,請使用者輸入的英式日期,將其轉換為對應的美式日期後輸出。此題的執行結果可參考以下的畫面:
[7:17 user@ws in p9] ./a.out↵
Date▴(UK):▴15/9/2021↵
=Date▴(US):▴09/15/2021↵
[7:17 user@ws in p9] ./a.out↵
Date▴(UK):▴1/12/150↵
=Date▴(US):▴12/01/0150↵
[7:17 user@ws in p9] ./a.out↵
Date▴(UK):▴01/2/1995↵
=Date▴(US):▴02/01/1995↵
[7:17 user@ws in p9]
在台灣買東西大家都會記得要索取統一發票(uniform invoice),因為每單月份的25號會開獎一次,從統一發票號碼的末3碼開始到全部的8碼,只要與開獎號碼相同就可以領取從200元到200萬元不等的獎金。
請設計一個C語言程式Last3.c,讓使用者輸入一組統一發票的號碼,並且將其最後3碼印出。請注意統一發票號碼的格式,其前兩碼為英文字母,後面則接8碼的數字。程式的執行結果可參考以下的畫面:
[7:17 user@ws in p10] ./a.out↵
Please▴input▴a▴uniform-invoice▴number:▴FB00960518↵
The▴last▴3▴digits▴are▴518.↵
[7:17 user@ws in p10] ./a.out↵
Please▴input▴a▴uniform-invoice▴number:▴IG34019017↵
The▴last▴3▴digits▴are▴017.↵
[7:17 user@ws in p10]