Школоло / Говнокод #20178 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 Small_Diamond, (Updated )

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

  • Неправильно - разделять людей по гендерному признаку, тем более - писать для этого какой-то говнокод.
    Ответить
  • function Test (const Que : String): boolean;
    begin
     if ((c3 in ['A'..'Z']) and (c1 in ['A'..'Z'])) // 'A'..'Z'

    Уже плохо: какие-то глобальные переменные, да ещё и с ни о чём не говорящими названиями.

    Если от этого кода оторваться и вернуться через несколько недель, то Вы уже сами не вспомните, какой фрагмент что делает.

    Вообще рекомендую погуглить материал по теме «сцепление модулей».
    Ответить
  • > Просто скажите говнокод это или нет.
    Следи за руками, Small_Diamond! Свой код ты выложил на сайт govnokod.ru, откуда можно сделать вывод, что твой код - это говнокод. Всё просто!
    Ответить
  • >Исследуя модель танцевального кружка, можно заметить
    >Если приходит больше мальчиков

    >танцевального
    >больше мальчиков

    impossible
    Ответить
    • На самом деле это может быть так. ибо

      1. Мальчики не выбирают сами, а родители не спрашивают (по себе знаю) что хочет чадо, и, если учитывать, сколько идиотов стало вокруг, вполне логично, что всякие вейперы и хипстеры отправляют пацанов в плясуны.

      2. Парни в сознательном возрасте могут идти на балет ради девчонок. Логично, если ты один на 20 баб, то ты в шоколаде, даже если крив и страшен. А потом некоторые втягиваются, и все.
      Ответить
      • Да, забавно будет. Пришел надеясь что будешь один на 20 баб, а по факту пришло больше мальчиков. Ну и делать нечего, втянулся потихоньку, тем более европейские ценности.
        Ответить
        • >будешь один на 20 баб
          Фу хуйня. Даже не матюкнешься.

          В балете гейропейские ценности прижились задолго до того, как у вас стало принято материть европку, но при этом все хорошее привозить оттуда.
          Ответить
          • "Пар на 95% безопаснее дыма, и вообще - законом не запрещено - парю где хочу!"

            Примерно так переводится кудахтанье среднестатистического питуха на русский язык
            Ответить
  • Алгоритмическая сложность удаления сосёт.
    Ответить
  • Перечитайте тред глазами "нормального человека" ©.
    >колготки
    >пидары
    >сосёт
    Ответить
    • Вообще то у тебя очередь одна. Это переменная S.

      procedure TForm1.Button1Click(Sender: TObject);
      var s,a:string; {a - входной поток s - очередь}
      v,z,i:integer; {v - счетчик очереди: 0 - нет очереди, положительное - очередь больших, отрицательное -очередь маленьких z - текущий сивол: -1 маленькая 1 большая i - Index }
      begin
      a:=Edit1.Text;
      s:=a[1];
      if (ord(a[1]) div 97) = 1 then v:=1 else v:=-1;
      for i:=2 to length(a) do
      begin
      if (ord(a[i]) div 97) = 1 then z:=1 else z:=-1;
      memo1.Lines.Add('Очередь : '+s+' '+inttostr(v));
      if v=0 then
      begin
      Memo1.Lines.Add('Очереди нет ');
      v:=v+z;
      s:=a[i];
      end
      else
      if v*z>0 then
      begin
      s:=s+a[i];
      v:=v+z;
      end
      else
      begin
      Memo1.Lines.Add('Пара образована : '+s[1]+'-'+a[i]);
      delete(s,1,1);
      if z=1 then v:=v+1 else v:=v-1;
      end;

      end;
      Memo1.Lines.Add('В очереди остались :'+s);
      end;
      Ответить

Добавить комментарий

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8