作者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
1F:推 drygoat:复制->另存新档->放入随身碟 谢谢泰泰专业解析 06/21 00:34
2F:推 daikon14:太强大了拉!!!快膜拜吧!!! 06/21 00:36
3F:推 alex960368:麻吉推 真的太棒了 06/21 00:37
※ 编辑: andy801119 来自: 220.136.122.90 (06/21 00:53)
4F:推 baby30069:扣掉睡眠 所剩时间寥寥无几~~~~~~~ 感谢安泰大大!!! 06/21 00:44
5F:推 j359436224:天啊 也真是太感谢你 辛苦了! 谢!!!!!!!!!!!!!! 06/21 00:45
6F:→ ayomot038:是有几个人是有试着写过的? 06/21 00:48
7F:→ ayomot038:不要整天都想要有人帮你 06/21 00:51
8F:推 justbearcry:拜神罗! 06/21 00:53
9F:推 shes87551:有神快拜! 06/21 00:55
10F:推 bennyt6182:谢谢 我现在编译一次看看 06/21 00:56
11F:推 bengikey:跪着案推文啊 06/21 03:04
12F:→ game0416:"你什麽时候有第三题一定要用前两题类别的错觉了" 06/21 08:11
13F:→ game0416:去年的解法应该都是这个想法(?) 06/21 08:11
14F:→ andy801119:我还真的产生错觉了 06/21 09:51