数据结构 活期储蓄账目管理(课程设计完整实验报告)

本文介绍了一个使用哈希表进行活期储蓄账目管理的课程设计,包括开户、销户、查询和存取款功能。哈希表采用BKDRHash算法散列,冲突处理使用链表。详细阐述了系统的设计思路、存储结构、算法设计以及功能实现。
摘要由CSDN通过智能技术生成

需求分析

1.1问题描述

随着社会发展,银行作为一个金融机构,在现代人们的生活中扮演着极其重要的角色。为生活节凑飞快的现代人提供快速、便捷、高效的理财服务。伴随着电脑技术的发展,各大银行的储蓄管理系统也随之出现在这一舞台上。人们的生活水平不断提高,会将一定的收入用于活期存储,因其储户开户、销户、存入、支出活动频繁的需求特点,本课程设计使用哈希表进行银行活期储蓄账目管理系统的模拟,实现基本的数据存储和处理操作。活期储蓄帐目管理,活期储蓄处理中,储户开户、销户、存入、支出活动频繁,系统设计要求:1)能比较迅速地找到储户的帐户,以实现存款、取款记账;2)能比较简单,迅速地实现插入和删除,以实现开户和销户的需要。

 

1.2模块组成

UI模块:伪界面,为了使界面美观设计的伪UI

主程序模块:初始化工作及功能选择和调用

开户模块:经过人机验证后能新建账户。

销户模块:查找到目的账户,再验证密码后对其销户。

查询模块:能够通过账号查找,迅速的找到要查找的账户,并显示账户余额。

存取模块:在迅速地查找到目的账户后,对账户余额进行修改。

测试模块:超级管理员能够模拟输入数据,并输出全部数据

 

1.3 功能要求

根据1.2模块组成该系统具有以下五个部分的功能:

开户功能:通过人机验证能够从键盘输入用户账户新建账户,并赋予初始开户金额0元。

销户功能:查找到目的账户,若余额为0则对其销户,否则提示先取钱再销户。

查询功能:能够通过账号查找,迅速的找到要查找的账户,并显示账户余额。

存取功能:迅速地查找到目的账户,验证密码后对账户进行存钱取钱操作。

测试功能:能够通过管理员预设密码进行,模拟输入,全部输出操作,以方便测试

2 概要设计

2.1 设计思路

  每一个用户看作一个基本单位,将系统抽象只包括账号和金额,密码、日期等不做存储和处理。为了便于后期维护与找错,使结构更加明了,采用数据结构型函数与功能实现型函数分离结构,存储数据结构是哈希表。

1 数据结构型函数和功能实现型函数

 

2.2 存储结构设计

  数据结构存储采用的是哈希表,账号存储为字符串,常用字符串哈希函数有 BKDRHash、APHash、DJBHash、JSHash、RSHash、SDBMHash、PJWHash、ELFHash等,本程序采用 BKDRHash对字符串进行散列,得到一个整数的hash值,根据得到的hash值选择一个槽位置,解决冲突方法为链接法,如图3哈希表插入过程。其中零号元素位用于存储哈希表主槽位容积,非所有元素容积,如图2哈希表存储模型。

 

2 哈希表存储模型

 

3 哈希表插入过程

 

2.3 算法设计说明

下面将从函数调用关系和对部分算法设计说明两个方面进行

 

2.3.1 函数调用关系

4 函数调用关系

 

2.3.2 算法设计说明

  哈希表初始化算法思想是,为哈希表主槽申请空间并置为0,第0个元素的值域用于存放哈希表主槽长度。

  判断哈希值所在哈希表槽位的思想是,将字符串用BKDR算法散列成一个整数哈希值,用该整数哈希值对长度取余加1一定落在哈希表主槽槽位数组内,其中加1是为了防止落在0位,因为0位用于存储长度。

  哈希表插入元素的思想是,结合图3,先求插入值的主槽,主槽存在该元素则直接更新值域,如果主槽不是该元素,则冲突处理,本程序用链接法,查看主槽冲突指针域,重复上述过程,即找主槽,然后遍历主槽冲突链,存在就更新,不存在就插入。

  哈希表删除元素的思想与插入元素的思想较为类似,将对应插入改成删除。

  哈希表搜索的思想是,先求要搜索值的哈希值,再利用判断哈希值所在哈希表槽位的算法找到该槽位,对比该槽位元素查看是否一致,一致则查找成功,不一样则看该槽位是否有冲突元素,有的话则对比该槽位元素是否一致,没有的话则不存在该元素,查找失败。

5 哈希表查找流程图

  返回全部数据元素个数的思想为,遍历主槽,如果主槽后面有冲突链则遍历冲突链。

  打印全部元素的思想与返回全部元素思想类似,先主槽,并查看是否有冲突链。

 

3 详细设计

3.1 结构体定义

根据2.2存储结构设计,哈希表结构体的定义为:

typedef struct _htItem

{

struct _htItem  *next;//冲突时下一个

char *key_string;//

uint fid;

int password;//卫星值

} htItem;

 

3.2 功能型函数

开户、销户等功能型函数较为简单,在此不做特别说明,利用随机数产生加减法进行人机验证,for循环可进行多次开户、销户操作,尽可能体现严谨思维。

 int funOpenAccount(htItem **ht)

 {

     //人机验证

    int n,m,num1,num2,x;

    long s;

    char c;

     srand((unsigned) time(NULL));//用时间做种子,每次产生的随机序列不同

     num1=rand()%10+1;

     num2=rand()%10+1;

     x=rand()%3;

     switch(x)

     {

        case 0:c='+';s=num1+num2;break;

        case 1:c='-';s=num1-num2;break;

        default:c='*';s

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值