某停车场停车费用计算规则如下:
①每小时 10 元,不足 1 小时的部分按照 1 小时计算;
②超过 8 小时,未超过 24 小时的按照 8 小时计算;
③超过 24 小时,超过部分按照上述标准重新计算。
本程序的任务是模拟一个智能停车管理系统,可以进行汽车停车入库、出场结算、数据导入、数据导出、查询、排序、停车费用汇总、僵尸车统计、输出显示、异常处理等操作,具体要求如下:
入库:输入车牌号码和入场时间(入场时间由相关时间函数自动获取并处理),完成停车入库操作。
注:某车牌已入场则不允许再次进行入库操作;若某车牌号码已经完成入场、出场操作,允许其再次入场。
出库:输入车牌号码、出场时间(出场时间由相关时间函数自动获取并处理)和停车时长,完成出库、停车费用结算。
3、数据导入:实现停车信息从文件parkingLot.txt 读入。
4、数据导出:将停车信息存放到文件 parkingLot_new.txt 中。
5、查询:查找车辆停车信息(不查找已出场的停车信息)。
6、排序:对所有停车信息,按入场时间从前到后排序,排序算法不限。
7、停车费用汇总:计算停车场目前总收入(还没有出场结算的不计算在内)。
8、僵尸车统计:遍历已有停车信息,查找停车 7 天及以上还未出场的车辆,显示僵尸车列表。
注:停车场中超过 7 天还未出场的车辆称为僵尸车,这种车辆未来很可能继续滞留在停车场,造成车位紧张,需要进行统计以便及时处理(异常车辆摸排)。
运行界面及部分结果如下:
测试文件参考如下
:
1 沪A7828 2023-07-29:12:36:00 2023-07-29:18:48:00 6.2 70
2 沪B6826 2023-07-24:08:08:00 2023-07-25:11:54:00 27.9 120
3 浙B0529 2023-07-25:12:25:00 2023-07-27:20:49:00 56.4 240
4 沪D9855 2023-07-23:07:17:00 2023-07-24:12:22:00 29.1 140
5 浙A1234 2023-07-28:08:38:00 0 0 0
6 皖B5678 2023-07-30:10:27:00 0 0 0
7 沪A7299 2023-08-02:14:55:00 0 0 0
程序框架参考如下:
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#define MAX_CAPACITY 100
struct ParkingRecord
{
int id; //停车入库单号 ,从1开始
char licenseNum[10];//车牌号码
char timeIn[20]; //停车入场时间
char timeOut[20]; //停车出场时间
float parkTime; //停车时长
int cost; //停车费用
};
time_t get_timestamp(char* time_str)//日期格式转时间戳
{
struct tm tm;//时间结构体
time_t timestamp;//时间类型,表示1970.01.01到特定日期的秒数
int a;//sscanf的返回值,不给返回值会警告
a = sscanf(time_str, "%d-%d-%d:%d:%d:%d", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min,&tm.tm_sec);//将数据写入结构体
//与时间戳相对应的时间结构体中tm_year的值从1900开始,tm_mon的取值范围是[0,11],故转时间戳前要将实际年份减去1900,实际月份减去1,之后才能转成正确的时间戳
tm.tm_year -= 1900;
tm.tm_mon -= 1;
timestamp = mktime(&tm);//转时间戳
return timestamp;
}
int search(struct ParkingRecord parkingLot[],int n,char licenseNum[])//函数功能:查找车辆停车信息(不查找已出场的停车信息)。
{
}
int parkCar(struct ParkingRecord parkingLot[],int n)//函数功能:输入车牌号码和入场时间(入场时间由相关时间函数自动获取并处理),完成停车入库操作。
{
}
int charge(int hours)//函数功能:按照费用计算规则计算停车费用
{
}
void checkOutCar(struct ParkingRecord parkingLot[],int n,char licenseNum[10])//函数功能:输入车牌号码、出场时间(出场时间由相关时间函数自动获取并处理)和停车时长,完成出库、停车费用结算。
{
}
void ShowRecords(struct ParkingRecord parkingLot[],int n)//函数功能:显示所有停车信息。
{
}
int import_data(struct ParkingRecord parkingLot[])//函数功能:实现停车信息从文件parkingLot.txt 读入。
{
}
void save_data(struct ParkingRecord parkingLot[], int n)//函数功能:将停车信息存放到文件 parkingLot_new.txt 中(为测试方便保留原parkingLot.txt中的数据)。
{
}
void sort(struct ParkingRecord parkingLot[],int n)//函数功能:对所有停车信息,按入场时间从前到后排序,排序算法不限。
{
}
int sum(struct ParkingRecord parkingLot[],int n)//函数功能:计算停车场目前总收入(还没有出场结算的不计算在内)。
{
}
void abnormal_data(struct ParkingRecord parkingLot[],int n)//函数功能:遍历已有停车信息,查找停车 7 天及以上还未出场的车辆,显示僵尸车列表。
{
}
void display_data(struct ParkingRecord parkingLot[],char licenseNum[],int n)//函数功能:输入车牌号,输出显示该车辆的所有停车记录。
{
}
void menu(void)//菜单显示
{
printf("\n 智能停车系统\n 1:显示\n 2:查找\n 3:停车入库\n 4:出库结算\n 5:计算总费用\n 6:排序\n 7:导出\n 8异常车辆摸排\n 0:退出\n");
}
int main(void)
{
struct ParkingRecord parkingLot[MAX_CAPACITY];//存放停车信息的结构体数组
int parkCout=0;//停车记录数
char licenseNum[10];
int choice,total;
menu();
parkCout=import_data(parkingLot);//数据初始化 ,从文本文件导入
ShowRecords(parkingLot,parkCout);
while(1)
{
printf("请输入你的选择(0~8):");
scanf("%d",&choice);
if(choice==0)
{
printf("谢谢使用!\n");
break;
}
else if(choice==1)
{
ShowRecords(parkingLot,parkCout);
}
else if(choice==2)
{
printf("请输入你要查找的车牌号码:");
scanf("%s",licenseNum);
display_data(parkingLot,licenseNum,parkCout);
}
else if(choice==3)
{
parkCout=parkCar(parkingLot,parkCout);
}
else if(choice==4)
{
printf("请输入要出库结算的车牌号码:\n");
scanf("%s",licenseNum);
checkOutCar(parkingLot,parkCout,licenseNum);
}
else if(choice==5)
{
total=sum(parkingLot,parkCout);
printf("停车场目前总收入为%d元\n",total);
}
else if(choice==6)
{
sort(parkingLot,parkCout);
save_data(parkingLot,parkCout);
ShowRecords(parkingLot,parkCout);
}
else if(choice==7)
{
save_data(parkingLot,parkCout);
}
else if(choice==8)
{
abnormal_data(parkingLot,parkCout);
}
}
return 0;
}
完整源码
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#define MAX_CAPACITY 100
struct ParkingRecord {
int id; // 停车入库单号,从1开始
char licenseNum[10];// 车牌号码
char timeIn[20]; // 停车入场时间
char timeOut[20]; // 停车出场时间
float parkTime; // 停车时长
int cost; // 停车费用
};
time_t get_timestamp(char* time_str) {
struct tm tm;
time_t timestamp;
int a;
a = sscanf(time_str, "%d-%d-%d %d:%d:%d", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec);
tm.tm_year -= 1900;
tm.tm_mon -= 1;
timestamp = mktime(&tm);
return timestamp;
}
int search(struct ParkingRecord parkingLot[], int n, char licenseNum[]) {
for (int i = 0; i < n; i++) {
if (strcmp(parkingLot[i].licenseNum, licenseNum) == 0 && parkingLot[i].timeOut[0] == '\0') {
return i;
}
}
return -1;
}
int parkCar(struct ParkingRecord parkingLot[], int n) {
if (n >= MAX_CAPACITY) {
printf("停车场已满,无法入库!\n");
return n;
}
struct ParkingRecord newRecord;
newRecord.id = n + 1;
printf("请输入车牌号码:");
scanf("%s", newRecord.licenseNum);
if (search(parkingLot, n, newRecord.licenseNum) != -1) {
printf("该车牌已入场,不允许再次入库!\n");
return n;
}
time_t now = time(NULL);
strftime(newRecord.timeIn, 20, "%Y-%m-%d %H:%M:%S", localtime(&now));
newRecord.timeOut[0] = '\0';
newRecord.parkTime = 0;
newRecord.cost = 0;
parkingLot[n] = newRecord;
printf("车牌 %s 已入库,入场时间:%s\n", newRecord.licenseNum, newRecord.timeIn);
return n + 1;
}
int charge(int hours) {
if (hours <= 8) {
return hours * 10;
} else if (hours <= 24) {
return 80;
} else {
return 80 + charge(hours - 24);
}
}
void checkOutCar(struct ParkingRecord parkingLot[], int n, char licenseNum[10]) {
int index = search(parkingLot, n, licenseNum);
if (index == -1) {
printf("未找到该车牌的入场记录!\n");
return;
}
time_t now = time(NULL);
strftime(parkingLot[index].timeOut, 20, "%Y-%m-%d %H:%M:%S", localtime(&now));
time_t timeIn = get_timestamp(parkingLot[index].timeIn);
parkingLot[index].parkTime = difftime(now, timeIn) / 3600.0;
parkingLot[index].cost = charge(ceil(parkingLot[index].parkTime));
printf("车牌 %s 已出库,出场时间:%s,停车时长:%.2f小时,费用:%d元\n",
parkingLot[index].licenseNum, parkingLot[index].timeOut, parkingLot[index].parkTime, parkingLot[index].cost);
}
void ShowRecords(struct ParkingRecord parkingLot[], int n) {
printf("停车记录如下:\n");
for (int i = 0; i < n; i++) {
printf("ID: %d, 车牌: %s, 入场时间: %s, 出场时间: %s, 停车时长: %.2f小时, 费用: %d元\n",
parkingLot[i].id, parkingLot[i].licenseNum, parkingLot[i].timeIn, parkingLot[i].timeOut, parkingLot[i].parkTime, parkingLot[i].cost);
}
}
int import_data(struct ParkingRecord parkingLot[]) {
FILE *file = fopen("parkingLot.txt", "r");
if (!file) {
printf("无法打开文件 parkingLot.txt\n");
return 0;
}
int count = 0;
while (fscanf(file, "%d %s %s %s %f %d", &parkingLot[count].id, parkingLot[count].licenseNum, parkingLot[count].timeIn, parkingLot[count].timeOut, &parkingLot[count].parkTime, &parkingLot[count].cost) != EOF) {
count++;
}
fclose(file);
return count;
}
void save_data(struct ParkingRecord parkingLot[], int n) {
FILE *file = fopen("parkingLot_new.txt", "w");
if (!file) {
printf("无法打开文件 parkingLot_new.txt\n");
return;
}
for (int i = 0; i < n; i++) {
fprintf(file, "%d %s %s %s %.2f %d\n", parkingLot[i].id, parkingLot[i].licenseNum, parkingLot[i].timeIn, parkingLot[i].timeOut, parkingLot[i].parkTime, parkingLot[i].cost);
}
fclose(file);
}
void sort(struct ParkingRecord parkingLot[], int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (get_timestamp(parkingLot[j].timeIn) > get_timestamp(parkingLot[j + 1].timeIn)) {
struct ParkingRecord temp = parkingLot[j];
parkingLot[j] = parkingLot[j + 1];
parkingLot[j + 1] = temp;
}
}
}
}
int sum(struct ParkingRecord parkingLot[], int n) {
int total = 0;
for (int i = 0; i < n; i++) {
if (parkingLot[i].timeOut[0] != '\0') {
total += parkingLot[i].cost;
}
}
return total;
}
void abnormal_data(struct ParkingRecord parkingLot[], int n) {
printf("僵尸车列表:\n");
for (int i = 0; i < n; i++) {
if (parkingLot[i].timeOut[0] == '\0') {
time_t now = time(NULL);
time_t timeIn = get_timestamp(parkingLot[i].timeIn);
if (difftime(now, timeIn) >= 7 * 24 * 3600) {
printf("车牌: %s, 入场时间: %s\n", parkingLot[i].licenseNum, parkingLot[i].timeIn);
}
}
}
}
void display_data(struct ParkingRecord parkingLot[], char licenseNum[], int n) {
int found = 0;
for (int i = 0; i < n; i++) {
if (strcmp(parkingLot[i].licenseNum, licenseNum) == 0 && parkingLot[i].timeOut[0] == '\0') {
printf("ID: %d, 车牌: %s, 入场时间: %s, 出场时间: %s, 停车时长: %.2f小时, 费用: %d元\n",
parkingLot[i].id, parkingLot[i].licenseNum, parkingLot[i].timeIn, parkingLot[i].timeOut, parkingLot[i].parkTime, parkingLot[i].cost);
found = 1;
}
}
if (!found) {
printf("未找到该车牌的入场记录!\n");
}
}
void menu(void) {
printf("\n 智能停车系统\n 1:显示\n 2:查找\n 3:停车入库\n 4:出库结算\n 5:计算总费用\n 6:排序\n 7:导出\n 8:异常车辆摸排\n 0:退出\n");
}
int main(void) {
struct ParkingRecord parkingLot[MAX_CAPACITY];
int parkCount = 0;
char licenseNum[10];
int choice, total;
menu();
parkCount = import_data(parkingLot);
ShowRecords(parkingLot, parkCount);
while (1) {
printf("请输入你的选择(0~8):");
scanf("%d", &choice);
if (choice == 0) {
printf("谢谢使用!\n");
break;
} else if (choice == 1) {
ShowRecords(parkingLot, parkCount);
} else if (choice == 2) {
printf("请输入你要查找的车牌号码:");
scanf("%s", licenseNum);
display_data(parkingLot, licenseNum, parkCount);
} else if (choice == 3) {
parkCount = parkCar(parkingLot, parkCount);
} else if (choice == 4) {
printf("请输入要出库结算的车牌号码:\n");
scanf("%s", licenseNum);
checkOutCar(parkingLot, parkCount, licenseNum);
} else if (choice == 5) {
total = sum(parkingLot, parkCount);
printf("停车场目前总收入为%d元\n", total);
} else if (choice == 6) {
sort(parkingLot, parkCount);
save_data(parkingLot, parkCount);
ShowRecords(parkingLot, parkCount);
} else if (choice == 7) {
save_data(parkingLot, parkCount);
} else if (choice == 8) {
abnormal_data(parkingLot, parkCount);
}
}
return 0;
}
包可以运行的
CoderJoon一个致力于帮助大学的解决难题的专业coder