0


C语言开发东北大学20级大作业—活力长者社区(附源码)

12.20更新密码功能,被迫营业

东北大学20级大作业—活力长者社区

活力长者社区

东北大学20级大作业—活力长者社区
开发语言:C语言
开发者:20级软件2009杨富超等
使用工具:vs2019
CSDN源码下载:东北大学20级大作业—活力长者社区
任何疑问欢迎留言
请尊重劳动成果,借用时评论一下“已借用”

一,系统使用展示(部分)

在这里插入图片描述

1,yufuchao.h
在这里插入图片描述
2,长者社区.cpp
在这里插入图片描述
3,文件需要
在这里插入图片描述

二,系统功能介绍

1,系统功能介绍

在这里插入图片描述

1,会员管理(新建,查询,修改,删除)
2,房屋管理(新建,查询,修改,删除)
3,入住管理(会员入住处理,入住信息查询)
4,娱乐设施管理(新建,查询,修改,删除)
5,用户管理(新建,查询,修改,删除)
6,文件管理(保存数据到文件,打印文件数据,清空文件)
0,退出系统

2,系统main函数,while循环在外,系统程序能够持续运行,switch判断语句进行功能选择与函数切换。

intmain(void)//主函数{system("color 0E");//改变字体颜色while(1){Menu();//打印菜单char ch =getchar();switch(ch){case'1':MemberManagement();//会员管理功能break;case'2':HouseManagement();//房屋管理功能break;case'3':PersonManagement();//会员入住管理功能break;case'4':AmusementManagement();//娱乐设施管理功能break;case'5':UserManagement();//用户管功能break;case'6':FileMenu();//文件数据操作功能break;case'0':return0;//退出系统break;default:printf("输入有误,没有该功能\n\n");system("pause");//暂停system("cls");//清屏break;}}return0;}

3,全局共用结构体

偷懒了,为了减少代码量,用了共用结构体

//全局结构体!!!structEntity{char name[10]={'\0'};//姓名,名称char name1[10]={'\0'};char work[10]={'\0'};//职位int  message =0;//入住longlongint number =0;//电话号码,可使用人数structEntity* next;};//全局头节点,尾节点structEntity* head1,* end1;//房屋structEntity* head2,* end2;//会员structEntity* head3,* end3;//设施structEntity* head4,* end4;//用户

4,头文件

#include<stdio.h>#include<stdlib.h>#include<string.h>#include<malloc.h>#include<conio.h>#include<windows.h>//头文件ok!

前言

肝这个系统很久了,(也因此写出了我的第一篇CSDN)
这是我做的第一个较大的系统,U1S1,泪目
一个人肝了快1200多行,
共1490行,
共实现了33个函数功能,
包括链表新建,删除,文件的保存,删除,清空,查找,修改等等
(初心:用最少的代码干最多的事)
今天它终于成年了,
从婴儿到青年,到少年。
挺不容易的,学到了很多C的知识。
也体会到,优化是无止境的,想法在老脑子里

但是,应该不会再优化它了,事太多了,挺舍不得的,做了这么久了,把他当儿子,自己像个老父亲,虽然它经常出bug,熬夜秃头多次,一次次优化,长大成人,很奇妙的感觉,成就感有,也有一丝丝伤感与解脱,不再为它熬夜了。还有考试,大创前端,陪你到这儿,不拖了!

作业要求
在这里插入图片描述

二,菜单

在这里插入图片描述

1,菜单展示

voidMenu(){printf("*************************************************\n");printf("*\t欢迎使用活力长者社区系统\t\t*\n");printf("*\t\t请选择功能\t\t\t*\n");printf("*************************************************\n");printf("*\t\t1.会员管理\t\t\t*\n");//okprintf("*\t\t2.房屋管理\t\t\t*\n");//okprintf("*\t\t3.入住管理\t\t\t*\n");printf("*\t\t4.娱乐设施管理\t\t\t*\n");printf("*\t\t5.用户管理\t\t\t*\n");printf("*\t\t6.文件管理\t\t\t*\n");//okprintf("*\t\t0.退出系统\t\t\t*\n");//okprintf("*************************************************\n");}

2,打印菜单

//打印菜单Menu();//读取一个字符 整数,字符在内存中映射为ASCII码char ch =getchar();

三,会员管理

在这里插入图片描述

1,会员管理菜单

用printf打印,再用while循环,switch选择,break退出

voidMemberManagement(){system("cls");while(1){system("cls");printf("*************************************************\n");printf("*\t欢迎使用会员管理功能\t\t\t*\n");printf("*\t\t请选择功能\t\t\t*\n");printf("*************************************************\n");printf("*\t\t1.新建会员\t\t\t*\n");//okprintf("*\t\t2.查询会员\t\t\t*\n");//okprintf("*\t\t3.修改会员\t\t\t*\n");printf("*\t\t4.删除会员\t\t\t*\n");printf("*\t\t0.返回   \t\t\t*\n");//okprintf("*************************************************\n");char b =_getch();if(b =='0')//输入0.退出循环break;switch(b){case'1':MemberNew();//新建会员break;case'2':MemberSeek();//查询会员break;case'3':MemberChange();//修改会员break;case'4':MemberDelete();//删除会员break;default:printf("输入有误,没有该功能\n\n");system("pause");system("cls");break;}}system("cls");}

2,新建会员

1, 运用了链表新建,使用while,使可以达到多次输入,自己选择退出的目标
2,注意head2为全局头节点,方便后面使用,把链表保存在文件中
3,创新思想:这里关于房屋选择,我的办法是我把房屋信息打印出来,再由会员自己选择房屋(手动输入名称)
4,会员信息:姓名,手机号码,所选房屋

voidMemberNew(){int flag =2;//判断头节点是否为空,并找到尾节点while(head2 !=NULL&& end2->next !=NULL){
        end2 = end2->next;}//打印房屋文件Fangwufile();while(flag !=1)//判断是否退出循环{//创建一个会员,在堆中分配内存 structEntity* node =(structEntity*)malloc(sizeof(structEntity));//判断头节点是否为空if(head2 ==NULL){
            head2 = node;
            end2 = head2;}//录入会员信息memset(node,0,sizeof(structEntity));//printf("请输入新建会员的名字\n");memset(node->name,'0',sizeof(node->name));scanf("%s", node->name);printf("请输入新建会员的手机号码\n");scanf_s("%lld",&node->number);//&指针得到值printf("请输入新建会员选择的房型\n");scanf("%s", node->work);puts("恭喜房屋购买成功");printf("是否需要继续输入?否(1),是(2)\n");scanf("%d",&flag);
        end2->next = node;
        end2 = node;
        node->next =NULL;}system("cls");puts("请记得保存会员信息!");system("pause");system("cls");}

3,查询会员

1,这里实现的是在文件中查找数据( 并不是链表 ),并打印出来
2,使用的是fscanf,fscanf返回值为得到的参数个数
3, 注意fscanf的使用是把数据保存在缓存中
4,实现在文件中查询int(整型数据)

voidMemberSeek(){//文件指针
    FILE* fp;if((fp =fopen(".\\会员信息.txt","r"))==NULL){printf("打开会员信息.txt文件失败\n");return;}else{//查询的会员号码(11位),所以用long long longlongint m;printf("输入会员的电话号码:");scanf("%lld",&m);//在堆中分配内存structEntity* q =(structEntity*)malloc(sizeof(structEntity));while(1){int nRead =fscanf(fp,"%s %lld %s", q->name,&q->number, q->work);//nRead等于要输出参数的个数//逐个比较寻找if(3== nRead && q->number == m){puts("*购买人\t*电话号码\t*所购买的房型\t*");printf("*%s\t*%lld\t*%s\n", q->name, q->number, q->work);free(q);break;}//判断是否到结尾也没有找到elseif(nRead !=3){puts("对不起查询不到会员信息");break;}}}fclose(fp);//关闭文件system("pause");system("cls");}

4,修改会员

功能: 实现在文件中修改已保存的数据
创新思想:创建一个临时文件,再把需要的数据输入到临时文件中,再把源文件移除
再把临时文件重命名。ok!

voidMemberChange(){
    FILE* fp;
    FILE* fp1;longlongint c =0;
    fp =fopen(".\\会员信息.txt","r+");
    fp1 =fopen(".\\linshi.txt","w+");//新建一个临时文件structEntity* p =(structEntity*)malloc(sizeof(structEntity));structEntity* p1 =(structEntity*)malloc(sizeof(structEntity));puts("请输入你要修改会员的电话号码");scanf("%lld",&p->number);while(fscanf(fp,"%s %lld %s", p1->name,&p1->number, p->work)!=EOF)//从原文件读一个结点{if(p->number != p1->number)//不是要修改的内容{fprintf(fp1,"%s %lld %s\n", p1->name, p1->number, p->work);}else{//重新录入会员数据puts("请输入会员的姓名");scanf("%s", p1->name);puts("请输入会员的电话号码");scanf("%lld",&p1->number);puts("请输入会员所购买的房型");scanf("%s", p1->work);fprintf(fp1,"%s %lld %s\n", p1->name, p1->number, p->work);}}free(p);free(p1);fclose(fp);fclose(fp1);remove(".\\会员信息.txt");//移除原文件rename("linshi.txt",".\\会员信息.txt");//把linshi文件重命名为原文件名}

5,删除会员

功能:实现在文件中对会员数据进行查找并删除
创新思想:创建一个临时文件,再把需要的数据输入到临时文件中,再把源文件移除
再把临时文件重命名。ok!

voidMemberDelete(){
    FILE* fp;
    FILE* fp1;
    fp =fopen(".\\会员信息.txt","r+");
    fp1 =fopen(".\\linshi.txt","w+");//新建一个临时文件structEntity* p =(structEntity*)malloc(sizeof(structEntity));structEntity* p1 =(structEntity*)malloc(sizeof(structEntity));puts("请输入你要删除会员的电话号码");scanf("%lld",&p->number);while(fscanf(fp,"%s %lld %s", p1->name,&p1->number, p->work)!=EOF)//从原文件读一个结点{if(p->number != p1->number)//不是要删除的内容{fprintf(fp1,"%s %lld %s\n", p1->name, p1->number, p->work);}}puts("恭喜您删除成功");free(p);free(p1);fclose(fp);fclose(fp1);remove(".\\会员信息.txt");rename("linshi.txt",".\\会员信息.txt");}

四,房屋管理

1,房屋菜单

在这里插入图片描述

清屏,while,switch

voidHouseManagement(){system("cls");while(1){printf("*************************************************\n");printf("*\t欢迎使用房屋管理功能\t\t\t*\n");printf("*\t\t请选择功能\t\t\t*\n");printf("*************************************************\n");printf("*\t\t1.新建房屋\t\t\t*\n");printf("*\t\t2.修改房屋信息\t\t\t*\n");printf("*\t\t3.删除房屋信息\t\t\t*\n");printf("*\t\t4.查询房屋购买信息\t\t*\n");printf("*\t\t0.返回   \t\t\t*\n");printf("*************************************************\n");char b =_getch();if(b =='0')break;switch(b){case'1':HouseNew();break;case'2':HouseChange();break;case'3':HouseDelete();break;case'4':Huiyuanfile();break;default:printf("输入有误,没有该功能\n\n");system("pause");system("cls");break;}}system("cls");}

1,新建房屋

通过链表来新建,新建完后需要保存数据!
房屋信息:房屋类型,面积(m^2)

voidHouseNew(){int flag =2;while(head1 !=NULL&& end1->next !=NULL){
        end1 = end1->next;}while(flag !=1){structEntity* node =(structEntity*)malloc(sizeof(structEntity));if(head1 ==NULL){
            head1 = node;
            end1 = head1;}memset(node,0,sizeof(structEntity));printf("请输入新建房屋的类型(商品房等)\n");scanf("%s", node->name);printf("请输入新建房屋的面积(m^2)\n");scanf_s("%lld",&node->number);//&指针得到值printf("是否需要继续输入?否(1),是(2)\n");scanf("%d",&flag);
        end1->next = node;
        end1 = node;
        node->next =NULL;}system("pause");system("cls");}

2,修改房屋信息

实现在文件中查找字符串
关键函数:strcmp
创新思想:创建一个临时文件,再把需要的数据输入到临时文件中,再把源文件移除
再把临时文件重命名。ok!

voidHouseChange(){
    FILE* fp;
    FILE* fp1;
    fp =fopen(".\\房屋信息.txt","r+");
    fp1 =fopen(".\\linshi.txt","w+");//读新建一个临时文件structEntity* p =(structEntity*)malloc(sizeof(structEntity));structEntity* p1 =(structEntity*)malloc(sizeof(structEntity));puts("请输入你要修改房屋的名称");scanf("%s", p->name);while(fscanf(fp,"%s %lld", p1->name,&p1->number)!=EOF)//从原文件读一个结点{int abc =strcmp(p->name, p1->name);if(abc !=0)//不是要改变的内容{fprintf(fp1,"%s %lld\n", p1->name, p1->number);}else{puts("请输入新修改房屋的名称");scanf("%s", p1->name);puts("请输入新修改的房屋的面积");scanf("%lld",&p1->number);fprintf(fp1,"%s %lld\n", p1->name, p1->number);}}free(p);free(p1);fclose(fp);fclose(fp1);remove(".\\房屋信息.txt");rename("linshi.txt",".\\房屋信息.txt");system("cls");puts("恭喜您修改成功");system("pause");system("cls");}

3,删除房屋信息

实现在文件中查找字符串
关键函数:strcmp
创新思想:创建一个临时文件,再把需要的数据输入到临时文件中,再把源文件移除
再把临时文件重命名。ok!

voidHouseDelete(){
    FILE* fp;
    FILE* fp1;
    fp =fopen(".\\房屋信息.txt","r+");
    fp1 =fopen(".\\linshi.txt","w+");//读新建一个临时文件structEntity* p =(structEntity*)malloc(sizeof(structEntity));structEntity* p1 =(structEntity*)malloc(sizeof(structEntity));puts("请输入你要删除房屋的名称");scanf("%s", p->name);while(fscanf(fp,"%s %lld", p1->name,&p1->number)!=EOF)//从原文件读一个结点{int abc =strcmp(p->name, p1->name);if(abc !=0)//不是要改变的内容{fprintf(fp1,"%s %lld\n", p1->name, p1->number);}}free(p);free(p1);fclose(fp);fclose(fp1);remove(".\\会员信息.txt");rename("linshi.txt",".\\会员信息.txt");system("cls");puts("恭喜您删除成功");system("pause");system("cls");}

4,查询房屋信息

房屋信息即会员购买信息,那么我们这里就可以直接引用会员信息打印函数

//会员信息打印voidHuiyuanfile(){system("cls");
    FILE* fp;structEntity* p =(structEntity*)malloc(sizeof(structEntity));structEntity* q =(structEntity*)malloc(sizeof(structEntity));if((fp =fopen(".\\会员信息.txt","r"))==NULL){printf("打开会员信息.txt文件失败\n");return;}else{puts("**********************************");puts("*购买人\t\t*电话号码\t*所购买的房型\t*");while(1){int nRead =fscanf(fp,"%s %lld %s", q->name,&q->number, q->work);//nRead等于要输出参数的个数if(3== nRead){printf("*%-10s\t*%-lld\t*%-10s\n", q->name, q->number, q->work);
                p->next = q;
                p = q;}else{free(q);break;}}puts("**********************************");}
    p->next =NULL;fclose(fp);system("pause");system("cls");}

== 五,入住管理==

1,入住管理菜单

在这里插入图片描述

while循环,使用system(“cls”)清屏

//菜单voidPersonManagement(){system("cls");while(1){system("cls");puts("***********************************************");puts("*\t欢迎使用入住管理功能\t              *");puts("*\t\t\t                      *");puts("*\t1.会员入住处理 \t\t\t*");puts("*\t2.入住信息查询 \t\t\t*");puts("*\t0.返回 \t\t\t\t*");puts("***********************************************");char b =_getche();if(b =='0')break;switch(b){case'1':Person();break;case'2':Personfile();break;default:printf("输入有误,没有该功能\n\n");system("pause");system("cls");break;}}system("cls");}

2,会员入住管理

1,从会员信息.txt中读取数据,找到会员
2,把找到的会员数据输入入住信息。txt中,并加入一个数字(1or2or3),方便后面打印入住信息时使用,也方便会员录入
3,if判断入住还是申请设施使用
4,Sleep(毫秒数)为Windo.h头文件包含

//会员入住处理voidPerson(){system("cls");
    FILE* fp;
    FILE* fp1;structEntity* p =(structEntity*)malloc(sizeof(structEntity));if((fp1 =fopen(".\\入住信息.txt","a+"))==NULL){printf("打开入住信息.txt文件失败,请联系管理人员处理\n");system("pause");return;}if((fp =fopen(".\\会员信息.txt","r"))==NULL){printf("打开会员信息.txt文件失败\n");system("pause");return;}else{longlongint m;puts("********************************************************");printf("输入入住的会员的电话号码:");scanf("%lld",&m);puts("*购买人 \t*电话号码\t*所购买的房型*\t");while(1){structEntity* q =(structEntity*)malloc(sizeof(structEntity));int nRead =fscanf(fp,"%s %lld %s", q->name,&q->number, q->work);//nRead等于要输出参数的个数if(3== nRead && q->number == m){fprintf(fp1,"%s %11d %s", q->name, q->number, q->work);printf("*%-10s\t*%-lld\t*%-10s\t\n", q->name, q->number, q->work);puts("*入住输入1,申请设施输入2");//选择功能int b =0;scanf("%d",&b);if(b ==1)//入住puts("*请输入:""1(入住)""or""2(出租)""or3(空置)""");scanf_s("%d",&q->message);fprintf(fp1,"    %d\n", q->message);if(q->message ==1){system("cls");puts("恭喜入住成功!");}elseif(q->message ==2){system("cls");puts("恭喜出租成功");}else{system("cls");puts("恭喜空置成功");}free(q);break;}else//申请设施{system("cls");Sheshifile();//打印已有的设施AmusementSeek();//搜寻需要使用的设施puts("设施使用完毕");Sleep(4000);//屏幕暂停4sfree(q);break;}}else{if(!feof(fp)){
                    p->next = q;
                    p = q;}else{puts("抱歉,该会员未购买房屋,我们这儿不允许白嫖");//手动狗头break;}}}
        p->next =NULL;fclose(fp);system("pause");system("cls");}}}

3,入住信息查询

在这里插入图片描述

while遍历
创新点:用strcpy函数实现把之前的数字(1,2,3)变成(入住,出租,闲置)

//打印入住会员的信息voidPersonfile(){system("cls");
    FILE* fp;structEntity* p =(structEntity*)malloc(sizeof(structEntity));structEntity* q =(structEntity*)malloc(sizeof(structEntity));if((fp =fopen(".\\入住信息.txt","r"))==NULL){printf("打开入住信息.txt文件失败\n");return;}else{puts("******************************************************");printf("*购买人\t*电话号码\t*所购买的房型\t");printf("*入住信息\t*\n");while(1){structEntity* q =(structEntity*)malloc(sizeof(structEntity));//在堆中分配空间int nRead =fscanf(fp,"%s %lld %s %d", q->name,&q->number, q->work,&q->message);//nRead等于要输出参数的个数if(4== nRead){char b[20]="\0";if(q->message ==1)strcpy(b,"入住");elseif(q->message ==2)strcpy(b,"出租");elsestrcpy(b,"闲置");printf("*%-10s\t*%-lld\t*%-10s\t*%-10s\n", q->name, q->number, q->work, b);
                p->next = q;
                p = q;}else{free(q);break;}}}
    p->next =NULL;fclose(fp);system("pause");system("cls");}

六,娱乐设施管理

在述

1,娱乐设施管理菜单

while
创新点:用了_getch,好处不用按enter,直接就能继续运行

voidAmusementManagement(){system("cls");while(1){printf("*************************************************\n");printf("*\t欢迎使用设施管理功能\t\t\t*\n");printf("*\t\t请选择功能\t\t\t*\n");printf("*************************************************\n");printf("*\t\t1.新建设施信息\t\t\t*\n");//okprintf("*\t\t2.修改设施信息\t\t\t*\n");//okprintf("*\t\t3.删除设施信息   \t\t*\n");//okprintf("*\t\t0.返回   \t\t\t*\n");//okprintf("*************************************************\n");char b =_getch();if(b =='0')break;switch(b){case'1':AmusementNew();break;case'2':AmusementChange();break;case'3':AmusementDelete();default:printf("输入有误,没有该功能\n\n");system("pause");system("cls");break;}}system("pause");system("cls");}

2,新建娱乐设施

while循还,用一个判断来决定是否输入,更加人性化
设施信息:名称,可使用人数

voidAmusementNew(){system("cls");int flag =2;while(head3 !=NULL&& end3->next !=NULL){
        end3 = end3->next;}puts("***************************************");while(flag !=1)//判断是否继续,很常用的一个代码思想{structEntity* node =(structEntity*)malloc(sizeof(structEntity));if(head3 ==NULL){//判断是否头节点为空
            head3 = node;
            end3 = head3;}memset(node,0,sizeof(structEntity));//清空结构体//录入数据printf("*\t请输入新建设施的名称:\t\t*\n");scanf("%s", node->name);printf("*\t请输入设施可以使用的人数: \t\n");scanf_s("%lld",&node->number);//&指针得到值printf("*\t是否需要继续输入?否(1),是(2)\t*\n");scanf("%d",&flag);
        end3->next = node;
        end3 = node;
        node->next =NULL;//最后尾节点指向空(NULL)}system("cls");puts("请记得保存设施信息!");system("pause");system("cls");}

3,搜寻娱乐设施信息

在这里插入图片描述

此函数作用:在申请娱乐设施时的选择设施(也就是查找)
得不到数据,debug了很久。。。。解决后,奖励一杯快乐水

//搜寻seekvoidAmusementSeek(){
    FILE* fp;structEntity* p2 =(structEntity*)malloc(sizeof(structEntity));structEntity* q =(structEntity*)malloc(sizeof(structEntity));if((fp =fopen(".\\娱乐设施信息.txt","r"))==NULL){printf("打开娱乐设施信息.txt文件失败\n");return;}else{printf("请输入娱乐设施的名称:");scanf("%s", p2->name);while(1){int nRead =fscanf(fp,"%s %lld", q->name,&q->number);//nRead等于要输出参数的个数int abc =strcmp(p2->name, q->name)//相同返回为0printf("%d", abc);if(2== nRead && abc==0){puts("*娱乐设施名称\t*可使用人数\t*");printf("*%-10s\t*%-lld\t\n", q->name, q->number);free(q);//释放空间break;}elseif(nRead !=2){puts("对不起没用此娱乐设施信息");break;}}}fclose(fp);system("pause");}

4,修改娱乐设施信息

实现 :在文件中找到数据,并进行数据修改,并不改变其他数据!
创新思想:创建一个临时文件,再把需要的数据输入到临时文件中,再把源文件移除
再把临时文件重命名。ok!

voidAmusementChange(){
    FILE* fp2;
    FILE* fp3;longlongint c =0;
    fp2 =fopen(".\\娱乐设施信息.txt","r+");
    fp3 =fopen(".\\linshi2.txt","w+");//新建一个临时文件structEntity* p2 =(structEntity*)malloc(sizeof(structEntity));structEntity* p3 =(structEntity*)malloc(sizeof(structEntity));puts("请输入你要修改设施的名称");scanf("%s",&p2->name);while(fscanf(fp2,"%s %lld", p3->name,&p3->number)!=EOF)//从原文件读一个结点{int abc =strcmp(p2->name, p3->name);if(abc !=0)//不是要改变的内容{fprintf(fp3,"%s %lld\n", p3->name, p3->number);}else{puts("请输入新修改的设施的名称");scanf("%s", p3->name);puts("请输入新修改的设施可以使用的人数");scanf("%lld",&p3->number);fprintf(fp3,"%s %lld \n", p3->name, p3->number);}}free(p2);free(p3);fclose(fp2);fclose(fp3);remove(".\\娱乐设施信息.txt");rename("linshi2.txt",".\\娱乐设施信息.txt");system("cls");puts("恭喜您修改成功");system("pause");system("cls");}

5,删除设施信息

通过一个while循还遍历,和if来判断是否是需要删除的数据
创新思想:创建一个临时文件,再把需要的数据输入到临时文件中,再把源文件移除
再把临时文件重命名。ok!

voidAmusementDelete(){
    FILE* fp4;
    FILE* fp5;
    fp4 =fopen(".\\娱乐设施信息.txt","r+");
    fp5 =fopen(".\\linshi.txt","w+");//新建一个临时文件structEntity* p4 =(structEntity*)malloc(sizeof(structEntity));structEntity* p5 =(structEntity*)malloc(sizeof(structEntity));puts("请输入你要删除设施的名称");scanf("%s",&p4->name);while(fscanf(fp4,"%s %lld", p5->name,&p5->number)!=EOF)//从原文件读一个结点{int abc =strcmp(p4->name,p5->name);if(abc !=0)//不是要删除的内容{fprintf(fp5,"%s %lld\n", p5->name, p5->number);}}free(p4);free(p5);fclose(fp4);fclose(fp5);remove(".\\娱乐设施信息.txt");rename("linshi.txt",".\\娱乐设施信息.txt");system("cls");puts("恭喜您删除成功");system("pause");system("cls");}

七,用户管理

ps:这个功能函数的文件保存存在延迟,有时需要退出系统后,文件数据才会保存到文件中
运行时,可能不会看到文件的实时变化

1,用户管理菜单

在这里插入图片描述

清屏,while,_getche()

voidUserManagement(){system("cls");int k =PassWord();if(k ==2){system("cls");return;}while(1){printf("*************************************************\n");printf("*\t欢迎使用用户管理功能\t\t\t*\n");printf("*\t                    \t\t\t*\n");printf("*\t\t请选择功能\t\t\t*\n");printf("*************************************************\n");printf("*\t\t1.新建用户\t\t\t*\n");//okprintf("*\t\t2.查询用户\t\t\t*\n");//okprintf("*\t\t3.修改用户\t\t\t*\n");printf("*\t\t4.删除用户\t\t\t*\n");printf("*\t\t5.设置服务对象\t\t\t*\n");printf("*\t\t6.查询服务对象\t\t\t*\n");printf("*\t\t0.返回   \t\t\t*\n");//okprintf("*************************************************\n");char b =_getche();if(b =='0')break;switch(b){case'1':UserNew();break;case'2':UserSeek();break;case'3':UserChange();break;case'4':UserDelete();break;case'5':UserPerson();break;case'6':PersonUserfile();break;default:printf("输入有误,没有该功能\n\n");system("pause");system("cls");break;}}system("cls");}

2,新建用户

通过链表创建新的节点,记得保存到文件中
用户信息:名字,职务,电话号码

voidUserNew(){int flag =2;while(head4 !=NULL&& end4->next !=NULL){
        end4 = end4->next;}while(flag !=1){structEntity* node =(structEntity*)malloc(sizeof(structEntity));if(head4 ==NULL){
            head4 = node;
            end4 = head4;}memset(node,0,sizeof(structEntity));printf("*\t请输入服务人员的名字\t*\n");memset(node->name,'0',sizeof(node->name));scanf("%s", node->name);printf("*\t请输入其职务\t*\n");scanf("%s", node->work);printf("*\t请输入其的手机号码\t*\n");scanf_s("%lld",&node->number);//&指针得到值printf("是否需要继续输入?否(1),是(2)\n");scanf("%d",&flag);
        end4->next = node;
        end4 = node;
        node->next =NULL;}system("cls");puts("请记得保存用户信息!");system("pause");system("cls");}

3,查询用户

通过电话号码查询

voidUserSeek(){
    FILE* fp1;longlongint n;structEntity* p =(structEntity*)malloc(sizeof(structEntity));if((fp1 =fopen(".\\用户信息.txt","r"))==NULL){printf("打开用户信息.txt文件失败\n");return;}puts("输入服务人员电话号码");scanf("%lld",&n);while(1){structEntity* q =(structEntity*)malloc(sizeof(structEntity));int nRead =fscanf(fp1,"%s %lld %s ", q->name,&q->number, q->work);//nRead等于要输出参数的个数if(3== nRead && q->number == n){puts("********************************");puts("*姓名\t\t*职务\t\t*电话号码*");printf("*%-10s\t*%-10s\t*%-lld\n", q->name, q->work, q->number);puts("********************************");free(q);break;}else{
            p->next = q;
            p = q;}}
    p->next =NULL;fclose(fp1);system("pause");system("cls");}

4,修改用户

通过电话号码找到数据,再对其进行重新输入
创新思想:创建一个临时文件,再把需要的数据输入到临时文件中,再把源文件移除
再把临时文件重命名。ok!

voidUserChange(){
    FILE* fp;
    FILE* fp1;longlongint c =0;
    fp =fopen(".\\用户信息.txt","r+");
    fp1 =fopen(".\\linshi.txt","w+");//读新建一个临时文件structEntity* p =(structEntity*)malloc(sizeof(structEntity));structEntity* p1 =(structEntity*)malloc(sizeof(structEntity));puts("请输入你要修改用户的电话号码");scanf("%lld",&p->number);while(fscanf(fp,"%s %lld %s", p1->name,&p1->number, p->work)!=EOF)//从原文件读一个结点{if(p->number != p1->number)//不是要删除的内容{fprintf(fp1,"%s %lld %s\n", p1->name, p1->number, p->work);}else{puts("请输入用户的姓名");scanf("%s", p1->name);puts("请输入用户的电话号码");scanf("%lld",&p1->number);puts("请输入用户的职务");scanf("%s", p1->work);fprintf(fp1,"%s %lld %s\n", p1->name, p1->number, p->work);}}free(p);free(p1);fclose(fp);fclose(fp1);remove(".\\用户信息.txt");rename("linshi.txt",".\\用户信息.txt");puts("恭喜您修改成功");system("pause");system("cls");}

5, 删除用户数据

创新思想:创建一个临时文件,再把需要的数据输入到临时文件中,再把源文件移除
再把临时文件重命名。ok!

voidUserDelete(){
    FILE* fp;
    FILE* fp1;
    fp =fopen(".\\用户信息.txt","r+");
    fp1 =fopen(".\\linshi.txt","w+");//读新建一个临时文件structEntity* p =(structEntity*)malloc(sizeof(structEntity));structEntity* p1 =(structEntity*)malloc(sizeof(structEntity));puts("请输入你要删除用户的电话号码");scanf("%lld",&p->number);while(fscanf(fp,"%s %lld %s", p1->name,&p1->number, p->work)!=EOF)//从原文件读一个结点{if(p->number != p1->number)//不是要删除的内容{fprintf(fp1,"%s %lld %s\n", p1->name, p1->number, p->work);}}free(p);free(p1);fclose(fp);fclose(fp1);remove(".\\用户信息.txt");rename("linshi.txt",".\\用户信息.txt");puts("恭喜您删除成功");system("pause");system("cls");}

6,设置服务对象

2个文件,一个用户信息.txt,一个服务对象信息

voidUserPerson(){system("cls");longlongint n;
    FILE* fp1;
    FILE* fp2;structEntity* p =(structEntity*)malloc(sizeof(structEntity));structEntity* q =(structEntity*)malloc(sizeof(structEntity));if((fp1 =fopen(".\\用户信息.txt","r"))==NULL){printf("打开用户信息.txt文件失败\n");return;}if((fp2 =fopen(".\\服务对象信息.txt","a+"))==NULL){printf("打开服务人员信息.txt文件失败\n");return;}puts(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");puts("*输入服务人员电话号码");//设置服务人员scanf("%lld",&n);while(1){int nRead =fscanf(fp1,"%s %lld  %s", q->name,&q->number, q->work);//nRead等于要输出参数的个数if(3== nRead && q->number == n)//找到服务对象{puts("********************************");puts("*姓名\t*职务\t*电话号码*");printf("*%-10s\t*%-10s\t*%-lld\n", q->name, q->work, q->number);puts("********************************");puts("输入服务的对象的名字");//服务的对象scanf("%s", q->name1);fprintf(fp2,"%s %s %lld %s\n", q->name, q->work,q->number,q->name1);puts("服务成功");free(q);break;}else{
            p->next = q;
            p = q;}if(nRead !=3)printf("没有这个号码的服务人员");}
    p->next =NULL;fclose(fp1);system("pause");system("cls");}

7,查询服务对象

打印服务对象

voidPersonUserfile(){system("cls");
    FILE* fp1;structEntity* p =(structEntity*)malloc(sizeof(structEntity));structEntity* q =(structEntity*)malloc(sizeof(structEntity));if((fp1 =fopen(".\\服务对象信息.txt","r"))==NULL){printf("打开服务对象信息.txt文件失败\n");return;}puts("********************************");puts("*姓名    \t*职务\t\t*电话号码\t*服务对象");while(1){int nRead =fscanf(fp1,"%s %s %lld %s\n", q->name, q->work,&q->number,q->name1);//nRead等于要输出参数的个数if(4== nRead){printf("*%-10s\t*%-10s\t*%-lld\t*%-10s\n", q->name, q->work, q->number,q->name1);
            p->next = q;
            p = q;puts("********************************");}else{break;}}
    p->next =NULL;free(q);fclose(fp1);system("pause");system("cls");}

八,文件管理

1,文件管理菜单

文件包括:文件保存,文件数据查询,清空文件数据

voidFileMenu(){system("cls");int k =PassWord();if(k ==2){system("cls");return;}while(1){system("cls");printf("*************************************************\n");printf("*\t欢迎使用文件管理功能\t\t\t*\n");printf("*\t\t请选择功能\t\t\t*\n");printf("*************************************************\n");printf("*\t\t1.文件保存\t\t\t*\n");printf("*\t\t2.文件数据查询\t\t\t*\n");printf("*\t\t3.文件数据清空\t\t\t*\n");printf("*\t\t0.返回\t\t\t\t*\n");printf("*************************************************\n");char b =_getch();if(b =='0')break;switch(b){case'1':Savefile();break;case'2':Filesercher();break;case'3':flash();break;default:printf("输入有误,没有该功能\n\n");system("pause");system("cls");break;}}system("cls");}

2,文件数据保存

可以保存:会员,房屋,娱乐设施,用户数据
ps:因为新建时是用的链表,所以必须要保存
创新(取巧):这里用了个switch,再用strcpy,给filename赋值,再进行操作

voidSavefile(){system("cls");//打开文件while(1){system("cls");
        FILE* pFile;printf("************************************************\n");printf("*\t\t请输入您想保存那个文本数据\t*\n");printf("*\t\t输入1,保存会员数据\t\t*\n*\t\t输入2,保存房屋数据\t\t*\n");printf("*\t\t输入3,保存娱乐设施数据\t\t*\n*\t\t输入4,保存用户数据\t\t*\n");printf("*\t\t输入0,返回\t\t\t*\n");printf("*************************************************\n");char  ch2 =_getch();if(ch2 =='0')break;structEntity* p1 =NULL;char filename[30]={"0"};switch(ch2){case'1':strcpy(filename,".\\会员信息.txt");
            p1 = head2;break;case'2':strcpy(filename,".\\房屋信息.txt");
            p1 = head1;break;case'3':strcpy(filename,".\\娱乐设施信息.txt");
            p1 = head3;break;case'4':strcpy(filename,".\\用户信息.txt");
            p1 = head4;break;case'\n':break;default:printf("输入有误,没有该功能\n\n");system("pause");system("cls");break;}if(filename ==".\\用户信息.txt"){
            pFile =fopen(filename,"a+");//文件地址要改fseek(pFile,0,SEEK_END);if(pFile ==NULL){printf("打开文件失败。\n");return;}else{//写入数据structEntity* p = p1;while(p !=NULL){fprintf(pFile,"%s  %s %lld\n", p->name,p->number,p->work);
                    p = p->next;}//关闭文件fclose(pFile);printf("%s数据保存成功。\n", filename);system("pause");system("cls");}}elseif(filename ==".\\会员信息.txt"){
            pFile =fopen(filename,"a+");//文件地址要改fseek(pFile,0,SEEK_END);//末尾if(pFile ==NULL){printf("打开文件失败。\n");return;}else{//写入数据 structEntity* p = p1;while(p !=NULL){fprintf(pFile,"%s  %lld  %s \n", p->name, p->number, p->work);
                    p = p->next;}//关闭文件fclose(pFile);printf("%s数据保存成功。\n", filename);system("pause");system("cls");}}elseif(filename ==".\\入住信息.txt"){
            pFile =fopen(filename,"a+");//文件地址要改fseek(pFile,0,SEEK_END);//末尾if(pFile ==NULL){printf("打开文件失败。\n");return;}else{//写入数据 structEntity* p = p1;while(p !=NULL){fprintf(pFile,"%s  %lld  %s %d\n", p->name, p->number, p->work, p->message);
                    p = p->next;}//关闭文件fclose(pFile);printf("%s数据保存成功。\n", filename);system("pause");system("cls");}}else{
            pFile =fopen(filename,"a+");//文件地址要改fseek(pFile,0,SEEK_END);if(pFile ==NULL){printf("打开文件失败。\n");return;}else{//写入数据 structEntity* p = p1;while(p !=NULL){fprintf(pFile,"%s  %lld  %s \n", p->name, p->number, p->work);
                    p = p->next;}//关闭文件fclose(pFile);printf("%s数据保存成功。\n", filename);system("pause");system("cls");}}}system("cls");}

3,文件数据查询

@1,文件查询菜单

可以查询(打印)会员,房屋,娱乐设施,用户人员,服务对象信息
既是查询,有是打印

voidFilesercher(){system("cls");while(1){system("cls");puts("******************************");puts("*\t输入1查询会员信息    *\t");puts("*\t输入2查询房屋信息    *\t");puts("*\t输入3查询娱乐设施信息*\t");puts("*\t输入4查询用户人员信息*\t");puts("*\t输入5查询入住信息  *\t");puts("*\t输入6查询服务对象信息*\t");puts("*\t输入0退出            *\t");puts("******************************");char b =_getch();if(b =='0')break;switch(b){case'1':Huiyuanfile();break;case'2':Fangwufile();break;case'3':Sheshifile();break;case'4':Userfile();break;case'5':Personfile();break;case'6':PersonUserfile();break;default:printf("输入有误,没有该功能\n\n");system("pause");system("cls");break;}}system("cls");}

@2,房屋文件查询

voidFangwufile(){system("cls");
    FILE* fp;structEntity* p =(structEntity*)malloc(sizeof(structEntity));structEntity* q =(structEntity*)malloc(sizeof(structEntity));if((fp =fopen(".\\房屋信息.txt","r"))==NULL){printf("打开房屋信息.txt文件失败\n");return;}else{puts("**********************************");puts("*房屋类型\t\t*面积(m^2)");while(1){int nRead =fscanf(fp,"%s %lld", q->name,&q->number);//nRead等于要输出参数的个数if(2== nRead)//判断是否到了结尾{printf("*%-10s\t\t*%-lld*\n", q->name, q->number);
                p->next = q;
                p = q;puts("**********************************");}else{free(q);break;}}}
    p->next =NULL;fclose(fp);system("pause");}

@3,会员文件查询

voidHuiyuanfile(){system("cls");
    FILE* fp;structEntity* p =(structEntity*)malloc(sizeof(structEntity));structEntity* q =(structEntity*)malloc(sizeof(structEntity));if((fp =fopen(".\\会员信息.txt","r"))==NULL){printf("打开会员信息.txt文件失败\n");return;}else{puts("**********************************");puts("*购买人\t\t*电话号码\t*所购买的房型\t*");while(1){int nRead =fscanf(fp,"%s %lld %s", q->name,&q->number, q->work);//nRead等于要输出参数的个数if(3== nRead){printf("*%-10s\t*%-lld\t*%-10s\n", q->name, q->number, q->work);
                p->next = q;
                p = q;}else{free(q);break;}}puts("**********************************");}
    p->next =NULL;fclose(fp);system("pause");system("cls");}

@4,设施文件查询

voidSheshifile(){

    FILE* fp;structEntity* p =(structEntity*)malloc(sizeof(structEntity));structEntity* q =(structEntity*)malloc(sizeof(structEntity));if((fp =fopen(".\\娱乐设施信息.txt","r"))==NULL){printf("打开娱乐设施信息.txt文件失败\n");return;}else{puts("*娱乐设施的名称\t*可以使用的人数");while(1){int nRead =fscanf(fp,"%s %lld\n", q->name,&q->number);//nRead等于要输出参数的个数if(2== nRead){printf("*%-10s\t*%-lld\t\n", q->name, q->number);
                p->next = q;
                p = q;}else{free(q);break;}}}
    p->next =NULL;fclose(fp);system("pause");}

@5,用户文件查询

voidUserfile(){system("cls");
    FILE* fp1;structEntity* p =(structEntity*)malloc(sizeof(structEntity));structEntity* q =(structEntity*)malloc(sizeof(structEntity));if((fp1 =fopen(".\\用户信息.txt","r"))==NULL){printf("打开用户信息.txt文件失败\n");return;}puts("********************************");puts("*姓名    \t*职务\t\t*电话号码*");while(1){int nRead =fscanf(fp1,"%s %lld %s", q->name,&q->number,q->work);//nRead等于要输出参数的个数if(3== nRead){printf("*%-10s\t*%-10s\t*%-lld\n", q->name, q->work, q->number);
            p->next = q;
            p = q;puts("********************************");}else{free(q);break;}}
    p->next =NULL;fclose(fp1);system("pause");}

@6,入住文件查询

voidPersonfile(){system("cls");
    FILE* fp;structEntity* p =(structEntity*)malloc(sizeof(structEntity));structEntity* q =(structEntity*)malloc(sizeof(structEntity));if((fp =fopen(".\\入住信息.txt","r"))==NULL){printf("打开入住信息.txt文件失败\n");return;}else{puts("******************************************************");printf("*购买人\t\t*电话号码\t*所购买的房型\t");printf("*入住信息\t\n");while(1){structEntity* q =(structEntity*)malloc(sizeof(structEntity));int nRead =fscanf(fp,"%s %lld %s %d\n", q->name,&q->number, q->work,&q->message);//nRead等于要输出参数的个数if(4== nRead){char b[20]="\0";if(q->message ==1)strcpy(b,"入住");elseif(q->message ==2)strcpy(b,"出租");elsestrcpy(b,"闲置");printf("*%-10s\t*%-lld\t*%-10s\t*%-10s\n", q->name, q->number, q->work, b);
                p->next = q;
                p = q;}else{free(q);break;}}}
    p->next =NULL;fclose(fp);system("pause");system("cls");}

@7,服务对象文件查询

voidPersonUserfile(){system("cls");
    FILE* fp1;structEntity* p =(structEntity*)malloc(sizeof(structEntity));structEntity* q =(structEntity*)malloc(sizeof(structEntity));if((fp1 =fopen(".\\服务对象信息.txt","r"))==NULL){printf("打开服务对象信息.txt文件失败\n");return;}puts("********************************");puts("*姓名    \t*职务\t\t*电话号码\t*服务对象");while(1){int nRead =fscanf(fp1,"%s %s %lld %s\n", q->name, q->work,&q->number,q->name1);//nRead等于要输出参数的个数if(4== nRead){printf("*%-10s\t*%-10s\t*%-lld\t*%-10s\n", q->name, q->work, q->number,q->name1);
            p->next = q;
            p = q;puts("********************************");}else{break;}}
    p->next =NULL;free(q);fclose(fp1);system("pause");system("cls");}

4,文件数据清空

可以清空:会员,房屋,服务对象,娱乐设施,用户,入住信息
思想:switch,再用strcpy给filename赋值
重点:文件打开方式为w+,再直接关闭即可!!!

voidflash(){system("cls");//打开文件
    FILE* pFile;puts("***********************************");printf("*请输入您想保存哪个清空数据\n");printf("*输入1,清空会员数据\n*输入2,清空房屋数据\n*输入3,清空服务对象信息\n");printf("*输入4,清空娱乐设施数据\n*输入5,清空用户数据\n输入6,清空入住信息\n");puts("***********************************");char  ch2 =_getch();char filename[30]={"0"};switch(ch2){case'1':strcpy(filename,".\\会员信息.txt");break;case'2':strcpy(filename,".\\房屋信息.txt");break;case'3':strcpy(filename,".\\服务对象信息.txt");break;case'4':strcpy(filename,".\\娱乐设施信息.txt");break;case'5':strcpy(filename,".\\用户信息.txt");break;case'6':strcpy(filename,".\\入住信息.txt");break;case'\n':break;default:printf("输入有误,没有该功能\n\n");system("pause");system("cls");break;}
    FILE* fp =fopen(filename,"w+");if(fp ==NULL){printf("文件未被打开\n");}else{fclose(fp);printf("你已经清空%s\n", filename);}system("pause");system("cls");}

九,密码功能

注意添加 #define PASSWORD 6666
作用于:用户和文件操作时
注意在yangfuchao.h中添加int PassWord

int k =PassWord();if(k ==2){system("cls");return;}

上面这个是添加在各个功能菜单开头且在system(“cls”);后

intPassWord(){int password;int  a=0;do{system("cls");puts("***************************");printf("请输入密码\n");scanf_s("%d",&password);if(PASSWORD == password){break;}else{printf("密码输入有误,请重新输入\n");printf("是(1)否(2)重新输入\n");}scanf("%d",&a);if(a ==2)return2;}while(a ==1);puts("欢迎您!!!");puts("*******************************");system("pause");return1;}

本文转载自: https://blog.csdn.net/qq_50971078/article/details/111113293
版权归原作者 超超不写代码 所有, 如有侵权,请联系我们删除。

“C语言开发东北大学20级大作业—活力长者社区(附源码)”的评论:

还没有评论