目錄表
CPP Turnin作業4
國立屏東大學 資訊工程系 物件導向程式設計
Turnin作業4(指標、參考、字串、使用者自定型態、記憶體管理)
- Turnin Code: cpp.hw4
- Due Date: 5/15 12:00 AM Hard Deadline
繳交方式說明
本次Turnin作業包含多個程式題,請為每一題建立一個資料夾,並將該題所要上傳的檔案放置其中後,再使用turnin指令上傳作業。請同學先為本次作業建立一個資料夾hw4,然後在hw4裡分別為每一題建立一個子資料夾,用以進行每一題的作答以及上傳。每一題的子資料夾名稱已寫於題目前方,請務必依照題目的規定建立子資料夾,例如第1題為p1、第2題為p2,餘依此類推。當我們完成某一個題目的作答後,就可以使用turnin指令將該題的答案上傳。以第1題為例,當我們在p1子資料夾裡完成作答後,就可以回到hw4資料夾,使用以下指令將其上傳:
[3:23 user@ws hw4] turnin▴cpp.hw4▴p1↵
當然,你也可以等到所有題目都完成後,回到hw4資料夾,使用以下指令將所有題目都加以上傳:
[3:23 user@ws hw4] turnin▴cpp.hw4▴.↵
註:本文使用▴及↵代表空白字元與Enter換行字元,並且將使用者輸入的部份使用灰階方式
顯示。
p1 傳參考呼叫(Call by Reference)
請參考下面的main.cpp以及twoNumbers.h程式:
#include <iostream> using namespace std; #include "twoNumbers.h" int main() { int x,y; cin >> x; cin >> y; if(x!=y) { show(x,y); swap(x,y); show(x,y); min(x,y)=0; show(x,y); } else cout << "Error!" << endl; }
void show(int i, int j); void swap(int &a, int &b); int & min(int &i, int &j);
你必須完成名為twoNumbers.cpp的C++語言程式,其中包含相關的函式實作。此程式完成後,可讓使用者輸入兩個數字,並且在兩數不相等的情況下,先將兩數交換然後將其中較小數值者的數值設定為0。此題的執行結果可參考如下:
[3:23 user@ws hw] ./a.out↵
3▴5↵
(3,▴5)↵
(5,▴3)↵
(5,▴0)↵
[3:23 user@ws hw] ./a.out↵
5▴3↵
(5,▴3)↵
(3,▴5)↵
(0,▴5)↵
[3:23 user@ws hw] ./a.out↵
2▴2↵
Error!↵
[3:23 user@ws hw]
本題的相關程式將使用以下的Makefile進行編譯:
all: main.cpp twoNumbers.o c++ main.cpp twoNumbers.o twoNumbers.o: twoNumbers.cpp twoNumbers.h c++ -c twoNumbers.cpp clean: rm -f *.o *~ *.*~ a.out
請注意本題只需繳交twoNumbers.cpp,其它檔案則不需繳交。
p2 蘋果電腦多少錢?
請參考下面的main.cpp以及findAMac.h程式:
#include<iostream> using namespace std; #include "findAMac.h" int main() { string mac[6]={"MacBook Air", "MacBook Pro", "iMac", "Mac Mini", "Mac Studio", "Mac Pro"}; int price[6]= { 41900, 54900, 44900, 24900, 64999, 229900 }; string which2buy; bool found=false; cout << "Which Mac do you want to buy?"; getline(cin, which2buy); found=findAMac(which2buy, mac, price); if(!found) { cout << "Not Found!" << endl; } }
#include <iostream> #include <string> using namespace std; bool findAMac(string which2buy, string *mac, int *price);
你必須完成名為findAMac.cpp的C++語言程式,其中包含findAMac()函式的實作。此程式完成後,可讓使用者輸入一個蘋果電腦的產品名字,就程式中已有的6台電腦名字進行比對,告知使用者該台電腦的售價,並推薦和該產品售價最接近的另一台相關產品。此題的執行結果可參考如下:
[3:23 user@ws hw] ./a.out↵
Which▴Mac▴do▴you▴want▴to▴buy?Mac▴Mini↵
Mac▴Mini:TWD▴24900.↵
You▴can▴also▴consider▴MacBook▴Air:TWD▴41900.↵
[3:23 user@ws hw] ./a.out↵
Which▴Mac▴do▴you▴want▴to▴buy?Macbook▴Air↵
Not▴Found!↵
[3:23 user@ws hw] ./a.out↵
Which▴Mac▴do▴you▴want▴to▴buy?MacBook▴Air↵
MacBook▴Air:TWD▴41900.↵
You▴can▴also▴consider▴iMac:TWD▴44900.↵
[3:23 user@ws hw] ./a.out↵
Which▴Mac▴do▴you▴want▴to▴buy?Mac▴Studio↵
Mac▴Studio:TWD▴64999.↵
You▴can▴also▴consider▴MacBook▴Pro:TWD▴54900.↵
[3:23 user@ws hw]
本題的相關程式將使用以下的Makefile進行編譯:
all: main.cpp findAMac.o c++ main.cpp findAMac.o findAMac.o: findAMac.cpp findAMac.h c++ -c findAMac.cpp clean: rm -f *.o *~ *.*~ a.out
請注意本題只需繳交findAMac.cpp,其它檔案則不需繳交。
p3 聯絡人排序
請設計一個程式用以管理10個聯絡人資訊,其中每個聯絡人包含以下資訊:
- name(姓名)
- gender(性別)
- birthday(生日)
請參考以下的 contact.h所定義的自定型態:
#define numContact 10 enum Gender {Male, Female}; enum Month {January, February, March, April, May, June, July, August, September, October, November, December}; struct Date { Month month; short day; short year; }; struct Name { char firstname[20]; char lastname[10]; }; struct Contact { Name name; Gender gender; Date birthday; }; Contact getAContact(); void showAContact(Contact c); void sortContacts(Contact cs[]);
請設計並實作一個名為 contact.cpp 的程式,並在其中完成「getAContact()」、 「showAContact()」與「sortContacts()」函式之實作,其中sortContacts()函式是以聯絡人的年齡進行排序,年紀愈輕的排在愈前面(換句話說,出生日期愈早的人年紀愈大,排在愈後面)。相關程式功能可以使用以下的main.cpp進行測試:
#include <iostream> using namespace std; #include "contact.h" int main() { int i; Contact *mycontacts = new Contact [numContact]; for(i=0;i<numContact;i++) mycontacts[i]=getAContact(); sortContacts(mycontacts); for(i=0;i<numContact;i++) showAContact(mycontacts[i]); }
本題的相關程式將使用以下的Makefile進行編譯:
all: main.cpp contact.o c++ main.cpp contact.o contact.o: contact.cpp contact.h c++ -c contact.cpp clean: rm -f *.o *~ *.*~ a.out
此題的執行結果如下:
[3:23 user@ws hw] ./a.out↵
Name:▴Amy▴Wang↵
Gender▴(M/F):▴F↵
Birthday▴(YYYY MM DD):▴1977 03 05↵
Name:▴Kung▴Liu↵
Gender▴(M/F):▴M↵
Birthday▴(YYYY MM DD):▴1995 12 3↵
⋮
Kung▴Liu▴(Male)▴December▴3rd,▴1995.↵
Amy▴Wang▴(Female)▴March▴5th,▴1977.↵
⋮
[3:23 user@ws hw]
- 注意:本題只需繳交contact.cpp,其它檔案則不需繳交。
p4 動態二維陣列
請參考下面的main.cpp以及dynamic2DArray.h程式:
#include <iostream> using namespace std; #include "dynamic2DArray.h" int main() { int **data; int i, j, d1, d2; cout << "Dimension 1: "; cin >> d1; cout << "Dimension 2: "; cin >> d2; data=create2DArray(d1, d2); show2DArray(data, d1, d2); for(int i=0;i<d1; i++) delete [] data[i]; delete [] data; return 0; }
int **create2DArray(int d1, int d2); void show2DArray(int **data, int d1, int d2);
你必須完成名為dynamic2DArray.cpp的C++語言程式,其中包含create2DArray()與show2DArray()函式的實作,相關函式說明如下:
- create2DArray()函式接收代表兩個維度的整數d1與d2,並建立一個d1xd2的動態二維陣列;此陣列依[0][0]、[0][1]、[0][2]、…、[1][0]、[1][1]、[1][2]、…、[d1-1][d2-1]的順序,依序填入整數1、2、3、…、d1xd2。
- show2DArray()函式,則輸出所建立的動態二維陣列的內容,其格式可參考下方的執行結果。
此題的執行結果可參考如下:
[3:23 user@ws hw] ./a.out↵
Dimension▴1:▴2↵
Dimension▴2:▴2↵
1▴2↵
3▴4↵
[3:23 user@ws hw] ./a.out↵
Dimension▴1:▴3↵
Dimension▴2:▴5↵
▴1▴▴2▴▴3▴▴4▴▴5↵
▴6▴▴7▴▴8▴▴9▴10↵
11▴12▴13▴14▴15↵
[3:23 user@ws hw] ./a.out↵
Dimension▴1:▴10↵
Dimension▴2:▴10↵
▴▴1▴▴▴2▴▴▴3▴▴▴4▴▴▴5▴▴▴6▴▴▴7▴▴▴8▴▴▴9▴▴10↵
▴11▴▴12▴▴13▴▴14▴▴15▴▴16▴▴17▴▴18▴▴19▴▴20↵
▴21▴▴22▴▴23▴▴24▴▴25▴▴26▴▴27▴▴28▴▴29▴▴30↵
▴31▴▴32▴▴33▴▴34▴▴35▴▴36▴▴37▴▴38▴▴39▴▴40↵
▴41▴▴42▴▴43▴▴44▴▴45▴▴46▴▴47▴▴48▴▴49▴▴50↵
▴51▴▴52▴▴53▴▴54▴▴55▴▴56▴▴57▴▴58▴▴59▴▴60↵
▴61▴▴62▴▴63▴▴64▴▴65▴▴66▴▴67▴▴68▴▴69▴▴70↵
▴71▴▴72▴▴73▴▴74▴▴75▴▴76▴▴77▴▴78▴▴79▴▴80↵
▴81▴▴82▴▴83▴▴84▴▴85▴▴86▴▴87▴▴88▴▴89▴▴90↵
▴91▴▴92▴▴93▴▴94▴▴95▴▴96▴▴97▴▴98▴▴99▴100↵
[3:23 user@ws hw]
本題的相關程式將使用以下的Makefile進行編譯:
all: main.cpp dynamic2DArray.o c++ main.cpp dynamic2DArray.o dynamic2DArray.o: dynamic2DArray.cpp dynamic2DArray.h c++ -c dynamic2DArray.cpp clean: rm -f *.o *~ *.*~ a.out
請注意本題只需繳交dynamic2DArray.cpp,其它檔案則不需繳交。