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判断语句进行功能选择与函数切换。
int main(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':
return 0;//退出系统
break;
default:
printf("输入有误,没有该功能\n\n");
system("pause");//暂停
system("cls");//清屏
break;
}
}
return 0;
}
3,全局共用结构体
偷懒了,为了减少代码量,用了共用结构体
//全局结构体!!!
struct Entity {
char name[10] = { '\0' };//姓名,名称
char name1[10] = { '\0' };
char work[10] = { '\0' };//职位
int message = 0;//入住
long long int number = 0;//电话号码,可使用人数
struct Entity* next;
};
//全局头节点,尾节点
struct Entity* head1, * end1;//房屋
struct Entity* head2, * end2;//会员
struct Entity* head3, * end3;//设施
struct Entity* 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,菜单展示
void Menu() {
printf("*************************************************\n");
printf("*\t欢迎使用活力长者社区系统\t\t*\n");
printf("*\t\t请选择功能\t\t\t*\n");
printf("*************************************************\n");
printf("*\t\t1.会员管理\t\t\t*\n");//ok
printf("*\t\t2.房屋管理\t\t\t*\n");//ok
printf("*\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");//ok
printf("*\t\t0.退出系统\t\t\t*\n");//ok
printf("*************************************************\n");
}
2,打印菜单
//打印菜单
Menu();
//读取一个字符 整数,字符在内存中映射为ASCII码
char ch = getchar();
三,会员管理
1,会员管理菜单
用printf打印,再用while循环,switch选择,break退出
void MemberManagement() {
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");//ok
printf("*\t\t2.查询会员\t\t\t*\n");//ok
printf("*\t\t3.修改会员\t\t\t*\n");
printf("*\t\t4.删除会员\t\t\t*\n");
printf("*\t\t0.返回 \t\t\t*\n");//ok
printf("*************************************************\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,会员信息:姓名,手机号码,所选房屋
void MemberNew() {
int flag = 2;
//判断头节点是否为空,并找到尾节点
while (head2 != NULL && end2->next != NULL)
{
end2 = end2->next;
}
//打印房屋文件
Fangwufile();
while (flag != 1)//判断是否退出循环
{ //创建一个会员,在堆中分配内存
struct Entity* node = (struct Entity*)malloc(sizeof(struct Entity));
//判断头节点是否为空
if (head2 == NULL) {
head2 = node;
end2 = head2;
}
//录入会员信息
memset(node, 0, sizeof(struct Entity));//
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(整型数据)
void MemberSeek()
{ //文件指针
FILE* fp;
if ((fp = fopen(".\\会员信息.txt", "r")) == NULL)
{
printf("打开会员信息.txt文件失败\n");
return;
}
else
{ //查询的会员号码(11位),所以用long long
long long int m;
printf("输入会员的电话号码:");
scanf("%lld", &m);
//在堆中分配内存
struct Entity* q = (struct Entity*)malloc(sizeof(struct Entity));
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;
}
//判断是否到结尾也没有找到
else if (nRead != 3)
{
puts("对不起查询不到会员信息");
break;
}
}
}
fclose(fp);//关闭文件
system("pause");
system("cls");
}
4,修改会员
功能: 实现在文件中修改已保存的数据
创新思想:创建一个临时文件,再把需要的数据输入到临时文件中,再把源文件移除
再把临时文件重命名。ok!
void MemberChange() {
FILE* fp;
FILE* fp1;
long long int c = 0;
fp = fopen(".\\会员信息.txt", "r+");
fp1 = fopen(".\\linshi.txt", "w+");//新建一个临时文件
struct Entity* p = (struct Entity*)malloc(sizeof(struct Entity));
struct Entity* p1 = (struct Entity*)malloc(sizeof(struct Entity));
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!
void MemberDelete() {
FILE* fp;
FILE* fp1;
fp = fopen(".\\会员信息.txt", "r+");
fp1 = fopen(".\\linshi.txt", "w+");//新建一个临时文件
struct Entity* p = (struct Entity*)malloc(sizeof(struct Entity));
struct Entity* p1 = (struct Entity*)malloc(sizeof(struct Entity));
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
void HouseManagement()
{
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)
void HouseNew()
{
int flag = 2;
while (head1 != NULL && end1->next != NULL)
{
end1 = end1->next;
}
while (flag != 1)
{
struct Entity* node = (struct Entity*)malloc(sizeof(struct Entity));
if (head1 == NULL) {
head1 = node;
end1 = head1;
}
memset(node, 0, sizeof(struct Entity));
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!
void HouseChange(){
FILE* fp;
FILE* fp1;
fp = fopen(".\\房屋信息.txt", "r+");
fp1 = fopen(".\\linshi.txt", "w+");//读新建一个临时文件
struct Entity* p = (struct Entity*)malloc(sizeof(struct Entity));
struct Entity* p1 = (struct Entity*)malloc(sizeof(struct Entity));
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!
void HouseDelete(){
FILE* fp;
FILE* fp1;
fp = fopen(".\\房屋信息.txt", "r+");
fp1 = fopen(".\\linshi.txt", "w+");//读新建一个临时文件
struct Entity* p = (struct Entity*)malloc(sizeof(struct Entity));
struct Entity* p1 = (struct Entity*)malloc(sizeof(struct Entity));
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,查询房屋信息
房屋信息即会员购买信息,那么我们这里就可以直接引用会员信息打印函数
//会员信息打印
void Huiyuanfile()
{
system("cls");
FILE* fp;
struct Entity* p = (struct Entity*)malloc(sizeof(struct Entity));
struct Entity* q = (struct Entity*)malloc(sizeof(struct Entity));
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”)清屏
//菜单
void PersonManagement()
{
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头文件包含
//会员入住处理
void Person()
{
system("cls");
FILE* fp;
FILE* fp1;
struct Entity* p = (struct Entity*)malloc(sizeof(struct Entity));
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
{
long long int m;
puts("********************************************************");
printf("输入入住的会员的电话号码:");
scanf("%lld", &m);
puts("*购买人 \t*电话号码\t*所购买的房型*\t");
while (1)
{
struct Entity* q = (struct Entity*)malloc(sizeof(struct Entity));
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("恭喜入住成功!");
}
else if (q->message == 2)
{
system("cls");
puts("恭喜出租成功");
}
else
{
system("cls");
puts("恭喜空置成功");
}
free(q);
break;
}
else//申请设施
{
system("cls");
Sheshifile();//打印已有的设施
AmusementSeek();//搜寻需要使用的设施
puts("设施使用完毕");
Sleep(4000);//屏幕暂停4s
free(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)变成(入住,出租,闲置)
//打印入住会员的信息
void Personfile() {
system("cls");
FILE* fp;
struct Entity* p = (struct Entity*)malloc(sizeof(struct Entity));
struct Entity* q = (struct Entity*)malloc(sizeof(struct Entity));
if ((fp = fopen(".\\入住信息.txt", "r")) == NULL)
{
printf("打开入住信息.txt文件失败\n");
return;
}
else
{
puts("******************************************************");
printf("*购买人\t*电话号码\t*所购买的房型\t");
printf("*入住信息\t*\n");
while (1)
{
struct Entity* q = (struct Entity*)malloc(sizeof(struct Entity));//在堆中分配空间
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, "入住");
else if (q->message == 2)
strcpy(b, "出租");
else strcpy(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,直接就能继续运行
void AmusementManagement()
{
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");//ok
printf("*\t\t2.修改设施信息\t\t\t*\n");//ok
printf("*\t\t3.删除设施信息 \t\t*\n");//ok
printf("*\t\t0.返回 \t\t\t*\n");//ok
printf("*************************************************\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循还,用一个判断来决定是否输入,更加人性化
设施信息:名称,可使用人数
void AmusementNew() {
system("cls");
int flag = 2;
while (head3 != NULL && end3->next != NULL)
{
end3 = end3->next;
}
puts("***************************************");
while (flag != 1)//判断是否继续,很常用的一个代码思想
{
struct Entity* node = (struct Entity*)malloc(sizeof(struct Entity));
if (head3 == NULL) {//判断是否头节点为空
head3 = node;
end3 = head3;
}
memset(node, 0, sizeof(struct Entity));//清空结构体
//录入数据
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了很久。。。。解决后,奖励一杯快乐水
//搜寻seek
void AmusementSeek()
{
FILE* fp;
struct Entity* p2 = (struct Entity*)malloc(sizeof(struct Entity));
struct Entity* q = (struct Entity*)malloc(sizeof(struct Entity));
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)//相同返回为0
printf("%d", abc);
if (2 == nRead && abc==0)
{
puts("*娱乐设施名称\t*可使用人数\t*");
printf("*%-10s\t*%-lld\t\n", q->name, q->number);
free(q);//释放空间
break;
}
else if (nRead != 2)
{
puts("对不起没用此娱乐设施信息");
break;
}
}
}
fclose(fp);
system("pause");
}
4,修改娱乐设施信息
实现 :在文件中找到数据,并进行数据修改,并不改变其他数据!
创新思想:创建一个临时文件,再把需要的数据输入到临时文件中,再把源文件移除
再把临时文件重命名。ok!
void AmusementChange()
{
FILE* fp2;
FILE* fp3;
long long int c = 0;
fp2 = fopen(".\\娱乐设施信息.txt", "r+");
fp3 = fopen(".\\linshi2.txt", "w+");//新建一个临时文件
struct Entity* p2 = (struct Entity*)malloc(sizeof(struct Entity));
struct Entity* p3 = (struct Entity*)malloc(sizeof(struct Entity));
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!
void AmusementDelete() {
FILE* fp4;
FILE* fp5;
fp4 = fopen(".\\娱乐设施信息.txt", "r+");
fp5 = fopen(".\\linshi.txt", "w+");//新建一个临时文件
struct Entity* p4 = (struct Entity*)malloc(sizeof(struct Entity));
struct Entity* p5 = (struct Entity*)malloc(sizeof(struct Entity));
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()
void UserManagement() {
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");//ok
printf("*\t\t2.查询用户\t\t\t*\n");//ok
printf("*\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");//ok
printf("*************************************************\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,新建用户
通过链表创建新的节点,记得保存到文件中
用户信息:名字,职务,电话号码
void UserNew() {
int flag = 2;
while (head4 != NULL && end4->next != NULL)
{
end4 = end4->next;
}
while (flag != 1)
{
struct Entity* node = (struct Entity*)malloc(sizeof(struct Entity));
if (head4 == NULL)
{
head4 = node;
end4 = head4;
}
memset(node, 0, sizeof(struct Entity));
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,查询用户
通过电话号码查询
void UserSeek() {
FILE* fp1;
long long int n;
struct Entity* p = (struct Entity*)malloc(sizeof(struct Entity));
if ((fp1 = fopen(".\\用户信息.txt", "r")) == NULL)
{
printf("打开用户信息.txt文件失败\n");
return;
}
puts("输入服务人员电话号码");
scanf("%lld", &n);
while (1)
{
struct Entity* q = (struct Entity*)malloc(sizeof(struct Entity));
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!
void UserChange()
{
FILE* fp;
FILE* fp1;
long long int c = 0;
fp = fopen(".\\用户信息.txt", "r+");
fp1 = fopen(".\\linshi.txt", "w+");//读新建一个临时文件
struct Entity* p = (struct Entity*)malloc(sizeof(struct Entity));
struct Entity* p1 = (struct Entity*)malloc(sizeof(struct Entity));
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!
void UserDelete()
{
FILE* fp;
FILE* fp1;
fp = fopen(".\\用户信息.txt", "r+");
fp1 = fopen(".\\linshi.txt", "w+");//读新建一个临时文件
struct Entity* p = (struct Entity*)malloc(sizeof(struct Entity));
struct Entity* p1 = (struct Entity*)malloc(sizeof(struct Entity));
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,一个服务对象信息
void UserPerson(){
system("cls");
long long int n;
FILE* fp1;
FILE* fp2;
struct Entity* p = (struct Entity*)malloc(sizeof(struct Entity));
struct Entity* q = (struct Entity*)malloc(sizeof(struct Entity));
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,查询服务对象
打印服务对象
void PersonUserfile(){
system("cls");
FILE* fp1;
struct Entity* p = (struct Entity*)malloc(sizeof(struct Entity));
struct Entity* q = (struct Entity*)malloc(sizeof(struct Entity));
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,文件管理菜单
文件包括:文件保存,文件数据查询,清空文件数据
void FileMenu()
{
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赋值,再进行操作
void Savefile() {
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;
struct Entity* 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 {//写入数据
struct Entity* 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");
}
}
else if (filename == ".\\会员信息.txt")
{
pFile = fopen(filename, "a+");
//文件地址要改
fseek(pFile, 0, SEEK_END);//末尾
if (pFile == NULL) {
printf("打开文件失败。\n");
return;
}
else {//写入数据
struct Entity* 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");
}
}
else if (filename == ".\\入住信息.txt")
{
pFile = fopen(filename, "a+");
//文件地址要改
fseek(pFile, 0, SEEK_END);//末尾
if (pFile == NULL) {
printf("打开文件失败。\n");
return;
}
else {//写入数据
struct Entity* 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 {//写入数据
struct Entity* 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,文件查询菜单
可以查询(打印)会员,房屋,娱乐设施,用户人员,服务对象信息
既是查询,有是打印
void Filesercher() {
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,房屋文件查询
void Fangwufile()
{
system("cls");
FILE* fp;
struct Entity* p = (struct Entity*)malloc(sizeof(struct Entity));
struct Entity* q = (struct Entity*)malloc(sizeof(struct Entity));
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,会员文件查询
void Huiyuanfile()
{
system("cls");
FILE* fp;
struct Entity* p = (struct Entity*)malloc(sizeof(struct Entity));
struct Entity* q = (struct Entity*)malloc(sizeof(struct Entity));
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,设施文件查询
void Sheshifile()
{
FILE* fp;
struct Entity* p = (struct Entity*)malloc(sizeof(struct Entity));
struct Entity* q = (struct Entity*)malloc(sizeof(struct Entity));
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,用户文件查询
void Userfile()
{
system("cls");
FILE* fp1;
struct Entity* p = (struct Entity*)malloc(sizeof(struct Entity));
struct Entity* q = (struct Entity*)malloc(sizeof(struct Entity));
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,入住文件查询
void Personfile() {
system("cls");
FILE* fp;
struct Entity* p = (struct Entity*)malloc(sizeof(struct Entity));
struct Entity* q = (struct Entity*)malloc(sizeof(struct Entity));
if ((fp = fopen(".\\入住信息.txt", "r")) == NULL)
{
printf("打开入住信息.txt文件失败\n");
return;
}
else
{
puts("******************************************************");
printf("*购买人\t\t*电话号码\t*所购买的房型\t");
printf("*入住信息\t\n");
while (1)
{
struct Entity* q = (struct Entity*)malloc(sizeof(struct Entity));
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, "入住");
else if (q->message == 2)
strcpy(b, "出租");
else strcpy(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,服务对象文件查询
void PersonUserfile(){
system("cls");
FILE* fp1;
struct Entity* p = (struct Entity*)malloc(sizeof(struct Entity));
struct Entity* q = (struct Entity*)malloc(sizeof(struct Entity));
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+,再直接关闭即可!!!
void flash() {
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”);后
int PassWord() {
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)
return 2;
} while (a == 1);
puts("欢迎您!!!");
puts("*******************************");
system("pause");
return 1;
}