• 学生成绩管理系统(数据结构课程设计)


    学生成绩管理问题 

    问题描述:建立两个学生成绩信息表1、2,以文件的形式分别进行存储命名为1.txt和2.txt,然后实现将两个文件合并成一个新的文件3.txt。

    新文件中有补考的学生查找到,存储到另一个文件4.txt中。

        基本要求:

          1、学生成绩信息表至少包含姓名、学号、语文成绩、数学成绩、英语成绩、总分。

          2、合并后的文件3.txt中的数据要按照总分进行降序排序。(排序方法为直接插入排序)

          3、根据学生姓名和学号应该能查到学生的各科成绩。(查找方法为折半查找)

        4、存储结构为顺序表。

      1 /*
      2 ***************************************************************************************************************************** 
      3 knocker:1.void read(char str[40]);读取文本
      4         2. Status InitList(SqList *L); 构造空的顺序表 L 
      5         3 Status fuzhi_sq(SqList *L,SqList *L3); 将txt1,2中的数据传到顺序表中
      6         4.void InsertSort(SqList &L);直接插入排序
      7         5.void Create(SqList &L,char str[40]); 生成txt3,4
      8         6. void find_bukao(SqList &L,SqList &L2); 找出补考学生 
      9         7.int Search_id(SqList &L,char k[]);根据学号查找 (折半查找)
     10         8.int Search_name(SqList &L,char k[]);按姓名查找 
     11         9.void tianjia_stu(ElemType e,char str[40]); 添加学生信息
     12         10.void Delete_stu(SqList &L,int id,int n); 删除学生信息 
     13         11.void Xiugai_stu(SqList &L,int id);修改学生信息
     14         12.void Output(SqList &L);显示学生信息 
     15 *****************************************************************************************************************************        
     16 */ 
     17 #include<stdio.h>
     18 #include<malloc.h>
     19 #include<stdlib.h>
     20 #include<string.h>
     21 #define OK 1
     22 #define ERROR 0
     23 #define OVERFLOW -2
     24 #define MAXSIZE 100
     25 float sum;
     26 char str1[20]={"D:\1.txt"};
     27 char str2[20]={"D:\2.txt"};
     28 char str3[40]={"D:\3.txt"};
     29 char str4[40]={"D:\4.txt"};
     30 typedef int Status; // 定义函数返回值类型
     31 
     32  struct student
     33 {
     34     char num[10]; // 学号
     35     char name[20]; // 姓名
     36     int chinese; //语文成绩 
     37     int math;//数学成绩
     38     int English;//英语成绩
     39     int sum;//总分 
     40 }*p,*q,u,s[3],r[MAXSIZE],c[MAXSIZE];
     41  
     42 typedef student ElemType;
     43 //顺序表 
     44 typedef struct
     45 {
     46     ElemType *elem; // 存储空间的基地址 
     47     int length; // 当前长度 
     48 }SqList;
     49 Status fuzhi_sq(SqList *L);
     50 //读取文档1,2 
     51 void read(char str[40])
     52 {
     53     FILE *fp;
     54     int i;
     55     p=c;
     56     if((fp=fopen(str,"rt"))==NULL)
     57     {
     58         printf("cannot open this file
    ");
     59         
     60         exit(0);
     61     }
     62     printf("姓名	学号	语文	数学	英语	总分
    ");
     63     for(i=0;!feof(fp);i++,p++)
     64     fscanf(fp,"%s	%s	%d	%d	%d	%d
    ",&p->name,&p->num,&p->chinese,&p->math,&p->English,&p->sum);
     65     fclose(fp);
     66     for(int j=0;j<i;j++)
     67     printf("%s	%s	%d	%d	%d	%d
    ",c[j].name,c[j].num,c[j].chinese,c[j].math,c[j].English,c[j].sum);
     68 
     69     
     70  } 
     71 Status InitList(SqList *L) // 构造空的顺序表 L 
     72 {    
     73     L->elem=(ElemType *)malloc(sizeof(ElemType)*MAXSIZE);
     74     if(!L->elem)  exit(OVERFLOW);
     75     L->length=0;
     76     return OK;
     77 }
     78 //将txt1,2中的数据传到顺序表中 
     79 Status fuzhi_sq(SqList *L,SqList *L3) 
     80 {
     81 
     82     FILE *fp;
     83     //把txt1内容输到数组s[3] 
     84     int i,k;
     85     p=s;
     86     if((fp=fopen(str1,"rt"))==NULL)
     87     {
     88         printf("cannot open this file
    ");
     89         
     90         exit(0);
     91     }
     92     for(i=0;!feof(fp);i++,p++)
     93     fscanf(fp,"%s	%s	%d	%d	%d	%d
    ",&p->name,&p->num,&p->chinese,&p->math,&p->English,&p->sum);
     94     fclose(fp);
     95 
     96     //把txt2内容输到数组r[3] 
     97     int j,n,m;
     98     q=r;
     99     if((fp=fopen(str2,"rt"))==NULL)
    100     {
    101         printf("cannot open this file
    ");
    102         
    103         exit(0);
    104     }
    105     for(n=0;!feof(fp);n++,q++)
    106     fscanf(fp,"%s	%s	%d	%d	%d	%d
    ",&q->name,&q->num,&q->chinese,&q->math,&q->English,&q->sum);
    107     fclose(fp);
    108 //数组s[3],r[MAXSIZE]合并到数组c[MAXSIZE]    
    109     for(j=0;j<i;j++)
    110     c[j]=s[j];
    111     for(int l=0,j=i;j<n+i;j++,l++)
    112     c[j]=r[l];
    113     for(j=0;j<n+i;j++)
    114     L->elem[j+1]=c[j];
    115     L->length=j+1;
    116     for(j=0;j<n+i;j++)
    117     L3->elem[j+1]=c[j];    
    118     L3->length=j+1;
    119     
    120 }
    121 //直接插入排序
    122 void InsertSort(SqList &L)
    123 {
    124     int j;
    125     for(int i=2;i<=L.length-1;i++)
    126     if(L.elem[i].sum>L.elem[i-1].sum)
    127     {
    128         L.elem[0]=L.elem[i];
    129         L.elem[i]=L.elem[i-1];
    130         for(j=i-2;L.elem[0].sum>L.elem[j].sum;j--)
    131         L.elem[j+1]=L.elem[j];
    132         L.elem[j+1]=L.elem[0];    
    133     }
    134 
    135  } 
    136  //生成txt3,4
    137 void Create(SqList &L,char str[40])
    138 {
    139     FILE *fp;
    140     p=c;
    141     int i;
    142     fp=fopen(str,"wt");
    143     for(int i=0;i<L.length-1;i++)
    144     fprintf(fp,"%s	%s	%d	%d	%d	%d
    ",L.elem[i+1].name,L.elem[i+1].num,L.elem[i+1].chinese,L.elem[i+1].math,L.elem[i+1].English,L.elem[i+1].sum);
    145     fclose(fp);
    146     if((fp=fopen(str,"rt"))==NULL)
    147     {
    148         printf("cannot open this file
    ");
    149         
    150         exit(0);
    151     }
    152     printf("姓名	学号	语文	数学	英语	总分
    ");
    153     for(i=0;!feof(fp);i++,p++)
    154     fscanf(fp,"%s%s%d%d%d%d",&p->name,&p->num,&p->chinese,&p->math,&p->English,&p->sum);
    155     fclose(fp);
    156     for(p=c;p<c+i-1;p++)
    157     printf("%s	%s	%d	%d	%d	%d
    ",p->name,p->num,p->chinese,p->math,p->English,p->sum);    
    158  } 
    159  //找出补考学生 
    160 void find_bukao(SqList &L,SqList &L2)
    161 {
    162     int j=1;
    163     for(int i=0;i<L.length-1;i++)
    164     if(L.elem[i+1].chinese<60||L.elem[i+1].math<60||L.elem[i+1].English<60)
    165     {
    166     
    167         L2.elem[j]=L.elem[i+1];
    168         j++;                
    169     }
    170     L2.length=j;
    171 } 
    172 
    173 ElemType GetElem(SqList &L,int i) // 访问顺序表,找到 i位置,返回给 e
    174 {
    175     return L.elem[i];
    176 }
    177 //根据学号查找 
    178 int Search_id(SqList &L,char k[]) 
    179 {
    180     int low = 1;
    181     int high = L.length;
    182     while(low <= high)
    183     {
    184         int mid = (low + high) / 2;
    185         if(strcmp(k,L.elem[mid].num)==0)
    186         {
    187             return mid;
    188     }
    189         else if(strcmp(k,L.elem[mid].num)<0)
    190         {
    191             high = mid - 1;
    192         }
    193         else
    194         {
    195             low = mid + 1;
    196         }
    197     }
    198   
    199     return 0;
    200 }
    201 //按姓名查找 
    202 int Search_name(SqList &L,char k[]) 
    203 {
    204     for(int i=1;i<L.length;i++)
    205     {
    206         if(strcmp(L.elem[i].name,k)==0)
    207         return i;
    208     }
    209     
    210 } 
    211 //添加学生信息
    212 void tianjia_stu(ElemType e,char str[40]) 
    213 {
    214     FILE *fp;
    215     fp=fopen(str,"at");    
    216     fprintf(fp,"
    %s	%s	%d	%d	%d	%d",e.name,e.num,e.chinese,e.math,e.English,e.sum);
    217     fclose(fp);
    218 }
    219 //删除学生信息 
    220 void Delete_stu(SqList &L,int id,int n) 
    221 {
    222     for(int j=id;j<L.length-1;j++)
    223     L.elem[j]=L.elem[j+1];
    224     L.length-=1;
    225     for(int i=0;i<L.length-1;i++)
    226     printf("%s	%s	%d	%d	%d	%d
    ",L.elem[i+1].name,L.elem[i+1].num,L.elem[i+1].chinese,L.elem[i+1].math,L.elem[i+1].English,L.elem[i+1].sum);
    227     
    228     FILE *fp;
    229     if(id<=3)
    230     {
    231         fp=fopen(str1,"wt");
    232         for(int i=0;i<3-n;i++)
    233         fprintf(fp,"%s	%s	%d	%d	%d	%d
    ",L.elem[i+1].name,L.elem[i+1].num,L.elem[i+1].chinese,L.elem[i+1].math,L.elem[i+1].English,L.elem[i+1].sum);
    234         fclose(fp);
    235 
    236     }
    237     else
    238     {
    239         fp=fopen(str2,"wt");
    240         for(int i=3;i<L.length-n;i++)
    241         fprintf(fp,"%s	%s	%d	%d	%d	%d
    ",L.elem[i+1].name,L.elem[i+1].num,L.elem[i+1].chinese,L.elem[i+1].math,L.elem[i+1].English,L.elem[i+1].sum);
    242         fclose(fp);
    243     
    244     }
    245 }
    246 //修改学生信息
    247 void Xiugai_stu(SqList &L,int id)
    248 {
    249     int m;
    250     printf("
    1:语文	2:数学	3:英语
    ");    
    251     printf("请选择要修改的科目:");
    252 L102:    scanf("%d",&m);
    253         getchar();
    254         if(m==1)
    255             {
    256             printf("请输入要修改的语文成绩:");
    257             scanf("%d",&L.elem[id].chinese);
    258             L.elem[id].sum=L.elem[id].chinese+L.elem[id].math+L.elem[id].English;
    259         }
    260         else if(m==2)
    261         {
    262             printf("请输入要修改的数学成绩:");
    263             scanf("%d",&L.elem[id].math);
    264             L.elem[id].sum=L.elem[id].chinese+L.elem[id].math+L.elem[id].English;
    265         }
    266         else if(m==3)
    267         {
    268             printf("请输入要修改的英语成绩:");
    269             scanf("%d",&L.elem[id].English);
    270             L.elem[id].sum=L.elem[id].chinese+L.elem[id].math+L.elem[id].English;
    271         }
    272         else
    273         {
    274             printf("请按提示输入。
    ");
    275             goto    L102;
    276         }    
    277     FILE *fp;
    278     if(id<=3)
    279     {
    280         fp=fopen(str1,"wt");
    281         for(int i=0;i<3;i++)
    282         fprintf(fp,"%s	%s	%d	%d	%d	%d
    ",L.elem[i+1].name,L.elem[i+1].num,L.elem[i+1].chinese,L.elem[i+1].math,L.elem[i+1].English,L.elem[i+1].sum);
    283         fclose(fp);
    284 
    285     }
    286     else
    287     {
    288         fp=fopen(str2,"wt");
    289         for(int i=3;i<L.length-1;i++)
    290         fprintf(fp,"%s	%s	%d	%d	%d	%d
    ",L.elem[i+1].name,L.elem[i+1].num,L.elem[i+1].chinese,L.elem[i+1].math,L.elem[i+1].English,L.elem[i+1].sum);
    291         fclose(fp);
    292     }    
    293 } 
    294 
    295  
    296 void Output(SqList &L)
    297 {
    298     printf("姓名	学号	语文	数学	英语	总分
    ");
    299     for(int j=1;j<L.length;j++)
    300     printf("%s	%s	%d	%d	%d	%d
    ",L.elem[j].name,L.elem[j].num,L.elem[j].chinese,L.elem[j].math,L.elem[j].English,L.elem[j].sum);
    301 }
    302  
    303 int main()
    304 {
    305 
    306     SqList L,L2,L3;//顺序表L进行排序,L2用于补考功能,L3记录排序前学生信息 
    307     InitList(&L);
    308     InitList(&L2);
    309     InitList(&L3);
    310     ElemType a,b,c,d;
    311 L:    printf("
    		****************************************************************************
    
    ");
    312         puts("		************	1.读取学生文档1.txt				************");
    313         puts("		************	2.读取学生文档2.txt				************");
    314         puts("		************	3.学生排名(创建学生文档3.txt,降序排列)	************");
    315         puts("		************	4.补考学生信息(创建学生文档4)			************");
    316         puts("		************	5.输入姓名,查找该学生				************");
    317         puts("		************	6.输入学号,查找该学生				************");
    318         puts("		************	7.添加学生信息					************");
    319         puts("		************	8.删除学生信息					************");
    320         puts("		************	9.修改学生信息					************");
    321         puts("		************	10.显示学生信息					************");
    322         puts("		************	0. 退出						************");
    323     printf("
    		****************************************************************************
    
    ");
    324     int x,choose;
    325     while(1)
    326     {
    327         printf("请选择:");
    328         while(1)
    329         {
    330             if(!(scanf("%d",&choose))||choose>10||choose<0)
    331             {
    332                 printf("请按提示输入
    ");
    333                 fflush(stdin);// 清除缓冲区 
    334                 system("pause");
    335                 system("cls");
    336                 goto L; 
    337                 continue; 
    338             }
    339             break;
    340         }
    341         if(choose==0)    break;
    342         switch(choose)
    343         {
    344             case 1:
    345                     read(str1);    
    346                     break;
    347             case 2:
    348                     read(str2);
    349                     system("pause");
    350                     system("cls");
    351                     goto L;
    352                     break;            
    353             case 3:
    354                     fuzhi_sq(&L,&L3);
    355                     InsertSort(L);
    356                     printf("文档创建成功
    ");    
    357                     Create(L,str3);
    358                     system("pause");
    359                     system("cls");
    360                     goto L;
    361                     break;
    362             case 4:
    363                     fuzhi_sq(&L,&L3);
    364                     find_bukao(L3,L2);//把顺序表L中的补考学生录入顺序表L2 
    365                     printf("文档创建成功
    ");    
    366                     Create(L2,str4);
    367                     printf("补考信息如下:
    ");
    368                     printf("	语文补考:");
    369                     for(int i=1;i<L2.length;i++)
    370                     {
    371                         if(L2.elem[i].chinese<60)
    372                         printf("%s(%d) ",L2.elem[i].name,L2.elem[i].chinese);
    373                     }
    374                     
    375                     printf("
    	数学补考:");
    376                     for(int i=1;i<L2.length;i++)
    377                     {
    378                         if(L2.elem[i].math<60)
    379                         printf("%s(%d) ",L2.elem[i].name,L2.elem[i].math);
    380                     }
    381                     printf("
    	英语补考:");
    382                     for(int i=1;i<L2.length;i++)
    383                     {
    384                         if(L2.elem[i].English<60)
    385                         printf("%s(%d )",L2.elem[i].name,L2.elem[i].English);
    386                     }
    387                     printf("
    ");
    388                     system("pause");
    389                     system("cls");
    390                     goto L;
    391                     break;
    392             case 5:
    393                     
    394 L5:                    char name[8];
    395                     printf("请输入要查找的学生姓名:");
    396                     scanf("%s",&name);
    397                     if(int g=Search_name(L3,name))
    398                     {
    399                         printf("姓名	学号	语文	数学	英语	总分
    ");
    400                         printf("%s	%s	%d	%d	%d	%d
    ",L3.elem[g].name,L3.elem[g].num,L3.elem[g].chinese,L3.elem[g].math,L3.elem[g].English,L3.elem[g].sum);    
    401                     }
    402                     else
    403                           printf("对不起,查无此人!
    "); 
    404             L5a:    printf("是否继续查询(y/n):");
    405                     char d; 
    406                     scanf("%s",&d);
    407                     switch(d)
    408                     {
    409                         case 'y':
    410                             goto L5;break;
    411                         case 'n':
    412                             system("pause");
    413                             system("cls");
    414                             goto L;
    415                             break;
    416                         default:
    417                             printf("请按提示输入!!!
    ");
    418                             goto L5a;
    419                             break;
    420                     }
    421                     break;
    422             case 6:    
    423 L6:                    printf("请输入要查询的学号:");
    424                     char id[3];
    425                     scanf("%s",&id);
    426                     if(    int i=Search_id(L3,id))
    427                     {
    428                         printf("姓名	学号	语文	数学	英语	总分
    ");
    429                         printf("%s	%s	%d	%d	%d	%d
    ",L3.elem[i].name,L3.elem[i].num,L3.elem[i].chinese,L3.elem[i].math,L3.elem[i].English,L3.elem[i].sum);
    430                     }
    431                     else
    432                           printf("对不起,查无此人!
    "); 
    433             L6a:    printf("是否继续查询(y/n):");
    434                     char v; 
    435                     scanf("%s",&v);
    436                     switch(v)
    437                     {
    438                         case 'y':
    439                             goto L6;break;
    440                         case 'n':
    441                             system("pause");
    442                             system("cls");
    443                             goto L;
    444                             break;
    445                         default:
    446                             printf("请按提示输入!!!
    ");
    447                             goto L8a;
    448                     }
    449                     break;
    450             
    451             case 7:
    452 L7:                    printf("请输入学生信息:
    ");
    453                     printf("姓名:");    scanf("%s",u.name);
    454                     printf("学号:");    scanf("%s",u.num);
    455                     printf("语文:");    scanf("%d",&u.chinese);
    456                     printf("数学:");    scanf("%d",&u.math);
    457                     printf("英语:");    scanf("%d",&u.English);
    458                     u.sum=u.chinese+u.math+u.English;
    459                     printf("输入完成
    
    ");
    460                     tianjia_stu(u,str2);
    461                     read(str2);
    462             L7a:    printf("是否继续添加(y/n):");
    463                     char b; 
    464                     scanf("%s",&b);
    465                     switch(b)
    466                     {
    467                         case 'y':
    468                             goto L7;break;
    469                         case 'n':
    470                             system("pause");
    471                             system("cls");
    472                             goto L;
    473                             break;
    474                         default:
    475                             printf("请按提示输入!!!
    ");
    476                             goto L7a;
    477                     }
    478                     system("pause");
    479                     system("cls");
    480                     goto L;
    481                     break;
    482             case 8:
    483                     int number;
    484                     number=1; //记录删除的个数 (一次操作) 
    485 L8:                    printf("请输入要删除的学生学号:");
    486                     char id1[3];
    487                     scanf("%s",&id1);
    488                     if(int m=Search_id(L3,id1))
    489                         {
    490                             Delete_stu(L3,m,number);
    491                             puts("删除成功");
    492                         }
    493                     else
    494                             printf("学号不存在,请输入正确学号。
    ");
    495             L8a:    char f;    
    496                     printf("是否继续删除?(y/n)");
    497                     getchar();
    498                     scanf("%s",&f);
    499                     
    500                     switch(f)
    501                     {
    502                         case 'y':
    503                             number++;
    504                             goto L8;
    505                             break;
    506                         case 'n':
    507                             system("pause");
    508                             system("cls");
    509                             goto L;
    510                             break;
    511                         default:
    512                             printf("请按提示输入!!!
    ");
    513                             goto L8a;
    514                     }
    515                     break;
    516             
    517             case 9:
    518                     char id2[3],m,n;
    519                     int grade;
    520         L10a:        printf("请输入要修改的学生学号:");
    521                     scanf("%s",&id2);
    522                     if(!(n=Search_id(L3,id2)))
    523                     {
    524                         printf("学号不存在,请输入正确学号。
    ");
    525                         goto L10a;    
    526                     }
    527                     Xiugai_stu(L3,n);
    528                     printf("修改成功!
    ");
    529                     printf("姓名	学号	语文	数学	英语	总分
    ");
    530                     printf("%s	%s	%d	%d	%d	%d
    ",L3.elem[n].name,L3.elem[n].num,L3.elem[n].chinese,L3.elem[n].math,L3.elem[n].English,L3.elem[n].sum);
    531                     system("pause");
    532                     system("cls");
    533                     goto L;
    534                     break;
    535             case 10:
    536                     fuzhi_sq(&L,&L3);
    537                     Output(L3);
    538                     printf("
    已录入的学生个数为:%d
    
    ",L3.length-1);
    539                     system("pause");
    540                     system("cls");
    541                     goto L;
    542                     break;                                    
    543         }
    544     }
    545     printf("
    
    谢谢您的使用,请按任意键退出
    
    
    ");
    546     system("pause");
    547     return 0;
    548 }

    功能一:读取txt1

    功能二:读取txt2

    功能三:学生排名(创建学生文档3.txt,降序排列)

     

    功能四:补考学生信息(创建学生文档4)

     功能五:输入姓名,查找该学生

    功能六:输入学号,查找该学生

    功能七:添加学生信息

    功能八:删除学生信息

    功能九:修改学生信息

     功能十:退出

    *************************

    ***author:knocker***

    *************************

  • 相关阅读:
    java——base64 加密和解密
    BASE64Encoded() 方法报错说方法未定义
    java 实现HTTP连接(HTTPClient)
    如何关闭一些烦人的弹窗(总结)
    IDEA
    6、git和github
    5、预测和鉴定miRNA的靶基因
    4、在线blast比对结果解析(保守结构域)
    ASE分析
    3、Linux下配置Java环境
  • 原文地址:https://www.cnblogs.com/zhi321/p/10178578.html
Copyright © 2020-2023  润新知