编辑器:Dev.C++
该系统的学生数据储存到txt文件,每次运行从txt文件中读取学生信息,可进行添加、删除、修改等等操作。
环境搭建
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 10
void seek();//查找学生信息
void add();//添加学生信息
void de();//删除学生信息
void revise();//修改学生信息
void save();//保存学生信息(保存信息)
void present();//浏览学生信息
void refresh();//刷新学生信息
void menu();//菜单
void quit();//退出系统
void enter();//清空信息
void sort();//排序信息
void find();//查找信息
void good();
int n,t;//n为当前系统的人数,t为选择项
struct student{
char name[15];
char ID[6];
char sex;
int age;
int grade[3];
}stu[N];
int len=sizeof(struct student);
菜单功能
void menu()//菜单
{
printf("----------------------------------------\n");
printf(" 欢迎使用学生信息管理系统\n");
printf(" 1.查找 2.添加 3.删除 4.浏览 \n");
printf(" 5.排序 6.修改 7.显示最好成绩 \n");
printf(" 8.帮助 9.退出\n");
printf(" 当前有%d位学生信息 ",n);
printf("\n");
printf("----------------------------------------\n");
}
查找功能
void find()
{
char ID[10];
int i,x,re=0,flag=0;
while(1)
{ printf("请输入你要查找学生信息的学号");
scanf("%s",&ID);
getchar();
for(i=0;i<n;i++)
{
if(strcmp(ID,stu[i].ID)==0)
{
printf("找到了!!\n");
printf("学号:%s\t ",stu[i].ID);
printf("姓名:%s\t ",stu[i].name);
printf("性别:%c\t ",stu[i].sex);
printf("年龄:%d\t ",stu[i].age);
printf("高等数学:%d 英语:%d C语言:%d",stu[i].grade[0],stu[i].grade[1],stu[i].grade[2]);
printf("\n");
flag=1;
break;
}
}
if(flag!=1)
printf("无该学号的学生信息!\n");
printf("是否继续查找(1/0)");
scanf("%d",&x);
switch(x)
{
case 1:break;
case 0:re=1;break;
}
if(re==1)
break;
}
}
添加功能
void add()//添加
{
int m,j,g;//m为需要添加的学生人数
printf("请输入你要添加的人数:");
scanf("%d",&m);
int i=n;
if(m>0);
{
while(i<n+m)
{
printf("请输入第%d位学生的信息\n",i+1);
flag: printf("请输入学号:");
scanf("%s",stu[i].ID);
getchar();
//----------判断学号有无重复----------
int j;
for(j=0;j<i;j++)
if(strcmp(stu[i].ID,stu[j].ID)==0)
{
printf("学号已重复,请重新输入 ");
goto flag;
}
//----------判断学号有无重复----------
printf("请输入姓名:");
scanf("%s",stu[i].name);
getchar();
printf("请输入性别F(女)或M(男):");
scanf("%c",&stu[i].sex);
getchar();
printf("请输入年龄:");
scanf("%d",&stu[i].age);
printf("请输入三科成绩(用空格隔开):");
scanf("%d%d%d",&stu[i].grade[0],&stu[i].grade[1],&stu[i].grade[2]);
FILE *p=fopen("学生信息.txt","ab+");
if(p==NULL)
exit(0);
fwrite(&stu[i],len,1,p);
fclose(p);
i++;
}
printf("学生信息已经添加!!!\n");
printf("------------------------------------------------------------------------------------------\n");
for(i=n;i<n+m;i++)
{
printf("学号:%s \t",stu[i].ID);
printf("姓名:%s \t",stu[i].name);
printf("性别:%c \t",stu[i].sex);
printf("年龄:%d \t",stu[i].age);
printf("高等数学:%d 英语:%d C语言:%d",stu[i].grade[0],stu[i].grade[1],stu[i].grade[2]);
printf("\n");
}
printf("------------------------------------------------------------------------------------------\n");
}
n+=m;
}
删除功能
void de()//删除
{
//更新:删除后把文件清空重新保存
int i,flag,flag1;
char ID1[10];
if(n!=0)
{
for(i=0;i<n;i++)
{
printf("学号:%s ",stu[i].ID);
printf("姓名:%s ",stu[i].name);
printf("性别:%c ",stu[i].sex);
printf("年龄:%d ",stu[i].age);
printf("高等数学:%d 英语:%d C语言:%d",stu[i].grade[0],stu[i].grade[1],stu[i].grade[2]);
printf("\n");
}
while(1)
{
printf("请选择你要删除的信息(填学号):");
scanf("%s",&ID1);
for(i=0;i<n;i++)
{
if(strcmp(ID1,stu[i].ID)==0)
{
printf("找到了!\n");
printf("真的要删除?(1/0)\n");
scanf("%d",&flag);
switch(flag)
{
case 1:
{
int j;
//memset(&stu[i],0,sizeof(struct student));
for(j=i;j<n;j++)//删除的信息后面的信息往前一位,要删除的信息被前一信息覆盖,即删除
{
stu[j]=stu[j+1];
}
n-=1;
FILE *p=fopen("学生信息.txt","wb");
if(p==NULL)
exit(0);
for(i=0;i<n;i++)
{
if(fwrite(&stu[i],len,1,p)!=1)
{
printf("不能保存\n");
getchar();
}
}
fclose(p);
break;
}
case 0:flag1=1;break;
}
}
}
if(flag1==1);
break;
printf("找不到!\n");
}
}
else
printf("无信息可删除!");
system("pause");
}
浏览功能
void present()//浏览信息
{
int i,j;
if(n>0)
{
for(i=0;i<n;i++)
{
printf("学号:%s ",stu[i].ID);
printf("姓名:%s ",stu[i].name);
printf("性别:%c ",stu[i].sex);
printf("年龄:%d ",stu[i].age);
printf("高等数学:%d 英语:%d C语言:%d",stu[i].grade[0],stu[i].grade[1],stu[i].grade[2]);
printf("\n");
}
system("pause");
}
else
{
printf("无学生信息");
system("pause");
}
}
刷新功能
void reflash()//刷新.读取文件的学生信息
{
long size,m=0,flag;
FILE *p=fopen("学生信息.txt","rb");
if(p==NULL)
{
exit(0);
}
fseek(p,0,SEEK_END);
size=ftell(p);
if(size!=0)
{
rewind(p);
while(fread(&stu[n],len,1,p)==1)//每次读取一个学生信息
{
int k;
for(k=0;k<n;k++)
{
if(strcmp(stu[k].ID,stu[n].ID)==0)//判断单个是否重复
{
printf("学号信息已重复!");
memset(&stu[n],0,len);
flag=1;//是,读取的该信息清空
break;
}
if(flag==1)
continue;
}
//逐个判断操作台有没有重复的
n++;
}
}
else
{
printf("文件内无学生信息!\n");
}
fclose(p);
}
修改功能
void revise()//修改信息
{
//更新:修改完的信息覆盖掉文件中的信息
char ID[10];
present();
while(1)
{
printf("请问你需要修改学生信息的学号是:");
scanf("%s",&ID);
getchar();
int i,j,flag=0;
for(i=0;i<n;i++)
{
if(strcmp(ID,stu[i].ID)==0)
{
j=i;//记录找到的学生信息下标
flag=1;//找到了
break;
}
}
if(flag==1)//开始修改
{ while(1)
{
printf("请选择修改选项或退出:1.学号2.姓名3.性别4.年龄5.三科成绩 0.退出\n");
int x;
scanf("%d",&x);
switch(x)
{
case 1:
{
printf("请输入学号:");
scanf("%s",&stu[j].ID);
printf("修改成功!");
}
case 2:
{
printf("请输入新名字:\n");
scanf("%s",&stu[j].name);
printf("修改成功!");
break;
}
case 3:
{
printf("请修改性别");
scanf("%c",&stu[j].sex);
getchar();
printf("修改成功!");
break;
}
case 4:
{
int Age;
printf("请输入新年龄:\n");
scanf("%d",&Age);
stu[j].age=Age;
printf("修改成功!");
break;
}
break;
case 5:
{
int Grade[3];
printf("请输入新成绩");
scanf("%d %d %d",&Grade[0],&Grade[1],&Grade[2]);
stu[j].grade[0]=Grade[0],stu[j].grade[1]=Grade[1],stu[j].grade[2]=Grade[2];
printf("修改成功!");
break;
}
case 0:
{
//开始查找文件中的要修改的文件,将控制台修改完的信息覆盖到文件中要修改的信息
FILE *p=fopen("学生信息.txt","r+b");
if(p==NULL)
{
exit(0);
}
fseek(p,j*len,SEEK_SET);//把指针移向到要文件中要修改的信息
fwrite(&stu[j],len,1,p);
fclose(p);
return;
}
}
printf("学号:%s\t ",stu[i].ID);
printf("姓名:%s\t ",stu[i].name);
printf("性别:%c\t ",stu[i].sex);
printf("年龄:%d\t ",stu[i].age);
printf("高等数学:%d 英语:%d C语言:%d",stu[i].grade[0],stu[i].grade[1],stu[i].grade[2]);
printf("\n");
}
}
else
{
printf("找不到该学号的学生信息\n");
}
}
}
排序功能
void sort()//排序信息
{
f: printf("总成绩按1.升序/2.降序/3.退出\n");
int i,j,flag;
scanf("%d",&flag);
if(flag==1)
{
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
{
if(stu[j].grade[0]+stu[j].grade[1]+stu[j].grade[2]<stu[j+1].grade[0]+stu[j+1].grade[1]+stu[j+1].grade[2])
{
struct student temp;
temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
}
}
}
present();
}
else if(flag==2)
{
for(i=0;i<n;i++)
{
for(j=0;j<n-i-1;j++)
{
if(stu[j].grade[0]+stu[j].grade[1]+stu[j].grade[2]>stu[j+1].grade[0]+stu[j+1].grade[1]+stu[j+1].grade[2])
{
struct student temp;
temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
}
}
}
present();
}
else if(flag==3)
{
return;
}
else
{
printf("输入错误!");
goto f;
}
}
显示最好成绩功能
void good()
{
if(n>0)
{
printf("开始显示显示最好成绩\n");
int i,j,sum,temp;
sum=stu[0].grade[0]+stu[0].grade[1]+stu[0].grade[2];
for(i=0;i<n;i++)
{
temp=stu[i].grade[0]+stu[i].grade[1]+stu[i].grade[2];
if(temp>sum)
{
j=i;
sum=temp;
}
}
printf("最好成绩是:");
printf("学号:%s ",stu[j].ID);
printf("姓名:%s ",stu[j].name);
printf("性别:%c ",stu[j].sex);
printf("年龄:%d ",stu[j].age);
printf("高等数学:%d 英语:%d C语言:%d",stu[j].grade[0],stu[j].grade[1],stu[j].grade[2]);
printf("\n");
}
system("pause");
}
清空功能
void enter1()//清空系统
{
FILE *p=fopen("学生信息.txt","w");
if(p==NULL)
exit(0);
fclose(p);
}
提示功能
void help()
{
printf("一、请按菜单中选择前编号输入指令\n");
printf("二、遇到(1/0),1代表是,0代表否\n");
printf("三、输入或修改学号名字,不要输入空格!\n");
printf("四、选项10是清空文件内信息,选项11是清空控制台信息");
system("pause");
}
清空控制台数据功能
void enter2()
{
memset(&stu,0,len);
n=0;
}
退出功能
void quit()//退出系统
{
exit(0);
}
主函数用来控制程序逻辑
int main()
{
reflash();
printf("学生信息读取完毕\n");
while(1)
{
menu();
printf("请输入指令:");
scanf("%d",&t);
switch(t)
{
case 1:find();break;
case 2:add();break;
case 3:de();break;
case 4:present();break;
case 5:sort();break;
case 6:revise();break;
case 7:good();break;
case 8:help();break;
case 9:quit();break;
case 10:enter1();break;
case 11:enter2();break;
default:printf("输入指令有误,请重新输入!:\n");goto f;
}
}
return 0;
}
发现错误欢迎指正!!!