Dotcpp  >  编程题库  >  蓝桥杯算法训练VIP-A Major Problem
题目 2094:

蓝桥杯算法训练VIP-A Major Problem

时间限制: 3s 内存限制: 192MB 提交: 15 解决: 0

题目描述

在西方音乐中,用大写字母A到G来表示在乐谱中被使用的12个音符,它们后面可能连有升调符号“#”和降调符号“b”,而且如下面展示的那样循环排列。斜杠用来描述相同音符。
C/B# C#/Db D D#/Eb E/Fb F/E# F#/Gb G G#/Ab A A#/Bb B/Cb C/B# …
上表中任意两个相邻音符构成一个半音。恰被一个音符隔开的两个音符构成一个全音。一个大调音阶由八个音符组成。它由上述之一的音符开始并且紧跟着连续的“全音-全音-半音-全音-全音-全音-半音”。分别由C和Db开始的两个大调音阶,将由下面的音符组成:
C D E F G A B C
Db Eb F Gb Ab Bb C Db
下面的规则同样适用于大调音阶:
1. A到G的每个字母将在音阶中出现恰好一次,同时第一个字母将例外地在音阶最后重复出现一次。
2. 音阶当中不允许同时出现升调或降调记号。

大调音阶的首个音符被认为是这个音阶的曲调。比方说,上面的两个音阶分别是C和Db大调音阶。更换两个音阶的音符就是交换对应位置的音符那么简单。举个例子,C大调音阶中的F会和Db大调音阶中的Gb交换因为它们在各自音阶中的位置相同。
你需要写一个程序,在不同音阶中交换音符。

输入格式

输入包含多组数据,每行一组。每行开头是一个源曲调,紧跟着一个目标曲调,接下来是一串需要从源曲调大调音阶交换至目标曲调大调音阶的音符。每行由单个星号结束。每行中的音符和星号都由单个空格隔开。

输入的最后一行只包含一个星号,并不作为测试数据。

数据组数不超过100组并且保证输入音符合法。

输出格式

每组测试数据可能对应一行或多行输出。如果源调和目标调都是有效的,那么输出的第一行应该是“Transposing from X to Y:”,X代表源调,Y代表目标调。假如源调或者目标调中有一个是无效的,那么输出“Key of X/Y is not a valid major key”,X/Y表示无效的曲调,改行剩下的输入将被忽略。假如两者皆无效,只需输出源调。
对于包含了有效的源调和目标调的数据,在第一行的输出后,每个被交换的音符都对应一行输出。假如输入的音符在源调的大调音阶中是个有效音符,那么输出“M transposes to N”,M表示源调中的音符,N是目标调中对应位置的音符。假如输入的音符在源大调音阶中无效,那么输出“M is not a valid note in the X major scale”,M代表输入音符,X代表源音调。不管是有效还是无效音符,都要保持一致的缩进格式。
各组数据的输出之间应该用一个空行隔开。你的输出格式应该要和下面的标准输出相同。

输入和输出的标准格式请参考未格式化的试题。

样例输入

C Db F *
Db C Gb *
C B# A B *
C D A A# B Bb C *
A# Bb C *
*

样例输出

Transposing from C to Db:
F transposes to Gb
Transposing from Db to C:
Gb transposes to F
Key of B# is not a valid major key
Transposing from C to D:
A transposes to B
A# is not a valid note in the C major scale
B transposes to C#
Bb is not a valid note in the C major scale
C transposes to D
Key of A# is not a valid major key

提示

零基础的同学可以先学习基础,教程见:  C语言教程C++教程编译器教程数据结构教程Python教程单片机教程

视频教学见视频网课

标签