其他分享
首页 > 其他分享> > 活期储蓄账目管理系统

活期储蓄账目管理系统

作者:互联网

活期储蓄账目管理系统

文章目录

数据结构课程设计

实验要求

本程序主要是模拟银行活期储蓄账目管理流程,要求实现以下功能:

  1. 开户:开户时需要记录储户信息(至少包括账号、姓名、余额),并设置余额为0;

  2. 销户,找到储户信息,若余额为0,则删除储户信息;

  3. 向某账户存款: 找到账户信息,修改账户余额(原来余额+存入金额),并且生成一条交易记录(至少包括交易时间、存取款标志、交易金额);

  4. 从某账户取款:找到账户信息,修改账户余额(原来余额一取出金额),并且生成一条交易记录(至少包括交易时间、存取款标志、交易金额);

  5. 显示所有账号信息;显示所有储户的信息(包括账号、姓名、余额等);

  6. 查询某账户余额:找到要查询的账户,显示该账户余额;

  7. 查询某账户交易记录:找到要查询的账户,显示该账户的全部交易记录;

要求:最终提交的测试结果,其数据必须合理规范,账户记录不得少于10条,每个账户不得少于2条交易记录。凡没有实现上面第7点的,不能及格

活期储蓄账目管理系统

1.内容与目的要求

本课题的目的是设计一个程序,模拟银行活期储蓄账目管理流程。具体内容如下:

(1) 开户:开户时需要记录储蓄账户的信息(包括账号、姓名、余额),并将余额设置为0;

(2) 销户:找到储蓄账户信息,如果余额为0,就删除该账户信息;

(3) 向某账户存款:找到该账户信息,修改余额(原金额+存入金额),并且生成一条交易记录(包括交易时间、存取款标志、交易金额);

(4) 从某账户取款:找到储蓄账户信息,修改余额,(原金额-取出金额),取出金额不能大于原金额,并且生成一条交易记录(包括交易时间、存取款标志、交易金额);

(5) 显示所有账户信息:显示所有储户的信息(包括账号、姓名、余额);

(6) 查询某账户余额:找到要查询的账户,显示该账户的余额;

(7) 查询某账户的交易记录:找到要查询的账户,显示该账户的全部交易记录。

本课题的实验要求如下:

(1) 要实现上述的7点,数据必须合理规范,账户记录不得少于10条,每个账户不得少于;两条交易记录;

(2) 附加要求:1.将现有的账户信息及交易信息存储至文件,程序运行时从文件中读入相关信息;在程序运行结束时,更新该文件中的信息。2.添加计算利息的功能。

2.总体思路与工程结构

2.1系统功能模块

根据功能分析,系统功能模块图如图1所示

在这里插入图片描述

图1 系统功能模块图

2.2工程结构

2.2.1工程总体结构

​ 建立名为“活期储蓄账目管理系统”的工程,整个实验将在其中进行。计划编写7个源文件和1个头文件,分别为 “account.cpp”, “getTime.cpp”, “inquire.cpp”, “ListDelete.cpp”, “ListInsert.cpp”, “main.cpp”, “record_file.cpp” 和 “headersfile.h”。图2体现了工程的模块结构。


在这里插入图片描述

​ 图2 工程结构

2.2.2函数之间的调用关系

​ 图3体现了各文件包含的函数,以及函数之间的调用关系。

在这里插入图片描述

图3 函数调用关系

2.2.3函数原型及功能

原型:int main()

功能:主调函数。其主要功能,一是输出与用户交互的文字界面提示;二是分别调用实现对应功能的函数;三是通过调用实现各个功能的函数得到返回值,将返回值通过交互方式反馈给用户。

原型:Status input_str()

功能:导入文件信息函数,将原先保存的储蓄账户信息导入到存储结构中,如果导入成功就输出“导入信息完毕!”, 并返回状态字“OK”。

原型:string getTime()

功能:实现获取当前时间,并以字符串的形式返回当前时间,时间格式为“年月日_时分秒”。

原型:int ListInsert()

功能:实现开户功能,通过将输入信息插入到顺序表中,并且给该账户一个账户,余额设为0,将交易记录设置为“NULL”,最后返回原账号+1,主要是为了将账号以递增的形式创建。

原型:int Search_Bin()

功能:通过账号查找该账户在有序表中的位置,其查找方法是折半查找;若找到就返回它在顺序表中的序号,找不到则返回-1用来表示不存在该元素。

原型:Status ListDelete()

功能:用于销户,即删除该账号对应的账户信息。删除成功返回状态字“OK”。

原型:float putinmoney()

功能:用于存钱操作,先获取当前时间用于记录用户的交易时间,并且将交易信息和交易时间存入链表中,最后返回存完钱后的总余额。

原型:float putoutmoney()

功能:用于取款操作,先是获取当前时间作为交易时间,并将交易信息和交易时间存入链表中,最后返回取完钱后的总余额。

原型:void information()

功能:用于显示所有账户信息,遍历输出顺序表中的所有信息,而且还会输出该表中存有的账户个数。

原型:void balance­_inquiry()

功能:用于余额查询,输出账号、姓名、余额。

原型:void record()

功能:用于查询账户的交易记录,遍历输出交易记录(交易时间、存取标志、交易金额)。

原型:Status output_str()

功能:更新文件中的信息,将所有的账户信息和交易记录保存到txt文件中。

3. 主要数据结构与关键问题和算法

3.1 数据结构

本项目采用顺序表和链表的方式进行数据的存储,需要存储的信息包括两个方面,一是账户信息,包括账号、姓名、余额;二是存取款记录, 包括存取时间、存取标志(标志是存款还是取款)、金额。两方面信息通过指针关联起来,为了方便使用,从数组下标1开始存放。 存储结构如图4所示

在这里插入图片描述

图4 存储结构

账户表的数据结构定义如下:


#define MAXSIZE 1000  //最多允许存放1000个账户信息 

typedef struct account //账户记录结点

{

  node_account *elem;   //存账户表基地址

  int length;    //存账户表的当前长度

}accountList;

accountList L;

L.elem = new node_account[MAXSIZE]; //创建一个空的账户表

L.length = 0;

账户结点的数据结构定义如下:

typedef struct node_account

{
  int ID; //账号

  string Name; //姓名

  float balance; //余额

  struct node_log *first_node_log; //指向本账户第一个存取记录结点

}node_account;

存取记录结点的数据结构定义如下:

typedef struct node_log//存取记录结点

{

string DataTime; //存取时间

char W_D;  //存取标志, "W"取款, "D"存款

float balance;  //存取金额

struct node_log *next; //指向下一个存取记录结点

}node_log, *p_node_log;

3.2 关键问题

 “开户”操作,预先设置变量tempnum,如果文件导入的账号为空,则设置初值为100000;非空就将导入的最后的一个账号的值赋给变量tempnum。插入一个新的账户时,就在变量tempnum基础上加1再赋值给账号,以保证账号始终按升序排列,使得新开账号一定大于过往账号。这样新的账户就可直接插在账户表尾部就是L.length位置。从而就不需要找到插入位置就可直接插入。

​   查找某账户时用到折半查找,账号是按升序排列的,用折半查找可以提高查找速度。而销户、存取款、查找某账户余额和查询某账户交易记录都用折半查找来查找对应的账号的账户信息。

  “销户”操作,通过输入账号找到该账户,若余额为0,则删除该账户,再将后面的账户前移。

  “存取款”操作,通过账号找到该账户,存取金额后,生成新的存取记录结点存放在本次存取款信息,用“头插法”将这个新结点插入到该“存取记录”链表的最前面,减少“定位查找”时间。

  “显示所有账户信息”操作,遍历输出顺序表的信息(账号、姓名和余额),最后统计所有账户的个数。

  “查询某账户的余额”操作,通过账号找到该账户,输出该账户的余额。

  “查询某账户交易记录”操作,也是先通过账号找到该账户,然后依次输出链表中存放的“交易记录”。

  文件的读写。程序运行时从文件中读入相关信息;程序结束时将现有的信息写入到文件中,更新相关信息。本项目用两个txt文本文件来存放信息,record.txt 是用来存放账户表信息,另一个record2.txt是用来存放交易记录信息。这两个文件是通过账号关联起来的;第一个文件存放账号、姓名和余额。第二个文件存放账号、交易时间、存取标志和交易金额。先导入第一个文件中账户表的信息,导入完成后再导入第二个文件中的交易记录信息,先读出第二个文件中的一行信息存入设定好的变量中,再通过存放账号的变量,查到该账户在刚刚导入的账户表中的位置,再将相应的信息写入到该账户的链表中。程序运行结束后,将账户表的信息先写入到第一个表中,写完后再将账号和对应的交易记录写入到第二个文件中,这样就覆盖掉原来的文件内容,更新文件信息。

3.3 算法说明

本实验主要涉及的算法比较简单,主要有折半查找、线性表的增删、头插法创建链表。

折半查找算法:

int Search_Bin(SSTable ST,KeyType key)

{ //通过账号找到该账户,在有序表ST中折半查找其关键字等于ID的数据元素。该元素在表中的位置,否则为0

  low=1, high=ST.length;     //置查找区间初值

  mid;

  while(low<=high) {

   	mid=(low+high) / 2;

   	if (key ==ST.elem[mid]. key) return mid;     //找到待查元素

   	else if (ID<ST.elem[mid]. key) high = mid -1;//继续在前一子表进行查找

   	else low =mid +1;           //继续在后一子表进行查找

  }

  return -1;                 //表中不存在待查元素

}

线性表的增删:

增加:

int ListInsert(accountList &L, int i, node_account e)

{

  if (L.length == MAXSIZE || L.length > MAXSIZE){

  	return ERROR; //当前存储空间已满

  }

  e.ID = tempnum + 1;

  e.balance = 0.00;

  cout<<"您的6位数帐号是:"<<e.ID<<endl;

  cout<<"您的姓名为:"<<e.Name<<endl;

  cout<<"您账户余额为"<<e.balance<<"元"<<endl;

  L.elem[i] = e;

  L.elem[i].first_node_log = NULL;

  ++L.length;

  return tempnum ++;

} 

删除:

Status ListDelete(accountList &L, int i)

{ //在顺序表L中删除第i个元素,i值是合法范围是1到L.length

  if ((i < 1) || (i > L.length))

     return ERROR; //i值不合法

  for (int j = i; j <= L.length; j++)

     L.elem[j ] = L.elem[j + 1]; //被删除元素之后的元素前移

  --L.length; //表长减1

  return OK;

} 


头插法创建链表:

float putinmoney(accountList &L, float money, int i )//存款

{

  p_node_log p;

  p = new node_log;

  p->W_D = 'D';  //存取标志, "W"取款, "D"存款

   p->balance = money;

   p->next = L.elem[i].first_node_log;

   L.elem[i].first_node_log = p;

   L.elem[i].balance += money;

   return L.elem[i].balance;

}

4. 测试

4.1 实验截图

这里选择了比较代表性的实验截图,力求囊括各种可能的情况。

截图1:

在这里插入图片描述

分析:本实验开始菜单,有提示说明相关操作,并导入保存的信息, 实验结果符合预期。

截图2:

在这里插入图片描述

分析:一共创建了11个账号,并且每个账号至少有两条交易记录,然后显示所有账号信息,实验结果符合预期。

截图3:

在这里插入图片描述

分析:进行销户操作,如果账号余额为空就销户,非空则保留,实验结果符合预期。

截图4:

在这里插入图片描述

分析:查询某账户交易记录,实验结果符合预期。

截图5:

在这里插入图片描述

分析:向某账户存取款操作,实验结果符合预期。

截图6:

在这里插入图片描述

分析:开户和销户操作,实验结果符合预期。

截图 7:

在这里插入图片描述

分析:退出程序,并自动保存信息,实验结果符合预期。

4.2 实验数据及其整理

​ 根据前面进行相关测试,将相关的信息已经存入相应的文件上,下面将记录在文件上的信息放在以下图4和图5中。

在这里插入图片描述

图4 实验数据记录1

在这里插入图片描述

图5 实验数据记录2

5. 实验代码(C++)

注: 环境是在 Windows 10 + CodeBlocks 20.03

在这里插入图片描述

Headers

#include <string>
#include <stdlib.h>
#include <fstream>
#define MAXSIZE 1000   //最多允许存放1000个账户信息
#define OVERFLOW -2     //状态字
#define ERROR 0         //状态字
#define OK 1           //状态字

typedef int Status; //Status 是函数返回值类型,其值是函数结果状态代码。
using namespace std;

typedef struct node_log//存取记录结点
{
   string DataTime; //存取时间
   char W_D;    //存取标志, "W"取款, "D"存款
   float balance;   //存取金额
   struct node_log *next;  //指向下一个存取记录结点
}node_log, *p_node_log;

typedef struct node_account
{
   int ID;  //账号
   string Name; //姓名
   float balance;  //余额
   struct node_log *first_node_log;  //指向本账户第一个存取记录结点
}node_account;


typedef struct account  //账户记录结点
{
    node_account *elem;      //存账户表基地址
    int length;       //存账户表的当前长度
}accountList;


Sources

//存取款账户功能
#include "headersfile.h"
extern string getTime();
float  putinmoney(accountList &L, float money, int i )//存款
{
    p_node_log p;
    p = new node_log;
    p->DataTime = getTime(); //存取时间
    p->W_D = 'D';    //存取标志, "W"取款, "D"存款
    p->balance = money;
	p->next = L.elem[i].first_node_log;
	L.elem[i].first_node_log = p;
	L.elem[i].balance += money;
	return L.elem[i].balance;

}

float  putoutmoney(accountList &L, float money, int i ) //取款
{


	if(L.elem[i].balance - money<0){
        cout<<"取款失败,取出金额大于余额";
	}else{
        p_node_log p;
        p = new node_log;
        p->DataTime=getTime(); //存取时间
        p->W_D = 'W';          //存取标志, "W"取款, "D"存款
        p->balance = money;
        p->next = L.elem[i].first_node_log;
        L.elem[i].first_node_log = p;
        L.elem[i].balance -= money;
        cout<<"取款成功! 取出金额为: "<<money;
	}

	return L.elem[i].balance;//返回计算后的余额

}

//获取时间函数
#include "headersfile.h"
string getTime()
{
    time_t t;
    time(&t);
    char tmp[64];
    strftime(tmp, sizeof(tmp), "%Y/%m/%d_%H:%M:%S", localtime(&t));

    return tmp;

}//获取当前时间函数

//查询所有账户信息、某账户余额和交易记录的功能
#include "headersfile.h"
void information(accountList L)
{
    int i;
    for (i = 1; i <= L.length; i++){
        cout <<"账号:"<<L.elem[i].ID << " 姓名:"<<L.elem[i].Name<<" 余额:"<<L.elem[i].balance<<" "<<endl;
    }//遍历输出账户信息
    cout<<"一共有"<<L.length<<"个账户."<<endl;
	cout << endl;
}//查找所有账户信息


void balance_inquiry(accountList L, int i)
{
    cout<<"您要查询的账号:"<<L.elem[i].ID<<" 姓名:"<<L.elem[i].Name<<" 余额:"<<L.elem[i].balance<<endl;
}//查找某账户余额

void record(accountList &L, int i)
{
    p_node_log p;
	p = L.elem[i].first_node_log;
	if (p == NULL){
        cout<<"该账户交易记录为空"<<endl;
	}else{
        while (p != NULL) {
		cout <<"交易时间:"<< p->DataTime <<"  存取标志(W为取款, D为存款):"<< p->W_D <<"  交易金额:"<< p->balance <<endl;
		p = p->next;
        }
	}

}//查询该账户的交易记录

//折半查找和删除顺序表中的某个元素
#include "headersfile.h"
extern string getTime();

int Search_Bin(accountList ST,int ID)
{  //通过账号找到该账户,在有序表ST中折半查找其关键字等于ID的数据元素。该元素在表中的位置,否则为0
   int low=1,high=ST.length;							//置查找区间初值
   int  mid;
   while(low<=high) {
	   mid=(low+high) / 2;
      if (ID==ST.elem[mid].ID)  return mid;      		//找到待查元素
      else if (ID<ST.elem[mid].ID)  high = mid -1;		//继续在前一子表进行查找
      else  low =mid +1;                       			//继续在后一子表进行查找
   }//while
   return -1;										//表中不存在待查元素
}//折半查找相关账户

Status ListDelete(accountList &L, int i)
{ //在顺序表L中删除第i个元素
    if ((i < 1) || (i > L.length))
		return ERROR; //i值不合法

	for (int j = i; j <= L.length; j++)
		L.elem[j ] = L.elem[j + 1]; //被删除元素之后的元素前移

	--L.length; //表长减1
	return OK;
}//删除账户

#include "headersfile.h"
int tempnum = 100000;//设置初始账号为100000
int ListInsert(accountList &L, int i, node_account e)
{

    if (L.length == MAXSIZE ||  L.length > MAXSIZE){
        return ERROR; //当前存储空间已满
    }

    e.ID = tempnum + 1;
    e.balance = 0.00;
    cout<<"您的6位数帐号是:"<<e.ID<<endl;
    cout<<"您的姓名为:"<<e.Name<<endl;
    cout<<"您账户余额为"<<e.balance<<"元"<<endl;
    L.elem[i] = e;
    L.elem[i].first_node_log = NULL;
    ++L.length;
    return tempnum ++;

}//开户时插入账户

#include "headersfile.h"

extern string getTime();
extern int ListInsert(accountList &L, int i, node_account e);
extern int Search_Bin(accountList ST,int ID);
extern Status ListDelete(accountList &L, int i);
extern float  putinmoney(accountList &L, float money, int i );
extern float  putoutmoney(accountList &L, float money, int i );
extern void information(accountList L);
extern void balance_inquiry(accountList L, int i);
extern void record(accountList &L, int i);
extern Status output_str( accountList &L);
extern Status input_str(accountList &L);

int main()
{
    int s, i, id, num;
    float d, money;
    accountList L;
    L.elem = new node_account[MAXSIZE]; //创建一个空的账户表
    L.length = 0;
    node_account e;
    string DataTime;

    input_str(L);//导入信息

    cout<<"|------------------------------------------------|"<<endl;
    cout<<"|            活期储蓄账目管理系统                |"<<endl;
    cout<<"|  1.开户                                        |"<<endl;
    cout<<"|  2.销户                                        |"<<endl;
    cout<<"|  3.向某账户存款                                |"<<endl;
    cout<<"|  4.从某账户取款                                |"<<endl;
    cout<<"|  5.显示所有账号信息                            |"<<endl;
    cout<<"|  6.查询某账户余额                              |"<<endl;
    cout<<"|  7.查询某账户交易记录                          |"<<endl;
    cout<<"|  0.退出程序(更新保存记录)                      |"<<endl;
    cout<<"|================================================|"<<endl;
    cout<<"输入选择项:";
    cin>>s;
    while(s!=0){
         switch(s){
            case 1:
                i = L.length + 1;
                cout<<"您选择的项目为:开户"<<endl;
                cout<<"请输入姓名: ";
                cin>>e.Name;
                ListInsert(L, i, e);
                cout<<"账户创建成功!您已完成开户操作,请记住您的账号"<<endl;
                DataTime = getTime();
                cout<<"当前时间为:"<<DataTime<<endl;
                cout<<endl;
                break;
            case 2:
                cout<<"您选择的项目为:销户"<<endl;
                cout<<"请输入要查找的账号:";
                cin>>id;
                i = Search_Bin(L, id);//用折半查找定位在数组中位置
                if(i == -1){
                    cout<<"您输入的账号不存在,请查正后再输"<<endl;
                }else if(L.elem[i].balance != 0){
                    cout<<"该账户余额不为0,不能销户!"<<endl;
                }else{
                    ListDelete(L, i);
                    cout<<"销户成功!"<<endl;
                }
                cout<<endl;
                break;

            case 3:
                cout<<"您选择的项目为:向某账户存款"<<endl;
                cout<<"请输入要存款的账号:";
                cin>>id;
                i = Search_Bin(L, id);//用折半查找定位在数组中位置
                if(i== -1){
                    cout<<"您输入的账号不存在,请查正后再输"<<endl;
                }else{
                    cout<<"请输入要存款的金额:";
                    cin>>money;
                    while(money<=0){
                        cout<<"输入金额错误, 存款金额必须大于0"<<endl;
                        cout<<"请重新输入:";
                        cin>>money;
                    }
                    d = putinmoney(L, money, i );
                    cout<<"存款成功! 存入金额为: "<<money<<"  您的余额为:"<<d<<endl;
                }
                DataTime = getTime();
                cout<<"当前时间为:"<<DataTime<<endl;
                cout<<endl;
                break;
            case 4:
                cout<<"您选择的项目为:从某账户取款"<<endl;
                cout<<"请输入要存款的账号:";
                cin>>id;
                i = Search_Bin(L, id);//用折半查找定位数组的下标
                if(i== -1){
                    cout<<"您输入的账号不存在,请查正后再输"<<endl;
                }else{
                    cout<<"请输入要取款的金额:";
                    cin>>money;
                    while(money<=0){
                        cout<<"输入金额错误, 取款金额必须大于0"<<endl;
                        cout<<"请重新输入:";
                        cin>>money;
                    }
                    d = putoutmoney(L, money, i );
                    cout<<"  您的余额为:"<<d<<endl;
                }
                DataTime = getTime();
                cout<<"当前时间为:"<<DataTime<<endl;
                break;

            case 5:
                cout<<"您选择的项目为:显示所有账号信息"<<endl;
                information(L);
                break;
            case 6:
                cout<<"您选择的项目为:查询某账户余额"<<endl;
                cout<<"请输入要查询的账号:";
                cin>>id;
                i = Search_Bin(L, id);//用折半查找定位数组的下标
                if(i== -1){
                    cout<<"您输入的账号不存在,请查正后再输"<<endl;
                }else{
                    balance_inquiry(L, i);
                    cout<<"账户余额查询成功!"<<endl;
                }
                break;
            case 7:
                cout<<"您选择的项目为:查询某账户交易记录  "<<endl;
                cout<<"请输入要查询的账号:";
                cin>>id;
                i = Search_Bin(L, id);//用折半查找定位数组的下标
                if(i== -1){
                    cout<<"您输入的账号不存在,请查正后再输"<<endl;
                }else{
                    record(L, i);
                    cout<<"账户交易记录查询成功!"<<endl;
                }
                break;
            default:
                output_str(L);//将信息写入文件中;更新保存信息
                break;
        }
        cout<<endl;
        cout<<"输入选择项:";
        cin>>s;
    }

    output_str(L);//将信息写入文件中;更新保存信息
    cout<<"已经退出程序!"<<endl;

    return 0;
}

//存储信息为txt文本,并输入和输出信息
#include "headersfile.h"
extern int Search_Bin(accountList ST,int ID);
extern int tempnum;//外部导入变量tempnum
string head_1,head_2, head_3, head_4, head_5, head_6;


Status input_str(accountList &L)//读入函数,将txt文件的信息读到线性表中
{
    int a;
    int i =  1;

    if (!L.elem)
        exit(OVERFLOW);
    fstream infile;
    fstream infile_2;

    infile.open("record.txt");
    if (!infile) {
        cout <<"错误!未找到文件!"<< endl;
        exit(ERROR);
    }//打开第一个文件

    infile_2.open("record2.txt");
    if (!infile_2) {
        cout <<"错误!未找到文件!"<< endl;
        exit(ERROR);
    }//打开第二个文件

    infile >> head_1 >> head_2 >> head_3;  //先将"record.txt"文件第一行的标题字符串导入变量中暂存

    while (!infile.eof()){
        infile >> L.elem[i].ID >> L.elem[i].Name >> L.elem[i].balance;

        L.elem[i].first_node_log = NULL;
        i++;
    } //从第一个文件的第二行开始导入账号信息,创建好顺序表,并且每个账户的记录先设为空


    L.length = i-2;//线性表的长度


    infile_2>>head_1>>head_4>>head_5>>head_6;  //先将"record2.txt"文件第一行的标题字符串导入变量中暂存

    while(!infile_2.eof()){

        p_node_log p;
        p = new node_log;
        infile_2>>a>>p->DataTime>>p->W_D>>p->balance;
        int num = Search_Bin(L, a); //通过折半查找, 找到对应账户的交易记录
        p->next = L.elem[num].first_node_log;
        L.elem[num].first_node_log = p;
        a = 0;//重置a的值为0

    }//从第二个文件的第二行开始导入"交易记录"信息

    cout <<"导入信息完毕!"<<endl;

    infile.close();
    infile_2.close(); //关闭infile所关联的磁盘文件
    if(L.length != 0){
        tempnum =  L.elem[i-2].ID;
    }//如果导入的信息非空, 就继续用导入信息账号的下一个账户,即在原来的账号上加1操作,保证账号是大小递增的.
    return OK;
}


Status output_str( accountList &L)//将信息保存到txt文件中, 同时也可以更新txt文件中的信息
{



    ofstream outfile("record.txt", ios::out);//定义文件流对象,创建或者覆盖掉record.txt文件; record存放用户信息
    ofstream outfile_2("record2.txt", ios::out);//record2文件存放交易信息记录


    if(!outfile){
        cerr <<"record.txt打开出错!"<<endl;
        exit(0);
    }

    if(!outfile_2){
        cerr <<"record2.txt打开出错!"<<endl;
        exit(0);
    }


    head_1 = "账号\t";
    head_2 = "姓名\t";
    head_3 = "余额\t";
    outfile<<head_1<<head_2<<head_3<<endl; //输出txt文件的存放信息对应的标题

    head_4 = "交易时间\t";
    head_5 = "存取标志\t";
    head_6 = "交易金额\t";

    outfile_2<<head_1<<head_4<<head_5<<head_6<<endl;//输出txt文件的存放信息对应的标题

    for(int i=1;i<=L.length; i++ ){
        outfile<<L.elem[i].ID<<"\t"<<L.elem[i].Name<<"\t"<<L.elem[i].balance<<"\t";

        outfile<<endl;
        p_node_log p;
        p = L.elem[i].first_node_log;

        while (p != NULL) {
                    outfile_2 <<L.elem[i].ID<<"\t"<< p->DataTime<<"\t"<< p->W_D <<"\t"<< p->balance<<"\t";
                    p = p->next;
                    outfile_2<<endl;
        }

    }

    outfile.close();
    outfile_2.close();
    cout<<"保存记录成功!"<<endl;
    return OK;

}

附录

源代码下载 : https://download.csdn.net/download/honorzoey/20373777?spm=1001.2014.3001.5501

总结 : 数据结构的课程设计——活期储蓄管理账户系统, 该系统设计相对简单, 主要以线性表和链表的方式进行设计, 运用的知识相对简单, 并不复杂, 其次就是读写文件的问题, 主要还是C++的语法基础.

注意: 以上内容仅供学习参考,不经本人允许请勿转载

标签:node,账号,log,活期储蓄,账户,int,管理系统,信息,账目
来源: https://blog.csdn.net/honorzoey/article/details/118933850