C语言编程 歌手打分系统 高手进

①能够根据输入的选手人数创建链表;②录入9名评委给选手的打分,并存储到文件singerOriginal.dat中;③按照去掉一个最高分和去掉一个最低分的原则求每名选手的平... ① 能够根据输入的选手人数创建链表;
② 录入9名评委给选手的打分,并存储到文件singerOriginal.dat中;
③ 按照去掉一个最高分和去掉一个最低分的原则求每名选手的平均分;
④ 按平均分由高到低的顺序对选手进行排序;
⑤ 把排名后的数据存储到文件singerFianl.dat中;
⑥ 把原始数据和最终的结果输出到屏幕;
⑦ 在第②步中保存singerOriginal.dat文件之前,可根据情况修改数据,例如:插入或删除歌手。
1)要有可供选择的功能菜单
**************************************
* 1.输入歌手成绩 *
* 2.插入新歌手 *
* 3.删除退赛歌手 *
* 4.歌手成绩排名 *
* 5.输出歌手分数 *
* 6.输出歌手排名 *
* 7.退出系统 *
**************************************
展开
 我来答
匿名用户
2013-09-12
展开全部
全力倾注打造:

#include <stdio.h>
#include <stdlib.h>

typedef struct _singer {
double score;
struct _singer* next;
} *node, singer;

node insert(node* head, node p, double score)
{
node tmp;
tmp = (node)malloc(sizeof(singer));
tmp->score = score;
tmp->next = p ? p->next : *head;
return (p ? p->next : *head) = tmp;
}

node create(double* beg, double* end)
{
node head, t;
head = t = NULL;
while(beg != end)
t = insert(&head, t, *beg++);
return head;
}

void remove(node* head, node p)
{
node r = *head;
if(p == *head) {
*head = r->next;
} else {
while(r->next != p) r = r->next;
r->next = p->next;
r = p;
}
free(r);
}

void show(node head)
{
while(head) {
printf("%.2f ", head->score);
head = head->next;
}
putchar('\n');
}

node sort(node head, int n)
{
int i, mid;
node l, r, t, v, p, *pp;
if(n < 2) return head;
mid = n/2;
t = l = r = head;
for(i = 0; i < mid; ++i)
t = r, r = r->next;
t->next = NULL;
l = sort(l, mid);
r = sort(r, n-mid);
v = p = NULL;
for(; l && r; (*pp) = (*pp)->next)
p = (v ? p->next : v) = *(l->score < r->score ? (pp = &l) : (pp = &r));
for(t = l ? l : r ? r : NULL; t; t = t->next)
p = (v ? p->next : v) = t;
return v;
}

#define FEN 1
#define PAI 0
void save(node head, int f)
{
FILE* fp;
node t = head;
char* file = f ? "D:\\aaa.txt" : "D:\\bbb.txt";
fp = fopen(file, "w");
while(t) {
fprintf(fp, "%.2f ", t->score);
t = t->next;
}
fclose(fp);
show(head);
printf("%s已保存!\n", f ? "分数" : "排名");
}

node input()
{
double s;
node head, t;
char c;
head = t = NULL;
printf("请输入歌手的分数(数量无限制):");
while(scanf("%lf", &s)) {
t = insert(&head, t, s);
if((c = getchar()) == '\n')
break;
else
ungetc(c, stdin);
}
puts("输入完毕!");
return head;
}

void ins(node* head)
{
int n;
double s;
node t = *head;
printf("现在的分数序列是:");
show(*head);
printf("请输入你要插入到的位置(从1开始):");
scanf("%d", &n);
printf("请输入你要插入的分数:");
scanf("%lf", &s);
if(n == 1) t = NULL;
if(n >= 2) t = *head;
while(n-- > 2) t = t->next;
insert(head, t, s);
puts("插入完毕!");
}

void del(node* head)
{
int n;
node t = *head;
printf("现在的分数序列是:");
show(*head);
printf("请输入你要删除的分数所在的位置(从1开始):");
scanf("%d", &n);
while(--n) t = t->next;
remove(head, t);
puts("删除完毕!");
}

void pai(node* head)
{
int n;
node t = *head;
for(n = 0; t; ++n) t = t->next;
*head = sort(*head, n);
puts("排名完毕!");
}

int menu()
{
int n;
puts("* 1.输入歌手成绩 *");
puts("* 2.插入新歌手 *");
puts("* 3.删除退赛歌手 *");
puts("* 4.歌手成绩排名 *");
puts("* 5.输出歌手分数 *");
puts("* 6.输出歌手排名 *");
puts("* 7.退出系统 *");
scanf("%d", &n);
return n;
}

int main()
{
int done = 0;
node head;
while(!done)
switch (menu()) {
case 1: head = input(); break;
case 2: ins(&head); break;
case 3: del(&head); break;
case 4: pai(&head); break;
case 5: save(head, FEN); break;
case 6: save(head, PAI); break;
case 7: done = 1;
}
return 0;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式