immature123

 

对机房管理系统的优化办法

博客介绍:

本文是对非计算机类同学的c语言大作业进行优化,本人的编程能力有限,仅在基础之上作出浅薄的修改

 

源代码需求:

 

本程序需要对学生信息进行登记,所以需要作保密处理。题目要求功能概述:机房共有 100 台计算机,分为 20 排,每排 5 台。管理系统应包含每台计算机一周内的使用全部信息,包括计算机序号、配置、位置、状态、使用情况的历史记录(包括使用者姓名、学号、使用时间段)等。本系统可以模拟学生上机和离开的登记过程,查询机房计算机的使用情况。

 

源代码完成情况。

源代码能基本完成基本需求,虽然不能完美的完成需求任务,但对于非计算机类学生能编写出这样的代码已经是非常不错。

#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);
}
View Code

 

优化:

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编辑  收藏  举报

导航