C语言课程设计——小区物业费管理系统

前言:这个课程设计并没有用到数据库,就是简单的链表加文件存储。我只提供代码和解释。还有,这里面好多都是链表的基本操作,不会的可以看书和问dudu.

当然,我知道 你不是借鉴的,额,为了方便你抄,我这样写最好。记得点个赞。。。。

这是小区物业费管理管理的要求,请对照要求:

对此,我分了几个模块,如下:

Node* shanchu(Node* list);//用户信息删除模块;
Node* xiugai(Node*);//用户信息修改模块;
Node* add(Node* list);//新用户添加模块;
Node* caozuo(Node* list);//用户操作模块;
void jisuan(Node* list);//物业费计算模块;
void tongji(Node* list);//全体用户物业费统计
void jiaofei(Node* list);//用户物业费缴费模块
void chaxun(Node* list);//用户个人物业费缴纳模块
void save(Node* list);//信息保存模块(文件保存模块);
Node* Muen(Node* list);//主菜单
Node* head();//头节点初始化函数
void time_a(int* month,int* day);//时间计算函数
Node* ss(Node* list);//节点复制函数
Node* sort1(Node* list);//欠费用户升序排序函数
Node* sort2(Node* list);//欠费金额降序排序函数
Node* read_file(Node* list);//读文件模块

下面对每个模块进行展示:

1.链表功能模块:

//结构体(链表节点)
typedef struct Node{
	char name[100];//名字
	char ID[100];//身份证号
	char sex[10];//性别
	char num[100];//电话号码
	int building;//楼号
	int unit;//单元号
	int room;//房间号
	double area;//平方面积
	double price_pre;//每平方米价钱
	double fee;//物业费
	char item[1000];//备注
	int year;//缴费时的年份
	int month;//缴费时的月份
	int day;//缴费时的日期
	struct Node* next;
}Node;

//初始化头节点
Node* head() {
	Node* list = (Node*)malloc(sizeof(Node));
	strcpy(list->name, "\0");
	strcpy(list->ID, "\0");
	strcpy(list->sex, "\0");
	strcpy(list->num, "\0");
	list->building = 0;
	list->unit = 0;
	list->room = 0;
	list->area = 0;
	list->price_pre = 0;
	list->fee = 0;
	strcpy(list->item, "\0");
	list->year = 0;
	list->month = 0;
	list->day = 0;
	list->next = NULL;
	return list;
}

//测试节点模块
Node* df(Node* list) {
	Node* node= (Node*)malloc(sizeof(Node));
	scanf("%s", &(node->name));
	node->next = list->next;
	list->next = node;
	return list;
}

//测试显示模块
void qw(Node* list) {
	printf("这是测试链表存储模块,依次打印链表内容\n");
	int i = 1;
	for (Node* node = list->next;node != NULL;node = node->next,i++) {
		printf("用户%d:  名字:%s\n", i, (node->name));
		printf("\t身份证号:%s\n", (node->ID));
		printf("\t性别:%s\n", (node->sex));
		printf("\t电话号码:%s\n", (node->num));
		printf("\t楼号:%d\n", (node->building));
		printf("\t单元号:%d\n", (node->unit));
		printf("\t房间号:%d\n", (node->room));
		printf("\t平方米数:%.2lf\n", (node->area));
		printf("\t每平方价钱:%.2lf\n", (node->price_pre));
		printf("\t应缴费用:%.2lf\n", (node->fee));
		printf("\t备注:%s\n", (node->item));
	}
}

2.用户信息操作模块(包括子模块:增删改):

//用户信息操作模块
Node* caozuo(Node* list){
	char a;
	int b = 1, c = 1;
	while (b) {
		printf("...................操作模块..................\n");
		printf(": 请选择您要进行的操作:                    \t:\n");
		printf(": 1.新用户添加;                            \t:\n");
		printf(": 2.用户信息修改;                          \t:\n");
		printf(": 3.用户信息删除;                          \t:\n");
		printf(": 4.返回主菜单;                            \t:\n");
		printf(".............................................\n");
		printf(": 请选择功能前的代号:\n");
		scanf("%c", &a);
		getchar();
		switch (a){
			case '1':list=add(list);break;
			case '2':list=xiugai(list);break;
			case '3':list=shanchu(list);break;
			case '4':b = 0;break;
			default:c = 0;break;
		}
		if (b && !c) {
			printf("代号输入错误,请重新输入!\n");
			printf("按任意键继续输入:\n");
			getchar();
			c = 1;
		}
	}
	printf("按任意键返回主菜单\n");
	getchar();
	return list;
}


//用户信息删除模块
Node* shanchu(Node* list) {
	int a, b, c, flag = 1;
	char qq;
	printf("....................用户信息删除..................\n");
	printf("请输入要删除用户的:楼号,单元号和房间号\n");
	scanf("%d %d %d", &a, &b, &c);
	getchar();
	Node* tail = list->next;
	Node* head = list;
	while (flag) {
		while (tail != NULL) {
			if (tail->building == a) {
				if (tail->unit == b) {
					if (tail->room == c) {
						head->next = tail->next;
						free(tail);
						flag = 0;
						break;
					}
				}
			}
			head = tail;
			tail = tail->next;
		}
		if (flag) {
			printf("未找到用户\n");
			printf("按1继续输入,其他键退出:\n");
			scanf("%c", &qq);
			if (qq == '1') {
				printf("请重新输入:楼号,单元号和楼号!\n");
				scanf("%d %d %d", &a, &b, &c);
			}
			else {
				flag = 0;
			}
		}
		else {
			printf("删除成功!!!\n");
		}
	}
	printf("按任意键返回用户操作\n");
	getchar();
	save(list);
	return list;
}

//用户信息修改模块
Node* xiugai(Node* list) {
	int building, unit, room;
	int flag = 1, flag2 = 1;
	char b, c, d;
	char name[100];
	char ID[100];
	char sex[10];
	char num[100];
	double price_pre;
	char item[1000];
	printf("..................用户修改模块...................\n");
	printf(": 请按照提示进行操作:                          \t:\n");
	printf("请输入要修改的用户的楼号,单元楼和房间号:\n");
	scanf("%d %d %d", &building, &unit, &room);
	getchar();
	while (flag) {
		for (Node* node = list->next;node != NULL;node = node->next) {
			if (building == node->building) {
				if (unit == node->unit) {
					if (room = node->room) {
						printf("请输入要修改信息前面的代号用来选择您要修改的内容:\n");
						printf(" 1.修改用户姓名,身份证号及性别;\n");
						printf(" 2.修改用户电话号码;\n");
						printf(" 3.修改用户每平方米的价钱;\n");
						printf(" 4.修改用户备注;\n");
						printf(" 5.继续修改该用户的信息");
						printf(" 6.暂时不修改(退出);\n");
						scanf("%c", &b);
						getchar();
						while (flag2) {
							switch (b) {
							case '1':
								printf("请输入新的用户名字,身份证号及用户性别:\n");
								scanf("%s", name);
								scanf("%s", ID);
								scanf("%s", sex);
								strcpy(node->name, name);
								strcpy(node->ID, ID);
								strcpy(node->sex, sex);
								printf("修改成功!!!\n");
								break;
							case '2':
								printf("请输入用户新的电话号码:\n");
								scanf("%s", num);
								strcpy(node->num, num);
								printf("修改成功!!!\n");
								break;
							case '3':
								printf("请输入用户每平方米新的价钱:\n");
								scanf("%lf", &price_pre);
								node->price_pre = price_pre;
								printf("修改成功!!!\n");
								break;
							case '4':
								printf("请输入新的用户备注:\n");
								scanf("%s", item);
								strcpy(node->item, item);
								printf("修改成功!!!\n");
								break;
							case '5':
								flag2 = 1;
								break;
							default:
								flag2 = 0;
								break;
							}
							if (flag2) {
								printf("请选择是否继续修改该用户的信息:(按1继续修改,其余不修改)\n");
								scanf("%c", &d);
								getchar();
								if (d == '1') {
									printf("请继续输入要修改信息前的代号来选择您要修改的信息:");
									scanf("%c", &b);
								}else{
									flag2 = 0;
								}
								getchar();
							}
						}
						flag = 0;
						break;
					}
				}
			}
		}
		if (flag) {
			printf("未找到您要进行修改的用户,请选择是否重新输入:\n");
			printf("输入1重新输入,其余退出修改:\n");
			scanf("%c", &c);
			if (c == '1') {
				printf("请重新输入要修改的用户的楼号,单元楼和房间号:\n");
				scanf("%d %d %d", &building, &unit, &room);
			}
			else {
				printf("已退出修改模块.\n");
				flag = 0;
			}
		}
		else {
			printf("修改成功,已退出修改模块!\n");
		}
	}
	printf("按任意键返回用户操作模块\n");
	getchar();
	save(list);
	return list;
}

//新用户添加模块
Node* add(Node* list) {
	Node* node = (Node*)malloc(sizeof(Node));
	int a=1,b = 1;
	printf("..........新用户添加.........\n");
	printf("请按照提示进行操作:\n");
	printf("请输入用户的姓名:\n");
	scanf("%s", (node->name));
	printf("请输入用户的身份证号:\n");
	scanf("%s", (node->ID));
	printf("请输入用户性别:\n");
	scanf("%s", (node->sex));
	printf("请输入用户的电话号码:\n");
	scanf("%s", (node->num));
	printf("请输入用户的楼号,单元号:\n");
	scanf("%d %d", &node->building, &node->unit);
	while (b) {
		a = 1;
		printf("请输入用户的房间号:\n");
		scanf("%d", &(node->room));
		for (Node* qw = list->next;qw != NULL;qw = qw->next) {
			if ((qw->room) == (node->room)) {
				printf("该房间已经出售,请输入其他的房间号:\n");
				a = 0;
				continue;
			}
		}
		if (a == 1)b = 0;
		else b = 1;
	}
	printf("请输入用户房间占地面积,每平方米的价钱:\n");
	scanf("%lf %lf", &(node->area), &(node->price_pre));
	printf("请输入备注:\n");
	scanf("%s", (node->item));
	getchar();
	node->fee = 0;
	node->year = 0;
	node->month = 0;
	node->day = 0;
	node->next=list->next;
	list->next = node;
	printf("按任意键返回用户操作模块:\n");
	getchar();
	save(list);
	return list;
}

3.物业费计算模块(数据表计算)


//全体用户物业费计算模块
void jisuan(Node* list) {
	printf("..........全体物业费计算模块...........\n");
	int month, day;//用于判断时间是否为1月1日
	time_a(&month, &day);
	if (month == 1 && day == 1) {
		printf("今天的日期为 %d 月 %d 日,今天日期是月初(1月1日),将对全体用户物业费进行计算。\n",month,day);
		for (Node* node = list->next;node != NULL;node = node->next) {
			node->fee = ((node->area) * (node->price_pre));
		}
		printf("全体用户物业费计算完成!\n");
	}else{
		printf("今天的日期为 %d 月 %d 日,今天日期不是月初(1月1日),不对全体用户物业费进行计算。\n",month,day);
	}
	printf("已退出全体用户物业费计算模块\n");
	printf("按任意键返回主菜单\n");
	getchar();
	save(list);
}

//时间函数,是一个时间戳获取当前时间
void time_a(int* month,int* day) {
	time_t timea = time(NULL);
	struct tm* localTime;
	localTime = localtime(&timea);
	//printf("%d年 %d月 %d日\n", localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday);
	*month = localTime->tm_mon + 1;
	*day = localTime->tm_mday;
}

4.用户缴费模块


//用户缴费模块
void jiaofei(Node* list){
	int building, unit, room;
	int a = 1;
	double fee;
	printf(".................用户物业费缴费模块...................\n");
	printf("按提示进行操作,完成缴费:\n");
	printf("先查询楼层,单元号及房间号:\n");
	printf("请依次输入:楼层,单元号,房间号\n");
	scanf("%d %d %d",&building, &unit, &room);
	while (a) {
		for (Node* node = list->next;node != NULL;node = node->next) {
			if (building == node->building) {
				if (unit == node->unit) {
					if (room == node->room) {
						if (node->fee <= 0) {
							printf("您没有拖欠物业费,不用缴费\n");
						}
						else {
							printf("您欠了物业费:%.2lf,请缴纳:\n");
							scanf("%lf", &fee);
							printf("您缴纳了:%.2lf\n", fee);
							node->fee -= fee;
							if (node->fee <= 0) {
								printf("您已经还清了物业费,您的账户内余额还有:%.2lf\n", abs(node->fee));
							}
							else {
								printf("您还未缴纳完物业费,还需缴纳:%.2lf\n", node->fee);
							}
						}
						a = 0;
						break;
					}
				}
			}
		}	
	}
	printf("按任意键返回主菜单\n");
	getchar();
	save(list);
}

5.用户物业费统计模块

//用户全体物业费统计模块
void tongji(Node* list){
	printf("..................用户统计模块....................\n");
	printf("此功能可以实现按楼号分类统计所有未缴清物业费的记录,同时按楼号对拖欠款多少进行从高到低进行排序输出:\n");
	printf("先按照楼号统计未缴纳用户:\n");
	Node* node1 = head();//copy一个只包含欠费用户的升序链表头节点的初始化
	node1 = sort1(list);//将没有缴清费用的用户进行排序并赋值给node1;
	if (node1 ->next != NULL) {
		for (Node* node11 = node1->next;node11 != NULL;) {
			int a = node11->building;
			printf("第 %d 楼:\n", a);
			while (a == node11->building) {
				printf("\t 用户:%s\n", node11->name);
				printf("\t 欠费金额:%.2lf\n", node11->fee);
				printf("---------------------\n");
				node11 = node11->next;
				if (node11 == NULL) {
					break;
				}
			}
		}
		printf("楼号输出结束了\n");
	}
	else {
		printf("据统计,无用户未缴清物业费!\n");
	}
	
	printf("\n再按照拖欠费用进行从高到低排序(降序):\n");

	Node* node2 = head();
	node2 = sort2(list);
	if (node2->next != NULL) {
		for (Node* node22 = node2->next; node22 != NULL; node22 = node22->next) {
			printf(" \t用户:%s\n", node22->name);
			printf(" \t欠费金额:%.2lf\n", node22->fee);
			printf("---------------------------\n");
		}
		printf("欠费用户输出结束了!\n");
	}
	else {
		printf("据统计,无用户未缴清物业费\n");
	}
	printf("按任意键返回主菜单\n");
	getchar();
}

//链表排序(升序和降序)
//copy函数,用于复制节点
Node* ss(Node* list) {
	Node* node = (Node*)malloc(sizeof(Node));
	strcpy(node->name, list->name);
	strcpy(node->ID, list->ID);
	strcpy(node->sex, list->sex);
	strcpy(node->num, list->num);
	node->building = list->building;
	node->unit=list->unit;
	node->room = list->room;
	node->area = list->area;
	node->price_pre = list->price_pre;
	node->fee=list->fee;
	strcpy(node->item, list->item);
	node->year = list->year;
	node->month = list->month;
	node->day = list->day;
	node->next = NULL;
	return node;
}

//只包含欠费用户的链表升序排序函数
Node* sort1(Node* list) {
	Node* qw = head();
	for (Node* node = list->next;node != NULL;node = node->next) {
		if (node->fee > 0) {
			Node* node1 = (Node*)malloc(sizeof(Node));
			node1 = ss(node);
			Node* head = qw;
			Node* tail = qw->next;
			for (;tail != NULL;head = tail, tail = tail->next) {
				if (node1->building <= tail->building) {
					node1->next = tail;
					head->next = node1;
					break;
				}
			}
			if (tail == NULL) {
				node1->next = tail;
				head->next = node1;
			}
		}
	}
	return qw;
}

//按照欠费金额降序排序
Node* sort2(Node* list) {
	Node* qw2 = head();
	for (Node* node = list->next;node != NULL;node = node->next) {
		if (node->fee > 0) {
			Node* node22 = (Node*)malloc(sizeof(Node));
			node22 = ss(node);
			Node* head = qw2;
			Node* tail = qw2->next;
			for (;tail != NULL;head = tail, tail = tail->next) {
				if (node22->fee >= tail->fee) {
					node22->next = tail;
					head->next = node22;
					break;
				}
			}
			if (tail == NULL) {
				node22->next = tail;
				head->next = node22;
			}
		}
	}
	return qw2;
}

6.个体用户物业费统计


//用户个人物业费查询模块
void chaxun(Node* list){
	char a, c;
	int flag = 1, b = 1;
	char name[100];
	int building, unit, room;
	printf("...................用户查询模块...................\n");
	printf("请按照提示选择您需要的操作:\n");
	printf(" 1.输入用户名字,查询应缴费用及缴费情况\n");
	printf(" 2.输入楼号,单元号及房间号查询用户信息\n");
	printf("请输入功能前的代号来选择您要进行的查询方式:\n");
	scanf("%c", &a);
	getchar();
	while (flag) {
		if (a == '1') {
			printf("请输入用户的名字:\n");
			scanf("%s", name);
			getchar();
			for (Node* node = list->next;node != NULL;node = node->next) {
				if (strcmp(node->name,name)==0) {
					printf("用户%s要缴纳的费用是:%.2lf,上次缴费时间是:%d年 %d月 %d日(如果年月日都是0,表示用户买房未满一个月,没有缴费时间)\n",name,node->fee,node->year,node->month,node->day);
					b = 0;
					break;
				}
			}
			if (b) {
				printf("未找到用户:%s\n", name);
				printf("是否选择重新输入名字进行查询?\n");
				printf("按1重新输入名字:\n");
				scanf("%c", &c);
				getchar();
				if (c == '1') {
					continue;
				}else {
					printf("您选择了退出\n");
					printf("已退出查询\n");
				}
			}
		}
		else if (a == '2') {
			printf("请输入楼号,单元号及房间号进行查询\n");
			scanf("%d %d %d", &building, &unit, &room);
			for (Node* node = list->next;node != NULL;node = node->next) {
				if (node->building == building) {
					if (node->unit == unit) {
						if (node->room == room) {
							printf("您使用楼号,单元号,房间号查询的是用户信息如下:\n");
							printf("\t名字:%s\n", node->name);
							printf("\t身份证号:%s\n", node->ID);
							printf("\t性别:%s\n", node->sex);
							printf("\t电话号码:%s\n", node->num);
							printf("\t楼号:%d\n", node->building);
							printf("\t单元号:%d\n", node->unit);
							printf("\t房间号:%d\n", node->room);
							printf("\t平方面积为:%.lf\n", node->area);
							printf("\t每平方米价格:%.2lf\n", node->price_pre);
							break;
						}
					}
				}
			}
			
		}
		else {
			printf("您输入的代号错误,请重新输入:\n");
			scanf("%c", &a);
			getchar();
			continue;
		}
		printf("查询完成!!!\n");
		flag = 0;
	}
	printf("按任意键返回主菜单\n");
	getchar();
}

7.文件操作(读取和写入)


//信息保存模块
void save(Node* list){
	FILE* fp = fopen("./小区物业费管理系统文件.txt", "w");
	for (Node* node = list->next;node != NULL;node=node->next) {
		fprintf(fp, "%s %s %s %s %d %d %d %lf %lf %lf %s %d %d %d", node->name,node->ID,node->sex,node->num,node->building ,node->unit,node->room,node->area,node->price_pre,node->fee,node->item,node->year,node->month,node->day);
	}
	fclose(fp);
}

//信息读取模块
Node* read_file(Node* list){
	FILE* fp = fopen("./小区物业费管理系统文件.txt", "a+");
	int b = 1;
	if (fp == NULL) {
		printf("未找到文件,正在创立文件!!!\n");
		save(list);
		b = 0;
	}
	while (1) {
		if (feof(fp)) {
			break;
		}
		Node* node = (Node*)malloc(sizeof(Node));
		fscanf(fp, "%s %s %s %s %d %d %d %lf %lf %lf %s %d %d %d", &node->name, &node->ID, &node->sex, &node->num, &node->building, &node->unit, &node->room, &node->area, &node->price_pre, &node->fee, &node->item, &node->year, &node->month, &node->day);
		node -> next = list->next;
		list->next = node;
	}
	fclose(fp);
	return list;
}

8.主菜单:


//主菜单
Node* Muen(Node* list) {
	char a;
	int b = 1, c = 1;
	while (b) {
		printf("====================小区物业费管理系统==================\n");
		printf("|| 欢迎使用本管理系统:                                \t||\n");
		printf("|| 请选择功能:                                        \t||\n");
		printf("|| 1.用户信息操作功能(包含添加,修改和删除);        \t||\n");
		printf("|| 2.物业费计算功能;                                  \t||\n");
		printf("|| 3.用户缴费功能;                                    \t||\n");
		printf("|| 4.用户物业费统计功能;                              \t||\n");
		printf("|| 5.用户物业费查询功能;                              \t||\n");
		printf("|| 6.退出管理系统;                                    \t||\n");
		printf("========================================================\n");
		printf("请输入您要进行的操作(输入功能前面的代号):\n");
		scanf("%c", &a);
		getchar();
		switch (a){
			case '1':list=caozuo(list);break;//操作模块:包含新用户的添加,用户信息的修改,用户信息的删除
			case '2':jisuan(list);break;//用户应缴物业费的生成模块;
			case '3':jiaofei(list);break;//用户物业费缴纳模块;
			case '4':tongji(list);break;//用户全体物业费统计模块;
			case '5':chaxun(list);break;//用户个人物业费查询模块;
			case '6':save(list);b = 0;break;//信息保存模块并退出;
			default:c = 0;break;
		}
		if (b&&!c) {
			printf("代号输入错误,请重新输入!\n");
			printf("按任意键继续输入:\n");
			getchar();
			c = 1;
		}
	}
	printf("已退出管理系统!!!\n");
	return list;
}

全部代码:(头文件自己猜猜)

typedef struct Node{
	char name[100];//名字
	char ID[100];//身份证号
	char sex[10];//性别
	char num[100];//电话号码
	int building;//楼号
	int unit;//单元号
	int room;//房间号
	double area;//平方面积
	double price_pre;//每平方米价钱
	double fee;//物业费
	char item[1000];//备注
	int year;//缴费时的年份
	int month;//缴费时的月份
	int day;//缴费时的日期
	struct Node* next;
}Node;

Node* shanchu(Node* list);//用户信息删除模块;
Node* xiugai(Node*);//用户信息修改模块;
Node* add(Node* list);//新用户添加模块;
Node* caozuo(Node* list);//用户操作模块;
void jisuan(Node* list);//物业费计算模块;
void tongji(Node* list);//全体用户物业费统计
void jiaofei(Node* list);//用户物业费缴费模块
void chaxun(Node* list);//用户个人物业费缴纳模块
void save(Node* list);//信息保存模块(文件保存模块);
Node* Muen(Node* list);//主菜单
Node* head();//头节点初始化函数
void time_a(int* month,int* day);//时间计算函数
Node* ss(Node* list);//节点复制函数
Node* sort1(Node* list);//欠费用户升序排序函数
Node* sort2(Node* list);//欠费金额降序排序函数
Node* read_file(Node* list);//读文件模块

//时间函数
void time_a(int* month,int* day) {
	time_t timea = time(NULL);
	struct tm* localTime;
	localTime = localtime(&timea);
	//printf("%d年 %d月 %d日\n", localTime->tm_year + 1900, localTime->tm_mon + 1, localTime->tm_mday);
	*month = localTime->tm_mon + 1;
	*day = localTime->tm_mday;
}

//copy函数,用于复制节点
Node* ss(Node* list) {
	Node* node = (Node*)malloc(sizeof(Node));
	strcpy(node->name, list->name);
	strcpy(node->ID, list->ID);
	strcpy(node->sex, list->sex);
	strcpy(node->num, list->num);
	node->building = list->building;
	node->unit=list->unit;
	node->room = list->room;
	node->area = list->area;
	node->price_pre = list->price_pre;
	node->fee=list->fee;
	strcpy(node->item, list->item);
	node->year = list->year;
	node->month = list->month;
	node->day = list->day;
	node->next = NULL;
	return node;
}

//只包含欠费用户的链表升序排序函数
Node* sort1(Node* list) {
	Node* qw = head();
	for (Node* node = list->next;node != NULL;node = node->next) {
		if (node->fee > 0) {
			Node* node1 = (Node*)malloc(sizeof(Node));
			node1 = ss(node);
			Node* head = qw;
			Node* tail = qw->next;
			for (;tail != NULL;head = tail, tail = tail->next) {
				if (node1->building <= tail->building) {
					node1->next = tail;
					head->next = node1;
					break;
				}
			}
			if (tail == NULL) {
				node1->next = tail;
				head->next = node1;
			}
		}
	}
	return qw;
}

//按照欠费金额降序排序
Node* sort2(Node* list) {
	Node* qw2 = head();
	for (Node* node = list->next;node != NULL;node = node->next) {
		if (node->fee > 0) {
			Node* node22 = (Node*)malloc(sizeof(Node));
			node22 = ss(node);
			Node* head = qw2;
			Node* tail = qw2->next;
			for (;tail != NULL;head = tail, tail = tail->next) {
				if (node22->fee >= tail->fee) {
					node22->next = tail;
					head->next = node22;
					break;
				}
			}
			if (tail == NULL) {
				node22->next = tail;
				head->next = node22;
			}
		}
	}
	return qw2;
}

//初始化头节点
Node* head() {
	Node* list = (Node*)malloc(sizeof(Node));
	strcpy(list->name, "\0");
	strcpy(list->ID, "\0");
	strcpy(list->sex, "\0");
	strcpy(list->num, "\0");
	list->building = 0;
	list->unit = 0;
	list->room = 0;
	list->area = 0;
	list->price_pre = 0;
	list->fee = 0;
	strcpy(list->item, "\0");
	list->year = 0;
	list->month = 0;
	list->day = 0;
	list->next = NULL;
	return list;
}

//测试节点模块
Node* df(Node* list) {
	Node* node= (Node*)malloc(sizeof(Node));
	scanf("%s", &(node->name));
	node->next = list->next;
	list->next = node;
	return list;
}

//测试显示模块
void qw(Node* list) {
	printf("这是测试链表存储模块,依次打印链表内容\n");
	int i = 1;
	for (Node* node = list->next;node != NULL;node = node->next,i++) {
		printf("用户%d:  名字:%s\n", i, (node->name));
		printf("\t身份证号:%s\n", (node->ID));
		printf("\t性别:%s\n", (node->sex));
		printf("\t电话号码:%s\n", (node->num));
		printf("\t楼号:%d\n", (node->building));
		printf("\t单元号:%d\n", (node->unit));
		printf("\t房间号:%d\n", (node->room));
		printf("\t平方米数:%.2lf\n", (node->area));
		printf("\t每平方价钱:%.2lf\n", (node->price_pre));
		printf("\t应缴费用:%.2lf\n", (node->fee));
		printf("\t备注:%s\n", (node->item));
	}
}

//用户信息删除模块
Node* shanchu(Node* list) {
	int a, b, c, flag = 1;
	char qq;
	printf("....................用户信息删除..................\n");
	printf("请输入要删除用户的:楼号,单元号和房间号\n");
	scanf("%d %d %d", &a, &b, &c);
	getchar();
	Node* tail = list->next;
	Node* head = list;
	while (flag) {
		while (tail != NULL) {
			if (tail->building == a) {
				if (tail->unit == b) {
					if (tail->room == c) {
						head->next = tail->next;
						free(tail);
						flag = 0;
						break;
					}
				}
			}
			head = tail;
			tail = tail->next;
		}
		if (flag) {
			printf("未找到用户\n");
			printf("按1继续输入,其他键退出:\n");
			scanf("%c", &qq);
			if (qq == '1') {
				printf("请重新输入:楼号,单元号和楼号!\n");
				scanf("%d %d %d", &a, &b, &c);
			}
			else {
				flag = 0;
			}
		}
		else {
			printf("删除成功!!!\n");
		}
	}
	printf("按任意键返回用户操作\n");
	getchar();
	save(list);
	return list;
}

//用户信息修改模块
Node* xiugai(Node* list) {
	int building, unit, room;
	int flag = 1, flag2 = 1;
	char b, c, d;
	char name[100];
	char ID[100];
	char sex[10];
	char num[100];
	double price_pre;
	char item[1000];
	printf("..................用户修改模块...................\n");
	printf(": 请按照提示进行操作:                          \t:\n");
	printf("请输入要修改的用户的楼号,单元楼和房间号:\n");
	scanf("%d %d %d", &building, &unit, &room);
	getchar();
	while (flag) {
		for (Node* node = list->next;node != NULL;node = node->next) {
			if (building == node->building) {
				if (unit == node->unit) {
					if (room = node->room) {
						printf("请输入要修改信息前面的代号用来选择您要修改的内容:\n");
						printf(" 1.修改用户姓名,身份证号及性别;\n");
						printf(" 2.修改用户电话号码;\n");
						printf(" 3.修改用户每平方米的价钱;\n");
						printf(" 4.修改用户备注;\n");
						printf(" 5.继续修改该用户的信息");
						printf(" 6.暂时不修改(退出);\n");
						scanf("%c", &b);
						getchar();
						while (flag2) {
							switch (b) {
							case '1':
								printf("请输入新的用户名字,身份证号及用户性别:\n");
								scanf("%s", name);
								scanf("%s", ID);
								scanf("%s", sex);
								strcpy(node->name, name);
								strcpy(node->ID, ID);
								strcpy(node->sex, sex);
								printf("修改成功!!!\n");
								break;
							case '2':
								printf("请输入用户新的电话号码:\n");
								scanf("%s", num);
								strcpy(node->num, num);
								printf("修改成功!!!\n");
								break;
							case '3':
								printf("请输入用户每平方米新的价钱:\n");
								scanf("%lf", &price_pre);
								node->price_pre = price_pre;
								printf("修改成功!!!\n");
								break;
							case '4':
								printf("请输入新的用户备注:\n");
								scanf("%s", item);
								strcpy(node->item, item);
								printf("修改成功!!!\n");
								break;
							case '5':
								flag2 = 1;
								break;
							default:
								flag2 = 0;
								break;
							}
							if (flag2) {
								printf("请选择是否继续修改该用户的信息:(按1继续修改,其余不修改)\n");
								scanf("%c", &d);
								getchar();
								if (d == '1') {
									printf("请继续输入要修改信息前的代号来选择您要修改的信息:");
									scanf("%c", &b);
								}else{
									flag2 = 0;
								}
								getchar();
							}
						}
						flag = 0;
						break;
					}
				}
			}
		}
		if (flag) {
			printf("未找到您要进行修改的用户,请选择是否重新输入:\n");
			printf("输入1重新输入,其余退出修改:\n");
			scanf("%c", &c);
			if (c == '1') {
				printf("请重新输入要修改的用户的楼号,单元楼和房间号:\n");
				scanf("%d %d %d", &building, &unit, &room);
			}
			else {
				printf("已退出修改模块.\n");
				flag = 0;
			}
		}
		else {
			printf("修改成功,已退出修改模块!\n");
		}
	}
	printf("按任意键返回用户操作模块\n");
	getchar();
	save(list);
	return list;
}

//新用户添加模块
Node* add(Node* list) {
	Node* node = (Node*)malloc(sizeof(Node));
	int a=1,b = 1;
	printf("..........新用户添加.........\n");
	printf("请按照提示进行操作:\n");
	printf("请输入用户的姓名:\n");
	scanf("%s", (node->name));
	printf("请输入用户的身份证号:\n");
	scanf("%s", (node->ID));
	printf("请输入用户性别:\n");
	scanf("%s", (node->sex));
	printf("请输入用户的电话号码:\n");
	scanf("%s", (node->num));
	printf("请输入用户的楼号,单元号:\n");
	scanf("%d %d", &node->building, &node->unit);
	while (b) {
		a = 1;
		printf("请输入用户的房间号:\n");
		scanf("%d", &(node->room));
		for (Node* qw = list->next;qw != NULL;qw = qw->next) {
			if ((qw->room) == (node->room)) {
				printf("该房间已经出售,请输入其他的房间号:\n");
				a = 0;
				continue;
			}
		}
		if (a == 1)b = 0;
		else b = 1;
	}
	printf("请输入用户房间占地面积,每平方米的价钱:\n");
	scanf("%lf %lf", &(node->area), &(node->price_pre));
	printf("请输入备注:\n");
	scanf("%s", (node->item));
	getchar();
	node->fee = 0;
	node->year = 0;
	node->month = 0;
	node->day = 0;
	node->next=list->next;
	list->next = node;
	printf("按任意键返回用户操作模块:\n");
	getchar();
	save(list);
	return list;
}

//用户信息操作模块
Node* caozuo(Node* list){
	char a;
	int b = 1, c = 1;
	while (b) {
		printf("...................操作模块..................\n");
		printf(": 请选择您要进行的操作:                    \t:\n");
		printf(": 1.新用户添加;                            \t:\n");
		printf(": 2.用户信息修改;                          \t:\n");
		printf(": 3.用户信息删除;                          \t:\n");
		printf(": 4.返回主菜单;                            \t:\n");
		printf(".............................................\n");
		printf(": 请选择功能前的代号:\n");
		scanf("%c", &a);
		getchar();
		switch (a){
			case '1':list=add(list);break;
			case '2':list=xiugai(list);break;
			case '3':list=shanchu(list);break;
			case '4':b = 0;break;
			default:c = 0;break;
		}
		if (b && !c) {
			printf("代号输入错误,请重新输入!\n");
			printf("按任意键继续输入:\n");
			getchar();
			c = 1;
		}
	}
	printf("按任意键返回主菜单\n");
	getchar();
	return list;
}


//全体用户物业费计算模块
void jisuan(Node* list) {
	printf("..........全体物业费计算模块...........\n");
	int month, day;//用于判断时间是否为1月1日
	time_a(&month, &day);
	if (month == 1 && day == 1) {
		printf("今天的日期为 %d 月 %d 日,今天日期是月初(1月1日),将对全体用户物业费进行计算。\n",month,day);
		for (Node* node = list->next;node != NULL;node = node->next) {
			node->fee = ((node->area) * (node->price_pre));
		}
		printf("全体用户物业费计算完成!\n");
	}else{
		printf("今天的日期为 %d 月 %d 日,今天日期不是月初(1月1日),不对全体用户物业费进行计算。\n",month,day);
	}
	printf("已退出全体用户物业费计算模块\n");
	printf("按任意键返回主菜单\n");
	getchar();
	save(list);
}

//用户缴费模块
void jiaofei(Node* list){
	int building, unit, room;
	int a = 1;
	double fee;
	printf(".................用户物业费缴费模块...................\n");
	printf("按提示进行操作,完成缴费:\n");
	printf("先查询楼层,单元号及房间号:\n");
	printf("请依次输入:楼层,单元号,房间号\n");
	scanf("%d %d %d",&building, &unit, &room);
	while (a) {
		for (Node* node = list->next;node != NULL;node = node->next) {
			if (building == node->building) {
				if (unit == node->unit) {
					if (room == node->room) {
						if (node->fee <= 0) {
							printf("您没有拖欠物业费,不用缴费\n");
						}
						else {
							printf("您欠了物业费:%.2lf,请缴纳:\n");
							scanf("%lf", &fee);
							printf("您缴纳了:%.2lf\n", fee);
							node->fee -= fee;
							if (node->fee <= 0) {
								printf("您已经还清了物业费,您的账户内余额还有:%.2lf\n", abs(node->fee));
							}
							else {
								printf("您还未缴纳完物业费,还需缴纳:%.2lf\n", node->fee);
							}
						}
						a = 0;
						break;
					}
				}
			}
		}	
	}
	printf("按任意键返回主菜单\n");
	getchar();
	save(list);
}

//用户全体物业费统计模块
void tongji(Node* list){
	printf("..................用户统计模块....................\n");
	printf("此功能可以实现按楼号分类统计所有未缴清物业费的记录,同时按楼号对拖欠款多少进行从高到低进行排序输出:\n");
	printf("先按照楼号统计未缴纳用户:\n");
	Node* node1 = head();//copy一个只包含欠费用户的升序链表头节点的初始化
	node1 = sort1(list);//将没有缴清费用的用户进行排序并赋值给node1;
	if (node1 ->next != NULL) {
		for (Node* node11 = node1->next;node11 != NULL;) {
			int a = node11->building;
			printf("第 %d 楼:\n", a);
			while (a == node11->building) {
				printf("\t 用户:%s\n", node11->name);
				printf("\t 欠费金额:%.2lf\n", node11->fee);
				printf("---------------------\n");
				node11 = node11->next;
				if (node11 == NULL) {
					break;
				}
			}
		}
		printf("楼号输出结束了\n");
	}
	else {
		printf("据统计,无用户未缴清物业费!\n");
	}
	
	printf("\n再按照拖欠费用进行从高到低排序(降序):\n");

	Node* node2 = head();
	node2 = sort2(list);
	if (node2->next != NULL) {
		for (Node* node22 = node2->next; node22 != NULL; node22 = node22->next) {
			printf(" \t用户:%s\n", node22->name);
			printf(" \t欠费金额:%.2lf\n", node22->fee);
			printf("---------------------------\n");
		}
		printf("欠费用户输出结束了!\n");
	}
	else {
		printf("据统计,无用户未缴清物业费\n");
	}
	printf("按任意键返回主菜单\n");
	getchar();
}

//用户个人物业费查询模块
void chaxun(Node* list){
	char a, c;
	int flag = 1, b = 1;
	char name[100];
	int building, unit, room;
	printf("...................用户查询模块...................\n");
	printf("请按照提示选择您需要的操作:\n");
	printf(" 1.输入用户名字,查询应缴费用及缴费情况\n");
	printf(" 2.输入楼号,单元号及房间号查询用户信息\n");
	printf("请输入功能前的代号来选择您要进行的查询方式:\n");
	scanf("%c", &a);
	getchar();
	while (flag) {
		if (a == '1') {
			printf("请输入用户的名字:\n");
			scanf("%s", name);
			getchar();
			for (Node* node = list->next;node != NULL;node = node->next) {
				if (strcmp(node->name,name)==0) {
					printf("用户%s要缴纳的费用是:%.2lf,上次缴费时间是:%d年 %d月 %d日(如果年月日都是0,表示用户买房未满一个月,没有缴费时间)\n",name,node->fee,node->year,node->month,node->day);
					b = 0;
					break;
				}
			}
			if (b) {
				printf("未找到用户:%s\n", name);
				printf("是否选择重新输入名字进行查询?\n");
				printf("按1重新输入名字:\n");
				scanf("%c", &c);
				getchar();
				if (c == '1') {
					continue;
				}else {
					printf("您选择了退出\n");
					printf("已退出查询\n");
				}
			}
		}
		else if (a == '2') {
			printf("请输入楼号,单元号及房间号进行查询\n");
			scanf("%d %d %d", &building, &unit, &room);
			for (Node* node = list->next;node != NULL;node = node->next) {
				if (node->building == building) {
					if (node->unit == unit) {
						if (node->room == room) {
							printf("您使用楼号,单元号,房间号查询的是用户信息如下:\n");
							printf("\t名字:%s\n", node->name);
							printf("\t身份证号:%s\n", node->ID);
							printf("\t性别:%s\n", node->sex);
							printf("\t电话号码:%s\n", node->num);
							printf("\t楼号:%d\n", node->building);
							printf("\t单元号:%d\n", node->unit);
							printf("\t房间号:%d\n", node->room);
							printf("\t平方面积为:%.lf\n", node->area);
							printf("\t每平方米价格:%.2lf\n", node->price_pre);
							break;
						}
					}
				}
			}
			
		}
		else {
			printf("您输入的代号错误,请重新输入:\n");
			scanf("%c", &a);
			getchar();
			continue;
		}
		printf("查询完成!!!\n");
		flag = 0;
	}
	printf("按任意键返回主菜单\n");
	getchar();
}

//信息保存模块
void save(Node* list){
	FILE* fp = fopen("./小区物业费管理系统文件.txt", "w");
	for (Node* node = list->next;node != NULL;node=node->next) {
		fprintf(fp, "%s %s %s %s %d %d %d %lf %lf %lf %s %d %d %d", node->name,node->ID,node->sex,node->num,node->building ,node->unit,node->room,node->area,node->price_pre,node->fee,node->item,node->year,node->month,node->day);
	}
	fclose(fp);
}

//信息读取模块
Node* read_file(Node* list){
	FILE* fp = fopen("./小区物业费管理系统文件.txt", "a+");
	int b = 1;
	if (fp == NULL) {
		printf("未找到文件,正在创立文件!!!\n");
		save(list);
		b = 0;
	}
	while (1) {
		if (feof(fp)) {
			break;
		}
		Node* node = (Node*)malloc(sizeof(Node));
		fscanf(fp, "%s %s %s %s %d %d %d %lf %lf %lf %s %d %d %d", &node->name, &node->ID, &node->sex, &node->num, &node->building, &node->unit, &node->room, &node->area, &node->price_pre, &node->fee, &node->item, &node->year, &node->month, &node->day);
		node -> next = list->next;
		list->next = node;
	}
	fclose(fp);
	return list;
}

//主菜单
Node* Muen(Node* list) {
	char a;
	int b = 1, c = 1;
	while (b) {
		printf("====================小区物业费管理系统==================\n");
		printf("|| 欢迎使用本管理系统:                                \t||\n");
		printf("|| 请选择功能:                                        \t||\n");
		printf("|| 1.用户信息操作功能(包含添加,修改和删除);        \t||\n");
		printf("|| 2.物业费计算功能;                                  \t||\n");
		printf("|| 3.用户缴费功能;                                    \t||\n");
		printf("|| 4.用户物业费统计功能;                              \t||\n");
		printf("|| 5.用户物业费查询功能;                              \t||\n");
		printf("|| 6.退出管理系统;                                    \t||\n");
		printf("========================================================\n");
		printf("请输入您要进行的操作(输入功能前面的代号):\n");
		scanf("%c", &a);
		getchar();
		switch (a){
			case '1':list=caozuo(list);break;//操作模块:包含新用户的添加,用户信息的修改,用户信息的删除
			case '2':jisuan(list);break;//用户应缴物业费的生成模块;
			case '3':jiaofei(list);break;//用户物业费缴纳模块;
			case '4':tongji(list);break;//用户全体物业费统计模块;
			case '5':chaxun(list);break;//用户个人物业费查询模块;
			case '6':save(list);b = 0;break;//信息保存模块并退出;
			default:c = 0;break;
		}
		if (b&&!c) {
			printf("代号输入错误,请重新输入!\n");
			printf("按任意键继续输入:\n");
			getchar();
			c = 1;
		}
	}
	printf("已退出管理系统!!!\n");
	return list;
}
int main() {
	Node* list = head();
	list = read_file(list);
	Muen(list);
	return 0;
}

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值