[課業] 98年期末考考古題-不完整參考解答

看板NTUE-CS103作者 (泰坦)時間13年前 (2011/06/21 00:31), 編輯推噓9(905)
留言14則, 12人參與, 最新討論串1/1
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

06/21 00:34, , 1F
複製->另存新檔->放入隨身碟 謝謝泰泰專業解析
06/21 00:34, 1F

06/21 00:36, , 2F
太強大了拉!!!快膜拜吧!!!
06/21 00:36, 2F

06/21 00:37, , 3F
麻吉推 真的太棒了
06/21 00:37, 3F
※ 編輯: andy801119 來自: 220.136.122.90 (06/21 00:53)

06/21 00:44, , 4F
扣掉睡眠 所剩時間寥寥無幾~~~~~~~ 感謝安泰大大!!!
06/21 00:44, 4F

06/21 00:45, , 5F
天啊 也真是太感謝你 辛苦了! 謝!!!!!!!!!!!!!!
06/21 00:45, 5F

06/21 00:48, , 6F
是有幾個人是有試著寫過的?
06/21 00:48, 6F

06/21 00:51, , 7F
不要整天都想要有人幫你
06/21 00:51, 7F

06/21 00:53, , 8F
拜神囉!
06/21 00:53, 8F

06/21 00:55, , 9F
有神快拜!
06/21 00:55, 9F

06/21 00:56, , 10F
謝謝 我現在編譯一次看看
06/21 00:56, 10F

06/21 03:04, , 11F
跪著案推文啊
06/21 03:04, 11F

06/21 08:11, , 12F
"你什麼時候有第三題一定要用前兩題類別的錯覺了"
06/21 08:11, 12F

06/21 08:11, , 13F
去年的解法應該都是這個想法(?)
06/21 08:11, 13F

06/21 09:51, , 14F
我還真的產生錯覺了
06/21 09:51, 14F
文章代碼(AID): #1D_tNfQS (NTUE-CS103)