目前大家比较熟悉共享单车的使用。请编制一个共享单车的管理程序,实现如下基本功能。假设有5种品牌的共享单车(品牌内容自定)。
针对该5种品牌的共享单车,自行设计一套包含每种单车的品牌名称、投放量、投放点、某一时间点的在用数量、每辆车的每天骑行次数及单次里程和总里程、开锁过程中发现的损坏次数等信息(所有相关数据均自行设计)的数据结构;
随着骑行活动的开展,待使用单车的数量将发生变化。要求能对每种单车的使用数量及待使用的数量进行查询统计并输出;
对于某一投放点的某一品牌的单车,如果无备用车(待使用的车均为备用车),或备用车均为损坏的车,系统应能给出信息提示;
对于损坏报修的车辆,系统能够进行及时的统计,并能在投放数量中削减损坏车辆的数量,形成真实的有效投放量;
能够对客户信息进行处理,包括注册的用户名、电话号码、骑行里程、骑行习惯(比如70%以上的出行时间集中在某个时间段,时间段按时钟整点划分)、每天平均的骑行时间等;
该系统能进行当日使用状况的统计,请用链表排序(排序算法不限)提示交易使用次数排在前三名的单车品牌;
针对该5种品牌的共享单车,自行设计一套包含每种单车的品牌名称、投放量、投放点、某一时间点的在用数量、每辆车的每天骑行次数及单次里程和总里程、开锁过程中发现的损坏次数等信息(所有相关数据均自行设计)的数据结构;
随着骑行活动的开展,待使用单车的数量将发生变化。要求能对每种单车的使用数量及待使用的数量进行查询统计并输出;
对于某一投放点的某一品牌的单车,如果无备用车(待使用的车均为备用车),或备用车均为损坏的车,系统应能给出信息提示;
对于损坏报修的车辆,系统能够进行及时的统计,并能在投放数量中削减损坏车辆的数量,形成真实的有效投放量;
能够对客户信息进行处理,包括注册的用户名、电话号码、骑行里程、骑行习惯(比如70%以上的出行时间集中在某个时间段,时间段按时钟整点划分)、每天平均的骑行时间等;
该系统能进行当日使用状况的统计,请用链表排序(排序算法不限)提示交易使用次数排在前三名的单车品牌;
假设每种单车的使用是收费的,如第一个小时是免费的,第二个小时开始每小时收费0.5元,各品牌可各自推出优惠收费条件(优惠条件请自定义),然后根据假设的使用情况,统计出各种品牌的日营业额,并对各品牌的受欢迎程度进行排序。
有些地方如果写的比较乱 就是因为那个地方之前出过bug...
// 共享单车.cpp :
/*
使用说明:
*为了测试简单,投放地点用数字1-5代替 ,车辆种类用数字1-5代替,分别为1牌车,2牌车……
*存在一些冗余函数和变量
*利润的计算比较难,因为是以真实的时间为参考,所以至少一个小时才会有利益
*/
//
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <windows.h>
#include <map>
#include <cstdlib>
#include <ctime>
#include <conio.h>
#define MAX 65536
#define LEN_ sizeof(Node_user)
#define LEN_1 sizeof(Node_bike)
using namespace std;
int totnumber_user = 0;//用户人数
int totnumber_bike[6];//车辆数
int totnumber_bike_inuse[6];//正在用的车辆数
multimap<int, int> totprofit;//总利润
//骑行次数
struct tot_ride
{
int category;
int cnt;
tot_ride* next;
}firstbike;
struct Time { //作为一个时间节点或者时间段使用
int minu, hour, day;
Time(int a = 0, int b = 0, int c = 0) :minu(a), hour(b), day(c) {}
Time(SYSTEMTIME &a) {
minu = a.wMinute;
hour = a.wHour;
day = a.wDay;
}
Time operator +(Time &a) { //只做时间段累加
Time b = a;
b.minu += minu;
b.hour += hour;
b.hour += b.minu / 60;
b.minu %= 60;
return b;
}
Time operator -(Time &a) { //只做计算时间差
Time b = a;
int h = hour;
if (b.day != day)//只考虑半夜骑车的情况,不考虑骑24小时以上...
{
if (b.day>day)b.hour += 24;
else h += 24;
}
int m = abs((h - b.hour) * 60 + minu - b.minu);
b.minu = m % 60;
b.hour = m / 60;
return b;
}
Time operator =(SYSTEMTIME &a) {
minu = a.wMinute;
hour = a.wHour;
day = a.wDay;
}
int operator /(int day) { //只做平均时间
int min = hour * 60 + minu;
return min / day;
}
};
struct Ride_time {
Time st, ed;//起始时间和结束时间
Time lasting;
Ride_time(int a = 0, int b = 0, int c = 0) :st(a), ed(b), lasting(c) {}
Ride_time(Time &a, Time &b) :st(a), ed(b) { lasting = a - b; }
};
struct Ride_info { //骑行历史信息
int ride_cnt;//骑行次数
double totdis; //总距离 距离都无法更新
int totday;
double dis[MAX];//每次骑行距离
Ride_time ride_time[MAX];
Time totime;
Ride_info(int a=0,int b=0,int c=0):totime(0),ride_cnt(a),totdis(b),totday(c) {memset(dis, 0, sizeof(dis));}
void update(double dis0, Ride_time a) { //更新数据
ride_cnt++;
dis[ride_cnt] = dis0;
totdis += dis0;
ride_time[ride_cnt] = a;
if (ride_time[ride_cnt].st.day != ride_time[ride_cnt].ed.day || ride_cnt != 0 && ride_time[ride_cnt].st.day != ride_time[ride_cnt - 1].ed.day || ride_cnt == 0)totday++;
totime = totime + a.lasting;
}
int average_ridetime() { //每天骑多少分钟
if (totday == 0)return 0;
return totime / totday;
}
void main_ride() { //骑行习惯输出
int hours[13] = { 0 };
for (int i = 1; i <= ride_cnt; i++)
hours[ride_time[i].st.hour / 2]++;
int max1 = 0, t;
for (int i = 0; i<12; i++)
{
if (hours[i]>max1)
{
max1 = hours[i];
t = i;
}
}
if(ride_cnt)
printf("有%d%%的出行时间集中在%d——%d时间段\n每天平均骑行时间为%d分钟\n", max1 / ride_cnt * 100, t * 2, t * 2 + 2, average_ridetime());
}
};
//车辆数据
struct Node_bike {
char number[105];//车牌
char pw[105];//密码
int catrgory;//种类 好像打错了 但是不影响 1-5
char address[5];//目前所在位置 只有一位 1-5
int ride_cnt;//被骑次数
Time used_time;//使用时间
int damaged_cnt;//损坏次数
bool isbad;
bool isuse;
bool be;//是否储存了数据,冗余
Node_bike* next;
Node_bike() {
ride_cnt = 0;
damaged_cnt = 0;
next = NULL;
catrgory = 0;
be = 0;
}
double charge() {
srand((unsigned)time(NULL));
if (used_time.hour <= 1)return 0;
if (catrgory == 0)//1号车前两个小时免费
if (used_time.hour <= 2)return 0;
else return (used_time.hour - 2)*0.5;
else if (catrgory == 1)
{
if (used_time.hour >= 3)//2号车骑3个小时以上减一块钱
return (used_time.hour - 1)*0.5 - 1;
else (used_time.hour - 1)*0.5;
}
else if (catrgory == 2)//3号车0.4元一小时
return (used_time.hour - 1)*0.4;
else if (catrgory == 3)//4号车随机减两块钱一下的金额(好想法)
{
double x = rand() *3.1415926;
int t = (used_time.hour - 1)*0.5 - (x - (int)(x / 2) * 2);
return t > 0 ? t : 0;
}
else return (used_time.hour - 1)*0.5;//5号车不优惠
}
};
//用户数据
struct Node_user {
int number_user;
char phone[105];
char username[105];
char password[105];
bool isride;