在Pascal中转置字符串

时间:2015-06-02 05:11:19

标签: pascal freepascal

我对Pascal很新,还在学习。我必须编写一个代码:

  1. 输入字符串
  2. 将字符串分成两个字符(Snippet)
  3. 使用代码段从数组中获取索引
  4. 将代码段转置为特定值
  5. 如果Index + Transpose大于数组的长度,则不返回任何内容
  6. 如果不是,请将转置后的代码段附加到结果字符串
  7. 返回转置字符串
  8. 我只能写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.
    

1 个答案:

答案 0 :(得分:0)

作为你工作的首选,而不仅仅是用勺子喂答:

索引中包含代码段(注释)的索引。假设笔记是有序的,你需要从它上面的数组位置返回笔记,所以

result := result + melody[iter_index + transposevalue];

在尝试读取数组之前,您需要检查数组的长度,否则它会崩溃(步骤5)。这只是一个if声明。

我不会太担心循环 - 2深度嵌套并不是那么糟糕。如果你想将它分开一点,那么GetTransposedNote(const note:string): string;可以作为新函数拆分。

您可能想要考虑的事情是:

  • 如果您无法在阵列中找到该音符该怎么办?
  • 您想要区分大小写吗
  • 如果输入字符串有奇数个字符怎么办?

尽管如此,你已经离开那里了。