目錄表

CPP Turnin作業2

國立屏東大學 資訊工程系 物件導向程式設計

Turnin作業2


繳交方式說明

本次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置中對齊)加以輸出;為了易於識別起見,請將沒有輸出字元的部份使用*星號填充。

本題的相關程式將使用以下的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)

本題的執行結果可參考如下:

[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輛校車的幫助下(其實並沒有),開始提供三個校區間的接駁車服務,共有以下三種票種:

感念資工系友捐贈校車,資工系學生除可享票價6折優惠外,還可再和以下兩項優惠擇優合併計算(也就是採計票價最低的優惠方案):

  1. 大一新生可享9折優惠
  2. 不分年級所有學生一次購買10張可享8折優惠

至於其它系的學生僅能就上述兩種優惠擇優使用(也就是採計票價最低的優惠方案)。

注意:票價計算先依不同票種之票價乘以張數後,再進行折扣計算。若計算後之金額有小數,則一律無條件進位。舉例來說:

請設計一個C++語言程式fare.cpp,讓使用者輸入四個字元(英文部份一律大寫),分別代表:

  1. 票種(A, B或C)
  2. 張數(1-9張使用數字,10張以英文字T代替)
  3. 就讀年級(1-6)
  4. 是否為資工系學生(資工系學生請輸入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,其它檔案則不需繳交。