基于数据分析的小区电量扩容推荐程序

一、课题内容和要求

1、课题内容

老旧小区的改造是一项重大的民生工程,其中电网的改造又是头等大事。电力系统由于供电容量及工作人员人手的限制,不可能一次完成所有小区的扩容工作。因此,根据已有用量的数据情况综合分析,挑选出急需增容的小区先行改造非常有必要,电力公司也同时会考虑到效益问题。

本课题提供抽样小区至少50户以上居民两年的用电情况进行数据的统计和分析,再根据电力公司拟增容的小区数据及效益需求,提供一份小区名单给电力公司作参考。

2、功能要求

系统中主要有用电数据统计员和供电公司工作人员两种身份的用户,两种用户具有不同的功能:

用电数据统计员:

1)提供原始的数据,包括:小区名称、家庭户名、用电的年月、月峰时用电量、谷时用电量、每月电费(这一项是计算出来的)。

2)形成各类统计报表,按家庭统计:每年的总用电量、电费;然后是小区统计:小区每个月的总用电量、总电费、平均到每一户的平均电量和电费。

3)对小区数据进行各类排序:按每月峰时用电量,谷时用电量、按每月电费总量、按每一户的平均电量。

供电公司工作人员:

1 查询功能:可以进行各类查询功能,可以按小区或用户查询用电具体报表数据;

2)需求提供:工作人员可以提供各小区用户平均电量各小区年电费总额小区年峰值量大小

3)查看功能:系统根据需求提供的数据,列出优先扩容的小区建议名单供工作人员查看。

二、需求分析

小区电量扩容推荐系统的功能框架图如图1所示

1 整体功能框架图

(1)提供可操作的多级菜单:

第一级菜单选择需要的数据年份。

第二级菜单提供区分两个用户,输出菜单两个用户选项,用于区分用电数据统计员和供电公司工作人员。根据工作人员鼠标点击来运行不同的功能,运行不同的函数。

第三级菜单进入用电数据统计员的界面:有提供数据,形成报表,形成排序三个功能供工作人员选择。第三级菜单进入供电公司工作人员的界面:有查询功能,需求提供,查看功能三个供工作人员选择:

(2)形成数据:对结构体进行嵌套,通过调用随机函数产生模拟数据,进行初步计算,放入存储原始数据的结构体中。

(3)形成报表:可选择家庭每年总电量电费,小区每月总电量,小区每户每月平均总电量,小区每户每月平均总电电费五种不同报表,生成折线图来显示数据内容。

(4)形成排序:按不同小区形成小区内部数据排序,可选择提供数据进行排序。

(5)查询功能:可以选择查询小区的数据或查询具体用户的数据。选择查询小区,能够查询小区的月总数据,年总数据;选择查询具体用户的数据,能够查询用户每一月的具体数据,月总数据,年总数据。

(6)需求读入和比较:读入需求并与实际数据进行比较,给出优先扩容小区名单。

7)形成图形化界面:将上述所有功能制成图形化界面,鼠标移动时能显示选项外的矩形展示光标,并能够用鼠标点击实现菜单流畅转跳,能够读入数据,形成数据用txt输出,不出现后台界面。

三、概要设计

1.主要存储结构

//用户数据结构体

struct users

{                

    int family_name;                                     //用户名

    int year_month[12];                                   //时间

    int peak_electricity[12];                                //每个月的峰时电量

    int valley_electricity[12];                               //每个月的谷时电量

    int total_month_electricity[12];                           //每个月的电量

    float electricity_fee_month[12];                          //每个月的电费

    int total_year_ectricitity;                                //年总电量

    float electricity_fee_year;                               //年总电费

    float peak_electricity_year;                              //年峰时电费

    float valley_electricity_year;                             //年谷时电费



};

typedef struct users Record;



//小区数据结构体

struct community

{

    char old_district_community[50];                        //小区名

    Record data[50];                                      //用户结构体

    int community_total_month_electricity[12];                 //小区每月总用电量

    int community_total_month_electricity_fee[12];             //小区每月总电费

    int community_average_usersmonth_electricity[12];         //用户月平均用电量

    int community_average_usersmonth_electricity_fee[12];      //用户月平均电费

    int community_average_year_electricity;                   //用户年平均用电量

    int community_total_year_ectricitity;                     //小区年总用电量

    int community_total_year_ectricitity_fee;                  //小区年总电费

    float community_peak_electricity_year;                   //小区年总峰时用电量             

};

typedef struct community Recordal;

2.主要函数流程

  1. 生成并存储函数:建立用户结构体嵌入小区结构体,用随机数产生信息并储存,此处用嵌套for循环写入。
  2. 绘图函数:将原始生成的随机数据储存进数组,将数组归一化,最后在划线连接点。
  3. 排序函数:将原始数据放入放进临时数组中,按照条件对用户数据进行排序,并循环输出多个小区排序。
  4. 查找函数:利用用户输入的小区名称或小区和用户名称进行顺序查找并找出,并多次for循环输出。
  5. 读入并比较函数:从工作人员读取数据,将工作人员的数据与自身数据比较,生成建议列表,最后输出。

四、源程序代码

四、源程序代码  
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>  
#include <stdlib.h>  
#include <time.h>  
#include<string.h>
#include <math.h>
#include <cstdio>
#include <easyx.h>
#include <conio.h>
#include <graphics.h> 
#include <GL/glut.h>
#include<string>

//输入宽字符包括小区名称和用户名称
wchar_t d[128];
wchar_t e[128];

#define TYE_MAX 6500
#define TYE_MIN 4500
#define EFY_MAX 5000
#define EFY_MIN 3500
#define CTME_MAX 25000
#define CTME_MIN 20000
#define CTMEF_MAX 15000
#define CTMEF_MIN 20000
#define CAUE_MAX 500
#define CAUE_MIN 400
#define CAUEF_MAX 400
#define CAUEF_MIN 300

//用户数据结构体
struct users
{
	char old_district[50];
	int family_name;
	int year_month[12];
	int peak_electricity[12];
	int valley_electricity[12];
	int total_month_electricity[12];
	float electricity_fee_month[12];
	int total_year_ectricitity;
	float electricity_fee_year;
	float peak_electricity_year;
	float valley_electricity_year;

};

typedef struct users Record;
//小区数据结构体
struct community
{
	char old_district_community[50];
	Record data[50];
	int community_total_month_electricity[12];
	int community_total_month_electricity_fee[12];
	int community_average_usersmonth_electricity[12];
	int community_average_usersmonth_electricity_fee[12];
	int community_average_year_electricity;
	int community_total_year_ectricitity;
	int community_total_year_ectricitity_fee;
	float community_peak_electricity_year;
};
typedef struct community Recordal;
/*-----------------------------------------------------------------------------------------------------------*/
void arrayToString(char* arr, char str[], int length) {
	// 将字符数组转换为字符串
	int i;
	for (i = 0; i < length; i++) {
		str[i] = arr[i];
	}
	str[length] = '\0';
}
/*-----------------------------------------------------------------------------------------------------------*/
//生成并计算所有数据
void generate_data_community(Recordal* all, Record* data, int count, int size)
{
	for (int i = 0; i < size; i++)
	{
		// 生成小区名称
		all[i].old_district_community[0] = 'A' + (i) % 26;
		// 生成每一户的名称、用电的年月、当月峰时用电量、谷时用电量、每月电费等  
		for (int m = 0; m < count; m++)
		{
			// 生成的家庭户名
			all[i].data[m].family_name = m + 1; 
			for (int n = 0; n < 12; n++) {
				// 生成用电年月(1-12月)
				all[i].data[m].year_month[n] = 00 + n + 1; 
				// 生成随机的当月峰时用电量(200-600度)
				all[i].data[m].peak_electricity[n] = rand() % 400 + 200; 
				// 生成随机的当月谷时用电量(1-100度) 
				all[i].data[m].valley_electricity[n] = rand() % 100;  
				// 计算每月总用电量
				all[i].data[m].total_month_electricity[n] = all[i].data[m].peak_electricity[n] 
												+all[i].data[m].valley_electricity[n];
				// 计算每月电费(按照峰值每度电0.8元,谷值每度电0.5元计算) 
				all[i].data[m].electricity_fee_month[n] = all[i].data[m].peak_electricity[n] * 0.8
												+ all[i].data[m].valley_electricity[n] * 0.5;
			}
			for (int j = 0, k = 0, q = 0, p = 0, r = 0; j < 12; j++)
			{
				k = k + all[i].data[m].total_month_electricity[j];
				q = q + all[i].data[m].electricity_fee_month[j];
				p = p + all[i].data[m].peak_electricity[j];
				r = r + all[i].data[m].valley_electricity[j];
				//生成一户每年总电量
				all[i].data[m].total_year_ectricitity = k;
				//生成一户每年总电费
				all[i].data[m].electricity_fee_year = q;
				//生成一户每年峰值总电量
				all[i].data[m].peak_electricity_year = p;
				//生成一户每年谷值总电量
				all[i].data[m].valley_electricity_year = r;
			}
		}
		//计算小区的数据
		for (int j = 0; j < 12; j++)
		{
			int k = 0, q = 0;
			for (int m = 0; m < count; m++)
			{
				k = k + all[i].data[m].total_month_electricity[j];
				q = q + all[i].data[m].electricity_fee_month[j];
				// 计算小区每月总用电量
				all[i].community_total_month_electricity[j] = k;
				//计算小区每月总电费
				all[i].community_total_month_electricity_fee[j] = q;
			}
			//计算小区每月每户平均总电量
			all[i].community_average_usersmonth_electricity[j] = 
				all[i].community_total_month_electricity[j] / count;
			//计算小区每月每户平均总电费
			all[i].community_average_usersmonth_electricity_fee[j] = 
				all[i].community_total_month_electricity_fee[j] / count;
		}
		for (int j = 0, k = 0, q = 0, p = 0; j < 12; j++)
		{
			k = k + all[i].community_total_month_electricity[j];
			q = q + all[i].community_total_month_electricity_fee[j];
			p = p + all[i].community_average_usersmonth_electricity[j];
			// 计算小区每年总用电量
			all[i].community_total_year_ectricitity = k;
			//计算小区每年总电量
			all[i].community_total_year_ectricitity_fee = q;
			//计算小区用户年平均用电量
			all[i].community_average_year_electricity = p;
		}
		for (int i = 0; i < size; i++)
		{
			for (int j = 0, k = 0; j < count; j++)
			{
				k = k + all[i].data[j].valley_electricity_year;
				all[i].community_peak_electricity_year = k;
			}
		}

	}

}
/*-----------------------------------------------------------------------------------------------------------*/
//对数据进行排序  
//按小区的平均家庭每月电量排序
void sort_data1(Recordal* all, Record* data, int size)
{
	//建立一个临时文件存放数据
	FILE* fp;
	fp = fopen("file.txt", "w");
	setbuf(fp, NULL);
	fflush(fp);
	fputs("小区的平均家庭每月电量\n", fp);
	// 创建一个临时数组用于排序过程  
	for (int i = 0; i < size; i++)
	{
		double temp_electricity_data[12] &#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值