居民物业管理系统(数据结构单链表版)

前言

本文主要是【居民物业管理系统】——居民物业管理系统分析与设计的文章,如果有什么需要改进的地方还请大佬指出⛺️

作者简介:大家好,我是听风与他

☁️博客首页:CSDN主页听风与他

每日一句:狠狠沉淀,顶峰相见

​​​​​​​

本实训项目是小区物业管理系统,为了提高物业管理公司的服务质量、工作效率,拟定开发一个物业管理系统,实现对居民信息管理、收费管理、停车场车位管理物业服务的自动化管理。

项目组长:xxx项目成员:xxx xxx

项目分工:项目共有四个模块,分别为居民信息管理、物业收费管理、来客访问管理、设备报修管理。

xxx负责居民信息管理及物业收费管理模块。居民信息管理:建立住户信息库,实现住户档案数据的计算机化管理,使居民的登记与查询简易而快速,对居民的信息查询应有一定的权限检测,按权限进行查询,分级管理,同是应有更新功能。  物业收费管理:对纳入社区收费管理的收费项目进行电子收费管理(主要是指对煤气表、电表、水表的自动抄表与电子收费),提供应缴费用的查询、定期催缴、收费项目和计费方式的变更维护、定期统计收费情况等功能,同时将其他各子系统相应的收费信息递交收费管理中进行统一结算。 

xxx负责访问管理。来客访问管理:对出入小区的外来人员进行人员信息、出入信息的登记、汇总、监督管理,并提供查询功能。

xxx负责设备报修管理模块。设备报修管理:对日常设备的报修信息进行登记,对设备报修,及其处理情况有查询、考核与统计等管理功能,定期产生考核情况明细,报修信息的录入具有多条途径,相应的费用通过收费管理功能进行统一的结算。

基本要求:

  1. 按功能定义函数,划分好函数功能,进行模块化设计,各个功能模块用函数的形式来实现。
  2. 设计出的界面友好,易读懂且便于操作。
  3. 程序能成功运行,各个功能基本实现。
  4. 代码有大量注释,易读懂,且代码方便进行修改。
  5. 提供程序相应的测试方案。
  • 需求分析

6.1目的

为了提高物业管理公司的服务质量、工作效率,利用小区物业管理系统,根据管理员拥有的权限,给予多种功能,实现对居民信息管理、收费管理、停车场车位管理物业服务的自动化管理,让小区物业管理变得方便、快捷。

6.2系统设计需求

(1):建立住户信息库,实现住户档案数据的计算机化管理,使居民的登记与查询简易而快速,对居民的信息查询应有一定的权限检测,按权限进行查询,分级管理,同时应有更新功能。

(2)对纳入社区收费管理的收费项目进行电子收费管理(主要是指对煤气表、电表、水表的自动抄表与电子收费),提供应缴费用的查询、定期催缴、收费项目和计费方式的变更维护、定期统计收费情况等功能。

(3)对出入小区的外来人员进行人员信息、出入信息的登记、汇总、监督管理,并提供查询功能。

(4)对日常设备的报修信息进行登记,对设备报修,及其处理情况有查询、考核与统计等管理功能,定期产生考核情况明细。

  • 可行性分析

在开发系统之前要进行系统可行性分析,目的是用最简单的方法来解决最大的问题,程序一旦开发出来满足了用户的需要,所带来的便利和利益也很大。本系统主要从技术、经济、操作三个方面来进行调查研究和可行性分析。

7.1技术可行性分析

本系统开发选择c语言技术,大大减少了使用windows编程的难度,减少了开发人员在设计算法上的难度,同时,本系统选择Dev-C++作为编译工具,它环境简单,友好的界面以及强大的 功能,给程序开发人员带来了极大的便利,后台设计选择使用文本文档来建立、存放用户信息,因而本系统的技术是可行的。

7.2经济可行性分析

在疫情防控形势下,本系统进行软件开发仅需一台普通的计算机便可完成实现开发,开发难度不大,因而其成本低。且该系统软件的投入使用,可以实现更加快速高效的疫情防控形势下小区物业管理,同时还能实现对人力资源和管理资源的有效节约,因而在当前环境背景下小区物业管理系统在经济上完全可行。

7.3操作可行性分析

本系统采用基于移动端用电脑安装软件就能够进行访问和操作,且界面简单易操作,该系统的可操作性,主要是随着网络技术发展,计算机网络控制的高效简便极大程度提高了工作的效率和准确度,对于数据化管理可以更好的提高工作效率,所以本系统的操作问题是可行的。

经过总结,本系统在经济方面、技术方面、操作方面的条件都得以满足,为此系统的开发具备了可行性条件。

  • 系统流程的分析   

8.1系统流程图                                                  居民物业管理系统(数据结构单链表版)_第1张图片

图一  系统流程图

8.2系统用例图

居民物业管理系统(数据结构单链表版)_第2张图片

图二  系统用例图

8.3系统实体图

居民物业管理系统(数据结构单链表版)_第3张图片

                        图三 业主信息实体图

居民物业管理系统(数据结构单链表版)_第4张图片

图四 物业费信息实体图

居民物业管理系统(数据结构单链表版)_第5张图片

图五 外来人员信息实体图

居民物业管理系统(数据结构单链表版)_第6张图片

图六 报修信息实体图

8.4功能流程图

居民物业管理系统(数据结构单链表版)_第7张图片

图七  居民信息管理功能流程图

居民物业管理系统(数据结构单链表版)_第8张图片

图八  物业收费管理功能流程图

居民物业管理系统(数据结构单链表版)_第9张图片

                            图九 来客访问管理功能流程图

      居民物业管理系统(数据结构单链表版)_第10张图片

图十   设备报修管理功能流程图

  • 系统界面功能展示

输入正确的管理用户名和密码后可进入系统

居民物业管理系统(数据结构单链表版)_第11张图片

进入系统后,主页面有四个主功能板块,输入相应的数字即可进入对应的功能板块。

居民物业管理系统(数据结构单链表版)_第12张图片

进入居民信息管理功能区,可执行四个功能

居民物业管理系统(数据结构单链表版)_第13张图片

进入物业收费管理功能区,可执行四个功能

居民物业管理系统(数据结构单链表版)_第14张图片

进入来客访问管理功能区,可执行四个功能

居民物业管理系统(数据结构单链表版)_第15张图片

进入设备报修管理功能区,可执行三个功能

居民物业管理系统(数据结构单链表版)_第16张图片

实验代码:

管理员账号:admin

密码:123456

#define _CRT_SECURE_NO_WARNINGS 
#include
#include
#include
#include
#include
#include
#include
//8项数据
//居民信息结构体 
typedef struct Node
{
	int ID;//用户ID 
	char name[10]; //姓名
	char sex[10];  //性别
	char IDnumber[10];//身份证号
	char phone[10];   // 手机号
	int building; //楼号
	int roomID;   //房号
	int roomarea;  //住房面积
	struct Node *next; 
}SLNode;
//13项数据 
//物业费结构体 
typedef struct node {
	int ID;//用户ID 
	char name[10];//用户姓名
	int gas_fee;//煤气
	int water_fee;//水费单价 
	int power_fee;//电费单价 
	int park_fee;//停车费
	int repair_fee;//报修费
	int gas;//煤气用度 
	int water;//水用度
	int power; //电单用度
	int total;//总费用 
	char time[20];//时间
	char bz[10]; //备注 
	struct node *next;
}Fee;
//外来人员信息结构体 
typedef struct NODE 
{
	char name[10]; //姓名
	char sex[10];  //性别
	char phone[10];   // 手机号
    char ad_name[10];//值班管理人员姓名 
    char time[20];//时间 
	struct NODE *next; 
}Out;
//设备维修信息结构体 
typedef struct NOde
{
	int ID;//用户ID 
	char water[10];//水系统 
	char elec[10];//电 系统 
	int water_level;//维修水平 
	int elec_level;//维修水平 
	char time[20];//时间 
	struct NOde *next;
}SBei;
//声明相关的函数
void MM_pass();//密码判定函数 
void UI_showA();//居民信息管理页面 
void UI_showB();//物业收费管理页面 
void UI_showC();//来客访问管理页面 
void UI_showD();//设备报修管理页面
void FUN();//总体功能函数 
void FUN_A();//居民信息管理系统
void FUN_B();//物业收费管理系统
void FUN_C();//来客访问管理系统
void FUN_D();//设备报修管理系统
void EXIT_ALL();//退出总系统页面 
void EXIT();//退出四大信息管理页面 
SLNode* createlist();//链表A生成函数 
Fee* createlist_B();//链表B生成函数
Out* createlist_C();//链表C生成函数
SBei* createlist_D();//链表D生成函数 
//A
void OAD_addnew(); //添加用户
void OAD_select();//查询用户 
void OAD_change();//修改用户信息 
void OAD_delete(); //删除功能 
//B
void OBD_select();//查询功能 
void OBD_urge();//定期催缴功能 
void OBD_change();//费用维护功能 
void OBD_count();//定期统计收费功能
void OBD_fee(int ID);//返回界面
void OBD_addnew();//添加收费信息 
//C
void OCD_addnew();//添加外来人员
void OCD_select();//查询外来人员信息 
void OCD_ad_select();//监管信息查询  
//D
void ODD_addnew();//添加 
void ODD_select();//查询 
void ODD_produce();//考核情况 
//=======================================================================
//密码判定函数
void MM_pass() 
{
	//首先进行用户名判断,当存在此用户名后 再进行与该用户名 匹配的密码 判断 。当密码输入3次错误时 退出程序
	int count = 0, a, i;
	char MM[10] = { "123456" }, MI[10]; //密码存放
	char UW[10] = { "admin" }, UU[10]; //用户名存放
	//-------------------------------------------------------------	
	for (i = 0; i<8; i++)                    //UI欢迎界面
	{
		printf("\n");
	}
	for (i = 0; i<30; i++)
	{
		printf(" ");
	}
	printf("欢迎进入物业管理系统\n");
//-------------------------------------------------------------------------------	
	while (1)			//进入循环				//判断用户名是否存在
	{
		for (i = 0; i<30; i++)
		{
			printf(" ");
		}
		printf("请输入用户名:");  //提示输入用户名
		gets(UU);       //键盘得到 用户名
 
		if (strcmp(UW, UU) == 0)    //如果用户名存在 则判断密码是否正确
		{
		
			for (i = 0; i<30; i++)
			{
				printf(" ");
			}
			printf("请输入密码:");
			for (count = 0; count<3; count++)   //判断密码是否正确
			{
 
				gets(MI);
				a = strcmp(MM, MI);
				if (a == 0)                    // 如果比对 成功
				{
					system("cls");
					return ;                 //返回值,结束此函数
				}
				if (count == 0 || count == 1) //比对不成功
				{
					for (i = 0; i<30; i++)
					{
						printf(" ");
					}
					printf("请输入密码:"); //提示重新输入密码
				}
			}
			//由于执行过count++ 则count为3
			if (count >= 3)                    //密码输错3次 程序锁定 错误判定
			{
				for (i = 0; i<25; i++)
				{
					printf(" ");
				}
				printf("密码3输入错误,程序锁定,退出重试。\n");
				getchar();
				exit(0);
			}
			
		}
		else
		{
			for (i = 0; i<30; i++)
			{
				printf(" ");
			}
			printf("查无此用户!\n");
			
		}
	}	
}
//=======================================================================
//进入界面 UI 实现
void UI_show()       
{
	int i, j;
	system("cls");
//--------------------------------------------------------------------
	printf("\n");
	for (i = 0; i < 75; i++)   //数字  控制 上方 = 数量 
	{
		printf("=");
	}
	printf("\n");
	for (i = 0; i < 30; i++)
	{
		printf(" ");
	}
	printf("欢迎进入物业管理系统");
	for (i = 0; i < 30; i++)
	{
		printf(" ");
	}
	printf("\n");
	for (i = 0; i < 75; i++)   //数字  控制 上方 = 数量 
	{
		printf("=");
	}
	//实现上方欢迎界面
//--------------------------------------------------------------------
	printf("\n\n\n");
	for (i = 0; i < 33; i++)                          //以下实现  菜单界面功能选择
	{
		printf(" ");
	}
	printf("请选择以下功能:\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("1、居民信息管理\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("2、物业收费管理\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("3、来客访问管理\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("4、设备报修管理\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("5、退出系统\n");
 
	printf("\n\n");
 
	for (i = 0; i < 75; i++)   //数字  控制 上方 = 数量 
	{
		printf("=");
	}
	printf("\n\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("请选择:");
	//实现界面UI
	
}

 //进入界面 UI 实现居民信息管理系统 
void UI_showA()       
{
	system("cls"); 
	int i, j;
//--------------------------------------------------------------------
	printf("\n");
	for (i = 0; i < 75; i++)   //数字  控制 上方 = 数量 
	{
		printf("=");
	}
	printf("\n");
	for (i = 0; i < 30; i++)
	{
		printf(" ");
	}
	printf("欢迎进入居民信息管理系统");
	for (i = 0; i < 30; i++)
	{
		printf(" ");
	}
	printf("\n");
	for (i = 0; i < 75; i++)   //数字  控制 上方 = 数量 
	{
		printf("=");
	}
	//实现上方欢迎界面
//--------------------------------------------------------------------
	printf("\n\n\n");
	for (i = 0; i < 33; i++)                          //以下实现  菜单界面功能选择
	{
		printf(" ");
	}
	printf("请选择以下功能:\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("1、查询居民信息\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("2、添加居民信息\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("3、修改居民信息\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("4、删除居民信息\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("5、退出系统\n");
 
	printf("\n\n");
 
	for (i = 0; i < 75; i++)   //数字  控制 上方 = 数量 
	{
		printf("=");
	}
	printf("\n\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("请选择:");
	//实现界面UI
}
void FUN()
{
	int pan,p;
	while (1)
	{	
		system("cls");  //清屏
		UI_show();    //调用 界面UI 显示
		scanf("%d", &pan);
		switch (pan)
		{
		case 1:FUN_A(); break;
		case 2:FUN_B(); break;
		case 3:FUN_C(); break;
		case 4:FUN_D(); break;
		case 5:EXIT_ALL(); break;//退出
		default:printf("\n\t\t\t输入错误! 按回车键返回重新选择");//按键错误反馈
		}
		getchar();
		getchar();
		system("cls");//清屏
	}
}
void FUN_A()
{
	system("cls");
	UI_showA();
	int pan,p;
    while (1)
	{	
		scanf("%d", &pan);
		switch (pan)
		{
		case 2:OAD_addnew(); break;//新用户信息添加
		case 3:OAD_change(); break;//修改住户信息的功能
		case 4:OAD_delete(); break;//删除住户信息的功能
		case 1:OAD_select();break;//查询居民信息 
		case 5:EXIT(); break;//退出
		default:printf("\n\t\t\t输入错误! 按回车键返回重新选择");//按键错误反馈
		}
		getchar();
		getchar();
		system("cls");//清屏
	}
}
//功能B 
void FUN_B()
{
	system("cls");
	UI_showB();
	int pan,p;
    while (1)
	{	
		scanf("%d", &pan);
		switch (pan)
		{
		case 1:OBD_select(); break;//费用查询 
		case 2:OBD_urge(); break;//定期催缴功能
		case 3:OBD_change(); break;//费用变更维护 
		case 4:OBD_count();break;//定期统计收费 
		case 5:OBD_addnew();break;//添加收费信息 
		case 6:EXIT(); break;//退出
		default:printf("\n\t\t\t输入错误! 按回车键返回重新选择");//按键错误反馈
		}
		getchar();
		getchar();
		system("cls");//清屏
	}
}
//功能C
void FUN_C()
{
	system("cls");
	UI_showC();
	int pan,p;
    while (1)
	{	
		scanf("%d", &pan);
		switch (pan)
		{
		case 1:OCD_addnew(); break;//登记人员出入信息 
		case 2:OCD_ad_select(); break;//监督管理 
		case 3:OCD_select();break;//查询信息 
		case 4:EXIT(); break;//退出
		default:printf("\n\t\t\t输入错误! 按回车键返回重新选择");//按键错误反馈
		}
		getchar();
		getchar();
		system("cls");//清屏
	}
} 

//功能D
void FUN_D()
{
	system("cls");
	UI_showD();
	int pan,p;
    while (1)
	{	
		scanf("%d", &pan);
		switch (pan)
		{
		case 1:ODD_addnew(); break;//登记报修信息 
		case 2:ODD_select(); break;//查询报修情况 
		case 3:ODD_produce(); break;//产生考核情况明细 
		case 4:EXIT();break;//退出 
		default:printf("\n\t\t\t输入错误! 按回车键返回重新选择");//按键错误反馈
		}
		getchar();
		getchar();
		system("cls");//清屏
	}
}  
 //进入界面 UI 实现物业收费管理系统 
void UI_showB()       
{
	system("cls"); 
	int i, j;
//--------------------------------------------------------------------
	printf("\n");
	for (i = 0; i < 75; i++)   //数字  控制 上方 = 数量 
	{
		printf("=");
	}
	printf("\n");
	for (i = 0; i < 30; i++)
	{
		printf(" ");
	}
	printf("欢迎进入物业收费管理系统");
	for (i = 0; i < 30; i++)
	{
		printf(" ");
	}
	printf("\n");
	for (i = 0; i < 75; i++)   //数字  控制 上方 = 数量 
	{
		printf("=");
	}
	//实现上方欢迎界面
//--------------------------------------------------------------------
	printf("\n\n\n");
	for (i = 0; i < 33; i++)                          //以下实现  菜单界面功能选择
	{
		printf(" ");
	}
	printf("请选择以下功能:\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("1、查询应缴费用\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("2、定期催缴\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("3、费用变更维护\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("4、定期统计收费情况\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("5、添加收费信息\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("6、退出系统\n");
 
	printf("\n\n");
 
	for (i = 0; i < 75; i++)   //数字  控制 上方 = 数量 
	{
		printf("=");
	}
	printf("\n\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("请选择:");
	//实现界面UI
 
}
 //进入界面 UI 实现来客访问管理系统 
void UI_showC()       
{
	system("cls"); 
	int i, j;
//--------------------------------------------------------------------
	printf("\n");
	for (i = 0; i < 75; i++)   //数字  控制 上方 = 数量 
	{
		printf("=");
	}
	printf("\n");
	for (i = 0; i < 30; i++)
	{
		printf(" ");
	}
	printf("欢迎进入来客访问管理系统");
	for (i = 0; i < 30; i++)
	{
		printf(" ");
	}
	printf("\n");
	for (i = 0; i < 75; i++)   //数字  控制 上方 = 数量 
	{
		printf("=");
	}
	//实现上方欢迎界面
//--------------------------------------------------------------------
	printf("\n\n\n");
	for (i = 0; i < 33; i++)                          //以下实现  菜单界面功能选择
	{
		printf(" ");
	}
	printf("请选择以下功能:\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("1、登记外来人员出入信息\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("2、监督管理功能\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("3、查询外来人员信息\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("4、退出系统\n");
 
	printf("\n\n");
 
	for (i = 0; i < 75; i++)   //数字  控制 上方 = 数量 
	{
		printf("=");
	}
	printf("\n\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("请选择:");
	//实现界面UI
 
}
 //进入界面 UI 实现设备报修管理系统 
void UI_showD()       
{
	system("cls"); 
	int i, j;
//--------------------------------------------------------------------
	printf("\n");
	for (i = 0; i < 75; i++)   //数字  控制 上方 = 数量 
	{
		printf("=");
	}
	printf("\n");
	for (i = 0; i < 30; i++)
	{
		printf(" ");
	}
	printf("欢迎进入设备报修管理系统");
	for (i = 0; i < 30; i++)
	{
		printf(" ");
	}
	printf("\n");
	for (i = 0; i < 75; i++)   //数字  控制 上方 = 数量 
	{
		printf("=");
	}
	//实现上方欢迎界面
//--------------------------------------------------------------------
	printf("\n\n\n");
	for (i = 0; i < 33; i++)                          //以下实现  菜单界面功能选择
	{
		printf(" ");
	}
	printf("请选择以下功能:\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("1、登记报修信息\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("2、查询报修情况\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("3、产生考核情况明细\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("4、退出系统\n");
 
	printf("\n\n");
 
	for (i = 0; i < 75; i++)   //数字  控制 上方 = 数量 
	{
		printf("=");
	}
	printf("\n\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("请选择:");
	//实现界面UI
 
}
//退出功能 退出整个系统 
void EXIT_ALL()
{
   	char ch;
	do
	{
		printf("你确定退出吗?(Y/N):");
		getchar();
		scanf("%c", &ch);
 
	} while ((ch != 'Y') && (ch != 'y') && (ch != 'n') && (ch != 'N'));
 
	if ((ch == 'y') || (ch == 'Y'))
	{
       exit(0);
	}
}
//退出居民管理系统
void EXIT()
{
	char ch;
	do
	{
		printf("你确定退出吗?(Y/N):");
		getchar();
		scanf("%c", &ch);
 
	} while ((ch != 'Y') && (ch != 'y') && (ch != 'n') && (ch != 'N'));
 
	if ((ch == 'y') || (ch == 'Y'))
	{
       FUN();
	}
}
void OAD_addnew() //添加用户
{
	FILE *fp=NULL;
	fp=fopen("C:\\Users\\zhangzilong\\OneDrive\\桌面\\业主信息.txt", "a");
	int flag=0;
	int ID,building,roomID,roomarea;
	char name[10],sex[10],IDnumber[10],phone[10];
	char ch;
		while (1)     //进入循环体,直到接收到用户 跳出循环
	{
        printf("请输入ID:");
		scanf("%d",&ID);
	SLNode* head = createlist();
	SLNode* head2 = head;
	int j=0;
	while (head2 != NULL)
	{
       if(head2->ID==ID)
       {
       	printf("该用户已存在,请重新输入\n", head2->ID, head2->name, head2->sex, head2->IDnumber, head2->phone, head2->building, head2->roomID,head2->roomarea);
	    OAD_addnew(); 
	    j=1;
		break;
	   }else
	   {
	   	head2=head2->next;
	   }
	}
	if(j==0)
	{
		printf("请输入姓名:");
		scanf("%s", name);
		printf("请输入性别:");
		scanf("%s", sex);
		printf("请输入身份证号:");
		scanf("%s", IDnumber);
		printf("请输入联系电话:");
		scanf("%s", phone);
		printf("请输入楼号:");
		scanf("%d", &building);
		printf("请输入房号:");
		scanf("%d", &roomID);
		printf("请输入住房面积:");
		scanf("%d", &roomarea);
	}
        fprintf(fp,"%d  %s  %s  %s  %s  %d  %d  %d\n",ID,name,sex,IDnumber,phone,building,roomID,roomarea);
		do           // 接收字符 判断是否 继续录入用户信息
		{
			printf("是否继续录入?请选择(Y/N)");
			getchar();   //接收 回车键
			scanf("%c", &ch);
 
		} while ((ch != 'Y') && (ch != 'y') && (ch != 'n') && (ch != 'N'));
 
		if ((ch == 'n') || (ch == 'N'))
		{
			fclose(fp);  //如果用户 输入N 则保存 并退出程序
			printf("\n请按回车键返回菜单选项.....");
				getchar();
				getchar();
				FUN_A();
				break;
		}
	}
}
void OAD_select()//居民查询功能 
{
	SLNode* head = createlist();
	SLNode* head2 = head;
	char ch;
	int ID,flag=0; 
	system("cls");
	printf("\n请输入要查询的住户ID:");
	scanf("%d", &ID);	
    printf("\n请您核对查询人的信息:\n\n");
    printf("ID 姓名 性别 身份证号 电话 楼号 房号 住房面积 \n");	
	while (head2 != NULL)
	{
       if(head2->ID==ID)
       {

       	printf("%d  %s  %s   %s     %s    %d     %d     %d      \n", head2->ID, head2->name, head2->sex, head2->IDnumber, head2->phone, head2->building, head2->roomID,head2->roomarea);
	    flag=1;
	    break;
	   }else
	   {
	   	head2=head2->next;
	   }
	}
	if (flag == 0)   //判断为未找到用户
	{
		printf("没找到该用户!\n请按回车键返回菜单选项.....");
		getchar();
		getchar();
		FUN_A();
	}
		printf("\n请按回车键返回菜单选项.....");
		getchar();
		getchar();
		FUN_A();
	
}
void UI_showB_fee()
{
	system("cls"); 
	int i, j;
//--------------------------------------------------------------------
	printf("\n");
	for (i = 0; i < 75; i++)   //数字  控制 上方 = 数量 
	{
		printf("=");
	}
	printf("\n");
	for (i = 0; i < 30; i++)
	{
		printf(" ");
	}
	printf("欢迎进入进入物业费系统");
	for (i = 0; i < 30; i++)
	{
		printf(" ");
	}
	printf("\n");
	for (i = 0; i < 75; i++)   //数字  控制 上方 = 数量 
	{
		printf("=");
	}
	//实现上方欢迎界面
//--------------------------------------------------------------------
	printf("\n\n\n");
	for (i = 0; i < 33; i++)                          //以下实现  菜单界面功能选择
	{
		printf(" ");
	}
	printf("请选择以下功能:\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("1、查询煤气费\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("2、水费\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("3、电费\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("4、停车费\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("5、报修费\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("6、总费用\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("7、电子收费单据\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("8、缴费\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("9、退出\n");
 
	printf("\n\n");
 
	for (i = 0; i < 75; i++)   //数字  控制 上方 = 数量 
	{
		printf("=");
	}
	printf("\n\n");
	for (i = 0; i < 33; i++)
	{
		printf(" ");
	}
	printf("请选择:");
	//实现界面UI
}
//费用查询功能 
void OBD_select()
{
	Fee* head = createlist_B();
	Fee* head2 = head;
	FILE *fp;
	char ch;
	int ID,flag=0;
	system("cls");
	printf("\n请输入要查询的住户ID:");
	scanf("%d", &ID);
	while (head2!= NULL)
	{
       if(head2->ID==ID)
       {
       	system("cls");
       	printf("\n\n请您核对查询人的信息:\n\n");
		printf("\nID:%d 姓名:%s\n",head2->ID,head2->name);
		printf("\n请按回车键继续.....");
        getchar();
        getchar();
       	int change;
       	UI_showB_fee();
       	scanf("%d",&change);
       	switch(change)
       	{
       	case 1:system("cls");printf("\n煤气费明细:用量:%d立方米 单价:%d元 煤气费:%d元",head2->gas_fee,head2->gas,head2->gas_fee*head2->gas); 
		printf("\n请按回车键返回菜单选项.....");
		getchar();
		getchar();
		OBD_fee(ID);
		break;
       	case 2:system("cls");printf("\n水费明细:用量:%d升  单价:%d元 水费:%d元",head2->water_fee,head2->water,head2->water_fee*head2->water);
		printf("\n请按回车键返回菜单选项.....");
		getchar();
		getchar();
		OBD_fee(ID);break;
       	case 3:system("cls");printf("\n电费明细:用量:%d度  单价:%d元 电费:%d元",head2->power_fee,head2->power,head2->power_fee*head2->power);		printf("\n请按回车键返回菜单选项.....");
		getchar();
		getchar();
		OBD_fee(ID);break;
       	case 4:system("cls");printf("\n停车费:%d元",head2->park_fee);		printf("\n请按回车键返回菜单选项.....");
		getchar();
		getchar();
		OBD_fee(ID);break;
       	case 5:system("cls");printf("\n报修费:%d元",head2->repair_fee);		printf("\n请按回车键返回菜单选项.....");
		getchar();
		getchar();
		OBD_fee(ID);break;
       	case 6:system("cls");printf("\n总费用:%d元",(head2->gas_fee*head2->gas+head2->water_fee*head2->water+head2->power_fee*head2->power+head2->park_fee+head2->repair_fee));
       	printf("\n请按回车键返回菜单选项.....");
		getchar();
		getchar();
		OBD_fee(ID);break;
       	case 7:system("cls");
       	printf("ID:%d\n姓名:%s\n煤气费:%d元\n水费:%d元\n电费:%d元\n停车费:%d元\n报修费:%d元\n总计:%d元\n", head2->ID, head2->name, head2->gas_fee, head2->water_fee, head2->power_fee, head2->park_fee, head2->repair_fee,(head2->gas_fee*head2->gas+head2->water_fee*head2->water+head2->power_fee*head2->power+head2->park_fee+head2->repair_fee));
		printf("\n请按回车键返回菜单选项.....");
		getchar();
		getchar();
		OBD_fee(ID);break;
		case 8:system("cls");
		printf("缴费成功!已缴费%d元",(head2->gas_fee*head2->gas+head2->water_fee*head2->water+head2->power_fee*head2->power+head2->park_fee+head2->repair_fee)); 
		head2->total=0;
		head2=head;
		fp = fopen("C:\\Users\\zhangzilong\\OneDrive\\桌面\\物业费.txt", "w");
		while(head2!=NULL)
		{
		fprintf(fp,"%d  %s  %d   %d     %d   %d   %d   %d  %d %d %d %s %s\n", head2->ID, head2->name, head2->gas_fee, head2->water_fee, head2->power_fee, head2->park_fee, head2->repair_fee,head2->gas,head2->water,head2->power,head2->total,head2->time,head2->bz);
	    head2=head2->next;
		}
		fclose(fp);
		printf("\n请按回车键返回菜单选项.....");
		getchar();
		getchar();
		OBD_fee(ID);break;
		case 9:FUN_B();break;
		}
	    flag=1;
	   }
	   	head2=head2->next;
	   }
	   
	    head2=head;
		fp = fopen("C:\\Users\\zhangzilong\\OneDrive\\桌面\\物业费.txt", "w");
		while(head2!=NULL)
		{
		fprintf(fp,"%d  %s  %d   %d     %d   %d   %d   %d  %d %d %d %s %s\n", head2->ID, head2->name, head2->gas_fee, head2->water_fee, head2->power_fee, head2->park_fee, head2->repair_fee,head2->gas,head2->water,head2->power,head2->total,head2->time,head2->bz);
	    head2=head2->next;
		}
		fclose(fp);
	if (flag == 0)   //判断为未找到用户
	{
		system("cls");
		printf("抱歉!没找到该用户!\n请按回车键返回菜单选项.....");
		getchar();
		getchar();
		FUN_B();
	}
		printf("\n请按回车键返回菜单选项.....");
		getchar();
		getchar();
		FUN_B();
}
//费用查询返回函数
void OBD_fee(int ID)
{
	Fee* head = createlist_B();
	Fee* head2 = head;
	FILE *fp;
	char ch;
	int flag=0;
	UI_showB_fee();	
	while (head2 != NULL)
	{
       if(head2->ID==ID)
       {
       	int change;
       	scanf("%d",&change);
       	switch(change)
       	{
       	case 1:system("cls");printf("\n煤气费明细:用量:%d立方米 单价:%d元 煤气费:%d元",head2->gas_fee,head2->gas,head2->gas_fee*head2->gas); 
		printf("\n请按回车键返回菜单选项.....");
		getchar();
		getchar();
		OBD_fee(ID);
		break;
       	case 2:system("cls");printf("\n水费明细:用量:%d升  单价:%d元 水费:%d元",head2->water_fee,head2->water,head2->water_fee*head2->water);
		printf("\n请按回车键返回菜单选项.....");
		getchar();
		getchar();
		OBD_fee(ID);break;
       	case 3:system("cls");printf("\n电费明细:用量:%d度  单价:%d元 电费:%d元",head2->power_fee,head2->power,head2->power_fee*head2->power);		printf("\n请按回车键返回菜单选项.....");
		getchar();
		getchar();
		OBD_fee(ID);break;
       	case 4:system("cls");printf("\n停车费:%d元",head2->park_fee);		printf("\n请按回车键返回菜单选项.....");
		getchar();
		getchar();
		OBD_fee(ID);break;
       	case 5:system("cls");printf("\n报修费:%d元",head2->repair_fee);		printf("\n请按回车键返回菜单选项.....");
		getchar();
		getchar();
		OBD_fee(ID);break;
       	case 6:system("cls");printf("\n总费用:%d元",(head2->gas_fee*head2->gas+head2->water_fee*head2->water+head2->power_fee*head2->power+head2->park_fee+head2->repair_fee));
       	printf("\n请按回车键返回菜单选项.....");
		getchar();
		getchar();
		OBD_fee(ID);break;
       	case 7:system("cls");
       	printf("ID:%d\n姓名:%s\n煤气费:%d元\n水费:%d元\n电费:%d元\n停车费:%d元\n报修费:%d元\n总计:%d元\n", head2->ID, head2->name, head2->gas_fee, head2->water_fee, head2->power_fee, head2->park_fee, head2->repair_fee,(head2->gas_fee*head2->gas+head2->water_fee*head2->water+head2->power_fee*head2->power+head2->park_fee+head2->repair_fee));
		printf("\n请按回车键返回菜单选项.....");
		getchar();
		getchar();
		OBD_fee(ID);break;
		case 8:system("cls");printf("缴费成功!已缴费%d元",(head2->gas_fee*head2->gas+head2->water_fee*head2->water+head2->power_fee*head2->power+head2->park_fee+head2->repair_fee)); 
		head2->total=0;
		head2=head;
		fp = fopen("C:\\Users\\zhangzilong\\OneDrive\\桌面\\物业费.txt", "w");
		while(head2!=NULL)
		{
		fprintf(fp,"%d  %s  %d   %d     %d   %d   %d   %d  %d %d %d %s %s\n", head2->ID, head2->name, head2->gas_fee, head2->water_fee, head2->power_fee, head2->park_fee, head2->repair_fee,head2->gas,head2->water,head2->power,head2->total,head2->time,head2->bz);
	    head2=head2->next;
		}
		fclose(fp);		
		printf("\n请按回车键返回菜单选项.....");
		getchar();
		getchar();
		OBD_fee(ID);break;
		case 9:FUN_B();break;
		}
	    flag=1;
	   }
	   	head2=head2->next;
	   }
	    head2=head;
		fp = fopen("C:\\Users\\zhangzilong\\OneDrive\\桌面\\物业费.txt", "w");
		while(head2!=NULL)
		{
		fprintf(fp,"%d  %s  %d   %d     %d   %d   %d   %d  %d %d %d %s %s\n", head2->ID, head2->name, head2->gas_fee, head2->water_fee, head2->power_fee, head2->park_fee, head2->repair_fee,head2->gas,head2->water,head2->power,head2->total,head2->time,head2->bz);
	    head2=head2->next;
		}
		fclose(fp);
}
//定期催缴功能
void OBD_urge()
{
	Fee* head = createlist_B();
	Fee* head2 = head;
	FILE *fp;
	int ID,flag=0;
	char bz[10]={"请缴费"};
	//时间
	char len[20] = {0};
    time_t timep;
    time(&timep);
    struct tm *p;
    p = gmtime(&timep);
    int total; 
    snprintf(len, 20, "%d-%d-%d %d:%d:%d", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, 8 + p->tm_hour, p->tm_min, p->tm_sec); 
	while(head2!=NULL)
	{
		if(head2->total>0)
		{
			flag=1;
			strcpy(head2->time,len);
			strcpy(head2->bz,bz);
			printf("\n\n\n   尊敬的%s(先生/女士),您已欠费%d元,请及时缴纳 %s",head2->name,(head2->gas_fee*head2->gas+head2->water_fee*head2->water+head2->power_fee*head2->power+head2->park_fee+head2->repair_fee),head2->time);
		}
		head2=head2->next;
	}
	    head2=head;
		fp = fopen("C:\\Users\\zhangzilong\\OneDrive\\桌面\\物业费.txt", "w");
		while(head2!=NULL)
		{
		fprintf(fp,"%d  %s  %d   %d     %d   %d   %d   %d  %d %d %d %s %s\n", head2->ID, head2->name, head2->gas_fee, head2->water_fee, head2->power_fee, head2->park_fee, head2->repair_fee,head2->gas,head2->water,head2->power,head2->total,head2->time,head2->bz);
	    head2=head2->next;
		}
		if(flag==0)
		{
			printf("\n无人欠费!\n");
		}
		fclose(fp);
		printf("\n\n   按回车键退出");
	    getchar();
	    getchar();
	    FUN_B();
}
//添加物业费 
void OBD_addnew() //添加用户
{
	FILE *fp=NULL;
	fp=fopen("C:\\Users\\zhangzilong\\OneDrive\\桌面\\物业费.txt", "a");
	int flag=0;
    int ID;//用户ID 
	char name[10];//用户姓名
	int gas_fee;//煤气
	int water_fee;//水费 
	int power_fee;//电
	int park_fee;//停车费
	int repair_fee=0;//报修费
	int gas;//煤气用度 
	int water;//水用度
	int power; //电用度
	int total;//总费用 
	char time[20];//时间
	char bz[10]; //备注 
	char ch;
	while (1)     //进入循环体,直到接收到用户 跳出循环
	{
		printf("请输入用户ID:");
		scanf("%d", &ID);
	SLNode* head = createlist();
	SLNode* head2 = head;
	int j=0;
	while (head2 != NULL)
	{
       if(head2->ID==ID)
       {
	    j=1;
		break;
	   }else
	   {
	   	head2=head2->next;
	   }
	}
	if(j==0) 
	{
		printf("该用户已存在,请重新输入\n");
	    OAD_addnew(); 
	}
	if(j==1)
	{
		printf("请输入用户姓名:");
		scanf("%s",name);
		printf("请输入煤气每立方米单价:");
		scanf("%d",&gas_fee);
        printf("请输入水每升单价:");
		scanf("%d",&water_fee);
		printf("请输入电每度单价:");
		scanf("%d",&power_fee);
		printf("请输入停车费:");
		scanf("%d",&park_fee);
		printf("请输入煤气用量:");
		scanf("%d",&gas);
		printf("请输入水用度:");
		scanf("%d",&water);
		printf("请输入电用度:");
		scanf("%d",&power);
        printf("请输入时间:");
		scanf("%s",time);
		printf("请输入备注:");
		scanf("%s",bz);
	}
		total=gas_fee*gas+water_fee*water+power_fee*power+park_fee+repair_fee;
        fprintf(fp,"%d  %s  %d   %d     %d   %d   %d   %d  %d %d %d %s %s\n", ID, name, gas_fee, water_fee, power_fee, park_fee, repair_fee,gas,water,power,(gas_fee*gas+water_fee*water+power_fee*power+park_fee+repair_fee),time,bz);
		do           // 接收字符 判断是否 继续录入用户信息
		{
			printf("是否继续录入?请选择(Y/N)");
			getchar();   //接收 回车键
			scanf("%c", &ch);
         
		} while ((ch != 'Y') && (ch != 'y') && (ch != 'n') && (ch != 'N'));
 
		if ((ch == 'n') || (ch == 'N'))
		{
			fclose(fp);  //如果用户 输入N 则保存 并退出程序
			printf("\n请按回车键返回菜单选项.....");
				getchar();
				getchar();
				FUN_B();
		}
	}
}
//费用变更修维护功能 
void OBD_change()
{
	Fee* head = createlist_B();
	Fee* head2 = head;
	Fee* p;
	FILE* fp;
	fp = fopen("C:\\Users\\zhangzilong\\OneDrive\\桌面\\物业费.txt", "r");
	while(head2!=NULL)
	{
		printf("\n修改前各项费用明细:\n");
		printf("\n煤气费单价:%d元\n水单价:%d元\n电单价%d元\n",head2->gas,head2->water,head2->power);
		break;
	}
       printf("\n请输入修改项:1.煤气 2.水 3.电\n请输入:");

		int a,gas=0,water=0,power=0;
		scanf("%d",&a);
		p=head;
		if(a==1)
		{
			printf("请输入修改后的煤气每立方米单价:\n");
			scanf("%d",&gas);
			printf("修改成功!");
		}
				if(a==2)
		{
			printf("请输入修改后的水每升单价:\n");
			scanf("%d",&water);
			printf("修改成功!");
		}
				if(a==3)
		{
			printf("\n\n请输入修改后的电每度单价:\n");
			scanf("%d",&power);
			printf("修改成功!");
		}
		while(p!=NULL)
		{
          if(gas>0)
          {
          	p->gas=gas;
		  }else if(water>0)
		  {
		  	p->water=water;
		  }else{
		  	p->power=power;
		  }
		  p=p->next;
		}
        head2=head;
		fp = fopen("C:\\Users\\zhangzilong\\OneDrive\\桌面\\物业费.txt", "w");
		while(head2!=NULL)
		{
		fprintf(fp,"%d  %s  %d   %d     %d   %d   %d   %d  %d %d %d %s %s\n", head2->ID, head2->name, head2->gas_fee, head2->water_fee, head2->power_fee, head2->park_fee, head2->repair_fee,head2->gas,head2->water,head2->power,(head2->gas_fee*head2->gas+head2->water_fee*head2->water+head2->power_fee*head2->power+head2->park_fee+head2->repair_fee),head2->time,head2->bz);
	    head2=head2->next;
		}
	fclose(fp);
	printf("\n按回车键退出");
	getchar();
	getchar();
	FUN_B();
}
//统计收费情况
void OBD_count()
{
	Fee* head = createlist_B();
	Fee* p=head;
	int i=0,j=0;
	int count1=0,count2=0,count=0;//已收费,未收费,总收费 
	while(p!=NULL)
	{
		if(p->total>0)
		{
			i++;
			count1=count1+p->total;
			count=count+count1;
		}
		if(p->total==0)
		{
			j++;
			count2=count2+p->park_fee+p->repair_fee+p->gas_fee*p->gas+p->power_fee*p->power+p->water_fee*p->water;
			count=count+count2;
		}
		p=p->next;
	}
	printf("\n   总计需收费:%d元\n   需收费%d户:%d元\n   已收费%d户:%d元",count,i,count1,j,count2);
	printf("\n\n   按回车键退出");
	getchar();
	getchar();
	FUN_B();
}
//居民管理系统修改功能 
void OAD_change()
{
	FILE* fp;
	SLNode *p1;
	SLNode* p2;
	SLNode* head = NULL;
	SLNode* head2 = NULL;
	SLNode *p;
	int ID,building,roomID,roomarea;
	char name[10],sex[10],IDnumber[10],phone[10],ch;
	fp = fopen("C:\\Users\\zhangzilong\\OneDrive\\桌面\\业主信息.txt", "r");
		int i = 0;
		//把文件中的数据存入到链表中
//		printf("\n修改前各项数据数据:\n");
	    i = fscanf(fp, "%d %s %s %s %s %d %d %d",&ID,name,sex,IDnumber,phone,&building,&roomID,&roomarea );
		while (i == 8)
		{
        p1 = (SLNode*)malloc(sizeof(SLNode));
		if (p1 == NULL) printf("p1为空");
		p1->ID=ID;//ID
		strcpy(p1->name, name);//姓名
		strcpy(p1->sex, sex);//性别 
		strcpy(p1->IDnumber, IDnumber);//身份证
		strcpy(p1->phone, phone);// 电话
        p1->building=building;//楼号 
		p1->roomID=roomID;//房号 
		p1->roomarea=roomarea; //住房面积 
			p1->next = NULL;
			if (head == NULL)
			{
				head = p1;
				p2 = p1;
			}
			else
			{
				p2->next = p1;
				p2 = p1;
			}
	i = fscanf(fp, "%d %s %s %s %s %d %d %d",&ID,name,sex,IDnumber,phone,&building,&roomID,&roomarea );
		}
		fclose(fp);//关闭文件 
		head2 = head;
	    int sign=0;
	    printf("请输入要修改的住户ID:\n");
	    scanf("%d", &ID);
	    while(head2!=NULL)
	    {
	    	if(head2->ID==ID)
	    	{
	    	sign=1;
	    	printf("\n请您核对居民的信息:\n\n");
       		printf("ID 姓名 性别 身份证号 电话 楼号 房号 住房面积 \n");
       	    printf("%d  %s  %s   %s     %s   %d   %d   %d      \n", head2->ID, head2->name,head2->sex, head2->IDnumber, head2->phone, head2->building, head2->roomID,head2->roomarea);
			printf("\n您确认要修改信息吗(Y/N)");
			getchar();
			scanf("%c",&ch);
			if(ch=='Y'||ch=='y')
			{
                	printf("\n请输入要修改的内容:(输入数字:1~9)\n");
                	printf("\n1.用户ID        2.姓名    3.性别\n4.身份证号码    5.手机号  6.楼号\n7.房号          8.住房面积9.退出\n");
                	int change1;
                while(1)
                {
                printf("\n     请输入选项:");
                scanf("%d",&change1);
                printf("\n");
				switch(change1)
				{
					case 1:		
					printf("原ID为%d\n",head2->ID);	
					printf("请输入新ID:");
				    scanf("%d", &ID);
				    head2->ID=ID;
				    break;
				    case 2:
                    printf("原姓名为%s\n",head2->name);	
					printf("请输入新姓名:");
				    scanf("%s", name);
				    strcpy(head2->name,name);
				    break;
				    case 3:
                    printf("原性别为%s\n",head2->sex);	
					printf("请输入新性别:");
				    scanf("%s", sex);
				    strcpy(head2->sex,sex);
				    break;
				    case 4:
                    printf("原身份证号为%s\n",head2->IDnumber);	
					printf("请输入新身份证号:");
				    scanf("%s", IDnumber);
				    strcpy(head2->IDnumber,IDnumber);
				    break;
				    case 5:
                    printf("原手机号为%s\n",head2->phone);	
					printf("请输入新手机号:");
				    scanf("%s", phone);
				    strcpy(head2->phone,phone);
				    break;
				    case 6:
					printf("原楼号为%d\n",head2->building);	
					printf("请输入新楼号:");
				    scanf("%d", &building);
				    head2->building=building;
				    break;
				    case 7:
					printf("原房号为%d\n",head2->roomID);	
					printf("请输入新房号:");
				    scanf("%d", &roomID);
				    head2->roomID=roomID;
				    break;
				    case 8:
					printf("原住房面积为%d\n",head2->roomarea);	
					printf("请输入新住房面积:");
				    scanf("%d", &roomarea);
				    head2->roomarea=roomarea;
				    break;
                   	case 9:EXIT(); break;//退出
		default:printf("\n\t\t\t输入错误! 按回车键返回重新选择");//按键错误反馈
				}
				break;
			}
		}	
		}
		head2=head2->next;
}
        p=head;
		fp = fopen("C:\\Users\\zhangzilong\\OneDrive\\桌面\\业主信息.txt", "w");
		while(p!=NULL)
		{
		fprintf(fp,"%d  %s  %s  %s  %s  %d  %d  %d\n",p->ID,p->name,p->sex,p->IDnumber,p->phone,p->building,p->roomID,p->roomarea);
	    p=p->next;
		}
		if(sign==0)
		{
			    fclose(fp);
			    printf("没有找到此用户信息\n");
				printf("\n请按回车键返回菜单选项.....");
				getchar();
				getchar();
				FUN_A();
		}
		        fclose(fp);//关闭并保存 
				printf("\n请按回车键返回菜单选项.....");
				getchar();
				getchar();
				FUN_A();
}

void OAD_delete()	//删除用户信息
{
	FILE* fp;
	fp = fopen("C:\\Users\\zhangzilong\\OneDrive\\桌面\\业主信息.txt", "r");
	int flag = 0,ID;
	SLNode* head = createlist();//创建业主信息链表 
	SLNode* head2 = head;
	printf("\n请您核对居民的信息:\n\n");
	printf("ID 姓名 性别 身份证号 电话 楼号 房号 住房面积 \n");
	while (head2)
	{
		printf("%d  %s  %s  %s  %s  %d  %d  %d\n", head2->ID, head2->name, head2->sex,head2->IDnumber,head2->phone,head2->building,head2->roomID,head2->roomarea);
		head2 = head2->next;
	}
	head2 = head;
	fp = fopen("C:\\Users\\zhangzilong\\OneDrive\\桌面\\业主信息.txt", "w");
    printf("\n请输入您想要删除的用户ID:\n");
    scanf("%d",&ID);
	while (head2 != NULL)
	{
		//再把链表中的数据存入文件 
		if (head2->ID==ID)//ID比对 
		{
			head2 = head2->next;
			if (head2 == NULL) break;
		}
		fprintf(fp,"%d  %s  %s  %s  %s  %d  %d  %d\n", head2->ID, head2->name, head2->sex,head2->IDnumber,head2->phone,head2->building,head2->roomID,head2->roomarea);
		head2 = head2->next;
	}
	    fclose(fp);
	printf("\n删除成功\n");
				printf("\n请按回车键返回菜单选项.....");
				getchar();
				getchar();
				FUN_A();
}
void OCD_addnew() //添加用户
{
	FILE *fp=NULL;
	fp=fopen("C:\\Users\\zhangzilong\\OneDrive\\桌面\\外来人员.txt", "a");
	int flag=0;
    char name[10]; //姓名
	char sex[10];  //性别
	char phone[10];   // 手机号
    char ad_name[10];//值班管理人员姓名 
    char time[20];//时间 
	char ch;
	while (1)     //进入循环体,直到接收到用户 跳出循环
	{
		printf("请输入姓名:");
		scanf("%s", name);
		printf("请输入性别:");
		scanf("%s", sex);
		printf("请输入联系电话:");
		scanf("%s", phone);
        printf("请输入值班人姓名:");
		scanf("%s", ad_name);
		printf("请输入时间:");
		scanf("%s", time);
        fprintf(fp,"%s  %s  %s  %s  %s\n",name,sex,phone,ad_name,time);
		do           // 接收字符 判断是否 继续录入用户信息
		{
			printf("是否继续录入?请选择(Y/N)");
			getchar();   //接收 回车键
			scanf("%c", &ch);
         
		} while ((ch != 'Y') && (ch != 'y') && (ch != 'n') && (ch != 'N'));
 
		if ((ch == 'n') || (ch == 'N'))
		{
			fclose(fp);  //如果用户 输入N 则保存 并退出程序
			printf("\n请按回车键返回菜单选项.....");
				getchar();
				getchar();
				FUN_C();
		}
	}
}
void OCD_select()//外来人员查询功能 
{
	Out* head = createlist_C();
	Out* head2 = head;
	char ch;
	int flag=0;
	char name[10];
	printf("请输入要查询外来人员姓名:");
	scanf("%s", name);	
	while (head2 != NULL)
	{
       if(strcmp(name, head2->name) == 0)
       {
       	    printf("\n请您核对外来人员的信息:\n\n");
       	printf("姓名:%s  性别:%s  电话:%s   时间:%s \n", head2->name, head2->sex,  head2->phone, head2->time);
	    flag=1;
	    break;
	   }else
	   {
	   	head2=head2->next;
	   }
	}
	if (flag == 0)   //判断为未找到用户
	{
		printf("没找到该用户!\n请按回车键返回菜单选项.....");
		getchar();
		getchar();
		FUN_C();
	}
		printf("\n请按回车键返回菜单选项.....");
		getchar();
		getchar();
		FUN_C();
	
}
void OCD_ad_select()//监督管理功能
{
	Out* head = createlist_C();
	Out* head2 = head;
	char ch;
	int flag=0;
	char name[10];
	printf("请输入要监督外来人员姓名:\n");
	scanf("%s", name);	
	while (head2 != NULL)
	{
       if(strcmp(name, head2->name) == 0)
       {
       	printf("请您核对当天值班人员的信息:\n\n");
       	printf("%s   %s \n", head2->ad_name, head2->time);
	    flag=1;
	    break;
	   }else
	   {
	   	head2=head2->next;
	   }
	}
	if (flag == 0)   //判断为未找到用户
	{
		printf("没找到该用户!\n请按回车键返回菜单选项.....");
		getchar();
		getchar();
		FUN_C();
	}
		printf("\n请按回车键返回菜单选项.....");
		getchar();
		getchar();
		FUN_C();
	
}
//添加维修设备 
void ODD_addnew() 
{
	FILE *fp=NULL;
	FILE *fp1=NULL; 
	Fee* head = createlist_B();
	Fee* head2 = head;
	fp=fopen("C:\\Users\\zhangzilong\\OneDrive\\桌面\\设备.txt", "a");
	fp1=fopen("C:\\Users\\zhangzilong\\OneDrive\\桌面\\物业费.txt", "w");
	int flag=0;
    int ID;//用户ID 
	char water[10];//水系统 
	char elec[10];//电 系统 
	int water_level;//维修水平 
	int elec_level;//维修水平 
	char time[20];//时间 
    int level;//综合维修等级 
	char ch;
	while (1)     //进入循环体,直到接收到用户 跳出循环
	{
		printf("请输入用户ID:");
		scanf("%d",&ID);
	SLNode* p = createlist();
	int j=0;
	while (p != NULL)
	{
       if(p->ID==ID)
       {
	    j=1;
		break;
	   }else
	   {
	   	p=p->next;
	   }
	}
	if(j==0)
	{
		printf("该用户不存在,请重新输入\n"); 
	}
	if(j==1)
	{
		printf("请输入维修水设备:");
		scanf("%s", water);
		printf("请输入维修电设备:");
		scanf("%s", elec);
		printf("请输入水维修水平:(0~2):0/不维修 1/轻度维修 2/报废维修\n请输入:");
		scanf("%d",&water_level );
		printf("请输入电维修水平:(0~2):0/不维修 1/轻度维修 2/报废维修\n请输入:");
		scanf("%d",&elec_level);
		printf("请输入时间:");
		scanf("%s",time);
        fprintf(fp,"%d %s  %s  %d  %d  %s\n",ID,water,elec,water_level,elec_level,time);
		level=water_level+elec_level;
		while(head2!=NULL)
		{
			if(head2->ID==ID)
			{
				if(level==0)
				{
				head2->repair_fee=0;
				head2->total=(head2->gas_fee*head2->gas+head2->water_fee*head2->water+head2->power_fee*head2->power+head2->park_fee+head2->repair_fee);
				break;	
				}
				
				else if(level==1) 
				{
				head2->repair_fee=1;
							head2->total=(head2->gas_fee*head2->gas+head2->water_fee*head2->water+head2->power_fee*head2->power+head2->park_fee+head2->repair_fee);
				break;
				}
				else if(level==2) 
				{
				head2->repair_fee=2;
				head2->total=(head2->gas_fee*head2->gas+head2->water_fee*head2->water+head2->power_fee*head2->power+head2->park_fee+head2->repair_fee);
				break;	
				}
				else if(level==3) 
				{
					head2->repair_fee=3;
					head2->total=(head2->gas_fee*head2->gas+head2->water_fee*head2->water+head2->power_fee*head2->power+head2->park_fee+head2->repair_fee);
					break;
				}
				else {
					head2->repair_fee=4;
					head2->total=(head2->gas_fee*head2->gas+head2->water_fee*head2->water+head2->power_fee*head2->power+head2->park_fee+head2->repair_fee);
					break;
				}
			
	    head2=head2->next;
		}
	}
}
	head2=head;
	while(head2!=NULL)
	{
		fprintf(fp1,"%d  %s  %d   %d     %d   %d   %d   %d  %d %d %d %s %s\n", head2->ID, head2->name, head2->gas_fee, head2->water_fee, head2->power_fee, head2->park_fee, head2->repair_fee,head2->gas,head2->water,head2->power,(head2->gas_fee*head2->gas+head2->water_fee*head2->water+head2->power_fee*head2->power+head2->park_fee+head2->repair_fee),head2->time,head2->bz);
	    head2=head2->next;
	}
		fclose(fp1);
		do           // 接收字符 判断是否 继续录入用户信息
		{
			printf("是否继续录入?请选择(Y/N)");
			getchar();   //接收 回车键
			scanf("%c", &ch);
 
		} while ((ch != 'Y') && (ch != 'y') && (ch != 'n') && (ch != 'N'));
 
		if ((ch == 'n') || (ch == 'N'))
		{
			fclose(fp);  //如果用户 输入N 则保存 并退出程序
			printf("\n请按回车键返回菜单选项.....");
				getchar();
				getchar();
				FUN_D();
		}
	}
}
void ODD_select()//查询设备报修功能功能 
{
	SBei* head = createlist_D();
	SBei* head2 = head;
	int flag=0;
	int ID;
	char ch;
	printf("请您输入住户ID:");
	scanf("%d",&ID);
	printf("请您核对住户的报修信息:\n\n");
	while (head2 != NULL)
	{
    if(head2->ID==ID)
    {
    	flag=1;
       	printf("\n用户ID:%d \n\n供水系统报修设备:%s  \n\n供电系统报修设备:%s  \n\n供水系统设备报修等级:%d \n\n供电电系统报修等级:%d   \n\n时间:%s \n\n", head2->ID,head2->water,head2->elec,head2->water_level,head2->elec_level,head2->time);
	    break;
	}
		head2=head2->next;
	}
	if (flag==0)   //判断为未找到用户
	{
		printf("没找到该用户!\n请按回车键返回菜单选项.....");
				getchar();
				getchar();
				FUN_D();
	}else{
		
			    printf("\n请按回车键返回菜单选项.....");
				getchar();
				getchar();
				FUN_D();
        }
}
void ODD_produce()
{
	SBei* head = createlist_D();
	SBei* head2 = head;
	system("cls");
	printf("请您输入住户的ID:");
	int ID;
	scanf("%d",&ID);
	printf("\n");
	printf("住户的设备考核信息:\n\n");
	while (head2 != NULL)
	{
    if(head2->water_level==0&&head2->elec_level==0)
    {
       	printf("%s设备良好,%s设备良好\n",head2->water,head2->elec);
       	break;
	}
	else   if(head2->water_level==0&&head2->elec_level==1)
    {
       printf("%s设备良好,%s设备需轻度维修\n",head2->water,head2->elec);
       	break;
	}
	else   if(head2->water_level==0&&head2->elec_level==1)
    {
       printf("%s设备良好,%s设备受损严重\n",head2->water,head2->elec);
       break;
	}
		else   if(head2->water_level==1&&head2->elec_level==0)
    {
       printf("%s设备良好,%s设备需轻度维修\n",head2->elec,head2->water);
       break;
	}
		else   if(head2->water_level==2&&head2->elec_level==0)
    {
       printf("%s设备良好,%s设备受损严重\n",head2->elec,head2->water);
       break;
	}
		else   if(head2->water_level==2&&head2->elec_level==2)
    {
       printf("%s设备受损严重,%s设备受损严重\n",head2->water,head2->elec);
       break;
	}
		head2=head2->next;
	}
				printf("\n请按回车键返回菜单选项.....");
				getchar();
				getchar();
				FUN_D();
}
SLNode* createlist()//链表生成函数(完成可用)
{
	//结构体中的各项数据 
	int ID,building,roomID,roomarea;
	char name[10],sex[10],IDnumber[10],phone[10];
	//供链表定义使用 
	SLNode* p1;
	SLNode* p2;
	SLNode* head = NULL;
	SLNode* head2 = NULL;
	// 
	FILE* fp1, * fp2;
	fp1 = fopen("C:\\Users\\zhangzilong\\OneDrive\\桌面\\业主信息.txt", "r");
	int i = 0;
	//把文件中的数据存入到链表中
 
	i = fscanf(fp1, "%d %s %s %s %s %d %d %d",&ID,name,sex,IDnumber,phone,&building,&roomID,&roomarea );
	while (i == 8)
	{
		p1 = (SLNode*)malloc(sizeof(SLNode));
		if (p1 == NULL) printf("p1为空");
		p1->ID=ID;//ID
		strcpy(p1->name, name);//姓名
		strcpy(p1->sex, sex);//性别 
		strcpy(p1->IDnumber, IDnumber);//身份证
		strcpy(p1->phone, phone);// 电话
        p1->building=building;//楼号 
		p1->roomID=roomID;//房号 
		p1->roomarea=roomarea; //住房面积 
 
		p1->next = NULL;
 
		if (head == NULL)
		{
			head = p1;
			p2 = p1;
		}
		else
		{
			p2->next = p1;
			p2 = p1;
		}
	i = fscanf(fp1, "%d %s %s %s %s %d %d %d",&ID,name,sex,IDnumber,phone,&building,&roomID,&roomarea );
	}
	fclose(fp1);
	return head;
}
Fee* createlist_B()//链表生成函数(完成可用)
{
	//结构体中的各项数据 
	int ID;//用户ID 
	char name[10];//用户姓名
	int gas_fee;//煤气费 
	int water_fee;//水费 
	int power_fee;//电费 
	int park_fee;//停车费
	int repair_fee;//报修费
	int gas;//煤气单价 
	int water;//水单价
	int power; //电单价
	int total;//总费用 
	char time[20];//时间
	char bz[10]; //备注 
	//供链表定义使用 
	Fee* p1;
	Fee* p2;
	Fee* head = NULL;
	Fee* head2 = NULL;
	FILE* fp;
	fp = fopen("C:\\Users\\zhangzilong\\OneDrive\\桌面\\物业费.txt", "r");
	int i = 0;
	//把文件中的数据存入到链表中
 
	i = fscanf(fp, "%d %s %d %d %d %d %d %d %d %d %d %s %s",&ID,name,&gas_fee,&water_fee,&power_fee,&park_fee,&repair_fee,&gas,&water,&power,&total,time,bz );
	while (i == 13)
	{
		p1 = (Fee*)malloc(sizeof(Fee));
		if (p1 == NULL) printf("p1为空");
		p1->ID=ID;//ID
		strcpy(p1->name, name);//姓名
        p1->gas_fee=gas_fee;
        p1->water_fee=water_fee;
        p1->power_fee=power_fee;
        p1->park_fee=park_fee;
        p1->repair_fee=repair_fee;
        p1->gas=gas;
        p1->water=water;
        p1->power=power;
        p1->total=total;
		p1->next = NULL;
        strcpy(p1->time,time);
        strcpy(p1->bz,bz);
		if (head == NULL)
		{
			head = p1;
			p2 = p1;
		}
		else
		{
			p2->next = p1;
			p2 = p1;
		}
	i = fscanf(fp, "%d %s %d %d %d %d %d %d %d %d %d %s %s",&ID,name,&gas_fee,&water_fee,&power_fee,&park_fee,&repair_fee,&gas,&water,&power,&total,time,bz);
	}
	fclose(fp);
	return head;
}
//
Out* createlist_C()//链表生成函数(完成可用)
{
	//结构体中的各项数据 
    char name[10]; //姓名
	char sex[10];  //性别
	char phone[10];   // 手机号
    char ad_name[10];//值班管理人员姓名 
    char time[20];//时间 
	//供链表定义使用 
	Out* p1;
	Out* p2;
	Out* head = NULL;
	Out* head2 = NULL;
	FILE* fp;
	fp = fopen("C:\\Users\\zhangzilong\\OneDrive\\桌面\\外来人员.txt", "r");
	int i = 0;
	//把文件中的数据存入到链表中
 
	i = fscanf(fp, "%s %s %s %s %s",name,sex,phone,ad_name,time);
	while (i == 5)
	{
		p1 = (Out*)malloc(sizeof(Out));
		if (p1 == NULL) printf("p1为空");
		strcpy(p1->name, name);//姓名
		strcpy(p1->sex,sex);
		strcpy(p1->phone,phone);
		strcpy(p1->ad_name,ad_name);
        strcpy(p1->time,time);
		if (head == NULL)
		{
			head = p1;
			p2 = p1;
		}
		else
		{
			p2->next = p1;
			p2 = p1;
		}
	i = fscanf(fp, "%s %s %s %s %s",name,sex,phone,ad_name,time);
	}
	fclose(fp);
	return head;
} 
//
//
SBei* createlist_D()//链表生成函数(完成可用)
{
	//结构体中的各项数据 
	int ID;
    char water[10]; 
	char elec[10];
	char time[20];
    int water_level;
    int elec_level;
	//供链表定义使用 
	SBei* p1;
	SBei* p2;
	SBei* head = NULL;
	SBei* head2 = NULL;
	FILE* fp;
	fp = fopen("C:\\Users\\zhangzilong\\OneDrive\\桌面\\设备.txt", "r");
	int i = 0;
	//把文件中的数据存入到链表中
 
	i = fscanf(fp, "%d %s %s %d %d %s",&ID,water,elec,&water_level,&elec_level,time);
	while (i == 6)
	{
		p1 = (SBei*)malloc(sizeof(SBei));
		if (p1 == NULL) printf("p1为空");
		p1->ID=ID;
		strcpy(p1->water, water);
		strcpy(p1->elec,elec);
		p1->elec_level=elec_level;
		p1->water_level=water_level;
        strcpy(p1->time,time);
		if (head == NULL)
		{
			head = p1;
			p2 = p1;
		}
		else
		{
			p2->next = p1;
			p2 = p1;
		}
	i = fscanf(fp, "%d %s %s %d %d %s",&ID,water,elec,&water_level,&elec_level,time);
	}
	fclose(fp);
	return head;
} 
int main()
{
	MM_pass();// 调用 密码程序 输入3次密码错误 程序锁定
	FUN();// 主要功能函数 
	system("pause");
	return 0;
}

实验所需文档:

居民物业管理系统(数据结构单链表版)_第17张图片

测试数据及测试方案:

    

  • 功能测试
    • 居民管理系统功能测试

1.添加用户

测试用例1:1  张三  女  123  123  14  15  120

测试用例2:2  李四  男  456  456  12  13  120

测试用例3:3  王五  女  258  258  25  26  150

测试结果:

居民物业管理系统(数据结构单链表版)_第18张图片

输入用户数据,全被成功被记录在txt文件里并保存。

2.查询用户

输入要查询的居民ID:

测试用例1:1

测试结果:

居民物业管理系统(数据结构单链表版)_第19张图片

测试用例2:10

测试结果:

居民物业管理系统(数据结构单链表版)_第20张图片

3.修改用户信息

输入要修改的居民ID:

测试用例:1 3

居民物业管理系统(数据结构单链表版)_第21张图片

测试结果:

居民物业管理系统(数据结构单链表版)_第22张图片

张三的性别被更改为男,测试成功!

4.删除用户信息

输入要删除的居民ID:

测试用例:3

测试结果:

居民物业管理系统(数据结构单链表版)_第23张图片

居民物业管理系统(数据结构单链表版)_第24张图片

用户ID为3的居民信息成功被删除!测试成功!

    • 物业收费管理系统功能测试

1.添加收费信息

测试用例1:1  张三  1 1 1  2   0   1  1 1 5 2023.1.5 无

居民物业管理系统(数据结构单链表版)_第25张图片

测试用例2:2  李四  11  1  3   0   2  2 2 9 2023.1.5 无

居民物业管理系统(数据结构单链表版)_第26张图片

测试结果:

居民物业管理系统(数据结构单链表版)_第27张图片

物业费信息被成功写入物业费.txt并成功保存,添加成功!

2.查询收费信息

测试用例:1

测试结果:

居民物业管理系统(数据结构单链表版)_第28张图片

测试用例:2

测试结果:

居民物业管理系统(数据结构单链表版)_第29张图片

查询物业费成功!

3.定期催缴功能

居民物业管理系统(数据结构单链表版)_第30张图片

居民物业管理系统(数据结构单链表版)_第31张图片

使用催缴功能后,居民的备注信息由无变为请缴费,实现了缴费提醒的功能。测试成功!

4.费用维护统计功能

测试用例:3 2 3

居民物业管理系统(数据结构单链表版)_第32张图片

测试结果:

居民物业管理系统(数据结构单链表版)_第33张图片

5.定期统计收费功能

测试结果:

居民物业管理系统(数据结构单链表版)_第34张图片

    • 外来人员系统功能测试

1.登记外来人员信息

测试用例1:小明  男  145  张居  2023.1.2

测试用例2:小红  男  159  李宜  2023.1.2

测试结果:

居民物业管理系统(数据结构单链表版)_第35张图片

外来人员信息已成功登记并保存。

2.查询外来人员信息

测试用例1:小明

测试结果:

居民物业管理系统(数据结构单链表版)_第36张图片

测试用例2:小红

居民物业管理系统(数据结构单链表版)_第37张图片

查询成功!

3.监督管理功能

测试用例1:小明

测试结果:

居民物业管理系统(数据结构单链表版)_第38张图片

测试用例2:小红

测试结果:

居民物业管理系统(数据结构单链表版)_第39张图片

    • 设备维修系统功能测试

1.添加维修设备

测试用例:1 水表  电表  2  2  2023.1.5

测试结果:

居民物业管理系统(数据结构单链表版)_第40张图片

居民物业管理系统(数据结构单链表版)_第41张图片

添加维修设备的同时,物业费中的维修费用也会及时的更新,达到同步更新的效果。

2.查询维修设备情况

输入居民ID:

测试用例1:1

测试结果:

居民物业管理系统(数据结构单链表版)_第42张图片

3.查询设备考核情况

输入居民ID:

测试用例1:1

测试结果:

居民物业管理系统(数据结构单链表版)_第43张图片

成功打印出设备的考核情况,测试成功!

文章末尾

​​​​​​​

居民物业管理系统(数据结构单链表版)_第44张图片

你可能感兴趣的:(java,开发语言,数据结构)