成绩打分

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include <string.h>
  4 #define N 10
  5 
  6 
  7 struct  Data
  8 {
  9    char  Name[20];//姓名
 10    int   Num ;//编号
 11    int flags ;//评委是否打分  1:已经打分  0:未打分
 12    float Score[10];//10个人的成绩
 13    float Max;//最高分
 14    float Min;//最低分
 15    float Aver;//平均分(除去最高分和最低分)
 16 };
 17 
 18 struct Songer_info        //定义歌手信息数据结构体 
 19 {
 20    Data data ;
 21    Songer_info *next;
 22  };
 23 
 24 Songer_info *Create(Songer_info *Head);//创建
 25 void Input(Songer_info *Head);//添加信息
 26 void  Judge(Songer_info *Head);//打分
 27 void Search(Songer_info *Head); //查询
 28 Songer_info *Sort(Songer_info *Head);//冒泡排序
 29 void Look(Songer_info *Head);//查看信息
 30 void  Alter(Songer_info *Head);//修改数据
 31 void Save(Songer_info *Head);//保存文件
 32 
 33 int main()
 34 {
 35    Songer_info *Head = NULL;
 36    Head=Create(Head);
 37    int i;
 38    do                          //显示一个选择菜单 
 39    {
 40      printf("\n");
 41      printf("**********************************\n");
 42      printf("            歌手比赛系统          \n");
 43      printf("**********************************\n");
 44      printf("1************输入数据*************\n"); 
 45      printf("2************评委打分*************\n"); 
 46      printf("3************成绩排名*************\n");
 47      printf("4************数据查询*************\n");
 48      printf("5************修改数据*************\n");
 49      printf("6************写入数据*************\n");
 50      printf("7************退出系统*************\n");
 51      printf("请选择您要进行的操作:");
 52      scanf("%d",&i);                                 //用户进行功能选择 
 53      switch(i)
 54      {                       
 55        case 1: Input(Head);                        //函数调用 
 56                break;
 57        case 2: Judge(Head);
 58                break;
 59        case 3: Look(Sort(Head));
 60                break;
 61        case 4: Search(Head);
 62                break;
 63        case 5: Alter(Head);
 64                Look(Head);
 65                break;
 66        case 6: Save(Head);
 67                break;
 68        case 7: break;
 69        default : printf("请输入正确选项!!!");
 70        break;
 71       }
 72    }while (i!=7);
 73     return 0;
 74 }
 75 
 76 Songer_info *Create(Songer_info *Head)//创建
 77 {
 78     Head = (Songer_info *)malloc(sizeof Songer_info);//分配存储块
 79     if(Head==NULL)//分配失败
 80     {
 81         printf("Fial to Create!\n");
 82         exit(0);
 83     }
 84     Head->next=NULL;
 85     return Head;
 86 }
 87 
 88 void Input(Songer_info *Head)//添加信息
 89 {
 90     int Flags;//标记
 91     float max = 0,min = 100,sum = 0;
 92     Songer_info *Songer = NULL;
 93     Songer = Head->next;
 94     Data temp;
 95     printf("-------------------------------\n");
 96     printf("*           添加              *\n");
 97     printf("-------------------------------\n");
 98     printf("**选手编号:");
 99     scanf("%d",&temp.Num);
100    
101     Flags = 1;
102     while(Songer!=NULL)
103     {
104         if(Songer->data.Num==temp.Num)//编号存在
105         {
106             Flags = 0; 
107             break;
108         }
109         Songer=Songer->next;
110     }
111 
112     if(Flags==1)
113     {
114         //Songer_info *Songer=NULL;
115         Songer_info *p=NULL;
116         Songer_info *s=NULL;
117         Songer=Head;
118         p=Songer->next;
119         while(p!=NULL)
120         {
121             Songer=p;
122             p=Songer->next;
123         }
124         s=(Songer_info *)malloc(sizeof Songer_info);
125         
126                             //检查完毕,开始输入 
127          
128        printf("**姓名:");
129        scanf("%s",&temp.Name);
130 
131        temp.flags = 0;//评委未打分
132        s->data = temp ;
133        Songer->next = s;
134        s->next=p;
135        printf("*           添加成功          *\n");
136     }else   printf("*           编号重复          *\n");
137     printf("-------------------------------\n\n");
138 }
139 
140 void  Judge(Songer_info *Head)//打分
141 {
142     int i,Flags;//标记
143     float max = 0,min = 100,sum = 0;
144     Songer_info *Songer = NULL;
145     Songer = Head->next;
146     Data temp;
147     printf("-------------------------------\n");
148     printf("*           打分              *\n");
149     printf("-------------------------------\n");
150     printf("**选手编号:");
151     scanf("%d",&temp.Num);
152    
153     Flags = 1;
154     while(Songer!=NULL)
155     {
156         if(Songer->data.Num==temp.Num)//编号存在
157         {
158             printf("**请分别输入%d个评委的成绩:\n",N);
159             strcpy(temp.Name,Songer->data.Name);
160             for(i=0;i<N;i++)
161             {
162                printf("第%d个评委给的成绩:",i+1);
163                scanf("%f",&temp.Score[i]);
164                if(max<temp.Score[i])max = temp.Score[i];
165                if(min>temp.Score[i]) min = temp.Score[i];
166                sum += temp.Score[i];
167             }
168        
169            temp.Max = max;
170            temp.Min = min;
171            temp.Aver = ( sum - max - min ) / (N - 2);
172            temp.flags = 1;//该选手已经打分
173            Songer->data = temp;
174            printf("*           打分成功          *\n");
175            Flags = 0; 
176            break;
177         }
178         Songer=Songer->next;
179     }  
180     if(Flags==1)  printf("*           编号不存在         *\n");
181     printf("-------------------------------\n\n");
182 }
183 
184 void Search(Songer_info *Head)  //查询
185 {
186     int i;
187     Songer_info *Songer;
188     Songer=Head->next;
189     int Num;
190     printf("-------------------------------\n");
191     printf("*             查询             *\n");
192     printf("-------------------------------\n");
193     if(Songer!=NULL)
194     {
195         printf("***编号:");
196         scanf("%d",&Num);
197         int flags = 1;//用于判断编号是否存在
198         while(Songer!=NULL){
199             if(Num==Songer->data.Num) //找到相应的编号 
200             {
201                 printf("编号:%d\t",Songer->data.Num);
202                 printf("姓名:%s\n",Songer->data.Name);
203                 if(Songer->data.flags==1)
204                 {
205                     printf("成绩:\n");
206                     for(i=0;i<N;i++)    printf("%.1f  ",Songer->data.Score[i]);
207                     printf("\n");
208                     printf("最高分:%.2f\t",Songer->data.Max);
209                     printf("最低分:%.2f\n",Songer->data.Min);
210                     printf("平均分:%.2f\n",Songer->data.Aver);
211                 }
212                 flags = 0;
213                 break;
214             }
215             Songer=Songer->next;
216         }
217         if(flags==1)printf("              没有查询到!!!\n");
218         printf("-------------------------------\n\n");
219     }
220 } 
221 
222 Songer_info *Sort(Songer_info *Head)//冒泡排序
223 {
224     Songer_info *p,*p1,*p2,*p3;
225     Songer_info h, t;
226     if (Head == NULL) return NULL;
227     h.next=Head;
228     p=&h;
229     while (p->next!=NULL)
230     {
231         p=p->next;
232     }
233     p=p->next=&t;
234     while (p!=h.next)
235     {
236         p3=&h;
237         p1=p3->next;
238         p2=p1->next;
239         while (p2!=p) 
240         {
241             if ((p1->data.Aver)>(p2->data.Aver))
242             {
243                 p1->next=p2->next;
244                 p2->next=p1;
245                 p3->next=p2;
246 
247                 p3=p2; 
248                 p2=p1->next;
249 
250             } else {
251                 p3=p1;
252                 p1=p2;
253                 p2=p2->next;
254             }
255         }
256         p=p1;
257     }
258     while (p->next!=&t)
259     {
260         p=p->next;
261     }
262     p->next=NULL;
263     return h.next;
264 }
265 
266 void Look(Songer_info *Head)//查看信息
267 {
268     int i;
269     Songer_info *q=NULL;
270     q=Head->next;
271     printf("-------------------------------\n");
272     printf("*           信息显示           *\n");
273     printf("-------------------------------\n");
274     
275     while(q!=NULL)
276     {
277         printf("编号:%d\t",q->data.Num);
278         printf("姓名:%s\n",q->data.Name);
279         if(q->data.flags==1)
280         {
281             printf("成绩:\n");
282             for(i=0;i<N;i++)    printf("%.1f  ",q->data.Score[i]);
283             printf("\n");
284             printf("平均分:%.2f\n",q->data.Aver);
285             printf("最高分:%.2f\t",q->data.Max);
286             printf("最低分:%.2f\n\n",q->data.Min);
287             
288         }
289         q=q->next;
290     }
291     printf("-------------------------------\n\n");
292 }
293 
294 void  Alter(Songer_info *Head)//修改数据
295 {
296     int i,Flags,select;//标记
297     float max = 0,min = 100,sum = 0;
298     Songer_info *Songer = NULL;
299     Songer = Head->next;
300     Data temp;
301     printf("-------------------------------\n");
302     printf("*           修改              *\n");
303     printf("-------------------------------\n");
304     printf("**选手编号:");
305     scanf("%d",&temp.Num);
306    
307     Flags = 1;
308     while(Songer!=NULL)
309     {
310         if(Songer->data.Num==temp.Num)//编号存在
311         {
312             printf("**修改姓名:[1:修改;0:不修改]:");
313             scanf("%d",&select);
314             if(select==1)
315             {
316                 printf("**姓名:");
317                 scanf("%s",&temp.Name);
318             }
319             printf("**修改评委分成绩:[1:修改;0:不修改]:");
320             scanf("%d",&select);
321             if(select==1)
322             {
323                 printf("**请分别输入%d个评委的成绩:\n",N);
324                 for(i=0;i<N;i++)
325                 {
326                    printf("第%d个评委给的成绩:",i+1);
327                    scanf("%f",&temp.Score[i]);
328                    if(max<temp.Score[i])max = temp.Score[i];
329                    if(min>temp.Score[i]) min = temp.Score[i];
330                    sum += temp.Score[i];
331                 }
332        
333                temp.Max = max;
334                temp.Min = min;
335                temp.Aver = ( sum - max - min ) / (N - 2);
336                temp.flags = 1;//该选手已经打分
337             }
338            Songer->data = temp;
339            printf("*           修改成功          *\n");
340            Flags = 0; 
341            break;
342         }
343         Songer=Songer->next;
344     }  
345     if(Flags==1)  printf("*           编号不存在         *\n");
346     printf("-------------------------------\n\n");
347 }
348 
349 void Save(Songer_info *Head)//保存文件
350 {
351     int i;
352     Songer_info *q=NULL;
353     q=Head->next;
354 
355     FILE *fp;
356     if((fp=fopen("file.txt","w+"))==NULL)
357     {
358         printf("文件不存在\n");
359         
360     }else{
361          while(q!=NULL)
362         {
363              fprintf(fp,"%d\t",q->data.Num);//编号存入文件
364              fprintf(fp,"%s\t",q->data.Name);//姓名存入文件
365              fprintf(fp,"%d\n",q->data.flags);
366              if(q->data.flags==1)
367              {
368                  for(i = 0;i<N;i++)    fprintf(fp,"%.1f\t",q->data.Score[i]);
369              
370              }
371              fprintf(fp,"\n");
372              q=q->next;
373         }
374         printf("*         写入数据文件        *\n");
375         printf("-------------------------------\n\n");
376        fclose(fp);
377     }
378 }

 

posted @ 2016-03-03 20:56  指间ゝ繁华初逝的格调  阅读(246)  评论(0编辑  收藏  举报