制作学生管理系统,能实现信息录入、删除学生休息、修改信息、查询信息、排序;信息包括:学号、姓名、性别、班级、本学期三门以上学科成绩、平均成绩、总成绩、最高成绩、最低成绩;排序能够按照学号,姓名,或各科成绩进行排序,等级分组;显示所有记录;文件系统读写。并在代码后面注释
写不完的学生管理系统。你是否有翻阅csdn论坛呢,这里各种语言的都有现成的
学生管理系统真多
解决了没
纯手写代码,有帮助望采纳
#include<stdio.h>
#include<windows.h>
#define Max_stu_num 25
#define obj_num 4
char File_Path[]="score_data.txt";
typedef struct
{
char Name[25]; //姓名
int Number; //学号
int score[obj_num]; //计算机成绩//数学成绩//C语言成绩//英语成绩//
int Sum_score; //总成绩
} Stu;
char obj_name[obj_num][25]= {"计算机","数学","C语言","英语"};
double ave[obj_num];
double stu_avescore[Max_stu_num]; //平均成绩
Stu stu[Max_stu_num];
int count_stu=0;
void cal_sum_score(int index)
{
stu[index].Sum_score=0;
for(int j=0; j<obj_num; j++)
{
stu[index].Sum_score+=stu[index].score[j];
}
}
void input()
{
printf("输入姓名:\n");
fflush(stdin);
scanf("%s",stu[count_stu].Name);
printf("输入学号:\n");
fflush(stdin);
scanf("%d",&stu[count_stu].Number);
for(int i=0; i<obj_num; i++)
{
printf("输入%s成绩:\n",obj_name[i]);
fflush(stdin);
scanf("%d",&stu[count_stu].score[i]);
}
cal_sum_score(count_stu);
count_stu++;
}
void output_head()
{
printf("姓名\t学号\t");
for(int i=0; i<obj_num; i++)
{
printf("%s\t",obj_name[i]);
}
printf("总分\n");
}
void outputOne(int index)
{
printf("%s\t",stu[index].Name);
printf("%d\t",stu[index].Number);
for(int i=0; i<obj_num; i++)
{
printf("%d\t",stu[index].score[i]);
}
printf("%d\t",stu[index].Sum_score);
printf("\n");
}
void output(int n)
{
output_head();
int j;
for(j=0; j<n; j++)
{
outputOne(j);
}
printf("---------------------------------------------\n");
}
int search(int number)
{
int i,p=-1;
for(i=0; i<count_stu; i++)
{
if(stu[i].Number==number)
{
p=i;
return p;
}
}
return -1;
}
void modify(int number)
{
int index=search(number);
if(index==-1)
{
printf("找不到该学号\n");
}
else
{
printf("学号%d的学生是第%d位\n",number,index+1);
output_head();
outputOne(index);
puts("修改信息");
printf("输入姓名:\n");
fflush(stdin);
scanf("%s",stu[index].Name);
printf("输入学号:\n");
fflush(stdin);
scanf("%d",&stu[index].Number);
stu[index].Sum_score=0;
for(int i=0; i<obj_num; i++)
{
printf("输入%s成绩:\n",obj_name[i]);
fflush(stdin);
scanf("%d",&stu[index].score[i]);
stu[index].Sum_score+=stu[index].score[i];
}
cal_sum_score(index);
printf("修改成功\n");
}
}
void del(int number)
{
int index=search(number);
if(index==-1)
{
printf("找不到该学号\n");
}
else
{
printf("学号%d的学生是第%d位\n",number,index+1);
output_head();
outputOne(index);
int i;
for(i=index; i<count_stu-1; i++)
{
stu[i]= stu[i+1];
}
printf("删除成功\n");
count_stu--;
}
}
double calave()
{
int score_sum[obj_num]= {0};
for(int i=0; i<count_stu; i++)
{
for(int j=0; j<obj_num; j++)
{
score_sum[j]+=stu[i].score[j];
}
}
for(int j=0; j<obj_num; j++)
{
ave[j]=(double)score_sum[j]/count_stu;
}
}
void save()
{
FILE *fp;
fp = fopen(File_Path,"w");
if(fp == NULL)
{
printf("error!");
}
else
{
for(int j=0; j<count_stu; j++)
{
fprintf(fp,"%s %d ",stu[j].Name,stu[j].Number);
for(int i=0; i<obj_num; i++)
{
fprintf(fp,"%d ",stu[j].score[i]);
}
fprintf(fp,"%d\n",stu[j].Sum_score);
}
printf("文件写入成功\n");
}
fclose(fp);
}
void read()
{
FILE *fp;
fp = fopen(File_Path,"r");
int count=0;
if(fp == NULL)
{
printf("error!");
}
else
{
int flag=2;
int j=count_stu;
do
{
flag=fscanf(fp,"%s %d ",stu[j].Name,&stu[j].Number);
for(int i=0; i<obj_num; i++)
{
fscanf(fp,"%d ",&stu[j].score[i]);
}
fscanf(fp,"%d\n",&stu[j].Sum_score);
if(flag!=-1)
{
cal_sum_score(count);
count++;
}
j++;
}
while(flag>0);
printf("文件读取成功\n");
count_stu+=count;
}
fclose(fp);
}
void swap_stu_inf(Stu stu[],int a,int b)
{
Stu tem=stu[a];
stu[a]=stu[b];
stu[b]=tem;
}
void BubbleSort_Sum_number(Stu stu[],int n)
{
int j,k;
Stu t;
for(j=0; j<n-1; j++)
{
for(k=0; k<n-j-1; k++)
{
if(stu[k].Number>stu[k+1].Number)
{
t=stu[k];
stu[k]=stu[k+1];
stu[k+1]=t;
}
}
}
}
void BubbleSort_Sum_score(Stu stu[],int n)
{
int j,k;
Stu t;
for(j=0; j<n-1; j++)
{
for(k=0; k<n-j-1; k++)
{
if(stu[k].Sum_score<stu[k+1].Sum_score)
{
t=stu[k];
stu[k]=stu[k+1];
stu[k+1]=t;
}
}
}
}
void out_aveScore()
{
printf("平均分\t\t");
for(int i=0; i<obj_num; i++)
{
printf("%.2lf\t",ave[i]);
}
printf("\n");
}
void cal_stu_avescore()
{
for(int i=0; i<count_stu; i++)
{
stu_avescore[i]=(double)stu[i].Sum_score/obj_num;
}
}
void color(short x) //自定义函根据参数改变颜色
{
if(x>=0 && x<=15)//参数在0-15的范围颜色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x); //只有一个参数,改变字体颜色
else//默认的颜色白色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
void put_stu_ave_score()
{
cal_stu_avescore();
printf("姓名\t学号\t平均分\n");
for(int i=0; i<count_stu; i++)
{
if(stu_avescore[i]<60)
{
color(6);
}
printf("%s\t%d\t%.2f\n",stu[i].Name,stu[i].Number,stu_avescore[i]);
color(7);
}
//color(7);
}
void sort_menu()
{
puts("--------1.按学号排序------------------------------");
puts("--------2.按总分排序------------------------------");
puts("--------3.返回主菜单------------------------------");
int option=0;
fflush(stdin);
scanf("%d",&option);
if(option==2)
{
system("cls");
puts("按总分排序");
BubbleSort_Sum_score(stu,count_stu);
output(count_stu);
}
else if(option==1)
{
system("cls");
puts("按学号排序");
BubbleSort_Sum_number(stu,count_stu);
output(count_stu);
}
else if(option==3)
{
return;
}
}
void insert()
{
puts("在已按学号有序的提下,将学生插入到合适的位置");
puts("输入学号:");
Stu tem;
scanf("%d",&tem.Number);
int index=count_stu;
BubbleSort_Sum_number(stu,count_stu);
for(int i=0; i<count_stu; i++)
{
if(stu[i].Number>=tem.Number)
{
index=i;
break;
}
}
printf("学号:%d 在第 %d 位\n",tem.Number,index+1);
printf("输入姓名:\n");
fflush(stdin);
scanf("%s",tem.Name);
for(int i=0; i<obj_num; i++)
{
printf("输入%s成绩:\n",obj_name[i]);
fflush(stdin);
scanf("%d",&tem.score[i]);
}
for(int i=count_stu+1; i>index; i--)
{
stu[i]=stu[i-1];
}
stu[index]=tem;
cal_sum_score(index);
count_stu++;
}
void menu()
{
int option=0;
while(option!=-1)
{
system("cls");
printf("--------------------------------------------------------------------------------\n");
printf("------学生成绩管理--------------------------------------------------------------\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("------9.文件读入 --------------------------------------------------------------\n");
printf("------10.保存至文件--------------------------------------------------------------\n");
printf("------11.退出 -----------------------------------------------------------------\n");
printf("--------------------------------------------------------------------------------\n");
printf("输入选项:\n");
fflush(stdin);
scanf("%d",&option);
if(option==1)
{
system("cls");
input();
system("pause");
}
else if(option==2)
{
system("cls");
output(count_stu);
system("pause");
}
else if(option==3)
{
system("cls");
sort_menu();
system("pause");
}
else if(option==4)
{
system("cls");
int number;
printf("输入要查找的学号:");
fflush(stdin);
scanf("%d",&number);
int index=search(number);
if(index==-1)
{
printf("查找失败\n");
}
else
{
printf("查找成功\n");
output_head();
outputOne(index);
}
system("pause");
}
else if(option==5)
{
system("cls");
output(count_stu);
int number;
printf("输入要修改成绩的学生对应的学号:");
scanf("%d",&number);
modify(number);
system("pause");
}
else if(option==6)
{
system("cls");
int number;
printf("输入要删除的学号:");
scanf("%d",&number);
del(number);
puts("完成");
system("pause");
}
else if(option==7)
{
system("cls");
output(count_stu);
calave();
out_aveScore();
system("pause");
}
else if(option==8)
{
system("cls");
insert();
system("pause");
}
else if(option==9)
{
system("cls");
read();
system("pause");
}
else if(option==10)
{
system("cls");
save();
system("pause");
}
}
}
int main()
{
menu();
return 0;
}
可以使用fclose函数来关闭一个文件,该函数原型为
int fclose(FILE *stream);
fclose函数只有一个参数stream,是FILE结构体类型的指针,表示一个文件流。fclose函数的功能就是将该函数所指定的文件流关闭。函数的返回值为int类型,当函数执行成功,返回整型值0,当函数执行失败,返回一个EOF。EOF是一个宏的名字,是End of file(文件终点)的首字母缩写,它表示一个非零值,通常被定义为-1
我们可以将fopen函数所返回的文件流作为实参,调用fclose函数,以关闭与该文件流相关联的文件
FILE *pfile = fopen("D:\\test.txt","r");
if(pfile)
{
printf("File opened successfully.\n");
if(!fclose(pfile))
printf("File closed successfully.\n");
else
printf("File closure failed successfully.\n");
}
else
printf("Failed to open file.\n");
代码中,首先通过fopen函数打开D盘的test.txt文件,并返回与该文件相关联的输入流,然后通过if语句对文件流pfile进行检查,若文件流pfile是正常的、可用的,则执行大括号中的语句;若文件流是不可用的,则执行else部分,打印输出文件打开失败的信息
在大括号中,首先通过printf函数打印文件打开成功的信息,然后再次使用if…else语句。在小括号内的条件表达式中,将文件流pfile作为实参调用fclose函数,这会将与文件流pfile相关联的文件test.txt关闭。如果关闭成功,则fclose函数的返回值为0,由于前面使用了逻辑非运算符,因此,小括号内的表达式的值为真,这会通过printf函数在控制台窗口打印文件关闭成功的信息;若文件关闭失败,fclose函数的返回值为EOF,通过逻辑非运算符转换,小括号内表达式的结果为假,就会执行else部分,打印文件关闭失败的信息
由于之前已经在D盘上创建了test.txt文件,结果为
File opened successfully.
File closed successfully.
将D盘上的test.txt文件删除,并重新运行该程序
Failed to open file.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 学生结构体
typedef struct student {
char id[20]; // 学号
char name[20]; // 姓名
char sex[10]; // 性别
char cla[20]; // 班级
int score[10]; // 成绩
int total_score; // 总成绩
float average_score; // 平均成绩
int max_score; // 最高成绩
int min_score; // 最低成绩
struct student *next; // 指向下一个节点的指针
} Student;
// 全局变量
Student *head = NULL; // 学生信息链表头
// 函数声明
void input_student(); // 录入学生信息
void delete_student(); // 删除学生信息
void modify_student(); // 修改学生信息
void query_student(); // 查询学生信息
void sort_student(); // 排序学生信息
void group_student(); // 按照等级分组学生信息
void display_all(); // 显示所有记录
void save_data(); // 保存数据到文件
void read_data(); // 从文件中读取数据
void free_data(); // 释放动态分配的内存
int main() {
int choice;
read_data(); // 从文件中读取数据
while (1) {
printf("请输入您的操作:\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("9. 退出程序\n");
scanf("%d", &choice);
switch (choice) {
case 1:
input_student();
break;
case 2:
delete_student();
break;
case 3:
modify_student();
break;
case 4:
query_student();
break;
case 5:
sort_student();
break;
case 6:
group_student();
break;
case 7:
display_all();
break;
case 8:
save_data();
break;
case 9:
free_data();
exit(0);
break;
default:
printf("无效的输入,请重新输入!\n");
break;
}
}
return 0;
}
// 录入学生信息
void input_student() {
Student *p, *q;
p = (Student *) malloc(sizeof(Student));
printf("请输入学生学号:");
scanf("%s", p->id);
printf("请输入学生姓名:");
scanf("%s", p->name);
printf("请输入学生性别:");
scanf("%s", p->sex);
printf("请输入学生班级:");
scanf("%s", p->cla);
printf("请输入本学期三门以上学科成绩(用逗号分隔):");
for (int i = 0; i < 3; i++) {
scanf("%d", &(p->score[i]));
}
p->total_score = p->score[0] + p->score[1] + p->score[2];
p->average_score = p->total_score / 3.0;
p->max_score = p->score[0];
p->min_score = p->score[0];
for (int i = 1; i < 3; i++) {
if (p->score[i] > p->max_score) {
p->max_score = p->score[i];
}
if (p->score[i] < p->min_score) {
p->min_score = p->score[i];
}
}
p->next = NULL;
// 将学生信息插入到链表中
if (head == NULL) {
head = p;
} else {
q = head;
while (q->next != NULL) {
q = q->next;
}
q->next = p;
}
printf("录入成功!\n");
}
// 删除学生信息
void delete_student() {
Student *p, *q;
char id[20];
if (head == NULL) {
printf("学生信息为空!\n");
return;
}
printf("请输入要删除的学生学号:");
scanf("%s", id);
p = head;
while (p != NULL) {
if (strcmp(p->id, id) == 0) {
if (p == head) {
head = head->next;
} else {
q->next = p->next;
}
free(p);
printf("删除成功!\n");
return;
}
q = p;
p = p->next;
}
printf("学生信息不存在!\n");
}
// 修改学生信息
void modify_student() {
Student *p;
char id[20];
int choice;
if (head == NULL) {
printf("学生信息为空!\n");
return;
}
printf("请输入要修改的学生学号:");
scanf("%s", id);
p = head;
while (p != NULL) {
if (strcmp(p->id, id) == 0) {
printf("请选择要修改的选项:\n");
printf("1. 学号\n");
printf("2. 姓名\n");
printf("3. 性别\n");
printf("4. 班级\n");
printf("5. 成绩\n");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入新的学号:");
scanf("%s", p->id);
break;
case 2:
printf("请输入新的姓名:");
scanf("%s", p->name);
break;
case 3:
printf("请输入新的性别:");
scanf("%s", p->sex);
break;
case 4:
printf("请输入新的班级:");
scanf("%s", p->cla);
break;
case 5:
printf("请输入新的成绩(用逗号分隔):");
for (int i = 0; i < 3; i++) {
scanf("%d", &(p->score[i]));
}
p->total_score = p->score[0] + p->score[1] + p->score[2];
p->average_score = p->total_score / 3.0;
p->max_score = p->score[0];
p->min_score = p->score[0];
for (int i = 1; i < 3; i++) {
if (p->score[i] > p->max_score) {
p->max_score = p->score[i];
}
if (p->score[i] < p->min_score) {
p->min_score = p->score[i];
}
}
break;
default:
printf("无效的输入!\n");
break;
}
printf("修改成功!\n");
return;
}
p = p->next;
}
printf("学生信息不存在!\n");
}
// 查询学生信息
void query_student() {
Student *p;
char id[20];
if (head == NULL) {
printf("学生信息为空!\n");
return;
}
printf("请输入要查询的学生学号:");
scanf("%s", id);
p = head;
while (p != NULL) {
if (strcmp(p->id, id) == 0) {
printf("学号:%s\n", p->id);
printf("姓名:%s\n", p->name);
printf("性别:%s\n", p->sex);
printf("班级:%s\n", p->cla);
printf("各科成绩:%d, %d, %d\n", p->score[0], p->score[1], p->score[2]);
printf("平均成绩:%.1f\n", p->average_score);
printf("总成绩:%d\n", p->total_score);
printf("最高成绩:%d\n", p->max_score);
printf("最低成绩:%d\n", p->min_score);
return;
}
p = p->next;
}
printf("学生信息不存在!\n");
}
// 排序学生信息
void sort_student() {
你与其来提问等gpt回答,还不如去百度。这个XX管理系统都烂大街了,一搜一大堆,修改修改就符合你作业要求了
回答部分参考、引用ChatGpt以便为您提供更准确的答案:
以下是一个简单的学生管理系统的代码示例,实现了信息录入、删除学生信息、修改信息、查询信息、排序等功能,同时包括了学号、姓名、性别、班级、本学期三门以上学科成绩、平均成绩、总成绩、最高成绩、最低成绩等信息的记录和排序功能,并支持文件系统读写。
class Student:
def __init__(self, student_id, name, gender, class_name, scores):
self.student_id = student_id
self.name = name
self.gender = gender
self.class_name = class_name
self.scores = scores
def calculate_average_score(self):
return sum(self.scores) / len(self.scores)
def calculate_total_score(self):
return sum(self.scores)
def get_highest_score(self):
return max(self.scores)
def get_lowest_score(self):
return min(self.scores)
class StudentManagementSystem:
def __init__(self):
self.students = []
def add_student(self, student):
self.students.append(student)
def delete_student(self, student_id):
for student in self.students:
if student.student_id == student_id:
self.students.remove(student)
break
def update_student(self, student_id, new_name, new_gender, new_class_name, new_scores):
for student in self.students:
if student.student_id == student_id:
student.name = new_name
student.gender = new_gender
student.class_name = new_class_name
student.scores = new_scores
break
def search_student(self, student_id):
for student in self.students:
if student.student_id == student_id:
return student
return None
def sort_students_by_id(self):
self.students.sort(key=lambda student: student.student_id)
def sort_students_by_name(self):
self.students.sort(key=lambda student: student.name)
def sort_students_by_score(self):
self.students.sort(key=lambda student: student.calculate_total_score())
def display_all_students(self):
for student in self.students:
print(f"学号: {student.student_id}, 姓名: {student.name}, 性别: {student.gender}, 班级: {student.class_name}, "
f"本学期三门以上学科成绩: {student.scores}, 平均成绩: {student.calculate_average_score()}, "
f"总成绩: {student.calculate_total_score()}, 最高成绩: {student.get_highest_score()}, "
f"最低成绩: {student.get_lowest_score()}")
def save_to_file(self, file_name):
with open(file_name, "w") as file:
for student in self.students:
file.write(f"{student.student_id},{student.name},{student.gender},{student.class_name},"
f"{','.join(str(score) for score in student.scores)}\n")
def load_from_file(self, file_name):
self.students = []
with open(file_name, "r") as file:
lines = file.readlines()
for line in lines:
data = line.strip().split(",")
student_id = data[0]
name = data[1]
gender = data[2]
class_name = data[3]
scores = [int(score) for score in data[4:]]
student = Student(student_id, name, gender, class_name, scores)
self.students.append(student)
# 使用示例
# 创建学生管理系统对象
sms = StudentManagementSystem()
# 添加学生
student1 = Student("001", "张三", "男", "Class A", [80, 85, 90])
student2 = Student("002", "李四", "女", "Class B", [75, 88, 92])
sms.add_student(student1)
sms.add_student(student2)
# 修改学生信息
sms.update_student("001", "张三", "男", "Class C", [85, 90, 95])
# 删除学生
sms.delete_student("002")
# 查询学生信息
student = sms.search_student("001")
if student:
print(f"学号为001的学生信息:姓名: {student.name}, 性别: {student.gender}, 班级: {student.class_name}")
# 排序学生信息
sms.sort_students_by_id()
sms.sort_students_by_name()
sms.sort_students_by_score()
# 显示所有学生信息
sms.display_all_students()
# 将学生信息保存到文件
sms.save_to_file("students.txt")
# 从文件加载学生信息
sms.load_from_file("students.txt")
请注意,以上代码仅提供了一个简单的学生管理系统的实现示例,并未包含完整的错误处理、用户交互等功能。在实际应用中,可以根据需求进行适当的扩展和修改。