前言
更新版本请参考:https://blog.csdn.net/qq_43437555/article/details/120318242
大一上学期用C语言写的学生管理系统,写的比较粗糙,但是基本的功能都实现了,发出来供有需要的同学参考。
预备知识
#include<stdio.h> // bug 成绩输入时输入字母或者特殊字符会使程序崩溃
#include<string.h>
#include <stdlib.h>
struct student //结构体
{
char ID[20];
char name[20];
int eng,chn,cop; //英语 思修 体育
float ave; //用来对成绩排序
};
struct student st[10000]; //定义结构体变量
int num=0; //全局变量
void display() //主菜单
{
system("color 0");
printf(" *欢迎使用学生成绩管理系统* \n");
printf("********************************************************************************\n");
printf(" *请用户根据以下提示进行操作(温馨提示:请在成绩录入后再使用其它功能)* \n");
printf("*******************************************************************************\n");
printf("0.退出系统 1.成绩录入 2.计算平均成绩 3.成绩输出\n");
printf("4.成绩排序(按平均成绩) 5.成绩查找 6.成绩修改 7.成绩追加\n");
printf("8.删除成绩 9.成绩分段 10.文件存储 11.文件输出\n");
printf("*******************************************************************************\n");
printf(" *如需退出系统请按0* \n" );
}
void entry() //成绩录入
{
int i=0;
char a;
while(1)
{
printf("请输入学号:");
scanf("%s",st[num].ID );
printf("请输入姓名:");
scanf("%s",st[num].name );
printf("请输入英语成绩:");
scanf("%d",&st[num].eng );
printf("请输入思修成绩:");
scanf("%d",&st[num].chn );
printf("请输入体育成绩:");
scanf("%d",&st[num].cop );
num++;
printf("任意键继续,n退出:");
getchar();
if(getchar()=='n')
{
break;
}
}
for(i=0;i<num;i++) //计算平均成绩 (个人)
{
st[i].ave=(st[i].chn+st[i].cop+st[i].eng)/3.0;
}
}
void average() //平均分(班级)
{
system("cls");
display();
float socer=0,s1=0,s2=0,s3=0;
float aver,aver1,aver2,aver3;
int i;
for(i=0;i<num;i++)
{
socer=socer+st[i].ave;
}
aver=socer/num;
for(i=0;i<num;i++)
{
s1=s1+st[i].eng;
}
aver1=s1/num;
for(i=0;i<num;i++)
{
s2=s2+st[i].chn;
}
aver2=s2/num;
for(i=0;i<num;i++)
{
s3=s3+st[i].cop;
}
aver3=s3/num;
printf("班级平均分 英语平均分 思修平均分 体育平均分\n");
printf("------------------------------------------------------------\n");
printf("%.2f ",aver);
printf("%.2f ",aver1);
printf("%.2f ",aver2);
printf("%.2f \n",aver3);
}
void OUTPUT() //成绩输出
{
system("cls");
display();
int i;
printf("%s %s %s %s %s %s\n","学号","姓名","思修","体育","英语","平均分");
printf("--------------------------------------------------------\n");
for (i=0;i<num;i++)
{
printf("%s %s %d %d %d %.2f\n",st[i].ID,st[i].name,st[i].chn,st[i].cop,st[i].eng,st[i].ave);
}
}
void sort() //冒泡法排序 修改
{
system("cls");
display();
int j=0;
int i=0;
struct student st1; //定义一个结构体用来做中间变量
float f=0;
for(j=0;j<num-1;j++)
for(i=0;i<num-1-j;i++)
if(st[i].ave>st[i+1].ave)
{st1=st[i];st[i]=st[i+1];st[i+1]=st1;} //结构体交换
printf("按平均成绩排序后的结果为:\n");
printf("----------------------------------------------------------------------\n");
printf("%s %s %s %s %s %s\n","学号","姓名","思修","体育","英语","平均分");
for(i=num-1;i>=0;i--)
{
printf("%s %s %d %d %d %.2f\n",st[i].ID,st[i].name,st[i].chn,st[i].cop,st[i].eng,st[i].ave);
}
printf("\n");
}
int findname(char name[]) //返回数组下标的函数 返回值为int型
{
int i;
for(i=0;i<num;i++)
{
if(strcmp(st[i].name,name)==0) //比较原数据与传入的数据是否相等,若相等则返回姓名下标
{
return i;
}
else if(strcmp(st[i].ID,name)==0) //返回ID下标
{
return i;
}
}
return -1; //若姓名和ID均没有相同的,则返回-1
}
void display1(int a);
void find1() //按姓名或者学号查找学生
{
system("cls");
display();
int i,t=0;
printf("学生名单:\n");
printf("****************************************************************************\n");
for(i=0;i<num;i++)
{
printf("%s %s\t",st[i].ID,st[i].name);
t++;
if(t==5)
{
printf("\n");
t=0;
}
}
printf("\n");
while(1)
{
char name[20];
int a;
printf("请输入要查询的学生信息:");
scanf("%s",name);
printf("\n");
getchar(); //不可省略
a=findname(name);
if(a==-1)
{
printf("学生信息有误,请重新输入!\n");
}
else
{
printf("您要查询的学生信息为:\n");
printf("****************************************************************************\n");
display1(a);
}
printf("任意键继续,n退出:");
if(getchar()=='n')
{
break;
}
}
}
void display1(int a) //单一学生信息显示
{
printf("%s %s %s %s %s %s\n","学号","姓名","思修","体育","英语","平均分");
printf("----------------------------------------------------------------------------\n");
printf("%s %s %d %d %d %.2f\n",st[a].ID,st[a].name,st[a].chn,st[a].cop,st[a].eng,st[a].ave);
}
void subsection() //成绩分段
{
system("cls"); //清屏函数
display(); //使菜单始终显示在顶端
int i;
int b=0;
int t1=0,t2=0,t3=0;
printf("优秀学生名单:\n"); //通过三个循环将优秀、优良、差生分别累加并分类显示
printf("--------------------------------------------------------------------\n");
for(i=0;i<num;i++)
{
b=b+st[i].chn+st[i].cop+st[i].eng;
if(b>=211&&b<=300)
{
t1++;
printf("%s %s %d %d %d %.2f\n",st[i].ID,st[i].name,st[i].chn,st[i].cop,st[i].eng,st[i].ave);
}
b=0;
}
b=0;
printf("--------------------------------------------------------------------\n");
printf("优良学生名单:\n");
printf("--------------------------------------------------------------------\n");
for(i=0;i<num;i++)
{
b=b+st[i].chn+st[i].cop+st[i].eng;
if(b>=180&&b<=210)
{
t2++;
printf("%s %s %d %d %d %.2f\n",st[i].ID,st[i].name,st[i].chn,st[i].cop,st[i].eng,st[i].ave);
}
b=0;
}
b=0;
printf("--------------------------------------------------------------------\n");
printf("差生名单:\n");
printf("--------------------------------------------------------------------\n");
for(i=0;i<num;i++)
{
b=b+st[i].chn+st[i].cop+st[i].eng;
if(b>=0&&b<=179)
{
t3++;
printf("%s %s %d %d %d %.2f\n",st[i].ID,st[i].name,st[i].chn,st[i].cop,st[i].eng,st[i].ave);
}
b=0;
}
b=0;
printf("\n");
printf("********************************************************************\n");
printf("\n");
printf("优等生 优良生 差生\n");
printf("--------------------------------------------------------------------\n");
printf("%d个 %d个 %d个\n",t1,t2,t3);
printf("\n");
}
void output() //文件输出或者存储
{
system("cls");
display();
int i;
FILE *fp;
fp=fopen("student.txt","w+");
if(fp==NULL)
{
printf("文件打开错误!");
exit(0);
}
for(i=0;i<num;i++)
{
fprintf(fp,"%s %s %d %d %d %.2f\n",st[i].ID,st[i].name,st[i].chn,st[i].cop,st[i].eng,st[i].ave);
fprintf(fp,"\n");
}
fclose(fp);
}
void modify() //学生成绩修改
{
system("cls");
display();
int a;
int i;
char name[20];
printf("学生名单:\n"); //显示学生的姓名以备教师查看
printf("**************************************************************************\n");
for(i=0;i<num;i++)
{
printf("%s\t",st[i].name);
}
printf("\n");
printf("\n");
while(1)
{
printf("请输入要修改的学生的姓名:");
scanf("%s",&name);
a=findname(name); //通过姓名找到数组下标
if(a==-1) //如果没找到就接收到-1,从而报错
{
printf("学生信息有误!!!");
}
else
{
printf("需要修改的信息为:\n");
display1(a); //将需要修改的学生信息显示出来
int q;
printf("请输入要修改成绩的序号(1.英语 2.思修 3.体育):"); //选择要修改的科目
scanf("%d",&q);
if(q==1) //判断要修改的科目
{
printf("请输入要修改的英语成绩:");
scanf("%d",&st[a].eng); //重新输入要修改的成绩(将原先覆盖)
st[a].ave=(st[a].chn+st[a].cop+st[a].eng)/3.0; //对已修改的学生的平均分进行重新计算
getchar();
printf("任意键继续修改,n退出:");
if(getchar()=='n')
{
break;
}
}
if(q==2)
{
printf("请输入要修改的思修成绩:");
scanf("%d",&st[a].chn);
st[a].ave=(st[a].chn+st[a].cop+st[a].eng)/3.0;
getchar();
printf("任意键继续修改,n退出:");
if(getchar()=='n')
{
break;
}
}
if(q==3)
{
printf("请输入要修改的体育成绩:");
scanf("%d",&st[a].cop);
st[a].ave=(st[a].chn+st[a].cop+st[a].eng)/3.0;
getchar();
}
printf("任意键继续修改,n退出:");
if(getchar()=='n')
{
break;
}
}
}
}
void write() //bug 乱码问题解决,但是文本信息修改后读入的信息未改变 部分解决。 有bug
{
FILE *fp;
int i;
if ((fp=fopen("student.txt","rb"))==NULL)
{
printf("不能打开文件!\n");
return;
}
if(fread(&st[i], sizeof(struct student),2,fp)!=1)
{
printf("%s %s %d %d %d %.2f\n",st[i].ID,st[i].name,st[i].chn,st[i].cop,st[i].eng,st[i].ave);
printf("\n");
}
fclose(fp);
}
void Delete() //删除学生信息
{
system("cls");
display();
int i;
printf("学生名单:\n");
printf("*************************************************\n");
for(i=0;i<num;i++)
{
printf("%s\t",st[i].name);
}
printf("\n");
printf("*************************************************\n");
while(1)
{
char name[20];
int a;
printf("请输入要删除的学生姓名:"); //ID也可以实现,原理类似
scanf("%s",name);
a=findname(name); //确定数组下标
if(a==-1) //如果返回值为-1,提醒出错
{
printf("学生不存在!\n");
}
else
{
printf("你要删除的学生信息为:\n");
display1(a); //显示要删除的学生信息
printf("是否删除(确认请按y):");
getchar();
if(getchar()=='y')
{
for(i=a;i<num-1;i++)
{
st[i]=st[i+1]; //把后边的对象都向前移动
}
num--; //学生人数减去一,最后一位(即要删除的学生)就不会被显示了
}
}
getchar();
printf("任意键继续,n退出:");
if (getchar()=='n')
{
break;
}
}
}
int main() //主函数
{
display();
char i[200];
int b;
char p[30];
char a[60];
while(1)
{
printf("请输入密码:"); //密码 zhang 中国智造2025
scanf("%s",a);
if(strcmp(a,"zhang")==0) //设置简单的密码,如果输入的与设置的一致则程序继续运行,否则报错。
{
while(1)
{
printf("\n请选择功能:"); //系统可选功能范围,超出则提示输入有误,请先录入学生信息!
scanf("%s",&p);
printf("\n");
if(p[0]=='1'&&p[1]=='\0')
{
entry();break;
}
else if(p[0]=='1'&&p[1]=='1'&&p[2]=='\0')
{
write();
}
else if(p[0]=='0'&&p[1]=='\0')
{
exit(0); //退出系统
}
else
{
printf("输入有误,请先录入学生信息!\n");
}
}
while(1)
{
printf("\n请选择功能:");
scanf("%s",i); //判断用户输入的是否在0-11数字范围内,若输入字母或特殊符号则报错!
printf("\n");
if(strcmp(i,"1")==0)b=1;
else if(strcmp(i,"0")==0)b=0; //起
else if(strcmp(i,"2")==0)b=2;
else if(strcmp(i,"3")==0)b=3;
else if(strcmp(i,"4")==0)b=4;
else if(strcmp(i,"5")==0)b=5;
else if(strcmp(i,"6")==0)b=6;
else if(strcmp(i,"7")==0)b=7;
else if(strcmp(i,"8")==0)b=8;
else if(strcmp(i,"9")==0)b=9;
else if(strcmp(i,"10")==0)b=10;
else if(strcmp(i,"11")==0)b=11; // 终
else
{
b=-1;
}
if(b>=0&&b<=11) //b的范围在0-11之间
{
switch(b)
{
case 1:entry();break; //录入信息
case 2:average();break; //求班级总体的平均分
case 3:OUTPUT();break; //输出学生信息
case 4:sort();break; //排序
case 5:find1();break; //按学号或者姓名查找
case 6:modify();break; //修改
case 7:entry();break; //追加/
case 8:Delete();break; //删除
case 9:subsection();break; //成绩分段
case 10:output();break; //输出到文件
case 11:write();break; //从文件读取信息
case 0:exit(0);break; //退出系统
}
}
else if(b=-1) //如果b=-1,则报错
{
printf("暂未建设此功能,请重新选择!\n");
}
}
}
else
{
printf("密码错误请重新输入!\n");
}
}
}