共享单车管理系统

目前大家比较熟悉共享单车的使用。请编制一个共享单车的管理程序,实现如下基本功能。假设有5种品牌的共享单车(品牌内容自定)。
针对该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;
	
  • 11
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值