C语言停车场模型详解
C语言停车场模型详解
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语言的基本语法,以及如何利用数据结构和算法解决实际问题。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!