《数据结构课程设计》
题目1:活期储蓄管理系统
学生姓名 |
胡泳行 |
所在专业 |
信息管理与信息系统专业 |
所在班级 |
信管1134班 |
任课老师 |
易学明 |
实习时间 |
2015年 1月 4 日 |
指导教师评语:
指导教师签字:
2015 年1 月 4 日
目 录
一. 实训目的..............................................................................................................................…..3
二. 实训环境..........................................................................................................................….….3
三. 实习题目....................................................................................................................................3
四. 总体要求和说明........................................................................................................................3
五. 考核方法....................................................................................................................................3
六. 系统功能结构......................................................................................................................…..4
(1) 开户功能....................................................................................................................….....4
(2) 销户功能.............................................................................................................................5
(3) 存款功能.......................................................................................................................…..5
(4) 取款功能.......................................................................................................................…..6
(5) 转账功能.........................................................................................................................…7
七、系统功能界面.............................................................................................................................8
A. 开户功能界面...........................................................................................................................8
B. 销户功能界面...........................................................................................................................9
C. 存款界面..................................................................................................................................9
D. 取款界面.................................................................................................................................10
E. 转账界面.................................................................................................................................10
F. 查看所有账户界面.................................................................................................................10
G. 最近五笔交易界面..................................................................................................................11
八、源代码.........................................................................................................................................11
九、结 论 ...........................................................................................................................................20
十、参考文献.....................................................................................................................................20
一、实训目的
通过课程设计,学会运用数据结构知识,针对具体应用,自己设计合理数据结构,确定存储结构,并能设计具体操作算法,选择使用具体语言进行实现。掌握C++较复杂程序的组织和设计过程,调试技巧。学习解决实际问题的能力。
二、实训环境
计算机windows xp或其它版本,VC6.0或更高版本,或其它语言环境。
三、实习题目
题目 1.小明是一个计算机专业top student,祝贺他毕业了。并准备到银行参加工作。上班第一天,经理叫他编制一个实现一个活期储蓄处理程序,算作考查。上班第一天, 一定要给领导一个好印象,小明二话没说,就答应了。现要你是小明了,请完成如下题目功能。储户开户、销户、存入、支出活动频繁,系统设计要求:
(1)能比较迅速地找到储户的帐户,以实现存款、取款记账;
(2)能比较简单,迅速地实现插入和删除,以实现开户和销户的需要。
根据实际的需要,还增加了部分功能。
四 总体要求和说明
使用数据结构相关知识来做。语言工具不受限。
( 1 )独立完成,设计算法并编写代码,调试通过。
( 2 ) 写设计说明书。
内容:题目、功能、要求、分析、代码,收获和体会及不足等。
( 3 ) 以个人独立完成。每一个选择一个题目。选题方式是:自己学号整除5所得的余数是几就做几号题。如学号为12做2号题,学号为5的做0号题。
( 4 ) 时间:从第13周开始收集资料,进行准备。具体设计时间在16-17周(等实验室安排)。在设计周周五检查(在机房子单独接受老师检查并提问),次周周五前提交设计 说明书(实习报告)。
( 5 ) 实习单独计算成绩,学分1分,成绩好坏和考试没关系。
五.考核方法
单独考核(和课程考试分开考核),学分1.0分,报告占30%和总结20%分,综合50%。
六、 系统功能结构
(1) 开户功能
//开户
voidopenAccount()
{
char name[NAMELENGTH];
printf("请输入新开立的账户名称 : ");
fflush(stdin);
gets(name);
if(strlen(name)>0)
{
p = (struct Account *)malloc(LEN); /* 创建一个新账户 */
p->balance=DEFAULTBALANCE;
p->next=NULL;
strcpy(p->name,name);
tail->next=p;
tail = p;
}
}
(2) 销户功能
//销户
voidcloseAccount()
{
char name[NAMELENGTH];
printf("请输入要销户的账户名称 :");
fflush(stdin);
gets(name);
if(strlen(name)>0)
{
struct Account *pre;
p = head;
pre=head;
int find=0;
while(p != NULL)
{
if(strcmp(p->name,name)==0)
{
if(head == p)
head=p->next;
else if(tail==p)
{
pre->next=NULL;
tail = pre;
}
else
{
pre->next =p->next;
}
find=1;
break;
}
pre = p;
p = p->next;
}
if(find==0)
printf("没有此账户,无法完成销户!\n");
}
}
(3) 存款功能
//存款
voiddeposit()
{
char name[NAMELENGTH];
printf("请输入要存款的账户名称:");
fflush(stdin);
gets(name);
p = findAccountByName(name);
if(p!=NULL)
{
float savemoney;
printf("请输入要存款的金额 :");
scanf("%f",&savemoney);
while(savemoney<=0)
{
printf("存款额不能小于等于零,请重新输入! ");
scanf("%f",&savemoney);
}
p->balance =p->balance+savemoney; /*存入账户金额*/
char message[MESSAGELENGTH];
sprintf(message,"账户%s成功存入%.2f元!\n",name,savemoney);
writeMessage(p,message); /*写入交易记录*/
}
else
printf("没有此账户!\n");
}
(4) 取款功能
//取款
voidwithdraw()
{
char name[NAMELENGTH];
printf("请输入要取款的账户名称:");
fflush(stdin);
gets(name);
p = findAccountByName(name);
if(p!=NULL)
{
float savemoney;
printf("请输入要取款的金额 :");
fflush(stdin);
scanf("%f",&savemoney);
while(savemoney<=0 || savemoney>p->balance)
{
printf("存款额不能小于等于零或者大于余额,请重新输入! ");
scanf("%f",&savemoney);
}
p->balance =p->balance-savemoney; /*存入账户金额*/
char message[MESSAGELENGTH];
sprintf(message,"账户%s成功取出%.2f元!\n",name,savemoney);
writeMessage(p,message); /*写入交易记录*/
}
else
printf("没有此账户!\n");
}
(5) 转账功能
//转账
voidtransfer()
{
char outname[NAMELENGTH];
char inname[NAMELENGTH];
struct Account *outAccount;
struct Account *inAccount;
printf("请输入要转出的账户名称:");
fflush(stdin);
gets(outname);
outAccount =findAccountByName(outname);
if(outAccount!=NULL)
{
printf("请输入要转入的账户名称:");
fflush(stdin);
gets(inname);
inAccount =findAccountByName(inname);
if(inAccount != NULL)
{
float money;
printf("请输入要转账的金额 :");
fflush(stdin);
scanf("%f",&money);
while(money<=0 || money>outAccount->balance)
{
printf("转账金额不能小于等于零或者大于转出账户余额,请重新输入! ");
scanf("%f",&money);
}
outAccount->balance =outAccount->balance-money; /*减少转出账户金额*/
inAccount->balance =inAccount->balance+money; /*增加转入账户金额*/
charoutmessage[MESSAGELENGTH];
sprintf(outmessage,"账户%s成功转出%.2f元!\n",outname,money);
writeMessage(outAccount,outmessage); /*写入转出交易记录*/
char inmessage[MESSAGELENGTH];
sprintf(inmessage,"账户%s成功转入%.2f元!\n",inname,money);
writeMessage(inAccount,inmessage); /*写入转出交易记录*/
}
}
else
printf("没有此转出账户!\n");
}
六、 系统功能界面
A开户功能界面
B 销户功能界面
C 存款功能界面
D 取款界面
E 查看所有账户界面
F 最近五笔交易界面
八、源代码:
#include
#include
#include
#define LEN sizeof(struct Account)
#define RECORDCOUNT 5
#define MESSAGELENGTH 100
#define NAMELENGTH 100
#define VIEWCOUNT 5
#define DEFAULTBALANCE 0.00
#define SAVE 1
struct Account *head,*tail,*p; /*账户头部和尾部指针*/
struct Account
{
char name[NAMELENGTH]; /* 账户名称 */
float balance; /* 账户余额*/
char message[RECORDCOUNT][MESSAGELENGTH]; /* 交易记录 */
int maxMessageIndex;
struct Account *next; /* 指向下一账户 */
};
void freeMemory(); /*释放内存*/
void removeFirst(struct Account * account); /*移除第一个元素*/
void showMenu(); /*输出选择菜单*/
struct Account * findAccountByName(char name[]); /*通过账户名称找到对应的账户 */
void writeMessage(struct Account * account,char message[]); /* 写入交易记录 */
void init(); /* 创建链表,并返回表头指针 */
void openAccount(); /* 开户 */
void closeAccount(); /* 销户 */
void deposit(); /* 存款*/
void withdraw(); /* 取款 */
void transfer(); /* 转账 */
void print(); /*输出账户列表*/
void printMessage(); /*输出账户交易记录*/
int main()
{
init();
printf(" 欢迎使用活期储蓄管理系统\n");
showMenu();
char choice;
fflush(stdin);
choice = getchar();
while(choice != '8')
{
switch(choice)
{
case '1':
openAccount();
showMenu();
fflush(stdin);
choice = getchar();
break;
case '2':
closeAccount();
showMenu();
fflush(stdin);
choice = getchar();
break;
case '3':
deposit();
showMenu();
fflush(stdin);
choice = getchar();
break;
case '4':
withdraw();
showMenu();
fflush(stdin);
choice = getchar();
break;
case '5':
transfer();
showMenu();
fflush(stdin);
choice = getchar();
break;
case '6':
print();
showMenu();
fflush(stdin);
choice = getchar();
break;
case '7':
printMessage();
showMenu();
fflush(stdin);
choice = getchar();
break;
default:
printf("无效菜单!\n");
showMenu();
fflush(stdin);
choice = getchar();
break;
}
}
freeMemory(); /*释放内存*/
return 0;
}
void showMenu()
{
printf(" ---------------------------------------------------------------- \n");
printf(" | | \n");
printf(" | 1.开户 5.转账 | \n");
printf(" | | \n");
printf(" | 2.销户 6.查看所有账户 | \n");
printf(" | | \n");
printf(" | 3.存款 7.最近五笔交易 | \n");
printf(" | | \n");
printf(" | 4.取款 8.退出系统 | \n");
printf(" | | \n");
printf(" ---------------------------------------------------------------- \n");
}
//通过账户名称找到对应的账户
struct Account * findAccountByName(char name[])
{
if(strlen(name)>0)
{
p = head;
while(p != NULL)
{
if(strcmp(p->name,name)==0)
{
return p;
}
p = p->next;
}
}
return NULL;
}
//写入交易记录
void writeMessage(struct Account * account,char message[])
{
if(account->maxMessageIndex >= RECORDCOUNT)
{
removeFirst(account);
strcpy((account->message)[RECORDCOUNT-1],message);
account->maxMessageIndex = account->maxMessageIndex+1;
}
else
{
strcpy((account->message)[account->maxMessageIndex],message);
account->maxMessageIndex = account->maxMessageIndex+1;
}
}
void removeFirst(struct Account * account)
{
int i=0;
for(i=1; imessage)[i-1],(account->message)[i]);
}
/* 初始化三个默认账户 */
void init()
{
p = (struct Account *)malloc(LEN); /* 创建第一个账户 */
p->balance=DEFAULTBALANCE;
p->next=NULL;
p->maxMessageIndex=0;
strcpy(p->name,"001");
head=p;
tail = p;
p = (struct Account *)malloc(LEN); /* 创建第二个账户 */
p->balance=DEFAULTBALANCE;
p->next=NULL;
p->maxMessageIndex=0;
strcpy(p->name,"002");
head->next = p;
tail = p;
p = (struct Account *)malloc(LEN); /* 创建第三个账户 */
p->balance=DEFAULTBALANCE;
p->next=NULL;
p->maxMessageIndex=0;
strcpy(p->name,"003");
tail->next = p;
tail = p;
}
//输出账户列表信息
void print()
{
int i;
p = head;
i = 1;
while(p != NULL)
{
printf("第%d个账户的数据 账户名称:%s 余额:%.2f\n",i++,p->name,p->balance);
p = p->next;
}
}
//释放内存
void freeMemory()
{
p = head;
while(p != NULL)
{
head = p;
free(head);
p = p->next;
}
}
//开户
void openAccount()
{
char name[NAMELENGTH];
printf("请输入新开立的账户名称 : ");
fflush(stdin);
gets(name);
if(strlen(name)>0)
{
p = (struct Account *)malloc(LEN); /* 创建一个新账户 */
p->balance=DEFAULTBALANCE;
p->next=NULL;
strcpy(p->name,name);
tail->next=p;
tail = p;
}
}
//销户
void closeAccount()
{
char name[NAMELENGTH];
printf("请输入要销户的账户名称 : ");
fflush(stdin);
gets(name);
if(strlen(name)>0)
{
struct Account *pre;
p = head;
pre=head;
int find=0;
while(p != NULL)
{
if(strcmp(p->name,name)==0)
{
if(head == p)
head=p->next;
else if(tail==p)
{
pre->next=NULL;
tail = pre;
}
else
{
pre->next = p->next;
}
find=1;
break;
}
pre = p;
p = p->next;
}
if(find==0)
printf("没有此账户,无法完成销户!\n");
}
}
//存款
void deposit()
{
char name[NAMELENGTH];
printf("请输入要存款的账户名称 :");
fflush(stdin);
gets(name);
p = findAccountByName(name);
if(p!=NULL)
{
float savemoney;
printf("请输入要存款的金额 : ");
scanf("%f",&savemoney);
while(savemoney<=0)
{
printf("存款额不能小于等于零,请重新输入! ");
scanf("%f",&savemoney);
}
p->balance = p->balance+savemoney; /*存入账户金额*/
char message[MESSAGELENGTH];
sprintf(message,"账户%s成功存入%.2f元!\n",name,savemoney);
writeMessage(p,message); /*写入交易记录*/
}
else
printf("没有此账户!\n");
}
//取款
void withdraw()
{
char name[NAMELENGTH];
printf("请输入要取款的账户名称 :");
fflush(stdin);
gets(name);
p = findAccountByName(name);
if(p!=NULL)
{
float savemoney;
printf("请输入要取款的金额 : ");
fflush(stdin);
scanf("%f",&savemoney);
while(savemoney<=0 || savemoney> p->balance)
{
printf("存款额不能小于等于零或者大于余额,请重新输入! ");
scanf("%f",&savemoney);
}
p->balance = p->balance-savemoney; /*存入账户金额*/
char message[MESSAGELENGTH];
sprintf(message,"账户%s成功取出%.2f元!\n",name,savemoney);
writeMessage(p,message); /*写入交易记录*/
}
else
printf("没有此账户!\n");
}
//转账
void transfer()
{
char outname[NAMELENGTH];
char inname[NAMELENGTH];
struct Account *outAccount;
struct Account *inAccount;
printf("请输入要转出的账户名称 :");
fflush(stdin);
gets(outname);
outAccount = findAccountByName(outname);
if(outAccount!=NULL)
{
printf("请输入要转入的账户名称 :");
fflush(stdin);
gets(inname);
inAccount = findAccountByName(inname);
if(inAccount != NULL)
{
float money;
printf("请输入要转账的金额 : ");
fflush(stdin);
scanf("%f",&money);
while(money<=0 || money> outAccount->balance)
{
printf("转账金额不能小于等于零或者大于转出账户余额,请重新输入! ");
scanf("%f",&money);
}
outAccount->balance = outAccount->balance-money; /*减少转出账户金额*/
inAccount->balance = inAccount->balance+money; /*增加转入账户金额*/
char outmessage[MESSAGELENGTH];
sprintf(outmessage,"账户%s成功转出%.2f元!\n",outname,money);
writeMessage(outAccount,outmessage); /*写入转出交易记录*/
char inmessage[MESSAGELENGTH];
sprintf(inmessage,"账户%s成功转入%.2f元!\n",inname,money);
writeMessage(inAccount,inmessage); /*写入转出交易记录*/
}
}
else
printf("没有此转出账户!\n");
}
//查看账户最近五笔交易历史
void printMessage()
{
char name[NAMELENGTH];
printf("请输入要查看最近五笔交易历史的账户名称 :");
fflush(stdin);
gets(name);
p = findAccountByName(name);
if(p!=NULL)
{
int i=0;
int end = (p->maxMessageIndex)>=VIEWCOUNT?VIEWCOUNT:(p->maxMessageIndex);
for(i=0; imessage)[i]);
}
else
printf("没有此账户!\n");
}
九、心得体会
程序设计时,也不要怕遇到错误,在实际操作过程中犯的一些错误还会有意外的收获,感觉课程设计很有意思。在具体操作中对这学期所学的理论知识得到巩固,达到课程设计的基本目的,也发现自己的不足之出,在以后的上机中应更加注意,同时也体会到C++语言具有的语句简洁,使用灵活,执行效率高等特点。
这次课程设计让我有一个深刻的体会,那就是细节决定成败,编程最需要的是严谨,如何的严谨都不过分,往往检查了半天发现错误发生在某个括号,分号,引号,或者数据类型上。就像我在写代码时,写完后,忘了在大括号后加个分号,这一点小小的错误也耽误了我几十分钟,所以说细节很重要。
十、参考文献
[1] 陈维兴,林小茶:《C++面向对象程序设计教程》[M],清华大学出版社
[2] 王红梅,胡明,王涛:数据结构(c++版)学习辅导与实验指导(第2版)
[3] 王红梅,胡明,王涛:数据结构(c++版)(第2版)