用C语言实现歌曲排行榜,前三名的统计与展示
在数字音乐时代,歌曲排行榜一直是衡量作品热度的重要指标,无论是音乐平台的热歌榜,还是校园广播的每周推荐,排行榜都以直观的方式呈现最受欢迎的歌曲,如果我们用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 ( 发布于:2026-09-21,除非注明,否则均为原创文章,转载请注明出处。
