作者andy801119 (泰坦)
看板NTUE-CS103
標題[課業] 98年期末考考古題-不完整參考解答
時間Tue Jun 21 00:31:33 2011
http://www.cs.ntue.edu.tw/cssa/drupal/?q=node/123
題目在這在這在這 還好網址沒有很長 我不會縮址
以下只有到第3小題 也就是member1.cpp的部分
請酌量服用
--
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
這次我的作法只有用到這些東西
當然如果想要湊行數的話
可以加上#include<ctime> #include<cstring> #include<iomanip>
之類之類的
隨你們高興~
--
第一小題:
class member
//member就是所謂的會員
{
protected:
string num;
//num是會員編號
int money,bonus;
//money是消費金額 bonus是紅利
public:
inline int getbonus(){return bonus;}
//inline省略不打並不會影響結果
inline int getmoney(){return money;}
//只會增加CPU的溫度而已
inline string getnum(){return num;}
};
//別忘了class要記得加上分號
沒什麼重點的第一小題
主要就是資料成員 題目規定不能用public
第二小題又要把資料成員繼承下去 不能用private
所以protected是您的唯一選擇
--
第二小題:
class golden : public member
//golden是所謂的黃金會員
{
golden *ptr;
//ptr是為了待會串列使用
public:
golden(char *n,int i)
//利用建構函式的參數把資料輸入進去
{
num=string(n,4);
//輸入會員編號
money=i;
//輸入消費金額
bonus=100+money/5;
//算出紅利
ptr=NULL;
//ptr指向NULL以便後面判別
}
void setptr(golden *i){ptr=i;}
//ptr的輸入與輸出函式
inline golden *getptr(){return ptr;}
};
黃金會員的部分
當黃金會員紅利真多 害我也想當
--
class normal : public member
//normal是所謂的一般會員
{
normal *ptr;
public:
normal(char *n,int i)
{
num=string(n,4);
money=i;
bonus=money/20;
//唯一的不同點就是紅利少的可憐
ptr=NULL;
}
void setptr(normal *i){ptr=i;}
inline normal *getptr(){return ptr;}
};
由於父類別member裡面有成員函式
所以三種繼承手法只能選擇public繼承
很簡單的第二小題
--
崩潰的第三小題:
int main()
//進入崩潰的主函式
{
//這邊解釋跟input1.txt的對應關係
fstream file;
//1 A001 1000 分別是
char level,num[4];
//level num[4] money
int money;
golden *head1=new golden(num,-500),*a,*b,*c;
//兩種會員會用到兩條串列
normal *head2=new normal(num,0),*x,*y,*z;
//所以需要兩個head
file.open("input1.txt",ios_base::in);
//開啟input1.txt檔案
把該宣告的都宣告出來
兩個head各給他一個new是為了排序的時候墊底
golden跟normal後面的參數就自己細細的體會吧
有點不容易解釋科科
接下來是有點複雜的串流程序 請做好心理準備
--
while(!file.eof())
//.eof函式在檔案到底時回傳ture
{ //這邊對應input1.txt
//1 A001 1000
file.get(level);
//把1存在level裡面
file.get();
//中間的空格吃掉
file.get(num[0]).get(num[1]).get(num[2]).get(num[3]);
//A001存在num裡面
file.get();
//中間的空格再吃掉
file>>money;
//剩下的數字存在money裡面
file.get();
//把最後的enter吃掉
就這樣 一整行的資料都被分別存在對的地方了
其實只是把我們常用的cin換成file而已
重點是 中間討厭的空格要讓它消失於異次元之中
--
之後利用level辦別是否為黃金會員
if(level=='1')
//1表示黃金會員
{
a=new golden(num,money);
//new一個golden 並輸入num跟money
a→→排序
//把上學期的排序程式複製過來用吧!
}
if(level=='2') //2表示一般會員
{
x=new normal(num,money);
x→→排序
}
}
我的排序邏輯又臭又長是眾所皆知的
這邊用自己熟悉的排序方式就好
排序過後 head1是黃金會員的串列頭 head2是一般會員的串列頭
--
a=head1;
//開始進行輸出
x=head2;
cout<<"編號\t金額\t紅利\n";
while(a->getptr()!=NULL||x->getptr()!=NULL)
//當兩條串列都到底就結束
{
if(a->getbonus()>x->getbonus())
//從頭開始 比較兩邊會員的紅利大小
{
//較大的一方輸出 並且移到下一位
cout<<a->getnum()<<"\t"<<a->getmoney()<<"\t"<<a->getbonus()<<endl;
a=a->getptr();
}
else
//依序輸出編號 金額 紅利
{
cout<<x->getnum()<<"\t"<<x->getmoney()<<"\t"<<x->getbonus()<<endl;
x=x->getptr();
}
}
system("pause");
兩條串列輸出邏輯大概是這樣
--
}
//↑最後一個大括號 記得上括號跟下括號要一樣多
不知道現在Po這個能不能稍微幫你們一點忙
也不知道我有沒有解釋得相當清楚
如果有更好的方法不要吝嗇 提出來吧
對我的程式的哪邊相當不順眼也直接說 我盡量改進
各位加油 還有10個小時
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.136.122.90
推 drygoat:複製->另存新檔->放入隨身碟 謝謝泰泰專業解析 06/21 00:34
推 daikon14:太強大了拉!!!快膜拜吧!!! 06/21 00:36
推 alex960368:麻吉推 真的太棒了 06/21 00:37
※ 編輯: andy801119 來自: 220.136.122.90 (06/21 00:53)
推 baby30069:扣掉睡眠 所剩時間寥寥無幾~~~~~~~ 感謝安泰大大!!! 06/21 00:44
推 j359436224:天啊 也真是太感謝你 辛苦了! 謝!!!!!!!!!!!!!! 06/21 00:45
→ ayomot038:是有幾個人是有試著寫過的? 06/21 00:48
→ ayomot038:不要整天都想要有人幫你 06/21 00:51
推 justbearcry:拜神囉! 06/21 00:53
推 shes87551:有神快拜! 06/21 00:55
推 bennyt6182:謝謝 我現在編譯一次看看 06/21 00:56
推 bengikey:跪著案推文啊 06/21 03:04
→ game0416:"你什麼時候有第三題一定要用前兩題類別的錯覺了" 06/21 08:11
→ game0416:去年的解法應該都是這個想法(?) 06/21 08:11
→ andy801119:我還真的產生錯覺了 06/21 09:51