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 }