Коваль Леон: другие произведения.

Быть дедом ... блок-схемного программирования

Сервер "Заграница": [Регистрация] [Найти] [Рейтинги] [Обсуждения] [Новинки] [Помощь]
  • Комментарии: 2, последний от 13/10/2007.
  • © Copyright Коваль Леон (leonko@walla.com)
  • Обновлено: 31/12/2010. 58k. Статистика.
  • Статья: Израиль
  • Иллюстрации: 45 штук.
  • Оценка: 2.96*11  Ваша оценка:
  • Аннотация:
    Особое мышление программиста... Попробуйте решить известную грустную задачу про человеческую природу с арахисовым полем, пятью братьями и обезьяной - в стиле программиста. Или идентифицировать десятичные цифры по ключу: donald + jerald = robert


  •    Леон Коваль
       Быть дедом ... блок-схемного программирования
      
       Это - последний пока текст из серии "Быть дедом". Названия и адреса трех предыдущих указаны ниже. Все тексты серии связаны между собой и с предметом программирования - для школьников, их дедов и бабуль.
       1.Быть дедом http://world.lib.ru/editors/p/professor_l_k/070711_koval_bitdedom.shtml
       2.Быть дедом. "Долбица" умножения и Паскаль
       http://world.lib.ru/editors/p/professor_l_k/070725_koval_dolbicaotdeda.shtml
       3. Быть дедом - заботливым или озабоченным
       http://world.lib.ru/p/professor_l_k/070922_koval_zabotliv.shtml
      
       Кроме всего прочего я пытаюсь найти аудиторию для книжки "Введение в программирование. Язык программирования Паскаль - 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. Эти данные есть коэффициенты системы уравнений :
       A*X + B*Y = C
       D*X + E*Y = F
       Решить эту систему, используя следующие формулы:
       X = (C*E - B*F)/(A*E - B*D); Y = (A*F - C*D)/(A*E - B*D) .
       Обратить внимание на случай равенства нулю знаменателя. В этом случае выдать: 'нет релевантного решения'.
       13.В баскетболе ничьих не бывает. По результатам чемпионатов Европы за 20 лет установлено : не было игры, в которой победитель набрал бы больше 130 очков, а проигравший - меньше 40; разрыв никогда не превышал 60 очков.
       Прочесть два данных А и В и проверить, могут ли эти числа быть логичным результатом встречи на чемпионате Европы. Если ответ положительный, напечатать 'да', иначе - 'нет'.
       14.Прочесть 4 данных. Напечатать, сколько из них отрицательных.
       15.Прочесть 6 данных. Это - результаты трех игр 'Маккаби' Т.-А.. Каждая пара данных есть счет одной игры, первое число это количество мячей, забитых командой 'Маккаби', а второе есть число мячей, забитых команде 'Маккаби'.
       Сколько очков набрала 'Маккаби', если победа дает два очка, поражение - одно, а ничьих не бывает.
       16.Перед тобой фрагмент блок-схемы. Для каждой пары данных ввода
       a. А = 25, В = 20; b. А = 15, В = 20; c. А = 30, В = 15
       необходимо составить таблицу слежения(прогона) блок-схемы и ее вывода.
      
     []
      
       17.Перед тобой фрагмент блок- cхемы. Переменные А и В могут принимать значения: a.А = 10, В = 3; b.А = 7, В = -3. Каким будет вывод в каждом из этих случаев? Воспользуйся таблицей слежения(прогона).
      
     []
      
       18.Перед тобой фрагмент блок-схемы.
       а.Проследи с помощью таблицы прогона за исполнением программы для следующих данных на вводе 1, 0, 3, -4 и запиши вывод.
       b. Запиши с аргументацией вывод для ввода тех же данных, но в обратном порядке(начиная с -4).
      
      
     []
       4.СЕМАФОРЫ - ЦИКЛЫ
       Семафор дает возможность повторять участок программы, который находится под ним, несколько раз подряд. Повторяющийся участок программы именуется : цикл - LOOP(петля). После выполнения требуемое число раз участка программы, помещенного снизу от семафора, выходят из цикла, т.е. 'поворачиваются' направо от семафора.
     []
      
      
       Семафор - простой счетчик.
      
     []
      
       а)Исполнить участок программы ниже семафора 100 раз.
       б)Исполнить участок программы ниже семафора А раз.
       в)Вычислить значение выражения, которое записано в семафоре, и столько раз выполнить участок программы ниже семафора.
      
       *Переменные - компоненты выражения, определяющего число повторений цикла, должны быть определены(обладать значениями) до входа в семафор.
      
       Пример 1. Прочесть целое число N. После этого прочесть N данных. Вычислить и напечатать сумму тех из них, которые меньше 100.
      
     []
      
       Преждевременное завершение цикла. Бывают обстоятельства, при которых нужно прекратить действие семафора до выполнения заданного числа повторений. Это можно сделать с помощью оператора END. В тот момент, когда программа придет к команде END, она возвращается к семафору и сворачивает направо. Т.е. прерывает выполнение цикла и продолжает исполнение программы.
      
     []
       Пример 2. К вводу приготовлено 70 чисел. Вычислить сумму чисел. Но если среди вводимых данных вдруг встретится число больше 100, то нужно прекратить ввод и напечатать тот результат, который был до того получен.
      
     []
       Когда цикл завершается необычным образом (с помощью END), нередко это следует знать при продолжении программы. Для этого используют специальную переменную, значение которой может сигнализировать о том, как завершился цикл.
      
       Пример 3. Прочесть 100 чисел и проверить - все ли они положительные. Если все положительные - напечатать 'Данные нормальные', иначе - 'Данные не нормальные'.
      
     []
      
      
       Преждевременное возвращение к семафору
       Бывают обстоятельства, при которых нужно прервать участок программы под семафором, вернуться к нему и продолжить исполнение цикла. Это можно сделать с помощью оператора CONT.
       В тот момент, когда программа придет к команде CONT, она должна вернуться к семафору без исполения участка команд, которые ниже его в цикле. В простом семафоре(семафор-счетчик) будет осуществлено новое вхождение в цикл, если счетчик позволяет это.
      
     []
      
       Пример 4. На вводе находится 70 чисел. Подсчитать число данных, которые меньше или равны 50. Подсчитать число данных, которые больше 50, но меньше 100. Остальные данные проигнорировать.
      
     []
      
      
       Семафор с условием(условный семафор).
       В семафоре имеется возможность записать и условие. Будет выполняться тот участок программы, который находится ниже семафора, до тех пор, пока условие НЕ осуществляется.
       В тот момент, когда условие выполняется, программа выходит из цикла. Если условие выполнится одновременно с входом в семафор - участок не будет выполнен ни разу. Условие в семафоре может быть простым или составным.
      
     []
      
       * Переменные, которые участвуют в условии, должны быть определены, т.е. обладать значениями до входа в семафор. Внутри цикла эти значения должны изменяться, иначе цикл может получиться бесконечным.
      
       Пример 5. На вводе находится неизвестное число данных. Вычислить и напечатать сумму чисел до первого данного, которое больше 100.
      
     []
       Пример 6. На вводе 100 данных. Прочитать и просуммировать их до первого из них, равного нулю (нет гарантии, что ноль будет обязательно).
      
     []
      
       Индексный семафор.
       Индексный семафор включает в себя последовательность указаний, выполняющихся автоматически при каждом входе в семафор. Индекс - переменная, которая будет использоваться как счетчик семафора, изменяющийся при каждом осуществлении цикла. Начальное значение - начальное значение индекса. Конечное значение('верхний' предел) - обозначает состояние индекса, когда необходимо прервать циклический процесс.
      
     []
      
       Из семафора выходят, когда индекс перейдет границу. Приращение это добавление, которое надо прибавлять к индексу всякий раз по возвращении к семафору. Границы и приращение могут быть числами, именами переменных или математическими выражениями.
      
     []
          Правила работы индексного семафора. При первом прохождении семафора индексу присваивается начальное значение. И еще до вхождения в участок команд, управляемых семафором, проверяется состояние индекса завершения действия семафора. Положительный (по знаку приращения) индексный семафор завершится, когда значение индекса станет больше конечного значения. Отрицательный индексный семафор завершится, когда значение индекса станет меньше конечного значения. Начиная со второго прохода и далее - с каждым возвращением к семафору осуществляется изменение индекса и выносится решение об еще одном входе в семафор.
      
       Пример 7. Ввести 70 данных, напечатать порядковые номера тех из них, которые больше 100.
      
     []
      
       Условный индексный семафор
       В нем завершение исполнения цикла происходит в момент, когда выполняется некоторое условие.
      
     []
      
      
       Пример 8. Читать и суммировать неизвестное число данных до появления числа, равного нулю. Напечатать сумму и порядковый номер нуля.
      
     []
     
       УПРАЖНЕНИЯ К РАЗДЕЛУ 4
       1. Прочитать 100 данных и напечатать их.
       2. Прочитать 100 данных, просуммировать и напечатать результат.
       3. Вводится несколько данных. Первое данное показывает число данных, находящихся за ним. Ввести и просуммировать все данные, находящиеся следом за первым, и напечатать результат. Самое первое число в сумму не входит.
       4. См. упражнение 3, но напечатать надо среднее арифметическое данных. Предусмотреть случай, когда число данных равно нулю,
       5. Прочитать 100 данных и напечатать наибольшее из них.
       6. Прочитать 100 данных. Часть из них положительные, а часть отрицательные. Напечатать количество отрицательных данных.
       7. Прочитать 100 данных. Напечатать сумму чисел - второго, четвертого, шестого, ...., сотого и сумму чисел с нечетными номерами.
       8. Прочитать данное в ячейку А. Затем прочитать 100 данных и напечатать порядковые номера тех, которые равны содержимому А.
       9. Прочитать 100 данных, напечатать порядковый номер наибольшего из них.
       10. Прочитать 100 пар данных. В каждой паре первое данное обозначает код ученика,а второе - его оценку. Напечатать коды учеников, которые преуспели на экзамене (оценки свыше 70), и затем среднюю оценку только успешных учеников. Обратить внимание на случай, при котором все не выдержали.
       11. Прочитать 50 данных и просуммировать их. После этого прочитать еще 1000 данных и напечатать порядковые номера ( от 1 до 1000) тех из них, которые равны сумме первых 50.
       12. Прочитать 100 данных и проверить, упорядочены ли они по возрастанию(неубыванию). Если это так, напечатать 'упорядочены', иначе - 'не упорядочены'.
       13. Читать 100 данных одно за другим и суммировать их. Когда появится данное, равное уже накопленной сумме, прервать ввод и напечатать это данное. Если такое данное не обнаружится, напечатать - 'не найдено'.
       14. Даны 365 средних температур в Т.-А. на каждый день 1997 года. Известно, что температура в Т.-А. никогда не бывает выше 40 градусов С и ниже -5 градусов С. Прочесть эти данные и проверить, нет ли ошибочной температуры. Если есть, напечатать 'данные ошибочны', если нет - 'данные нормальные'.
       15. В Совете Безопасности ООН голосуют 15 членов. Коды голосований : 1 - за, 2 - против, 3 - воздержался, 4 - вето(для тех, у кого есть право вето). Прочесть 15 кодов определенного голосования, напечатать число голосов 'за', 'против', 'воздержался'. Если встречается 'вето', печатать сразу сообщение об этом с порядковым номером страны.
       16. Ввести 1000 данных. Просуммировать: в ячейке SUM1 те из них, которые меньше 1000, в ячейке SUM2 - те, которые меньше 2000, но больше или равны 1000, в ячейке SUM3 - остальные данные. Напечатать итоговое содержание этих ячеек. Воздержаться от использования условия внутри условия.
       17. Вводится неизвестное число положительных данных, в конце находится ноль, обозначающий их конец. Напечатать сумму вводимых данных.
       18. Дана последовательность чисел. Найти первую пару чисел, следующих одно за другим, содержащих одинаковое число, и напечатать его (осторожно со чтением!). Наличие такой пары гарантируется.
       19. На вводе имеется 100 пар чисел, каждая пара предназначена для произвольного числа и его квадрата. Читать пары чисел и проверять, все ли они отвечают своему назначению. Если нет, напечатать: 'Существует минимум одна незаконная пара данных'.
       20. На вводе находится неизвестное количество троек чисел. Первое в тройке число есть код действия: 1 - сложение, 2 - вычитание, 3 - умножение, любое другое число - знак конца данных. Второе и третье данные есть пара чисел, над которыми следует произвести указанное действие. Напечатать результаты каждого действия и затем общую сумму этих результатов. Не пользоваться условием внутри условия.
       21.Последовательность чисел Фибоначчи строится так: первый и второй элементы равны 1; все элементы, начиная с третьего вычисляются : каждый равен сумме двух предыдущих. Т.е. 1, 1, 2, 3, 5, 8, 13, .... Прочесть число N > 2. Вычислить и напечатать все элементы последовательности Фибоначчи до первого, который больше N (напечатать и его). Сообщить, сколько членов получилось в этой последовательности.
       22. Напечатать последовательность натуральных чисел от 1 до N.
       23. Прочесть два положительных целых числа Х1 и Х2(Х1 ё Х2). Напечатать все целые числа от Х1 до Х2, включая их самих.
       24. Прочесть целое N >= 0, вычислить и напечатать N! = 1*2*3*.....*N.
       25. Прочесть целое N >= 0, вычислить сумму последовательности 20+21+22+ ...+2N и напечатать результат.
       26. Известно, что У = Х2 + 5. Ввести: а)начальное значение Х; б)конечное значение Х; в)приращение(шаг) аргумента Х в заданных выше пределах. Вычислить и напечатать таблицу значений Х и У.
       27. Что будет напечатано?
      
     []
      
       28. Дана функция F(X) = H/(X2 + H2)3/2 . Прочесть DX (приращение X) и значение H>0. Вычислить и напечатать значения Х и функции F. Вычислять F до тех пор, пока F(X) > 0.001*F(0). Использовать стандартную функцию корня квадратного SQRT(X).
      
       5.ПОДПРОГРАММЫ - ФУНКЦИИ
       Сложные программы принято делить на некоторое количество процедур и функций. Здесь мы рассмотрим функции, которые связаны с вычислением какого-либо одного результата (числа) наподобие стандартных функций abs(x) или sqrt(x). Прикладная функция, которую используют неоднократно, должна описываться только один раз после главной блок-схемы с помощью отдельной схемы.
       На месте START в схеме функции должно появиться ее имя и в скобках обозначения параметров описания(через запятые, если их больше одного), а вместо STOP - команда EXIT(выход). В теле функции хотя бы один раз ее имени должно быть присвоено значение. При обращении к функции на место параметров описания подставляются фактические параметры.
       Примечание. Команда EXIT возвращает управление в блок-схему, из которой обратились к функции. Командой EXIT можно завершать и главную блок-схему, когда по какой-либо причине нельзя продолжить выполнение основной программы. В этом случае команда EXIT приводит в действие команду STOP.
       Сначала добавим к перечню известных нам стандартных функций операции деления для получения целой части и остатка:
      
     []
      
       где L - целая часть частного X/Y, a R остаток от деления .
      
     []
      
       Пусть Х=16, Y=10. В результате L=1, M=6.
       (Уточним, что при делении на 1 операция div дает целую, а mod - дробную части числа).
       Аргументами этих функций могут быть выражения, переменные и числа.
       Любая функция может быть записана в операторе присвоения только справа от знака присвоения(имя функции и ее аргументы в скобках), а слева - имя переменной-результата. Например, - корень квадратный из суммы квадратов :
      
     []
      
       Функции можно включать в выражения. Например(SIN - функция синуса):
      
     []
      
       Пример. Вычисление квадратных корней из чисел a > 0 осуществляется с помощью итерационной формулы Ньютона:
       Xn+1 = 0.5*(a/Xn + Xn) ,
       где Xn и Xn+1 - значения последовательных итераций. Итерационный процесс прекращается, когда |Xn+1 - Xn| <= e, где e >= 0 - заданная погрешность вычисления корня квадратного. Если положить e = 0, то условие прекращения процесса приобретает вид : Xn+1 = Xn . Нулевая итерация обычно назначается так: Х0 = а.
      
       Пусть требуется вычислить корень квадратный из числа 9 с точностью не хуже e = 0.03. Итерационный процесс пройдет так:
       Х0 = 9; Х1 = 0.5*(9/9 + 9) = 5; |Х10| = |5 - 9| > 0.03
       Х1 = 5; Х2 = 0.5*(9/5 + 5) = 3.4; |Х21| = |3.4 - 5| > 0.03
       Х2 = 3.4; Х3 = 0.5*(9/3.4 + 3.4) = 3.0235; |Х32| = |3.0235 - 3.4| > 0.03
       Х3 = 3.0235; Х4 = 0.5*(9/3.0235 + 3.0235) = 3.0001; |Х43| = |3.0001 - 3.0235| < 0.03
       Т.е. с точностью не хуже 0.03 SQRT(9) = 3.0001 .
       Ниже изображена блок-схема функции SQRT(X). Отрицательное значение функции есть сигнал, что на ее вход поступило отрицательное число.
      
     []
      
      
       УПРАЖНЕНИЯ К РАЗДЕЛУ 5
       1. Прочитать 100 данных. Проверить каждое из них -делится ли оно без остатка на 5 или нет, Напечатать каждое прочитаноое число и возле - 'да' или 'нет'.
       2. Прочитать число N. Просуммировать все числа от 1 до N , которые делятся на 3 и/или 5.
       3. Прочитать положительное целое данное и напечатать самую правую его цифру.
       4. Прочитать целое данное, вычислить и напечатать сумму его цифр.
       5. Прочитать целое данное и напечатать число цифр у него.
       6. Прочитать 1000 целых данных. Напечатать числа, которые делятся на 3 и при этом цифра десятков есть 8. Просуммировать эти данные и напечатать эту сумму.
       7. Прочитать 1000 чисел и проверить не являются ли они квадратами целых чисел. Печатать только те числа, которые являются квадратами целых чисел.
      
       6.ГНЕЗДА СЕМАФОРОВ - ВЛОЖЕННЫЕ ЦИКЛЫ
       В состав участка команд, управляемых семафором, можно включить дополнительный семафор любого типа. При одном проходе верхнего семафора нижний семафор осуществит полностью все его циклы, а также участок команд, которые находятся в точке его завершения - до возвращения к верхнему семафору и его следующего цикла.
      
     []
      
       Пример 1. Сколько раз осуществится чтение в ячейку А в рамках этой схемы?
      
     []
      
       Ответ: 50 раз. На каждое прохождение верхнего семафора (10 раз) нижний семафор всякий раз осуществляет пять проходов.
      
       Пример 2. На вводе неизвестное число пар неотрицательных данных. Конец данных по числу 999( в первом числе из пары). Для каждой пары найти их произведение без использования операции умножения.
      
     []
       Преждевременное завершение в гнездах семафоров. Команды END и CONT, записанные внутри гнезда семафоров, действуют прямо на семафор, ниже которого они записаны.
      
       УПРАЖНЕНИЯ К РАЗДЕЛУ 6
       1. Прочитать 100 данных, вычислить и напечатать у каждого из них факториал.
       2. Прочитать неизвестное число данных(до первого отрицательного числа, которое обязательно появится на вводе). Напечатать сумму цифр каждого данного.
       3. В некоей школе есть 100 учеников и у каждого ученика 10 отметок. Данные на вводе упорядочены по ученикам, а именно - 10 отметок первого ученика, затем 10 отметок второго и т.д. Напечатать среднюю отметку каждого ученика и затем
       среднюю отметку по школе.
       4. Напечатать таблицу умножения размером 20*20 в таком виде:
       1 2 3 4 ...................... 19 20
       2 4 6 8 ...................... 38 40
       3 6 9 12 .................... 57 60
       .......................................................
       5. Прочитать 1000 данных, просуммировать каждое десятое данное, начиная с первого и напечатать результат.
       6. Ввести число N. Напечатать все числа от 1 до N, затем от 2 до N и т.д., всякий раз уменьшая ряд напечатанных чисел, до тех пор пока не будет напечатано только число N.
       7. Задача, подобная предыдущей, только порядок печати будет иным. Напечатать все числа от 1 до N, затем от 1 до N-1 и т.д., всякий раз уменьшая ряд напечатанных чисел, до тех пор пока не будет напечатано только число 1.
      
       7.КОНТРОЛЬНЫЕ УПРАЖНЕНИЯ
       1. На вводе находится 100 неупорядоченных целых чисел(каждое >= 1). Напечатать каждое из них и рядом слово 'ДА', если оно является элементом последовательности Фибоначчи, в противном случае напечатать 'НЕТ'.
       2. Ввести шестизначное число, обозначающую дату: две первые цифры -год, две следующие месяц (от 01 до 12) и две последние - день месяца (от 01 до 31(пусть пока так)). Напечатать дату и рядом слово 'Законная', если она соответствует указанным выше ограничениям, иначе - напечатать слово 'Незаконная'.
       3. Прочитать 100 чисел и напечатать для каждого из них само число и число цифр в нем после десятичной точки.
       4. Прочесть положительное целое данное и проверить - простое ли оно число. Простым называется число , которое нацело делится только на себя и на 1. Если число простое, напечатать слово 'Простое', иначе - 'Не простое'.
       5. Прочесть положительное целое данное и напечатать его сомножители. Сомножители числа есть простые числа, которые при умножении дают результат, равный этому числу. например, сомножителями числа 300 будут 2, 2, 3, 5, 5.
       6. Прочитать два положительных числа А и В (А > В). Напечатать их наибольший общий делитель. Например, А=14, В=28, наибольший общий делитель 14; А=3, В=25, наибольший общий делитель 1.
       7. Симметрическое число при чтении слева направо и справа налево дает одно и то же значение (например, 17371 или 173371). Прочесть данное. Если оно симметрическое, напечатать 'Симметрическое' , иначе - 'Не симметрическое'.
       8. Блок-схема печатает таблицу умножения 20*20 в форме, указанной в упражнении 4
      
     []
      
       предыдущего параграфа. Дополнить схему.
       9. Блок-схема получает сумму цифр вводимого числа N. Число цифр в числе
      
     []
      
       неизвестно. Дополнить схему.
       10. Написать блок-схему, печатающую часы, минуты и секунды так, как они представляются в электронных часах от 0:00:00 до 23:59:59. На вход схемы время поставляется в виде числа секунд от начала текущих суток.
       11. Ввести число, представляющее сумму денег в зузах, которую предстоит вернуть клиенту как сдачу - с помощью принятых банкнот и оптимальным способом. Банкноты такие: 7 зуз, 3 зузы, 1 зуз. Сначала надо использовать банкноты по 7 зуз, остаток - выплачивать банктнотами по 3 зузы, последний остаток - банкнотами в 1 зуз. Вычислить и напечатать число банкнот каждого вида, не используя функции MOD и DIV.
       12. Ввести два целых положительных числа. Надлежит напечатать их произведение без использования операции умножения.
       13. Ввести число N и построить перевернутую пирамиду в соответствии с примером. Для числа N=4 пирамида выглядит так:
       1 2 3 4 3 2 1
       1 2 3 2 1
       1 2 1
       1
      
     []
      
       Дополнить решение.
       14. Ввести 50 целых чисел. Напечатать для каждого числа - сколько у него цифр. Подсчитать и напечатать - сколько всего было четных чисел.
       15. Задача с обезьяной. У хозяина арахисовой фермы было 5 сыновей и обезьяна. С приходом сезона сбора разошлись сыновья по полю и собрали урожай. Вечером сыновья легли спать, решив назавтра разделить между собой собранное.
       Сразу после того как братья уснули один из них пробудился и сказал себе: 'Знаю я нашего брата и опасаюсь, что .... '. Пошел брат к куче орешков и тихонько разделил ее на пять равных частей. В итоге получилось у него 5 равных куч, но остался один лишний орешек и его он отдал обезьяне. Забрал себе брат одну из куч(т.е. одну пятую часть орехов), объединил оставшиеся и лег снова спать.
       После этого просыпались остальные братья, и все они делали в точности то же, что и первый брат. Каждый обнаруживал кучу (всегда на 1/5 меньше, чем куча предыдущая), точно делил ее, и всякий раз оставался у него лишний орешек, который получала обезьяна.
       Утром проснулись пятеро братьев. И никто из них не рассказал, что происходило ночью. Они сели и вновь поделили остаток кучи на 5 равных частей, и, о чудо!, снова у них остался один орешек для обезьяны...
       В чем вопрос? После алгоритмической подготовки (получения общего решения, зависящего от целого параметра N(1,2,3,...)) составить программу, которая вводит значение параметра и определяет : -сколько орешков было в куче сначала; -как бы они были поделены, если бы братья доверяли друг другу; -и как орешки были поделены в этой грустной истории.
       16.Идентифицировать обозначения десяти десятичных цифр по ключу:
       donald + jerald = robert
       Необходимо найти решение с помощью логических заключений. Составлять блок-схему не требуется. Программа, реализующая метод "грубой силы"(полный перебор), содержит гнездо, состоящее из 10 вложенных циклов. Она нагляднее выглядит на алгоритмическом языке, скажем, на Паскале.
      
       8.ИЗБРАННЫЕ РЕШЕНИЯ УПРАЖНЕНИЙ
      
      
     []
      
      
     []
      
      
     []
      
      
       7.15. Х - число орешков , доставшееся каждому из братьев утром.
       Последняя куча орешков: 5*Х+1
       Куча перед братом 5: 5/4*(5*X+1)+1 = 52/4*X+5/4+1
       Куча перед братом 4: 5/4*(52/4*X+5/4+1)+1 = 53/42*X+52/42+5/4+1
       Куча перед братом 3: 5/4*(53/42*X+52/42+5/4+1)+1 = 54/43*X+53/43+52/42+5/4+1
       Куча перед братом 2: 5/4*(54/43*X+53/43+52/42+5/4+1)+1 =
       =55/44*X+54/44+53/43+52/42+5/4+1
       Куча перед братом 1: 5/4*(55/44*X+54/44+53/43+52/42+5/4+1)+1 =
       = 56/45*X+55/45+54/44+53/43+52/42+5/4+1
       Итак, общий урожай орешков Z = 56/45*X+55/45+54/44+53/43+52/42+5/4+1 =
       = (56*X+55+54*4+53*42+52*43+5*44+45)/45 =
       = (15625*X+3125+2500+2000+1600+1280+1024)/1024 = (15625*X+11529)/1024 =
       = 15*X + 11 + 265*(X+1)/1024.
       Число орешков Z будет целым, если целым будет отношение n = (X+1)/1024 = =(X+1)/210. n может принимать значения 1,2,3, ... . А значит X = n*210 - 1
       Окончательная формула для исходного количества орешков
       Z = 15*n* 210 + 265*n - 4 = 15625*n - 4, n = 1,2,3, .....
       Пусть n = 1, тогда X = 1023, а Z = 15621.
       Если n = 2, то X = 2047, а Z = 31246 . И т.д...
      
       7.16. В задаче 10 цифр обозначены буквами, требуется установить значения букв. Ниже приведено начало решения.
      
       5 4 3 2 1 0 (номера разрядов)
       d o n a l d +
       j e r a l d =
       r o b e r t
       d не 0, t - четное, e или 0 или 9(см. разряд 4).
      
       I.Пусть е = 0, тогда а = 5(см. второй разряд) :
       n + r + 1 = b (переноса нет)
       r = d + j (переноса нет)
       n + d + j +1 = b
       n, d , j могут быть : 1, 2, 3 ( b = 7), или 1, 2, 4 ( b = 8)* , 1, 3, 4 ( b = 9).
       r = l + l (разряд 1 не дает переноса), r - четное.
       Т.о. n, d , j , l забили 1, 2, 3, 4, t или 6 или 8;
       r = d + j , значит четное r = 6(2+4), t = 8.
       Значит d , j забили 2, 4 и b = 8 тоже(см. *) - не может быть!
      
       II.е = 9, d не 0, t - четное. а = 4 : и т.д.
      
       N49.doc, L.K., 10.2007
  • Комментарии: 2, последний от 13/10/2007.
  • © Copyright Коваль Леон (leonko@walla.com)
  • Обновлено: 31/12/2010. 58k. Статистика.
  • Статья: Израиль
  • Оценка: 2.96*11  Ваша оценка:

    Связаться с программистом сайта
    "Заграница"
    Путевые заметки
    Это наша кнопка