学生成绩管理c语言

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
/*
 注:快排等高效率排序写不起 老卡死  以下排序都说选择排序 
  还有很多功能可写 
 期末成绩录入与读取  由学生结构体来写 
 int cal_how_many_data_in_txt();//计算文件数据个数 
 读取 void fetch();//由文件传递已有数据  该程序将自动读取 
 void entry();//由结构体数据传入文件储存 
 1.排序 void sort_low_to_high();从低到高 
 2.排序 void sort_high_to_low();//包含多种形式排序 具体由该函数实现 从高到低 
 3.增加 void add();
 4.删除 void delete_data();
 5.更新 void updata(); 
 6.显示 void show_data();
 7.查找 void find();//包含多种形式查找 具体由该函数实现  二分查找 
 8.菜单显示 void show_menu();
 9.排序 void sort_due_to_data();//按所选学生信息排序 如 姓名 学号 班级 专业 
 0.退出 
 student* auto_expand_data(student*);//扩展数据个数 
 student* set();//建立学生信息结构体 
*/
static int BEGIN=20;//起始数目  这个将会随数据个数而变化 
static int size=0;//数据个数 
const int BEISHU=3;//扩展用的倍数  水平有限只能先这样 
struct student{
 double score[5];//包含高数 英语 面向对象 物理 思修 
 double credit[5];//每门学分 这个由分数决定 
 char* name;//姓名 
 char* student_id;//学号 
 char* student_class;//学生班级 
 char* student_major;//学生专业 
};
int cal_how_many_data_in_txt();//计算文件数据个数 
void fetch(student*);//由文件传递已有数据  该程序将自动读取 
void entry(student*);//由结构体数据传入文件储存 
void sort_low_to_high(student*);//包含多种形式排序 具体由该函数实现 从低到高排序
void sort_high_to_low(student*);//包含多种形式排序 具体由该函数实现 从高到低排序
void sort_due_to_data(student*);//按所选学生信息排序 如 姓名 学号 班级 专业 
void add(student*);//增加记录 
void delete_data(student*);//删除记录 
void update(student*); //更新记录 
void show_data(student*);//显示数据 
int find(student*);//包含多种形式查找 具体由该函数实现  二分查找 
void sort(student*);//辅助find()二分查找 
void show_menu();//显示菜单 
student* set();//建立学生信息结构体 
student* auto_expand_data(student*);//扩展数据个数 
int main()
{
 student* data=set();
 show_menu();
 int select,flag=0;
 if(cal_how_many_data_in_txt())
  flag=1;
 while(1){
  printf("choice your select:");
  scanf("%d",&select);
  if(select==0){
   printf("退出学生成绩系统成功!\n");
   break;
  }
  if(select==3){
   add(data);
   flag=1;
  }
  if(flag){
  if(select==1)
   sort_low_to_high(data);
  if(select==2)
   sort_high_to_low(data);
  if(select==4)
   delete_data(data);
  if(select==5)
   update(data);
  if(select==6)
   show_data(data);
  if(select==7)
   find(data);
  if(select==8)
   show_menu();
  if(select==9)
   sort_due_to_data(data);
  }else
   printf("无数据存在,请增加数据再进行此类操作!\n");
 }
 entry(data);
 return 0;
}
void show_menu(){
 printf("1.排序(从低到高)\n"); 
 printf("2.排序(从高到低)\n"); 
 printf("3.增加\n"); 
 printf("4.删除\n"); 
 printf("5.更新\n"); 
 printf("6.显示\n"); 
 printf("7.查找\n"); 
 printf("8.菜单显示\n"); 
 printf("9.排序(按所选学生信息排序)\n");
 printf("0.退出\n"); 
} 
void fetch(student* data){//由文件传递已有数据  该程序将自动读取 
 FILE *fp = NULL;
 fp = fopen("test.txt", "r");
 int count=cal_how_many_data_in_txt();
 printf("自动为您读取%d条数据\n",count);
 for(;size<count;size++){
  //以下free不free没区别 局部 
  data[size].name=(char*)malloc(10*sizeof(char)); 
  data[size].student_id=(char*)malloc(20*sizeof(char));
  data[size].student_class=(char*)malloc(15*sizeof(char));
  data[size].student_major=(char*)malloc(15*sizeof(char));
 fscanf(fp, "%s %s %s %s", data[size].name,data[size].student_id,data[size].student_class,data[size].student_major);
 fscanf(fp,"%lf %lf %lf %lf %lf",&data[size].score[0],&data[size].score[1],&data[size].score[2],&data[size].score[3],&data[size].score[4]);
 fscanf(fp,"%lf %lf %lf %lf %lf",&data[size].credit[0],&data[size].credit[1],&data[size].credit[2],&data[size].credit[3],&data[size].credit[4]);
 }
 fclose(fp);
} 
void sort_due_to_data(student* data){//按所选学生信息排序 如 姓名 学号 班级 专业  
 int select;
 printf("选择你要以什么为依据排序:1.姓名;2.学号;3.班级;4.专业:");
 scanf("%d",&select);
 if(select==1)
  for(int i=0;i<size-1;i++){
   int k=i;
   for(int j=i+1;j<size;j++){
    if(strcmp(data[k].name,data[j].name)>0)
     k=j;
   }
   if(k!=i){
    student temp=data[k];
    data[k]=data[i];
    data[i]=temp;
   }
  }
 else if(select==2)
  for(int i=0;i<size-1;i++){
   int k=i;
   for(int j=i+1;j<size;j++){
    if(strcmp(data[k].student_id,data[j].student_id)>0)
     k=j;
   }
   if(k!=i){
    student temp=data[k];
    data[k]=data[i];
    data[i]=temp;
   }
  }
 else if(select==3)
  for(int i=0;i<size-1;i++){
   int k=i;
   for(int j=i+1;j<size;j++){
    if(strcmp(data[k].student_class,data[j].student_class)>0)
     k=j;
   }
   if(k!=i){
    student temp=data[k];
    data[k]=data[i];
    data[i]=temp;
   }
  }
 else if(select==4)
  for(int i=0;i<size-1;i++){
   int k=i;
   for(int j=i+1;j<size;j++){
    if(strcmp(data[k].student_major,data[j].student_major)>0)
     k=j;
   }
   if(k!=i){
    student temp=data[k];
    data[k]=data[i];
    data[i]=temp;
   }
  }
 printf("排序成功!\n");
}
void sort(student* data){//辅助find()二分查找 
 for(int i=0;i<size-1;i++){
  int k=i;
  for(int j=i+1;j<size;j++){
   if(strcmp(data[k].name,data[j].name)>0)
    k=j;
  }
  if(k!=i){
   student temp=data[k];
   data[k]=data[i];
   data[i]=temp;
  }
 }
 /*
 快排怎么死了。。。。 mdzz
 student temp=data[l];
 int i=l,j=r;
 if(l>=r)
  return;
 while(i!=j){
  while(i<j&&strcmp(data[j].name,temp.name)>0) j--;
  if(i<j)
   data[i]=data[j];
  while(i<j&&strcmp(data[i].name,temp.name)<0) i++;
  if(i<j)
   data[j]=data[i];
 }
 data[i]=temp;
 sort(data,l,i-1);
 sort(data,i+1,r);*/
}
void entry(student* data){//由结构体数据传入文件储存  水平有限只能这样写 
 FILE *fp = NULL;
 fp = fopen("test.txt", "r");
 fclose(fp);
 fp = fopen("test.txt", "w+");
 for(int i=0;i<size;i++){
  fprintf(fp,"%s %s %s %s\n", data[i].name,data[i].student_id,data[i].student_class,data[i].student_major);
  fprintf(fp,"%lf %lf %lf %lf %lf\n",data[i].score[0],data[i].score[1],data[i].score[2],data[i].score[3],data[i].score[4]);
  fprintf(fp,"%lf %lf %lf %lf %lf\n",data[i].credit[0],data[i].credit[1],data[i].credit[2],data[i].credit[3],data[i].credit[4]);
 }
 fclose(fp);
 printf("自动为您储存%d条数据(详细请看test文档)\n",size);
}
void sort_low_to_high(student* data){//包含多种形式排序 具体由该函数实现 低到高排序 
 int select;
 printf("选择你要按什么排序:1.高数成绩;2.英语成绩;3.面向对象成绩;4.思修成绩;5.物理成绩;6.总分;");
 scanf("%d",&select);
 if(select==6){
  for(int i=0;i<size-1;i++){
   int k=i;
   double sum1=data[i].score[0]+data[i].score[1]+data[i].score[2]+data[i].score[3]+data[i].score[4];
   for(int j=i+1;j<size;j++){
    double sum2=data[j].score[0]+data[j].score[1]+data[j].score[2]+data[j].score[3]+data[j].score[4];
    if(sum1>sum2)
     k=j;
   }
   if(k!=i){
    student temp=data[k];
    data[k]=data[i];
    data[i]=temp;
   }
  }
 }else{
  select--;
  for(int i=0;i<size-1;i++){
   int k=i;
   double sum1=data[i].score[select];
   for(int j=i+1;j<size;j++){
    double sum2=data[j].score[select];
    if(sum1>sum2)
     k=j;
   }
   if(k!=i){
    student temp=data[k];
    data[k]=data[i];
    data[i]=temp;
   }
  }
 }
 printf("排序成功!\n");
}
void sort_high_to_low(student* data){//从高到低排序 
 int select;
 printf("选择你要按什么排序:1.高数成绩;2.英语成绩;3.面向对象成绩;4.思修成绩;5.物理成绩;6.总分;");
 scanf("%d",&select);
 if(select==6){
  for(int i=0;i<size-1;i++){
   int k=i;
   double sum1=data[i].score[0]+data[i].score[1]+data[i].score[2]+data[i].score[3]+data[i].score[4];
   for(int j=i+1;j<size;j++){
    double sum2=data[j].score[0]+data[j].score[1]+data[j].score[2]+data[j].score[3]+data[j].score[4];
    if(sum1<sum2)
     k=j;
   }
   if(k!=i){
    student temp=data[k];
    data[k]=data[i];
    data[i]=temp;
   }
  }
 }else{
  select--;
  for(int i=0;i<size-1;i++){
   int k=i;
   double sum1=data[i].score[select];
   for(int j=i+1;j<size;j++){
    double sum2=data[j].score[select];
    if(sum1<sum2)
     k=j;
   }
   if(k!=i){
    student temp=data[k];
    data[k]=data[i];
    data[i]=temp;
   }
  }
 }
 printf("排序成功!\n");
}
void add(student* data){
 char flag;//判断是否继续添加数据 
 while(1){
  printf("依次输入姓名 学号 班级 专业 5门分数(依次为高数 英语 面向对象 思修 物理):\n");
  data[size].name=(char*)malloc(10*sizeof(char));
  data[size].student_id=(char*)malloc(20*sizeof(char));
  data[size].student_class=(char*)malloc(15*sizeof(char));
  data[size].student_major=(char*)malloc(15*sizeof(char));
  scanf("%s %s %s %s",data[size].name,data[size].student_id,data[size].student_class,data[size].student_major);
  for(int i=0;i<5;i++){
   scanf("%lf",&data[size].score[i]);
   if(data[size].score[i]>=90)
    data[size].credit[i]=5;
   else if(data[size].score[i]>=80)
    data[size].credit[i]=4;
   else if(data[size].score[i]>=70)
    data[size].credit[i]=3;
   else if(data[size].score[i]>=60)
    data[size].credit[i]=2;
   else
    data[size].credit[i]=1;
  }
  size++;
  if(size>=BEGIN){
   BEGIN*=BEISHU;
   data=auto_expand_data(data);
  }
  printf("是否继续增加记录(Y/N):");
  getchar();
  scanf("%c",&flag);
  if(flag!='y'&&flag!='Y')
   break; 
 }
} 
void delete_data(student* data){
 int delete_index=find(data);
 if(delete_index!=-1){
  char flag;
  printf("确定删除改信息吗(Y/N):");
  getchar();
  scanf("%c",&flag);
  if(flag=='y'||flag=='Y'){
   if(delete_index<size-1)
    for(int i=delete_index;i<size-1;i++)
     data[i]=data[i+1];
   size--;
   printf("删除成功!\n");
  }
  else
   printf("删除失败!(你未确定删除)\n");
 }
}
void update(student* data){
 int updata_index=find(data),select;
 char flag;
 if(updata_index!=-1){
  char* new_data=NULL;
  while(1){
   printf("选择您要修改的内容1.姓名;2.学号;3.班级;4.专业;5.成绩:");
   scanf("%d",&select);
   switch(select){
    case 1:new_data=(char*)malloc(10*sizeof(char));
      printf("输入您要修改的信息:");
      scanf("%s",new_data);
      printf("姓名修改成功:原名:%s---->新名:%s",data[updata_index].name,new_data);
      strcpy(data[updata_index].name,new_data);
     break;
    case 2:new_data=(char*)malloc(20*sizeof(char));
      printf("输入您要修改的信息:");
      scanf("%s",new_data);
      printf("学号修改成功:原学号:%s---->新学号:%s",data[updata_index].student_id,new_data);
      strcpy(data[updata_index].student_id,new_data);
     break;
    case 3:new_data=(char*)malloc(15*sizeof(char));
      printf("输入您要修改的信息:");
      scanf("%s",new_data);
      printf("班级修改成功:原班级:%s---->新班级:%s",data[updata_index].student_class,new_data);
      strcpy(data[updata_index].student_class,new_data);
     break;
    case 4:new_data=(char*)malloc(15*sizeof(char));
      printf("输入您要修改的信息:");
      scanf("%s",new_data);
      printf("专业修改成功:原专业:%s---->新专业:%s",data[updata_index].student_major,new_data);
      strcpy(data[updata_index].student_major,new_data);
     break;
    case 5:{
     int type;
     printf("选择你要修改的课程:1.高数;2.英语;3.面向对象;4.思修;5.物理\n");
     scanf("%d",&type);
     if(type>0&&type<=5){
      type--;
      int old=data[updata_index].score[type];
      printf("输入你要修过的成绩:");
      scanf("%lf",&data[updata_index].score[type]);
      printf("成绩修改成功!\n");
      if(type==0)
       printf("高数原成绩:%.1lf---->新成绩:%.1lf\n",old,data[updata_index].score[type]);
      else if(type==1)
       printf("英语原成绩:%.1lf---->新成绩:%.1lf\n",old,data[updata_index].score[type]);
      else if(type==2)
       printf("面向对象原成绩:%.1lf---->新成绩:%.1lf\n",old,data[updata_index].score[type]);
      else if(type==3)
       printf("思修原成绩:%.1lf---->新成绩:%.1lf\n",old,data[updata_index].score[type]);
      else
       printf("物理原成绩:%.1lf---->新成绩:%.1lf\n",old,data[updata_index].score[type]);
     }
     else
      printf("你的选择有误自动返回上一层!\n");
     break;
    }
    default:printf("你的选择有误自动返回上一层!\n");
   }
   printf("是否继续修改(Y/N):");
   getchar();
   scanf("%c",&flag);
   if(flag!='Y'&&flag!='y')
    break;
  }
 }
}
void show_data(student* data){
 for(int i=0;i<size;i++){
  printf("姓名:%s 学号:%s 班级:%s 专业:%s\n",data[i].name,data[i].student_id,data[i].student_class,data[i].student_major);
  printf("学生%s成绩信息如下:\n",data[i].name);
  printf("高数:分数:%.1lf 学分:%.1lf\n",data[i].score[0],data[i].credit[0]);
  printf("英语:分数:%.1lf 学分:%.1lf\n",data[i].score[1],data[i].credit[1]);
  printf("思修:分数:%.1lf 学分:%.1lf\n",data[i].score[3],data[i].credit[3]);
  printf("物理:分数:%.1lf 学分:%.1lf\n",data[i].score[4],data[i].credit[4]);
  printf("面向对象:分数:%.1lf 学分:%.1lf\n",data[i].score[2],data[i].credit[2]);
 }
}
int find(student* data){//包含多种形式查找 具体由该函数实现  二分查找 
 char* find_data=NULL;
 int select;
 int flag=0,i=0;
 sort(data);//排序 二分前提 
 printf("选择你通过什么查询,1.姓名;2.学号:");
 scanf("%d",&select);
 switch(select){
  case 1:find_data=(char*)malloc(20*sizeof(char));
   break;
  case 2:find_data=(char*)malloc(20*sizeof(char));
   break;
  default:find_data=NULL;
   break;
 }
 if(find_data!=NULL){
  if(select==1)
   printf("请输入姓名:");
  else
   printf("请输入学号:");
  scanf("%s",find_data);
  int l=0,r=size-1;
  if(select==1){
   while(l<=r){
    i=(l+r)/2;
    if(strcmp(find_data,data[i].name)>0)
     l=i+1;
    else if(strcmp(find_data,data[i].name)<0)
     r=i-1;
    else{
     flag=1;
     break;
    }
   }
  }else{
   while(l<=r){
    i=(l+r)/2;
    if(strcmp(find_data,data[i].student_id)>0)
     l=i+1;
    else if(strcmp(find_data,data[i].student_id)<0)
     r=i-1;
    else{
     flag=1;
     break;
    }
   }
  }
  if(!flag){
   if(select==1)
    printf("未找与姓名:%s有关的信息\n",find_data);
   else
    printf("未找与学号:%s有关的信息\n",find_data);
   return -1;
  }
  else{
   printf("信息如下:\n姓名:%s 学号:%s 班级:%s 专业:%s\n",data[i].name,data[i].student_id,data[i].student_class,data[i].student_major);
   printf("学生%s成绩信息如下:\n",data[i].name);
   printf("高数:分数:%.1lf 学分:%.1lf\n",data[i].score[0],data[i].credit[0]);
   printf("英语:分数:%.1lf 学分:%.1lf\n",data[i].score[1],data[i].credit[1]);
   printf("思修:分数:%.1lf 学分:%.1lf\n",data[i].score[3],data[i].credit[3]);
   printf("物理:分数:%.1lf 学分:%.1lf\n",data[i].score[4],data[i].credit[4]);
   printf("面向对象:分数:%.1lf 学分:%.1lf\n",data[i].score[2],data[i].credit[2]);
   return i;
  }
 }else{
  printf("选择错误,返回上一层!\n");
  return -1;
 }
}
student* set(){//建立学生信息结构体 
 printf("自动为您建立学生通讯录\n");
 while(cal_how_many_data_in_txt()>=BEGIN)
  BEGIN*=BEISHU;
 student* data=(student*)malloc(BEGIN*sizeof(student));
 fetch(data);
 return data;
}
student* auto_expand_data(student* old){//扩展数据个数 
 student* data=(student*)malloc(BEGIN*sizeof(student));
 for(int i=0;i<size;i++)
  data[i]=old[i];
 return data;
}
int cal_how_many_data_in_txt(){//计算文件数据个数   待优化  经验不足 只能这样写 
 FILE *fp = NULL;
 fp = fopen("test.txt", "r");
 int i=0;
 char* name=(char*)malloc(200*sizeof(char));
 while(fgets(name,200,(FILE *)fp )!=NULL)
  i++;
 fclose(fp);
 return i/3;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值