在好久之前就做过这样一个任务,当时是直接创建一个存储数据的临时文件,实际应用肯定不是这样的,这一次我拿出刚刚学过的sqlite3来完成这样的任务。

主要的思路是在登陆的时候一次性将所有用户信息先读到内存中,在退出的时候再一次性将改变的地方写入。

需要用到sqlite3的C语言接口如下:
rc = sqlite3_open(“bank.db”, &db);
打开数据库
rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);
运行sql语句

main.cpp

/** @Descripttion: * @version: * @Author: Yueyang* @email: 1700695611@qq.com* @Date: 2021-03-16 21:52:15* @LastEditors: Yueyang* @LastEditTime: 2021-03-17 12:39:23*/
#include <iostream>
#include <string>
#include "Bank.h"
using namespace std;int main()
{cout<<"+-------------------------------+"<<endl;cout<<"         欢迎光临天地银行!"<<endl;cout<<"+-------------------------------+"<<endl;Bank *bank=new Bank();bank->work();delete bank;return 0;
}

Bank.h

/** @Descripttion: 银行储蓄系统* @version: V 1.0* @Author: Yueyang* @email: 1700695611@qq.com* @Date: 2021-03-16 21:50:20* @LastEditors: Yueyang* @LastEditTime: 2021-03-17 12:31:40*/
#ifndef BANK_H
#define BANK_H#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>
#include <ctype.h>
#include <sqlite3.h>
#define MAXNUM 2000
using namespace std;class Check
{public:string checkid;string username;string userid;string userplace;string phone;string passkey;double money;double rate;int state;friend class BANK;
public:void Set(string,string,string,string,string,string,double);string getpass();};class Bank
{private:int realcount;friend class Check;string inputpass();
public:Bank();~Bank();sqlite3 *db;void work();int menushow();void establish();void Delete();void save();void withdraw();void find();void transfer();void reportloss();void cancelloss();void changepass();bool checkkey(string key,Check *u);
};#endif // !BANK_H

Bank.cpp

/** @Descripttion: * @version: * @Author: Yueyang* @email: 1700695611@qq.com* @Date: 2021-03-16 21:50:10* @LastEditors: Yueyang* @LastEditTime: 2021-03-17 12:49:01*/
#include "Bank.h"
#define   RATE 0.043//银行当前利率
#include <sstream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sqlite3.h>int callbacktimes=0;//回调次数
Check *check[MAXNUM];//所有账户
/*** create table userInfomation(ID      TEXT(20) PRIMARY KEY NOT NULL,NAME    TEXT(10),STACARD TEXT(30),ADDRESS TEXT(20),PHONE   TEXT(15),CODE    TEXT(20),MONEY   DOUBLE);INSERT INTO userInfomation (ID,NAME,STACARD,ADDRESS,PHONE,CODE,MONEY)
VALUES('0','杨越','321023200004210416','中国','18852566109','197696',1000);INSERT INTO userInfomation (ID,NAME,STACARD,ADDRESS,PHONE,CODE,MONEY)
VALUES('1','杨越','321023200004210416','中国','18852566109','197696',1000);
*/
static int callback(void *data, int argc, char **argv, char **azColName){int i;for(i=0; i<argc; i++){check[callbacktimes]=new Check;check[callbacktimes]->Set(argv[0],argv[1],argv[2],argv[3],argv[4],argv[5],atof(argv[6]));i++;}callbacktimes++;return 0;
}Bank::Bank()
{char *zErrMsg = 0;int rc;char *sql;const char* data = "";int i=0;double Money,Rate,Key;string id,usename,usid,place,phone;rc = sqlite3_open("bank.db", &db);callbacktimes=0;/* Create SQL statement */sql = (char*)"SELECT * from userInfomation";/* Execute SQL statement */rc = sqlite3_exec(db, sql, callback, (void*)data, &zErrMsg);realcount=callbacktimes;
}//功能:用析构函数,在退出系统时,将数据保存到文件中
/*** UPDATE userInfomation Set MONEY=10 WHERE ID=1*
INSERT INTO userInfomation (ID,NAME,STACARD,ADDRESS,PHONE,CODE,MONEY)
VALUES('1','杨越','321023200004210416','中国','18852566109','197696',1000);*/
Bank::~Bank()
{int i;char *pErrMsg = 0;char sql[3000];if (realcount<=callbacktimes){//没有新增用户cout<<1;for(i=0; i<realcount; i++){if(check[i]->state!=0){cout<<2;sprintf(sql, (char*)"UPDATE userInfomation Set MONEY=%f WHERE ID='%d';",check[i]->money, i);sqlite3_exec(db, sql, NULL, 0, &pErrMsg);}}}else if(realcount>callbacktimes){for(i=callbacktimes;i<realcount;i++){sprintf(sql,(char*)"INSERT INTO userInfomation (ID,NAME,STACARD,ADDRESS,PHONE,CODE,MONEY) VALUES('%s','%s','%s','%s','%s','%s',%f)",check[i]->checkid.c_str(),check[i]->username.c_str(),check[i]->userid.c_str(),check[i]->userplace.c_str(),check[i]->phone.c_str(),check[i]->passkey.c_str(),check[i]->money);sqlite3_exec(db, sql, NULL, 0, &pErrMsg);  }}
}int Bank::menushow()
{int i;cout<<endl;cout<<"+--------------------------------------+"<<endl;cout<<"+ 1 开户         2 销户         3 存款 +"<<endl;cout<<"+ 4 取款         5 查询         6 转账 +"<<endl;cout<<"+ 7 挂失         8 解挂         9 改密 +"<<endl;cout<<"+                               0 退出 +"<<endl;cout<<"+--------------------------------------+"<<endl;cout<<"请输入操作指令:";while(1){cin>>i;if(i>=0&&i<=9)break;elsecout<<"输入错误,请重新选择:";}return i;
}//功能:办理业务
void Bank::work()
{int choose;do{choose=menushow();switch(choose){case 0:break;//退出case 1:establish();//开户break;case 2:Delete();//销户break;case 3:save();//存款break;case 4:withdraw();//取款break;case 5:find();//查询break;case 6:transfer();//转账break;case 7:reportloss();//挂失break;case 8:cancelloss();//解挂break;case 9:changepass();//改密break;break;}}while(choose);
}void Bank::establish()
{if (realcount==MAXNUM){cout<<"非常抱歉,银行储户已达上限"<<endl;return;}double Money,Rate;string id,usename,usid,place,phone;string Key0,Key1;cout<<"请输入姓名:";cin>>usename;cout<<endl;cout<<"请输入身份证号码:";cin>>usid;cout<<endl;cout<<"请输入居住地址:";cin>>place;cout<<endl;cout<<"请输入电话号码:";cin>>phone;cout<<endl;
ERR:cout<<"请输入密码:";Key0=inputpass();cout<<endl;cout<<"请确认密码:" ;    Key1=inputpass();cout<<endl;if(Key0!=Key1){goto ERR;}check[realcount]=new Check;//动态数组开辟空间check[realcount]->Set(std::to_string(realcount),usename,usid,place,phone, Key0,0.0f);cout<<"开户成功!"<<endl;cout<<"+------------------------------------------------------------+"<<endl;cout<<"+                           开户信息                         +"<<endl;cout<<"          姓名: " <<check[realcount]->username                 <<endl;cout<<"          单号: " <<check[realcount]->checkid                 <<endl;cout<<"          密码: " <<"******"                                 <<endl;cout<<"          地址: " <<check[realcount]->userplace                 <<endl;    cout<<"          电话: " <<check[realcount]->phone                 <<endl;cout<<"+-------------------------------------------------------------+"<<endl;realcount++;
}void Bank::Delete()
{int id;string Key;char *pErrMsg = 0;char sql[3000];cout<<"请输入销户账号:";cin>>id;cout<<endl;if(id<0||id>=realcount){cout<<"该账户不存在!"<<endl;return;}if(check[id]->state==0){cout<<"该账户已销户!"<<endl;return;}cout<<"请输入密码:";Key=inputpass();cout<<endl;if(checkkey(Key,check[id])){check[id]->state=0;cout<<"销户成功!请取款"<<check[id]->money<<"元."<<endl;check[id]->money=0;sprintf(sql,"delete from userInfomation where ID='%d';",id);sqlite3_exec(db, sql, NULL, 0, &pErrMsg);  }else{cout<<"操作取消!"<<endl;}
}void Bank::find()
{int num;string key;string sta[3]= {"注销","正常","挂失"};cout<<"请输入账号:";cin>>num;if(num<0||num>=realcount){cout<<"该账户不存在!"<<endl;return;}cout<<"姓名:"<<check[num]->username<<endl;cout<<"请输入密码:";key=inputpass();if(checkkey(key,check[num])){cout<<"身份证号:"<<check[num]->userid<<endl;cout<<"家庭住址:"<<check[num]->userplace<<endl;cout<<"余额:"<<check[num]->money<<endl;cout<<"状态:"<<sta[check[num]->state]<<endl;}elsecout<<"操作失败!"<<endl;}//功能:存款
//说明:增加账户金额,需要保证账户存在,且处于正常状态
void Bank::save()
{int num;double m;cout<<"请输入账号:";cin>>num;if(num<0||num>=realcount){cout<<"该账户不存在!"<<endl;return;}if(check[num]->state!=1){cout<<"该账户已经处于"<<(check[num]->state==0?"销户":"挂失")<<"状态,无法操作!"<<endl;return ;}cout<<"姓名:"<<check[num]->username<<endl;cout<<"请输入存款金额:";cin>>m;check[num]->money+=m;cout<<"存款成功!"<<endl;cout<<"余额:"<<check[num]->money<<endl;
}//功能:取款
//说明:减少账户金额。需要保证账户存在,且处于正常状态,另外,余额要足够取
void Bank::withdraw()
{int num;string key;double m;cout<<"请输入账号:";cin>>num;if(num<0||num>=realcount){cout<<"该账户不存在!"<<endl;return;}if(check[num]->state!=1){cout<<"该账户已经处于"<<(check[num]->state==0?"销户":"挂失")<<"状态,无法操作!"<<endl;return ;}cout<<"姓名:"<<check[num]->username<<endl;cout<<"请输入密码:";key=inputpass();if(checkkey(key,check[num])){cout<<"余额:"<<check[num]->money<<endl;cout<<"请输入取款金额:";cin>>m;if(m<=check[num]->money){check[num]->money-=m;cout<<"取款成功!"<<endl;cout<<"余额:"<<check[num]->money<<endl;}elsecout<<"余额不足!"<<endl;}elsecout<<"操作取消!"<<endl;
}//功能:转账
//说明:需要保证两个账户都存在,且处于正常状态,另外,转出账户的余额要足够
void Bank::transfer()
{int in,out;string key;double m;cout<<"输入转出账号:";cin>>out;if(out<0||out>=realcount){cout<<"该账户不存在!"<<endl;return;}if(check[out]->state!=1){cout<<"该账户已经处于"<<(check[out]->state==0?"销户":"挂失")<<"状态,无法操作!"<<endl;return ;}cout<<"姓名:"<<check[out]->username<<endl;cout<<"请输入密码:";key=inputpass();if(checkkey(key,check[out])){cout<<"余额:"<<check[out]->money<<endl;cout<<"请输入转账金额:";cin>>m;if(m<=check[out]->money){cout<<"输入转入帐号:";cin>>in;if(in<0||in>=realcount){cout<<"该账户不存在!"<<endl;return;}if(check[in]->state!=1){cout<<"该账户已经处于"<<(check[in]->state==0?"销户":"挂失")<<"状态,无法操作!"<<endl;return ;}check[out]->money-=m;check[in]->money+=m;cout<<"转账成功!"<<endl;cout<<"余额:"<<check[out]->money<<endl;}elsecout<<"余额不足!"<<endl;}elsecout<<"操作取消!"<<endl;
}//功能:挂失
//说明:将用户账户状态改为挂失
void Bank::reportloss()
{int num;string key;cout<<"请输入账号:";cin>>num;if(num<0||num>=realcount){cout<<"该账户不存在!"<<endl;return;}if(check[num]->state!=1){cout<<"该账户已经处于"<<(check[num]->state==0?"销户":"挂失")<<"状态,无法操作!"<<endl;return ;}cout<<"姓名:"<<check[num]->username<<endl;cout<<"请输入密码:";key=inputpass();if(checkkey(key,check[num])){check[num]->state=2;cout<<"挂失成功!"<<endl;}elsecout<<"操作取消!"<<endl;
}//功能:解挂
//说明:将用户账户状态改为正常
void Bank::cancelloss()
{int num;string key;cout<<"请输入账号:";cin>>num;if(num<0||num>=realcount){cout<<"该账户不存在!"<<endl;return;}if(check[num]->state!=2){cout<<"该账户已经处于"<<(check[num]->state==0?"销户状态,无法操作!":"正常状态,无需解挂。")<<endl;return ;}cout<<"姓名:"<<check[num]->username<<endl;cout<<"请输入密码:";key=inputpass();if(checkkey(key,check[num])){check[num]->state=1;cout<<"解挂成功!"<<endl;}elsecout<<"操作取消!"<<endl;
}//功能:改密
//说明:更改账户密码,需在账户正常的状态下进行
void Bank::changepass()
{int num;string  key,key1,key2;cout<<"请输入账号:";cin>>num;if(num<0||num>=realcount){cout<<"该账户不存在!"<<endl;return;}if(check[num]->state!=1){cout<<"该账户已经处于"<<(check[num]->state==0?"销户":"挂失")<<"状态,无法操作!"<<endl;return ;}cout<<"姓名:"<<check[num]->username<<endl;cout<<"请输入密码:";key=inputpass();if(checkkey(key,check[num])){cout<<"输入新密码:";key1=inputpass();cout<<"确认密码:";key2=inputpass();if(key1==key2){check[num]->passkey=key1;cout<<"修改密码成功!"<<endl;}elsecout<<"2次密码不一致,修改失败!"<<endl;}elsecout<<"操作取消!"<<endl;
}void itoa(int i, char *string)
{int power = 0, j = 0;j = i;for (power = 1; j>10; j /= 10)power *= 10;for (; power>0; power /= 10){*string++ = '0' + i / power;i %= power;}*string = '\0';printf("%s\n", string);
}int atoi(char *str)
{if (!str)return -1;bool bMinus = false;int result = 0;if (('0'>*str || *str>'9') && (*str == '+' || *str == '-')){if (*str == '-')bMinus = true;*str++;}while (*str != '\0'){if ('0'> *str || *str>'9')break;elseresult = result * 10 + (*str++ - '0');}if (*str != '\0')//no-normal end  return -2;return bMinus ? -result : result;
}string Bank::inputpass()
{cout<<"密码格式为六位数字!!!"<<endl;int pass=0,i;char ch;while(ch!='p'&&ch!='P'){cout<<"点击p确认"<<endl;cin>>ch;}
ERR:printf("请输入密码------\b\b\b\b\b\b");for(i=0;i<6;i++){ch=getchar();if(ch>='0'&&ch<='9'){pass=pass*10+(ch-'0');}else{pass=0;break;}}if(pass==0){printf("请输入密码------\b\b\b\b\b\b");goto ERR;}cout<<endl;return to_string(pass);
}
//功能:验证密码输入是否正确
bool Bank::checkkey(string key,Check *u)
{string temp=u->getpass();if(key==temp)return true;elsecout<<"密码错误!"<<endl;return false;
}string Check::getpass()
{return passkey;
}void Check::Set(string id,string usename,string usid,string place,string pon,string key,double m)
{checkid=id;username=usename;userid=usid;userplace=place;phone=pon;passkey=key;state=1;money=m;rate=RATE;
}

Makefile

CXX = g++
INC = -I./include
CXXFLAGS = -l sqlite3 -g TARGET=./mainSRC=$(wildcard ./*.cpp)OBJ=$(patsubst %.cpp, %.o, $(SRC))$(TARGET): $(OBJ)$(CXX)  -o $@ $^ $(CXXFLAGS)$(OBJ):%.o: %.cpp$(CXX)  $(INC) -o $@ -c $< $(CXXFLAGS)clean:rm -f *.orm -f $(TARGET)

【SQLITE3】基于SQLITE3的银行储蓄管理系统相关推荐

  1. C#——Windows银行储蓄管理系统

    在银行储蓄管理系统中,普通帐户(Account)和VIP账号(VipAccount)都包含账户(CreditNo),余额(Balance)等基本数据信息,都提供创建帐户,存款(Withdtaw),取款 ...

  2. 银行储蓄管理系统 课程设计

    一.问题描述 随着经济的加速发展,我国的银行业将面临更加激烈的同业竞争,如何提供更多的金融产品和更优质的服务,如何吸引更多的客户,如何利用计算机技术加强银行账户信息管理,提高银行的工作效率和业务竟争能 ...

  3. QT银行储蓄管理系统

    QT银行储蓄管理系统 银行储蓄管理系统 该系统需创建和管理以下信息: 1.储户信息:帐号.姓名.密码.地址.储种(定 期 1 年.3 年.5 年).利息(1 年到期利率 1.98%:3 年到期利率 2 ...

  4. 银行账户管理系统c语言链表,课程设计银行储蓄管理系统Word版

    <课程设计银行储蓄管理系统Word版>由会员分享,可在线阅读,更多相关<课程设计银行储蓄管理系统Word版(22页珍藏版)>请在人人文库网上搜索. 1.传播优秀Word版文档 ...

  5. 银行储蓄管理系统的设计与实现

    摘要 随着金融业的发展,手工操作和旧的管理模式已经严重制约了质量和效率的问题,用计算机管理来代替手工管理是非常必要的.本文主要介绍了银行管理系统的方案论证.结构特性设计及行为特性设计的实现过程,详细论 ...

  6. 基于java+springmvc+mysql的银行储蓄管理系统

    系统介绍: 系统包括用户登录注册,存款,取款,查询,交易记录,个人信息,修改信息,注销,挂失,退出登录等功能 功能演示:

  7. 基于Java的银行账户管理系统

    一.项目介绍 基于Java GUI的银行账户信息管理系统,可直接启动演示.包含账户查询.开户.销户.存款.取款.账户统计等功能.适合作为课程设计.大作业.毕业设计项目. 二.技术介绍: Java;Sp ...

  8. 基于java的银行账目管理系统

    本系统主要完成对银行账目管理的帐户管理(开户,销户,办卡,挂失等).取款机管理.用户查询.查询统计等.系统有完整的后台添加.管理.密码修改功能.系统采用JSP为编程语言,mysql数据库,Myecli ...

  9. 基于java的银行账目管理系统-计算机毕业设计

    项目介绍 本系统主要完成对银行账目管理的帐户管理(开户,销户,办卡,挂失等).取款机管理.用户查询.查询统计等.系统有完整的后台添加.管理.密码修改功能.系统采用JSP为编程语言,mysql数据库,M ...

  10. 基于SSH网上银行综合管理系统

    内容简述:该系统体系结构包括:视图层,应用服务层,数据处理层.系统功能包括:账户管理,转账管理,付款管理,系统管理,统计查询. 本课题的目的是使银行账目管理清晰化,透明化,便于操作,易于管理,实现功能 ...

最新文章

  1. ListView中CheckBox使用问题
  2. shell编程中for/while/util/case/select/break/continue
  3. Python3实现邮箱发送
  4. Python 爬虫 大量数据清洗 ---- sql语句优化
  5. Direct2D的使用
  6. 万能素材库_自媒体运营必备3款黑科技工具,一个万能素材网站,你都在用吗?...
  7. node.js——麻将算法(四)胡牌算法的一些优化处理方案(无赖子版)
  8. 终于可以和 QQ 彻底说再见了!
  9. infortrend ESDS RAID6故障后的数据恢复方案
  10. stm32f10x 安装包_Keil5 Pack Installer下载_Keil5 Pack 离线安装包下载 2.2.0 官方正式版_当载软件站...
  11. oracle odac 客户端 区别,ODAC使用指南 (一)ODAC常见问题集
  12. 如何在苹果手机上进行自动化测试!!!!!可以尝试配置一下
  13. kernel 打印时间戳
  14. 学生搭配问题数据结构报告c语言,数据结构课程设计_学生搭配问题.doc
  15. 在macOS上用supervisor构建稳定的SSH转发
  16. vue h5点击跳转主流手机应用商店app下载页
  17. redis appendonly.aof文件损坏修复方法
  18. NandFlash 驱动分析与基础功能实现
  19. C++ Pointer指针
  20. 外贸群发软件不好用,邮件群发很苦恼

热门文章

  1. 攻防世界-MISC-奇怪的TTL字符
  2. 最强自动化测试框架Playwright(13)- headed模式运行
  3. 深入了解Spring Boot:快速构建Java应用程序的利器
  4. HDFS源码分析心跳汇报之数据块汇报
  5. 2021年小红书KOL营销报告
  6. 融资租赁业务系统建设思路
  7. 华为防火墙-5-NAT
  8. 关于CAD-GIS总体整合的三个提示
  9. 嵌入式 STM32 步进电机驱动,干货满满,建议收藏
  10. Python 爬虫十六式 - 第五式:BeautifulSoup-美味的汤