C语言停车场模型详解

2023-12-28 06:06:40

1. 引言

本文将介绍一个使用C语言实现的停车场模型,包括代码和实现思路。停车场管理系统是现实生活中常见的系统之一,通过模拟实现停车场管理系统,我们可以学习和熟悉C语言的基本语法,以及如何利用数据结构和算法解决实际问题。

2. 代码概述

本停车场模型代码由以下几个部分组成:

  • 定义常量和数据结构:包括最大车库数、最大每个车库的车位数、最大车牌号长度等常量的定义,以及CarCarPort结构体的定义。
  • 初始化车库:定义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_numcarports[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_carportsprint_waiting_cars函数打印当前车库和等候车辆情况,并返回。

如果车库已满,我们通过循环遍历便道的车位情况,查找是否存在空车位。如果存在空车位,则将车辆信息保存到该车位,并记录进入停车场的时间。然后打印在便道等候的提示信息,并调用print_carportsprint_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_carportsprint_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语言的基本语法,以及如何利用数据结构和算法解决实际问题。

文章来源:https://blog.csdn.net/VicdorLin/article/details/135254848
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。