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语言的基本语法,以及如何利用数据结构和算法解决实际问题。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hyper-v ubuntu 3节点 k8s集群搭建

前奏 搭建一主二从的k8s集群&#xff0c;如图所示&#xff0c;准备3台虚拟机。 不会创建的同学&#xff0c;可以看我上上篇博客&#xff1a;https://blog.csdn.net/dawnto/article/details/135086252 和上篇博客&#xff1a;https://blog.csdn.net/dawnto/article/details/135…

(04730)半导体器件之基本放大器工作原理(三)

本文主要阐述多级与差动放大器 为使输入的微弱信号进行放大后能获得足够的输出功率去推动负载运行&#xff0c;往往要采用所谓的多级放大电路&#xff0c;信号逐级通过放大&#xff0c;直至得到输出信号。这就必须考虑放大电路级与级之间的信号传递方法&#xff0c;或者称为耦…

henauOJ 1069: 三连击

题目描述 本题为提交答案题&#xff0c;您可以写程序或手算在本机上算出答案后&#xff0c;直接提交答案文本&#xff0c;也可提交答案生成程序。 #include <bits/stdc.h> #define endl \n using namespace std; void GordenGhost(); vector<int>a; bool vis[10]…

微软官方系统镜像安装U盘制作

https://www.microsoft.com/zh-cn/software-download/windows11https://www.microsoft.com/zh-cn/software-download/windows10工具下载地址 #win10 https://download.microsoft.com/download/b/0/5/b053c6bc-fc07-4785-a66a-63c5aeb715a9/MediaCreationTool21H2.exehttps://d…

GC控制器(Garbagecollector)源码解析

KubeController Garbagecollector 本文从源码的角度分析KubeController Garbagecollector相关功能的实现。 本篇kubernetes版本为v1.27.3。 kubernetes项目地址: https://github.com/kubernetes/kubernetes controller命令main入口: cmd/kube-controller-manager/controller-…

k8s的网络类型

部署 CNI 网络组件 部署 flannel K8S 中 Pod 网络通信&#xff1a; ●Pod 内容器与容器之间的通信 在同一个 Pod 内的容器&#xff08;Pod 内的容器是不会跨宿主机的&#xff09;共享同一个网络命名空间&#xff0c; 相当于它们在同一台机器上一样&#xff0c;可以用 localho…

internet download manager 6.42怎么删除卸载,2024最新idm卸载不干净怎么解决

internet download manager 6.42简称为IDM&#xff0c;这是一款非常好用的下载软件&#xff0c;很多小伙伴都在使用。如果后续我们不再需要使用该软件&#xff0c;小伙伴们知道具体该如何将其卸载掉吗&#xff0c;其实卸载方法是非常简单的&#xff0c;只需要进行几个非常简单的…

Qt+Opencv:模板匹配

一、模板匹配应用场景闲聊 在很多机器视觉的应用场景都有用到模板匹配的功能&#xff0c;常常用来判断是否有目标检测对象&#xff0c;以及检测对象在图像中的位置。譬如在AOI检测软件中&#xff0c;通过拍摄Mark点的图像&#xff0c;进行mark模板的匹配&#xff0c;从而进行晶…

docker——数据卷(volume)概念及使用案例

docker数据卷 Docker的镜像是有⼀系列的只读层组合⽽来&#xff0c;当启动⼀个容器时&#xff0c;Docker加载镜像的所有只读层&#xff0c;并在最上层加⼊⼀个读写层。这个设计使得Docker可以提⾼镜像构建、存储和分发的效率&#xff0c;节省了时间和存储空间&#xff0c;然⽽…

【Java EE初阶三 】线程的状态与安全(上)

1. join方法与多线程 1.1 初识多线程 为了提高cpu得利用率&#xff0c;因此就引入了多个线程的概念&#xff1b;即每个线程负责完成整个程序的一部分工作即可。 写一个代码&#xff0c;让主线程&#xff0c;创建一个新的线程&#xff0c;由新线程负责完成运算&#xff08;12。…

Redis实现滚动周榜|滚动榜单|直播间榜单|排行榜|Redis实现日榜03

滚动排行榜与一般排行榜的最大区别在于数据的存储和查询方式。在一般排行榜中&#xff0c;起始点是固定的&#xff0c;例如某一周或某一个月&#xff0c;存储和查询时的时间范围也是固定的。而滚动排行榜则不同&#xff0c;在滚动排行榜中&#xff0c;榜单的取值范围是随着时间…

数模学习day01-层次分析法模型

已经一个多月没有更新过文章了&#xff0c;为了保住那绩点的意思微弱的优势&#xff0c;直接开摆&#xff0c;开始复习专业课和公共课考试了&#xff0c;结果虽然有遗憾但是还是算不错&#xff0c;至少没有掉到3.xx嘿嘿。 然后现在就要开始学习数学建模和算法同步了。接下来的文…

element ui Checkbox 多选框组件 lable不支持Object类型的值的问题

浅浅记录一下&#xff0c;遇到这个问题的心理路程吧&#xff0c;首先我遇到的问题是多选框的值回显不打对勾&#xff0c;&#xff08;例如&#xff1a;你新增的时候多选&#xff0c;然后点击编辑的时候选过的值没有被勾选&#xff0c;其实是被勾选上了&#xff0c;但是没有显示…

Ubuntu中fdisk磁盘分区并挂载、扩容逻辑卷

Ubuntu中fdisk磁盘分区并挂载、扩容逻辑卷 一&#xff1a;fdisk磁盘分区并挂载1.查看磁盘分区信息2.分区3.强制系统重新读取分区(避免重启系统)4.格式化分区5.创建挂载目录6.设置开机自动挂载&#xff1a;7.验证并自动挂载(执行了该命令不需要重启系统)8.查看挂载007.异常情况处…

Zulip:开源团队协作工具,高效沟通与远程办公 | 开源日报 No.126

zulip/zulip Stars: 18.9k License: Apache-2.0 Zulip 是一个开源的团队协作工具&#xff0c;拥有独特的基于主题的线程功能&#xff0c;结合了电子邮件和聊天的优点&#xff0c;使远程工作更加高效和愉快。它是唯一设计用于实时和异步对话的现代团队聊天应用程序。 其核心优势…

ubuntu 系统终端颜色设置

1 开启终端颜色 # 第一步&#xff1a; 在 ~/.bashrc 中设置 force_color_promptyes# 第二步&#xff1a; 执行 source ~/.bashrc2 对于精减的 .bashrc 在 ~/.bashrc 中添加以下内容&#xff0c;再执行 source ~/.bashrc &#xff1a; # uncomment for a colored prompt, if…

Vue 3插槽

Vue 3中的插槽&#xff08;Slots&#xff09;是一种强大的模式&#xff0c;用于创建可复用的组件&#xff0c;它允许你将模板插入到组件内部&#xff0c;同时保持组件的封装性和可重用性。在Vue 3中&#xff0c;插槽的使用变得更加灵活和强大。 基本插槽 默认插槽 : 在子组件…

Redis自动部署脚本编写

#!/bin/bash ck_ok() { if [ $? -ne 0 ] then echo "$1 error." exit 1 fi } download_redis() { cd /usr/local/src if [ -f redis-7.0.4.tar.gz ] then echo "当前目录已经存在redis-7.0.4.tar.gz&q…

【线性代数】通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗?

一、通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗&#xff1f; 如果你进行的矩阵乘法涉及一个线性方程组 Ax b&#xff0c;并且你乘以一个可逆矩阵 M&#xff0c;且产生新的方程组 M(Ax) Mb&#xff0c;那么这两个系统是等价的&#xff1b;它们具有相同的解集。这…

RabbitMq知识概述

本文来说下RabbitMq相关的知识与概念 文章目录 概述AMQP协议Exchange 消息如何保证100&#xff05;投递什么是生产端的可靠性投递可靠性投递保障方案 消息幂等性高并发的情况下如何避免消息重复消费confirm 确认消息、Return返回消息如何实现confirm确认消息return消息机制 消费…