首页 新闻 会员 周边 捐助

求救哦!有一个函数不太会写!

-1
悬赏园豆:50 [已关闭问题] 关闭于 2013-06-29 09:14
  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 }

 

要求: 选出得票数最多的前三名选手,若票数相同,则要求对其(前三)进行重新投票。求大神救命啊! 在线等!!

大Yi巴狼的主页 大Yi巴狼 | 初学一级 | 园豆:149
提问于:2013-06-28 14:18
< >
分享
所有回答(2)
0

哇哦,c 不会诶 啊哈哈~

alone__ | 园豆:60 (初学一级) | 2013-06-28 14:27

哇呜呜!

支持(0) 反对(0) 大Yi巴狼 | 园豆:149 (初学一级) | 2013-06-28 14:28

@大Yi巴狼: 其实你很厉害了,c都会 我就是C# 而且是基本的 啊哈哈~

支持(0) 反对(0) alone__ | 园豆:60 (初学一级) | 2013-06-28 15:16

@alone__: 没有啦,我菜鸟一只嗯!以后还得各位前辈多多指教呢! 共同学习,共同进步!O(∩_∩)O~

支持(0) 反对(0) 大Yi巴狼 | 园豆:149 (初学一级) | 2013-06-28 16:00
0
 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 }
大Yi巴狼 | 园豆:149 (初学一级) | 2013-06-28 16:02

哇,指针 不会,啊哈哈~

支持(0) 反对(0) alone__ | 园豆:60 (初学一级) | 2013-06-28 16:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册