1. Список говнокодов пользователя Small_Diamond

    Всего: 1

  2. Pascal / Говнокод #20178

    −42

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    96. 96
    //Просто скажите говнокод это или нет. Сильно не пинать, я ток учусь программировать. Нужно адекватное мнение 
    //По идее я правильно решил?
    //Вот условие задачи:
    //
    {
    А) Исследуя модель танцевального кружка, можно заметить, что в любой
    момент одна из двух очередей обязательно пуста. В самом деле, если приходит
    больше мальчиков, то будет пуста девчоночья очередь и наоборот. Можно ли
    обойтись одной очередью? Придумайте, как это сделать.
    
    Подсказка: добавьте функцию для тестирования очереди с тем, чтобы
    выяснить, не пуста ли она. И, если не пуста, то кто томится в ней — мальчик или
    девочка? Эта функция не должна изменять состояние очереди.}
    //Вот моё решение:
    uses Crt;
    var
     S_IN : String; 	//Stream In
     S_OUT : String; 	//Stream Out
     b : boolean;           //Lenth = 0 or no?
     S : String;            //Boys and Girls
     c1, c2, c3 : char;		//Symbols: first and second
     i : Integer; 		//Index in input stream
    //Кто томится в очереди, мальчик или девочка?
    function EmptyQue (var Que : String; var boy_or_girl : char) : boolean;
    begin
     if Length (Que) = 0 then EmptyQue:=false
     else
     begin
      boy_or_girl:=Que[1];
      EmptyQue:=true;
     end;
    end;
    //Постановка символа arg в очередь Que
    procedure PutInQue (var Que : String; arg : char);
    begin
     Que:=Que+arg;
    end;
    //Являются ли первый символ в очереди и текущий одинакового регистра
    function Test (const Que : String): boolean;
    begin
     if ((c3 in ['A'..'Z']) and (c1 in ['A'..'Z'])) // 'A'..'Z'
        or
        ((c3 in ['a'..'z']) and (c1 in ['a'..'z'])) //'a'..'z'
     then
      Test:=true
     else
     Test:=false;
    end;
    //Извлечь из очереди
    function GetFromQue (var Que : String; var arg : char) : boolean;
    var
     b : boolean;
    begin
     b:=Test (Que);                 //Если первый в очереди и текущий, мальчик или
     if b then GetFromQue:=false    //девочка, то идем дальше, пару не составляем
     else
     begin
      GetFromQue:=true;
      arg:=Que[1];
      Delete (Que,1,1);
     end;
    end;
    begin
     ClrScr;
     S_IN:='ZHJKqwertASDyuiopQWERTYUIOPasdf';
     S_OUT:='';
     c3:=#0;
     S:='';
     for i:=1 to Length (S_IN) do
     begin
      c1:=S_IN[i];
      b:=EmptyQue (S,c3);
      if b then begin
       if c1 in ['A'..'Z'] then begin
        if GetFromQue (S,c2) then S_OUT:=S_OUT+c1+c2+' '
        else
        PutInQue (S,c1);
       end
       else
       begin
        if GetFromQue (S,c2) then S_OUT:=S_OUT+c2+c1+' '
        else
        PutInQue (S,c1);
       end;
      end
      else
      PutInQue (S,c1);
     end;
     Writeln ('Входной поток: ');
     Writeln (S_IN);
     Writeln ('Выходной поток: ');
     Writeln (S_OUT);
     Writeln ('В очереди остались:');
     Writeln (S);
     Readln;
    end.

    Хочу узнать мнение других людей. Наговнокодил ли я или нет, пока решал задачу (задача из книги по программированию "Песни о Паскале"). Короче дана входная строка, состоящая из маленьких и больших латинских букв (большие - мальчики, маленькие - девочки). Есть две очереди Boys и Girls. Если текущий символ (это в цикле) мальчик, то достаем девочку, иначе - достаем мальчика.
    :
    ...
    for i:=1 to Length(S_IN) do begin
    c1:= S_IN[i]; { выбираем из входного потока }
    if c1 in ['A'..'Z']
    then begin { если это мальчик...}
    { если в очереди есть девочка }
    if GetFromQue(Girls, c2)
    { добавляем пару в выходной поток }
    then S_OUT:= S_OUT+c1+c2+’ ’
    { а иначе помещаем мальчика в очередь }
    else PutInQue(Boys, c1);
    end
    else begin { а если это девочка...}
    { если в очереди есть мальчик }
    if GetFromQue(Boys, c2)
    { добавляем пару в выходной поток }
    then S_OUT:= S_OUT+c2+c1+’ ’
    { а иначе помещаем девочку в очередь }
    else PutInQue(Girls, c1);
    end
    end;
    ...
    Теперь необходимо всё делать в одной очереди (а не Boys и Girls)

    Small_Diamond, 11 Июня 2016

    Комментарии (48)