关于#c语言#的问题,请各位专家解答!

根据图片要求 要源代码 数据结构 数据结构要用 C语言 C语言 数据结构

img

参考如下:

// 编译该范例前,请把 music.mp3 放在项目文件夹中
// 把 music.mp3 和编译的 exe 放在一起
// 编译环境:VC6~VC2019 + EasyX_20210115
//
#include <graphics.h>
#include <conio.h>
#include<string.h>
// 引用 Windows Multimedia API
#pragma comment(lib, "Winmm.lib")
  
void ZT();       // 暂停
void BF1();      // 播放1
void BF2();      // 播放2
void BF3();      // 播放3
void menu();    // 总得
void locate(int a, int b, int c, int d, int e, LPCTSTR text);
void locate(int a, int b, int c, int d, int e, LPCTSTR text, COLORREF color);
int Return();
  
int main()
{
  initgraph(640, 480);
  
  while (1)
  {
    int A=Return();    // 鼠标选择;
    switch (A)
    {
    case 0:ZT();break;
    case 1:BF1();break;
    case 2:BF2();break;
    case 3:BF3();break;
    }
  }
  closegraph();
  return 0;
}
  
void ZT()      // 暂停
{
  mciSendString(_T("stop mymusic"), NULL, 0, NULL);
  mciSendString(_T("close mymusic"), NULL, 0, NULL);
}
void BF1()      // 播放1
{
  mciSendString(_T("open 1.mp3 alias mymusic"), NULL, 0, NULL);
  // 播放音乐
  mciSendString(_T("play mymusic"), NULL, 0, NULL);
}
void BF2()      // 播放2
{
  mciSendString(_T("open 2.mp3 alias mymusic"), NULL, 0, NULL);
  // 播放音乐
  mciSendString(_T("play mymusic"), NULL, 0, NULL);
}
void BF3()      // 播放3
{
  mciSendString(_T("open 1.mp3 alias mymusic"), NULL, 0, NULL);
  // 播放音乐
  mciSendString(_T("play mymusic"), NULL, 0, NULL);
}
  
int Return()
{
  menu();
  MOUSEMSG m1;
  //BeginBatchDraw();
  while (1)
  {
    m1 = GetMouseMsg();
    switch (m1.uMsg)
    {
    case WM_MOUSEMOVE:
      menu();
      if (m1.x >= 220 && m1.x <= 420 && m1.y >= 100 && m1.y <= 130)
      {
        menu();
        locate(220, 100, 420, 130, 30, _T("暂停/结束"), RED);
        break;
      }
  
      if (m1.x >= 220 && m1.x <= 420 && m1.y >= 130 && m1.y <= 160)
      {
        menu();
        locate(220, 130, 420, 160, 30, _T("播放音乐1"), RED);
        break;
      }
  
      if (m1.x >= 220 && m1.x <= 420 && m1.y >= 160 && m1.y <= 190)
      {
        menu();
        locate(220, 160, 420, 190, 30, _T("播放音乐2"), RED);
      }
      if (m1.x >= 220 && m1.x <= 420 && m1.y >= 190 && m1.y <= 220)
      {
        menu();
        locate(220, 190, 420, 220, 30, _T("播放音乐3"), RED);
      }
       
    }
  
    if (m1.x >= 220 && m1.x <= 420 && m1.y >= 100 && m1.y <= 130)
    {
      locate(220, 100, 420, 130, 30, _T("暂停/结束"), RED);
      if (m1.uMsg == WM_LBUTTONDOWN)
      {
        return 0;
      }
    }
  
    if (m1.x >= 220 && m1.x <= 420 && m1.y >= 130 && m1.y <= 160)
    {
      if (m1.uMsg == WM_LBUTTONDOWN)
      {
        return 1;      // 
      }
    }
    if (m1.x >= 220 && m1.x <= 420 && m1.y >= 160 && m1.y <= 190)
    {
      if (m1.uMsg == WM_LBUTTONDOWN)
      {
        return 2;
      }
    }
    if (m1.x >= 220 && m1.x <= 420 && m1.y >= 190 && m1.y <= 220)
    {
      if (m1.uMsg == WM_LBUTTONDOWN)
      {
        return 3;
      }
    }
  }
  
}
  
void locate(int a, int b, int c, int d, int e, LPCTSTR text, COLORREF color)
{
  HCURSOR hcur = LoadCursor(NULL, IDC_CROSS);      // 加载系统预置的鼠标样式
  HWND hwnd = GetHWnd();                // 获取绘图窗口句柄
  SetClassLongPtr(hwnd, GCLP_HCURSOR, (long)hcur);  // 设置窗口类的鼠标样式
  setlinecolor(color);
  roundrect(a, b, c, d, e, e);
  settextcolor(color);
  settextstyle(20, 0, _T("黑体"));
  setbkmode(TRANSPARENT);
  char arr[50] = "按钮";
  RECT r = { a, b, c, d };
  drawtext(text, &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
  
void locate(int a, int b, int c, int d, int e, LPCTSTR text)
{
  setlinecolor(WHITE);
  roundrect(a, b, c, d, e, e);
  settextcolor(YELLOW);
  settextstyle(20, 0, _T("黑体"));
  setbkmode(TRANSPARENT);
  char arr[50] = "按钮";
  RECT r = { a, b, c, d };
  drawtext(text, &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
void menu()
{
  HCURSOR hcur = LoadCursor(NULL, IDC_ARROW);      // 加载系统预置的鼠标样式
  HWND hwnd = GetHWnd();                // 获取绘图窗口句柄
  SetClassLongPtr(hwnd, GCLP_HCURSOR, (long)hcur);  // 设置窗口类的鼠标样式
  locate(220, 100, 420, 130, 30, _T("暂停/结束"));
  locate(220, 130, 420, 160, 30, _T("播放音乐1"));
  locate(220, 160, 420, 190, 30, _T("播放音乐2"));
  locate(220, 190, 420, 220, 30, _T("播放音乐3"));
}
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7542887
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:系列一:(选择结构与循环结构)含答案解析 C语言经典编程题 期末复习笔记
  • 你还可以看下c语言参考手册中的 c语言-求值顺序与定序
  • 除此之外, 这篇博客: 万字小长文 初识C语言 C语言基础知识点总结 建议直接收藏 期末复习的法宝中的 结构体的初始化: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 您还可以看一下 朱有鹏老师的C语言复杂表达式与指针应用视频精讲-C语言专题第4部分课程中的 4.4.4.函数指针实战2小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    对于你提出的问题,我无法给出一个具体的解决方案,因为你提到的要求的数据结构和图片要求都没有具体描述。但是,我可以给你提供一些关于实现特定数据结构的一般步骤和常用方法:

    1. 首先,你需要明确要实现的数据结构的功能和特点,以及它的相关操作。

    2. 根据数据结构的特点,选择适合的数据类型和数据结构来实现它。例如,如果需要实现链表,可以使用结构体和指针来表示链表节点和节点之间的关系。

    3. 根据数据结构的要求,编写相应的操作函数,例如插入、删除、查找等。

    4. 确保你的代码逻辑正确,并进行测试。可以使用一些已知的测试用例来验证你的实现是否正确,也可以编写一些简单的测试函数来检查结果。

    5. 如果你在实现过程中遇到问题,可以参考一些相关的资料和教程,或者向其他的开发者寻求帮助。

    希望以上的指导可以帮助你实现你所需的特定数据结构。如果你有具体的要求和问题描述,我可以提供更具体的帮助和代码示例。

供参考:

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

//定义栈结点
typedef struct stackNode {
    char song[20]; //歌曲名
    struct stackNode *next; //指向下一个结点
} StackNode;

//定义栈
typedef struct stack {
    StackNode *top; //栈顶指针
    int size; //栈的大小
} Stack;

//定义队列结点
typedef struct queueNode {
    char song[20]; //歌曲名
    struct queueNode *next; //指向下一个结点
} QueueNode;

//定义队列
typedef struct queue {
    QueueNode *front; //队头指针
    QueueNode *rear; //队尾指针
    int size; //队列的大小
} Queue;

//初始化栈
void initStack(Stack *s) {
    s->top = NULL; //栈顶为空
    s->size = 0; //栈的大小为0
}

//判断栈是否为空
int isEmptyStack(Stack *s) {
    return s->top == NULL; //如果栈顶为空,返回1,否则返回0
}

//判断栈是否已满
int isFullStack(Stack *s, int max) {
    return s->size == max; //如果栈的大小等于最大长度,返回1,否则返回0
}

//入栈操作
void push(Stack *s, char *song) {
    StackNode *newNode = (StackNode *)malloc(sizeof(StackNode)); //创建一个新结点
    strcpy(newNode->song, song); //复制歌曲名到新结点
    newNode->next = s->top; //新结点的下一个指向原来的栈顶
    s->top = newNode; //更新栈顶为新结点
    s->size++; //更新栈的大小加1
}

//出栈操作
char *pop(Stack *s) {
    if (isEmptyStack(s)) { //如果栈为空,返回NULL
        return NULL;
    }
    StackNode *temp = s->top; //保存原来的栈顶结点
    char *song = (char *)malloc(20); //创建一个字符串存储歌曲名
    strcpy(song, temp->song); //复制歌曲名到字符串中
    s->top = temp->next; //更新栈顶为原来的下一个结点
    free(temp); //释放原来的栈顶结点
    s->size--; //更新栈的大小减1
    return song; //返回歌曲名字符串
}

//初始化队列
void initQueue(Queue *q) {
    q->front = NULL; //队头为空
    q->rear = NULL; //队尾为空
    q->size = 0; //队列的大小为0
}

//判断队列是否为空
int isEmptyQueue(Queue *q) {
    return q->front == NULL; //如果队头为空,返回1,否则返回0
}

//入队操作
void enqueue(Queue *q, char *song) {
    QueueNode *newNode = (QueueNode *)malloc(sizeof(QueueNode)); //创建一个新结点
    strcpy(newNode->song, song); //复制歌曲名到新结点
    newNode->next = NULL; //新结点的下一个为空
    if (isEmptyQueue(q)) { //如果队列为空,更新队头和队尾为新结点
        q->front = newNode;
        q->rear = newNode;
    } else { //否则,更新队尾的下一个为新结点,更新队尾为新结点
        q->rear->next = newNode;
        q->rear = newNode;
    }
    q->size++; //更新队列的大小加1
}

//出队操作
char *dequeue(Queue *q) {
    if (isEmptyQueue(q)) { //如果队列为空,返回NULL
        return NULL;
    }
    QueueNode *temp = q->front; //保存原来的队头结点
    char *song = (char *)malloc(20); //创建一个字符串存储歌曲名
    strcpy(song, temp->song); //复制歌曲名到字符串中
    q->front = temp->next; //更新队头为原来的下一个结点
    if (q->front == NULL) { //如果队头为空,更新队尾为空
        q->rear = NULL;
    }
    free(temp); //释放原来的队头结点
    q->size--; //更新队列的大小减1
    return song; //返回歌曲名字符串
}

//打印栈中的歌曲
void printStack(Stack *s) {
    StackNode *p = s->top; //从栈顶开始遍历
    while (p != NULL) { //如果不为空,打印歌曲名,移动到下一个结点
        printf("%s\n", p->song);
        p = p->next;
    }
}

//打印队列中的歌曲
void printQueue(Queue *q) {
    QueueNode *p = q->front; //从队头开始遍历
    while (p != NULL) { //如果不为空,打印歌曲名,移动到下一个结点
        printf("%s\n", p->song);
        p = p->next;
    }
}

//主函数
int main() {
    Stack s; //创建一个栈存储待播歌曲
    Queue q; //创建一个队列存储已播歌曲
    int total = 0; //记录歌曲的总数
    int max = 20; //记录栈的最大长度,默认为20

    initStack(&s); //初始化栈
    initQueue(&q); //初始化队列

    int choice; //记录用户的选择

    do {
        printf("欢迎使用音乐播放器!\n");
        printf("请选择你要执行的操作:\n");
        printf("1. 更新长度\n");
        printf("2. 添加歌曲\n");
        printf("3. 播放歌曲\n");
        printf("4. 退出\n");
        scanf("%d", &choice); //读取用户的选择

        switch (choice) {
            case 1: { //更新长度操作
                printf("请输入你想要设置的最大长度:\n");
                char input[20]; //创建一个字符串存储用户的输入
                scanf("%s", input); //读取用户的输入

                int flag = 1; //记录输入是否合法,1表示合法,0表示不合法

                for (int i = 0; i < strlen(input); i++) { //遍历输入的字符串,判断是否都是数字字符
                    if (input[i] < '0' || input[i] > '9') { //如果不是数字字符,设置flag为0,跳出循环
                        flag = 0;
                        break;
                    }
                }

                if (flag == 0) { //如果输入不合法,提示错误信息,并设置最大长度为默认值20
                    printf("输入错误!最大长度只能为数字!\n");
                    max = 20;
                    printf("已将最大长度设置为默认值20。\n");
                } else { //如果输入合法,将字符串转换为整数,并设置最大长度为该值
                    max = atoi(input);
                    printf("已将最大长度设置为%d。\n", max);
                }

                break;
            }
            case 2: { //添加歌曲操作
                if (isFullStack(&s, max)) { //

其中栈的实现使用动态数组,以下是使用C语言实现播放器的完整的源代码:

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

#define MAX_LEN 20  // 默认最大长度

typedef struct {
    int* data;  // 数据指针,指向动态数组
    int top;  // 栈顶指针,指向栈顶元素的下标
    int max_len;  // 最大长度
} Stack;

// 初始化栈
void init_stack(Stack* stack, int max_len) {
    stack->data = (int*)malloc(sizeof(int) * max_len);  // 动态分配数组内存
    stack->top = -1;  // 初始栈顶指针为-1,表示栈为空
    stack->max_len = max_len;  // 设置最大长度
}

// 判断栈是否为空
int is_empty(Stack* stack) {
    return stack->top == -1;  // 栈顶指针为-1时表示栈为空
}

// 判断栈是否已满
int is_full(Stack* stack) {
    return stack->top == stack->max_len - 1;  // 栈顶指针等于最大下标时表示栈已满
}

// 元素入栈
void push(Stack* stack, int value) {
    if (is_full(stack)) {  // 如果栈已满,则无法入栈
        printf("Stack is full.\n");
        return;
    }
    stack->top++;  // 栈顶指针加1
    stack->data[stack->top] = value;  // 将元素放入栈顶位置
}

// 元素出栈
int pop(Stack* stack) {
    if (is_empty(stack)) {  // 如果栈为空,则无法出栈
        printf("Stack is empty.\n");
        return -1;  // 返回-1表示出栈失败
    }
    int value = stack->data[stack->top];  // 取出栈顶元素
    stack->top--;  // 栈顶指针减1
    return value;  // 返回出栈元素
}

int main() {
    Stack stack;
    int max_len = MAX_LEN;
    init_stack(&stack, max_len);  // 初始化栈

    char input[100];
    int song_num = 0;
    printf("请输入歌曲总数(不超过%d):", max_len);
    fgets(input, sizeof(input), stdin);  // 读取用户输入
    if (isdigit(input[0])) {  // 如果输入的是数字
        song_num = atoi(input);  // 将字符串转换为数字
        if (song_num > max_len) {  // 如果输入的数字超过最大长度,则使用最大长度
            song_num = max_len;
        }
    } else {
        printf("输入错误,使用默认长度%d。\n", max_len);
        song_num = max_len;
    }

    int option;
    while (1) {
        printf("\n请选择操作:\n");
        printf("1. 添加歌曲\n");
        printf("2. 播放歌曲\n");
        printf("3. 退出\n");
        printf("请选择(1-3):");
        fgets(input, sizeof(input), stdin);  // 读取用户输入
        if (isdigit(input[0])) {  // 如果输入的是数字
            option = atoi(input);  // 将字符串转换为数字
            if (option < 1 || option > 3) {  // 如果输入的数字不在1-3之间,则重新输入
                printf("输入错误,请重新选择。\n");
                continue;
            }
        } else {
            printf("输入错误,请重新选择。\n");
            continue;
        }

        if (option == 1) {  // 添加歌曲
            if (stack.top == song_num - 1) {  // 如果栈已满,则无法入栈
                printf("待播歌曲列表已满,无法添加歌曲。\n");
                continue;
            }
            int song_id = stack.top + 2;  // 新加的歌曲编号为栈顶编号+2
            printf("请输入第%d首歌曲的ID:", song_id);
            fgets(input, sizeof(input), stdin);  // 读取用户输入
            if (isdigit(input[0])) { // 如果输入的是数字
                int song = atoi(input);  // 将字符串转换为数字
                push(&stack, song);  // 入栈
                printf("已添加歌曲ID:%d\n", song);
                printf("待播歌曲列表:");
                for (int i = stack.top; i >= 0; i--) {  // 输出待播歌曲列表
                    printf("%d ", stack.data[i]);
                }
                printf("\n");
            } else {
                printf("输入错误,请输入数字。\n");
            }
        } else if (option == 2) {  // 播放歌曲
            if (is_empty(&stack)) {  // 如果栈为空,则无法出栈
                printf("待播歌曲列表为空,无法播放歌曲。\n");
                continue;
            }
            int song = pop(&stack);  // 出栈
            printf("已播放歌曲ID:%d\n", song);
            printf("已播放歌曲列表:");
            // 输出已播放歌曲列表
            for (int i = stack.top; i >= 0; i--) {
                printf("%d ", stack.data[i]);
            }
            printf("\n");
        } else {  // 退出
            break;
        }
    }

    free(stack.data);  // 释放动态数组内存
    return 0;
}

该代码实现了播放器的基本功能,包括添加歌曲、播放歌曲、退出等操作。在添加歌曲时,新加的歌曲会放在栈顶位置,即最先播放;在播放歌曲时,从栈顶取出最后加入的歌曲进行播放。同时,根据用户输入的歌曲总数,限制了待播歌曲列表的最大长度。

参考 https://blog.csdn.net/qq_52948564/article/details/130462036

有现成的,可以看看
C语言实现简易音乐播放器

c语言实现音乐播放器的教程,网上不少啊,多找下啊。你可以做成带界面式的,也可以做成不带界面式的,命令行的方式。
我帮你找一些现成的资料来,代码拿来修改下即可吧:
C语言精品案例-音乐播放器与状态机:https://zhuanlan.zhihu.com/p/588905101
C语言实现音乐播放器 :https://blog.csdn.net/m0_63536277/article/details/125902157

可以去git上下载现成的改改,从零开始写的话,工作量很大