音阶(ljestvica)

来源:互联网 发布:武汉淘宝摄影基地 编辑:程序博客网 时间:2024/04/29 10:24

音阶(ljestvica/1S/64M)

【题目描述】

Veronica进入了音乐学院。她收到了一张只有音符没有注释的乐谱,需要认出乐谱中用到的音阶。在本题中,我们只用到了两种最常用的(而且也是学校最先教的)音阶:A小调和C大调。这并不是说这两个音阶比其他大调、小调更简单或基础,所有的小调和大调都是差不多的。

 

现代音乐中一个八度有12个音(A, A#, B, C, C#, D, D#, E ,F, F#, G, G#),A小调和C大调也是用这12个音组成。A小调是一组有序的七个音{A,B,C,D,E,F,G},C大调是{C,D,E,F,G,A,B}。

 

注意,这两个音阶用到的音是一样的。那区别在哪?确定一个音阶,重点不仅在用到了什么音,还有他们的用法。主音(一个音阶的第一个音),                                                                                                                                下属音(第四个音),属音(第五个音)在一个音阶中是重音的首选。在A小调中就是A、D、E,在C大调中就是C、F、G。我们把这些音叫main tones。

 

大调和小调有什么不同呢?比方说,A小调的中音(第三个音)比主音高三个半音,C大调的中音比主音高四个半音。总之,差别就在于两个相邻的音的距离。这使小调听起来伤感,大调听起来喜庆。

 

现在你要写一个程序判断这首曲子是用A小调写的还是用C大调写的。可以数在重音(每小节的第一个音)中是A小调的main tones多还是C大调的main tones多。如果main tones数相同,若最后一个音是A小调的main tones,这首曲子就是A小调,否则就是C大调。

 

比如说,现在来判断著名的旋律“你在睡觉吗?”;

CD|EC|CD|EC|EF|G|EF|G|GAGF|EC|GAGF|EC|CG|C|CG|C

字符“|”把每个小节隔开了,所以这个旋律的重音依次是:C,E,C,E,E,G,E,G,G,E,G,E,C,C,C,C。有10个C大调的main tones,6个A小调的main tones,所以这个旋律是C大调的。

 

【输入格式】

输入文件仅一行, 包含一个序列(最短为5, 最长100),每个字母都包含在{“A”, “B”, “C”, “D”, “E”, “F”, “G”, “|”} 中。其中”|” 将每小节分开,且不会出现在序列的开头或结尾。

 

【输出格式】

输出文件仅一行,为” C-dur “(C大调) 或“ A-mol” (A小调)。

 

【输入1】

AEB|C

【输出1】

C-dur

【输入2】

CD|EC|CD|EC|EF|G|EF|G|GAGF|EC|GAGF|EC|CG|C|CG|C

【输出2】

C-dur

【解题思路】

大水题,直接上程序。

#include <cstdio>#include <cstring>#include <iostream>#include <string>using namespace std;string s;char ch;int f1 , f2;bool isA(char ch){if(ch == 'A' || ch == 'D' || ch == 'E') return true;return false;}bool isC(char ch){if(ch == 'C' || ch == 'F' || ch == 'G') return true;return false;}int main(){freopen("ljestvica.in","r",stdin);freopen("ljestvica.out","w",stdout);cin>>s;s = "|" + s;int len = s.length();for(int i=0;i<len;i++)if(s[i] == '|'){ch = s[i+1];if(isA(ch)) f1++;if(isC(ch)) f2++;}ch = s[len-1];if(f1>f2){printf("A-mol");return 0;}if(f2>f1){printf("C-dur");return 0;}if(f1 == f2){if(isA(ch)){printf("A-mol");return 0;}else{printf("C-dur");return 0;}}return 0;}


0 0
原创粉丝点击