《数据结构课程设计》 活期储蓄管理系统 实验报告


《数据结构课程设计》

题目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张图片


(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"); 

六、   系统功能界面

《数据结构课程设计》 活期储蓄管理系统 实验报告_第2张图片

A开户功能界面

《数据结构课程设计》 活期储蓄管理系统 实验报告_第3张图片

B 销户功能界面

《数据结构课程设计》 活期储蓄管理系统 实验报告_第4张图片

C 存款功能界面

《数据结构课程设计》 活期储蓄管理系统 实验报告_第5张图片

D 取款界面

《数据结构课程设计》 活期储蓄管理系统 实验报告_第6张图片

E 查看所有账户界面

《数据结构课程设计》 活期储蓄管理系统 实验报告_第7张图片

F 最近五笔交易界面

《数据结构课程设计》 活期储蓄管理系统 实验报告_第8张图片


八、源代码:

#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版)

                                                                                                                                                       

 

你可能感兴趣的:(《数据结构课程设计》 活期储蓄管理系统 实验报告)