用c语言编写一个学生成绩管理系统_c语言成绩查询系统编程

2022-09-27 14:32:46 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

C语言简单实现学生成绩管理系统

一、前言

  • 首先,要写一个管理系统必须要先搭出一个框架来,即明确自己要实现哪些功能,将每个功能都写陈一个函数,然后再去编写实现各个功能的函数,最后再思考各个函数之间的相互调用。如果没有先搭好框架,而是直接一上手就去写代码的话,写着写着就会有种无从下手的感觉,就像你要做一道编程题目一样,首先要做的肯定是去读题目,看题目想要让我们干什么,然后才会去写代码。
  • 其次,最好是实现一个功能就测试一个,因为这样比较方便调试,出现bug的时候自己先思考,然后再去查找对应的知识点,一定要自己多思考,这样才会使自己的理解和记忆更加深刻
  • 最后,在写管理系统的时候会出现很多bug,在解决完之后会有很大收获。

二、涉及内容及要求

  • C语言的选择,循环,数组,字符串,链表,文件的熟练掌握
  • 链表的增删改查及链表排序
  • 文件录入链表及把链表信息存入文件

三、小技巧

  • 多文件存放信息,即将学生成绩信息,学生账号信息,教师账号信息存入不同文件中,这样方便内容的读取
  • 将链表内容导入文件时一行存放一个人的信息,方便读取
  • 在进入系统时就把学生成绩信息,学生账号信息,教师账号信息从文件录入链表
  • 修改密码时必须验证原密码,在修改完密码后立即存入文件
  • 在系统退出时将学生成绩信息导入文件,不用每次修改后就导入
  • 在输入密码时在屏幕上用’*’来代替用户输入的密码

四、正文

  • 界面
    • 我的管理系统分了三个端口:教师端,学生端,管理员端
    • 首先,这是登录界面
    • 教师端功能界面
    • 学生端界面
    • 学生端功能界面
    • 管理员功能界面
  • 详情 每个端口进行登录时都会进行账号和密码验证,若账号不存在则自动退出系统,账号正确密码错误时会有三次机会,若正确则进入,若错误则输出错误信息,并提示还有几次机会,三次错误系统会自动退出:

五、代码块

  • 头文件
代码语言:javascript复制
#define MAX 20
#ifndef HEAD_H_INCLUDED
#define HEAD_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <unistd.h>
#include <errno.h>
typedef struct student {
    char xuehao[9] ;
    char name[MAX] ;
    int total ;
    char Advanced[4] ;
    char C_language_programming[4] ;
    char English[4] ;
    float average ;
}Item ;
typedef struct node1 {
    Item student ;
    struct node1 * next ;
}Node_student;
typedef Node_student * Linklist_student ;
typedef struct account_password {
    char account [9] ;
    char password [MAX] ;
} AAP ;
typedef struct node2 {
    AAP account_password ;
    struct node2 * next ;
} Node_aap ;
typedef Node_aap * Linklist_aap ;
Linklist_student chuangjian () ;                //学生链表的创建
void entering1 (Linklist_student) ;             //学生信息导出
Linklist_student export1 () ;                   //学生信息导入
void entering2(Linklist_aap, int) ;             //账号信息导出
Linklist_aap export2(int) ;                     //账号信息导入
void add1(Linklist_student) ;                   //增加学生信息
void del1(Linklist_student) ;                   //删除学生信息
void change1(Linklist_student) ;                //修改学生信息
void add2(Linklist_aap) ;                       //增加账号信息
void del2(Linklist_aap) ;                       //删除账号信息
int change2(Linklist_aap, const char *) ;       //密码修改
void find2(Linklist_aap) ;                      //查找账号信息
void password_change() ;                        //管理员密码修改
void find1(Linklist_student) ;                  //查找学生信息
void Performance_analysis(Linklist_student) ;   //成绩分析
int Print2(Linklist_aap) ;                      //打印账号信息
void sort () ;                                  //对学生链表进行排序
void Print1() ;                                 //打印学生信息
void Print3() ;                                 //打印某个账号信息
void show() ;                                   //系统界面
void manager_interface() ;                      //管理员登录界面
void manager_login() ;                          //管理员登录(密码验证)
void manager_power() ;                          //管理员权限
void student_interface() ;                      //学生登录界面
void register1 () ;                             //用户注册
void login (int) ;                              //用户登录(账号密码验证)
void student_power (const char *) ;             //学生用户权限界面
void teacher_register () ;                      //教师用户注册
void teacher_power() ;                          //教师用户权限
void password_input(char * p) ;                 //密码输入
void student_handle() ;                         //学生账号信息管理
void teacher_handle() ;                         //教师账号信息管理
char * s_gets(char * p, int n) ;                //获取字符串
  • 函数定义
代码语言:javascript复制
    #include "head.h"

    void password_input (char * p) { 
               //密码输入
    int i = 0 ;
    while (i<19) { 
   
        char ch ;
        ch = getch() ;
        if (ch == 'n' || ch == 'r') { 
   
            p[i] = '' ;
            break ;
        }
        else if (ch == 'b'){ 
   
            if (i>0) { 
   
                printf("b b") ;
                p[--i] = '' ;
            }
        }
        else { 
   
            p[i  ] = ch ;
            putchar('*') ;
        }
    }
    fflush(stdin) ;
    p[19] = '' ;
}

void register1 () { 
            //账号注册
    system("cls") ;
    AAP * aap1 = (AAP *) malloc (sizeof(AAP)) ;
    AAP * aap2 = (AAP *) malloc (sizeof(AAP)) ;
    FILE * fp = fopen("student_cAp.txt", "at ") ;
    if (fp==NULL) { 
   
        printf("nt打开文件失败n") ;
        puts("nt请键入任意键退出!") ;
        getch() ;
        exit(1) ;
    }
    printf("nnnt请输入用户名(8位学号):") ;
    scanf("%s", aap1->account) ;
    fflush(stdin) ;
    while (!feof(fp)) { 
   
        fscanf(fp, "%s %sn", aap2->account, aap2->password) ;
        if (strcmp(aap1->account, aap2->account) == 0) { 
   
            puts("t该用户已存在!请重新注册或登录!") ;
            printf("t请键入任意键返回注册界面!") ;
            getch() ;
            fclose(fp) ;
            free(aap1) ;
            free(aap2) ;
            student_interface() ;
        }
    }
    printf("nt密码:nt") ;
    password_input (aap1->password) ;
    printf("nt请在输入一遍进行确认:nt") ;
    password_input(aap2->password) ;
    if (strcmp(aap1->password, aap2->password)) { 
   
        puts("nt两次输入不一致!请重新进行注册!") ;
        student_interface() ;
    }
    fprintf(fp, "%s %sn", aap1->account, aap1->password) ;
    fclose(fp) ;
    free(aap1) ;
    free(aap2) ;
    student_interface() ;
}

void login (int n) { 
           //登录验证
    system("cls") ;
    AAP * aap1 = (AAP *) malloc(sizeof(AAP)) ;
    AAP * aap2 = (AAP *) malloc(sizeof(AAP)) ;
    FILE * fp ;
    if (n==2) { 
   
        fp = fopen("teacher_cAp.txt", "rt") ;
        if (fp==NULL) { 
   
            printf("nt打开文件失败n") ;
            puts("nnnt请键入任意键退出!") ;
            getch() ;
            exit(1) ;
        }
        printf("nt账号:") ;
    }
    else { 
   
        fp = fopen("student_cAp.txt", "rt") ;
        if (fp==NULL) { 
   
            printf("nt打开文件失败n") ;
            puts("nnnt请键入任意键退出!") ;
            getch() ;
            exit(1) ;
        }
        printf("nnnt账号(8位学号):") ;
    }
    scanf("%s", aap1->account) ;
    fflush(stdin) ;
    while (!feof(fp)) { 
   
        fscanf(fp, "%s %sn", aap2->account, aap2->password) ;
        if (strcmp(aap1->account, aap2->account)==0) { 
   
            printf("nt密码:") ;
            for (int i=0; i<3; i  ) { 
   
                password_input (aap1->password) ;
                if (strcmp(aap1->password, aap2->password)==0) { 
   
                    puts ("登录成功!") ;
                    if (n==1)
                        student_power(aap1->account) ;
                    else
                        teacher_power(aap1->account) ;
                }
                else
                    printf("nt密码错误!请重新输入(您还有%d次机会):nt", 2-i) ;
            }
            printf("t您已经输错三次,系统将强制退出!n");
            exit(1) ;
        }
    }
    fclose (fp) ;
    printf ("t该用户不存在!请键入任意字符退出n") ;
    getch () ;
    exit (1) ;
}

void student_interface () { 
        //学生界面
    system ("cls") ;
    printf ("nnnnnnttttt    欢迎进入学生系统n") ;
    printf ("ttttt   *******************n") ;
    printf ("ttttt        1.注册   nttttt        2.登录n") ;
    printf ("ttttt        3.返回上一层nttttt        0.退出n") ;
    printf ("ttttt   *******************n") ;
    printf ("ttttt  请选择你要进行的操作:nttttt  ") ;
    int x ;
    fflush (stdin) ;
    do { 
   
        scanf ("%d", &x) ;
        fflush (stdin) ;
        switch (x) { 
   
            case 1 :
                register1 (1) ;
                break ;
            case 2 :
                login (1) ;
                break ;
            case 3 :
                show () ;
                break ;
            case 0 :
                entering1(head) ;
                entering2(aap_s, 1) ;
                entering2(aap_t, 2) ;
                printf ("nttttt  您选择了退出!") ;
                sleep (1) ;
                printf ("nttttt  正在退出...") ;
                sleep (1) ;
                printf ("nttttt  已退出n") ;
                exit(0) ;
            default :
                printf ("t输入有误, 请重新输入:nt") ;
                printf("请键入任意键重新进行选择!") ;
                getch() ;
        }
        student_interface() ;
    }
    while (x != 0) ;
}

void student_power(const char * p) { 
           //学生功能
    system("cls") ;
    puts("nnnnnnttttt     请选择你要进行的功能:") ;
    puts("ttttt     ****************************") ;
    puts("ttttt           1.查询个人成绩") ;
    puts("ttttt           2.查询全班成绩") ;
    puts("ttttt           3.成绩分析") ;
    puts("ttttt           4.修改密码") ;
    puts("ttttt           5.返回上一层") ;
    puts("ttttt           0.退出") ;
    puts("ttttt     ****************************") ;
    printf("ttttt     ") ;
    int x ;
    do { 
   
        Linklist_student q = head->next ;
        scanf("%d", &x) ;
        fflush(stdin) ;
        if (x == 1 || x == 2) { 
   
            system("cls") ;
            sort() ;
        }
        int count = 1 ;
        switch (x) { 
   
            case 1 :
                while (q && strcmp(p, q->student.xuehao) != 0) { 
   
                    count    ;
                    q = q->next ;
                }
                if (q) { 
   
                    printf("nnnt排名ttt学号ttt姓名tt高数ttc语言tt大英tt总分tt平均分n") ;
                    printf("t%dttt%stt%stt%dtt%dtt%dtt%dtt%.1fn", count, q->student.xuehao, q->student.name,
                        atoi(q->student.Advanced), atoi(q->student.C_language_programming), atoi(q->student.English), q->student.total,
                        q->student.average) ;
                }
                else { 
   
                    puts("tttttt    抱歉, 找不到该学生!") ;
                    puts("tttttt    请键入任意键返回上一层!") ;
                    getch() ;
                    student_power(p) ;
                }
                printf("t请键入任意键返回上一层n") ;
                getch() ;
                break ;
            case 2 :
                Print1() ;
                break ;
            case 3 :
                Performance_analysis(head) ;
                break ;
            case 4 :
                if (change2(aap_s, p)) { 
   
                    entering2(aap_s, 1) ;
                    student_interface() ;
                }
                break ;
            case 5 :
                student_interface() ;
                break ;
            case 0 :
                entering1(head) ;
                puts("ttttt     您选择了退出!") ;
                sleep(1) ;
                puts("ttttt     正在退出...") ;
                sleep(1) ;
                puts("ttttt     已退出n") ;
                exit (0) ;
            default :
                puts("ttttt     输入错误, 请重新选择:") ;
                printf("ttttt     请键入任意键重新进行选择:") ;
                getch() ;
        }
        student_power(p) ;
    }
    while (x != 0) ;
}

void entering1(Linklist_student phead) { 
           //学生信息导出
    Linklist_student p = phead->next ;
    FILE * fp = fopen("student_message.txt", "w ") ;
    if (fp != NULL) { 
   
        while (p) { 
   
            fprintf(fp, "%s %s %s %s %s %d %.1fn", p->student.name, p->student.xuehao, p->student.Advanced,
                    p->student.C_language_programming, p->student.English, p->student.total, p->student.average) ;
            p = p->next ;
        }}
    fclose(fp) ;
}

Linklist_student export1 () { 
                      //学生信息导入
    changdu = 0 ;
    Linklist_student phead, p, q ;
    phead = (Linklist_student) malloc (sizeof(Node_student)) ;
    phead->next = NULL ;
    p = phead ;
    FILE * fp = fopen("student_message.txt", "rt") ;
    if (fgetc(fp)==EOF)
        ;
    else { 
   
        rewind(fp) ;
        while (!feof(fp)) { 
   
            q = (Linklist_student) malloc (sizeof(Node_student)) ;
            fscanf(fp, "%s %s %s %s %s %d %fn", q->student.name, q->student.xuehao, q->student.Advanced,
                q->student.C_language_programming, q->student.English, &q->student.total, &q->student.average) ;
            changdu    ;
            p->next = q ;
            p = q ;
        }
        q->next = NULL ;
    }
    fclose(fp) ;
    return phead ;
}

void entering2(Linklist_aap phead, int n) { 
          //账号信息导出
    Linklist_aap p = phead->next ;
    FILE * fp ;
    if (n == 1)
        fp = fopen("student_cAp.txt", "w ") ;
    else
        fp = fopen("teacher_cAp.txt", "w ") ;
    while (p) { 
   
        fprintf(fp, "%s %sn", p->account_password.account, p->account_password.password) ;
        p = p->next ;
    }
    fclose(fp) ;
}

Linklist_aap export2 (int n) { 
                        //账号信息导入
    Linklist_aap phead, p, q ;
    phead = (Linklist_aap) malloc (sizeof(Node_aap)) ;
    phead->next = NULL ;
    p = phead ;
    FILE * fp ;
    if (n == 1)
        fp = fopen("student_cAp.txt", "rt") ;
    else
        fp = fopen("teacher_cAp.txt", "rt") ;
    if (fgetc(fp)==EOF)
        ;
    else { 
   
        rewind(fp) ;
        while (!feof(fp)) { 
   
            q = (Linklist_aap) malloc (sizeof(Node_aap)) ;
            fscanf(fp, "%s %sn", q->account_password.account, q->account_password.password) ;
            p->next = q ;
            p = q ;
        }
        q->next = NULL ;
    }
    fclose(fp) ;
    return phead ;
}

Linklist_student chuangjian() { 
                //学生信息链表的创建
    system("cls") ;
    Linklist_student phead, pnew, pend ;
    phead = (Linklist_student) malloc(sizeof(Node_student)) ;
    pend = phead ;
    phead->next = NULL ;
    char xuehao[9] ;
    printf("nnnt请输入学生学号(8位)[输入非负数结束录入]:") ;
    changdu = 0 ;
    while (s_gets(xuehao, 9) && atoi(xuehao)>0) { 
   
        changdu    ;
        pnew = (Linklist_student) malloc(sizeof(Node_student)) ;
        pnew->next = NULL ;
        pend->next = pnew ;
        strncpy(pnew->student.xuehao, xuehao, 9) ;
        printf("nt请输入该生姓名:") ;
        s_gets(pnew->student.name, MAX) ;
        printf("nt请输入该生高数成绩:") ;
        s_gets(pnew->student.Advanced, 4) ;
        printf("nt请输入该生c语言成绩:") ;
        s_gets(pnew->student.C_language_programming, 4) ;
        printf("nt请输入该生大英成绩:") ;
        s_gets(pnew->student.English, 4) ;
        printf("nt请输入下一个学生学号(8位)[输入非负数结束录入]:") ;
        pnew->student.total = atoi(pnew->student.Advanced)   atoi(pnew->student.C_language_programming)   atoi(pnew->student.English) ;
        pnew->student.average = pnew->student.total / 3.0 ;
        pend = pnew ;
    }
    return phead ;
}

void add1 (Linklist_student phead) { 
               //添加学生信息
    system("cls") ;
    Linklist_student p = phead, pnew ;
    char xuehao[9] ;
    printf("nnnt请输入要添加的学生学号:") ;
    s_gets(xuehao, 9) ;
    while (p->next)
        p = p->next ;
    pnew = (Linklist_student) malloc (sizeof(Node_student)) ;
    if (pnew == NULL)
        puts("t添加失败!") ;
    else { 
   
        strcpy(pnew->student.xuehao, xuehao) ;
        printf("nt请输入该生姓名:") ;
        s_gets(pnew->student.name, MAX) ;
        printf("nt请输入该生高数成绩:") ;
        s_gets(pnew->student.Advanced, 4) ;
        printf("nt请输入该生c语言成绩:") ;
        s_gets(pnew->student.C_language_programming, 4) ;
        printf("nt请输入该生大英成绩:") ;
        s_gets(pnew->student.English, 4) ;
        pnew->student.total = atoi(pnew->student.Advanced)   atoi(pnew->student.C_language_programming)   atoi(pnew->student.English) ;
        pnew->student.average = pnew->student.total / 3.0 ;
        p->next = pnew ;
        pnew->next = NULL ;
    }
    printf("nt请键入任意字符退出n") ;
    getch() ;
}

void del1 (Linklist_student phead) { 
           //删除学生信息
    system("cls") ;
    Linklist_student q = phead->next, p = phead->next ;
    char xuehao[9] ;
    printf("nnnt请输入要删除的学号:") ;
    s_gets(xuehao, 10) ;
    while (q && strcmp(q->student.xuehao, xuehao) != 0) { 
   
        p = q ;
        q = q->next ;
    }
    if (q == NULL)
        puts("t输入错误, 未找到该生!") ;
    else { 
   
        if (q == phead->next)
            phead->next = q->next ;
        else
            p->next = q->next ;
        puts("t已删除!") ;
        free(q) ;
    }
    printf("t请键入任意字符退出n") ;
    getch() ;
}

void change1 (Linklist_student phead) { 
        //修改学生信息
    system("cls") ;
    Linklist_student p = phead->next ;
    char xuehao[9] ;
    printf("nnnt请输入要修改的学生学号:") ;
    s_gets(xuehao, 9) ;
    while (p && strcmp(p->student.xuehao, xuehao) != 0)
        p = p->next ;
    if (p == NULL)
        puts("t输入错误, 为找到该生!") ;
    else { 
   
        printf("nttt1.姓名    ttt2.高数成绩") ;
        printf("nttt3.c语言成绩ttt4.大英成绩n") ;
        printf("ttt5.学号n") ;
        printf("nt请输入要修改的内容:") ;
        int x ;
        scanf("%d", &x) ;
        fflush(stdin) ;
        switch (x) { 
   
            case 1 :
                printf("nt请输入修改后的学生姓名:") ;
                s_gets (p->student.name, MAX) ;
                break ;
            case 2 :
                printf("nt请输入修改后的高数成绩:") ;
                s_gets(p->student.Advanced, 4) ;
                break ;
            case 3 :
                printf("nt请输入修改后的c语言成绩:") ;
                s_gets(p->student.C_language_programming, 4) ;
                break ;
            case 4 :
                printf("nt请输入修改后的大英成绩:") ;
                s_gets(p->student.English, 4) ;
                break ;
            case 5 :
                printf("nt请输入修改后的学号:") ;
                s_gets(p->student.xuehao, 9) ;
                break ;
        }
        p->student.total = atoi(p->student.Advanced)   atoi(p->student.C_language_programming)   atoi(p->student.English) ;
        p->student.average = p->student.total / 3.0 ;
    }
    printf("t请键入任意键退出n") ;
    getch() ;
}

void find1 (const Linklist_student phead) { 
        //查找学生信息
    system("cls") ;
    Linklist_student p = phead->next ;
    char xuehao[9] ;
    printf("nnnt请输入要查找的学生学号:") ; ;
    s_gets(xuehao, 9) ;
    sort() ;
    int count = 1 ;
    while (p && strcmp(xuehao, p->student.xuehao) != 0) { 
   
        count    ;
        p = p->next ;
    }
    if (p == NULL)
        puts("nt输入错误, 未找到该生!") ;
    else { 
   
        printf("nt排名ttt学号ttt姓名tt高数ttc语言tt大英tt总分tt平均分n") ;
        printf("t%dttt%stt%stt%stt%stt%stt%dtt%.1fn", count, p->student.xuehao, p->student.name,
                p->student.Advanced, p->student.C_language_programming, p->student.English, p->student.total,
                p->student.average) ;
    }
    printf("nt请键入任意键退出n") ;
    getch() ;
}

void swap (Linklist_student a, Linklist_student b) { 
           //交换结点数据域
    Item r = a->student ;
    a->student = b->student ;
    b->student = r ;
}

void sort () { 
             //学生信息链表的排序
    system("cls") ;
    puts("nnnnnntttttt    请选择以什么顺序输出学生成绩:") ;
    puts("tttttt    ****************************") ;
    puts("ttttttt    1.总分") ;
    puts("ttttttt    2.高数") ;
    puts("ttttttt    3.大英") ;
    puts("ttttttt    4.c语言") ;
    puts("ttttttt    5.学号") ;
    puts("tttttt    ****************************") ;
    printf("tttttt    ") ;
    int n ;
    scanf("%d", &n) ;
    fflush(stdin) ;
    Linklist_student q = head->next ;
    int flag = 1 ;
    for (int i=0; i<changdu && flag; i  ) { 
   
        q = head->next ;
        flag = 0 ;
        for (; q->next != NULL; q = q->next)
            if (n<1 || n>6) { 
   
                puts("输入错误, 请重新输入:") ;
                sort() ;
                break ;
            }
            else if (n==1 && q->student.total < q->next->student.total) { 
   
                flag = 1 ;
                swap(q, q->next) ;
            }
            else if (n==2 && strcmp(q->student.Advanced, q->next->student.Advanced)<0) { 
   
                flag = 1 ;
                swap(q, q->next) ;
            }
            else if (n==3 && strcmp(q->student.English, q->next->student.English)<0) { 
   
                flag = 1 ;
                swap(q, q->next) ;
            }
            else if (n==4 && strcmp(q->student.C_language_programming, q->next->student.C_language_programming)<0) { 
   
                flag = 1 ;
                swap(q, q->next) ;
            }
            else if (n==5 && strcmp(q->student.xuehao, q->next->student.xuehao)>0) { 
   
                flag = 1 ;
                swap(q, q->next) ;
            }
    }
}

void Performance_analysis (Linklist_student phead) { 
           //学生成绩分析
    system("cls") ;
    Linklist_student p = phead->next ;
    if (p && phead) { 
   
        int c1, c2, c3, m1, m2, m3, y1, y2, y3 ;
        int gs_max, dy_max, cyy_max ;
        int gs_min, dy_min, cyy_min ;
        int sum_gs, sum_dy, sum_cyy ;
        float aver_gs, aver_dy, aver_cyy ;
        gs_max = gs_min = atoi(p->student.Advanced) ;
        dy_max = dy_min = atoi(p->student.English) ;
        cyy_max = cyy_min = atoi(p->student.C_language_programming) ;
        sum_gs = sum_dy = sum_cyy = 0 ;
        aver_gs = aver_dy = aver_cyy = 0 ;
        c1 = c2 = c3 = 0 ;
        m1 = m2 = m3 = 0 ;
        y1 = y2 = y3 = 0 ;
        while (p) { 
   
            sum_gs  = atoi(p->student.Advanced) ;
            sum_dy  = atoi(p->student.English) ;
            sum_cyy  = atoi(p->student.C_language_programming) ;
            if (gs_max<atoi(p->student.Advanced))
                gs_max = atoi(p->student.Advanced) ;
            if (gs_min>atoi(p->student.Advanced))
                gs_min = atoi(p->student.Advanced) ;
            if (dy_max>atoi(p->student.English))
                dy_max = atoi(p->student.English) ;
            if (dy_min>atoi(p->student.English)) ;
                dy_min = atoi(p->student.English) ;
            if (cyy_max<atoi(p->student.C_language_programming))
                cyy_max = atoi(p->student.C_language_programming) ;
            if (cyy_min>atoi(p->student.C_language_programming))
                cyy_min = atoi(p->student.C_language_programming) ;
            if (atoi(p->student.C_language_programming)>=60) { 
   
                c2    ;
                if (atoi(p->student.C_language_programming)>=85)
                    c3    ;
            }
            else    c1    ;
            if (atoi(p->student.Advanced)>=60) { 
   
                m2    ;
                if (atoi(p->student.Advanced)>=85)
                    m3    ;
            }
            else    m1    ;
            if (atoi(p->student.English)>=60) { 
   
                y2    ;
                if (atoi(p->student.English)>=85)
                    y3    ;
            }
            else    y1    ;
            p = p->next ;
        }
        aver_gs = sum_gs / (changdu   0.0) ;
        aver_dy = sum_dy / (changdu   0.0) ;
        aver_cyy = sum_cyy / (changdu   0.0) ;
        printf("nnnnnnttt    及格人数t    优秀人数t    不及格人数t      最高分t      最低分t       平均分nn") ;
        printf("tt高数tt%dtt%dtt%dtt%dtt%dtt%.1fnn", m2, m3, m1, gs_max, gs_min, aver_gs) ;
        printf("ttc语言tt%dtt%dtt%dtt%dtt%dtt%.1fnn", c2, c3, c1, cyy_max, cyy_min, aver_cyy) ;
        printf("tt大英tt%dtt%dtt%dtt%dtt%dtt%.1fnn", y2, y3, y1, dy_max, dy_min, aver_dy) ;
    }
    else
        puts("nnnnnnttt    无学生信息!") ;
    printf("tt请键入任意键返回上一层!") ;
    getch() ;
}

void Print1 () { 
               //打印学生信息
    system("cls") ;
    Linklist_student p = head->next ;
    int n = 1 ;
    if (p == NULL || head == NULL)
        printf("nnnt无学生信息!n") ;
    else { 
   
        printf("nnnnt排名ttt学号ttt姓名tt高数ttc语言tt大英tt总分tt平均分n") ;
        while (p) { 
   
            printf("t%dttt%stt%stt%dtt%dtt%dtt%dtt%.1fn", n  , p->student.xuehao, p->student.name,
                   atoi(p->student.Advanced), atoi(p->student.C_language_programming), atoi(p->student.English), p->student.total,
                   p->student.average) ;
            p = p->next ;
        }
    }
    printf("t请键入任意键返回上一层n") ;
    getch() ;
}

int change2(Linklist_aap phead, const char * q) { 
          //密码修改
    Linklist_aap p = phead->next ;
    while (p && strcmp(p->account_password.account, q) != 0)
        p = p->next ;
    if (p == NULL) { 
   
        puts("ttttt     输入错误, 未找到该账号!") ;
        puts("ttttt   请键入任意键返回上一层!") ;
        getch() ;
        return 0 ;
    }
    else { 
   
        char a[20], b[20] ;
        printf("ttttt     请输入原密码:nttttt     ") ;
        password_input(a) ;
        if (strcmp(a, p->account_password.password)==0) { 
   
            puts("nttttt     请输入修改后的密码:") ;
            printf("ttttt     ") ;
            password_input(a) ;
            puts("nttttt     请再输入一遍以确认:") ;
            printf("ttttt     ") ;
            password_input(b) ;
            if (strcmp(a, b) != 0) { 
   
                puts("nttttt     两次输入不一致!nttttt     请键入任意键返回上一层!") ;
                return 0 ;
            }
            else { 
   
                puts("nttttt     修改成功!") ;
                strcpy(p->account_password.password, a) ;
                puts("ttttt   请键入任意键返回上一层!") ;
                getch() ;
                return 1 ;
            }
        }
        else { 
   
            puts("nttttt     原密码错误!nttttt     请键入任意键返回上一层!") ;
            getch() ;
            return 0 ;
        }
    }
}

void del2(Linklist_aap phead) { 
            //账号信息删除
    Linklist_aap q = phead->next, p = phead->next ;
    char account[9] ;
    printf("请输入要删除的账号:") ;
    s_gets(account, 10) ;
    while (q && strcmp(q->account_password.account, account) != 0) { 
   
        p = q ;
        q = q->next ;
    }
    if (q == NULL)
        puts("输入错误, 未找到该账号!") ;
    else { 
   
        if (q == phead->next)
            phead->next = q->next ;
        else
            p->next = q->next ;
        puts("已删除!") ;
        free(q) ;
    }
    printf("请键入任意字符退出n") ;
    getch() ;
}

void add2(Linklist_aap phead) { 
            //添加账号信息
    Linklist_aap p = phead, q ;
    while (p->next)
        p = p->next ;
    printf("ttttt     请输入要添加的账号:nttttt     ") ;
    char a[9], b[MAX], c[MAX] ;
    s_gets(a, 9) ;
    printf("nttttt     请输入密码:nttttt     ") ;
    password_input(b) ;
    printf("nttttt     请再输入一遍密码进行确认:nttttt     ") ;
    password_input(c) ;
    if (strcmp(b, c)) { 
   
        puts("nttttt     两次输入不一致!") ;
        puts("nttttt     请键入任意键返回上一层!") ;
        getch() ;
    }
    else { 
   
        q = (Linklist_aap) malloc(sizeof(Node_aap)) ;
        strcpy(q->account_password.account, a) ;
        strcpy(q->account_password.password, b) ;
        p->next = q ;
        q->next = NULL ;
        puts("nttttt     注册成功!") ;
        puts("nttttt     请键入任意键返回上一层!") ;
        getch() ;
    }
}

int Print2 (Linklist_aap phead) { 
              //打印账号信息
    Linklist_aap p = phead->next ;
    if (phead == NULL || p == NULL) { 
   
        puts("ttttt     无账号信息!") ;
        if (phead)
            return 1 ;
        else
            return 0 ;
    }
    else { 
   
        while (p) { 
   
            printf("ttttt     账号tt密码n") ;
            printf("ttttt     %stt%sn", p->account_password.account, p->account_password.password) ;
            p = p->next ;
        }
        return 0 ;
    }
}

void Print3(Linklist_aap phead) { 
              //打印要查找的账号信息
    char a[9] ;
    printf("ttttt     请输入要查找的账号:n") ;
    s_gets(a, 9) ;
    Linklist_aap p = phead -> next ;
    while (p && strcmp(a, p->account_password.account) != 0)
        p = p->next ;
    if (p==NULL)
        printf("ttttt     输入错误, 未找到该账号!n") ;
    else
        printf("ttttt     账号:%sn密码:%sn", p->account_password.account, p->account_password.password) ;
    printf("ttttt     请键入任意键返回上一层!") ;
    getch() ;
}

void manager_interface() { 
             //管理员端
    manager_login() ;
    manager_power() ;
}

void manager_login () { 
                //管理员登录验证
    system("cls") ;
    char a[MAX], b[MAX] ;
    FILE * fp = fopen("manager_cAp.txt", "rt") ;
    fscanf(fp, "%sn", b) ;
    int j ;
    for(j=0; j<3; j  ) { 
   
        putchar('n') ;
        int i = 0 ;
        printf("t   请输入密码:") ;
        while (i<19) { 
   
            char ch ;
            ch = getch() ;
            if (ch == 'n' || ch == 'r') { 
   
                a[i] = '' ;
                break ;
            }
            else if (ch == 'b') { 
   
                printf("b b") ;
                if (i>0)
                    a[--i] = '' ;
            }
            else { 
   
                a[i  ] = ch ;
                putchar('*') ;
            }
        }
        a[19] = '' ;
        if (strcmp(b, a) == 0) { 
   
            manager_power() ;
            break ;
        }
    }
    if (j==3)
    puts("n您已经输错三次!系统将强制退出!") ;
    exit(1) ;
}

void manager_power () { 
                //管理员功能
    system("cls") ;
    puts("nnnnnnttttt欢迎进入管理员界面") ;
    puts("tttt    ****************************") ;
    puts("ttttt1.管理学生账号信息") ;
    puts("ttttt2.管理教师账号信息") ;
    puts("ttttt3.修改密码") ;
    puts("ttttt4.返回上一层") ;
    puts("ttttt0.退出") ;
    puts("tttt    ****************************") ;
    int x ;
    printf("ttttt请输入你要进行的操作:nttttt") ;
    do { 
   
        scanf("%d", &x) ;
        fflush(stdin) ;
        switch (x) { 
   
            case 1 :
                student_handle() ;
                break ;
            case 2 :
                teacher_handle() ;
                break ;
            case 3 :
                password_change() ;
                manager_interface() ;
                break ;
            case 4 :
                show() ;
            case 0 :
                printf ("nttttt您选择了退出!") ;
                sleep (1) ;
                printf ("nttttt正在退出...") ;
                sleep (1) ;
                printf ("nttttt已退出n") ;
                exit(0) ;
            default :
                printf("nttttt输入错误, 请重新输入:nttttt") ;
                printf("请键入任意键重新进行选择!") ;
                getch() ;
        }
        manager_power() ;
    }
    while (x != 0) ;
}

void password_change() { 
               //管理员密码修改
    char a[MAX], b[MAX] ;
    printf("nnnnnnttttt请输入修改后的密码:nttttt") ;
    password_input(a) ;
    printf("nnttttt请再输入一遍已确认:nttttt") ;
    password_input(b) ;
    FILE * fp = fopen("manager_cAp.txt", "wt") ;
    if (strcmp(a, b) != 0)
        puts("nttttt两次输入不一致!") ;
    else { 
   
        puts("修改成功!") ;
        fprintf(fp, "%sn", a) ;
    }
    fclose(fp) ;
}

void student_handle() { 
                //对学生的操作
    system ("cls") ;
    puts ("nnnnnnttttt     **************************") ;
    puts("ttttt           1.修改学生账号") ;
    puts("ttttt           2.删除学生账号") ;
    puts("ttttt           3.查找学生账号") ;
    puts("ttttt           4.添加学生账号") ;
    puts("ttttt           5.返回上一层") ;
    puts("ttttt           0.退出") ;
    puts ("ttttt     **************************") ;
    printf ("ttttt     请选择你要进行的操作:nttttt     ") ;
    int x ;
    do { 
   
        scanf("%d", &x) ;
        int y ;
        fflush(stdin) ;
        if (x!=0 && x!=4 && x!=5)
            y = Print2(aap_s) ;
        if (y) { 
   
            switch (x) { 
   
                case 1 :
                    printf("ttttt     请输入你要修改的账号:") ;
                    printf("nttttt   ") ;
                    char a[9] ;
                    s_gets(a, 9) ;
                    change2(aap_s, a) ;
                    entering2(aap_s, 1) ;
                    break ;
                case 2 :
                    del2(aap_s) ;
                    break ;
                case 3 :
                    Print3(aap_s) ;
                    break ;
                case 4 :
                    add2(aap_s) ;
                    entering2(aap_s, 1) ;
                    break ;
                case 5 :
                    manager_power() ;
                    break ;
                case 0 :
                    entering1(head) ;
                    printf("nttttt     您选择了退出!") ;
                    sleep(1) ;
                    printf("nttttt     正在退出...") ;
                    sleep(1) ;
                    printf("nttttt     已退出n") ;
                    exit (0) ;
                default :
                    printf ("ttttt     输入有误, 请重新输入:n");
                    printf("ttttt     请键入任意键重新进行选择!") ;
                    getch() ;
            }
        }
        else { 
   
            printf("ttttt     请键入任意键返回上一层!") ;
            getch() ;
        }
        student_handle() ;
    }
    while (x != 0) ;
}

void teacher_handle() { 
                    //对教师的操作
    system ("cls") ;
    puts ("nnnnnnttttt     **************************") ;
    puts("tttttt  1.修改教师账号") ;
    puts("tttttt  2.删除教师账号") ;
    puts("tttttt  3.查找教师账号") ;
    puts("tttttt  4.添加教师账号") ;
    puts("tttttt  5.返回上一层") ;
    puts("tttttt  0.退出") ;
    puts ("ttttt     **************************") ;
    printf ("ttttt     请选择你要进行的操作:nttttt     ") ;
    int x ;
    do { 
   
        scanf("%d", &x) ;
        fflush(stdin) ;
        int y ;
        if (x!=0 && x!=4 && x!=5)
            y = Print2(aap_t) ;
        if (y) { 
   
            switch (x) { 
   
                case 1 :
                    printf("ttttt     请输入你要修改的账号:") ;
                    char a[9] ;
                    s_gets(a, 9) ;
                    change2(aap_t, a) ;
                    entering2(aap_t, 2) ;
                    break ;
                case 2 :
                    del2(aap_t) ;
                    break ;
                case 3 :
                    Print3(aap_t) ;
                    break ;
                case 4 :
                    add2(aap_t) ;
                    entering2(aap_t, 2) ;
                    break ;
                case 5 :
                    manager_power() ;
                    break ;
                case 0 :
                    entering1(head) ;
                    printf("nttttt     您选择了退出!") ;
                    sleep(1) ;
                    printf("nttttt     正在退出...") ;
                    sleep(1) ;
                    printf("nttttt     已退出n") ;
                    exit (0) ;
                default :
                    printf ("ttttt     输入有误, 请重新输入:n");
                    printf("ttttt     请键入任意键重新进行选择!") ;
                    getch() ;
            }
        }
        else { 
   
            printf("ttttt     请键入任意键返回上一层!") ;
            getch() ;
        }
        teacher_handle() ;
    }
    while (x != 0) ;
}

void teacher_power (const char * p) { 
              //教师功能
    system ("cls") ;
    puts ("nnnnnnttttt     **************************") ;
    puts ("ttttt           1.学生信息录入") ;
    puts ("ttttt           2.增添学生信息") ;
    puts ("ttttt           3.删除学生信息") ;
    puts ("ttttt           4.修改学生信息") ;
    puts ("ttttt           5.查找学生信息") ;
    puts ("ttttt           6.打印学生信息") ;
    puts ("ttttt           7.成绩分析") ;
    puts ("ttttt           8.修改密码") ;
    puts ("ttttt           9.返回上一层") ;
    puts ("ttttt           0.退出") ;
    puts ("ttttt     **************************") ;
    printf ("nttttt     请选择你要进行的操作:nttttt     ") ;
    int x ;
    do { 
   
        scanf ("%d", &x) ;
        fflush (stdin) ;
        switch (x) { 
   
            case 1 :
                head = chuangjian () ;
                break ;
            case 2 :
                add1 (head) ;
                break ;
            case 3 :
                del1 (head) ;
                break ;
            case 4 :
                change1 (head) ;
                break ;
            case 5 :
                find1 (head) ;
                break ;
            case 6 :
                sort() ;
                Print1 () ;
                break ;
            case 7 :
                Performance_analysis(head) ;
                break ;
            case 8 :
                if (change2(aap_t, p)) { 
   
                    entering2(aap_t, 2) ;
                    show() ;
                }
                break ;
            case 9 :
                show() ;
                break ;
            case 0 :
                entering1(head) ;
                printf("nttttt     您选择了退出!") ;
                sleep(1) ;
                printf("nttttt     正在退出...") ;
                sleep(1) ;
                printf("nttttt     已退出n") ;
                exit (0) ;
            default :
                printf ("ttttt输入有误, 请重新输入:n");
                printf("请键入任意键重新进行选择!") ;
                getch() ;
        }
        teacher_power(p) ;
    }
    while (x != 0) ;
}

void show () { 
                 //系统界面
    system("cls") ;
    printf("nnnnnnttttt   欢迎进入yjh728的学生管理系统n") ;
    printf("ttttt   ****************************n") ;
    printf("ttttt           1.学生登录   nttttt           2.教师登录n") ;
    printf("ttttt           3.管理员登录 nttttt           0.退出n") ;
    printf("ttttt   ****************************n") ;
    printf("ttttt   请选择身份进行登录nttttt   ") ;
    int x ;
    fflush(stdin) ;
    do { 
   
        scanf("%d", &x) ;
        fflush(stdin) ;
        switch (x) { 
   
            case 1 :
                student_interface () ;
                break ;
            case 2 :
                login(2) ;
                break ;
            case 3 :
                manager_interface () ;
                break ;
            case 0 :
                entering1(head) ;
                entering2(aap_s, 1) ;
                entering2(aap_t, 2) ;
                printf("nttttt   您选择了退出!") ;
                sleep(1) ;
                printf("nttttt   正在退出...") ;
                sleep(1) ;
                printf("nttttt   已退出n") ;
                exit (0) ;
            default :
                printf("ttttt   输入错误, 请重新选择!n") ;
                printf("ttttt   请键入任意键重新进行选择!") ;
                getch() ;
        }
        show() ;
    }
    while (x != 0) ;
}

char * s_gets (char * p, int n) { 
              //字符串输入及处理
    char * q, * find ;
    q = fgets(p, n, stdin) ;
    if (q) { 
   
        find = strchr(p, 'n') ;
        if (find)
            * find = '' ;
        else
            while (getchar() != 'n')
                continue ;
    }
    return q ;
}
  • 主函数
代码语言:javascript复制
#include "head.h"

Linklist_student head = NULL ;      //学生信息链表
Linklist_aap aap_s = NULL ;         //学生账号信息链表
Linklist_aap aap_t = NULL ;         //教师账号信息链表
int changdu  = 0 ;

int main()
{
    head = export1() ;              //学生信息从文件导入链表
    aap_s = export2(1) ;            //学生账号导入链表
    aap_t = export2(2) ;            //教师账号导入链表
    show() ;                        //学生管理系统界面
    return 0 ;
}

六、总结

第一次写这么长的代码,确实挺累的,但收获也不小,但是还有还不够完善,比如密码加密未完成,还有这个系统只能管理一个班级,若要实现多个班级的成绩管理就不嗯呢该完成了…… 最后的最后,这是我的第一篇博客,希望对浏览的人能有所帮助,也希望之后的自己能变得更好,加油!

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/192825.html原文链接:https://javaforall.cn

0 人点赞