问题背景
音乐解释器程序,根据自定义规则将音乐解释成简谱。
代码实现
public class PlayContext
{
public string PlayText { get; set; }
}
public abstract class Expression
{
public void Interpret(PlayContext context)
{
if(context.PlayText.Length == 0)
{
return;
}
else
{
string playKey = context.PlayText.Substring(0, 1);
context.PlayText = context.PlayText.Substring(2);
double playValue = Convert.ToDouble(context.PlayText.Substring(0,context.PlayText.IndexOf(" ")));
context.PlayText = context.PlayText.Substring(context.PlayText.IndexOf(" ") + 1);
Excute(playKey, playValue);
}
}
public abstract void Excute(string key,double value);
}
public class Note:Expression
{
public override void Excute(string key, double value)
{
string note = "";
switch (key)
{
case "C":
note = "1";
break;
case "D":
note = "2";
break;
case "E":
note = "3";
break;
case "F":
note = "4";
break;
case "G":
note = "5";
break;
case "A":
note = "6";
break;
case "B":
note = "7";
break;
}
Console.Write($"{note} ");
}
}
public class Scale : Expression
{
public override void Excute(string key, double value)
{
string scale = "";
switch ((int)(value))
{
case 1:
scale = "低音";
break;
case 2:
scale = "中音";
break;
case 3:
scale = "高音";
break;
}
Console.Write($"{scale} ");
}
}
public class Speed : Expression
{
public override void Excute(string key, double value)
{
string speed;
if(value < 500)
{
speed = "快速";
}
else if (value >= 1000)
{
speed = "慢速";
}
else
{
speed = "中速";
}
Console.Write($"{speed} ");
}
}
internal class Program
{
static void Main(string[] args)
{
PlayContext context = new PlayContext();
Console.WriteLine("上海滩:");
context.PlayText = "T 500 O 2 E 0.5 G 0.5 A 3 E 0.5 G 0.5 D 3 E 0.5 G 0.5 A 0.5 O 3 C 1 O 2 A 0.5 G 1 C 0.5 E 0.5 D 3 ";
Expression expression = null;
try
{
while (context.PlayText.Length > 0)
{
string str = context.PlayText.Substring(0, 1);
switch (str)
{
case "O":
expression = new Scale();
break;
case "T":
expression = new Speed();
break;
case "C":
case "D":
case "E":
case "F":
case "G":
case "A":
case "B":
expression = new Note();
break;
}
expression.Interpret(context);
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}