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.部分截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐