C语言停车场模型详解
- 1. 引言
- 2. 代码概述
- 3. 代码详解
- 3.1 定义常量和数据结构
- 3.2 初始化车库
- 3.3 查找车辆所在车库
- 3.4 查找车辆所在的车位
- 3.5 打印车库状态
- 3.6 打印等候车辆
- 3.7 车辆入库
- 3.8 车辆出库
- 3.9 菜单功能
- 3.10 主函数
- 5.效果展示
- 5.完整代码
- 6. 总结
1. 引言
本文将介绍一个使用C语言实现的停车场模型,包括代码和实现思路。停车场管理系统是现实生活中常见的系统之一,通过模拟实现停车场管理系统,我们可以学习和熟悉C语言的基本语法,以及如何利用数据结构和算法解决实际问题。
2. 代码概述
本停车场模型代码由以下几个部分组成:
- 定义常量和数据结构:包括最大车库数、最大每个车库的车位数、最大车牌号长度等常量的定义,以及
Car
和CarPort
结构体的定义。 - 初始化车库:定义
init_carports
函数,用于初始化车库信息。 - 查找车辆所在车库:定义
find_carport
函数,用于根据车牌号查找车辆所在的车库。 - 查找车辆所在的车位:定义
find_carport_by_plate
函数,用于在指定车库中根据车牌号查找车辆所在的车位。 - 打印车库状态:定义
print_carports
函数,用于打印当前各个车库的车位情况。 - 打印等候车辆:定义
print_waiting_cars
函数,用于打印当前等候的车辆。 - 车辆入库:定义
in_car
函数,用于实现车辆进入停车场的操作。 - 车辆出库:定义
out_car
函数,用于实现车辆离开停车场的操作。 - 菜单功能:定义
menu
函数,用于实现用户选择功能菜单,并根据用户选择调用相应的函数。 - 主函数:定义
main
函数,用于程序的入口,调用init_carports
函数进行初始化,调用menu
函数进入功能菜单循环。
3. 代码详解
3.1 定义常量和数据结构
在代码开始部分,我们定义了一些常量,包括最大车库数、最大每个车库的车位数、最大车牌号长度等。这些常量的定义有助于代码的可读性和维护性,方便后续对代码的修改和扩展。
#define MAX_CARPORTS 10 // 最大车库数
#define MAX_CAPACITY 10 // 最大每个车库的车位数
#define MAX_PLATE_LEN 10 // 最大车牌号长度typedef struct {char plate[MAX_PLATE_LEN];time_t in_time;
} Car;typedef struct {int capacity;Car cars[MAX_CAPACITY];
} CarPort;
在这段代码中,我们定义了Car
结构体用于表示一辆车的信息,包括车牌号和进入停车场的时间。CarPort
结构体用于表示一个车库的信息,包括车库的容量和存放的车辆信息。
3.2 初始化车库
通过init_carports
函数,我们可以初始化车库的信息,包括车库个数和每个车库的车位数。
void init_carports() {printf("请输入车库个数:");scanf("%d", &carport_num);for (int i = 0; i < carport_num; i++) {printf("请输入第 %d 个车库的车位个数:", i + 1);scanf("%d", &carports[i].capacity);}
}
在函数中,我们使用scanf
函数依次读取用户输入的车库个数和每个车库的车位数,并将其保存到carport_num
和carports[i].capacity
变量中。
3.3 查找车辆所在车库
通过find_carport
函数,我们可以根据车牌号查找车辆所在的车库。函数会遍历每个车库中的车辆信息,比对车牌号,如果存在相同的车牌号,则返回对应的车库编号。
int find_carport(const char *plate) {for (int i = 0; i < carport_num; i++) {for (int j = 0; j < carports[i].capacity; j++) {if (strcmp(plate, carports[i].cars[j].plate) == 0) {return i;}}}return -1;
}
在函数中,我们使用两层循环来遍历每个车库中的车辆信息。在内层循环中,使用strcmp
函数比对字符串是否相同,如果相同,则返回对应的车库编号。如果没有找到车辆所在的车库,函数返回-1。
3.4 查找车辆所在的车位
通过find_carport_by_plate
函数,我们可以在指定车库中根据车牌号查找车辆所在的车位。如果找到相同的车牌号,则返回车位的索引。
int find_carport_by_plate(const char *plate, int carport) {for (int j = 0; j < carports[carport].capacity; j++) {if (strcmp(plate, carports[carport].cars[j].plate) == 0) {return j;}}return -1;
}
在函数中,我们使用一个循环遍历指定车库中的车辆信息,通过strcmp
函数比对车牌号是否相同,如果相同,则返回对应车位的索引。如果没有找到车牌号相同的车辆,则返回-1。
3.5 打印车库状态
通过print_carports
函数,我们可以打印当前各个车库的车位情况。
void print_carports() {for (int i = 0; i < carport_num; i++) {printf("车库 %d 车位情况:", i + 1);for (int j = 0; j < carports[i].capacity; j++) {if (strlen(carports[i].cars[j].plate) > 0) {printf("%s ", carports[i].cars[j].plate);}}printf("\n");}
}
在函数中,我们使用两层循环遍历每个车库中的车辆信息,并通过strlen
函数判断是否为空车位。如果不为空车位,则打印车牌号。最后,通过换行符换行。
3.6 打印等候车辆
通过print_waiting_cars
函数,我们可以打印当前等候的车辆信息。
void print_waiting_cars() {printf("等待车辆:");for (int i = 0; i < carport_num; i++) {for (int j = carports[i].capacity; j < MAX_CAPACITY; j++) {if (strlen(carports[i].cars[j].plate) > 0) {printf("%s ", carports[i].cars[j].plate);}}}printf("\n");
}
在函数中,我们使用两层循环遍历每个车库中的等候车辆信息,并通过strlen
函数判断是否为空车位。如果不为空车位,则打印车牌号。最后,通过换行符换行。
3.7 车辆入库
通过in_car
函数,我们可以实现车辆进入停车场的操作。
void in_car() {int carport;char plate[MAX_PLATE_LEN];printf("请输入车库编号(1-%d):", carport_num);scanf("%d", &carport);carport--;if (carport < 0 || carport >= carport_num) {printf("车库编号无效\n");return;}printf("请输入车牌号:");scanf("%s", plate);int index = find_carport(plate);if (index >= 0) {printf("车辆 %s 已在库\n", plate);return;}for (int i = 0; i < carports[carport].capacity; i++) {if (strlen(carports[carport].cars[i].plate) == 0) {strcpy(carports[carport].cars[i].plate, plate);carports[carport].cars[i].in_time = time(NULL);printf("车辆 %s 入库成功\n", plate);print_carports();print_waiting_cars();return;}}for (int i = carports[carport].capacity; i < MAX_CAPACITY; i++) {if (strlen(carports[carport].cars[i].plate) == 0) {strcpy(carports[carport].cars[i].plate, plate);carports[carport].cars[i].in_time = time(NULL);printf("车辆 %s 在便道等候\n", plate);print_carports();print_waiting_cars();return;}}printf("车库 %d 已满,无法入库\n", carport + 1);
}
在函数中,我们先通过scanf
函数读取用户输入的车库编号,并将其减1转换为数组索引。然后,通过scanf
函数读取用户输入的车牌号。
接下来,我们通过find_carport
函数查找车辆是否已在库中,如果已存在,则打印提示信息并返回。
然后,我们使用循环遍历当前车库的车位情况,通过strlen
函数判断是否为空车位。如果存在空车位,则将车辆信息保存到该车位,并记录进入停车场的时间。然后打印入库成功的提示信息,并调用print_carports
和print_waiting_cars
函数打印当前车库和等候车辆情况,并返回。
如果车库已满,我们通过循环遍历便道的车位情况,查找是否存在空车位。如果存在空车位,则将车辆信息保存到该车位,并记录进入停车场的时间。然后打印在便道等候的提示信息,并调用print_carports
和print_waiting_cars
函数打印当前车库和等候车辆情况,并返回。
如果便道车位也满了,则打印无法入库的提示信息。
3.8 车辆出库
通过out_car
函数,我们可以实现车辆离开停车场的操作。
void out_car() {char plate[MAX_PLATE_LEN];printf("请输入车牌号:");scanf("%s", plate);int carport = find_carport(plate);if (carport < 0) {printf("车辆 %s 不在库\n", plate);return;}int index = find_carport_by_plate(plate, carport);if (index < 0) {printf("未找到车辆 %s 的位置\n", plate);return;}carports[carport].cars[index].in_time = 0;strcpy(carports[carport].cars[index].plate, "");printf("车辆 %s 出库成功\n", plate);print_carports();print_waiting_cars();
}
在函数中,我们通过scanf
函数读取用户输入的车牌号,并通过find_carport
函数查找车辆是否在库中。如果车辆不在库中,则打印提示信息并返回。
接下来,我们通过find_carport_by_plate
函数查找车辆在指定车库中的车位。如果没有找到车辆在库中的位置,则打印提示信息并返回。
然后,我们将车辆在库中的时间设置为0,将车辆的车牌号清空。
最后,我们打印车辆出库成功的提示信息,并调用print_carports
和print_waiting_cars
函数打印当前车库和等候车辆情况。
3.9 菜单功能
通过menu
函数,我们可以实现用户选择功能菜单,并根据用户选择调用相应的函数。
void menu() {int choice;do {printf("\n停车场管理系统\n");printf("1. 入库\n");printf("2. 出库\n");printf("3. 查看车库\n");printf("4. 查看等候车辆\n");printf("0. 退出\n");printf("请输入您的选择:");scanf("%d", &choice);switch (choice) {case 1:in_car();break;case 2:out_car();break;case 3:print_carports();break;case 4:print_waiting_cars();break;case 0:printf("再见!\n");break;default:printf("无效选择\n");break;}} while (choice != 0);
}
在函数中,我们通过do-while
循环实现一个功能菜单的循环,直到用户选择退出程序。在循环中,我们使用switch
语句根据用户选择调用对应的函数。如果用户选择无效选项,则打印提示信息。
3.10 主函数
在main
函数中,我们首先调用init_carports
函数进行初始化,然后调用menu
函数进入功能菜单循环。
int main() {init_carports();menu();return 0;
}
5.效果展示
5.完整代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>#define MAX_CARPORTS 10 // 最大车库数
#define MAX_CAPACITY 10 // 最大每个车库的车位数
#define MAX_PLATE_LEN 10 // 最大车牌号长度typedef struct {char plate[MAX_PLATE_LEN];time_t in_time;
} Car;typedef struct {int capacity;Car cars[MAX_CAPACITY];
} CarPort;CarPort carports[MAX_CARPORTS];
int carport_num = 0; // 实际车库数void init_carports() {printf("请输入车库个数:");scanf("%d", &carport_num);for (int i = 0; i < carport_num; i++) {printf("请输入第 %d 个车库的车位个数:", i + 1);scanf("%d", &carports[i].capacity);}
}int find_carport(const char *plate) {for (int i = 0; i < carport_num; i++) {for (int j = 0; j < carports[i].capacity; j++) {if (strcmp(plate, carports[i].cars[j].plate) == 0) {return i;}}}return -1;
}int find_carport_by_plate(const char *plate, int carport) {for (int j = 0; j < carports[carport].capacity; j++) {if (strcmp(plate, carports[carport].cars[j].plate) == 0) {return j;}}return -1;
}void print_carports() {for (int i = 0; i < carport_num; i++) {printf("车库 %d 车位情况:", i + 1);for (int j = 0; j < carports[i].capacity; j++) {if (strlen(carports[i].cars[j].plate) > 0) {printf("%s ", carports[i].cars[j].plate);}}printf("\n");}
}void print_waiting_cars() {printf("等待车辆:");for (int i = 0; i < carport_num; i++) {for (int j = carports[i].capacity; j < MAX_CAPACITY; j++) {if (strlen(carports[i].cars[j].plate) > 0) {printf("%s ", carports[i].cars[j].plate);}}}printf("\n");
}void in_car() {int carport;char plate[MAX_PLATE_LEN];printf("请输入车库编号(1-%d):", carport_num);scanf("%d", &carport);carport--;if (carport < 0 || carport >= carport_num) {printf("车库编号无效\n");return;}printf("请输入车牌号:");scanf("%s", plate);int index = find_carport(plate);if (index >= 0) {printf("车辆 %s 已在库\n", plate);return;}for (int i = 0; i < carports[carport].capacity; i++) {if (strlen(carports[carport].cars[i].plate) == 0) {strcpy(carports[carport].cars[i].plate, plate);carports[carport].cars[i].in_time = time(NULL);printf("车辆 %s 入库成功\n", plate);print_carports();print_waiting_cars();return;}}for (int i = carports[carport].capacity; i < MAX_CAPACITY; i++) {if (strlen(carports[carport].cars[i].plate) == 0) {strcpy(carports[carport].cars[i].plate, plate);carports[carport].cars[i].in_time = time(NULL);printf("车辆 %s 在便道等候\n", plate);print_carports();print_waiting_cars();return;}}printf("车库 %d 已满,无法入库\n", carport + 1);
}void out_car() {char plate[MAX_PLATE_LEN];printf("请输入出库车牌号:");scanf("%s", plate);int carport = find_carport(plate);if (carport < 0) {printf("车辆 %s 不在库\n", plate);return;}int index = find_carport_by_plate(plate, carport);if (index < 0) {printf("车辆 %s 不在库\n", plate);return;}time_t out_time = time(NULL);double duration = difftime(out_time, carports[carport].cars[index].in_time);double fee;if (duration <= 900) {fee = 0;} else {struct tm *out_tm = localtime(&out_time);int hour = out_tm->tm_hour;if (hour >= 6 && hour < 18) {fee = duration / 900 * 0.5;} else {fee = duration / 900;}}printf("车辆 %s 出库成功,停车时长 %.1f 分钟,收费 %.2f 元\n", plate, duration / 60, fee);carports[carport].cars[index].plate[0] = '\0';for (int i = carports[carport].capacity; i < MAX_CAPACITY; i++) {if (strlen(carports[carport].cars[i].plate) > 0) {strcpy(carports[carport].cars[index].plate, carports[carport].cars[i].plate);carports[carport].cars[index].in_time = carports[carport].cars[i].in_time;carports[carport].cars[i].plate[0] = '\0';printf("等候车辆 %s 入库\n", carports[carport].cars[index].plate);print_carports();print_waiting_cars();return;}}print_carports();print_waiting_cars();
}void menu() {int choice;do {printf("\n停车场管理系统\n");printf("1. 入库\n");printf("2. 出库\n");printf("3. 查看车库\n");printf("4. 查看等候车辆\n");printf("0. 退出\n");printf("请输入您的选择:");scanf("%d", &choice);switch (choice) {case 1:in_car();break;case 2:out_car();break;case 3:print_carports();break;case 4:print_waiting_cars();break;case 0:printf("再见!\n");break;default:printf("无效选择\n");break;}} while (choice != 0);
}int main() {init_carports();menu();return 0;
}
6. 总结
本文介绍了一个使用C语言实现的停车场模型代码,包括定义常量和数据结构,初始化车库,查找车辆所在车库和车位,打印车库状态和等候车辆,车辆入库和出库,以及菜单功能等。该代码通过模拟实现停车场管理系统,可以帮助学习和熟悉C语言的基本语法,以及如何利用数据结构和算法解决实际问题。