Ask Question

Name:
Title:
Your Question:

Answer Question

Name:
Your Answer:
User Submitted Source Code!


Description:
  扣扣
Language: C/C++
Code:

          #ifndef H_STUDENT_HH
#define H_STUDENT_HH

#include "stdio.h"
#include "string.h"
#include "malloc.h"

#define LEN sizeof(struct message_student)  /*一个结构体数组元素的长度*/
#define numsubs 5        /*学科数目*/
typedef struct message_student     /*结构体定义*/
{
 char number[6];
 char name[20];
 char sex[4];
 float subject[numsubs];
 float score;
 float average;
 int index;
}student;

extern int numstus;        /*学生数目*/
extern student *pointer;      /*指向结构体数组*/
extern int lens;

int menu_select();        /*函数声明*/
int openfile(student stu[]);
int findrecord(student stud[]);
int writetotext(student stud[]);
void welcome();
void display1();
void showtable();
void sort(student stu[]); 
void deleterecord(student stu[],int i);
void addrecord(student stud[]);
void display(student stud[],int n1,int n2);
void amendrecord(student stud[]);
void count(student stud[]);
void sortnum(student stud[]);
void sortnum2(student stud[]);
void sortname(student stud[]);
void sortname2(student stud[]);
void sortcount(student stud[]);
void sortcount2(student stud[]);
void statistic(student stud[]);
void display1();

#endif

#include "head.h"
int menu_select()           
{
 char c;
 printf("\n\n");
 printf("               | 1. 增加学生记录                    5.统计信息 |\n");
 printf("               | 2. 查询学生记录                    6.打开文件 |\n");
 printf("               | 3. 修改学生记录                    7.保存文件 |\n");
 printf("               | 4. 学生纪录排序                    8.显示记录 |\n");
 printf("               |                                    0.退出系统 |\n");
 printf("\n\n");
 printf("请选择(0-8):");
 c=getchar();
 getchar();
 return (c-'0');
}

#include "head.h"
int findrecord(student stud[])    /*查找信息*/
{
 char str[2];
 int i,num;
 if(numstus==0) 
 {
  printf("没有可被查找的记录\n");
  return -1;
 }
 else
 {
  printf("以何种方式查找?\n1.学号\t2.姓名\t3.名次\n");
  gets(str);
  if(str[0]=='1')       /*按学号查找*/
  {
   printf("请输入学号:");
   gets(str);
   for(i=0;i<=numstus;i++)
    if(strcmp(str,stud[i].number)==0)
    {
     display(stud,i,i);
     break;
    }
    else continue;
  }
  else if(str[0]=='2')      /*按姓名查找*/
  {
   printf("请输入姓名:");
   gets(str);
   for(i=0;i<=numstus;i++)
    if(strcmp(str,stud[i].name)==0)
    {
     display(stud,i,i);
     break;
    }
    else continue;
  }
  else if(str[0]=='3')      /*按名次查找*/
  {
   printf("请输入名次:");
   scanf("%d",&num);
   getchar();
   for(i=0;i<=numstus;i++)
    if(num==stud[i].index)
    {
     display(stud,i,i);
     break;
    }
    else continue;
  }
  if(i>numstus) 
  {
   printf("没有查找所要的信息。\n");
   return -1;
  }
  return i;
 }
}

#include"head.h"
int openfile(student stu[])
{
 int i=0,j;
    FILE *fp;
 char filename[20],str[2];
 if(numstus!=0)
 {
  printf("已经有记录存在,是否保存?(y/n)");
  gets(str);
  if(str[0]=='y'||str[0]=='Y')
   writetotext(stu);
 }
 printf("请输入文件名:");
 gets(filename);
 numstus=0;
 if((fp=fopen(filename,"rb+"))==NULL)
 {
  printf("无法打开该文件\n");
  return(-1);
 }
 fscanf(fp,"%d",&numstus);
 fgetc(fp);
 while(i<numstus)
 {
  fscanf(fp,"%s",stu[i].number);
        fscanf(fp,"%s",stu[i].name);
  fscanf(fp,"%s",stu[i].sex);
  for(j=0;j<numsubs;j++)
  fscanf(fp,"%f",&stu[i].subject[j]);
  fscanf(fp,"%f",&stu[i].score);
  fscanf(fp,"%f",&stu[i].average);
  fscanf(fp,"%d",&stu[i].index);
  i++;
 } 
 fclose(fp);         
 printf("文件读取成功\n");
 printf("是否显示纪录?(y/n)");
 gets(str);
 if(str[0]=='y'||str[0]=='Y')
 display(stu,0,numstus-1);
 return(0);
}
#include "head.h"
void sort(student stud[])
{   
 int i,j=0;
 char str[5];
 student *p;
 p=stud;
 if(numstus==0)
 {
  printf("没有可供查询的记录!");
 }
 while(1)
 {
  for(i=0;;i++)
  {
   printf(" 请输入查询方式:");
   printf("(直接输入回车则结束查询操作)\n");
   printf("1.按照学号\t");
   printf("2.按照姓名\t");
   printf("3.按照名次\n");
   gets(str);
   if(strlen(str)==0) break;
   if(str[0]=='1')
   {
    printf("请输入排序次序:\n");
    printf("1.升序排列\t");
    printf("2.降序排列\n");
    gets(str);
    if(str[0]=='1')
     sortnum2(p);
    else
     sortnum(p); 
    display(stud,0,numstus-1);
   }
   else if(str[0]=='2')
   {
    printf("请输入排序次序:\n");
    printf("1.升序排列\t");
    printf("2.降序排列\n");
    gets(str);
    if(str[0]=='1')
    sortname2(p);
    else
    sortname(p);
    display(stud,0,numstus-1);
   }
   else if(str[0]=='3')
   {
    printf("请输入排序次序:\n");
    printf("1.升序排列\t");
    printf("2.降序排列\n");
    gets(str);
    if(str[0]=='1')
    sortcount2(p);
    else
    sortcount(p);
    display(stud,0,numstus-1);
   }
   else printf("请输入1~3");
   printf("是否退出排序?(y/n)");
   gets(str);
   if(str[0]=='y'||str[0]=='Y') break;
  }
  return;
 }
}
 void sortnum(student stud[])
 {
  int i,j;
  student temp;
  student *p;
  p=stud;
  for(i=0;i<numstus;i++)
   for(j=0;j<numstus-i-1;j++)
   {
    if(strcmp(stud[j+1].number,stud[j].number)>0)
    {
     temp=*(p+j);
     *(p+j)=*(p+j+1);
     *(p+j+1)=temp;
    }
   }
 } 
 void sortnum2(student stud[])
 {
  int i,j;
  student temp;
  student *p;
  p=stud;
  for(i=0;i<numstus;i++)
   for(j=0;j<numstus-i-1;j++)
   {
    if(strcmp(stud[j].number,stud[j+1].number)>0)
    {
     temp=*(p+j);
     *(p+j)=*(p+j+1);
     *(p+j+1)=temp;
    }
   }
 }
 void sortname(student stud[])
 {
  int i,j;
  student temp;
  student *p;
  p=stud;
  for(i=0;i<numstus;i++)
   for(j=0;j<numstus-i-1;j++)
   {
    if(strcmp(stud[j+1].name,stud[j].name)>0)
    {
     temp=*(p+j);
     *(p+j)=*(p+j+1);
     *(p+j+1)=temp;
    }
   }
 }
 void sortname2(student stud[])
 {
  int i,j;
  student temp;
  student *p;
  p=stud;
  for(i=0;i<numstus;i++)
   for(j=0;j<numstus-i-1;j++)
   {
    if(strcmp(stud[j].name,stud[j+1].name)>0)
    {
     temp=*(p+j);
     *(p+j)=*(p+j+1);
     *(p+j+1)=temp;
    }
   }
 }
    void sortcount(student stud[])
 {
  int i,j;
  student temp;
  student *p;
  p=stud;
  for(i=0;i<numstus;i++)
   for(j=0;j<numstus-i-1;j++)
   {
    if(stud[j+1].index>stud[j].index)
    {
     temp=*(p+j);
     *(p+j)=*(p+j+1);
     *(p+j+1)=temp;
    }
   }
 }
    void sortcount2(student stud[])
 {
  int i,j;
  student temp;
  student *p;
  p=stud;
  for(i=0;i<numstus;i++)
   for(j=0;j<numstus-i-1;j++)
   {
    if(stud[j].index>stud[j+1].index)
    {
     temp=*(p+j);
     *(p+j)=*(p+j+1);
     *(p+j+1)=temp;
    }
   }
 }
#include"head.h"
void statistic(student stud[])            /*新增功能,输出统计信息*/
{              
           int i,j=0,k=0;
     char c1,str[2];
              float average[numsubs],sum=0;
     if(numstus==0) 
      printf("没有可被查找的记录\n");
     else
     {
      while(1)
      {
       printf("下面将统计考试成绩\n");
       printf("请选择你要统计哪科的成绩  1.A\t2.B\t3.C\t4.D\t5.E\n");
       c1=getchar();
       printf("\t一共有个%d记录\n",numstus);            /*总共记录数*/
       switch(c1)
       {
       case '1':
        for(i=0;i<numstus;i++)            /*循环输入判断*/
        {
         sum+=stud[i].subject[0]; 
         if(stud[k].subject[0]>stud[i].subject[0]) k=i;
         if(stud[j].subject[0]<stud[i].subject[0]) j=i;
        }
        average[0]=sum/numstus;
        printf("\t科目A的最高分:\n");           /*最高分*/
        printf("\t\t学号:%s   姓名:%s   分数:%.2f\n",stud[j].number,stud[j].name,stud[j].subject[0]);
        printf("\t科目A的最低分是:\n");            /*最低分*/
        printf("\t\t学号:%s   姓名:%s   分数:%.2f\n",stud[k].number,stud[k].name,stud[k].subject[0]); 
        printf("\t科目A的平均分是 %5.2f\n",average[0]);                   /*平均分*/
        break;
       case '2': 
        for(i=0;i<numstus;i++)            /*循环输入判断*/
        {
         sum+=stud[i].subject[1];  
         if(stud[k].subject[1]>stud[i].subject[1]) k=i;
         if(stud[j].subject[1]<stud[i].subject[1]) j=i;
        }
        average[1]=sum/numstus;
        printf("\t科目B的最高分:\n");           /*最高分*/
        printf("\t\t学号:%s   姓名:%s   分数:%.2f\n",stud[j].number,stud[j].name,stud[j].subject[1]);
        printf("\t科目B的最低分是:\n");            /*最低分*/
        printf("\t\t学号:%s   姓名:%s   分数:%.2f\n",stud[k].number,stud[k].name,stud[k].subject[1]);
        printf("\t科目B的平均分是 %5.2f\n",average[1]);                  /*平均分*/
        break;
       case '3': 
        for(i=0;i<numstus;i++)            /*循环输入判断*/
        {
         sum+=stud[i].subject[2]; 
         if(stud[k].subject[2]>stud[i].subject[2]) k=i;
         if(stud[j].subject[2]<stud[i].subject[2]) j=i;
        }
        average[2]=sum/numstus;
        printf("\t科目C的最高分:\n");           /*最高分*/
        printf("\t\t学号:%s   姓名:%s   分数:%.2f\n",stud[j].number,stud[j].name,stud[j].subject[2]);
        printf("\t科目C的最低分是:\n");            /*最低分*/
        printf("\t\t学号:%s   姓名:%s   分数:%.2f\n",stud[k].number,stud[k].name,stud[k].subject[2]);
        printf("\t科目C的平均分是 %5.2f\n",average[2]);          /*平均分*/
        break;
       case '4':
        for(i=0;i<numstus;i++)            /*循环输入判断*/
        {
         sum+=stud[i].subject[3]; 
         if(stud[k].subject[3]>stud[i].subject[3]) k=i;
         if(stud[j].subject[3]<stud[i].subject[3]) j=i;
        }
        average[3]=sum/numstus;
        printf("\t科目D的最高分:\n");           /*最高分*/
        printf("\t\t学号:%s   姓名:%s   分数:%.2f\n",stud[j].number,stud[j].name,stud[j].subject[3]);
        printf("\t科目D的最低分是:\n");            /*最低分*/
        printf("\t\t学号:%s   姓名:%s   分数:%.2f\n",stud[k].number,stud[k].name,stud[k].subject[3]);
        printf("\t科目D的平均分是 %5.2f\n",average[3]);           /*平均分*/
        break;
       case '5': 
        for(i=0;i<numstus;i++)            /*循环输入判断*/
        {
         sum+=stud[i].subject[4]; 
         if(stud[k].subject[4]>stud[i].subject[4]) k=i;
         if(stud[j].subject[4]<stud[i].subject[4]) j=i;
        }
        average[4]=sum/numstus;
        printf("\t科目E的最高分:\n");           /*最高分*/
        printf("\t\t学号:%s   姓名:%s   分数:%.2f\n",stud[j].number,stud[j].name,stud[j].subject[4]);
        printf("\t科目E的最低分是:\n");            /*最低分*/
        printf("\t\t学号:%s   姓名:%s   分数:%.2f\n",stud[k].number,stud[k].name,stud[k].subject[4]);
        printf("\t科目E的平均分是 %5.2f\n",average[4]);            /*平均分*/
        break;
       default:printf("输入错误!请输入1~5之间的数\n");
       }
       sum=0;
       getchar();
       printf("是否继续进行统计?(y/n)");
       gets(str);
       if(str[0]=='y'||str[0]=='Y') ;
       else break;
      }
     }
}

 #include"head.h"
int writetotext(student stud[])            /*将所有记录写入文件*/
{
 int i=0,j;
 FILE *fp;
 char filename[20];
 printf("输入文件名称:");
 gets(filename);
 fp=fopen(filename,"w");
 fprintf(fp,"%d\n",numstus); 
 while(i<numstus)
 {
  fprintf(fp,"%s %s %s ",stud[i].number,stud[i].name,stud[i].sex);
  for(j=0;j<numsubs;j++)
   fprintf(fp,"%f ",stud[i].subject[j]);
  fprintf(fp,"%f %f %d ",stud[i].score,stud[i].average,stud[i].index);
  i++;
 }
 fclose(fp);
 printf("已成功存储!\n");
 display(stud,0,numstus-1);
 numstus=0;
    return 0;
}

 #include"head.h"
void welcome()
{     
 printf("\t*************************************************************\n");
 printf("\t\t\t\t这是一个学生成绩管理系统\n\t\t\t\t   倾情奉献 欢迎使用!\n");
 printf("\t*************************************************************\n");



void showtable()
{   
    printf("---------------------------------------------------------------------------------------\n");
 printf("学号\t姓名\t性别\tA\tB\tC\tD\tE\t总分\t平均分\t名次\n");
 printf("---------------------------------------------------------------------------------------\n");
}

void display(student stud[],int n1,int n2)
{
 int i;
 showtable();     /*显示表头*/
    for(i=n1;i<=n2;i++)    
 printf("%s\t%s\t%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\t%d\t\n",stud[i].number,stud[i].name,stud[i].sex,stud[i].subject[0],stud[i].subject[1],stud[i].subject[2],stud[i].subject[3],stud[i].subject[4],stud[i].score,stud[i].average,stud[i].index); 
         /*通过循环输出数据*/
  
}
void display1()
{
 printf("\t\t本系统由计应精英一组亲情制作\n\n");
 printf("\t\t制作人员列表:        (按比划)\n");
 printf("\t\t王庆斌\t\t\t张威\n\t\t李智\t\t\t周在峰\n\t\t杨凯\t\t\t胡杨\n");
 printf("\n\n");
 getchar();
}

#include"head.h"
#include<string.h>
void amendrecord(student stud[])
{
 char str[5];        /*供用户输入*/
 int i=-1,j;
        
 if(numstus==0)                                /*没有记录返回*/
 printf("没有可供修改的记录!");
    while(i<0)
    {
  i=findrecord(stud);
  if(i>=0)
  { 
   printf("要删除这个学生的信息吗?(y/n)");      
   gets(str);
   if(str[0]=='y'||str[0]=='Y')
   {
    deleterecord(stud,i);
                count(stud);
   }
   else 
   {
    printf("确定要修改这个学生的信息吗?(y/n)");
    gets(str);
    if(str[0]=='y'||str[0]=='Y')
    {
    
     printf("下面请重新输入学生的信息:\n");
     printf("请输入学号:");
     gets(stud[i].number);
     printf("请输入姓名:");
     gets(stud[i].name);
     printf("请输入性别(男/女  1/0):");
     gets(str);
     if(str[0]=='0')
      strcpy(stud[i].sex,"女");
     else
      strcpy(stud[i].sex,"男");
     stud[i].score=0;
     printf("请按顺序输入成绩:");
     for(j=0;j<numsubs;j++)
     {
      scanf("%f",&stud[i].subject[j]);             
      stud[i].score+=stud[i].subject[j];
     }
     getchar();     
     stud[i].average=stud[i].score/numsubs;
    }
    count(stud);
   }
   display(stud,0,numstus-1);
  }
  printf("是否继续进行其他修改?(y/n)\n");
  gets(str);
  if(str[0]=='y'||str[0]=='Y')
   i=-1;
  else i=1;
 }
}

void deleterecord(student stu[],int i)             /*删除信息*/
{
 int j;

 while(i>=0)
 {
  for(j=i;j<numstus;j++)
   stu[j]=stu[j+1];
  numstus--;
  printf("删除成功!\n");

}
}

void count(student stud[])
{
 int i,j;
 for(i=0;i<numstus;i++)
 {
  stud[i].index=1;
  for(j=0;j<numstus;j++)
   if(stud[j].score>stud[i].score)
    stud[i].index++;
 }
}

#include "head.h"
void addrecord(student stud[])
{
 int i=0,j,num;
 char str[5];
 if(numstus!=0)
 {
  printf("已有记录存在是否覆盖?(y/n)\n");
  gets(str);
  if(str[0]=='Y'||str[0]=='y')
   i=0;
  else i=numstus;
 }
 
  printf("请输入增加的学生信息条目数:");
  scanf("%d",&num);
  if(i==0)
   numstus=num;
  else numstus+=num;
  if(numstus>lens)
  {
   lens+=50;
   pointer=(student *)realloc(pointer,lens*LEN);
  }
  printf("请输入学生信息:\n");
  for(;i<numstus;i++)
  {
   getchar();
   printf("请输入学号:");
   gets(pointer[i].number);  
   printf("请输入姓名:");
   gets(pointer[i].name);
   printf("请输入性别(男/女  1/0):");
   gets(pointer[i].sex);
   if(pointer[i].sex[0]=='0') strcpy(pointer[i].sex,"女");
   else strcpy(pointer[i].sex,"男");
   printf("请输入各科成绩:(按ABCDE的顺序):");
   stud[i].score=0;
   for(j=0;j<numsubs;j++)
   {
    scanf("%f",&stud[i].subject[j]);    /*计算总分*/
    stud[i].score+=stud[i].subject[j];
   }
   stud[i].average=stud[i].score/numsubs;    /*计算平均分*/
  }
  count(stud);           /*附名次*/
  display(stud,0,numstus-1);
  getchar();
}#include "head.h"
int numstus;
int lens;
student *pointer;
void main()
{
 int i=1;
 char str[2];
 lens=100;
 pointer=(student *)malloc(lens*LEN);       /*分配内存*/
 numstus=0;
 welcome();           /*欢迎界面*/
 while(i>0)
 {
  i=menu_select();        /*控制菜单*/
  switch(i)
  {
  case 1:addrecord(pointer);break;    /*增加学生信息*/
  case 2:findrecord(pointer);break;    /*查询学生信息*/
  case 3:amendrecord(pointer);break;    /*修改学生信息*/
  case 4:sort(pointer);break;      /*学生信息排序*/
  case 5:statistic(pointer);break;    /*统计信息*/
  case 6:openfile(pointer);break;     /*打开文件*/
  case 7:writetotext(pointer);break;    /*保存文件*/
        case 8:display(pointer,0,numstus-1);break;      /*显示记录*/
  case 0:
   if(numstus!=0) printf("是否保存当前记录?(y/n)");
   gets(str);
   if(str[0]=='y'||str[0]=='Y')
   writetotext(pointer);
   i=-1;break;         /*退出系统*/
  default:printf("请输入数字0~8:\n");i=1;      /*输入错误*/
  }
 }
 printf("\t\t欢迎再次使用本系统。\n\n");
 display1();
}
Comments: