你好,我现在要用C语言做一个学生考试系统。
首先,要做一个学生和教师的登录验证,登录之后会显示学生和教师的基本信息。
当学生登录后,学生可以选择考试和查询成绩。若学生选择考试,则显示可以考试的科目与时间,当学生选择其中一个科目并进入考试,则显示考试的题目,学生需要输入自己的答案,到截止时间,考试结束,学生的选择题答案,与预先提供的标答,自动匹配批改,每道题2分。
教师登录后,可以选择管理学生信息,进行修改,包括添加、删除。也可以选择批改试卷,对学生的答案进行打分,分值为0-10分。
最后对学生成绩进行汇总,并按从高到低进行排序。
这样?
#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;
}
#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");
}
}
}
完整的系统挺复杂的,你可以说说具体哪里不懂,进行具体问题的解答
不知道你这个问题是否已经解决, 如果还没有解决的话:关于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