成绩打分
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 }