网吧管理系统------C语言课设

  • 1.课程设计报告的要求
  • 2.实现管理员注册和登录模块的代码
  • 3.实现管理员对用户的管理功能及简介如下,包括上下机,余额积分加减等功能。
  • 4.主函数
  • 5.存在的不足
  • 6.心得体会

1.课程设计报告的要求

开发一个简单的网吧管理系统,实现以下基本功能:
【基本功能】
1.网吧会员信息包括:会员号、会员姓名、手机号、身份证号、积分等。
2.上网信息包括:会员号、电脑编号、上网开始时间等。
3.能够添加、删除、修改会员信息,并将修改后的信息再次写入文件。
4.能够按给定会员号、姓名等信息进行查找并显示相关信息。
5.能够按照姓名或会员号对会员信息进行排序,并存入文件中。
6.结算时,需将对应上网信息删除,并添加相应会员积分。
【扩展功能】
可以按照自己对网吧管理系统的需求理解进行扩展。比如:(1)权限处理 (2)模糊查询(3)综合查询(4)统计等功能。总之,可以根据自己的需求分析进行功能扩展。

2.实现管理员注册和登录模块的代码

部分函数声明及功能简介

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
//#include "user_vip.h"
void menu();
//打印菜单以供用户选择void menu_choice(int choice);
//对用户菜单的选项来调用函数void sign_in();
//设置登陆系统,默认账号12345678
//默认密码admin
//第一次输入需要用户更新账号密码存于名为key的文本文档中
//运用fopen函数void registe();
/*注册函数
* 先判断是否是默认函数(sign_flag是否为0)
* 如果是则可以修改
* 如果不是则需要输入任意一位管理员账号密码才能注册
*/void add_administrator_menu();
//打印添加管理员菜单void add_administrator(int choice);
/*在默认账号密码已经被使用过之后
* 使用的添加管理员的函数
* 需要输入之前任意一位管理员的账号密码
才能注册新的管理员账号密码
*///建立所需文件
void OpenFile();

各个函数具体内容

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "sysytem.h"
#include "user_vip.h"
char id[15];
char key[15];
//int sign_flag;
//FILE* p = fopen("flag.txt", "r");
//fscanf(p,"%d",&sign_flag);
//flag.txt表示注册次数,第一次则直接覆盖默认账号密码void set_file()
{FILE *p1=fopen("管理员key.txt", "a+");FILE *p2=fopen("管理员id.txt", "a+");FILE* p3= fopen("sign_flag.txt", "a+");FILE* p4 = fopen("user_somebody.txt", "a+");FILE* p5 = fopen("user_vip.txt", "a+");//fprintf(p4,"**********************会员号码*****会员名称*****会员手机号*****零钱余额*****积分余额**********************");fclose(p1);fclose(p2);fclose(p3);fclose(p4);fclose(p5);}void menu()
{//int sign_flag = 0;//表示注册次数,第一次则直接覆盖默认账号密码int choice;printf("\n\n\n\n");printf("           ****************************************************************           \n");printf("           *                        网吧管理系统                          *           \n");printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("           *              请输入账号密码来进入管理员后台!                 *           \n");printf("           *                                                              *           \n");printf("           *                   ( 默认账号:12345678                        *           \n");printf("           *                                                              *           \n");printf("           *                    默认密码:admin )                          *           \n");printf("           *       1.登录                                                 *           \n");printf("           *       2.注册账号                                             *           \n");printf("           *       3.退出系统                                             *           \n");printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("           *    [默认账号密码仅用于注册第一位管理员,使用一次之后会失效]   *           \n");printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("           ****************************************************************           \n");printf("\n\n\n");printf("请输入对应菜单选项!\n");scanf("%d", &choice);menu_choice(choice);}/*
* 1.登录(未完成)
* 2.注册账号
* 3.退出系统
*///默认密码登录不安全提示?直接跳注册界面?
//显示当前已有多少管理员?
void menu_choice(int choice)
{switch (choice){case 1:sign_in();break;case 2:registe();break;case 3:printf("\n\n谢谢使用本管理系统,系统已退出!\n\n");exit(0);break;default:printf("输入错误,请重新输入!\n");menu();}
}//第一个管理员允许才能创建第二个管理员?[已完成]
//注册函数要注意思考用户名重复问题[已完成]
//"\n"是否读入?[已完成fseek解决,读入\n]
//时间动感?颜色?
void sign_in()
//登录
{FILE* fp1=fopen("管理员id.txt","r" );FILE* fp2 = fopen("管理员key.txt", "r");
//r表示只读int sign_flag;FILE* p = fopen("sign_flag.txt", "r");fscanf(p, "%d", &sign_flag);int flag = 0;char library_id[15];char library_key[15];int count = 0;printf("           ****************************************************************           \n");printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("                          账号:");scanf("%s", &id);while (strlen(id) > 15){printf("账号长度过大,请重新输入\n");scanf("%s", id);}printf("           *                                                              *           \n");printf("           *                                                              *           \n");puts("");printf("                          密码:");scanf("%s", &key);while (strlen(key) > 15){printf("密码长度过大,请重新输入\n");scanf("%s", key);}printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("           ****************************************************************           \n");puts("");if (sign_flag == 0 && strcmp(id, "12345678") == 0 && strcmp(key, "admin") == 0){printf("请勿用默认管理员账号密码进入系统!仅用来注册使用!\n");printf("\n即将返回上一层菜单!\n");menu();}else{while (strcmp(library_id, id) != 0){fscanf(fp1, "%s", library_id);if (strcmp(library_id, id) == 0)flag = 1;count++;if (count > sign_flag){printf("\n\n您暂无管理员权限,请重新输入!\n\n");menu();break;}}if (flag == 1){count = 0;while (strcmp(library_key, key) != 0){fscanf(fp2, "%s", library_key);//不能换行输入的话,"内加空格试试if (strcmp(library_key, key) == 0)flag = 2;count++;if (count > sign_flag){printf("\n密码错误,请重新输入!\n");sign_in();break;}}}if (flag == 2){pr_vip_menu();}}}void registe()
{int sign_flag;FILE* p = fopen("sign_flag.txt", "r");fscanf(p, "%d", &sign_flag);fclose(p);printf("           ****************************************************************           \n");printf("           *                      新管理员后台注册系统                    *           \n");  printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("                        请输入新管理员账号:");scanf("%s", &id);while (strlen(id) > 15){printf("账号过长,请输入0-15位字符作为账号密码,\n请重新输入账号");scanf("%s", &id);}printf("                        请输入新管理员密码:");scanf("%s", &key);while (strlen(key) > 15){printf("账号过长,请输入0-15位字符作为账号密码\n请重新输入密码");scanf("%s", &key);}printf("           *                                                              *           \n");printf("           *            [第一次注册请使用默认账号密码注册!]               *           \n");printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("           ****************************************************************           \n");if (sign_flag > 0){printf("\n\n\n");printf("您暂无注册管理员权限!请联系任意一位管理员获取权限!!\n");printf("\n\n\n");add_administrator_menu();}else if (sign_flag == 0){if (strcmp(id, "12345678") == 0 && strcmp("admin", key) == 0){FILE* fp1=NULL; FILE* fp2=NULL;FILE* fp3=NULL;FILE* fp4=NULL;fp1 = fopen("管理员id.txt", "w");fp2 = fopen("管理员key.txt", "w");fclose(fp1);fclose(fp2);fp3 = fopen("管理员id.txt", "r+");fp4 = fopen("管理员key.txt", "r+");printf("                       请输入新的管理员账号:\n");scanf("%s", &id);while (strlen(id) > 15){printf("账号过长,请输入0-15位字符作为账号密码,\n请重新输入账号");scanf("%s", &id);}printf("                        请输入新管理员密码:");scanf("%s", &key);while (strlen(key) > 15){printf("账号过长,请输入0-15位字符作为账号密码\n请重新输入密码");scanf("%s", &key);}fputs(key, fp4);fputs(id,fp3);fclose(fp3);fclose(fp4);sign_flag++;}else{printf("默认账号密码有误,请重新尝试!\n");registe();}p = fopen("sign_flag.txt", "w");fclose(p);p = fopen("sign_flag.txt", "r+");fprintf(p, "%d", sign_flag);fclose(p);printf("\n\n\n您已注册成功,即将返回主菜单!!\n");menu();}}/* 用户名重复问题[已完成]
* \n读入问题[已完成]
* 是否要限制用户名和密码位数?
* 是否密码复杂度?修改密码?
打印菜单供选择[已完成]
*/void add_administrator_menu()
{int choice;printf("\n\n\n");printf("           ****************************************************************           \n");printf("           *                您正在申请注册新的管理员权限                  *           \n");printf("           *                                                              *           \n");printf("           *            请输入以下菜单编号来获取功能                      *           \n");printf("           *                                                              *           \n");printf("           *           1.注册新的管理员权限                               *           \n");printf("           *                                                              *           \n");printf("           *           2.返回登陆界面                                     *           \n");printf("           *                                                              *           \n");printf("           *           3.退出系统                                         *           \n");printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("           ****************************************************************           \n");printf("\n\n");printf("请输入菜单编号:\n");scanf("%d", &choice);add_administrator(choice);}/*
* 1.注册新管理
* 2.返回登陆
* 3.退出系统
*/void add_administrator(int choice)
{char id[15];char key[15];int sign_flag;FILE* p = fopen("sign_flag.txt","r");fscanf(p,"%d",&sign_flag);fclose(p);FILE* fp1 = fopen("管理员id.txt", "r");FILE* fp2 = fopen("管理员key.txt", "r");char id_tem[15];int flag = 0;char key_tem[15];//媒介用于对比switch (choice){case 1:printf("\n\n\n");printf("           ****************************************************************           \n");printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("                 请输入已注册管理员的账号:");scanf("%s", id);while (strlen(id) > 15){printf("账号长度过大,请重新输入\n");scanf("%s", id);}printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("                 请输入已注册管理员的密码:");scanf("%s", key);while (strlen(key) > 15){printf("密码长度过大,请重新输入\n");scanf("%s", key);}printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("           ****************************************************************           \n");//接下来核对管理员账号密码是否正确for (int i = 0; i < sign_flag; i++){fscanf(fp1, "%s", id_tem);fscanf(fp2, "%s", key_tem);if (strcmp(id_tem, id) == 0){flag = 1;if (strcmp(key_tem, key) == 0){flag = 2;}}//fp1 += strlen(id_tem);//fp2 += strlen(key_tem);fseek(fp1, strlen(id_tem), SEEK_CUR);fseek(fp1, strlen(key_tem), SEEK_CUR);}fp1 = fopen("管理员id.txt", "r");fp2 = fopen("管理员key.txt", "r");if (flag == 0){printf("无此管理员权限信息!请检查是否账号输入错误\n");printf("\n\n\n");add_administrator_menu();}if (flag == 1){printf("管理员密码错误!\n");printf("\n\n\n");add_administrator_menu();}//接下来检验账户名是否重复else if (flag == 2){printf("\n\n\n");printf("           ****************************************************************           \n");printf("           *                  您已成功进入注册界面!                       *           \n");printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("                  请输入新的管理员账号:");scanf("%s", &id);while (strlen(id) > 15){printf("账号长度过大,请重新输入\n");scanf("%s", id);}printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("                  请输入您的密码:");scanf("%s", &key);while (strlen(key) > 15){printf("密码长度过大,请重新输入\n");scanf("%s", key);}printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("           ****************************************************************           \n");flag = 3;for (int i = 0; i < sign_flag; i++){fscanf(fp1, "%s", &id_tem);if (strcmp(id, id_tem) == 0){flag = 4;break;}//fp1 += strlen(id_tem);fseek(fp1, strlen(id_tem), SEEK_CUR);}while (flag == 4){printf("\n\n");printf("与其他管理员账号相同,请修改账号!\n\n");printf("\n");printf("           ****************************************************************           \n");printf("           *                  您已成功进入注册界面!                       *           \n");printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("                  请输入新的管理员账号:");scanf("%s", &id);while (strlen(id) > 15){printf("账号长度过大,请重新输入\n");scanf("%s", id);}printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("                  请输入您的密码:");scanf("%s", &key);while (strlen(key) > 15){printf("密码长度过大,请重新输入\n");scanf("%s", key);}printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("           *                                                              *           \n");printf("           ****************************************************************           \n");fp1 = fopen("管理员id.txt", "r");//指针归0for (int i = 0; i < sign_flag; i++){flag = 3;fscanf(fp1, "%s", &id_tem);if (strcmp(id, id_tem) == 0){flag = 4;break;}//fp1 += strlen(id_tem) + 1;fseek(fp1, strlen(id_tem) + 1, SEEK_CUR);}}//此时账号已经不重复,可以录入文件内了fp1 = fopen("管理员id.txt", "a");fp2 = fopen("管理员key.txt", "a");fprintf(fp1, "\n");fprintf(fp1,"%s", id);//fprintf(fp1, "\n");fprintf(fp2, "\n");fprintf(fp2,"%s", key);//fprintf(fp2, "\n");sign_flag++;FILE* fp3 = fopen("sign_flag.txt", "w");fclose(fp3);fp3 = fopen("sign_flag.txt", "r+");fprintf(fp3, "%d",sign_flag);//关闭文件fclose(fp1);fclose(fp2);fclose(fp3);}/* flag=0表示初始状态或者管理员账号密码均错误* flag=1表示之前管理员账号正确,但密码错误需要检查密码* flag=2表示之前管理员账号密码验证通过* flag=3表示管理员账号不重复,可以成功注册* flag=4表示刚刚注册新管理员,若结束输入后flag还是4则表示管理员账号重复*/printf("\n\n\n您已完成注册!即将返回系统主菜单\n\n\n");menu();break;case 2:sign_in();break;case 3:break;default:printf("请输入菜单中的序号!\n");add_administrator_menu();}
}void OpenFile()
{FILE* p1 = fopen("sign_flag.txt","r");if (p1 == NULL){FILE* p1 = fopen("sign_flag.txt", "w");fprintf(p1, "%d", 0);fclose(p1);}FILE* p2 = fopen("管理员id.txt", "r");if (p2 == NULL);{FILE* p2 = fopen("管理员id.txt", "w");fprintf(p2, "%s", "12345678");fclose(p2);}FILE* p3 = fopen("管理员key.txt", "r");if (p3 == NULL);{FILE* p3 = fopen("管理员key.txt", "w");fprintf(p3, "%s", "admin");fclose(p3);}FILE* p4 = fopen("user_somebody.txt", "r");if (p4 == NULL);{FILE* p4 = fopen("user_somebody.txt", "w");fclose(p4);}FILE* p5 = fopen("user_vip.txt", "r");if (p5 == NULL);{FILE* p5 = fopen("user_vip.txt", "w");fclose(p5);}FILE* p6 = fopen("count_vip.txt", "r");if (p6 == NULL);{FILE* p6 = fopen("count_vip.txt", "w");fprintf(p6, "%d", 0);fclose(p6);}FILE* p7 = fopen("count_user.txt", "r");if (p7 == NULL);{FILE* p7 = fopen("count_user.txt", "w");fprintf(p7, "%d", 0);fclose(p7);}FILE* p8 = fopen("count_com.txt", "r");if (p8 == NULL);{FILE* p8 = fopen("count_com.txt", "w");fprintf(p8, "%d", 0);fclose(p8);}FILE* p9 = fopen("ComputersOn.txt", "r");if (p9 == NULL);{FILE* p9 = fopen("ComputersOn.txt", "w");fclose(p9);}FILE* p10 = fopen("ComputersDown.txt", "r");if (p10 == NULL);{FILE* p10 = fopen("ComputersDown.txt", "w");fclose(p10);}
}

3.实现管理员对用户的管理功能及简介如下,包括上下机,余额积分加减等功能。

相关函数声明及功能简介如下

#pragma once
void pr_vip_menu();
//打印菜单以供选择void vipmenu_choice(int choice);
//根据选项调用函数void add_vip();
//添加vip用户的信息void add_somebody();
//添加普通用户的信息int read_count();
int read_count_vip();
//分别返回总人数和vip人数//读取数据到结构体数组
void ReadSomebodyData();void ReadVipData();//修改用户信息
void ModifyUser();//返回主菜单
void ReMenu();//删除用户信息
void DelUser();//打印所有信息
void  PriUser();//char * GetCurTime();//获取正在上机电脑数量
int ReadComCount();//获取电脑状态
void ReadComOnData();//打印电脑信息
void PriComData();
//登陆电脑
void SignCom();
//下机函数
void ExitCom();
//机器管理菜单
void ComMenu();
//记录上机时间
void timestart();
//记录下机时间
void timeend();
//积分排序
void IntegralRank();
//模糊查找
void Search();//清除电脑上机下机信息
void DelDown( char id[21]);void DelOn(char id[21]);
//扣钱加钱
void SubBalance(char id[21],float sum);void AddBalance();void AddIntegral(int sum, char id[21]);int TimeSub(char id[10]);

函数本体在这

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <Windows.h>
#include "user_vip.h"
#include <time.h>
#define MAX 1000;//vip最多600
#define Com 1000///两百台电脑
// 1 2 3 4 5 6 7 8 9 10
// . . . . . .     .  .
typedef struct user
{char id[21];char name[21];char tele[20];int integral;float balance;};user vip[1000];user somebody[1000];
typedef struct clock
{int hour;   //小时int minute; //分钟int second;  //秒
} Clock;
Clock startime;//用于存储上机开始时间
Clock endtime;//用于存储下机时间
Clock temptime;//用于存储临时时间
typedef struct Computer
{//char Whether;//char time[30]=GetCurTime();char id[10];char UserId[21];int hour, minute, second;};
//积分系统别忘了写好后嵌套到下机系统里面同时删除上机下机信息(数删早了?)
Computer ComsOn[500];
Computer ComsDown[500];
void pr_vip_menu()
{int choice;printf("\n\n恭喜您成功进入系统!\n\n");printf("           ****************************************************************           \n");printf("           *                  网吧管理系统-用户管理系统                   *           \n");printf("           *                                                              *           \n");printf("           *     1.查看注册用户人数                                       *           \n");//包括平民和vip,显示分别有几个人(已写)printf("           *                                                              *           \n");printf("           *     2.机器管理系统                                           *           \n");//包括哪些正在上机,那些需要维修,哪些状态良好未启动(数量,编号)printf("           *                                                              *           \n");printf("           *     3.增加用户                                               *           \n");//增加vip,平民(已写)printf("           *                                                              *           \n");printf("           *     4.修改用户信息                                           *           \n");//vip与平民分开写(已写)     printf("           *                                                              *           \n");printf("           *     5.删除用户信息                                           *           \n");//已写printf("           *                                                              *           \n");printf("           *     6.查看积分排行榜                                         *           \n");//并且存积分,同时修改上机状态和机器状态        printf("           *                                                              *           \n");printf("           *     7.查找用户信息                                           *           \n");//分类:vip,平民,模糊查找(名字,vip号),  ......另设菜单//余额查询printf("           *                                                              *           \n");printf("           *     8.余额充值                                               *           \n");//充值体现查询,(借助查找实现?)(余额不足自动提示?)printf("           *                                                              *           \n");printf("           *     9.展示用户信息                                           *           \n");printf("           *                                                              *           \n");printf("           *     10.退出系统                                              *           \n");printf("           *                                                              *           \n");printf("           ****************************************************************           \n");printf("\n\n\n");printf("请输入菜单上的序号以供选择\n");scanf("%d", &choice);vipmenu_choice(choice);
}void vipmenu_choice(int choice)
{int count = read_count();int count_vip = read_count_vip();switch (choice){int choice1;case 1://用户注册人数printf("           ****************************************************************           \n");printf("\n                     当前已注册用户人数:%d\n                     其中已注册会员人数:%d\n                     未注册会员人数:%d\n", count, count_vip, count - count_vip);printf("即将返回主菜单\n");printf("           ****************************************************************           \n");for (int i = 0; i < 20; i++){printf("*");Sleep(100);}system("pause");pr_vip_menu();break;case 2:ComMenu();break;case 3://增加printf("           ****************************************************************           \n");printf("\n                 请输入用户类型\n                 1.VIP用户\n                  2.普通用户\n");printf("           ****************************************************************           \n");scanf("%d", &choice1);if (choice1 == 1)add_vip();if (choice1 == 2)add_somebody();else{printf("           ****************************************************************           \n");printf("\n                           输入错误请重试!\n");printf("           ****************************************************************           \n");vipmenu_choice(1);}break;case 4://修改ModifyUser();break;case 5://删除DelUser();break;case 6://删除上网信息IntegralRank();break;case 7://查找用户Search();break;case 8://查询余额(积分)AddBalance();break;case 9://查询用户信息(打印所有,模糊查找)PriUser();break;case 10:system("cls");Sleep(500);printf("           ****************************************************************           \n");printf("\n                                 您已成功退出系统\n\n");printf("           ****************************************************************           \n");exit(0);default:printf("\n请输入菜单上的编号!\n");pr_vip_menu();break;}
}void add_vip()
{user tem;printf("           ****************************************************************           \n");printf("                      请输入新会员的姓名:");scanf("%s", tem.name);printf("                    请输入新会员的身份证号码:");scanf("%s", tem.id);printf("                     请输入新会员的电话号码:");scanf("%s", tem.tele);printf("           ****************************************************************           \n");//已注册情况int count = read_count_vip(); int flag = 0;FILE* p1 = fopen("user_vip.txt", "a+");ReadVipData();for (int i = 0; i < count; i++){if (strcmp(vip[i].id, tem.id) ==0){flag = 1;break;}}if (flag == 1){printf("           ****************************************************************           \n");printf("\n                    此账号为已注册会员,请检查是否输入错误!\n\n");printf("           ****************************************************************           \n");Sleep(1000);system("cls");pr_vip_menu();}fclose(p1);//未注册情况if (flag == 0){FILE* p = fopen("user_vip.txt", "a+");fprintf(p, "%s %s %s %d %.2f\n", tem.id, tem.name, tem.tele, 0, 0);fclose(p);printf("           ****************************************************************           \n");printf("\n                     会员信息输入成功!即将返回主菜单\n\n");printf("           ****************************************************************           \n");count++;FILE* p2 = fopen("count_vip.txt", "w");fprintf(p2, "%d", count);int count1 = read_count();FILE* p3 = fopen("count_user.txt", "w");count1++;fprintf(p3, "%d", count1);fclose(p3);fclose(p);fclose(p2);Sleep(750);system("cls");}pr_vip_menu();}void add_somebody()
{user tem;printf("           ****************************************************************           \n");printf("                      请输入新用户的姓名:");scanf("%s", tem.name);printf("                    请输入新用户的身份证号码:");scanf("%s", tem.id);printf("                     请输入新用户的电话号码:");scanf("%s", tem.tele);printf("           ****************************************************************           \n");//已注册情况int count = read_count();int count1 = read_count_vip(); int flag = 0;FILE* p1 = fopen("user_somebody.txt", "r");for (int i = 0; i < count-count1; i++){if (strcmp(somebody[i].id, tem.id) ==0){flag = 1;break;}}if (flag == 1){printf("\n\n此账号为已注册用户,请检查注册类型是否输入错误!\n\n");Sleep(1000);system("cls");pr_vip_menu();}//未注册情况if (flag == 0){FILE* p = fopen("user_somebody.txt", "a+");fprintf(p, "%s %s %s %d %.2f\n", tem.id, tem.name, tem.tele, 0, 0);fclose(p);printf("\n用户信息输入成功!即将返回主菜单\n\n");FILE* p3 = fopen("count_user.txt", "w");count++;fprintf(p3, "%d", count);fclose(p3);fclose(p1);fclose(p);Sleep(750);system("cls");}pr_vip_menu();FILE* p = fopen("user_somebody.txt", "r+");fprintf(p, "%s %s %s %d %d\n", tem.id, tem.name, tem.tele, 0, 0);fclose(p);printf("\n用户信息输入成功!即将返回主菜单\n\n");Sleep(750);system("cls");pr_vip_menu();
}//读取总人数 返回总人数
int read_count()
{int count;FILE* p = fopen("count_user.txt", "r");fscanf(p,"%d", &count);fclose(p);return count;
}int read_count_vip()
{int count_vip;FILE* p = fopen("count_vip.txt", "r");fscanf(p,"%d", &count_vip);fclose(p);return count_vip;
}//读取信息到结构体数组void ReadVipData()
{FILE* p = fopen("user_vip.txt", "r");int CountVip = read_count_vip();for (int i = 0; i < CountVip; i++){user* p1=&vip[i];fscanf(p, "%s%s%s%d%f", p1->id, p1->name, p1->tele, &p1->integral, &p1->balance);}fclose(p);
}void ReadSomebodyData(){FILE* p = fopen("user_somebody.txt", "r");int CountVip = read_count_vip();int Count = read_count();for (int i = 0; i < Count-CountVip; i++){user* p1 = &somebody[i];fscanf(p, "%s%s%s%d%f", p1->id, p1->name, p1->tele, &p1->integral, &p1->balance);}fclose(p);}//修改用户信息void ModifyUser(){system("cls");printf("\n请输入需要修改信息的用户类型!\n");printf("         1.VIP会员用户\n");printf("         2.普通用户\n");int choice; int flag = 0;int Count = read_count();int CountVip = read_count_vip();char id[20];int i = 0;   scanf("%d", &choice);int a = 0;if (choice == 1){ReadVipData();FILE* p1 = fopen("user_vip.txt", "w");printf("\n\n请输入要修改信息会员的账号!\n\n");scanf("%s", id);for (i = 0; i < CountVip; i++){if (strcmp(id, vip[i].id) == 0){flag = 1;int choice2;printf("\n\n请输入需要修改用户的信息类型\n\n");printf("        1.用户身份证号码\n");printf("        2.用户姓名\n");printf("        3.用户手机号码\n");scanf("%d", &choice2);system("cls");if (choice2 == 1){char new_id[20];printf("\n请输入修改后的用户身份证号码!\n");scanf("%s", new_id);strcpy(vip[i].id, new_id);}if (choice2 == 2){char new_name[20];printf("\n请输入修改后的用户姓名!\n");scanf("%s", new_name);strcpy(vip[i].name, new_name);}if (choice2 == 3){char new_tele[20];printf("\n请输入修改后的用户身份证号码!\n");scanf("%s", new_tele);strcpy(vip[i].tele, new_tele);}}fprintf(p1, "%s %s %s %d %.2f\n", vip[i].id, vip[i].name, vip[i].tele, vip[i].integral, vip[i].balance);}if (flag == 0){printf("\n未找到该用户请重新输入!\n");ModifyUser();}fclose(p1);printf("\n\n用户信息修改成功!\n\n");Sleep(1000);ReMenu();}if (choice == 2){ReadSomebodyData();FILE* p2 = fopen("user_somebody.txt", "w+");FILE* p1 = fopen("user_vip.txt", "a+");printf("\n\n请输入要修改信息用户的账号!\n\n");scanf("%s", id);for (i = 0; i < Count - CountVip; i++){if (strcmp(id, somebody[i].id) == 0){flag = 1;int choice2;printf("\n\n请输入需要修改用户的信息类型\n\n");printf("        1.用户身份证号码\n");printf("        2.用户姓名\n");printf("        3.用户手机号码\n");printf("        4.用户升级为VIP会员\n");scanf("%d", &choice2);system("cls");if (choice2 == 1){char new_id[20];printf("\n请输入修改后的用户身份证号码!\n");scanf("%s", new_id);strcpy(somebody[i].id, new_id);fprintf(p2, "%s %s %s %d %.2f\n", somebody[i].id, somebody[i].name,somebody[i].tele, somebody[i].integral, somebody[i].balance);}if (choice2 == 2){char new_name[20];printf("\n请输入修改后的用户姓名!\n");scanf("%s", new_name);strcpy(somebody[i].name, new_name);fprintf(p2, "%s %s %s %d %.2f\n", somebody[i].id, somebody[i].name, somebody[i].tele,somebody[i].integral, somebody[i].balance);}if (choice2 == 3){char new_tele[20];printf("\n请输入修改后的用户身份证号码!\n");scanf("%s", new_tele);strcpy(somebody[i].tele, new_tele);fprintf(p2, "%s %s %s %d %.2f\n", somebody[i].id, somebody[i].name,somebody[i].tele, somebody[i].integral, somebody[i].balance);}if (choice2 == 4){fprintf(p1, "%s %s %s %d %.2f\n", somebody[i].id, somebody[i].name,somebody[i].tele, somebody[i].integral, somebody[i].balance);CountVip++;FILE* p4 = fopen("count_vip.txt", "w");fprintf(p4, "%d", CountVip);fclose(p4);CountVip--;}if (choice2 > 4 || choice2 <= 0){printf("\n菜单标号输入错误,请重新输入!\n");Sleep(2000);ModifyUser();}}elsefprintf(p2, "%s %s %s %d %.2f\n", somebody[i].id, somebody[i].name,somebody[i].tele, somebody[i].integral, somebody[i].balance);if (flag == 0){printf("\n未找到该用户请重新输入!\n");Sleep(2000);ModifyUser();}}fclose(p1);fclose(p2);printf("\n\n用户信息修改成功!\n\n");Sleep(1000);ReMenu();}else{printf("\n菜单标号输入错误,请重新输入!\n");Sleep(2000);ModifyUser();}ReMenu();}void ReMenu(){system("cls");printf("即将返回主菜单\n");for (int i = 0; i < 20; i++){printf("<");Sleep(30);}system("cls");pr_vip_menu();}void DelUser(){int choice;int flag = 0;int Count = read_count();int CountVip = read_count_vip();printf("\n\n请输入要删除的用户类型!\n\n");printf("        1.VIP会员用户\n");printf("        2.普通用户\n");scanf("%d", &choice);printf("请输入删除的用户的身份证号码:\n");char id[20];scanf("%s", id);if (choice == 1){ReadVipData();FILE* p = fopen("user_vip.txt","w");for (int i = 0; i < CountVip; i++){if (strcmp(vip[i].id, id) == 0){flag=1;}else{fprintf(p, "%s %s %s %d %.2f\n", vip[i].id, vip[i].name, vip[i].tele, vip[i].integral, vip[i].balance);}}if (flag == 1){system("cls");printf("\n\n用户信息删除成功,即将返回主菜单\n\n");CountVip--;FILE* p1 = fopen("count_vip.txt", "w");Count--;FILE* p2 = fopen("count_user.txt", "w");fprintf(p2, "%d", Count);fprintf(p1, "%d", CountVip);fclose(p1);fclose(p2);}elseprintf("\n\n无法找到此用户,请检查是否输入错误\n\n");Sleep(1000);ReMenu();}else if (choice == 2){ReadSomebodyData();FILE* p = fopen("user_somebody.txt", "w");for (int i = 0; i < CountVip; i++){if (strcmp(somebody[i].id, id) == 0){flag=1 ;}else{fprintf(p, "%s %s %s %d %.2f\n", somebody[i].id, somebody[i].name, somebody[i].tele, somebody[i].integral, somebody[i].balance);}}if (flag == 1){system("cls");printf("\n\n用户信息删除成功,即将返回主菜单\n\n");Count--;FILE* p2 = fopen("count_user.txt", "w");fprintf(p2, "%d", Count);fclose(p2);}elseprintf("\n\n无法找到此用户,请检查是否输入错误\n\n");Sleep(1000);ReMenu();}else if(choice!=1&&choice!=2){printf("\n\n请正确输入菜单选项中的标号!\n\n");Sleep(2000);system("cls");DelUser();}}void PriUser(){int choice;int i = 0;FILE* p1 = fopen("user_vip.txt","r");FILE* p2 = fopen("user_somebody.txt", "r");int Count = read_count();int CountVip = read_count_vip();printf("\n请输入需要展示的菜单编号\n");printf("             ****************************************************************           \n");printf("\n             1.打印所有VIP会员用户的信息\n");printf("\n             2.打印所有非会员用户的信息\n");printf("\n             3.打印所有用户的信息(先VIP后用户)\n");printf("\n           ****************************************************************           \n");scanf("%d", &choice);system("cls");printf("*******************************************************************************************************\n");printf("*----------用户姓名----------身份证号码-----------手机号码----------会员余额---------会员积分---------*\n");switch (choice){case 1:ReadVipData();for (i = 0; i < CountVip; i++){printf("\n*           %s          %s       %s            %.2f               %d           *\n", vip[i].name, vip[i].id, vip[i].tele, vip[i].balance, vip[i].integral);}printf("\n*******************************************************************************************************\n");break;case 2:ReadSomebodyData();for (i = 0; i < Count-CountVip; i++){printf("\n*           %s          %s       %s            %.2f               %c           *\n", somebody[i].name, somebody[i].id, somebody[i].tele, somebody[i].balance, '\\');}printf("\n*******************************************************************************************************\n");break;case 3:ReadVipData();for (i = 0; i < CountVip; i++){printf("\n*           %s          %s       %s            %.2f               %d           *\n", vip[i].name, vip[i].id, vip[i].tele, vip[i].balance, vip[i].integral);}ReadSomebodyData();for (i = 0; i < Count - CountVip; i++){printf("\n*           %s          %s       %s            %.2f               %c           *\n", somebody[i].name, somebody[i].id, somebody[i].tele, somebody[i].balance, '\\');}printf("\n*******************************************************************************************************\n");break;default:printf("\n请输入正确的菜单标号\n\n");PriUser();break;}system("pause");ReMenu();}//char* GetCurTime()//{// time_t CurTime;// CurTime = time(NULL);// char Cur_Time[30];// struct tm *Time;// Time = localtime(&CurTime);// strcpy(Cur_Time,asctime(Time));// return Cur_Time;// //}void  ComMenu(){int choice;printf("           ****************************************************************           \n");printf("           *                       机器管理系统                           *           \n");printf("           *       1.查看机器状态         *      2.上机                   *           \n");printf("           *                              *                               *           \n");printf("           *       3.下机                 *      4.返回上层菜单           *           \n");printf("           *                              *                               *           \n");printf("           ****************************************************************           \n");printf("请输入菜单选项!\n");scanf("%d", &choice);switch (choice){case 1:PriComData();break;case 2:SignCom();break;case 3:ExitCom();break;case 4:ReMenu();exit(0);default:printf("请输入正确的菜单标号!\n\n");Sleep(1000);system("cls");ComMenu();break;}ReMenu();}int ReadComCount(){int count;FILE* p = fopen("count_com.txt", "r");fscanf(p, "%d", &count);fclose(p);return count;}void ReadComOnData(){FILE* p = fopen("ComputersOn.txt", "r");int count = ReadComCount();for (int i = 0; i < count; i++){struct Computer* p1 = &ComsOn[i];fscanf(p, "%s%s%d%d%d", p1->id, p1->UserId,&p1->hour,&p1->minute,&p1->second);}fclose(p);}void ReadComDownData(){FILE* p = fopen("ComputersDown.txt", "r");int count = ReadComCount();for (int i = 0; i < count; i++){struct Computer* p1 = &ComsDown[i];fscanf(p, "%s%s%d%d%d", p1->id, p1->UserId, &p1->hour, &p1->minute, &p1->second);}fclose(p);}void SignCom(){char id[21];int flag = 0;char userid[21];int count = ReadComCount();FILE* p = fopen("count_com.txt", "r+");PriComData();if (count >= 500){printf("上机机器已达最大值,请您等候!\n");ReMenu();}printf("请选择需要上机的电脑编号:\n");scanf("%s", &id);for (int i = 0; i < count; i++){if (strcmp(id, ComsOn[i].id) == 0){flag = 1;}}if (flag == 1){printf("\n此电脑已有用户在使用,请重新选择电脑!\n");SignCom();}if (flag == 0){int flag1 = 0;char time[50];printf("请输入上机的用户编号:\n");scanf("%s", userid);ReadVipData();ReadSomebodyData();int count_vip = read_count_vip();int count_user = read_count();for (int i = 0; i < count_vip; i++){if (strcmp(vip[i].id, userid) == 0){int a;if (vip[i].balance <= 0){printf("余额不足,请充值!\n");AddBalance();}flag1 = 1;break;}}if (flag1 == 0){for (int i = 0; i < count_user-count_vip; i++){if (strcmp(somebody[i].id, userid) == 0){if (somebody[i].balance <= 0){printf("余额不足,请充值!\n");AddBalance();}flag1 = 1; break;}}}if (flag1 == 1){//char* a = GetCurTime();//strcpy(time, a);timestart();FILE* p1 = fopen("ComputersOn.txt", "a");fprintf(p1, "%s %s %d %d %d\n", id, userid,startime.hour,startime.minute,startime.second );count++;fclose(p);fclose(p1);FILE* p = fopen("count_com.txt", "w");fprintf(p, "%d", count);fclose(p);system("cls");printf("\n上机成功!即将返回主菜单\n");Sleep(1000);system("pause");ReMenu();}if (flag1 == 0){printf("\n\n您暂未注册账号,请联系管理员进行注册!\n\n");Sleep(1000);system("pause");ReMenu();}}fclose(p);}void ExitCom(){char id[21];int flag = 0;char userid[21];int count = ReadComCount();FILE* p = fopen("count_com.txt", "r+");PriComData();fclose(p);printf("请选择需要下机的电脑编号:\n");scanf("%s", &id);for (int i = 0; i < count; i++){if (strcmp(id, ComsOn[i].id) == 0){flag = 1;}}/*if (flag == 1){printf("\n请确认是否下机?\n");}*/if (flag == 1){int flag1 = 0;char time[50];printf("请输入下机的用户编号:\n");scanf("%s", userid);ReadVipData();ReadSomebodyData();int count_vip = read_count_vip();int count_user = read_count();for (int i = 0; i < count_vip; i++){if (strcmp(vip[i].id, userid) == 0){flag1 = 1;break;}}if (flag1 == 0){for (int i = 0; i < count_user - count_vip; i++){if (strcmp(somebody[i].id, userid) == 0){flag1 = 1; break;}}}if (flag1 == 1){//char* a = GetCurTime();//strcpy(time, a);int count = ReadComCount();ReadComOnData();int flag2 = 0;for (int i = 0; i < count; i++){if (strcmp(id, ComsOn[i].id) == 0){flag2 = 1; break;}}if (flag2 == 1){timeend();FILE* p1 = fopen("ComputersDown.txt", "a");fprintf(p1, "%s %s %d %d %d\n", id, userid, endtime.hour, endtime.minute, endtime.second);fclose(p1);system("cls");//增加积分功能float sum = TimeSub(id);SubBalance(userid,sum);AddIntegral( sum, userid);//删除上网信息功能//DelDown(id);DelOn(userid);//扣钱printf("\n下机成功!即将返回主菜单\n");count--;FILE* p = fopen("count_com.txt", "w");FILE* p3 = fopen("ComputersDown.txt", "w");fprintf(p, "%d", count);fclose(p);fclose(p3);Sleep(1000);ReMenu();}else{printf("\n\n您暂未上机,请检查是否输入错误!\n\n");ExitCom();}}if (flag1 == 0){printf("\n\n您暂未注册账号,请联系管理员进行注册!\n\n");Sleep(1000);ReMenu();}}}void PriComData(){FILE* p = fopen("count_com.txt", "r+");int count = ReadComCount();//ReadVipData();//ReadSomebodyData();printf("\n目前有%d个电脑处于工作状态,有%d个电脑处于空闲状态\n", count, 500 - count);ReadComOnData();for (int i = 0; i < count; i++){printf("\n目前 %s 号机正处于工作状态,上机会员的会员编号是 %s ,上机于 %02d : %02d: %02d \n", ComsOn[i].id, ComsOn[i].UserId,ComsOn[i].hour,ComsOn[i].minute,ComsOn[i].second);}fclose(p);system("pause");}void timestart(){time_t now;struct tm* p;time(&now);p = localtime(&now);startime.hour = p->tm_hour;startime.minute = p->tm_min;startime.second = p->tm_sec;}void timeend(){time_t now;struct tm* p;time(&now);p = localtime(&now);endtime.hour = p->tm_hour;endtime.minute = p->tm_min;endtime.second = p->tm_sec;}void IntegralRank(){ReadVipData();user tem = {0,0,0,0,0};int count = read_count_vip();int flag = 0;for (int i = 0; i < count - 1; i++){for (int j = 0; j <count - 1 - i; j++){if (vip[j].integral <=vip[j + 1].integral){tem = vip[j];vip[j] = vip[j + 1];vip[j + 1] = tem;}}if (flag == 0)break;}printf("*******************************************************************************************************\n");printf("*----------用户姓名----------身份证号码-----------手机号码----------会员余额---------会员积分---------*\n");for (int i = 0; i < count; i++){printf("\n*           %s          %s       %s            %.2f               %d           *\n", vip[i].name, vip[i].id, vip[i].tele, vip[i].balance, vip[i].integral);}printf("\n*******************************************************************************************************\n");system("pause");ReMenu();}void Search(){char massage[80];printf("\n请输入任何关于要查找用户的任何准确信息!\n");scanf("%s", massage);int count = read_count();int count_vip = read_count_vip();FILE* p1 = fopen("user_vip.txt", "r");int flag = 0;FILE* p2 = fopen("user_somebody.txt", "r");for (int i = 0; i < count_vip; i++){char str[80];fgets(str, 80, p1);if (strstr(str, massage) != NULL){flag = 1;ReadVipData();printf("\n");printf("*----------用户姓名----------身份证号码-----------手机号码----------会员余额---------会员积分---------*\n");printf("\n*           %s          %s       %s            %.2f              %d           *\n", vip[i].name, vip[i].id, vip[i].tele, vip[i].balance, vip[i].integral);printf("\n");}}for (int i = 0; i < count-count_vip; i++){char str[80];fgets(str, 80, p2);if (strstr(str, massage) != NULL){flag = 1;ReadSomebodyData();printf("\n");printf("*----------用户姓名----------身份证号码-----------手机号码----------会员余额---------会员积分---------*\n");printf("\n*           %s          %s       %s            %d               %d           *\n", somebody[i].name, somebody[i].id, somebody[i].tele, somebody[i].balance, somebody[i].integral);printf("\n");}}if(flag==1)printf("\n用户信息查询完毕,即将返回菜单\n");if (flag == 0)printf("\n未查到相关信息,请检查是否输入错误!\n即将返回主菜单\n");system("pause");ReMenu();}//返回上网分钟数作为积分增加量int TimeSub(char id[10]){ReadComOnData();ReadComDownData();int h1, h2, m1, m2;int sum = 0;int count = ReadComCount();for (int i = 0; i < count; i++){if (strcmp(id, ComsOn[i].id) == 0){h1 = ComsOn[i].hour;m1 = ComsOn[i].minute;break;}}for (int i = 0; i < count; i++){if (strcmp(id, ComsOn[i].id) == 0){h2 = ComsDown[i].hour;m2 = ComsDown[i].minute;break;}}if (m2 >= m1){sum += (m2 - m1 + (h2 - h1) * 60);}else{h2--;m2 += 60;sum += ((h2 - h1) * 60 + m2 - m1);}return sum;}//增加积分void AddIntegral(int sum,char id[21]){ReadVipData();int count = read_count_vip();int flag = 0;for (int i = 0; i < count; i++){if (strcmp(vip[i].id, id) == 0){flag = 1;vip[i].integral += sum;break;}}FILE* p = fopen("user_vip.txt", "w");for (int i = 0; i < count; i++){fprintf(p, "%s %s %s %d %.2f\n", vip[i].id, vip[i].name, vip[i].tele, vip[i].integral, vip[i].balance);}if (flag == 0)printf("\n您为非会员,暂无积分增加,如需开通积分功能,请联系管理员升级为会员!\n");fclose(p);system("pause");}void DelOn(char id[21]){ReadComOnData();int count = ReadComCount();FILE* p = fopen("ComputersOn.txt", "w+");for (int i = 0; i < count; i++){if (strcmp(id, ComsOn[i].UserId) == 0);elsefprintf(p, "%s %s %d %d %d\n", ComsOn[i].id, ComsOn[i].UserId, ComsOn[i].hour, ComsOn[i].minute, ComsOn[i].second);}fclose(p);}void DelDown(char id[21]){ReadComDownData();int count = ReadComCount();FILE* p = fopen("ComputersDown.txt", "w+");for (int i = 0; i < count; i++){if (strcmp(id, ComsOn[i].id) == 0);//fprintf(p, "%s %s %d %d %d\n", ComsOn[i].id, ComsOn[i].UserId, ComsDown[i].hour, ComsDown[i].minute, ComsDown[i].second);}fclose(p);}void SubBalance(char id[21],float sum){sum /= 60;sum *= 5;int count = read_count_vip();int count1 = read_count();int flag = 0;ReadVipData();for (int i = 0; i < count; i++){if (strcmp(vip[i].id, id) == 0){flag = 1;vip[i].balance -= sum;if (vip[i].balance <= 0)printf("余额不足,请联系管理员充值!\n");}if (flag == 1){FILE* p1 = fopen("user_vip.txt", "w");for (int i = 0; i < count; i++){fprintf(p1, "%s %s %s %d %.2f\n", vip[i].id, vip[i].name, vip[i].tele, vip[i].integral, vip[i].balance);}fclose(p1);break;}}if (flag == 0){ReadSomebodyData();for (int i = 0; i < count1 - count; i++){if (strcmp(somebody[i].id, id) == 0){flag = 1;somebody[i].balance -= sum;if (somebody[i].balance <= 0)printf("余额不足,请联系管理员充值!\n");break;}}FILE* p = fopen("user_somebody.txt", "w");for (int i = 0; i < count1-count; i++){fprintf(p, "%s %s %s %d %.2f\n", somebody[i].id, somebody[i].name, somebody[i].tele, somebody[i].integral, somebody[i].balance);}fclose(p); }}void AddBalance(){char id[21];printf("请输入需要充值余额的用户账号!\n\n");scanf("%s", id);printf("请输入需要充值的余额!\n\n");float a;scanf("%f", &a);ReadVipData();int count = read_count_vip();int count1 = read_count();int flag = 0;for (int i = 0; i < count; i++){if (strcmp(vip[i].id, id) == 0){flag = 1;vip[i].balance += a;break;}}if (flag == 1){FILE* p1 = fopen("user_vip.txt", "w");for (int i = 0; i < count; i++){fprintf(p1, "%s %s %s %d %.2f\n", vip[i].id, vip[i].name, vip[i].tele, vip[i].integral, vip[i].balance);}fclose(p1);}if (flag == 0){ReadSomebodyData();for (int i = 0; i < count1 - count; i++){if (strcmp(somebody[i].id, id) == 0){flag = 2;flag = 1;somebody[i].balance += a;break;}}FILE* p = fopen("user_somebody.txt", "w");for (int i = 0; i < count; i++){fprintf(p, "%s %s %s %d %.2f\n", somebody[i].id, somebody[i].name, somebody[i].tele, somebody[i].integral, somebody[i].balance);}fclose(p);}if (flag == 0){printf("未找到该用户请检查是否输入错误!\n\n");printf("即将返回主菜单!");system("pause");ReMenu();}else{printf("恭喜你,充值成功!\n");printf("即将返回主菜单!");system("pause");ReMenu();}}

4.主函数

int main()
{OpenFile();menu();//qq2811949745欢迎共同学习相互交流,以及能力范围内的疑问解答return 0;
}

5.存在的不足

6.1注册管理员账号

问题1:在使用注册管理员时需要手动建立相关文本文档,并输入相关内容(默认账号密码、初始管理员数目为0)以便注册新管理员时读取和对比。
问题2:在注册管理员时因为要验证有无注册新管理权限总会要求输入两遍新的管理员账号密码。
问题3:对输入的账号和密码未作限制要求,若输入位数过大程序则会出现相应错误而无法运行。
问题4:账号密码在存储时未进行加密。
解决方法1:新建一个函数在程序第一次启动(只有0位管理员)时才运行,函数自动建立相关文本文档并输入相关内容。
解决方法2:调换顺序先验证有无新管理员权限,再要求输入新管理员的账号密码,减少一次输入。
解决方法3:当检测到输入位数过大时进行提醒,并要求重新输入。
解决方法4:运用相应加密方式在账号密码读取和存储时使用。

6.2登录管理员账号

问题:未限制输入登陆账号密码时的位数,容易造成栈溢出。
解决方法:当检测到输入位数过大时进行提醒,并要求重新输入。

6.3增加用户信息

问题1:在读取用户数据之后未能及时关闭文件,容易造成文件清空或者文件内容损坏不完整。
问题2:在输入错误之后直接返回主菜单再重新进入功能菜单,而不是重新输入,程序繁琐
解决方法1:打开文件读取数据之后及时关闭文件
解决方法2:调整ReMenu(返回主菜单)函数的使用次数和位置,重新调整逻辑来减少程序繁琐性。

6.4删除、修改用户信息

问题1:在删除和修改时总会把所有该类型用户数据读取,再进行查找,随后把无关的数据再输出回文本文件,大大增加程序的时间复杂的对内存读取造成大量的浪费。
解决方法:不读取文件到结构体数组,直接使用Fseek函数搭配双指针对用户信息进行比对,若符合则不进行行为,若不符合则将当前数据存储到临时文件中,最后只需将需要修改的用户信息输入到临时文件中。利用remove函数删除原文件,再利用rename函数将临时文件命名为原文件便可以实现数据的交换和更新。大大减少了时间的复杂度和空间的读取。

6.5查找用户信息

问题1:不能进行精确查找。并且在进行模糊查找之后,不能在查找结果的基础上再次进行模糊查找或者精确查找。
问题2:在查找到所要查找的用户信息之后无法对其进行相应的功能更改(例如余额、积分增减,信息修改、上机下机操作)
解决方法1:在模糊查找之后嵌套菜单使用户选择是否继续进行查找,并选择相应的查找方式。
解决方法2:在查找到用户之后嵌入一个菜单函数,菜单函数中调用相关功能函数,使能对所查找的唯一用户进行相关功能的实现。

6.6积分排序

问题:未对冒泡排序算法进行优化,使之在不需要排序的时候仍进行很多没必要的循环对比大小,减少了程序的效率。
解决方法:对冒泡排序进行优化,判断是否需要排序。

6.7机器管理

问题1:在上机电脑达到最大值之后不能做出相关警告。
问题2:上机信息一旦在下机之后立即清除,无法存储在某个文件中进行短时间保存.
问题3:在下机时才进行扣款,可能会出现大量余额不足下机成功的情况。
解决方法1:记录上机数量,当数量达到最大值即发出警告。
解决方法2:建立文件,当将下机信息存储在其中,当下机数量达到某一数值时进行第一个下机用户的信息清除,实现信息的短时间储存。
解决方法3:当用户上机时,若余额少于一定数值时,对其进行提醒,并询问是否需要充值余额。再调用相关函数对余额进行充值。

6.心得体会

通过两个星期的课程设计,回顾这次课程设计,至今我仍感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,在整整一个星期的日子里,可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论和知识是远远不够的,只有把所学的理论知识与实际相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考能力。在设计的过程中遇到的问题,这毕竟独立做的,难免会遇到各种各样的问题,同时在设计的过程中发现自己的不足之处,对以前所学的知识理解得不够深刻,掌握得不够牢固,比如说结构体……通过这次课程设计之后,一定把以前所学过的知识从新温故。这次课设终于顺利完成了,在设计中遇到了很多编程问题也认识到自己的不足。
在进行课程设计时,我发现了自己在自学能力上的缺陷,不论是算法方面还是基础知识方面我都仍有很大的漏洞。并且懂得了在学习语言的时候一定要记住动手,不要只说不做,这样会行成眼高手低,不管什么样的程序都要亲手做过才能说会了。另外我学习到在设计的过程中一定要抓住细节,很多细节方面的东西都会对整个程序是致命的。只有心思缜密同时能够联系到实际并且拥有创新能力才能做出一个合格的课程报告。不能对一知半解满足要摸清楚原理和实现办法,更要对所需要用到的知识进行深入的学习和了解。不理解的地方要学会主动查找资料、询问老师。同时要多参加类似的活动来锻炼自己的心思和自学能力,才不至于在下一次遇到这种情况时手忙脚乱。另外要做好课前预习和课后复习,本次课设没有用到链表方面的知识不仅是因为对链表的知识不够熟悉,更是因为在链表方面的运用次数太少,不了解其存储数据结构的读入和读出方法,更不了解其优点和缺点。下一阶段要增强自己对算法的学习和对数据结构更深的进一步了解,同时要增加对新知识的练习和运用。

网吧管理系统------C语言课设相关推荐

  1. 学生信息管理系统c语言课设,学生信息管理系统C语言课设.doc

    学生信息管理系统C语言课设 目录 一.需求分析2 二.概要设计2 三.详细设计4 四.调试分析9 五.用户手册9 六.测试数据9 七.附录10 一.需求分析学生学籍管理系统用数据文件存放学生的学籍,可 ...

  2. C语言课设物资管理系统,C语言课设之物资管理系统.doc

    C语言课设之物资管理系统 C语言课程设计 目 录 1.需求分析: 2.系统总框图: 3.每个模块的设计分析: 4.列出所有定义的函数及说明: 5.举例说明1.2个比较有特点的算法: 6.数据分析.完备 ...

  3. 课设 c语言编译学籍管理系统,C语言课设之学生学籍管理系统

    <C语言课设之学生学籍管理系统>由会员分享,可在线阅读,更多相关<C语言课设之学生学籍管理系统(10页珍藏版)>请在人人文库网上搜索. 1.题目:学生学籍管理系统 目录:一.个 ...

  4. c语言建筑工地管理系统,C语言课设之建筑工地信息管理系统.doc

    C语言课设之建筑工地信息管理系统 C 语 言 课 程 实 习 报 告 建筑工地信息管理系统 题目要求 <建筑工地信息管理系统>要求要建立与建筑相关的四个文件信息:1)项目2)工地 3)配件 ...

  5. c语言设计之歌曲信息管理系统,C语言课设之歌曲信息管理系统

    <C语言课设之歌曲信息管理系统>由会员分享,可在线阅读,更多相关<C语言课设之歌曲信息管理系统(10页珍藏版)>请在人人文库网上搜索. 1.C语言课程设计目 录1.题目要求2. ...

  6. 职工管理系统c语言课设需求分析,人力资源管理系统需求分析报告及系统架构图...

    人力资源管理系统需求分析 小组成员:朱国辉 许珍源 1.需求获取及分析 1.1业务需求 随着现在计算机技术的不断完善,以及现代经济的不断发展,传统的管理技术不再满足企业的需要,越来越多的企业注重计算机 ...

  7. 高校教师工资管理系统/C语言课设

    此项目为BJFU2020级课程设计 供学弟学妹们参考 项目总体介绍:  一.总体介绍 1. 项目名称:高校教师工资管理系统 2. 项目简介: 完成高等院校教师工资管理软件开发.教师的基本信息包括:工号 ...

  8. c语言学生学籍管理修改,C语言课设之学生学籍管理系统.doc

    C语言课设之学生学籍管理系统.doc 题目学生学籍管理系统 目录一.个人简介.二.报告摘要.三.报告目录.四.报告正文. 1.系统需求分析 2.系统总体设计 3.系统详细设计六.总结. 二.报告摘要 ...

  9. C语言课设-----工资管理系统(附全部源码)

    C语言课设-----工资管理系统(附全部源码) 本系统分三个部分: 1.出售金鱼 2.数字菱形 3.工资管理系统 (ps:另外添加了登录界面 id:qwq password:123 可自己在代码里再更 ...

最新文章

  1. Settings(系统设置app)
  2. python输出print到txt-pycharm实现print输出保存到txt文件
  3. MATLAB的xlsread无法读入数据问题
  4. 42、Java服务内存OOM原因分析
  5. Java 获取linux根目录下的文件夹_Windows支持直接访问Linux子系统文件:你的下一台Linux何必是Linux...
  6. Awesome Bioinformatics:假期了,收藏学习吧!
  7. nginx 如何解析php文件php-fpm的解释
  8. xml xsd java
  9. js带开关的时钟_避雷器带计数器HY5WZ-17/45-JS
  10. 手机游戏中的社交互动与任务剧情
  11. Monthly数据类型
  12. springboot项目发布到独立的tomcat中运行
  13. mysql 字段 英文 变 中文_Oracle将英文字符集数据转换成中文
  14. C语言里的符号重载《C专家编程》
  15. 三星安卓手机刷linux,三星galaxy nexus刷ubutun系统的详细步骤
  16. 文档计算机无法分页,word文档总是重新分页 word文档老是分页显示怎么解决
  17. 英文论文评审意见_小弟第一篇英文论文审稿意见求助 - 论文投稿 - 小木虫 - 学术 科研 互动社区...
  18. 北京程序员小哥哥的故事
  19. 集线器、交换机、路由器、网桥、网关之间的区别
  20. 一人干翻专业机构,27岁华裔小伙一战成名!搞出美国新冠最准预测模型,彭博:Superstar

热门文章

  1. 【wx 小功能】frame_tools.py
  2. 大数据技术概述复习(一)
  3. 树莓派 使用 systemd 设置开机启动项
  4. Keil5 生成bin文件失败解决方法
  5. 阿里云重新初始化磁盘后ssh无法远程连接
  6. 下载hotspot源码
  7. 实验十五:数据恢复原理实验
  8. Elastic中国开发者大会的精彩日程现已上线
  9. 网页中在线玩拳皇KOF
  10. 夏至未至计算机版音乐,夏至未至有哪些插曲背景音乐 夏至未至所有bgm歌曲汇总...