1 /* 数据结构课程设计任务书2 2 * 题目:电视大赛观众投票及排名系统(排序应用) 3 * 【问题描述】 4 * 在很多的电视大赛中,通常当选手表演结束后,现场观众通过手中的按键对参赛选手进行投票, 5 * 然后对选手获得的票数进行统计,从高到低进行降序排序,从而自动产生冠军、亚军和季军。 6 * 现在要求编写一程序模拟实现上述系统的功能。 7 * 【实现提示】 8 * 在本例中,首先输入参赛选手的人数(范围为1-9个),然后根据人数通过malloc函数来开辟存 9 * 放选手信息的顺序表(参考严尉敏教材中顺序表的定义)。将选手的编号和姓名依此存入顺序表单 10 * 元中,观众通过按键进行投票,按'1'为1号选手投票,按'2'为2号选手投票,以此类推,以按'0' 11 * 作为投票结束标志。投票结束后进行排序,在此采用希尔排序,然后为每个选手计算名次,得票相 12 * 同的名次也相同。 13 ***************************************************************************************************/ 14 15 #include <stdio.h> 16 #include <stdlib.h> 17 18 //#define Maxsize 9 19 #define LIST_INIT_SIZE 3 // 线性表存储空间的初始分配量 20 #define LIST_INCREMENT 3 // 线性表存储空间的分配增量 21 22 typedef struct node 23 { 24 char name[9]; /* 选手姓名 */ 25 int num; /* 选手编号 */ 26 int score; /* 选手得分 */ 27 int tax; /* 选手名次 */ 28 }ElemType; 29 30 typedef struct 31 { 32 ElemType *data; 33 int len; //当前长度 34 int listsize; //当前分配的存储容量(以sizeof(NODE)为单位) 35 }SeqList; 36 37 void Init_sq(SeqList *L,int n) 38 { 39 L->data=(ElemType*)malloc(n*sizeof(ElemType)); 40 if(!L->data) exit(1); //存储分配失败 41 L->len = n; //空表长度为0 42 L->listsize = n; //初始存储容量 43 } 44 45 void Init(SeqList *L) 46 { 47 ElemType *newbase; 48 int i,n; 49 printf("请输入选手个数: "); 50 scanf("%d",&n); 51 Init_sq(L,n); 52 printf("请输入选手姓名和编号\n"); 53 printf("姓名\t编号\t\n"); 54 if(L->len>=L->listsize) 55 { 56 newbase = (ElemType *)realloc(L->data,(L->listsize+LIST_INCREMENT)*sizeof(ElemType)); 57 if(!newbase) exit(1); //分配失败 58 L->data = newbase; 59 L->listsize += LIST_INCREMENT; 60 } 61 for(i=1;i<=L->len;i++) 62 { 63 scanf("%s%d",L->data[i].name,&L->data[i].num); 64 L->data[i].score = L->data[i].tax =0; 65 } 66 } 67 68 void Toupiao(SeqList *L) 69 { 70 int i,num; 71 printf("请输入您要为几号选手投票:( 0 结束) \n"); 72 do 73 { 74 scanf("%d",&num); 75 if(num < 0 || num > L->len) 76 { 77 printf("你输入的编号错误请重新输入 (1--%d)\n",L->len); 78 continue; 79 } 80 else 81 for(i=1;i<=L->len;i++) 82 if(L->data[i].num == num) 83 L->data[i].score += 1; 84 }while(num != 0); 85 } 86 87 void Shellsort(SeqList *L) 88 { 89 int i,j;//,flag; 90 int increment=L->len; 91 do 92 { 93 increment=increment/3+1; /* 增量序列 */ 94 for(i=increment+1;i<=L->len;i++) 95 { 96 if (L->data[i].score > L->data[i-increment].score) /* 需将L->r[i]插入有序增量子表 */ 97 { 98 L->data[0]=L->data[i]; /* 暂存在L->r[0] */ 99 for(j=i-increment; j>0 && L->data[0].score > L->data[j].score; j-=increment) 100 L->data[j+increment]=L->data[j]; /* 记录后移,查找插入位置 */ 101 L->data[j+increment]=L->data[0]; /* 插入 */ 102 } 103 } 104 }while(increment>1); 105 } 106 /* 计算选手名次 */ 107 void Mingci(SeqList *L) 108 { 109 int i; 110 L->data[1].tax=1; 111 for(i=2;i<=L->len;i++) 112 if(L->data[i-1].score==L->data[i].score) 113 L->data[i].tax= L->data[i-1].tax; 114 else 115 L->data[i].tax= L->data[i-1].tax+1; 116 printf("正在计算选手名次请稍后\n排序成功\n"); 117 } 118 /* 119 void check(SeqList *L,SeqList *P) 120 { 121 int i; 122 for(i=1;i<=L->len-1;i++) 123 if(L->data[i].score==L->data[i+1].score) 124 125 } 126 */ 127 void Display(SeqList *L) 128 { 129 int i; 130 printf("姓名\t编号\t票数\t名次\t\n"); 131 for(i=1;i<=L->len;i++) 132 printf("%s\t%d\t%d\t%d\t\n",L->data[i].name,L->data[i].num,L->data[i].score,L->data[i].tax); 133 printf("\n"); 134 } 135 136 void Save(SeqList *L) 137 { 138 FILE *fp; 139 int i; 140 char filename[20]; 141 printf("请输入目标文件名:\n"); 142 scanf("%s",filename); 143 fp=fopen(filename,"w"); 144 fprintf(fp,"姓名\t编号\t票数\t名次\n"); 145 for(i=1;i<=L->len;i++) 146 fprintf(fp,"%s\t%d\t%d\t%d\t\n",L->data[i].name,L->data[i].num,L->data[i].score,L->data[i].tax); 147 fclose(fp); 148 printf("数据已成功保存! \n"); 149 } 150 151 void meun() 152 { 153 printf("***************************************************\n"); 154 printf("**** 1--------输入选手信息(姓名、编号) ****\n"); 155 printf("**** 2--------开始投票 ****\n"); 156 printf("**** 3--------排序 ****\n"); 157 printf("**** 4--------查看结果 ****\n"); 158 //printf("**** 6--------选出前三名 ****\n"); 159 printf("**** 5--------保存到文件 ****\n"); 160 printf("**** 0--------退出 ****\n"); 161 printf("***************************************************\n"); 162 } 163 164 void main() 165 { 166 int sel; 167 SeqList L; 168 SeqList P; 169 do 170 { 171 meun(); 172 printf("请输入您的选择: "); 173 scanf("%d",&sel); 174 switch(sel) 175 { 176 case 1:Init(&L); break; 177 case 2:Toupiao(&L); break; 178 case 3:Shellsort(&L); 179 Mingci(&L);break; 180 case 4:Display(&L); break; 181 case 5:Save(&L); break; 182 } 183 }while(sel!=0); 184 }
要求: 选出得票数最多的前三名选手,若票数相同,则要求对其(前三)进行重新投票。求大神救命啊! 在线等!!
哇哦,c 不会诶 啊哈哈~
哇呜呜!
@大Yi巴狼: 其实你很厉害了,c都会 我就是C# 而且是基本的 啊哈哈~
@alone__: 没有啦,我菜鸟一只嗯!以后还得各位前辈多多指教呢! 共同学习,共同进步!O(∩_∩)O~
1 void Check(SeqList *L) 2 { 3 int i,flag=0,n=0; 4 SeqList *P; 5 P=(SeqList*)malloc(sizeof(SeqList)); 6 Init_sq(P,LIST_INIT_SIZE); 7 for(i=1;i<=L->len;i++) 8 if(L->data[i].tax == L->data[i+1].tax && i<=3) 9 flag=1; 10 if(flag==1) 11 { 12 for(i=1;i<=L->len;i++) 13 if(L->data[i].tax==1 || L->data[i].tax==2 || L->data[i].tax==3) 14 { 15 P->data[i]=L->data[i]; 16 n++; 17 } 18 P->len=n; 19 printf("前3名中有并列票数请重新为前三名投票"); 20 for(i=1;i<=P->len;i++) 21 P->data[i].score = P->data[i].tax =0; 22 Toupiao(P); 23 Shellsort(P); 24 Mingci(P); 25 Display(P); 26 } 27 else 28 Display(L); 29 }
哇,指针 不会,啊哈哈~