【C语言】软件开发基础篇--CL音乐

【C语言】案例五十 歌曲管理系统 让我用心把你(的赞)留下来! #include "stdio.h" #include "stdlib.h" #include "string.h" #include "ctype.h" #define M 50 /*定义常数表示记录数*/ typedef struct /*定义数据结构*/ { char songname[20];/*歌曲名*/ char name[20]; /*作者*/ char singer[20]; /*演唱者*/ char year[20]; /*年月日*/ } 阅读详情

作为基础篇,实现软件的那些功能呢?

a.构建基本框架

b.围绕歌曲信息的增删查改进行的

c.将内容通过文件操作存进文档

d.整理歌曲内容(排序)

e.实现简单的歌曲播放功能

有人可能就会问了,需要掌握C语言那些知识才能实现这些功能呢?

主要是 :数组,函数,指针,结构体,文件操作等知识即可.

接下来,带大家一起实操

首先,为了让部分功能分工明确,我们可以建立三个cpp文件,(播放音乐需要在c++的环境下)一个头文件,将他看成一个盖房子的过程:

CL-music.h 头文件(建筑图纸)

Basic struct.cpp 用来构建框架,地基

Function interface.cpp 功能界面(给建筑上色,标明门牌号)

play.cpp 实现各部分功能(家具)

首先从创建好的Basic struct.cpp开始实现

想象一下

在我们登录类似于QQ音乐,网易音乐的时候刚开始是不是都有一个登录界面,然后显示音乐logo

这里我们可以分装两个函数

//初始化界面  
Init_picture();
//登录
Lojin();

接着在CL-music.h实现函数声明(可以把所有需要引用的头文件都写入CL-music.h,其他文件只需要引用一下此头文件即可,例如#include"CL-music.h")

这两项都不需要返回值,所以写成void即可

//初始化加载界面
void Init_picture();

//登录/注册
void Lojin();

接下来在Basic struct.cpp里实现

初始化界面就不展示啦,大家可以根据自己的创意来设计logo~

登录如何实现呢?

想象一下

大家刚开始在使用这个软件的时候是不是都没账号,所以要有注册界面,然后再登录(已有账号可以直接跳过注册),账号通过两个数组来维护,一个是注册时输入的,一个是登录时确定的,通过比较即可确定是否输入正确,密码也是如此,账号或密码输入需要重新输入.

下面是登录代码:

//登录
void Lojin()
{

	printf("|-----------------------------------------|\n");
	printf("                  请登录                  \n");
	printf("|-----------------------------------------|\n");
	char account[10] = { 0 };
	char password[10] = { 0 };
	char account_1[10] = { 0 };
	char password_1[10] = { 0 };
	while (1)
	{
		printf("请输入账号(如果您还没有账号请输入\"*\"注册账号) :");
		scanf("%s", account_1);
		if (account_1[0] == '*')
		{
			printf("\n请输入您要注册的账号:");
			scanf("%s", account);
			printf("\n请输入您要注册的密码:");
			scanf("%s", password);
			printf("注册成功\n");
		}
		else
		{
			if (strcmp(account, account_1) == 0)
			{
				printf("请输入密码:");
				scanf("%s", &password_1);
				if (strcmp(password, password_1) == 0)
				{
					printf("登录成功\n");
					printf("正在为您加载...\n");
					Sleep(4000);
					system("cls");
					return;
				}
				else
				{
					printf("密码错误,请重新输入!\n");
				}
			}
			else
			{
				printf("账户错误,请重新输入!\n");
			}
		}
	}

}

成功登录进入后,是不是因该转入功能界面了呢?

大家可以自己想象设计一下功能界面,比如热门歌曲选项,主页,搜索,等等

由于是基础篇,不需要考虑网络搭建,有些界面只需要一个形式即可

下面是功能界面代码实现:

//加载功能界面--主界面
int Func_picture()
{
	printf("|-----------------------------------------|\n");
	printf("|   搜索(1):                             |\n");
	printf("|-----------------------------------------|\n");
	printf("|   热门(2)  |     歌单(3)   |  主页(4)   |\n");
	printf("|-----------------------------------------|\n");
	printf("|-----------------------------------------|\n");
	printf("|                                         |\n");
	printf("|                                         |\n");
	printf("|                欢迎您来到               |\n");
	printf("|                                         |\n");
	printf("|                   CL                    |\n");
	printf("|    海报                          海报   |\n");
	printf("|                  musci                  |\n");
	printf("|                                         |\n");
	printf("|                  ...                    |\n");
	printf("|                                         |\n");
	printf("|                关闭程序(0)              |\n");
	printf("|                                         |\n");
	printf("|-----------------------------------------|\n");
	printf("请输入您要进行操作的序号:");
	int input = 0;
	scanf("%d", &input);
	system("cls");
	return input;
}

以上各功能只需输入对应的序号即可执行操作,并通过system("cls");清除界面,实现界面跳转

补充一点,system函数来源于stdlib.h文件,登录界面的字符串比较函数来自string.h因此需要在头文件里包含

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

int Func_picture();这个功能界面为什么需要返回值呢?

接下来看主体框架

int main()
{
	//初始化加载界面
	Init_picture();
	int input1 = 0;
	Lojin();//登录
	do
	{
		switch (input1 = Func_picture())
		{
		case 1:
			break;
		case 2:
			break;
		case 3:
            break;
		case 4:
			break;
		case 5:
			break;
		case 0:
			printf("退出音乐\n");
			return 0;
		default:
			printf("输入非法,请重新输入!\n");
			break;
		}
	} while (input1);
	return 0;
}

通过 Func_picture();的返回值来判断进入哪个case语句,并实现相应功能

既然是歌曲库,那么何来的库呢?

这里通过结构来创建歌曲库

结构体放入.h文件即可

typedef struct Songinfo //歌曲相关信息
{
	char Charname[NAME_MAX];
	char Charauthor[AUTHOR_MAX];
	char Charsinger[SINGER_MAX];
	char Charpub_date[DATE_MAX];
}Songinfo;

这里的数量我用的#define定义的,可以方便后期维护和修改

#define NAME_MAX 20
#define AUTHOR_MAX 20
#define SINGER_MAX 20
#define DATE_MAX 11

可是我们总不可能写入一个歌曲信息就去手动创建一个

可以另外创建一个结构体,实现真正的歌曲库,里面包含一个结构体数组和一个计数器,每添加一个歌曲信息就将计数器加1,这样不仅实现了多信息的存储,也记录了信息的存储数量

typedef struct Song_library //歌曲库
{
	Songinfo arr[MUSIC_MAX];//添加进的歌曲
	int sz;//记录当前有效信息数
}Song_library

创建歌曲库,命名为son

//歌曲库
	Song_library son;

下一步,将结构体数据初始化,写入play.cpp

注意这里传址

//初始化库存音乐
void Init_library(Song_library* son)
{
	son->sz = 0;
	memset(son->arr, 0, sizeof(son->arr));
}

接下来就可以一步一步实现功能界面部分功能啦

既然是实现功能,不妨将这些功能分装成不同的函数,放在play.cpp中

注意:不要忘记将这些函数声明哦~

首先是

搜索歌曲功能

通过搜索歌曲名,展示出歌曲相应信息

如何实现呢

可以通过遍历数组,用字符串比较函数的方法来查询

下面是搜索代码实现

//查找信息
static int Find_song(const Song_library* son, char name[NAME_MAX])
{
    assert(son != NULL);
	int i = 0;
	for (i = 0; i < son->sz; i++)
	{
		if (0 == strcmp(name, son->arr[i].Charname))
		{
			return i;
		}
	}
	return -1;
}

注:assert(son != NULL);保证指针有效性

细心的小伙伴可能就发现了,

这里的static是干什么的?

const又是干什么的?

第一个问题:想象一下,如果在未来的公司里,每个文件分别实现不同功能,当代码量特别大的时候,在两个不同的文件下定义了两个同名的函数,但是要实现不同的功能,这时代码就会出现冗余的现象,为了避免,加上static关键字,将其修饰为静态变量,使其函数功能的实现只能在本文件里使用,就有效防止了代码的冗余.

第二个问题:搜索功能不需要去修改什么,const是为了防止Song_library* son被修改,这样加强了代码,未来实现一个大的工程,不是只有你一个人在完成这个项目,别人可能并不知道这个变量不能被修改!

第二个模块:

热门选项:

//热门
void Hot()
{

	printf("|-----------------------------------------|\n");
	printf("|                  热门                   |\n");
	printf("|-----------------------------------------|\n");
	printf("|                今日榜单                 |\n");
	printf("|                                         |\n");
	printf("|         说好不哭 周杰伦 试听(1)         |\n");
	printf("|                                         |\n");
	printf("|       不为谁而作的歌 林俊杰 试听(2)     |\n");
	printf("|                                         |\n");
	printf("|         七里香 周杰伦 试听(3)           |\n");
	printf("|                                         |\n");
	printf("|                   ...                   |\n");
	printf("|                 返回(0)                 |\n");
	printf("|                                         |\n");
	printf("|-----------------------------------------|\n");

	int input = 0;
	printf("请选择:");
	scanf("%d", &input);
	switch (input)
		{
		case 1:
			system("cls");
			Music(input);
			break;
		case 2:
			system("cls");
			Music(input);
			break;
		case 3:
			system("cls");
			Music(input);
			break;
		case 0:
			system("cls");
			break;
		default:
			printf("输入非法,请重新输入!\n");
			break;
		}
	system("cls");

一个简易的播放界面,作为试听歌曲

第三个模块:

歌单界面:

int Playlist_menu()
{
	printf("|-----------------------------------------|\n");
	printf("|               *** LC ***                |\n");
	printf("|       |-------------------------|       |\n");
	printf("|       |        添加歌曲(1)      |       |\n");
	printf("|       |-------------------------|       |\n");
	printf("|       |        删除歌曲(2)      |       |\n");
	printf("|       |-------------------------|       |\n");
	printf("|       |        查询歌单(3)      |       |\n");
	printf("|       |-------------------------|       |\n");
	printf("|       |        修改歌曲(4)      |       |\n");
	printf("|       |-------------------------|       |\n");
	printf("|                 返回(0)                 |\n");
	printf("|-----------------------------------------|\n");
	printf("请输入您要进行操作的序号:");
	int input = 0;
	scanf("%d", &input);
	system("cls");
	return input;
}

这就是整个信息管理系统的核心部分,对歌曲信息进行增删查改功能

因此,我们因该在Basic struct.cpp这个基础框架中添加选项,如下代码:

do
	{
		switch (input1 = Func_picture())
		{
		case 1:
			Search(&son);
			break;
		case 2:
			Hot();
			break;
		case 3:
			do
			{
				switch (input2 = Playlist_menu())//歌单
				{
				case 1:
					//增加歌曲
					Add_song(&son);
					Bubble_sort(&son);
					break;
				case 2:
					//删除歌曲
					Delete(&son);
					break;
				case 3:
					//查询歌曲
					Show_list(&son);
					break;
				case 4:
					//修改信息
					Modify(&son);
					break;
				case 0:
					break;
				default:
					printf("输入非法,请重新输入\n");
					break;
				}
			} while (input2);
			break;
		case 4:
				Home_page();
			break;
		case 5:
			Music(input1);
			break;
		case 0:
			printf("退出音乐\n");
			return 0;
		default:
			printf("输入非法,请重新输入!\n");
			break;
		}
	} while (input1);

先来看看添加歌曲

//增加歌曲
void Add_song(Song_library* son)
{
	assert(son != NULL);
	if (son->sz == MUSIC_MAX)
	{
		printf("歌曲库已满,无法添加\n");
	}
	else
	{
		FILE* write = NULL;
		if (son->sz == 0)
		{
			 write = fopen("歌曲库.txt", "w");
			if (write == NULL)
			{
				return;
			}
		}
		else
		{
			write = fopen("歌曲库.txt", "a");
			if (write == NULL)
			{
				return;
			}
		}
		printf("请输入歌曲名:");
		scanf("%s",&(son->arr[son->sz].Charname));
		printf("请输入作者:");
		scanf("%s", &(son->arr[son->sz].Charauthor));
		printf("请输入演唱者:");
		scanf("%s", &(son->arr[son->sz].Charsinger));
		printf("请输入发行时间:");
		scanf("%s", &(son->arr[son->sz].Charpub_date));

		//写入歌曲库
		fprintf(write, "%-10s\t", son->arr[son->sz].Charname);
		fprintf(write, "%-10s\t", son->arr[son->sz].Charauthor);
		fprintf(write, "%-10s\t", son->arr[son->sz].Charsinger);
		fprintf(write, "%-10s\t\n", son->arr[son->sz].Charpub_date);
		son->sz++;
		printf("添加成功!\n");
		fclose(write);
		write = NULL;
	}
}

想象一下,进入此模块,首先因该想到该歌曲库是否已经被填满

       接下来,要注意,不能只是简单的进行"w"操作,"w"为只写,我们每次往文件里添加歌曲的时候都会覆盖上一个创建的文件,如果没有文件,则会重新创建一个,所以这首先因该判断,如果歌曲库的歌曲个数为零,则可以通过"w"创建一个txt文件,倘若歌曲个数不为零,我们则可以通过"a"来追加

下一个功能:

删除歌曲

//删除歌曲
void Delete(Song_library* son)
{
	assert(son != NULL);
	char name[NAME_MAX] = { 0 };
	printf("请输入要删除的歌曲的名字:");
	scanf("%s", name);
	int ret = Find_song(son, name);//查找
	if (ret == -1)
	{
		printf("对不起,没有您要找的歌曲信息!\n");
	}
	else
	{
		int i = 0;  //从后向前覆盖
		for (i = ret; i < son-> sz - 1; i++)
		{
			son->arr[i] = son->arr[i + 1];
		}
		son->sz--;
		//重新写入文件
		FILE* write = fopen("歌曲库.txt", "w");
		if (write == NULL)
		{
			return;
		}
		for (i = 0; i < son->sz; i++)
		{
			fprintf(write, "%-10s\t", son->arr[i].Charname);
			fprintf(write, "%-10s\t", son->arr[i].Charauthor);
			fprintf(write, "%-10s\t", son->arr[i].Charsinger);
			fprintf(write, "%-10s\t\n", son->arr[i].Charpub_date);
		}
		printf("删除成功!\n");
		fclose(write);
		write = NULL;
	}
	system("pause");
	system("cls");
}

       输入的歌曲名通过数组存放,再用之前的查找函数Find_song进行搜索,没找到输出提示,找到了进行删除歌曲信息操作,如何删除呢,由于歌曲库未添加歌曲的地方被初始化成全0,所以通过从后向前覆盖的方式进行删除

下一个功能:

查找歌曲信息

//歌单列表
void Show_list(const Song_library* son)
{
	assert(son != NULL);
		FILE* read = fopen("歌曲库.txt", "r");
		if (read == NULL)
		{
			return;
		}
		int i = 0;
		for (i = 0; i < son->sz; i++)
		{
			fscanf(read, "%s", &(son->arr[i].Charname));
			fscanf(read, "%s", &(son->arr[i].Charauthor));
			fscanf(read, "%s", &(son->arr[i].Charsinger));
			fscanf(read, "%s", &(son->arr[i].Charpub_date));
		}
		printf("|------------------------------------------------------------|\n");
		printf("  %-18s\t%-8s\t%-8s\t%-11s\n", "歌曲名", "作词人", "演唱者", "日期");
		for (i = 0; i < son->sz; i++)
		{
			if (i % 10 == 0 && i != 0)
			{
				system("pause");
			}
			printf("  %-18s\t%-8s\t%-8s\t%-11s\n",
				son->arr[i].Charname,
				son->arr[i].Charauthor,
				son->arr[i].Charsinger,
				son->arr[i].Charpub_date);
		}
		printf("|------------------------------------------------------------|\n");
		system("pause");
		system("cls");
		fclose(read);
		read = NULL;
}

     通过fscanf函数从歌曲库中获取信息,再通过printf进行打印,分屏输出,每次10条歌曲信息

注意:

	for (i = 0; i < son->sz; i++)
		{
			if (i % 10 == 0 && i != 0)
			{
				system("pause");
			}

这里的 i = 0 时进入 i % 10 = 0 依然成立,所以这里要注意并且的条件

下一个功能:

修改歌曲信息

//修改
void Modify(Song_library* son)
{
	assert(son != NULL);
	char name[NAME_MAX] = { 0 };
	printf("请输入您要修改信息的歌曲名:");
	scanf("%s", name);
	int ret = Find_song(son, name);
	if (ret == -1)
	{
		printf("对不起,没有您要找的歌曲信息!\n");
	}
	else
	{
		FILE* modif = fopen("歌曲库.txt", "a");
		if (modif == NULL)
		{
			return;
		}
		printf("请输入歌曲名:");
		scanf("%s", &(son->arr[ret].Charname));
		printf("请输入作者:");
		scanf("%s", &(son->arr[ret].Charauthor));
		printf("请输入演唱者:");
		scanf("%s", &(son->arr[ret].Charsinger));
		printf("请输入发行时间:");
		scanf("%s", &(son->arr[ret].Charpub_date));

		//重新写入文件
		FILE* write = fopen("歌曲库.txt", "w");
		if (write == NULL)
		{
			return;
		}
		int i = 0;
		for (i = 0; i < son->sz; i++)
		{
			fprintf(write, "%-10s\t", son->arr[i].Charname);
			fprintf(write, "%-10s\t", son->arr[i].Charauthor);
			fprintf(write, "%-10s\t", son->arr[i].Charsinger);
			fprintf(write, "%-10s\t\n", son->arr[i].Charpub_date);
		}
		printf("修改成功!\n");
		fclose(write);
		write = NULL;
	}
	system("pause");
	system("cls");
}

     首先,通过查找歌曲函数先找到歌曲信息,然后对歌曲重新写入,覆盖之前的歌曲信息,最后修改成功并给予反馈

增删查改功能到这里就完成啦,为了让歌曲信息直观有序,继续创建一个模块

排序功能

//排序
void Bubble_sort(Song_library* son)
{
	assert(son != NULL);
	char tmp_name[NAME_MAX] = { 0 };
	//写入结构体数组
	int i = 0;
	for (i = 0; i < son->sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < son->sz - i - 1; j++)
		{
			if (strcmp(son->arr[j].Charname, son->arr[j + 1].Charname) > 0)
			{
				//名字
				strcpy(tmp_name, son->arr[j].Charname);
				strcpy(son->arr[j].Charname, son->arr[j + 1].Charname);
				strcpy(son->arr[j + 1].Charname, tmp_name);
				//作者
				strcpy(tmp_name, son->arr[j].Charauthor);
				strcpy(son->arr[j].Charauthor, son->arr[j + 1].Charauthor);
				strcpy(son->arr[j + 1].Charauthor, tmp_name);
				//演唱者
				strcpy(tmp_name, son->arr[j].Charsinger);
				strcpy(son->arr[j].Charsinger, son->arr[j + 1].Charsinger);
				strcpy(son->arr[j + 1].Charsinger, tmp_name);
				//发行日期
				strcpy(tmp_name, son->arr[j].Charpub_date);
				strcpy(son->arr[j].Charpub_date, son->arr[j + 1].Charpub_date);
				strcpy(son->arr[j + 1].Charpub_date, tmp_name);
			}
		}
	}
	//重新写入文件
	FILE* write = fopen("歌曲库.txt", "w");
	if (write == NULL)
	{
		return;
	}
	for (i = 0; i < son->sz; i++)
	{
		fprintf(write, "%-10s\t", son->arr[i].Charname);
		fprintf(write, "%-10s\t", son->arr[i].Charauthor);
		fprintf(write, "%-10s\t", son->arr[i].Charsinger);
		fprintf(write, "%-10s\t\n", son->arr[i].Charpub_date);
	}
	printf("修改成功!\n");
	fclose(write);
	write = NULL;

}

            比较首元素ASCII码值的大小,由小到大进行排序,创建一个临时数组    char tmp_name[NAME_MAX] = { 0 };  用来临时存放歌曲信息,方便交换,相当于你要交换一个油瓶和一个醋瓶中的液体一样,肯定是需要一个空瓶来临时存放的,这里的临时数组就相当于空瓶,最后重新写入文件,注意这里因该覆盖掉之前的文件内容;此功能可以放在增添歌曲功能的后面

如下代码:

				case 1:
					//增加歌曲
					Add_song(&son);
					Bubble_sort(&son);
					break;
				case 2:

最后一个模块

音乐播放

这里首先要保证是在cpp环境下进行,并且需要修改字符集,修改为使用多字节字符集,如下图

下一步,需要引用一些头文件

//加载音乐需要的头文件
#include<Windows.h>
#include<mmsystem.h>//包含多媒体设备接口头文件
#pragma comment (lib,"winmm.lib")//加载静态库

接着,将需要播放的音乐下载好,(注意:网易音乐不行,有加密),放在当前路径下

 接着如下代码

mciSendString("open 说好不哭.mp3 alias a", 0, 0, 0);// alias 是重命名
mciSendString("play a", 0, 0, 0);//播放刚刚被命名的a音乐

如果需要暂停音乐,可以用如下代码

mciSendString("close a", 0, 0, 0);

模仿音乐播放功能,就有了如下代码

//音乐播放
void Music(const int ret)
{
	int input = 0;
	if (ret == 1)
	{
		A:
		printf("|-----------------------------------------|\n");
		printf(" 正在为您播放“说好不哭”\n");
		mciSendString("close a", 0, 0, 0);
		mciSendString("close b", 0, 0, 0);
		mciSendString("close c", 0, 0, 0);
		mciSendString("open 说好不哭.mp3 alias a", 0, 0, 0);
		mciSendString("play a", 0, 0, 0);
		printf(" 播放(1)       关闭播放(2)       单曲循环(3)\n");
		printf("                 返回(0)\n");
		printf("|-----------------------------------------|\n");
	}
	else if (ret == 2)
	{
		B:
		printf("|-----------------------------------------|\n");
		printf(" 正在为您播放“不为谁而作的歌”\n");
		mciSendString("close a", 0, 0, 0);
		mciSendString("close b", 0, 0, 0);
		mciSendString("close c", 0, 0, 0);
		mciSendString("open 不为谁而作的歌.mp3 alias b", 0, 0, 0);
		mciSendString("play b", 0, 0, 0);
		printf(" 播放(1)       关闭播放(2)       单曲循环(3)\n");
		printf("                 返回(0)\n");
		printf("|-----------------------------------------|\n");
	}
	else if (ret == 3)
	{
		C:
		printf("|-----------------------------------------|\n");
		printf(" 正在为您播放“七里香”\n");
		mciSendString("close a", 0, 0, 0);
		mciSendString("close b", 0, 0, 0);
		mciSendString("close c", 0, 0, 0);
		mciSendString("open 七里香.mp3 alias c", 0, 0, 0);
		mciSendString("play c", 0, 0, 0);
		printf(" 播放(1)       关闭播放(2)       单曲循环(3)\n");
		printf("                 返回(0)\n");
		printf("|-----------------------------------------|\n");
	}
	while (1)
	{
		printf("请选择:");
		scanf("%d", &input);
		if (input == 1)
		{
			if (ret == 1)
			{
				system("cls");
				goto A;
			}
			else if (ret == 2)
			{
				system("cls");
				goto B;
			}
			else if (ret == 3)
			{
				system("cls");
				goto C;
			}
		}
		else if (input == 2)
		{
			if (ret == 1)
				mciSendString("close a", 0, 0, 0); 
			else if(ret == 2)
				mciSendString("close b", 0, 0, 0);
			else if(ret == 3)
				mciSendString("close c", 0, 0, 0);
		}
		else if (input == 3)
		{
			if (ret == 1)
				mciSendString("repeat a", 0, 0, 0); 
			else if (ret == 2)
				mciSendString("repeat b", 0, 0, 0);
			else if(ret == 3)
				mciSendString("repeat c", 0, 0, 0);
		}
		else if (input == 0)
		{
			break;
		}
	}
	system("cls");
}

这样一个基本的框架就建立好啦

码字不易~

【C语言】利用Beep函数实现歌曲演奏(C语言演奏) 依靠C语言实现歌曲演奏 阅读详情

相关推荐

立晶半导体Cubic Lattice Inc 专攻音频ADC,音频DAC,音频CODEC,音频CLASS D等CL7016

CL7016是一款高保真USB Type-C兼容音频编解码芯片。

ANines07的博客 1668

使用C语言播放一首音乐

播放音乐 大家好,我是辰梦! 很久没有写过文章了,在这期间,我写了很多代码,但很多都是别人写的,我想了又想,今天把我觉得比较好的代码给大家分享出来! 相信大家也找了很久的C语言音乐播放器,在这里,我就抛转引玉,虽不是音乐播放器,但也是做音乐播放器的第一步! 第一节 代码的组成 #define use_CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<graphics.h> #include<stdlib.h> #inclu

qq_56402474的博客 3805

易用型arduino音乐库

最近沉迷搞arduino音乐,但是音乐库总找不到好用的,有的吧缺调,有的命名冗长不好用,遂自己写了一个,可能有bug,欢迎批评指正//泛用性arduino音乐库 //由 过路人 制作 //可能产生的频率bug可在下方微调,欢迎反馈bug至1987409587@qq.com //命名方式:#define 调(A,B,C,D,E,F,,G)+音域(L,M,H)+音(1,2,3,4,5,6,7) 频率 ...

weixin_42647423的博客 1190

adrunio蜂鸣器音乐(天空之城)c调

天空之城简谱(来源:网络) 话不多说直接上代码 //天空之城 //C调 #define C0 1 #define C1 262 #define C2 294 #define C3 330 #define C4 350 #define C5 393 #define C6 441 #define C7 495 #define CL1 131 #define CL2 147 #define CL3 165 #define CL4 175 #define CL5 196 #define CL6 221 #de

weixin_51703558的博客 2284

手把手教你用唐都实验箱+汇编语言,复刻一个带音乐播放的倒计时器(附完整代码)

本文详细介绍了如何使用唐都实验箱和汇编语言实现带音乐播放的倒计时器,涵盖硬件配置、系统架构设计、核心功能实现及调试技巧。通过8255、8254、8259等芯片的协同工作,展示了微机原理在实践中的应用,附完整代码帮助读者快速复现项目。

weixin_29171087的博客 400

85、音乐与逻辑中的图表应用

本文探讨了图表在不同领域中的应用,重点分析了音乐创作与逻辑推理中的图表使用。以贝多芬《渴望》的创作过程为例,展示了音乐记谱法如何作为一种兼具图标法则符号和图标单一符号特征的图表系统,参与音乐创作的符号链,并与图表推理过程相似。同时,介绍了微积分CL作为一种结合树状图、欧拉型图、文氏型图和对立四边形优点的逻辑工具,既可用于本体编辑,也可作为推理引擎,帮助非专业用户进行知识表示与逻辑推理。

linux6sysadmin的博客 69

c语言中调用一个程序设计,第一章 C语言程序设计概述

1 计算机体系结构计算机主要由硬件和软件的协作完成生活和工作中的绝大多数事情,例如听音乐,看电影,上网聊天,购物等等。硬件主要包含CPU,内存,外存,IO设备等组成。CPU:负责从内存中读取进程的数据和控制其他设备内存:分为RAM(随机访问存储器)和ROM(只读存储器),只是负责暂时存储数据,断电后数据会消失。做程序开发时一般配置的内存为8-16G,而当台服务器的内存一般为64G。外存:用于永久存...

weixin_31572321的博客 281

C语言 音乐播放器项目(综合)

4.makefile文件。1.main.c文件。

aisheisadas的博客 2220

国产音频芯片:音频ADC,音频DAC,音频CODEC,音频CLASS D如何竞争欧美大牌?

CL7016,USB连接电脑或手机录音耳机监听口可以同时监听录音/降噪/音量加减等功能,CL7016+LDR6023完成边听歌边充电的Type-C音频转接口。 CL1026+ DSP(数字版手机声卡) CL1009录音/放音 (运动相机) CL1026 + 2.4G无线(领夹麦克风) CL1026 or CL4016(音箱,音响) CL1026+5.8无线(监听耳机) CL1009+DSP(行车记录仪)

weixin_51957723的博客 9556

C语言实现歌曲信息管理系统.doc

C语言实现歌曲信息管理系统--附源码

C语言实现歌曲信息管理系统

主要为大家详细介绍了C语言实现歌曲信息管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

基于工作过程的c语言程序设计,第一章 C语言程序设计概述

1 计算机体系结构计算机主要由硬件和软件的协作完成生活和工作中的绝大多数事情,例如听音乐,看电影,上网聊天,购物等等。硬件主要包含CPU,内存,外存,IO设备等组成。CPU:负责从内存中读取进程的数据进行各种运算和控制其他设备内存:分为RAM(随机访问存储器)和ROM(只读存储器,例如BIOS),只是负责暂时存储数据,断电后数据会消失。做程序开发时一般配置的内存为8-16G,而当台服务器的内存一般...

weixin_35972313的博客 290

LLVM 编译器学习笔记之三十六-- 指令调度Instruction scheduling

1、参考Instruction scheduling in LLVM - 知乎,在中后端均存在指令调度 指令调度模型 2、在llvm12->llvm14 中Machine Instruction Scheduler有个patch增强了load/store指令的合并,也就是指令调度不仅仅只是改变指令的顺序,该优化类似gcc中的store-merge优化 .....................................................................

~ 飞 扬 的 天 空 ~ 5685

【树莓派C语言开发】实验09:有源和无源蜂鸣器模块

本文讲述了有源和无源蜂鸣器的接线,以及使用C语言代码控制它们

慕雪华年的博客 1万+

从ViT到Swin Transformer:一文搞懂Transformer在CV中的进化史(附实战代码)

本文系统梳理了Transformer在计算机视觉领域的演进历程,从开创性的Vision Transformer(ViT)引入全局注意力机制,到DETR实现端到端目标检测,再到里程碑式的Swin Transformer通过滑动窗口和层次化设计高效桥接CNN与ViT。文章深入剖析了各模型的核心思想、技术突破与实战应用,并提供了可运行的代码示例,帮助读者从理论到实践全面掌握这一关键技术脉络。

cola5的博客 712

RTAB-MAP实战:用Realsense D435i在ROS中搭建室内3D地图(附避坑指南)

本文详细介绍了如何在ROS环境下,使用Intel Realsense D435i深度相机和RTAB-MAP算法进行室内3D地图构建的完整实战流程。内容涵盖环境配置、核心节点数据流解析、关键参数调优、地图保存与重定位,并提供了实用的避坑指南,帮助机器人开发者和研究者快速实现稳定的视觉SLAM应用。

weixin_29095049的博客 489

arduino 嗡鸣器 音乐_Arduino教程——蜂鸣器发声

更强的代码#define NOTE_0-1#define NOTE_A1 441#define NOTE_A2 495#define NOTE_A3 556#define NOTE_A4 589#define NOTE_A5 661#define NOTE_A6 742#define NOTE_A7 833#define NOTE_AL1 221#define NOTE_AL2 248#def...

weixin_39652810的博客 1122

内网穿透-frp二层隧道搭建

环境: weblogic: 192.168.0.133 10.10.20.12 win7 : 10.10.20.7 10.10.10.7go语言、跨平台的 可以分为frpc和frps frpc—>请求----->frps frps:放到黑客公网上 1.需要出网 2.配置: frpc:放到肉鸡上,请求frps 2.端口转发 2.1frpc传到肉鸡(weblogic) 利用工具,传入内存马到weblogic,然后使用冰蝎进行连接 然后在文件管理中上传frpc.exe和frpc.ini文件 fr

yyytaotao的博客 2100

推荐文章:Common Lisp开发者的福音——cl-gtk4

推荐文章:Common Lisp开发者的福音——cl-gtk4 项目介绍 cl-gtk4是一个为Common Lisp社区带来的强大礼物,它提供了对GTK4、Libadwaita和WebKitGTK的无缝绑定。这不仅极大地扩展了Common Lisp在GUI应用开发领域的潜力,更是将现代图形界面设计的能力置于Lisp程序员的指尖之下。通过这个库,开发者能够利用成熟的GTK框架,在多平台上构建优雅且...

gitblog_00535的博客 597

【近源攻击】badusb制作

BadUSB是利用伪造HID设备执行攻击载荷的一种攻击方式。HID(Human InterfaceDevice)设备通常指的就是键盘鼠标等与人交互的设备,用户插入BadUSB,就会自动执行预置在固件中的恶意代码。BadUsb插入后,会模拟键盘鼠标对电脑进行操作,通过这些操作打开电脑的命令终端,并执行一条命令,这条命令将从指定网址下载其他代码并于后台静默运行。这些代码功能包括:窃取信息、反弹shell、发送邮件等,从而实现控制目标机或者窃取信息的目的。

qinjilll的博客 2543

完整的 Python 数据分析案例:新能源汽车续航里程预测

随着新能源汽车的普及,续航里程成为消费者关注的重要指标。准确预测新能源汽车的续航里程,有助于车企优化电池管理系统、提升车辆性能,也能帮助消费者合理规划出行。本案例将基于新能源汽车的各项参数,如电池容量、行驶速度、环境温度等,构建续航里程预测模型。通过以上改进,可以提高数据处理的准确性、模型的性能和可视化的效果。

daqsdfas的博客 1587

树莓派 python蜂鸣器播放音乐

python(树莓派蜂鸣器程序注释) import RPi.GPIO as GPIO import time Buzzer = 11 #蜂鸣器接在第11管脚上 # 定义低中高频率 CL = [0, 131, 147, 165, 175, 196, 211, 248] # Frequency of Low C notes CM = [0, 262, 294, 330, 350, 393, 441, 495] # Frequency of Middle C notes CH = [0, 525,

dujuancao11的博客 5304

NX二次开发点通过云配准获取相同体

先找到体的参考方向(这个参考方向对于相同体重合之后是相同的),这个时候我们的思路是三个不共线的点确定一个坐标系,然后和绝对方向求转换矩阵。然后获取体的所有边的几何中心,把这些点通过转换矩阵转换之后存起来,再和另外一个体转换之后的点数据作对比,在误差范围内配对点的数量等于体获取点的数量就是相同体

qq_39541524的博客 1643

【小程序】微信小程序进入自动播放背景音乐

需求:打开微信小程序后音乐自动后台播放,切换不同页面不受影响 在需要首次播放的页面所在文件夹,打开页面.js文件 首先构造 const back = wx.getBackgroundAudioManager(); backmusic: function () { player(); function player() { back.title = "LXY&CL "; // 必须要有一个title ..

SZnAl的博客 9096

2021年03月 C/C++(五级)真题解析#中国电子学会#全国青少年软件编程等级考试

给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0。n的位数为m。现在从m位中删除k位(0

人生就是一个不断学习的过程 1008

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

汇编语言代码编写c 语言代码,通过内联汇编实现字符串的复制,TC20下的内联汇编...

,如同别的注释一样,<>之间的表示可选的;例如:main(){char *c="hello,world\n\r$";asm mov ah,9;asm mov dx,c;asm int 33;printf("You sucessed!\n");}或者是:main(){char *c="hello,world\n\r$";asm mov ah,9asm mov dx,casm int 33...

weixin_36333893的博客 735

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: 【C语言】深度剖析数据在内存中的存储(含整型提升讲解)
下一篇: 【C语言】指针进阶剖析
陈亦康
陈亦康 优质创作者: Java技术领域 优质创作者: Java技术领域
博客等级 码龄5年 6万+粉丝 388原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈亦康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值