【用C语言描述数据结构】课程设计:歌手比赛系统

这篇具有很好参考价值的文章主要介绍了【用C语言描述数据结构】课程设计:歌手比赛系统。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

✅作者简介:一名在读大二学生,希望大家多多支持👍👍👍
🔥系列专栏:数据结构
💬个人主页:梦园的CSDN博客

c语言歌唱比赛系统,数据结构,C语言,c语言,数据结构,课程设计

文末附有全部代码哦💖💖
文末附有全部代码哦~

一、具体问题

1.问题描述:

设计一个简单的歌手比赛绩管理程序,对一次歌手比赛的成绩进行管理,使用链表实现,基本的设计要求如下(不限于此要求):
(1)输入每个选手的数据包括编号、姓名、十个评委的成绩,根据输入计算出总成绩和平均成绩(去掉最高分,去掉最低分)。
(2)显示主菜单如下:

  • 1.选手数据输入
  • 2.评委打分
  • 3.成绩排序
  • 4.数据查询
  • 5.追加选手数据
  • 6.删除选手数据
  • 7.修改选手数据
  • 8.输出全部选手信息
  • 9.写入数据文件
  • 10.退出系统

2.问题来源

当下,无论是校园内还是在社会生活中,经常会举行一些歌手演唱比赛,在信息化的时代里,不会再像以前那样用笔和纸记录比赛的赛况,歌手比赛系统应运而生。歌手比赛系统包含了一切歌手演唱比赛需要的功能,歌手信息的输入,评委打分,成绩排序等功能操作简单高效,可以完成很多繁琐的工作,完全可以满足一切歌手比赛的需求。开发此系统只为方便歌手演唱比赛的举办。

3.解决手段

歌手比赛系统是一个可以储存多个比赛选手信息的系统,主要采用链表来实现存储信息的需求,使用头插法来输入数据,通过选手编号来实现评委打分,成绩排序,数据查询,追加选手数据,删除选手信息,修改选手信息,输出全部选手信息,写入数据文件等功能。

4.应用前景

在信息技术迅速发展的今天,网络对于大多数人已经不再陌生,网络在人们的工作、学习和生活中发挥着不可替代的作用,大大提高了人们生产生活效率。歌手比赛系统是信息技术在人们工作生活中应用的代表,该系统完成评委打分,成绩排序,数据查询,追加选手数据,删除选手信息,修改选手信息,输出全部选手信息,写入数据文件等功能,这些功能可以让评委们在歌手比赛结算时时更加方便快捷。同时,该系统也可以应用到其他比赛当中,使比赛更加方便快捷。

二、需求分析

1.功能需求分析

歌手比赛系统是我们为了方便进行歌手比赛而开发的一套系统,该系统的主要目的是实现选手的信息分析,该系统具有评委打分,成绩排序,数据查询,追加选手数据,删除选手信息,修改选手信息,输出全部选手信息,写入数据文件等功能。同时,歌手比赛系统基于c语言编译的源程序,其调用函数根据所需要模块进行引用,再编写好之后,要对程序进行相应的调试,以验证程序的正确性和可用性。调试及测试时,通过相应信息,充分证明程序的可行性,同时本程序具有很高的逻辑性和严密性。

2.系统功能模块图

该程序的系统功能模块图如下图所示。
c语言歌唱比赛系统,数据结构,C语言,c语言,数据结构,课程设计

3.数据结构定义

typedef struct Node {
    int id;//编号
    char name[MAXSIZE];//姓名
    float grade[NUMBER];//评委评分
    float sum;//总分
float average;//平均分
struct Node *next;//指针域
} S;//结构体定义为S

//各函数定义
void menu(); //菜单函数 
S *create();//创建链表函数 
void print(S *);//输出链表函数 
void insert(S *);//插入节点函数 
void del(S *);//删除节点函数
void update(S *);

void search(S *);//查找节点函数
void sort(S *);//节点排序函数 
void save(S *);

void giveScore(S *);

三、系统设计

1.主要函数表

c语言歌唱比赛系统,数据结构,C语言,c语言,数据结构,课程设计

2.功能流程图

(1)添加选手信息

如下图所示:
c语言歌唱比赛系统,数据结构,C语言,c语言,数据结构,课程设计

(2)修改选手信息

如下图所示:
c语言歌唱比赛系统,数据结构,C语言,c语言,数据结构,课程设计

(3)删除选手信息

如下图所示:
c语言歌唱比赛系统,数据结构,C语言,c语言,数据结构,课程设计

四、代码测试

1.主函数

//主函数
int main() {
    S *head;
    int n, a = 1;//n用来控制选择操作类型,a控制循环,以-1终止
    while (a > 0) {
        menu();//显示菜单
        printf("请输入操作数:");
        scanf("%d", &n);//选择操作
        switch (n)//各操作数字对应菜单数字,通过n确定操作类型
        {
            //创建结点,输入选手数据
            case 1:
                head = create();
                break;
                //评委打分
            case 2:
                if (head == NULL) {
                    printf("链表为空,请先执行1操作!\n");
                    break;
                }
                giveScore(head);
                break;
                //排序
            case 3:
                if (head == NULL) {
                    printf("链表为空,请先执行1操作!\n");
                    break;
                }
                sort(head);
                break;
                //查询
            case 4:
                if (head == NULL) {
                    printf("链表为空,请先执行1操作!\n");
                    break;
                }
                search(head);
                break;
                //追加数据
            case 5:
                if (head == NULL) {
                    printf("链表为空,请先执行1操作!\n");
                    break;
                }
                insert(head);
                break;
                //删除
            case 6:
                if (head == NULL) {
                    printf("链表为空,请先执行1操作!\n");
                    break;
                }
                del(head);
                break;
                //修改数据
            case 7:
                if (head == NULL) {
                    printf("链表为空,请先执行1操作!\n");
                    break;
                }
                update(head);
                break;
                //输出全部选手信息
            case 8:
                if (head == NULL) {
                    printf("链表为空,请先执行1操作!\n");
                    break;
                }
                print(head);
                break;
                //写入文件
            case 9:
                if (head == NULL) {
                    printf("链表为空,请先执行1操作!\n");
                    break;
                }
                save(head);
                break;
                //退出系统
            case 0:
                exit(0);
                break;
            default:
                printf("退出系统");
                a = -1;//跳出循环条件
                break;
        }
    }
    return 0;
}

2.菜单模块

//菜单模块直接显示 
void menu() {
    printf("==============================\n");
    printf("=========请选择操作============\n");
    printf("========1.输入选手数据=========\n");
    printf("========2.评委打分============\n");
    printf("========3.成绩排序============\n");
    printf("========4.数据查询============\n");
    printf("========5.追加选手数据=========\n");
    printf("========6.删除选手信息=========\n");
    printf("========7.修改选手信息=========\n");
    printf("========8.输出全部选手信息======\n");
    printf("========9.写入数据文件=========\n");
    printf("========0.退出系统============\n");
    printf("=============================\n");
}

  • 运行结果如下:
    c语言歌唱比赛系统,数据结构,C语言,c语言,数据结构,课程设计

3.输入选手数据模块

//1.输入选手数据
S *create() {
    S *head, *p, *q;//定义指针
    int i;
    head = (S *) malloc(sizeof(S));//头节点开辟空间
    head->average = 0;//置空头节点的average成员
    head->next = NULL;//置空头节点的指针域
    q = head;//q指针记录头节点的地址
    p = head->next;//p指针记录头节点的指针域的地址
    printf("请输入选手编号和姓名(编号为0则表示停止):\n");
    int id;
    printf("请输入选手id(输入0退出):\n");
    scanf("%d", &id);
    while (id != 0)//输入选手编号输入为零停止循环
    {
        p = (S *) malloc(sizeof(S));//p指针开辟空间
        p->id = id;
        printf("请输入选手姓名:\n");
        scanf("%s", p->name);
        for (i = 0; i < NUMBER; i++) {
            p->grade[i] = 0;
        }
        p->sum = 0;
        p->average = 0;
        p->next = NULL;//置空p节点的指针域
        q->next = p;//p,q节点连接
        q = p;//q指针后移
        printf("请输入选手id(输入0退出):\n");
        scanf("%d", &id);
    }
    return head;//返回链表的起始地址
}

  • 运行结果如下:
    c语言歌唱比赛系统,数据结构,C语言,c语言,数据结构,课程设计

4.评委打分模块

//2.评委打分
void giveScore(S *head) {
    //定义指针
    S *p;
    p = head->next;
    float max, min;
    while (p != NULL) {
        if (p->grade[0] != 0) {
            p = p->next;
            continue;
        }
        printf("请十位评为给编号为%d的选手打分:\n", p->id);
        p->sum = 0;
        for (int i = 0; i < NUMBER; i++) {
            printf("请第%d位评委打分:", i);
            scanf("%f", &p->grade[i]);
            p->sum += p->grade[i];
        }
        printf("\n");
        min = max = p->grade[0];
        for (int i = 0; i < NUMBER; i++) {
            if (p->grade[i] > max)
                max = p->grade[i];
            if (p->grade[i] < min)
                min = p->grade[i];
        }
        p->average = (p->sum - max - min) / 8;
        p = p->next;
    }
}

  • 运行结果如下:
    c语言歌唱比赛系统,数据结构,C语言,c语言,数据结构,课程设计

5.按照平均成绩排序 – 采用冒泡排序,交换节点

//3.按照平均成绩排序 -- 采用冒泡排序,交换节点
void sort(S *head) {
    S *p, *pre, *temp, *tail;

    tail = NULL;
// 算法的核心部分,节点交换
    while (head->next != tail) {
        pre = head;
        p = head->next;
        while (p->next != tail) {
            if (p->average < p->next->average) {
                temp = p->next;
                pre->next = p->next;
                p->next = p->next->next;
                pre->next->next = p;
                p = temp;
            }
            // 节点后移
            p = p->next;
            pre = pre->next;
        }
        tail = p;
    }
}

6.数据查询模块

//4.根据id查找节点模块
void search(S *head) {
    S *p;//定义指针
    int id;//定义b用于输入查找编号
    printf("请输入要查找的选手编号:");
    //输入查找编号
    scanf("%d", &id);
    p = head->next;
    while (p != NULL) {
        if (p->id == id)//判断是否找到选手编号
        {
            //为真时,输出信息
            printf("编号\t姓名\t\t\t\t\t十位评委的成绩\t\t\t\t\t总成绩\t平均成绩\n");
            printf("%d %s %.2f%.2f%.2f%.2f%.2f%.2f%.2f%.2f%.2f%.2f %.2f %.2f\n", p->id, p->name, p->grade[0],
                   p->grade[1], p->grade[2], p->grade[3], p->grade[4], p->grade[5], p->grade[6], p->grade[7],
                   p->grade[8], p->grade[9], p->sum, p->average);
            break;
        } else
            //为假时
            p = p->next;//指针后移
    }
    if (p == NULL)//查找到最后一个节点还未查到要的编号时,输出ERROR INPUT
        printf("输入的选手编号错误\n");
}
  • 运行结果如下:
    c语言歌唱比赛系统,数据结构,C语言,c语言,数据结构,课程设计

7.追加选手数据模块

//5.追加节点模块(可多个插入)
void insert(S *head) {
    int i, id, flag = 1;//flag实现判断指针是否到达最后一个节点
    S *p, *q, *r;    //定义指针便于插入操作
    p = head;
    printf("请输入选手信息:\n");
    printf("请输入选手id(输入0退出):\n");
    scanf("%d", &id);
    while (id != 0)//输入编号不为零时循环,以零终止,可实现多个插入
    {
        r = (S *) malloc(sizeof(S));//为r开辟空间
        r->next = NULL;//置空r的指针域
        //输入相关数据,并计算相关数据
        r->id = id;
        printf("请输入选手姓名:\n");
        scanf("%s", r->name);
        r->sum = 0;
        r->average = 0;
        for (i = 0; i < NUMBER; i++) {
            r->grade[i] = 0;
        }

        while (p->next != NULL) {
            p = p->next;
        }
        p->next = r;

        printf("请输入选手id(输入0退出):\n");
        scanf("%d", &id);
    }
}

  • 运行结果如下:
    c语言歌唱比赛系统,数据结构,C语言,c语言,数据结构,课程设计

8.删除选手信息模块

//6.删除节点模块
void del(S *head) {
    S *p, *q;//定义指针
    int b;//用于输入编号查找删除
    p = head;//p记录头节点的地址
    q = head->next;//q记录头节点的指针域的地址
    printf("请输入要删除选手的id:");
    //输入编号
    scanf("%d", &b);
    while (q != NULL)//q不为空时执行循环
    {
        if (q->id == b)//判断是否找到输入的编号
            //为真时
        {
            p->next = q->next;//断开q节点
            free(q);//释放q节点neicun
            q = NULL;    //置空q指针防止出现野指针
        } else {
            //判断为假时
            p = p->next;//p指针后移
            q = q->next;//q指针后移
        }
    }
    if (p == NULL)//当查找到最后一个节点还未查到要删除的编号时,输出ERROR INPUT
        printf("输入的选手id不存在!\n");
}
  • 运行结果如下:
    c语言歌唱比赛系统,数据结构,C语言,c语言,数据结构,课程设计

9.修改选手信息模块

//修改选手信息
void update(S *head) {
    S *p, *q, *new;//定义指针
    int id;//用于输入编号查找删除
    float min = 999, max = 0;
    p = head;//p记录头节点的地址
    q = head->next;//q记录头节点的指针域的地址
    printf("请输入要修改的选手id:");
    //输入编号
    scanf("%d", &id);
    while (q != NULL)//q不为空时执行循环
    {
        //判断是否找到输入的编号
        if (q->id == id) {
            new = (S *) malloc(sizeof(S));
            printf("请输入%d号选手的新成绩:", q->id);
            new->id = q->id;
            strcpy(new->name, q->name);
            new->sum = 0;
            new->average = 0;
            for (int i = 0; i < NUMBER; ++i) {
                scanf("%f", &new->grade[i]);
                new->sum += new->grade[i];
                if (new->grade[i] > max) {
                    max = new->grade[i];
                }
                if (new->grade[i] < min) {
                    min = new->grade[i];
                }
            }
            new->average = (new->sum - max - min) / (NUMBER - 2);
            new->next = q->next;//断开q节点
            p->next = new;
            free(q);//释放q节点
            q = NULL;    //置空q指针防止出现野指针
        } else {
            //判断为假时
            p = p->next;//p指针后移
            q = q->next;//q指针后移
        }
    }
    if (p == NULL)//当查找到最后一个节点还未查到要修改的编号时
        printf("输入的选手id不存在!\n");
}

  • 运行结果如下:
    c语言歌唱比赛系统,数据结构,C语言,c语言,数据结构,课程设计

10.输出全部选手信息模块

//7.输出全部选手信息
void print(S *head) {
    int i;
    S *p = head->next;
    printf("编号\t姓名\t总成绩\t平均成绩\t\t\t\t\t十位评委的成绩\t\t\t\t\n");
    while (p)//当p不为空的时候执行
    {
        printf("%-d\t%-s\t%-.2f\t%-.2f\t", p->id, p->name, p->sum, p->average);
        for (i = 0; i < NUMBER; i++)
            printf("%-6.2f\t", p->grade[i]);
        printf("\n");
        p = p->next;//指针后移
    }
}

  • 运行结果如下:
    c语言歌唱比赛系统,数据结构,C语言,c语言,数据结构,课程设计

11.写入数据文件(记得修改写入文件地址)

//8.写入数据文件
void save(S *head) {
    S *p;
    p = head->next;
    FILE *fp;
    if ((fp = fopen("C:\\Users\\zhuxuanyu\\Desktop\\file.txt", "wt")) == NULL) {
        printf("打开写入文件fle.txt失败\n");
        return;
    }
    while (p) {
        fprintf(fp, "编号:%-d\t 姓名:%-s\t 总成绩:%-.2f\t 平均成绩:%-.2f\t 评委打分:", p->id, p->name, p->sum,
                p->average);
        for (int i = 0; i < NUMBER; ++i) {
            fprintf(fp, "%-.2f\t", p->grade[i]);
        }
        fprintf(fp, "\n");
        p = p->next;
    }
    fclose(fp);
}

五、完整代码


#include <stdio.h>
#include  <stdlib.h>
#include <string.h>
//创建结构体及其成员 

#define MAXSIZE 20
#define NUMBER 10

typedef struct Node {
    int id;//编号
    char name[MAXSIZE];//姓名
    float grade[NUMBER];//评委评分
    float sum;//总分
    float average;//平均分
    struct Node *next;//指针域
} S;//结构体定义为S
//各函数定义
void menu(); //菜单函数 
S *create();//创建链表函数 
void print(S *);//输出链表函数 
void insert(S *);//插入节点函数 
void del(S *);//删除节点函数
void update(S *);

void search(S *);//查找节点函数
void sort(S *);//节点排序函数 
void save(S *);

void giveScore(S *);


//主函数
int main() {
    S *head;
    int n, a = 1;//n用来控制选择操作类型,a控制循环,以-1终止
    while (a > 0) {
        menu();//显示菜单
        printf("请输入操作数:");
        scanf("%d", &n);//选择操作
        switch (n)//各操作数字对应菜单数字,通过n确定操作类型
        {
            //创建结点,输入选手数据
            case 1:
                head = create();
                break;
                //评委打分
            case 2:
                if (head == NULL) {
                    printf("链表为空,请先执行1操作!\n");
                    break;
                }
                giveScore(head);
                break;
                //排序
            case 3:
                if (head == NULL) {
                    printf("链表为空,请先执行1操作!\n");
                    break;
                }
                sort(head);
                break;
                //查询
            case 4:
                if (head == NULL) {
                    printf("链表为空,请先执行1操作!\n");
                    break;
                }
                search(head);
                break;
                //追加数据
            case 5:
                if (head == NULL) {
                    printf("链表为空,请先执行1操作!\n");
                    break;
                }
                insert(head);
                break;
                //删除
            case 6:
                if (head == NULL) {
                    printf("链表为空,请先执行1操作!\n");
                    break;
                }
                del(head);
                break;
                //修改数据
            case 7:
                if (head == NULL) {
                    printf("链表为空,请先执行1操作!\n");
                    break;
                }
                update(head);
                break;
                //输出全部选手信息
            case 8:
                if (head == NULL) {
                    printf("链表为空,请先执行1操作!\n");
                    break;
                }
                print(head);
                break;
                //写入文件
            case 9:
                if (head == NULL) {
                    printf("链表为空,请先执行1操作!\n");
                    break;
                }
                save(head);
                break;
                //退出系统
            case 0:
                exit(0);
                break;
            default:
                printf("退出系统");
                a = -1;//跳出循环条件
                break;
        }
    }
    return 0;
}

//菜单模块直接显示 
void menu() {
    printf("==============================\n");
    printf("=========请选择操作============\n");
    printf("========1.输入选手数据=========\n");
    printf("========2.评委打分============\n");
    printf("========3.成绩排序============\n");
    printf("========4.数据查询============\n");
    printf("========5.追加选手数据=========\n");
    printf("========6.删除选手信息=========\n");
    printf("========7.修改选手信息=========\n");
    printf("========8.输出全部选手信息======\n");
    printf("========9.写入数据文件=========\n");
    printf("========0.退出系统============\n");
    printf("=============================\n");
}

//1.输入选手数据
S *create() {
    S *head, *p, *q;//定义指针
    int i;
    head = (S *) malloc(sizeof(S));//头节点开辟空间
    head->average = 0;//置空头节点的average成员
    head->next = NULL;//置空头节点的指针域
    q = head;//q指针记录头节点的地址
    p = head->next;//p指针记录头节点的指针域的地址
    printf("请输入选手编号和姓名(编号为0则表示停止):\n");
    int id;
    printf("请输入选手id(输入0退出):\n");
    scanf("%d", &id);
    while (id != 0)//输入选手编号输入为零停止循环
    {
        p = (S *) malloc(sizeof(S));//p指针开辟空间
        p->id = id;
        printf("请输入选手姓名:\n");
        scanf("%s", p->name);
        for (i = 0; i < NUMBER; i++) {
            p->grade[i] = 0;
        }
        p->sum = 0;
        p->average = 0;
        p->next = NULL;//置空p节点的指针域
        q->next = p;//p,q节点连接
        q = p;//q指针后移
        printf("请输入选手id(输入0退出):\n");
        scanf("%d", &id);
    }
    return head;//返回链表的起始地址
}

//2.评委打分
void giveScore(S *head) {
    //定义指针
    S *p;
    p = head->next;
    float max, min;
    while (p != NULL) {
        if (p->grade[0] != 0) {
            p = p->next;
            continue;
        }
        printf("请十位评为给编号为%d的选手打分:\n", p->id);
        p->sum = 0;
        for (int i = 0; i < NUMBER; i++) {
            printf("请第%d位评委打分:", i);
            scanf("%f", &p->grade[i]);
            p->sum += p->grade[i];
        }
        printf("\n");
        min = max = p->grade[0];
        for (int i = 0; i < NUMBER; i++) {
            if (p->grade[i] > max)
                max = p->grade[i];
            if (p->grade[i] < min)
                min = p->grade[i];
        }
        p->average = (p->sum - max - min) / 8;
        p = p->next;
    }
}

//3.按照平均成绩排序 -- 采用冒泡排序,交换节点
void sort(S *head) {
    S *p, *pre, *temp, *tail;

    tail = NULL;
// 算法的核心部分,节点交换
    while (head->next != tail) {
        pre = head;
        p = head->next;
        while (p->next != tail) {
            if (p->average < p->next->average) {
                temp = p->next;
                pre->next = p->next;
                p->next = p->next->next;
                pre->next->next = p;
                p = temp;
            }
            // 节点后移
            p = p->next;
            pre = pre->next;
        }
        tail = p;
    }
}

//4.根据id查找节点模块
void search(S *head) {
    S *p;//定义指针
    int id;//定义b用于输入查找编号
    printf("请输入要查找的选手编号:");
    //输入查找编号
    scanf("%d", &id);
    p = head->next;
    while (p != NULL) {
        if (p->id == id)//判断是否找到选手编号
        {
            //为真时,输出信息
            printf("编号\t姓名\t\t\t\t\t十位评委的成绩\t\t\t\t\t总成绩\t平均成绩\n");
            printf("%d %s %.2f%.2f%.2f%.2f%.2f%.2f%.2f%.2f%.2f%.2f %.2f %.2f\n", p->id, p->name, p->grade[0],
                   p->grade[1], p->grade[2], p->grade[3], p->grade[4], p->grade[5], p->grade[6], p->grade[7],
                   p->grade[8], p->grade[9], p->sum, p->average);
            break;
        } else
            //为假时
            p = p->next;//指针后移
    }
    if (p == NULL)//查找到最后一个节点还未查到要的编号时,输出ERROR INPUT
        printf("输入的选手编号错误\n");
}


//5.追加节点模块(可多个插入)
void insert(S *head) {
    int i, id, flag = 1;//flag实现判断指针是否到达最后一个节点
    S *p, *q, *r;    //定义指针便于插入操作
    p = head;
    printf("请输入选手信息:\n");
    printf("请输入选手id(输入0退出):\n");
    scanf("%d", &id);
    while (id != 0)//输入编号不为零时循环,以零终止,可实现多个插入
    {
        r = (S *) malloc(sizeof(S));//为r开辟空间
        r->next = NULL;//置空r的指针域
        //输入相关数据,并计算相关数据
        r->id = id;
        printf("请输入选手姓名:\n");
        scanf("%s", r->name);
        r->sum = 0;
        r->average = 0;
        for (i = 0; i < NUMBER; i++) {
            r->grade[i] = 0;
        }

        while (p->next != NULL) {
            p = p->next;
        }
        p->next = r;

        printf("请输入选手id(输入0退出):\n");
        scanf("%d", &id);
    }
}

//6.删除节点模块
void del(S *head) {
    S *p, *q;//定义指针
    int b;//用于输入编号查找删除
    p = head;//p记录头节点的地址
    q = head->next;//q记录头节点的指针域的地址
    printf("请输入要删除选手的id:");
    //输入编号
    scanf("%d", &b);
    while (q != NULL)//q不为空时执行循环
    {
        if (q->id == b)//判断是否找到输入的编号
            //为真时
        {
            p->next = q->next;//断开q节点
            free(q);//释放q节点neicun
            q = NULL;    //置空q指针防止出现野指针
        } else {
            //判断为假时
            p = p->next;//p指针后移
            q = q->next;//q指针后移
        }
    }
    if (p == NULL)//当查找到最后一个节点还未查到要删除的编号时,输出ERROR INPUT
        printf("输入的选手id不存在!\n");
}

//修改选手信息
void update(S *head) {
    S *p, *q, *new;//定义指针
    int id;//用于输入编号查找删除
    float min = 999, max = 0;
    p = head;//p记录头节点的地址
    q = head->next;//q记录头节点的指针域的地址
    printf("请输入要修改的选手id:");
    //输入编号
    scanf("%d", &id);
    while (q != NULL)//q不为空时执行循环
    {
        //判断是否找到输入的编号
        if (q->id == id) {
            new = (S *) malloc(sizeof(S));
            printf("请输入%d号选手的新成绩:", q->id);
            new->id = q->id;
            strcpy(new->name, q->name);
            new->sum = 0;
            new->average = 0;
            for (int i = 0; i < NUMBER; ++i) {
                scanf("%f", &new->grade[i]);
                new->sum += new->grade[i];
                if (new->grade[i] > max) {
                    max = new->grade[i];
                }
                if (new->grade[i] < min) {
                    min = new->grade[i];
                }
            }
            new->average = (new->sum - max - min) / (NUMBER - 2);
            new->next = q->next;//断开q节点
            p->next = new;
            free(q);//释放q节点
            q = NULL;    //置空q指针防止出现野指针
        } else {
            //判断为假时
            p = p->next;//p指针后移
            q = q->next;//q指针后移
        }
    }
    if (p == NULL)//当查找到最后一个节点还未查到要修改的编号时
        printf("输入的选手id不存在!\n");
}

//7.输出全部选手信息
void print(S *head) {
    int i;
    S *p = head->next;
    printf("编号\t姓名\t总成绩\t平均成绩\t\t\t\t\t十位评委的成绩\t\t\t\t\n");
    while (p)//当p不为空的时候执行
    {
        printf("%-d\t%-s\t%-.2f\t%-.2f\t", p->id, p->name, p->sum, p->average);
        for (i = 0; i < NUMBER; i++)
            printf("%-6.2f\t", p->grade[i]);
        printf("\n");
        p = p->next;//指针后移
    }
}

//8.写入数据文件(记得修改文件地址)

void save(S *head) {
    S *p;
    p = head->next;
    FILE *fp;
    if ((fp = fopen("C:\\Users\\zhuxuanyu\\Desktop\\file.txt", "wt")) == NULL) {
        printf("打开写入文件fle.txt失败\n");
        return;
    }
    while (p) {
        fprintf(fp, "编号:%-d\t 姓名:%-s\t 总成绩:%-.2f\t 平均成绩:%-.2f\t 评委打分:", p->id, p->name, p->sum,
                p->average);
        for (int i = 0; i < NUMBER; ++i) {
            fprintf(fp, "%-.2f\t", p->grade[i]);
        }
        fprintf(fp, "\n");
        p = p->next;
    }
    fclose(fp);
}

六、设计体会与小结

  • 数据结构是基础的一门课,对于有过编程经验的人,结合自己的编程体会去悟它的思想,而且我觉得随着编程经历的丰富对它的体会越深入,最初接触是对一些思想可能只是生硬的记忆,随着学习的深入逐渐领悟了很多。看了这次课程设计的题目,虽然具体要求没有看清,但是总结一下,可以看出,其需要我们能把一个具体案例或一件事情反映为程序来表达,数据结构就是桥梁,通过自己的设计,使应用能力得以融汇,对与问题,具有了初步的分析,继而解决之的能力,感觉对以后的学习会有很大的帮助,学习无非是用于实践。
  • 很多人都说编程是一条孤独的、枯燥的路,其实我感觉编程还挺好玩,每编一个程序都像是一场斗智斗勇的冒险,一头扎进去就是好几个小时,也会经常和同学分享一下自己的思路或者见解,越学越觉得智慧殿堂无穷无尽。在这一段时间的学习里,我们同学之前互相沟通交流,互相帮助过得也很愉快,老师在教我们之前生了一场病,如果不是这样,老师上课的风采应该更甚。在以后的学习中,我也会继续探究数据结构的奇妙世界,学无止境,争取在数据的道路上更上一层楼!

c语言歌唱比赛系统,数据结构,C语言,c语言,数据结构,课程设计文章来源地址https://www.toymoban.com/news/detail-776531.html

到了这里,关于【用C语言描述数据结构】课程设计:歌手比赛系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构_C++语言描述_高教出版社

    博客起源:本博客记录了个人学习数据结构期间做的一些笔记,其中含有PPT的截图或者个人的一些见解与思考,多有不足还望包含与指出,祝各位学习愉快 参考教材:《数据结构 C++语言描述》高等教育出版社 相关代码:DataStructure 笔记范围:全书 1.1 数据分析+结构存储+算法

    2024年01月19日
    浏览(36)
  • 《数据结构、算法与应用C++语言描述》-列车车厢重排问题

    完整可编译运行代码见:Github::Data-Structures-Algorithms-and-Applications/_10Train_carriages_rearrangement/ 一列货运列车有 n 节车厢,每节车厢要停靠在不同的车站。假设 n个车站从 1 到n 编号,而且货运列车按照从n到1的顺序经过车站。车厢的编号与它们要停靠的车站编号相同。为了便于从

    2024年04月10日
    浏览(51)
  • 数据结构——用C语言描述(第2版)耿国华 课后习题答案

      如有错误,敬请谅解! 此文章仅为本人学习笔记,仅供参考,如有冒犯,请联系作者删除!! 目录 第一章习题答案 第二章习题答案 第三章习题答案 第五章习题答案 第六章习题答案 第七章习题答案 第八章查找 第九章排序 2 、 ××√ 3 、( 1 )包含改变量定义的最小范围

    2024年02月08日
    浏览(33)
  • 数据结构:定长顺序串(SString)基本操作的算法描述(C语言)

    作者在学习数据结构时,发现鲜有完全按照 C 语言描述的算法操作,这让习惯于写 .c 而不是 .cpp 的初学者很是头疼。本文将基于 C 语言描述算法操作,如有错漏还望大佬们指正。 本文将按照严惠敏所著《数据结构(C语言版)》所做的函数原型声明进行算法描述,由于C语言不支

    2024年02月07日
    浏览(54)
  • 数据结构课程设计

    编制一个能演示执行集合的交、并和差运算的程序。 要求: 集合元素用小写英文字母,执行各种操作应以对话方式执行。 算法要点:利用单链表表示集合;理解好三种运算的含义 分析 : 输入:输入应该具有判断是否为小写字母的功能,如果不是小写字母,应该舍去,同时

    2024年02月02日
    浏览(35)
  • 数据结构课程设计 ——考试报名系统

    数据结构课程设计 ——考试报名系统 一、项目功能要求 完成对考生信息的建立,查找,插入,修改,删除等功能。其中考生信息包括准考证号,姓名,性别,年龄和报考类别等信息。项目在设计时应首先确定系统的数据结构,定义类的成员变量和成员函数;然后实现各成员

    2024年02月04日
    浏览(37)
  • 【数据结构课程设计】关键路径问题

    1 问题描述与功能需求分析 1.1问题描述 1) 任务:设计一个程序求出完成整项工程至少需要多少时间以及整项工程中的关键活动。 2)基本要求: (1)对一个描述工程的 AOE 网,应判断其是否能够顺利进行。 (2)若该工程能顺利进行,输出完成整项工程至少需要多少时间,以及

    2024年02月10日
    浏览(36)
  • 数据结构课程设计1: 区块链

    1.任务: [问题描述] 使用链表设计一个保存信息的系统,该系统拥有类似区块链的设计以防止信息被轻易篡改。 该题目使用一个链表。信息保存在链表的每一个节点中,每个节点需要包含该节点的编号、信息和校验码。其中: + 每个节点的编号按照顺序递增,从0开始。 + 节

    2023年04月16日
    浏览(95)
  • 数据结构课程设计 仓储管理系统

    【基本功能】 把货品信息表抽象成一个线性表,货品信息(包括ID、货品名、定价、数量等)作为线性表的一个元素,实现:按ID、货品名分别查找某货品信息(包括ID、货品名、定价、数量等);收录货品(如果货品在帐中已有,则只将总库存量增加。否则插入新增信息);

    2024年01月23日
    浏览(45)
  • 一、课程设计目的与任务《数据结构》课程设计是为训练学生的数据组织能力和提高程序设计能力而设置的增强实践能力的课程。目的:学习数据结构课程,旨在使学生学会分析研究数据对象的特性,学会数据的组织方法,以

    一、课程设计目的与任务 《数据结构》课程设计是为训练学生的数据组织能力和提高程序设计能力而设置的增强实践能力的课程。目的:学习数据结构课程,旨在使学生学会分析研究数据对象的特性,学会数据的组织方法,以便选择合适的数据的逻辑结构和存储结构以及相应

    2024年02月21日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包