用C语言实现歌曲排行榜,前三名的统计与展示

博主:sooopusooopu 2026-09-21 17:00:14 3

在数字音乐时代,歌曲排行榜一直是衡量作品热度的重要指标,无论是音乐平台的热歌榜,还是校园广播的每周推荐,排行榜都以直观的方式呈现最受欢迎的歌曲,如果我们用C语言来实现一个简单的歌曲排行榜系统,并统计出播放次数前三的歌曲,不仅能巩固编程基础,还能理解数据处理的逻辑,本文将详细介绍如何用C语言实现这一功能,从数据结构设计到排序算法选择,再到最终结果的展示。

歌曲排行榜的数据结构设计

要实现歌曲排行榜,首先需要明确存储哪些信息,一首歌曲的核心信息包括:歌名、歌手、播放次数,在C语言中,我们可以使用结构体(struct)来封装这些信息,再用数组存储多首歌曲的数据,形成“歌曲列表”。

#define MAX_SONGS 100  // 最大歌曲数量
// 定义歌曲结构体
typedef struct {
    char name[50];     // 歌名
    char artist[30];   // 歌手
    int plays;         // 播放次数
} Song;
// 歌曲数组
Song songList[MAX_SONGS];
int songCount = 0;    // 当前歌曲数量

这里,MAX_SONGS 定义了系统支持的最大歌曲数量(可根据需求调整),songCount 记录当前已输入的歌曲数量,避免数组越界。

歌曲数据的输入与存储

实现排行榜的第一步是录入歌曲数据,我们可以编写一个函数 inputSongs(),通过循环让用户输入歌名、歌手和播放次数,并存入 songList 数组,为了简化操作,这里假设用户手动输入数据(实际应用中可能从文件或数据库读取)。

#include <stdio.h>
#include <string.h>
// 输入歌曲数据
void inputSongs() {
    printf("请输入歌曲数量(1-%d):", MAX_SONGS);
    scanf("%d", &songCount);
    getchar();  // 清除输入缓冲区的换行符
    for (int i = 0; i < songCount; i++) {
        printf("\n第%d首歌曲:\n", i + 1);
        printf("歌名:");
        fgets(songList[i].name, sizeof(songList[i].name), stdin);
        songList[i].name[strcspn(songList[i].name, "\n")] = '\0';  // 去除末尾换行符
        printf("歌手:");
        fgets(songList[i].artist, sizeof(songList[i].artist), stdin);
        songList[i].artist[strcspn(songList[i].artist, "\n")] = '\0';
        printf("播放次数:");
        scanf("%d", &songList[i].plays);
        getchar();  // 清除输入缓冲区的换行符
    }
}

函数中,fgets() 用于读取字符串(避免 scanf 的缓冲区问题),strcspn() 用于去除字符串末尾的换行符,确保数据格式整洁。

排序算法:按播放次数降序排列

排行榜的核心是“排序”——根据播放次数从高到低排列歌曲,C语言中常见的排序算法有冒泡排序、选择排序、快速排序等,考虑到前三名的需求,如果歌曲数量不多(如 MAX_SONGS=100),冒泡排序或选择排序的效率足够;如果数据量较大,可改用快速排序,这里以冒泡排序为例,因其逻辑直观,适合演示。

// 冒泡排序:按播放次数降序排列
void sortSongs() {
    for (int i = 0; i < songCount - 1; i++) {
        for (int j = 0; j < songCount - 1 - i; j++) {
            if (songList[j].plays < songList[j + 1].plays) {
                // 交换两首歌曲的数据
                Song temp = songList[j];
                songList[j] = songList[j + 1];
                songList[j + 1] = temp;
            }
        }
    }
}

冒泡排序通过多次遍历数组,每次将当前未排序部分的最大值“冒泡”到正确位置。songList 数组将按播放次数从高到低排列。

筛选并展示前三名

排序完成后,前三名就是数组的前三个元素(songList[0]songList[1]songList[2]),我们可以编写一个函数 displayTop3(),以格式化的方式展示前三名的信息。

// 展示前三名
void displayTop3() {
    printf("\n=== 歌曲排行榜 TOP 3 ===\n");
    if (songCount == 0) {
        printf("暂无歌曲数据!\n");
        return;
    }
    for (int i = 0; i < 3 && i < songCount; i++) {
        printf("第%d名:\n", i + 1);
        printf("  歌名:%s\n", songList[i].name);
        printf("  歌手:%s\n", songList[i].artist);
        printf("  播放次数:%d\n", songList[i].plays);
        printf("------------------------\n");
    }
}

完整代码与运行示例

将上述函数整合,并在主函数中调用,即可实现完整的歌曲排行榜前三名统计功能,以下是完整代码:

#include <stdio.h>
#include <string.h>
#define MAX_SONGS 100
typedef struct {
    char name[50];
    char artist[30];
    int plays;
} Song;
Song songList[MAX_SONGS];
int songCount = 0;
void inputSongs() {
    printf("请输入歌曲数量(1-%d):", MAX_SONGS);
    scanf("%d", &songCount);
    getchar();
    for (int i = 0; i < songCount; i++) {
        printf("\n第%d首歌曲:\n", i + 1);
        printf("歌名:");
        fgets(songList[i].name, sizeof(songList[i].name), stdin);
        songList[i].name[strcspn(songList[i].name, "\n")] = '\0';
        printf("歌手:");
        fgets(songList[i].artist, sizeof(songList[i].artist), stdin);
        songList[i].artist[strcspn(songList[i].artist, "\n")] = '\0';
        printf("播放次数:");
        scanf("%d", &songList[i].plays);
        getchar();
    }
}
void sortSongs() {
    for (int i = 0; i < songCount - 1; i++) {
        for (
The End

发布于:2026-09-21,除非注明,否则均为歌曲CLUB原创文章,转载请注明出处。