Аннотация: Особое мышление программиста... Попробуйте решить известную грустную задачу про человеческую природу с арахисовым полем, пятью братьями и обезьяной - в стиле программиста. Или идентифицировать десятичные цифры по ключу: donald + jerald = robert
Леон Коваль
Быть дедом ... блок-схемного программирования
Это - последний пока текст из серии "Быть дедом". Названия и адреса трех предыдущих указаны ниже. Все тексты серии связаны между собой и с предметом программирования - для школьников, их дедов и бабуль.
Кроме всего прочего я пытаюсь найти аудиторию для книжки "Введение в программирование. Язык программирования Паскаль - TURBO PASCAL 7.0", написанной лет 8-9 назад. Надо зайти на титул нашей с внуком странички в интернете по адресу http://koval-ron.tripod.com/и кликнуть по полигону ОГЛАВЛЕНИЕ. Читателю откроется перечень текстов с отсылками на разнообразные шедевры автора в первоначальной редакции. Теперь идем "вниз" по перечню до заголовка: "Список оригинальных и переведенных на русский язык израильских учебников по математике и программированию с адресными отсылками". Продолжая движение "вниз" добираемся до отсылок на учебник. На первую половину русского текста можно выходить и прямо по адресу http://koval-ron-texts4.tripod.com/pasrus.htm, а на вторую - по адресу
http://koval-ron-texts4.tripod.com/pasrus1.htm.
Разумеется, никакой я не дедушка блок-схемного программирования. Это Брешко-Брешковская была бабушкой русской революции - с точки зрения ее поклонников. Но - старый дедушка своих внуков, и принадлежу вымирающему поколению ветеранов программирования, которые преподавали этот предмет в советских ВУЗах и пользовались графическими, блоковыми отображениями и объяснениями компьютерных программ. Регулярный курс "Программирование геофизических задач" читался мною 30 раз. Первый раз в 1963 году - пятому курсу РФ-59. Последний - третьему курсу РФ/СФ-88 в 1991-м. (Умение правильно считать циклы есть важное качество программиста!). Блок-схемы использовались всегда, но особенно интенсивно вначале, когда программировали в кодах. Обозначения операторов были теми же, но язык заканчивался условиями (см. ниже).
В 96 или 97 году уже в Израиле ко мне обратились два относительно молодых инженера "из наших" с просьбой подсобить им. Оба - электронщики, оба находились здесь 5-6 лет в положении "синих воротничков". И оба решили поучиться на дорогих годичных вечерних курсах программирования фирмы "Сиван махшевим".
("Сиван" в еврейском календаре есть название месяца, пересекающегося с еще не очень жарким приятным июнем. А также - женское имя. "Махшев" - компьютер на иврите. Значит название фирмы, скорее всего, переводится как "Компьютеры Сиван". В те уже далекие времена реклама фирмы звучала часто и на иврите, и на русском. Учили там добросовестно: двум моим подопечным эта учеба определенно помогла сменить воротнички. Но сейчас "Сиван махшевим" не слышно. Не исключено: за отсутствием спроса фирма прекратила свое существование вообще или организацию курсов, в частости).
Работу с абитуриентами фирма начинала предложением пройти предварительный курс по блок-схемному программированию за небольшую особую плату. Затем, если абитуриент проходил на этой основе отбор, он приглашался на основной годичный курс с зачетом половины, кажется, уже потраченных денег. Фирма составила пособие (анонимное) по указанному предмету. Язык блок-схем был развит, в него вошли подпрограммы и циклы.
Занимаясь с инженерами я перевел это пособие на русский, а потом в течение нескольких лет возвращался к этому тексту. Что-то исправлял, что-то убирал, добавлял или пересказывал. И включил в учебник по программированию в качестве первой главы. Для самого первого или общего знакомства с предметом для учеников в возрасте от 12-13 лет и старше указанной главы (или ее подмножества - с учетом усвоенной уже математики) вполне достаточно.
И вот теперь я решил еще раз поработать над, возможно, старомодным, но на мой взгляд полезным текстом, с помощью которого обеспечивается наглядное знакомство с предметом, а также определение склонности ученика к занятию программированием. Итак:
БЛОК-СХЕМНОЕ ПРОГРАММИРОВАНИЕ
1.Схема компьютера
2.Программа на языке блок-схем. Алгоритм
3.Условия
4.Семафоры - циклы
5.Подпрограммы-функции
6.Гнезда семафоров - вложенные циклы
7.Контрольные упражнения
8.Избранные решения упражнений
1.СХЕМА КОМПЬЮТЕРА
ПАМЯТЬ. Память 'схематического компьютера' состоит из ячеек. Каждая из них предназначена для хранения чисел - исходных данных, промежуточных и окончательных результатов вычислений. Обращение к ячейке осуществляется с помощью уникального имени, составленного из латинских букв и цифр. Имя ячейки является также именем переменной, хранящейся в ней.
ВВОД И ВЫВОД ДАННЫХ. Исходные данные вводятся в ячейки памяти с помощью устройства ввода. Результаты вычислений (числа и тексты) печатаются на бумаге или экране с помощью устройства вывода.
ПРОЦЕССОР. Устройство выполняет арифметические и другие действия с числами, а также вырабатывает значения условий (выполняется/не выполняется, да или нет).
2.ПРОГРАММА НА ЯЗЫКЕ БЛОК-СХЕМ. АЛГОРИТМ
Блок-схема, реализующая алгоритм программы, есть совокупность команд, сформулированных на языке 'схематического компьютера'. Целью блок-схемы(алгоритма) является достижение определенных результатов.
Алгоритмом называют систему указаний, которая четко и однозначно определяет процесс выполнения заданной работы.
В блок-схеме прямые линии связывают блоки и показывают направление процесса : куда программе следует двигаться. Если на этих линиях нет стрелок или обозначений выполнения условий, то действие программы (поток) продолжается горизонтально и/или вниз.
УСЛОВНЫЕ ОБОЗНАЧЕНИЯ КОМАНД
По порядку сверху вниз:
-начать исполнение программы.
-остановить исполнение, завершить программу.
-ввести данные и поместить их в указанные ячейки памяти.
-общая форма операции присвоения. Означает: а) вычислить значение математического выражения , указанного справа от знака присвоения; б)записать значение выражения в ячейку, имя которой указано слева от знака присвоения (присвоить значение выражения указанной переменной). Примеры:
Сверху вниз:
-Ввести число 5 в ячейку a.
-Скопировать содержимое ячеки d в ячейку b . Значение d при этом не изменится.
-Вычислить значение математического выражения, находящееся cправа от знака присвоения, и результат поместить в w.
ЗНАКИ МАТЕМАТИЧЕСКИХ ДЕЙСТВИЙ
+ есть сложение; - вычитание; * умножение; / деление; ** возведение в степень.
ПРАВИЛА ЗАПИСИ И ВЫЧИСЛЕНИЙ МАТЕМАТИЧЕСКИХ ВЫРАЖЕНИЙ - обычные. Порядок предпочтения (иерархия) действий : - возведение в степень ; - умножение и деление ; - сложение и вычитание. Круглые скобки изменяют порядок действий и операции с ними предшествуют остальным операциям. Разрешается использование некоторых стандартных математических функций таких как: abs(X) - абсолютное значение выражения в скобках , sqrt(X) - корень квадратный из Х. Значения математических функций вычисляются в выражениях в первую очередь.
Если в ячейке, имя которой записано слева в операторе присвоения, находилось какое-либо число, то оно стирается, заменяется на новое.
ПРИМЕР. Ввести три числа, сложить первое со вторым, умножить сумму на третье число и напечатать результат.
УПРАЖНЕНИЯ К РАЗДЕЛУ 2
1. Прочесть данное в какую-либо ячейку и напечатать его.
2. Прочесть два данных в какие-либо ячейки и напечатать их в порядке, обратном порядку ввода.
3. Прочесть два данных в какие-либо ячейки и напечатать только первое данное.
4. Прочесть три данных, просуммировать их и напечатать результат.
5. Прочесть два данных. Первое данное есть длина прямоугольника, втрое - его ширина. Вычислить и напечатать периметр прямоугольника и его площадь.
6. Прочесть три данных, напечатать их согласно порядка на вводе, вычислить и напечатать их среднее арифметическое.
7. Введены три данных : К - капитал (исходная сумма), Р - годовой процент и N число лет. Вычислить и напечатать новую сумму R, которая получится по формуле сложных процентов: R = K*(1+P/100)N .
8. Прочесть два числа, вычислить и напечатать: их сумму, разность (первое минус второе), произведение и частное (первое на второе). Вывод организовать так, как показано в примере для введенных чисел 8 и 4 : 8+4=12 8-4=4 8*4=32 8/4=2
9. Ввести четыре данных, провести следующие действия : а) добавить третье к первому; б)отнять от второго четвертое; в) разделить третье на 8; г) умножить четвертое на первое(до его изменения); д)напечатать новые значения переменных.
10. Прочитать два данных в ячейки А и В и затем поменять их местами.
3.УСЛОВИЯ
Условие есть предложение(оператор), проверяющий - выполняется нечто или нет. У каждого условия только два ответа : ДА - если условие выполняется; НЕТ - если условие не выполняется.
Математическое выражение может быть именем переменной, числом или собственно выражением, в котором есть знаки математических действий.
Знаки отношений: < , > , = , не = , >= , <= .
Как пользуются условием ? Условие записывается внутри ромба; оно проверяется. Если условие выполняется, поток поворачивает налево и - выполняется участок команд А; если условие не выполняется, поток поворачивает направо и выполняется участок команд Б.
*В каждом условии есть только один вход и один выход.
*Всякий раз будет исполняться или участок А или участок Б.
*Об условиях, вложенных одно в другое: условие, которое открывается последним,-
закрывается первым.
Пример 1. Ввести два неравных числа и напечатать наибольшее. Обратите внимание на то, что в решении этого примера два разветвления (рукава) соединились и вышли в одну точку для продолжения.
Пример 2. Прочесть два числа, напечатать наибольшее из них. Если они равны, напечатать 'ошибочно'. В этой задаче используются два вложенных условия.
Пример 3. Прочесть три данных, найти наибольшее из них и напечатать его. Обозначения: А,В,С - данные ввода. МАХ- для наибольшего значения.
Прогон блок-схемы для А=50, В=20, С=90.
А В С МАХ Печать
50 20 90 50
. . . . . . 90 90
Измените значения переменных и прокрутите блок-схему еще пару раз. В каждом случае на выходе схемы МАХ будет содержать наибольшее значение.
Пример 4. Прочесть три данных А, В, С и проверить упорядочены ли они в порядке возрастания. Если да - напечатать 'упорядочены', иначе - 'не упорядочены'.
СОСТАВНОЕ УСЛОВИЕ. До сих пор в каждом ромбе у нас было только одно условие. Теперь мы хотим задавать одновременно два или больше условий. Составное условие есть несколько простых, связанных между собой посредством знаков логических действий AND(И) и/или OR(ИЛИ).
Два условия, связанных операцией OR, дают в результате ответ НЕТ только тогда, когда оба они не выполняются; иначе - ответ ДА.
Пример 5. Напечатать значение переменной А, если оно больше 928 или меньше 532.
Два условия, связанных операцией AND, дают в результате ответ ДА только тогда, когда оба они выполняются; иначе - ответ НЕТ.
Пример 6. Напечатать значение переменной А, если оно будет между 20 и 340.
Важно помнить!
* В OR - достаточно исполнения одного из условий, чтобы исполнилось составное
условие.
* В AND - все условия должны исполняться, чтобы исполнилось составное условие.
* Знаки OR , AND появляются только между условиями (но не между переменными).
* Вместо A < C < F следует писать A < C AND C < F .
* AND главнее OR. Если есть составное условие, где эти знаки идут подряд, AND исполняется прежде (подобно тому, как умножение исполняется прежде сложения).
Вернемся к примеру 4 и решим его с помощью составного условия.
УПРАЖНЕНИЯ К РАЗДЕЛУ 3
1.Ввести число и напечатать его, если оно больше 539.
2.Прочесть 5 чисел и напечатать наибольшее из них.
3.Прочитать три данных в ячейки А, В, Х. Заранее известно, что А < В. Надлежит проверить находится ли Х между А и В. Если это так, напечатать 'внутри', иначе - 'не внутри'.
4.Прочесть два данных в А и В. Поместить затем в А наименьшее из прочитанных данных, а в В - наибольшее.
5.Прочесть три данных в А, В, С. Упорядочить данные так, чтобы в С находилось наибольшее из них. А и В могут содержать два других данных в любом порядке. Осуществить прогон схемы, чтобы проверить, что решение действительно верно.
6.Прочесть данное и напечатать согласно его значению: 'положительное', 'отрицательное' или 'ноль'.
7.Прочесть положительное целое данное между 1 и 9999, напечатать его и число цифр в нем. Пример: число 983, цифр в нем 3.
8.Прочитать три данных А, В, С. Изобразить блок-схему, печатающую 'упорядочены' или 'не упорядочены'. Данные на вводе считаются упорядоченными, если каждое следующее вводимое число >= предыдущего(-му).
9.Прочитать три данных А, В, С. Изобразить блок-схему, которая разместит эти данные в тех же ячейках в порядке возрастания (точнее, неубывания), т.е в А - наименьшее, в В - промежуточное, в С - наибольшее. И затем программа должна напечатать эти упорядоченные числа. Как изменить решение, чтобы упорядочение было по убыванию(не возрастанию).
10.Прочитать 4 данных в ячейки А, В, С, D , упорядочить их в тех же ячейках и напечатать содежимое А, В, С, D.
11.Хозяин предприятия решил поднять зарплату всем своим сотрудникам на 10% при условии, что после повышения она не окажется больше 5000 шекелей. В случае , если получается большая сумма, зарплата поднимается только на 5%. Написать программу, вводящую код работника и его зарплату брутто и затем выдающую код и новую зарплату. Проследить, чтобы те, кто получал больше до повышения, получили бы не меньше тех, кто прежде получал меньше их.
12.Прочитать 6 данных A, B, C, D, E, F. Эти данные есть коэффициенты системы уравнений :