#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<stdbool.h>
typedef struct Student
{
int id;
char name[20];
char attendance[4][10]; // 出勤、迟到、早退、缺席
struct Student* next;
} Student;
typedef struct Class
{
int class_id;
char category[20];
int student_count;
Student* students;
char monitor[20];
char other_leaders[20][20];
} Class;
// 增加学生信息
void add_student(Class* class, int id, char* name)
{
Student* new_student = (Student*)malloc(sizeof(Student));
new_student->id = id;
strcpy(new_student->name, name);
new_student->next = NULL;
if (class->students == NULL)
{
class->students = new_student;
}
else
{
Student* temp = class->students;
while (temp->next != NULL) //temp 是 0x7FF
{
temp = temp->next;
}
temp->next = new_student;
}
class->student_count++;
}
// 删除学生信息
void delete_student(Class* class, int id)
{
Student* temp = class->students;
Student* prev = NULL;
while (temp != NULL)
{
if (temp->id == id)
{
if (prev == NULL)
{
class->students = temp->next;
}
else
{
prev->next = temp->next;
}
free(temp);
class->student_count--;
return;
}
prev = temp;
temp = temp->next;
}
}
// 修改学生信息
void update_student(Class* class, int id, char* new_name)
{
Student* temp = class->students;
while (temp != NULL)
{
if (temp->id == id)
{
strcpy(temp->name, new_name);
return;
}
temp = temp->next;
}
}
// 考勤
void attend(Class* class, int id, char* status)
{
Student* temp = class->students;
while (temp != NULL)
{
if (temp->id == id)
{
strcpy(temp->attendance[0], status);
return;
}
temp = temp->next;
}
}
// 按班级、学号、类别查询
void query(Class* class, int id, char* category)
{
int i;
for (i = 0; i < class->student_count; i++)
{
if (class->students[i].id == id && strcmp(class->category, category) == 0)
{
printf("学号: %d, 姓名: %s, 出勤: %s, 迟到: %s, 早退: %s, 缺席: %s\n", class->students[i].id, class->students[i].name, class->students[i].attendance[0], class->students[i].attendance[1], class->students[i].attendance[2], class->students[i].attendance[3]);
break;
}
}
}
void scanf_student(Class* class)
{
int n;
printf("请输入学生数量:");
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
int id;
char name[20] ="";
printf("请输入第%d个学生的学号和姓名:", i + 1);
int i = scanf("%d %s", &id, name);
add_student(&class, id, name);
}
int m;
printf("请输入考勤记录数量:");
scanf("%d", &m);
for (int i = 0; i < m; i++)
{
int id;
char status[10];
printf("请输入第%d条考勤记录的学号和出勤状态:", i + 1);
scanf("%d %s", &id, status);
attend(&class, id, status);
}
int q;
printf("请输入查询次数:");
scanf("%d", &q);
for (int i = 0; i < q; i++)
{
int id;
printf("请输入要查询的学生学号:");
scanf("%d", &id);
query(&class, id, "研究生班");
}
}
int main() {
Class class;
strcpy(class.category, "研究生班");
class.student_count = 0;
class.students = NULL;
char new_name[20] = "";
char status[20] = "";
char category[20] = "";
int id = 0;
int choice;
while (true)
{
printf("**********************\n");
printf("*******系统菜单*******\n");
printf("**********************\n");
printf("* 1.添加 *\n");
printf("* 2.删除 *\n");
printf("* 3.修改 *\n");
printf("* 4.考勤 *\n");
printf("* 0.退出 *\n");
printf("**********************\n");
printf("5.按班级、学号、类别查询\n");
printf("请输入您在【0,5】之内的选择:");
int result = scanf("%d", &choice);
switch (choice)
{
case 1:
//添加操作
scanf_student(&class);
break;
case 2:
//删除操作
printf("请输入要删除的学生学号:");
scanf("%d", &id);
delete_student(&class, id);
break;
case 3:
//修改操作
printf("请输入要修改的学生学号和新姓名:");
scanf("%d %s", &id, new_name);
update_student(&class, id, new_name);
break;
case 4:
//考勤操作
printf("请输入要考勤的学生学号和出勤状态(出勤、迟到、早退、缺席):");
scanf("%d %s", &id, status);
attend(&class, id, status);
break;
case 5:
// 按班级、学号、类别查询
printf("请输入要查询的学生学号:");
scanf("%d", &id);
query(&class, id, category);
break;
case 0:
//退出程序
return 0;
default:
//已输入其他数字
printf("\n");
printf("无效的选择,请您重新选择!!!");
printf("\n");
break;
}
}
return 0;
}