1. VisualBasic / Говнокод #3433

    −86

    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
    97. 97
    98. 98
    99. 99
    10 GOSUB 300
    30 INPUT "Долгота (град)";B5,L5: INPUT "Часовая зона (час)";H
    50 L5=L5/360: Z0=H/24
    60 GOSUB 1170: T=(J-2451545)+F
    70 TT=T/36525+1: ' TT = столетия, начиная с 1900.0
    90 GOSUB 410: T=T+Z0
    120 GOSUB 910: A(1)=A5: D(1)=D5 '  Получаем положение солнца
    130 T=T+1
    140 GOSUB 910: A(2)=A5: D(2)=D5
    150 IF A(2)<A(1) THEN A(2)=A(2)+P2
    160 Z1=DR*90.833: ' Вычисление зенита
    170 S=SIN(B5*DR): C=COS(B5*DR)
    180 Z=COS(Z1): M8=0: W8=0: PRINT
    190 A0=A(1): D0=D(1)
    200 DA=A(2)-A(1): DD=D(2)-D(1)
    210 FOR C0=0 TO 23
    220 P=(C0+1)/24
    230 A2=A(1)+P*DA: D2=D(1)+P*DD
    240 GOSUB 490
    250 A0=A2: D0=D2: V0=V2
    260 NEXT
    270 GOSUB 820: ' Вывод информации
    280 END
    300 DIM A(2),D(2)      ' Константы
    320 P1=3.14159265: P2=2*P1: DR=P1/180: K1=15*DR*1.0027379: S$="Заход солнца в "
    330 R$="Восход солнца в ": M1$="В этот день солнце не восходит"     
    370 M2$="В этот день солнце не заходит": M3$="Солнце заходит весь день"           
    390 M4$="Солнце восходит весь день"          
    400 RETURN                                   
    410 T0=T/36525 '     Получение часового пояса
    430 S=24110.5+8640184.813*T0
    440 S=S+86636.6*Z0+86400*L5
    450 S=S/86400: S=S-INT(S)
    460 T0=S*360*DR
    470 RETURN
    490 L0=T0+C0*K1: L2=L0+K1  '  Просматриваем возможные события на полученный час
    510 H0=L0-A0: H2=L2-A2
    520 H1=(H2+H0)/2: '  Часовой угол,
    530 D1=(D2+D0)/2: '  наклон в получасе
    550 IF C0>0 THEN 570
    560 V0=S*SIN(D0)+C*COS(D0)*COS(H0)-Z
    570 V2=S*SIN(D2)+C*COS(D2)*COS(H2)-Z
    580 IF SGN(V0)=SGN(V2) THEN 800
    590 V1=S*SIN(D1)+C*COS(D1)*COS(H1)-Z
    600 A=2*V2-4*V1+2*V0: B=4*V1-3*V0-V2
    610 D=B*B-4*A*V0: IF D<0 THEN 800
    620 D=SQR(D)
    630 IF V0<0 AND V2>0 THEN PRINT R$;
    640 IF V0<0 AND V2>0 THEN M8=1
    650 IF V0>0 AND V2<0 THEN PRINT S$;
    660 IF V0>0 AND V2<0 THEN W8=1
    670 E=(-B+D)/(2*A)
    680 IF E>1 OR E<0 THEN E=(-B-D)/(2*A)
    690 T3=C0+E+1/120: ' Округление
    700 H3=INT(T3): M3=INT((T3-H3)*60)
    710 PRINT USING "##:##";H3;M3;
    720 H7=H0+E*(H2-H0)
    730 N7=-COS(D1)*SIN(H7)
    740 D7=C*SIN(D1)-S*COS(D1)*COS(H7)
    750 AZ=ATN(N7/D7)/DR
    760 IF D7<0 THEN AZ=AZ+180
    770 IF AZ<0 THEN AZ=AZ+360
    780 IF AZ>360 THEN AZ=AZ-360
    790 PRINT USING ",  азимут ###.#";AZ
    800 RETURN
    820 IF M8=0 AND W8=0 THEN 870 ' Процедура вывода информации
    840 IF M8=0 THEN PRINT M1$
    850 IF W8=0 THEN PRINT M2$
    860 GOTO 890
    870 IF V2<0 THEN PRINT M3$
    880 IF V2>0 THEN PRINT M4$
    890 RETURN
    910 L=.779072+.00273790931*T ' Фундаментальные константы (Van Flandern & Pulkkinen, 1979)
    950 G=.993126+.0027377785*T
    960 L=L-INT(L): G=G-INT(G): L=L*P2: G=G*P2
    980 V=.39785*SIN(L): V=V-.01000*SIN(L-G)
    1000 V=V+.00333*SIN(L+G): V=V-.00021*TT*SIN(L)
    1020 U=1-.03349*COS(G): U=U-.00014*COS(2*L)
    1040 U=U+.00008*COS(L): W=-.00010-.04129*SIN(2*L)
    1060 W=W+.03211*SIN(G): W=W+.00104*SIN(2*L-G)
    1080 W=W-.00035*SIN(2*L+G): W=W-.00008*TT*SIN(G)
    1120 S=W/SQR(U-V*V) '    Вычисление солнечных координат
    1130 A5=L+ATN(S/SQR(1-S*S))
    1140 S=V/SQR(U):D5=ATN(S/SQR(1-S*S))
    1150 R5=1.00021*SQR(U)
    1160 RETURN
    1170 INPUT "Год, Месяц, День";Y,M,D ' Календарь --> JD
    1190 G=1: IF Y<1583 THEN G=0
    1200 D1=INT(D): F=D-D1-.5
    1210 J=-INT(7*(INT((M+9)/12)+Y)/4)
    1220 IF G=0 THEN 1260
    1230 S=SGN(M-9): A=ABS(M-9)
    1240 J3=INT(Y+S*INT(A/7))
    1250 J3=-INT((INT(J3/100)+1)*3/4)
    1260 J=J+INT(275*M/9)+D1+G*J3
    1270 J=J+1721027+2*G+367*Y
    1280 IF F>=0 THEN 1300
    1290 F=F+1: J=J-1
    1300 RETURN

    Вот такой вот реликт. Вы всё ещё пользуетесь GOTO? Тогда мы идём к вам.
    Программа вычисляет время восхода и захода солнца по дате (с точностью до минуты) в пределах нескольких текущих столетий. Производит корректировку, если географическая точка находится в арктичиском или антарктическом регионе, где заход или восход солнца на текущую дату может не состояться. Вводимые данные: положительная северная широта и отрицательная западная долгота. Часовой пояс указывается относительно Гринвича (например, 5 для EST и 4 для EDT). Алгоритм обсуждался в "Sky & Telescope" за август 1994, страница 84.
    P. S. VisualBasic такой Visual...

    Запостил: Stalker, 10 Июня 2010

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

    • Понимаю, конечно, несовершенство языка и всё такое, но... Страшно.
      Ответить
    • и где тут VB, совсем не видно его, обычный Basic.
      Ответить
      • А где тут С++? ;))
        Да в курсе я, просто нету в списке обычного Васика.
        Ответить
      • я и сам когда-то на таком писал и нормально...
        GoSubы там всякие и GoTo - это вынужденная необходмость поскольку whileов нету и нормальных процедур тоже.
        если вы присмотритесь сильно попахивает асмом
        это из=за того что на спектумах был асм и более удобная для программирования версия - бейсик
        Ответить
        • Не знай, я писал на спектруме с использованием Tasm, ZXAsm, Alasm и не напрягался:-) Всяко круче бейскика.
          Ответить
          • Насколько мне известно, под спектрум были компиляторы Си, Паскаля, Форта и даже Лиспа.
            Ответить
            • Но быстрое на них было нереально написать, а асм все позволял не заморачиваясь делать. Да и видели бы вы эти компиляторы, это ж какой-то тихий ужас для программок уровня Hello, World!
              Ответить
              • а не пиздишь? что же такого ужасного в хеловорде на сях? это вообще-то на фанатизм смахивает
                Ответить
        • используя goto, gosub таки можно писать простой и понятный код - дисциплина в программировании позволит писать не хуже чем на нормальном процедурном языке

          используя современный ООП язык с поддержкой всего чего надо таки можно писать еще непонятнее.
          Ответить
          • ИМХО, вы абсолютно правы
            там по-моему можно было делать именнованые GoSubы,
            как-то так GoSub Calc
            правда жаль работы со стеком не было - приходилось через массивы рекурсию делать 0_o
            тут асм бесспорно лучше
            Ответить
    • Алгоритмы из книжек в виде кода выглядят как-то особенно хуёво.
      Ответить
    • вах, спасибо, поностальгировал... Сразу вспомнились журналы "Радио", "Ваш компьютер" с программами на Бейсике для Спекки. Кстати, там было чудо: игра "Искатель алмазов" длиной в пару тысяч строк, причем публиковали по куску кода в разделе - каждый месяц вводишь вручную очередную порцию )))
      Ответить
      • блин ))
        вспомнилось как в каком-то журнале тех лет видел запостили исполняемый файл под x86 в HEX кодах :D
        Ответить
        • они настолько стеснялись кода, что решили его не показывать) поэтому и в hex кодах.
          Ответить
        • а это часто было. нужно было в хекс едиторе набирать и сравнивать контрольные суммы строк
          Ответить
      • Та-а-а-к! Теперь у меня есть список олдфагов:)
        Ответить
    • Код типа такого можно запустить на советских калькуляторах типа Электроника МК85
      Ответить
      • И кстати, на том же МК85, с помощью одного хака, можно было писать код на ассемблере PDP - скорость работы была на много быстрее..
        Ответить
    • Ууу... Да тут старики одни :)
      (Не являюсь оным)
      Ответить
    • Я писал на басике в 6 лет на таком девайсе: http://rasterweb.net/raster/computers/images/vtech.jpg

      precomputer 1000.

      Я не шучу
      Ответить
      • блин. это первый комп который я увидел у друга!!))
        он говорил на нем можно играть но я не верил..(по моему во второй класс только пошел)
        Ответить
      • и еще игры вроде говорил можно делать, а еще у него в комнате какашками пахло)) это случайно не ты был?))
        Ответить
        • как друга-то звали?
          Ответить
          • блин я непомню =( оч давно было. я к нему один раз всего ходил. жил в сосновом бору.
            Ответить
            • нет, в сосновом бору я не жил. я жил рядом с парком "сосновка")
              и не помню, что б так уж пахло
              Ответить
    • 860 GOTO 890
      890 RETURN
      Говнокод тут, да?
      Ответить
      • в самом начале

        > 10 GOSUB 300

        это круто, да.
        Ответить
        • Выполнение начинается с вызова подпрограммы, чё такого.
          Ответить
          • Кстати, все и сейчас так делают.
            Ответить
    • Я как-то видел компилятор квикбейсика на квикбейсике (единственный сурьёзный проект на квикбейсике, который видел), там такое было спагетти из готто... Не верится, что человек писал, сгенеренно должно быть
      Ответить
    • > за август 1994

      давно с++ изобретён, а они...
      Ответить

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