CPP Turnin作業2
國立屏東大學 資訊工程系 物件導向程式設計
Turnin作業2
- Turnin Code: cpp.hw2
- Due Date: 3/27 00:00 Hard Deadline
繳交方式說明
本次Turnin作業包含多個程式題,請為每一題建立一個資料夾,並將該題所要上傳的檔案放置其中後,再使用turnin指令上傳作業。請同學先為本次作業建立一個資料夾hw2,然後在hw2裡分別為每一題建立一個子資料夾,用以進行每一題的作答以及上傳。每一題的子資料夾名稱已寫於題目前方,請務必依照題目的規定建立子資料夾,例如第1題為p1、第2題為p2,餘依此類推。當我們完成某一個題目的作答後,就可以使用turnin指令將該題的答案上傳。以第1題為例,當我們在p1子資料夾裡完成作答後,就可以回到hw2資料夾,使用以下指令將其上傳:
[3:23 user@ws hw2] turnin▴cpp.hw2▴p1↵
當然,你也可以等到所有題目都完成後,回到hw2資料夾,使用以下指令將所有題目都加以上傳:
[3:23 user@ws hw2] turnin▴cpp.hw2▴.↵
註:本文使用▴及↵代表空白字元與Enter換行字元,並且將使用者輸入的部份使用灰階方式
顯示。
p1 字串置中對齊
請參考下面的main.cpp以及string.h程式:
#include <iostream> #include <iomanip> #include "string.h" using namespace std; int main() { int w; char str[20]; cout << "Width=? "; cin >> w; cout << "String=? "; cin >> str; show_string(str, string_length(str), w, Left_Alignment); show_string(str, string_length(str), w, Right_Alignment); show_string(str, string_length(str), w, Center_Alignment); return 0; }
#define Left_Alignment 0 #define Right_Alignment 1 #define Center_Alignment 2 int string_length(char str[]); void show_string(char str[], int len, int w, int align);
你必須完成名為string.cpp的C++語言程式,其中包含strng_length()函式與show_string()函式的Implementation。string_length()函式接收一個char[]字串,計算其字串長度(即不包含空字元在內的字元數)後傳回。show_string()函式接收一個char []字串str、該字串的長度len、輸出的寬度w以及對齊方式align,請以w做為字串輸出的寬度,並採用align的對齊方式(包含Left_Alignment靠左、Right_Alignment靠右以及Center_Alignment置中對齊)加以輸出;為了易於識別起見,請將沒有輸出字元的部份使用*星號填充。
- 注意:本題所輸入的字串長度不會超過20個字元,且當寬度小於字串長度時,請仍將字串內容完整輸出。
- 注意:本題所謂的置中對齊,必須在字串的左右兩側顯示相同個數的*星號。但當左右兩側星號個數無法均等時,左側可以比右側多一個星號。例如:要將“abc”在10個字元的寬度裡以置中對齊的方式顯示於,其左側與右側分別保留4個與3個星號。
本題的相關程式將使用以下的Makefile進行編譯:
all: main.cpp string.o c++ main.cpp string.o string.o: string.cpp string.h c++ -c string.cpp clean: rm -f *.o *~ *.*~ a.out此題的執行結果如下:
[3:23 user@ws hw] ./a.out↵
Width=?▴9↵
String=?▴abc↵
abc******↵
******abc↵
***abc***↵
[3:23 user@ws hw] ./a.out↵
Width=?▴8↵
String=?▴abc↵
abc*****↵
*****abc↵
***abc**↵
[3:23 user@ws hw] ./a.out↵
Width=?▴3↵
String=?▴csie↵
csie↵
csie↵
csie↵
[3:23 user@ws hw]
請注意本題只需繳交string.cpp,其它檔案則不需繳交。
p2 溫度轉換
請設計一個C++語言的程式f2c.cpp,讓使用者輸入一個華氏(Fahrenheit)溫度,計算並輸出對應的攝氏(Celsius)溫度。 溫度計算公式如下:
攝氏 =(華氏-32)*(5/9)
- 注意1:你必須使用定義在iomanip中的setprecision()或是定義在iostream裡的precision,並搭配fixed操控子,來設定輸出到小數後第2位(超出位數時,四捨五入到小數點後第2位)。
- 注意2:本題如有浮點數的處理需求,請一律使用double型態。
本題的執行結果可參考如下:
[9:19 user@ws hw] ./a.out↵
Fahrenheit:132↵
Fahrenheit▴132.00▴=▴Celsius▴55.56↵
[9:19 user@ws hw] ./a.out↵
Fahrenheit:77.77↵
Fahrenheit▴77.77▴=▴Celsius▴25.43↵
[9:19 user@ws hw] ./a.out↵
Fahrenheit:33.3↵
Fahrenheit▴33.30▴=▴Celsius▴0.72↵
[9:19 user@ws hw] ./a.out↵
Fahrenheit:-18.05↵
Fahrenheit▴-18.05▴=▴Celsius▴-27.81↵
[9:19 user@ws hw]
p3 校車票價計算
屏東大學在資工系傑出校友捐贈10輛校車的幫助下(其實並沒有),開始提供三個校區間的接駁車服務,共有以下三種票種:
- A: 民生校區 ← → 屏商校區 20元
- B: 民生校區 ← → 屏師校區 10元
- C: 屏商校區 ← → 屏師校區 23元
感念資工系友捐贈校車,資工系學生除可享票價6折優惠外,還可再和以下兩項優惠擇優合併計算(也就是採計票價最低的優惠方案):
- 大一新生可享9折優惠
- 不分年級所有學生一次購買10張可享8折優惠
至於其它系的學生僅能就上述兩種優惠擇優使用(也就是採計票價最低的優惠方案)。
注意:票價計算先依不同票種之票價乘以張數後,再進行折扣計算。若計算後之金額有小數,則一律無條件進位。舉例來說:
- 大一的資工系學生購買A票種2張可合併享有6折與9折的優惠:20*2*0.6*.0.9=21.6,再無條件進位到整數成為22元。
- 大一的資工系學生購買A票種10張可合併享有6折與8折的優惠:20*10*0.6*.0.8=96。
- 非資工系大一學生購買A票種2張可享有9折優惠:20*2*0.9=36。
- 非資工系大一學生購買A票種10張可享有8折優惠:20*10*0.8=160。
請設計一個C++語言程式fare.cpp,讓使用者輸入四個字元(英文部份一律大寫),分別代表:
- 票種(A, B或C)
- 張數(1-9張使用數字,10張以英文字T代替)
- 就讀年級(1-6)
- 是否為資工系學生(資工系學生請輸入C,非資工系請輸入N)
例如A↵1↵3↵N↵
代表非資工系3年級學生購買A票種1張,B↵T↵1↵C↵
代表資工系1年級學生購買B票種10張。若是輸入有任何錯誤,則一律顯示「Error!↵」
注意:英文字母僅接受大寫,小寫一律視為錯誤。張數與就讀年級可接受的正確範圍分別為「1-10(其中10以英文字母T代替)」與「1-6」。
注意:測試時的輸入,必定是由四個「一個字元」及「一個換行」所組成的輸入。例如不會有A1↵10↵10↵CC↵
,所給定的四個輸入必定都是一個字元加一個換行。
請參考以下的執行結果:
[9:19 user@ws hw] ./a.out↵
A↵
2↵
1↵
C↵
Fare=22↵
[9:19 user@ws hw] ./a.out↵
A↵
T↵
1↵
C↵
Fare=96↵
[9:19 user@ws hw] ./a.out↵
C↵
6↵
1↵
N↵
Fare=125↵
[9:19 user@ws hw] ./a.out↵
C↵
T↵
1↵
C↵
Fare=111↵
[9:19 user@ws hw] ./a.out↵
C↵
T↵
2↵
C↵
Fare=111↵
[9:19 user@ws hw] ./a.out↵
A↵
0↵
1↵
N↵
Error!↵
[9:19 user@ws hw]
請注意本題只須上傳fare.cpp檔案。
註:本題如有使用浮點數的需求,請使用double做為相關變數的資料型態。
p4 數字系統轉換
請參考下面的main.cpp以及value.h程式:
#include <iostream> using namespace std; #include "value.h" int main() { char sys_input, sys_output; int value; cout << "Number system for input (T/O/H):"; cin >> sys_input; cout << "Input a value:"; value=get_value(sys_input); cout << "Number system for output (T/O/H):"; cin >> sys_output; show_value(sys_output, value); cout << endl; }
#include <iostream> #include <iomanip> using namespace std; int get_value(char sys); void show_value(char sys, int value);
你必須完成名為value.cpp的C++語言程式,其中包含get_value()與show_value()函式Implementation。 get_value()函式接收一個代表數字系統的char字元,並依據其值取得不同數字系統的數值後傳回。至於show_value()函式則接收一個代表數字系統的char字元,以及一個int整數,並依據指定的數字系統輸出數值。此題使用字元T代表10進制、O代表8進制,以及H代表16進制。
本題的相關程式將使用以下的Makefile進行編譯:
all: main.cpp value.o c++ main.cpp value.o value.o: value.cpp value.h c++ -c value.cpp clean: rm -f *.o *~ *.*~ a.out此題的執行結果如下:
[3:23 user@ws hw] ./a.out↵
Number▴system▴for▴input▴(T/O/H):T↵
Input▴a▴value:123↵
Number▴system▴for▴output▴(T/O/H):O↵
173↵
[3:23 user@ws hw] ./a.out↵
Number▴system▴for▴input▴(T/O/H):O↵
Input▴a▴value:267↵
Number▴system▴for▴output▴(T/O/H):H↵
B7↵
[3:23 user@ws hw] ./a.out↵
Number▴system▴for▴input▴(T/O/H):H↵
Input▴a▴value:E29B↵
Number▴system▴for▴output▴(T/O/H):T↵
58011↵
[3:23 user@ws hw]
請注意本題只需繳交value.cpp,其它檔案則不需繳交。