社区讨论

求续写代码

灌水区参与者 3已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lz8jzkgq
此快照首次捕获于
2024/07/30 23:08
2 年前
此快照最后确认于
2024/07/31 08:59
2 年前
查看原帖
实在写不下去了(这应该也算和程序学习有关吧)
CPP
#include <array>
#include <vector>
#include <iostream>
#include <ctime>
#include <sstream>
#include <windows.h>
#include <pthread.h>
 
using namespace std;
 
#define PAI 400  //一拍的时长,可以自行调整 
 
struct tone{
	short a; short d; short g;  //中音;低音;高音 
	short b; short e; short f;  //半阶音 
};
 
struct tune{
	short t;	//唱名 
	float l;	//音长 
	short b;	//音调 
};
 
array<tone,8>m;
 
short t(short a,short b)
{
	switch(b){
		case 0: return m[a].a;
		case 1: return m[a].d;
		case 2: return m[a].g;
		case 3: return m[a].b;
		case 4: return m[a].e;
		case 5: return m[a].f;
	}
}
 
short p(float p)
{
	return (short)(PAI*p);
}
void initTone(void)
{	
	m.at(0)={0,0,0,0,0,0};
	m.at(1)={523,262,1046,554,277,1109};
	m.at(2)={578,294,1175,622,311,1245};
	m.at(3)={659,330,1318,659,330,1318};
	m.at(4)={698,349,1493,740,370,1556};
	m.at(5)={784,392,1568,831,415,1661};
	m.at(6)={880,440,1760,932,466,1865};
	m.at(7)={988,494,1976,988,494,1976};
}
 
void repeat1(vector<tune>&s)//前奏QAQ 
{
	s.push_back({1,1,0});
	s.push_back({1,1,2});
	s.push_back({7,1,0});
	s.push_back({1,1,2});
	
	s.push_back({5,1,0});
	s.push_back({1,1,2});
	s.push_back({4,1,0});
	s.push_back({1,1,2});
	
	s.push_back({3,1,0});
	s.push_back({1,1,2});
	s.push_back({2,1,0});
	s.push_back({1,1,2});
	
	s.push_back({3,1,0});
	s.push_back({1,1,2});
	s.push_back({4,1,0});
}
void repeat2(vector<tune>&s)//这里还是乱的…… 
{
	s.push_back({3,2,1});
	s.push_back({3,2,1});
	s.push_back({3,2,1});
	
	s.push_back({3,1,2});
	s.push_back({3,1,1});

	s.push_back({3,2,2});
	s.push_back({3,2,1});
	
	s.push_back({5,1,2});
	s.push_back({0,0,1});
	s.push_back({4,1,1});
	
	s.push_back({3,1,1});
	s.push_back({3,1,2});
	s.push_back({0,0,1});
	s.push_back({0,0,1});
	
	s.push_back({5,2,0});
	
	s.push_back({3,2,1});
	s.push_back({3,2,1});
	s.push_back({3,2,1});
	s.push_back({3,2,1});
	s.push_back({4,2,1});
}
//以上根据简谱上的拍子和音调编入容器,方法如下: 
	//第一个参数 1~7 对应do re mi fa so la si 0=休止符
	//第二个参数 1拍=1;半拍=0.5 四分之一拍=0.25 以此类推 
	//第三个参数 一般就为0,低音=1 高音=2 对应的半阶音=3 4 5 
	//转简谱时看到什么数字就是什么,不用记频率数方便编辑和排错
void initTune(vector<tune>&s)
{
	/*for(int i=0;i<3;i++)
	{
		repeat1(s);
	}*/
	repeat2(s);
}

void gotoXY(short x, short y)
{
    COORD position = {x, y};
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hConsole, position);
}
 
bool play_not_end=true;  //设置演奏标记 
 
void* play(void* args)
{
	vector<tune>music;
	initTone();
	initTune(music);
	gotoXY(28,8);
	cout<<"背景音乐:《使一颗心免于哀伤》";
	for (auto v:music)
		if (play_not_end) Beep(t(v.t,v.b),p(v.l));
		else break;
 
	play_not_end=false;
}
 
char strTime[20];
 
void* coutTime(void* args)
{
	time_t lt;
	while (play_not_end){
		time(&lt);
		strftime(strTime,sizeof(strTime),"%Y-%m-%d %H:%M:%S",localtime(&lt));
		Sleep(300);
	}
	play_not_end=false;
}
 
int main()
{
	pthread_t pt;
	int ret = pthread_create(&pt, NULL, play, NULL);  //创建一个线程,play()变相成为背景音乐 
	if (ret!=0) cout<<"create thread_1 error: error_code="<<ret<<endl;
	
	ret = pthread_create(&pt, NULL, coutTime, NULL);  //再创建一个线程,用于显示当前系统时间 
	if (ret!=0) cout<<"create thread_2 error: error_code="<<ret<<endl;
	//在 pthread_create()与 pthread_exit()之间,便是程序工作的主场 
	Sleep(100);
	gotoXY(28,10);
	cout<<"工作次数:"; 
	for(int i=1;play_not_end;i++){
		gotoXY(48,10);
		cout<<i<<endl;
		gotoXY(60,0);
		cout<<strTime; //显示另外一个线程取回的时间 
		Sleep(300);
		if (i==100) play_not_end=false;  //工作在音乐演奏完之前结束,只要把标记设为false即可 
	}
	gotoXY(28,12);
	cout<<"演奏完re……"<<endl;
	
	pthread_exit(NULL);
	return 0; 
}
违规自删

回复

5 条回复,欢迎继续交流。

正在加载回复...