一.系統功能
(1)通過菜單的形式實作人機互動界面
(2)實作便道上停車資訊顯示
(3)實作錄入進入停車場的車輛車牌号
二.設計思想
1.人機互動界面
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNyZuBnLiVWN5EGZjNjY0kzNlRWZilDZ5QTM4UWNxEjZ5gDNxYzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
2.錄入進入車牌資訊
3.顯示已停停車場情況
下面如繼續錄入
三、全部分代碼
#include<stdio.h>
#include<stdlib.h>
#include <windows.h> //"cls"
#include<string.h> //strcmp
#include<time.h> //time_t
#define MAXSIZE 100
#define M 4
#define N 5 //停車場有M行N列
//車輛資訊節點
typedef struct carnode
{
int row, line;
int inHour; //入場時間 1
int inMin; //30
int liveHour; //待多久1
int liveMin; //40
int outHour; //出場小時 3
int outMin; // 分鐘 10
char License[10];
}CarNode;
//用來存放時間的連結清單
typedef struct carlist
{
CarNode *data; //data是結構體數組
struct carlist *next;
}CarList;
//聲明每個全局變量
CarList *timeQ[25];
int park[M][N]={0};
int flag=0; //判斷停車場是否已滿
int oddEven(int n);
void printPark(); //用二維數組存放停車場
void initList(); //初始化連結清單
int *localTime(); //求系統時間
CarNode *InCar(int r,int l); //車輛進入
CarNode *initCarNode(int row,int line,char License[10]);
void List_add(CarList *list,CarNode *car); //構造連結清單比較出場時間
void leaveCar(); //新使用者進來是否等待
void printCar(CarList *q); //列印車輛資訊
void Welcome(); //顯示菜單
void smallwelcome(); //子菜單
void HideCursor(); //完成清屏功能(調用系統函數)
void printCars(); //停車場已滿,等待
CarNode *InCar(int r,int l);
int main()
{
srand((unsigned)time(NULL));
initList();
Welcome();
while(1){
system("cls"); // 清屏
Welcome(); // 重新顯示界面
int i, cho;
scanf("%d", &i);
if (i == 1) {
smallwelcome();
printPark();
if (flag>M*N) {
printCars();
break;
}
}
if (i == 2) {
printf("\n歡迎您再次使用本系統呦 ε=ε=ε=(~ ̄▽ ̄)~\n\n");
break;
}
printf("---------------------------------------\n");
printf("\n若車已停好,請輸入0\n");
begin: // goto 标志位
scanf("%d", &cho);
if(cho == 0){
continue;
}
else{
printf("您的輸入有誤,請重新輸入\n");
goto begin; // goto 到指定标志位 begin
}
}
return 0;
}
int oddEven(int n)
{
if(n%2!=0){ //奇數
return 1;
}else{
return 0;
}
}
//初始化連結清單
void initList()
{
int i;
for(i=1; i<25; i++){
timeQ[i] = (CarList *)malloc(sizeof(CarList));
timeQ[i]->next=NULL;
}
}
//判斷後列印車輛資訊
void printCar(CarList *q)
{
printf("\t\t車牌号為%s的車主 \n",q->data->License);
printf("\t\t會在中原標準時間%d時%d分離開停車場\n",q->data->outHour,q->data->outMin);
printf("\t\t請您将車停在第%d行第%d列的位置上\n",q->data->row+1,q->data->line+1);
}
//用二維數組存放停車場
void printPark()
{
int i, j;
for(i=0; i<M*2+1; i++) {
for(j=0; j<N*2+1; j++) {
if(!oddEven(i) && !oddEven(j)) {
printf(" ");
} else if(!oddEven(i) && oddEven(j)) {
printf("---");
} else if(oddEven(i) &&!oddEven(j)) {
printf("|");
} else if(oddEven(i) && oddEven(j)) {
if(park[(i-1)/2][(j-1)/2]) {
printf(" P ");
}else{
printf(" ");
}
}
}
printf("\n");
}
}
//求系統時間
int *localTime()
{
time_t tmpcal_ptr;
struct tm *tmp_ptr = NULL;
time(&tmpcal_ptr);
tmp_ptr = localtime(&tmpcal_ptr);
int *a = (int*)malloc(sizeof(int)*2);
a[0]= tmp_ptr->tm_hour;
a[1]= tmp_ptr->tm_min;
return a;
}
//車輛進入
CarNode *InCar(int r,int l)
{
if (park[r][l] == 0) {
char *License=(char *)malloc(sizeof(char)*10);
printf("輸入車牌号:");
getchar();
gets(License);
printf("---------------------------------------\n");
getchar();
CarNode *car = initCarNode(r,l,License);
List_add(timeQ[localTime()[0]],car);
park[r][l] = 1;
flag++;
return car;
} else {
printf("該車位已經被占了哦!\n");
printf("請重新輸入:");
scanf("%d %d",&r,&l);
return InCar(r,l);
}
}
//汽車資訊
CarNode *initCarNode(int row,int line,char License[10])
{
CarNode *car = (CarNode *)malloc(sizeof(CarNode));
car->row = row;
car->line = line;
int liveHour = rand()%4;
int liveMin = rand()%61;
car->liveHour = liveHour;
car->liveMin = liveMin;
car->inHour = localTime()[0];
car->inMin = localTime()[1];
car->outMin = (localTime()[1]+liveMin)%60;
car->outHour = localTime()[0]+car->liveHour+(localTime()[1]+liveMin)/60;
strcpy(car->License,License);
return car;
}
//構造timeQ[25]連結清單
void List_add(CarList *list,CarNode *car)
{
CarList *p = list;
CarList *q = (CarList *)malloc(sizeof(CarList));
q->data = car;
while(p->next) {
if(p->next->data->outMin < car->outMin) {
break;
}
p = p->next;
}
q->next = p->next;
p->next = q;
}
//新使用者進來是否等待
void leaveCar()
{
CarList *p = timeQ[localTime()[0]];
CarList *q = NULL;
while(p->next){
if(p->next->data->outMin == localTime()[1]) {
q = p->next;
p->next = q->next;
park[p->data->row][p->data->line] = 0;
break;
}
p = p->next;
}
if(q)
printCar(q);
}
//完成清屏時間控制功能(調用系統函數)
void HideCursor()
{
CONSOLE_CURSOR_INFO cursor_info = {1, 0};
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
//顯示菜單
void Welcome()
{
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
printf ("\t\t\t%s", asctime(timeinfo) );
HideCursor();
printf ("\t*******************目前停車場狀況***********************\n");
printf ("\t 停車場共有%d個車位,目前停車場共有%d輛車\n",M*N,flag);
printf ("\t********************************************************\n");
printf ("\t--------------Welcome to LZH's Car Parking--------------\n");
printf ("\t* *\n");
printf ("\t* 該停車場是一個%d行%d列的矩形停車場 *\n",M,N);
printf ("\t* 系統會自動幫您配置設定停車時間,請合理安排時間 *\n");
printf ("\t* 1.将您的愛車停在該停車場 *\n");
printf ("\t* 2.退出管理系統 *\n");
printf ("\t* *\n");
printf ("\t*------------------------------------------------------*\n");
printf ("\t---------------Press key(1/2/) to run program ----------\n");
}
//歡迎光臨
void smallwelcome()
{
printf ("%d %d", localTime()[0],localTime()[1] );
int r,l;
printf("親~請選擇停車區域哦!(行數<%d,列數<%d)",M+1,N+1);
scanf("%d %d",&r,&l);
if (r>M||l>N) {
printf("\t\t本停車場沒有你想象中的大哦!\n");
smallwelcome();
return ;
}
CarNode *car = InCar(r-1,l-1);
List_add(timeQ[ localTime()[0] ],car);
printf("\t\t請牌照為%s的汽車停入停車位的第%d行第%d列的位置上\n",car->License,r,l);
printf("\t\t現在為中原標準時間:%d點%d分\n",localTime()[0],localTime()[1]);
printf("\t\t為您配置設定的停車時間為:%d小時%d分鐘\n",car->liveHour,car->liveMin);
printf("\t\t請您在%d點%d分之前離開停車場\n",car->outHour,car->outMin);
}
//停車場已滿,列印最早離開的車輛資訊
void printCars()
{
int i;
for(i=1; i<25; i++) {
CarList *timeq = timeQ[i];
while(timeq->next != NULL) {
printCar(timeq->next);
timeq = timeq->next;
break;
}
}
}