在Pascal中对字符串进行自由转置



我对Pascal很陌生,还在学习很多东西。我必须写一个代码:

  1. 接受字符串
  2. 的输入
  3. 将字符串拆分为两个字符(Snippet)
  4. 使用代码片段从数组
  5. 获取索引
  6. 将代码片段转置为某个值
  7. 如果Index + Transpose大于Array的长度,则不返回
  8. 如果没有,将转置后的代码段追加到结果字符串
  9. 返回调换后的字符串

我只能写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;可以作为一个新函数分开。

你可能需要考虑的事情是:

  • 如果在数组中找不到注释怎么办?
  • 是否需要区分大小写
  • 如果输入字符串有奇数个字符怎么办?

你已经差不多到了。

最新更新