sqlite3+FILE实现停车场

car.h

#ifndef _CAR_H_
#define _CAR_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sqlite3.h>
#include <errno.h>

#define MAX_COUNT 3 //宏定义停车场车位

void welcome(); //欢迎界面
void menu(FILE *fp); //菜单界面
int create_table(sqlite3 *pdb); //创建汽车信息表
void itoa(int number, char *num); //将整数转换成字符
int is_max(FILE *fp); //判断停车场是否满了
int insert_record(FILE *fp, sqlite3 *pdb); //插入数据(车辆进入)
void display(char **pResult, int rowc, int colc); //打印结果
void mypause(); //暂停
int lookinfo(sqlite3 *pdb); //查看停入车辆信息
int findinfo(sqlite3 *pdb); //查找停入的车辆
int deleteinfo(FILE * fp, sqlite3 *pdb); //删除(车辆离开)
void exit_sys(FILE *fp, sqlite3 *pdb); //退出系统


#endif

car.c

#include "car.h"

void welcome() //欢迎界面
{
	system("clear");
	printf("-----------------------------------------------------\n");
	printf("\t\t欢迎使用BK停车场系统\n");
	printf("\t\t正在加载......\n");
	printf("-----------------------------------------------------\n");
}

void menu(FILE *fp) //菜单界面
{
	int carc, parkc;
	char buff[10];
	fseek(fp, 0, SEEK_SET);
	fread(buff, 10, 1, fp);
	carc = atoi(buff);
	parkc = MAX_COUNT - carc;
	sleep(1);
	system("clear");
	printf("********************************\n");
	printf("当前停入车辆:%d\n", carc);
	printf("停车场剩余车位:%d\n", parkc);
	printf("********************************\n");
	printf("\t1.***车辆进入录入***\n");
	printf("\t2.***查看所有车辆***\n");
	printf("\t3.***查找车辆信息***\n");
	printf("\t4.***车辆离开录入***\n");
	printf("\t5.****退出系统****\n");
	printf("********************************\n");
}

int create_table(sqlite3 *pdb) //创建汽车信息表
{
	char *sql = NULL;
	char *errmsg = NULL;
	
	sql = "create table if not exists car(id text not null primary key, date_in text, date_out text default('待离开'), time text default('待计算'), pay text default('待计算'));";
	
	if (SQLITE_OK != sqlite3_exec(pdb, sql, NULL, NULL, &errmsg))
	{
		printf("Create table fail: %s\n", sqlite3_errmsg(pdb));
		
		return -1;
	}
	
	return SQLITE_OK;
}

void itoa(int number, char *num) //将整数转换成字符
{
	int i, length = 1, n;
	n = number;
	while ((n / 10) != 0 )
	{
		length++;
		n = n / 10;
	}
	
	n = number;
	for (i = length - 1; i >= 0; i--)
	{
		num[i] = n % 10 + '0';
		n = n / 10;
	}
}

int is_max(FILE *fp) //判断停车场是否满了
{
	int carc;
	char buff[10];
	fseek(fp, 0, SEEK_SET);
	fread(buff, 10, 1, fp);
	carc = atoi(buff);
	if (MAX_COUNT == carc)
	{
		printf("停车场已满,请先等待车辆离开!\n");
		printf("返回主菜单中...\n");
		sleep(1);
		
		return -1;
	}
	
	return SQLITE_OK;
}

int insert_record(FILE *fp, sqlite3 *pdb) //插入数据(车辆进入)
{
	system("clear");
	if (SQLITE_OK != is_max(fp))
	{
		return SQLITE_OK;
	}
	
	char sql[100];
	char *errmsg = NULL;
	char id[10];
	printf("请输入车牌号:\n");
	scanf("%s", id);
	sprintf(sql, "insert into car (id, date_in) values ('%s', datetime('now','localtime'));", id);
	
	if (SQLITE_OK != sqlite3_exec(pdb, sql, NULL, NULL, &errmsg))
	{
		printf("Insert values fail: %s", sqlite3_errmsg(pdb));
		
		return -1;
	}
	
	int carc;
	char buff[10];
	fseek(fp, 0, SEEK_SET);
	fread(buff, 10, 1, fp);
	carc = atoi(buff);
	carc++;
	itoa(carc, buff); //将整数转换成字符
	fseek(fp, 0, SEEK_SET);
	fwrite(buff, 10, 1, fp);
	printf("车辆进入成功!\n");
	
	return SQLITE_OK;
}

void display(char **pResult, int rowc, int colc) //打印结果
{
	int i;
	for (i = 0; i < (rowc + 1) * colc; i++)
		{
			printf("%-25s", pResult[i]);
			if (((i + 1) % colc) == 0)
			{
				putchar(10);
			}
		}
}

void mypause() //暂停
{
	char mark;
	printf("按任意键输入回车后返回主菜单\n");
	scanf(" %c", &mark);
	system("clear");
	printf("返回主菜单中...\n");
}

int lookinfo(sqlite3 *pdb) //查看停入车辆信息
{
	system("clear");
	char *sql = NULL;
	char **pResult = NULL;
	int colc, rowc;
	char *errmsg = NULL;
	
	sql = "select * from car;";
	if (SQLITE_OK != sqlite3_get_table(pdb, sql, &pResult, &rowc, &colc, &errmsg))
	{
		printf("Select fail: %s", sqlite3_errmsg(pdb));
		
		return -1;
	}
	
	if (0 == rowc)
	{
		printf("停车场为空!\n");
	}
	else
	{
		display(pResult, rowc, colc); //打印结果	
		mypause();
	}
	sqlite3_free_table(pResult);
	
	return SQLITE_OK;
}

int findinfo(sqlite3 *pdb) //查找停入的车辆
{
	system("clear");
	char id[10];
	char sql[100];
	char **pResult = NULL;
	int colc, rowc;
	char *errmsg = NULL;
	
	printf("请输入要查询的车牌号:\n");
	scanf("%s", id);
	sprintf(sql, "select * from car where id = '%s';", id);
	if (SQLITE_OK != sqlite3_get_table(pdb, sql, &pResult, &rowc, &colc, &errmsg))
	{
		printf("Select fail: %s", sqlite3_errmsg(pdb));
		
		return -1;
	}
	
	system("clear");
	if (0 == rowc)
	{
		printf("此车未进入本停车场!\n");
	}
	else
	{
		display(pResult, rowc, colc); //打印结果	
		mypause();
	}
	sqlite3_free_table(pResult);
	
	return SQLITE_OK;
}

int deleteinfo(FILE * fp, sqlite3 *pdb) //删除(车辆离开)
{
	system("clear");
	char id[10];
	printf("请输入要离开的车的车牌号:\n");
	scanf("%s", id);
	system("clear");
	
	char sql[100];
	char **pResult = NULL;
	int colc, rowc;
	char *errmsg = NULL;
	
	sprintf(sql, "update car set date_out = datetime('now','localtime') where id = '%s';", id);
	sqlite3_exec(pdb, sql, NULL, NULL, &errmsg);
	char *_sql = "update car set time = strftime('%s', date_out) - strftime('%s', date_in);";
	sqlite3_exec(pdb, _sql, NULL, NULL, &errmsg);
	sprintf(sql, "update car set pay = time * 0.01 where id = '%s';", id);
	sqlite3_exec(pdb, sql, NULL, NULL, &errmsg);
	sprintf(sql, "select * from car where id = '%s';", id);
	sqlite3_get_table(pdb, sql, &pResult, &rowc, &colc, &errmsg);
	display(pResult, rowc, colc); //打印结果
	printf("请支付%s元!\n", pResult[(rowc + 1) * colc - 1]);
	sprintf(sql, "delete from car where id = '%s';", id);
	sqlite3_exec(pdb, sql, NULL, NULL, &errmsg);
	
	int carc;
	char buff[10];
	fseek(fp, 0, SEEK_SET);
	fread(buff, 10, 1, fp);
	carc = atoi(buff);
	carc--;
	itoa(carc, buff); //将整数转换成字符
	fseek(fp, 0, SEEK_SET);
	fwrite(buff, 10, 1, fp);
	printf("车辆已离开!\n");
	mypause();
	
	return SQLITE_OK;
}

void exit_sys(FILE *fp, sqlite3 *pdb) //退出系统
{
	system("clear");	
	fclose(fp); //关闭文件
	sqlite3_close(pdb); //关闭数据库
	printf("close database success!\n");
	printf("close file success!\n");
	printf("正在退出......期待您的下次使用!\n");
	sleep(1);
	system("clear");
}



main.c

#include "car.h"

int main()
{
	FILE *fp;
	sqlite3 *pdb = NULL;
	
	if ((fp = fopen("car_park.txt", "r+")) == NULL)
	{
		perror("open file error:\n");
		
		exit(-1);
	}
	
	if (SQLITE_OK != sqlite3_open("database_car.db", &pdb)) //打开(创建)数据库
	{
		printf("Open database fail: %s\n", sqlite3_errmsg(pdb));
		
		exit(-1);
	}
	
	if (SQLITE_OK != create_table(pdb)) //创建汽车信息表
	{
		sqlite3_close(pdb);
		
		exit(-1);
	}
	
	welcome();
	int chioce;

	while(1)
	{
		menu(fp);
		scanf("%d", &chioce);
		
		switch(chioce)
		{
			case 1:
				if (SQLITE_OK != insert_record(fp, pdb)) //插入数据(车辆进入)
				{
					printf("有错误,返回主菜单中...\n");
					sleep(1);
		
					continue;
				}
			
			break;
			
			case 2:
				if (SQLITE_OK != lookinfo(pdb)) //查看停入车辆信息
				{
					printf("有错误,返回主菜单中...\n");
					sleep(1);
		
					continue;
				}
			
				break;
				
			case 3:
				if (SQLITE_OK != findinfo(pdb)) //查找停入的车辆
				{
					printf("有错误,返回主菜单中...\n");
					sleep(1);
		
					continue;
				}
				
				break;
				
			case 4:
				if (SQLITE_OK != deleteinfo(fp, pdb)) //删除(车辆离开)
				{
					printf("有错误,返回主菜单中...\n");
					sleep(1);
		
					continue;
				}
				
				break;
				
			case 5:
				exit_sys(fp, pdb); //退出系统
				exit(0);
	
			default:
				system("clear");
				printf("输入有误,请重新输入!\n");
				sleep(1);
				continue;
		}
	}
}

makefile

OBJS=main.c car.c
txl:$(OBJS)
	gcc $(OBJS) -o tcc -lsqlite3
.PHONY:clean
clean:
	rm tcc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值