初始提交:添加三个游戏(进制转换、背单词、点歌台管理)

This commit is contained in:
cc 2025-07-24 10:40:36 +08:00
commit 6e62e4477b
23 changed files with 1739 additions and 0 deletions

60
.gitignore vendored Normal file
View File

@ -0,0 +1,60 @@
# ---> C
# Prerequisites
*.d
# Object files
*.o
*.ko
*.obj
*.elf
# Linker output
*.ilk
*.map
*.exp
# Precompiled Headers
*.gch
*.pch
# Libraries
*.lib
*.a
*.la
*.lo
# Shared objects (inc. Windows DLLs)
*.dll
*.so
*.so.*
*.dylib
# Executables
*.exe
*.out
*.app
*.i*86
*.x86_64
*.hex
# Debug files
*.dSYM/
*.su
*.idb
*.pdb
# Kernel Module Compile Results
*.mod*
*.cmd
.tmp_versions/
modules.order
Module.symvers
Mkfile.old
dkms.conf
# CMake
cmake-build-*/
# macOS
.DS_Store

13
CMakeLists.txt Normal file
View File

@ -0,0 +1,13 @@
cmake_minimum_required(VERSION 3.30)
project(simple C)
set(CMAKE_C_STANDARD 11)
add_executable(simple main.c conversion/C1main.c
word/C2main.c
muisc_message/C3main.c
muisc_message/User/C3_User.c
muisc_message/Admin/C3_Admin.c
muisc_message/Shear/C3_shear.c)

BIN
conversion/ASCII码.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

193
conversion/C1main.c Normal file
View File

@ -0,0 +1,193 @@
//
// Created by CC-star on 25-5-6.
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int R,num;//需要得到的进制,输入的整数
char num_16[100]; // 十六进制
int R_choice;//原本进制
// void Pr_Start() {
// int power = 1; // R进制的幂从R^0=1开始
// }
//十进制转2进制
void DectoBin() {
int arr[100],length = 0;
while(num){
arr[length++] = num % 2;
num/=2;
}
printf("对应2进制表示为");
for(int i = length-1;i>=0;i--){
printf("%d",arr[i]);
}
printf("\n");
}
//十进制转R进制
void DectoR() {
switch(R){
//十进制转二进制
case 2:
DectoBin();
break;
//十进制转8进制
case 8:
printf("对应8进制表示为%o\n",num);
break;
case 10:
printf("对应10进制表示为%d\n",num);
break;
//十进制转16进制
case 16:
printf("对应16进制表示为%x\n",num);
break;
default:
printf("输入有误目前只支持2、8、10、16进制间的转换\n");
break;
}
}
//2进制转10进制
void BintoDec() {
int s = 0;
int i = 0;
int power = 1;
while (num > 0) {
s += (num % 10) * power;
power *= 2;
num/=10;
i++;
}
num = s;
DectoR();
}
//8进制转10进制
void OcttoDec() {
int s = 0;
int i = 0;
int power = 1;
while (num > 0) {
s += (num % 10) * power;
power *= 8;
num/=10;
i++;
}
num = s;
DectoR();
}
//16进制转10进制
void HextoDec() {
int s = 0; // 十进制结果
int len = strlen(num_16);
int power = 1;
for(int i = len-1; i >= 0; i--) {
int digit;
if(num_16[i] >= '0' && num_16[i] <= '9') {
digit = num_16[i] - '0';
}
else if(num_16[i] >= 'A' && num_16[i] <= 'F') {
digit = num_16[i] - 'A' + 10;
}
else if(num_16[i] >= 'a' && num_16[i] <= 'f') {
digit = num_16[i] - 'a' + 10;
}
else {
// 既不是数字也不是字母a-f/A-F输入错误
printf("错误:输入的不是有效的%d进制数\n",R_choice);
return ;
}
s = s + digit * power;
power *= 16;
}
num = s;
DectoR();
}
int Input() {
printf("输入你的%d进制数:",R_choice);
scanf("%d",&num);
while (getchar() != '\n');
if(num < 0) {
printf("错误:请输入正数!\n");
return 0;
}
int tmp = num;
int a;
while (tmp > 0) {
a = tmp % 10;
if (a >= R_choice) {
printf("错误:输入的不是有效的%d进制数\n",R_choice);
return 0;
}
tmp /= 10;//去掉个位
}
printf("输入你要得到的R进制:");
scanf("%d",&R);
while (getchar() != '\n');
return 1;
}
int C1main(){
int opt;
while (1) {
printf("---------------------👇进制转换【整数|正数】控制面板👇----------------------\n");
printf("12进制转R\n28进制转R\n");
printf("310进制转R\n416进制转R\n");
printf("0.返回主控制台\n");
printf("-----------------------👆选择对应数字👆------------------------\n");
printf("请输入选择:");
scanf("%d", &opt);
//固定原始数字的进制
if (opt == 1) {
R_choice =2;
}else if(opt == 2) {
R_choice=8;
}else if(opt == 3) {
R_choice=10;
}else if(opt == 4) {
R_choice=16;
}
switch (opt) {
case 1://2进制转R
if(Input() == 1) {
BintoDec();
}
break;
case 2://8进制转R
if(Input() == 1) {
OcttoDec();
}
break;
case 3://10进制转R
if(Input() == 1) {
DectoR();
}
break;
case 4://16进制转R
printf("输入你的16进制数:");
scanf("%s", num_16);
printf("输入你要得到的R进制:");
scanf("%d",&R);
HextoDec();
break;
case 0:
printf("⚠️返回主控制台中...⚠️\n");
return 0;
default:
printf("⚠️输入有误,请重新输入⚠️\n");
break;
}
}
}

38
main.c Normal file
View File

@ -0,0 +1,38 @@
#include <stdio.h>
int C1main();
int C2main();
int C3main();
int main(void) {
while (1) {
printf("\n---------------------👇题目面板👇----------------------\n");
printf("1.进制转换\n");
printf("2.背单词\n");
printf("3.点歌台管理\n");
printf("0.退出程序\n");
printf("-----------------------👆选择对应数字👆------------------------\n");
printf("请输入选择:");
int opt;
scanf("%d", &opt);
while (getchar() != '\n');
switch (opt) {
case 1:
printf("启动进制转换程序...\n");
C1main();
break;
case 2:
printf("启动背单词程序...\n");
C2main();
break;
case 3:
printf("启动点歌台管理程序...\n");
C3main();
break;
case 0:
return 0;
default:
printf("⚠️输入有误,请重新输入⚠️\n");
}
}
}

View File

@ -0,0 +1,468 @@
//
// Created by CC-star on 25-5-9.
// (1) 管理员功能:
//歌曲信息管理: 歌曲信息添加,查询,修改,删除,存盘,浏览等。
//歌曲信息至少包括: 编号,歌手名,歌曲名,歌曲类别等。
#include <stdio.h>
#include <string.h>
#include <dirent.h>
#include "../Shear/C3_shear.h"
extern int songCount;
// 更新歌曲信息功能
void Update_MusicInfo() {
Read_MuiscFile();
if (songCount > 0) {
FILE *fp = fopen(MUSIC_PATH, "w");
if (fp == NULL) {
printf("无法打开文件进行写入:%s\n", MUSIC_PATH);
return;
}
for (int i = 0; i < songCount; i++) {
// 编号-歌手名-歌曲名-歌曲类别
fprintf(fp, "%d-%s-%s-%s\n",
SongList[i].id,
SongList[i].artist,
SongList[i].name,
SongList[i].category);
}
fclose(fp);
printf("歌曲信息更新成功,写入%d首歌\n",songCount);
} else {
printf("未找到任何歌曲,不需要写入文件\n");
}
}
//歌曲修改
void Alter_MusicInfo() {
Read_MuiscFile();
if (songCount > 0) {
FILE *fp = fopen(MUSIC_PATH, "r");
if (fp == NULL) {
printf("无法打开文件进行写入:%s\n", MUSIC_PATH);
return;
}
int opt,a,b;
char c1[100],c2[100];
while (1) {
printf("\n---------------------👇歌曲信息修改依据👇----------------------\n");
printf("1id\n2.歌曲名\n3.歌手名\n4.歌曲类别\n");
printf("0.返回控制台\n");
printf("-----------------------👆选择对应数字👆------------------------\n");
printf("请输入选择:");
scanf("%d", &opt);
while(getchar() != '\n');
switch (opt) {
case 1:
printf("请输入需要修改的id(整数)");
scanf("%d", &a);
while(getchar() != '\n');
// 先显示匹配的歌曲信息
printf("\n---------------------👇匹配的歌曲信息👇----------------------\n");
int found = 0;
for (int i = 0; i < songCount; ++i) {
if (a == SongList[i].id) {
printf("%d-%s-%s-%s\n", SongList[i].id, SongList[i].artist, SongList[i].name, SongList[i].category);
found = 1;
}
}
if (!found) {
printf("未找到ID为%d的歌曲无法进行修改操作\n", a);
break;
}
printf("-----------------------👆歌曲信息👆------------------------\n");
printf("请输入修改后的id(整数)");
scanf("%d", &b);
while(getchar() != '\n');
for (int i = 0; i < songCount; i++) {
if (b == SongList[i].id) {
printf("您输入的修改后的ID%d已存在无法进行修改操作\n", b);
return;
}
}
printf("确认修改ID(1.是0.否)");
int confirm;
scanf("%d", &confirm);
while(getchar() != '\n');
if (!confirm) {
printf("已取消修改操作\n");
break;
}
//开始改
for (int i = 0; i < songCount; ++i) {
if (a == SongList[i].id) {
char old_filename[256], new_filename[256];
sprintf(old_filename, "%s/%d-%s-%s-%s.mp3",
MRES_PATH,
SongList[i].id,
SongList[i].artist,
SongList[i].name,
SongList[i].category);
SongList[i].id = b;
sprintf(new_filename, "%s/%d-%s-%s-%s.mp3",
MRES_PATH,
SongList[i].id,
SongList[i].artist,
SongList[i].name,
SongList[i].category);
if (rename(old_filename, new_filename) == 0) {
printf("歌曲 %s 的ID修改成功文件已重命名\n", SongList[i].name);
} else {
printf("文件重命名失败,请检查文件是否存在\n");
}
fclose(fp);
printf("歌曲信息自动更新中...\n");
Update_MusicInfo();
printf("修改完成,返回控制台\n");
return;
}
}
break;
case 2:
printf("请输入需要修改的歌曲名:");
scanf("%[^\n]", c1);
while(getchar() != '\n');
printf("\n---------------------👇匹配的歌曲信息👇----------------------\n");
found = 0;
for (int i = 0; i < songCount; ++i) {
if (strcmp(c1, SongList[i].name) == 0) {
printf("%d-%s-%s-%s\n", SongList[i].id, SongList[i].artist, SongList[i].name, SongList[i].category);
found = 1;
}
}
if (!found) {
printf("未找到歌曲名为%s的歌曲无法进行修改操作\n", c1);
break;
}
printf("-----------------------👆歌曲信息👆------------------------\n");
printf("请输入修改后的歌曲名:");
scanf("%[^\n]", c2);
while(getchar() != '\n');
for (int i = 0; i < songCount; i++) {
if (strcmp(c2, SongList[i].name) == 0) {
printf("您输入的修改后的歌曲名:%s已存在无法进行修改操作\n", c2);
return;
}
}
printf("确认修改歌曲名?(1.是0.否)");
scanf("%d", &confirm);
while(getchar() != '\n');
if (!confirm) {
printf("已取消修改操作\n");
break;
}
for (int i = 0; i < songCount; ++i) {
if (strcmp(c1, SongList[i].name) == 0) {
char old_filename[256], new_filename[256];
sprintf(old_filename, "%s/%d-%s-%s-%s.mp3",
MRES_PATH,
SongList[i].id,
SongList[i].artist,
SongList[i].name,
SongList[i].category);
strcpy(SongList[i].name, c2);
sprintf(new_filename, "%s/%d-%s-%s-%s.mp3",
MRES_PATH,
SongList[i].id,
SongList[i].artist,
SongList[i].name,
SongList[i].category);
if (rename(old_filename, new_filename) == 0) {
printf("歌曲名修改成功,文件已重命名\n");
} else {
printf("文件重命名失败,请检查文件是否存在\n");
}
fclose(fp);
printf("歌曲信息自动更新中...\n");
Update_MusicInfo();
printf("修改完成,返回控制台\n");
return;
}
}
break;
case 3:
printf("请输入需要修改的歌手名:");
scanf("%[^\n]", c1);
while(getchar() != '\n');
printf("\n---------------------👇匹配的歌曲信息👇----------------------\n");
found = 0;
for (int i = 0; i < songCount; ++i) {
if (strcmp(c1, SongList[i].artist) == 0) {
printf("%d-%s-%s-%s\n", SongList[i].id, SongList[i].artist, SongList[i].name, SongList[i].category);
found = 1;
}
}
if (!found) {
printf("未找到匹配的歌手名,无法进行修改操作\n");
break;
}
printf("-----------------------👆歌曲信息👆------------------------\n");
printf("请输入修改后的歌手名:");
scanf("%[^\n]", c2);
while(getchar() != '\n');
printf("确认修改所有匹配歌曲的歌手名?(1.是0.否)");
scanf("%d", &confirm);
while(getchar() != '\n');
if (!confirm) {
printf("已取消修改操作\n");
break;
}
for (int i = 0; i < songCount; ++i) {
if (strcmp(c1, SongList[i].artist) == 0) {
char old_filename[256], new_filename[256];
sprintf(old_filename, "%s/%d-%s-%s-%s.mp3",
MRES_PATH,
SongList[i].id,
SongList[i].artist,
SongList[i].name,
SongList[i].category);
strcpy(SongList[i].artist, c2);
sprintf(new_filename, "%s/%d-%s-%s-%s.mp3",
MRES_PATH,
SongList[i].id,
SongList[i].artist,
SongList[i].name,
SongList[i].category);
if (rename(old_filename, new_filename) == 0) {
printf("歌曲 %s 的歌手名修改成功,文件已重命名\n", SongList[i].name);
} else {
printf("歌曲 %s 的文件重命名失败,请检查文件是否存在\n", SongList[i].name);
}
}
}
fclose(fp);
printf("歌曲信息自动更新中...\n");
Update_MusicInfo();
printf("修改完成,返回控制台\n");
return;
case 4:
printf("请输入需要修改的歌曲类别:");
scanf("%[^\n]", c1);
while(getchar() != '\n');
printf("\n---------------------👇匹配的歌曲信息👇----------------------\n");
found = 0;
for (int i = 0; i < songCount; ++i) {
if (strcmp(c1, SongList[i].category) == 0) {
printf("%d-%s-%s-%s\n", SongList[i].id, SongList[i].artist, SongList[i].name, SongList[i].category);
found = 1;
}
}
if (!found) {
printf("未找到匹配的歌曲类别,无法进行修改操作\n");
break;
}
printf("-----------------------👆歌曲信息👆------------------------\n");
printf("请输入修改后的歌曲类别:");
scanf("%[^\n]", c2);
while(getchar() != '\n');
printf("确认修改所有匹配歌曲的类别?(1.是0.否)");
scanf("%d", &confirm);
while(getchar() != '\n');
if (!confirm) {
printf("已取消修改操作\n");
break;
}
for (int i = 0; i < songCount; ++i) {
if (strcmp(c1, SongList[i].category) == 0) {
char old_filename[256], new_filename[256];
sprintf(old_filename, "%s/%d-%s-%s-%s.mp3",
MRES_PATH,
SongList[i].id,
SongList[i].artist,
SongList[i].name,
SongList[i].category);
strcpy(SongList[i].category, c2);
sprintf(new_filename, "%s/%d-%s-%s-%s.mp3",
MRES_PATH,
SongList[i].id,
SongList[i].artist,
SongList[i].name,
SongList[i].category);
if (rename(old_filename, new_filename) == 0) {
printf("歌曲 %s 的类别修改成功,文件已重命名\n", SongList[i].name);
} else {
printf("歌曲 %s 的文件重命名失败,请检查文件是否存在\n", SongList[i].name);
}
}
}
fclose(fp);
printf("歌曲信息自动更新中...\n");
Update_MusicInfo();
printf("修改完成,返回控制台\n");
return;
case 0:
printf("⚠️返回控制台中...⚠️\n");
return;
default:
printf("⚠️输入有误,请重新输入⚠️\n");
break;
}
}
} else {
printf("未找到任何歌曲,无法修改文件\n");
}
}
//删除歌曲
void Delete_MusicInfo() {
Read_MuiscFile();
if (songCount <= 0) {
printf("曲库为空,无法执行删除操作\n");
return;
}
FILE *fp = fopen(MUSIC_PATH, "r");
if (fp == NULL) {
printf("无法打开文件进行读取:%s\n", MUSIC_PATH);
return;
}
int a;
printf("请输入需要删除的歌曲的id(整数)");
scanf("%d", &a);
while(getchar() != '\n');
printf("\n---------------------👇匹配的歌曲信息👇----------------------\n");
int found = 0;
int index ; // 删除的歌曲的索引
for (int i = 0; i < songCount; ++i) {
if (a == SongList[i].id) {
printf("%d-%s-%s-%s\n", SongList[i].id, SongList[i].artist, SongList[i].name, SongList[i].category);
found = 1;
index = i;
}
}
if (!found) {
printf("未找到ID为%d的歌曲无法进行删除操作\n", a);
fclose(fp);
return;
}
printf("-----------------------👆歌曲信息👆------------------------\n");
printf("确认删除此歌曲?(1.是0.否)");
int confirm;
scanf("%d", &confirm);
while(getchar() != '\n');
if (!confirm) {
printf("已取消删除操作\n");
fclose(fp);
return;
}
char filename[256];
sprintf(filename, "%s/%d-%s-%s-%s.mp3",
MRES_PATH,
SongList[index].id,
SongList[index].artist,
SongList[index].name,
SongList[index].category);
if (remove(filename) == 0) {
printf("歌曲文件删除成功: %s\n", filename);
} else {
printf("歌曲文件删除失败,请检查文件是否存在\n");
}
for (int i = index; i < songCount - 1; i++) {
SongList[i] = SongList[i + 1];
}
songCount--;
printf("歌曲 %s 已从曲库中删除\n", SongList[index].name);
fclose(fp);
printf("歌曲信息自动更新中...\n");
Update_MusicInfo();
printf("删除操作完成,返回控制台\n");
}
int C3_Admin() {
char password[10];
printf("请输入管理员密码: ");
scanf("%s", password);
if (strcmp(password,"1") == 0) {
while (1) {
printf("\n---------------------👇管理员控制面板👇----------------------\n");
printf("1. 歌曲信息覆盖\n");
printf("2. 歌曲查询\n");
printf("3. 歌曲修改\n");
printf("4. 歌曲删除\n");
printf("5. 歌曲浏览\n");
printf("0.返回控制台\n");
printf("-----------------------👆选择对应数字👆------------------------\n");
printf("请输入选择:");
int opt;
scanf("%d", &opt);
while(getchar() != '\n');
switch (opt) {
case 1://歌曲信息更新
Update_MusicInfo();
break;
case 2://歌曲查询
Song_query();
break;
case 3://歌曲修改
Alter_MusicInfo();
break;
case 4://歌曲删除
Delete_MusicInfo();
break;
case 5://歌曲浏览
BrowseSongs();
break;
case 0:
printf("⚠️返回主控制台中...⚠️\n");
return 0;
default:
printf("⚠️输入有误,请重新输入⚠️\n");
break;
}
}
}
}

65
muisc_message/C3main.c Normal file
View File

@ -0,0 +1,65 @@
//
// Created by CC-star on 25-5-9.
//
#include <stdio.h>
#include "./Shear/C3_shear.h"
int C3_User();
int C3_Admin();
void Update_MusicInfo();
//文件大小
int File_information_size() {
FILE *fp = fopen(MUSIC_PATH, "r");
if (fp == NULL) {
printf("无法打开歌曲列表文件该程序无法正常使用请先创建歌曲列表文件music_list.txt\n");
return 3;
}
fseek(fp, 0, SEEK_END);
long fileSize= ftell(fp);
// rewind(fp);
fclose(fp);
if (fileSize == 0) {
printf("无歌曲信息,自动更新音乐歌单\n");
return 2;
}else {
return 1;
}
}
int C3main() {
int ret = File_information_size();
if (ret== 3) {
return 0;
} else if (ret == 2) {
Update_MusicInfo();
}
while (1) {
printf("\n---------------------👇点歌台管理控制面板👇----------------------\n");
printf("1游客登入\n2管理员登入\n");
printf("0.返回主控制台\n");
printf("-----------------------👆选择对应数字👆------------------------\n");
printf("请输入选择:");
int opt;
scanf("%d", &opt);
while (getchar() != '\n');
switch (opt) {
case 1:
C3_User();
break;
case 2:
C3_Admin();
break;
case 0:
printf("⚠️返回主控制台中...⚠️\n");
return 0;
default:
printf("⚠️输入有误,请重新输入⚠️\n");
break;
}
}
}

View File

@ -0,0 +1,209 @@
//
// Created by CC-star on 25-5-9.
//
#include "C3_shear.h"
#include <dirent.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
extern int songCount;
//读取
void Read_MuiscFile() {
DIR *dir;//文件目录
struct dirent *entry;//文件信息
dir = opendir(MRES_PATH);
if (dir == NULL) {
printf("无法打开歌曲文件目录!\n");
return;
}
songCount = 0;
// 编号-歌手名-歌曲名-歌曲类别.mp3
while ((entry = readdir(dir)) != NULL && songCount < 500) {
char *filename = entry->d_name;
if (strstr(filename, ".mp3") != NULL) {
char fileCopy[200];
strcpy(fileCopy, filename);
//id
char *token = strtok(fileCopy, "-");
if (token != NULL) {
SongList[songCount].id = atoi(token);
// 歌手名
token = strtok(NULL, "-");
if (token != NULL) {
strcpy(SongList[songCount].artist, token);
// 歌曲名
token = strtok(NULL, "-");
if (token != NULL) {
strcpy(SongList[songCount].name, token);
// 歌曲类别
token = strtok(NULL, ".");
if (token != NULL) {
strcpy(SongList[songCount].category, token);
songCount++;
}
}
}
}
}
}
closedir(dir);
int i, j;
struct Song temp;
for (i = 0; i < songCount - 1; i++) {
for (j = 0; j < songCount - i - 1; j++) {
if (SongList[j].id > SongList[j + 1].id) {
temp = SongList[j];
SongList[j] = SongList[j + 1];
SongList[j + 1] = temp;
}
}
}
}
// 歌曲浏览功能
void BrowseSongs() {
FILE *fp = fopen(MUSIC_PATH, "r");
printf("\n---------------------👇歌曲列表👇----------------------\n");
char line[500];
while (fgets(line, sizeof(line), fp) != NULL) {
printf("%s", line);
}
printf("-----------------------👆歌曲列表👆------------------------\n");
fclose(fp);
}
//歌曲查询
void Song_query() {
int i = 0;//某一个歌曲信息
FILE *fp = fopen(MUSIC_PATH, "r");
if (fp == NULL) {
printf("文件打开失败\n");
return;
}
char line[100];
// 编号-歌手名-歌曲名-歌曲类别
while (fgets(line, sizeof(line), fp) != NULL) {
line[strcspn(line, "\n")] = 0;
//ID
char *token = strtok(line, "-");
if (token != NULL) {
SongList[i].id = atoi(token);
//歌手
token = strtok(NULL, "-");
if (token != NULL) {
strcpy(SongList[i].artist, token);
//歌曲
token = strtok(NULL, "-");
if (token != NULL) {
strcpy(SongList[i].name, token);
token = strtok(NULL, "-");
if (token != NULL) {
strcpy(SongList[i].category, token);
i++;
}
}
}
}
}
fclose(fp);
int sum_song = i;
while (1) {
int found = 0;
printf("\n---------------------👇歌曲查询信息类别👇----------------------\n");
printf("1id\n2.歌曲名\n3.歌手名\n4.歌曲类别\n");
printf("0.返回控制台\n");
printf("-----------------------👆选择对应数字👆------------------------\n");
printf("请输入选择:");
int opt,a;
char c[100];
scanf("%d", &opt);
while(getchar() != '\n');
switch (opt) {
case 1:
printf("请输入id");
scanf("%d", &a);
while(getchar() != '\n');
printf("\n---------------------👇您所查询的歌曲信息👇----------------------\n");
for (int i = 0; i < sum_song; ++i) {
if (a == SongList[i].id) {
printf("%d-%s-%s-%s\n", SongList[i].id, SongList[i].artist, SongList[i].name, SongList[i].category);
found = 1;
}
}
if (found == 0) {
printf("⚠️未找到歌曲...⚠️\n");
}
printf("-----------------------👆歌曲信息👆------------------------\n");
break;
case 2:
printf("请输入歌曲名:");
scanf("%[^\n]", c);
while(getchar() != '\n');
printf("\n---------------------👇您所查询的歌曲信息👇----------------------\n");
for (int i = 0; i < sum_song; ++i) {
if (strcmp(c, SongList[i].name) == 0) {
printf("%d-%s-%s-%s\n", SongList[i].id, SongList[i].artist, SongList[i].name, SongList[i].category);
found = 1;
}
}
if (found == 0) {
printf("⚠️未找到歌曲...⚠️\n");
}
printf("-----------------------👆歌曲信息👆------------------------\n");
break;
case 3:
printf("请输入歌手名:");
scanf("%[^\n]", c);
while(getchar() != '\n');
printf("\n---------------------👇您所查询的歌曲信息👇----------------------\n");
for (int i = 0; i < sum_song; ++i) {
if (strcmp(c, SongList[i].artist) == 0) {
printf("%d-%s-%s-%s\n", SongList[i].id, SongList[i].artist, SongList[i].name, SongList[i].category);
found = 1;
}
}
if (found == 0) {
printf("⚠️未找到歌曲...⚠️\n");
}
printf("-----------------------👆歌曲信息👆------------------------\n");
break;
case 4:
printf("请输入歌曲类别:");
scanf("%s", c);
while(getchar() != '\n');
printf("\n---------------------👇您所查询的歌曲信息👇----------------------\n");
for (int i = 0; i < sum_song; ++i) {
if (strcmp(c, SongList[i].category) == 0) {
printf("%d-%s-%s-%s\n", SongList[i].id, SongList[i].artist, SongList[i].name, SongList[i].category);
found = 1;
}
}
if (found == 0) {
printf("⚠️未找到歌曲...⚠️\n");
}
printf("-----------------------👆歌曲信息👆------------------------\n");
break;
case 0:
printf("⚠️返回控制台中...⚠️\n");
return;
default:
printf("⚠️输入有误,请重新输入⚠️\n");
break;
}
}
}

View File

@ -0,0 +1,22 @@
#define C3_SHEAR_H
#define MUSIC_PATH "../muisc_message/Shear/music_list.txt"//歌单信息
#define MRES_PATH "../muisc_message/mres"//歌曲文件夹
struct Song{
int id; // 编号
char name[100]; // 歌曲名
char artist[100]; // 歌手名
char category[50]; // 歌曲类别
} SongList[500];
int songCount; // 歌曲计数器SongList中的歌曲数量
void Read_MuiscFile();//读取
void Song_query();//查询
void BrowseSongs();//游览

View File

@ -0,0 +1,8 @@
1-Justin Bieber-sorry-英文
2-方大同-听-中文
3-林俊杰-江南-中文
5-方大同-听2-中文
6-方大同-听3-中文
7-Justin Bieber-Die for you-英文
8-Justin Bieber-Die for you2-英文
9-Justin Bieber-sorry3-英文

View File

@ -0,0 +1,268 @@
//
// Created by CC-star on 25-5-9.
//
// (2) 用户功能:
//  多种类型的歌曲查询、显示功能:
//  按歌曲名、歌手名、歌曲类别等查询歌曲。
//  点歌功能:用户录入歌曲编号,被点播歌曲按点播顺序放入播放表,每一分钟删除最前面一首歌,表示已经播放完毕。
// 当全部点播歌曲播放完毕,提示"点播歌曲已经播完,请继续点播"。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "../Shear/C3_shear.h"
// 播放队列
typedef struct {
int songIds[100]; // 歌曲ID
int count; // 歌曲数量
} PlayQueue;
// PlayQueue playQueue = {.count = 0}; // 指定count = 0
PlayQueue playQueue = {0};
// int i;//找到的歌曲索引
// 显示当前播放队列
void ShowPlayQueue() {
printf("\n---------------------👇当前播放队列👇----------------------\n");
if (playQueue.count == 0) {
printf("播放队列为空\n");
} else {
for (int i = 0; i < playQueue.count; i++) {
for (int j = 0; j < songCount; j++) {
if (SongList[j].id == playQueue.songIds[i]) {
printf("%d. %s - %s\n", i + 1, SongList[j].artist, SongList[j].name);
break;
}
}
}
}
printf("-----------------------👆播放队列👆------------------------\n");
}
// 移除队列中的第一首歌
void RemoveFirstSong() {
if (playQueue.count > 0) {
for (int i = 0; i < playQueue.count - 1; i++) {
playQueue.songIds[i] = playQueue.songIds[i + 1];
}
playQueue.count--;
}
}
void PlayMusic(int songId) {
char command[256];
char filename[256];
int found = 0;
for (int i = 0; i < songCount; i++) {
if (SongList[i].id == songId) {
sprintf(filename, "%d-%s-%s-%s.mp3",
SongList[i].id,
SongList[i].artist,
SongList[i].name,
SongList[i].category);
//afplay "/Users/music/song.mp3" &
sprintf(command, "afplay \"%s/%s\" & -t 10", MRES_PATH, filename);
system(command);
printf("正在播放: %s - %s\n", SongList[i].artist, SongList[i].name);
found = 1;
break;
}
}
if (!found) {
printf("未找到ID为 %d 的歌曲,无法播放\n", songId);
}
ShowPlayQueue();
}
// 播放控制
void ControlPlayback(int control) {
switch (control) {
case 0: // 停止播放
system("pkill afplay");
printf("播放已停止\n");
break;
case 1: // 暂停播放
system("pkill -STOP afplay");
printf("播放已暂停\n");
break;
case 2://继续播放
system("pkill -CONT afplay");
printf("继续播放\n");
break;
case 3: // 下一首
system("pkill afplay");
if (playQueue.count > 0) {
RemoveFirstSong();
if (playQueue.count > 0) {
PlayMusic(playQueue.songIds[0]);
}else {
printf("播放歌单已播放完毕,请添加歌曲");
}
}
break;
default:
printf("⚠️输入有误,请重新输入⚠️\n");
break;
}
}
int IsSongFinished() {
FILE *fp = popen("ps aux | grep afplay | grep -v grep", "r");
if (fp == NULL) {
return 0;
}
char line[256];
int isPlaying = 0;
while (fgets(line, sizeof(line), fp)) {
if (strstr(line, "afplay") != NULL) {
isPlaying = 1;
break;
}
}
pclose(fp);
return isPlaying;
}
// 自动播放
void AutoPlayNext() {
if (playQueue.count > 0) {
if (IsSongFinished() == 0) {
RemoveFirstSong();
if (playQueue.count > 0) {
printf("播放完毕,自动切换下一首中。。。\n");
PlayMusic(playQueue.songIds[0]);
} else {
printf("播放队列已空,请继续点歌\n");
}
}
}
}
int hasInput() {
int result;
struct timeval tv = {0, 0};
fd_set fds;
FD_ZERO(&fds);
FD_SET(STDIN_FILENO, &fds);
result = select(STDIN_FILENO + 1, &fds, NULL, NULL, &tv) > 0;
return result;
}
//开始点歌
void Start_Muisc() {
Read_MuiscFile();
if (songCount > 0) {
int shown = 0;
while (1) {
AutoPlayNext();
if (!hasInput()) {
if (!shown) {
printf("\n==================================================\n 按回车键继续...\n");
shown = 1;
}
usleep(100000);//0.1秒
continue;
}
shown = 0;
printf("\n---------------------👇点歌控制面板👇----------------------\n");
printf("1. 添加歌曲到播放队列\n");
printf("2. 显示当前播放队列\n");
printf("3. 控制播放(0.停止1.暂停2.继续3.下一首):\n");
printf("0. 返回主菜单\n");
printf("-----------------------👆选择对应数字👆------------------------\n");
printf("请输入选择:");
int choice;
scanf("%d", &choice);
while (getchar() != '\n');
switch (choice) {
case 1: {
printf("请输入要播放的歌曲id: \n");
int songId;//需要播放的歌曲id
scanf("%d", &songId);
while (getchar() != '\n');
int found = 0;
for (int i = 0; i < songCount; ++i) {
if (songId == SongList[i].id) {
printf("歌曲【%d-%s-%s-%s】已添加到播放队列\n", SongList[i].id, SongList[i].artist, SongList[i].name, SongList[i].category);
if (playQueue.count < 100) {
// songId = songId - 1;
playQueue.songIds[playQueue.count] = songId;
playQueue.count++;
if (playQueue.count == 1) {
PlayMusic(songId);
}
} else {
printf("播放队列已满,无法添加更多歌曲\n");
break;
}
found = 1;
break;
}
}
if (!found) {
printf("未找到ID为 %d 的歌曲\n", songId);
}
// ShowPlayQueue();
break;
}
case 2:
ShowPlayQueue();
break;
case 3: {
int control;
printf("请输入控制命令 (0.停止1.暂停2.继续3.下一首): ");
scanf("%d", &control);
while (getchar() != '\n');
ControlPlayback(control);
break;
}
case 0:
printf("⚠️停止音乐中...⚠️\n");
system("pkill afplay");
printf("⚠️音乐已停止,返回控制台中...⚠️\n");
return;
default:
printf("无效的选择,请重新输入\n");
}
}
} else {
printf("⚠️找不到歌曲...⚠️\n");
}
}
int C3_User() {
while (1) {
printf("\n---------------------👇用户控制面板👇----------------------\n");
printf("1. 歌曲查询\n");
printf("2. 歌曲游览\n");
printf("3. 开始点歌\n");
printf("0.返回控制台\n");
printf("-----------------------👆选择对应数字👆------------------------\n");
printf("请输入选择:");
int opt;
scanf("%d", &opt);
while (getchar() != '\n');
switch (opt) {
case 1:
Song_query();
break;
case 2:
BrowseSongs();
break;
case 3:
Start_Muisc();
break;
case 0:
printf("⚠️返回主控制台中...⚠️\n");
return 0;
default:
printf("⚠️输入有误,请重新输入⚠️\n");
break;
}
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

13
muisc_message/题目.txt Normal file
View File

@ -0,0 +1,13 @@
设计并实现一个点歌台管理的C语言程序。3级
【功能要求】
(1) 管理员功能:
歌曲信息管理:歌曲信息添加,查询,修改,删除,存盘,浏览等。
歌曲信息至少包括: 编号,歌曲名,歌手名,歌曲类别等。
(2) 用户功能:
 多种类型的歌曲查询、显示功能:
 按歌曲名、歌手名、歌曲类别等查询歌曲。
 点歌功能:用户录入歌曲编号,被点播歌曲按点播顺序放入播放表,
当全部点播歌曲播放完毕,提示“点播歌曲已经播完,请继续点播”。
(3) 设计提示:
管理员通过密码登录,进行歌曲的管理。
普通用户无需登录,能进行浏览、查询和点歌 操作。歌曲播放及删除,可设计定时器来完成。

163
word/C2main.c Normal file
View File

@ -0,0 +1,163 @@
//
// Created by CC-star on 25-5-6.
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define Words_File "../word/words.txt"
struct Words {
char English[50];
char Chinese[100];
// int ReciteIndex;//单词背诵次数【背诵正确+1错误-1】
} wordsList[500];
int wordsCount,SumRightCount = 0,SumLearnCount = 0;
int usedWords[500] = {0};
// 读取
int readWordsFromFile() {
FILE* file = fopen( Words_File, "r");
if (file == NULL) {
printf("\n⚠️无法打开单词库文件:%s⚠\n", Words_File);
return 0;
}else {
// 单词数
wordsCount = 0;
char line[100];
while (fgets(line, sizeof(line), file) != NULL ) {
sscanf(line, "%s %s",wordsList[wordsCount].English, wordsList[wordsCount].Chinese);
wordsCount++;
}
}
fclose(file);
if (wordsCount == 0) {
printf("\n\t⚠️单词库没有信息⚠️\n");
return 0;
}else {
return 1;
}
}
// 显示所有单词
void showAllWords() {
//readWordsFromFile();
printf("\n---------------------👇单词列表👇----------------------\n");
for (int i = 0; i < wordsCount; i++) {
printf("%d. %s - %s\n", i + 1, wordsList[i].English, wordsList[i].Chinese);
}
printf("-----------------------👆共计单词数:%d👆------------------------\n",wordsCount);
}
// 背单词功能
void startLearning() {
//readWordsFromFile();
int LearnCount,ret;//本次背诵数量
char ming[100];
int RightCount = 0;//正确数量单词
while (1){
printf("\n---------------------👇背单词区域👇----------------------\n");
printf("请输入要背诵的单词数量(不超过%d: ", wordsCount);
ret = scanf("%d", &LearnCount);
while(getchar() != '\n');
if (ret != 1 || LearnCount < 1 || LearnCount > wordsCount) {
do {
printf("输入无效请输入1到%d之间的数字\n", wordsCount);
ret = scanf("%d", &LearnCount);
while(getchar() != '\n');
}while (ret != 1 || LearnCount < 1 || LearnCount > wordsCount);
}
// printf("本次需要背诵:%d", LearnCount);
for (int i = 0; i < LearnCount; i++) {
int randomIndex;
do {
randomIndex = rand() % wordsCount;
} while (usedWords[randomIndex] == 1);
usedWords[randomIndex] = 1;
printf("单词:%s\n",wordsList[randomIndex].Chinese);
printf("请输入对应英文(不要有空格)\n");
scanf("%s", ming);
while (getchar() != '\n');
if (strcmp(wordsList[randomIndex].English, ming) == 0) {
RightCount++;
} else {
printf("错误,对应正确英文是:%s\n",wordsList[randomIndex].English);
}
}
printf("-----------------------👆背单词区域👆------------------------\n");
printf("\n---------------------👇单次成绩区域👇----------------------\n");
//总结提示
if (RightCount == LearnCount) {
printf("\t太棒啦,全部正确!!本次背了%d个单词分数为%d\n",LearnCount,RightCount);
}else if (RightCount > (LearnCount/2)){
printf("\t不错哦!!本次背了%d个单词分数为%d\n",LearnCount,RightCount);
}else {
printf("\t很遗憾😪,本次背了%d个单词只正确了%d个\n",LearnCount,RightCount);
}
printf("-----------------------👆单次成绩区域👆------------------------\n");
SumLearnCount += LearnCount;
SumRightCount += RightCount;
RightCount = 0;
char continueLearning;
while (1) {
printf("是否继续(Y/N)?\n");
scanf(" %c", &continueLearning);
if (continueLearning == 'Y' || continueLearning == 'y') {
break;
} else if (continueLearning == 'N' || continueLearning == 'n') {
printf("\n---------------------👇总成绩区域👇----------------------\n");
printf("\t本次共计背了%d个单词总正确数为%d\n", SumLearnCount, SumRightCount);
printf("-----------------------👆总成绩区域👆------------------------\n");
SumRightCount = 0;
SumLearnCount = 0;
return;
} else {
printf("输入有误,请重新输入\n");
}
}
}
}
int C2main() {
srand(time(NULL));
if (readWordsFromFile() == 1){
while (1) {
printf("\n---------------------👇背单词控制面板👇----------------------\n");
printf("1开始背单词\n2查看所有单词\n");
printf("0.返回主控制台\n");
printf("-----------------------👆选择对应数字👆------------------------\n");
printf("请输入选择:");
int opt;
scanf("%d", &opt);
while (getchar() != '\n');
switch (opt) {
case 1:
startLearning();
break;
case 2:
showAllWords();
break;
case 0:
printf("⚠️返回主控制台中...⚠️\n");
return 0;
default:
printf("⚠️输入有误,请重新输入⚠️\n");
break;
}
}
}else {
printf("⚠️背单词程序无法运作,已退出⚠️\n");
}
}

219
word/words.txt Normal file
View File

@ -0,0 +1,219 @@
friend 朋友
family 家庭
love 爱
happiness 幸福
laughter 笑声
smile 微笑
sunshine 阳光
rain 雨
wind 风
cloud 云
mountain 山
river 河
lake 湖
ocean 海洋
sky 天空
earth 地球
forest 森林
grass 草
sand 沙子
stone 石头
path 路径
road 路
bridge 桥
house 房子
tree 树
flower 花
bird 鸟
butterfly 蝴蝶
insect 昆虫
fish 鱼
animal 动物
zoo 动物园
garden 花园
park 公园
city 城市
country 乡村
beach 海滩
mountain 山脉
valley 谷
sunrise 日出
sunset 日落
night 夜晚
morning 早晨
afternoon 下午
evening 傍晚
season 季节
spring 春天
summer 夏天
autumn 秋天
winter 冬天
weather 天气
snow 雪
ice 冰
heat 热
cold 冷
windy 有风的
rainy 下雨的
cloudy 多云的
sunny 晴朗的
birthday 生日
holiday 假日
Christmas 圣诞节
New Year 新年
party 派对
music 音乐
song 歌曲
dance 舞蹈
art 艺术
painting 绘画
sculpture 雕塑
poem 诗歌
book 书
story 故事
movie 电影
game 游戏
play 玩
sport 运动
football 足球
basketball 篮球
tennis 网球
swimming 游泳
running 跑步
walking 走路
eating 吃
drinking 喝
cooking 烹饪
baking 烘焙
reading 阅读
writing 写作
drawing 画画
painting 绘画
listening 听
watching 看
talking 说话
laughing 笑
crying 哭
feeling 感觉
thinking 思考
dreaming 梦想
wishing 希望
trying 尝试
learning 学习
working 工作
playing 玩耍
traveling 旅行
exploring 探索
discovering 发现
creating 创造
building 建造
fixing 修理
cleaning 清洁
organizing 组织
decorating 装饰
planting 种植
harvesting 收获
selling 卖
buying 买
giving 给
sharing 分享
helping 帮助
loving 爱
caring 关心
teaching 教学
understanding 理解
remembering 记忆
forgetting 忘记
knowing 知道
believing 相信
trusting 信任
respecting 尊重
honoring 敬重
apologizing 道歉
forgiving 原谅
meeting 见面
greeting 问候
saying 说
listening 倾听
hearing 听见
seeing 看见
looking 看
finding 找到
searching 搜索
seeking 寻找
waiting 等待
hurrying 匆忙
slowing 放慢
stopping 停止
starting 开始
continuing 继续
finishing 完成
succeeding 成功
failing 失败
winning 获胜
losing 失败
competing 竞争
cooperating 合作
leading 领导
following 跟随
guiding 指导
directing 指挥
ordering 命令
obeying 服从
resisting 抵抗
fighting 战斗
defending 防御
attacking 攻击
protecting 保护
saving 拯救
rescuing 救援
hurting 伤害
healing 治愈
recovering 恢复
growing 成长
developing 发展
improving 改进
worsening 恶化
changing 改变
remaining 保持
staying 停留
leaving 离开
returning 返回
arriving 到达
departing 离开
entering 进入
exiting 退出
opening 打开
closing 关闭
breaking 打破
fixing 修复
building 建设
destroying 摧毁
making 制作
designing 设计
planning 计划
achieving 实现
fulfilling 实现
disappointing 令人失望
surprising 惊喜
shocking 震惊
confusing 混乱
understanding 了解
explaining 解释
describing 描述
telling 告诉
asking 询问
answering 回答
questioning 质疑
doubting 怀疑
deciding 决定
choosing 选择
rejecting 拒绝
accepting 接受
agreeing 同意
disagreeing 不同意
arguing 争论
debating 辩论
negotiating 谈判
compromising 妥协
solving 解决