C语言停车场模型详解

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. 代码概述

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

  • 定义常量和数据结构:包括最大车库数、最大每个车库的车位数、最大车牌号长度等常量的定义,以及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语言的基本语法,以及如何利用数据结构和算法解决实际问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/275279.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux 网络工具(二)

linux 网络工具 1. ip命令簇4.1 address4.2 link4.3 route4.4 rule 2. 其他常用命令2.1 ifup/ifdown2.2 配置主机名2.3 设置DNS服务器指向2.4 配置域名解析2.5 ss2.6 路由相关配置文件2.7 查看机器可用端口2.8 traceroute2.9 dhclient 1. ip命令簇 Linux的ip命令和ifconfig类似…

vue3+elementPlus:el-drawer新增修改弹窗复用

在el-drawer的属性里设置:title属性&#xff0c;和重置函数 //html<!-- 弹窗 --><el-drawerv-model"drawer":title"title":size"505":direction"direction":before-close"handleClose"><el-formlabel-posit…

yolov8 细胞分割数据集准备及训练

1、数据 下载:https://universe.roboflow.com/motherson-hm/5-part-diff 500来张,5个类别(嗜碱性细胞、嗜酸细胞、淋巴细胞、单核细胞、中性粒细胞) yolo 分割数据标注格式: 与检测类似,就是坐标分割有多个 2、训练 训练yaml: seg_data.yaml (与检测格式一样) …

Guava自加载缓存LoadingCache使用指南

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;今天我们来聊聊缓存。在Java世界里&#xff0c;高效的缓存机制对于提升应用性能、降低数据库负担至关重要。想象一下&#xff0c;如果每次数据请求都要跑到数据库里取&#xff0c;那服务器岂不是要累趴了&#x…

SpringBoot发布项目到docker

Dockerfile FROM openjdk:11 # 作者 MAINTAINER chenxiaodong<2774398338qq.com># 安装 vim # RUN yum -y install vim# 环境变量 # 进入容器后的默认工作目录 ENV WORKPATH /usr/local/webapp ENV EXECFILE Docker2Application-0.0.1-SNAPSHOT.jarRUN mkdir -p $WORKPA…

论文分享 | 利用单模态自监督学习实现多模态AVSR

以下文章来源于智能语音新青年 &#xff0c;作者ttslr 论文地址&#xff1a; https://aclanthology.org/2022.acl-long.308.pdf 代码仓库&#xff1a; https://github.com/LUMIA-Group/Leveraging-Self-Supervised-Learning-for-AVSR 训练一个基于Transformer的模型需要大量的…

从0开始学前端day1

script setup 在script里写一个setup的作用 自动注册子组件属性和方法无需返回&#xff0c;执行完后自动更新支持props和context Vue 3中的props和context props是一种用于父子组件通信的机制。父组件可以通过props向子组件传递数据&#xff0c;子组件则可以通过props接收来…

Android : 画布绘制矩形和文字 让其居中显示简单应用

示例图&#xff1a; CenterView.java package com.example.demo;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.Log; import android.view.View;public class Center…

大数据Doris(四十二):使用物化视图

文章目录 使用物化视图 一、​​​​​​​创建物化视图

听GPT 讲Rust源代码--src/tools(29)

File: rust/src/tools/clippy/clippy_lints/src/unused_peekable.rs 在Rust源代码中&#xff0c;rust/src/tools/clippy/clippy_lints/src/unused_peekable.rs这个文件是Clippy工具中一个特定的Lint规则的实现文件&#xff0c;用于检测未使用的Peekable迭代器。 Peekable迭代器…

Bind for 0.0.0.0:2379 failed: port is already allocated

1、执行命令docker-compose -p docker-apisix up -d 报错 Error response from daemon: driver failed programming external connectivity on endpoint docker-apisix-etcd-1 (2a92a0cefff9194fcd1dad4bdeabf4201d9047ec2633eda455c6e46528668af4): Bind for 0.0.0.0:2379 fa…

Pandas教程(三)—— 数据清洗与准备

1.处理缺失值 1.1 数据删除函数 作用&#xff1a;删除Dataframe某行或某列的数据 语法&#xff1a;df.drop&#xff08; labels [ ] &#xff09; drop函数的几个参数&#xff1a; labels &#xff1a;接收一个列表&#xff0c;内含删除行 / 列的索引编号或索引名 axis &…

用友薪福社解决社会化用工难题,助力企业走上“降本增效”之路

“就业”一直是人们关注的重点。用人需求与求职人数环比均明显上升&#xff0c;人力资源市场活跃度也明显增强&#xff0c;但供求关系整体仍旧偏紧。在行业快速发展的前提下&#xff0c;如何快速缓解企业用工荒难题&#xff0c;成为当前诸多企业面临的困境。为了科学合规地降低…

金融贷款行业怎么精准获客,电销打吐了!教你两招

助贷行业&#xff0c;一般都会设有kpi&#xff0c;压力竞争都不小。虽然现在贷款电销大家对此意见不同&#xff0c;但是&#xff0c;不可否认&#xff0c;这个行业&#xff0c;电销就是它们最快速的获客方式。只要耐得住性子&#xff0c;有一份精准的话单&#xff0c;就可以开工…

二叉树数据结构:深入了解二叉树的概念、特性与结构

在探索栈和队列之后&#xff08;大家可以移步至我的数据结构专栏&#xff09;&#xff1a;T-rLN的数据结构专栏 我们转向了更为复杂而有趣的数据结构——二叉树。本文将引领我们进入二叉树的世界&#xff0c;从最基本的概念和结构开始&#xff0c;逐步深入了解二叉树的顺序结构…

Postman使用

Postman使用 Pre-request Script 参考&#xff1a; Scripting in Postman 可以请求、集合或文件夹中添加Pre-request Script&#xff0c;在请求运行之前执行JavaScript 如设置变量值、参数、Header和正文数据&#xff0c;也可以使用Pre-request Script来调试代码&#xff0…

解决Hive在DataGrip 中注释乱码问题

注释属于元数据的一部分&#xff0c;同样存储在mysql的metastore库中&#xff0c;如果metastore库的字符集不支持中文&#xff0c;就会导致中文显示乱码。 不建议修改Hive元数据库的编码&#xff0c;此处我们在metastore中找存储注释的表&#xff0c;找到表中存储注释的字段&a…

【汇编笔记】初识汇编-内存读写

汇编语言的由来&#xff1a; CPU是计算机的核心&#xff0c;由于计算机只认识二进制&#xff0c;所以CPU执行的指令是二进制。 我们要想让CPU工作&#xff0c;就得给他提供它认识的指令&#xff0c;这一系列的指令的集合&#xff0c;称之为指令集。 指令集&#xff1a; 不同的体…

VR全景图片制作时有哪些技巧,VR全景图片能带来哪些好处

引言&#xff1a; VR全景图片是通过虚拟现实技术制作出的具有沉浸感的图片&#xff0c;能够提供给用户一种身临其境的感觉。在宣传方面&#xff0c;它有着独特的优势和潜力&#xff0c;能够帮助吸引更多的潜在客户&#xff0c;那么VR全景图片制作时有哪些技巧&#xff0c;VR全…

【科普】家长们:如何早期发现孩子的听力问题?

孩子太小还不会说话&#xff0c; 或表达不准确&#xff0c; 家长往往很难发现他们听力下降&#xff1b; 那在生活中 如何发现孩子听力异常呢&#xff1f; 1、新生儿听力筛查 每一个新生儿出生后都要求做听力筛查&#xff0c;这样可以及早判断是否存在听力障碍的可能&#…