admin管理员组

文章数量:1530059

学生信息管理系统(C实现–文件+链表)

需求分析

其中的”信息管理模块“的登录验证改为用户登录验证

总体思路

  1. 使用动态链表组织内存数据,并且关联到文件

  2. 采用的是全局变量,分别代表管理员和学生,还有密码

  3. 在开始的时候先从文件读取信息到全局变量头结点

    1. 在结束的时候将头结点信息更新到文件
    2. 在修改信息后,直接更新文件,而不是退出后更新(防止意外退出而没有更新到文件)
  4. 文件部分,一个是学生信息的文件,一个是管理员信息的文件。读取的文件的方式使用的操作文本文件的==fscanf()和fprintf()函数==。都是按指定的格式进行读写3.

  5. 登入模块用户登陆(学生登陆,管理员登陆)

  6. 界面函数:参考了这位博主(调整光标和隐藏光标),还有一些布局。<https://blog.csdn/qq_41226029/article/details/79438131>


代码:

#include<stdio.h>
#include<string.h>   //字符串比较函数strcmp(,)如果相同返回0,
#include<windows.h>  //system("cls"):清屏       sleep(毫秒):将执行挂起一段时间
#include<conio.h>    //getch()
#include<stdlib.h>

typedef struct Stu{
    char xueh[12];  //学号
    char name[8];  //名字
    int age; //7
    char sex;  //7
    char born[12];  //出生年月
    char address[8];   //地址
    char phone[12];  //电话
    char email[14];   //邮箱   80位
    struct Stu *next;   //采用的是单链表结构存储
}link_stu;
typedef link_stu* link_S;

//管理员数据结构
typedef struct Guan{
    char passward[10];
    char name[10];
    struct Guan *next;
}link_gg;
typedef link_gg* link_G;

typedef struct stupw {
    char pw[10];
    struct stupw *next;
}link_spw;
typedef link_spw* link_P;

link_P head_pw;
link_G head_tea;   //管理员
link_S head;   //学生全局变量
int Flag = 1;   //用于标记学生登录还是管理员登录--影响到“信息管理”的使用

/**文件函数*/
void init_tea();  //初始化管理员
void flush_tea();   //更新管理员信息到文件
void init_stu();  //初始化学生信息
void flush_stu();   //更新到学生信息到文件
void init_stupw();  //passward

/**界面辅助函数*/
void toxy(int x, int y);    //将光标移动到X,Y坐标处
void HideCursor();    //隐藏光标

/**共用界面*/
void show_head();  //学生信息界面
void show_2_menu();  //中间的小窗口
void show_3();   //外面的大窗口

/**学生信息函数*/
void show_Stu();  //学生总览
void find_Stu();  //学生查询
void print_Stu(char arr[8]);   //重复姓名
void print_Stu02(link_S stu);
void xueh_find();  //学号查询界面
link_S xueh_find_2();   // 学号查下
void names_find();  //姓名查询

/**信息管理(增删改查)函数*/
void inform_guanli();
void fix_address(link_S p);
void fix_phone(link_S p);
void fix_email(link_S p);
void delete_Stu(link_S pi);
void add_Stu();
int add_check(char xuehao[12]);   //用于检测重复学号

/**学生排序函数*/
void sort_Stu();
void sort_age();
void sort_xueh();
void select_Stu();

/**主界面及退出函数*/
void mainmenu();
int exitSys();  //退出
void chose_menu();
void check_inform();
void check_tea();
void print_pw();

void toxy(int x, int y)      //将光标移动到X,Y坐标处
{
    COORD pos = { x , y };
    HANDLE Out = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(Out, pos);
}

void HideCursor()     //隐藏光标
{
    CONSOLE_CURSOR_INFO cursor_info = {1, 0};
    SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

void init_stupw()
{
    link_S p = head->next;
    char temp[10];
    head_pw = (link_P)malloc(sizeof(link_spw));
    head_pw->next = NULL;
    link_P q,tail;
    tail = head_pw;
    int i,j;
    //将学号后6位变成密码,链表存储
    while(p)
    {
        for(i=4,j=0;i<=9;i++,j++)
            temp[j] = p->xueh[i];
        q = (link_P)malloc(sizeof(link_spw));
        strcpy(q->pw,temp);

        tail->next = q;
        tail = q;

        p = p->next;
    }
    tail->next = NULL;
}

void print_pw()
{
    link_P p = head_pw->next;
    while(p)
    {
        printf("%s\n",p->pw);
        p = p->next;
    }
}

void flush_tea()   /**把链表内容更新到文件*/
{
    link_G p = head_tea->next;
    FILE *fp = fopen("pw.txt","w");

    if(fp == NULL)
    {
        printf("打开文件失败!");
        exit(0);
    }
    while(p)
    {
        fprintf(fp,"%s %s\n",p->name,p->passward);
        p = p->next;
    }
    fclose(fp);
}

void init_tea()
{
    FILE *fp = fopen("pw.txt","r");

    /**先定义这些临时变量,用来存放使用fscanf()函数时的输入
    */
    char name[10];
    char passward[10];

    head_tea = (link_G)malloc(sizeof(link_gg));
    head_tea->next = NULL;
    link_G tail = head_tea;

    if(fp == NULL)
    {
        printf("打开文件失败!");
        exit(0);
    }

    while((fscanf (fp,"%s %s\n",name,passward)) != EOF )
    {
        /**fscanf()函数是有返回值的,如果读取到文件尾会返回EOF(-1)
        */
        link_G p = (link_G)malloc(sizeof(link_gg));

        strcpy((p->name),name);
        strcpy((p->passward),passward);

        tail->next = p;
        tail = p;
    }
    tail->next = NULL;
    fclose(fp);
}

void init_stu()  /**初始化学生信息*/
{
    FILE *fp = fopen("studata_4.txt","r");
    if(fp == NULL)
    {
        printf("打开文件失败!");
        exit(0);
    }
    /**先定义这些临时变量,用来存放使用fscanf()函数时的输入
    */
    char xueh2[12];  //学号
    char name2[8];
    int age2; //8
    char sex2;  //8
    char born2[12];  //出生年月
    char address2[8];   //地址
    char phone2[12];  //电话
    char email2[14];   //邮箱   =90位

    head = (link_S)malloc(sizeof(link_stu));
    head->next = NULL;
    link_S tail = head;

    while((fscanf (fp,"%s %s %d %s %c %s %s %s\n",xueh2,name2,&age2,address2,&sex2,born2,phone2,email2)) != EOF )
    {
        /**fscanf()函数是有返回值的,如果读取到文件尾会返回EOF(-1)
        */
        link_S p = (link_S)malloc(sizeof(link_stu));

        strcpy((p->xueh),xueh2);   //p->xueh指的是值,而右边是地址,所以加一个&
        strcpy((p->name),name2);
        p->age = age2;
        p->sex = sex2;
        strcpy((p->born),born2);
        strcpy((p->address),address2);
        strcpy((p->phone),phone2);
        strcpy((p->email),email2);

        tail->next = p;
        tail = p;
    }
    tail->next = NULL;
    fclose(fp);
}

void flush_stu()   /**更新学生信息到文件*/
{
    link_S p = head->next;
    FILE *fp = fopen("studata_4.txt","w");

    if(fp == NULL)
    {
        printf("打开文件失败!");
        exit(0);
    }
    while(p)
    {
        fprintf(fp,"%s %s %d %s %c %s %s %s\n",p->xueh,p->name,p->age,p->address,p->sex,p->born,p->phone,p->email);
        p = p->next;
    }
    fclose(fp);
}

void delete_Stu(link_S pi)   /**删除学生*/
{
    /**确定有这个学生才到这里*/
    link_S p = head->next;
    link_S pre = head;

    while(p != pi)
    {
        pre = p;
        p = p->next;
    }
    pre->next = p->next;
    free(p);

    flush_stu();
    show_2_menu();
    toxy(38,17);
    printf("--删除成功--");
    toxy(38,19);
    printf("---按0返回--");
    Sleep(2000);
}

void show_2_menu()   /**小窗口*/
{
    int i;
    toxy(30,12);
    printf("|                          |");
    toxy(30,13);
    printf("|                          |");
    toxy(30,14);
    printf("|  |********************|  |");
    for(i=15;i<=21;i++)
    {
        toxy(30,i);
        printf("|  |                    |  |");
    }
    toxy(30,22);
    printf("|  |********************|  |");
    toxy(30,23);
    printf("|                          |");
    toxy(30,24);
    printf("|                          |");

}

void show_head()   /**学生信息界面*/
{
    int i;
    toxy(36,9);
    printf("学生信息");

    toxy(1,10);
    for(i=0;i<80;i++) printf("-");
    toxy(1,11);
    printf("学号        姓名    年龄   性别   出生年月    地址    电话        邮箱          ");
    toxy(1,12);
    for(i=0;i<80;i++) printf("-");
    toxy(1,13);
}

void check_inform()
{
    if(Flag)
        inform_guanli();
    else
    {
        show_2_menu();
        toxy(38,18);
        printf("--禁止访问--");
        Sleep(1000);
    }
}

void inform_guanli()  /**信息管理-功能*/
{
    show_2_menu();
    toxy(38,16);
    printf("1  信息修改");
    toxy(38,18);
    printf("2  删除学生");
    toxy(38,20);
    printf("3  添加学生");
    toxy(38,24);
    printf("----按0返回");

    char ch ;
    while(ch = getch())
    {
        if(ch == '1')   //修改信息
        {
            link_S p = xueh_find_2();
            if(p != NULL)  //找到了学生
            {
                show_2_menu();
                toxy(38,16);
                printf("该学生为:");
                toxy(38,18);
                printf("姓名:%s",p->name);
                Sleep(3000);

                show_2_menu();
                toxy(38,16);
                printf("1  修改地址");
                toxy(38,18);
                printf("2  修改电话");
                toxy(38,20);
                printf("3  修改邮箱");
                toxy(38,24);
                printf("----按0返回");

                char ch_1 = getch();
                switch(ch_1)
                {
                    case '1': fix_address(p); break;
                    case '2': fix_phone(p); break;
                    case '3': fix_email(p); break;
                    case '0': inform_guanli(); break;
                    default : break;
                }
            }
            else
            {
                show_2_menu();
                toxy(38,17);
                printf("--查找失败--");
                toxy(38,19);
                printf("--无法修改--");
                Sleep(2000);
                inform_guanli();
            }
        }
        if(ch == '2')
        {
            link_S p_1 = xueh_find_2();
            if(p_1)
            {
                /**查询成功先返回学生名字,便于确认
                */
                show_2_menu();
                toxy(35,16);
                printf("  是否删除该学生?");
                toxy(35,18);
                printf("  姓名:%s",p_1->name);
                toxy(35,20);
                printf("  1 是     0 否  ");

                char ch = getch();
                switch(ch)
                {
                    case '1': delete_Stu(p_1); break;
                    case '0': inform_guanli(); break;
                    default : break;
                }
            }
            else
            {
                show_2_menu();
                toxy(38,17);
                printf("--查找失败--");
                toxy(38,19);
                printf("--无法删除--");
                Sleep(3000);
                inform_guanli();
            }
        }
        if(ch == '3')
            add_Stu();
        if(ch == '0')
            mainmenu();
    }
}

void print_Stu02(link_S stu)   /**打印某个学生*/
{
    system("cls");  //先清屏
    link_S headp = stu;
    show_head();
    printf("%-12s%-8s%-7d%-7c%-12s%-8s%-12s%-14s",headp->xueh,headp->name,headp->age,headp->sex,headp->born,headp->address,headp->phone,headp->email);
}

void print_Stu(char arr[8])   /**对有重复名的打印*/
{
    system("cls");  //先清屏
    show_head();
    link_S p = head->next;
    int x = 13;
    while(p)
   {
        if(strcmp(p->name,arr)==0)
        {
            toxy(1,x);
            printf("%-12s%-8s%-7d%-7c%-12s%-8s%-12s%-14s\n",p->xueh,p->name,p->age,p->sex,p->born,p->address,p->phone,p->email);
            x++;
        }
        p = p->next;
    }
}

link_S xueh_find_2()  /**查找*/
{
    //要先从文件读取
    link_S p = head->next;
    show_2_menu();
    toxy(38,16);
    printf(" 输入学号");
    toxy(37,20);   //这两句在调用的的时候才出现
    printf("输入:      ");   //这里的输入不是1和2,而是输入1,2后出现的学号或姓名
    toxy(41,20);

    char xuehao[12];
    toxy(42,20);

    scanf("%s",xuehao);
    while(p && strcmp(p->xueh,xuehao)!=0)
        p = p->next;
    return p;
}

void show_3()   /**大窗口*/
{
    int i;
    toxy(30,9);
    printf("|--------------------------|");
    toxy(30,10);
    printf("|     学生信息管理系统     |");
    toxy(30,11);
    printf("|--------------------------|");
    for(i=12;i<=25;i++)
    {
        toxy(30,i);
        printf("|                          |");
    }
    toxy(30,26);
    printf("|--------------------------|");
}

void xueh_find()  /**学号查询*/
{
    link_S p = xueh_find_2();  /**查询函数*/
    if(p)
    {
        show_2_menu();
        toxy(38,18);
        printf("--查询成功--");
        Sleep(1000);

        print_Stu02(p);   //查询成功-打印学生信息
        Sleep(2000);
        system("cls");
        toxy(45,9);
        show_3();
        find_Stu();
    }
    else
    {
        show_2_menu();
        toxy(38,18);
        printf("--查询失败--");
        Sleep(1500);
        show_3();
        find_Stu();
    }

}

void names_find()   /***姓名查询*/
{
    link_S p = head->next;
    show_2_menu();  //覆盖
    char name[8];
    char arr[8];

    toxy(39,16);
    printf(" 输入姓名");
    toxy(36,20);   //这两句在调用的的时候才出现
    printf("输入:");   //这里的输入不是1和2,而是输入1,2后出现的学号或姓名
    scanf("%s",name);
    while(p && strcmp(p->name,name)!=0)
        p = p->next;
    if(p)
    {
        strcpy(arr,p->name);
        show_2_menu();
        toxy(38,18);
        printf("--查询成功--");
        Sleep(1000);
        print_Stu(arr);
        Sleep(2000);
        system("cls");
        show_3();
        find_Stu();
    }
    else
    {
        show_2_menu();
        toxy(38,18);
        printf("--查询失败--");
        Sleep(1500);
        show_3();
        find_Stu();
    }

}

void find_Stu()  /**寻找学生*/
{
    char ch;//用于getch()做选择

    show_2_menu();
    toxy(38,16);
    printf("1  学号查询");
    toxy(38,18);
    printf("2  姓名查询");
    toxy(38,20);
    printf("----按0返回");

    while(ch=getch())
    {
        if(ch == '1')
            xueh_find();
        if(ch == '2')
            names_find();
        if(ch == '0')
            mainmenu();
    }
}

void fix_address(link_S p)   /**修改地址--8位*/
{
    char add_2[8];   //临时变量
    int flag = 1;

    while(flag)
    {
         toxy(30,28);
         printf("输入修改后的地址:");
         scanf("%s",add_2);
          if(strlen(add_2)<sizeof(add_2))   //输入的字符串长度小于数组长度
          {
              strcpy(p->address,add_2);   //将数组拷贝到学生信息
              toxy(30,28);
              printf("     -----修改成功-----         ");
              Sleep(2000);
              toxy(30,28);
              printf("                                ");
              flush_stu();
              flag = 0;
          }
          else
          {
              toxy(30,28);
              printf("                                                       ");
              toxy(30,28);
              printf("长度越界,重新输入:");
              Sleep(1500);
              flag = 1;
          }
    }
}

void fix_phone(link_S p)   /**修改手机---12位*/
{
    char phone_2[12];
    int flag  = 1;

    while(flag)
    {
        toxy(30,28);
        printf("输入修改后的电话:");
        scanf("%s",phone_2);

        if(strlen(phone_2)<sizeof(phone_2))
        {
            strcpy(p->phone,phone_2);
            toxy(30,28);
            printf("     -----修改成功-----         ");
            Sleep(2000);
            toxy(30,28);
            printf("                                ");
            flush_stu();
            flag = 0;
        }
        else
        {
            toxy(30,28);
            printf("                                                            ");
            toxy(30,28);
            printf("长度越界,重新输入:");
            Sleep(1500);
            flag = 1;
        }
    }
}

void fix_email(link_S p)    /**修改邮箱--14位*/
{
    char email_2[14];
    int flag = 1;
    while(flag)
    {
        toxy(30,28);
        printf("输入修改后的邮箱:");
        scanf("%s",email_2);

        if(strlen(email_2)<sizeof(email_2))  //输入长度合理检测
        {
            strcpy(p->email,email_2);
            toxy(30,28);
            printf("     -----修改成功-----         ");
            Sleep(2000);
            toxy(30,28);
            printf("                                ");
            flush_stu();
            flag = 0;
        }
        else
         {
             toxy(30,28);
             printf("                                                            ");
             toxy(30,28);
             printf("长度越界,重新输入:");
             Sleep(1500);
             flag = 1;
         }
    }
}

int add_check(char xuehao[12])  /**用于检测重复学号*/
{
    link_S p = head->next;
    int flag = 1;
    while(p)   //重复检测
    {
        if(strcmp(p->xueh,xuehao) == 0)
            flag = 0;
        p = p->next;
    }
    return flag;
}

void add_Stu()    /**添加学生-首插*/
{
        system("cls");
        int flag;
        link_S p = (link_S)malloc(sizeof(link_stu));

        toxy(30,9);
        printf("|--------------------------|");
        toxy(30,10);
        printf("|     学生信息管理系统     |");
        toxy(30,11);
        printf("|--------------------------|");
        toxy(30,12);
        printf("|      学号:               |");
        toxy(43,12);
        scanf("%s",p->xueh);
        //学号合理性检查
        flag = add_check(p->xueh);
        if(flag == 0){
                toxy(30,15);
                printf("|--------------------------|");
                toxy(30,16);
                printf("|                          |");
                toxy(30,17);
                printf("|    重复学号--录入失败    |");
                toxy(30,18);
                printf("|                          |");
                toxy(30,19);
                printf("|    ----按0继续           |");
                toxy(30,20);
                printf("|                          |");
                toxy(30,21);
                printf("|--------------------------|");
                char ch ;
                while(ch = getch())
                {
                    if(ch == '0')
                        add_Stu();
                }
        }

        getchar();
        toxy(30,13);
        printf("|                          |");
        toxy(30,14);
        printf("|      姓名:               |");
        toxy(43,14);
        scanf("%s",p->name);

        getchar();
        toxy(30,15);
        printf("|                          |");
        toxy(30,16);
        printf("|      年龄:               |");
        toxy(43,16);
        scanf("%d",&p->age);

        getchar();
        toxy(30,17);
        printf("|                          |");
        toxy(30,18);
        printf("|      性别:               |");
        toxy(43,18);
        scanf("%c",&p->sex);

        getchar();
        toxy(30,19);
        printf("|                          |");
        toxy(30,20);
        printf("|      生日:               |");
        toxy(43,20);
        scanf("%s",p->born);

        getchar();
        toxy(30,21);
        printf("|                          |");
        toxy(30,22);
        printf("|      地址:               |");
        toxy(43,22);
        scanf("%s",p->address);

        getchar();
        toxy(30,23);
        printf("|                          |");
        toxy(30,24);
        printf("|      电话:               |");
        toxy(43,24);
        scanf("%s",p->phone);

        getchar();
        toxy(30,25);
        printf("|                          |");
        toxy(30,26);
        printf("|      邮箱:               |");

        toxy(43,26);
        scanf("%s",p->email);

        toxy(30,27);
        printf("|--------------------------|");
        toxy(30,28);
        printf("|     录入成功 按0退出     |");
        toxy(30,29);
        printf("|--------------------------|");

        p->next = head->next;
        head->next = p;

        /**直接更新到文件,不用等程序退出*/
        flush_stu();
        char ch = getch();
        if(ch == '0')
        {
            system("cls");
            mainmenu();
        }

}

void show_Stu()   /**打印学生信息*/
{
    int z = 13;
    system("cls");
    link_S p = head->next;

    toxy(42,9);
    printf(" --按0返回");
    show_head();
    while(p)
    {
        printf("%-12s%-8s%-7d%-7c%-12s%-8s%-12s%-14s",p->xueh,p->name,p->age,p->sex,p->born,p->address,p->phone,p->email);
        z++;
        toxy(1,z);
        p = p->next;
    }
    char ch = getch();
    if(ch == 0) mainmenu();
}

void select_Stu()   /**学生分类*/
{
    link_S p = head->next;
    int countM = 0;
    int countW = 0;

    while(p)
    {
        if(p->sex=='m')
            countM++;
        else
            countW++;
        p = p->next;
    }
    //界面
    show_2_menu();
    toxy(35,16);
    printf("男生      人数:%-2d",countM);
    toxy(35,20);
    printf("女生      人数:%-2d",countW);

    toxy(33,24);
    printf("-------按0返回--------");
    char ch;
    while(ch = getch()){
          if(ch == '0') mainmenu();
    }
}

void sort_age()  /**插入排序-年龄排序*/
{
    link_S newhead, pre, p1, p2;
    p1=head->next;
    newhead=p1->next; //新链表
    p1->next=NULL;  //将原来的链断开

    while(newhead) 
    {
       p2=newhead;  
       newhead=newhead->next; 
       pre=head; 
       p1=head->next; 
       while(p1!=NULL && p1->age<p2->age)
       {
           pre=p1;
           p1=p1->next;
       }
       p2->next=p1;
       pre->next=p2;
    }
    show_Stu();
}

void sort_xueh()  /***插入排序,问题,学号是字符串型的,怎么排序----已解决--使用sscanf()函数**/
{
    link_S newhead, pre, p1, p2;
    p1 = head->next;
    newhead = p1->next;
    p1->next = NULL;

    while(newhead)
    {
       p2 = newhead;
       newhead = newhead->next;
       pre = head;
       p1 = head->next;
       while(p1 != NULL)
       {
           int n;
           int m;
           sscanf(p1->xueh,"%d",&n);   //字符串转数字函数
           sscanf(p2->xueh,"%d",&m);
           if(n<m)
           {
              pre = p1;
              p1 = p1->next;
           }
           else
            break;   //如果没跳出循环,会一直下去
       }
       p2->next = p1;
       pre->next = p2;
    }
    show_Stu();    
}

//排序界面
void sort_Stu()
{
    char ch;   //---getch()

    show_2_menu();
    toxy(37,17);
    printf("1  按年龄排序");
    toxy(37,19);
    printf("2  按学号排序");
    toxy(38,24);
    printf("----按0返回");
    while(ch = getch())
    {
        if(ch == '1')  sort_age();
        if(ch == '2')  sort_xueh();
        if(ch == '0')  mainmenu();
    }
}

int exitSys()   /**退出选项*/
{
    toxy(32,25);
    printf(" 1 是              2 否 ");
    char ch;
    while(ch = getch())   //使用循环防止输入其他的情况
    {
         if(ch=='1')
         {
             flush_stu();   //退出更新信息到文件
             flush_tea();
             return 0;
         }
         if(ch=='2') return 1;
    }
}

void check_stu()   /**学生登录模块*/
{
    link_S p = head->next;
    link_P pp = head_pw->next;
    char xueh[12];
    char pw[10];
    int i = 0;

    show_2_menu();
    toxy(36,16);
    printf("学号:");  //此时光标就在后面
    scanf("%s",xueh);

    getchar();
    toxy(36,18);
    printf("密码:");

    toxy(37,24);
    printf("密码以'#'结束");

    while( i<10)
    {
        char ch = getch();    /**用gerch(),将输入密码用一个数组先存起来,然后再匹配*/
        if(ch == '#') break;
        else
        {
            pw[i] = ch;
            i++;
        }
    }

    while(p)    /**判断密码是否正确*/
    {
        if(strcmp(p->xueh,xueh) == 0 )  //学号
        {
            //&& strcmp(stupw,pw) == 0
            while(pp)   //寻找密码
            {
                if(strcmp(pp->pw,pw) == 0)
                {
                    show_2_menu();
                    toxy(38,18);
                    printf("--登录成功--");
                    Sleep(300);
                    mainmenu();
                    break;
                }
               pp = pp->next;
            }
            if(pp == NULL)   //账号正确,密码错误
            {
                show_2_menu();
                toxy(38,18);
                printf("--密码错误--");
                Sleep(1000);
                chose_menu();
            }
        }
        p = p->next;
    }
    if(p == NULL)   //账号错误
        {
            show_2_menu();
            toxy(38,18);
            printf("--学号错误--");
            Sleep(1000);
            chose_menu();
        }
}

void check_tea()  /**老师登录登录*/
{
    link_G p = head_tea->next;
    char name[10];
    char pw[10];
    int i = 0;
    int flag = 1;

    show_2_menu();

    toxy(38,16);
    printf("账号:");  //此时光标就在后面
    scanf("%s",name);

    getchar();
    toxy(38,18);
    printf("密码:");

    toxy(37,24);
    printf("密码以'#'结束");
    while(flag && i<10)
    {
        char ch = getch();    /**用gerch(),将输入密码用一个数组先存起来,然后再匹配*/
        if(ch == '#') flag = 0;
        else
        {
            pw[i] = ch;
            i++;
        }
    }

    while(p)    /**判断密码是否正确*/
    {
        if(strcmp(p->passward,pw) == 0 && strcmp(p->name,name) == 0)
        {
            show_2_menu();
            toxy(38,18);
            printf("--登录成功--");
            Sleep(300);
            mainmenu();
            break;
        }
        p = p->next;
    }
    if(p==NULL)
    {
        show_2_menu();
        toxy(38,18);
        printf("--登录失败--");
        Sleep(1000);
        chose_menu();
    }
}

void mainmenu()    /***主界面*/
{
    int flag = 1;
    while(flag)
    {
        system("cls");
        HideCursor();   //隐藏光标

        show_3();
        toxy(30,13);
        printf("|        1 学生信息        |");
        toxy(30,15);
        printf("|        2 学生查询        |");
        toxy(30,17);
        printf("|        3 信息管理        |");
        toxy(30,19);
        printf("|        4 信息排序        |");
        toxy(30,21);
        printf("|        5 学生分类        |");
        toxy(30,23);
        printf("|        6 退出界面        |");

        char ch = getch();
        switch(ch)
        {
            case '1': show_Stu(); break;
            case '2': find_Stu(); break;
            case '3': check_inform(); break;
            case '4': sort_Stu(); break;
            case '5': select_Stu(); break;
            case '6':
                flag = exitSys();
                if(flag == 0)
                {
                    system("cls");  //先清屏,再退出
                    exit(0);
                } break;
            default : mainmenu(); break;
        }
    }
}

void chose_menu()    //登录模块
{
    HideCursor();   //隐藏光标
    char ch;
    show_3();
    toxy(38,16);
    printf("1  学生登录");
    toxy(38,20);
    printf("2  管理登录");

    while(ch = getch())
    {
        if(ch =='1')
        {
            Flag = 0;
            check_stu();
        }
        if(ch == '2')
        {
            Flag = 1;
            check_tea();
        }
    }
}

void main()
{
    init_stu();  /**初始化学生信息*/
    init_tea();   /**初始化管理员信息*/
    init_stupw();
    //print_pw();
    //mainmenu();
    chose_menu();
}

因为是使用格式读入链表:所以先在文件中把格式对齐:***(一个空格)***
补充一点:学号后6位是登录密码,输入不回显,以 ‘#’ 结束输入

学生信息

管理员信息

部分界面



这是这学期的一个课程设计,还有很多地方没有完善,功能也不算丰富——比如一些输入验证,存在的一些问题欢迎大家指正,共同进步!!!

2019.12.08:好久没看了,重复代码特别多,改进空间很大

本文标签: 信息管理系统语言学生