目錄表
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,其它檔案則不需繳交。
