⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1255.cpp

📁 这是哈尔滨工业大学acmOJ的源代码
💻 CPP
字号:
/* This Code is Submitted by wywcgs for Problem 1255 on 2006-11-13 at 21:44:45 */
#include <cstdio>
#include <cstring>
#include <cctype>
#include <algorithm>
using namespace std;
 
const char CHORD[][4] = { "A", "A#", "B", "C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", 
				"BB", "DB", "EB", "GB", "AB", "" };
const int NUM[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1, 4, 6, 9, 11 };
 
char* upper(char*);
bool major(int*);
bool minor(int*);
 
int main()
{
	char c[3][4];
	int cn[3];
	
	while(scanf("%s %s %s", c[0], c[1], c[2]) != EOF) {
		printf("%s %s %s is ", c[0], c[1], c[2]);
		for(int i = 0; i < 3; i++)
			for(int j = 0; CHORD[j][0] != 0; j++)
				if(!strcmp(upper(c[i]), CHORD[j])) cn[i] = NUM[j];
		//for(int i = 0; i < 3; i++) printf("%s %d ", c[i], cn[i]);
		//putchar('\n');
		bool can = false;
		sort(cn, cn+3);
		do {
			//for(int i = 0; i < 3; i++) printf("%d ", cn[i]);
			can = true;
			if(major(cn)) printf("a %s Major chord.\n", CHORD[cn[0]]);
			else if(minor(cn)) printf("a %s Minor chord.\n", CHORD[cn[0]]);
			else can = false;
		} while(next_permutation(cn, cn+3) && !can);
		if(!can) printf("unrecognized.\n");
	}
 
	return 0;
}
 
char* upper(char* str)
{
	for(int i = 0; str[i] != 0; i++) str[i] = toupper(str[i]);
	return str;
}
bool major(int* a)
{
	int b[3] = { a[0], a[1], a[2] };
	if(b[1] < b[0]) b[1] += 12;
	if(b[2] < b[1]) b[2] += 12;
	return b[1]-b[0] == 4 && b[2]-b[1] == 3;
}
bool minor(int* a)
{
	int b[3] = { a[0], a[1], a[2] };
	if(b[1] < b[0]) b[1] += 12;
	if(b[2] < b[1]) b[2] += 12;
	return b[1]-b[0] == 3 && b[2]-b[1] == 4;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -