欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

学生信息管理系统(C语言)

程序员文章站 2022-03-09 19:29:44
...

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

需求分析

学生信息管理系统(C语言)

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

总体思路

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

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

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

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

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

  6. 界面函数:参考了这位博主(调整光标和隐藏光标),还有一些布局。<https://blog.csdn.net/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位是登录密码,输入不回显,以 ‘#’ 结束输入

学生信息
学生信息管理系统(C语言)

管理员信息

学生信息管理系统(C语言)

部分界面

学生信息管理系统(C语言)
学生信息管理系统(C语言)
学生信息管理系统(C语言)

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