我对Pascal很陌生,还在学习很多东西。我必须写一个代码:
- 接受字符串 的输入
- 将字符串拆分为两个字符(Snippet)
- 使用代码片段从数组 获取索引
- 将代码片段转置为某个值
- 如果Index + Transpose大于Array的长度,则不返回
- 如果没有,将转置后的代码段追加到结果字符串
- 返回调换后的字符串
我只能写1到3,其余的对我来说还是很模糊。感谢帮助。
(我也想改进它没有许多for
循环。任何想法?)
program TransposeString;
var
melody : Array[1..24] of String[2] = ('c.', 'c#', 'd.', 'd#', 'e.', 'f.', 'f#', 'g.', 'g#', 'a.', 'a#', 'b.', 'C.', 'C#', 'D.', 'D#', 'E.', 'F.', 'F#', 'G.', 'G#', 'A.', 'A#', 'B.');
songstring, transposedstring : String;
transposevalue : byte;
function Transpose(song : String; transposevalue : byte): String;
var
songsnippet : String[2];
iter_song, iter_index, index : byte;
begin
for iter_song := 1 to length(song) do
begin
if iter_song mod 2 = 0 then continue;
songsnippet := song[iter_song] + song[iter_song + 1]; //Split the string into 2 characters each
for iter_index := 1 to 24 do
begin
if melody[iter_index] = songsnippet then
begin
index := iter_index; //Get Index
break;
end;
end;
//Check Transpose + Index
//Transpose Snippet
//Append Snippet to Result String
end;
end;
begin
readln(songstring);
readln(transposevalue);
transposedstring := transpose(songstring, transposevalue);
writeln(transposedstring);
end.
作为你工作的开始,而不仅仅是填鸭式的回答:
在index中有代码片段的索引(注释)。假设音符是有序的,您需要从它上面的数组位置返回音符,因此
result := result + melody[iter_index + transposevalue];
你需要检查数组的长度之前试图从它读取,否则它会崩溃(步骤5)。这只是一个if
语句。
我不会太担心for循环- 2深度嵌套并不是那么糟糕。如果你想把它分开一点,那么GetTransposedNote(const note:string): string;
可以作为一个新函数分开。
你可能需要考虑的事情是:
- 如果在数组中找不到注释怎么办?
- 是否需要区分大小写
- 如果输入字符串有奇数个字符怎么办?
你已经差不多到了。