C语言,有些模块没学过

你好,我现在要用C语言做一个学生考试系统。
首先,要做一个学生和教师的登录验证,登录之后会显示学生和教师的基本信息。
当学生登录后,学生可以选择考试和查询成绩。若学生选择考试,则显示可以考试的科目与时间,当学生选择其中一个科目并进入考试,则显示考试的题目,学生需要输入自己的答案,到截止时间,考试结束,学生的选择题答案,与预先提供的标答,自动匹配批改,每道题2分。
教师登录后,可以选择管理学生信息,进行修改,包括添加、删除。也可以选择批改试卷,对学生的答案进行打分,分值为0-10分。
最后对学生成绩进行汇总,并按从高到低进行排序。

这样?

img

#include <stdio.h>
#include <string.h>

struct student {
    char name[20];
    char password[20];
    int score;
};

struct teacher {
    char name[20];
    char password[20];
};

int student_login(struct student *students, int n)
{
    char name[20];
    char password[20];

    printf("请输入用户名:");
    scanf("%s", name);
    printf("请输入密码:");
    scanf("%s", password);

    for (int i = 0; i < n; i++) {
        if (strcmp(students[i].name, name) == 0 && strcmp(students[i].password, password) == 0) {
            printf("登录成功!\n");
            printf("欢迎您,%s!\n", students[i].name);
            return i;
        }
    }

    printf("用户名或密码错误!\n");
    return -1;
}

int teacher_login(struct teacher *teachers, int n)
{
    char name[20];
    char password[20];

    printf("请输入用户名:");
    scanf("%s", name);
    printf("请输入密码:");
    scanf("%s", password);

    for (int i = 0; i < n; i++) {
        if (strcmp(teachers[i].name, name) == 0 && strcmp(teachers[i].password, password) == 0) {
            printf("登录成功!\n");
            printf("欢迎您,%s!\n", teachers[i].name);
            return i;
        }
    }

    printf("用户名或密码错误!\n");
    return -1;
}

void add_student(struct student *students, int n)
{
    printf("请输入学生姓名:");
    scanf("%s", students[n].name);
    printf("请输入学生密码:");
    scanf("%s", students[n].password);
    students[n].score = 0;

    printf("添加成功!\n");
}

void delete_student(struct student *students, int n)
{
    char name[20];

    printf("请输入要删除的学生姓名:");
    scanf("%s", name);

    for (int i = 0; i < n; i++) {
        if (strcmp(students[i].name, name) == 0) {
            for (int j = i; j < n - 1; j++) {
                students[j] = students[j + 1];
            }

            printf("删除成功!\n");
            return;
        }
    }

    printf("未找到该学生!\n");
}

void print_student_scores(struct student *students, int n)
{
    printf("%-10s%-10s\n", "姓名", "成绩");
    for (int i = 0; i < n; i++) {
        printf("%-10s%-10d\n", students[i].name, students[i].score);
    }
}

void modify_student_score(struct student *students, int n)
{
    char name[20];
    int score;

    printf("请输入要修改成绩的学生姓名:");
    scanf("%s", name);

    for (int i = 0; i < n; i++) {
        if (strcmp(students[i].name, name) == 0) {
            printf("请输入新的成绩:");
            scanf("%d", &score);
            students[i].score = score;
            printf("修改成功!\n");
            return;
        }
    }

    printf("未找到该学生!\n");
}

void exam(struct student *students, int student_index)
{
    char *subjects[] = {"数学", "语文", "英语", "物理"};
    char *questions[] = {
        "1 + 1 = ?\nA. 1\nB. 2\nC. 3\nD. 4\n",
        "我国的首都是?\nA. 北京\nB. 上海\nC. 广州\nD. 深圳\n",
        "What's your name?\nA. Tom\nB. Mike\nC. Jack\nD. None of the above\n",
        "牛顿第二定律的公式为?\nA. F = ma\nB. E = mc2\nC. F = G(m1m2)/r^2\nD. P = F/A\n"
    };
    char *answers[] = {"B", "A", "D", "A"};

    int choice;

    printf("请选择考试科目:\n");
    for (int i = 0; i < 4; i++) {
        printf("%d. %s\n", i + 1, subjects[i]);
    }

    scanf("%d", &choice);
    choice--;

    printf("开始考试!\n");
    printf("--------------------\n");
    
    for (int i = 0; i < 4; i++) {
        printf("第%d题:\n%s", i + 1, questions[i]);
        char answer[10];
        scanf("%s", answer);
        
        if (strcmp(answer, answers[i]) == 0) {
            printf("你的答案是:%s,恭喜你,回答正确!\n", answer);
            students[student_index].score += 2;
        } else {
            printf("你的答案是:%s,很遗憾,回答错误!\n", answer);
        }
    }

    printf("考试结束!\n");
    printf("--------------------\n");
}
void init(struct student *students, int *student_count, struct teacher *teachers, int *teacher_count) {
    // 添加学生信息
    strcpy(students[0].name, "小明");
    strcpy(students[0].password, "123456");
    students[0].score = 0;

    strcpy(students[1].name, "小红");
    strcpy(students[1].password, "111111");
    students[1].score = 0;

    *student_count = 2;

    // 添加教师信息
    strcpy(teachers[0].name, "张老师");
    strcpy(teachers[0].password, "123456");

    *teacher_count = 1;
}

int main()
{
    struct student students[100];
    int student_count = 0;

    struct teacher teachers[100];
    int teacher_count = 0;

    int student_index = -1;
    int teacher_index = -1;

    int choice;
    

    init(students, &student_count, teachers, &teacher_count);
    while (1) {
        printf("请选择登录身份:\n");
        printf("1. 学生\n");
        printf("2. 教师\n");
        printf("3. 退出程序\n");

        scanf("%d", &choice);

        if (choice == 1) {
            student_index = student_login(students, student_count);
            if (student_index != -1) {
                while (1) {
                    printf("请选择操作:\n");
                    printf("1. 开始考试\n");
                    printf("2. 退出登录\n");
                    scanf("%d", &choice);

                    if (choice == 1) {
                        exam(students, student_index);
                    } else if (choice == 2) {
                        student_index = -1;
                        break;
                    } else {
                        printf("输入有误,请重新输入!\n");
                    }
                }
            }
        } else if (choice == 2) {
            teacher_index = teacher_login(teachers, teacher_count);
            if (teacher_index != -1) {
                while (1) {
                    printf("请选择操作:\n");
                    printf("1. 添加学生\n");
                    printf("2. 删除学生\n");
                    printf("3. 查看成绩\n");
                    printf("4. 修改成绩\n");
                    printf("5. 退出登录\n");
                    scanf("%d", &choice);

                    if (choice == 1) {
                        add_student(students, student_count);
                        student_count++;
                    } else if (choice == 2) {
                        delete_student(students, student_count);
                        student_count--;
                    } else if (choice == 3) {
                        print_student_scores(students, student_count);
                    } else if (choice == 4) {
                        modify_student_score(students, student_count);
                    } else if (choice == 5) {
                        teacher_index = -1;
                        break;
                    } else {
                        printf("输入有误,请重新输入!\n");
                    }
                }
            }
        } else if (choice == 3) {
            break;
        } else {
            printf("输入有误,请重新输入!\n");
        }
    }

    printf("程序已退出!\n");

    return 0;
}


img

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_STUDENTS 100
#define MAX_SUBJECTS 10
#define MAX_QUESTIONS 5
#define MAX_ANSWER_LENGTH 20

typedef struct {
    char username[20];
    char password[20];
    char name[50];
    int role;  // 0表示学生,1表示教师
} User;

typedef struct {
    char subject[50];
    char time[50];
    char questions[MAX_QUESTIONS][100];
    char answers[MAX_QUESTIONS][MAX_ANSWER_LENGTH];
    int correct_answers[MAX_QUESTIONS];
    int total_students;
    int scores[MAX_STUDENTS];
} Exam;

User students[MAX_STUDENTS];
User teachers[MAX_STUDENTS];
Exam exams[MAX_SUBJECTS];
int num_students = 0;
int num_teachers = 0;
int num_exams = 0;

void addStudent() {
    User student;
    printf("请输入学生用户名: ");
    scanf("%s", student.username);
    printf("请输入学生密码: ");
    scanf("%s", student.password);
    printf("请输入学生姓名: ");
    scanf("%s", student.name);
    student.role = 0;  // 学生角色
    students[num_students++] = student;
    printf("学生添加成功!\n");
}

void addTeacher() {
    User teacher;
    printf("请输入教师用户名: ");
    scanf("%s", teacher.username);
    printf("请输入教师密码: ");
    scanf("%s", teacher.password);
    printf("请输入教师姓名: ");
    scanf("%s", teacher.name);
    teacher.role = 1;  // 教师角色
    teachers[num_teachers++] = teacher;
    printf("教师添加成功!\n");
}

int login() {
    char username[20];
    char password[20];
    printf("请输入用户名: ");
    scanf("%s", username);
    printf("请输入密码: ");
    scanf("%s", password);

    // 验证学生登录
    for (int i = 0; i < num_students; i++) {
        if (strcmp(username, students[i].username) == 0 && strcmp(password, students[i].password) == 0) {
            printf("学生登录成功!\n");
            printf("学生信息:姓名:%s\n", students[i].name);
            return 0;  // 返回学生角色标识
        }
    }

    // 验证教师登录
    for (int i = 0; i < num_teachers; i++) {
        if (strcmp(username, teachers[i].username) == 0 && strcmp(password, teachers[i].password) == 0) {
            printf("教师登录成功!\n");
            printf("教师信息:姓名:%s\n", teachers[i].name);
            return 1;  // 返回教师角色标识
        }
    }

    printf("用户名或密码错误!\n");
    return -1;  // 登录失败
}

void addExam() {
    Exam exam;
    printf("请输入考试科目: ");
    scanf("%s", exam.subject);
    printf("请输入考试时间: ");
    scanf("%s", exam.time);
    printf("请输入考试题目(共%d道题):\n", MAX_QUESTIONS);
    for (int i = 0; i < MAX_QUESTIONS; i++) {
        printf("题目%d: ", i + 1);
        scanf(" %[^\n]", exam.questions[i]);
        printf("答案%d: ", i + 1);
        scanf("%s", exam.answers[i]);
        exam.correct_answers[i] = 0;
    }
    exam.total_students = 0;
    exams[num_exams++] = exam;
    printf("考试添加成功!\n");
}

void takeExam(User student) {
    printf("可供选择的考试科目与时间如下:\n");
    for (int i = 0; i < num_exams; i++) {
        printf("%d. %s(%s)\n", i + 1, exams[i].subject, exams[i].time);
    }

    int examChoice;
    printf("请选择要参加的考试编号: ");
    scanf("%d", &examChoice);

    if (examChoice >= 1 && examChoice <= num_exams) {
        Exam selectedExam = exams[examChoice - 1];
        printf("您选择了考试科目:%s\n", selectedExam.subject);
        printf("考试开始!请回答下列题目:\n");

        int score = 0;
        for (int i = 0; i < MAX_QUESTIONS; i++) {
            printf("题目%d: %s\n", i + 1, selectedExam.questions[i]);
            char answer[MAX_ANSWER_LENGTH];
            printf("请输入您的答案: ");
            scanf("%s", answer);
            if (strcmp(answer, selectedExam.answers[i]) == 0) {
                score += 2;
                selectedExam.correct_answers[i] = 1;
            }
        }

        selectedExam.scores[selectedExam.total_students++] = score;
        printf("考试结束!您的得分:%d\n", score);
    } else {
        printf("无效的选择!\n");
    }
}

void gradeExams(User teacher) {
    printf("请选择要批改的考试科目与时间:\n");
    for (int i = 0; i < num_exams; i++) {
        printf("%d. %s(%s)\n", i + 1, exams[i].subject, exams[i].time);
    }

    int examChoice;
    printf("请选择要批改的考试编号: ");
    scanf("%d", &examChoice);

    if (examChoice >= 1 && examChoice <= num_exams) {
        Exam selectedExam = exams[examChoice - 1];
        printf("您选择了批改考试科目:%s\n", selectedExam.subject);
        printf("学生成绩如下:\n");

        for (int i = 0; i < selectedExam.total_students; i++) {
            printf("学生%d得分:%d\n", i + 1, selectedExam.scores[i]);
        }
    } else {
        printf("无效的选择!\n");
    }
}

void sortStudentsByScore() {
    for (int i = 0; i < num_exams; i++) {
        for (int j = i + 1; j < num_exams; j++) {
            if (exams[i].scores[0] < exams[j].scores[0]) {
                Exam temp = exams[i];
                exams[i] = exams[j];
                exams[j] = temp;
            }
        }
    }
}

int main() {
    int choice;
    while (1) {
        printf("\n欢迎使用学生考试系统\n");
        printf("1. 学生注册\n");
        printf("2. 教师注册\n");
        printf("3. 登录\n");
        printf("4. 添加考试\n");
        printf("5. 学生参加考试\n");
        printf("6. 教师批改试卷\n");
        printf("7. 汇总学生成绩并排序\n");
        printf("8. 退出\n");
        printf("请选择操作: ");
        scanf("%d", &choice);

        switch (choice) {
            case 1:
                addStudent();
                break;
            case 2:
                addTeacher();
                break;
            case 3: {
                int role = login();
                if (role == 0) {
                    User student = students[num_students - 1];  // 最后一个注册的学生
                    int studentChoice;
                    while (1) {
                        printf("\n1. 参加考试\n");
                        printf("2. 查询成绩\n");
                        printf("3. 返回\n");
                        printf("请选择操作: ");
                        scanf("%d", &studentChoice);
                        switch (studentChoice) {
                            case 1:
                                takeExam(student);
                                break;
                            case 2:
                                printf("您的成绩如下:\n");
                                for (int i = 0; i < num_exams; i++) {
                                    Exam exam = exams[i];
                                    for (int j = 0; j < exam.total_students; j++) {
                                        if (strcmp(student.username, students[j].username) == 0) {
                                            printf("%s: %d\n", exam.subject, exam.scores[j]);
                                            break;
                                        }
                                    }
                                }
                                break;
                            case 3:
                                break;
                            default:
                                printf("无效的选择!\n");
                                break;
                        }
                        if (studentChoice == 3) {
                            break;
                        }
                    }
                } else if (role == 1) {
                    User teacher = teachers[num_teachers - 1];  // 最后一个注册的教师
                    int teacherChoice;
                    while (1) {
                        printf("\n1. 管理学生信息\n");
                        printf("2. 批改试卷\n");
                        printf("3. 返回\n");
                        printf("请选择操作: ");
                        scanf("%d", &teacherChoice);
                        switch (teacherChoice) {
                            case 1:
                                printf("暂未实现学生信息管理功能。\n");
                                break;
                            case 2:
                                gradeExams(teacher);
                                break;
                            case 3:
                                break;
                            default:
                                printf("无效的选择!\n");
                                break;
                        }
                        if (teacherChoice == 3) {
                            break;
                        }
                    }
                }
                break;
            }
            case 4:
                addExam();
                break;
            case 5:
                printf("请先登录学生账号再参加考试。\n");
                break;
            case 6:
                printf("请先登录教师账号再批改试卷。\n");
                break;
            case 7:
                sortStudentsByScore();
                printf("学生成绩汇总并按照从高到低排序:\n");
                for (int i = 0; i < num_exams; i++) {
                    Exam exam = exams[i];
                    printf("考试科目:%s(%s)\n", exam.subject, exam.time);
                    for (int j = 0; j < exam.total_students; j++) {
                        printf("学生%d得分:%d\n", j + 1, exam.scores[j]);
                    }
                }
                break;
            case 8:
                printf("谢谢使用,再见!\n");
                exit(0);
            default:
                printf("无效的选择!\n");
                break;
        }
    }

    return 0;
}

参考GPT

https://blog.csdn.net/XITMan/article/details/106667408

/*学生成绩管理系统,分为教师界面和学生界面,教师界面需要密码进入可以输入学生的信息,
修改学生的成绩,删除学生信息,查询学生的成绩,给成绩排序,查看所有学生信息,读取和保存学
生信息,读取学生的建议功能。学生需要提供学号和密码,成功进入后可以查看个人信息,修改密码,
给老师留言(这里老师添加完信息需要保存,然后学生才能根据老师的录入来登录),进入系统可以读取
上次存放在文件中的数据,这样能够更好的实现交互性。教师可以查看学生的建议,可以显示留下建议
的同学的学号。总体而言功能较为全面,可能有些许bug可以修改*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<getch.h>
#include<ctype.h>

void main_menu();          //主页面的显示
void teacher_menu();       //教师登录页面的显示
void student_menu();       //学生登录页面的显示
void advice_menu();        //对该程序的建议
void teacher_operation();  //教师的页面操作处理
void student_operation();  //学生的页面操作处理
void studentgrade_scanf();      //学生成绩录入
void inputallstudent();    //输出所有学生信息
void studentgrade_modify();//修改学生成绩
void student_information_p();//学生自我查询成绩输出
void quert_student();      //教师查询学生成绩
void studentgrade_sort(); //学生成绩排序
void save_studentinformation(); //保存学生信息到文件
void read_studentinformation(); //从文件读取学生信息
void delete_student();      //删除学生信息
void student_advice();       //学生建议查看
void student_advice_p();  //学生意见写入
void modify_grade();    //学生修改密码

typedef struct     //学生信息
{
    char s_name[10];    //名字
    unsigned int age;   //年龄
    char s_studentnumber[17]; //学号
    char sex[4];         //性别
    char major[10];       //专业
    unsigned int grade;//分数
    char s_password[18];//密码
}Student;

typedef struct _Node   //结点定义
{
    Student stu;     //结点信息
    struct _Node* next;   //下一个结点地址
}Node;

Node* g_pHead=NULL;//头结点
char s_number[17];

int main()
{
    char command;           //定义最开始页面的输入指令
    while(1)
    {
        system("clear");
        main_menu();         //显示页面
        command=getch();       //获取用户的指令
        switch(command)          //对指令进行分析
        {
            case '1':teacher_menu();break;  //跳转到教师的登录界面
            case '2':student_menu();break;    //跳转到学生的登录界面
            case '3':advice_menu();break;     //跳转到建议界面
            case '0':exit(0);                //退出
            case 'r':read_studentinformation();break;//读取数据
            default:printf("输入数据非法请重新输入!\n");
        }
    }
}

void main_menu()//主页面
{
    printf("\t\t\t----------------------------------\n");
    printf("\t\t\t|         学生管理系统1.0v       |\n");
    printf("\t\t\t----------------------------------\n");
    printf("\t\t\t|1.教师登录            2.学生登录|\n");
    printf("\t\t\t|0.退出系统            3.提出建议|\n");
    printf("\t\t\t|r.读入库中数据------------------|\n");
    printf("\t\t\t----------------------------------\n");
    printf("请输入指令:\n");
}

void teacher_menu()  //教师登录页面
{
    //存放教师的登录账号和密码
    char c_teacher_number[10]="xiong",c_teacher_mm[10]="250";
    char c_print_number[10],c_print_mm[10];//定义输入的账号和密码
    printf("请输入教师账号:");
    gets(c_print_number);
    //如果输入账号的长度过大或者不匹配提示重新输入
    if(strlen(c_print_number)>strlen(c_teacher_number)||\
        strcmp(c_print_number,c_teacher_number))  
    {
        printf("账号输入有误,请重新输入!\n");
        teacher_menu();
    }
    printf("请输入密码:");
    gets(c_print_mm);
    //如果输入密码的长度过大或者不匹配提示重新输入
    if(strlen(c_print_mm)>strlen(c_teacher_mm)||\
        strcmp(c_print_mm,c_teacher_mm))
    {
        printf("密码输入有误,请重新输入!\n");
        teacher_menu();
    }
    printf("登录成功,欢迎熊老师!\n");
    teacher_operation();//跳转到教师操作界面
}

void student_menu()  //学生登录页面
{
    char number[17],s_password[18];
    int sign=0;  //如果没找到学生的学号
    printf("请输入你的学号:");
    gets(number);
    Node *p=g_pHead;
    while(p!=NULL)
    {
        if(strcmp(p->stu.s_studentnumber,number)==0)
        {
            printf("请输入密码:");
            gets(s_password);
            if(strcmp(p->stu.s_password,s_password)!=0)
            {
                printf("密码错误!!!\n");
                student_menu();
            }
            else
            {
                strcpy(s_number,number);
                sign=1;
                printf("欢迎登录!!\n");
                student_operation();
            }
        }
        p=p->next;
    }
    if(sign==0)
    {
        printf("学号未找到!!!\n");
    }
    getch();
    system("clear");
    return;
}

void teacher_operation()//教师操作界面
{
    system("clear");
    printf("\t\t\t----------------------------------\n");
    printf("\t\t\t|           教师管理界面         |\n");
    printf("\t\t\t----------------------------------\n");
    printf("\t\t\t|1.录入学生信息    2.修改学生成绩|\n");
    printf("\t\t\t|3.显示所有学生信息4.学生成绩排名|\n");
    printf("\t\t\t|5.查询学生成绩    6.查看学生留言|\n");
    printf("\t\t\t|7.保存学生信息  8.读取学生信息|\n");
    printf("\t\t\t|9.删除学生信息    0.退出登录    |\n");
    printf("\t\t\t----------------------------------\n");
    char command;
    printf("请老师输入指令:\n");
    command=getch();
    switch(command)     //命令跳转
    {
        case '1':studentgrade_scanf();break;
        case '2':studentgrade_modify();break;
        case '3':inputallstudent();break;
        case '4':studentgrade_sort();break;
        case '5':quert_student();break;
        case '6':student_advice();break;
        case '7':save_studentinformation();break;
        case '8':read_studentinformation();break;
        case '9':delete_student();break;
        case '0':return;
    }
    system("clear");
    teacher_operation();
}

void studentgrade_scanf()//学生信息输入
{
    Node* p=(Node *)malloc(sizeof(Node)); //请求存储空间
    p->next=NULL;
    printf("请输入学生的姓名:\n");
    scanf("%s",p->stu.s_name);
    printf("请输入学生的年龄:\n");
    scanf("%d",&p->stu.age);
    printf("请输入学生的学号:\n");
    scanf("%s",p->stu.s_studentnumber);
    printf("请输入学生的性别:\n");
    scanf("%s",p->stu.sex);
    printf("请输入学生的专业:\n");
    scanf("%s",p->stu.major);
    printf("请输入学生的分数:\n");
    scanf("%d",&p->stu.grade);
    printf("请输入学生的登录密码\n");
    scanf("%s",p->stu.s_password);

    if(g_pHead==NULL)     //给第一个结点赋值
    {
        g_pHead=p;
    }
    else                   //将结点从已有结点的头部插入
    {
        p->next=g_pHead;
        g_pHead=p;
    }

    printf("成绩录入成功!\n");
    getch();
    getch();
    teacher_operation();
}

void studentgrade_modify()            //学生成绩修改
{
    char name[10];
    int grade;
    printf("请输入要修改的学生名字:");
    scanf("%s",name);
    Node* p=g_pHead;

    while(p!=NULL)                    //遍历链表
    {
        if(strcmp(name,p->stu.s_name)==0)       
        {
            printf("此学生的成绩为:%d\n",p->stu.grade);
            printf("要将此学生的成绩改为:");
            scanf("%d",&grade);
            if(grade>=0&&grade<=100)         //如果成绩合法可以修改
            {
                p->stu.grade=grade;
                printf("\n修改成功!\n");
            }
            else                               //不合法重新输入
            {
                printf("\n输入不合法,请重新输入!\n");
                system("clear");
                studentgrade_modify();
            }
        }
        p=p->next;
    }

    getchar();
}

void quert_student()   //教师查询学生成绩
{
    char studentnumber[17];
    int sign=0;//是否找到

    system("clear");
    printf("请输入你要查询的学生学号:\n");
    scanf("%s",studentnumber);

    Node* p=g_pHead;

    while(p!=NULL)
    {
        if(strcmp(p->stu.s_studentnumber,studentnumber)==0)
        {
            printf("\t\t\t----------------------------------\n");
            printf("\t\t\t姓名  年龄  学号  性别  专业  分数\n");
            printf("\t\t\t----------------------------------\n");
            printf("\t\t\t%5s  %2d  %5s  %4s  %5s  %3d\n",p->stu.s_name,p->stu.age,p->stu.s_studentnumber,p->stu.sex\
            ,p->stu.major,p->stu.grade);
            sign=1;
        }
        p=p->next;
    }

    if(sign==0)
    {
        printf("未找到该学生信息!!!\n");
    }

    getch();
    getch();
}

void inputallstudent()    //输出所有的学生信息
{
    //system("clear");
    printf("\t\t\t----------------------------------\n");
    printf("\t\t\t姓名  年龄  学号  性别  专业  分数\n");
    printf("\t\t\t----------------------------------\n");

    Node* p=g_pHead;

    while(p!=NULL)       //遍历链表输出学生信息
    {
        printf("\t\t\t%5s  %2d  %5s  %4s  %5s  %3d\n",p->stu.s_name,p->stu.age,p->stu.s_studentnumber,p->stu.sex\
        ,p->stu.major,p->stu.grade);
        p=p->next;
    }

    getchar();
}

void studentgrade_sort()    //学生成绩排序
{
    Node* p=g_pHead;
    Node* q=p+1;
    Student temp;

    for(p=g_pHead;p!=NULL;p=p->next)    //双循环来排序
    {
        for(q=p->next;q!=NULL;q=q->next)
        {
            if(p->stu.grade<q->stu.grade)
            {
                temp=p->stu;
                p->stu=q->stu;
                q->stu=temp;
            }
        }
    }

    inputallstudent();
}

void save_studentinformation()//保存学生信息
{
    FILE* p_file=fopen("student.txt","w+");

    if(p_file==NULL)    //打开失败
    {
        printf("打开文件失败!!");
        return;
    }

    Node* p=g_pHead;
    while(p!=NULL)    //遍历把数据读入
    {
        fprintf(p_file,"%s %d %s %s %s %d %s\n",p->stu.s_name,p->stu.age,p->stu.s_studentnumber,p->stu.sex\
        ,p->stu.major,p->stu.grade,p->stu.s_password);
        p=p->next;
    }
    printf("数据保存成功!\n");
    getch();
    fclose(p_file);
}

void read_studentinformation()    //读取文件中信息
{
    Node* p,*p2;
    p=p2=g_pHead;

    while(p2!=NULL)     //先将结点中已有的信息释放
    {
        p=p->next;
        free(p2);

        p2=p;
    }
    g_pHead=NULL;

    FILE* s_file=fopen("student.txt","r");

    if(s_file==NULL)
    {
        printf("读取文件失败!!");
        return;
    }

    while(!feof(s_file))//读取文件的信息
    {
        Node* ptemp = (Node *)malloc(sizeof(Node));//申请内存因为前面释放了
        fscanf(s_file,"%s %d %s %s %s %d %s\n",ptemp->stu.s_name,&ptemp->stu.age,ptemp->stu.s_studentnumber,ptemp->stu.sex\
        ,ptemp->stu.major,&ptemp->stu.grade,ptemp->stu.s_password);//按格式读取文件中的信息

        if(g_pHead==NULL)//如果头结点为空则讲数据给头结点
        {
            g_pHead=ptemp;
            p=g_pHead;
        }
        else//不是头结点就把信息给p的下一个结点
        {
            p->next=ptemp;
            p=p->next;
            p->next=NULL;
        }
    }
    printf("读取成功\n");
    getch();
    fclose(s_file);
}

void delete_student()   //删除某个学生的信息
{
    char s_studentnumber[17];
    printf("请输入要删除的学生学号:\n");
    scanf("%s",s_studentnumber);
    Node* p = g_pHead;
    Node* p2;
    if(strcmp(g_pHead->stu.s_studentnumber,s_studentnumber)==0)
    //如果输入的学号跟头结点一样就保存头结点的地址,然后把头结点赋值为下一个结点的地址,然后把头结点的地址释放
    {
        p2=g_pHead;
        g_pHead=g_pHead->next;
        free(p2);
        printf("删除成功!!\n");
        getch();
        return;
    }
    //如果不是头结点就遍历,如果一个结点的下一个结点是要找的就保存他的地址,然后把该节点的地址赋值为下一个地址,然后将他的地址释放
    while(p->next!=NULL)
    {
        if(strcmp(p->next->stu.s_studentnumber,s_studentnumber)==0)
        {
            p2=p->next;
            p->next=p->next->next;
            free(p2);
            printf("删除成功!!\n");
            getch();
            return;
        }
        p=p->next;

        if(p->next==NULL)
        {
            break;
        }
    }
    if(p==NULL)
    {
        printf("没有找到该学员的信息!!");
    }
    getch();

}

void student_advice()//读取学生建议
{
    FILE* p_file = fopen("studentadvice.txt","r");
    fseek( p_file , 0 , SEEK_END );
    int file_size;
    file_size = ftell(p_file);
    char *tmp;
    fseek( p_file , 0 , SEEK_SET);
    tmp =  (char *)malloc( file_size * sizeof( char ) );
    fread( tmp , file_size , sizeof(char) , p_file);
    printf("%s" , tmp );
    getch();
    fclose(p_file);
}

void student_operation()   //学生操作页面
{
    system("clear");
    char temp;
    printf("\t\t\t----------------------------------\n");
    printf("\t\t\t|           学生管理界面         |\n");
    printf("\t\t\t----------------------------------\n");
    printf("\t\t\t|1.显示我的信息      2.给老师留言|\n");
    printf("\t\t\t|3.返回主页          4.退出系统  |\n");
    printf("\t\t\t|5.修改密码                      |\n");
    printf("\t\t\t----------------------------------\n");
    printf("请继续你的操作:\n");
    temp=getchar();
    switch(temp)
    {
        case '1':student_information_p();break;
        case '2':student_advice_p();break;
        case '4':exit(0);
        case '3':return;
        case '5':modify_grade();break;
        default:printf("输入有误!!\n");student_operation();
    }
}

void student_information_p()   //学生信息显示
{
    Node* p=g_pHead;


    while(p!=NULL)                    //遍历链表
    {
        if(strcmp(s_number,p->stu.s_studentnumber)==0)
        {
            printf("\t\t\t姓名%s  年龄%d  学号%s  性别%s  专业%s  分数%d\n",p->stu.s_name,p->stu.age,p->stu.s_studentnumber,p->stu.sex\
            ,p->stu.major,p->stu.grade);
        }
        p=p->next;
    }
    getch();
    getch();
    student_operation();
}

void student_advice_p()     //学生建议写入保存
{
    char studentadvice[200];
    printf("请输入你对老师的建议:\n");
    FILE* p_file = fopen("studentadvice.txt","a");
    scanf("%s",studentadvice);
    fprintf(p_file,"%s %s\n",s_number,studentadvice);
    fclose(p_file);
    p_file=NULL;
    printf("写入成功!!!\n");
    getch();
    getch();
    student_operation();
}

void modify_grade()
{
    char password[18],newpassword[18];
    Node* p = g_pHead;
    while(p!=NULL)
    {
        if(strcmp(p->stu.s_studentnumber,s_number)==0)
        {
            printf("请输入原密码:\n");
            getchar();
            gets(password);
            if(strcmp(p->stu.s_password,password)==0)
            {
                printf("请输入新的密码:\n");
                gets(newpassword);
                if(strcmp(p->stu.s_password,newpassword)==0)
                {
                    printf("密码相同,修改失败!!!");
                    break;
                }
                else
                {
                    strcpy(p->stu.s_password,newpassword);
                    printf("修改成功!!!");
                    break;
                }
            }
        }
        p=p->next;
    }

    getch();
    student_operation();
}

void advice_menu() //对系统的建议
{
    char advice[200];
    FILE* p_file = fopen("advice.txt","a");
    system("clear");
    printf("您的建议是(最多可输入200字):\n");
    scanf("%s",advice);
    getchar();
    fprintf(p_file,"%s\n",advice);
    fclose(p_file);
    p_file=NULL;
    printf("\n感谢您的建议,我们将会做的更好!\n");
    getch();
}


好复杂的说

首先,我们可以考虑使用C语言来实现这个学生考试系统。你可以利用C语言的数据结构和函数来组织和管理系统的各个功能模块。

学生和教师的登录验证:
可以通过输入用户名和密码来验证学生和教师的身份。
可以使用文件存储学生和教师的账号信息,比如用户名和密码。

学生功能:
学生登录后,可以选择考试和查询成绩。
考试功能:显示可供考试的科目和时间,学生选择其中一个科目后进入考试界面。
考试界面:显示考试的题目,学生需要输入答案。
考试结束后,学生的选择题答案与预先提供的标准答案进行匹配,自动批改并计算得分。

教师功能:
教师登录后,可以选择管理学生信息和批改试卷。
学生管理功能:可以添加、删除和修改学生的信息,比如学号、姓名等。
试卷批改功能:显示学生的答案,教师对每道题目进行评分,分值范围为0-10分。
学生成绩汇总与排序:根据学生的考试得分进行汇总,并按照从高到低的顺序进行排序。

实现这个学生考试系统,你需要具备一些基本的C语言编程知识,如文件操作、字符串处理、结构体和数组的使用等。你可以按照以下步骤进行开发:

设计数据结构:定义学生和教师的结构体,包括学号、姓名、密码等信息。
实现登录验证:编写登录函数,读取存储的账号信息,并与用户输入进行比较验证。
实现学生功能:
编写函数显示可供考试的科目和时间。
编写函数显示考试题目并获取学生的答案。
编写函数自动批改学生的答案并计算得分。
实现教师功能:
编写函数管理学生信息,包括添加、删除和修改学生的信息。
编写函数批改学生的答案并计算得分。
编写函数对学生成绩进行汇总和排序。

以上是一个初步的设计和开发思路,你可以根据自己的实际需求进行调整

注释见代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定义学生结构体
typedef struct {
    int id;
    char name[20];
    char password[20];
} Student;

// 定义教师结构体
typedef struct {
    int id;
    char name[20];
    char password[20];
} Teacher;

// 定义科目结构体
typedef struct {
    int id;
    char name[20];
    char time[20];
} Subject;

// 定义题目结构体
typedef struct {
    int id;
    char content[100];
    char answer[20];
} Question;

// 定义成绩结构体
typedef struct {
    int student_id;
    int subject_id;
    char answer[20];
    int score;
} Score;

// 定义学生数组和学生数量
Student students[100];
int student_count = 0;

// 定义教师数组和教师数量
Teacher teachers[10];
int teacher_count = 0;

// 定义科目数组和科目数量
Subject subjects[10];
int subject_count = 0;

// 定义题目数组和题目数量
Question questions[100];
int question_count = 0;

// 定义成绩数组和成绩数量
Score scores[1000];
int score_count = 0;

// 学生登录验证函数
int student_login(char *name, char *password) {
    int i;
    for (i = 0; i < student_count; i++) {
        if (strcmp(students[i].name, name) == 0 && strcmp(students[i].password, password) == 0) {
            return students[i].id;
        }
    }
    return -1;
}

// 教师登录验证函数
int teacher_login(char *name, char *password) {
    int i;
    for (i = 0; i < teacher_count; i++) {
        if (strcmp(teachers[i].name, name) == 0 && strcmp(teachers[i].password, password) == 0) {
            return teachers[i].id;
        }
    }
    return -1;
}

// 添加学生函数
void add_student(int id, char *name, char *password) {
    Student student = {id, name, password};
    students[student_count++] = student;
}

// 添加教师函数
void add_teacher(int id, char *name, char *password) {
    Teacher teacher = {id, name, password};
    teachers[teacher_count++] = teacher;
}

// 添加科目函数
void add_subject(int id, char *name, char *time) {
    Subject subject = {id, name, time};
    subjects[subject_count++] = subject;
}

// 添加题目函数
void add_question(int id, char *content, char *answer) {
    Question question = {id, content, answer};
    questions[question_count++] = question;
}

// 添加成绩函数
void add_score(int student_id, int subject_id, char *answer, int score) {
    Score s = {student_id, subject_id, answer, score};
    scores[score_count++] = s;
}

// 查询科目函数
void list_subjects() {
    int i;
    for (i = 0; i < subject_count; i++) {
        printf("%d. %s (%s)\n", subjects[i].id, subjects[i].name, subjects[i].time);
    }
}

// 查询题目函数
void list_questions(int subject_id) {
    int i;
    for (i = 0; i < question_count; i++) {
        if (questions[i].id == subject_id) {
            printf("%d. %s\n", i + 1, questions[i].content);
        }
    }
}

// 学生考试函数
void student_exam(int student_id) {
    int subject_id;
    list_subjects();
    printf("请选择科目:");
    scanf("%d", &subject_id);
    list_questions(subject_id);
    printf("请输入答案:");
    char answer[20];
    scanf("%s", answer);
    // 计算得分
    int i, score = 0;
    for (i = 0; i < question_count; i++) {
        if (questions[i].id == subject_id && strcmp(questions[i].answer, answer) == 0) {
            score += 2;
        }
    }
    add_score(student_id, subject_id, answer, score);
    printf("您的得分为:%d\n", score);
}

// 教师批改试卷函数
void teacher_grade(int teacher_id) {
    int i;
    for (i = 0; i < score_count; i++) {
        if (scores[i].score == 0) {
            printf("学生%d的%s科目答案为:%s,请输入分数:", scores[i].student_id, subjects[scores[i].subject_id].name, scores[i].answer);
            int score;
            scanf("%d", &score);
            scores[i].score = score;
        }
    }
}

// 按成绩排序函数
void sort_scores() {
    int i, j;
    for (i = 0; i < score_count - 1; i++) {
        for (j = 0; j < score_count - i - 1; j++) {
            if (scores[j].score < scores[j + 1].score) {
                Score temp = scores[j];
                scores[j] = scores[j + 1];
                scores[j + 1] = temp;
            }
        }
    }
}

// 主函数
int main() {
    // 添加学生
    add_student(1, "张三", "123456");
    add_student(2, "李四", "123456");
    add_student(3, "王五", "123456");
    // 添加教师
    add_teacher(1, "张老师", "123456");
    // 添加科目
    add_subject(1, "数学", "2021-05-01 09:00");
    add_subject(2, "英语", "2021-05-02 09:00");
    // 添加题目
    add_question(1, "1+1=?", "2");
    add_question(1, "2+2=?", "4");
    add_question(2, "Hello, world!", "Hello,world!"); 
    add_question(2, "What's your name?", "My name is John."); 
    // 学生考试
    int student_id = login_student("张三", "123456"); 
    student_exam(student_id); 
    // 教师批改试卷 
    int teacher_id = login_teacher("张老师", "123456"); 
teacher_grade(teacher_id); 
// 按成绩排序 sort_scores(); 
// 输出成绩单 
printf("成绩单:\n"); 
int i; for (i = 0; i < score_count; i++) { printf("学生%d的%s科目得分为:%d\n", scores[i].student_id, subjects[scores[i].subject_id].name, scores[i].score); } return 0; }

以前学的c语言,就做的这个程序,可以帮你找到代码

C语言实现

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <iostream>
#include <vector>
#include <string.h>
using namespace std;

struct Student
{
    int ID;
    char name[20];
    float chinese=0.0;
    float math=0.0;
};

int main()
{
    vector<Student> Students;
    while(true)
    {
        int n=0;
        printf("考试系统\n");
        printf("1.学生信息录入\n");
        printf("2.查询学生成绩\n");  //以学号进行查询
        printf("3.语文考试\n");
        printf("4.数学考试\n");
        scanf("%d",&n);

        if(n==1)
        {
            printf("请依次输入学生的学号和姓名,用空格分开\n");
            Student stu;
            scanf("%d%s",&stu.ID,&stu.name);
            Students.push_back(stu);
            printf("学生信息录入成功\n");

        }else if(n==2)
        {
            printf("请输入需要查询的学生学号\n");
            int id;
            scanf("%d",&id);
            bool isFind=false;
            for(int i=0;i<Students.size();++i)
            {
                if(id==Students[i].ID)
                {
                    printf("学号:%d,姓名:%s,语文成绩:%.1f,数学成绩:%.1f\n",Students[i].ID,
                           Students[i].name,Students[i].chinese,Students[i].math);
                    isFind=true;
                }
            }
            if(!isFind)
            {
                printf("学生不存在\n");
            }

        }else if(n==3)
        {
            int id;
            printf("请输入需要考试的学号\n");
            scanf("%d",&id);
            bool isFind=false;
            for(int i=0;i<Students.size();++i)
            {
                if(id==Students[i].ID)
                {
                    isFind=true;
                    printf("语文考试,一共又2题,每题50分\n");
                    printf("第一题\n");
                    printf("李白被称为什么?\n");
                    char ti1[20];
                    char ti1key[20]="诗仙";
                    scanf("%s",&ti1);
                    int Source=0;
                    if(strcmp(ti1,ti1key)==0)
                    {
                        Source+=50;
                        printf("回答正确\n");
                    }else
                    {
                        printf("回答错误\n");
                    }
                    printf("第二题\n");
                    printf("相思这首诗是谁写的\n");
                    char ti2[20];
                    char ti2key[20]="王维";
                    scanf("%s",&ti2);
                    if(strcmp(ti2,ti2key)==0)
                    {
                        Source+=50;
                        printf("回答正确\n");
                    }else
                    {
                        printf("回答错误\n");
                    }
                    printf("考试结束\n");
                    printf("你的语文分数是%d分",Source);
                    Students[i].chinese=Source;
                }
            }
            if(!isFind)
            {
                printf("学生不存在,请录入信息后再进行考试\n");
            }

        }else if(n==4)
        {
            int id;
            printf("请输入需要考试的学号\n");
            scanf("%d",&id);
            bool isFind=false;
            for(int i=0;i<Students.size();++i)
            {
                if(id==Students[i].ID)
                {
                    isFind=true;
                    printf("数学考试,一共又2题,每题50分\n");
                    printf("第一题\n");
                    printf("长方形的长为10,宽为5,则长方形的面积为\n");
                    printf("A 50    B 30\n");
                    char ti1[20];
                    char ti1key[20]="A";
                    char tikey1[20]="a";
                    scanf("%s",&ti1);
                    int Source=0;
                    if(strcmp(ti1,ti1key)==0||strcmp(ti1,tikey1)==0)
                    {
                        Source+=50;
                        printf("回答正确\n");
                    }else
                    {
                        printf("回答错误\n");
                    }
                    printf("第二题\n");
                    printf("三角形的三条边分别是3,4,5,改三角形是什么三角形\n");
                    printf("A 等腰三角形     B 等边三角形 C 直角三角形\n");
                    char ti2[20];
                    char ti2key[20]="C";
                    char ti2key2[20]="c";
                    scanf("%s",&ti2);
                    if(strcmp(ti2,ti2key)==0||strcmp(ti2,ti2key2)==0)
                    {
                        Source+=50;
                        printf("回答正确\n");
                    }else
                    {
                        printf("回答错误\n");
                    }
                    printf("考试结束\n");
                    printf("你的数学分数是%d分",Source);
                    Students[i].math=Source;
                }
            }
            if(!isFind)
            {
                printf("学生不存在,请录入信息后再进行考试\n");
            }

        }
        else
        {
            printf("操作有误,请重新操作\n");
        }
    }
}



完整的系统挺复杂的,你可以说说具体哪里不懂,进行具体问题的解答

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7445523
  • 除此之外, 这篇博客: C语言实现八大排序算法详解及其性能之间的中的 这里需要对堆有一定的了解,堆就是一个比较特殊的完全二叉树,在最大堆里,每个节点的值都大于其左右两个孩子节点的值。这就是最大堆。反之就是最小堆。拿最大堆举例子,每次堆顶的元素值,不就是当前数列的最大吗?这不就成选择排序里的简单排序了吗?找完之后,将他和完全二叉树里最后一个结点的值进行交换,然后做一个自顶向下的自我调整,将他再次调整成一个完全二叉堆。第二次取最大的树,这时我们需要将上一次找到的结点屏蔽掉,不然会陷入一个死循环。无数次找完之后,再按层序的思想将二叉树里的数据遍历到一个数组当中,这时的数组为一个有序的数组。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    算法思想


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

关于C语言实现的考试系统,网上挺多的资料,比如咱CSDN上就有很多博文可以参考,代码也基本可以使用,比如:
C语言实现的简易考试系统:https://blog.csdn.net/weixin_43676892/article/details/125367381
基于C语言的学生考试系统:https://blog.csdn.net/weixin_45277561/article/details/103960457
建议你再这些源代码的基础上,结合你的需求稍作修改,以达到你的需求

借鉴文心一言:
我这测过了,您试下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定义学生和教师的结构体
typedef struct {
    int id; // 学生或教师的ID
    char name[20]; // 姓名
} StudentOrTeacher;

// 定义考试信息结构体
typedef struct {
    int subject_id; // 科目ID
    int start_time; // 开始时间
    int end_time; // 结束时间
} ExamInfo;

// 定义考试题目结构体
typedef struct {
    int question_id; // 题目ID
    char content[100]; // 题目内容
    int answer[10]; // 正确答案(1-10)
} ExamQuestion;

// 定义学生信息结构体
typedef struct {
    int id; // 学生ID
    int score; // 总分
} StudentInfo;

// 定义学生考试信息结构体
typedef struct {
    int student_id; // 学生ID
    int exam_id; // 考试ID
    int score; // 该题得分(0-10)
} StudentExamInfo;

// 定义学生成绩信息结构体
typedef struct {
    int student_id; // 学生ID
    int total_score; // 总分(所有科目分数之和)
} StudentGradeInfo;

// 定义考试列表结构体,用于存储所有考试信息
typedef struct {
    int count; // 考试数量
    ExamInfo exams[10]; // 所有考试信息数组,每个元素代表一个考试信息,包括科目ID、开始时间和结束时间等信息。注意,这里只存储了考试的时间段,具体考试题目需要在考试时动态生成。
} ExamList;

// 定义学生列表结构体,用于存储所有学生信息和成绩信息。注意,这里只存储了学生的基本信息和总分,具体考试信息和成绩需要在考试时动态生成。同时,为了方便查找和管理,将学生ID作为索引。

typedef struct {
    int count; // 学生数量
    StudentOrTeacher students[10]; // 所有学生信息数组,每个元素代表一个学生,包括ID、姓名等信息。注意,这里只存储了学生的基本信息。

具体考试信息和成绩需要在考试时动态生成。同时,为了方便查找和管理,将学生ID作为索引。StudentGradeInfo grades[10]; // 所有学生成绩信息数组,每个元素代表一个学生的成绩信息,包括学生ID、总分等信息。同样地,为了方便查找和管理,将学生ID作为索引。

你的同门师兄弟也来了,一模一样的问题。。。。。。https://ask.csdn.net/questions/7961418