1. 程式人生 > >停車場管理系統(資料庫)

停車場管理系統(資料庫)

停車場管理系統主要實現的功能包括:

1、檢視空位  2、停車 3、系統計費 3、管理員檢視停車記錄 4、查詢車輛資訊

/*****************************************************
copyright (C), 2016-2017, Lighting Studio. Co.,     Ltd. 
File name:停車場
Author:王    Version:1.0    Date:2017.3.20 
Description:
Funcion List: 
*****************************************************/

#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <stddef.h>

#define ALL 10

void creat_table(sqlite3 * db)            //建立表,記錄車位資訊
{
	char *sql;
	char *errmsg;
	int ret;

	sql = "create table if not exists mytable (id integer primary key,name text,entertm integer,exittm integer,stall text,entertime text,exittime text);";

	ret = sqlite3_exec(db,sql,NULL,NULL,&errmsg);
	if(ret != SQLITE_OK)
	{
		printf("create table fail!:%s\n",errmsg);
		exit(-1);
	}
}

void creat_new(sqlite3 * db)             //建立新表,儲存該停車場的所有停車記錄
{
	char *sql;
	char *errmsg;
	int ret;

	sql = "create table if not exists newtable (id integer,name text,stall text,entertime text,exittime text);";

	ret = sqlite3_exec(db,sql,NULL,NULL,&errmsg);
	if(ret != SQLITE_OK)
	{
		printf("create table fail!:%s\n",errmsg);
		exit(-1);
	}
}

void insert_init(sqlite3 * db)                  //對建立的車位進行初始化
{
	int i;
	int j = 0;
	for(i = 0;i < ALL; i++)
	{
		int ret;
		char *sql;
		char *errmsg;

		sql="insert into mytable(id,name,entertm,exittm,stall,entertime,exittime) values(NULL,'no',NULL,NULL,'no','no','no');";
		ret = sqlite3_exec(db,sql,NULL,NULL,&errmsg);
		if(ret != SQLITE_OK)
		{
			printf("insert fail!%s\n",errmsg);
			exit(-1);
		}
	}
}

void insert_value(sqlite3* db)                    //車主選擇位置自由停車
{
	int ret,a;
	char sql[100];
	char *errmsg;
	char name[10];
	time_t t;

	printf("輸入車牌號:\n");
	scanf("%s",name);
	printf("選擇車位:\n");
	scanf("%d",&a);

	t = time(NULL);
	struct tm *tb;
	tb = localtime(&t);

	sprintf(sql,"update mytable set name = '%s',entertm = %d,stall = 'parking',entertime = '%d.%d.%d %d:%d:%d' where id = %d;",name,t,tb->tm_year+1900,tb->tm_mon+1,tb->tm_mday,tb->tm_hour,tb->tm_min,tb->tm_sec,a);

	ret = sqlite3_exec(db,sql,NULL,NULL,&errmsg);
	if(ret != SQLITE_OK)
	{
		printf("insert fail!%s\n",errmsg);
		exit(-1);
	}
}

void select_all(sqlite3 *db)                  //檢視該停車場的車位狀況
{
	int ret;
	int i;
	int row = 0;
	int column = 0;
	char * sql;
	char ** presult;
	char *errmsg;

	sql = "select id,name,stall from mytable;";

	ret = sqlite3_get_table(db,sql,&presult,&row,&column,&errmsg);
	if(ret != SQLITE_OK)
	{
		printf("select fail:%s\n",errmsg);
		exit(-1);
	}

	for(i = 0;i < (ALL + 1) * column;i++)
	{
		printf("%15s",presult[i]);
		if((i + 1)%column == 0)
		{
			printf("\n");
		}
		if((i + 1) == column)
		{
			printf("---------------------------------------------------------\n");
		}
	}
}

void update_exittm(sqlite3 *db)               //離開車位,計算費用,更新車位資訊
{
	int ret1,ret2,ret3;
	int a,b;
	int row = 0;
	int column = 0;
	char ** presult;
	char sql1[100];
	char sql2[100];
	char sql3[100];
	char * errmsg1;
	char * errmsg2;
	char * errmsg3;
	char name[10];
	time_t t;
	struct tm *td;

	printf("輸入車牌號:\n");
	scanf("%s",name);

	t = time(NULL);
	td = localtime(&t);

	sprintf(sql1,"update mytable set exittm = %d,exittime = '%d.%d.%d %d:%d:%d' where name = '%s';",t,td->tm_year+1900,td->tm_mon+1,td->tm_mday,td->tm_hour,td->tm_min,td->tm_sec,name);
	ret1 = sqlite3_exec(db,sql1,NULL,NULL,&errmsg1);           //離開車位
	if(ret1 != SQLITE_OK)
	{
		printf("update fail:%s\n",errmsg1);
		exit(-1);
	}

	sprintf(sql3,"select entertm,exittm from mytable where name like '%s';",name);

	ret3 = sqlite3_get_table(db,sql3,&presult,&row,&column,&errmsg3);
	if(ret3 != SQLITE_OK)
	{
		printf("select fail :%s\n",errmsg3);
		exit(-1);
	}

	sprintf(sql3,"insert into newtable(id,name,entertime,exittime) select id,name,entertime,exittime from mytable where name like '%s';",name);
	sqlite3_exec(db,sql3,NULL,NULL,&errmsg1);         //將該車的停車資訊儲存到新表中

	a = atoi(presult[2]);
	b = atoi(presult[3]);

	printf("總費用:%d元\n",(b-a)/3600*2);           //計算費用

	sprintf(sql2,"update mytable set stall = 'no',name = 'no',entertime = 'no' where name = '%s';",name);
	ret2 = sqlite3_exec(db,sql2,NULL,NULL,&errmsg2);
	if(ret2 != SQLITE_OK)
	{
		printf("delete fail:%s\n",errmsg2);
		exit(-1);
	}

}

void select_name(sqlite3 * db)                   //按照車牌資訊查詢該車的停車記錄
{
	int ret,i;
	int row = 0;
	int column = 0;
	char ** presult;
	char sql[100];
	char *errmsg;
	char name[20];

	while(1)
	{
		printf("輸入車牌號:(q quit)\n");
		scanf("%s",name);
		if(strcmp(name,"q") == 0)
			return;
		sprintf(sql,"select id,name,entertime,exittime from newtable where name like '%s';",name);

		ret = sqlite3_get_table(db,sql,&presult,&row,&column,&errmsg);
		if(ret != SQLITE_OK)
		{
			printf("select fail :%s\n",errmsg);
			exit(-1);
		}

		for(i = 0;i < (row + 1) * column;i++)
		{
			printf("%20s",presult[i]);
			if((i + 1)%column == 0)
			{
				printf("\n");
			}
			if((i + 1) == column)
			{
				printf("-------------------------------------------------------------------------------\n");
			}
		}
	}
}

void select_newall(sqlite3 *db)                     //檢視該停車場的所有停車記錄
{
	int ret;
	int i;
	int row = 0;
	int column = 0;
	char * sql;
	char ** presult;
	char *errmsg;

	sql = "select id,name,entertime,exittime from newtable;";

	ret = sqlite3_get_table(db,sql,&presult,&row,&column,&errmsg);
	if(ret != SQLITE_OK)
	{
		printf("select fail:%s\n",errmsg);
		exit(-1);
	}

	for(i = 0;i < (row + 1) * column;i++)
	{
		printf("%20s",presult[i]);
		if((i + 1)%column == 0)
		{
			printf("\n");
		}
		if((i + 1) == column)
		{
			printf("-----------------------------------------------------------------------------------\n");
		}
	}
}

void menu()
{
	printf("\n**************************\n");
	printf("** 1)檢視空位 ** 2)停車 **\n");
	printf("** 3)離開交費 ** 4)退出 **\n");
	printf("**     5)管理員系統     **\n");
	printf("**   收費標準2¥/h   **\n");
	printf("**     30分鐘免費     **\n");
	printf("**************************\n\n");
}

int main()
{
	int ret,i;
	int a = 0;
	int b,c;
	sqlite3 *db;

	ret = sqlite3_open("park.db",&db);
	if(ret != SQLITE_OK)
	{
		printf("open fail!\n");
		exit(-1);
	}
	creat_table(db);
	creat_new(db);

	insert_init(db);
	while(a != 4)
	{
		menu();
		printf("選擇操作:");
		scanf("%d",&a);
		switch(a)
		{
			case 1:select_all(db);break;
			case 2:insert_value(db);break;
			case 3:update_exittm(db);break;
			case 5:{
					   printf("輸入管理員密碼(123456):\n");
					   scanf("%d",&c);
					   if(c == 123456)
					   {
					   b = 0;
					   while(b != 3)
					   {
						   printf("1)檢視所有停車記錄 2)查詢車輛停車資訊 3)退出\n");
						   scanf("%d",&b);
						   switch(b)
						   {
							   case 1:select_newall(db);break;
							   case 2:select_name(db);break;
						   }
					   }
					   }
					   else
						   printf("沒有許可權!\n");
				   }break;
		}
	}
	sqlite3_close(db);

    return 0;
}