1.前言
记录一下课程设计遇到的问题和解决办法,分享一下。由于做这个课程设计中,事情很多,还存在很多bug没来得及改,只测试了成功的情况,部分失败的情况也测试过,交互时输入错误信息有很多bug还没有改,因为很久没有用过C语言,用起来很生疏,并且代码格式不太规范,有很多重叠函数,没有优化代码。毕竟也是一次经验,留作保存一下。
课程设计做一套仿银行的ATM的交易系统。没有图形界面,在Linux命令窗口进行交互操作。
源代码已经上传,点击此处即可到达。
2.环境配置
2.1运行环境
开发工具:Sublime
虚拟机:VMware® Workstation 15 Pro
Ubuntu:18.04
2.2虚拟机上网
2.3共享文件夹设置
之前的课程设计是用的11版本的Ubuntu,轻巧,不会导致电脑运行内存爆满,但设置共享文件夹有点麻烦,需要用到网络共享,具体方法忘记如何操作了。Ubuntu18版本可以直接通过虚拟机设置共享文件夹,很方便,在Windows下写程序,保存到共享目录,Linux运行此文件即可。
具体操作步骤:打开虚拟机菜单->管理->虚拟机设置,弹出界面后选择选项界面—>点击共享文件夹,右上角中的文件夹共享选择总是启用—>点击添加,选择Windows下面的文件夹为共享文件夹即可。
共享文件夹会自动保存在Ubuntu项目的/mnt/hgfs/目录下面,我设置的共享文件名为share,所以保存的文件都在/mnt/hgfs/share/下面。
2.4数据库配置
用到的数据库是sqlite3
2.4.1安装数据库
sudo apt install sqlite3
sudo apt install libsqlite3-dev
当然这种安装方法需要虚拟机可以联网,如果虚拟机不能使用网络,可以去sqlite官网下载安装包,直接安装即可。
2.4.2测试是否安装成功
sqlite3 -version
输出版本信息则为安装成功
2.4.3创建数据库
当相应路径下面运行如下语句:
sqlite3 数据库名 // 创建数据库
例:
sqlite3 ./test.db
// 创建关系表,所有的SQL语句必须以分号结尾
CREATE TABLE 表名(列名 数据类型 约束条件, ...);
例:
create table t_test(id integer primary key, name text);
.table 查看数据库中的所有表名
.schema 查看表的创建语句(查看表的结构)
.quit 退出sqlite3的命令模式
其他的命令和MySQL语句一样
3. C语言访问sqlite3数据库
3.1. 用到的接口
sqlite3_open()//创建连接对象,打开一个新的或者已经存在的数据库连接,如果数据库存在,直接打开;如果不存在,则先创建在打开。
sqlite3_close()//销毁连接对象,断开连接
sqlite3_exec()//这是一个包装函数,用于执行字符串形式的SQL语句
sqlite3_exec函数说明:
sqlite3_exec(sqlite3*,const char *sql,int,
int(*callback)(void*,int,char**,char**),
void *,
char **errmsg
);
函数说明(数据库连接对象,表示要操作的数据库;
需要执行的SQL语句;
回调函数,即一个函数指针,必须是查询语句并且查到至少一条记录才会运行;
回调函数的第一个参数;
错误信息写在这里)
注:callback只有查询语句才需要,其它的SQL语句不需要此参数,写NULL即可
回调函数用来画select语句查询到的结果集,这个结果集可以理解为一个只读的关系表,由行和列组成。在程序中我们预测获取其中一行数据(获一条记录)。
获取到的一条记录包括他的表头与数据,所以回调函数的格式如下:
int callback(void *arg, int size, char **header);
参数说明:
(1).arg有外部传递就来的,即exec函数的第四个参数,通过不需要,可以不传递参数,
(2).size 表示一条记录有几个字段,从0开始计算
(3).values 字符串数组,表示这一行的值
(4).header 字符串数组,表示结果的表头
返回:
返回0表示正常,则继续局哦亲下一条记录
如果非0,则直接结束。
当不需要回调函数时,当然也不需要给这个回调函数提供参数了,所以exec函数的第四个参数也写NULL即可
3.2. 连接数据库
// 连接数据库
#include <stdio.h>
#include <sqlite3.h>
int main()
{
//创建一个连接对象
sqlite3 *db;
// 打卡数据库连接
int result = sqlite3_open("./info.db",&db);
// 如果打开失败
if (result != SQLITE_OK)
{
// 通过sqlite3_errmsg函数获取错误信息,并打印到标准错误
fprintf(stderr, "open database error%s\n", sqlite3_errmsg(db));
// 失败关闭连接
sqlite3_close(db);
// 从main函数返回,表示程序结束
return 1;
}
printf("open database success\n");
return 0;
}
3.3. Ubuntu终端命令
3.3.1 单个文件编译执行
虚拟机进入到共享文件下的C文件所在目录,然后运行
gcc c文件.c -o 输出文件名 -lsqlite3
./输出文件名
因为要操作数据库,使用在编译的时候需要在最后加上-lsqlite3
3.3.2 工程文件编译执行
|--工程管理用make命令:
|--make是一个项目管理工具,它能帮助我们自动检查文件的更新情况、自动进行编译。
|--make工具需要一个专内的配置文件,make 工作的时自动读取该配置文件中的信息,这个配置文件称为Makefile。
|--makefile可以很复杂,也可以很简单, 但核心规则是一样的 :
|--需要生成的目标文件
|--生成目标所需要的依赖文件
|--生成目标文件的编译规则
|--这三个核心内容的组织形式如下:
目标文件名:依赖文件列表
<Tab>编译指令
|--说明:
makefile中的目标一般可以分为两种:
真正的目标:指需要生成一个文件的这种目标,如可执行文件
make工具自动执行第一个真正的目标
伪目标:指不需要生成具体的文件,只是执行某种操作
伪目标需要在make时指定
例如:我们可以在工程的目录下新建一个makefile文件,内容为
bank: 0510_BankProject.c CustomerManagement.c TradeManagement.c
# $^代表上面所有的c文件,$@代表要生成的编译文件,也就是上面一行的bank
gcc $^ -o $@ -lsqlite3
clean:
rm -rf bank
#通过make文件就可以让Linux帮我们编译多个文件,省的我们在调试的时候需要多次编译或者很长的命令
#在当前工程目录下执行make目录就是生产输出文件,直接输出文件就可以运行
4. 系统顶层设计
以下是本套项目实现的功能点,基本上实现了,一些还没有完善,存在bug。
|--银行客户存取款系统概要说明
|--1.客户信息管理
|--开户
|--输入: 姓名、身份证、电话...
|--输出: 卡号、密码、开户日期、开户银行、余额...
|--销户
|--输入: 卡号、密码
|--输出: 姓名、余额...
|--查询用户信息
|--输入: 卡号、密码
|--输出: 用户信息...
|--2.交易信息管理
|--存款
|--输入:卡号、密码、金额
|--输出:提示
|--取款
|--转账
|--查询余额
|--查询交易记录
...
|--3.退出
5.系统实现
5.1数据库创建
在代码中会自动创建,所以不需要我们单独操作,以下是创建两张表,分别为用户信息表和银行卡信息表。
create table if not exists user(id varchar(18) primary key,name text not null,tel text not null, addr text);
// 创建外键时先在数据库中运行pragma foreign_keys=on;
CREATE TABLE if not exists bankcard(id integer primary key,cardpass integer not null,opendate date text default (date('now')),bankname text,balance real default 0, uid varchar(18) not null,foreign key(uid) references user(id));
|--客户信息表:身份证号码(PK) 姓名 电话 地址...
|--银行卡信息表: 卡号(PK) 密码 开户日期 开户行 余额 身份证号码(FK)...
6.工程目录详解
|--ATM
|--SQlFiles 数据库bank.db所在文件夹
|--CustomerControl.c 用户信息模块
|--CustomerControl.h 用户信息头文件
|--TradeControl.c 交易信息模块
|--TradeControl.h 交易信息头文件
|--data_process.c 数据库操作模块
|--data_process.h 数据库操作头文件
|--ui.c 界面模块
|--ui.h 界面头文件
|--main.c 主界面,主入口
|--Makefile.makefile 编译上面所有.c文件
|--bank_sys 编译后的二进制文件,用于运行系统
7.部分截图