目錄表

CPP Turnin作業4

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

Turnin作業4(指標、參考、字串、使用者自定型態、記憶體管理)


繳交方式說明

本次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);

你必須完成名為twoNumber.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:$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個聯絡人資訊,其中每個聯絡人包含以下資訊:

請參考以下的 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]

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()函式的實作,相關函式說明如下:

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

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