题目:
题目1.小明是一个计算机专业top student,祝贺他毕业了。并准备到银行参加工作。上班第一天,经理叫他编制一个实现一个活期储蓄处理程序,算作考查。上班第一天,一定要给领导一个好印象,小明二话没说,就答应了。现要你是小明了,请完成如下题目功能。储户开户、销户、存入、支出活动频繁,系统设计要求:
(1)能比较迅速地找到储户的帐户,以实现存款、取款记账;
(2)能比较简单,迅速地实现插入和删除,以实现开户和销户的需要。
分析:
从主函数出发,先是登录:输入用户名和密码,若输入信息一次不符合则提示,大于等于两次即自动退出系统,若符合即可登入,进入主菜单,选择1则去到开户函数kaihu(),this指针从账号初始赋予值1000后移1位即第一个开户者账号为10001,将输入数据给Record对象,创建结点封装Record对象,将Node结点插入Linklist链表,之后会显示账户所有信息并提示开户成功和该账户的初始信息,按任意键回到主菜单;选择2去到销户函数xiaohu(),则指针指向输入的需要销户账号并检验密码是否正确以及账户是否还存在,然后根据确认进行销户,按任意键返回主菜单;选择3去到查找函数chazhao()类似选项2的步骤然后显示出要该账户的各种信息,之后按任意键返回主菜单进行其他功能操作;选择4去到存款函数cun(),是按输入账号的指针地址查找账户信息看是否存在,然后进行存款步骤,最后显示存款后的账户信息,按任意键返回主菜单;选择5去到取款函数qu()类似选项4步骤,进行取款,若输入金额大于余额指针所指的数值则提示余额不足,若成功后显示取款后账户信息并提示取款结束,按任意键返回主菜单;选择6去到转账函数zhuan()验证转出账户信息是否正确然后根据输入的转入账户信息和金额进行转账,转出账户指针指向的余额数值减去转出的金额,转入账户指针则增加;选择0则直接退出程序。
功能: 登录(输入用户名和密码)、开户(输入账户名、密码、金额)、销户(输入账号、密码以及确认)、查询(输入账号、密码,结果有账号、户名、密码、余额、状态)、存款(输入账号和存款金额)、取款(输入账号、密码、取款金额)、转账(转出账号及其密码、转入账号、转入金额)、显示账户信息、退出系统。
//主函数.cpp
#include"Bank.h"
#include
using namespace std;
void welcome();
void login(Bank *bank);
void mainmenu(Bank *bank);
int main()
{ Bank *bank=new Bank;
welcome();
login(bank);
return 0;
}
void welcome()
{ cout<<"|~——————————————————~|"< 感谢使用活期储蓄程序 < |"<>choice;
switch(choice)
{case 0:
exit(0);
case 1:
bank->kaihu();
break;
case 2:
bank->xiaohu();
break;
case 3:
bank->chazhao();
break;
case 4:
bank->cun();
break;
case 5:
bank->qu();
break;
case 6:
bank->zhuan();
break;
default:
cout << "——没有该选项——" << endl;
break;
}
}
while(true);
}
void login(Bank *bank)
{ string admin_name;
string admin_password;
for(int i=1;i<=3;++i)
{ cout<>admin_name;
cout<<"请输入您的密码:"<>admin_password;
if((admin_name=="admin")&&(admin_password=="admin"))
{ mainmenu(bank);
}
else
{ if(i<2)
{ cout<<"——用户名或密码输入错误——"<
//记录.h
#ifndef HEADER_RECORD
#define HEADER_RECORD
#include
using namespace std;
class Record
{private:
int num;
string name;
string password;
double balance;
int flag;
public:
Record();
void set_num(int num);
void set_name(string name);
void set_password(string password);
void set_balance(double balance);
void set_flag(int flag);
int get_num();
string get_name();
string get_password();
double get_balance();
int get_flag();
void display_Record();
};
#endif
//记录.cpp
#include"记录.h"
#include
using namespace std;
Record::Record()
{this->num=0;
this->name=' ';
this->password=' ';
this->balance=0;
this->flag=-1;
};
void Record::set_num(int num)
{this->num=num;
}
void Record::set_name(string name)
{this->name=name;
}
void Record::set_password(string password)
{this->password=password;
}
void Record::set_balance(double balance)
{this->balance=balance;
}
void Record::set_flag(int flag)
{this->flag=flag;
}
int Record::get_num()
{return this->num;
}
string Record::get_name()
{return this->name;
}
string Record::get_password()
{return this->password;
}
double Record::get_balance()
{ return this->balance;
}
int Record::get_flag()
{ return this->flag;
}
void Record::display_Record() //显示打印信息~
{cout<<"打印账户信息ing...请等候"<num<<'\t'<<"|"<name<<'\t'<<"|"
<password<<'\t'<<"|"<balance<<'\t'<<"|";
if(this->flag==1)
{ cout<<"正常";
}
else
{ cout<<"销户";
}
cout<<'\t'<<"|"<
using namespace std;
Node::Node()
{ this->record=NULL;
this->next=NULL;
}
Node::~Node()
{ delete this->record;
this->record=NULL;
this->next=NULL;
}
void Node::set_record(Record *record)
{ this->record=record;
}
void Node::set_next(Node *next)
{ this->next=next;
}
Record *Node::get_record()
{ return this->record;
}
Node *Node::get_next()
{ return this->next;
}
void Node::display_Node()
{ cout<<"打印账户信息ing...请稍候..."<record!=NULL) //当出现空链表时执行
{ Record *r=this->record;
r->display_Record();
}
else
{ cout<<"sorry,没有记录"<next<
using namespace std;
Linklist::Linklist()
{ this->head=NULL;
this->len=0;
}
Linklist::~Linklist()
{Node *n1,*n2;
n1=this->head;
while(n1!=NULL)
{ n2=n1;
n1=n1->get_next();
delete n2;
}
this->head=NULL;
this->len=0;
}
void Linklist::set_head(Node *head)
{ this->head=head;
}
void Linklist::set_len(int len)
{ this->len=len;
}
Node *Linklist::get_head()
{ return this->head;
}
int Linklist::get_len()
{ return this->len;
}
Node *Linklist::make_node(Record *record)
{ Node *node=new Node();
node->set_record(record);
node->set_next(NULL);
return node;
}
void Linklist::insert_node(Node *node)
{ Node *n1=this->head;
if(n1==NULL)
{ this->head=node;
this->len++;
return;
}
while(n1->get_next()!=NULL)
{ n1=n1->get_next();
}
n1->set_next(node);
this->len++;
return;
}
Node *Linklist::find_node(int num)
{ Node *n1=this->head;
while(n1!=NULL)
{ Record *r=n1->get_record();
if(r->get_num()==num)
{ return n1; //返回找到的结点
}
else
{ n1=n1->get_next();
}
}
return n1; //return NULL
}
void Linklist::display_Linklist()
{ cout<<"打印账户信息ing...请稍候~"<head;
if(n1==NULL)
{ cout<<"链表为空"<len<display_Node();
n1=n1->get_next();
}
cout<<"链长:"<len<
#include"Bank.h"
#include
using namespace std;
Bank::Bank()
{ this->list=this->make_linklist();
this->zhanghu_num=10000; //未开户
}
Bank::~Bank() //将调用所有类的析构函数
{ delete this->list;
this->list=NULL;
}
void Bank::set_list(Linklist *list)
{ this->list=list;
}
Linklist *Bank::get_list()
{ return this->list;
}
Linklist *Bank::make_linklist()
{ return new Linklist();
}
Record *Bank::make_record(string name,string password,double balance)
{ Record *r=new Record();
int num=this->creat_num();
r->set_num(num);
r->set_password(password);
r->set_name(name);
r->set_balance(balance);
r->set_flag(1);
return r;
}
int Bank::creat_num()
{ return this->zhanghu_num=zhanghu_num+1;
}
int Bank::get_num()
{ int num;
cout<<"请输入账号"<>num;
cout<<"账号:"<>name;
cout<<"账户名:"<> password;
cout << "密码: " << password << endl;
return password;
}
double Bank::get_balance()
{ double balance;
cout <<"请输入金额"<< endl;
cin >> balance;
cout <<"金额:"<list->find_node(zhanghu_num);
if(n!=NULL)
{
return n->get_record();
}
return NULL;
}
//以下为开户功能:
void Bank::kaihu()
{ string name=this->get_name(); //获取输入的账户信息
string password = this->get_password();
double balance = this->get_balance();
Record *r = this->make_record(name, password, balance);//使用输入的数据创建Record对象Node *n=this->list->make_node(r); //创建Node结点,封装Record对象
this->list->insert_node(n); //将Node结点插入Linklist链表
r->display_Record();//显示账户信息
cout<<"——开户成功——"<get_num(); // 获取销户账号
Record * back_record = this->find_record(num); // 查找账户
if(back_record == NULL)
{ cout<<"——没有此帐户——"<get_password(); //获取账户密码,判断密码是否正确
if(password != back_record->get_password())
{ cout << "——密码不正确——" << endl;
getchar();
return;
}
if(back_record->get_flag() == 0) //判断账户状态
{ cout << "——已销户,不能再次销户——" << endl;
getchar();
return;
}
char answer; //获取用户输入的选择信息,确认是否销户
cout << "是否确认销户? [1:销户| 其他:不销户] " << endl;
cin >> answer;
if(answer =='1') //销户
{ back_record->set_flag(0);
back_record->set_balance(0);
back_record->display_Record();
cout << "——销户成功——" << endl;
getchar();
return;
}
else
cout << "——取消销户——" << endl;
return;
}
void Bank::chazhao() //查询功能:
{ int num= this->get_num(); // 获取查询账号
Record * back_record = this->find_record(num); // 查找账户
if(back_record == NULL)
{ cout << "——没有此帐户——" << endl;
getch();
return;
}
string password = this->get_password(); //获取账户密码,判断密码是否正确
if(password != back_record->get_password())
{ cout << "——密码错误——" << endl;
getch();
return;
}
back_record->display_Record(); //显示查询到的用户信息
cout << "——查询成功——" << endl;
getch();
return;
}
void Bank::cun() //以下为存款功能:
{ int num = this->get_num();//获取存款账号
Record * back_record = this->find_record(num); //查找账号
if(back_record == NULL) //判断用户是否存在
{ cout << "——没有此帐户——" << endl;
getch();
return;
}
back_record->display_Record(); //显示账户信息
if(back_record->get_flag() == 0) //判断账户是否销户
{ cout << "——已销户——" << endl;
getch();
return;
}
double cash = 0;
cout << "输入存款金额: " << endl;
cin >> cash;
cout << "存款金额为:" << cash << endl;
cash = back_record->get_balance()+cash;
back_record->set_balance(cash);
back_record->display_Record(); //显示账户信息
cout << "——存款结束——" << endl;
getch();
return;
}
void Bank::qu() //以下为取款功能:
{ int num = this->get_num(); // 获取取款账号
Record * back_record=this->find_record(num); // 查找账户
if(back_record == NULL)
{ cout << "——没有此帐户——" << endl;
getch();
return;
}
string password = this->get_password(); //获取账户密码,判断密码是否正确
if(password!= back_record->get_password())
{ cout << "——密码不正确——" << endl;
getch();
return;
}
if(back_record->get_flag() == 0) // 确定用户账户状态
{ cout << "——已销户——" << endl;
getch();
return;
}
double cash = 0;
cout << "请输入取款金额:" << endl;
cin >> cash;
if(cash>back_record->get_balance())
{ cout << "——账户余额不足——" << endl;
getch();
return;
}
cash = back_record->get_balance() - cash;
back_record->set_balance(cash);
back_record->display_Record(); //显示账户信息
cout << "——取款结束——" << endl;
getch();
return;
}
void Bank::zhuan() //转账功能:
{ int num; // 获取转入账号
cout << "转出账号为:" << endl;
cin >> num;
Record * back_record = this->find_record(num); // 查找账号
if(back_record == NULL)
{ cout << "——没有此帐户——" << endl;
getch();
return;
}
string password; //获取账户密码,判断密码是否正确
cout << "请输入账户密码:" << endl;
cin >> password;
if(password != back_record->get_password())
{ cout << "——密码不正确——" << endl;
getch();
return;
}
if(back_record->get_flag() == 0) // 确定用户账户状态
{ cout << "——已销户——" << endl;
getch();
return;
}
int zhuan_num; //获取转账账号
cout << "请输入转入账号:" << endl;
cin >>zhuan_num;
Record * zhuan_record = this->find_record(zhuan_num); //查找转账账户
if(back_record == NULL)
{ cout << "——没有此帐户——" << endl;
getch();
return;
}
if(back_record->get_flag() == 0) // 确定用户账户状态
{ cout << "——已销户——" << endl;
getch();
return;
}
double cash = 0; //获取转账金额
cout << "请输入转入金额:" << endl;
cin >> cash;
if(cash > back_record->get_balance()) //判断转账金额是否合法
{ cout << "——账户余额不足——" << endl;
getch();
return;
}
zhuan_record->set_balance(zhuan_record->get_balance() + cash); //资金转账
back_record->set_balance(back_record->get_balance() - cash);
cout << "转出帐户信息:" << endl; //显示当前帐户信息及转账账户信息
back_record->display_Record();
cout << "转入账户信息:" << endl;
zhuan_record->display_Record();
cout << "——转账完成——" << endl; //转账结束
getch();
return;
}
收获和体会及不足:
通过这次的课程设计实践,收获不少,对C++语言和数据结构有更多的认识和更深的理解,都说程序=算法+数据结构,可见数据结构在程序设计中的重要性,本来C++基础不是很好,通过本学期数据结构的学习以及各种途径收集资料参考进行了恶补、探究、思考,提高了自己思考,分析问题,解决问题的能力。一开始拿到课题时,有点手足无措,不知道该从何入手,先是静下心来翻阅课本,看看哪些知识是比较符合题目要求的迅速找到目标并实现插入和删除数据等,感觉第二章的线性表中线性表的链接存储结构比较适合,链表带有结点,里面有指针域和数据域,可以比较容易实现查找等功能。
这次课程设计还体会到自己对编程的不上手和算法设计的笨拙,还有对程序语法错误的英文的陌生,不过相信继续努力去探究会更好的,通过编译、建立连接发现问题,根据系统提示的错误去排查修正,发现了以前没遇过的错误描述,如'int ' differs in levels of indirection from 'char [2];empty character constant……,上网查找程序语法错误英语的翻译并试着自己去修正程序,不断编译,依然不行则请教同学和查找解决方法,看到错误提示越来越少的时候真是非常激动人心,因为离程序可以运行又近了一步,知道了this指针初始化空字符串时要用单引号加空格,用char数据类型定义变量的话,如果没有规定长度则只会默认输出两个字节,所以如果需要输出比较长的字符串则要使用string定义该变量。