学生成绩管理系统

这是本学期的课程设计,总共有两个题目,其中一个是学生成绩管理系统(要求各种排序),一个是仓库货物管理系统,由于货物管理系统和以前做过的学生信息管理类似,都是二叉树结构,本次就写了学生成绩管理系统,使用的是存储结构是结构体数组(三种结构体相互嵌套,比较笨哦),方便排序嘛,排序部分用的是快速排序算法,如果成绩相同,则进行按学号排序。绑定一个配置文件,程序完全是“空”的,所有信息依赖用户输入,依赖配置文件,这是我的程序第一次完全实现数据和程序“分家”。

#include<stdio.h>
#include <stdlib.h>
#include<string.h>
#define LENGTH 1000
int longth=1; //用于重分配内存
const int nnumber=0,nrank=1,nscore=2;//按学号 名词 总分 排序
typedef struct Birthday
{ int year;
int month;
int day;
}Birthday;
typedef struct Sstu
{ char name[20];
char sex[10];
Birthday birthday;
char colloge[20];
int grade;
char major[20];
int info[10];
}Sstu;
typedef struct Student
{ int stunumber;
int scorenumber;
char information[10][10];
Sstu *hole;
}Student;
void Editdeal(Student *S);
void Filedeal(Student *S);
void Fileread(FILE *fp,Student *S);
void Filesave(FILE *fp,Student *S);
void Filesaveother(FILE *fp,Student *S);
int Find(int id,Student *S,int flag);
int Getint(void);
void InitS(Student *S);
void Read(Student *S);
void Searchdeal(Student *S);
void Sortdeal(Student *S);
void Sort(int m,Student *S,int start,int end);
int Partition(int m,Student *S,int start,int end);
void Sort2(int m,Student *S,int start,int end);
int Partition2(int m,Student *S,int start,int end);
void Sort3(int m,Student *S,int start,int end);
void dellast(void);
void Print(Student *S);
void main(void)
{ Student S;
int flag;
FILE *fp=0;
InitS(&S);
if((fp=fopen("配置文件.txt","rb"))!=0)
{ printf("/n正在读取配置文件,请稍等、、、");
Fileread(fp,&S);
fclose(fp);
printf("/n读取完毕");
}
else
{ printf("/n首次使用没有生成配置文件,请首先输入学生成绩等信息");
    Read(&S);
fp=fopen("配置文件.txt","wb");
Filesave(fp,&S);
fclose(fp);
}
printf("/n---------------------------------------------------------");
printf("/n|                                                        |");
printf("/n|    o(∩_∩)o... 欢迎使用学生成绩管理系统               |");
printf("/n|                                                        |");
do
{ printf("/n|---------------------------------------------------|");
printf("/n|1,文件||2,编辑||3,查找||4,排序||5,输出||0,退出 |");
printf("/n|---------------------------------------------------|/n选择=");
    flag=Getint();
switch(flag)
{ case 1: Filedeal(&S); break;
   case 2: Editdeal(&S); break;
      case 3: Searchdeal(&S); break;
      case 4: Sortdeal(&S); break;
   case 5: Print(&S); break;
      case 0: break;
      default : printf("/n选择无效,请重新选择"); break;
}
}while(flag);
printf("/n你想保存操作吗?/n1,保存||0,不保存/n选择=");
flag=Getint();
if(flag)
{ if((fp=fopen("配置文件.txt","wb"))!=0)
{ Filesave(fp,&S);
fclose(fp);
}
else printf("/n保存失败");
}
printf("/n谢谢使用");
}
void Filedeal(Student *S)
{ int flag;
FILE *fp=0;
char address[50];
printf("/n1,重新读取||2,重新键盘输入||3,保存||4,另存为||0,退出/n选择=");
flag=Getint();
switch(flag)
{ case 1: if((fp=fopen("配置文件.txt","rb"))!=0)
{            Fileread(fp,S);
               fclose(fp);
}
             else printf("/n读取失败");
    break;
   case 2: Read(S); break;
   case 3: if((fp=fopen("配置文件.txt","wb"))!=0)
    { Filesave(fp,S);
           fclose(fp);
    }
         else printf("/n保存失败");
    break;
   case 4: if(S->stunumber==0)
    { printf("没有学生的信息!");
              return;
    }
        printf("/n请输入地址如:D://文件//成绩.txt,保存到当前文件夹如:成绩.txt/n文件地址=");
        gets(address);
     if((fp=fopen(address,"w"))!=0)
     { Filesaveother(fp,S);
       fclose(fp);
     }
     else printf("/n保存失败");
     break;
   case 0: break;
   default : printf("/n选择无效");
}
}
void Editdeal(Student *S)
{ int flag,flag2,id,i,j,sum=0;
printf("/n1,插入||2,删除||3,编辑某个学生信息||0,退出/n选择=");
flag2=Getint();
switch(flag2)
{ case 1:
    if(S->stunumber+1>=longth*LENGTH)
    { longth++;
     while(!(S->hole=(Sstu *)realloc(S->hole,(longth*LENGTH)*sizeof(Sstu))))
       continue;
    }
    Sort(nnumber,S,0,S->stunumber-1);//快速排序按学号排序
            printf("/n请输入学号:/n学号=");
            id=Getint();
    flag=1;
            i=Find(id,S,flag);
      if(i<0)
    { printf("/n学号不能小于0!!");
        return;
    }
    for(j=S->stunumber;j>i;j--)//
     S->hole[j]=S->hole[j-1];
            S->hole[i].info[nnumber]=id;
            printf("/n请输入姓名/n姓名=");
    gets(S->hole[i].name);
            printf("/n请输入性别/n性别=");
    gets(S->hole[i].sex);
            printf("/n请输入出生日期 如2009,08,15/n出生日期=");
            scanf("%d,%d,%d",&(*S).hole[i].birthday.year,&(*S).hole[i].birthday.month,&(*S).hole[i].birthday.day);
    dellast();
    printf("/n请输入所在学院/n学院=");
    gets(S->hole[i].colloge);
            printf("/n请输入所在专业/n专业=");
    gets(S->hole[i].major);
            printf("/n请输入入学时间/n入学时间=");
    S->hole[i].grade=Getint();
    for(j=0;j<S->scorenumber;j++)//从单科成绩开始输入
    { printf("/n请输入 %s 的成绩",S->information[j+3]);
     sum+=S->hole[i].info[j+3]=Getint();
    }
            S->hole[i].info[nscore]=sum;
    S->stunumber++;
            Sort3(nscore,S,0,S->stunumber);
    for(i=0;i<S->stunumber;i++)
     S->hole[i].info[nrank]=i+1;
    break;
case 2: if(S->stunumber==0)
    { printf("没有学生的信息!");
            return;
    }
       Sort(nnumber,S,0,S->stunumber-1);
       printf("/n请输入要删除的学号/n学号=");
       id=Getint();
    flag=0;
          i=Find(id,S,flag);//二分查找返回结构体的位置
     if(i<0||i>S->hole[S->stunumber-1].info[nnumber])
    { printf("/n没有学号是%d的学生的信息",id);
      return;
    }
    for(j=i;j<S->stunumber;j++)
     S->hole[j]=S->hole[j+1];
       S->stunumber--;
            Sort3(nscore,S,0,S->stunumber-1);
    for(i=0;i<S->stunumber;i++)
     S->hole[i].info[nrank]=i+1;
    break;
case 3: if(S->stunumber==0)
    { printf("没有学生的信息!");
            return;
    }
       Sort(nnumber,S,0,S->stunumber-1);
       printf("/n请输入要编辑的学号/n学号=");
       id=Getint();
    flag=0;
          i=Find(id,S,flag);
     if(i<0||i>=S->stunumber)
    { printf("/n没有学号是%d的学生的信息3",id);
      return;
    }
    printf("/n学号是%d的学生信息如下",id);
    printf("/n-------------------------------------------------------------");
          printf("/n学号:%d/t姓名:%s/t",S->hole[i].info[nnumber],S->hole[i].name);
    printf("/n出生日期:%d年%d月%d日",S->hole[i].birthday.year,S->hole[i].birthday.month,S->hole[i].birthday.day);
    printf("/n学院:%s/t专业:%s/t年级:%d",S->hole[i].colloge,S->hole[i].major,S->hole[i].grade);
          printf("/n排名:%d/t总分:%d",S->hole[i].info[nrank],S->hole[i].info[nscore]);
    for(j=0;j<S->scorenumber;j++)
    printf("/t%S:%d",S->information[j+3],S->hole[i].info[j+3]);
    printf("/n-------------------------------------------------------------");
    printf("/n请输入新的学号/n学号=");
          S->hole[i].info[nnumber]=Getint();
            printf("/n请输入姓名/n姓名=");
    gets(S->hole[i].name);
            printf("/n请输入性别/n性别=");
    gets(S->hole[i].sex);
            printf("/n请输入出生日期 如2009,08,15/n出生日期=");
            scanf("%d,%d,%d",&(*S).hole[i].birthday.year,&(*S).hole[i].birthday.month,&(*S).hole[i].birthday.day);
    dellast();
    printf("/n请输入所在学院/n学院=");
    gets(S->hole[i].colloge);
            printf("/n请输入所在专业/n专业=");
    gets(S->hole[i].major);
            printf("/n请输入入学时间/n入学时间=");
    S->hole[i].grade=Getint();
    for(j=0;j<S->scorenumber;j++)//从单科成绩开始输入
    { printf("/n请输入 %s 的成绩",S->information[j+3]);
     sum+=S->hole[i].info[j+3]=Getint();
    }
            S->hole[i].info[nscore]=sum;
    Sort3(nscore,S,0,S->stunumber-1);
    for(i=0;i<S->stunumber;i++)
     S->hole[i].info[nrank]=i+1;
    break;
case 0: break;
default : break;
}
}
void Searchdeal(Student *S)
{ int id,i,j,flag=0;
   if(S->stunumber==0)
{ printf("没有学生的信息!");
    return;
}
   Sort(nnumber,S,0,S->stunumber-1);
   printf("请输入学号/n学号=");
   id=Getint();
   i=Find(id,S,flag);
   if(i<0)
   { printf("/n没有学号是%d的学生的信息",id);
     return;
   }
    printf("/n学号是%d的学生信息如下",id);
    printf("/n-------------------------------------------------------------");
          printf("/n学号:%d/t姓名:%s/t",S->hole[i].info[nnumber],S->hole[i].name);
    printf("/n出生日期:%d年%d月%d日",S->hole[i].birthday.year,S->hole[i].birthday.month,S->hole[i].birthday.day);
    printf("/n学院:%s/t专业:%s/t年级:%d",S->hole[i].colloge,S->hole[i].major,S->hole[i].grade);
          printf("/n排名:%d/t总分:%d",S->hole[i].info[nrank],S->hole[i].info[nscore]);
    for(j=0;j<S->scorenumber;j++)
    printf("/t%s:%d",S->information[j+3],S->hole[i].info[j+3]);
    printf("/n-------------------------------------------------------------");
}
void Sortdeal(Student *S)
{ int num,i,j;
   if(S->stunumber==0)
{ printf("没有学生的信息!");
    return;
}
   printf("/n请输入按什么排序");
   printf("/n1,学号||2,排名||3,总成绩");
   for(i=0;i<S->scorenumber;i++)
    printf("||%d,%s",i+4,S->information[i+3]);
   printf("/n选择=");
   num=Getint();
   num--;
   if(num==0||num==1)
    Sort(num,S,0,S->stunumber-1);
   else
Sort3(num,S,0,S->stunumber-1);
   printf("/n按照 %s 排序的学生成绩信息如下:/n",S->information[num]);
   for(i=0;i<S->stunumber;i++)
   { printf("/n-------------------------------------------------------------");
          printf("/n学号:%d/t姓名:%s/t",S->hole[i].info[nnumber],S->hole[i].name);
    printf("/n出生日期:%d年%d月%d日",S->hole[i].birthday.year,S->hole[i].birthday.month,S->hole[i].birthday.day);
    printf("/n学院:%s/t专业:%s/t年级:%d",S->hole[i].colloge,S->hole[i].major,S->hole[i].grade);
          printf("/n排名:%d/t总分:%d",S->hole[i].info[nrank],S->hole[i].info[nscore]);
    for(j=0;j<S->scorenumber;j++)
    printf("/t%s:%d",S->information[j+3],S->hole[i].info[j+3]);
   }
   printf("/n-------------------------------------------------------------");
}
void InitS(Student *S)
{ strcpy(S->information[0],"学号");
strcpy(S->information[1],"排名");
strcpy(S->information[2],"总分");
while(!(S->hole=(Sstu *)malloc((LENGTH)*sizeof(Sstu))))
   continue;
}
void Fileread(FILE *fp,Student *S)
{ int i;
fscanf(fp,"/t%d",&S->stunumber);
fscanf(fp,"/t%d",&S->scorenumber);
fread(&S->information,sizeof(S->information),1,fp);
for(i=0;i<S->stunumber;i++)
{ if(S->stunumber+1>=longth*LENGTH)
{ longth++;
   while(!(S->hole=(Sstu *)realloc(S->hole,(longth*LENGTH)*sizeof(Sstu))))
   continue;
}
   fread(&S->hole[i],sizeof(S->hole[i]),1,fp);
}
}
void Read(Student *S)
{ int i,j,sum;
printf("/n请输入学科的数量/n学科数量=");
S->scorenumber=Getint();
for(i=0;i<S->scorenumber;i++)
{ printf("/n请输入第%d个学科的名称/n名称=",i+1);
    gets(S->information[i+3]);
}
printf("/n开始输入学生详细信息,当学号输入为非整数时停止输入");
for(i=0;;i++)
{ sum=0;
    if(S->stunumber+1>=longth*LENGTH)
{ longth++;
   while(!(S->hole=(Sstu *)realloc(S->hole,(longth*LENGTH)*sizeof(Sstu))))
     continue;
}
   printf("/n请输第%d个学生的学号/n学号=",i+1);
          if(scanf("%d",&S->hole[i].info[nnumber])!=1)
     break;
     dellast();
            printf("/n请输入姓名/n姓名=");
    gets(S->hole[i].name);
            printf("/n请输入性别/n性别=");
    gets(S->hole[i].sex);
            printf("/n请输入出生日期 如2009,08,15/n出生日期=");
            scanf("%d,%d,%d",&(*S).hole[i].birthday.year,&(*S).hole[i].birthday.month,&(*S).hole[i].birthday.day);
    dellast();
    printf("/n请输入所在学院/n学院=");
    gets(S->hole[i].colloge);
            printf("/n请输入所在专业/n专业=");
    gets(S->hole[i].major);
            printf("/n请输入入学时间/n入学时间=");
    S->hole[i].grade=Getint();
    for(j=0;j<S->scorenumber;j++)//从单科成绩开始输入
    { printf("/n请输入 %s 的成绩/n%s成绩=",S->information[j+3],S->information[j+3]);
     sum+=S->hole[i].info[j+3]=Getint();
    }
            S->hole[i].info[nscore]=sum;
}
S->stunumber=i;
Sort3(nscore,S,0,S->stunumber-1);
for(i=0;i<S->stunumber;i++)
S->hole[i].info[nrank]=i+1;
}
void Filesave(FILE *fp,Student *S)
{ int i;
if(S->stunumber==0)
{ printf("没有学生的信息!");
    return;
}
fprintf(fp,"/t%d",S->stunumber);
fprintf(fp,"/t%d",S->scorenumber);
fwrite(S->information,sizeof(S->information),1,fp);
for(i=0;i<S->stunumber;i++)
   fwrite(&S->hole[i],sizeof(Sstu),1,fp);
}
void Filesaveother(FILE *fp,Student *S)
{ int i,j;
   if(S->stunumber==0)
   { printf("没有学生的信息!");
     return;
   }
    fprintf(fp,"学生数量:%d/n",S->stunumber);
    fprintf(fp,"学科数量:%d/n",S->scorenumber);
fprintf(fp,"学科名称:");
for(j=0;j<S->scorenumber;j++)
fprintf(fp,"/t%s",S->information[j+3]);
    for(i=0;i<S->stunumber;i++)
   { fprintf(fp,"/n-------------------------------------------------------------");
          fprintf(fp,"/n学号:%d/t姓名:%s/t",S->hole[i].info[nnumber],S->hole[i].name);
    fprintf(fp,"/n出生日期:%d年%d月%d日",S->hole[i].birthday.year,S->hole[i].birthday.month,S->hole[i].birthday.day);
    fprintf(fp,"/n学院:%s/t专业:%s/t年级:%d",S->hole[i].colloge,S->hole[i].major,S->hole[i].grade);
          fprintf(fp,"/n排名:%d/t总分:%d",S->hole[i].info[nrank],S->hole[i].info[nscore]);
    for(j=0;j<S->scorenumber;j++)
    fprintf(fp,"/t%s:%d",S->information[j+3],S->hole[i].info[j+3]);
   }
   fprintf(fp,"/n-------------------------------------------------------------");
}
int Find(int id,Student *S,int flag)
{ int i,low=0,up,mid;
   if(id<0)
{ printf("/n找不到学号为%d的学生信息",id);
    return -1;
}
if(flag==0)
{ if(id==S->hole[0].info[nnumber])
    return 0;
    if(id==S->hole[S->stunumber-1].info[nnumber])
   return S->stunumber-1;
up=S->stunumber-1;
    mid=(low+up)/2;
    while(S->hole[mid].info[nnumber]!=id&&low<=up)
{ if(S->hole[mid].info[nnumber]>id)
      up=mid-1;
     if(S->hole[mid].info[nnumber]<id)
   low=mid+1;
mid=(low+up)/2;
}
if(S->hole[mid].info[nnumber]==id)
   return mid;
}
else if(flag==1)
{ if(id<=S->hole[0].info[nnumber])
     return 0;
    if(id>=S->hole[S->stunumber-1].info[nnumber])
     return S->stunumber;
for(i=0;i<S->stunumber;i++)
     if(id>S->hole[i].info[nnumber]&&id<S->hole[i+1].info[nnumber])
       return i;
}
return -1;
}
int Getint(void)
{ int m;
while(scanf("%d",&m)!=1)
{ while(getchar()!='/n')
    continue;
    printf("/n请输入一个整数/n整数=");
}
while(getchar()!='/n')
    continue;
return m;
}
void Sort(int m,Student *S,int start,int end)
{ int pivotloc;
if(start<end)
{ pivotloc=Partition(m,S,start,end);
Sort(m,S,start,pivotloc-1);
Sort(m,S,pivotloc+1,end);
}
}
int Partition(int m,Student *S,int start,int end)
{ int pivotkey;
Sstu A;
A=S->hole[start];
pivotkey=S->hole[start].info[m];
while(start<end)
{ while(start<end&&S->hole[end].info[m]>=pivotkey)
      end--;
    S->hole[start]=S->hole[end];
    while(start<end&&S->hole[start].info[m]<=pivotkey)
      start++;
    S->hole[end]=S->hole[start];
}
S->hole[start]=A;
return start;
}
void Sort3(int m,Student *S,int start,int end) /*调用Sort2函数,首先进行从大到小排序,若有若干人成绩相同,则对他们按学号排序*/
{ int i=0,j=1;
Sort2(m,S,start,end);
while(i<=end&&j<=end)
{ if(S->hole[i].info[m]!=S->hole[j].info[m]&&i<=end&&j<=end)
{ i++;
    j++;
}
if(S->hole[i].info[m]==S->hole[j].info[m]&&i<=end&&j<=end)
{ while(S->hole[i].info[m]==S->hole[j].info[m]&&i<=end&&j<=end)
    j++;
    Sort(nnumber,S,i,j-1);
i=j-1;
}
}
}
void Sort2(int m,Student *S,int start,int end)///从大到小排序
{ int pivotloc;
if(start<end)
{ pivotloc=Partition2(m,S,start,end);
Sort2(m,S,start,pivotloc-1);
Sort2(m,S,pivotloc+1,end);
}
}
int Partition2(int m,Student *S,int start,int end)
{ int pivotkey;
Sstu A;
A=S->hole[start];
pivotkey=S->hole[start].info[m];
while(start<end)
{ while(start<end&&S->hole[end].info[m]<=pivotkey)
      end--;
    S->hole[start]=S->hole[end];
    while(start<end&&S->hole[start].info[m]>=pivotkey)
      start++;
    S->hole[end]=S->hole[start];
}
S->hole[start]=A;
return start;
}
void dellast(void)
{ while(getchar()!='/n')
   continue;
}
void Print(Student *S)
{ int i,j;
    if(S->stunumber==0)
{ printf("没有学生的信息!");
    return;
}
for(i=0;i<S->stunumber;i++)
   { printf("/n-------------------------------------------------------------");
          printf("/n学号:%d/t姓名:%s/t",S->hole[i].info[nnumber],S->hole[i].name);
    printf("/n出生日期:%d年%d月%d日",S->hole[i].birthday.year,S->hole[i].birthday.month,S->hole[i].birthday.day);
    printf("/n学院:%s/t专业:%s/t年级:%d",S->hole[i].colloge,S->hole[i].major,S->hole[i].grade);
          printf("/n排名:%d/t总分:%d",S->hole[i].info[nrank],S->hole[i].info[nscore]);
    for(j=0;j<S->scorenumber;j++)
    printf("/t%s:%d",S->information[j+3],S->hole[i].info[j+3]);
   }
   printf("/n-------------------------------------------------------------");
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值