Text
                    М. А. Б А К У М Е Н К О

АЛГОРИТМИЗАЦИЯ
И ПРОГРАММИРОВАНИЕ

7/) «Инфра Инженерия»

Н. В. Апатова, М. А. Бакуменко АЛГОРИТМИЗАЦИЯ И ПРОГРАММИРОВАНИЕ Учебное пособие Москва Вологда «Инфра-Инженерия» 2025
УДК 004.42 ББК 32.973 Л76 Рецензенты: доктор педагогических наук, профессор, ФГАОУ ВО «Крымский федеральный университет имени В. И. Вернадского» Гончарова Оксана Николаевна; доктор педагогических наук, профессор, ГБОУ ВО РК «Крымский инженерно-педагогический университет имени Февзи Якубова» Гордиенко Татьяна Петровна Апатова, Н. В. А76 Алгоритмизация и программирование : учебное пособие / Н. В. Апа- това, М. А. Бакуменко. - Москва ; Вологда : Инфра-Инженерия, 2025. - 216 с. : ил., табл. 18ВК 978-5-9729-2228-4 Даны алгоритмы построения компьютерных программ на языке Паскаль (Разса!). Пособие состоит из лекционного курса (И тем), вопросов и заданий для са- мостоятельной подготовки обучающихся и цикла лабораторных работ (18 работ). Для студентов, обучающихся по направлению подготовки 38.03.05 «Бизнес- информатика». УДК 004.42 ББК 32.973 18ВГ1 978-5-9729-2228-4 © Апатова Н. В., Бакуменко М. А., 2025 © Издательство «Инфра-Инженерия». 2025 © Оформление. Издательство «Инфра-Инженерия», 2025
СОДЕРЖАНИЕ ВВЕДЕНИЕ......................................................5 ТЕМА 1. ОСНОВНЫЕ СРЕДСТВА ЯЗЫКА ПАСКАЛЬ И АЛГОРИТМЫ ОБРАБОТКИ СКАЛЯРНЫХ ДАННЫХ........................6 1.1. Язык программирования Паскаль............................6 Вопросы и задания.............................................8 1.2. Структура программы на Паскале. Ввод и вывод данных......8 Вопросы и задания............................................11 Лабораторное задание 1. Линейные вычислительные процессы.....13 1 3. Условный оператор.......................................20 Вопросы и задания............................................24 Лабораторное задание 2. Разветвляющиеся вычислительные процессы. Сокращенная форма оператора 1Р...............................26 Лабораторное задание 3. Разветвляющиеся вычислительные процессы. Использование вложенных инструкций 1Р ТНЕК ЕЬ8Е..............35 1.4. Организация циклов......................................42 Вопросы и задания............................................48 Лабораторное задание 4. Циклические вычислительные процессы. Оператор РОК.................................................50 Лабораторное задание 5. Циклические вычислительные процессы. Операторы АУН1ЕЕ И КЕРЕАТ 1М'1Е..............................57 ТЕМА 2. КОМПЬЮТЕРНАЯ ТОЧНОСТЬ ВЫЧИСЛЕНИЙ.....................61 Вопросы и задания............................................66 Лабораторное задание 6. Вычисления с заданной точностью......68 ТЕМА 3. ОДНОМЕРНЫЕ И ДВУМЕРНЫЕ МАССИВЫ.......................73 3.1. Массивы.................................................73 Вопросы и задания............................................78 Лабораторное задание 7. Обработка одномерных массивов........79 Лабораторное задание 8. Сортировка массивов..................85 3.2. Алгоритмы обработки таблиц..............................88 Вопросы и задания............................................93 Лабораторное задание 9. Обработка двумерных массивов.........94 Лабораторное задание 10. Преобразование и построение матриц.100 ТЕМА 4. ОПЕРАТОР ВАРИАНТА...................................107 Лабораторное задание 11. Оператор варианта..................109 ТЕМА 5. ПОДПРОГРАММЫ........................................114 5.1. Процедуры..............................................115 5.2. Подпрограммы-функции...................................119 Вопросы и задания...........................................121 Лабораторное задание 12. Подпрограммы. Функции..............122 Лабораторное задание 13. Процедуры и функции................128 ТЕМА 6. ОБРАБОТКА СТРОК.....................................135
Вопросы и задания........................................142 Лабораторное задание 14. Символьный тип данных...........143 Лабораторное задание 15. Обработка строк.................148 ТЕМА 7. ЗАПИСИ...........................................153 Вопросы и задания........................................157 Лабораторное задание 16. Записи..........................158 ТЕМА 8. ФАЙЛЫ............................................165 Вопросы и задания........................................169 Лабораторное задание 17. Работа с файлами................171 ТЕМА 9. ГРАФИКА......................................... 178 Вопросы и задания........................................187 Лабораторное задание 18. Компьютерная графика............189 ТЕМА 10. РЕКУРСИЯ........................................197 Вопросы и задания........................................202 ТЕМА 11. ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ...................203 Вопросы и задания........................................210 ЛИТЕРАТУРА...............................................212
ВВЕДЕНИЕ Учебное пособие предназначено для обучающихся первого курса бака- лавриата по направлению подготовки 38.03.05 «Бизнес-информатика» и подго- товлено согласно требованиям образовательного стандарта, учебного плана, утвержденного Ученым советом ФГАОУ ВО «Крымский федеральный универ- ситет имени В. И. Вернадского», и учебной программы дисциплины «Алгорит- мизация и программирование». Дисциплина «Алгоритмизация и программиро- вание» входит в вариативную группу дисциплин для подготовки бакалавров по направлению подготовки 38.03.05 «Бизнес-информатика». Изучение языков программирования и алгоритмов построения компью- терных программ является необходимостью для будущих бакалавров по направлению подготовки «Бизнес-информатика». В учебном пособии в качестве языка программирования был выбран язык Паскаль (Разса!). Паскаль является одним из наиболее простых языков про- граммирования для формирования базовых навыков и компетенций у обучаю- щихся начальных курсов. Он позволяет записывать команды компьютеру для решения математических задач, обработки текстов, построения изображений на экране дисплея. Реализованный на 1ВМ РС Паскаль позволяет использовать практически все возможности персонального компьютера. Структурно учебное пособие состоит из лекционного курса (одиннадцати тем), вопросов и заданий для самостоятельной подготовки обучающихся и цик- ла лабораторных работ (восемнадцати работ). В результате изучения дисциплины «Алгоритмизация и программирова- ние» обучающиеся должны приобрести знания, умения и навыки, необходимые в будущей профессиональной деятельности для самостоятельного решения профессиональных задач с применением вычислительной техники и информа- ционных технологий. Авторы выражают искреннюю благодарность рецензентам, профессорам Оксане Николаевне Гончаровой и Татьяне Петровне Гордиенко, за внимание к учебному пособию, ценные советы, замечания и рекомендации. Авторы надеются, что учебное пособие будет полезно обучающимся по направлению подготовки 38.03.05 «Бизнес-информатика».
Тема 1. ОСНОВНЫЕ СРЕДСТВА ЯЗЫКА ПАСКАЛЬ И АЛГОРИТМЫ ОБРАБОТКИ СКАЛЯРНЫХ ДАННЫХ 1.1. Язык программирования Паскаль Одним из наиболее популярных сегодня языков программирования явля- ется язык Паскаль. Он позволяет записывать команды компьютеру для решения математических задач, обработки текстов, построения изображений на экране дисплея. Первоначально такое разнообразие средств не входило в стандарт языка, принятый в 1973 году. Создатель Паскаля - Никлаус Вирт - предложил первую версию строгого по форме и простого для написания программ языка в 1968 году, когда не существовало персональных компьютеров. Реализованный на 1ВМ РС Разса! (в дальнейшем - просто Паскаль) позволяет использовать практически все возможности персонального компьютера. Как каждый язык, Паскаль имеет свой алфавит. В него входят латинские буквы, цифры от 0 до 9, специальные знаки (+, -, круглые, квадратные и фи- гурные скобки, точка, занятая и другие), а также служебные слова языка (Ье§ш, епс1, Гог, \\1н1е и другие). В текстах программ служебные слова будут выделены жирным шрифтом. При создании информационной модели один из основных этапов - име- нование объектов. Имя в Паскале - это слово из букв, цифр и знаков подчерки- вания, начинающееся с буквы. В качестве имени нельзя использовать служеб- ные слова. Каждое имя соответствует некоторой ячейке памяти, куда записыва- ется данное значение. Поскольку в ячейку можно записать одно за другим сколько угодно данных, то имя также называют переменной или именем пере- менной. Ячейка - понятие условное, это последовательность разного количе- ства байтов памяти для разных данных. Для целых чисел в Паскале требуется два байта, для действительных - шесть. Каждый символ клавиатуры занимает один байт. Поэтому для каждой переменной надо указать ее тип, чтобы транс- лятор (программа, переводящая с языка программирования на язык машинных команд) знал, сколько места в памяти она будет занимать. Числа в Паскале различаются как целые и действительные (веществен- ные). Целое число по внешнему виду такое же, как обычно: знак «+» можно не указывать. Вещественные числа, несмотря на одинаковое представление в па- мяти компьютера, могут иметь вид с фиксированной и с плавающей точкой. Числа с фиксированной точкой похожи на десятичные, только целая часть от дробной отделяется не запятой, а точкой: -7.23, 897.5, -0.11. Числа с плаваю- щей точкой имеют громоздкий вид, они выводятся как результаты работы про- граммы. Однако, как показано в описании операторов ввода-вывода, их можно
заменить на числа с фиксированной точкой. Если программа выдала веще- ственное число: - 4.9876 543234Е-02 то это то же самое, что - 0,049876543234 , т. е. деся- тичную точку надо сдвинуть влево на две позиции. Сдвиг указан после буквы Е в записи числа: вправо, если после Е плюс, и влево, если минус. Для работы с числами используются шесть операций: «+» - сложение, «-» - вычитание, «/» - деление, «*» - умножение, «той» - нахождение остатка от деления и «(Ну» - деление нацело. Находить остаток от деления и делить нацело можно только целые числа. Из имен, чисел, знаков арифметических действий и математических функций конструируются арифметические выражения. Для указания порядка действий используются только круглые скобки, их может быть несколько, главное, чтобы количество открывающих скобок равнялось количеству закры- вающих. Математические функции Паскаля во многом совпадают с общепри- нятыми: 51п(х), со§(х), 1п(х). Для возведения аргумента в квадрат используется $цг(х), для извлечения квадратного корня зцгЦх), а модуль обозначается аЬ«(х). В качестве аргумента каждой функции может быть арифметическое выражение. Оператор присваивания. Алгоритм преобразования данных на Паскале состоит из операторов - укрупненных команд. Каждый оператор преобразуется транслятором в последовательность машинных команд. Основное преобразова- ние данных, выполняемое компьютером, - присваивание переменной нового значения. Общий вид оператора присваивания: имя переменной ;= арифметическое выражение; В дальнейшем будет показано, что справа может стоять и выражение дру- гого типа. Знак «:=» читается «присвоить». Точка с запятой в конце записи оператора является обязательной. При выполнении оператора присваивания рассматривается арифметиче- ское выражение, из ячеек оперативной памяти, соответствующих стоящим там именам, считываются значения в процессор и выполняются указанные действия над данными. Полученный результат записывается в ячейку памяти, имя кото- рой указано слева от знака присваивания. Примеры оператора присваивания: х ~ 3.14; {переменной х присвоить значение 3.14} а := Ь + с; {из ячеек вис считываются заранее помещенные туда данные, вычисляется сумма, результат записывается в ячейку а} т := т + 1; {значение переменной увеличивается на единицу} Для типов переменной слева и арифметического выражения справа от знака присваивания существуют ограничения: 1) если переменная слева - вещественного типа, то арифметическое вы- ражение может быть как целого, так и вещественного типа, т. е. содержать либо целые переменные и допустимые для них операции, либо вещественные, либо и те, и другие (тогда выражение преобразуется к вещественному типу);
2) если переменная слева - целого типа, то арифметическое выражение - только целочисленное. Это означает, что можно, например, вещественной переменной присвоить целое значение. В памяти компьютера оно будет преобразовано к веществен- ному типу. В фигурных скобках рядом с оператором помещается комментарий его действий. Вопросы и задания 1. Кто придумал язык программирования Паскаль? 2. Что входит в состав алфавита Паскаля? 3. Почему Паскаль различает целые и вещественные числа? 4. Что такое арифметическое выражение, из чего оно может состоять? 5. Как работает оператор присваивания? 6. Какие ограничения накладывает Паскаль на типы данных при присваи- вании? 7. Что такое транслятор? 8. Запишите в виде арифметического выражения квадратный трехчлен. 9. Запишите на Паскале /§х, 1% х, у4. 1.2. Структура программы на Паскале. Ввод и вывод данных Программа на Паскале состоит из двух частей: описания используемых данных и операторов по их преобразованию. Вторая часть также называется протраммным блоком. Общий вид программы: рго^гаш имя программы; 1аЬе1 {список меток}; сопЧ {список постоянных значений}; Гуре {описания сложных типов данных}; уаг {описания данных программы}; Ьещп {начало программного блока} {алгоритм} епй. {конец программы} Имя программы содержит не более 8 знаков, начинается с буквы и со- держит буквы, цифры и знаки подчеркивания. Программа начинается со слова рго^гат и заканчивается словом епй с точкой. Операторы, разделы и описания разделов заканчиваются точкой с запятой. Описательная часть программы состоит из четырех разделов. Раздел ме- ток 1аЬе1, раздел констант сопвГ и раздел типов Гуре. Их использование будет
рассмотрено в дальнейшем, по мере необходимости. Основным из этих разде- лов является раздел переменных уаг. В нем указываются имена переменных, используемых в программе, и их тип. Для числовых данных используются ос- новные описатели типов пйе^ег (целый) и геа! (вещественный). Например, в программе используются две целочисленные переменные и одна вещественная. Раздел переменных может иметь вид: уаг Ц :ш1е§ег; х: геа1; Имена переменных одного типа перечисляются через запятую, затем по- сле двоеточия указывается их тип. Описание каждого типа заканчивается точ- кой с запятой. Когда при переводе на язык машинных кодов транслятор встре- чает описание переменной, он отводит для этой переменной ячейку памяти и ставит в соответствие имени переменной номер первого байта ячейки. Программный блок содержит операторы, описывающие алгоритм реше- ния задачи. Для сообщения данных компьютеру используются операторы ввода и вы- вода. Оператор ввода помещает вводимое значение переменной в отведенную для нее ячейку. Оператор ввода: геай (список имен); Оператор геай (читать) останавливает работу программы и ждет, пока пользователь наберет на клавиатуре число и нажмет ЕпНт. Введенное число помещается в оперативную память, в отведенную ячейку. Если список ввода содержит несколько имен, то для каждого надо ввести свое значение. Числа вводятся или через пробел, или через запятую, или для каждого нажимается Еп1ег. Например: геай (у); требует ввода двух целых чисел. После работы этого оператора курсор расположен после последнего числа, он не переводится на новую строку. Для перевода курсора на новую строку экрана дисплея после ввода данных надо ис- пользовать оператор геай1п (список имен); Для вывода результатов работы программы на экран дисплея служит опе- ратор чггйе (список вывода); Оператор эугйе (писать) выводит данные на экран дисплея. Список выво- да - перечисленные через запятую имена результатов или арифметические вы- ражения, являющиеся результатом работы программы. Также в список вывода, для пояснения, входят заключенные в апострофы тексты.
Например: уугйе (‘ х=‘ , х); Этот оператор напечатает на экране, начиная с той позиции, где находит- ся число, текст, заключенный между апострофами и значение переменной х из оперативной памяти. Значение будет выведено в форме вещественного числа с плавающей точкой. Для того, чтобы число было выведено в форме с фиксиро- ванной точкой, после имени соответствующей переменной надо указать два це- лых числа, отделив каждое двоеточием. Первое из этих чисел показывает, сколько позиций занимает число (включая десятичную точку и знак числа). Второе - показывает количество цифр дробной части числа. Например, для пе- чати числа -23.57 как значения переменной х, оператор печати примет вид: у»тйе( ‘х=‘, х:6:2); На экран будет выдано х=-23.57 Для перевода курсора на новую строку используется оператор пустого вывода лупМп; Если надо перевести курсор после печати, используется м п1е1п (список вывода); После вывода результатов работы программы на экран в ТигЬо Разса! си- стема так быстро возвращается в редактор текстов программы, что пользова- тель не успевает увидеть эти результаты. Для того, чтобы задержать изображе- ние, в конце программы ставят оператор пустого ввода геай1п; Рассмотрим пример программы. Пусть требуется найти сумму, произве- дение и разность двух данных чисел. Для каждого из чисел надо придумать имя переменной и указать ее тип. Затем ввести эти числа в отведенные ячейки и, используя возможность оператора вывода содержать арифметическое выраже- ние, напечатать результаты. рго^гат Е1; уаг а,Ь . геа1; Ье*Дп уугйе (‘введите два числа через пробел, затем нажмите Еп(ег’); геай1п(а,Ь);
«тйе (‘а + Ь =‘, а+Ь, ‘а*Ь = ‘, а*Ь, ‘а-Ь = ‘, а-Ь); геай1п; епй. Служебные слова Паскаля выделены жирным шрифтом, на письме они подчеркиваются. При наборе текста программы на клавиатуре они никак не вы- деляются, их различает транслятор (синоним - компилятор). Поэтому служеб- ные слова нельзя использовать в качестве имен. Первый оператор программно- го блока выводит на экран подсказку для пользователя, что он должен сделать. Для ввода данных рекомендуется делать подобные подсказки. При решении задач имена присваиваются не только исходным данным, но и результатам, а также получаемым промежуточным значениям. Поскольку в рассматриваемом примере надо получить три результата, введем для них пе- ременные х, у, г. В программе этим переменным будут присвоены значения суммы, произведения и разности двух вводимых чисел. рго§гат Е2; уаг а,Ь,х,у,х : геа1; Ье^т у»тйе (‘введите два числа через пробел, затем нажмите Еп1ег’); геай1п(а,Ь); х := а + Ь; у := а * Ь; х := а - Ь; тггйе (‘а+Ь =‘, х, ‘а*Ь = ‘, у, ‘а-Ь = ‘, х); геай1п; епй Вопросы и задания 1. Для чего необходимо описывать данные в программе? 2. Как описать переменные одного типа, например, вещественного? 3. Какой оператор используется для ввода данных? Как он работает? 4. Куда попадают введенные с клавиатуры числа при работе оператора ввода? 5. Как перевести курсор на новую строку после ввода данных? 6. Как вывести результаты работы программы на экран дисплея? 7. Как сделать так, чтобы вывод данных был с новой строки? 8. Как увидеть результаты вывода на экране дисплея, если уже сработал у.тйе? 9. Можно ли получить результат вычислений без использования операто- ра присваивания? 10. Напишите программу вычисления среднего арифметического двух чи- сел.
11. Напишите программу вычисления расстояния между двумя точками плоскости. 12. Напишите программу вычисления площади треугольника по формуле Герона. 13. Напишите программу вычисления площади боковой поверхности ку- ба. 14. Напишите программу вычисления площади и гипотенузы прямо- угольного треугольника, если известны его катеты. 15. Напишите программу вычисления суммы модулей трех вещественных чисел. 16. Напишите программу вычисления площади круга, если известна дли- на окружности. 17. Напишите программу вычисления площади равностороннего тре- угольника. 18. Напишите программу возведения числа в четвертую степень за две операции. 19. Напишите программу возведения числа в седьмую степень за четыре операции. 20. Напишите программу определения времени встречи двух автомоби- лей, если известно расстояние между двумя пунктами, откуда они вышли навстречу друг другу одновременно, а также их скорости. 21. Напишите программу вычисления суммы арифметической прогрес- сии, если известен ее начальный член и разность, а также количество ее членов. Указание', при работе на компьютере укажите разные форматы вывода чисел с фиксированной точкой, выполните программу для разных данных не- сколько раз.
Лабораторное задание 1. Линейные вычислительные процессы Цель - получение практических навыков программирования линейных вычислительных процессов. Задание. Необходимо решить в редакторе Разса! задачу вычисления и вывода значений функций у = Ц(х), § = • Создать блок-схему алго- ритма решения задачи. Выполнить программу и проанализировать результаты ее работы (проведя параллельные вычисления в табличном процессоре). Варианты заданий Вариант № у-- = ./1(? ) 8~~ = /2(у,а,б) 1. созх + 2,5 „ У 2 +у 1з4а + 7,1 Л 3 5 м 4а+ 7,1 2. У = х| + 11 х5 + 7 \1у + 3 + §= . , - 81П Ь + а2 + 3 3. у ё, + 1 + 21 7 8 = а + 15у2 + 16 У X 15у2 + 16 + 63 4. х + 18,54 ' 8 у* + 4со8й + Ш + 4 у3 + Ш + 4 5. 3 + 1п(+ +7,1) У~ х + 7,1 8 7 д/у+ 8СО8Я у + 8со8а -ЗЬ 6 Йх + 14,2 У = х + 3 (у + 9)3+14а 81п Ъ + (у + 9)3 +14о 7. V У = ип + 3 + 15 1§(у +11) + 3 соз а 1§(у + 1 1)+ 81П/9 8. 1§(24-Зх) + 7 8ша (у + П) у - х2 + 7 мп в (у + 11)-4й 9. 8Ш2 Л + 4 8т’(ау)+ 1Ъ2 у- . п п 8Ш 2х + 7 5 8Ш3 Ы- -3 10. 8|1ёх2| + 14 81Па + 5узУ у- 21 + х3 (81па + 5у3> 3 тЪ 11. 81П х2 соз(2х + 19 )+7 1 ё(4у ?(4у 3+28)+а + 28)+62
Вариант № У = /1(т) 8 = /1{у^,Ъ) 12. У~^ х + 15 > + 8)+4 ^ау + 7 +12 8 ^ау + 1+Ь2 13. у + 4 У " Г. г Л/ 81П X + X' ^/у + 10а+24 8т6 + (/у + 10а 14. У У = х2 +7,2 х + 2,4 11 + / + С08с '1 С08Я + / + 0,86 15. у = - х/х + 15 7х5 + 4 /-1а + 14 & 0-7 3 8111 О + У -1а\ + 14 16. У = ех+1 + 5 у л + 7 _ у/а + 2у2 + +1 (?/> + ! + 2у2 Методические указания ио выполнению лабораторной работы Программа на языке Разса! должна состоять из следующих основных раз- делов: 1) декларативная часть (описание переменных); 2) основная часть (ввод исходных данных, обработка данных, вывод по- лученных результатов для пользователя). Исходные данные должны вводиться с клавиатуры. Перед оператором ввода необходимо применять оператор тугйе для вывода на экран соответству- ющего сообщения для пользователя о необходимости ввода данных. Если в формуле присутствует повторяющаяся часть (например, в задании варианта 16 в выражении для нахождения величины § в числителе и знаменате- ле есть повторяющееся выражение 2у2 + +1), то для ее вычисления следует ввести дополнительную переменную, что должно упростить исходную расчет- ную формулу. Так, например, для варианта 16 вводим дополнительную переменную х: г = 2 у2 + +1. _ \а +2 Тогда § =-----. 2 Осуществляя запись математических выражений в программе при необ- ходимости следует применять встроенные функции языка Разса!: Математическая запись* Запись на языке Ра$са1 зт х 8Ш(х) СОЗ X С08(х) 1§х 8Н1(х)/сО8(х) С'1у х СО8(х)/81П(х) 1п х 1п(х)
Математическая запись* Запись на языке Ра$са1 1% х=1о%1пх=1п хДп 10 1п(х)/1п(10) 1о§ах=1п хДп а 1п(х)/1п(а) И аЬв(х) х2 8цт(х) 8^Н(х) е ехр(х) аь=еь 1па ехр(Ь*1п(а)) * Примечание: в языке Разса1 отсутствуют встроенные функции и с1%х, а также отсут- ствует оператор возведения в степень. В процессе построения блок-схем программ, представленных в лабора- торных работах, понадобятся знания о назначении основных фигур блок-схем:
Обозначение Пояснение Направление вычисления снизу вверх или справа налево В отчет необходимо включить экранный снимок выполнения программы в редакторе Разса!. Для создания снимка экрана можно применить сочетание клавиш АЙ+Ргг8с, а для размещения снимка экрана в отчете - сочетание кла- виш СШ+У. Для проверки корректности составленной программы рекомендуется про- вести параллельные расчеты в табличном процессоре (с применением, при необходимости, встроенных математических функций). В отчет по лаборатор- ной работе рекомендуется поместить экранный снимок результата данной про- верки. Пример оформления отчета по лабораторной работе Вариант №16 Цель - получение практических навыков программирования линейных вычис- лительных процессов. Задание. Необходимо решить в редакторе Рааса! задачу вычисления и вывода значений функций: в +5 х/п" 3“ 2г + +1 л/х+7 !§/:> +1 + 2у2 Создать блок-схему алгоритма решения задачи. Выполнить программу и про- анализировать результаты ее работы (проведя параллельные вычисления в табличном процессоре). Решение. В формуле для нахождения величины у можно выделить одинаковое -> 2 , , А т + г выражение: 2 = 2у + 1уп + 1.1 огда можно записать: § —----- 2 1 , 5 I— — 11 а Выражение у а можно записать в виде е5
Блок-схема алгоритма решения задачи: Код программы: рго§гаш 1аЪ 1; {Лабораторная работа 1 обучающегося группы БИ-б-о-201 Петрова П.П.} уаг х, а, Ь: геа1; {исходные данные} г: геа1; {промежуточная величина} у, с: гса1; {результаты работы программы} Ье§1п (Вывод сообщения для пользователя о необходимости ввода исходных данных} \угке1п('Введите х, а, Ь’); геай)п(х,а,Ь); {ввод исходных данных с клавиатуры}
{Вычисления} у:=(ехр(х+Г)+5)/(8дй(х)+7); х :=8ш(Ъ)/со8(Ь)+1+2*8дг(у); § :=(ехр(1/5*1п(а))+х)/х; {Вывод результатов работы программы на экран: отформатированный вид (два знака после запятой)} уггке1п(‘у=’, у : 8 : 2); ^гке1п(‘ §=’, § : 8 : 2); геаскп; епс1. Экранный снимок выполнения кода программы в редакторе Рааса!: татраз 1 реостат 1аЬ_1 2 {Лабораторная работа 1 3 обучающегося группы БИ-б-о-201 4 Петрова П.П.} 5 уаг 6 х а Ь: геа! ; {исходные данные} 7 х: геа! {промежуточная величина} 8 у геа1 {результаты работы программы} 9 Ь- 10 шгИе1п(' Введите х, а, Ь'); {ввод исходных данных с клавиатуры} 11 геаЛп(х а Ь) 12 у (ехр(х 1)+5)/(5яг1(х) 7); {вычисления} 13 х 51п(Ь) соз(Ь) 12 здг(у) 14 § (ехр(1 5 1п(а))+х)/х; 15 нгИе1п(' у=', у : 8 : 2); {вывод результатов работы прог&лФЪ —. 16 ыггЬеХп('е=' е • 8 : 2) 17 геаЛп 18 19 20 I V ** .О 1приГ Введите х, а, Ь 3 1 7 у= 6.83 д= 1.01
Экранный снимок выполнения вычислений в табличном процессоре: 0 Лабораторная 1 - Ехсе! Главная Вставка Разметка страницы Формулы Рецензирование Вид Разработчик Справка Буфер обмена "а Шрифт Выравнивание =(В2Л(1/5)+В5)/85 ТАИ 7 2 = 2у2 + 1аЬ +1 - & I Результаты выполнения программы в редакторе Разса! и проведения парал- лельных вычислений в табличном процессоре: Набор данных Результаты вычислений X а ъ Редактор Ракса! Табличный процессор У ё У ё 3 1 7 6,83 1,01 6,83 1,01 Выводы. Поскольку результаты выполнения разработанной программы совпали с результатами расчетов в табличном процессоре, можно говорить о том, что про- грамма составлена верно. Контрольные вопросы 1. Опишите структуру программы на языке Разса!. 2. Как объявляются переменные в программе, написанной на языке Разса!? 3. Расскажите о синтаксисе операторов ввода и вывода. 4. Перечислите основные встроенные математические функции Разса!. 5. Как на языке Разса! записать возведение в степень? 6. Что Вы знаете о записи комментариев в Разса!? 7. Расскажите о форматировании вывода на экран.
1.3. Условный оператор Для записи любого алгоритма исполнителю достаточно иметь три коман- ды: присваивания, ветвления и повторения. Команде ветвления в Паскале соот- ветствует условный оператор. Условному оператору соответствуют две структуры, представленные на рис. 1-2. На рис. 1 показана неполная форма условного оператора, когда дей- ствие выполняется только тогда, когда выполняется записанное в ромбе усло- вие. В случае невыполнения условия происходит переход к следующему опера- тору (выход из структуры). На рис. 2 изображена полная форма условного опе- ратора, в случае выполнения условия (выход «+» из ромба) выполняется одно действие, в случае невыполнения (выход «-») - другое действие. Рис. 1. Сокращенная форма оператора 1Р Каждая структура имеет один вход и один выход. Программу рекоменду- ется строить из последовательных, логически завершенных блоков, не допуская передачи управления из одного блока в другой. Такая программа содержит
меньше ошибок при разработке, легче проверяется на правильность выполне- ния. Неполный условный оператор имеет вид: 1Е условие ТНЕЫ оператор; Полный условный оператор: 1Е условие ТНЕХ оператор_1 ЕЬ8Е оператор_2 ; В различных случаях после слов ТНЕК и ЕЕ8Е надо выполнить не один оператор, а несколько. Тогда эти операторы заключаются в так называемые операторные скобки, открывающая скобка которых - слово ВЕОЕЫ, а закрыва- ющая - слово ЕИП: Ье^ш {операторы} епй; Перед словом ЕЕ8Е точка с запятой не ставится. В операторных скобках рекомендуется каждую пару ВЕОШ - ЕК’О записывать в одном столбце, так легче проверить соответствие каждой открывающей скобке закрывающей. Примеры условного оператора: На < Ь Шеп у := х; И х < 0 Шеп х := -х; {изменения знака переменной х} И а + Ь < с Шеп Ье§т х := х; {обмен значениями переменными х и у } х :=у; у :=/ епй; В качестве выполняемого в условном операторе действия может быть другой условный оператор. Например: И кцг (х) + 8цг (у) > 1 Шеп И х > у Шеп х := О еке х := 1; При такой форме записи, использующей сдвиг вправо для каждого внут- реннего действия, легко понять, к какому из двух слов 1Р относится слово ЕЕ8Е. Если бы этот оператор записать в одну строку, то ответ будет неодно- значным. Транслятор поступает следующим образом. Встретив сложную кон- струкцию из вложенных условных операторов, он анализирует ее с конца, при-
писывая последнее найденное ЕЬ8Е первому встреченному при просмотре справа налево 1Р. Рассмотрим пример программы с использованием условного оператора. Пусть для двух целых чисел надо определить, являются они четными или нет. Для проверки четности используем условие: остаток от деления на два четного числа равен нулю. рго^гат ЕЗ; уаг а, Ь ' ш4е§ег; Ье§1п тупМп (‘ введите два целых числа ‘); геай1п (а, Ь); И а той 2—0 (11 еп туп(е1п (‘а - четное1) еке туп(е1п (‘а - нечетное1); И Ь той 2 = 0 (Ьеп туп(е (‘ Ь четное1) еке туп(е (‘ Ь - нечетное1) епй. Логические выражения. Алгоритм решения квадратного уравнения со- держит проверку условия <1 < 0. Два значения, <1 и 0 связаны отношением «О> - меньше. Если условие выполняется, то говорят, что соответствующее выраже- ние истинно, если не выполняется - выражение ложно. Речь идет о логическом выражении. Для построения сложных условий в Паскале имеются логические операции апй( и), ог (или) и по! (не). Обозначив истинное значение 1 и ложное через 0, построим таблицы истинности для этих операций. Рассмотрим примеры построения сложных логических выражений. 1. Пусть требуется определить, принадлежит ли точка с координатой X отрезку [а;Ь]. Если записать это условие двойным неравенством, то мы читаем это неравенство так: Xменьше либо равен Ь и больше либо равен а (а<=Х<=Ь). Отношение «меньше либо равно» в Паскале записывается двумя знаками. Ана- логично записывается и «больше либо равно». Однако, в Паскале нельзя запи- сывать двойное неравенство. Используя логическую операцию «и» запишем: ( х >= а) апй (х <— Ь) Отношения, между которыми стоит логическая операция, заключаются в круглые скобки.
по! X х по! X 1 0 0 1 Рис. 3. Таблицы истинности логических операций 2. Имеется прямоугольное отверстие со сторонами а и Ъ и кирпич с реб- рами х, у, г. Требуется составить условие прохождения кирпича в отверстие. Кирпич пройдет в прямоугольное отверстие, если выполнится сложное условие: (а <= х ) апй ( Ь <— у) ог (а <= у) апй ( Ь <- х) ог ( а <= х) апй ( Ь <— х) ог (а <- г) апй ( Ь <= х) ог (а <- у) апй ( Ь <= х) ог ( а <= г) апй (Ь <= у) Для трех граней шесть условий получается потому, что можно каждую грань повернуть на 90° и проверить для каждой грани два случая. 3. Определить принадлежность точки фигуре. Пусть фигура задана огра- ничивающими ее прямыми (рис. 4). Для каждой прямой определим полуплос- кость, в которой находится фигура - треугольник АВС. Полуплоскость задается неравенством.
Полуплоскость, выше оси X неравенством У О находящаяся определяется Полуплоскость, находящаяся справа от прямой, соединяющей точки (-1,0) и (0,2) задается неравенством V - 2Х - 2 < 0. Рис. 4. Определение принадлежности точки фигуре Полуплоскость, находящаяся слева от прямой, соединяющей точки (1,0) и (0,2) задается неравенством X +2Х - 2 < 0. Условие принадлежности точки (Х,У) данной фигуре: (X > 0) апй (X - 2*Х -2) апй (X + 2*Х - 2) 4. Приведем пример программы определения существования треугольника со сторонами а, Ь и с. Условие существования треугольника известно из геомет- рии: сумма двух любых сторон должна быть больше третьей. Следовательно, для всех сторон условие «сумма двух больше третьей» должно выполняться. рго^гаш Е4; уаг а,Ь,с:геа1; Ье§ш лугйе1п (‘введите длины грех сторон треугольника1); геайЕп (а,Ь,с); хугйе (‘ треугольник со сторонами ‘, а, Ь, с); И (а + Ь < с) апй (Ь + с < а) апй (а + с < Ь) Шеп уугйе (‘существует1) еке лугйе (‘не существует1); геай1п епй. Вопросы и задания 1. Как транслятор анализирует вложенные условные операторы? 2. Как работает неполный условный оператор? 3. Как проверить, является ли целое число нечетным? 4. Как выполняются логические операции «и», «или», «не»?
Напишите программы на Паскале для решения следующих задач. 5. Даны три числа а, Ъ и с. Выяснить, верно ли а < Ь < с. Ответ получить в текстовой форме: верно или неверно. 6. Даны положительные числа а, Ь, с, х. Выяснить, пройдет ли кирпич с ребрами а, Ъ, с в квадратное отверстие со стороной х. 7. Выяснить, принадлежат ли числа а и Ь промежутку (-1;1). 8. Даны числа х и у. Вычислить число х, равное х + у, если х <= у и 1-х+у в противном случае. 9. Присвоить г значение большего из чисел х и у в том случае, если х<0, и меньшего, если х> = 0. 10. Даны три действительных числа. Выбрать те из них, которые принад- лежат отрезку [1;3]. 11. Присвоить величине а значение наибольшего из трех заданных чисел. 12. Даны два числа. Вывести первое из них, если оно больше второго, и оба числа, если это не так. 13. Проверить, есть ли среди трех заданных чисел равные. 14. Даны два действительных числа. Меньшее из них заменить полусум- мой этих чисел, а большее - их произведением. 15. Вычислить наименьшее из трех заданных чисел. 16. Найти решение уравнения ах + Ъ = 0, если оно существует. 17. Если данное число х меньше нуля, то х присвоить значение большего из двух чисел х и у, иначе х присвоить значение полусуммы этих чисел. 18. Даны три действительных числа. Найти наибольшее значение из их суммы и произведения. 19. Даны действительные числа а, Ь и с. Удвоить эти числа, если они яв- ляются упорядоченными по возрастанию.
Лабораторное задание 2. Разветвляющиеся вычислительные процессы. Сокращенная форма оператора 1Р Цель - получение практических навыков программирования разветвляю- щихся вычислительных процессов с применением сокращенной формы опера- тора 1Р. Задание. Необходимо решить в редакторе Разса! задачу вычисления и вывода значений функции у = /(х), применяя сокращенную форму оператора 1Р. Создать блок-схему алгоритма решения задачи. Выполнить программу и проанализировать результаты ее работы (проведя параллельные вычисления в табличном процессоре). Варианты заданий Вариант № У = /(х) 1. у = - 3/х2 при х < -1, х2 сое х при 1 > х > -7, х + 15 при 4 > х > 1, 3 + х* 1/7 + 1 при х>4. 2. У = ‘ 7х4 при х>18, 1^(х + 1) при 18 >12, е ' при 12 > х > 7, Г§х\ при х<1. 3. У = < ГС08л/х+1 при х>24, 1§(2х) при 24 > х >15, 1/х+54 при 15>т>3, \с/§х\ при х<3. 4. У = при х > 2, 8Ш2 х при 2 > х > 1, < 1д:(7х) при 1 > х > 0,5 х2 при х<0,5.
Вариант № У = /(*) 5. '1 1 у = \ г3+17 пр» л: <-10, п|х3+17 при -10<х<-4, У?+.34 при -4<х<0, г+21 при х>0. 2 6. У = ' Зл/х2+20 при х<-4, 7 зт х при - 4 < х < 3, 1§х при 3 < х < 8, 8т(х + 1) при х>8. 7. У = < ^[х|+5тл/2 пРи *<-Ю, соз(х+3) при -10<х<9, ^х + 4 при 9<х<15, х + 7 8/(х + 21) при х>15. 8. У = 1п х при х > 6, сое3 х при 4 < х < 6, ' ех при - 2 < х < 4, зт х при х<-2. _х+ 25 9. у = - \/л| + 3 пРи л<-15, х3+со8х при -15<х<8, 4 х3 + 1пх при 8<х<15, х + 12 при х>15.
Вариант № 10. У = < при х > 5, 8т2 х при 5>х>3, ех при 3 > х > 1, созх + 7 при х<1. 11. У-< 8т3 х при х > 34, при 34 > х > 20, соа4 х при 20>х>10, х+10 при х<10. 12. у=' 8‘п х + 7 при х < 3, созх + 21 5Д + 1п(х + Ю) при 3<х<9, л/х + 25 при 9 < х < 24, 9х4 при х > 24. 13. У = х3 + 7(х + 4)2 при х < -1, ат х +1 при - 7 < х < 5, СО8Х + 12 хТР + 2 при 5<х<14, 1пх при х>14. 14. у-- х соз х + 9 при х < 3, 2зтх 1Ух-24+0,5 при 3<х<11, 1§х при 11<х<25, 2(х + 1) при х>25.
Вариант № У = /(х) 15. У = 1/х2 при х>3, е‘ при 3 > х > 2, х + 3 при 2>х>-10, X Юх+ 4 при х<-10. 16. У = 5/у при х > 11, 7ед при 11 > х > 4, • 8Ш2х при 4>х>1, х2 + 4 при х < 1. 1 3 Методические указания по выполнению лабораторной работы В процессе выполнения лабораторной работы нужно вычислить значение функции, заданной различными формулами на разных участках ее определения с применением сокращенной инструкции оператора 1Р: И <условие> Й1еп <опсратор>; Рассматриваемый метод решения задачи носит название метода проверки ветвей. Сущность метода заключается в том, что для каждой области задания функции составляется логическое выражение (в том числе с использованием логического союза апй), которое принимает значение ИСТИНА (ТЯНЕ), если аргумент х принадлежит данной области, и значение ЛОЖЬ (РАЕ8Е), если ар- гумент х не принадлежит данной области. Количество инструкций 1Р, используемое в программе, будет зависеть от числа ветвей разветвления. В ходе работы программы будут осуществлены все проверки в инструкциях 1Р, что является в определенной степени недостатком данного метода. Преимуществом рассматриваемого подхода является простота записи кода программы (сложно допустить ошибку). При подготовке набора данных для проверки работы программы необхо- димо помнить о том, что количество тестовых наборов данных будет зависеть от числа расчетных формул. Один тестовый набор данных позволяет проверить лишь одну ветвь разветвления. В отчет необходимо включить экранные снимки выполнения программы в редакторе Разса!. Для проверки корректности составленной программы реко- мендуется провести параллельные расчеты в табличном процессоре (с приме-
нением, при необходимости, встроенных математических функций). В отчет по лабораторной работе рекомендуется поместить экранный снимок результата данной проверки. Пример оформления отчета по лабораторной работе Вариант №16 Цель - получение практических навыков программирования разветвляющихся вычислительных процессов с применением сокращенной формы оператора 1Р. Задание. Необходимо решить в редакторе Разса! задачу вычисления и вывода значений функции при X > 1 1, 7е' при 1 1 > X -4, У = < зш2 X при 4>х> 1, х2 + 4 при х < 1. . 3 применяя сокращенную форму оператора 1Р. Создать блок-схему алгоритма решения задачи. Выполнить программу и проанализировать результаты ее работы (проведя па- раллельные вычисления в табличном процессоре). 5 Г “,ПХ Решение. Выражение \/х можно записать в виде е5
Блок-схема алгоритма решения задачи:
Код программы: рго§гаш 1аЪ 2; {Лабораторная работа 2 обучающегося группы БИ-б-о-201 Петрова П.П.} уаг х, у: геа1; Ье§1п {Сообщение для пользователя о необходимости ввода исходных данных} уугйе(* Введите х=’); геас11п(х): {вводзначения переменной х с клавиатуры} И х > 11 111еп {проверка первого условия} у := ехр(1/5*1п(х)); (Проверка второго условия; поскольку условие является составным, его части заключаются в круглые скобки и объединяются логическим союзом АПО} И (х <= 11) апс! (х > 4) (йен у := 7*ехр(х); В (х <= 4) апс! (х > Г) 1йеп {проверка третьего условия} у := 8дг(8т(х)); Их <= 1 (йеп {проверка четвертого условия} у := (8дг(х)+4)/3; [Вывод на экран значения у (отформатированный вид - два знака после запя- той)} уугйе1п(‘у=’, у : 8 ; 2); геасПп; епс1. Экранные снимки выполнения кода программы в редакторе Рааса!: таитраз 1 1аЬ_2 2 {Лабораторная работа 2 3 обучающегося группы БИ-б-о-201 4 Петрова П.П.} 5 6 х у: геа! 8 ыгйе( ' Введите х=’) 9 геаЛп(х) 10 х > 11 1Кеп 11 у ехр(1 5 1п(х)) 12 (х < 11) (х > 4) 13 у 7 ехр(х) I 14 Ц7 (х < 4) Апс! (х > 1) 15 у 5Цг(б1п(х)) 16 1Т X < 1 [ 17 у (5дг(х) 4) 3 18 ыг1±е1п(’у=‘ у : 8 : 2) 19 геаЛп 20
Введите х—17 Экранный снимок выполнения вычислений в табличном процессоре: Результаты выполнения программы в редакторе Разса! и проведения парал- лельных вычислений в табличном процессоре: Значение х Результаты вычислений Редактор Разса! Табличный процессор 17 1,76 1,76 8 20866,71 20866,71 2 0,83 0,83 -3 4,33 4,33 Выводы. Поскольку результаты выполнения разработанной программы совпали с результатами расчетов в табличном процессоре, можно говорить о том, что про- грамма составлена верно.
Контрольные вопросы 1. Какие операторы применяются в Разса! для построения разветвляющихся алгоритмов? 2. Опишите синтаксис сокращенной формы оператора 1Р. 3. Какое количество операторов можно записать после ключевого слова Нтеп? 4. Что Вы знаете об использовании логических союзов в РазсаГ? 5. Как записываются сложные логические условия в Разса!? 6. Представьте в форме блок-схемы сокращенную инструкцию оператора 1Р. 7. Расскажите о преимуществах и недостатках примененного в лаборатор- ной работе алгоритма решения задачи.
Лабораторное задание 3. Разветвляющиеся вычислительные процессы. Использование вложенных инструкций 1Е ТНЕ№ ЕЕ8Е Цель - получение практических навыков программирования разветвляю- щихся вычислительных процессов с применением полной формы оператора 1Р. Задание. Необходимо решить в редакторе Разса! задачу вычисления и вывода значений функции у = /(х), применяя полную форму оператора 1Р. Со- здать блок-схему алгоритма решения задачи. Выполнить программу и проана- лизировать результаты ее работы (проведя параллельные вычисления в таблич- ном процессоре). Варианты заданий Вариант № У = /(л) 1. У = 3/х2 при х<-7, х2 соз х при 1 > х > -7, х + 15 при 4 > х > 1, 3 + х2 Д/х+1 при х>4. 2. У = ' 7х* при х>18, 1^(х +1) при 18>х>12, е ' при 12 > х > 7, Г§х\ при х < 7. 3. У = созд/х + 1 при х > 24, 1§(2х) при 24>х>15, ^х + 54 при 15>х>3, \с(§х\ при х<3. 4. У = е-; при х > 2, 8т2 х при 2 > х > 1, 1д:(7х) при 1>х>0,5 х2 при х<0,5.
Вариант № У = /(*) 5. '1 1 у = \ г3+17 пр» л: <-10, п|х3+17 при -10<х<-4, У?+.34 при -4<х<0, г+21 при х>0. 2 6. У = ' Зл/х2+20 при х<-4, 7 зт х при — 4 < х < 3, 1§х при 3 < х < 8, 8т(х + 1) при х>8. 7. У = < ^[х|+5тл/2 пРи *<-Ю, соз(х + 3) при -10<х<9, + 4 при 9<х<15, х + 7 8/(х + 21) при х>15. 8. У = 1п х при х > 6, сое3 х при 4 < х < 6, ' ех при - 2 < х < 4, зт х при х<-2. _х+ 25 9. У=’ \/л| + 3 пРи ^^-15, х3 + со8х при -15<х<8, 4 х3 + 1пх при 8<х<15, х + 12 при х>15.
Вариант № 10. У = < при х > 5, 8т2 х при 5>х>3, ех при 3 > х > 1, созх + 7 при х<1. 11. У-< 8т3 х при х > 34, при 34 > х > 20, соа4 х при 20>х>10, х+10 при х<10. 12. у=' 8Ш х + 7 при х < 3, созх + 21 5Д + 1п(ж + 10) при 3<х<9, л/х + 25 при 9 < X < 24, 9х4 при х > 24. 13. У = х3 + 7(х + 4)2 при х < -1, ат х +1 при - 7 < х < 5, СО8Х + 12 хл/Р + 2 при 5<х<14, 1пх при х>14. 14. у-- х соз х + 9 при х < 3, 2зтх ^х-24+0,5 при 3<х<11, 1§х при 11<х<25, 2(х + 1) при х>25.
Вариант № У = /№ 15. У = 1/х2 при х>3, е‘ при 3 > х > 2, х + 3 при 2>х>-10, X Юх+ 4 при х<-10. 16. У = 5/у при х > 11, 7ед при 11 > х > 4, • 8Ш2х при 4>х>1, х2 + 4 при х < 1. 1 3 Методические указания по выполнению лабораторной работы В процессе выполнения лабораторной работы нужно вычислить значение функции, заданной различными формулами на разных участках ее определения с применением полной инструкции оператора 1Р: И<условие> Шеп <опсратор 1> еКе <оператор 2>; Рассматриваемый метод решения задачи называется методом проверки точек ветвления. В процессе построения кода программы следует помнить: - проверку точек ветвления необходимо начинать с одной из крайних точек (для варианта 16 такими точками являются точки 11 и 1); - если точка ветвления задается двумя отношениями, то из этих отношений в полной инструкции оператора 1Р выбирается то, для которого по направлению Шеп можно выделить расчетную формулу. В ходе применения данного метода суммарное число операторов 1Р не будет превосходить числа точек ветвления. Во всех задачах данной лаборатор- ной работы таких точек три. При составлении кода программы следует помнить, что в операторе 1Р перед служебным словом е1зе точка с запятой не ставится. Преимуществом рассматриваемого метода решения задачи является меньшее среднее время выполнения, поскольку после выполнения выбранного оператора присваивания дальнейшие проверки во вложенных операторах 1Р не производятся. При подготовке набора данных для проверки работы программы необхо- димо помнить о том, что количество тестовых наборов данных будет зависеть
от числа расчетных формул. Один тестовый набор данных позволяет проверить лишь одну ветвь разветвления. В отчет необходимо включить экранные снимки выполнения программы в редакторе Разса!. Для проверки корректности составленной программы реко- мендуется провести параллельные расчеты в табличном процессоре (с приме- нением, при необходимости, встроенных математических функций). В отчет по лабораторной работе рекомендуется поместить экранный снимок результата данной проверки. Пример оформления отчета по лабораторной работе Вариант №16 Цель - получение практических навыков программирования разветвляющихся вычислительных процессов с применением полной формы оператора 1Р. Задание. Необходимо решить в редакторе Разса! задачу вычисления и вывода значений функции V* при X > 11, 7с‘ при 11 > X > 4, ЯП3 X при 4 > х > 1, х-+4 при х < 1. 3 применяя полную форму оператора 1Р. Создать блок-схему алгоритма решения зада- чи. Выполнить программу и проанализировать результаты ее работы (проведя парал- лельные вычисления в табличном процессоре). Решение. Выражение можно записать в виде е5 Код программы: рго§гаш 1аЬ 3; {Лабораторная работа 3 обучающегося группы БИ-б-о-201 Петрова П.П.} уаг х, у: геа1; {описание переменных} Ье§ш {Вывод сообщения для пользователя о необходимости ввода исходных данных} мгйе(‘Введите х=’); геасйп(х); {ввод исходных данных с клавиатуры} И'х> 11 Пзеп {проверяем условие х> 11} у := ехр(1/5*1п(х))
{Если условие х>11 не выполняется, то автоматически выполняется условие х<=11, поэтому на данном этапе нужно проверить только условие х>4} екс И х > 4 (Беп у := 7*ехр(х) {Если условие х>4 не выполняется, то автоматически выполняется условие х<=4, поэтому на данном этапе нужно проверить только условие х>1} еЬе И х > 1 Й1еп у := 8дг(81п(х)) {Если условие х>1 не выполняется, то автоматически выполняется условие х<=1, поэтому можно сразу произвести вычисления по формуле} еке у := (8дг(х)+4)/3 ; {Выводим на экран значение у: отформатированный вид} зугке1п(‘у=’, у : 8 : 2); геасПп: епй Блок-схема алгоритма решения задачи:
Экранные снимки выполнения кода программы в редакторе Ракса!: 0 ► Рип Е О РеЬид | Д 31ор | В . Н 5ауе та1п.ра5 1 рго^гаш 1аЬ_3; 2 {Лабораторная работа 3 3 обучающегося группы БИ-б-о-201 I 4 Петрова П.П.} 5 уэг 6 х у: геа! 7 гги- 8 ыгйе(1 Введите х='); 9 геас11п(х) I 10 х > 11 Кел 11 у ехр(1 5 1п(х)) 12 х > 4 13 у 7 ехр(х) | 15 у 5дг(51п(х)) 16 ь 17 у (бЧг(х) 4) 3 18 иг1±е1п('у=' у : 8 : 2); Экранный снимок выполнения вычислений в табличном процессоре:
Результаты выполнения программы в редакторе Разса! и проведения парал- лельных вычислений в табличном процессоре: Значение х Результаты вычислений Редактор Разса! Табличный процессор 17 1,76 1,76 8 20866,71 20866,71 2 0,83 0,83 -3 4,33 4,33 Выводы. Поскольку результаты выполнения разработанной программы совпали с результатами расчетов в табличном процессоре, можно говорить о том, что про- грамма составлена верно. Контрольные вопросы 1. Опишите синтаксис полной формы оператора 1Р. 2. Какое количество операторов можно записать после ключевых слов Шеп и еке? 3. Представьте в форме блок-схемы полную инструкцию оператора ГР. 4. Расскажите о преимуществах и недостатках примененного в лаборатор- ной работе алгоритма решения задачи. 5. Как поступить, если после ключевых слов Шеп или еке нужно выполнить сразу несколько операторов? 1.4. Организация циклов Компьютер может заданное число раз выполнить одни и те же действия с разными данными. Повторяющиеся действия в программировании называются циклом. Цикл не может выполняться вечно, в этом случае нарушается свойство алгоритма решить задачу за конечное число шагов. Цикл заканчивается по ка- кому-либо условию. Проверка этого условия может производиться в начале каждого повторяющегося шага, в этом случае цикл называется «пока». При проверке условия в конце каждого шага цикл называется «до». Разновидностью цикла «до» является также цикл «пересчет». В цикле «пока» сначала проверяется условие и, если оно выполняется, т. е. логическое выражение истинно, то выполняется оператор и снова проверя- ется условие. Записанное в цикле «пока» условие является условием продолже- ния цикла. Как только оно перестанет выполняться, цикл завершится. Выход из ромба «+» (или «да») означает выполнение условия цикла, «-» (или «нет») - невыполнение. Цикл «пока» не выполнится ни разу, если условие при входе в структуру оказалось ложно. Как правило, цикл «пока» содержит условие по- вторения, а цикл «до» - условие окончания работы цикла. Обе структуры име- ют один вход и один выход. Однако, цикл «до» всегда выполняется хотя бы
один раз, потому что условие проверяется после выполнения действия. Это за- трудняет проверку правильности программы, поэтому лучше использовать цикл «пока». Оператор в цикле может быть простым или составным, заключен- ным в операторные скобки. В этом случае в цикле могут повторяться не один оператор, а несколько. Повторяющиеся в цикле операторы называются телом цикла. Циклы можно организовывать, используя различные средства языка Пас- каль. Оператор безусловного перехода. Этот оператор позволяет перейти без проверки условия либо на один из предыдущих операторов, либо на один из по- следующих, т. е. изменить порядок выполнения команд. Общий вид оператора: §ою п; где п - целое число, не более чем из четырех цифр, называемое меткой. Метка появляется в программе три раза: 1) в описательной части в разделе ЬаЬе1; 2) в операторе щйо; 3) перед оператором, на который осуществляется безусловный переход, в этом случае метка от оператора отделяется двоеточием. Организация циклов с помощью операторов условного и безусловно- го переходов. Пусть требуется вычислить наибольший общий делитель двух натуральных чисел А и В. Воспользуемся алгоритмом Евклида: будем уменьшать каждый раз большее из чисел на величину меньшего до тех пор, по- ка оба значения не станут равны. Исходные Первыи данные шаг А = 25 А = 10 В = 15 В = 15 Второй шаг А = 10 В = 5 Третий шаг А=5 В = 5 НОД (А,В) = 5 Рис. 5. Выполнение алгоритма Евклида рго^гаш Е5; 1аЬе1 1,2; уаг а , Ь: т€е§ег; Ьещп уугйе(‘введите два натуральных числа’); геай1п(а,Ь); 1: И а = Ь Шеп ^оШ 2; И а > Ь Шеп а := а - Ь еке Ь := Ь - а; §ош и 2: мтке (‘ НОД(‘ , а, ‘‘, Ь, ‘ ) = ‘, а) СП(1.
Оператор цикла «пока». Как видно из предыдущего примера, цикличе- ский процесс можно организовать без использования специальных операторов. Однако, при составлении достаточно серьезных программ, использовать опера- тор безусловного перехода не рекомендуется, т. к. можно быстро запутаться при проверке программы. Оператор цикла «пока» имеет вид: ккИе условие с1о оператор; и выполняется следующим образом: оператор (тело цикла) повторяется до тех пор, пока выполняется условие (истинно логическое выражение). Оператор может быть простым или составным, заключенным в операторные скобки Ье§1п ... епй. Для алгоритма Евклида программа примет вид: рго&гаш Е6; уаг а, Ь : т^е^ег, Ье§т \угйе(‘введите два натуральных числа’); геаЛ1п(а,Ь); туЫ1е а <> Ь До И а > Ь ТЬеп а := а - Ь еке Ь := Ь - а; тугйе НОД(‘, а, ‘‘ , Ъ, ‘ ) = ‘, а) епД. Оператор цикла «до». Проверка условия в цикле «до» осуществляется после выполнения оператора. Если условие в цикле «пока» является условием продолжения повторений, то условие в цикле «до» - условием выхода из цикла, его завершением. Поэтому для одной и той же задачи эти условия противопо- ложны. Общий вид оператора: гереМ оператор ипШ условие; Между словами гереа1 (повторить) и ипШ (до тех пор пока) можно запи- сать любое количество операторов без использования операторных скобок. Пе- ред словом ип(Н не ставится точка с запятой. Программа нахождения наибольшего общего делителя примет вид: рго&гаш Е7; уаг а, Ь ' 1п1е§ег; Ье§ш уугйе(‘введите два натуральных числа’); геаД1п(а,Ь); гереа!
И а > Ь Шеп а := а - Ь; ИЬ > а Шеп Ь := Ь - а ипШ а-Ь; тугйе (‘ НОД(‘, а, ‘, Ь, ‘‘, а) епй. Операторы циклов «пересчет». При выполнении программ нахождения наибольшего общего делителя число повторений различно для разных данных. Когда известно число повторений, удобно использовать цикл «пересчет». В Паскале имеются два оператора для организации циклов «пересчет»: прямой и обратный. Прямой пересчет идет от известного меньшего числа до известного большего, на каждом шаге прибавляется единица (например, от 120 до 140: 121, 122, 123,... 139, 140). Оператор прямого пересчета: Гот 1 :=п1 Ш п2 йо оператор ; читается как «для / начиная с «у до ль выполнить оператор». Переменная / называется переменной цикла, она при прямом пересчете всегда меняется от меньшего значения до большего. При / = иу цикл выполня- ется первый раз. Затем к значению переменной / добавляется единица и осу- ществляется проверка, не превысило ли полученное значение величину п2. Если I + 1 <= п2, то оператор выполняется, если это условие неверно, то происходит выход из цикла и выполнение следующего по порядку оператора программы. Поскольку оператор цикла /ог сам изменяет значение переменной цикла, ее нельзя менять другими способами, например, присваиванием ей какого-либо значения в теле цикла (она не должна появиться слева от знака :=). Оператор в цикле может быть простым или составным, заключенным в операторные скобки. Оператор «пересчет» работает как цикл «до», поэтому надо быть внимательным, оператор в теле цикла выполнится всегда хотя бы один раз. Рассмотрим примеры использования операторов цикла. 1. Пусть надо вычислить ап. Известно, что целая степень п числа - это его произведение п раз. Это произведение при выполнении программы будет хра- ниться в ячейке с именем р. Каждый раз, при очередном выполнении цикла, из этой ячейки будет считываться предыдущий результат, домножаться на осно- вание степени а и снова записываться в ячейку р. Основной оператор в теле цикла повторяется п раз и имеет вид: р := р * а ; При первом выполнении цик- ла в ячейке р должно находиться число, не влияющее на умножение, т. е. до цикла туда надо записать единицу. Программа имеет вид: рго^гаш Е8; уаг а,р: геа1; 1, п. шШ§ег; Ье§1п уугйс (‘введите а - основание степени, а = ’);
геас11 п (а); тгпГе(‘ введите целое п - показатель степени, п = ’); гсас11п (п); Р := 1; Гог 1 := 1 Го п До р :=р * а ; лупГе (‘ р= ‘, р) епД. 1 1 2 3 4 р 2 4 8 16 В таблице представлен протокол выполнения программы при возведении числа 2 в четвертую степень. Таблица заполнена вручную, процесс ее заполне- ния называется отладкой программы. Отладка - это проверка всех этапов рабо- ты программы. Для сложных задач сначала составляется контрольный пример (тест) и программа выполняется человеком, который выполняет каждый опера- тор так, как его выполняет компьютер. Затем программу выполняет компьютер и сверяются все промежуточные полученные при счете данные и конечные ре- зультаты. Только после полного совпадения программа выполняется с реаль- ными данными. Для понимания работы программы, выполнения отдельных операторов полезно заполнять подобные протоколы для всех учебных задач. 2. Вычисление р = п ! (и факториал). По определению п ! = 1 * 2 * 3 * .... * п. Используя предыдущую про- грамму вычислим р как произведение чисел от 1 до п, т. е. р каждый раз умно- жается не на одно и то же число, а на значение переменной цикла. рго^гаш Е9; уаг р, 1, п: шГе^ег; Ье§т лупГе(‘ введите целое п = ‘); геаДГп (п); Р := 1; Гог 1 := 1 Го п До р :=р * 1; лупГе (‘ п ! = ‘, р) епД. 3. Составление таблицы значений функции у = зт х. Пусть требуется со- ставить таблицу значений функции на отрезке [ 0; 3.14] с шагом 0,1. Для того, чтобы не вычислять количество повторений вычислений, можно воспользо- ваться циклом «пока». Используя вывод вещественных чисел с фиксированной точкой, определим, что количество цифр после запятой в значении функции будет равно пяти. Тогда все число, учитывая область значений синуса, займет
семь позиций (числа положительные, значит добавится позиция для десятичной точки и целой части числа), Программа имеет вид: рго§гат ЕЮ; уаг х, у : геа1; Ьещп х := 0; ттпГе1п ( ‘ х’ : 10, ‘зт х’ : 10); мЬПе х < = 3.14 йо Ье§1п у := зт ( х); мгйе1п (х : 10: 1, ‘ ‘, у : 7 : 5); х :=х + 0.1 епй епй. При каждом выполнении цикла будет сначала проверяться условие (у < = 3.14), затем вычисляться значение функции, печататься аргумент х (для него отведено десять позиций, из них одна - для цифры дробной части) и, через три пробела, - значение функции и, наконец, для следующего шага цикла - вы- числяться новое значение аргумента (х увеличится на 0,1). Цикл «пока» позво- ляет изменять переменную цикла как угодно, увеличивая ее или уменьшая на любое значение. 4, Суммирование чисел. При суммировании, как и при умножении не- скольких чисел, необходимо накапливать результат в некоторой ячейке памяти, каждый раз считывая из этой ячейки предыдущее значение суммы и увеличивая его на очередное слагаемое. Пусть известно, что будут складываться п чисел. В этом случае надо п раз выполнить действие з := з + а; где а - очередное число, вводимое с клавиатуры. Для первого выполнения этого оператора присваива- ния надо из ячейки с именем у взять такое число, которое не повлияло бы на ре- зультат сложения. Следовательно, до цикла надо поместить в эту ячейку (или, что то же самое, присвоить переменной \) число ноль. Программа имеет вид: рго§гат Е11; уаг а, з : геа1; 1, п : 1пГе§ег; Ье§1п тугйе (‘ введите количество слагаемых п = ‘); геай1п (п); з := 0; Гог 1 := 1 Го г. йо Ье§т уугйе (1, ое число = ‘);
геас11п (а); 8 := 8 + а епй; мтйе(‘ сумма 8 = ’ , 8) епй. Если количество чисел неизвестно, то можно задать число-ограничитель, например, ноль. В таком случае используется цикл и’Л/'/е или гереа(. 8 :=0; геас11п (а); М'Ы1е а о 0 йо Ье§т 8 := 8 + а; геай1п (а) епй; 8 :=0; гереаГ геас11п (а); 8 := 8 + а 1П1В1 а = 0; Оператор цикла «обратный пересчет» работает аналогично оператору цикла прямого пересчета, только переменная цикла не возрастает с каждым ша- гом на единицу, а на единицу убывает. Оператор имеет вид: Гог 1 := п2 йомпЮ п1 йо оператор; Для этого оператора должно также выполняться п2 > = п1. При использовании в программе операторов цикла необходимо со блюдать следующие правила: - внутри цикла может находиться другой цикл, но циклы должны иметь разные переменные и внутренний цикл должен полностью находиться в теле внешнего цикла; - нельзя передавать управление в тело цикла, минуя заголовок (это зна- чит, что метка и оператор ао(о с этой меткой должны находиться в теле цикла); - если необходимо обойти группу операторов в теле цикла и продолжить цикл, т. е. выполнить его следующий шаг, то надо передать управление на за- мыкающий цикл епс1; - можно досрочно выйти из цикла, используя или оператор рого, или из- менив параметр условия в операторах н’кИе и гереа! так, чтобы цикл больше не выполнялся. Вопросы и задания 1. Пусть тело цикла в программе Е7 такое же, как в программе Е6. Как будет работать программа, если ввести два одинаковых числа а и д? 2. Сколько раз выполнится оператор цикла гереаГ, если условие после слова ппШ истинно при входе в цикл?
3. Объясните, какая разница между условиями, записанными после слов ууЫ1е и гереа! для одной и той же задачи? Напишите программы вычисления сумм'. 4. Для сорока слагаемых вида п - ?, где / = 1, 2, 3, ... ,40, а п - данное число. 5. Для п слагаемых вида х + /, где х - данное число, а / меняется от 1 до п. 6. Для ста слагаемых, имеющих вид дроби (; + !)/(*+ 2). 7. Для и слагаемых вида (I + I)2 / = 1, 2,..., п. 8. Для и слагаемых зт х + зт х2 + зт х3 + ... + зт хп. 9. Для п слагаемых зт х + згт х + зт3 х + ... + зт” х. 10. Кубов п первых натуральных чисел. 11. Для различных вводимых с клавиатуры целых чисел найти сумму по- ложительных нечетных. Напишите программы вычисления произведений: 12. а * (а + 1) * (а + 2) *... * (а + п - 1). 13. а *(а-п) * (а - 2 п) *...*( а- п2). 14. (х -1) (х - 2) (х - 3) ... (х - п). 15. 2 * 4 * 6 * ... * (2и). 16. ( 1+ зт 0.1) ( 1 + зт 0.2) ... ( 1 + зт 10). 17. Всех чисел от 1 до 100 кратных 3, но не кратных 6. 18. п сомножителей вида (х+1)~. 19. Дано положительное число А. Найти среди чисел 1,1 + 1/2, 1 + 1/3, ... первое, большее А. 20. Вводя числа с клавиатуры без ограничения их количества (конец вво- да - число ноль), найти сумму положительных и произведение отрицательных чисел. 21. соз 1 . соз 1 + с оз 2 . соз 1 + соз 2 + ... + соз п зт 1 зт 1 + зт 2 зт 1 + зт 2 + ... + зт п
Лабораторное задание 4. Циклические вычислительные процессы. Оператор ГОК Цель - получение практических навыков программирования циклических вычислительных процессов с применением оператора РОК. Задание. Необходимо решить в редакторе Разса! с применением операто- ра РОК задачу вычисления и вывода к значений функции у = /(х, р) для ряда равноотстоящих значений х, начиная от значения х1 и завершая значением х2. Параметр р вводится с клавиатуры во время выполнения программы или зада- ется в виде константы (на усмотрение обучающегося). Создать блок-схему ал- горитма решения задачи. Выполнить программу и проанализировать результа- ты ее работы (проведя параллельные вычисления в табличном процессоре). Варианты заданий Вариант № у=/(х,р) к Х2 1. У = х + р- х + 1 11 2 4 2. 11 1X4 р\ 17 4 8 1пх + р| + 1пх 3. 114рх' + л'2.1 У = 1 \ 17/2 + 28 11 1 4 4. у = 81П . >'1 Р\_ 21 1 2 5. Д’ = !§ К /24-Х 16 3 4,5 6. У /> + 24 Ух + 2/> 21 2 8 7. 1§(/22+х2 2/> + х ) 21 3 7 8. Л У = 1 х + 2/>х 11/2 11 2 3,5 9. \1р + Юх У = г р + ух 21 1 6 10. СОЕ У = \1р + х3 4+ р 11 1 2
Вариант № У = /(х,р) к хг 11. 8Ш4 X + СО84 V у = 81п2х + 3 11 2 3 12. ^2р + х +7 р р + 2х 21 1 И 13. \]р + СО8 X \р + 8Ш X 17 0 1 14. у] рх + Зх 3 ~ Зр3 + 2х 16 4 10 15. СО8 рх + СО82 X 14 + СО82 р 16 1 4 16. _ (§х - х3 + р У~ 4 + />2 11 0,5 1 Методические указания по выполнению лабораторной работы Оператор РОК удобно применять для реализации циклических алгорит- мов, в которых изначально известно количество повторений тела цикла. В процессе выполнения задания лабораторной работы необходимо при- менить оператор прямого пересчета. Его синтаксис: Гог . :=п1 Го п2 йо оператор ; где И/ - начальное значение переменной цикла (счетчика цикла); п2 - конечное значение счетчика цикла. Поскольку оператор цикла РОК сам изменяет значение переменной цик- ла, ее нельзя менять другими способами, например, присваиванием ей какого- либо значения в теле цикла. Переменная цикла может быть только целочислен- ного типа. Если в программе ее объявить вещественного типа, программа рабо- тать не будет. Общий вид алгоритма решения задач, относящихся к арифметическим циклам, можно представить в виде следующей блок-схемы:
В теле программы нужно предусмотреть ввод с клавиатуры исходных данных, - значений переменных к, х7, х?. Параметр р на усмотрение обучаю- щегося вводится с клавиатуры во время выполнения программы или задается в виде константы. Перед выполнением цикла необходимо присвоить переменной означение X/ (начальное значение) и определить величину шага изменения аргумента - дх по формуле: = ———. к 1 В теле цикла должно определяться значение у и выводиться на экран ре- зультат решения - значения д хи у. Результат работы программы желательно вывести на экран в форме таблицы с заголовком. Подготовка к очередному выполнению цикла должна заключаться в уве- личении значения аргумента хна величину <7х. В отчет необходимо включить экранный снимок выполнения программы в редакторе Разса!. Для проверки корректности составленной программы реко- мендуется провести параллельные расчеты в табличном процессоре (с приме- нением метода автозаполнения и, при необходимости, встроенных математиче- ских функций). В отчет но лабораторной работе рекомендуется поместить экранный снимок результата данной проверки. Пример оформления отчета по лабораторной работе Вариант №16 Цель - получение практических навыков программирования циклических вы- числительных процессов с применением оператора ГОК..
Задание. Необходимо решить в редакторе Ракса! с применением оператора ГОК /11 1 Л {ёХ - Х" + Р задачу вычисления и вывода к =11 значении функции у =---------- для ряда рав- 4 + р- ноотстоящих значений х, начиная от значения = 0,5 и завершая значением х2= 1. Параметр р вводится с клавиатуры во время выполнения программы или задается в виде константы (на усмотрение обучающегося). Создать блок-схему алгоритма реше- ния задачи. Выполнить программу и проанализировать результаты ее работы (прове- дя параллельные вычисления в табличном процессоре). 8111 X Решение. Выражение (§х можно записать в виде---. СО8Х Блок-схема алгоритма решения задачи:
Код программы: рго§гаш 1аЪ 4; {Лабораторная работа 4 обучающегося группы БИ-б-о-201 Петрова П.П.} сопя! р=3; {задаем параметр р в виде константы} \аг х, у, х! ,х2: геа1; ах: геа1; {шаг изменения аргумента} 1,к: ш!е§ег; {счетчик цикла} Ье§1п {Выводим на экран сообщение для пользователя о необходимости ввода исходных данных} \уп(е1п('Введите х1, х2, к'); геас11п(х1,х2,к); {ввод исходных данных с клавиатуры} х:=х!; {присваиваем переменной х начальное значение} ах:=(х2-хГ)/(к-1); {вычисляем шаг изменения аргумента} \уг|1е1п('Рсзулыа1ы работы программы'); {вывод на экран названия таблицы} \угйе1п("Номер': 5, 'х': 10, 'у': 10); {вывод на экран заголовка таблицы} {Вычисление значений у для ряда равноотстоящих значений х} Гог 1=1 1о к с!о {Операторные скобки необходимы, поскольку в теле цикла должен выполниться бо- лее, чем один оператор} Ье§1п у:=(8т(х)/со8(х)-8дг(х)*х+р)/(4+8дг(р)); \уп1е1п(1:5, х: 10:3, у: 10:3); {вывод на экран очередного значения у} х:=х+<1х; {увеличение х на величину шага изменения аргумента} епй; геасПп; епЛ. Экранный снимок выполнения кода программы в редакторе Рааса!: тат раз 4 Петрова П.П.} 5 сог п р 3 6 -л 7 х,у -х1 х2:геа!; 8 с!х:геа1; {шаг изменения аргумента} 9 1 к:1п1е{>ег; {счетчик цикла} 10 11 ыг1.1е1п('Введите х1, х2, к'); 12 геасИп(х1,х2,к) 13 х:=х1; 14 дх (х2 х1)/(к 1); 15 ыг11е1п('Результаты работы программы’); 16 ыгИе1п('Номер' : 5, ’х' : 10, 'у' : 10) 17 'Рог х:-1 Ро к с1о 18 Ье§1п 19 у (51п(х) соз(х) 5Дг(х) х р) (4 5Дг(р)) 20 ыгх^е1п(1:5 х:10:3 у: 10:3); 21 х: х с1х; 22 чи в. 23 геаЛп 24 25 26____________________________________________
Введите х1, х2, к 0.5 1 11 Результаты работы программы Номер X У 1 0.500 0.263 2 0.550 0.265 3 0.600 0.267 4 0.650 0.268 5 0.700 0.269 6 0.750 0.270 7 0.800 0.271 8 0.850 0.271 9 0.900 0.272 10 0.950 0.272 11 1.000 0.274 Экранный снимок выполнения вычислений в табличном процессоре: X ✓ Л -(ТАМ(В7) В7Л3«-$Р$4)/(4+$Р$4*2) 1 1 X У 1§х-хг+р 2 1 0,5 0,263 у- 4 + У 3 2 0,55 0,265 4 3 0,6 0,267 1 р= 1 з! 5 4 0,65 0,268 6 5 0,7 0,269 7 6 0,75 <ГА1Ч(В7)-В7Л3+$Е$4)/(4+$Е$4Л2)| 8 7 0,8 0,271 9 8 0,85 0,271 10 9 0,9 0,272 11 10 0,95 0,272 12 11 1 0,274 Результаты выполнения программы в редакторе Раяса! и проведения парал- лельных вычислений в табличном процессоре: Набор данных Результаты вычислений к Р X; X: Редактор Раяса! Табличный процессор 1 X У 1 X У 11 3 0,5 1 1 0,5 0,263 1 0,5 0,263 2 0,55 0.265 2 0,55 0,265 3 0.6 0,267 3 0,6 0,267 4 0.65 0,268 4 0,65 0,268 5 0,7 0,269 5 0,7 0,269 6 0,75 0,270 6 0,75 0,270 7 0,8 0,271 7 0,8 0,271 8 0,85 0,271 8 0,85 0,271 9 0.9 0,272 9 0,9 0,272 10 0,95 0,272 10 0.95 0,272 11 1 0,274 11 1 0,274
Выводы. Поскольку результаты выполнения разработанной программы совпали с результатами расчетов в табличном процессоре, можно говорить о том, что про- грамма составлена верно. Контрольные вопросы 1. Какие виды циклов в Разса! Вы знаете? 2. В каких случаях целесообразно применять цикл пересчет (цикл РОК)? 3. Запишите синтаксис цикла РОК для случаев прямого и обратного пере- счета. 4. Какое количество операторов может содержаться в теле цикла РОК? 5. Можно ли в теле цикла изменять значение счетчика цикла? 6. Какого типа может быть счетчик цикла? 7. Расскажите о преимуществах цикла РОК.
Лабораторное задание 5. Циклические вычислительные процессы. Операторы \МП ЕЕ и КЕРЕАТ 1АПЕ Цель - получение практических навыков программирования циклических вычислительных процессов с применением операторов АУН1ЕЕ и КЕРЕАТ 1ЖТ1Е. Задание. Необходимо решить в редакторе Разса! с применением операто- ров АУН1ЕЕ и КЕРЕАТ 1ЖТ1Е задачу вычисления и вывода к значений функ- ции у = /(х,р) для ряда равноотстоящих значений х, начиная от значения х, и завершая значением х,. Параметр р вводится с клавиатуры во время выполне- ния программы или задается в виде константы (на усмотрение обучающегося). Создать блок-схемы алгоритмов решения задачи. Выполнить программы и про- анализировать результаты их работы (проведя параллельные вычисления в таб- личном процессоре). Варианты заданий Вариант № к X, х2 1. у = - <]х + р2 х + 1 11 2 4 2. ПХ + р\ 17 4 8 1п X + р\ + 1п X 3. '4 рх2 + \/2х 17/2 + 28 11 1 4 4. . д/^+7 у = 81П 7Й 21 1 2 5. У = и \Р -X 16 3 4,5 6. р = />+24 д/х + 2р 21 2 8 7. г Мг + \1р + X ) 21 3 7 8. У-4^ 1х + 2рх 11/2 11 2 3,5 9. 1/ » +1 Ох У = г р + ух 21 1 6
Вариант № У = /(х,р) к хг 10. СО8д/ р + х' у =—- 4+ р 11 1 2 11. 81114 X + СО84 р У = 81п2х + 3 11 2 3 12. 1/2 р + х +1 р У = р + 1х 21 1 И 13. ^р + СО8Х у]\р + 81П X 17 0 1 14. д/ рх + Зх У= } 3 Зр + 2х 16 4 10 15. СО8 рх + СО82 х У = . . 14-1 СО8” р 16 1 4 16. 1§х -х3 + р у~ 4 + />2 11 0,5 1 Методические указания по выполнению лабораторной работы В процессе выполнения лабораторной работы необходимо составить две программы на языке Разса!, реализующих решение поставленной задачи, и по- строить соответствующие им блок-схемы. Первая программа должна реализо- вывать поставленную задачу с применением цикла АУН1ЕЕ, а вторая програм- ма - с применением цикла КЕРЕАТ 1ЖТ1Р. Циклы АУШЬЕ и КЕРЕАТ 1ЖТ1Р применяются в тех случаях, когда чис- ло повторений цикла заранее не известно. Но в рамках данной работы необхо- димо откорректировать алгоритм, представленный в предыдущей лабораторной работе, - заменить цикл РОК на циклы с предусловием и постусловием. Синтаксис цикла с предусловием (цикл АУШЬЕ): туЫ1с <условие> йо <опсратор>; Если в теле цикла необходимо выполнить несколько операторов, то они заключаются в операторные скобки: Ьэдп ... епй;
Блок-схема цикла АУН1ЕЕ выглядит следующим образом: Если логическое условие в цикле \УН1ЕЕ сразу является ложным, то та- кой цикл не будет выполнен ни разу. Тело цикла АУШЬЕ выполняется до тех пор, пока логическое условие является истинным. В цикле с постусловием (цикл КЕРЕАТ 1ЖТ1Е) условие проверяется по- сле цикла. Тело цикла КЕРЕАТ 1ЖТ1Е будет выполняться до тех пор, пока ло- гическое условие не выполнено. Данный цикл гарантированно выполнится хотя бы один раз. Синтаксис цикла с постусловием: гереа! <оператор(ы)> ипШ <условие>; Следует помнить, что операторные скобки в цикле КЕРЕАТ 1ЖТ1Е не требуются. После служебного слова гереа! могут располагаться как один опе- ратор, так и несколько операторов. Блок-схема цикла КЕРЕАТ 1ЖТ1Е выглядит следующим образом:
Применяя циклы У/Н1ЕЕ и КЕРЕАТ ЕЛМТ1Е, нужно предусмотреть воз- можность выхода из цикла в любой ситуации во избежание так называемого «зацикливания» программы. Как и в предыдущей лабораторной работе, результаты работы программ желательно вывести на экран в форме таблиц с заголовком. Результаты выполнения программ в редакторе Разса! и проведения парал- лельных вычислений в табличном процессоре желательно оформить в виде следующей таблицы (пример для варианта 16). Набор данных Результаты вычислений к Р Редактор Разса! Табличный процессор Цикл \\'Н ГЕЕ Цикл КЕРЕАТ ЕГЫТ1Е / X V / X У 1 X V И 3 0,5 1 1 0,5 0,263 1 0,5 0,263 1 0,5 0,263 2 0,55 0,265 2 0,55 0,265 2 0,55 0,265 3 0,6 0,267 3 0,6 0,267 3 0,6 0,267 4 0,65 0,268 4 0,65 0,268 4 0,65 0,268 5 0,7 0,269 5 0,7 0,269 5 0,7 0,269 6 0,75 0,270 6 0,75 0,270 6 0,75 0,270 7 0,8 0,271 7 0,8 0,271 7 0,8 0,271 8 0,85 0,271 8 0,85 0,271 8 0,85 0,271 9 0,9 0,272 9 0,9 0,272 9 0,9 0,272 10 0,95 0,272 10 0,95 0,272 10 0,95 0,272 11 1 0,274 11 1 0,274 И 1 0,274 Результаты выполнения данной лабораторной работы необходимо офор- мить по аналогии с предыдущей работой. Контрольные вопросы 1. В каких ситуациях целесообразно применять циклы \УШЕЕ и КЕРЕАТ ЕЖ'ПЕ? 2. Запишите синтаксис цикла с предусловием и цикла с постусловием. 3. В чем главные отличия в работе циклов 4'ШЕЕ и КЕРЕАТ ЕГКТ1Е? 4. Какое количество операторов может содержаться в теле циклов 4'Н1ЕЕ и КЕРЕАТ ЕЖТ! Е? 5. Нарисуйте блок-схемы циклов с предусловием и постусловием. 6. Что произойдет, если логическое условие в цикле 4'ШЕЕ сразу окажется ложным? 7. Необходимы ли операторные скобки в цикле КЕРЕАТ ЕК'ПЕ?
Тема 2. КОМПЬЮТЕРНАЯ ТОЧНОСТЬ ВЫЧИСЛЕНИЙ Вещественные числа, используемые в Паскале, занимают шесть байтов в памяти компьютера. Следовательно, длина числа (количество его цифр) огра- ничена размером предоставляемой памяти. При выводе вещественного числа в форме с плавающей точкой оно содержит 11 цифр - приближенное значение точного результата. Приближенным числом а называется число, незначительно отличающееся от точного А и заменяющее последнее в вычислениях. Известно, что каждое действительное число может быть записано в виде десятичной дроби. Действительному числу соответствует точка числовой пря- мой. Действительное число А называется рациональным, если существуют це- лые числа ср и ср такие, что А = Ц] /д2. В противном случае, число А называ- ется иррациональным. Рациональным числам, и только им, соответствуют пе- риодические десятичные дроби. Бесконечная непериодическая десятичная дробь может быть вычислена только с определенной точностью, с конечным количеством десятичных зна- ков. В школьном курсе математики встречаются иррациональные величины - значения корней квадратных и кубических, тригонометрических функций, ло- гарифмы. Компьютеры позволяют вычислять значения таких величин с различ- ной степенью точности, но эта точность не может быть выше компьютерной - нельзя получить большее количество цифр в числе, чем помещается в отведен- ную для числа память. Рассмотрим примеры вычислений с заданной точностью. 1. Вычисление корня квадратного из данного числа А. Точному значению корня квадратного из числа А соответствует точка на числовой прямой. Возьмем некоторое приближенное значение этого числа ле- вее данной точки, пусть это будет хп (рис. 6). Тогда значение А/хц будет на чис- ловой прямой соответствовать точке, находящейся правее точного значения корня. Хо \/А А / х0 П I I \ Х1 Рис. 6 За первое приближение иррационального числа можно взять полусумму чисел х0 и А / хо'. Х[ = 1/2 ( х0 + А / х0 )
Продолжая рассуждения, получим последовательность значений х;, х_% ... х„ . Общий вид формулы, по которой производят вычисления: хп+1 = 1/2 (хп + А / хп) Вычислительный процесс, при котором каждое последующее значение вычисляется с использованием одного или нескольких предыдущих значений, называется итерационным, а сами вычисления - итерационными. Процесс, приводящий к получению корня квадратного из данного числа, был известен еще греческому математику Гсрону (около 1 века н. э.) и называется процессом Герона. Можно обобщить данную формулу для корня п-й степени: х„+1= 1/п ((п-1) хп +А / хЛ') Как же определить, когда будет достигнута требуемая точность вычисле- ний? Для итерационных процессов существует единый признак достижения точности: модуль разности двух соседних значений должен не превышать за- данную точность е (читается «эпсилон» - греч.): | Хп+1 - Хп | <- Е Так как в Паскале нет греческой буквы е, обозначим точность вычисле- ний через ера. В программе Е12 используются всего две переменные: х1 и х2, но вычисления могут повторяться сколь угодное число раз (в зависимости от зада- ваемой точности). При построении последовательности уточненных значений неизвестно, сколько ее членов будет получено для введенного значения точно- сти. Следовательно, неизвестно, сколько памяти потребуется для этих данных. Используя тот факт, что на каждом шаге вычислений необходимо знать значе- ние только одного, предыдущего, члена получаемой последовательности, будем каждый раз новое значение записывать в ячейку с именем х1, а брать предыду- щее из хО. Чтобы на каждом шаге вычислений использовалось только что вы- численное значение, будем помещать его каждый раз в ячейку хО оператором присваивания: х1 :=х0; Тогда, независимо от числа повторений и получаемых при этом членов последовательности, в программе можно ограничиться двумя переменными. В качестве начального значения корня можно взять любое число (кроме нуля), например, 1. рго^гаш Е12; уаг А, срз, хО, х1: геа1;
Ье^т мтйе (‘введите положительное число Л =‘); геай1п(А); мтйе (‘введите точность вычислений - правильную десятичную дробь ‘); геай1п(ерз); хО := 1; х1 := 1/2 * ( хО + А/хО); туЫ1е аЬз (х1 - хО ) > ера йо Ье§т хО :=х1; х1 := 1/2 * (хО +А/хО) епй; лтгйе (‘ корень квадратный из числа ’ , А, ‘ = ‘ , х1) епй. 2. Вычисление значения тригонометрической функции. Из высшей математики известно, что многие функции, в том числе три- гонометрические, можно представить в виде бесконечной суммы. Для того, чтобы вычислить значение такой суммы с заданной точностью, достаточно взять несколько слагаемых. Количество слагаемых зависит от точности. Рассмотрим представление в виде суммы функции зт х при 0 <= х <= л/ 4. 3 5 7 п XXX X 81П X = X - ---+ ----- - ------ + .... - ----- 3 ! 5 ! 7 ! п ! где п = 1, 3, 5, 7, ... По формуле вычисления зт х как суммы бесконечного числа слагаемых можно вычислять каждое слагаемое и находить сумму. Однако, и числитель, и знаменатель каждого слагаемого - быстро увеличивающиеся числа, поэтому для вычислений, включающих степень и факториал, выводят зависимости меж- ду соседними значениями, позволяющие на каждом шаге умножать предыду- щее значение на сравнительно небольшое число. Для получения зависимости между слагаемыми выпишем два последова- тельных слагаемых в общем виде и разделим одно на другое. ап + з — -------------’; ап • ; (п+ 1)(п + 2) п ! ап + 2 ап----------------- и ! (п+ 1 )(п + 2)
Вычисления должны прекратиться, когда модуль разности двух соседних сумм будет меньше или равен заданной точности. Разность двух соседних сумм равна очередному слагаемому, поэтому условие окончания вычислений I ап+2 I < ~ е Используем в программе одну переменную а для вычисления каждого слагаемого. рго^гаш Е13; уаг х, а, 8, ера : геа1: п : пПе^ег; Ье§ш лугВе (‘х = геаЛп (х); лугВе ( ‘ ера = ‘); геаЛп (ера); а := х; 8 := х; п := 1; гереа^ а := - а * ацг (х) / (п + 1) / (п + 2); 8 := 8 + а; п := п + 2 ипШ аЬа (а) < ера; мгйе (‘ ат ‘, х , ‘ ‘, 8 ) епй. 3. Уточнения корня уравнения методом деления отрезка ионолам. Пусть дано уравнение где функция/(х ) определена и непрерывна на некотором интервале а < х < Ъ. В школьном курсе математики рассматриваются методы точного решения (нахождения корней уравнения, т. е. нулей функции / (х) ) только некоторых уравнений: квадратного, тригонометрических, показательных. Если же уравне- ние алгебраическое или трансцендентное достаточно сложно, то редко имеется возможность точного вычисления его корней. Поэтому важное значение приоб- ретают методы приближенного вычисления корней уравнения. К таким мето- дам относится метод деления отрезка пополам. Будем исходить из предположения, что уравнение/ (х ) = 0 имеет лишь изолированные корни, т. е. для каждого корня уравнения существует некоторая окрестность, не содержащая других корней этого уравнения.
Приближенное вычисление изолированных вещественных корней урав- нения обычно складывается из двух этапов: 1) отделение корней, т. е. установление возможно тесных промежутков, содержащих только один корень уравнения; 2) уточнение приближенных корней, т. е. доведение вычислений до за- данной точности. Если функция/(х ) принимает нулевое значение, то это означает, что она пересекает ось х в некоторой точке, а знак функции меняется либо с минуса на плюс (рис. 7), либо с плюса на минус. Первый этап - отделение корней - может быть произведен с помощью графика функции, построенного либо по точкам, либо из других соображений. График может быть построен достаточно приближенно, чтобы по нему можно было определить концы интервала, содержащего корень, с точностью до целого значения или нескольких целых. Затем надо убедиться, что на данном проме- жутке функция действительно меняет знак, т. е. вычислить/(а) и/(Ъ). Для уточнения корня вычислим значение функции в средней точке отрезка: с : = ( а + Ь ) / 2 ; Если в точке середины отрезка у функции оказался тот же знак, что и в точке а, перенесем точку а вправо, при этом а примет значение с ( а := с ). Если в точке с функция имеет такой же знак, как и в точке Ъ, перенесем точку Ь вле- во, присвоив ей значение с ( Ь := с). После переноса точки новый отрезок де- лится пополам и снова определяется знак функции в середине. Вычисляя значение корня по описанному методу, перенося концы отрезка в новые точки и, тем самым, сужая отрезок, получаем последовательные при- ближения точного значения - точки пересечения функции с осью абсцисс. Вы- числения продолжаются до тех пор, пока не будет достигнута заданная точность. Определить, когда эта точность будет достигнута, можно следующим способом: длина сужаемого отрезка стала меньше либо равна заданной точности.
Запишем программу на Паскале для конкретной функции /(х) = х2 - сои х + 0.5 на отрезке [0; 1]. рго^гат Е14; уаг а, Ь, с, ера : геа1; Ье^ш а := 0; Ь := 1; ера := 0.0001; теЫ1е аЬа (Ь - а) > ера Ло Ье<цп с := ( а + Ь ) / 2; И ( а*а - соа (а) +0.5) * ( с*с - соа (с) + 0.5) > 0 (11еп а := с е1ае Ь := с; епй; тенге (‘ корень Г (х) на отрезке ‘, а , ‘, Ь , ‘равен ‘, (а -г Ь) /2 ) епй. Вопросы и задания 1. Объясните идею метода вычисления корня квадратного, использующего процесс Герона. 2. Напишите программу вычисления корня пятой степени из заданного чис- ла А. 3. Как узнать количество итераций при вычислении зт х в программе Е13? 4. Объясните, почему достаточно двух величин для вычисления любого ко- личества членов последовательности в программе Е12? 5. Почему точность вычислений на компьютере не может быть произволь- ной? 6. Можно ли выбрать отрезок для уточнения корня, если на его концах функция имеет одинаковые знаки? 7. Можно ли сказать, что отрезок [-5 ; + 5] для функции /(х) = 3 х2 - 5 х - 3 содержит изолированные корни? 8. Напишите программу вычисления корня уравнения для функции из при- мера Е14 на отрезке [ 0 ; 1 ] методом деления отрезка пополам 20 раз. Определите, с какой точностью произведены вычисления. 9. Используя программу Е12, вычислить корни квадратные из чисел 1.45, 1.678, 0.2, 131 с точностью 1Е - 6. 10. Для первых двух чисел предыдущего вопроса посчитать количество по- вторений, требуемых для достижения указанной точности. 11. Используя пример Е13, вычислить значение зт х при х = л/ 8. Число л за- дать как константу 3.141592. 12. Дополнить программу Е13 вычислением значения зт х для одного и того же аргумента с помощью встроенной арифметической функции зт (х). Сравнить полученные значения функции. Сколько знаков дробной части у этих чисел одинаковы?
13. Для вычисления корня квадратного из числа, принадлежащего отрезку [ -1; 1], можно использовать следующую бесконечную сумму: 1 * ] 1*1*3 ] *] * 3 * 5 1 + X =1+ —— X...- X2 +.....X3..........X4 + .... 2 2*4 2*4*6 2*4 * 6*8 слагаемые которой задаются соотношениями. 2п-5 31 = 1; ат = 1/2 х ап = - а„.1 * х ---------- 2п-2 при п = 3, 4. 5,... Используя программу Е13 для вычисления зт х, внести изменения для вычисления корня квадратного с помощью бесконечной суммы; вычис- лить с ее помощью корень квадратный из числа 1.45, посчитать количе- ство итераций. Сравнить, какой из двух методов вычислений корня квад- ратного быстрее достигает заданной точности. 14. Для возведения в степень положительного числа в Паскале используется формула: р'' = ехр СХ * Ьп 1 р)) , где ехр (х) = е\ е = 2. 718282... - иррациональное число, играющее большую роль в естественных науках. 1_п (х) - натуральный логарифм, логарифм по основанию е. Используя эту формулу, уточнить с помощью программы корень уравне- ния на отрезке [1; 2]: х + 2 зт х - 2х = 0 с точностью 0.001 и с ма- шинной точностью. 15. Для уравнения 2х + 3х2-5х-3 = 0 определить по графику началь- ные приближения. Можно построить два графика: у = 2х и у = - 3 х2 + + 5 х + 3, найти их точки пересечения и в качестве начальных приближе- ний взять абсциссы этих точек. Сколько корней имеет уравнение? Уточ- нить их с точностью 0.001.
Лабораторное задание 6. Вычисления с заданной точностью Цель - получение практических навыков программирования вычислений с заданной точностью. Задание. Необходимо в редакторе Разса! написать программу, проводя- щую вычисления с заданной точностью. Выполнить программу и проанализи- ровать результаты ее работы. Варианты заданий Вариант № Задание 1. Для действительного числа х вычислить с точностью 10": “ 1 У ——. ^х3-к2 2. Для действительного числа х вычислить с точностью 10": 2 ОО у к='к2 3. Для действительного числа х вычислить с точностью 10": у Л й к3 ' 4. Для действительного числа х вычислить с точностью 10": у НЛ й к 5. Для действительного числа х вычислить с точностью 10’6: « 1 <-=1 х + к 6. Для действительного числа х вычислить с точностью 10": со | Л+*2 7. Даны действительные числа х, е (х^0, 4' > 0). Необходимо вычислить с точностью е бесконечную сумму и определить количество учтенных слагаемых: Ы 2к\ 8. Даны действительные числа х, е (х 0, 4' > 0). Необходимо вычислить с точностью е бесконечную сумму и определить количество учтенных слагаемых: (-1)' (/< +1 )х 2_.1 ^к к = 0 3
Вариант № Задание 9. Даны действительные числа х, е (х^О, ^ > 0). Необходимо вычислить с точностью е бесконечную сумму и определить количество учтенных слагаемых: (~1)У+2 Щк +1)^ + 2)!' 10. Даны действительные числа х, е (х > 0, г: > 0). Необходимо вычислить с точностью е бесконечную сумму и определить количество учтенных слагаемых: уИХ 4 = 0 (Л + 1)2 ' 11. Дано действительное число х. Последовательность х" к аА образована по закону: ап = -—г-. Вычислить У а, (2л)! ,=1 где к - наименьшее целое число, которое удовлетворяет условиям: А: >10 и |о(+1 <105. 12. Дано действительное число х. Последовательность Я1, а,,... образована по закону: а„ - г ,Х г-. Вычислить л/н(п + 2)! а , где к - наименьшее целое число, которое удовлетворяет условиям: А: >10 и |«4 | < 1 О '. 13. Дано действительное число х. Последовательность а1, а,,... образована по закону: ап = , —к-, г. п(п + 1)(и + 2) Вычислить У , где к - наименьшее целое число, которое удовлетворяет условиям: А: >10 и «.,<10'. 14. Дано х = 1. Последовательность а1, а,,... образована по Х2и8И1(х”} * закону: «„ = —-. Вычислить У «., где к - П 7=1 наименьшее целое число, которое удовлетворяет условиям: к > 10 и «,, < 10 '.
Вариант № Задание 15. Дано действительное число е (е > 0). Последовательность й,, в,, ••• образована по закону: а„ = , —, . Найти л/и2 +1 ~ + п2 -1 первый член последовательности а, (и > 2), для которого справедливо условие |ав - аи< е . 16. Дано действительное число е (е > 0). Последовательность я,, а,,... образована по закону: Л И и - а = 1— 1— ... 1 . Наити первый член У 2 /У 3 7 У п + 1) последовательности ап (л > 2), для которого справедливо условие |ял - ал_, < е . Методические указания по выполнению лабораторной работы Точность вычислений (число е) необходимо задавать в программе в виде константы. Следует помнить, что разделителем целой и дробной части веще- ственного числа в языке Разса! является точка. Поскольку число итераций цикла заранее неизвестно, для выполнения за- дания будет необходим цикл \УШЬЕ или КЕРЕАТ 1ЖТ1Е. В отчете по лабора- торной работе необходимо обосновать (в форме комментария к программе) вы- бор соответствующего цикла. Код программы должен содержать краткие комментарии, а также вывод на экран соответствующих сообщений для пользователя. В отчет необходимо включить экранный снимок выполнения программы в редакторе Разса!. Для проверки корректности составленной программы реко- мендуется провести параллельные расчеты в табличном процессоре (с приме- нением метода автозаполнения и, при необходимости, встроенных математиче- ских функций). В отчет по лабораторной работе рекомендуется поместить экранный снимок результата данной проверки. Пример оформления отчета по лабораторной работе Вариант № 16 Цель - получение практических навыков программирования вычислений с за- данной точностью. Задание. Дано действительное число е (Е > 0). Последовательность ах,а2,... образована по закону: ал=-|1-------| 1—|...| 1------|. Найти первый член V 2 Д ъ) V п + 1) последовательности ап (п > 2), для которого справедливо условие |ол — ап_11 < е .
Решение. Код программы: рго^гаш 1аЪ 6; {Лабораторная работа 6 обучающегося группы БИ-б-о-201 Петрова 11. II.} еопч1 ер8=0.000001; {задаем точность вычислений} уаг а1, а2: геа1; {переменные для хранения значений двух соседних членов последователь- ности} п: 1п1е§ег; {переменная для хранения номера текущего члена последовательности} Ье§1п п:=1; а1 :=1-1/(п+1); {вычисляем первый член последовательности} п:=2; а2:=а1*(1-1/(п+1)); {вычисляем второй член последовательности} {Применяем цикл с предусловием, поскольку в результате работы цикла в пере- менной а2 должно находиться искомое значение} \у11Пе аЬ8(а2-аГ)>=ер8 йо {Операторные скобки необходимы, поскольку в теле цикла должны выполняться три оператора} Ье^п п:=п+1; {задаем номер текущего члена последовательности} {В переменной а! запоминаем значение предыдущего члена последователь- ности - (п-1)} а1:=а2; {В переменную а2 помещаем значение текущего члена последовательно- сти - п} 02;=й1*(1-1/(п+1)) епй, {Вывод отформатированного результата работы программы на экран} ууп(с1п('Искомый член последовательности п=', п); ууп1е1п(а2;8;8); геасПп; епй.
Экранный снимок выполнения кода программы в редакторе Ракса!: ЦЦ ► п 1 таю раз 1рго§гат 1аЬ_6; 2 {Лабораторная работа 6 3 обучающегося группы БИ-б-о-201 4 Петрова П.П.} 5 соп5± ерз=0.000001; {точность вычислений} 6 уаг 7 а1, а2: геа1; {переменные для хранения двух соседних членов последовательнее 1Ь 8 п:1п±едег; {переменная для хранения номера текущего члена последовательно' —। 9 НИ- 10 п 1; 11 а1:=1-1/(п+1); {вычисляем первый член последовательности} 12 п 2 13 а2:=а!*(1 1 (п+1)); {вычисляем второй член последовательности} 14 ыЬПе эЬз(а2 а1)> ерз ао {применен цикл с предусловием, поскольку в результате г 15ж Ье§1п {операторные скобки необходимы, поскольку в теле цикла должны выполняться 16 п п+1; {задаем номер текущего члена последовательности} а1: а2; {в переменной а1 запоминаем значение предыдущего члена последователь 18 а2:=а1 (1 1/(п+1)) {в переменную а2 помещаем значение текущего члена после? 19 —, 20 иг1±е1п('Искомый член последовательности п=',п); {вывод отформатированного резус- 21 иг11е1п(а2:8:8); 22 геасПп 23 —. Искомый член последовательности п—1000 Г.00099900 Экранный снимок выполнения вычислений в табличном процессоре: 1 1001 1002 1003 1004 1005 п Ап Ап - Ап-1 1000 | 0,00099900| 0,00000100 1001 0,00099800 0,00000100 1002 0,00099701 0,00000100 1003 0,00099602 0,00000099 1004 0,00099502 0,00000099 Выводы. Поскольку результаты выполнения разработанной программы совпали с результатами расчетов в табличном процессоре, можно говорить о том, что про- грамма составлена верно. Контрольные вопросы 1. Дайте определение понятия «приближенное число». 2. Что такое рациональное число? 3. Чем обуславливается точность компьютерных вычислений? 4. Как задать в программе требуемую точность вычислений?
ТЕМА 3. ОДНОМЕРНЫЕ И ДВУМЕРНЫЕ МАССИВЫ 3.1. Массивы В рассмотренных ранее примерах программ производилась обработка одиночных данных - значений простых переменных. При решении практиче- ских задач данные объединяются в различные структуры, наиболее простыми из которых являются массивы. Массив - именованный набор с фиксированным количеством одно- типных данных. В массивы объединены результаты экспериментов, списки фамилий со- трудников, различные сложные структуры данных. Так, список из классного журнала 10-А является массивом. В массиве могут быть одинаковые данные, поэтому элементы массива различаются но своим порядковым номерам. Если каждый элемент имеет один порядковый номер, то такой массив называется одномерным, если два - то это таблица из строк и столбцов. Для таблиц первый номер элемента показывает строку, а второй - столбец, на пересечении которых находится элемент. Все строки таблицы имеют одинаковую длину. Одномерный массив может быть числовой последовательностью с из- вестным количеством членов. Так же, как и в последовательности, в массиве можно указать элемент с конкретным номером, например, а5, или записать об- щий вид элемента, используя в качестве индекса переменную и указывая диа- пазон ее изменения: а,, / = 1, 2, ... , п. Задачи на обработку массивов могут иметь различную формулировку. Например, начинаться со слов «Дано п чисел ....» и далее говорится, что требу- ется сделать с этими числами. Для того, чтобы решить такую задачу на компь- ютере с использованием языка программирования Паскаль, необходимо выпол- нить следующее: 1) определиться, какие числа даны: целые или вещественные. Если об этом конкретно не сказано, то лучше считать их вещественными; 2) назвать весь массив одним именем, это же имя будет использоваться для каждого элемента, только к нему добавится номер этого элемента (индекс); 3) описать массив в разделе переменных уаг, тем самым отведя место в памяти для массива; 4) ввести данные в память. Описание массива использует специальное слово аггау (массив), после которого в квадратных скобках через две точки указывается диапазон измене- ния номеров элементов, затем слово оГ (из) и пишется тип данных массива. Ко-
гда транслятор встречает описание массива, он отводит для него столько после- довательных ячеек, сколько указано в квадратных скобках, и такого формата, каков тип данных массива. Эту память в программе можно использовать всю или частично, вычисляя значения элементов массива, или вводя их с клавиату- ры (или с диска). Чаще всего номера элементов меняются от 1 до заданного числа п. Значение п можно указать в разделе констант (соп$Г), тогда в описании можно указать переменную п в качестве последнего значения (верхней грани- цы) номера элемента массива. Пример описания: соп$Г п = 10; уаг а: аггау [ 1 .. п ] оГ геа1; Это описание означает, что для массива а будет отведено десять ячеек оперативной памяти по шесть байтов каждая. Имена ячеек: а1, а2, аз, а4, аз, а,.. В Паскале эти имена будут записаны следующим образом: а[1], а[2], а[3], а[4], а[5], а[6]. В описании после имени массива а ставится двоеточие, после которого указывается тип данного - массив. Если в программе несколько массивов одно- го размера и типа, то, как и для простых переменных, их имена можно перечис- лить через запятую, а потом, после двоеточия, указать описание массива. Для ввода данных в память необходимо организовать цикл. Поскольку число повторений ввода данных известно, удобно использовать цикл “пере- счет”. Ввод описанного массива а может иметь вид: Гог 1 := 1 Го п До геаД (а[ 1 ]); Вводимые значения набираются на клавиатуре через пробел и нажимает- ся ЕпГег. Можно ввод прокомментировать и вводить каждое данное на отдельной строке экрана: Гог 1 := 1 Го п До Ье§ш уугке (‘а[‘ , 1, ‘] = ‘); геаД1п ( а [ 1 ]) епД; При обработке массивов решения многих задач основываются на следу- ющих, более простых, задачах: вычисление суммы (произведения) элементов массива; нахождение наибольшего (наименьшего) элемента; упорядочение эле- ментов по возрастанию или по убыванию. Рассмотрим эти базовые задачи. 1. Вычисление суммы элементов массива Вычисление суммы элементов массива ничем не отличается, в принципе, от суммирования значений простых переменных (программа Е11). Решение за-
дачи состоит из трех основных этапов: 1) ввод данных; 2) вычисление суммы; 3) печать результатов. рго§гаш Е15; сопзГ п = 7; уаг а : аггау [ 1 .. п ] оГ геа1; 8 : геа1; 1 : тГе&ег; Ье§ш хгг1Ге(‘ вводите элементы массива - ’ , п, ‘ вещественных чисел через пробел’); Гог 1: = 1 Го п йо геай (а [ 1 ]); 8 1=0; Гог 1 := 1 Го п йо 8 := 8 + а [ 1 ] ; эупГе!п; эупГе (‘ сумма элементов массива 8 = ‘ , 8 ) епй. 2. Нахождение наибольшего элемента массива В предыдущем примере производились вычисления, переменная 8 меняла свои значения в процессе решения задачи. Однако большинство задач, решае- мых с помощью компьютера, являются невычислительными. К таким относится задача поиска наибольшего элемента в массиве. Трудность при разработке ал- горитма решения заключается в том, что надо записать в виде команд компью- теру привычные для человека действия: выделение большего из последователь- ности чисел. Чтобы лучше представить, как последовательно просматривать и сравнивать между собой числа, записанные в памяти, вообразим, что каждое число написано на отдельной карточке и карточки сложены стопкой. В таком случае мы первое число запомним сразу как наибольшее и перевернем карточ- ку. Теперь в нашем распоряжении два числа: одно видим, другое - помним. Сравнивая их между собой, запомним большее, т. е. если первое было больше, запоминать новое не придется и надо смотреть следующую карточку. Если вто- рое больше первого, первое в дальнейшем помнить нет смысла и мы запомним второе. Таким образом, на каждом этапе сравнения мы будем помнить большее из просмотренных чисел и в конце решим поставленную задачу. Записав при- веденные рассуждения в виде операторов, получим программу нахождения наибольшего значения. Промежуточные значения и ответ содержит переменная тах. рго^гат Е16; сопзГ п = 7; уаг а: аггау [ 1 .. п ] оГтГе^ег; тах, 1 : шГе^ег; Ье§1п Гог 1 := ] Го п йо
Ье^т уугйе (‘а[‘ , 1, '] = ’).; геас11п ( а [ 1 ] ) епс1; тах := а [ 1 ] ; Гог 1 := 2 ю п До И тах > а [ 1 ] Шеп тах := а [ 1 ]; уупГе (‘наибольший элемент массива тах = ‘ , тах) епй. 3. Упорядочение массива по возрастанию Упорядочения массивов могут осуществляться по какому-либо признаку (называются также сортировками). Существуют различные методы сортировок, они различаются, в основном, по скорости получения результата. Рассмотрим один из них - метод «пузырька». Пусть имеется последовательность чисел ау , 02 , ... , ап, которую необходимо упорядочить по возрастанию. Зафиксируем первый элемент и будем последовательно сравнивать его со стоящими справа. Если какой-то из элементов справа окажется меньше первого, мы поменяем ме- стами этот элемент с первым и продолжим сравнение уже нового элемента, стоящего на первом месте, с оставшимися справа числами. Если снова выявится элемент, меньший зафиксированного, повторим перестановку. В результате первого просмотра последовательности на первом месте окажется наименьший из всех элементов, т. е. он как более «легкий» как бы «всплывает» наверх, от- сюда и название метода - «метод пузырька». Теперь зафиксируем второй эле- мент и повторим просмотр, выполняя при необходимости перестановки эле- ментов и т. д. Уяснив идею решения, остановимся на двух вопросах: каким об- разом фиксировать элементы и как осуществить перестановку двух элементов. Для того, чтобы при переборе элементов, стоящих справа от проверяемого, не менялся индекс последнего, необходимо, чтобы индексы фиксируемого и сто- ящих правее него элементов были различны: / и у. Индекс / изменяется от 1 до п - 1, индекс у всегда на 1 больше / и пробегает все значения от / + 1 до и. Для каждого значения / индекс у должен последовательно принять все допустимые значения, следовательно, конструкция программы, отражающая полный пере- бор всех элементов и их упорядочение по возрастанию, представляет двойной цикл. При перестановке двух элементов используется третья переменная. Пере- становка местами (обмен значениями в памяти) двух переменных а и Ь выгля- дит следующим образом: 1) с := а; 2) а := Ь; 3) Ь := с. Программа сортировки ме- тодом пузырька имеет вид: рго&гат Е17; сопсГ п = 7; уаг а : аггау [ 1.. п ] оГ геа1; 1, | : тГе^ег ; с : геа1; Ье§т
Гог 1 := 1 Го п До Ье^т уупГе (‘а[‘ , 1, '] = *).; геасПп ( а [ 1 ] ) епД; Гог 1 := 1 Го п - 1 До Гог з := 1 + 1 го п До 1Га[1]>а[Л ГЬеп Ье^т с := а [ 1 ] ; а[1] :=а[Л ; а [; ] : = с епД; лгпГеГп (‘ упорядоченный по возрастанию массив ‘); Гог 1 : = 1 Го п До лупГе ( а [ 1 ] ) епД. 4. Поиск элемента в массиве Одна из важных невычислительных задач - поиск данного значения сре- ди элементов массива. Такой поиск называется также поиском по ключу. На практике поиск осуществляется в упорядоченном массиве, имеются различные алгоритмы поиска. В данном учебном примере осуществим поиск путем сплошного перебора. Если элемент найден, напечатаем его номер, если нет, то выдадим соответствующее сообщение. Существенным является то, какой из одинаковых элементов массива, равных данному, нас интересует: первый встретившийся при поиске или последний. В данном примере будем искать первый. Поиск осуществляется в цикле, как только элемент найден, надо выйти из цикла. Для досрочного выхода из цикла /ог используем оператор §о1о. Если досрочный выход не произойдет, значит, элемент, равный данному, в массиве отсутствует. В таком случае выдача сообщения об отсутствии элемента должна быть сразу после цикла поиска. Значит, чтобы обойти печать номера элемента, надо использовать еще один оператор §оГо и еще одну метку в программе. Программа поиска данного элемента в массиве: рго^гат Е18; 1аЬе1 1, 2; соп^Г п = 7; уаг а : аггау [ 1 .. п ] оГ геа1; х: геа1; 1 : тГе§ег; Ье§ш эупГеГп (‘ введите элементы массивов’) ; Гог 1 := 1 Го п До зупГе ( а [ 1 ] ); уупГеГп;
уугке (‘ введите число для поиска в массиве, х = ‘); геаШп (х); Гог 1 := 1 Го п До И а [ 1 ] = х Шеп цоГо 1; уугйе1п (‘ такого числа в массиве нет’); §оГо 2; 1: уупГе(‘ номер элемента массива, равного данному ‘ , 1); 2: епй. Если искать не первый по порядку равный ключу элемент, а последний, то надо использовать цикл обратного пересчета: Гог 1 := п ДоуупГо 1 До. Вопросы и задания 1. Чем отличается массив от файла? 2. Для чего необходимо описание массива? 3. Что надо сделать, чтобы начать решать на компьютере задачу, форму- лировка которой начинается со слов: «Дано п чисел ...»? 4. Может ли массив содержать разнородные данные? 5. Можно ли в примере программы Е15 ограничиться одним оператором цикла? 6. Что надо изменить в программе Е16, чтобы осуществлялся поиск не наибольшего, а наименьшего элемента массива? 7. Какие изменения в программу Е16 надо внести, чтобы одновременно со значением наибольшего числа определялся его порядковый номер? 8. Объясните работу двойного цикла в программе Е17. 9. Измените программу Е18 так, чтобы вместо цикла «пересчет» при по- иске элемента использовался цикл «пока». Примените переменную-флажок, ко- торая до цикла имела бы нулевое значение, а в случае нахождения необходимо- го элемента изменила бы значение на 1. Как при этом обойтись без операторов §о/о? 10. В заданной последовательности целых чисел определить количество и сумму элементов, кратных 10. 11. Дано п чисел. Найти сумму чисел, больших заданного числа а. 12. В заданном массиве заменить нулем наибольший элемент. 13. Найти полупроизведение всех положительных элементов массива. 14. Найти сумму квадратов неотрицательных элементов и количество по- ложительных чисел в заданном целочисленном одномерном массиве. 15. В заданной вещественной последовательности поменять местами пер- вый и наименьший элементы. 16. Дано п чисел. Заменить все отрицательные числа их модулями. 17. Вычислить среднее арифметическое наибольшего и наименьшего из п чисел.
Лабораторное задание 7. Обработка одномерных массивов Цель - получение практических навыков обработки одномерных масси- вов. Задание. Необходимо в редакторе Разса! написать программу, которая на основе заданных трех числовых последовательностей а, Ь, с формирует чис- ловые последовательности у, г по определенному правилу. Числовые после- довательности а, Ъ, с содержат вещественные числа и их размерность к зада- ется в программе в виде константы ( /< < 25 ). Числовые последовательности за- даются в виде массивов. Выполнить программу и проанализировать результаты ее работы (проведя параллельные вычисления в табличном процессоре). Варианты заданий Вариант № Правило формирования последовательностей у, г 1. У, = 2а,+0,5Ь:, х, = 2Ъ1 + 0,5с,, / = 1, к 2. У,=4^ а,-(7 + М , х, = • (7 + бД, / = 1,к 3. У,=^ а,' н26/ , х, = д//?' + 2с/ , / = 1,к 4. у = За 'гЬ г = ЗЪ 4-с, 1 = 1,к У 1 1 К—1+1 ’ 1 1 к —г+1 7 7 5. у: = тах [а,, Б,, к], х, = тах{/>,, <;, к}, 1 = 1, к, к - вещественное число, задаваемое пользователем во время работы программы 6. У, = тт{ 1^,1 , в = тт >Д1 }, 1 = 1, к. 7. тах{а ,2Ь ,к\ тах{б ,2с ,к} . , , , время У ' ' • -{Д-А-аМ 3 3 вещественное число, задаваемое пользователем вс работы программы 8. у1 = тах{2о1,Зй,,2Л}, х, — тах{22>,Зс,,2Л}, 1 = 1,к, к - вещественное число, задаваемое пользователем во время работы программы 9. у: = (а + 2Ъ, )/3 + тт а, - тах Ь:, х =(Ь1 + 2с,)/3 + тт7>, -тахс,, / = 1,& 10. Л =«, Ч’ тах а, - тт Ь1 /2, х, = Ь1 + ^тахй; - тт с, /2, 1=1,к 11. У. = а, Ь, 2,\’г, =ь,-с, /=1’^ 12. У, =а, + -Дх2«.-V , 2 =й,+^Е(2й,-С,)2 , 1=1,к
Вариант № Правило формирования последовательностей у, х 13. тах{а .Ь } тах{/> ,с } . у-у У1 = — г —Ч- ’ —Ч ’г тт{а ) 1 тт{6 ] 14. у: =тш{а ,й4_1+1,й ), 21 = тт{Л,с4_,+1,А / = 1,А, к - вещественное число, задаваемое пользователем во время работы программы 15. а +Ъ Ъ +с у-г Е«. ЕЛ 16. у1 = а + [пппй + |/3, г1-Ь1 +ттс,уЗ, 1 = 1,к Методические указания по выполнению лабораторной работы Размерность числовых последовательностей к задается в программе в виде константы. Числовые последовательности задаются в виде одномерных массивов. В разделе описания переменных уаг допустимо задавать все исход- ные и формируемые в процессе работы программы массивы в одном объявле- нии, например: сопЧ к = 25; уаг а, Ь, с, у, х: аггау[1..к] о? геа1; Последовательности а, Ь, с вводятся пользователем программы с клави- атуры. Для этого применяются соответствующие циклы РОК с предваритель- ным выводом сообщения для пользователя о необходимости ввода элементов массива: лугйе1п (‘Введите элементы массива а (размерность массива к=’, к, ‘)’); Гог (о к йо геай1п(а[1]); Необходимо помнить, что счетчик цикла должен быть объявлен целочис- ленной переменной. Запись у: = птах{а,,Д, А , означает, что /'-я переменная массива у форми- руется как наибольшее значение среди /-х переменных массивов а и Ь и пара- метра к. Запись у, = а, +|тт(з2 + ттА,//3 означает, что /-я переменная массива у формируется как сумма /-Й переменной массива а и суммы минимальных зна- чений массивов а и Ъ, поделенной на число 3. При написании кода программы следует (по возможности) представлять его в наиболее компактном виде и не использовать избыточное количество пе- ременных.
Код программы необходимо сопровождать краткими поясняющими ком- ментариями. При выводе результатов вычислений на экран наряду с выводом выходных последовательностей желательно выводить и исходные последова- тельности. Вывод результатов на экран должен предваряться соответствующим сообщением для пользователя. В отчет необходимо включить экранный снимок выполнения программы в редакторе Разса!. Для проверки корректности составленной программы реко- мендуется провести параллельные расчеты в табличном процессоре (с приме- нением метода автозаполнения и, при необходимости, встроенных математиче- ских функций). В отчет по лабораторной работе рекомендуется поместить экранный снимок результата данной проверки. Пример оформления отчета по лабораторной работе Вариант №16 Цель - получение практических навыков обработки одномерных массивов. Задание. Необходимо в редакторе Разса! написать программу, которая на осно- ве заданных трех числовых последовательностей а, Ъ, с формирует числовые по- следовательности у, т по следующим правилам: у1 =а1 + |тша, + тт^/3, 2, = Ь, + |тт&, + ттс,уЗ, / = 1,&. Числовые последовательности а, Ь, с содержат вещественные числа и их раз- мерность к задается в программе в виде константы (/с < 25 ). Числовые последова- тельности задаются в виде массивов. Выполнить программу и проанализировать ре- зультаты ее работы (проведя параллельные вычисления в табличном процессоре). Решение. Код программы: рго§гаш 1аЪ 7; {Лабораторная работа 7 обучающегося группы БИ-б-о-201 Петрова П.П.} сопзГ к= 10; {размерность массива} уаг а, Ь, с, у, г: аггау[1 .к] оГ геа1: {объявление одномерных массивов} 1. {счетчик цикла} тт1, тт2: геа1; {вспомогательные переменные для нахождения минимальных значе- ний исходных массивов} Ье§1п (Ввод с клавиатуры массива а} мтйе1п(‘Введите элементы массива а (размерность массива к=’, к, ')’); Гог 1:=1 (о к бо геас11п(а[1]); {Ввод с клавиатуры массива Ъ} М'ГЙе1п(‘Введите элементы массива Ь (размерность массива к=’, к, *)’); Гог 1:=1 (о к <1о геаа1п(Ь[1]);
{Ввод с клавиатуры массива с} И'Г11е1п(‘Введите элементы массива с (размерность массива к=’, к, *)’); Гог к=1 1о к <1о геай1п(с[1]); {Поиск минимального элемента массива а} {Сначала предполагаем, что минимальным элементом в массиве является его первый элемент} тт1:=а[1]; {Начинаем сравнивать переменную ппп1 со всеми элементами массива а и если окажется, что она больше какого-то элемента, - записываем в нее значение дан- ного элемента} Гог 1:=2 (о к До 1Г тт1>а[1] И1сп тт1:=а[1]; {Поиск минимального элемента массива Ъ} {Сначала предполагаем, что минимальным элементом в массиве является его первый элемент} тт2:=Ь[1]; {Начинаем сравнивать переменную пнп2 со всеми элементами массива Ь и если окажется, что она больше какого-то элемента, - записываем в нее значение дан- ного элемента} Гог к=2 (о к <1о 1Г тт2>Ь[1] (Пеп пнп2:=Ь[1]; тт1:=(тт1+гшп2)/3; {формируем первое слагаемое массива у} {Нахождение элементов массива у} Гог к=1 (о к с!о у[1]:=тт1+а[1]; {На данном этапе работы программы переменная пйп2 содержит минимальное значение массива Ъ и нам необходимо найти наименьшее значение среди элемен- тов массива с и поместить его в переменную пцп1} {Поиск минимального элемента массива с} {Сначала предполагаем, что минимальным элементом в массиве является его первый элемент} тт1:=с[1]; {Начинаем сравнивать переменную пип! со всеми элементами массива с и если окажется, что она больше какого-то элемента, - записываем в нее значение дан- ного элемента} Гог 1:=2 (о к с1о 1Г тт1>с[1] (Пеп тт1:=с[1]; тт1:=(пипНт1п2)/3; {формируем первое слагаемое массива 2} {Нахождение элементов массива 2} Гог к=1 (о к (Го г[1]:=тт1+Ь[1]; {Вывод полученных результатов на экран} (Угке1п(‘Последовательность а’);
Гог г=1 (о к йо {вывод на экран элементов массива а} мтке(а[1]:8:2); \угке1п: И'Г1Ге1п(‘Последовательность Ъ’); Гог к=1 (о к <1о {вывод на экран элементов массива Ь} хугке(Ь[1]:8:2); хтгке1п: уу гке1п(‘Последовательность с ’); Гог к=1 Го к йо {вывод на экран элементов массива с} хугке(с[1]:8:2); уупГс1п; уугке1п(‘Последовательность у’); Гог к=1 Го к йо {вывод на экран элементов массива у} уугке(у[1]:8:2); уугкеГп; уутке1п (‘Последовательность г’); Гог к=1 Го к йо {вывод на экран элементов массива хгпГе(г[1]:8:2); уугке1п: геасПп: епй Экранный снимок выполнения кода программы в редакторе Ракса!: 1 тат раз 1 11 к л 46 нгНе(а[1] :8:2); 47 ыгз±е1п; 48 ыг!Г:е1п( ‘Последовательность Ь'); 49 1 1 к Но 50 ыгйе(Ь[1] :8:2); 51 ыг11е1п 52 нг1±е1п(‘Последовательность с'); 53 1 1 Го к йо 54 мгИе(с[х] :8:2); 55 иг1±еХп; 56 ыг1Ге1п(‘Последовательность у'); 57 1 1 л- к Ио 58 ыг1,ке(у[1] :8:2); 59 ыг1±еХп; 60 ыг1±еХп('Последовательность 2') 61 1 1 *- к Ио 62 мг!±е(х[1]:8:2); 63 мгНеХп 64 геай1п 65 66 67 —— 1 Последовательность с 1 ’ .00 5.00 10.00 12.00 16.00 3.00 7.00 8.00 9.00 10.00 последовательность у 1 3 .00 7.00 6.00 4.00 8.00 2.00 1.00 0.00 3.00 7.00 [последовательность г 7 .00 6.00 5.00 11.00 1.00 13.00 4.00 3.00 2.00 4.00 ! Последовательность а 1 3. .00 7.00 6.00 4.00 8.00 2.00 1.00 0.00 3.00 7.00 Последовательность Ь с. .00 5.00 4.00 10.00 0.00 12.00 3.00 2.00 1.00 3.00 Последовательность с 1 < .00 5.00 10.00 12.00 16.00 3.00 7.00 8.00 9.00 10.00
Экранный снимок выполнения вычислений в табличном процессоре: Лкборкгорим 7 - Ек«1 Рецензирование Вид Разработчик Результаты выполнения программы в редакторе Равса! и проведения парал- лельных вычислений в табличном процессоре: к Набор данных Результаты вычислений Редактор Разса! Табличный процессор а Ь С У 2 У 2 1 3 6 4 3,00 7.00 3,00 7,00 2 7 5 5 7,00 6,00 7,00 6,00 3 6 4 10 6,00 5,00 6,00 5,00 4 4 10 12 4,00 11,00 4,00 11,00 5 8 0 16 8,00 1,00 8.00 1,00 6 2 12 3 2,00 13,00 2,00 13,00 7 1 3 7 1,00 4,00 1,00 4,00 8 0 2 8 0,00 3 00 0.00 3,00 9 3 1 9 3,00 2.00 3,00 2,00 10 7 3 10 7,00 4,00 7,00 4,00 Выводы. Поскольку результаты выполнения разработанной программы совпали с результатами расчетов в табличном процессоре, можно говорить о том, что про- грамма составлена верно. Контрольные вопросы 1. Дайте определение понятия «массив». 2. Запишите синтаксис объявления одномерного массива в разделе описа- ния переменных. 3. Что такое индекс элемента массива? 4. Как можно обратиться к определенному элементу одномерного массива? 5. Напишите синтаксис ввода элементов одномерного массива в цикле РОК.. 6. Может ли одномерный массив состоять из разнородных элементов? 7. Опишите алгоритм нахождения минимального элемента одномерного массива.
Лабораторное задание 8. Сортировка маесивов Цель - получение практических навыков сортировки массивов. Задание. Необходимо в редакторе Разса! написать программу, которая производит сортировку (преобразование) элементов целочисленного одномер- ного массива размерности и (15 < л < 30). Параметр п задается в программе в виде константы. Элементы массива должны вводиться с клавиатуры. Выпол- нить программу и проанализировать результаты ее работы. Варианты заданий Вариант № Задание 1. Упорядочить массив по возрастанию 2. Упорядочить массив по убыванию 3. Упорядочить массив по возрастанию модулей элементов 4. Упорядочить массив по убыванию модулей элементов 5. Изменить порядок следования элементов массива на обратный 6. Вначале расположить элементы, равные 0, затем - остальные 7. Элементы, равные 0, расположить после всех остальных 8. Вначале расположить четные, затем - нечетные элементы 9. Вначале расположить нечетные, затем - четные элементы 10. Вначале расположить элементы с четным, затем - с нечетным индексом 11. Вначале расположить элементы с нечетным, затем - с четным индексом 12. Удалить из массива элементы, модуль которых не превышает 10. Освободившиеся в конце элементы заполнить нулями 13. Удалить из массива отрицательные элементы. Освободившиеся в конце элементы заполнить нулями 14. Удалить из массива положительные элементы. Освободившиеся в конце элементы заполнить нулями 15. Удалить из массива элементы с четным индексом. Освободившиеся в конце элементы заполнить нулями 16. Удалить из массива элементы с нечетным индексом. Освободившиеся в конце элементы заполнить нулями Методические указания по выполнению лабораторной работы Размерность массива должна задаваться в программе в виде константы. Программа должна предусматривать ввод элементов массива с клавиатуры. Для этого рекомендуется использовать цикл РОК. с предварительным выводом со- общения для пользователя о необходимости ввода элементов массива.
Счетчик цикла должен быть объявлен целочисленной переменной. В процессе выполнения задания лабораторной работы необходимо (по возможности) обходиться минимальным набором переменных и представлять код программы в наиболее компактной форме. Если условие задачи позволяет, то использовать один массив. При выводе результатов обработки одномерного массива на экран наряду с выводом выходной последовательности желательно выводить и исходную по- следовательность. Вывод результатов на экран должен предваряться соответ- ствующим сообщением для пользователя. В отчет необходимо включить экранный снимок выполнения программы в редакторе Разса!. Пример оформления отчета по лабораторной работе Вариант №16 Цель - получение практических навыков сортировки массивов. Задание. Необходимо в редакторе Разса! написать программу, которая произво- дит сортировку (преобразование) элементов целочисленного одномерного массива размерности п (15 < п < 30). Программа должна удалить из массива элементы с не- четным индексом, освободившиеся в конце элементы заполнить нулями. Параметр и задается в программе в виде константы. Элементы массива должны вводиться с кла- виатуры. Выполнить программу и проанализировать результаты ее работы. Решение Код программы: рго§гаш 1аЪ 8; {Лабораторная работа 8 обучающегося группы БИ-б-о-201 Петрова П.П.} еопМ п=15; {чадаем размерность массива в виде константы} уаг а,Ь: аггау[1..п] оГ ш1е§ег; {определяем два одномерных массива, один - исходный, второй - преобразованный, поскольку условие задачи не позволяет обойтись задани- ем лишь одного массива} 1,к. 1п1е§сг; {г — счетчик цикла: к - вспомогательная переменная для заполнения эле- ментами преобразованного массива} Ье§ш (Ввод исходного массива} мтйс1п('введите массив'); Гог 1:=1 1о п йо геас11п(а[1]); {Изначально предполагается, что в преобразованном массиве нет ни одного элемента} к:=0; ' {Заполнение элементами преобразованного массива. Новый массив нужно напол- нить элементами исходного массива с четными индексами, а освободившиеся в конце элементы заполнить нулями} Гог г=] (о п йо
{Проверяем очередной элемент массива на четность индекса: если условие вы- полняется, значит элемент исходного массива имеет четный порядковый номер и данный элемент нужно включить в новый массив} Ил той 2=0 ГПеп Ье§т к:=к+1; {формируем текущий индекс нового массива} {Заполняем новый массив очередным элементом, удовлетворяющим условию} Ь[к]:=а[1]; епй; {В результате выполнения кода программы в новый массив будут помещены все четные элементы исходного массива-ровно к элементов} {В новый массив, начиная с номера элемента к+1 и до номера п, нужно поме- стить число ноль} Гог 1:=к+1 Го п йо Ь[1]:=0; {Вывод исходного массива на жран: отформатированный вид (два знака после запятой)} ътИе1п('Исходный массив'); Гог 1:=1 Го п йо ууг!Ге(а[1]:8:2); {Вывод преобразованного массива на экран: отформатированный вид (два знака после запятой)} уугИе1п('Новый массив'); Гог 1:=1 Го п йо уупГе(Ь[1]:8;2); геайГп; епй. Результаты выполнения программы в редакторе Разса!. п Исходный массив Преобразованный массив 1 9 6,00 2 6 21,00 3 4 7,00 4 21 24,00 5 6 0 00 6 7 7,00 7 18 3,00 8 24 0,00 9 25 0.00 10 0 0,00 11 14 0,00 12 7 0,00 13 5 0,00 14 3 0,00 15 8 0,00
Экранный снимок выполнения кода программы в редакторе Ракса!: д 51ор Н тат.раз 12 к:=0; {изначально предполагается, что в преобразованном массиве нет ни одного эле/* 13 {Заполнение элементами преобразованного массива. Новый массив нужно наполнить эла* 14 "Гог 1:=1 1о л до 15 1 — ‘В 2 0 1Ьеп {проверяем очередной элемент массива на четность индекса; 16 17 к к 1 {формируем текущий индекс нового массива} 18 Ь[к]:=а[1]; {заполняем новый массив очередным элементом, удовлетворяющим ус: > 19 епй; 20 {В результате выполнения кода программы в новый массив будут помещены все г 21 {В новый массив, начиная с номера элемента й+1 и до номера п, нужно поме с ьъ 22 Рог 1: к+1 1о п Но 23 Ь[1]: 0 24 ыгИе1п('Исходный массив'); {Вывод исходного массива на экран} 25 1;=1 * л до 26 игИе(а[1]:8:2); 27 нг1±е1п('Новый массив'); {Вывод преобразованного массива на экран} 28 11 о л до 29 ыг1±е(Ь[1]:8:2) 30 геаН1п V о три1 Исходный массив 9.00 6.00 4.00 21.00 6.00 7.00 18.00 24.00 25.00 0.00 14.00 7 яй массив 6.00 21.00 7.00 24.00 0.00 7.00 3.00 0.00 0.00 0.00 0.00 О Выводы. Поскольку результаты выполнения разработанной программы совпали с результатами сортировки вручную, можно говорить о том, что программа составле- на верно. Контрольные вопросы 1. Дайте определение понятия «сортировка». 2. Какие методы сортировки массивов Вы знаете? В чем заключается их суть? 3. Расскажите о преимуществах и недостатках каждого метода сортировки. 3.2. Алгоритмы обработки таблиц Двумерный массив или прямоугольная таблица В из и строк и т столбцов в общем виде выглядит следующим образом: Ьп Ь12... Ь1т 1^21 Ь12 1>2т 'п! ®п2 ™пт
На Паскале имена элементов массива записываются так же, с двумя но- мерами (индексами): Ь ( 1,1), Ь ( 1,2 ), ... , Ь ( 1,ш ), Ь ( 2,1 ), Ь ( 2,2 ), ... , Ь ( 2,т ),..., Ь ( п,т ). В памяти компьютера элементы двумерного массива рас- положены один за другим: после элементов первой строки следуют элементы второй строки таблицы и т. д. Если число строк таблицы равно числу столбцов, то такая таблица называется квадратной. Главная диагональ квадратной табли- цы проходит из левого верхнего угла в правый нижний. Рассмотрим задачи обработки таблиц и алгоритмы их решения. 1. Вычисление суммы элементов главной диагонали квадратной таб- лицы. Для решения задачи надо выполнить следующие шаги: 1) ввести таблицу в память; 2) найти сумму элементов главной диагонали; 3) напечатать резуль- тат. Описание таблицы, как и описание одномерного массива, используется для резервирования памяти. В описании таблицы указываются диапазоны для двух номеров: строк и столбцов. сопН п = 3; уаг Ь : аггау [ 1..п, 1..п ] о Г геа1; т.) : пйе^ег; При обработке массивов в разделе переменных программы появляются имена индексов элементов: для одномерного массива - одной, для двумерно- го - двух целочисленных переменных. При вычислении суммы элементов диагонали следует1 обратить внимание на имена суммируемых элементов: оба индекса имеют одинаковые значения, т. е. в общем виде имя элемента диагонали Ь [ 1, 1 ]. Это означает, что можно рассматривать диагональ как одномерный массив и использовать один цикл для вычислений. Программа имеет вид: рго^гат Е19; СОП81 п = 3; уаг Ь : аггау [ 1.. п, 1 .. п | оГ геа1; 1, | : 1п1е^ег; 8: геа1; Ье$;1п \угйе1п (‘ введите значения элементов таблицы по строкам’); ууп1е1п (‘ в конце каждой строки нажимайте Еп(ег’); Гог 1 : = 1 Ю п йо Ье^ш Гог ) := 1 Ю п йо геай ( Ь [ 1,) ]); тугйе1п епй; 8 :=0; Гог 1 := 1 (о п йо
8-8 + Ь[1,1]; лугйе (' сумма элементов диагонали таблицы 8 =‘, 8) епй. 2. Нахождение наибольших элементов каждой строки таблицы. Каждую строку таблицы можно рассматривать как одномерный массив и использовать идею нахождения наибольшего значения в программе Е16. Найденные значения будем помещать в одномерный массив (рис. 8). В про- грамме Е20 для каждой строки таблицы переменная а [ 1 ] играет такую же роль, как переменная шах в программе Е16. Для каждой строки (ее задает пере- менная /) элемент а [ 1 ] получает значение первого элемента строки. Затем внутренний цикл по переменной | позволяет просмотреть все элементы данной строки и, если среди них встретится элемент, значение которого больше, чем запомненное в а [ 1 ], то оно присваивается а [ 1 ] . Для распечатки результатов работы программы - массива а - используется цикл. Используемый в програм- ме комментарий, заключенный в фигурные скобки, позволяет при чтении про- граммы выделить основную ее часть. Массив результатов Данная таблица а[1] 6 5 6 1 а[2] 15 4 12 15 а[3] 2 2 -3 0 Рис, 8, Пример выполнения программы Е20 - нахождение наибольших элементов строк рго^гаш Е20; соп«Г п = 3; уаг Ь : аггау [ 1.. п, 1 .. п ] оГшГе^ег; 1, | : шГе^ег; а : аггау [ 1..п ] о Г шГе- Ье§ш мгйе1п (‘ введите значения элементов таблицы по строкам’); лупГе1п (‘ в конце каждой строки нажимайте Еп(ег’); Гог 1 : = 1 Го п йо Ье^ш Гог з := 1 Го п йо геай ( Ь [ Д ]); лгпГеГп епй;
{ построение массива наибольших значений элементов строк таблицы } Гог 1 := 1 Го п До Ье^ш Гог ] := 2 го п До И а [1] < Ь[1Д] гЬеп а [ 1 ] :=Ь [ 1, з]; епД; \уп1е1п (‘ наибольшие числа строк таблицы:’); Гог 1 := 1 Го п До м п Ге ( а [ 1 ] ) епД. 3. Нахождение сумм элементов столбцов таблицы. При обработке таблиц можно осуществлять операции как над строками, так и над столбцами. При нахождении сумм элементов столбцов можно исполь- зовать алгоритм примера Е15. Для лучшего понимания работы программы вве- дем переменную .5' для вычисления суммы, а затем для каждого столбца запи- шем полученный результат в массив а, т. е. присвоим его переменной а [) ], где у - текущий номер столбцов таблицы. Пример выполнения программы приве- ден на рис. 9. Данная таблица 5 6 1 4 12 15 2 -3 0 Массив результатов а[1] а [2] а[3] 11 15 16 Рис. 9. Пример выполнения программы Е21 - нахождение сумм элементов столбцов таблицы рго^гаш Е21; сопвГ п = 3; уаг Ь : а ттау [ 1.. п, 1 .. п ] оГ шГе^ег; 8,1,) : шГе^ег; а : аггау [ 1. .п ] оГ т- Ге§ег; Ье^ш
уупГеГп (‘ вводите значения элементов таблицы по строкам’); И’пГеГп (‘ в конце каждой строки нажимайте ЕпГег’); Гог 1 : = 1 Го п йо Ье^ш Гог з := 1 ю п До геай (Ь [:,Л); уупгеГп епй; { построение массива сумм элементов столбцов таблицы } Гог ) := 1 Го п йо Ье§1п 8 :=0; Гог 1 := 1 Го и йо 8:=8 + Ь[1,Л; а [Л :=8 епй; уупГеГп (‘суммы элементов столбцов таблицы:’); Гог 1 := 1 Го п До тупГе ( а [ 1 ] ) епй. 4. Перестановка строк таблицы. В прямоугольной таблице Ь из п строк и т столбцов требуется поменять местами две строки. При решении этой задачи можно использовать алгоритм обмена значениями двух переменных из программы сортировки (пример Е17). Для этого достаточно организовать цикл по переменной столбца и, используя промежуточную переменную, менять местами каждую пару элементов, стоя- щих в одном столбце. При заданных номерах строк К и Е решение выглядит так: рго^гаш Е22; соп$Г п — 3; т = 4; уаг Ъ' аггау [ 1.. п, 1 .. т] оГ геа1; с : геа1; 1Д, К, Е : тГе^ег; Ье§т уупГе (‘ введите номера меняемых местами строк таблицы’); геайГп ( К , Е ); { ввод таблицы } Гог 1 := 1 Го п йо Ье§ш уупГеГп (1, я строка таблицы’); Гог ):= 1 Го ш До геай(Ь[1,Л) епй; {перестановка строк }
Гог । :=1 1о т До Ье^и с:=Ь[К,Л; ЫК,з]:=Ь[ЬЛ; ь [Ь,Л :=с епй; {печать результатов} уупГе1п; лугйеГп (‘ таблица с переставленными строками: ‘); Гог 1 := ] ю п йо Ье§т Гог ; I (о т йо тепГе ( Ь [ 1, Л ); \уп(е1п епй епй. Вопросы и задания 1. В квадратной таблице, не содержащей отрицательных элементов, найти корень квадратный из произведения диагональных элементов. 2. Найти наибольший элемент квадратной таблицы. 3. Найти наименьший элемент квадратной таблицы и заменить его нулем. 4. В прямоугольной таблице заменить все элементы их квадратами. 5. В целочисленной прямоугольной таблице увеличить на 0,5 все отрица- тельные элементы. 6. В квадратной таблице найти наибольший элемент диагонали. 7. Переставить местами первую и последнюю строки прямоугольной таб- лицы. 8. Найти произведения элементов строк прямоугольной таблицы.
Лабораторное задание 9. Обработка двумерных массивов Цель - получение практических навыков обработки двумерных массивов. Задание. Необходимо в редакторе Разса! написать программу, которая производит обработку двумерного числового массива (матрицы) размерности п'к (5 < п < 10, 5 < к < 10). Параметры пик задаются в программе в виде кон- стант. Элементы массивов должны вводиться с клавиатуры. Выполнить про- грамму и проанализировать результаты ее работы. Варианты заданий Вариант № Условие 1. Для каждого столбца матрицы найти произведение его элементов, которые превосходят по своему значению вели- чину к . Величина к задается пользователем во время работы программы 2. Для каждого столбца матрицы определить значение наибольшего но модулю элемента и его порядковый номер 3. В каждом столбце матрицы вычислить среднее значение его элементов 4. Для каждой строки матрицы найти произведение элементов. Поменять местами строки с максимальным и минимальным значением произведения 5. В каждой строке матрицы найти сумму отрицательных элементов и сумму положительных элементов 6. Элементы каждой строки матрицы разделить на значение минимального элемента (в строке) 7. Для каждого столбца матрицы найти сумму квадратов его элементов. Поменять местами столбцы с максимальным и минимальным значением суммы квадратов 8. В каждой строке матрицы определить количество положи- тельных и отрицательных элементов 9. Для каждой строки матрицы найти сумму элементов, кото- рые превосходят по своему значению величину к . Величина к задается пользователем во время работы программы 10. В каждом столбце матрицы найти произведение его отрица- тельных элементов и произведение его положительных элементов 11. Для каждой строки матрицы определить значение ее наименьшего элемента и его порядковый номер 12. Для каждого столбца матрицы определить величину разно- сти между его наибольшим и наименьшим элементами
Вариант № Условие 13. В каждой строке матрицы определить количество элементов, которые превосходят по своему значению среднее значение всех элементов матрицы 14. В каждом столбце матрицы определить количество элемен- тов, которые не превосходят по своему значению среднее значение всех элементов матрицы 15. Д.тя каждого столбца матрицы найти произведение элемен- тов. Поменять местами столбцы с максимальным и мини- мальным значением произведения 16. В каждом столбце матрицы найти сумму отрицательных элементов и сумму положительных элементов Методические указания по выполнению лабораторной работы Размерность матрицы (параметры пик) задается в программе в виде констант. Матрица задается в программе в виде двумерного массива. Двумерный массив вводится пользователем программы с клавиатуры. Для этого применяется соответствующий вложенный (двойной) цикл РОК с предварительным выводом сообщения для пользователя о необходимости ввода элементов матрицы по строкам либо по столбцам: лупГе1п(‘Введите элементы матрицы размерности’, п, ‘х’, к, ‘по строкам’); Гог ц=1 Го п До Ье^ш лупГе!п(1, ‘-я строка’); Гог ):=1 Го к До геаД(а[Ц]); \ггйе1п; епД; Счетчики циклов должны быть объявлены как целочисленные перемен- ные. Составляя код программы, следует помнить, что для обращения к опреде- ленному элементу двумерного массива нужны два индекса (например я[/, Д). Первый индекс характеризует номер строки, а второй индекс - номер столбца. Обработка двумерного массива, скорее всего, потребует создания вло- женного цикла РОК. В процессе обработки двумерного массива по строкам внешний цикл РОК должен изменять номер (индекс) строки, а внутренний цикл - номер столбца. И, соответственно, в процессе обработки матрицы по столбцам внешний цикл РОК должен изменять номер столбца, а внутренний цикл - номер строки. При написании кода программы следует (по возможности) представлять его в наиболее компактном виде и не использовать избыточное количество пе-
ременных. Код программы необходимо сопровождать краткими поясняющими комментариями. В процессе решения поставленной задачи для хранения полу- ченного результата, в ряде случаев, будет удобно использовать одномерный массив (или несколько одномерных массивов), который должен быть объявлен в разделе описания переменных уаг. При выводе результатов вычислений на экран желательно выводить и ис- ходную матрицу. Вывод результатов на экран должен предваряться соответ- ствующими сообщениями для пользователя. В отчет необходимо включить экранный снимок выполнения программы в редакторе Разса!. Для проверки корректности составленной программы реко- мендуется провести параллельные расчеты в табличном процессоре. В отчет по лабораторной работе рекомендуется поместить экранный снимок результата данной проверки. Пример оформления отчета по лабораторной работе Вариант №16 Цель - получение практических навыков обработки двумерных массивов Задание. Необходимо в редакторе Ракса! написать программу, которая произво- дит обработку двумерного числового массива (матрицы) размерности п*к (5 < п < 10, 5 < /с < 10), - в каждом столбце матрицы находит сумму отрицатель- ных элементов и сумму положительных элементов. Параметры п и к задаются в программе в виде констант. Элементы массивов должны вводиться с клавиатуры. Выполнить программу и проанализировать результаты ее работы. Решение. Код программы: рго§гаш 1аЬ 9; {Лабораторная работа 9 обучающегося группы БИ-б-о-201 Петрова П.П.} соп'Л п=5; к=5; {размерностьматрицы} уаг а: аггау[1..п, 1..к] оГгеак {объявление двумерного массива} Ь: аггау[1. к] оГ геа1; {одномерный массив для хранения сумм отрицательных и по- ложительных элементов каждого столбца матрицы; его размерность равна числу столбцов матрицы} у: шГс§сг; {счетчики цикла} Ье§ш (Ввод элементов матрицы с клавиатуры по строкам} \гп(е1п('Введите элементы матрицы размерности’, п, ‘х’, к, ‘по строкам’); Гог ц=1 (о п йо Ье^ш мп(е1г1(|, *-я строка’); Гог ):=1 Го к (Го геас1(а[у]); уугйекг:
епй; {Нахождение сумы отрицательных элементов в каждом столбце матрицы} Гог ):=1 (о к йо {счетчик внешнего цикла соответствует индексу столбца} Ъе§ш {Изначально предполагаем, что сумма отрицательных элементов обра- батываемого столбца равна нулю} Ь[]]:=0; {проверяем каждый элемент }-го столбца матрицы, и если он отрица- тельный, то добавляем его в сумму} Гог к=1 Го г. йо к а[1,|]<0 Г11сп ЬШ:=ЬШ+а[ц]; епй; {Вывод на экран исходной матрицы} \угйе1п('Исходная матрица'); Гог к=1 Го п йо Ье§1п Гог(:= I Го к йо уупГе(а[у]:8:2); \\гке1п: епй; {Вывод на экран сумм отрицательных элементов каждого столбца матрицы} уугке1п('Суммы отрицательных элементов каждого столбца матрицы'); Гог) :=1 (о к йо уугке(ЪЦ]:8:2); {Нахождение сумм положительных элементов в каждом столбце матрицы} Гог ):=1 Го к йо {счетчик внешнего цикла соответствует индексу столбца} Ье§ш {Изначально предполагаем, что сумма положительных элементов обра- батываемого столбца равна нулю} ЬШ~0; {проверяем каждый элемент }-го столбца матрицы, и если он положи- тельный, то добавляем его в сумму} Гог к=1 Го п йо к а[г,)]>0 ГЬеп ЬШ-^ЬЦНаЩ]; епй; уупГсГп; {Вывод на экран сумм положительных элементов каждого столбца матрицы} уупГе1п('Суммы положительных элементов каждого столбца матрицы'); Гог р=1 Го к йо Н'гке(ЬЦ]:8:2); геайкц епй
Экранный снимок выполнения кода программы в редакторе Ракса!: ДДДД ► Рип | ОРеЬид | В51ор О - мЗыуе 11И глат.раз 3 к 31 нг11е(а[х з]:8:2); 32 нг11е1п 33 епН; 34 {Вывод на экран сумм отрицательных элементов и 35 «Г1Се1п('Суммы отрицательных элементов каждогс 36 з 1 Со к до 37 нг11е(Ь[з]:8:2); 38 {Нахождение сумм положительных элементов в 39 бог з :=1 Со к с1о {счетчик внешнего цикла “1 40 Ьея1п 41 Ь[з] 0; {Изначально предполагаем, что И х:=1 Со п с1о {проверяем каждый элеме» 43 а[т^з]>0 Ьеп 44 Ь[з] Ь[з] а[1,з] 45 -Ч». 46 нгхСе1п 47 {Вывод на экран сумм положительных элементов 48 нг1Се1п('Суммы положительных элементов каждог; 49 з 1 Со к до 50 нг1Се(Ь[з]:8:2) ; 51 геас11п 52 в Исходная матрица -10.00 7.00 3.00 2.00 4.00 7.00 -а. 00 -2.00 -9.00 10.00 7.00 12.00 -8.00 4.00 -5.00 -5.00 9.00 -7.00 3.00 8.00 7.00 3.00 11.00 9.00 8.00 -5.00 9 -,, -7.00 3.00 8.00 7.00 3.00 11.00 9.00 8.00 Су»« отрицательных элементов каждого столбца матрицы 1 -15.00 -8.00 -17.00 -9.00 -5.00 Суг*и положительных элементов каждого столбца матрицы 1 21.00 31.00 14.00 18.00 30.00 1 Экранный снимок выполнения вычислений в табличном процессоре: 10_____Суммы положительных элементов_ 11 =СУММЕСЛИ(А..А5;">0";А.А5)30 12
Выводы. Поскольку результаты выполнения разработанной программы совпали с результатами расчетов в табличном процессоре, можно говорить о том, что про- грамма составлена верно. Контрольные вопросы 1. Напишите синтаксис объявления двумерного массива в разделе описания переменных. 2. Как можно обратиться к определенному элементу двумерного массива? 3. Напишите синтаксис ввода элементов двумерного массива с клавиатуры по столбцам. 4. Может ли двумерный массив состоять из разнородных элементов? 5. Опишите алгоритм нахождения суммы элементов двумерного массива.
Лабораторное задание 10. Преобразование и построение матриц Цель - получение практических навыков определения индексов элементов матрицы, соответствующих необходимой области матрицы, и выполнения дей- ствий только с элементами матрицы, соответствующими нужному диапазону. Задание. Необходимо в редакторе Разса! написать программу, которая производит обработку элементов определенного диапазона квадратной матри- цы (заштрихованная область) размерности и*и (5 < п < 10). Параметр п задает- ся в программе в виде константы. Элементы матрицы должны вводиться с кла- виатуры. Выполнить программу и проанализировать результаты ее работы. Варианты заданий Вариант № Область матрицы Задание 1. Найти наибольший из элементов, расположенных в заштрихованной части матрицы 2. Найти наибольший из элементов, расположенных в заштрихованной части матрицы 3. Найти наибольший из элементов, расположенных в заштрихованной части матрицы 4. Найти наибольший из элементов, расположенных в заштрихованной части матрицы
Вариант № Область матрицы Задание 5. Найти наибольший из элементов, расположенных в заштрихованной части матрицы 6. Найти наибольший из элементов, расположенных в заштрихованной части матрицы 7. Найти сумму элементов, располо- женных в заштрихованной части матрицы 8. Найти наибольший из элементов, расположенных в заштрихованной части матрицы 9. Найти наибольший из элементов, расположенных в заштрихованной части матрицы 10. Найти сумму элементов, располо- женных в заштрихованной части матрицы
Вариант № Область матрицы Задание 11. Найти сумму положительных эле- ментов, расположенных в заштрихо- ванной части матрицы 12. Найти сумму положительных эле- ментов, расположенных в заштрихо- ванной части матрицы 13. Найти сумму положительных эле- ментов, расположенных в заштрихо- ванной части матрицы 14. Найти сумму положительных эле- ментов, расположенных в заштрихо- ванной части матрицы 15. Найти наименьший из элементов, расположенных в заштрихованной части матрицы 16. Найти сумму положительных эле- ментов, расположенных в заштрихо- ванной части матрицы
Методические указания по выполнению лабораторной работы Размерность матрицы (параметр и) задается в программе в виде констан- ты. Двумерный массив вводится пользователем программы с клавиатуры. Для этого применяется соответствующий вложенный (двойной) цикл РОК с предва- рительным выводом сообщения для пользователя о необходимости ввода эле- ментов матрицы по строкам либо по столбцам. При написании кода программы следует (по возможности) представлять его в наиболее компактном виде и не использовать избыточное количество пе- ременных. Код программы необходимо сопровождать краткими поясняющими комментариями. В процессе написания кода программы можно применять различные под- ходы. В частности, можно применить алгоритм, заключающийся в переборе всех элементов квадратной матрицы и проверке каждого элемента на заданное условие. Индексы элементов матрицы, расположенных ниже главной диагонали, соответствуют условию / >у, где / - индекс строки, у - индекс столбца. Соот- ветственно, индексы элементов матрицы, расположенных выше главной диаго- нали, соответствуют условию / < у, а индексы элементов матрицы, расположен- ных на главной диагонали, соответствуют условию / =у. Индексы элементов матрицы, расположенных ниже побочной диагонали, соответствуют условию /+у > п+1, где / - индекс строки,у - индекс столбца, п - размерность квадратной матрицы. Соответственно, индексы элементов матри- цы, расположенных выше побочной диагонали, соответствуют условию /+у < п+1, а индексы элементов матрицы, расположенных на побочной диаго- нали, соответствуют условию <+у = п+1. Так, например, заштрихованная область матрицы для задания варианта 16, соответствует элементам, расположенным одновременно на главной диаго- нали матрицы или ниже ее и на побочной диагонали матрицы или выше ее. В ходе задания сложного логического условия в операторе 1Р необходимо помнить, что составные части данного условия должны заключаться в круглые скобки и соединяться логическими союзами. Например, для 16 варианта: И(1>=)) апс! (1+)<=п+1) апй (а[1,)]>0) Шеп ... Второй способ решения подобных задач может заключаться в переборе только тех элементов матрицы, которые соответствуют заштрихованной обла- сти. Так, например, для заштрихованной области:
перебор всех элементов можно выполнить с помощью операторов: Гог !:=1 Го п Ло Гог ;:=1 Го 1 Ло где / - индекс строки,у - индекс столбца, п - размерность квадратной матрицы. При выводе результатов вычислений на экран желательно выводить и ис- ходную матрицу. Вывод результатов на экран должен предваряться соответ- ствующими сообщениями для пользователя. В отчет необходимо включить экранный снимок выполнения программы в редакторе Разса]. Пример оформления отчета по лабораторной работе Вариант № 16 Цель - получение практических навыков определения индексов элементов мат- рицы, соответствующих необходимой области матрицы, и выполнения действий только с элементами матрицы, соответствующими нужному диапазону. Задание. Необходимо в редакторе Разса! написать программу, которая произво- дит обработку элементов определенного диапазона квадратной матрицы (заштрихо- ванная область) размерности н'п (5<ч<10), _ находит сумму положительных эле- ментов, расположенных в заштрихованной части матрицы: Параметр п задается в программе в виде константы. Элементы матрицы долж- ны вводиться с клавиатуры. Выполнить программу и проанализировать результаты ее работы. Решение. Код программы: рго§гаш 1аЬ 10; {Лабораторная работа 10 обучающегося группы БИ-б-о-201 Петрова 11.11} сопаГ п=5; {размерность матрицы} уаг а: аггау[1..п, 1..п] оГгса!; {объявление двумерного массива} 8: гса1; {переменная для нахождения суммы положительных элементов, расположен- ных в заштрихованной части матрицы}
у: шГе§ег; {счетчики цикла} Ье§1п (Ввод элементов матрицы с клавиатуры по строкам} \угке1п('Ввсдите элементы матрицы размерности’, п, ‘х’, п, ‘по строкам’); Гог 1:=1 (о п йо Ье§1п чт1Ге1п(1, '-я строка’); Гог ):=1 (о п йо геай(а[1Л); уупГеГп; епй; {Нахождение суммы положительных элементов, расположенных в заштрихо- ванной части матрицы: нужные элементы расположены одновременно на глав ной диагонали матрицы или ниже ее и на побочной диагонали матрицы или выше ее} {в переменную з присваиваем то число, которое не меняет значение суммы} в:=0; Гог 1:=1 Го п йо Гог р=1 Го п йо {если определенный элемент матрицы расположен одновременно на глав- ной диагонали матрицы или ниже ее и на побочной диагонали матрицы или выше ее, и является положительным, то его значение нужно доба- вить в искомую сумму} 1Г (1>=]) апй (1+)<=г.+1) апй (а[у ]>0) ГИеп §:=8+а[у]; (Вывод на экран исходной матрицы} \\ пГе1п('Исходная матрица'); Гог г=1 Го п йо Ьс^ш Гог):=1 Го и йо ууг1Ге(а[1^]:8:2); «пГе!п; епй, (Вывод на экран найденной суммы} уупГе1п('Сумма положительных элементов, расположенных в заштрихованной ча- сти матрицы, 8=’, 8:8:2); геай!п; епй.
Экранный снимок выполнения кода программы в редакторе Разса!: тэт.раз 14 □ 1 п 15 геад(а[1 Л) 16 ыгз±е1п; 17 епа; 18 {Нахождение суммы положительных элементов, расположенных в заштрихованной 1 19 5-0; {в переменную 5 присваиваем то число, которое не меняет значение сум^ 20 1=1 1о п Ио 21 □ -1 п 22 (1> □) (1 □< п 1) Аги) (а[1 Л>0) Кел {если определенный элемент .'ц>чг.1 23 5: 5 а[1,Л; 24 {Вывод на экран исходной матрицы} 25 нгПе1п( ' Исходная матрица') 26 1 1 п до 27 ГП 28 з 1 п с1о 29 ыгЯ±е(а[1,:8:2), 30 шг!±е1п; 31 епй; 32 {Вывод на экран найденной суммы} 33 шг11е1п('Сумма положительных элементов, расположенных в заштрихованной части г 34 геасНп 35 36 -3.00 7.00 2.00 -4.00 1.00 э.оо -а.оо з.оо г.оо а.оо -5.00 7.00 10.00 9.00 2.00 6.00 9.00 2.00 9.00 7.00 10.00 5.00 8.00 3.00 2.00 51.00 Выводы. Поскольку результаты выполнения разработанной программы совпали с результатами расчетов вручную, можно говорить о том, что программа составлена верно. Контрольные вопросы 1. Какие алгоритмы обработки элементов матрицы, расположенных в опре- деленной области матрицы. Вы знаете? 2. Назовите преимущества и недостатки данных алгоритмов. 3. Как осуществить перебор всех элементов матрицы, расположенных ниже главной диагонали? 4. Как осуществить перебор всех элементов матрицы, расположенных выше побочной диагонали? 5. Как найти сумму элементов матрицы, расположенных на побочной диа- гонали? 6. Какие правила применяются для записи сложных логических условий в операторе ГР? 7. Какие логические союзы Вы знаете? Как они записываются на языке Раз- са1?
Тема 4. ОПЕРАТОР ВАРИАНТА Условный оператор позволяет осуществить ветвление программы только по двум направлениям, одно из которых соответствует выполнению проверяе- мого условия, а другое - невыполнению этого же условия. Если для перемен- ной необходимо осуществить ряд действий, зависящих от других условий, то надо записывать либо вложенные условные операторы, либо несколько таких операторов подряд. Для такой ситуации удобно использовать оператор вариан- та. Данная структура называется также переключателем и выполняется следу- ющим образом: вход в структуру содержит вычисление или ранее полученное значение переменной (индекса варианта). Это значение может совпасть с мет- кой, стоящей перед оператором на одной из ветвей переключателя. В таком случае выполняется оператор, помеченный этой меткой и происходит выход из структуры. Оператор может быть простым или составным, ограниченным опе- раторными скобками Ье$>ш ... епй; . Если значение индекса варианта не совпало ни с одной из меток, то выполняется оператор с номером и + 1 из строки еКе. Если оператор варианта содержит строку е1че, то это - полная форма оператора, если такой строки нет, то используется сокращенная форма оператора варианта. Метки оператора варианта могут быть константами любого типа, их тип должен совпадать с переменной индекса варианта. Индекс варианта может быть как именем переменной, так и выражением соответствующего типа. На языке Паскаль оператор варианта имеет вид: са«е индекс варианта (й метка 1 : оператор 1; метка 2 : оператор 2; метка п : оператор п; еке оператор п + 1 епй ; Приведем пример программы, содержащей оператор варианта. Одной из распространенных задач раздела физики «Молекулярно-кинетическая теория» является задача, связанная с расчетом числа молекул в единице объема в теле с заданной массы и в теле с известным объемом. Для такой задачи можно по- строить программу-решатель. Дано: молярная масса вещества М, плотность данного вещества Р, масса К или объем данного тела V. Требуется найти число молекул К: 1) в единице массы вещества; 2) в теле с заданной массой; 3) в единице объема вещества; 4) в теле с заданным объемом. Для решения задачи воспользуемся формулой: На К= —- Я м
где Нд= 6,022 * 10 3 г / моль - число Авогадро. На основании этой формулы получаем расчетные формулы для програм- мы: 1)К = МА/М; 2)К = НаК/М; 3) К = КЛ Р V / М; 4) К = КА Р / М. Программа имеет вид: рго^гаш Е23; сопй ИА — 6.022 Е23; уаг К : ййе§ег; М, К, Р, V, К: геа1; Ье§т уугйе1п (‘ Зная постоянную Авогадро, плотность Р данного вещества’); уугйе1п (‘ и его молярную массу М можно найти число молекул в’); уутйе1п(‘ 1. В единице массы вещества’); уутйе1п(‘ 2. В теле массой К’); уугйе1п(‘ 3. В единице объема’); уугйе1п(‘ 4. В геле объемом V’); уутйе(‘ Введите номер решаемой задачи’); геай1п(К); уугйе(‘ Введите исходные данные: М =’); геай1п( М); сазе И ей' 1: К:=ИА/М; 2: Ье§т уугйе (‘К=‘); геай1п(К); К := ИА *К/М; епй; 3: Ье^т уугйе (‘ плотность вещества Р=‘); геай1п(Р); уугйе (‘У=‘); геаййг (V); К := ИА *Р*У/М; епй; 4: Ье§ш уугйе (‘плотность вещества Р=‘); геай!п (Р); К := ИА *Р/У епй; епй; уугйе (‘число молекул К=’ , К’) епй.
Лабораторное задание 11. Оператор варианта Цель - получение практических навыков программирования выбора из произвольного числа имеющихся вариантов с применением оператора САЗЕ. Задание. Необходимо в редакторе Разса! написать программу с примене- нием оператора САЗЕ. Выполнить программу и проанализировать результаты ее работы. Варианты заданий1 Вариант № Задание 1. Даны три числа а, Ь, с, удовлетворяющие аксиоме треугольника и число р. Если р = 1, то необходимо найти периметр треугольника; если р = 2, то нужно вычислить площадь треугольника; если р — 3, то необходимо определить угол а. В других случаях нужно вывести на экран слово «треугольник» 2. Выч фигу 8 = < ислить площадь определенной геометрической ры: р-1, если к = 1, к , р —, если к - 2, 2 2 я -8- к, если к = 3, 2 я •/?•/, если к - 4, я • К2, если к =5, я • 8- (2/г а), если к = 6. 3. Выч фигу 8 = < ислить площадь определенной геометрической ры: а - Ь, если п = 1, А а-—, если п — 2, 2 (а+/>)•—, если п — 3,. л 8 , если п = 4, „2 а я • А , если п = 5. 360 4. Написать программу, которая по номеру автомобиля выводит на экран Ф. И. О. его владельца (для 10 автомобилей) 1 Составлено с использованием материалов: Комарова Е.С. Практикум по программированию на языке Паскаль / Е.С. Комарова. - Москва ; Берлин : Директ-Медиа, 2015. - Ч. 1. - Режим доступа: по подписке. - 1Л<[_: Ийр;//ЫЫ1ос1иЪ.ги/1пс1ех.р11р?ра§е=Ьоок&1с1=426942.
Вариант № Задание 5. По номеру дня недели (1, 2, .... 7) вывести на экран название этого дня на английском языке. Определить, какой этот день - рабочий или выходной 6. В зависимости от времени года («зима», «весна», «лето», «осень») охарактеризовать погодные условия («очень холодно», «тепло», «жарко», «холодно») 7. Выч У = < ислить значение функции: у г при к = 1, 7е' при к = 2, зт2х при к = 3, х2 + 4 при к = 4. 3 8. Написать программу, которая по определенному году и номеру месяца выводит на экран количество дней в этом месяце 9. Для введенной с клавиатуры цифры (0-9) вывести на экран ее название на английском языке 10. Написать программу, которая по введенному номеру единицы измерения (1 - килограмм, 2 - миллиграмм, 3 - грамм, 4 - тонна, 5 - центнер) и массе М вычисляла соответствующее значение массы в килограммах 11. Написать программу, которая по введенному номеру времени года выводила на экран название месяцев, ему соответствующих, и количество дней в каждом месяце 12. Для целого числа К (от 1 до 99) вывести на экран сообщение «Гражданину И лет». Здесь необходимо учитывать, что при определенных значениях К слово «лет» нужно заменить словом «год» или «года». Например, 10 лет, 24 года, 71 год 13. Написать программу, которая по введенному номеру единицы измерения (1 - дециметр, 2 - километр, 3 - метр, 4 - миллиметр, 5 - сантиметр) и заданной длине отрезка Ь вычисляла соответствующую длину отрезка в метрах 14. Составить программу, которая по вводимому с клавиатуры номеру класса (числу к от 1 до 11) выводила на экран соответствующее приветствие: «Здравствуй, к-классник!». Например, если к = 1, то - «Здравствуй, первоклассник!» 15. Даны два действительных положительных числа х и у. Арифметические операции над числами пронумерованы следующим образом: 1 - сложение, 2 - вычитание,
Вариант № Задание 3 - умножение, 4 - деление. Написать программу, которая по введенному номеру арифметической операции выполняет соответствующее математическое действие над числами 16. Написать программу, которая для введенного с клавиатуры числа (1 - 12) выводит на экран соответствующее название времени года на английском языке Методические указания по выполнению лабораторной работы В процессе выполнения данной лабораторной работы следует помнить, что: - оператор САЗЕ применяется для выбора определенного направления дальнейшего выполнения программы из нескольких вариантов; - выбор определенного направления хода программы (инструкции или со- вокупности инструкций) происходит во время выполнения программы и зависит от равенства значения переменной-селектора константе, указан- ной перед определенной инструкцией (или группой инструкций); - если в результате совпадения переменной-селектора и определенной кон- станты должны быть выполнены сразу несколько операторов, - их следу- ет заключать в операторные скобки Ье^дп ... епй; - переменной-селектором может являться переменная целого (например, пИе^ет) или символьного типа (тип данных сйаг). При написании кода программы следует (по возможности) представлять его в наиболее компактном виде и не использовать избыточное количество пе- ременных. Код программы необходимо сопровождать краткими поясняющими комментариями. В отчет необходимо включить экранный снимок выполнения программы в редакторе Разса!. Пример оформления отчета по лабораторной работе Вариант № 16 Цель - получение практических навыков программирования выбора из произ- вольного числа имеющихся вариантов с применением оператора САЗЕ. Задание. В редакторе Разса! необходимо написать программу с применением оператора САЗЕ, которая для введенного с клавиатуры числа (1—12) выводит на экран соответствующее название времени года на английском языке. Решение. Код программы: рго§гат 1аЪ _11; {Лабораторная работа 11 обучающегося группы БИ-б-о-201 Петрова П.П.}
уаг топ1Ь: 1п1е«ег: {номер месяца} Ье§111 {Вывод сообщения для пользователя о необходимости ввода исходных данных} \угке1п('Ввсдите номер месяца 1-12'); уугке('->‘); геас11п(топЙ1); {ввод исходных данных с клавиатуры} саке топ& о Г {Задание условий выбора в операторе САВЕ} {Если переменная-селектор равна 1, 2, 12, то на экран будет выведено сооб- щение "1Ут1ег” - Зима} 1,2,12: уугке1п('\Ут1ег'); {Если переменная-селектор равна 3, 4, 5, то на экран будет выведено сообще- ние "8рпп§” - Весна} 3..5: у»гИе1п('8рпп8'); {Если переменная-селектор равна 6, 7, 8, то на экран будет выведено сообще- ние “Виттег" - Лето} 6 .8. уугке1п('8иттег'); {Если переменная-селектор равна 9, 10, 11, то на экран будет выведено сооб- щение “ Ашитп ” - Осень} 9..11: уугке1п(‘Ли1итп'); {Если пользователь ввел число, которое не принадлежит диапазону 1-12, то программа выдаст сообщение об ошибке ввода} еке \Уг1(е1п('О|[|нбка ввода (от 1 до 12)'); епй; {в операторе САВЕ перед служебным словом “еЕе точка с запятой (;) ставит- ся} геасПп; епй. Экранные снимки выполнения кода программы в редакторе Ракса!: татраз 1 рго^гат 1аЬ_11 2 {Лабораторная работа 11 3 обучающегося группы БИ-б-о-201 4 Петрова П.П.} 6 пюп1Ь: 1п1е§ег {номер месяца} Г| 7 »г11г мгИе1п('Введите номер месяца 1-12')’ нгйе( ' - > ' ) 10 геасПп(«оп1Ь) В 11 топ1Н 1 2 12: ыгИе1п( 'Ы1п1ег' ) : 3..5: ыгИе1п('5рг1пе') 16..8: ыга±е1п('Биттег') 9..11: ыг11е1п('Аи1итп‘) ыг11е1п('Ошибка ввода (от 1 до 12)’) 17 18 геасПп 19
Введите номер месяца 1-12 |->7 Виппле г Введите номер месяца 1-12 ->17 Ошибка ввода (от 1 до 12) Выводы. Поскольку результаты выполнения разработанной программы совпали с результатами расчетов вручную, можно говорить о том, что программа составлена верно. Контрольные вопросы 1. В каких случаях целесообразно применять оператор САЗЕ? 2. Напишите синтаксис оператора САЗЕ (полной и сокращенной формы). 3. Как работает оператор САЗЕ? 4. Как поступить, если в результате совпадения переменной-селектора и определенной константы в операторе САЗЕ должны быть выполнены сразу несколько операторов? 5. Какой тип данных может быть у переменной-селектора?
Тема 5. ПОДПРОГРАММЫ При разработке программы иногда появляются повторяемые группы дей- ствий или возникает необходимость расчленить программу на функциональные модули, сделать ее структуру иерархической. Для этого во всех языках протрам- мирования существуют средства организации подпрограмм. При решении слож- ной задачи рекомендуется сначала алгоритм, а затем и программу разрабатывать «сверху вниз», от более общего плана к детальному. В таком виде главная про- грамма соответствует укрупненному плану решения задачи, а ее команды -- вы- зову соответствующей подзадачи, реализованной в виде подпрограммы. Идя по такому пути создания программы, можно отдельные мелкие функции реализо- вывать сначала в виде небольших подпрограмм, проверять их на контрольных примерах и, только убедившись в правильности работы, включать в состав ос- новной программы. Это удобнее проделывать, имея в распоряжении язык, поз- воляющий полностью выделить подпрограмму из текста основной программы в виде отдельного модуля. Использование подпрограмм позволяет разрабатывать программу по частям, поручать реализацию больших проектов группам разра- ботчиков. В состав таких групп входят специалисты данной науки или производ- ства, из области которой решается задача, компьютерные аналитики, разрабаты- вающие алгоритм и структурирующие данные, а также программисты, объеди- няющие алгоритм и данные в программе для компьютера. В Паскале подпрограмма является частью основной программы, ее опи- сание располагается между разделом уаг главной программы и ее программным блоком (первым Ье§т). Подпрограмм может быть несколько, их описания рас- полагаются в произвольном порядке одно за другим. Описание подпрограммы можно сравнить с записываемой в математике формулой «в общем виде», в ко- торую при расчетах подставляются конкретные значения. Поскольку далеко не каждую задачу можно свести к некоторой формуле, но можно записать алго- ритм ее решения, подпрограмма - это та же инструкция по решению некоторой задачи. Как и формулу, подпрограмму можно использовать для различных дан- ных, передаваемых из главной программы или других подпрограмм. Подпрограмма - это специальным образом оформленный алгоритм, который может многократно использоваться при решении более общей задачи. В Паскале различают два вида подпрограмм: процедуры и функции. Ос- новное различие между ними заключается в том, что процедура получает в ре- зультате своей работы любое количество данных, а функция - только одно зна- чение. Подпрограммы имеют структуру, аналогичную главной программе. Они содержат заголовок со специальным словом - признаком подпрограммы, имя и, при необходимости, списки передаваемых на обработку и получаемых из под- программы данных. Затем могут располагаться все разделы описаний, имею-
щиеся в главной программе: меток, констант, типов и переменных. В этих раз- делах описываются данные, используемые только внутри подпрограммы и яв- ляющиеся промежуточными при ее выполнении. Такие данные, используемые только в подпрограмме, называются локальными. В подпрограмме могут участ- вовать переменные, описанные в главной программе. Такие данные называются глобальными, их значения и подпрограмма, и главная программа берут из об- щей памяти. При работе с подпрограммой всегда выделяется два этапа: описание под- программы, т. е. запись алгоритма решения задачи в специальной форме, и вы- зов подпрограммы - передача ей данных на обработку из вызываемой програм- мы, которая, в свою очередь, может быть подпрограммой, и получение обратно результатов. Рассмотрим способы организации подпрограмм в Паскале. 5.1. Процедуры Процедура - подпрограмма, имеющая любое количество входных и вы- ходных данных. Процедура может быть описана без параметров и с параметра- ми. Параметры - это данные из заголовка процедуры, как передаваемые ей на обработку, так и получаемые в виде результатов. Таким образом, с помощью параметров происходит обмен информацией между процедурой и вызывающей ее программой. Процедуры без параметров Описание процедуры имеет вид: ргосеДцге имя; {описание локальных переменных} Ье§1п {операторы} еп<1; Процедура без параметров может реализовывать любой алгоритм. Все переменные, над которыми производят действия операторы процедуры, опре- деляются в вызывающей программе, им присваиваются необходимые для вы- полнения процедуры значения. 1. Рассмотрим пример вычисления наименьшего общего кратного двух натуральных чисел НОК (X, У), которое можно вычислить, используя наибольший общий делитель этих чисел, по формуле: X * У НОК( Х,У ) =---------- НОД(Х,У)
При составлении программы оформим как процедуру без параметров про- грамму Е7 - вычисление НОД по алгоритму Евклида. Результат работы проце- дуры будет заноситься в ячейку с именем М, переменная М описана как гло- бальный параметр, она используется и главной программой, и процедурой. В программе будем вычислять НОК нескольких чисел, занеся их в массив С. Этот массив формируется в разделе констант главной программы. Если данные опре- деляются в разделе констант, они не требуют дополнительного описания в раз- деле переменных (уаг). Переменная X сначала содержит значение первого числа, а затем ей присваивается результат - НОК двух первых чисел. Переменная У имеет своим значение второе число из каждой пары, для которой вычисляется наименьшее общее кратное. Таким образом, при каждом шаге цикла вычисляет- ся НОК двух чисел, первое из которых X содержит результат предыдущего шага. Вызов процедуры ХОВ вычисления наибольшего общего делителя осу- ществляется только по имени: М)1); Текст программы имеет вид: рго^гат Е24; сопИ с: аггау [1 .. 5] оПпГе^ег = ( 36,54,72,18,15 ); уаг х, у, 1, т : тГе^ег; ргосейиге ХОВ; { заголовок процедуры } уаг а, Ь: тГе^ег; { описание локальных переменных } Ье§1п а := х; Ь := у; { сохранение исходных данных } луНПе а о Ь йо И а > Ь 141 сп а := а - Ь еке Ь := Ь - а; т а { результат работы процедуры присваивается глобальной пе- ременной } епй: { конец процедуры } Ье^1п { начало главной программы } х :=с [ 1 ] ; Гог 1 := 2 Го 5 До Ьещп у-С 11]; ХОВ; { вызов процедуры без параметров } х := х * у Шу т { сНу - деление нацело для целочисленных данных } епй: лугГГе (‘ НОК , х) епй. { конец главной программы }
Процедуры с параметрами. Для удобства передачи данных в процедуру и получения из нее результата используются формальные и фактические пара- метры. Формальные - условные обозначения в описании процедуры - описы- ваются в ее заголовке. Фактические - с которыми требуется выполнить проце- дуру - перечисляются при вызове процедуры. Формальные и фактические па- раметры должны соответствовать по количеству, типу и порядку следования. Формальные параметры, описанные в заголовке процедуры, больше нигде не описываются. Их описание похоже на описание данных в разделе переменных и может также содержать слово уаг. Слово уаг в заголовке процедуры ставится перед теми параметрами, имена которых соответствуют выходным данным. Фактические параметры, соответствующие формальным, перед которыми стоит слово уаг, могут быть только именами переменных. Перед именами формаль- ных переменных, являющимися входными данными процедуры, можно слово уаг не указывать. Если перед формальным параметром в заголовке процедуры нет слова уаг, то ему может соответствовать формальный параметр, имеющий вид выражения соответствующего типа. Если для входных данных процедуры при описании формальных параметров указано слово уаг, то им также соответ- ствуют фактические параметры - имена переменных. 2. Например, процедура МОП с параметрами может иметь заголовок: ргосейиге МОП ( а, Ь: пПе^ег; уаг к: пНе^ег ); Вызов этой процедуры: МОП ( х, у, т); или: МОП (36, 54, т); Переменные в заголовке процедуры - формальные параметры, заменяе- мые при выполнении процедуры на конкретные значения переменных х и у или числа 36 и 54. В заголовке процедуры МОП описаны формальные параметры: а и Ь - входные данные, для которых находится наибольший общий делитель; к - результат работы процедуры. При вызове процедуры переменная а примет значение х, а переменная Ъ - значение у. Результат работы процедуры при вы- зове попадет в ячейку с именем т, которой соответствует формальный пара- метр к. Программа при использовании процедуры с параметрами примет вид: рго^тат Е25; сопя! с: аггау [1 .. 5] о? тГе^ег = ( 36,54,72,18,15 ); уаг х, у, 1, т : т!е§ег; ргосейиге МОП ( а, Ь : нйе&ег; уаг к : пНецег); {заголовок процедуры} Ьещп луЫ1е а о Ь йо И а > Ь 111 еп а := а - Ь еке Ь := Ь - а; к := а { значение переменной к - результат работы процедуры } еп<1; { конец процедуры }
Ье^ш { начало главной программы } х := с [ 1 ] ; Гог 1 := 2 Го 5 йо Ье§ш у := с [ 1 ]; КСЮ ( х, у, т); { вызов процедуры с фактическими пара- метрами } х := х * у й1у т епй; лугйе (‘ НОК =‘, х) епй. { конец главной программы } 3. Рассмотрим еще один пример использования процедуры с параметра- ми. Найдем с помощью процедуры среднее арифметическое, наибольший и наименьший элементы массива. рго^гаш Е26; сопяГ п = 50; Гуре К = аггау [ 1..п ] оГ геа1; уаг У:К; А, В, С : геа1; 1 : тГе^ег; ргосейиге 8ГаГ (Х:К; уаг 8, тт, тах: геа!) ; Ье^ш 8 := 0 ; тт := х [1]; тах := х [1]; Гог 1 := 1 Го п йо Ье§т 8 :=8 + х[1]; 1Г х [ 1 ] < тт ГЬеп тт := х [ 1 ] ; 1Г х [ 1 ] > тах ГЬеп тах := х [ 1 ] епй; 8 :=8/п епй; Ьещп { главная программа } Гог 1 := 1 Го п йо геай ( У [; ]); 8ГаГ ( У, А, В, С); { вызов процедуры } угпГеГп; лупГе ( ‘среднее = ‘ , А, ‘наименьшее = ‘ , В, ‘ наибольшее = ‘, С ) епй. В программе Е26 появился новый раздел описаний - раздел типов данных Гуре. В этом разделе можно описать новый тип данных через уже известные ти- пы, которые могут быть так же ранее описаны в данном разделе. Тип данных К - это массивы из п вещественных чисел, К - имя типа. В дальнейшем этот тип позволяет сократить описания, он используется в главной программе при
описании исходного массива У и в заголовке процедуры при описании фор- мального параметра - массива X. Главная программа состоит из 'грех основных этапов: 1) ввода данных- массива X; 2) вызова процедуры 81а! с фактическими параметрами - массивом У и получаемыми результатами, попадающими соответственно в ячейки А (среднее значение), В ( наименьшее) и С (наибольшее); 3) печати результатов работы программы. 5.2. Подпрограммы-функции Подпрограмма, имеющая единственный результат, может быть оформле- на как функция. Описание функции имеет вид: ГипсНоп имя_функции ( описание входных данных ) : тип_рсзультата; {описания локальных переменных } Ье^ш { операторы } имя_функции := результат; епй; После описания формальных параметров, которые являются аргументами функции, в заголовке указывается тип результата, т. е. тип самой функции. Это описание относится к имени функции, которому необходимо присвоить значе- ние результата работы подпрограммы. Как и процедура, функция может содер- жать все четыре раздела описаний локальных переменных. Имя функции нельзя использовать для промежуточных вычислений. Функция вызывается с помощью указателя. Указатель - это имя функции, после которого в круглых скобках перечислены фактические параметры - ар- гументы функции. Указатель имеет вид: имя_функции (список фактических параметров) Указатель может появиться в выражении соответствующего типа, в усло- виях операторов И, исЬПе и гсреа( после слова ппШ, а также в операторе пе- чати мтИе. Примерами вызова функций являются встроенные арифметические функции, например: мтИе (зт(х)); 4. Рассмотрим третий вариант программы вычисления наименьшего об- щего кратного. Так как наибольший общий делитель двух натуральных чисел - единственное число, то вычисляющую его подпрограмму можно оформить как функцию. Программа имеет вид:
рго^гат Е27; сопзГ с: аггау [1 .. 5] оПпГе^ег- ( 36,54,72,18,15 ); уаг х, у, 1: тГе^ег; Гипсйоп КОВ ( а, Ь : тГе^ег) : т!е§ег; { заголовок функции } Ье^т зуЬПе а <> Ь До И а > Ь Шеп а := а - Ь еке Ь := Ь - а; КОВ := а {результат работы функции присваивается ее имени } епй; { конец описания функции } Ье^т { начало главной программы } х := с [ 1 ] ; Гог 1 := 2 Ш 5 До Ье§ш У := с [ 1 ]; х := х * у Д1у КОВ ( х, у) { вызов функции } епй: зтпГе (‘ НОК =‘ , х) епй. { конец главной программы } 5. Одна подпрограмма может вызывать другую. Рассмотрим программу уточнения корня уравнения методом деления отрезка пополам (пример Е14), включающую две подпрограммы. Первая подпрограмма - процедура, реализу- ющая метод половинного деления, вторая - подпрограмма-функция, вычисля- ющая значения функции в требуемых точках. рго^гат Е28; уаг а1, Ы, е, у: геа1; {а1, Ы - концы отрезка, е - точность, у - результат вычислений} ргоееДиге ргес18е ( а, Ь, еря: геа1; уаг с : геа1); {процедура уточнения кор- ня} Ьещп ууйПе аЬз ( Ь - а ) > ерз До Ье§т с : = ( а + Ь ) /2; И Г(а) * Г(с)>0 Шеп а := с еке Ь := с епД; с := ( а+Ь) /2 епД; { конец процедуры } ГппсШт Г( х : геа!) : геа1; { заголовок функции } Ье§1п Г := х * х - соз (х) + 0.5 епД; { конец описания функции }
Ье^ш { начало главной программы } уугИе (‘ введите значения концов отрезка1); геасПп (а1, Ы); уугйе (‘ введите точность1); геасПп ( е ); ргессзе ( а1, Ы, е, у); уугИе ( 1 корень Г(х) на отрезке 1 , а1, , Ъ1, ‘равен ’, у) епй. {конец главной программы } Вопросы и задания 1. Что такое подпрограмма и для чего она используется? 2 Объясните назначение локальных и глобальных переменных. 3. Как происходит обмен данными с процедурой без параметров? 4. Что такое формальные и фактические параметры? 5. К чему относится описание типа в конце заголовка подпрограммы- функции? 6. Чем отличается вызов функции от вызова процедуры? 7. Как задать значения элементов массива без использования оператора ввода? 8. Примеры программ предыдущих параграфов, кроме рассмотренных в данном, оформить с использованием процедур.
Лабораторное задание 12. Подпрограммы. Функции Цель - получение пракгических навыков по созданию и применению подпрограмм-функций. Задание. Необходимо в редакторе Разса! написать программу вычисления значений величины у. Для нахождения сумм создать подпрограмму-функцию. к - вещественное число, задаваемое пользователем во время работы програм- мы. Выполнить программу и проанализировать результаты ее работы. Варианты заданий Вариант № Задание 1. 10 + ^(7/3 +3/ + 11) У = V 3 + Ё(4'2 + 2 + 7г) 1=2 2. ^(2»2 +5/ + 7)+й У = ~ п 17 + ^(/2 + 2/г) 3. Ц + 3-^(/3 + 18) у = — 18 + 22(2;3 + г + 71 + 4) 4. 3 + 2'Х(3/2 +/ + 12) у 1=2 8 + Е(4/2+24)+7-Е(7/ + 1) 5. Н + Х(/2 +/г +3)2 У = V й2 +^(з/2 + 2/ + 1)2 6. 2 + Х(5г3 +/ + 7) у = 4 + Ё(3/2 +3/-й) 7. 3/г ьХ(3/3 +2'2 +4) у = 14+ 2 (7г +2Л + 7)
Вариант № Задание 8. з + 1(/3 + /2+1) у = 1—п Л + 5-^(8/2 +16 7=3 9. 22 (4/2 + 3/ - к) у = — 14 + Ё(5;'2 + /) 7=1 10. ^(б<2 -2/ + А) У Ё(з/2+21)3 11. к- + 2-^(5г +47-10) у= 2 + ^(10/2 + й) 1=2 12. 7 ьЕ(3/3 + 7/+ 2 у = А + Х(5/3 +Ю/2 -1) 13. 11 + ^(4/2 +5/) У = 20 + ЁО'2 + /+Л+1) 14. к2 +Х(3г +!8) У = 4 + Ё(2'2 +7/+Л ) 15. 5Й + ^(2|3 -/2 +24) У = г1 7 + ^(/3 + Г -1 + /г) 7=3 16. 14 + Е(/3 + / + 21 з7 = 2й + ^(0.5/3 +2/4 л)
Методические указания по выполнению лабораторной работы Каждая из формул для вычисления значения величины у содержит не- сколько похожих выражений - сумм. Поэтому, создавая код программы, целе- сообразно написать пользовательскую функцию, которая будет определять данные суммы. Следует помнить, что имена функций формируются но тем же правилам, что и имена переменных. То есть они могут состоять из латинских букв, цифр и нижнего знака подчеркивания и обязательно начинаются с буквы. В качестве имен функций нельзя использовать служебные слова. Приступая к работе над заданием, первоначально необходимо записать выражение для вычисления суммы в общем виде, которое подойдет для всех входящих в формулу составных элементов - сумм. Рассмотрим задачу варианта 16. Расчетная формула для этого варианта представлена выражением: 14 + Е(/3 + 1 + 21) У =-----7^------------• 2Л + ^(0.5/3 +2/ + Й.) 7=1 Представленная выше формула предполагает нахождение значений сле- дующих двух сумм: 51=^(/3+/ + 21), ,5'2 =^(о.5/3+2/ + /?). /=3 /-1 Поэтому искомое выражение для нахождения суммы может быть записа- но следующим образом: зит(к\,к2,а$,а2,а\, яО) = 2ДяЗ •/' +а2-г + я1-/ + я0). /=Н Сумма .57 может быть найдена с помощью следующего вызова функции: я«н(3, к, 1, 0, 1, 21). А сумму 52 можно определить с помощью вызова функции «7777(1 , 77, 0.5, 0, 2, /?). Пределы суммирования можно задавать в программе в виде констант. Необходимо помнить, что при создании функции перед завершением ее описания (перед епй;) имени функции обязательно нужно присвоить результат работы функции. Также нужно учитывать, что имя функции нельзя использо- вать для промежуточных вычислений. Код программы необходимо сопровождать краткими поясняющими ком- ментариями. Вывод результатов на экран должен предваряться соответствую- щими сообщениями для пользователя.
В отчет необходимо включить экранный снимок выполнения программы в редакторе Разса!. Для проверки корректности составленной программы реко- мендуется провести параллельные расчеты в табличном процессоре. В отчет по лабораторной работе рекомендуется поместить экранный снимок результата данной проверки. Пример оформления отчета по лабораторной работе Вариант №16 Цель - получение практических навыков по созданию и применению подпро- гра мм-функций. Задание. Необходимо в редакторе Разса! написать программу вычисления зна- чений величины 14 + Е(/3 + / + 21) у =------. 2Л + Х(0-5'3 +2/ + А) Для нахождения сумм создать подпрограмму-функцию, к - вещественное чис- ло, задаваемое пользователем во время работы программы. Выполнить программу и проанализировать результаты ее работы. Решение. Код программы: рго§гаш 1аЪ 12; {Лабораторная работа 12 обучающегося группы БИ-б-о-201 Петрова 11.11.} икек СП; сопМ п=7; к=8; уаг у, к: геа1; {Создаем функцию} Гипсйоп &ит(к1, к2: т(с§сг; аЗ, а2, а1, аО: гсаГ): геа1; уаг г 1п1е^ег: {счетчик цикла} 8: геа1; {вспомогательная переменная для накопления величины искомой суммы} Ье§1п {в переменную в помещаем то значение, которое не меняет результат суммирова- ния} &:= 0; {Определение суммы} Гог е= к1 (о к2 До 8:= 8 + аЗ*зцг(1)*1 + а2 * 8цг(1) + а1 * 1 + аО; 8ит:= 8; {имени функции присваиваем результат ее выполнения} епс1: Ье§1п {начало главной программы} {Ввод данных} У1ГЙе("Введите параметр 11=’); геас11п(11);
{Нахождение значения искомой величины у с помощью вызова созданной функции зит} у = (14 + 8ит(3, к, 1, О, 1, 21)) / (2*Ь + 8ит(1, п, 0.5, 0, 2, Ь)); {Вывод результата работы программы} уугке1п(‘у=’, у : 8 : 3); геасПп; епс1. Экранный снимок выполнения кода программы в редакторе Разса!: Введите параметр Ь—4 у= 3.017 Экранный снимок выполнения вычислений в табличном процессоре: Е <3 I <1 3,017 89 151 243 371 541 1446 _____Р_________Е ____ 82_____________К= 6,5 12 у= 23,5 44 76,5 124 [=0,5*(С8Л3)+2*С8+$(3$1 47б' 10 11 12 13 14 14 + ^(г3+/ + 21) ______с-3__________ 2/г + 2(05г3 + 2г + й) Выводы. Поскольку результаты выполнения разработанной программы совпали с результатами расчетов в табличном процессоре, можно говорить о том, что про- грамма составлена верно
Контрольные вопросы 1. Что такое подпрограмма-функция в языке программирования РазсаГ? 2. Какие удобства предоставляет подпрограмма-функция разработчику про- грамм? 3. Напишите синтаксис описания подпрограммы-функции в разделе уаг. 4. По каким правилам формируются имена подпрограмм-функций? 5. Как можно вызвать подпрограмму-функцию в основной программе? 6. Можно ли имя функции использовать для промежуточных вычислений? 7. Опишите алгоритм, примененный в рамках выполнения данной лабора- торной работы.
Лабораторное задание 13. Процедуры и функции Цель - получение практических навыков по созданию и применению подпрограмм - процедур и функций. Задание. Необходимо в редакторе Разса! написать программу обработки одномерного массива размерности п с применением процедур и функций (ввод и вывод массивов нужно оформить в виде процедур, а вычисления и преобразо- вания в массиве - в виде функций). Выполнить программу и проанализировать результаты ее работы. Варианты заданий Вариант № Задание 1. 1. Найти произведение элементов одномерного массива, расположенных после минимального по модулю элемента. 2. Упорядочить массив по возрастанию 2. 1. Найти произведение элементов одномерного массива, расположенных после максимального по модулю элемента. 2. Упорядочить массив по убыванию 3. 1. Найти сумму квадратов элементов одномерного массива, расположенных после минимального элемента. 2. Упорядочить массив по возрастанию модулей элементов 4. 1. Найти сумму квадратов элементов одномерного массива, расположенных после максимального элемента. 2. Упорядочить массив по убыванию модулей элементов 5. 1. Найти произведение элементов одномерного массива, расположенных между максимальным и минимальным элементами. 2. Удалить из массива элементы с нечетным индексом. Освободившиеся в конце элементы заполнить нулями 6. 1. Найти сумму модулей элементов одномерного массива, расположенных после первого отрицательного элемента. 2. Вначале расположить элементы, равные 0, затем - остальные 7. 1. Найти сумму квадратов элементов одномерного массива, расположенных после первого нулевого элемента. 2. Элементы, равные 0 расположить после всех остальных 8. 1. Найти произведение элементов одномерного массива, расположенных между первым и вторым положительными элементами. 2. Вначале расположить четные, затем - нечетные элементы 9. 1. Найти произведение элементов одномерного массива, расположенных между первым и вторым отрицательными элементами. 2. Вначале расположить нечетные, затем - четные элементы
Вариант № Задание 10. 1. Найти произведение элементов одномерного массива, расположенных между первым и вторым нулевыми элементами. 2. Вначале расположить элементы с четным, затем - с нечетным индексом 11. 1. Найти сумму кубов элементов одномерного массива, расположенных между первым и последним положительными элементами. 2. Вначале расположить элементы с нечетным, затем - с четным индексом 12. 1. Найти сумму кубов элементов одномерного массива, расположенных до последнего положительного элемента. 2. Удалить из массива элементы, модуль которых не превышает 10. Освободившиеся в конце элементы заполнить нулями 13. 1. Найти сумму кубов элементов одномерного массива, расположенных между первым и последним отрицательными элементами. 2. Удалить из массива отрицательные элементы. Освободившиеся в конце элементы заполнить нулями 14. 1. Найти сумму квадратов элементов одномерного массива, расположенных между первым и последним нулевыми элементами. 2. Удалить из массива положительные элементы. Освободившиеся в конце элементы заполнить нулями 15. 1. Найти произведение элементов одномерного массива, расположенных между максимальным и минимальным по модулю элементами. 2. Удалить из массива элементы с четным индексом. Освободившиеся в конце элементы заполнить нулями 16. 1. Найти сумму элементов одномерного массива, расположенных после первого положительного элемента. 2. Изменить порядок следования элементов массива на обратный Методические указания по выполнению лабораторной работы Программа должна предусматривать выполнение следующих действий: - заполнение одномерного массива размерности п случайными числами; - вычисление в исходном массиве (пункт 1 задания); - преобразование исходного массива (пункт 2 задания); - вывод на экран для пользователя результатов работы программы (реко- мендуется также выводить исходный массив).
Заполнение и вывод массивов оформляется в виде подпрограмм-процедур (в качестве параметра передается массив), а вычисление и преобразование необходимо реализовать в виде подпрограмм-функций (в качестве параметра передается массив). Размерность одномерного массива (параметр п) задается в программе в виде константы. Для удобства описания и сокращения кода программы рекомендуется со- здать в разделе (уре пользовательский тип данных, описывающий одномерный массив вещественных чисел, который затем применять в главной программе и подпрограммах (процедурах и функциях) для описания массивов. Например: сопя! п=10; {размерность массива} 1уре таз=аггау[1..п] о( геа1; {создаем новый тип данных - одномерный массив размерности п, содержащий вещественные числа} уаг а,Ь: таз; {исходный и преобразованный массивы} ргосеЛиге упуосИс: таз); уаг 1: пПе^ег; Ье§т Гог 1~1 {о п До мгйе(с[1]:8:2); \угйе1п; епй; Перед генерированием случайных чисел (элементов массива) необходимо применить процедуру гапйоппге. При написании кода программы следует (по возможности) представлять его в наиболее компактном виде и не использовать избыточное количество пе- ременных. Код программы необходимо сопровождать краткими поясняющими комментариями. Вывод результатов на экран должен предваряться соответ- ствующими сообщениями для пользователя. В отчет необходимо включить экранный снимок выполнения программы в редакторе Разса!. Пример оформления отчета по лабораторной работе Вариант №16 Цель - получение практических навыков по созданию и применению подпро- грамм - процедур и функций. Задание. Необходимо в редакторе Разса! написать программу обработки одно- мерного массива размерности п с применением процедур и функций: 1. Найти сумму элементов одномерного массива, расположенных после первого положительного элемента. 2. Изменить порядок следования элементов массива на обратный.
Ввод и вывод массивов нужно оформить в виде процедур, а вычисления и пре- образования в массиве - в виде функций. Выполнить программу и проанализировать результаты ее работы. Решение. Для решения данной задачи нам понадобятся: 1. Процедура ввода (случайным образом) элементов одномерного массива. 2. Процедура вывода на экран элементов одномерного массива. 3. Функция, которая определяет в массиве номер первого положительного эле- мента. 4. Функция, которая суммирует элементы одномерного массива в определенном диапазоне. 5. Процедура, которая меняет порядок элементов массива на обратный. Код программы: рго§гаш 1аЬ 13; {Лабораторная работа 13 обучающегося группы БИ-б-о-201 Петрова П.П.} сопзГ п=10; {размерность массива} {Создаем новый тип данных - одномерный массив размерности п, содержащий ве- щественные числа} Гуре та8=аггау[1..п] оГгса1; уаг а,Ь: так; {исходный и преобразованный массивы} 8ит_е1ет: геа1; {итоговая переменная, хранящая полученную сумму элементов мас- сива} к: 1пГе§ег; {номер первого положительного элементе! в массиве} {Процедура, которая заполняет одномерный массив случайными числами: массив пе- редается в процедуру в качестве параметра} ргосейиге ууой(уаг с: таз); уаг 1. 1п1е«ег: {счетчик цикла} Ье§1п гапс1опп7.е: {данная процедура необходима для обеспечения корректной генерации случайных чисел} {генерируем п случайных чисел и заполняем ими одномерный .массив} Гог Е = 1 Го п с!о с[1]:^гапс1от( 1()0)-гапс1от( 100): епй; {завершение описания процедуры} {Процедура, которая выводит одномерный массив на экран: массив передается в процедуру в качестве параметра} ргосейиге уиуой(с: таз); уаг 1: тГедег; {счетчик цикла} Ье§1п Гог ц=1 Го п йо И'пГе(с[1]:8:2); {вывод на экран очередного элемента массива} 5УпГе1п; епй; {Функция, которая определяет в массиве номер первого положительного элемента}
ГипсНоп питЬег(с: та8):1пГе§ег; уаг I: шГе§ег; {вспомогательная переменная для поиска номера элемента массива} {сначала предположим, что положительных элементов в массиве нет и }1а§=(), а ко- гда положительный элемент будет найден $Ж=1 и выходим из цикла} Пас' т(е§сг; г 1п1е«ег: {счетчик цикла} Ье§1п 1~1; {переменная, которая необходима для выхода из цикла, чтобы не было за- цикливания, если положительных элементов не окажется вовсе} Па§:=0; 1~0; {предполагаем, что положительных элементов в массиве нет} ууППе (Пац<>() апй (1<>п+1) йо Ье^т !Гс[1]>0 (Пеп Ье§т Ла§:=1; (;=1; {запоминаем номер первого положительного элемента масси- ва} епй; 1:=1+1; {для того чтобы перейти к следующему элементу массива при необходимости} епй, питЬег:=(; {значением функции будет либо номер первого положительного эле- мента массива, либо 0 - когда положительных элементов в массиве нет} епй; {завершение функции} {Функция, которая суммирует элементы одномерного массива в определенном диа- пазоне, от п1 до п2} ГипсИоп 8итта(с: таз; п1,п2: тГевег); геа1; уаг к 1п(е§ег; {счетчик цикла} 81 геа1; {вспомогательная переменная для накопления суммы} Ье§1п 8=0: {сначала сумма элементов массива равна нулю} Гог 1:=п1 (о п2 йо 8;=8+с[1]; {после этого цикла в переменной в будет находиться сумма элемен- тов одномерного массива от п1 до п2} 8итта:=8; {присваиваем имени функции итоговое значение} епй; {завершение функции} {Процедура, которая меняет порядок расположения элементов массива на обрат- ный} ргосейиге ропайок(с: глав: уаг й: глав); уаг е тГе§ег; {счетчик цикла} Ье^цп Гог к=1 (о п йо й[1]:=с[п-1+1]; {после работы данной процедуры в массив с! будет записан мас- сив с в обратном порядке} епй; {завершение процедуры}
Ье§1п {начало главной программы} {Вызываем функцию которая сгенерирует массив а} ууо<1(а); {врезультате массив а должен заполниться случайными числами} {Выводим ^генерированный массив на экран с помощью процедуры ушюд} ууп(е1п('Исходный массив'); уиуос!(а); {С помощью функции питЬег определяем и записываем в переменную к номер пер- вого по счету положительного элемента в массиве} к:=питЬег(а); {Находим сумму элементов одномерного массива, расположенных после первого положительного элемента, применяя функцию зитта} 8ит_е1ет:=8итта(а,к,п); {Выводим полученное значение на экран} \угйе1п('Сумма элементов =', яит_е1ет:8:2); {Меняем порядок расположения элементов массива а на обратный. Результат помещаем в массив Ь. Применяем процедуру ропас1ок} ропа4ок(а,Ь); (Выводим новый массив на экран с помощью процедуры уил’од} ууп1е1п('Преобразованный массив'); у11уос1(Ъ); геасПп; епй. Экранный снимок выполнения кода программы в редакторе Разса!: I I та|пра5 ► Рип Ц 0 РеЬид Г Ьапдиаде Разса! 61 62 <1[1]:-с[п 1 1]; {после работы данной функции в массив д будет записан массив с в обратном порядке} 63 Ьее1п {начало главной программы} 64' {Вызываем функцию ууод, которая сгенерирует массив а} 65 66 67 68 69 70 76 учой(а); {в результате массив а должен заполниться случайными числами} {Выводим сгенерированный массив на экран с помощью процедуры иииод} ыг1'ке1п( 'Исходный массив' ), уиуой(а); {С помощью функции питЬег определяем и записываем в переменную к номер первого по к: питЬег(а); {Находим сумму элементов одномерного массива, расположенных после первого поля 5ит_е1ет. чиита(а,к,п) ; {Выводим полученное значение на экран} нг11е1п('Сумма элементов = зив_е1еа:8:2); {Меняем порядок элементов массива а на обратный. Результат по'*™’ | —— рог*1айок(а, Ь) 77 • {Выводим новый массив на экран с помощью процедуры иииоЛ 78 79 ыг*11:е1п( ' Преобразованный массив' ), уиуой(Ь) геаЛп о Л Исходный массив 5.00 -30.00 53.00 -35.00 27.00 -21.00 18.00 11.00 8.00 -52.00 Сумма элементов = -16.00 . Преобразованный массив -52.00 8.00 11.00 18.00 -21.00 27.00 -35.00 53.00 -30.00 5.00 I
Выводы. Поскольку результаты выполнения разработанной программы совпали с результатами расчетов вручную, можно говорить о том, что программа составлена верно. Контрольные вопросы 1. В чем основные отличия подпрограммы-процедуры от подпрограммы- функции? 2. Напишите синтаксис описания процедуры в разделе уаг. 3. По каким правилам формируются имена процедур? 4. Как можно вызвать процедуру в основной программе? 5. Может ли процедура не содержать параметры? 6. Какие типы параметров процедур Вы знаете?
Тема 6. ОБРАБОТКА СТРОК В памяти компьютера могут храниться числа и символы. Каждый символ занимает один байт памяти. Для данного, соответствующего одиночному сим- волу, используется описатель сЬаг. Символы могут объединяться в массивы. Каждому элементу массива, как и для числовых данных, соответствует поряд- ковый номер, а имя элемента состоит из имени всего массива и его номера. В тексте программы не всегда можно определить, какой массив обрабатывается: числовой или символьный, это можно понять только по описанию массива. Значение символьного данного - любой символ клавиатуры компьютера, огра- ниченный апострофами. Например: ‘А’ , ‘?’ , ‘5’ - значения символьных вели- чин. Примеры описаний: уаг а: аггау [ 1.. 50 ] (,Г скат; х,у : скат; Массив а может состоять из 50 символов, ему отводится при трансляции программы 50 байтов памяти. Элементы массива: а[1], а[2], ..., а[50]. Перемен- ные х и у - простые, их значения - одиночные символы. Для ввода символьного массива необходимо использовать цикл: Гог 1:= 1 Го п йо геай( а[ 1 ]); При вводе такого массива можно набрать строку из п символов и в конце нажать ЕпГег. Можно объявить в описании таблицу символов и для ее ввода использо- вать двойной цикл: соп$Г п 10; т = 15; уаг Ь аггау [ 1..п, 1:т ] оГ ейаг; 1, у тГецег; Ье§т Гог 1 := 1 Го п йо Ье^п Гог ] ~ 1 (о тйо геай ( Ь [ у ]); лупГеГп епй; епй. В примере используется Ь - таблица из 10 строк по 15 символов каждая. При ее вводе необходимо набирать строки по 15 символов и нажимать ЕпГег. Неудобство такого ввода заключается в том, что все строки должны быть по
15 символов, т. е. если набираются слова, то они не должны быть более чем из 15 букв, а для коротких слов надо добавлять пробелы. При обработке символьных массивов используются такие же алгоритмы, как и для числовых. Например, требуется слово, заданное как массив символов, записать в обратном порядке, т. е. справа налево. При разработке алгоритма можно использовать такую постановку задачи: данный числовой массив пере- писать так, чтобы последний элемент встал на первое место, предпоследний на второе и т. д., а первый - на последнее. Т. е. необходимо из массива я/, ..., ап получить а„, а,,.], ... ,а], который будет находиться в массиве Ъ. Формула пересчета индекса: п - г + 1 когда у массива а номера перечис- ляются в прямом порядке, т. е. текущий индекс элемента массива изменяется от 1 до н, то у элементов массива Ь индексы должны меняться от л до 1. Такое из- менение и обеспечивает данная формула, она приведена для индексов массива Ь. Программа Е29 производит перемещение элементов в обратном порядке, для символьных данных она называется программой обращения слова: рго^гат Е29; соп$| п — 15; уаг а,Ь : аггау [ 1.. п ] оГсЬаг; 1 : тГе^ег; Ье^т Гог .:= 1 го п йо Ье^ш геай ( а [Д ]); Ь [ п -1 + 1 ] := а [ 1 ] епй; Гог 1 1 Го п йо гупГе (Ь [; ]) епй. Несколько подряд записанных символов образуют строку. Строка - это ограниченная апострофами последовательность любых символов. Длина строки, обрабатываемой в Паскале, не должна превышать 255 сим- волов (апострофы не считаются). Это связано с тем, что в конце строки, в до- полнительном байте, хранится ее длина - количество символов, а наибольшее целое число, которое может быть записано в байте - 255. Если требуется обра- ботать текст, длина которого большее 255 знаков, то надо использовать массив строк. Описание строки имеет вид: уаг х: «Гпп§ [ 20 ]; Строка х должна быть не более чем из 20 символов, если она меньше, то будет занимать в памяти столько байтов, сколько знаков она содержит
(плюс 1 байт - длина). Поэтому при вводе строк нет необходимости дополнять их до указанной в описании длины. Для обработки строк используются специальные операции и собранные в специальную библиотеку подпрограммы. Операции позволяют работать со строками, как с цельными объектами, а подпрограммы, в основном, - с отдель- ными символами или частями строк. Операции над строками - это объедине- ние, сравнение и присваивание. Объединение строк. Эта операция позволяет объединить две строки в одну, присоединив начало второй строки к концу первой. Объединение обозна- чается знаком «+». Например: уаг х, у, х : [ 10 ]; Ье^т: х := ‘тепло’; у := ‘ ход‘; х := х + у; тупГе (х) епй. Переменным х и у присваиваются значения строк, а переменной х - ре- зультат объединения этих строк в одну: «теплоход». При печати строки будет выдано содержимое области памяти, называемой х, Очевидно, что операция объединения строк некоммутативна, т. е. для нее а + Ь <>Ь-1 а поэтому при использовании объединения необходимо предусматривать, с какой стороны к данной строке присоединяется другая: слева или справа. Как и для арифметических операций, для данной операции со строками существует нейтральный элемент, не влияющий на ее результат. Это - строка нулевой длины (пустая строка), обозначаемая двумя рядом стоящими апостро- фами ( ” ). Такую строку можно присоединить к любой строке слева или справа и строка не изменится. Сравнение строк. Для строк используются такие же операции отноше- ния, как и для чисел, но они имеют несколько другой смысл. Если строки срав- нивать на «равно» ( =) , то выполнение равенства означает посимвольное сов- падение строк. Соответственно «не равно» ( <>) означает несовпадение хотя бы в одном знаке. Остальные отношения ( < , <=, >=, >) относятся к длинам строк, т. е. сравниваются не символы строк, а их количества. Если записать: ‘а’ < ‘Ь’ + ‘с’ то сначала выполняется объединение строк (эта операция имеет более высокий приоритет), а затем сравнение длин. В данном случае условие выполняется, т. к. строка из одного символа меньше (по длине), чем строка из двух символов.
Присваивание. Оператор присваивания для строковых данных имеет вид: имя_строковой-Переменной := строковое выражение; Имя строковой переменной может быть простое или с индексом (элемен- том массива строк). Если в результате выполнения всех операций строкового выражения получается строка, длина которой превышает длину в описании пе- ременной, стоящей слева от знака присваивания, то полученная строка укора- чивается справа до допустимой длины. уаг х : Нгнщ [ 6 ]; Ье^т х : = ‘мим’ + ‘озабоченный’; тугйе (х) епй. В результате работы этой программы будет напечатано слово «мимоза», т. к. допустимая длина х - 6 символов, то значение выражения справа от при- сваивания «мимозабоченный» сократится до «мимоза», остальные символы бу- дут отброшены. Длина строки. Функция длины строки выдает количество символов строки: 1епр1й (строковое_выражение) Например: рго^гаш ЕЗО; уаг х, у: Нпгщ [ 20 ]; к, 1, п : пйе^ег; Ье§ш у*тйе1п (‘ введите две строки’); геасПп (х); геасПп (у); к := 1еп@гЬ ( х ); 1 := 1еп@1Ь (у ); п := 1еп§тЬ ( х + у ); ТУгМе1п (‘ длина первой строки1 : 25, 1 длина второй строки1 : 25); \угйе1п (к : 25,1: 25); \угйе1п ( х + у, 1 длина строки 1, п ) епй. В программе ЕЗО используется вывод с форматированием результата. Первый раз формат ( : 25) указан после строки, выводимой на экран ( 1 длина первой строки’ ). Это означает, что для данной строки отводится 25 позиций экрана, т. к. выводимый текст короче (20 символов), то он дополнится вначале пробелами, т. е. будет правоустановленным в отведенном ему поле. Аналогич- но расположатся в отводимом для них месте экрана целые числа - длины строк. Таким образом, результат работы программы может иметь вид:
длина первой строки длина второй строки 7 10 С помощью форматирования можно располагать выводимые данные в столбцах, строить на экране дисплея таблицы. Копирование строки или ее части. Функция копирования называется также «вырезкой». Она позволяет скопировать одну область памяти в другую. Для копирования необходимо указать строковое выражение, из значения кото- рого выделяется часть, а также начальный номер символа и количество симво- лов копируемой части: сору (строковое выражение, начальный номер символа, количество символов) Например, результатом работы функции сору (‘информатика1 , 3, 5) будет слово ‘форма1. Применим данную функцию для разработки второй версии программы обращения слова. Будем обрабатывать слово, выделяя из него буквы и присо- единяя к результату слева. Переменной у, содержащей результат, сначала при- сваивается значение пустой строки. Переменная цикла изменяет свои значения от 1 (первого символа слова) до длины вводимой строки (номера последнего символа слова). рго^гат Е 31; уаг х, у: Нптщ [10 ]; 1 : тГе^ет; Ье§т тугйе ( ‘введите слово ‘); геасПп ( х ); у ; { присваивание результату начального значения - пустого сло- ва } Гог 1 := 1 Го 1еп§гЬ ( х ) До у := сору ( х, 1, 1 ) + у; { присоединение копируемой буквы слева } \упГе!п; \\тйе ( у) епй. Поиск подстроки з строке. Функция поиска определяет, с какой пози- ции (номера символа) одна строка (подстрока) содержится в другой (данной строке). Если такое вхождение подстроки в строку имеет место, то результат работы функции - номер символа в исходной строке, с которого начинается
подстрока. Если вхождения нет, то результат - ноль. Аргументы функции могут быть строковыми выражениями. роя ( подстрока, исходная строка ) Вст авка з строку. В одну строку можно вставить другую строку, указав номер символа, начиная с которого осуществляется вставка. Входные данные процедуры - вставляемая строка, исходная строка и целочисленное выражение, задающее позицию вставки. Строки также могут быть заданы строковыми вы- ражениями. Результат работы процедуры помещается в исходную строку, стро- ка при этом «расширяется». Если длина вставки совместно с длиной исходной строки превышает допустимую длину исходной строки, то вставка укорачива- ется справа до допустимой длины. тяег( (вставляемая строка, исходная строка, целочисленное выражение); Удаление части строки. Часть строки можно удалить, строка при этом «сжимается». Для удаления необходимо указать строку ( в виде строкового вы- ражения), начальный номер удаляемой части строки, количество удаляемых символов. Процедура удаления вызывается следующим образом: йе1е1е (строка, начальный номер, количество символов); Рассмотрим пример замены буквы в слове. Сделаем из слова «форма» слово «фирма». рго^гаш Е32; уаг х : [10]; Ье§ш х := ‘форма’; швеН (‘и’, х, 2); { вставка буквы “и”, получилось слово “фиорма”} с1е1е1е (х , 3,1); { удаление третьей буквы - буквы “о” } \уп1е (х) епй. Пример программы пословного перевода с английского языка. Пусть требуется построить программу-переводчик, которая бы, не учитывая правил грамматики, просто переводила каждое слово вводимого предложения. По- скольку программа демонстрационная, словари небольшие, содержат по 10 слов. Однако, в случае расширения словарей, программу можно использо- вать и для реального пословного перевода. Идея выделения слов из вводимого предложения основана на том, что слова разделяются, как обычно, пробелами, и вырезается слово между двумя пробелами. Далее, при обращении к словарю ищется совпадение выделенного слова со словами словаря. При нахождении
такого совпадения из словаря переводов печатается слово с таким же индексом элемента, как и в исходном словаре английских слов. Такая идея поиска может быть использована и в других таблицах, когда, например, по названию химиче- ского элемента ищется его масса. Рассмотрим этапы выполнения программы на примере перевода предло- жения «I Ике а са(». Для выделения слов из предложения будем использовать два указателя. Первый из них - переменная т, ее значение всегда 1, т. к. она показывает на первый символ вырезаемого (копируемого) из предложения сло- ва. Второй указатель - значение переменной к - всегда показывает на позицию пробела за выделяемым словом, являясь его номером. Для первого слова пред- ложения первое значение переменной к - это 2. Функция поиска подстроки в строке работает таким образом, что поиск вхождения всегда осуществляется с первой позиции исходной строки. Поэтому, если мы не будем изменять исход- ную строку, то будем всегда находить первый пробел. Поэтому после каждого выделения слова из строки строку необходимо «усекать», оставляя только необработанную часть строки. Такое «усечение» производит оператор: а := сору ( а, к, п - к + 1); где п - к + 1 длина оставшейся после выделения очередного слова части строки. Так, после выделения первого слова из предложения (слова «I» ), которое будет присвоено переменной х, строка а примет вид «Ике а са1». При поиске в словаре английских слов (массив е) значение переменной х сравнивается с каждым сло- вом словаря. Если произошло совпадение, то печатается слово из словаря рус- ских слов (массив г) с таким же порядковым номером, как в английском слова- ре. Если весь словарь просмотрен, но слово не найдено, то печатается сообще- ние «слова в словаре нет». Программа обрабатывает определенный и неопреде- ленный артикли, они в словаре не ищутся, происходит переход к обработке следующего слова предложения. Программа имеет вид: рго^гат ЕЗЗ; 1аЬе1 1,2, 3; сопИ р = 10; {количество слов в каждом словаре} уаг е, г : аггау [ 1..р ] о? вГгнщ [10 ]; х : 81п1щ [ 10 ]; 1, к, т, п : т!е§ег; а, Ь: $1пп§[ 255 ]; Ье^ш { формирование словарей } ууп1е1п ( ‘ введите ‘ , р, ‘ слов английских ‘; Гог 1 := 1 1о р йо геай1п ( е [ 1 ] X туп1е1п (‘введите русские слова •); Гог 1 := 1 1о р йо геасПп ( г [ 1 ] ); { ввод и выделение слов из предложения }
уугйе1п (‘ введите предложение ‘); геасПп (Ь ); Ь := а; { сохранение исходного предложения } т := 1; п := 1еп§1Ь ( а ) ; { п - длина предложения} 1 : к := роз (‘ а ); { поиск пробела } Ик = 0 ГЬеп к := п + 1; {выставление пробела после последнего слова} х := сору ( а, т, к - т ); { вырезка слова длиной к - т } И ( х = ‘а’) ог ( х = ‘ГЬе’) гЬеп §оГо 3; { обработка артиклей } { поиск слова в словаре } Гог 1 := ] Го р йо И е [ 1 ] = х ГЬеп ^оГо 2; \упГе1п; уупГеГп (‘ слова в словаре нет’); ^оГо 3; 2 : уупГеГп ( г [ 1 ] ) ; { выдача слова из русского словаря } 3 : к := к + 1; { переход к следующему слову в предложении } а := сору ( а, к, п - к + 1); И а <> ‘ ‘ ГЬеп ^оГо 1; епй. Вопросы и задания 1. Чем отличается символьный тип данных от строковых? 2. Используя символьный массив, определите, сколько слов в данном тек- сте. 3. Используя символьный массив, посчитайте, сколько букв «а» в данном слове. 4. Используя средства обработки строк, исправьте слово «вылысыпыдыс- ты». 5. Используя идею программы обращения слова Е31, удвойте каждую букву в данном слове. 6. Используя программу обращения слова Е31, определите, является ли данное слово палиндромом («перевертышем», например, «казак», «потоп», «кок» и т. д.). 7. Дана строка с несколькими запятыми. Получить слово между первой и второй запятыми. Решить задачу с применением массива символов и строки символов.
Лабораторное задание 14. Символьный тип данных Цель - получение практических навыков обработки массивов символов (тип данных сйаг). Задание. Необходимо в редакторе Разса! написать программу с примене- нием соответствующих инструментов обработки символов. Выполнить про- грамму и проанализировать результаты ее работы. Варианты заданий Вариант № Задание 1. Дан массив символов, образующий несколько слов. Вывести на экран все слова, начинающиеся на определенную букву 2. Дан массив символов, образующий несколько слов. Найти в нем симметричное слово (палиндром) максимальной длины 3. Дан массив символов, образующий несколько слов. Провести в нем реверс слова максимальной длины (записать символы слова в обратном порядке) 4. Дан массив символов, образующий несколько слов. Удалить из каждого слова все последующие вхождения его первой буквы 5. Дан массив символов, образующий несколько слов. Удалить из него слова длиной менее 4 букв 6. Дан массив символов, образующий несколько слов. Удалить из него все слова максимальной длины 7. Дан массив символов, образующий несколько слов. Провести в нем реверс всех слов (записать все слова в обратном порядке) 8. Дан массив символов, образующий несколько слов. Подсчитать в нем количество букв ‘а’. Если такой буквы в массиве нет, - вывести на экран соответствующее сообщение 9. Дан массив символов, образующий несколько слов. Вывести на экран слово с максимальным количеством гласных букв 10. Дан массив символов, образующий несколько слов. Отсортировать в нем слова по возрастанию длин слов 2 Составлено с использованием материалов: Андрианова А. А. Алгоритмизация и программирование. Практикум: учебное пособие / А. А. Андрианова, Л. Н. Исмагилов, Т. М. Мухтарова. - СПб.: Издательство «Лань», 2019. - 240 с. - Режим доступа: по подписке. - 1зНря;//е.1апЪоок.сот/Ъоок/113933'.’са1есогу—1540.
Вариант № Задание 11. Дан массив символов, образующий несколько слов. Вывести на экран слово с минимальным количеством согласных букв 12. Дан массив символов, образующий несколько слов. Вывести на экран все слова, начинающиеся на гласную букву 13. Дан массив символов, образующий несколько слов. Найти в нем симметричное слово (палиндром) минимальной длины 14. Дан массив символов, образующий несколько слов. Записать все слова с прописной буквы 15. Дан массив символов, образующий несколько слов. Удалить в нем все лишние пробелы (между словами должно быть только по одному пробелу) 16. Дан массив символов, образующий несколько слов. Вывести на экран количество слов Методические указания по выполнению лабораторной работы В программе должен быть определен одномерный массив символов раз- мерности 20 < и < 50. Размерность массива задается константой. Выполняя задания лабораторной работы следует помнить, что: - символьные данные могут быть объявлены как переменные, либо как константы; - значениями переменной (либо константы) типа сйат могут являться все символы, которые высвечиваются на экране дисплея; - переменная типа скат может принимать значение лишь одного символа, которое можно присвоить ей с помощью оператора ввода или же с помо- щью оператора присваивания; - в операторе присваивания присваиваемый символ необходимо заключить в апострофы, например: х:=’в’; - каждому символу соответствует определенный код - целое число в диа- пазоне от 0 до 255 (код А8СП, англ., Ашепсап 5>1апс1агс1 Соде Гог ГпГог- тайоп 1ШегсЬап§е, - американский стандартный код для обмена инфор- мацией). К данным типа скат применимы следующие встроенные функции: о гй(х) - преобразовывает символ в его числовой код согласно А8СП (тип аргумента - символьный; тип результата - положительное число в диапазоне от 0 до 255); р гей(х) - возвращает предшествующий символ относительно х согласно А8СП (тип аргумента - символьный; тип результата - символьный); 8 11сс(х) - возвращает следующий по порядку символ относительно х со- гласно А8СИ (тип аргумента - символьный; тип результата - символьный);
скг(х) - преобразует выражение типа ЪуГе в символ и возвращает этот символ в качестве своего значения согласно Л8СП (тип аргумента - Ьу(е; тип результата - скат), В Разса! можно объявлять переменную цикла со счетчиком типа скат. В качестве примера приведем код программы, которая выводит на экран буквы латинского алфавита через пробел одной строкой: рго^гат а х; уаг 1. скат; Ье§!п Гог п= ‘а’ Го ‘г’ Ло м'гйеЦ, ‘ ’); геаЛ1п; епЛ. Если в программе записан оператор ввода с клавиатуры геаЛ, предусмат- ривающий ввод нескольких переменных типа скат, то, вводя данные, можно ввести символы слитно и в конце нажать клавишу ЕпГег. В результате каждый символ будет помещен в свою ячейку памяти. Например: геай(х,у,х); Если в процессе ввода данных пользователь нажал на клавиатуре без про- бела три клавиши ‘аЬс’, то в переменной х будет храниться значение ‘а’, в пе- ременной у - значение ‘Ь’, а в переменной г - значение ‘с’. Если, например, в операторе, предусматривающем ввод символов, запи- сано: геаЛ(х), и пользователь нажал на клавиатуре последовательно две клави- ши ‘аЬ’, то тогда в переменную х будет записана первая буква - ‘а’. При написании кода протраммы следует (по возможности) представлять его в наиболее компактном виде и не использовать избыточное количество пе- ременных. Код программы необходимо сопровождать краткими поясняющими комментариями. В отчет необходимо включить экранный снимок выполнения программы в редакторе Разса!. Пример оформления отчета по лабораторной работе Вариант № 16 Цель - получение практических навыков обработки массивов символов (тип данных сЬаг). Задание. Необходимо в редакторе Разса! написать программу с применением соответствующих инструментов обработки символов: дан массив символов, образу- ющий несколько слов; вывести на экран количество слов.
Выполнить программу и проанализировать результаты ее работы. Решение. Код программы: рго§гат 1аЬ 14; {Лабораторная работа 14 обучающегося группы БИ-б-о-201 Петрова П.П.} соп>>( п=30; {максимальнаяразмерность массива} уаг а: аггау[1 .п] оГ с1гаг; {объявление одномерного символьного массива} ко1: гпГе§ег; {переменная для нахождения количества введенных слов} к: тГе§ег; {вспомогательная переменная для хранения количества введенных симво- лов} г: 1п(е«ег: {счетчик цикла) Ье§гп {Ввод с клавиатуры длины исходной строки} \угке!п('Укажите суммарную длину вводимой строки, включая пробелы. Строка не должна превышать', п , 'символов.'); к~0; гереаГ {Вводим ограничение на вводимое значение к} геаЛп(к) ипШ (к>1) апй (к<30); \угйе1п('Ввсдите строку и в конце нажмите клавишу Еп!ег. Максимальная длина введенной строки', к , 'символов, включая пробелы.'); {Ввод исходной строки} Гог е=1 Го к с1о геай(а[г]); {Первоначально предполагаем, что пользователь не ввел ни одного слова} ко1:=0; (Вывод на экран введенной строки) уугке1п('Исходная строка:'); Гог е=1 (о к <1о уугке(а[г]); зугкеЫ; {Подсчет количества слов в строке) Гог г:=1 (о к йо к ((а[г]='') апс! (а[1-1]<>'') апй (1<>Г)) ог ((а[г]<>'') апй (1=к)) Гкеп ко1:=ко1+1; {Вывод результата работы программы) \угке1|1('Количсство слов равно', коГ); геасПп: епй.
Экранный снимок выполнения кода программы в редакторе Разса!: Укажите суммарную длину вводимой строки, включая пробелы. Строка не должна превьжпатьЗОсимволов. 15 Введите строку и в конце нажмите клавишу ЕггЬег. Максимальная длина введенной строки15символов, включая пробелы. Наче а доос! ба у ।Исходная строка: Наче а дооб бау Количество слов равно 4 Выводы. Поскольку результаты выполнения разработанной программы совпали с результатами расчетов вручную, можно говорить о том, что программа составлена верно. Контрольные вопросы 1. Для чего служит тип данных скат? 2. Какие данные может содержать переменная типа скат? 3. Как присвоить переменной типа скат определенное значение с клавиату- ры? 4. Как задать переменной типа скат определенное значение в операторе присваивания? 5. Какие встроенные функции можно применить для обработки символьных переменных? 6. Как можно преобразовать выражение типа ку(е в символ? 7. Что такое код А8СП?
Лабораторное задание 15. Обработка строк Цель - получение практических навыков обработки строк (тип данных Задание. Необходимо в редакторе Разса! написать программу с примене- нием соответствующих процедур и функций обработки строк. Выполнить про- грамму и проанализировать результаты ее работы. Варианты заданий' Вариант № Задание 1. Определить количество слов во введенной с клавиатуры строке 2. Дана строка на английском языке. Определить, сколько в ней букв а, о, е, 1 3. Дана строка, состоящая из нескольких слов. Определить длину самого короткого и самого длинного слова в данной строке 4. Дана строка символов, среди которых присутствует двоеточие (;). Подсчитать количество символов, которые ему предшествуют 5. Дана строка. Заменить в ней все точки (.) на двоеточие (:) 6. Дана строка. Определить, сколько раз входит в нее сочетание букв аЬс 7. Дана строка символов, среди которых есть одна открывающаяся и одна закрывающаяся скобка. Вывести на экран все символы, находящиеся внутри данных скобок 8. Дана строка. Вывести на экран те слова, которые содержат хотя бы одну букву а 9. В строке между словами вставить вместо пробела запятую и пробел 10. Подсчитать, сколько раз во введенной с клавиатуры строке встречается определенное слово 11. Строка содержит одно слово. Проверить, является ли оно палиндромом (читается ли оно одинаково слева направо и справа налево) 12. Во введенной с клавиатуры строке слова зашифрованы (записаны наоборот). Необходимо расшифровать сообщение 3 Составлено с использованием материалов: Комарова Е.С. Практикум по программированию на языке Паскаль / Е.С. Комарова. - Москва ; Берлин : Директ-Медиа, 2015. - Ч. 2. - 123 с. - Режим доступа: по подписке. - 1Л<[_: 1гйр://ЫЫ1ос1иЪ.ги/1пс1ех.р11р?ра$е=Ьоок&1с1=426943.
Вариант № Задание 13. Необходимо проверить, одинаковое ли число открывающихся и закрывающихся скобок содержится во введенной с клавиатуры строке 14. Введенная с клавиатуры строка содержит текст на русском языке. Определить, какие буквы в нем преобладают - гласные или согласные 15. Необходимо во введенной с клавиатуры строке удалить часть текста, расположенного внутри круглых скобок (вместе со скобками) 16. Нужно в строке, введенной с клавиатуры, сделать вставки, - после сочетания букв необходимо вставить точку, если ее там нет Методические указания по выполнению лабораторной работы Программа должна предусматривать ввод исходной строки с клавиатуры. Нежелательно вводить исходную строку с применением оператора присваива- ния. Выполняя задания лабораторной работы следует помнить, что: - переменная типа 51г1п« может содержать до 255 символов; - в разделе объявления переменных уаг длину строки можно задавать явно в квадратных скобках после служебного слова Нгпщ, например: уаг з: »кш§[35]; - к определенному символу в строке можно обратиться, указав в квадрат- ных скобках рядом с именем соответствующей строковой переменной индекс символа в строке, например: з[7]; - если фактическая длина строки занимает к символов, то элементы данной строки имеют номера от 1 до к включительно; - если в процессе объединения строк длина результирующей строки пре- высит 255 символов, то лишние символы будут от брошены; - можно присваивать друг другу значения строк разного размера, но в про- цессе присваивания размеры строк нс контролируются и лишние символы будут отброшены. В ходе выполнения лабораторной работы могут понадобиться встроенные процедуры и функции обработки строк (сору, с!е1е(е, т&еН, роз, кп^гй и др.). Применяя встроенные процедуры и функции следует внимательно задавать их аргументы. Если в процедуре йекк в качестве номера позиции первого удаляемого символа указано число, которое превышает длину строки, то из исходной стро- ки символы удалены не будут.
Вставка в начало или конец строки подстроки с помощью процедуры шьеН равнозначна операции сложения (слияния) строк. Для объединения нескольких строк удобно применять функцию соп- са!(8(г1, 8(г2, 80'3,...). Итогом работы данной функции будет строка, представ- ляющая собой объединение строк, заданных в качестве параметров функции. При написании кода программы следует (по возможности) представлять его в наиболее компактном виде и не использовать избыточное количество пе- ременных. Код программы необходимо сопровождать краткими поясняющими комментариями. В отчет необходимо включить экранный снимок выполнения программы в редакторе Разса!. Пример оформления отчета по лабораторной работе Вариант №16 Цель - получение практических навыков обработки строк (тип данных &(г1п§). Задание. Необходимо в редакторе Разса! написать программу с применением соответствующих процедур и функций обработки строк: нужно в строке, введенной с клавиатуры, сделать вставки, - после сочетания букв необходимо вставить точку, если ее там нет. Выполнить программу и проанализировать результаты ее работы. Решение. Код программы: рго§гаш 1аЬ 15; {Лабораторная работа 15 обучающегося группы БИ-б-о-201 Петрова П.П.} уаг 8: 8(Г1П«: {исходная строка} 1,1: 1п1с§сг; {вспомогательные переменные для хранения индексов} х,у,х: сЬаг: {вспомогательные переменные для хранения значений трех расположен- ных рядом символов исходной строки} Ье§111 \угйе1п('Ввсдитс строку'); геас11п(8); {ввод с клавиатуры исходной строки} {Определяем длину введенной пользователем строки и записываем ее в 1} 1:=1еп§Н1(8); г=1; ууНИе 1<(1-1) с!о {задаем условие выхода из цикла) Ье§т х:=8[1]; у:=8[1+1]; х:=8[1+2]; {Проверяем, есть ли сочетание символов кр без точки в конце: если есть, то добавляем точку} Н‘ (х='к') апй (у=*8‘) апс! (го1.*) (Кен Ье§ш
ш8ег1('.',8,1+2); 1:=1+1; {поскольку была добавлена точка, длина строки увеличилась на 1 символ, и это нужно учесть в переменной 1} 1:=1+3; {корректируем значение индекса 1 для осуществления пере- хода к следующей группе символов} епй {перед е1хе в операторе 1Р точку с запятой ставить нельзя} еке 1:=1+1; {корректируем значение индекса I для осуществления перехода к следующей группе символов} епй; {Проверяем два последних символа в строке. Если они равны ку, то после них до- бавляем точку} И(8[1-1]='к') апй С8[1]='ё') гйеп ш^егЦ' .',5,1+ Г); \\тйе1п('1Преобразованная строка:*); уугке(8); {выводи.^ преобразованную строку на экран} геай1п; епй. Экранный снимок выполнения кода программы в редакторе Ра8са1: ► Кип 0РеЬид| 51ор | © ЗЬаге г М 8ауе тат рак 10 геа<11п(5)Г-{ ббоЗ с клавиатуры исходной стро I 11 1:-1епдЫ1(5); {определяем длину введенной — 12 1 1 1<(1 1) с1о {задаем условие вы> I 14 г-л 15 х: з[1] 16 у:=5[1 1]; I 17 2-5[1 2]; I 18 {Проверяем, есть ли сочетание символов "т 19 16 (х-'к') Аид (у'§) Апс! (х<>'.') +1 I 20 1-С 21 1П5егб(5,1+2) I 22 1:-1 1; {поскольку была добавлена точка, дял I1 23 1:-1+3; {корректируем значение индекса г д. 24 {перед е1зе точку с запятой ставить нел 25 -Нее 26 {корректируем значение индекса г 3— 27 епд; 28 {Проверяем два последних символа в строке. " 29 16 (5[11] к’) Апб (б[1] '§') бЬеп 30 1п5егб(,5,1+1) 31 иг11е1п('Преобразованная строка;') 32 иг16е(5) 33 геасПп 34 I 35 Введите строку кд. аЪскдхуг кд1пт кд Преобразованная строка: кд. аЬскд.хуг кд.1шп кд.
Выводы. Поскольку результаты выполнения разработанной программы совпали с результатами расчетов вручную, можно говорить о том, что программа составлена верно. Контрольные вопросы 1. Дате определение понятию «строка» с точки зрения программирования. 2. Какова максимальная длина обрабатываемой строки? 3. Напишите синтаксис описания строки в разделе уаг, в том числе в ситуа- ции явного задания размера строки. 4. Как можно обратиться к определенному символу в строке? 5. Что Вы знаете об операции объединения строк? 6. Что произойдет, если в процессе объединения строк длина результирую- щей строки превысит 255 символов? 7. Как осуществляется сравнение строк? 8. Расскажите об особенностях применения оператора присваивания к дан- ным строкового типа. 9. Как можно определить длину строки? 10. Напишите синтаксис функции копирования строки или ее части и опи- шите, как она работает. 11. С помощью какой функции можно найти определенную подстроку в строке? Напишите ее синтаксис. 12. Как осуществить вставку в строку? 13. Как можно удалить часть строки? Что происходит с длиной строки после удаления части строки? 14. Как легко объединить несколько строк? Напишите синтаксис соответ- ствующей функции и поясните, как она работает. 15. Что произойдет, если в процедуре ск1с(е в качестве номера позиции пер- вого удаляемого символа указано число, которое превышает длину стро- ки?
Тема 7. ЗАПИСИ Ранее запись была определена как последовательность байтов на носите- ле, ограниченная с двух сторон специальными признаками. Такое определение дает представление о записи как о единице обмена между внешней и оператив- ной памятью компьютера. Однако сама запись может быть сложной структу- рой, содержащей разные данные. Запись может, например, соответствовать строке ведомости заработной платы, в которой указаны фамилия и несколько чисел, или строке классного журнала, где также содержатся фамилия и оценки. Таким образом, запись понимается как сложная конструкция. Поэтому в Паска- ле и других программных системах слово «запись» имеет двойной смысл: это и сложная структура, и единица данных на носителе (например, диске). Запись - это совокупность разнородных данных, описываемых и обра- батываемых как единое целое. Данные, из которых состоит запись, называются ее полями. Поля могут быть простыми данными или составными, например, массивами или записями. С помощью записей удобно описывать свойства объектов, хранить их совместно. Из записей состоят базы данных, включающие описание нескольких объектов. Описание записи состоит из ключевого слова гесогй, после которого ука- зываются имена нолей и тип каждого поля. Тип поля отделяется от имени двое- точием. Описание записи заканчивается словом епй и точкой с запятой. Записи описываются в разделе типов данных 1уре. В этом разделе указывается имя класса объектов (имя типа) и описание этого класса. Для каждого объекта клас- са имеется свое имя в разделе переменных уаг с описанием данного типа. Это имя используется в дальнейшем в программе. Пример 1. Объект - физическое тело с измерениями а,Ъ,с- длина, шири- на и высота. Описание может иметь вид а), когда для каждого поля указан тип данного, или б), когда подряд идущие однотипные поля описаны совместно: а) 1уре х = гесогй а: т^е^ег; Ь : т!е§ег; с : пйе^ег епй; б) 1уре х = гесогй а, Ь, с: пйе§ег епй; уаг х: х; уаг х : х; Пример 2. Объект - товар, характеризуется названием и ценой: (уре (оуаг = гесогй м§п : [ 20]; рпсе : геа! епй;
Пример 3. Объект - дата рождения: день, месяц, год. День можно указать как диапазон значений, такой тип данных называется интервальным. Он уже встречался при описании массивов, в указании границ номеров элементов. Этот тип можно использовать для целочисленных и символьных данных в описани- ях, а также как метку оператора варианта. Интервальным типом можно задавать значения констант в разделе сон\1. гуре дагеоГЫггй — гесогй дау : 1 ..31; тошЬ : ‘йгпщ [10]; усаг : т4е§ег епд; уаг да(е: да1е_о1^ЫНЬ; Записи могут объединяться в массивы. Массив записей может быть опи- сан в разделе 1уре или уаг. Для примера 2 раздел переменных может иметь вид: уаг х: аггау [ 1..100 ] оОоуаг; у: (о\аг; х - массив записей, к каждому его элементу используется обычное обращение, например, х[ 1 ]; у - простая переменная. Для обращения к полю записи используется сложное имя, состоящее из двух имен, разделенных точкой. Первое из этих имен - имя переменной типа запись из раздела уаг, второе - имя поля этой записи из раздела (уре. Так, для товаров имена полей в программе имеют вид: у . ь:§п , у . рпсе, х [ 1 ]. 81§п, х [ 1 ]. рпсе Пример 4. Пусть требуется описать сведения о работнике предприятия: фамилию, должность, дату рождения и зарплату. Для каждого поля записи необходимо сначала придумать имя, затем определить, какой тип наиболее удобен для обработки этих данных. Описываемые сведения включают в виде поля даты рождения структуру типа запись, се также требуется уточнить и опи- сать в разделе типов раньше, чем запись работника. В описании данной записи используется тип «день рождения» (да1е_оГ_ЫпЬ) из примера 3. Общее описание записи имеет вид: 1урс (Ше оГ ЫНЬ = гесогй дау : 1 .. 31; топтЬ : <1гпщ [10]; усат : пйе^ег епй; дуогКег = гесогй пате : [ 20 ];
розйюп ; <>1ппц [ 10 ]; с!а!е : даХеоГЫлЬ; заI агу : геа! епс1; уаг х: аггау [ 1..7] оС'логкег; \у : дуогкег; Поле записи с!а(е содержит запись из трех полей. При формировании имени поля этой внутренней записи необходимо использовать тройное имя: имя переменной раздела уаг, имя поля записи ууогкег и имя поля записи скйеоГЫпЬ. Например, для переменной тм обращение к месяцу рождения ра- ботника в программе будет иметь вид: уу.даГе.топйт В программе ввод и вывод записи производится по полям, но можно при- своить одной записи значение другой, при этом происходит копирование обла- сти памяти: х [ 1 ] := ту; Оператор присоединения. Для обработки записи используется оператор уйгЬ, который позволяет указать один раз имя записи из раздела переменных, а затем, во всей области действия оператора, указывать только имена полей этой записи из раздела (уре. После слова луПЬ можно написать несколько имен полей из раздела переменных. Оператор присоединения имеет вид: и’/тЛ список имен записей Ло оператор; Оператор может быть простым или составным, ограниченным оператор- ными скобками. Список имен записей может состоять из одного имени. Пример 5 Дан массив записей, содержащий сведения о работниках предприятия (пример 4). Напечатать: 1) список бухгалтеров; 2) список работников от 30 до 50 лет; 3) среднюю заработную плату по предприятию. Как и в других задачах, где сказано, что «дано п чисел» или что-либо дру- гое, исходные данные необходимо описать и ввести в компьютер. Для записей этой задачи определяются их структура, имена и типы полей (пример 4). Затем определяется имя массива записей, который используется в программе и вспо- могательные переменные, а также имена результатов.
Программа решения задачи: рго^гат Е34; соп«Г п 10; Гуре йаГеоГЫгтЬ - гесогй йау : 1 ..31; тошЬ : [10]; уеаг : тГе§ег епй; хуогкег = гесогй пате : 8Ггт§ [ 20 ]; розшоп : 8Гпп§ [ 10 ]; йа!е : йаГеоГЫгТЬ; за1агу : геа! епй; уаг х: аггау [ 1..п] оГ луогкег; ху : хуогкег; !,],§; тГе^ег; 8 : геа1; р: вГппк [10 ]; Ье^п { формирование массива записей } Гог 1 := 1 Го п йо XVII11 X [ 1 ] ЙО Ье§1п уупГе1п(‘сведения о 1 ,1, 1 работнике 1 ); хупГе!п (‘ фамилия, инициалы1 ); геай1п (пате); ххпГе1п (‘ должность1); геай1п ( роз|йоп); ххгйе1п (‘ число, месяц (словом) и год рождения1); геай!п (йаГе.йау, йаГе.топГЬ, йаГе.уеаг); ххгйе1п (‘ зарплата1); геай!п (за1агу ); епй: {решение подзадачи 1) - печатание списка бухгалтеров] р := ‘бухгалтер1 ; I := 0; {счетчик строк списка - количество бухгалтеров } Гог 1 := 1 Го п йо хх1ГИ х [ 1 ] йо П р = рО8П1ОП Гйеп Ье§т 1 :=1 + 1; ххгйе1п ( , пате); {после номера в списке печатается точка и имя] епй;
{решение подзадачи 2) список работников от 30 до 50 лет} уупГеГп (' список работников от 30 до 50 лет ‘); 3-0; у»гке (‘ введите текущий год в виде четырехзначного числа’); геасПп ( §); Гог 1 := 1 Го п йо зукЬ х [ 1 ] йо И ( § - йаГе.уеаг < 50) апй ( § - йаГе.уеаг >30) ГЬеп Ье§ш з-з + 1; ууткеГп О ±*. ‘ , пате) епй; { решение подзадачи 3) - вычисление средней зарплаты } 8 :=0; Гог 1 := 1 Го п йо 8 := 8 + х[ 1 ].за1агу; зугке (‘ средняя зарплата = ‘, 8 / п : 10:2) епй. Вопросы и задания 1. Как в информатике понимается существительное «запись»? 2. Как обратиться в программе к полю записи? 3. Что необходимо сделать, чтобы описать в программе объект, характе- ристики которого - разнотипные данные? 4. Каково имя данного, содержащего сведения о том, какого числа родил- ся работник предприятия? 5. Объясните, что означают имена: х [ 2 ].ро8п1оп , х [ 5 фйаге.топгЬ, ху.пате . 6. Для чего используется оператор илУй? 7. Опишите объект «ученик 11 класса», используя запись. 8. Создайте базу данных для своего класса и с ее помощью получите све- дения: а) о самом старшем ученике в классе; б) о самом младшем ученике; в) об оценках для каждого ученика по изучаемым в классе предметам; г) об отличниках; д) о самом отстающем ученике; е) о среднем балле для каждого ученика по оценкам последней четверти; ж) о средней успеваемости класса по всем предметам; з) о тех, кто пропускает уроки чаще, чем раз в неделю. Указания: как сохранить все данные на диске, написано в следующем па- раграфе, а в данной задаче напишите управляющие программы по образцу Е34.
Лабораторное задание 16. Записи Цель - получение практических навыков работы со структурированными типами данных. Задание. Необходимо в редакторе Разса! написать программу, предпола- гающую обработку записей. Выполнить программу и проанализировать резуль- таты ее работы. Варианты заданий Вариант № Задание 1. Дан массив, содержащий информацию о гражданах, обслуживаемых поликлиникой (Ф.И.О., год рождения, адрес проживания, место работы, дата прохождения флюорографии). Необходимо вывести на экран Ф.И.О. лиц, которые прошли флюорографию более 1 года назад 2. Дан массив, содержащий информацию об автомобилях (номер, модель машины, цвет, Ф.И.О. владельца, дата прохождения техосмотра). Вывести на экран номера машин и Ф.И.О. владельцев для тех автомобилей, которые не прошли техосмотр в текущем году 3. Дан массив, содержащий информацию об автомобилях (номер, модель машины, цвет, Ф.И.О. владельца, дата прохождения техосмотра). Вывести на экран Ф.И.О. владельцев автомобилей в алфавитном порядке и соответствующие номера автомобилей 4. Дан массив, содержащий информацию о гражданах, обслуживаемых поликлиникой (Ф.И.О., год рождения, адрес проживания, место работы, дата прохождения флюорографии). Необходимо вывести на экран все сведения о гражданах, родившихся в определенном году 5. Дан массив, содержащий информацию о выставленных на продажу квартирах (количество комнат, общая площадь, площадь зала, площадь кухни, наличие балкона, этаж, стоимость, адрес). Необходимо вывести на экран адреса всех трехкомнатных квартир, стоимость которых не превышает некоторое пороговое значение 6. Дан массив, содержащий информацию о выставленных на продажу квартирах (количество комнат, общая площадь, площадь зала, площадь кухни, наличие балкона, этаж, стоимость, адрес). Необходимо вывести на экран все сведения о квартирах, у которых есть лоджия и которые расположены на втором этаже
Вариант № Задание 7. Дан массив, содержащий информацию о выставленных на продажу квартирах (количество комнат, общая площадь, площадь зала, площадь кухни, наличие балкона, этаж, стоимость, адрес). Необходимо вывести на экран все сведения о квартирах в порядке возрастания их стоимости 8. Дан массив, содержащий информацию о развивающих играх для детей (название игры, стоимость и возрастные границы детей, которым будет интересна данная игра). Необходимо вывести на экран названия развивающих игр, которые подходят детям до возраста М и стоимость которых не превышает порог К 9. Дан массив, содержащий информацию о развивающих играх для детей (название игры, стоимость и возрастные границы детей, которым будет интересна данная игра). Необходимо вывести на экран все сведения о развивающих играх в порядке возрастания их цены, которые подходят детям до К лет 10. Дан массив, содержащий информацию о студентах университета (Ф.И.О., курс, направление подготовки, шифр группы, оценки по 4 экзаменам последней сессии). Необходимо вывести на экран Ф.И.О. и шифры групп лучших студентов университета (учатся на «отлично» и «хорошо» и по сумме полученных баллов не уступают другим студентам университета) 11. Дан массив, содержащий информацию о студентах группы (Ф.И.О., оценки по 4 экзаменам последней сессии). Необходимо вывести на экран название предмета, который был сдан наиболее успешно 12. Дан массив, содержащий информацию о студентах группы (Ф.И.О., оценки по 4 экзаменам последней сессии). Необходимо вывести на экран процент студентов, который сдал все экзамены без троек и с тройками 13. Дан массив, содержащий информацию о студентах университета (Ф.И.О,, пол, направление подготовки, курс). Необходимо вывести на экран название направления подготовки, на котором учится наибольший процент мужчин 14. Дан массив, содержащий информацию о студентах университета 1Ф.И.О., пол, направление подготовки, курс, рост). Необходимо вывести на экран Ф.И.О. всех студентов, чей рост выше среднего по университету (отдельно для мужчин и женщин)
Вариант № Задание 15. Дан массив, содержащий информацию о студентах группы (Ф.И.О., оценки по 4 экзаменам последней сессии). Необходимо вывести на экран сведения о среднем балле каждого студента (Ф.И.О. - средний балл) 16. Дан массив, содержащий информацию о студентах группы (Ф.И.О., оценки по 4 экзаменам последней сессии). Необходимо вывести на экран Ф.И.О. студентов в порядке их успеваемости (успеваемость определяется суммой баллов по всем экзаменам) Методические указания по выполнению лабораторной работы Размерность массива (параметр п) должна задаваться константой. Для удобства проверки работы программы размерность массива рекомендуется за- давать небольшой (3 < п <7). Работая над заданием лабораторной, необходимо помнить, что записи описываются в разделе Гуре. И далее в разделе описания переменных уаг со- здаются так называемые «экземпляры записи» (записи-переменные), которые уже можно обрабатывать в теле программы. Поля экземпляров записей должны заполняться с клавиатуры. Данные действия удобно компактно записать с помощью оператора присоединения и цикла РОК: Гог 1:=1 Го п йо луйй <имя_записи> йо Ье^ш геай1п(<имя_ноля_ 1 >); геай!п((<имя_поля_2>); геай1п((<имя_поля_к>); епй; Имена переменных-записей и полей, которые указаны в заголовке опера- тора \\ТГН, можно не указывать при обращении к компонентам записей в обла- сти действия оператора присоединения. Обратиться к определенному полю записи можно, указав имя переменной типа запись и имя соответствующего поля. При обработке массива записей также необходимо указывать индекс конкретного элемента данного массива, например: х[1].шагк1. Определенной переменной-записи можно присвоить значение другой пе- ременной-записи такого же типа. Например: Гуре 8ГийепГ=гесогй
зитате: к*гт§[50]; зпате: з*пп^[50]; тагк1:1..1ОО; тагк2: 1..100; епй; уаг х,у: з(ийеп(; Ье§т луШ1 х йо Ье^п геай1п(зитате); геай1п(з_пате); геай1п(тагк1); геай1п(тагк2); епй; у:=х; Данная возможность во многих случаях облегчает обработку массивов записей, в частности, их сортировку. При написании кода программы следует (по возможности) представлять его в наиболее компактном виде и не использовать избыточное количество пе- ременных. Код программы необходимо сопровождать краткими поясняющими комментариями. В отчет необходимо включить экранный снимок выполнения программы в редакторе Разса!. Пример оформления отчета по лабораторной работе Вариант №16 Цель - получение практических навыков работы со структурированными типа- ми данных. Задание. Необходимо в редакторе Разса! написать программу, предполагаю- щую обработку записей. Дан массив, содержащий информацию о студентах группы (Ф.И.О , оценки по 4 экзаменам последней сессии). Необходимо вывести на экран Ф.И.О. студентов в порядке их успеваемости (успеваемость определяется суммой баллов по всем экзаменам). Выполнить программу и проанализировать результаты ее работы. Решение. Код программы: рго§гаш 1аЪ 16; {Лабораторная работ а 16 обучающегося группы БИ-б-о-201 Петрова П.П.) сот* п=3; {количество студентов в группе}
{Описание записи, которая будет содержать ФИО студента и результаты его успеваемости по 4 экзаменам} (у ре 81ис1еп1=-гееогс1 вигпате. &1гёп^[50]; {фамилия} 8, пате: <,(Нп«[50]; {имя} райопугтс: 8кпп§[50]; {отчество} тагк1:1..1ОО; {оценки по 4 экзаменам} тагк2: 1..100; тагкЗ: 1..100; тагк4. 1 100; епй; уаг х: аггау[1..п] оГ 81ийеп1; {определяем массив, состоящий из п экземпляров записи з1ис1еп1} у: 1п1е§ег; {счетчики циклов} а: йке^ег. {вспомогательная буферная переменная, необходимая для временного хра- нения данных} Ь: 81ис1еп1; {вспомогательная буферная переменная, необходимая для временного хра- нения данных} 8: аггау[1..п] оГ шГе§ег; {массив для хранения суммарного балла каждого студента по 4-м экзаменам} Ье§1п \угке1п('Введите информацию о п,' студентах группы.'); {Формирование массива с информацией о студентах группы} Гог г:=1 (о п с!о \хт(1г х[г] с1о Ье§ш \угке1п('свсдсн!1я о ’Д,'-м студенте'); уугке1п('фамилия:'); геас11п(811гпатс); лупГе1п('имя:'); геас11п(8патс); гке1п( 'отчество:'); геай1п(ра1гопугшс); \угке1п('Оцен;<11 по 4 экзаменам последней сессии (от 1 до 100 бал- лов):1); геасИп(тагкГ); гсай1п(тагк2); геай1п(тагкЗ); гсай1п(тагк4); епй; \хгке1п: {Определяем успеваемость каждого студента как сумму баллов по 4-м экзаме- нам} Гог г:=1 (о п йо 8[1]:= х[1].тагк1+х[1].тагк2+х[1].тагкЗ+х[1].тагк4;
{Сортируем массивы х и л по условию убывания суммарной оценки по всем экза- менам} Гог 1:=1 1о п-1 <1о Гог з :=1+1 Го п <1о 1Г 8[1]<8[|] Гйеп Ье§1п а:=8[1]; 8[Г|:=8[]]; 8[]]=а; Ъ-х[1]; епй; [Вывод на экран списка студентов в порядке убывания их успеваемости} 5УГ1Ге1п('Список студентов в порядке убывания их успеваемости:'); Гог 1:=1 Го п с!о \тпГе1п(х[|].811гпатс, ’х[1].8_пате,'з[1]); геасПп; епй. Экранный снимок выполнения кода программы в редакторе Ракса!: 42 1 1 и 43 ^[1] х[1].тагк1 х[1].тагк2 х[1].тагкЗ х[1].тагк4 44 {Сортируем массивы х и 5 по условию убывания суммарной жагжль гл к.1 45 Гог 1: =1 Го п 1 с!о 46 ] 1+1 п 47 5[1]<5[Я 48 49 а 5[1] 50 5[1] 5[Л 51 5[з] а 52 Ь х[Ц 1 53 Т[1] х[Л 54 х[Л Ь ‘ 55 епс1; 56 {Вывод на экран списка студентов в порядке убывания их успеваемости} 57 ыг1Ге!п('Список студентов в порядке убывания их успеваемости: ) 58 11 Со п с1о 59 ыг1Се1п(х[1].Бигпате х[1].5_пане б[1]) 60 геасПп 61 триГ Список студентов в порядке убывания их успеваемости: Иванов Иван 374 Петров Петр 340 Пушкин Иван 310 Выводы. Поскольку результаты выполнения разработанной программы совпали с результатами расчетов вручную, можно говорить о том, что программа составлена верно.
Контрольные вопросы 1. В каких случаях в процессе программирования целесообразно использо- вать записи? 2. Напишите синтаксис описания записи в разделе создания типов данных Гуре. 3. Для чего создаются экземпляры записей (записи-переменные) в разделе описания переменных уаг? 4. Как можно обратиться к определенному полю записи? 5. Напишите синтаксис обращения к определенному полю одномерного массива записей. 6. Какого типа могут быть поля записи? 7. Как обрабатываются поля записи? 8. Охарактеризуйте назначение оператора \\ТГН и напишите синтаксис данного оператора. 9. Можно ли определенной переменной-записи присвоить значение другой переменной-записи такого же типа?
Тема 8. ФАЙЛЫ С понятием файла пользователь компьютера сталкивается постоянно. Язык программирования Паскаль позволяет работать с компонентами файла - записями и, как было показано в предыдущем параграфе, с полями записей, представляющими конечными обрабатываемыми данными. Файл в Паскале состоит из однотипных данных. С данными файла можно производить две операции: запись или чтение. В Паскале производится обра- ботка последовательных файлов, в которых данные записываются или считы- ваются одно за другим. Запись можно прочесть, минуя предыдущие, если изве- стен ее порядковый номер в файле. Для того, чтобы с данными файла произво- дить действия, файл необходимо открыть для соответствующей операции. Рассмотрим этапы, которые необходимо выполнить для каждой операции при работе с файлом. Операция записи. Запись в файл означает помещение в него новых дан- ных. Файл размещается на носителе, как правило, на магнитном диске. Данное для занесения в файл формируется в оперативной памяти как значение некото- рой переменной. Операцией записи в файл это данное копируется из оператив- ной памяти во внешнюю. Следовательно, форма представления данного, его тип и структура должны быть одинаковы и для записей файла, и для перемен- ной, из которой это данное копируется. 1. Описание файла. Описание файла может быть в разделе типов или в раз- деле переменных. Пусть файл/состоит из целых чисел. Его описание имеет вид: уаг Г: Ше оС ш^е^ег; а: пйе^ег; где а - компонента файла, данного того же типа, что и записи файла. Тип дан- ных файла указывается после слова оГ в описании, это может быть числовой или символьный тип, массив или запись. Сложный тип записи файла необхо- димо предварительно описать в разделе 1уре. 2. Установление соответствия между логическим и физическим име- нами файла. Логическое имя - имя переменной из раздела уаг, под этим име- нем файл присутствует в программе. Физическое имя - имя из каталога оглав- ления диска. Оператор установления соответствия между именами файлов: аххг§н (логическое имя файла, физическое имя); Для приведенного описания этот оператор имеет вид: азм^п ( Г, ‘Р.ОАТ’); Физическое имя заключено в апострофы, оно появится в оглавлении, в том же, где находится файл ШгЬо.ехе.
3. Открытие файла для операции «запись». Это действие выполняется оператором: гем>п1е (Г); При открытии файла для занесения в него данных на диске появляются две специальные записи: начало файла, содержащее физическое имя, и признак конца файла. Каждое открытие файла для записи означает создание файла. Ес- ли для операции «запись» открыть файл с уже имеющимися данными, то все данные файла пропадут. Поэтому открывать для записи можно только файлы с новыми именами (физическими). При занесении данных в файл они будут размещаться между именем и признаком конца файла, каждое новое данное будет размещаться перед призна- ком конца файла. Файл может содержать произвольное количество данных. Ограничение размера файла никак в программе не оговаривается. В оперативной памяти до- статочно одной области, совпадающей по формату с записями файла, а на диске файл может быть такого размера, сколько имеется свободного пространства на момент его создания. Запись данных в файл производит оператор: н>п1е ( Г, а ) ; Пример 1. Пусть требуется создать файл из 10 целых чисел. Программа имеет вид: рго§гаш Е35; уаг Г: Й1е оГ шГе^ег; а, 1 : пйе^ег; Ье^ш авещп (Г, Т.ПАТ’); гемгйе (Г); туп!е1п (‘введите 10 целых чисел, после каждого нажимайте Ешег’); Гог 1 := 1 1о 10 йо Ье§ш геай1п (а); зупГе ( Г, а ) епй епй. Если создать файл и никаких больше действий не производить, то ника- кой возможности просмотреть данные файлы вне программы практически нет. Поэтому большинство задач обработки файлов начинаются словами: «Дан файл». Очевидно, как и для других задач с подобным началом, файл нсобходи-
мо сначала создать, т. е. выполнить описанные четыре этапа. Для работы с дан- ными файла их необходимо прежде всего прочесть, открыть файл для чтения. Операция чтения. Для чтения данных из файла его необходимо описать, установить соответствие между логическим и физическим именем, открыть для чтения и считывать данные. Первые два шага - описание и установление соот- ветствия имен - такие же, как и для операции записи. Если с файлом выполня- ются различные операции, то перед выполнением следующей его необходимо закрыть оператором с1о$е (Г); Открытие файла для чтения производится оператором: гезе/ ( Г); Читать данные из файла позволяет оператор: геай ( Г, а ); После создания файла и нескольких преобразований может быть неиз- вестно количество его записей. Поэтому при чтении данных из файла удобно использовать специальную функцию, контролирующую признак конца файла. Эта функция принимает значение «истина», если встречен признак конца фай- ла, и «ложь», если прочитана другая запись. Т. к. при открытии файла для чте- ния уже считывается первая его запись, содержащая имя файла, то можно по- ставить контроль признака конца файла, даже не считав ни одной записи опера- тором геасИЕ. а); Функция обработки признака конца файла: ео/(П Поскольку количество записей в файле неизвестно, то использовать при чтении данных файла цикл-пересчет нельзя, используется цикл-пока. Его заго- ловок: н>кЦе по/ еоГ( Г) Ло надо понимать так: пока не встретился признак конца файла, выполнять цикл. Пример 2. Дан файл целых чисел. Посчитать количество положительных, отрицательных и нулевых элементов файла. Используем в данном примере про- грамму создания файла целых чисел Е35. рго^гаш Е36; сопИ к = 15;
уаг Г: Й1е о? Ше^ег; а, 1, п, р, х : тиШ^ег; Ье$рп ачящп (Г, Т.1ЭАТ’); гемтИе ( Г); { создание файла } мтйеШ ('введите’ , к, ‘ целых чисел, после каждого нажимайте Еп(ег’); (ог 1 := 1 1о п йо Ье§т геасПп (а); тугИе ( Г, а ) епй; с1о$е ( Г); { закрытие файла для операции записи } { решение задачи - подсчет различных элементов } п := 0; р := 0; х := 0; { п - отрицательные, р - положительные , х - нули } тезе! (Г); туЬПе по! еоГ( Г) До Ье^ш геай ( Г, а ); И а = 0 Шеп х := х + 1; На < 0 Шеп п :=п + 1; И а > 0 Шеп р := р + 1 епй; лугПе (‘ п = ‘ , п, ‘ х = ', х , ‘ р = ', р) епй. Пример 3. Пусть требуется расширить данный файл, добавив в него но- вые данные. Как известно, файл с данными нельзя открывать для записи, по- этому для решения подобных задач необходимо использовать вспомогательный файл. Решение задачи расширения файла складывается из следующих этапов: 1) открыть данный файл/для чтения, а вспомогательный § - для записи; 2) читать данное из исходного файла/и записывать его тут же в файл 3) после окончания переписывания данных закрыть файл/ 4) вводить новые данные с клавиатуры и записывать их в файл добав- ляя к уже имеющимся там данным файла/; 5) закрыть файл 6) открыть файл/для записи, а файл § - для чтения; 7) читать данные из файла § и записывать их в файл/ Таким образом, в файле/ к старым данным добавятся новые. Если требу- ется вставить новые данные в середину файла, то надо во втором пункте реше- ния контролировать считываемые данные и, дойдя до места вставки, приоста- новить чтение, записать требуемые данные в файл а затем дописать туда оставшиеся из исходного файла (пункты 3 и 4), далее выполнить пункты 5, 6, 7.
Программа добавления данных в файл (используем готовый файл / из примера Е35): рго§гат Е37; уаг Е §: Й1е оЕ т!е^ег; а: т!е§ег; Ье^ш азгщп ( Е Т.ПАТ’); аям^п ( §, ‘О.ПАТ’); { перезапись данных из исходного файла в вспомогательный } ге$е! ( Е); гелтп!е ( §); утШе по! соЕ ( Е) <1о Ье^1п геай ( Е а ); л*п!е ( §, а); епй; с105е (Е); { добавление данных в вспомогательный файл } геай!п (а); кЫ1е а о 0 йо { признак окончания ввода новых данных - ноль } Ье^ш луп!е ( §, а ); геай!п (а) епй; с1о«е (§); гезе!(§); гелуп!е(Е); { перезапись данных назад в исходный файл } кЫ1е по! еоЕ ( §) йо Ье§ш геай ( §, а ); луп!е ( Е а ) епй епй. Вопросы и задания 1. Какие операции можно производить с данными файла? 2. Почему второй параметр а операторов итЦе (/ а) и геаЛ (/', а ) должен быть такого же типа, как и данные файла? 3. Что такое физическое имя файла, чем оно отличается от логического имени? 4. Как открыть файл для записи? 5. Что будет, если ранее созданный файл с данными открыть для записи? 6. Чем ограничено количество данных в файле? 7. Чем отличается файл от массива?
8. Как прочесть данные из файла, не зная количества этих данных? 9. Как добавить данные в имеющийся файл? 10. Для целочисленного файла найти наибольший элемент данных. И. Для файла целых чисел переписать положительные в один дополни- тельный файл, а отрицательные - в другой. 12. Для задачи 8 предыдущего параграфа создайте файл с записями об учениках класса и выполните все пункты задания, используя данные файла.
Лабораторное задание 17. Работа с файлами Цель - получение практических навыков работы с типизированными файлами. Задание. Необходимо в редакторе Разса! написать программу, предпола- гающую обработку массивов, хранящихся в файлах. Выполнить программу и проанализировать результаты ее работы. Варианты заданий Вариант № Задание 1. В файле хранится массив, содержащий информацию о гражданах, обслуживаемых поликлиникой (Ф.И.О., год рождения, адрес проживания, место работы, дата прохождения флюорографии). Необходимо вывести на экран Ф.И.О. лиц, которые прошли флюорографию более 1 года назад 2. В файле хранится массив, содержащий информацию об автомобилях (номер, модель машины, цвет, Ф.И.О. владельца, дата прохождения техосмотра). Вывести на экран номера машин и Ф.И.О. владельцев для тех автомобилей, которые не прошли техосмотр в текущем году 3. В файле хранится массив, содержащий информацию об автомобилях (номер, модель машины, цвет, Ф.И.О. владельца, дата прохождения техосмотра). Вывести на экран Ф.И.О. владельцев автомобилей в алфавитном порядке и соответствующие номера автомобилей 4. В файле хранится массив, содержащий информацию о гражданах, обслуживаемых поликлиникой (Ф.И.О., год рождения, адрес проживания, место работы, дата прохождения флюорографии). Необходимо вывести на экран все сведения о гражданах, родившихся в определенном году 5. В файле хранится массив, содержащий информацию о выставленных на продажу квартирах (количество комнат, общая площадь, площадь зала, площадь кухни, наличие балкона, этаж, стоимость, адрес). Необходимо вывести на экран адреса всех грехкомнатных квартир, стоимость которых не превышает некоторое пороговое значение 6. В файле хранится массив, содержащий информацию о выставленных на продажу квартирах (количество комнат, общая площадь, площадь зала, площадь кухни, наличие балкона, этаж, стоимость, адрес). Необходимо вывести на экран все сведения о квартирах, у которых есть лоджия и которые расположены на втором этаже
Вариант № Задание 7. В файле хранится массив, содержащий информацию о выставленных на продажу квартирах (количество комнат, общая площадь, площадь зала, площадь кухни, наличие балкона, этаж, стоимость, адрес). Необходимо вывести на экран все сведения о квартирах в порядке возрастания их стоимости 8. В файле хранится массив, содержащий информацию о развивающих играх для детей (название игры, стоимость и возрастные границы детей, которым будет интересна данная игра). Необходимо вывести на экран названия развивающих игр, которые подходят детям до возраста К и стоимость которых не превышает порог К 9. В файле хранится массив, содержащий информацию о развивающих играх для детей (название игры, стоимость и возрастные границы детей, которым будет интересна данная игра). Необходимо вывести на экран все сведения о развивающих играх в порядке возрастания их цены, которые подходят детям до К лет 10. В файле хранится массив, содержащий информацию о студентах университета (Ф.И.О., курс, направление подготовки, шифр группы, оценки по 4 экзаменам последней сессии). Необходимо вывести на экран Ф.И.О. и шифры групп лучших студентов университета (учатся на «отлично» и «хорошо» и по сумме полученных баллов не уступают другим студентам университета) 11. В файле хранится массив, содержащий информацию о студентах группы (Ф.И.О., оценки по 4 экзаменам последней сессии). Необходимо вывести на экран Ф.И.О. студентов в порядке их успеваемости (успеваемость определяется суммой баллов по всем экзаменам) 12. В файле хранится массив, содержащий информацию о студентах группы (Ф.И.О., оценки но 4 экзаменам последней сессии). Необходимо вывести на экран название предмета, который был сдан наиболее успешно 13. В файле хранится массив, содержащий информацию о студентах 1руппы (Ф.И.О., оценки по 4 экзаменам последней сессии). Необходимо вывести на экран процент студентов, который сдал все экзамены без троек и с тройками 14. В файле хранится массив, содержащий информацию о студентах университета (Ф.И.О., пол, направление подготовки, курс). Необходимо вывести на экран название направления подготовки, на котором учится наибольший процент мужчин
Вариант № Задание 15. В файле хранится массив, содержащий информацию о студентах университета (Ф.И.О., пол, направление подготовки, курс, рост). Необходимо вывести на экран Ф.И.О. всех студентов, чей рост выше среднего по университету (отдельно для мужчин и женщин) 16. В файле хранится массив, содержащий информацию о студентах группы (Ф.И.О., оценки но 4 экзаменам последней сессии). Необходимо вывести на экран сведения о среднем балле каждого студента (Ф.И.О. - средний балл) Методические указания по выполнению лабораторной работы Во всех задачах данной лабораторной работы первоначально необходимо создать файл и внести в него соответствующие данные. Для хранения данных необходимо использовать записи. Количество записей, хранящихся в файле, рекомендуется задавать в виде константы. Для удобства проверки работы про- граммы это число должно быть небольшим (3 < п <7). Затем записи, хранящиеся в данном файле, нужно обработать и вывести на экран для пользователя результаты работы программы. В процессе написания кода программы необходимо помнить последова- тельность действий для создания нового файла и внесения в него информации: 1) создание файловой переменной; 2) установление связи файловой переменной с физическим файлом (опера- тор а*>м§п); 3) открытие файла для записи (оператор гетегйе); 4) внесение информации в файл (оператор эугйе); 5) закрытие файла (оператор с!озе). Последовательность действий для считывания информации из ранее со- зданного файла: 1) создание файловой переменной; 2) установление связи файловой переменной с физическим файлом (опера- тор азмцп); 3) открытие файла для чтения (оператор тезе!); 4) считывание необходимой информации из файла (оператор геай); 5) закрытие файла (оператор с!озе). При написании кода программы следует (по возможности) представлять его в наиболее компактном виде и не использовать избыточное количество пе- ременных. Код программы необходимо сопровождать краткими поясняющими комментариями. В отчет необходимо включить экранный снимок выполнения программы в редакторе Разса!.
Пример оформления отчета по лабораторной работе Вариант №16 Цель - получение практических навыков работы с типизированными файлами. Задание. Необходимо в редакторе Разса! написать программу, предполагаю- щую обработку массивов, хранящихся в файлах: В файле хранится массив, содержащий информацию о студентах группы (Ф.И.О., оценки по 4 экзаменам последней сессии). Необходимо вывести на экран сведения о среднем балле каждого студента (Ф.И.О. - средний балл). Выполнить программу и проанализировать результаты ее работы. Решение Код программы: рго§гаш 1аЬ 17; {Лабораторная работа 17 обучающегося группы БИ-б-о-201 Петрова П.П.} сопз1 п=3; {количество студентов в группе} {Описание записи, которая будет содержать ФИО студента и результаты его успеваемости по 4 экзаменам} (у ре З1ис1еп1=-гесогс1 зигпате. з>(г1п^[5О): {фамилия} упате: з1г1п§[50]; {имя} ра1гопут(с: з!пп§[50]; {отчество} тагк1:1..100; {оценки по 4 экзаменам} тагк2: 1..100; тагкЗ: 1..100; тагк4: 1..100; епй; уаг г: Й1е оГ зШйеп!; {создание файловой переменной г} уаг х: аггау[1..п] оГ з1ис1еп1: {определяем массив, состоящий из п экземпляров записи МиЛеп1} у; 1п1е^ег: {счетчики циклов} а: 1п1е§ег; {вспомогательная буферная переменная, необходимая для временного хра- нения данных} Ь: З1ис1еа1; {вспомогательная буферная переменная, необходимая для временного хра- нения данных} з: аггау[1..п] оГ Н1(е§ег; {массив для хранения суммарного балла каждого студента по 4-м экзаменам} Ьещп {Установление связи файловой переменной с физическим файлом} аззщп(2,'рг.йаГ); гемгйе(г); {открытие файла для записи} \угйе1п('Введите информацию о ', п,' студентах группы.');
{Формирование записей файла с информацией о студентах группы} Гог 1:=1 Го п с!о Ье(рп \хтГ11 Ь йо ЬеоИ1 «пГе1п('сведения о 'Д,’-м студенте'); \угйе1п('фамнл1-1я:'); геасПп! зитате); \хпГе1п('имя:'): геай1п(8_пате); \\ пГе1п ('отч ество:'); геай1п(раГгопугтс); \хпГе1п('Оцснки по 4 экзаменам последней сессии (от 1 до 100 бал- лов).'); геай1п(тагкГ); геай1п(тагк2); геасИп(тагкЗ); геай1п(тагк4); епй; ххпГе(х,Ь); {внесение информации в файл} епй; с108е(х); {закрытие файла} ге8еГ(/); {открытие файла для чтения} Гог 1: = 1 (о п йо Ье§т геэй(х, х[1]); {считывание соответствующей записи из файла в одномер- ный массив х, состоящий из записей} 8[1]:= х[1].тагк1+х[1].тагк2-'-х[1].тагкЗ+х[1].тагк4; {определяем успевае- мость каждого студента как сумму баллов по 4-м экзаменам} епй; {Сортируем массивы х и з по условию убывания суммарной оценки по всем экза- менам} Гог 1:=1 го п-1 йо Гог ):=1+1 Го п йо 1Г 8[1)<8[]] Гйеп Ье§т а:==8[1]; 8[1]:=8Ц]; 8Ц]:=а; Ь:=х[1]; хИ-хЩ; х[]]:=Ь; епй; {Вывод на экран списка студентов в порядке убывания их успеваемости} «'Г1Ге1п('Список студентов в порядке убывания их успеваемости;'); Гог Е=1 Го п йо \угйе1п(х[1] заплате,'', х[1].8_пате,'', 8[1]);
с1о8>е(г); {закрытие файла} геасПп; епй. Экранный снимок выполнения кода программы в редакторе Разса!: Выводы. Поскольку результаты выполнения разработанной программы совпали с результатами расчетов вручную, можно говорить о том, что программа составлена верно. Контрольные вопросы 1. Дайте определение понятию «файл». 2. Назовите последовательность действий для создания нового файла и вне- сения в него информации. 3. Назовите последовательность действий для считывания информации из ранее созданного файла. 4. В каком разделе программы можно описать файл? 5. Какие данные могут храниться в файле?
6. Зачем устанавливать соответствие между логическим и физическим име- нами файла? 7. Напишите синтаксис операторов для работы с файлами: ачмцп, геуугйе, итйе, с1о«е, ге$е1, геай. 8. Что Вы знаете о функции еоГ?
Тема 9. ГРАФИКА Средства языка Паскаль позволяют сроить изображения на экране дис- плея. Для этого используется специальная библиотека подпрограмм, называе- мая ОгарЬ. В нее входят графические процедуры и функции для выдачи различ- ных по форме фигур и линий, а также средства организации графического ре- жима. Эти средства предназначены для анализа возможностей используемого дисплея, разбиение поля экрана на различное число мелких квадратиков, каж- дый из которых считается отдельной точкой изображения и называется пиксе- лом. Для дисплея типа УОА число точек может быть 640 х 480, а количество используемых цветов - 16. Однако, более сложные, не рассматриваемые здесь средства Паскаля, позволяют увеличить количество цветов до 256. Цвет, как и координаты экранной точки, задается целым числом. Начало координат экрана находится в левом верхнем углу (точка 0,0), ось Ох направлена вправо, Оу - вниз. Эту особенность направленности оси Оу необходимо учитывать при построении изображений, особенно графиков функций и диаграмм. Для по- строения окружности необходимо указывать координаты центра и радиус, для прямоугольника - координаты противоположных вершин (например, А и П). Каждое изображение можно также построить по точкам, указав для каждой точки ее координаты и цвет . При построении изображений используются так называемые графические примитивы - базовые конструкции, и их модификации. К графическим прими- тивам относятся: точка, отрезок, дуга. Точка. Для выдачи точки на экран используется вызов процедуры Ри1Р1хе1 (х, у, номер_цвета); где х , у - координаты точки. С помощью этого оператора можно построить график функции. Построение графика функции. Для того, чтобы построить график, необходимо сначала задать отрезок области определения, на котором функция существует, и отобразить этот отрезок на ось Ох экрана дисплея. Точке х отрез- ка [ а, Ь ] из области определения функции должна соответствовать точка х, экрана дисплея, а точке у = / (х ) - значению функции - точка у/ экрана (рис. 10). Таким образом, происходит масштабирование графика, возможность отображать на экран любой отрезок области определения. Здесь, безусловно, необходимо учитывать разрешающую возможность экрана, чтобы масштаб позволил увидеть качественное поведение функции. Точки на экране, в отличие от точек геометрической прямой, имеют дискретные значения. Точки оси Ох нумеруются от 0 до 640, т. е. х1 = 0, 1, 2, 3, ... , 640.
X а -------------------------- Ь О ---------------------------------------------г.40 х1 Рис. 10. Установление соответствия между точками отрезка [а , Ъ ] и осью Ох экрана дисплея Из пропорции (х-а)/(Ь-а)=(х1 - 0)/( 640 - 0 ) получим расчетную формулу для вычисления аргумента функции, соответствующего заданной точ- ке экрана: х = а + х1*(Ь-а)/ хшах где хтах =» 640 для дисплеев типа УОА. Для получаемого значения аргумен- та вычисляется значение функции: У - Г ( х ) Теперь необходимо умножить полученное значение функции на коэффи- циент масштабирования, показывающий, сколько пикселов (физических точек экрана) содержится в выбранной единице масштаба: к = хтах / ( Ь - а ). Получаем значение у - координату для выдачи рассчитанной точки гра- фика функции на экран: у1 = у * хтах / ( Ь - а ). Теперь следует учесть особенность расположения оси Оу на экране и «пе- ревернуть» график, рассчитанный на традиционное положение осей координат, а также добавить смещение, чтобы график располагался по центру экрана: у1 = ушах / 2 - у1. С полученными координатами х1 и у1 точка выводится на экран. По- скольку реальные координаты графика функции, с которыми она вычисляется,
вещественные числа, а координаты точек экрана - целые, то в формуле вычис- ления у1, при использовании ее в программе, необходимо округлить получае- мый результат до ближайшего целого числа. Округление производит функция (типе, аргумент которой - выражение вещественного типа: у1 := {гипс (у * хтах/ ( Ь - а )); Программа построения графических изображений должна начинаться с оператора подключения библиотеки графических процедур и специальной биб- лиотеки, позволяющей использовать функции операционной системы (библио- теки СП). Этот оператор располагается сразу за заголовком программы и имеет вид: изез Старк, Сг(; Сама программа состоит из описаний процедур построения изображений, описания функции, для которой строится график и описания специальной про- цедуры установки графического режима. Главная программа при этом содер- жит операторы вызова этих процедур и оператора задержки изображения на экране (после построения последней точки изображение исчезает): тереа! илШ кеурге8«ей; {выполнять пустой цикл до нажатия любой клавиши} Программа построения графика функции у = мп ( х) на отрезке [-л; л]. рго^гаш Е38; п$е$ Огарй, СП; ргосейиге 1пй; { установка графического режима } уаг §г, §т : т(е§ет; Ье§ш §г := 0; {автоматическое распознавание тина дисплея } ХпкОгарй (§г, §т, ‘ ‘ ); {файл е§ау§а.Ь§1 находится в одном каталоге с ТигЬо.ехе} И ОгарйКезик о щ'Ок 1Ъеп Нак (1); { обработка результата установки } епй; ГипсНоп Г ( х: геа!) : геа1; { вычисление функции Г (х) } Ье^п Г := зт (х) епй;
ргосейпге §гайс; уаг хтах, утах, х1, у1 : т(е§ег; х, у, а, Ь геа1; Ье^т хтах := 640; утах := 480; а := - 3.14; Ь := 3.14; 1огх1 := 0 1о хтах йо Ье^т х г а + х I * ( Ь - а ) / хтах; у := Г ( х ); { вызов подпрограммы-функции } у1 := ттс(у * хтах/( Ь- а)); у1 := утах сйу 2 - у 1; Ри(Р1хе1 ( х1, у 1, 2); {выдача точки зеленым цветом} епй епй; Ье^т { главная программа } 1пП; { вызов процедуры установки графического режима} Огайс; { вызов процедуры построения графика функции} гереа! ипШ кеургеззей епй. При построении сложных рисунков, выдаваемых по точкам, можно ис- пользовать прием мозаики: нарисовать рисунок по клеточкам и заполнить таб- лицу целых чисел, каждое число соответствует номеру цвета соответствующей клеточки, а координаты клеточки соответствуют индексам элементов таблицы (рис. 11). 0 15 0 15 15 0 15 0 15 15 15 0 Рис. 11. Рисунок по клеточкам и соответствующая таблица Задание цвета. Некоторые графические операторы, такие, как построе- ние точки, включают параметр цвета, но для многих других используется те- кущий цвет, определенный последним оператором задания цвета: 8е1Со1ог ( цвет); Ниже приведены коды цветов, каждый цвет может быть задан как номе- ром, так и словом (на англ.).
черный - 0; синий - 1; зеленый - 2; бирюзовый - 3; красный - 4; малиновый - 5; коричневый - 6; серый-с - 7; серый-т - 8; голубой - 9; зеленый-с - 10; бирюзовый-с - 11; красный-с - 12; малиновый-с - 13; желтый - 14; белый - 15. (с - сокращенно «светлый», т - «темный») Отрезок. Для построения отрезка необходимо указать координаты его концов. Отрезок строится текущим цветом. Оператор построения отрезка: Ыпе ( х1, у1, х2, у2); При построении изображения компьютер как бы рисует лучом. Луч оста- навливается в последней точке изображения, координаты которой запоминают- ся. Можно построить отрезок, указав либо смещение от этой точки по осям х и у, либо координаты конца отрезка (начало там, где остановился луч). Смещение указывается в виде целого числа, положительное означает увеличение послед- ней координаты на величину смещения, отрицательное - соответственное уменьшение координаты. Смещение удобно использовать для построения изоб- ражения в относительных координатах, когда достаточно указать координаты первой точки, а остальные будут пересчитаны и, таким образом, можно пере- мещать картинку по экрану. Оператор построения отрезка с указанием смещения: ЫпеКе1 (с1х, йу); Оператор построения отрезка с указанием последней его точки: ЫпеТо (х, у ); Этот оператор удобно использовать для построения графика функции, которая либо резко возрастает, либо резко убывает. В этом случае изображение, построенное по точкам, терпит разрыв, т. к. для двух соседних аргументов два значения функции находятся далеко друг от друга. Первую точку графика надо выдать оператором Ри1Р1хе], а остальные, вычисляемые и строящиеся в цикле, - оператором ЫпеТо. Луч, строящий изображения, может перемещаться без следа. Это позво- ляют делать операторы, аналогичные двум последним: МоусКс! ((1х, (1у ); МогеТо (х, у); Аналогично отрезку строится прямоугольник, для построения которого необходимо указать координаты концов любой диагонали. Прямоугольник мо-
жет быть построен в виде контура или в виде закрашенной фигуры. Для кон- турного изображения прямоугольника используется оператор Кес1ап^1е (х1, у1, х2, у2); для закрашенного Ваг ( х1, у1, х2, у2); Построение столбчатой диаграммы. На рис. 12 представлена столбча- тая (линейная) диатрамма падения успеваемости некоторого учащегося по чет- вертям учебного года. В первой четверти успеваемость составила 75 %, во вто- рой - 50 %, в третьей - 25 %. Построим такую диаграмму с помощью програм- мы, расположив самый высокий столбец в центральной части экрана ( его дли- на - 480 : 3 = 160 пикселов) и рассчитав остальные пропорционально их значе- ниям относительно этого размера. По ширине вся диаграмма занимает также 1/3 часть, т. е. первоначальное значение координаты х равно 210 пикселов, ши- рина столбцов по 35 и расстояние между ними также 35 пикселов. Для расчета высоты второго столбца составим пропорцию 75 : 50 = 160 : х . Отсюда х = 106 (с округлением до целого). Высота второго столбца 53 пиксела. Т. к. нижние основания прямоугольников находятся на одном уровне, на котором у = 320, то расчет вторых координат (по оси у) производится вычитанием из 320 высоты соответствующего столбца. Рис. 12. Столбчатая диаграмма успеваемости учащегося по четвертям Размещение текста на изображении производится с помощью оператора: Ои1Тех1ХУ ( х, у, ‘текст ‘); где х, у - координаты, начиная с которых будет выдан текст. Программа построения столбчатой диаграммы имеет такую же структуру, как и программа Е38.
рго^гаш Е39; и«е8 Огарк, Сг(; ргосейиге 1пк; { установка графического режима } уаг §г, §т : шШ^ег; Ье^т дг :- 0; {автоматическое распознавание типа дисплея } 1пкОгарк (§г, §т, ‘ ‘ ); {файл е§ау§а.Ь§1 находится в одном каталоге с ШгЬо.ехе} И ОгаркКезик о §гОк Шеп Нак (1); { обработка результата установки } епй; ргосейиге ЕИа^гатЦ уаг х,у, х1, у 1, х2, у2: ййе§ег; Ье§т 8е<Со1ог (14); Ваг (210,160, 245, 320); 8е1Со1ог (10); Ваг ( 210 + 2*35, 320-106, 210 + 3*35,320); 8е1Со1ог (2); Ваг ( 210 + 4*35, 320- 53, 210 + 5*35,320); ОщТех1ХУ(210, 320 + 30, ‘Успеваемость по четвертям’); епй; Ье^п 1пк; В1а§гат1; гереа( ипШ кеургеззей епй. Построение дуги. Для построения дуги необходимо указать центр соот- ветствующей окружности (х и у), начальный угол, конечный угол дуги и ради- ус. Углы отсчитываются против часовой стрелки, их величина указывается в градусах, ее значения от 0 до 359. Отсчет угла производится от направленного вправо по горизонтали радиуса. Оператор построения дуги имеет вид: Аге ( х, у, начальиый_угол, конечный_угол, радиус); Для закрашенного сектора используется следующий оператор с такими же параметрами: Р1е8Исе (х, у, начальный_угол, конечный_угол, радиус); Если указать значения углов соответственно 0 и 359, то получим окруж- ность или закрашенный текущим цветом круг. Окружность можно также изоб- разить оператором: &гс1е (х, у, г); Рассмотрим пример построения «рога изобилия», построенного из окружностей. Центры окружностей перемещаются по окружности, задаваемой
как траектория точки, одна координата которой задается косинусом, а другая - синусом одного и того же угла х1 / к. При к = 20 получается замкнутый круг, к = 10 - два круга, к = 30 - полукруг. ргодгат Е40; изез ОгарЬ, СП; ргосейиге 1пй; { установка графического режима } уаг §г, дт : йиедег; Ье§ш §г := 0; {автоматическое распознавание типа дисплея } йшСйарй (§г, §т, ‘ ‘ ); {файл е§ау§а.Ь§1 находится в одном каталоге с йиЬо.ехе} И ОгарйКезпЙ о <цОк Гйеп Най (1); епй; ргосейиге Код; уаг хтах, утах, х1, у1, х, у, г : шГедег; Ьедт хтах := 640; утах := 480; (ог х1 := 1 Го 125 йо Ьедт х := .птс ( хтах / 2 + утах / 2 * соз ( х1 / 20 )); у := (гипс ( утах / 2 + хтах / 4 * зт ( х1 / 20 )); г := йппс ( утах / 4 - х1 ); Сйс1е ( х, у, г) епй епй; Ьедш 1пй; Код; гереаГ ипШ кеургеззей епй. Построение круговой диаграммы. Диаграммы такого типа представля- ют собой круги, разделенные на секторы разной площади (рис. 13). Площадь каждого сектора соответствует некоторой части, как правило, в процентном от- ношении, а за единицу (целое) принимается площадь всего круга. Вместо пло- щади сектора можно рассчитать длину дуги. Построим круговую диаграмму изменения успеваемости.
Рис. 13. Круговая диаграмма успеваемости Программа имеет вид: рго^гат Е41; п$е$ ОгарЬ, СП; ргосейиге 1тг; { установка графического режима } уаг §г, : т!е^ег; Ье§т §г 0; {автоматическое распознавание типа дисплея } 1штОгарЕ (§г, §т, ‘ ‘ ); {файл е§ау§а.Ь§1 находится в одном каталоге с ШгЬо.ехе} И ОгарйКезик о §гОк Шеп Нак (1); { обработка результата установки } епй; ргосейиге Вта§гат2; уаг хтах, утах, х1, у1, х, у, г : ш!е^ег; Ье<цп хтах := 640; утах := 480; х := 320; у := 240; г := 200; {координаты центра и радиус диаграммы} х1 := тгипс ( 75 * 36 / 10 ); { расчет длины первой дуги } 8етСо1ог (14); Р1е8Нсе ( х, у, 0, х1, г); у1 := тгипс ( 50 * 36 / 10 ); 8е(Со1ог ( 10 ); РтсЗИсе ( х, у, х1 + 1, у1, г) ; {вторая дуга + первая } 8е1Со1ог ( 2 ) ; РтсЗИсе ( х, у, у1 + 1, 359, г); { замыкание круга } епй; Ье^тп 1пй; В1адгат2; гереа! и.пШ кеургеззей епй.
Вопросы и задания 1. Как расположены оси координат на экране дисплея? 2. Что такое графические примитивы? 3. Как закрасить один пиксел экрана? 4. Как отобразить отрезок [ а, Ь ] на всю ширину экрана? 5. Сколько пикселов будет содержать единица измерения на отображае- мом на экране отрезке [ я, Ь ]? 6. Как расположить график на экране с учетом направленности оси Оу в противоположную от традиционного направления строну? 7. Какого типа данные соответствуют экранным координатам? 8 В какой библиотеке Паскаля содержатся графические подпрограммы и как подключить эту библиотеку при выполнении программы? 9. Как задержать изображение на экране после полного его построения? 10. Как задать цвет для построения линий, прямоугольников и дуг? 11. Какой оператор позволяет построить отрезок, используя только одну пару координат? 12. Как переместить рисующий луч по экрану так, чтобы нс было следа? 13. Как построить график функции, которая резко возрастает или убыва- ет? 14. Как построить изображение, которое можно перемещать по экрану, задавая координаты только первой его точки? 15. Какие операторы позволяют построить контурный и закрашенный прямоугольники? 16. Как построить линейную диаграмму? 17. Как подписать рисунок? 18. Как построить дугу окружности? Как с помощью оператора построе- ния дуги построить окружность? 19. Как изобразить закрашенный сектор? 20. Для чего используется функция (гипс? 21. Что такое круговая диаграмма? 22. В программу построения графика функции добавить выдачу на экран координатных осей и отметку на них единицы измерения. 23. С помощью программы построения графика функции построить гра- фики 1о§эХ, х, соз х на различных участках областей определения этих функ- ций. 24. Программу построения столбчатой диаграммы дополнить так, чтобы на изображении были все подписи, как на рис. 12. 25. Подписать круговую диаграмму, выделив в каждом секторе прямо- угольник белого цвета и поместив в него необходимый текст. 26. Построить концентрические окружности, закрасив каждую новым цветом. 27. Построить елочку из п треугольников, определив ее предварительно рекурсивно и использовав в программе рекурсивную графическую процедуру.
28. Используя идею детской игры «мозаика», построить изображение разноцветной бабочки, сохранив его предварительно в виде таблицы целых чи- сел (значений цветов) и выдавая затем эту таблицу по точкам на экран, приме- няя двойной цикл. 29. Построить по точкам пиктограммы графического редактора, создав предварительно таблицу, в которой каждая точка изображения присутствовала бы значением своего цвета.
Лабораторное задание 18. Компьютерная графика Цель - получение практических навыков работы с графическими объек- тами. Задание 1. Необходимо в редакторе Разса! нарисовать государственный флаг определенной страны. Выполнить программу и проанализировать резуль- таты ее работы. Варианты заданий4 Вариант № Страна Вид флага 1. Российская Федерация 2. Бахрейн 3. Багамские Острова 4. Греция 5. Гамбия 6. Дания 4 Составлено с использованием материалов: Список государственных флагов. - Ййр8://ги.ту1к1рес11а.ог§ .
Вариант № Страна Вид флага 7. Республика Конго 8. Республика Либерия 9. Лаос 10. Мальдивская Республика 11. Республика Сейшельские Острова 12. Франция II 13. Объединенная Республика Танзания 14. Сент-Люсия А
Вариант № Страна Зид флага 15. Сент-Винсент и Гренадины V 16. Кувейт Методические указания по выполнению лабораторной работы Перед началом создания программы рекомендуется найти нужные коор- динаты геометрических фигур, составляющих полотно флага, на листе бумаги. Государственный флаг страны должен располагаться в центре экрана и занимать не менее 50 % площади экрана. При построении флага желательно максимально соблюдать пропорции элементов флага (например, у полотна фла- га Кувейта ширина зеленой, белой и красной полос одинакова). При выборе цвета желательно подбирать цвета, наиболее близкие к оригиналу (например, светло-голубой, темно-синий и т. д.). Код программы следует (по возможности) представлять в наиболее ком- пактном виде и сопровождать краткими поясняющими комментариями. В отчет необходимо включить экранный снимок выполнения программы в редакторе Разса!. Пример оформления отчета по лабораторной работе Вариант № 16 Цель - получение практических навыков работы с графическими объектами. Задание. Необходимо в редакторе Разса! нарисовать государственный флаг Ку- вейта. Выполнить программу и проанализировать результаты ее работы. Решение. Код программы: рго§гаш 1аЪ 18 1; {Лабораторная работа 18, задание 1 обучающегося группы БИ-б-о-201 Петрова П.П.} иве® §гар!гаЬс; {программу будем выполнять в Ра.чеа1 АВС, поэтому указываем соот- ветствующую библиотеку ^гаркаЬс} Ье§1п &е1лтп1(1ом'М2е(300,120); {задаем размеры окна} гес1ап§1е(55,10,240,105); {строим прямоугольник, являющийся контуром флага} гес1апй1е(100,40,240,70); {строим белый прямоугольник}
Нпе(55,105,100,70); Ипе(55,10,100,40); Г1оо<1ЕШ(75,30,с1В1аск); {закрашиваем построенную трапецию в черный цвет} Г1ооаИ11(75,15,с1Огееп); {закрашиваем верхнюю часть флага в зеленый цвет} Г1оос1ГШ(230,100,с1Вес1); {закрашиваем нижнюю часть флага в красный цвет} геасПп; епс1. Экранный снимок выполнения кода программы в редакторе Разса! ЛВС: 'азез дгарйаЬс; Ьедю зес«1пйО5>гзхге (300,120); гессапд1е(55,10,240,105): гесгапд1е(100,40,240,70); 11пе(55,105,100,70); Пае(55,10,100,40); ПообЕШ (75,30, с1В1ас)с) ? г1ообГ±11(75,15,с16гееп); ,е1ообЕ111 (230,100, с1ЯеД) Выводы. Поскольку созданная программа рисует флаг Кувейта правильно, можно говорить о том, что она составлена верно. Задание 2. Необходимо в редакторе Разса! построить график функции у = /(х). Выполнить программу и проанализировать результаты ее работы. Варианты заданий5 Вариант № У = ЛХ) 1. у = х2 + 4х + 3 2. у = -2 ЯП Зт 3. у= х-3 4. у - Зсо»2т 5. у = 2-,+3 6. У = (8 * 5 Составлено с использованием материалов: Лунгу К. Н. Сборник задач по высшей математике. 1 курс / К. Н. Лунгу, Д. Т. Письменный, С. Н. Федин, Ю. А. Шевченко. - 7-е изд. - М.: Айрис-пресс, 2008. - 576 с.
Вариант № У = Л*) 7. у = т2 - 6х + 1 1 8. у = Зт + 5 9. у = 2зтт - 7 10. у = -х2 + 2т 11. у = 1пт2 12. у = т3 - Зт" + Зт -1 13. у = т3 - т 14. ;; = 3-5созт 15. у = т2 - 8т + 20 16. у = т3 Методические указания по выполнению лабораторной работы Перед началом создания программы рекомендуется сначала построить (по точкам) график функции в табличном процессоре (например, в ЕХСЕЕ). Это позволит сократить время программирования и количество допущенных ошибок, поскольку предоставит возможность выбрать правильный масштаб по- строения графика и его расположение. График функции должен размещаться по центру экрана и занимать не менее 50 % площади экрана. Оси графика должны быть подписаны. Также ре- комендуется отразить (и подписать) на графике цену деления. Оси координат и подписи к графику необходимо рисовать черным цве- том, а цвет самого графика может быть любым (единственное требование - график должен быть хорошо виден). При написании кода программы следует (по возможности) представлять его в наиболее компактном виде и не использовать избыточное количество пе- ременных. Код программы необходимо сопровождать краткими поясняющими комментариями. В отчет необходимо включить экранный снимок выполнения программы в редакторе Разса!, а также график функции, построенный в табличном процессоре. Пример оформления отчета по лабораторной работе Вариант №16 Задание. Необходимо в редакторе Разса! построить график функции: у — х Выполнить программу и проанализировать результаты ее работы. Решение. Код программы: рго§гат 1аЪ_18_2; {Лабораторная работа 18, задание 2
обучающегося группы БИ-б-о-201 Петрова П.П.} ияез §гар11АВС; уаг сх, §у, хО, уО, к, х1, у 1, е т1е§ег; х,у: геа1; Ьедт сх:=900; {задаем ширину экрана} §у:=700; {задаем высоту экрана} к:=20; {задаем масштаб графика} хеЬхпЫохххм/е^х.су); [задаемразмеры окна} х():=сх (Ну 2; {поиск центра окна, координата х{ уО:=§у (Ну 2; {поиск центра окна, координата у} {Построение осей координат} {Ось х} 1те(0, уО, §х, уО); Ппе('сх, уО, сх-10, у0+10); Ппе(ех, уО, сх-10, у0-10); 1ех1ои1(сх-10. у0-1 10, ’Х’); [подписываем ось х} {Ось у} 1ше(х0, 0, хО, §у); 1ше(х0, 0, хО-Ю, 10); 11пе(хО, 0, х0+10, 10); 1ех1ои1(х0-Ы0, 10, ’У’); {подписываем ось у} {Цикл для создания цены деления осей х и у} е=-15; ххЫ1е 1<16 йо Ье§1п {Цена деления х} 1те(х0+1*к, у0+10, хО+1*к, у0-10); 1ех1ои((хО '-|*к. у0+10, 1пМов1г(1)); {оператор тМоМг превращает число в строку} {Цена деления у} 1Г 1<>0 (йен Ье§т 1те(х0+10, уО+1*к, хО-Ю, уО+1*к); (ех1ои(('х0т|0, уО-1*к, тйо5й-(1)); епй; тс(1); {увеличиваем значение I на единицу} епй; {Построение графика функции} х.=-5; хуМе х<5 йо Ье§т у:=8дг(х)*х; х1 :=хО+гоипй(х*к); {координата х относительно центра} у1:=уО-гоипй(у*к); {координатау относительно центра} $е1репсо1ог(с1гей); Цадаем цвет - красный}
С1ге1е(х1, у1,2); Поос1й11(х1, у1, с1гес1); х-х+0.001; епй; геасПп; епй. Экранный снимок выполнения кода программы в редакторе Ракса! АВС: Я 5>*н>**с **•*>»*•* О X I I I I Н I I I I I I I I 1 1 « 5 < Г I » II 11 11 11 И в График функции, построенный в табличном процессоре: ос .4 «4гср' о гч «4 ос
Выводы. Поскольку график функции, построенный в результате выполнения разработанной программы, совпал с графиком данной функции, построенным в таб- личном процессоре, можно говорить о том, что программа составлена верно. Контрольные вопросы 1. Опишите алгоритм построения графика функции по точкам. 2. С помощью какого оператора можно установить размеры окна? 3. Как вычислить центр экрана? 4. Как создать цену деления осей координат? 5. Для чего служит оператор шН(Ыг? 6. Какие действия выполняет оператор 1ех1ои1?
Тема 10, РЕКУРСИЯ Если поставить два зеркала напротив друг друга и между ними поместить предмет, то получится бесконечное множество изображений, каждое из которых содержит свое собственное. Каждое из этих изображений можно рассматривать как рекурсивный объект, который частично состоит или определяется с помо- щью самого себя. Рекурсивные объекты обладают несколькими свойствами: - простотой построения; - несхожестью конечного результата с начальными данными; - внутренним самоподобием. В математике встречаются рекурсивные определения, позволяющие опи- сать объекты через самих себя. К таким определениям относится, например, определение натурального числа: 1) единица есть натуральное число; 2) число, следующее за натуральным, есть натуральное число. Определение, которое задает некоторый объект в терминах более просто- го случая этого же объекта, называется рекурсивным определением. Мощность рекурсивного определения заключается в том, что оно позво- ляет с помощью конечного высказывания определить бесконечное множество объектов. Как и цикл, рекурсивное определение содержит повторения, но каж- дый раз при этом используются новые данные, т. с. повторения не являются яв- ными. Рекурсия - это способ описания функций или процессов через самих себя. Процесс может быть описан некоторым алгоритмом, называемым в дан- ном случае рекурсивным. В таких алгоритмах выделяется два этапа выполне- ния: 1) «погружение» алгоритма в себя, т. е. применение определения «в об- ратную сторону», пока не будет найдено начальное определение, не являющее- ся рекурсивным; 2) последовательное построение от начального определения до определе- ния с введенным в алгоритм значением. Рассмотрим примеры рекурсивных алгоритмов, часто оформляемых в ви- де процедур и функций. 1. Наиболее распространенным рекурсивным определением является определение факториала (нерекурсивное вычисление факториала приведено в примере Е9): (а)1! = 1, (Ь) п > 0 : п! = п * (п - 1) !
На основе этого определения можно записать программу вычисления факториала, использующую рекурсивную функцию. рго^гат Е42; уаг п, у: ш4е§ег; Гипс11ол Г (х: т(е^ег) : пПе^ег; { описание рекурсивной функции } Ьещп И х= 1 Шеп Г := 1 {вызов для начального определения } еке Р :=х * Р (х - 1) { вызов для предыдущего определения } епй; { конец описания функции } Ье^т { начало главной программы } геасПп (п); У := Г ( п ); { вызов функции в главной протрамме } уугйе (‘ п! - ‘, V) епй. { конец главной программы } Выполним программу Е42 для п = 4. Рекурсивная функция будет работать следующим образом (при вызове функции значение п будет присвоено пере- менной х). Сначала осуществляется «погружение», работает оператор ветви е.1ае условного оператора: 1-й шаг: х = 4, х - 1 = 3, выполняется промежуточное вычисление 4 ! =4 * 3! 2-й шаг: х = 3, х - 1 = 2, выполняется промежуточное вычисление 3 ! =3 * 2! 3-й шаг: х = 2, х - 1 = 1, выполняется промежуточное вычисление 2 ! =2 * 1! 4-й шаг (последний): 1 ! = 1 по начальному определению, работает опера- тор Р:=1 ветви /Леи условного оператора. Следующий этап выполнения рекурсивного алгоритма - построение «прямого» определения, от начального до получения результата с исходными для алгоритма данными (числом 4). При этом осуществляется подстановка предыдущих вычислений (более поздних шагов) в более ранние: 5-й шаг: 2 ! = 2 * 1=2 6-й шаг: 3 ! = 3 * 2 = 6 7-й шаг: 4 !=4*6 = 24- получен результат, он возвращается в главную программу и присваивается переменной У. 2. Вычисление степени с натуральным показателем можно определить рекурсивно: (а)х°=1 (Ь)к>0: хк = х*хы
Этому определению соответствует рекурсивная функция ро\уег ( к, х). Программа имеет вид: рго^гат Е43; уаг у: геа1; п: тге&ег; Гипсйоп рохуег (к: т4е§ег ; х : геа!) : геа1; { описание рекурсивной функ- ции} Ье§ш Ик = 0 Шеп родуег := 1 { начальное определение } еке родуег := х * родуег (к - 1, х ) { рекурсивное определение } епй; { конец описания функции } Ье^ш { начало главной программы } лугИе (‘ основание степени х ); геасПп ( у); уупСе (‘ показатель степени к = ‘ ); геасПп (п)'; лугИе х в степени к ‘, родуег( п, у)) { вызов функции и печать ре- зультата } епй. { конец главной программы } 3. Вычисление чисел Фибоначчи. Итальянский математик Фибоначчи придумал последовательность натуральных чисел: 1, 1, 2, 3, 5, 8, 11, ... Первые два члена последовательности равны единице, а каждый, начиная с третьего, равен сумме двух предыдущих. Для чисел Фибоначчи верно соотношение: Р* =Рк-1+Рк-2 Рекурсивная процедура получения значения л-го числа Фибоначчи имеет вид: Гипсйоп Р1Ь (п: пПе^ег): цйе^ег; Ье^ш Ик<3 Шеп НЬ := 1 еке Р1Ь := Р1Ь (п - 1 ) + РФ (п - 2 ) епй; Для чисел Фибоначчи используется следующее рекурсивное определе- ние: (а) п = 1 , п = 2 : ЙЬ ( п ) = 1 (Ь) п > 2 : йЬ(п) = йЬ(п-2) + йЬ(п-1)
Для того, чтобы определить ЙЬ (6), применяя данное рекурсивное опреде- ление, надо вычислить: ЙЬ (6) = ЙЬ(4) + ЙЬ(5) = ЙЬ(2) + ЙЬ(3) + ЙЬ (5) = = 1 + ЙЬ(3) + ЙЬ(5) - = 1 + ЙЪ( 1) + йЬ(2) + ЙЬ(5)= = 1 + 1 + 1 + ЙЬ(5) = = 3 + ЙЬ(3) + ЙЬ(4) = = 3 + ЙЬ( 1) + ЙЬ (2) + ЙЬ(4) = = 3 + 1 + 1 + ЙЬ(4) = = 5 + ЙЬ(2) + ЙЬ(3) = = 5 + 1 + ЙЬ( 1) + ЙЬ(2) = =6+1+1=8 Количество действий в данных вычисления при использовании рекурсив- ного определения чисел Фибоначчи резко возрастает, потому что это определе- ние ссылается само на себя дважды. При вычислении факториала количество действий при выполнении программы с рекурсивной функцией и примера Е9 одинаково. 4. Рекурсивные алгоритмы могут быть оформлены и в виде процедур. Примером такой процедуры является решение задачи о Ханойских башнях. Рис. 14. Ханойские башни Эта задача связана с легендой о том, что в одном из восточных храмов находится бронзовая плита с тремя алмазными стержнями. На один из них Бог при сотворении мира нанизал 64 диска из чистого золота так, как показано на рис. 14. Жрецы должны переносить диски с одного стержня на другой, следуя следующим законам: 1) диски можно перемещать только по одному; 2) нельзя класть больший диск на меньший.
Согласно легенде, когда все диски будут перенесены с одного стержня на другой, наступит конец света. Решение этой задачи реализовано в виде рекурсивного алгоритма, кото- рый представляет собой инструкцию по перемещению дисков. Сформулируем задачу, присвоив имена стержням (А, В, С) и номера дискам (от 1 до «). Надо перенести диски со стержня А на стержень С, используя В как вспомогатель- ный и следуя приведенным выше правилам переноса дисков. Алгоритм на естественном языке имеет вид: 1. Если п = 0, остановиться. 2. Переместить верхние п - 1 дисков со стержня А на стержень В, исполь- зуя стержень С как вспомогательный. 3. Переместить оставшийся диск со стержня А на С. 4. Переместить п - 1 дисков со стержня В на стержень С, используя стер- жень А как вспомогательный. рго^гаш Е44; уаг к: пйе^ег; ргосейиге Напоу (п: пПе^ег; Опе, Туго, ТЬгее : сЬаг); Ье^п И п > 0 111 еп Ье^ш Напоу (п-1, Опе, ТЬгее, Тмю); мтйе (‘ переместить диск1 , п , 1 со стержня ‘ , Опе, ‘на стержень ‘ , Тмю); Напоу (п - 1, Тмю, Опе, ТЬгее) епй; епй; Ье§ш мтйе (‘введите количество дисков’); геай1п (к); Напоу (к, ‘А’, ‘В’, ‘С’) епй. Результат работы программы для п = 3 - это инструкция из 7 пунктов (п = 4 - инструкция из 15 пунктов): переместить диск 1 со стержня А на стержень С переместить диск 2 со стержня А на стержень В переместить диск 1 со стержня С на стержень В переместить диск 3 со стержня А на стержень С переместить диск 1 со стержня В на стержень А переместить диск 2 со стержня В на стержень С переместить диск 1 со стержня А на стержень С
Вопросы и задания 1. Что такое рекурсивный объект и каковы его свойства? 2. Приведите примеры рекурсивного определения в математике. 3. Что такое рекурсия? 4. Как выполняется рекурсивный алгоритм? 5. Поясните выполнения рекурсивной функции вычисления степени с натуральным показателем. 6. Напишите главную программу для вычисления п - го числа Фибоначчи. 7. Почему использовать рекурсивный алгоритм вычисления и - го числа Фибоначчи невыгодно? 8. Напишите нерекурсивную программу вычисления п - го числа Фибона- ччи, используя три переменные. 9. Определите рекурсивно умножение как сложение и деление как вычи- тание и оформите алгоритмы в виде рекурсивных функций с вызовом из глав- ных программ.
Тема 11. ДИНАМИЧЕСКИЕ СТРУКТУРЫ ДАННЫХ Ссылки. Всю память компьютера можно условно разделить на три части: в первой находятся служебные программы, во второй - программа пользовате- ля, готовая к выполнению и ее данные, а 'третья - свободная область. Програм- ма пользователя всегда располагается с фиксированного адреса памяти, дан- ные - следом за программой. Поэтому свободная область памяти может быть разного размера. Память, занимаемая программой и данными, называется статической, ее размер известен транслятору до выполнения программы. Свободная область памяти называется динамической, она служит для расположения данных и сложных структур, создаваемых в процессе выполнения программы. 1 - память для служебных программ \__________________________________________________/ •в этой памяти расположены программы операционной системы и другие активные программы 2 - программа пользователя на машинном языке, готовая к выполнению, и ее данные \__________________________________________________/ •всегда располагается с одного и того же места памяти (адреса) л х 3 - свободная память для динамических данных \__________________________________________________2 •имеет разный размер и также называется динамической памятью Рис. 15. Условное разделение памяти компьютера: 1 и 2 - статическая, 3 - динамическая Для использования динамической памяти в Паскале имеется ссылочный тип данных. Ссылка - это адрес свободной памяти, по которому можно записать дан- ное или структуру данных (запись). Ссылка (указатель) расположена в области данных программы, ее значение - адрес. Данное, его значение, расположено в динамической памяти. Переменные, являющиеся данными ссылочного типа, также называют динамическими или указателями. Они описываются в разделе данных 1уре.
Описание: 1уре ус=лгеа1; означает, что тип данных ссылочный, его имя \у и по адресу, который бу- дет значением для этого типа данных, расположен формат для вещественной переменной. Для того, чтобы эта переменная получила значение, надо, во-первых, в разделе переменных дать ей имя, например, а, во-вторых, получить с помощью специальной процедуры негу (а); адрес свободной области памяти (это делает транслятор по специальному алгоритму), и, в-третьих, присвоить значение, чтобы в динамической памяти в отведенном шаблоне появилось число или дру- гая константа (запись): уаг а:уу; {уу - переменная ссылочного типа, используемая в про- грамме} Ье^т пеуу(а); (переменная а получает значение - адрес в свободной памяти) а7 := 3.5; {знак Л означает указатель, ссылку, по которому записать значение) уугйе (аЛ); {печатает значение из свободной памяти по указателю - адресу) епй. Существует нулевая ссылка ш1, она записана в ячейке до выполнения процедуры печ'(а); Для уничтожения ссылки имеется процедура 41хроае(а); она разрывает связь между адресом и переменной, которая была сформирована по этому адре- су, второй раз один и гот же адрес не выдается, т. е. процедура пен>(а); каждый раз генерирует новую ссылку. адрес в свободной памяти имя переменной, а значение в шаблоне свободной памяти имя переменной, ал Рис. 16. Связь между переменной ссылочного типа и переменной в динамической памяти Рассмотрим пример программы. Тип м- - ссылочный, это имя типа в раз- деле Гуре, ссылка на вещественную переменную. В разделе переменных две пе- ременных а и Ь - для них транслятор резервирует место в памяти для данных, расположенной сразу за текстом программы на машинном языке (в статичной области 2 рис. 15). Процедуры пелу(а); пелу(Ь); получают адреса свободной па- мяти и помещают их в ячейки с именами, а и Ь. а" и ЬЛ - это имена в свободной памяти, переменные типа геа1. Они получают значения и участвуют в опсрато-
ре присваивания, при распечатывании они могут также быть отформатированы. Ссылки можно присваивать друг другу, как в операторе Ь~а; после его сраба- тывания обе ссылки показывают на одно и то же место динамической памяти, т. е. куда указывала ссылка а (число 3.5). Результат, полученный оператором ЬЛ— а +2; (число 5.5) утерян и недоступен для дальнейшей работы, поскольку, если снова написать псуу(Ь); это будет уже другой адрес. рго^гаш Е45; гуре \у=Лгеа1; уаг а,Ь: уу; Ье^т пеэу(а); пеуу(Ь); ал~3.5; Ь\ = аЛ _|_ 2; итйе(ал:7:2, Ьл:7:2); эугйе1п; Ь:=а; уугйе(аА:7:2, ЬА;7:2); геасПп епй. Одна ссылка может указывать на другую. Модифицируем программу, введем тип данных ссылочный с именем у и соответствующую переменную с в программе. рго^гат Е46; (уре уу=Лгеа1; у-л\у; уаг а,Ь:ду; с:у; Ье§ш пелу(а); пеуу(Ь); пслу(с); аА:—3.5; Ьл:= а'' + 2; уугйе(аА:7:2, Ьл:7:2); уупГе1п; СЛ~Ь; Ь~а; уугйе(аА:7:2, Ьл:7:2, сАА:7:2); геай1п епй. Переменная сА - это ссылка на ссылку Ь, чтобы «добраться» до числа, надо записать имя сАА. Получаем: с (адрес в динамической памяти)-^ сА (другой адрес в динамической памяти)-> с'А (число)
Часто ссылки в программе имеют имена р (от слова ропйег - указатель) и ср Рассмотрим пример. На рис. 17 показана работа программы Е47. рго^гат Е47; гуре р!п1=Лт1е^ег; уаг НпГе^ег; р,д:р1гй; Ье§ш пелу(р); пелу(д); 1-5; рл:=7; :=рл-1; 1-1+1; рл:=Ял+1; д-р; лугйе(дл); геай1п епй. Основная память, распр стеленная транслятором С сылкп на ди намическую память пе\у(р); пе\у(д); | адрес 1 адреса Рис. 17. Работа программы Е47 | адрес 1 ]- Списки. Основной структурой, создаваемой в динамической памяти, яв- ляется список. Список - это совокупность объектов, упорядоченных с помощью ссылок. Список состоит из записей, одно из полей которого ссылочного типа и содержит ссылку на следующий за ним элемент. Последний элемент содержит нулевую ссылку пП. На каждый элемент списка, кроме первого, имеется ссылка только от одного элемента - предшествующего. Вместе с каждым списком рас- сматривается переменная, значение которой является ссылка на первый эле- мент списка. Если список пустой, то значение этой переменной пП. Если эту ссылку уничтожить, то теряется доступ ко всему списку.
Для описания списка в разделе 1уре сначала надо описать ссылку на эле- мент списка - запись, а затем саму запись, которая состоит минимально из двух полей - информационного и ссылочного. В следующих примерах информаци- онное поле назовем гп/, а ссылочное - з1е(1. Рассмотрим пример построения списка из трех элементов (чисел): 5, 12, -8. Для его создания потребуется две ссылки р и ср Ссылкар всегда будет пока- зывать на первый элемент списка, ц - для выделения места в памяти для нового элемента. Список начинает создаваться с последнего элемента -8. •УРе рот! = Л е1ст; е1ет = гесогй тГ: т!е§ег; з1сд: рот! епй; уаг р,д:рот!; рл.тГ рл.81е<1 р рл.51е<1л • имя элемента Рис. 18. Список с указателем на первый элемент р На рис. 18 показан список, состоящий из записей. Каждая запись состоит из двух полей - информационного т/и ссылочного з1е<1. Имя первой записи рЛ, соответственно имена ее полей составляются по правилу: имя записи из раздела уаг, имя поля из раздела !уре На следующую запись показывает ссылка из первой записи, поэтому имя этой записи рЛ.81ейЛ, а ее полей соответственно рл.81ейл.тГ и рл.81ейл.81ей. Оче- видно, что такое построение имен элементов списка можно строить столько, сколько элементов в списке, но это неудобно, поэтому используют не более двух полей-ссылок и вспомогательные ссылки. Для занесения первого элемента в список занесем пустую ссылку в р р:=ш1; {1 } пеуу(д); дЛ.тГ:= -8; дл.81ей~р; р:=д; {на первый элемент показывают ссылки р и д } {2} пеуу(д); дЛ.тГ~12; дл.81ей~р; р:=д; {3} пеуу(д); дл.тР=5; дл.81сй~р; р~д;
Как видно, производятся однотипные действия с «перекоммутацией» ссылок (рис. 19). Рис. 19. Этапы создания списка из трех элементов Рассмотрим пример программы создания списка, элементы которого со- держат квадраты чисел 1, 2, 3, .... и2. Следует обратить внимание, что список формируется с последнего элемента п. рго^гат Е48; 1уре рот!=Ле1ет; е1ет=гесогй тГ: тГе§ег; 81ей: рот! епй; уаг р,д:рот1; 1,п: тГе^ег; Ье^ш {создание списка} уугйеСгг-); геай1п(п); р:=ш1; Гог 1:=п йоуугйо 1 йо Ье§т пелу(ц); дл.тГ:=1*1; дл.81ей:=р; р-д; епй; {печать списка} Ч=р; ууЬПе цош! йо Ье^т ууп!е1п(дл.тГ:5);
д:=дл.81ей; епй: геасПп епй. Со списком можно совершать операции включения новых элементов и исключения элемента. Для просмотра списка и поиска необходимого элемента используется оператор д:=дЛ.81ей; как это сделано в выводе на печать элементов в примере программы Е48. Включение в список. Пусть после числа 5 (рис. 20) надо в список вста- вить число 17. Понадобятся также ссылки р на начало списка и на элемент, после которого надо сделать вставку. Используем еще одну ссылку, чтобы со- здать запись с числом 17 в информационном поле. пеуу(г); г'.тГ-П; гЛ.81е<1:=дЛ.81ес1; {новый элемент показывает на следующий за числом 5} дЛ.81ей:=г; рл.зЫл.зЫ74 - имя элемента Рис. 20. Состояние списка и ссылок после вставки числа 17 в список Исключение из списка. Необходимо исключить элемент, следующий за тем, на который показывает ссылка ср исключим число 12. После оператора дЛ.81ей~г; ссылка с[ показывает на число 17. Исходная ситуация показана на рис. 21.
дл.81ед - имя поля ссылки Рис. 21. Состояние списка перед исключением числа 12 {вводим ссылку на исключаемый элемент} г:=дЛ.81е<1; {обрываем связь между исключаемым элементом и его предшественни- ком} дЛ.81ес1:=дЛ.81ес1Л.81ес1; {обнуляем вспомогательную ссылку, чтобы через нее нельзя было по- пасть в список} гЛ.81ед:=ш1; Включение нового элемента в начало списка'. пеуу(г); гл.тГ:-17; гл.81ед:-р; р:=г; Исключение первого элемента из списка'. г~р; р~рл.81ей; 1^.816(1:=пП; Вопросы и задания 1. Что Вы знаете об условном разделении памяти компьютера? 2. Дайте определение понятию «ссылка». 3. Как в языке Паскаль описываются переменные, являющиеся данными ссылочного типа? 4. Для чего служит процедура пе\у (а);? 5. Какая процедура применяется для уничтожения ссылки? 6. Дайте определение понятию «список». 7. Кратко охарактеризуйте структуру списка. 8. Как описываются списки в Паскаль? 9. Что Вы знаете об операциях включения нового элемента в список и исключения элемента из списка? 10. Выполнить приведенные программы.
11. «Собрать» программу для случая создания списка из чисел 5, 12, -8, распечатать список в виде 5, 12,-8. 12. Добавить в программу вставку в список числа 17, распечатать список. 13. Добавить в программу исключение из списка числа 12, распечатать список. 14. Обобщить полученную программу для создания списка из произволь- ных п целых чисел, ввести число для вставки и после какого числа бу- дет вставка. Распечатать список. 15. Добавить в программу исключение заданного вводом числа из списка и после какого числа будет исключение, распечатать список.
ЛИТЕРАТУРА 1. Грацианова, Т.Ю. Программирование в примерах и задачах: учебное пособие / Т.Ю. Грацианова. - 6-е изд. (эл.). - Москва: Лаборатория знаний, 2020. - 373 с. - Режим доступа: по подписке. - 1ЖБ: Ьпр8://Ь1Ыюс1иЬ.ги/т<1ех.рЬр?ра§е=Ьоок&М=448048. 2. Колокольникова, А.И. Практикум по информатике: основы алгоритмиза- ции и программирования / А.И. Колокольникова. - Москва; Берлин: Директ-Медиа, 2019. - 424 с. - Режим доступа: по подписке. - ЦКЬ: Ьйр8://ЫЫ1ос1иЬ.ги/тдех.рЬр?ра§е=Ьоок&1(1=560695. 3. Комарова, Е.С. Практикум по программированию на языке Паскаль: учеб- ное пособие / Е.С. Комарова. - Москва; Берлин: Директ-Медиа, 2015. - 4.1. - 85 с. - Режим доступа: по подписке. - ГРЕ: Ьпр8://ЫЫюс1иЬ.ги/тдех.рЬр?ра8е=Ьоок&1с1=426942. 4. Комарова, Е.С. Практикум по программированию на языке Паскаль: учеб- ное пособие / Е.С. Комарова. - Москва; Берлин: Директ-Медиа, 2015. - Ч. 2. - 123 с. - Режим доступа: по подписке. - 11 КГ: Ыгр8://Ь1Ы1ос1иЬ.ги/т<1ех.рЬр?ра§е=Ьоок&1с1=426943. 5. Митина, О.А. Программирование: методические указания / О.А. Митина, Т.Л. Борзунова; Министерство транспорта Российской Федерации, Мос- ковская государственная академия водного транспорта. - Москва' Альтаир: МГАВТ, 2015. - 61 с. - Режим доступа: по подписке. - 11КЕ: Ьпр8://ЫЫюс1иЬ.ги/т<1ех.р11р?ра§е=Ьоок&М=429764. 6. Царев Р. Ю. Алгоритмы и структуры данных (СПЮ) / Р.Ю. Царев, А.В. Прокопенко; Министерство образования и науки Российской Федерации, Сибирский Федеральный университет. - Красноярск: СФУ, 2016. - 204 с. - Режим доступа: по подписке. - 11КЕ: Ь1гр://ЫЫ1ос1иЬ.ги/тдех.рйр?ра§е=Ьоок&1д=497016.
(ч/Г\ Инфра-Инженерия \ ф ъ// Издательство технической литературы Издательство предлагает учебную литературу последующим направлениям: • 1Т. Информатика • Авиационная и ракетно-космическая техника • Автоматизация • Автомобильная техника • Арматура. Трубопроводы • Бетоны • Бурение нефтяных и газовых скважин • Вооружение. Радиоэлектронные системы. • Газовое хозяйство • Геодезия, картография и маркшейдерское дело • Геология. Геофизика. Геохимия • Горное дело • Железнодорожный транспорт • Лесная промышленность • Логистика • Машиностроение • Медицина и биоинженерия • Металлургия • Нефтегазовая промышленность • Педагогика. Психология • Пищевая промышленность • Промышленная безопасность. Охрана труда • Разработка и эксплуатация нефтяных и газовых месторождений • Сварочное дело • Словари • Сети и коммуникации. Волоконно-оптическая техника • Строительство • Судостроение • Транспортное строительство. Дороги. Мосты. Тоннели • Физико-математические науки • Химия. Химические технологии • Экология. Безопасность жизнедеятельности • Экономика. Управление. Электронная коммерция • Электроника • Электро- и теплоэнергетика Интернет-магазин ш^га-е.ги УУКа^зАрр УК Те1е^гат Телефон 8-800-250-66-01 8 911-512 48-48 Более 2000 выпущенных книг по 50 темам и направлениям Доставляем наши книги по всей России от Калининграда до Камчатки, а также в страны СНГ Нам доверяют более 90 учебных заведений в России и за рубежом


Учебное издание Наталья Владимировна Апатова Мария Александровна Бакуменко АЛГОРИТМИЗАЦИЯ И ПРОГР АММИРОВАНИЕ Учебное пособие 13ВБ 978-5-9729-2228-4 Подписано в печать 28.06.2024 Формат 60x84/16. Усл. печ. л. 12,56. Печать по требованию. Бумага офсетная. Гарнитура «Таймс». Издательство «Инфра-Инженерия» 160011, г. Вологда, ул. Козленская, д. 63 Тел.: 8 (800) 250-66-01 Е-таП: Ьоокт§@тГга-е.ги Ьйр5://т&а-е.ги Издательство приглашает к сотрудничеству авторов научно-технической литерах уры