學生成績管理系統源程序

/***********xuesheng.c***********/
/******頭文件(.h)***********/
#include "stdio.h"    /*I/O函數*/
#include "stdlib.h"   /*其它說明*/
#include "string.h"   /*字符串函數*/
#include "conio.h"   /*屏幕操作函數*/
#include "mem.h"   /*內存操作函數*/
#include "ctype.h"   /*字符操作函數*/
#include "alloc.h"   /*動態地址分配函數*/
#define N 3       /*定義常數*/
typedef struct z1   /*定義數據結構*/
{
   char no[11];
   char name[15];
   int score[N];
   float sum;
   float average;
   int order;
   struct z1 *next;
}STUDENT;
/*以下是函數原型*/
STUDENT  *init();      /*初始化函數*/
STUDENT *create();   /*創建鏈表*/
STUDENT *delete(STUDENT *h);   /*刪除記錄*/
void print(STUDENT *h);   /* 顯示所有記錄*/
void search(STUDENT *h);    /*查找*/
void save(STUDENT *h);     /*保存*/
STUDENT *load();        /*讀入記錄*/
void computer(STUDENT *h);  /*計算總分和均分*/
STUDENT *insert(STUDENT *h);   /*插入記錄*/
void append();            /*追加記錄*/
void copy();            /*複製文件*/
STUDENT *sort(STUDENT *h);    /*排序*/
STUDENT *index(STUDENT *h);  /*索引*/
void total(STUDENT *h);       /*分類合計*/
int menu_select();            /*菜單函數*/
/******主函數開始*******/
main()
{
   int i;
   STUDENT *head;     /*鏈表定義頭指針*/
   head=init();          /*初始化鏈表*/
   clrscr();            /*清屏*/
   for(;;)             /*無限循環*/
   {
      switch(menu_select())     /*調用主菜單函數,返回值整數作開關語句的條件*/
      {                     /*值不同,執行的函數不同,break 不能省略*/
case 0:head=init();break;   /*執行初始化*/
case 1:head=create();break; /*創建鏈表*/
case 2:head=delete(head);break; /*刪除記錄*/
case 3:print(head);break;   /*顯示全部記錄*/
case 4:search(head);break;  /*查找記錄*/
case 5:save(head);break;  /*保存文件*/
case 6:head=load(); break;  /*讀文件*/
case 7:computer(head);break;  /*計算總分和均分*/
case 8:head=insert(head);  break; /*插入記錄*/
case 9:copy();break;    /*複製文件*/
case 10:head=sort(head);break;  /*排序*/
case 11:append();break;     /*追加記錄*/
case 12:head=index(head);break;  /*索引*/
case 13:total(head);break;   /*分類合計*/
case 14:exit(0);       /*如菜單返回值爲14程序結束*/
      }
   }
}
/*菜單函數,返回值爲整數*/
menu_select()
{
   char *menu[]={"***************MENU***************",  /*定義菜單字符串數組*/
   " 0. init list",    /*初始化*/
   " 1. Enter list",   /*輸入記錄*/
   " 2. Delete a record from list",  /*從表中刪除記錄*/
   " 3. print list ",       /*顯示單鏈表中所有記錄*/
   " 4. Search record on name",   /*按照姓名查找記錄*/
   " 5. Save the file",          /*將單鏈表中記錄保存到文件中*/
   " 6. Load the file",        /*從文件中讀入記錄*/
   " 7. compute the score",    /*計算所有學生的總分和均分*/
   " 8. insert record to list ",   /*插入記錄到表中*/
   " 9. copy the file to new file",   /*複製文件*/
   " 10. sort to make new file",   /*排序*/
   " 11. append  record to file",   /*追加記錄到文件中*/
   " 12. index on nomber",       /*索引*/
   " 13. total on nomber",      /*分類合計*/
   " 14. Quit"};              /*退出*/
   char s[3];       /*以字符形式保存選擇號*/
   int c,i;        /*定義整形變量*/
   gotoxy(1,25);        /*移動光標*/
   printf("press any key enter menu....../n");   /*壓任一鍵進入主菜單*/
   getch();                       /*輸入任一鍵*/
   clrscr();                     /*清屏幕*/
   gotoxy(1,1);             /*移動光標*/
   textcolor(YELLOW);   /*設置文本顯示顏色爲黃色*/
   textbackground(BLUE);   /*設置背景顏色爲藍色*/
   gotoxy(10,2);          /*移動光標*/
   putch(0xc9);        /*輸出左上角邊框┏*/
   for(i=1;i<44;i++)
      putch(0xcd);    /*輸出上邊框水平線*/
   putch(0xbb);            /*輸出右上角邊框  ┓*/
   for(i=3;i<20;i++)
   {
      gotoxy(10,i);putch(0xba);   /*輸出左垂直線*/
      gotoxy(54,i);putch(0xba);
   }   /*輸出右垂直線*/
   gotoxy(10,20);putch(0xc8);  /*輸出左上角邊框┗*/
   for(i=1;i<44;i++)
      putch(0xcd);      /*輸出下邊框水平線*/
   putch(0xbc);                 /*輸出右下角邊框┛*/
   window(11,3,53,19);       /* 製作顯示菜單的窗口,大小根據菜單條數設計*/
   clrscr();              /*清屏*/
   for(i=0;i<16;i++)       /*輸出主菜單數組*/
   {
      gotoxy(10,i+1);
      cprintf("%s",menu[i]);
   }
   textbackground(BLACK);   /*設置背景顏色爲黑色*/
   window(1,1,80,25);       /*恢復原窗口大小*/
   gotoxy(10,21);       /*移動光標*/
   do{
      printf("/n Enter you choice(0~14):");    /*在菜單窗口外顯示提示信息*/
      scanf("%s",s);           /*輸入選擇項*/
      c=atoi(s);            /*將輸入的字符串轉化爲整形數*/
   }while(c<0||c>14);    /*選擇項不在0~14之間重輸*/
   return c;              /*返回選擇項,主程序根據該數調用相應的函數*/
}
STUDENT *init()
{
   return NULL;
}

/*創建鏈表*/
STUDENT *create()
{
   int i; int s;
   STUDENT *h=NULL,*info;  /* STUDENT指向結構體的指針*/
   for(;;)
   {
      info=(STUDENT *)malloc(sizeof(STUDENT));  /*申請空間*/
      if(!info)   /*如果指針info爲空*/
      {
printf("/nout of memory");   /*輸出內存溢出*/
return NULL;           /*返回空指針*/
      }
      inputs("enter no:",info->no,11);   /*輸入學號並校驗*/
      if(info->no[0]=='@') break;    /*如果學號首字符爲@則結束輸入*/
      inputs("enter name:",info->name,15); /*輸入姓名,並進行校驗*/
      printf("please input %d score /n",N);  /*提示開始輸入成績*/
      s=0;         /*計算每個學生的總分,初值爲0*/
      for(i=0;i<N;i++)    /*N門課程循環N次*/
      {
do{
    printf("score%d:",i+1);    /*提示輸入第幾門課程*/
    scanf("%d",&info->score[i]);    /*輸入成績*/
    if(info->score[i]>100||info->score[i]<0) /*確保成績在0~100之間*/
    printf("bad data,repeat input/n");  /*出錯提示信息*/
}while(info->score[i]>100||info->score[i]<0);
s=s+info->score[i];   /*累加各門課程成績*/
      }
      info->sum=s;    /*將總分保存*/
      info->average=(float)s/N;  /*求出平均值*/
      info->order=0;    /*未排序前此值爲0*/
      info->next=h;   /*將頭結點做爲新輸入結點的後繼結點*/
      h=info;    /*新輸入結點爲新的頭結點*/
   }
   return(h);   /*返回頭指針*/
}
/*輸入字符串,並進行長度驗證*/
inputs(char *prompt, char *s, int count)
{
   char p[255];
   do{
      printf(prompt);  /*顯示提示信息*/
      scanf("%s",p);  /*輸入字符串*/
      if(strlen(p)>count)printf("/n too long! /n"); /*進行長度校驗,超過count值重輸入*/
   }while(strlen(p)>count);
   strcpy(s,p); /*將輸入的字符串拷貝到字符串s中*/
}
/*輸出鏈表中結點信息*/
void print(STUDENT *h)
{
   int i=0;     /* 統計記錄條數*/
   STUDENT *p;  /*移動指針*/
   clrscr();     /*清屏*/
   p=h;      /*初值爲頭指針*/
   printf("/n/n/n****************************STUDENT********************************/n");
   printf("|rec|nO        |      name     | sc1| sc2| sc3|   sum  |  ave  |order|/n");
   printf("|---|----------|---------------|----|----|----|--------|-------|-----|/n");
   while(p!=NULL)
   {
       i++;
       printf("|%3d |%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |/n", i, p->no,p->name,p->score[0],p->score[1],
p->score[2],p->sum,p->average,p->order);
       p=p->next;
   }
   printf("**********************************end*********************************/n");
}
/*刪除記錄*/
STUDENT *delete(STUDENT *h)
{
   STUDENT *p,*q;  /*p爲查找到要刪除的結點指針,q爲其前驅指針*/
   char s[11];     /*存放學號*/
   clrscr();       /*清屏*/
   printf("please deleted no/n");      /*顯示提示信息*/
   scanf("%s",s);   /*輸入要刪除記錄的學號*/
   q=p=h;    /*給q和p賦初值頭指針*/
   while(strcmp(p->no,s)&&p!=NULL)   /*當記錄的學號不是要找的,或指針不爲空時*/
   {
      q=p;       /*將p指針值賦給q作爲p的前驅指針*/
      p=p->next;      /*將p指針指向下一條記錄*/
   }
   if(p==NULL)     /*如果p爲空,說明鏈表中沒有該結點*/
      printf("/nlist no %s student/n",s);
   else       /*p不爲空,顯示找到的記錄信息*/
   {
      printf("*****************************have found***************************/n");
      printf("|no        |      name     | sc1| sc2| sc3|   sum  |  ave  |order|/n");
      printf("|----------|---------------|----|----|----|--------|-------|-----|/n");
      printf("|%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |/n", p->no,
       p->name,p->score[0],p->score[1],p->score[2],p->sum,
       p->average,p->order);
      printf("********************************end*******************************/n");
      getch();      /*壓任一鍵後,開始刪除*/
      if(p==h)    /*如果p==h,說明被刪結點是頭結點*/
h=p->next;     /*修改頭指針指向下一條記錄*/
      else
q->next=p->next; /*不是頭指針,將p的後繼結點作爲q的後繼結點*/
      free(p);          /*釋放p所指結點空間*/
      printf("/n have deleted No %s student/n",s);
      printf("Don't forget save/n");/*提示刪除後不要忘記保存文件*/
   }
   return(h);      /*返回頭指針*/
}
/*查找記錄*/
void search(STUDENT *h)
{
   STUDENT *p;    /*  移動指針*/
   char s[15];    /*存放姓名的字符數組*/
   clrscr();    /*清屏幕*/
   printf("please enter name for search/n");
   scanf("%s",s);    /*輸入姓名*/
   p=h;    /*將頭指針賦給p*/
   while(strcmp(p->name,s)&&p!=NULL)  /*當記錄的姓名不是要找的,或指針不爲空時*/
   p=p->next;     /*移動指針,指向下一結點*/
   if(p==NULL)         /*如果指針爲空*/
      printf("/nlist no %s student/n",s);   /*顯示沒有該學生*/
   else           /*顯示找到的記錄信息*/
   {
      printf("/n/n*****************************havefound***************************/n");
      printf("|nO        |      name     | sc1| sc2| sc3|   sum  |  ave  |order|/n");
      printf("|----------|---------------|----|----|----|--------|-------|-----|/n");
      printf("|%-10s|%-15s|%4d|%4d|%4d| %4.2f | %4.2f | %3d |/n", p->no,
p->name,p->score[0],p->score[1],p->score[2],p->sum,p->average,p->order);
      printf("********************************end*******************************/n");
   }
}
/*插入記錄*/
STUDENT  *insert(STUDENT *h)
{
   STUDENT *p,*q,*info; /*p指向插入位置,q是其前驅,info指新插入記錄*/
   char s[11];  /*保存插入點位置的學號*/
   int s1,i;
   printf("please enter location  before the no/n");
   scanf("%s",s);   /*輸入插入點學號*/
   printf("/nplease new record/n");      /*提示輸入記錄信息*/
   info=(STUDENT *)malloc(sizeof(STUDENT));   /*申請空間*/
   if(!info)
   {
      printf("/nout of memory");   /*如沒有申請到,內存溢出*/
      return NULL;             /*返回空指針*/
   }
   inputs("enter no:",info->no,11); /*輸入學號*/
   inputs("enter name:",info->name,15); /*輸入姓名*/
   printf("please input %d score /n",N);  /*提示輸入分數*/
   s1=0;    /*保存新記錄的總分,初值爲0*/
   for(i=0;i<N;i++)    /*N門課程循環N次輸入成績*/
   {
      do{        /*對數據進行驗證,保證在0~100之間*/
printf("score%d:",i+1);
scanf("%d",&info->score[i]);
if(info->score[i]>100||info->score[i]<0)
    printf("bad data,repeat input/n");
      }while(info->score[i]>100||info->score[i]<0);
      s1=s1+info->score[i];    /*計算總分*/
   }
   info->sum=s1;    /*將總分存入新記錄中*/
   info->average=(float)s1/N;  /*計算均分*/
   info->order=0;         /*名次賦值0*/
   info->next=NULL;     /*設後繼指針爲空*/
   p=h;               /*將指針賦值給p*/
   q=h;             /*將指針賦值給q*/
   while(strcmp(p->no,s)&&p!=NULL)    /*查找插入位置*/
   {
      q=p;                 /*保存指針p,作爲下一個p的前驅*/
      p=p->next;          /*將指針p後移*/
   }
   if(p==NULL)      /*如果p指針爲空,說明沒有指定結點*/
      if(p==h)      /*同時p等於h,說明鏈表爲空*/
h=info;   /*新記錄則爲頭結點*/
      else
q->next=info;  /*p爲空,但p不等於h,將新結點插在表尾*/
   else
      if(p==h)     /*p不爲空,則找到了指定結點*/
      {
info->next=p; /*如果p等於h,則新結點插入在第一個結點之前*/
h=info;    /*新結點爲新的頭結點*/
      }
      else
      {
info->next=p;   /*不是頭結點,則是中間某個位置,新結點的後繼爲p*/
q->next=info;  /*新結點作爲q的後繼結點*/
      }
   printf("/n ----have inserted %s student----/n",info->name);    printf("---Don't forget save---/n");     /*提示存盤*/
   return(h);         /*返回頭指針*/
}
/*保存數據到文件*/
void save(STUDENT *h)
{
   FILE *fp;         /*定義指向文件的指針*/
   STUDENT *p;    /* 定義移動指針*/
   char outfile[10];  /*保存輸出文件名*/
   printf("Enter outfile name,for example c://f1//te.txt:/n"); /*提示文件名格式信息*/
   scanf("%s",outfile);
   if((fp=fopen(outfile,"wb"))==NULL) /*爲輸出打開一個二進制文件,如沒有則建立*/
   {
      printf("can not open file/n");
      exit(1);
   }
   printf("/nSaving file....../n");  /*打開文件,提示正在保存*/
   p=h;                    /*移動指針從頭指針開始*/
   while(p!=NULL)        /*如p不爲空*/
   {
      fwrite(p,sizeof(STUDENT),1,fp);/*寫入一條記錄*/
      p=p->next;        /*指針後移*/
   }
   fclose(fp);      /*關閉文件*/
   printf("-----save success!!-----/n");  /*顯示保存成功*/
}
/* 從文件讀數據*/
STUDENT *load()
{
   STUDENT *p,*q,*h=NULL;    /*定義記錄指針變量*/
   FILE *fp;            /* 定義指向文件的指針*/
   char infile[10];       /*保存文件名*/
   printf("Enter infile name,for example c://f1//te.txt:/n");   scanf("%s",infile);           /*輸入文件名*/
   if((fp=fopen(infile,"rb"))==NULL)   /*打開一個二進制文件,爲讀方式*/
   {
      printf("can not open file/n");    /*如不能打開,則結束程序*/
      exit(1);
   }
   printf("/n -----Loading file!-----/n");
   p=(STUDENT *)malloc(sizeof(STUDENT));   /*申請空間*/
   if(!p)
   {
      printf("out of memory!/n");    /*如沒有申請到,則內存溢出*/
      return h;       /*返回空頭指針*/
   }
   h=p;         /*申請到空間,將其作爲頭指針*/
   while(!feof(fp))  /*循環讀數據直到文件尾結束*/
   {
      if(1!=fread(p,sizeof(STUDENT),1,fp))
break;  /*如果沒讀到數據,跳出循環*/
      p->next=(STUDENT *)malloc(sizeof(STUDENT));  /*爲下一個結點申請空間*/
      if(!p->next)
      {
printf("out of memory!/n");  /*如沒有申請到,則內存溢出*/
return h;
      }
      q=p;   /*保存當前結點的指針,作爲下一結點的前驅*/
      p=p->next;   /*指針後移,新讀入數據鏈到當前表尾*/
   }
   q->next=NULL;   /*最後一個結點的後繼指針爲空*/
   fclose(fp);       /*關閉文件*/
   printf("---You have success read data from file!!!---/n");
   return h;   /*返回頭指針*/
}
/*追加記錄到文件*/
void append()
{
   FILE *fp;      /*定義指向文件的指針*/
   STUDENT *info;    /*新記錄指針*/
   int s1,i;
   char infile[10];    /*保存文件名*/
   printf("/nplease new record/n");
   info=(STUDENT *)malloc(sizeof(STUDENT));   /*申請空間*/
   if(!info)
   {
      printf("/nout of memory");   /*沒有申請到,內存溢出本函數結束*/
      return ;
   }
   inputs("enter no:",info->no,11);    /*調用inputs輸入學號*/
   inputs("enter name:",info->name,15); /*調用inputs輸入姓名*/
   printf("please input %d score /n",N);   /*提示輸入成績*/
   s1=0;
   for(i=0;i<N;i++)
   {
      do{
printf("score%d:",i+1);
scanf("%d",&info->score[i]);  /*輸入成績*/
if(info->score[i]>100||info->score[i]<0)printf("bad data,repeat input/n");
      }while(info->score[i]>100||info->score[i]<0); /*成績數據驗證*/
      s1=s1+info->score[i];      /*求總分*/
   }
   info->sum=s1;      /*保存總分*/
   info->average=(float)s1/N;  /*求均分*/
   info->order=0;      /*名次初始值爲0*/
   info->next=NULL;  /*將新記錄後繼指針賦值爲空*/
   printf("Enter infile name,for example c://f1//te.txt:/n");    scanf("%s",infile);         /*輸入文件名*/
   if((fp=fopen(infile,"ab"))==NULL)  /*向二進制文件尾增加數據方式打開文件*/
   {
      printf("can not open file/n");   /*顯示不能打開*/
      exit(1);             /*退出程序*/
   }
   printf("/n -----Appending record!-----/n");
   if(1!=fwrite(info,sizeof(STUDENT),1,fp))   /*寫文件操作*/
   {
      printf("-----file write error!-----/n");
      return;              /*返回*/
   }
   printf("-----append  sucess!!----/n");
   fclose(fp);       /*關閉文件*/
}
/*文件拷貝*/
void copy()
{
   char outfile[10],infile[10];
   FILE *sfp,*tfp;        /*源和目標文件指針*/
   STUDENT *p=NULL;   /*移動指針*/
   clrscr();    /*清屏*/
   printf("Enter infile name,for example c://f1//te.txt:/n");
   scanf("%s",infile);         /*輸入源文件名*/
   if((sfp=fopen(infile,"rb"))==NULL)   /*二進制讀方式打開源文件*/
   {
      printf("can not open input file/n");
      exit(0);
   }
   printf("Enter outfile name,for example c://f1//te.txt:/n");   /*提示輸入目標文件名*/
   scanf("%s",outfile);  /*輸入目標文件名*/
   if((tfp=fopen(outfile,"wb"))==NULL)  /*二進制寫方式打開目標文件*/
   {
      printf("can not open output file /n");
      exit(0);
   }
   while(!feof(sfp))   /*讀文件直到文件尾*/
   {
      if(1!=fread(p,sizeof(STUDENT),1,sfp))
break; /*塊讀*/
      fwrite(p,sizeof(STUDENT),1,tfp);   /*塊寫*/
   }
   fclose(sfp);    /*關閉源文件*/
   fclose(tfp);   /*關閉目標文件*/
   printf("you have success copy  file!!!/n");   /*顯示成功拷貝*/
}
/*排序*/
STUDENT *sort(STUDENT *h)
{
   int i=0;                  /*保存名次*/
   STUDENT *p,*q,*t,*h1;   /*定義臨時指針*/
   h1=h->next;           /*將原表的頭指針所指的下一個結點作頭指針*/
   h->next=NULL;        /*第一個結點爲新表的頭結點*/
   while(h1!=NULL)    /*當原表不爲空時,進行排序*/
   {
      t=h1;            /*取原表的頭結點*/
      h1=h1->next;     /*原表頭結點指針後移*/
      p=h;           /*設定移動指針p,從頭指針開始*/
      q=h;         /*設定移動指針q做爲p的前驅,初值爲頭指針*/
      while(t->sum<p->sum&&p!=NULL)  /*作總分比較*/
      {
q=p;            /*待排序點值小,則新表指針後移*/
p=p->next;
      }
      if(p==q)      /*p==q,說明待排序點值大,應排在首位*/
      {
t->next=p;     /*待排序點的後繼爲p*/
h=t;         /*新頭結點爲待排序點*/
      }
      else    /*待排序點應插入在中間某個位置q和p之間,如p爲空則是尾部*/
      {
t->next=p;   /*t的後繼是p*/
q->next=t;    /*q的後繼是t*/
      }
   }
   p=h;               /*已排好序的頭指針賦給p,準備填寫名次*/
   while(p!=NULL)  /*當p不爲空時,進行下列操作*/
   {
      i++;       /*結點序號*/
      p->order=i;   /*將名次賦值*/
      p=p->next;   /*指針後移*/
   }
   printf("sort sucess!!!/n");   /*排序成功*/
   return h;      /*返回頭指針*/
}
/*計算總分和均值*/
void computer(STUDENT *h)
{
   STUDENT *p;   /*定義移動指針*/
   int i=0;  /*保存記錄條數初值爲0*/
   long s=0;   /*總分初值爲0*/
   float average=0;  /*均分初值爲0*/
   p=h;        /*從頭指針開始*/
   while(p!=NULL)    /*當p不爲空時處理*/
   {
      s+=p->sum;    /*累加總分*/
      i++;         /*統計記錄條數*/
      p=p->next;   /*指針後移*/
   }
   average=(float)s/i;/* 求均分,均分爲浮點數,總分爲整數,所以做類型轉換*/
   printf("/n--All students sum score is:%ld  average is %5.2f/n",s,average);
}
/*索引*/
STUDENT *index(STUDENT *h)
{
   STUDENT *p,*q,*t,*h1;  /*定義臨時指針*/
   h1=h->next;    /*將原表的頭指針所指的下一個結點作頭指針*/
   h->next=NULL;   /*第一個結點爲新表的頭結點*/
   while(h1!=NULL)  /*當原表不爲空時,進行排序*/
   {
      t=h1;        /*取原表的頭結點*/
      h1=h1->next;   /*原表頭結點指針後移*/
      p=h;   /*設定移動指針p,從頭指針開始*/
      q=h;   /*設定移動指針q做爲p的前驅,初值爲頭指針*/
      while(strcmp(t->no,p->no)>0&&p!=NULL)  /*作學號比較*/
      {
q=p;           /*待排序點值大,應往後插,所以新表指針後移*/
p=p->next;
      }
      if(p==q)   /*p==q,說明待排序點值小,應排在首位*/
      {
t->next=p;  /*待排序點的後繼爲p*/
h=t;    /*新頭結點爲待排序點*/
      }
      else     /*待排序點應插入在中間某個位置q和p之間,如p爲空則是尾部*/
      {
t->next=p;    /*t的後繼是p*/
q->next=t;     /*q的後繼是t*/
      }
   }
   printf("index sucess!!!/n");  /*索引排序成功*/
   return h;    /*返回頭指針*/
}
/*分類合計*/
void total(STUDENT *h)
{
   STUDENT *p,*q;   /*定義臨時指針變量*/
   char sno[9],qno[9],*ptr;    /*保存班級號的*/
   float s1,ave;        /*保存總分和均分*/
   int i;       /*保存班級人數*/
   clrscr();    /*清屏*/
   printf("/n/n  *******************Total*****************/n");
   printf("---class---------sum--------------average----/n");
   p=h;       /*從頭指針開始*/
   while(p!=NULL)  /*當p不爲空時做下面的處理*/
   {
      memcpy(sno,p->no,8);  /*從學號中取出班級號*/
      sno[8]='/0';          /*做字符串結束標記*/
      q=p->next;        /*將指針指向待比較的記錄*/
      s1=p->sum;      /*當前班級的總分初值爲該班級的第一條記錄總分*/
      ave=p->average;  /*當前班級的均分初值爲該班級的第一條記錄均分*/
      i=1;          /*統計當前班級人數*/
      while(q!=NULL)   /*內循環開始*/
      {
memcpy(qno,q->no,8);   /*讀取班級號*/
qno[8]='/0';     /*做字符串結束標記*/
if(strcmp(qno,sno)==0)  /*比較班級號*/
{
    s1+=q->sum;     /*累加總分*/
    ave+=q->average; /*累加均分*/
    i++;         /*累加班級人數*/
    q=q->next;   /*指針指向下一條記錄*/
}
else
    break;  /*不是一個班級的結束本次內循環*/
      }
      printf("%s     %10.2f           %5.2f/n",sno,s1,ave/i);
      if(q==NULL)
break;   /*如果當前指針爲空,外循環結束,程序結束*/
      else
p=q;   /*否則,將當前記錄作爲新的班級的第一條記錄開始新的比較*/
   }
   printf("---------------------------------------------/n");
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章