📄 1255.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 + -