对机房管理系统的优化办法
博客介绍:
本文是对非计算机类同学的c语言大作业进行优化,本人的编程能力有限,仅在基础之上作出浅薄的修改。
源代码需求:
本程序需要对学生信息进行登记,所以需要作保密处理。题目要求功能概述:机房共有 100 台计算机,分为 20 排,每排 5 台。管理系统应包含每台计算机一周内的使用全部信息,包括计算机序号、配置、位置、状态、使用情况的历史记录(包括使用者姓名、学号、使用时间段)等。本系统可以模拟学生上机和离开的登记过程,查询机房计算机的使用情况。
源代码完成情况。
源代码能基本完成基本需求,虽然不能完美的完成需求任务,但对于非计算机类学生能编写出这样的代码已经是非常不错。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #include<windows.h> #define MaxSize 100 //机房最大承载量 typedef struct The_users { char id[11]; //账号 char pwd[20]; //密码 char name[15]; //姓名为字符串 char sex; //性别为单个字符 long phone; //电话号码为长整型 }users ; users a, b; //结构体变量以验证与记录 struct St_information { int seat; //计算机编号 char name[10]; //使用者姓名 long st_numb; //学号 char start_time[80]; //开始时间 char end_time[80]; //结束时间 } StudetList[MaxSize]; void verify(); void registers(); //注册函数 void land(); //登陆函数 void number(); //编号 void Menu1(); //界面一 void Menu2(); //界面二 void Menu3(); //界面三 void Show(); //所有计算机当前状态 void History(); //历史记录 int elect(); //计算机选择 int show_infor(); //查看本机信息 void Search(); //查询空机位 void outland(); //退出函数 int main() { number(); //为计算机编号 Menu1(); return 0; } void verify() { char A[] = { "Administrator" }; char B[40]; printf("请输入验证信息\n"); scanf("%s", B); if (!strcmp(A, B)) { printf("验证成功!欢迎使用\n"); Sleep(1000); Menu3(); } else { printf("验证失败,即将退出程序!\n"); Sleep(1000); exit(0); } } void registers() //按结构体的大小,一次写入或者读入1个结构体大小 { FILE *fp; char temp[20]; int count = 0; system("cls"); printf("|**********************************************| \n"); printf("| 欢迎注册 | \n"); printf("|**********************************************| \n"); printf("请输入账号(11字节以内):\n"); scanf("%s", &a.id); Sleep(1000); fp = fopen("users.txt", "w+"); fread(&b, sizeof(struct The_users), 1, fp); //读入一个结构体字符块 到b while (1) { if (strcmp(a.id, b.id)) /*如果两串不相等*/ { if (!feof(fp)) /*如果未到文件尾*/ fread(&b, sizeof(struct The_users), 1, fp); else break; } else { printf("此用户名已存在!请重新注册!\n"); Sleep(1000); fclose(fp); return; } } printf("请输入姓名:\n"); scanf("%s", &a.name); printf("请输入性别(f(女)/m(男)):\n"); scanf(" %c", &a.sex); do { if (a.sex != 'f' && a.sex != 'm') { printf("性别输入错误!请重新输入!\n"); scanf("%c", &a.sex); } } while (a.sex != 'f' && a.sex != 'm'); getchar(); printf("请输入电话号码:\n"); scanf("%ld", &a.phone); printf("请输入密码(20字节以内)\n"); scanf(" %s", &a.pwd); printf("请确认密码\n"); scanf(" %s", &temp); do { if (!strcmp(a.pwd, temp)) { fp = fopen("users.txt", "a"); fwrite(&a, sizeof(struct The_users), 1, fp); printf("账号注册成功,请登录!\n"); Sleep(500); fclose(fp); land(); } else { printf("两次密码不匹配!请重新输入!\n"); scanf("%s", &a.pwd); printf("请确认密码\n"); scanf("%s", &temp); } } while (1); } void land() { users a, b;//定义结构体The_users别名 FILE *fp; printf("|**********************************************| \n"); printf("| 欢迎登录 | \n"); printf("|**********************************************| \n"); Sleep(500); printf("请输入账号\n"); scanf("%s", &a.id); fp = fopen("users.txt", "r"); fread(&b, sizeof(struct The_users), 1, fp); //读入一个结构体字符块 写入b while (1) { if (strcmp(a.id, b.id) == 0) //如果有此用户名 break; else { if (!feof(fp)) //如果文件没有读完 fread(&b, sizeof(struct The_users), 1, fp); else { printf("此用户名不存在,请重新选择功能:\n"); Sleep(500); fclose(fp); return; } } } printf("请输入密码\n"); scanf("%s", &a.pwd); do { if (strcmp(a.pwd, b.pwd) == 0) /*如果密码匹配*/ { fclose(fp); printf("登录成功,欢迎使用!"); Sleep(500); Menu2(); } else { printf("密码不正确!请重新输入密码\n"); scanf("%s", &a.pwd); } } while (strcmp(a.pwd, b.pwd) == 0); } void number() //编号 { int j; for (j = 0; j < MaxSize; j++) { StudetList[j].start_time[0] = '\0'; //数组为空为空闲,非空为忙碌 StudetList[j].seat = j; //为计算机编号 } } void Menu1() //界面一 { while (1) { int i; system("cls"); printf(" \t|***************************************************************************************| \n"); printf(" \t| 学生计算机机房管理系统 | \n"); printf(" \t|***************************************************************************************| \n"); printf(" \t| * 【1】学生登录 * * 【2】注册 * | \n"); printf(" \t| *********************************************************************************** | \n"); printf(" \t| ****************************************** 【3】管理员登录 * | \n"); printf(" \t| *********************************************************************************** | \n"); printf(" \t| ----------------------------------------------------------------------------------- | \n"); printf(" \t请输入菜单编号:"); scanf_s("\t%d", &i); switch (i) { case 1: land(); break; case 2: registers(); break; case 3: verify(); break; default: printf("\t编号输入错误,请重新输入:"); } } } void Menu2() //界面二 { while (1) { int i; system("cls"); printf(" \t| *********************************************************************************** | \n"); printf(" \t| * 学生系统功能菜单 * | \n"); printf(" \t| ----------------------------------------------------------------------------------- | \n"); printf(" \t| * 【1】选择机号 * * 【2】查询本机信息 * | \n"); printf(" \t| *********************************************************************************** | \n"); printf(" \t| * 【3】查询空机位 * * 【0】退出程序 * | \n"); printf(" \t| *********************************************************************************** | \n"); printf(" \t| ----------------------------------------------------------------------------------- | \n"); printf(" \t请输入菜单编号:"); scanf("%d", &i); switch (i) //功能选择 { case 1: elect(); break; case 2: show_infor(); break; case 3: Search(); break; case 0: outland(); break; default: printf("\t编号输入错误,请重新输入:"); } } } void Menu3() { int i; while (1) { number(); system("cls"); printf(" | *********************************************************************************** | \n"); printf(" | * 管理系统功能菜单 * | \n"); printf(" | ----------------------------------------------------------------------------------- | \n"); printf(" | * 【1】查询所有计算机当前情况 * * 【2】查看历史记录 * | \n"); printf(" | *********************************************************************************** | \n"); printf(" | ******************************************** 【0】退出程序 * | \n"); printf(" | ----------------------------------------------------------------------------------- | \n"); printf(" 请输入菜单编号:"); scanf("%d", &i); switch (i) { case 1: Show(); break; case 2: History(); break; case 0: exit(0); default: printf("编号输入错误,请重新输入:"); } } } void Show() //所有计算机当前状态 { int i; printf("\n"); printf("计算机编号\t姓名\t学号\t上机时间\n"); for (i = 0; i < 100; i++) { printf("%d\t\t", StudetList[i].seat); printf("%s\t", StudetList[i].name); printf("%ld\t", StudetList[i].st_numb); printf("%s\n", StudetList[i].start_time); } system("pause"); } void History() //历史记录 { FILE* g; char c; char Fname[20] = { "history.txt" }; /*printf("请输入文件名(如:xxx.txt):"); //可自定义文件 scanf_s("%s", Fname);*/ if ((g = fopen(Fname, "r")) == NULL) { printf("不能打开文件,登记失败!\n"); exit(0); } while ((c = fgetc(g)) != EOF) putchar(c); fclose(g); system("pause"); } int elect() //选择计算机 { int f, x, k = 0; for (f = 0; f < 100; f++) { if (StudetList[f].start_time[0] == '\0') { k = 1; break; } } if (k == 0) printf("机房已满!"); else { Search(); printf("请输入计算机编号(0-99整数):"); scanf("%d", &x); if (x >= 100) printf("请输入0-99中的整数"); if (StudetList[x].start_time[0] != '\0') //判断机器是否使用中 { printf("\n本机正被使用中,按任意键重新选择功能"); system("pause"); return; } //运算行列并输出 printf("本机位于第%d行,第%d列。\n", StudetList[x].seat / 5 + 1, StudetList[x].seat % 5 + 1); printf("请输入上机者姓名:"); getchar(); //读取键盘缓冲区 gets(StudetList[x].name); printf("请输入上机者学号:"); scanf("%ld", &StudetList[x].st_numb); sj(StudetList[x].start_time); printf("上机成功"); system("pause"); } return 0; } void Search() //查询空机位 { int f; printf("空机号为:\n"); for (f = 0; f < 100; f++) { if (StudetList[f].start_time[0] == '\0') printf("%d\t\t", f); if ((f + 1) % 5 == 0) printf("\n"); } printf("\n"); } int show_infor() //查看本机信息 { char c; FILE* g; char Fname[20] = { "configure.txt" }; /*printf("请输入文件名(如:xxx.txt):"); //可自定义文件 scanf_s("%s", Fname);*/ if ((g = fopen(Fname, "ab")) == NULL) { printf("不能打开文件,登记结束时间失败!\n"); exit(0); } while ((c = fgetc(g)) != EOF) putchar(c); fclose(g); system("pause"); return 0; } void outland() //退出函数 { int s; printf("请输入你的机号:"); scanf("%d", &s); FILE* g; char Fname[20] = { "history.txt" }; /*printf("请输入文件名(如:xxx.txt):"); //可自定义文件 scanf_s("%s", Fname);*/ if ((g = fopen(Fname, "ab")) == NULL) { printf("不能打开文件,登记结束时间失败!\n"); exit(0); } sj(StudetList[s].end_time); fprintf(g, "计算机编号:%d\t学生姓名:%s\t学号:%ld\t使用时段:%s~%s\t联系方式:%ld\n", StudetList[s].seat, StudetList[s].name, StudetList[s].st_numb, StudetList[s].start_time, StudetList[s].end_time,b.phone); printf("文件保存成功!\n"); fclose(g); exit(0); }
优化:
1.在定义使用者结构体时,他将性别定义为char是合适的,但将账号、密码、姓名同样以char*来定义,这就会产生一些问题,相反string在和char*相比是有着不少的优势。
1.string对象声明为一个简单变量,字符数组只能是一个数组
2.string 是类,可以使用成员函数来方便地操作字符串。比起纯粹地自己管理 char 数组,使用 string 也更不容易出错。
3.string简化了字符串合并操作
//string s1;
//string s2 = “feaabc”;
//string s3 = s2;
//s1 = s2 + s3;
//s1 += s2;
//cout << s1 <<" “<< s2 <<” "<< s3 << endl;
4.string不用考虑内存释放和越界string管理char*所分配的内存,每一次string的复制,取值都有string负责维护,不用担心复制越界和取值越界等。
2.在进行交互界面,他采用了while(1)进行死循环,同时使用switch进行人机交互的操作。
在死循环的选择中他选择了while(1)。
对与死循环while(1)和for(;;)通过编译后代码对比:
对比发现,for(; ;)指令少,不占用寄存器,而且没有判断、跳转,比while( 1 )要好。
同时在他的运行界面中没有界面跳转后的清屏操作,这会使得用户的操作体现下降,为此的简单的修改方法为
在添加头文件#include <stdlib.h>后,在每次需要跳转界面前调用system("cls");来实现简单的清屏。
3.源码没有对获取系统时间进行编写,对于系统时间的获取可以采用以下方法。
1.调用<time.h>头文件,使用time 函数
返回1970-1-1, 00:00:00以来经过的秒数
time_t now; time(&now); printf("now time is %d\n", now); //此时now为从1970-1-1, 00:00:00以来经过的秒数
2.调用<time.h>头文件,使用localtime函数
将时间数值变换成本地时间,需考虑到本地时区和夏令时标志;
在这样的思路下定义tm结构指针,声明time_t类型变量now。用time函数返回值赋给now再利用local time函数转为当地时间、用strftime输出标准时间格式
struct tm t; time_t now; time(&now); localtime_s(&t, &now); string s; strftime(s, sizeof(s), "%Y-%m-%d %H:%M:%S", &t);
posted on 2021-03-07 17:12 immature123 阅读(210) 评论(0) 编辑 收藏 举报