C语言学生信息管理库制作

我制作了一个http删除://yunpan.删除cn/Qe4eSLMNJRIy4,这是源代码,但是老师说最好再添加两个功能,我想了一下,要是能添加一个修改学生成绩和把学生按平均分成绩排序应该是不错的想法。所以来求助各位,谢谢。当然你完全可以不接着我的代码继续写,可以自由发挥,项目也可以自己决定。无外乎是成绩查询、输出、打印所有结果、修改....之类的,自由发挥即可,只要有5个选项就行了。代码可以发在楼下,也可以发到我邮箱elowes@foxmail点com。谢谢

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<string.h>
/*作者:北京交通大学运输10级 lenhal
  功能:成绩管理系统
  时间:2012年7月
*/
int n=2;             //全局变量,要输入的学生数,自行改变其值
struct student
{
 char num[10];
 char name[10];
 float score[3];
 float avg;
}stu[200];
/**********************************************************************************************/
void enter(struct student t[])//输入数据
{
 int i,j,k,a;
 system("cls");
 printf("输入数据之前,请确定输入的人数\n你是否已经确定了人数\n");
 printf("是输入1回车继续\n否输入0回车退出程序,改变全局变量的值\n");
 scanf("%d",&a);
 if(a!=1)
  exit(0);
 for(i=0;i<n;i++)
 {
  system("cls");                          //清屏
  printf("请输入第%d个学生的学号:\n",i+1);
  scanf("%s",t[i].num);
  for(j=0;j<i;j++)
   if(strcmp(t[i].num,t[j].num)==0)                  //避免有相同的学号
   {
    i--;
    printf("此学号的学生已存在,请重新输入:");
    Sleep(3000);
    break;
   }
 }
 for(i=0;i<n;i++)
 {
  system("cls");
  printf("请输入学号为%s学生的:(用空格隔开) \n名字 第一门成绩 第二门成绩 第三门成绩\n",t[i].num);
  //t[i].score[0]=0;t[i].score[1]=0;t[i].score[2]=0;
  scanf("%s%f%f%f",t[i].name,&t[i].score[0],&t[i].score[1],&t[i].score[2]);
  t[i].avg=(t[i].score[0]+t[i].score[1]+t[i].score[2])/3.0;
 }
}
/**********************************************************************************************/
int list(struct student t[])               //显示所有信息
{
 int i;
 system("cls");
 printf("所有%d个学生信息如下:\n\n",n);
 printf("学号     名字    第一门成绩   第二门成绩   第三门成绩   平均分\n");
 for(i=0; ;i++)
 {
  if(strlen(t[i].num)!=0)                 //判断是否结束
  printf("%s\t%s\t  %5.2f\t        %5.2f\t    %5.2f\t %5.2f\t\n",
  t[i].num,t[i].name,t[i].score[0],t[i].score[1],t[i].score[2],t[i].avg);
  else 
   break;
 }
 putchar(10);
}
/**********************************************************************************************/
void research(struct student t[])           //按学号查找某个信息
{
 int i,a,y;
 char s[10];
 while(1)
 {
 system("cls");
 printf("请输入要查询的学号:");
 scanf("%s",&s);
 for(i=0; ;i++)
 {
  system("cls");
  if (!(strcmp(s,t[i].num)))         //如果找到该学号,则输出
  {
   printf("学号为%s的学生成绩如下:\n\n",t[i].num);
   printf("学号    名字    第一门成绩   第二门成绩   第三门成绩   平均分\n");
      printf("%s\t%s\t  %5.2f\t        %5.2f\t    %5.2f\t %5.2f\t\n",
      t[i].num,t[i].name,t[i].score[0],t[i].score[1],t[i].score[2],t[i].avg);
   putchar(10);
   break;
  }
  else if((strcmp(s,t[i].num))!=0 && strlen(t[i].num)==0)//查找完毕后找不到该学号,结束
  {
   printf("\n没有此学号的信息:\n\n");
   break;
  }
 }
 printf("************************************\n");
 printf("   继续查询,输入1回车\n");
 printf("   返回主菜单,输入2回车\n");
 printf("   退出程序,输入任意回车\n");
 printf("************************************\n");
 scanf("%d",&a);
 if(a==1)
 research(stu,n);
 else if(a==2)
  break;
 else
 {
  system("cls");
  printf("是否退出?直接退出输入1回车,保存数据退出输入2回车,输入22回主菜单\n建议退出前先保存数,否则数据将丢失");
  scanf("%d",&y);
  if(y==1)
     exit(0);
  else if(y==2)
   save(stu);
  else
   main();
 }
 }
 main();
}
/**********************************************************************************************/
void del(struct student t[])             //删除某一学生的信息
{
 int i,j,a,z,y;
 char b[10];
 system("cls");
 printf("请输入要删除的学号:");
 scanf("%s",b);
 for(i=0; ;i++)                    
  if(strcmp(b,t[i].num)==0)
   break;
  else if((strcmp(b,t[i].num))!=0 && strlen(t[i].num)==0)
  {
   printf("没有此学号的信息:\n\n");
   Sleep(3000);
   break;
  }
 if(strlen(t[i].num)!=0)
 {
 system("cls");
 printf("确认删除? 是输入1回车\n");
 scanf("%d",&z);
 if(z==1)
 for(j=i; ;j++)
 {
  if(strlen(t[j].num)==0)
   break;
  else
  {
      t[j]=t[j+1];
   n=n-1;
  }
 }
 }
 system("cls");
 printf("************************************\n");
 printf("   继续删除,输入1回车\n");
 printf("   返回主菜单,输入2回车\n");
 printf("   退出程序,输入任意回车\n");
 printf("************************************\n");
 scanf("%d",&a);
 if(a==1)
 del(stu);
 else if(a==2)
  main();
 else
 {
  system("cls");
  printf("是否退出?直接退出输入1回车,保存数据退出输入2回车,输入22回主菜单\n建议退出前先保存数,否则数据将丢失");
  scanf("%d",&y);
  if(y==1)
     exit(0);
  else if(y==2)
   save(stu);
  else
   main();
 }
}
/**********************************************************************************************/
void add(struct student t[])                    //增加学生数据
{
 int i,j,m,a,y;
 system("cls");
 printf("请输入要增加的记录数:\nm=");
 scanf("%d",&m);
 for(i=n;i<n+m;i++)
 {
 system("cls");
 printf("请输入第%d个新增学生的学号:",i-n+1);
 scanf("%s",t[i].num);
 for(j=0;j<i;j++)
   if(strcmp(t[i].num,t[j].num)==0)           //避免学号重复
   {
    i--;
    printf("此学号的学生已存在,请重新输入:");
    Sleep(3000);
    break;
   }
 }
 for(i=n;i<n+m;i++)
 {
  system("cls");
  printf("请输入增加学号为%s学生的:(用空格隔开) \n名字 第一门成绩 第二门成绩 第三门成绩\n",t[i].num);
  //t[i].score[0]=0;t[i].score[1]=0;t[i].score[2]=0;
  scanf("%s%f%f%f",t[i].name,&t[i].score[0],&t[i].score[1],&t[i].score[2]);
  t[i].avg=(t[i].score[0]+t[i].score[1]+t[i].score[2])/3.0;
 }
 n=n+m;                     //学生数等于本来学生数加新加的学生数
 printf("************************************\n");
 printf("   继续添加,输入1回车\n");
 printf("   返回主菜单,输入2回车\n");
 printf("   退出程序,输入任意回车\n");
 printf("************************************\n");
 scanf("%d",&a);
 if(a==1)
 add(stu);
 else if(a==2)
  main();
 else
 {
  system("cls");
  printf("是否退出?直接退出输入1回车,保存数据退出输入2回车,输入22回主菜单\n建议退出前先保存数,否则数据将丢失");
  scanf("%d",&y);
  if(y==1)
     exit(0);
  else if(y==2)
   save(stu);
  else
   main();
 }
}
/**********************************************************************************************/
int save(struct student t[])                           //保存数据到文件中
{
 FILE *fp;
 char s[20],ch;
 int i,a,y;
 system("cls");
 printf("保存到新的文件输入1回车\n保存到已有文件输入2回车\n");
 scanf("%d",&a);
 ch=getchar();           //接收回车字符,否则gets()函数将空格赋给s,出错
 if(a==1)
 {
 printf("请输入新的文件名:\n(包括其拓展名,20个字符以下)\n");
 gets(s);
 if((fp=fopen(s,"w+"))==NULL)         //使fp指向文件
 {
  printf("没有此文件\n");
  exit(0);
 }
 }
 else if(a==2)
 {
 printf("请输入已有文件名:\n(包括其拓展名,20个字符以下)\n");
 gets(s);
 if((fp=fopen(s,"w+"))==NULL)
 {
  system("cls");
  printf("没有此文件\n");
  exit(0);
  
 }
 }
 fprintf(fp,"%d\n",n);           //将学生数写的文件中
 for(i=0; ;i++)
  if(strlen(t[i].num)!=0)     //如果学号不为空,将数据写到指定文件中
  {
   fprintf(fp,"%s\t%s\t%-5.2f\t%-5.2f\t%-5.2f\t%-5.2f",
         t[i].num,t[i].name,t[i].score[0],t[i].score[1],t[i].score[2],t[i].avg);
   fprintf(fp,"\n");
  }
  else
   break;
 fclose(fp);
 system("cls");
 printf("    \n保存完成!\n");
}
/**********************************************************************************************/
void read(struct student t[])                //读取文件中的数据
{
 FILE *fp;
 int y,m,i,x;
 char s[20],ch;
 ch=getchar();         //接收回车字符,否则gets()函数将空格赋给s,出错
 system("cls");
 printf("请输入要读取数据的文件名:\n(包括其拓展名,20个字符以下)\n");
 gets(s);
 if((fp=fopen(s,"r"))==NULL)
 {
  system("cls");
  printf("没有此文件\n");
  Sleep(3000);
  system("cls");
  printf("是否退出?直接退出输入1回车,保存数据退出输入2回车,输入22回主菜单\n建议退出前先保存数,否则数据将丢失");
  scanf("%d",&y);
  if(y==1)
     exit(0);
  else if(y==2)
   save(stu);
  else
   main();
 }
 fscanf(fp,"%d",&x);//读取学生数
 for(i=0;i<x;i++)             //读取所有数据
  fscanf(fp,"%s%s%f%f%f%f",t[i].num,t[i].name,&t[i].score[0],
  &t[i].score[1],&t[i].score[2],&t[i].avg);
 fclose(fp);
 system("cls");
 n-=n; //将n置0
 n=x;
 printf("    \n读取完成!\n");
}
/**********************************************************************************************/
 menu()              //选择菜单
{
 int x;
 printf("请选择相应的菜单:\n");
 printf("************************************\n");
 printf("   输入新记录,输入0回车\n");
 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("   退出程序,输入11回车\n");
 printf("************************************\n");
 scanf("%d",&x);
 return x;
}
 /**********************************************************************************************/
 void to_exit()          //退出
 {
  int y;
  system("cls");
  printf("是否退出?直接退出输入1回车,保存数据退出输入2回车,输入22回主菜单\n建议退出前先保存数,否则数据将丢失");
  scanf("%d",&y);
  if(y==1)
     exit(0);
  else if(y==2)
   save(stu);
  else
   main();
 }
/**********************************************************************************************/
 void avg_arrange(struct student t[])//按平均分从高到低排序
 {
  int i,j;
  struct student temp[1];
  for(i=0;i<n-1;i++)
   for(j=i+1;j<n;j++)
    if(t[i].avg < t[j].avg)
    {
     temp[0]=t[i];
     t[i]=t[j];
     t[j]=temp[0];
    }
 list(stu);
 }
 /**********************************************************************************************/
 void num_arrange(struct student t[])//按学号从小到大排序
 {
  int i,j;
  struct student temp[1];
  for(i=0;i<n;i++)
   for(j=0;j<n-1;j++)
    if(strcmp(t[j].num,t[j+1].num)>0)
    {
     temp[0]=t[j];
     t[j]=t[j+1];
     t[j+1]=temp[0];
    }
 list(t);
 }

/**********************************************************************************************/
 void high(struct student t[])//查找某门科目的最高成绩
 {
  int i,j,k;
  struct student max[1];
  max[0]=t[0];
  system("cls");
  printf("请输入要查找的科目: 1 or 2 or 3\n");
  scanf("%d",&k);
  for(i=1;i<n;i++)
   max[0]=max[0].score[k-1] > t[i].score[k-1] ? max[0]:t[i];
 system("cls");
 printf("第 %d 科目: 最分为:%-5.2f  学号为%s\n",k,max[0].score[k-1],max[0].num);
}
/**********************************************************************************************/
main()
{
 int a;
 while(1)
 {
 a=menu();
 switch(a)//根据选择菜单做相应的操作
 {
 case 0 : enter(stu);break;
 case 1: list(stu);break;
 case 2: research(stu);break;
 case 3: del(stu);break;
 case 4: add(stu);break;
 case 5: read(stu);break;
 case 6: avg_arrange(stu);break;
 case 7: num_arrange(stu);break;
 case 8: high(stu);break;
 case 9: save(stu);break;
 default : to_exit();break;
 }
 }
}
/**********************************************************************************************/

以上是我以前写的,你看可不可以用

温馨提示:答案为网友推荐,仅供参考
相似回答