一、课题内容和要求
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.主要函数流程
- 生成并存储函数:建立用户结构体嵌入小区结构体,用随机数产生信息并储存,此处用嵌套for循环写入。
- 绘图函数:将原始生成的随机数据储存进数组,将数组归一化,最后在划线连接点。
- 排序函数:将原始数据放入放进临时数组中,按照条件对用户数据进行排序,并循环输出多个小区排序。
- 查找函数:利用用户输入的小区名称或小区和用户名称进行顺序查找并找出,并多次for循环输出。
- 读入并比较函数:从工作人员读取数据,将工作人员的数据与自身数据比较,生成建议列表,最后输出。
四、源程序代码
四、源程序代码
#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] &#