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