学生成绩管理系统(C语言)
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct
{
char num[20];
char name[20];
char grade[20];
char major[20];
int score[2];
int score1,score2,score3,sum,pj;
}STU;
STU stu[100];
int i=0;
int DengLu(char s1[])//登录
{
printf("输入密码: ");
char s2[10];
int k;
int j = 3;
while (j != 0)
{
gets(s2);
if (strcmp(s2, s1) == 0)break;
j--;
printf("密码错误还剩%d次机会,请重新输入: \n",j);
}
if(strcmp(s2,s1)==0)
{
printf("登录成功!\n");
return 1;
}
else
{
printf("登陆失败!\n");
return 0;
}
}
void add()//添加信息
{
printf("请依次输入学生学号,姓名,班级,专业,成绩1,成绩2,成绩3\n");
scanf("%s %s %s %s %d %d %d",&stu[i].num, &stu[i].name,&stu[i].grade,&stu[i].major,&stu[i].score1,&stu[i].score2,&stu[i].score3);
stu[i].sum=stu[i].score1+stu[i].score2+stu[i].score3;
stu[i].pj=(stu[i].sum)/3;
i++;
printf("共有%d个学生信息\n",i);
}
void display()//显示当前信息
{
int k=0;
printf("学号 姓名 班级 专业 成绩1 成绩2 成绩3 总成绩 平均成绩\n");
while(k<i)
{
printf("%4s %6s %8s %8s %7d %7d %7d %7d %9d\n",stu[k].num, stu[k].name,stu[k].grade,stu[k].major,stu[k].score1,stu[k].score2,stu[k].score3,stu[k].sum,stu[k].pj);
k++;
}
printf("\n");
}
void Delete()//删除信息
{
int c;
char name1[20],num1[20];
printf("***********删除功能***********\n");
printf("1.根据学号删除 2.根据姓名删除\n");
scanf("%d",&c);
if(c<=0 && c>2)printf("error");
else{
int q=0;
switch (c)
{
case 1:
printf("输入学生学号:\n");
scanf("%s",&num1);
while(q<i-1)
{
if(strcmp(num1,stu[q].num)==0)break;
q++;
}
//循环跳出后,如果q == i-1,也就是判断最后一个学生学号是否是该学号
if(q == (i-1)){
if(strcmp(num1,stu[q].num)!=0){
printf("未能找到该学生,输入学号有误");
//找不到则,将p设置为-1
p = -1;
}
}
break;
case 2:
printf("输入学生姓名:\n");
scanf("%s",&name1);
while(q<i)
{
if(strcmp(name1,stu[q].name)==0)break;
q++;
}
if(q>i)printf("error\n");
break;
}
if(q == -1){
printf("查无此人\n");
}else {
for (; q < i; q++)
{
stu[q] = stu[q + 1];
}
i--;
printf("删除成功!\n");
}
}
}
void Correct()//修改信息
{
int q=0;
int c;
char name1[20],num1[20];
printf("*****************修改功能****************\n");
printf("1.根据学号修改信息 2.根据姓名修改信息\n");
scanf("%d",&c);
if(c<=0 && c>2)printf("error");
else{
switch (c)
{
case 1:
printf("输入学生学号:\n");
scanf("%s",&num1);
while(q<i)
{
if(strcmp(num1,stu[q].num)==0)break;
q++;
}
if(q>i)printf("error\n");
break;
case 2:
printf("输入学生姓名:\n");
scanf("%s",&name1);
while(q<i)
{
if(strcmp(name1,stu[q].name)==0)break;
q++;
}
if(q>i)printf("error\n");
break;
}
printf("请依次输入学生学号,姓名,班级,专业,成绩1,成绩2,成绩3\n");
scanf("%s %s %s %s %d %d %d",&stu[q].num, &stu[q].name,&stu[q].grade,&stu[q].major,&stu[q].score1,&stu[q].score2,&stu[q].score3);
stu[q].sum=stu[q].score1+stu[q].score2+stu[q].score3;
stu[q].pj=(stu[q].sum)/3;
}
printf("修改成功!\n");
}
void savefile()//保存文件
{
int p;
FILE *fp;
fp=fopen("学生成绩.txt","w+");
if(!fp)
{
printf("error!\n");
}
for(p=0;p<i;p++)
{
fprintf(fp,"%s %s %s %s %d %d %d %d %d\n",stu[p].num, stu[p].name,stu[p].grade,stu[p].major,stu[p].score1,stu[p].score2,stu[p].score3,stu[p].sum,stu[p].pj);
}
fclose(fp);
printf("文件已经保存!\n");
}
void displayfile()//展示文件信息
{
int j=0;
int k=0;
FILE *fp;
if((fp=fopen("学生成绩.txt","r"))==NULL)
{
printf("Can not open file\n");
}
while(!feof(fp))
{
fscanf(fp,"%s %s %s %s %d %d %d %d %d\n",&stu[j].num,&stu[j].name,&stu[j].grade,&stu[j].major,&stu[j].score1,&stu[j].score2,&stu[j].score3,&stu[j].sum,&stu[j].pj);
j++;
}
printf("学号 姓名 班级 专业 成绩1 成绩2 成绩3 总成绩 平均成绩\n");
for(k=0;k<j;k++)
printf("%4s %6s %8s %8s %7d %7d %7d %7d %9d\n",stu[k].num,stu[k].name,stu[k].grade,stu[k].major,stu[k].score1,stu[k].score2,stu[k].score3,stu[k].sum,stu[k].pj);
fclose(fp);
}
void paixu()//冒泡法排序
{
int w,j;
STU temp;
for(w=0;w<i;w++)
for(j=0;j<i-w;j++)
{
if(stu[j].sum<=stu[j+1].sum)
{
temp=stu[j];
stu[j]=stu[j+1];
stu[j+1]=temp;
}
}
}
void file1()//平均成绩排序文件
{
paixu();
int p;
FILE *fp;
fp=fopen("学生平均成绩排序表.txt","w+");
if(!fp)
{
printf("error!\n");
}
for(p=0;p<i;p++)
{
fprintf(fp,"%s %s %d\n",stu[p].num, stu[p].name,stu[p].pj);
}
fclose(fp);
printf("平均成绩排序文件已经生成!\n");
}
void file2()//总成绩排序文件
{
paixu();
int p;
FILE *fp;
fp=fopen("学生总成绩排序表.txt","w+");
if(!fp)
{
printf("error!\n");
}
for(p=0;p<i;p++)
{
fprintf(fp,"%s %s %d\n",stu[p].num, stu[p].name,stu[p].sum);
}
fclose(fp);
printf("总成绩排序文件已经生成!\n");
}
void find()//折半查找找出给定分数段的人
{
int score,low,high;
int mid=0,j=0;
FILE *fp;
if((fp=fopen("学生总成绩排序表.txt","r"))==NULL)
{
printf("Can not open file\n");
}
while(!feof(fp))
{
fscanf(fp,"%s %s %d\n",&stu[j].num,&stu[j].name,&stu[j].sum);
j++;
}
fclose(fp);
printf("输入要查找的总成绩分数:");
scanf("%d",&score);
high=j-1;
while(low<=high)
{
mid=(low+high)/2;
if(stu[mid].sum==score)break;
if(stu[mid].sum<score)high=mid-1;
if(stu[mid].sum>score)low=mid+1;
}
if(low<=high)
{
printf("该分数段学生排名第%d位\n",mid+1);
int temp=mid;
int temp1=mid;
int n=0,n1=0;
mid--;
for(;temp<=j-1;temp++)if(stu[temp].sum==score)++n;
for(;mid>=0;mid--)if(stu[mid].sum==score)++n1;
int total=temp1-n1;
printf("学号 姓名 总成绩\n");
for(;total<temp1+n;total++)printf("%3s %6s %7d\n",stu[total].num,stu[total].name,stu[total].sum);
}
else printf("error!\n");
}
int main()
{
int k;
char s1[10]="123456";
k=DengLu(s1);
if(k==0)exit(0);
int j=0;
FILE *fp;
if((fp=fopen("学生成绩.txt","r"))==NULL)
{
printf("Can not open file\n");
}
else
{
while(!feof(fp))
{
fscanf(fp,"%s %s %s %s %d %d %d %d %d\n",&stu[j].num,&stu[j].name,&stu[j].grade,&stu[j].major,&stu[j].score1,&stu[j].score2,&stu[j].score3,&stu[j].sum,&stu[j].pj);
j++;
}
fclose(fp);
i=j;
printf("当前共有多少个学生:%d\n",i);
}
int c=0;
while (c<10)
{
printf("\n");
printf("******************************\n");
printf(" 1.添加信息 6.总成绩排序\n");
printf(" 2.显示文件 7.平均成绩排序\n");
printf(" 3.展示数据 8.修改信息\n");
printf(" 4.删除信息 9.保存文件\n");
printf(" 5.查询信息 10.退出系统\n");
printf("******************************\n");
printf("请根据你的需要选择(1~10):");
scanf("%d",&c);
printf("\n");
switch (c)
{
case 1:
add();
break;
case 2:
displayfile();
break;
case 3:
display();
break;
case 4:
Delete();
break;
case 5:
find();
break;
case 6:
file2();
break;
case 7:
file1();
break;
case 8:
Correct();
break;
case 9:
savefile();
break;
case 10:
printf("exit!\n");
}
}
return 0;
}