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