§ Предисловие к 2898423-му изданию

Для маминых программистов возрастом от 7 до 8 лет (я у мамы — программист!). Москва. ЭнергоАтомИздат, 1991 г.
Данный текст был получен путем анализа Древнего Учения, записанного в Станцах Дзиан (или Дхиан, Джианн — от санкритского слова "Знание", а знание — это сила, как известно).

§ Сборник советов

ГЛАВА 0. СТИЛЬ НАПИСАНИЯ ПРОГРАММ
  • 00. При написании программы используй семь или более управляющих конструкции, изменяющих естественный ход выполнения операторов: 1) цикл "пока", 2) альтернативу, 3) множественное ветвление, 4) цикл "до", 5) цикл с параметром, 6) вызов процедуры, 7) переход к метке;
  • 01. Структурируя алгоритмы и программы, пользуйся двумя методами: дублированием и использованием признака;
  • 02. При оформлении программы не пренебрегай графическими, цветовыми и иными способами выделения структуры алгоритма;
  • 03. Формируя в программе функциональный блок, ограниченный прямоугольными рамками, следи, чтобы у него был только один вход и только один выход;
  • 04. Изменив параметр цикла, можно досрочно выйти из него;
  • 05. Если ты затеял цикл с параметром, то умри, но выполни его до конца;
  • 06. Никогда не используй значение параметра цикла по выходе из него;
  • 07. Досрочно прервать программу можно, запрограммировав на одном плече альтернативы аварийную ситуацию;
  • 08. При инициализации цикла сделай так, чтобы операции обнуления сумматоров и другие оказались внутри цикла;
  • 09. Вписывай программы в структурные диаграммы. Это позволяет выделить алгоритм, освободив его от синтаксической оболочки конкретного языка;
  • 0A. Не пытайся усомниться в основной структурной теореме — она верна;
  • 0B. Ради дела можно отказаться даже от самых модных концепции программирования;
  • 0C. Структуру программы можно подчеркивать неструктурными средствами;
  • 0D. Во избежания меток в программе заменяй полную альтернативу на две неполные;
  • 0E. При особом желаний из программы можно убрать все альтернативы, будь они полные или неполные;
  • 0F. Можно ли сыграть на скрипке одной струной? Да, можно.
ГЛАВА 1. ДИАЛОГ С КОМПЬЮТЕРОМ
  • 10. Перед выводом информации очищай дисплей;
  • 11. Дублируй ввод значений важных переменных;
  • 12. На вкус и цвет товарищей нет. Но приемы удобного и быстрого ввода списков в память ЭВМ товарищу порекомендовать можно;
  • 13. Фиксируй минимальное и максимальное значение элементов вводимого числового массива;
  • 14. Не балуй машину! Не делай за нее то, что она прекрасно может сделать и без тебя;
  • 15. Давай пользователю оперативную возможность исправления ошибок;
  • 16. Приучай пользователя твоей программы к некоторым условным символам в общении с машиной;
  • 17. Не требуй от пользователя каких-то условных символов при ответе, — сделай машину более гибкой и понятливой;
  • 18. Не оговаривай форму ответа человека какими-то условиями;
  • 19. Если тебе приходится просматривать на дисплее периодически появляющуюся информацию, то сделай так, чтобы машина оглашала звуковым сигналом или мелодией их очередное появление;
  • 1A. Пользуйся двумя способами задержки вывода информации на дисплей;
  • 1B. Заблокировать клавиши клавиатуры можно не только программными, но и аппаратными средствами;
  • 1C. Не всегда дублируй нажатие клавиши клавиатуры печатью соответствующего символа на экране дисплея;
  • 1D. При работе с магнитофоном как с архивной памятью вставляй в программу операторы печати, приказывающие пользователю нажать ту или иную кнопку магнитофона;
  • 1E. В программы необходимо вносить участки защиты не только от "дураков", но и от шутников;
  • 1F. "Клиент всегда прав". Напиши лозунг, стоящий в названии совета, и повесь его в помещении, где ты создаешь программные продукты;
ГЛАВА 2. ОТЛАДКА ПРОГРАММЫ
  • 20. Имей в программе данные для контрольной прогонки;
  • 21. Вставляй в итерационные участки операторы печати, выводящие на дисплей значения достигнутой точности, параметров цикла и др.;
  • 22. При необходимости узнать, что произойдет, если из программы убрать оператор, его нет нужды совсем вымарывать из текста. Достаточно его просто "лишить прав состояния", поставив перед ним REM. Если потом это слово убрать, то оператор восстановится;
  • 23. Широко пользуйся штатными средствами ЭВМ при отладке программы на ней;
  • 24. Прежде чем передавать заказчику программу оптимизации, проверь ее на функциях, специально выдуманных для этого случая;
  • 25. Помечай особым образом места в программе, требующей дальнейшей доработки;
  • 26. При тестировании программ сортировки "подсовывай" машине массив, где есть как минимум два равных элемента;
  • 27. Программе можно сделать "прививку" от аварийного останова;
  • 28. Ошибок лучше вообще не допускать. Тогда не нужна будет и отладка. Разбивай поэтому длинную формулу на части и записывай ее в программу несколькими операторами присвоения;
  • 29. Переведи незаметно компьютер, например, с градусов на радианы и посмотри, что из этого получится;
  • 2A. При отладке программы или при повторном ее использовании бывает полезно запустить ее не с самого начала;
  • 2B. Не жалей скобок в алгебраическом выражении;
  • 2C. Перевод программы с одного диалекта языка на другой — одна из самых трудных, но нужных отладочных операции;
  • 2D. При наличии желания и времени можно провести супериспытание разработанной программы с проверкой правильности абсолютно всех выдаваемых ею результатов;
  • 2E. Чтобы отладить программу, нужно в ней наделать новых ошибок: "Клин клином вышибают";
  • 2F. Можно ли отладить программу на слух?
ГЛАВА 3. ОПТИМИЗАЦИЯ ПРОГРАММ
  • 30. Быстродействие и ясность программы — вещи, как правило, взаимносвязанные, поэтому подумай, прежде чем оптимизировать программу;
  • 31. Не делай многократно то, что можно сделать всего один раз;
  • 32. Вкладывай циклы так, чтобы они выполнялись за минимальное время;
  • 33. Избегай индексных переменных;
  • 34. Замена возведения в целую степень на произведение ускоряет расчет не всегда;
  • 35. Перестановка мест слагаемых меняет сумму;
  • 36. Перестановка мест сомножителей меняет произведение;
  • 37. Не увлекайся знаками логических выражении. Такое увлечение чревато потерей быстродействия помимо тех неприятностей, о котором было сказано в предыдущем совете;
  • 38. Делай так, чтобы компьютер не простаивал, когда ты изучаешь информацию на дисплее;
  • 39. Умело пользуйся буферной памятью принтера;
  • 3A. Не гоняй дисковод попусту;
  • 3B. Есть много факторов, влияющих на выбор места подпрограммы в программе;
  • 3C. "Поколдуй" над программой — и затраченное время вернется тебе сторицей;
  • 3D. Доверяй, но проверяй;
  • 3E. Внедряй на производстве энергосберегающие технологии;
  • 3F. Не спеши решать задачу, подожди, — может быть появится язык или программная среда, где она решается оптимальным способом одним оператором;
ГЛАВА 4. ПСИХОЛОГИЯ ПРОГРАММИРОВАНИЯ
  • 40. Утро вечера мудреней;
  • 41. Еще одно преимущество простого алгоритма;
  • 42. Не допусти, чтобы у тебя на работе отобрали ПК;
  • 43. Предупреждай о выполнении машиной необратимых операции;
  • 44. Не злоупотребляй принципом умолчания;
  • 45. Иногда стоит так написать программу, чтобы в ней долго никто не смог разобраться;
  • 46. Любопытство — не порок, а метод исследования;
  • 47. Проруби в своем дисплее еще одно окно в мир программирования;
  • 48. На ошибках не только учатся, но и строят алгоритмы;
  • 49. Умей видеть в пустяковой на первый взгляд программе возможную практическую пользу;
  • 4A. Если есть искусство ради программирования, то должно быть и программирование ради программирования;
  • 4B. Пиши программу так, чтобы ее авторство было видно и без указания на составителя программы;
  • 4C. Ищи у классиков темы для программирования;
  • 4D. Если не знаешь, как поступить в трудной жизненной ситуации, то смоделируй ее на компьютере;
  • 4E. Компьютер планирует выпуск себе подобных, рассказ плановика;
  • 4F. Часто бывает полезно получить от ЭВМ простыню-распечатку результатов и поразмышлять над ней в тиши, вдали от машины;
ГЛАВА 5. ЧТО В ИМЕНИ ТЕБЕ МОЕМ
  • 50. Дав файлам удачные имена, можно создать базу данных с удобными средствами записи, поиска и исправления;
  • 51. Стоит в программе изменить несколько констант — и ей может найтись новое применение;
  • 52. Нет ничего тайного, что не стало бы явным;
  • 53. Если в клетке со львом удивишь "Буйвол" — не верь глазам своим. К. Прутков;
  • 54. Используй предыдущий совет о длинных именах переменных с осторожностью;
  • 55. Далеко не любое слово может быть идентификатором;
  • 56. Помни не только имя переменной, но и ее фамилию, т.е. тип;
  • 57. Скупой платит дважды;
  • 58. Умный может совсем не заплатить;
  • 59. Переменная двойной точности;
  • 5A. Некоторым переменным стоит давать не имена, а прозвища;
  • 5B. Нужно помнить не только имя переменной, но и свое собственное;
  • 5C. Храни информацию о файлах диска на самом диске в главном файле;
  • 5D. Создавая программу, помни об уровне компьютерной грамотности пользователя;
  • 5E. Хорошо, если переменная помнит не только то, что в нее записали, но и имя соседки;
  • 5F. Периодически обновляй записи на внешнем носителе;
ГЛАВА 6. ЛИСТИНГ И ПРОТОКОЛ
  • 60. Имей при необходимости два варианта программы — рабочий и демонстрационный;
  • 61. Двойная печать;
  • 62. Выделение ключевых слов;
  • 63. Что еще можно выделить в программе;
  • 64. Лучший комментарий программы на незнакомом языке — это программа на знакомом языке;
  • 65. Можно без всякого комментария выразить сущность программы ее формой;
  • 66. Как бог на душу положит;
  • 67. Иногда целесообразно чтобы программа распечатывала ну если не всю себя, то хотя бы частично;
  • 68. Делай так, чтобы было ясно видно, что у тебя записано в блоке данных;
  • 69. Если уж у тебя нет принтера, то сделай так, чтобы владельцы принтера завидовали тебе хоть в малом;
  • 6A. Используй разные шрифты для большей выразительности твердых копии;
  • 6B. Заменяй по возможности вывод результатов расчета в виде таблиц на графики, диаграммы, гистограммы и прочее;
  • 6C. Не стреляй из пушки по воробьям;
  • 6D. Корми пользователя с ложечки;
  • 6E. Есть два способа снятия копии твердых копии с экрана дисплея;
  • 6F. Выжимай из программы все, что она может дать;
ГЛАВА 7. РАЗНОЕ
  • 70. Копеечным шилом можно удвоить емкость архивной памяти;
  • 71. Если у тебя нет графических операторов — будь ими;
  • 72. Матричный принтер можно заправить и бумажным полотенцем;
  • 73. Переименовывай клавиши при перепрограммировании их функции;
  • 74. Будь любопытен;
  • 75. Не пользуйся советом 74;
  • 76. Нужна ли ЭВМ педаль? Нужна. И не только педаль, но и другие устройства сенсорной информации помимо клавиатуры;
  • 77. Как включают периферию;
  • 78. Береженого бог бережет;
  • 79. Старайся, чтобы программа в ОЗУ и ее копия на внешнем носителе как можно меньше отличались друг от друга;
  • 7A. Не делай переходов к строкам с одной ремаркой и не выкидывай ремарки при вводе в ЭВМ чужой программы;
  • 7B. Есть единственный способ узнать, персональный ли у тебя компьютер или это терминал большой машины;
  • 7C. При замере интервалов времени иногда можно обойтись и без встроенных часов компьютера;
  • 7D. Два способа тасовки карт;
  • 7E. Как принимают решения с помощью ЭВМ;
  • 7F. Timeo Danaos et dona ferentos!

§ Игра Пасьянс: Турецкий Платок

Были времена, когда я не мог своими собственными пальцами набрать эту программу на Бейсике по той причине, что я не мог ее набрать из-за того, что у меня компа не было. Но сейчас то я могу и сделаю. Так что пришло время! Но я модифицировал эту программу.
1COLOR 0, 7
2CLS
3RANDOMIZE TIMER
4
5H = 0
6M = 4
7K = 13
8
9DIM M$(M), K$(K), B$(5, 9), N(9), K(M * K), J(1)
10DATA 50,51,52,53,54,55,56,57,88,66,68,75,65
11DATA 3,4,5,6
12
13PRINT "Turkish scarf. Press column number (0-9) or S-STOP"
14PRINT
15
16FOR I = 1 TO K: READ A: K$(I) = CHR$(A): NEXT
17FOR I = 1 TO M: READ A: M$(I) = CHR$(A): NEXT
18
19' Count cards in stack
20FOR J = 0 TO 9
21  PRINT " "; J;
22  IF J <= 1 THEN N(J) = 5 ELSE N(J) = 4
23NEXT
24
25' Show Trumana
26PRINT
27FOR I = 0 TO 5
28  FOR J = 0 TO 9
29
30    ' Select next random card and make it busy
31    DO: V = 1 + INT(M * K * RND(1)): LOOP UNTIL K(V) = 0: K(V) = 1
32
33    N = INT(V - K * INT((V - 1) / K))
34    B$(I, J) = K$(N)
35    PRINT "  "; K$(N); M$(1 + INT((V - 1) / K));
36
37    ' Exit from 52-nd card
38    IF I = 5 AND J = 1 THEN J = 9
39
40  NEXT
41  PRINT
42NEXT
43
44' GAME MODE: On
45' -------------
46
47DO
48
49  DO
50
51    PLAY "L16 BC"
52
53    ' Select two card
54    FOR I = 0 TO 1
55
56      DO
57
58        DO: A$ = INKEY$: LOOP UNTIL A$ = "S" OR A$ = "s" OR A$ >= "0" AND A$ <= "9":
59        J(I) = VAL(A$)
60        IF A$ = "S" OR A$ = "s" THEN LOCATE 13, 37: PRINT "Game Over": PLAY "CDEFGAB": END
61
62        ' Arrow selected row
63        LOCATE N(J(I)) + 5, 3 + J(I) * 4: PRINT CHR$(24);
64
65      LOOP WHILE N(J(I)) = -1
66
67    NEXT
68
69    ' Clear arrow
70    FOR I = 0 TO 1: LOCATE N(J(I)) + 5, 4 * J(I) + 3: PRINT " ": NEXT
71
72  ' Cards not must be one suit or different value
73  LOOP WHILE J(0) = J(1) OR B$(N(J(0)), J(0)) <> B$(N(J(1)), J(1))
74
75  ' Delete cards
76  FOR I = 0 TO 1
77
78    LOCATE N(J(I)) + 4, 4 * J(I) + 2: PRINT "    "
79    N(J(I)) = N(J(I)) - 1
80
81  NEXT
82
83  H = H + 2
84  LOCATE 11, 1: PRINT USING "Getted ## cards"; H: PLAY "CDCD"
85
86LOOP UNTIL H = 52
87
88' Turkish Rondo: Gangsta V.MOZART
89' -------------------------------
90PLAY "T120 ML L16 O2 BAG#A>C4 DC<B>CE4"
91PLAY "O3 FED#EBAG#ABAG#A>C4 L8 AB>C<BAG#AEFDC4<B4A4"
92PLAY "O3 AB>C#4<AB>C#<BAG#F#G#ABG#EAB>C#4<AB>C#<BAG#F#BG#EA.P16"
93PLAY "O3 AB>C#4<AB>C#<BAG#F#G#ABG#EAB>C#4<AB>C#<BAG#F#BG#EA4"
Snimok_ekrana_2024-05-09_11-13-49.png