《数据结构课程设计》
课程题目 | 银行活期储蓄管理系统 |
课程编号 | j1620102 |
学生姓名 | 李勋 |
学生学号 | 201311671111 |
所在班级 | 信管1131 |
任课老师 | 易学明 |
实习时间 | 2015年1月10日 |
设计成绩 |
|
老师评语 |
|
目 录:
1、问题描述······················································································3
2、问题分析····················································································3
3、程序总体分析············································································3
4、逻辑结构和存储结构设计························································4
5、算法设计····················································································4
6、时间复杂度和空间复杂度分析···············································4
7、程序运行演示·············································································5
8、心得体会·····················································································8
9、附录:源程序清单····································································8
1、问题描述:
小明是一个计算机专业top student,祝贺他毕业了。
并准备到银行参加工作。上班第一天,经理叫他编制一个实现一个活期储蓄处理程序,算作考查。
上班第一天, 一定要给领导一个好印象,小明二话没说,就答应了。现要你是小明了,
请完成如下题目功能。储户开户、销户、存入、支出活动频繁,系统设计要求:
(1)能比较迅速地找到储户的帐户,以实现存款、取款记账;
(2)能比较简单,迅速地实现插入和删除,以实现开户和销户的需要。
2、问题分析:
根据该问题的描述,要求的是设计一个银行账户管理系统,需要对银行账户进行开户销户、通过一定条件快速搜索账户,然后进行存取款的操作。由于账户操作活动较为频繁,要迅速的进行插入和删除操作,故不能使用顺序表来存储,虽然使用顺序表搜索速度较链表快,但是顺序表在插入删除时必须移动大量的数据元素,且账户的数量难以确定,容易造成账户数据的存储问题。故采取单链表的方式进行存储。
3、程序总体分析:
这个程序主要包括了开户、销户、存取款、修改账户密码、检索账户信息等功能。
1) 开户功能:
该操作需要用户输入开户信息,例如姓名、账号号码、身份证号、联系电话和开户时所存入的金额。
2) 销户功能:
该操作就是用户进行删除账号及其信息。
3) 存取款功能:
该操作需要用户通过姓名来检索账户号码,然后进行存取款项,使得账户的余额有相应的变化。
4) 修改账户密码功能:
该操作需要用户通过姓名检索账户的信息,显示账户号码,输入旧密码,之后两次输入一致的新密码来实现修改密码。
5) 检索账户信息功能:
该操作通过姓名来搜索相关账户的姓名、账户号码、身份证号、电话号码、当前的账户余额等信息。
4、逻辑结构和存储结构设计:
该程序因为是对账户的存储及其操作,所以使用线性表的逻辑结构。存储结构使用的是链接存储结构即单链表的方式存储,以方便账户信息的存取操作。
5、算法设计:
在主程序运行时,先用无参构造函数Bank()来创建一个头结点first。开户函数insert()主要是在表尾进行插入账户信息的,销户函数del(),存款函数save(),取款函数withdraw(),修改密码函数modify()主要的是依赖搜索函数search()通过姓名搜索到账户所在位置,在利用所得位置完成后续的操作。
6、时间复杂度和空间复杂度分析:
由于程序中所有的操作都从头指针first开始进行逐个结点的搜索,所以所有函数的时间复杂度皆为T(n)=O(n).
该程序除了函数算法、存储的数据之外,临时开辟的存储空间都最多只是一个临时结点及即将要录入的数据,故空间复杂度为S(n)=O(1).
7、程序运行演示:
1、
主菜单:
2、
开户功能
3、
销户功能:
4、
存款功能:
5、
取款功能:
6、
修改密码:
7、
搜索账户信息:
8、心得体会:
其实这次的数据结构课程设计较之前的c++课程设计有一定的难度,因为需要使用数据结构的知识来实现功能和解决问题。由于参考了相关的书籍及资料,编写程序的时间使用得较少,多数时间都用于程序的调试及bug的修正,最后在同学的协助下成功完成了编程,并改正了大部分的错误。不足之处是有一些功能没有实现,例如利用文件流读写账户资料、设定存款利率及为账户计算利息,相比银行的管理系统还有很多的缺失。我会从这次的课程设计中汲取经验,在以后的程序设计编程中做得更好,编写出更加完善的程序。
9、附录:源程序清单:
头文件Bank.h:
#ifndef bank_H
#define bank_H
#include<string.h>
#include<iostream>
using namespace std;
struct Account
{
stringname; //账户所有人姓名
stringid; //身份证号
stringnumber; //账号
stringphone; //联系方式
unsignedint password; //账户密码
doublebalance; //账户余额
Account*next;
};
class Bank
{
public:
Bank();
~Bank(){};
voidinsert();
intlength(); //求长度
voiddel(int i); //销户
int search(string S); //寻找
voidsave(int j); //存款
voidwithdraw(int k); //取款
voidmodify(int i); //修改密码
voidshow(int i);//显示单个账户的信息
private:
Account *first;
};
#endif
函数定义文件function.cpp:
#define _CRT_SECURE_NO_WARNINGS
#include"bank.h"
#include<iostream>
#include<iomanip>
#include<string>
using namespace std;
Bank::Bank()
{
first= new Account;
first->next=nullptr;
}
void Bank::insert()
{
Account*p = new Account;
p= first;
while(p->next != nullptr)
{
p= p->next;
}
Account*s = new Account;
cout<< "输入信息:" << endl;
cout<< "姓名:" << ends;
cin>> s->name;
cout<< "\n身份证号码:" << ends;
cin>> s->id;
cout<< "\n联系电话:" << ends;
cin>> s->phone;
cout<< "\n账户号码:" << ends;
cin>> s->number;
cout<< "\n密码:" << ends;
cin>> s->password;
cout<< "\n存入金额:" << ends;
cin>> s->balance;
s->next= p->next;
p->next= s;
}
void Bank::del(int i)
{
Account*p = first;
intcount = 0;
while(p != nullptr&& count < i - 1)
{
p= p->next;
count++;
}
if(p == nullptr || p->next == nullptr) throw "位置有误";
else
{
Account*q=new Account;
q= p->next;
p->next= q->next;
deleteq;
}
}
void Bank::save(int j)
{
Account*p = first;
intcount=0;
while(p != nullptr&& count <= j - 1)
{
p= p->next;
count++;
}
cout<< "姓名是: "<<p->name<<endl;
cout<< "账号是: " << p->number <<endl;
doublemoney;
cout<< "请输入要存入的金额: ";
cin>> money;
p->balance= p->balance + money;
}//存款
void Bank::withdraw(int k)
{
Account*p = first;
intcount = 0;
while(p != nullptr&& count <= k - 1)
{
p= p->next;
count++;
}
cout<< "姓名是:" << p->name << endl;
cout<< "账号是:" << p->number <<endl;
unsignedint password;
cout<< "输入账户密码:";
cin>> password;
cout<< endl;
if(p->password==password)
{
doublemoney;
cout<< "请输入要取出的金额:";
cin>> money;
p->balance= p->balance - money;
}
elsecout << "密码有误!";
}//取款
void Bank::modify(int i)
{
Account*p = first;
intcount = 0;
while(p != nullptr&& count <= i - 1)
{
p= p->next;
count++;
}
cout<< "姓名是: " << p->name << endl;
cout<< "账号是: " << p->number << endl;
unsignedint password;
cout<< "输入账户密码:";
cin>> password;
cout<< endl;
if(p->password == password)
{
unsignedint temp, temp_0;
cout<< "请输入新密码:";
cin>> temp;
cout<< "请再输入一次以确认:";
cin>> temp_0;
if(temp != temp_0)
{
cout<< "两次密码输入不一致!"<<endl;
system("pause");
}
else
{
p->password= temp;
}
}
else
{
cout<< "您输入的密码不正确!"<<endl;
system("pause");
return;
}
}
int Bank::search(string S)
{
Account*p;
p= first->next;
intcount = 1;
while(p != nullptr)
{
if(S==p->name)
returncount;
p= p->next;
count++;
}
return0;
} //通过名字搜索
{
Account*p = first->next;
while(p == nullptr)
{
cout<< "未输入任何账号信息!"<<endl;
system("pause");return;
}
cout<< "姓名" << setw(12) << "账号" << " " << "余额" << endl;
while(p != nullptr)
{
cout<< p->name << setw(15) << p->number <<" " << p->balance<< endl;
p = p->next;
}
system("pause");
} */
void Bank::show(int i)
{
Account*p = first;
intcount = 0;
while(p != nullptr&& count <= i - 1)
{
p= p->next;
count++;
}
cout<< "该账户的信息如下:" << endl;
cout<< "姓名: " << p->name << endl;
cout<< "账号: " << p->number << endl;
cout<< "身份证号码: " << p->id << endl;
cout<< "联系电话: " << p->phone << endl;
cout<< "账户余额: " << p->balance << endl;
system("pause");
}
主函数bank_main.cpp:
#include<iostream>
#include"bank.h"
#include<iomanip>
#include<cstdlib>
#include<string>
using namespace std;
void menu();
int main()
{
system("colorF0");
BankA;
shortchoose;
while(1)
{
menu();
cout<< " 请输入功能代码:";
cin>> choose;
switch(choose)
{
case0:
charh;
cout<< "是否退出系统(Y/N):";
cin>> h;
if(h == 'Y' || h == 'y')
{
cout<< "正在退出系统,再见!" << endl;
system("pause");
return0;
}
else
cout<< "取消退出指令。";
break;
case1:
A.insert();
break;
case2:
{
inta;
stringS;
cout<< "输入姓名:" << ends;
cin>> S;
a= A.search(S);
if(a == 0)
{
cout<< "你输入的姓名有误!!";
system("pause");
break;
}
else
{
cout<< "已找到:" << endl;
A.show(a);
cout<< "请确认是否删除?(Y/N):";
charchoose_1;
cin>> choose_1;
if(choose_1 == 'Y' || choose_1 == 'y')
{
A.del(a);
break;
}
else
{
break;
}
}
}
case3:
{
cout<< "输入姓名:";
stringS1;
cin>> S1;
intj;
j= A.search(S1);
if(j == 0)
{
cout<< "你输入的姓名有误!!";
system("pause");
break;
}
else
{
A.save(j);
break;
}
}
case4:
{
cout<< "输入姓名:";
stringS2;
cin>> S2;
intk;
k= A.search(S2);
if(k == 0)
{
cout<< "你输入的姓名有误!!";
system("pause");
break;
}
else
{
A.withdraw(k);
break;
}
}
case5:
{
cout<< "输入姓名:";
stringS3;
cin>> S3;
inti;
i= A.search(S3);
if(i == 0)
{
cout<< "你输入的姓名有误!!";
system("pause");
break;
}
else
{
A.modify(i);
break;
}
}
case6:
{
cout<< "输入要搜索的姓名:";
stringS4;
cin>> S4;
inti;
i= A.search(S4);
if(i == 0)
{
cout<< "你输入的姓名有误!!"<<endl;
system("pause");
break;
}
else
{
A.show(i);
break;
}
}
default:
cout<< "输入有误,请重新输入!"<< endl; break;
}
}
return0;
}
void menu()
{
system("cls");
cout<<"\t****************"<< "银行活期储蓄管理系统"<<"*****************" <<endl;
cout<< "\t-------------------- 【1】.开户 ---------------------" << endl;
cout<< "\t-------------------- 【2】.销户 ---------------------" << endl;
cout<< "\t-------------------- 【3】.存款 ---------------------" << endl;
cout<< "\t-------------------- 【4】.取款 ---------------------" << endl;
cout<< "\t-------------------- 【5】.修改账户密码 -------------" << endl;
cout<< "\t-------------------- 【6】.搜索账户信息 -------------" << endl;
cout<< "\t-------------------- 【0】.退出系统 -----------------" << endl;
}