一、实验名称
学生信息管理系统。
二、实验任务
学生信息包括学号、班级、姓名、性别、年龄、籍贯、职务、电话等(学号不重复)。
试设计“学生信息管理系统”,使之能提供(不限于)以下功能:
1.学生信息录入功能(学员信息用文件保存)
2.学生信息浏览功能
3.查询或排序功能:(至少一种查询方式)(1)按学号查询(2)按姓名查询等4.学生信息删除、修改功能
三、实验要求
大学生作业?你这个不是课程报告吗,就算代码给你流程图会画吗
基于new bing的参考编写,参考学习:
成功测试了数据保存到文件和从文件读取,没问题!有帮助记得采纳一下哦!
【运行截图】
#include <stdio.h>
#include<string.h>
#include <stdlib.h>
#define LEN sizeof(struct student)
//学生信息结构体
struct student
{int num;
char name[20];
char clas[20];
char sex[5];
float Eng_score;
float C_score;
float total;
float aver;
};
struct student stu[50];
//系统操作
int main()
{
void menu();
void in();
void delet();
void updet();
void select();
void print();
void sort();
void max();
void cut();
void clea();
menu();
int n;
printf("请选择功能(1-9):\n");
scanf("%d",&n);
while(n)
{
if(n>=1&&n<=9)
{
switch(n)
{
case 1:in();break;
case 2:delet();break;
case 3:updet();break;
case 4:select();break;
case 5:print();break;
case 6:sort();break;
case 7:max();break;
case 8:cut();break;
case 9:clea();break;
}
if(n==9)
{
menu();
}
printf("\n");
printf("请选择功能(1-9):");
scanf("%d",&n);
}
else
{
printf("\n");
printf("请重新输入:");
scanf("%d",&n);
}
}
return 0;
}
//目录
void menu()
{
printf("\n\n\n");
printf("\t\t-------------------------------------------------\n");
printf("\t\t|| ---------------- ||\n");
printf("\t\t||**************学生信息管理系统***************||\n");
printf("\t\t|| ---------------- ||\n");
printf("\t\t|| ||\n");
printf("\t\t||~~~~~~~~~~~~~~~1.录入学生信息~~~~~~~~~~~~~~~~||\n");
printf("\t\t||~~~~~~~~~~~~~~~2.删除学生信息~~~~~~~~~~~~~~~~||\n");
printf("\t\t||~~~~~~~~~~~~~~~3.修改学生信息~~~~~~~~~~~~~~~~||\n");
printf("\t\t||~~~~~~~~~~~~~~~4.查询学生信息~~~~~~~~~~~~~~~~||\n");
printf("\t\t||~~~~~~~~~~~~~~~5.显示学生信息~~~~~~~~~~~~~~~~||\n");
printf("\t\t||~~~~~~~~~~~~~~~6.排序学生信息~~~~~~~~~~~~~~~~||\n");
printf("\t\t||~~~~~~~~~~~~~~~7.显示最好成绩~~~~~~~~~~~~~~~~||\n");
printf("\t\t||~~~~~~~~~~~~~~~8.分组统计成绩~~~~~~~~~~~~~~~~||\n");
printf("\t\t||~~~~~~~~~~~~~~~9.清屏~~~~~~~~~~~~~~~~~~~~~~~~||\n");
printf("\t\t|| ||\n");
printf("\t\t||*********************************************||\n");
}
//录入学生信息
void in()
{
void print();
FILE *fp;
int i, m=0;
char ch[2];
if((fp=fopen("stu.txt","rb"))==NULL)
{
printf("文件打开失败\n");
return;
}
while(!feof(fp))
{
if(fread(&stu[m],LEN,1,fp)==1)
{
m++;
}
}
fclose(fp);
if(m==0)
{
printf("文件没有内容\n");
}
else
{
print();
}
if((fp=fopen("stu.txt","ab+"))==NULL)
{
printf("文件打开失败\n");
return;
}
printf("输入学生信息(y/n);\n");
scanf("%s",ch);
while(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)
{
printf("number:\n");
scanf("%3d",&stu[m].num);
for(i=0;i<m;i++)
{
if(stu[i].num==stu[m].num)
{
printf("您的信息已存在\n");
fclose(fp);
getchar();
return;
}
}
printf("name:\n");
scanf("%s",stu[m].name);
printf("class:\n");
scanf("%s",stu[m].clas);
printf("sex:\n");
scanf("%s",stu[i].sex);
printf("Eng_score:\n");
scanf("%f",&stu[m].Eng_score);
printf("C_score:\n");
scanf("%f",&stu[m].C_score);
stu[i].total=stu[i].C_score+stu[i].Eng_score;
stu[i].aver=(stu[i].C_score+stu[i].Eng_score)/2;
if(fwrite(&stu[m],LEN,1,fp)!=1)
{
printf("不能保存\n");
getchar();
}
else
{
printf("信息保存成功\n");
m++;
}
printf("是否继续录入学生信息(y/n):");
scanf("%s",ch);
}
fclose(fp);
}
//删除学生信息
void delet()
{
void print();
FILE *fp;
int num,m=0;
int i,j;
int flag=0;
char ch[2];
if((fp=fopen("stu.txt","rb"))==NULL)
{
printf("文件打开失败\n");
return;
}
while(!feof(fp))
{
if(fread(&stu[m],LEN,1,fp)==1)
{
m++;
}
}
fclose(fp);
if(m==0)
{
printf("文件中没有学生信息\n");
}
else
{
print();
printf("请输入需要删除学生信息的学号:");
scanf("%d",&num);
}
for(i=0;i<m;i++)
{
if(stu[i].num==num)
{
printf("该学生已找到,是否删除(y/n):");
scanf("%s",ch);
if(strcmp(ch,"y")==0||strcmp(ch,"Y")==0)
{
for(j=i;j<m;j++)
{
stu[j]=stu[j+1];
}
m--;
flag=1;
if((fp=fopen("stu.txt","wb"))==NULL)
{
printf("文件打开失败\n");
return;
}
for(j=0;j<m;j++)
{
if(fwrite(&stu[j],LEN,1,fp)!=1)
{
printf("不能保存\n");
getchar();
}
}
fclose(fp);
printf("删除成功!\n");break;
}
else
{
printf("学生信息存在,不需要删除。");
break;
}
}
}
if(m==i&&flag==0)
{
printf("未找到该学生");
}
}
//修改学生信息
void updet()
{
void print();
int num;
char name[10];
char clas[20];
char sex[5];
float Eng_score;
float C_score;
FILE *fp;
int m=0,a;
int i,j;
if((fp=fopen("stu.txt","rb"))==NULL)
{
printf("文件打开失败\n");
return;
}
while(!feof(fp))
{
if(fread(&stu[m],LEN,1,fp)==1)
{
m++;
}
}
fclose(fp);
if(m==0)
{
printf("文件中没有学生信息\n");
}
else
{
print();
printf("请输入需要修改学生信息的学号:");
scanf("%d",&num);
}
for(i=0;i<m;i++)
{
if(num==stu[i].num)
{
printf("1:学号,2:姓名,3:班级,4:性别,5:英语成绩,6:C语言成绩\n");
printf("该学生已被找到,请选择需要修改的内容(1-5):");
scanf("%d",&a);
while(a)
{
switch (a)
{
case 1:
printf("将%d学生的学号修改为:",num);
scanf("%d",&num);
stu[i].num=num;
for(j=i+1;j<m;j++)
{
if(stu[j].num==num)
{
printf("您修改的学号已存在\n");
getchar();
return;
}
}
break;
case 2:
printf("将%d学生的姓名修改为:",num);
scanf("%s",name);
strcpy(stu[i].name,name);
break;
case 3:
printf("将%d学生的班级修改为:",num);
scanf("%s",clas);
strcpy(stu[i].clas,clas);
break;
case 4:
printf("将%d学生的性别修改为:",num);
scanf("%s",sex);
strcpy(stu[i].sex,sex);
break;
case 5:
printf("将%d学生的英语成绩修改为:",num);
scanf("%f",&Eng_score);
stu[i].Eng_score=Eng_score;
stu[i].total=stu[i].C_score+stu[i].Eng_score;
stu[i].aver=(stu[i].C_score+stu[i].Eng_score)/2;
break;
case 6:
printf("将%d学生的C语言成绩修改为:",num);
scanf("%f",&C_score);
stu[i].C_score=C_score;
stu[i].total=stu[i].C_score+stu[i].Eng_score;
stu[i].aver=(stu[i].C_score+stu[i].Eng_score)/2;
break;
default:
printf("选择错误,请重新选择需要修改的内容:");
scanf("%d",&a);
break;
}
printf("请选择需要修改的内容(如果已修改完成请按0):");
scanf("%d",&a);
}
if((fp=fopen("stu.txt","wb"))==NULL)
{
printf("文件打开失败\n");
return;
}
for(j=0;j<m;j++)
{
if(fwrite(&stu[j],LEN,1,fp)!=1)
{
printf("不能保存\n");
getchar();
}
}
fclose(fp);
printf("修改成功!\n");
break;
}
}
if(m==i)
{
printf("未找到该学生\n");
}
}
//查询学生信息
void select()
{
int num,m=0;
int i;
FILE *fp;
if((fp=fopen("stu.txt","rb"))==NULL)
{
printf("文件打开失败\n");
return;
}
while(!feof(fp))
{
if(fread(&stu[m],LEN,1,fp)==1)
{
m++;
}
}
fclose(fp);
if(m==0)
{
printf("文件没有内容\n");
return;
}
printf("请输入学生学号进行查询:");
scanf("%d",&num);
for(i=0;i<m;i++)
{
if(num==stu[i].num)
{
printf("\n");
printf("该学生信息已被查到;\n");
printf("学号\t姓名\t班级\t性别\t英语成绩\tC语言成绩\t总成绩\t平均成绩\n");
printf("%3d\t%s\t%s\t%s\t%.2f\t\t%.2f\t\t%.2f\t %.2f\n",stu[i].num,stu[i].name,stu[i].clas,stu[i].sex,stu[i].Eng_score,stu[i].C_score,stu[i].total,stu[i].aver);
break;
}
}
if(m==i)
{
printf("该学生信息不存在\n");
return;
}
}
//显示学生信息
void print()
{
int i,m=0;
FILE *fp;
if((fp=fopen("stu.txt","rb"))==NULL)
{
printf("文件打开失败\n");
return;
}
while(!feof(fp))
{
if(fread(&stu[m],LEN,1,fp)==1)
{
m++;
}
}
fclose(fp);
if(m==0)
{
printf("文件中没有内容\n");
}
printf("学号\t姓名\t班级\t性别\t英语成绩\tC语言成绩\t总成绩\t平均成绩\n");
for(i=0;i<m;i++)
{
printf("%3d\t%s\t%s\t%s\t%.2f\t\t%.2f\t\t%.2f\t %.2f\n",stu[i].num,stu[i].name,stu[i].clas,stu[i].sex,stu[i].Eng_score,stu[i].C_score,stu[i].total,stu[i].aver);
}
}
//排序
void sort()
{
int i,j,m=0;
int ch;
FILE *fp;
struct student temp;
if((fp=fopen("stu.txt","rb"))==NULL)
{
printf("文件打开失败\n");
return;
}
while(!feof(fp))
{
if(fread(&stu[m],LEN,1,fp)==1)
{
m++;
}
}
fclose(fp);
if(m==0)
{
printf("文件中没有内容\n");
}
printf("1:学号升序,2:英语成绩升序,3:C语言升序,4:总成绩升序,5:平均成绩升序\n");
printf("请选择显示形式:");
scanf("%d",&ch);
switch (ch)
{
case 1:
for(i=0;i<m;i++)
{
for(j=i+1;j<m;j++)
{
if(stu[i].num>stu[j].num)
{
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
}
}
break;
case 2:
for(i=0;i<m;i++)
{
for(j=i+1;j<m;j++)
{
if(stu[i].Eng_score>stu[j].Eng_score)
{
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
}
}
break;
case 3:
for(i=0;i<m;i++)
{
for(j=i+1;j<m;j++)
{
if(stu[i].C_score>stu[j].C_score)
{
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
}
}
break;
case 4:
for(i=0;i<m;i++)
{
for(j=i+1;j<m;j++)
{
if(stu[i].total>stu[j].total)
{
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
}
}
break;
case 5:
for(i=0;i<m;i++)
{
for(j=i+1;j<m;j++)
{
if(stu[i].aver>stu[j].aver)
{
temp=stu[i];
stu[i]=stu[j];
stu[j]=temp;
}
}
}
break;
}
printf("学号\t姓名\t班级\t性别\t英语成绩\tC语言成绩\t总成绩\t平均成绩\n");
for(i=0;i<m;i++)
{
printf("%3d\t%s\t%s\t%s\t%.2f\t\t%.2f\t\t%.2f\t %.2f\n",stu[i].num,stu[i].name,stu[i].clas,stu[i].sex,stu[i].Eng_score,stu[i].C_score,stu[i].total,stu[i].aver);
}
}
//最大值
void max()
{
int i,j=0;
FILE *fp;
int m=0;
if((fp=fopen("stu.txt","rb"))==NULL)
{
printf("文件打开失败\n");
return;
}
while(!feof(fp))
{
if(fread(&stu[m],LEN,1,fp)==1)
{
m++;
}
}
fclose(fp);
if(m==0)
{
printf("文件中没有内容\n");
}
for(i=0;i<m;i++)
{
if(stu[i].total>stu[j].total)
j=i;
}
printf("总成绩成绩最高的同学是:\n");
printf("学号\t姓名\t班级\t性别\t英语成绩\tC语言成绩\t总成绩\t平均成绩\n");
printf("%3d\t%s\t%s\t%s\t%.2f\t\t%.2f\t\t%.2f\t %.2f\n",stu[j].num,stu[j].name,stu[j].clas,stu[j].sex,stu[j].Eng_score,stu[j].C_score,stu[j].total,stu[j].aver);
}
//分组统计
void cut()
{
int i,j;
float n;
FILE *fp;
int m=0;
if((fp=fopen("stu.txt","rb"))==NULL)
{
printf("文件打开失败\n");
return;
}
while(!feof(fp))
{
if(fread(&stu[m],LEN,1,fp)==1)
{
m++;
}
}
fclose(fp);
if(m==0)
{
printf("文件中没有内容\n");
}
printf("请输入按总成绩分组的值:");
scanf("%f",&n);
printf("总成绩大于%.2f的同学有:\n",n);
printf("学号\t姓名\t班级\t性别\t英语成绩\tC语言成绩\t总成绩\t平均成绩\n");
for(i=0;i<m;i++)
{
if(stu[i].total>=n)
printf("%3d\t%s\t%s\t%s\t%.2f\t\t%.2f\t\t%.2f\t %.2f\n",stu[i].num,stu[i].name,stu[i].clas,stu[i].sex,stu[i].Eng_score,stu[i].C_score,stu[i].total,stu[i].aver);
}
printf("总成绩小于%.2f的同学有:\n",n);
printf("学号\t姓名\t班级\t性别\t英语成绩\tC语言成绩\t总成绩\t平均成绩\n");
for(j=0;j<m;j++)
{
if(stu[j].total<n)
printf("%3d\t%s\t%s\t%s\t%.2f\t\t%.2f\t\t%.2f\t %.2f\n",stu[j].num,stu[j].name,stu[j].clas,stu[j].sex,stu[j].Eng_score,stu[j].C_score,stu[j].total,stu[j].aver);
}
}
//清屏
void clea()
{
system("cls");
}
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100 //最大学生数
/* 定义学生结构体 */
struct student {
char num[20]; //学号
char name[20]; //姓名
char sex[2]; //性别
int age; //年龄
char hometown[20]; //籍贯
char position[20]; //职务
char phone[20]; //电话
char class[20]; //班级
};
/* 定义学生数组 */
struct student stu[MAX];
/* 定义学生数 */
int num = 0;
/* 添加学生信息函数 */
void add_student() {
printf("请输入学生信息:\n");
printf("学号:");
scanf("%s", stu[num].num);
printf("姓名:");
scanf("%s", stu[num].name);
printf("性别:");
scanf("%s", stu[num].sex);
printf("年龄:");
scanf("%d", &stu[num].age);
printf("籍贯:");
scanf("%s", stu[num].hometown);
printf("职务:");
scanf("%s", stu[num].position);
printf("电话:");
scanf("%s", stu[num].phone);
printf("班级:");
scanf("%s", stu[num].class);
num++; //学生数加一
printf("添加成功。\n");
}
/* 查询学生信息函数 */
void search_student() {
int choice;
printf("请选择查询方式:\n");
printf("1.按学号查询\n");
printf("2.按姓名查询\n");
scanf("%d", &choice);
if (choice == 1) {
char snum[20];
printf("请输入学号:");
scanf("%s", snum);
int i;
for (i = 0; i < num; i++) {
if (strcmp(stu[i].num, snum) == 0) {
printf("学号\t姓名\t性别\t年龄\t籍贯\t职务\t电话\t班级\n");
printf("%s\t%s\t%s\t%d\t%s\t%s\t%s\t%s\n", stu[i].num, stu[i].name, stu[i].sex, stu[i].age, stu[i].hometown, stu[i].position, stu[i].phone, stu[i].class);
break;
}
}
if (i == num) {
printf("没有找到学号为%s的学生。\n", snum);
}
}
else if (choice == 2) {
char sname[20];
printf("请输入姓名:");
scanf("%s", sname);
int i;
for (i = 0; i < num; i++) {
if (strcmp(stu[i].name, sname) == 0) {
printf("学号\t姓名\t性别\t年龄\t籍贯\t职务\t电话\t班级\n");
printf("%s\t%s\t%s\t%d\t%s\t%s\t%s\t%s\n", stu[i].num, stu[i].name, stu[i].sex, stu[i].age, stu[i].hometown, stu[i].position, stu[i].phone, stu[i].class);
break;
}
}
if (i == num) {
printf("没有找到姓名为%s的学生。\n", sname);
}
}
else {
printf("输入有误。\n");
}
}
/* 修改学生信息函数 */
void modify_student() {
char snum[20];
printf("请输入要修改的学生的学号:");
scanf("%s", snum);
int i;
for (i = 0; i < num; i++) {
if (strcmp(stu[i].num, snum) == 0) {
printf("请输入修改后的信息:\n");
printf("学号:");
scanf("%s", stu[i].num);
printf("姓名:");
scanf("%s", stu[i].name);
printf("性别:");
scanf("%s", stu[i].sex);
printf("年龄:");
scanf("%d", &stu[i].age);
printf("籍贯:");
scanf("%s", stu[i].hometown);
printf("职务:");
scanf("%s", stu[i].position);
printf("电话:");
scanf("%s", stu[i].phone);
printf("班级:");
scanf("%s", stu[i].class);
printf("修改成功。\n");
break;
}
}
if (i == num) {
printf("没有找到学号为%s的学生。\n", snum);
}
}
/* 删除学生信息函数 */
void delete_student() {
char snum[20];
printf("请输入要删除的学生的学号:");
scanf("%s", snum);
int i, j;
for (i = 0; i < num; i++) {
if (strcmp(stu[i].num, snum) == 0) {
for (j = i; j < num - 1; j++) {
stu[j] = stu[j + 1]; //删除学生信息
}
printf("删除成功。\n");
num--; //学生数减一
break;
}
}
if (i == num) {
printf("没有找到学号为%s的学生。\n", snum);
}
}
/* 显示学生信息函数 */
void show_student() {
int i;
printf("学号\t姓名\t性别\t年龄\t籍贯\t职务\t电话\t班级\n");
for (i = 0; i < num; i++) {
printf("%s\t%s\t%s\t%d\t%s\t%s\t%s\t%s\n", stu[i].num, stu[i].name, stu[i].sex, stu[i].age, stu[i].hometown, stu[i].position, stu[i].phone, stu[i].class);
}
}
/* 主函数 */
int main() {
int choice;
do {
printf("****学生信息管理系统****\n");
printf("1.添加学生信息\n");
printf("2.查询学生信息\n");
printf("3.修改学生信息\n");
printf("4.删除学生信息\n");
printf("5.显示学生信息\n");
printf("0.退出\n");
scanf("%d", &choice);
switch (choice) {
case 1:
add_student(); //添加学生信息
break;
case 2:
search_student(); //查询学生信息
break;
case 3:
modify_student(); //修改学生信息
break;
case 4:
delete_student(); //删除学生信息
break;
case 5:
show_student(); //显示学生信息
break;
case 0:
break;
default:
printf("输入有误,请重新输入。\n");
break;
}
} while (choice != 0);
printf("bye~\n");
return 0;
}
这个程序是使用结构体来存储学生信息,通过函数实现了添加学生信息、查询学生信息、修改学生信息、删除学生信息、显示学生信息等多种功能。其中,查询学生信息可以按学号或姓名查询,可以根据实际需要进行选择。
如果我的回答解决了您的问题,请采纳!
以下内容引用CHATGPT、有用望采纳:
首先,我们可以定义一个结构体来存储学生信息。例如:
struct Student {
int id; // 学号
char name[20]; // 姓名
char gender; // 性别
int age; // 年龄
char hometown[20]; // 籍贯
char position[20]; // 职务
char phone[20]; // 电话
};
然后,我们可以用文件来保存学生信息。例如,我们可以在文件中按行保存每个学生的信息,每个字段之间用逗号隔开。例如:
1001,计算机1班,张三,男,20,北京,班长,123456789
1002,计算机1班,李四,女,19,上海,学习委员,987654321
接下来,我们可以实现以下功能:
struct Student s;
printf("请输入学号:");
scanf("%d", &s.id);
printf("请输入班级:");
scanf("%s", s.class);
printf("请输入姓名:");
scanf("%s", s.name);
printf("请输入性别:");
scanf("%c", &s.gender);
printf("请输入年龄:");
scanf("%d", &s.age);
printf("请输入籍贯:");
scanf("%s", s.hometown);
printf("请输入职务:");
scanf("%s", s.position);
printf("请输入电话:");
scanf("%s", s.phone);
FILE *fp = fopen("students.txt", "a");
fprintf(fp, "%d,%s,%s,%c,%d,%s,%s,%s\n", s.id, s.class, s.name, s.gender, s.age, s.hometown, s.position, s.phone);
fclose(fp);
FILE *fp = fopen("students.txt", "r");
char line[100];
while (fgets(line, 100, fp) != NULL) {
struct Student s;
sscanf(line, "%d,%s,%s,%c,%d,%s,%s,%s\n", &s.id, s.class, s.name, &s.gender, &s.age, s.hometown, s.position, s.phone);
printf("%d,%s,%s,%c,%d,%s,%s,%s\n", s.id, s.class, s.name, s.gender, s.age, s.hometown, s.position, s.phone);
}
fclose(fp);
int id;
printf("请输入要查询的学号:");
scanf("%d", &id);
FILE *fp = fopen("students.txt", "r");
char line[100];
while (fgets(line, 100, fp) != NULL) {
struct Student s;
sscanf(line, "%d,%s,%s,%c,%d,%s,%s,%s\n", &s.id, s.class, s.name, &s.gender, &s.age, s.hometown, s.position, s.phone);
if (s.id == id) {
printf("%d,%s,%s,%c,%d,%s,%s,%s\n", s.id, s.class, s.name, s.gender, s.age, s.hometown, s.position, s.phone);
break;
}
}
fclose(fp);
int id;
printf("请输入要删除或修改的学号:");
scanf("%d", &id);
FILE *fp = fopen("students.txt", "r");
FILE *tmp = fopen("students.tmp", "w");
char line[100];
while (fgets(line, 100, fp) != NULL) {
struct Student s;
sscanf(line, "%d,%s,%s,%c,%d,%s,%s,%s\n", &s.id, s.class, s.name, &s.gender, &s.age, s.hometown, s.position, s.phone);
if (s.id == id) {
// 如果找到了要删除或修改的学生信息,则跳过该行不写入新文件中
continue;
}
fprintf(tmp, "%d,%s,%s,%c,%d,%s,%s,%s\n", s.id, s.class, s.name, s.gender, s.age, s.hometown, s.position, s.phone);
}
fclose(fp);
fclose(tmp);
// 删除旧文件
remove("students.txt");
// 将新文件重命名为旧文件
rename("students.tmp", "students.txt");
以上是一个简单的学生信息管理系统的实现思路,可以根据实际需求进行修改和完善。
该回答引用ChatGPT
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENT_NUM 100 // 最多可存储的学生信息数量
#define MAX_NAME_LENGTH 20 // 学生姓名的最大长度
#define FILE_PATH "./student_info.txt" // 存储学生信息的文件路径
// 定义学生信息结构体
typedef struct {
int id; // 学号
char name[MAX_NAME_LENGTH];// 姓名
char gender; // 性别,'M'表示男性,'F'表示女性
int age; // 年龄
char hometown[20]; // 籍贯
char position[20]; // 职务
char phone[20]; // 电话
} Student;
// 学生信息数组,用于保存所有学生的信息
Student students[MAX_STUDENT_NUM];
// 学生信息数量
int student_count = 0;
// 从文件读取学生信息
void read_student_info() {
FILE* fp = fopen(FILE_PATH, "r");
if (!fp) {
printf("打开文件失败!
");
return;
}
while (!feof(fp)) {
Student student;
// 读取并解析一行学生信息
char line[200];
fgets(line, sizeof(line), fp);
if (strlen(line) == 0) {
break;
}
sscanf(line, "%d %s %c %d %s %s %s",
&student.id, student.name, &student.gender, &student.age, student.hometown, student.position, student.phone);
students[student_count++] = student;
}
fclose(fp);
}
// 将学生信息保存到文件
void save_student_info() {
FILE* fp = fopen(FILE_PATH, "w");
if (!fp) {
printf("保存文件失败!
");
return;
}
for (int i = 0; i < student_count; i++) {
fprintf(fp, "%d %s %c %d %s %s %s
",
students[i].id, students[i].name, students[i].gender, students[i].age,
students[i].hometown, students[i].position, students[i].phone);
}
fclose(fp);
}
// 根据学号查询学生信息
void query_by_id(int id) {
for (int i = 0; i < student_count; i++) {
if (students[i].id == id) {
printf("学号:%d
", students[i].id);
printf("姓名:%s
", students[i].name);
printf("性别:%c
", students[i].gender);
printf("年龄:%d
", students[i].age);
printf("籍贯:%s
", students[i].hometown);
printf("职务:%s
", students[i].position);
printf("电话:%s
", students[i].phone);
return;
}
}
printf("未查询到该学号的学生信息。
");
}
// 根据姓名查询学生信息
void query_by_name(char* name) {
for (int i = 0; i < student_count; i++) {
if (strcmp(students[i].name, name) == 0) {
printf("学号:%d
", students[i].id);
printf("姓名:%s
", students[i].name);
printf("性别:%c
", students[i].gender);
printf("年龄:%d
", students[i].age);
printf("籍贯:%s
", students[i].hometown);
printf("职务:%s
", students[i].position);
printf("电话:%s
", students[i].phone);
return;
}
}
printf("未查询到该姓名的学生信息。
");
}
// 输出所有学生信息
void print_all() {
for (int i = 0; i < student_count; i++) {
printf("学号:%d
", students[i].id);
printf("姓名:%s
", students[i].name);
printf("性别:%c
", students[i].gender);
printf("年龄:%d
", students[i].age);
printf("籍贯:%s
", students[i].hometown);
printf("职务:%s
", students[i].position);
printf("电话:%s
", students[i].phone);
printf("
");
}
}
// 添加一个学生信息
void add_student() {
if (student_count == MAX_STUDENT_NUM) {
printf("已达到最大学生信息数量,无法继续添加!
");
return;
}
Student student;
printf("请输入学号:");
scanf("%d", &student.id);
// 检查学号是否已存在
for (int i = 0; i < student_count; i++) {
if (students[i].id == student.id) {
printf("该学号已存在!
");
return;
}
}
printf("请输入姓名:");
scanf("%s", student.name);
printf("请输入性别(M或F):");
scanf("%s", &student.gender);
printf("请输入年龄:");
scanf("%d", &student.age);
printf("请输入籍贯:");
scanf("%s", student.hometown);
printf("请输入职务:");
scanf("%s", student.position);
printf("请输入电话:");
scanf("%s", student.phone);
students[student_count++] = student;
save_student_info();
}
// 删除一个学生信息
void delete_student() {
int id_to_delete;
printf("请输入要删除的学生的学号:");
scanf("%d", &id_to_delete);
int index_to_delete = -1;
for (int i = 0; i < student_count; i++) {
if (students[i].id == id_to_delete) {
index_to_delete = i;
break;
}
}
if (index_to_delete == -1) {
printf("未查询到该学号的学生信息,无法删除。
");
return;
}
for (int i = index_to_delete; i < student_count - 1; i++) {
students[i] = students[i + 1];
}
student_count--;
save_student_info();
printf("删除成功!
");
}
// 修改一个学生信息
void modify_student() {
int id_to_modify;
printf("请输入要修改的学生的学号:");
scanf("%d", &id_to_modify);
int index_to_modify = -1;
for (int i = 0; i < student_count; i++) {
if (students[i].id == id_to_modify) {
index_to_modify = i;
break;
}
}
if (index_to_modify == -1) {
printf("未查询到该学号的学生信息,无法修改。
");
return;
}
Student* student_to_modify = &students[index_to_modify];
printf("请输入姓名(留空表示不修改):");
char name[MAX_NAME_LENGTH];
int res = scanf("%s", name);
if (strlen(name) > 0) {
strcpy(student_to_modify->name, name); // 修改姓名
}
printf("请输入性别(M或F,留空表示不修改):");
char gender[2];
res = scanf("%s", gender);
if (res > 0) {
student_to_modify->gender = gender[0]; // 修改性别
}
printf("请输入年龄(留空表示不修改):");
res = scanf("%d", &student_to_modify->age); // 修改年龄
printf("请输入籍贯(留空表示不修改):");
res = scanf("%s", student_to_modify->hometown); // 修改籍贯
printf("请输入职务(留空表示不修改):");
res = scanf("%s", student_to_modify->position); // 修改职务
printf("请输入电话(留空表示不修改):");
res = scanf("%s", student_to_modify->phone); // 修改电话
save_student_info();
printf("修改成功!
");
}
int main() {
// 从文件读取学生信息
read_student_info();
// 显示菜单
printf("学生信息管理系统
");
printf("==================
");
printf("1. 添加学生信息
");
printf("2. 删除学生信息
");
printf("3. 修改学生信息
");
printf("4. 查询学生信息(按学号)
");
printf("5. 查询学生信息(按姓名)
");
printf("6. 显示所有学生信息
");
printf("7. 退出
");
// 循环处理用户输入
int choice = 0;
while (choice != 7) {
printf("请输入要执行的操作的编号:");
scanf("%d", &choice);
switch (choice) {
case 1:
add_student();
break;
case 2:
delete_student();
break;
case 3:
modify_student();
break;
case 4:
printf("请输入要查询的学生的学号:");
int id_to_query;
scanf("%d", &id_to_query);
query_by_id(id_to_query);
break;
case 5:
printf("请输入要查询的学生的姓名:");
char name_to_query[MAX_NAME_LENGTH];
scanf("%s", name_to_query);
query_by_name(name_to_query);
break;
case 6:
print_all();
break;
case 7:
exit(0); // 退出程序
default:
printf("无效的输入,请重新输入!
");
break;
}
}
return 0;
}