[課業] 98年期末考考古題-不完整參考解答
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