Камчатский государственный технический университет Кафедра информационных систем
В.В. Портнягина, Н.Н. Портнягин
ПРАКТ...
195 downloads
1481 Views
1MB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Камчатский государственный технический университет Кафедра информационных систем
В.В. Портнягина, Н.Н. Портнягин
ПРАКТИКУМ ПО ПРОГРАММИРОВАНИЮ НА ЯЗЫКЕ TURBO PASCAL Часть 1 2-е издание Рекомендовано Дальневосточным региональным учебно-методическим центром в качестве практикума для студентов специальности 220201 «Управление и информатика в технических системах» вузов региона
Петропавловск-Камчатский 2008 1
УДК 681.3(07) ББК 32.973-018 П60 Рецензенты: И.Г. Проценко, доктор технических наук, заместитель директора по научной работе Камчатского центра связи и мониторинга И.А. Рычка, кандидат физико-математических наук, доцент кафедры информационных систем КамчатГТУ
Портнягина Вера Васильевна П60
Практикум по программированию на языке Turbo Pascal. Ч. 1: Практикум. – 2-е изд. / В.В. Портнягина, Н.Н. Портнягин. – Петропавловск-Камчатский: КамчатГТУ, 2008. – 105 с. ISBN 5–328–00112–5 Практикум предназначен для приобретения практических навыков алгоритмизации задач и программирования на языке Turbo Pascal студентами специальности 220201 «Управление и информатика в технических системах». В нем приводятся основные приемы и методы программирования, описываются операторы ввода– вывода значений простых типов данных, делается акцент на форматированный вывод информации. Рассмотрены операторы условного перехода, множественного выбора, вопросы организации циклов, в частности итерационных циклов. Из сложных типов данных рассмотрены массивы. Дается описание языка Turbo Pascal. Практикум содержит более 200 задач для самостоятельного решения, систематизированных в соответствии с используемыми темами и объединенных в семь работ. Приведены вопросы для защиты каждой из семи лабораторных работ. УДК 681.3(07) ББК 32.973-018
ISBN 5–328–00112–5
© КамчатГТУ, 2006 © Портнягина В.В., 2006 © Портнягин Н.Н., 2006 © КамчатГТУ, 2008 © Портнягина В.В., 2008 © Портнягин Н.Н., 2008
2
СОДЕРЖАНИЕ Введение ........................................................................................................... 4 Лабораторная работа № 1 Интегрированная среда программирования на языке высокого уровня Паскаль ............................................................... 5 Лабораторная работа № 2 Организация работы программ линейной структуры ................................. 15 Лабораторная работа № 3 Условный оператор (развилка) ...................................................................... 38 Лабораторная работа № 4 Оператор множественного выбора CASE … OF ......................................... 51 Лабораторная работа № 5 Организация работы программ циклической структуры .................................................................................. 57 Лабораторная работа № 6 Организация итерационных циклов в программе ........................................ 80 Лабораторная работа № 7 Сложные типы данных (массивы) ................................................................. 86 Литература ....................................................................................................... 104
3
Введение Есть языки программирования, ориентированные на определенную область применения. Практика показала, что Паскаль в широком смысле слова – универсальный язык. Язык программирования должен облегчать создание больших программ, разрабатываемых, возможно, несколькими программистами, что также обеспечивает язык программирования Паскаль. Присущий языку Паскаль стиль программирования полностью определяется используемыми в нем типами данных, их организацией. Чтобы овладеть навыками программирования, необходимо понять концепцию организации данных, принятую в языке, как важнейший аспект программирования. Практикум по программированию включает 7 лабораторных работ, в которых рассматриваются задачи с использованием типов данных: простых и сложных (массивов). В лабораторной работе № 1 дается представление об интегрированной среде программирования языка Паскаль, в которой происходит подготовка текста программы, отладка и компиляция. В лабораторной работе № 2 рассматриваются программы линейной структуры, дается описание операторов ввода – вывода значений стандартных типов данных с акцентом на форматированный вывод информации, рассмотрены вопросы по оформлению текста, выводимого на экран дисплея. Работа включает для самостоятельного решения 16 вариантов – по три задачи в каждом варианте. В лабораторной работе № 3 рассматриваются программы с условием. Здесь описываются операторы с полной и неполной формами ветвления. Работа включает для самостоятельного решения 16 вариантов – по три задачи в каждом варианте. В лабораторной работе № 4 рассматриваются программы, в которых для организации ветвления используется оператор множественного выбора. Работа включает для самостоятельного решения 16 задач. В лабораторной работе № 5 рассматриваются программы циклической структуры, организация цикла с помощью оператора while (цикла с предусловием), оператора repeat (цикла с постусловием), оператора for (цикла с параметром), а также структуры программ, содержащей вложенные циклы. Работа включает для самостоятельного решения 16 вариантов – по три задачи в каждом варианте. В лабораторной работе № 6 рассматриваются способы задания числовой последовательности, программы с использованием для своей реализации итерационных циклов. Работа включает для самостоятельного решения 16 задач. В лабораторной работе № 7 рассматриваются программы, в которых используется сложный тип данных – массивы (одномерные и двумерные). Работа включает для самостоятельного решения два задания. Задание № 1 включает 16 вариантов – по три задачи в каждом варианте. Задание № 2 включает два задания для четных и нечетных номеров. В каждой из работ даны вопросы для защиты соответствующей лабораторной работы и для контроля понимания студентом пройденной темы. 4
ЛАБОРАТОРНАЯ РАБОТА № 1 ИНТЕГРИРОВАННАЯ СРЕДА ПРОГРАММИРОВАНИЯ НА ЯЗЫКЕ ВЫСОКОГО УРОВНЯ ПАСКАЛЬ Цели рабты 1. Знакомство с интегрированной средой программирования (IDE), комбинациями клавиш. 2. Знакомство с работой редактора текстов, командами IDE. 3. Знакомство с компиляцией программы. 4. Изучение порядка действий при смене каталога. Теоретический материал 1. Общие положения Процесс создания программы на языке высокого уровня состоит из следующих этапов: – создание/модификация алгоритма; – кодирование алгоритма на выбранном языке программирования; – компиляция исходного текста; – запуск исполнимого модуля; – анализ результатов и отладка. Пакет прикладных программ Borland Pascal 7.0 позволяет удобно проводить все, кроме первого, этапы этого процесса. Все средства, необходимые для написания программ, а именно: редактор, компилятор, отладчик и система контекстно-зависимой помощи – объединены в одну программу, называемую интегрированной средой разработки (Integrated Development Enviroment – IDE). IDE (для MS-DOS) поставляется в трех вариантах: 1) Turbo.Exe – содержит компилятор для реального режима DOS, использует память только в пределах первого мегабайта; имеет функцию компиляции программы без записи результата на диск; предназначена для малопроизводительных машин; 2) TPx.Exe – расширенная версия Turbo.Exe, использующая при компиляции верхнюю память; 3) BP.Exe – наиболее мощная IDE, содержащая компилятор для трех режимов исполнения: – в реальном режиме DOS; – в защищенном режиме DOS; – в среде Windows . Разница между ними фактически незначительна. Как правило, все они (или один) находятся в подкаталоге /Bin/ каталога Borland Pascal (обычно Turbo или BP). 5
Чтобы запустить Turbo Pascal, нужно в строке приглашения MS DOS набрать BP.EXE (или TURBO.EXE) и нажать клавишу < ENTER >, предварительно указав путь к каталогу, где находится эта программа. В результате этих действий на экране монитора появится окно редактора текста исходной программы (рис. 1). Исходный текст программы часто называют кодом, а окно редактора текста программы – окном редактора кода. В окне редактора набирается текст программы. 1.1. Начало работы В верхней части окна редактора кода Turbo Pascal (рис. 1.) находится строка главного меню, где перечислены названия групп команд, которые используются во время работы в среде программирования, как-то: – группы File используются для выполнения действий с файлами; – группы Compile – для компиляции исходной программы в выполняемую; – группы Options – для настройки среды программирования.
Рис.1 Внешний вид окна редактора текстов: 1 – окно редактирования; 2 – комментарии в фигурных скобках; 3 – непосредственно операторы языка; 4 – строка меню – способ выбора действий пользователя, которая вызывается клавишей F10 или мышью; 5 – строка состояния – подсказка и способ быстрого вызова наиболее частых действий; 6 – кнопка развертки-свертки окна мышью; 7 – номер окна
Выбрать нужную команду можно при помощи клавиатуры или мышки. Клавиатура. Чтобы выбрать и выполнить нужную команду при помощи клавиатуры, необходимо: – нажать клавишу < F10 > (в результате один из пунктов меню будет выделен цветом); – используя клавиши перемещения курсора влево и вправо, выделить название нужного пункта меню и нажать клавишу < Enter > (в результате этого появится список команд выбранного пункта меню); – используя клавиши перемещения курсора вверх и вниз, выделить название нужной команды и нажать клавишу < Enter >. 6
Мышка. Чтобы выбрать и выполнить нужную команду при помощи мышки, необходимо: – установить указатель мышки на название нужного пункта меню и щелкнуть (нажать и отпустить) левой кнопкой мышки (появится список команд выбранного пункта меню); – установить указатель мышки на название нужной команды и щелкнуть левой кнопкой мышки. 1.2. Интерфейс IDE IDE представляет собой специализированный многооконный текстовый редактор (внешний вид экрана в ней приведен на рис. 1). Запомнив (однозначный) номер окна, можно быстро переключиться в него, нажав Alt и цифру с номером, после чего Alt + 0 выдает на экран окошко со списком всех существующих (открытых) окошек. 1.3. Комбинации клавиш Управление можно производить не только через меню, но и с помощью горячих клавиш и их комбинаций, представленных в табл. 1. Таблица 1 Комбинация клавиш F1 Ctrl + F1 F2 Shift + F2 F3 F5 Alt + F5 F7 Ctrl + F7 F8 Ctrl + F8 F9 Ctrl + F9 F10
Действия Помощь Помощь к слову, на котором стоит курсор Сохранение файла в текущем окне Сохранение с другим именем Открытие файла Распахнуть/свернуть окошко Переключение в пользовательский экран Выполнение шага трассировки (с заходом в процедуры) Добавление переменной в окно Watch – просмотра текущих значений переменных Выполнение шага трассировки (или функции/процедуры целиком) Поставить/удалить точку останова Компиляция программы Запуск программы с предварительной компиляцией (при необходимости) Обращение к меню IDE
2. Подготовка текста программы Чтобы приступить к набору текста новой программы, надо из меню File (файл) выбрать команду New (новый) (рис. 2). В результате будет открыто новое окно редактора текстов. Редактор текста интегрированной среды разработки автоматически выделяет ключевые слова языка программирования Turbo Pascal (var, begin, end и др.) цветом, что делает текст программы более выразительным, облегчает восприятие структуры программы. 7
Кроме ключевых слов редактор выделяет комментарии. Как только программист напечатает символ комментария (открывающую фигурную скобку), текст, стоящий после этой скобки, меняет свой цвет. После того как программист поставит закрывающую скобку комментария, текст, стоящий после этой скобки, приобретает обычный вид. Ошибочно введенный символ можно удалить при помощи клавиши < Backspace >, предварительно установив курсор после этого символа. Чтобы добавить пропущенный символ, нужно установить курсор в ту позицию экрана, где он должен быть, и Рис. 2. Команды меню File нажать соответствующую клавишу. 2.1. Работа с фрагментом текста Фрагмент текста – это выделенная часть текста: символ, часть слова, слово, строка или несколько строк. Фрагмент текста можно переместить, скопировать или удалить. Команды, используемые при работе с фрагментами текста, находятся в меню Edit (правка) (рис. 3). Перед тем как переместить, скопировать или удалить фрагмент текста, необходимо этот фрагРис. 3. Команды меню EDIT мент выделить. 2.2. Выделение фрагмента текста Чтобы выделить фрагмент текста при помощи клавиатуры, необходимо: 1. Используя клавиши перемещения курсора, установить курсор на символ, с которого начинается фрагмент. 2. Нажать клавишу < Shift > и, удерживая ее и используя клавиши перемещения курсора, поместить курсор на последний символ фрагмента. 3. Отпустить клавишу < Shift >. Чтобы выделить фрагмент текста при помощи мыши, необходимо: 1. Перемещая мышь, установить указатель мыши на символ, с которого начинается фрагмент. 2. Нажать левую кнопку мыши и, удерживая ее, поместить указатель мыши на последний символ фрагмента. 3. Отпустить кнопку мыши. 2.3. Перемещение фрагмента текста Чтобы переместить фрагмент текста, необходимо: 1. Выделить фрагмент текста. 2. Из меню Edit выбрать команду Cut (вырезать). В результате этого выделенный фрагмент текста будет удален с экрана и помещен во внутренний буфер редактора. 8
3. Установить текстовый (мигающий) курсор за тем символом текста, после которого нужно поместить вырезанный фрагмент текста. Это можно сделать, перемещая курсор с помощью клавиш перемещения курсора или помещая указатель мыши в нужное место текста и щелкая левой кнопкой мыши. 4. Из меню Edit выбрать команду Paste (вставить). 2.4. Копирование фрагмента текста Чтобы скопировать фрагмент текста в другое место, необходимо: 1. Выделить фрагмент текста. 2. Из меню Edit выбрать команду Copy (копировать). В результате этого копия выделенного фрагмента будет помещена во внутренний буфер редактора. 3. Установить текстовый курсор за тем символом текста, после которого нужно поместить копию выделенного фрагмента. Это можно сделать, перемещая курсор с помощью клавиш перемещения курсора. Можно также поместить указатель мышки в нужное место текста и щелкнуть левой кнопкой мышки. 4. Из меню Edit выбрать команду Paste (вставить). 2.5. Удаление фрагмента текста Чтобы удалить фрагмент текста, необходимо: 1. Выделить фрагмент текста. 2. Из меню Edit выбрать команду Clear (очистить). Выделенный фрагмент текста будет удален с экрана. 2.6. Отмена команды редактирования Если вы случайно выполнили операцию, которая вам нежелательна (удалили нужный фрагмент текста или переместили его не туда, куда надо), то можно отменить выполненную команду. Для этого из меню Edit надо выбрать команду Undo (отменить). 3. Использование справочной системы При наборе текста программы можно воспользоваться встроенной справочной системой. Для получения справки по ключевым словам языка программирования надо поместить курсор на любую букву этого слова и, удерживая нажатой клавишу < Ctrl >, нажать < F1 >. Например, для получения справки о типе integer нужно поместить курсор на любую букву этого слова и нажать < Ctrl > + < Fl >. 4. Сохранение текста программы Набранный текст программы следует сохранить на диске. Для этого надо из меню File (файл) выбрать команду Save (сохранить) (рис. 2). В результате этого на экране (рис. 4) появляется диалоговое окно Save File As (сохранить как). В нижней части окна Save File As указывается имя текущего каталога. Если текущий каталог является каталогом, предназначенным для хранения текстов программ, то в поле Save File As (сохранить как) следует ввести имя файла (с расширением pas) и нажать < Enter > или щелкнуть на кнопке ОК. 9
При написании имени файла следует придерживаться следующих правил: 1. В имени файла допускается использовать только буквы латинского алфавита и цифры, причем первым символом должна быть буква. 2. Количество символов имени файла (без учета точки и расширения pas) не должно превышать восьми. 3. Имя файла должно быть связано с его содержимым. Например, текст программы решения квадратного уравнения можно сохранить в файле kvadr.pas или sqrt.pas.
Рис. 4. Диалоговое окно Save File As
5. Смена каталога Если текст программы надо сохранить в другом каталоге или на другом диске компьютера, то перед выполнением команды Save (сохранить) нужно сменить текущий каталог. Чтобы это сделать, надо из меню File (рис. 2) выбрать команду Change dir (сменить каталог) (рис. 5). Затем в появившемся окне Change directory (смена каталога) Рис. 5. Диалоговое окно Change Directory в списке Directory tree (дерево каталогов) выбрать нужный каталог (щелкнуть мышью на имени каталога) и щелкнуть на кнопке OK (рис. 5). Если нужный каталог находится на другом диске, то надо сначала выбрать строку Drives (диски) и щелкнуть на кнопке OK. Затем в открывшемся списке дисков компьютера выбрать нужный диск. После этого можно выбрать нужный каталог. 6. Загрузка текста программы Если исходная программа находится на диске, то для того, чтобы с ней работать, надо загрузить в редактор текста файл, в котором эта программа находится. Для этого надо из меню File выбрать команду Open (открыть) и в появившемся диалоговом окне Open a File (рис. 6) ввести в поле Name (имя) имя нужного файла. Затем щелкнуть на кнопке Open или нажать клавишу < Enter >. Имя файла можно ввести обычным образом. Однако проще выбрать имя файла из списка. Для этого надо переместиться в список Files (файлы), нажав клавишу < Таb > или щелкнув в поле списка, затем выделить имя нужного 10
файла и нажать < Enter > или сделать двойной щелчок (дважды быстро нажать и отпустить левую кнопку мыши) на имени файла. Поле ввода текста
Кнопка «Закрыть окно»
Выделенный элемент списка
Командные кнопки
Полоса прокрутки списка
Поле вывода (информационное)
Индикатор положения выделенного элемента
Рис. 6. Диалоговое окно Open a File c указанием элементов окна
Если файлов с программами в текущем каталоге много, то возможно, что имени нужного файла в поле списка на экране не видно. В этом случае следует прокрутить список до тех пор, пока не появится имя нужного файла. Если нужно открыть файл с программой, а в окне редактора находится программа, работа с которой уже завершена, то вместо кнопки Open (открыть) надо использовать кнопку Replace (заменить). 7. Компиляция Компиляция программы осуществляется при помощи команды Compile (компилировать) меню Compile. Если в тексте программы компилятор не нашел синтаксических ошибок, то генерируется исполняемый файл программы . Turbo Pascal 7.0 поддерживает два режима компиляции: – в память компьютера (Memory); – на диск (Disk). Компиляция в память выполняется быстрее, чем компиляция на диск. Однако при этом выполняемая программа может быть запущена только из среды программирования. Компиляция в память используется обычно при отладке программы. 11
При компиляции на диск компилятор создает выполняемую программу и записывает ее на диск, в файл с расширением ЕХЕ. Таким образом, созданная компилятором программа может быть загружена в память компьютера и выполнена позже, но уже без использования среды программирования. Файлу выполняемой программы автоматически присваивается такое же имя, как и у файла исходного текста программы, но расширение PAS заменяется на ЕХЕ. Файл выполняемой программы создается в каталоге, имя которого было задано при настройке среды программирования. 7.1. Ошибки времени компиляции Во время компиляции текст программы проверяется на отсутствие синтаксических ошибок. После исправления ошибки можно повторить компиляцию. Таким образом, исправляя обнаруживаемые компилятором ошибки и повторно проводя компиляцию, можно устранить все синтаксические ошибки в тексте программы. Ниже в табл. 2 приведены сообщения о наиболее типичных ошибках. Таблица 2 Сообщение компилятора 3: Unknown identifier. (неизвестный идентификатор)
Вероятная причина Используется переменная, не объявленная в разделе var программы; ошибка при написании имени объявленной переменной. Например, в разделе var объявлена переменная Summa, а в тексте программы написано Suma: = .... Ошибка при написании имени инструкции, например: вместо write написано wirte 8: String constant exceeds line. При записи строковой константы не поставлена за(строковая константа вершающая кавычка, например: в операторе write('Цена с превышает допустимую учетом скидки, Сеnа) после последнего символа сообщедлину) ния не поставлен завершающий апостроф 26: Type mismatch. В инструкции присваивания тип выражения не соот(несоответствие типов) ветствует или не может быть приведен к типу переменной, получающей значение выражения 85: ";" expected. Не поставлен символ «точка с запятой» после инст(ожидается символ рукции «точка с запятой») 113: Error in statment. Неверный синтаксис оператора, например: поставлен (ошибка в выражении) символ «точка с запятой» перед else условной инструкции if 10: Unexpected end of file. Нет символа «точка» после последнего слова end про(he найден конец файла) граммы; в конце программы нет слова end, за которым следует символ «точка»
8. Пробный запуск программы на выполнение Если компиляция программы завершена успешно, то можно выполнить пробный запуск выполняемой программы. Перед пробным запуском программы сохраните текст исходной программы в файле. Чтобы запустить на выполнение программу, текст которой находится в окне редактирования, надо из меню Run (выполнить) выбрать команду Run. 12
В результате запуска программы с экрана исчезает окно Turbo Pascal и появляется так называемое окно пользователя. В это окно программа выдает сообщения (результат выполнения инструкций Write и WriteLn), из этого окна она получает от пользователя необходимые данные (инструкции Read и ReadLn). По завершении работы запущенной программы вновь появляется главное окно Turbo Pascal. Посмотреть результат работы программы можно, переключившись в окно пользователя. Для этого необходимо из меню Debug (отладка) выбрать команду User Screen (окно пользователя) или, удерживая нажатой клавишу < Alt >, нажать клавишу < F5 >. Вернуться в главное окно из окна пользователя можно, нажав клавишу < Esc >. Чтобы по завершении программы окно пользователя не исчезало сразу с экрана, добавьте в конец текста программы следующие инструкции: WriteLn('Программа завершила работу'); WriteLn('Нажмите < Enter >') ; ReadLn. 8.1. Ошибки времени выполнения программы Отсутствие в тексте программы синтаксических ошибок и генерация компилятором исполняемого файла программы не являются гарантией отсутствия ошибок в программе. Ошибки в программе могут проявляться во время ее работы. Такие ошибки называются ошибками времени выполнения программы (runtime error). Причиной ошибок времени выполнения являются, как правило, ошибки в логике алгоритма, положенного в основу программы, или неверные исходные (входные) данные. В случае возникновения ошибки времени выполнения программа завершает работу и на экран выдается сообщение об ошибке. Например, если в программе пересчета расстояния из миль в километры расстояние в милях ввести не числом, а, к примеру, словом «полтора», то произойдет ошибка и на экран будет выведено сообщение типа «Runtime error 106 at ..». Ниже в таблице приведены типичные сообщения об ошибках времени выполнения программы с пояснениями возможных причин. Таблица 3 Сообщение об ошибке Описание Вероятная причина Runtime error 106 at... Invalid numeric format. Программа ожидает ввода числа ти(неверный числовой па integer, однако введено число в формаформат) те real или строка, не являющаяся числом Программа ожидает ввода числа в формате real, однако введена строка, не являющаяся числом Runtime error 200 at... Division by zero Второй операнд (делитель) операто(деление на ноль) ра деления в процессе выполнения программы стал равен нулю
13
9. Запуск программы на исполнение С помощью команды Run меню Run запускается программа, текст которой находится в окне редактора. Чтобы иметь возможность использовать созданную программу вне среды программирования (не запуская Turbo Pascal и не загружая текст программы в редактор), нужно создать исполняемый файл программы. Для этого требуется установить режим компиляции «на диск» и выполнить повторную компиляцию программы. В результате в каталоге, предназначенном для хранения файлов выполняемых программ, появится файл, имя которого будет совпадать с именем файла исходной программы и расширением ЕХЕ. После этого созданная программа может быть запущена из Norton Commander, DOS, Windows обычным образом. 10. Завершение работы Чтобы завершить работу со средой программирования Turbo Pascal 7.0, нужно из меню File (файл) выбрать команду Exit (выход). 11. Контрольные вопросы 1. Перечислите этапы создания программы. 2. Что такое интегрированная среда разработки (IDE) и каково ее назначение? 3. Перечислите правила записи имени программы на языке Паскаль. 4. Какие команды входят в строку главного меню? 5. Как перейти из окна редактора в пользовательский экран? 6. С помощью какой команды можно сделать корректировку файла? 7. Что такое фрагмент текста? 8. Как выделить фрагмент текста? 9. Какие операции можно делать с фрагментом текста? 10. Как скопировать фрагмент текста? 11. Как переместить фрагмент текста? 12. Как скопировать фрагмент текста? 13. Как удалить фрагмент текста? 14. Как отменить любую команду редактирования? 15. Как сохранить текст программы на языке Паскаль? 16. Как перейти на другой диск в окне сохранения программы? 17. Как изменить текущий каталог в окне сохранения программы? 18. Как загрузить текст программы на языке Паскаль в окно IDE? 19. Какой командой запускается программа на компиляцию из среды IDE? 20. Перечислите типы ошибок в программе. 21. Для чего служит компилятор? 22. Как выйти из среды IDE? 12. Практическое задание 1. Запустить среду программирования Паскаль (программа BP.EXE) 2. В меню File окна редактора выбрать команду New, с помощью которой создать новый файл. 14
3. В открывшемся окне набрать текст программы: Program Lab_1; Begin WriteLn (‘Good luck’); ReadLn; End. 4. Программу Lab_1 надо сохранить в вашем корневом каталоге, который находится на диске H. Для того чтобы сменить каталог, необходимо: – вызвать команду Change dir; – перейти на строку Drives и выбрать диск H; – нажать OK. 5. Созданный файл сохранить под именем Lab_1.PAS. Для этого надо вызвать меню File, в открывшемся меню выбрать команду Save As. В появившемся диалоговом окне ввести в поле Name имя программы Lab_1.PAS.
ЛАБОРАТОРНАЯ РАБОТА № 2 ОРГАНИЗАЦИЯ РАБОТЫ ПРОГРАММ ЛИНЕЙНОЙ СТРУКТУРЫ Цели работы 1. Освоение построения программы линейной структуры. 2. Знакомство с простыми типами данных (real, integer, boolean, char). 3. Знакомство с работой оператора присваивания, арифметическими операциями и встроенными функциями для работы с числовыми типами данных. 4. Получение навыков в организации ввода/вывода значений стандартных типов данных. 5. Получение практических навыков работы в диалоговом режиме. 6. Подключение модуля CRT, изучение порядка действий при выводе данных на экран дисплея (управление курсором, задание цвета фона экрана и цвета текста, выводимого на экран). Теоретический материал 1. Структура программы на Паскале В программе могут быть следующие разделы, каждый из которых, кроме последнего, завершается точкой с запятой: – заголовок программы; – раздел объявления типов; 15
– раздел объявления переменных; – раздел операторов (обязательная часть). Кроме операторов программа будет содержать комментарии. В языке Паскаль комментарии заключают в фигурные скобки, которые при выполнении программы никаких действий не выполняют.
РROGRAM < ИМЯ > ОПИСАНИЕ ДАННЫХ BEGIN РАЗДЕЛ ОПЕРАТОРОВ
1.1. Операторные скобки END. В языке Паскаль под операторными Рис. 7. Схематичное изображение скобками понимают два служебных слова: структуры программы на Паскале Begin (открывающая скобка) и End (закрывающая скобка). Составной оператор – это последовательность произвольных операторов программы, заключенная в операторные скобки BEGIN и END. Следует отметить, что составные операторы – важный инструмент языка, дающий возможность писать программы по современной технологии структурного программирования. На характер операторов, входящих в составной оператор, не накладывается никаких ограничений. Среди них могут быть и другие составные операторы языка. Допускается также произвольная глубина вложения составных операторов. Фактически весь раздел операторов представляет собой один составной оператор. Количество слов «Begin» совпадает с количеством слов «End». Для того чтобы избежать ошибки при составлении программы, пишите каждую пару «Begin–End» с одной позиции. При наличии большого количества подобных пар можно ставить номера в комментарии так, как показано на схеме. 2. Структура данных на Паскале. Типы данных Данные – это информация, представленная в формальном виде, который обеспечивает возможность ее хранения, обработки и передачи. В языке Паскаль любая константа, переменная, значение функции или выражения характеризуется своим типом. Используемые различные типы данных в PASCAL имеют огромное значение при программировании, так как определяют способы и алгоритмы обработки этих данных. Под типом данных понимается множество допустимых значений переменных, а также совокупность операций над ними. Константа (англ. constant) – это величина, значения которой не изменяются в период ее существования. Значения переменных предварительно описываются в разделе описания переменных CONST. Переменная (англ. variable) – это некоторая величина, значения которой могут изменяться, принимая в процессе изменения некоторые значения. 16
Приступая к решению задач , следует помнить, что: – каждая переменная программы должна быть объявлена; – объявления переменных помещают в раздел описания переменных, который начинается словом Var; – инструкция объявления переменной выглядит так: Имя Переменной: Тип; – в имени переменной можно использовать буквы латинского алфавита и цифры (первым символом должна быть буква); – основными числовыми типами языка Turbo Pascal являются Integer (целый), Real (вещественный); – после инструкции объявления переменной рекомендуется указывать назначение переменной. 2.1. Простые типы данных К простым относятся: – целые типы – Shortint, Integer, Longint, Byte, Word; – вeщественныe типы – Real, Single, Double, Extended, Comp; – логические типы – Boolean; – символьный тип – Char. Простые типы данных можно разделить на порядковые и вещественные. Все простые типы, кроме вещественных, называются порядковыми. Здесь каждое значение можно сопоставить с некоторым целым числом – порядковым номером значения. 2.2. Целые типы данных В Pascal 7.0 введено 5 стандартных целых типов, которые отличаются форматами и диапазонами допустимых значений (табл. 4). Таблица 4 Тип Shorint Integer Longint Byte Word
Значение
Формат –128…127 Знаковый –32 768…32 767 Знаковый –2 147 483 648…2 147 483 647 Знаковый 0…255 Беззнаковый 0…65 535 Беззнаковый
Характеристика Короткое целое (8 бит) Целое (16 бит) Длинное целое (32 бит) Короткое целое (8 бит) 16 бит
В последней колонке табл. 4 показано, что числу каждого диапазона отводится фиксированное количество разрядов в памяти ЭВМ. Это позволяет эффективно использовать память и влиять на скорость вычислений. Все целые типы являются упорядоченными, поэтому к их значениям применимы две специальные функции Succ(I) и Pred(I), где I – целое, возвращающие следующее и предшествующее I целые числа. Чаще всего целые числа используются в простых арифметических выражениях и выступают в программах в качестве различных счетчиков и значений индексов. Над ними определены пять основных операций, результатами которых являются также целые числа: 17
– сложение (+); – вычитание (–); – умножение (*) – частное от деления (div); – остаток от деления (mod). Все пять операций – двухместные (бинарные), т. е. применимы к двум аргументам, но операции сложения и вычитания могут использоваться и как одноместные (унарные). При изменении знака числа, например, допустима запись: а: = – а. При делении с точностью до целых получаются два результата: частное и остаток. Операция div обозначает целочисленное деление. Знак результата берется по обычным правилам, а полученный остаток игнорируется, например: 15 div 2 = 7; 3 div 7 = 0; (–9) div 4 = –2; (–9) div (–4 ) = 2. Операция mod дает остаток при делении двух целых чисел: 15 mod 2 = 1; 3 mod 7 = 3; (–9) mod 4 = –1; 9 mod 3 = 0. Операции *, div, mod имеют одинаковый, более высокий приоритет, а операции (+) и (–) имеют также одинаковый, но более низкий приоритет. Приоритеты можно менять с помощью круглых скобок. 2.3. Вещественный тип данных В Pascal 7.0 определено 5 стандартных вещественных типов, которые отличаются форматами и диапазонами допустимых значений (табл. 5). Таблица 5 Тип Real Single Double Extended Comp
Значение 2.9*10–39…1.7*1038 1.5*10–45 ...3.4*1038 5.0*10–324...1.7*10308 3.4*10–4932..1.1*104932 –2–63+1...2 +63–1
Число значащих цифр 11–12 7–8 15–16 19–20 19–20
Длина байт 6 4 8 10 8
Результат работы функций сложения, умножения, деления, вычитания и возведения в квадрат вещественных чисел дает вещественное число. Областью значений вещественного типа является подмножество множества всех вещественных чисел. Оно не является упорядоченным. Для представления чисел из широкого диапазона, от очень маленьких до очень больших, привычное представление с фиксированной запятой не подходит, так как любой вещественный тип в ЭВМ должен иметь ограничение на количество знаков. Если выводятся числа шириной 12 знаков, то, например, число 18
2 001 000 000 000 555 уже не будет изображено. Поэтому вещественные числа представляются в ЭВМ в форме с плавающей точкой, называемой экспоненциальной. Они имеют цифровую часть (мантиссу) и порядок, следующий за знаком е. Приведенное выше число примет вид 2.001е + 15. Ясно, что такая форма представления чисел дает возможность выполнять операции над вещественными числами только приближенно. Вообще-то нельзя предполагать точное равенство никаких двух чисел с плавающей точкой. Количество цифр в мантиссе характеризует точность. Чем больше цифр имеет мантисса, тем погрешность меньше. Стандартный вещественный тип Real используется без математического сопроцессора, а типы Single, Double, Extended относятся к расширенному набору вещественных типов и рассчитаны на работу с сопроцессором, применение которого значительно увеличивает точность расчетов и ускоряет их выполнение. Паскаль дает возможность при отсутствии математического сопроцессора эмулировать его работу программным путем с помощью директив компилятора {$N+, E+}, которые заключаются в фигурные скобки и имеют отличительный признак $. Новый знак ( / ) вводится только для операции деления вещественных чисел, причем результат операции всегда вещественный, даже когда оба операнда – целые числа (9/3). Операции возведения в степень в Паскале нет. Значение степени x a = (elna)x дает выражение exp (x*ln (a)), использующее две встроенные функции Exp и Ln, например: 37 = Exp(7*Ln(3)); (–4)5 = –Exp(5*Ln(4)), так как Ln(–4) не существует. 3. Математические (встроенные) функции Решая различные задачи, мы сталкиваемся с необходимостью извлекать квадратные корни, вычислять значения тригонометрических функций и т. д. Для облегчения работы наиболее употребительные алгоритмы разработаны фирмой-производителем и поставляются вместе с языком. Они хранятся в специальной библиотеке и называются стандартными, или встроенными, функциями. Чтобы обратиться к встроенной функции, нужно назвать ее имя (аргумент пишется в скобках). Углы для вычисления тригонометрических функций задаются в радианах. Применяя встроенные функции в выражениях или для конструирования новых функций, необходимо следить за типами аргументов и возвращаемых значений. Выполняя действия с любыми числами, следует помнить основные математические факты: – нельзя делить на ноль; – не существует квадратный корень из отрицателъного числа; – не существует логарифм числа, которое меньше или равно нулю. Для числовых данных стандартные функции представлены в табл. 6. 19
Таблица 6 Функция Обозначение Абсолютное значение x Abs(x) Арктангенс x Arctan(x) Косинус x Cos(x) Экспонента Еxp(x) Выделение дробной части Frac(x) аргумента Выделение целой части Int(x) аргумента Натуральный логарифм Ln(x) Значение Pi PI = 3.1415926535897932385 Проверка четности Odd(x) Предшествующее значение аргумента Инициализация датчика случайных чисел Формирование случайного числа Формирование случайного числа Округление вещественного числа до целого Синус х Квадрат х Квадратный корень x Следующее значение аргумента Выделение целой части вещественного числа
Тип аргумента Integer или Real Integer или Real Integer или Real Integer или Real Real
Тип результата Integer или Real Real Real Real Real
Real
Real
Real –
Real –
Longint
Pred(x)
INTEGER
Boolean(true, если число нечетное) Integer
Randomize
–
–
Random(x)
Word
Integer
Random
Аргумент не задан
Real
Round(x)
Real
Sin(x) Sqr(x) Sqrt (x) Susc(x)
Integer или Real Integer или Real Integer или Real Integer
Integer Longint Real Integer или Real Real Integer
Trunc(x)
Real
Integer Longint
Для вещественного типа количество принимаемых значений очень велико. Все простые типы данных, кроме вещественных, называются порядковыми. Для них определены следующие функции. Функции Int(x) и Frac(x) похожи на математические функции [х] и {х}, обозначающие соответственно целую и дробную части числа, но совпадают с ними только на множестве неотрицательных чисел. Если аргумент отрицательный, то они просто отбрасывают дробную или целую часть: [–5,8] = –6, Int (–5.8) = –5; {–5,8} = 0,2, Frac(–5.8) = –0.8. Функция Trunc(x) отличается от Frac(x) типом возвращаемого значения, Round(x) – функция округления, Odd(x) возвращает логическое значение true, если аргумент х – нечетное число. Функции Random, Random(x) и сопутствующая им процедура Randomize предназначены для получения псевдослучайных чисел. Целочисленные значения можно присваивать вещественным переменным, а присваивание вещественного значения целочисленной переменной яв20
ляется ошибкой программирования. Вещественные значения в последнем случае преобразовывают в целочисленные с помощью одной из предназначенных для этого встроенных функций: Trunc(x) или Round(x). Операции div и mod не могут употребляться с вещественными числами. 4. Оператор присваивания Значения переменных предварительно описываются в разделе описания переменных Var. Результаты арифметических операций, как и результаты других операций (сравнений, логических, строковых), могут быть присвоены какой-либо переменной с помощью оператора присваивания: < имя переменной > : = < значение переменной > Тип выражения в правой части этого оператора обязательно должен совпадать с типом переменной в левой части. Исключение составляют переменные вещественного типа: им могут присваиваться также значения целого типа. Результат работы функций сложения, умножения, деления, вычитания и возведения в квадрат вещественных чисел дает вещественное число. 5. Вычисление выражений Современные компьютеры умеют многое, но по-прежнему их можно использовать как очень мощные калькуляторы для вычисления арифметических и алгебраических выражений. При записи на языке программирования любое выражение должно быть «вытянуто в одну строчку», а приоритет операций регулируют скобки. Рассмотрим несколько примеров записи выражений (табл. 7). Таблица 7 Общематематическая запись –0,12310–7 456 · 1997 2π +e3 34 ⋅ 24
Запись на Паскале –0.123е–7 456*1997 2*pi +Exp(3) 34*24/(74 + 388)
74 + 388 |x| + √7 + y2 Sin13º log27 + lg3 + ln3
Abs(x) + Sqrt (7) + Sqr (y) Sin(13*Pi/180) Ln(7)/Ln(2) + Ln(3)/Ln(10) + Ln(3)
Задача 1 Вычислить: (1,2 : 36 + 1,2 : 0,25 + Cos2) : 7,24. Составим программу для решения приведенного арифметического примера, записывая его по правилам языка в одну строку: Program Lab2_1; Begin Write(1.2/36 + 1.2/0.25 + Cos(2))/7.24); ReadLn; End. 21
6. Процедуры ввода – вывода 6.1. Стандартные процедуры ввода на экран дисплея Процедуры Read (список переменных) и ReadLn (список переменных) могут считывать любое количество значений переменных, идентификаторы которых перечислены в круглых скобках через запятую. Процедура Read производит ввод данных, не переводя при этом курсор на следующую строку. Процедура ReadLn после ввода осуществляет переход на следующую строку. Процедуру ReadLn можно использовать без параметров – тогда она производит только перевод строки. 6.2. Стандартные процедуры вывода на экран дисплея К ним относятся процедуры Write (список элементов) и WriteLn (список элементов). Элементы в списке указываются через запятую. В общем случае элементами списка могут быть выражения любых типов, в том числе константы, переменные и обращения к функциям. Список элементов может быть пустым. В этом случае скобки в операторах вывода не используются, например: Write (А, В, 125); WriteLn ('x = ', y + z); Write; WriteLn; и т. п. На экране мы видим значения элементов списка. Значения элементов числового типа выводятся в десятичной системе счисления. При этом элементы вещественного типа выводятся в показательной форме. В качестве значений элементов логического типа выводятся слова True или False. Значения элементов символьного типа выводятся без изменений. Форма оператора вывода WriteLn отличается от формы Write только тем, что последующие операторы ввода – вывода данных будут выполняться начиная с новой строки экрана. Например, последовательность операторов вывода Write (А, В, С); WriteLn; эквивалентна одному оператору вывода WriteLn (А, В, С);. Задача 2 Необходимо ввести и вывести на печать три символа. Program Lab2_2; Var A1, A2, A3 : Char; Begin WriteLn ( ‘Введи три символа через пробел’); ReadLn (A1, A2, A3); WriteLn (‘Мы считали символы’, A1, A2, A3); End. После запуска программы на исполнение мы видим на экране монитора: Введи три символа через пробел: X_Y_Z Мы считали символы X Y Z. Пояснения к решению задачи 2 Ввод значений осуществляется вами в переменные символьного типа A1, A2, A3, объявленные в программе как Char. Процедура ReadLn считывает 22
с клавиатуры символ X и присваивает его переменной А1, затем считывает второй символ – Y и заносит его в переменную А2. Третий символ – Z соответственно считывается в переменную А3 . Вывод значений осуществляется вами с помощью процедуры WriteLn в одну строку. Задача 3 Необходимо ввести и вывести на печать два целых числа и два вещественных числа: 1) 5; 2) 317; 3) 45,399; 4) 700 000. Program Lab2_3; Var с1, с2 : Integer; с3, с4 : Real; Begin WriteLn (‘Введи число 1-е’); ReadLn (с1); WriteLn (‘Введи число 2-е’); ReadLn (с2); WriteLn (‘Введи число 3-е’); ReadLn (с3); WriteLn (‘Введи число 4-е’); ReadLn (с4); WriteLn (‘РЕЗУЛЬТАТ: ’); WriteLn (‘Мы ввели 1-е число: ’, c1); WriteLn (‘Мы ввели 2-е число: ’, c2); WriteLn (‘Мы ввели 3-е число: ’, c3); WriteLn (‘Мы ввели 4-е число: ’, c4); End. После запуска программы на исполнение мы видим на экране монитора: Введи число 1-е 5 Введи число 2-е 317 Введи число 3-е 45.6 Введи число 4-е 500000 Результат: Мы ввели 1-е число: 5 Мы ввели 2-е число: 317 23
Мы ввели 3-е число: 4.56Е + 01 Мы ввели 4-е число: 7.0Е + 05 Пояснения к решению задачи 3 При вводе значений в переменную целого или вещественного типа процедура ReadLn ожидает последовательности символов, образующих целое или вещественное число со знаком. Любые пробелы, знаки табуляции или признаки конца строки, предшествующие числовой строке, пропускаются. Ввод значений осуществляется нами в две переменные целого типа с1, с2, объявленные в программе как Integer, и в две переменные вещественного типа с3, с4, объявленные как Real. Процедура ReadLn считывает с клавиатуры числа 5, 317, 45,6 и 500 000 и присваивает их значения соответственно переменным с1, с2, с3, с4. Вывод значений осуществляется с помощью процедуры WriteLn: каждое число в своей строке. Первое и второе числа выведены в привычном виде, как и были введены. Третье и четвертое числа выведены в показательной форме. В следующем пункте мы рассмотрим форматированный вывод данных, который позволит вывести вещественные данные в обычном виде. 6.3. Управление выводом данных (форматированный вывод) Каждый элемент списка оператора вывода может быть снабжен указанием желаемого количества позиций, которое должно быть отведено для размещения его значения при выводе. Это называется форматированием вывода. Желаемая ширина поля (формат вывода) указывается через двоеточие после данного элемента списка. Если фактически для размещения значения потребуется меньше позиций, то первые слева незанятые позиции поля будут заполнены пробелами. Если же значение элемента не поместится в требуемое поле, то при выводе будет использовано столько позиций, сколько нужно фактически. Для элементов вещественного типа после ширины поля можно указать, также через двоеточие, еще одно число – количество цифр, которые должны быть выведены после десятичной точки. В этом случае число выводится не в показательной, а в обычной форме. Если в дробной части десятичного числа цифр больше, чем требуется вывести, то перед выводом автоматически будет выполнено округление. Если же цифр в дробной части меньше, то будут выведены дополнительные нули. Если для дробной части указать нулевое количество позиций, то вещественное число будет выведено в виде целого (табл. 8). Таблица 8 Значения элементов списка 1 А = –7,86 А = –7,86
Операторы вывода 2 WriteLn ('A = ', A : 5 : l) WriteLn ('A = ', A : 5 : 2)
24
Результат вывода 3 A = –7.9 A = –7.86
Окончание табл. 8 1 Х = 25,014 Х = 25,014 В = –7,86 D = 5,0 R = –123,1234567 R = –123,1234567
2 WriteLn ('x = ', x : 4 : 0) WriteLn (x = ', х : 6 : 3) WriteLn ('B = ', В : 0 : 0) WriteLn (‘Длина = ', d : 0 : 0))см') WriteLn (‘R = ’, R) WriteLn (‘R = ’, R7 : 2)
3 X = 25 X = 25.014 B = –8 Длина = 5 см R = –1.2312345670000E + 0002 R = –123.12
7. Управление режимами вывода данных на экран дисплея В понятие «удобство работы с пользовательским интерфейсом» входят: – шрифтовое оформление информации, представленной на экране; – расположение различных частей информации, относительно друг друга; – цветовое оформление информации, представленной на экране. Шрифт в текстовом режиме устанавливает операционная система. Изменить его нет возможности, но можно менять расположение информации на экране и цветовое оформление. 7.1. Управление положением курсора на экране монитора Инструкции Write и WriteLn выводят информацию, начиная с той позиции экрана, в которой находится курсор. Положение курсора на экране определяется номером строки и номером позиции в строке, которые можно рассматривать как координаты курсора. В стандартном режиме на экране могут быть отображены до 25 строк текста Рис. 8. Положение курсора длиной до 80 символов. на экране монитора Х – это горизонтальная координата которая меняется от 1 до 80 (определяет номер позиции в строке). Y – это вертикальная координата, которая меняется от 1 до 25 (определяет номер строки). За начало координат принят левый верхний угол экрана (рис. 8). Левая верхняя точка экрана имеет координаты (1,1), правая нижняя – (80,25). Процедура GoTo (X,Y) позволяет вывести текст с определенной позиции экрана. Процедура в общем виде выглядит так: GoToXY(координата Х, координата Y), где координата Х, координата У — выражения целого типа, значения которых задают новое положение курсора. К примеру, инструкции GoToXY(34,13); write('Turbo Pascal'); выводят сообщение примерно в середине экрана, в 34-й строке с 13-й позиции.
25
7.2. Стандартный модуль CRT. Подключение модулей с помощью Uses. Процедура очистки экрана дисплея ClrScr. Функция ReadKey Процедуры, управляющие представлением информации на экране в текстовом режиме, собраны в стандартном модуле CRT (Cathod ray tube – электронно-лучевая трубка), который необходимо подключить к программе в разделе подключения модулей Uses. Процедура ClrScr ClrScr – сокращение от англ. Clear Screen («очистить экран»). Результатом работы данной процедуры является удаление всех символов с экрана и перемещение каретки в левый верхний угол. Функция ReadKey ReadKey в переводе с английского означает «читать клавишу». ReadKey позволяет дождаться нажатия пользователем какой-либо клавиши, после чего определяется код нажатой клавиши. С ее помощью можно организовать паузу в программе, так как программа приостанавливается до нажатия клавиши. Задача 4 Подключение к программе модуля CRT и очистка экрана: Рrogram Lab2_4; Uses CRT; Begin ClrScr; Writeln (‘Нравится чистый экран?’); ReadKey; End. 7.3. Процедуры работы с цветом (TextColor,TextBackground) В любой момент времени выполнения программы экран в текстовом режиме имеет две цветовые характеристики: – текущий цвет выводимого текста; – текущий фон выводимого текста. В табл. 9 мы видим цвета, используемые для вывода информации на экран, и соответствующие им константы модуля CRT. Таблица 9 Цвет 1 Черный Синий Зеленый Морской волны Красный Фиолетовый Коричневый Светло-серый
Код 2 0 1 2 3 4 5 6 7
26
Константа модуля CRT 3 Black Blue Green Cyan Red Magenta Brown LightGray
Окончание табл. 9 1 Темно-серый Светло-синий Светло-зеленый Светлый морской волны Светло-красный Светло-фиолетовый Желтый Белый
2 8 9 10 11 12 13 14 15
3 DarkGray LightBlue LightGreen LightCyan LightRed LightMagenta Yellow White
Для изменения цвета символов используется процедура TextColor – цвет текста, имеющая следующий вид: TextColor(< цвет >). В качестве параметра «цвет» можно использовать код цвета (0 ÷ 15) или именованную константу. Для всех возможных цветов в модуле CRT описаны константы. Обратим внимание на то, что процедура TextColor устанавливает цвет только тех символов, которые будут выводиться после ее выполнения. Символы, уже находящиеся на экране, сохранят свой цвет. Вторая цветовая характеристика выводимого на экран текста – текущий цвет фона. Для изменения текущего цвета фона используется процедура TextBackground (англ.) – фон текста, имеющая следующий вид: TextBackground (< номер цвета >); Для цвета фона могут использоваться первые восемь цветов (0 ÷ 7) из 16 доступных в текстовом режиме. Задача 5 Вывести на экран дисплея на светло-сером фоне красными буквами текст «Goodbye!». Рrogram Lab2_5; Uses CRT; Begin ClrScr; TextColor(Red); TextBackGround(LigtCray); Writeln (‘Goodbye!’); ReadKey; End. Задача 6 Названия пунктов меню вывести на синем фоне светло-серым цветом, а номера пунктов меню – ярко-белым цветом. 27
Рrogram Lab2_6; Uses CRT; Begin ClrScr; TextBackGround(Blue); TextColor (15); WriteLn (‘1’); TextColor (7); Write (‘Вывод на экран’); TextColor (15); WriteLn (‘2’); TextColor (7); Write (‘Вывод на принтер’); ReadKey; End. 8. Контрольные вопросы 1. Что такое тип переменных? 2. Назовите простые основные типы языка Паскаль. 3. Что такое оператор? 4. Что такое идентификатор? Для чего используются идентификаторы в языке Паскаль? 5. Перечислите правила записи идентификаторов на языке Паскаль. 6. Перечислите арифметические операции для данных целочисленного типа языка Паскаль, приоритеты выполнения арифметических операций. 7. Почему знак умножения всегда записывается явно? 8. Назовите две формы записи вещественных чисел. 9. Что представляют собой мантисса и порядок в показательной форме записи вещественной константы? 10. Какие стандартные тригонометрические функции, реализованные в языке Паскаль, вы знаете? 11. Назовите стандартные математические функции языка Паскаль, имеющие вещественный тип. 12. Назовите стандартные математические функции языка Паскаль, имеющие целый тип. 13. В чем отличие двух типов числовых данных: Real и Integer? 14. К каким типам данных применимы арифметические операции Div и Mod? 15. При каких значениях аргумента стандартные функции trunc(x) и round(x) возвращают одинаковый результат? 16. Для каких чисел определены стандартные функции Susc(x) и Pred(x)? 17. Можно ли при записи арифметических операций использовать квадратные и фигурные скобки? 18. Какие функции преобразуют вещественный аргумент в целый? 19. Назовите операции отношения, которые применимы к данным числового типа. 28
20. Как называются элементы данных языка, значения которых определены в описательной части программы и не меняются в процессе ее выполнения? 21. Что такое «выражение», «операция», «операнд»? 22. Как называется некоторый конечный набор операций (действий, предписаний), выполнение которых одна за другой за конечное число шагов приводит к намеченной цели (искомому результату, решению поставленной задачи)? 23. Какие функциональные клавиши вызывают диалоговое окно «Открыть», позволяют сохранить текст программы в виде файла на магнитном носителе и выйти из ИСП Turbo Pascal? 24. Как сменить каталог в ИСП Turbo Pascal? 25. Что означает добавление буквосочетания Ln в операторах Write, Read? Как влияет на результат выполнения программы его отсутствие? 26. В чем заключается роль блока Uses в программе? 27. Оператор GotoXY(10,5) и его влияние на позицию курсора во время выполнения программы. 28. Какие процедуры устанавливают цвет фона и цвет символа? 29. Каков диапазон изменения константы процедуры, устанавливающей цвет фона? 30. Каков диапазон изменения константы процедуры, устанавливающей цвет символа? 31. Сколько строк и символов отображается на экране в стандартном режиме? 32. Каков приоритет выполнения арифметических операций? 33. Из каких символов может состоять идентификатор? 34. Может ли пробел входить в число символов, составляющих идентификатор? 35. Для чего служит процедура ClrScr? 36. Для чего служит функция ReadKey? 37. Что называется мантиссой числа? 38. Что называется порядком числа? 39. Почему знак умножения всегда выписывается явно? 40. Что такое форматированный вывод числа? 41. Что надо сделать, чтобы вещественное число было выведено в виде целого? 42. Считается ли пробел разделителем при чтении символов? 43. Для какого типа данных определены операции сложения, вычитания, умножения, деления? 9. Практическое задание – решение задач линейной структуры Организовать ввод данных и вывод результатов, снабдив распечатки соответствующими заголовками. Методические указания 1. Составить блок-схему программы, после чего приступить к написанию программы в ИСП. 29
2. Программа должна выполняться при любых значениях начальных данных. Данные для тестового задания № 1 приведены в условии задачи. Желательно сделать форматированный вывод результата вычислений. Вариант 1 1. Написать программу, которая вычисляет длину отрезка, если известны его координаты. Ниже представлен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом). Вычисление длины отрезка. Введите координаты отрезка (числа разделяйте пробелом): первая координата: х1, у1 – > 6 6 вторая координата: х2, у2 – > 9 10 ––––––––––––––––––––––––––––– Длина отрезка: 5 см 2. Написать программу, выводящую на светло-сером фоне черными буквами следующий текст, который надо расположить на экране c 20-й позиции, 6-й строки: Буря мглою небо кроет, Вихри снежные крутя… (А.С. Пушкин) 3. Написать программу на языке Паскаль для вычисления выражения по формуле (значения а, b подобрать самостоятельно): 3а 2 + 4 b
Вариант 2 1. Написать программу вычисления величины дохода по вкладу. Процентная ставка (в процентах годовых) и время хранения (в днях) задаются во время работы программы. Ниже представлен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом). Вычисление дохода по вкладу. Введите исходные данные: величина вклада (руб.) – > 2500 срок вклада (дней) – > 30 процентная ставка (годовых) – > 20 ––––––––––––––––––––––––––––– Доход: 41,10 руб. Сумма по окончании срока вклада: 254,1,10 руб 2. Написать программу, выводящую на синем фоне желтыми буквами следующий текст, который надо расположить на экране c 10-й позиции, 14-й строки: 30
Блеснул мороз. И рады мы Проказам матушки-зимы! (А.С. Пушкин) 3. Написать программу на языке Паскаль для вычисления выражения по формуле (значение х подобрать самостоятельно):
х 2 − 2 + 3х 2 − 8 х Вариант 3 1. Написать программу вычисления стоимости покупки, состоящей из нескольких тетрадей и такого же количества обложек к ним. Вычисление стоимости покупки. Введите исходные данные: цена тетради (руб.) – > 2,75 цена обложки (руб.) – > 0,5 количество комплектов (шт.) – > 7 –––––––––––––––––––––––––––– Стоимость покупки: 22,75 руб
2. Написать программу, которая выводит на экран фразу: «Каждый охотник желает знать, где сидит фазан», позволяющую запомнить порядок следования цветов радуги. (Первая буква слова кодирует цвет: каждый – красный, охотник – оранжевый, желает – желтый, знать – зеленый, где – голубой, сидит – синий, фазан – фиолетовый). Текст надо расположить на экране c 7-й позиции, 9-й строки. 3. Написать программу на языке Паскаль для вычисления выражения по формуле (значение х подобрать самостоятельно): y = 5 ln 0,8 x ⋅ tg 0,4 x
Вариант 4 1. Написать программу пересчета расстояния из верст в километры (1 верста равна 1 066,8 м). Ниже представлен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом). Пересчет расстояния из верст в километры. Введите расстояние в верстах и нажмите < Enter > – > 100. –––––––––––––––––––––––––––––––––––––––––––––––– 100 верст – это 106,680 км
2. Написать программу, выводящую на синем фоне желтыми буквами следующий текст, который надо расположить на экране c 8-й позиции, 19-й строки: 31
Его лошадка, снег почуя, Плетется рысью как-нибудь… (А.С. Пушкин) 3. Написать программу на языке Паскаль для вычисления выражения по формуле (значение х подобрать самостоятельно): y + sin x x + 6x 2
Вариант 5
1 ⎛ ⎞ 1. Написать программу вычисления объема конуса ⎜V = πHR 2 ⎟ . Ниже 3 ⎝ ⎠ представлен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом). Вычисление объема конуса. Введите исходные данные: высота (см) — > 3 радиус (см) — > 10 ––––––––––––––––––––––––– Объем конуса: 314 см2 2. Написать программу, выводящую на бирюзовом фоне синими буквами следующий текст, который надо расположить на экране c 12-й позиции,16-й строки: Выткался на озере алый цвет зари, На бору со звонами плачут глухари… (С.А. Есенин) 3. Написать программу на языке Паскаль для вычисления выражения по формуле (значение х подобрать самостоятельно): x − x2 − 3 2 sin x Вариант 6 1. Написать программу, которая преобразует введенное с клавиатуры дробное число в денежный формат. Например, число 125 должно быть преобразовано к виду 12 руб. 50 коп. ( данные, введенные пользователем, выделены полужирным шрифтом). Преобразование числа в денежный формат. Введите дробное число – > 23,6 23,6 руб. – это 23 руб. 60 коп
32
2. Написать программу, которая выводит на экран фразу, состоящую из трех строк: Любишь кататься – Люби и саночки возить. (Пословица) Первую строку вывести белым цветом на синем фоне, вторую – белым цветом на бирюзовом фоне, третью – белым цветом на зеленом фоне. Текст надо расположить на экране c15-й позиции, 14-й строки. 3. Написать программу на языке Паскаль для вычисления выражения по формуле y u= 2 + sin x, где u = –2, x = 1,5 x + 6x Вариант 7 1. Написать программу вычисления объема куба. Ниже представлен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом). Вычисление объема куба. Введите длину ребра (см) и нажмите < Enter > –9,5 –––––––––––––––––––––––––––––––––––––– Объем куба: 857,38 см3
2. Написать программу, выводящую на бирюзовом фоне синими буквами следующий текст, который надо расположить на экране c 6-й позиции, 17-й строки: Привольем пахнет дикий мед, Пыль – солнечным лучом… (А.А. Ахматова) 3. Написать программу на языке Паскаль для вычисления выражения по формуле
V=
x − y + 2 + sin( x 2 + y 2 ), где x = 3,2, y = 1,25
Вариант 8 1. Написать программу вычисления силы тока в электрической цепи. Ниже представлен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом). Вычисление силы тока в электрической цепи. Введите исходные данные: напряжение (вольт) – > 36 сопротивление (Ом) – > 1500 ––––––––––––––––––––––––– Сила тока: 0,024 ампер 33
2. Написать программу, выводящую на светло-сером фоне голубыми буквами следующий текст, который надо расположить на экране c 16-й позиции, 11-й строки: Водою пахнет резеда, И яблоком – любовь… (А.А. Ахматова) 3. Написать программу на языке Паскаль для вычисления выражения по формуле (значение х подобрать самостоятельно): x − 2 + sin( x 2 − 8)
Вариант 9 1. Написать программу вычисления стоимости поездки на автомобиле на дачу (туда и обратно). Исходными данными являются: расстояние до дачи (в километрах); количество бензина, которое потребляет автомобиль на 100 км пробега; цена одного литра бензина Ниже представлен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом). Вычисление стоимости поездки на дачу и обратно. Расстояние до дачи (км) – > 67 Расход бензина на 100 км пробега (л) – > 8,5 Цена литра бензина (руб.) – > 6,5 Поездка на дачу и обратно обойдется в 74 руб.
2. Написать программу, выводящую на бирюзовом фоне синими буквами следующий текст, который надо расположить на экране c 12-й позиции, 13-й строки: Выхожу один я на дорогу, Сквозь туман кремнистый путь блестит… (М.Ю. Лермонтов) 3. Написать программу на языке Паскаль для вычисления выражения по формуле (значения х, у подобрать самостоятельно): sin( x − 8) +
x 1+ y
Вариант 10 1. Написать программу вычисления площади треугольника, если известны длины двух его сторон и величина угла между этими сторонами. Ниже представлен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом). Вычисление площади треугольника. Введите (через пробел) длины двух сторон треугольника (см) – > 25 17
34
Введите величину угла между сторонами треугольника – > 30 –––––––––––––––––––––––––––––––––––––––––––––––––––––– Площадь треугольника: 106,25 см2 2. Написать программу, выводящую на синем фоне серыми буквами следующий текст, который надо расположить на экране c 20-й позиции, 15-й строки: Ночь тиха, пустыня внемлет богу, И звезда с звездою говорит. (М.Ю. Лермонтов) 3. Написать программу на языке Паскаль для вычисления выражения по формуле 2 sin( x 2 − 6 x) , где х = 2,1 1 + x2 − 2 x Вариант 11 1. Написать программу пересчета величины временного интервала, заданного в минутах, в величину, выраженную в часах и минутах. Ниже представлен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом). Введите величину временного интервала (в мин) – > 150 –––––––––––––––––––––––––––––––––––––––––––––––– 150 минут – это 2 ч. 30 мин
2. Написать программу, выводящую на красном фоне белыми буквами следующий текст, который надо расположить на экране c 7-й позиции, 9-й строки: Зима! Крестьянин, торжествуя, На дровнях обновляет путь… (А.С. Пушкин) 3. Написать программу на языке Паскаль для вычисления выражения по формуле (значение х подобрать самостоятельно): y = 5 ln 0,8 x ⋅ tg 0,4 x Вариант 12 1. Написать программу вычисления площади поверхности цилиндра (S = 2πr(h + r)). Ниже представлен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом). Вычисление площади поверхности цилиндра. Введите исходные данные: радиус основания (см) – > 5,5 высота цилиндра (см) – > 7 –––––––––––––––––––––––––––––––––––––––– Площадь поверхности цилиндра: 431,970 см2 35
2. Написать программу, выводящую на сиреневом фоне белыми буквами следующий текст, который надо расположить на экране c 4-й позиции, 14-й строки: Скажи-ка, дядя, ведь недаром Москва, спаленная пожаром, Французу отдана. (М.Ю. Лермонтов) 3. Написать программу на языке Паскаль для вычисления выражения по формуле x − 2 + sin( x 2 − 8), где х = 1,25 Вариант 13 1. Написать программу пересчета веса из фунтов в килограммы (1 фунт равен 409,5 г). Ниже представлен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом). Пересчет веса из фунтов в килограммы. Введите вес в фунтах и нажмите < Enter > – > 5 ––––––––––––––––––––––––––––––––––––––– 5 фунтов – это 2,05 кг
2. Написать программу, выводящую на экран фразу, состоящую из двух строк: Правда – хорошо, А счастье – лучше. (Пословица) Первую строку вывести желтым цветом на синем фоне, вторую – белым цветом на черном фоне. Текст надо расположить на экране c 5-й позиции, 11-й строки. 3. Написать программу на языке Паскаль для вычисления выражения по формуле x − y + 2 x − 6, где х, у можно задать любые значения. Вариант 14 1. Написать программу вычисления стоимости покупки, состоящей из тетрадей и карандашей. Вычисление стоимости покупки. Введите исходные данные: цена тетради (руб.) – > 2,75 количество тетрадей – > 5 цена карандаша (руб.) – > 0,85 количество карандашей – > 2 ––––––––––––––––––––––––––– Стоимость покупки: 15,45 руб
36
2. Написать программу, выводящую на сиреневом фоне белыми буквами следующий текст, который надо расположить на экране c 4-й позиции, 14-й строки: Плачет где-то иволга, схоронясь в дупло, Только мне не плачется, на душе светло. (С.А. Есенин) 3. Написать программу на языке Паскаль для вычисления выражения по формуле (значение х подобрать самостоятельно): sin( x − 2) + cos 2 ( x − 2) Вариант 15 1. Написать программу вычисления сопротивления электрической цепи, состоящей из двух параллельно соединенных сопротивлений. Ниже представлен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом). Вычисление сопротивления электрической цепи. Введите исходные данные: величина первого сопротивления (Ом) – > 15 величина второго сопротивления (Ом) – > 20 –––––––––––––––––––––––––––––––––––––– Сопротивление цепи: 8,57 Ом
2. Написать программу, выводящую на экран фразу из трех строк: Три раза – отмерь, Один раз – отрежь.. (Пословица) Первую строку вывести красным цветом на черном фоне, вторую – алым цветом на светло-сером фоне, третью – голубым цветом на бирюзовом фоне. Текст надо расположить на экране c 3-й позиции, 18-й строки. 3. Написать программу на языке Паскаль для вычисления выражения по формуле (значение х подобрать самостоятельно): x − 2 + sin( x 2 − 8) Вариант 16 1. Написать программу вычисления сопротивления электрической цепи, состоящей из двух последовательно соединенных сопротивлений. Ниже представлен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом). Вычисление сопротивления электрической цепи при последовательном соединении элементов. Введите исходные данные:
37
величина первого сопротивления (Ом) – > 15 величина второго сопротивления (Ом) – > 27,3 –––––––––––––––––––––––––––––––––––––––––––-–––––––––– Сопротивление цепи (последовательное соединение): 42,30 Ом 2. Написать программу, выводящую на сиреневом фоне черными буквами следующий текст, который надо расположить на экране c 15-й позиции, 10-й строки: Громада войск во тьме кипит, И над пылающей Москвою Багрово зарево лежит… (Д.В. Давыдов) 3. Написать программу на языке Паскаль для вычисления выражения по формуле a=
cos 5 sin 1 + 4 − 11 3 + 7
ЛАБОРАТОРНАЯ РАБОТА № 3 УСЛОВНЫЙ ОПЕРАТОР (РАЗВИЛКА)
Цели работы 1. Освоение простейшей структуры программы с условием (сокращенная и полная форма записи). 2. Получение навыков в организации программ с условием. Теоретический материал 1. Общие положения В разветвляющихся вычислительных процессах (алгоритм ветвления) используется оператор ветвления IF. Следует помнить следующее: – оператор IF используется для выбора одного из двух направлений дальнейшего хода программы (последовательности операторов, которые должны быть выполнены); – выбор последовательности операторов осуществляется во время выполнения программы в зависимости от выполнения «условия»;
38
– «условие» – это выражение логического типа, которое может принимать одно из двух значений: TRUE (истина – условие выполняется) или FALSE (ложь – условие не выполняется); – при помощи логических операций AND (логическое «и») и OR (логическое «или») из простых условий можно строить сложные. 2. Условный оператор IF ... THEN Условный оператор имеет две формы записи: полную и сокращенную. 2.1. Полная форма записи оператора IF IF «условие» THEN < оператор 1 > ELSE < оператор 2 >. В этом случае при истинности логического «условия» выполняется < оператор 1 >, в противном случае выполняется < оператор 2 >. Внимание! Перед словом ELSE нельзя ставить точку с запятой. Схематично этот случай изображается следующим образом:
Рис. 9. Полная форма оператора ветвления
Задача 1 Вычислить max (X + Y + Z, XYZ), вывести на экран значение большего вычисленного числа. Program Lab3_1; Uses Crt; Var X, Y, Z: integer; max: integer; Begin WriteLn('Введите X, Y, Z'); If Х + Y + Z > X*Y*Z then max: = X + Y + Z Else max: = X*Y*Z; WriteLn ('большее число = ', max); End.
39
2.2. Сокращенная форма записи оператора IF Допускается опускать служебное слово ELSE:
IF < условие > THEN < оператор 1 >; Альтернативная конструкция отсутствует и заменена точкой с запятой, т. е. если логическое «условие» ложно, то ничто не выполняется; если логическое «условие» истинно, то выполняется < оператор 1 >. Схематично этот случай изображается так:
Рис. 10. Сокращенная форма оператора ветвления
Задача 2 Вычислить значение функции f(x) в зависимости от значения аргумента Х. Условие задачи представлено на рис. 11.
Рис. 11. Схематичное изображение задачи 2
Решение будет следующим: Program Lab3_2; Uses Crt; Var X,Y: real; Begin ClrScr; WriteLn('Введите x'); Read(x); 40
If x > 0 Then y: = x; If x = 0 Then y: = 0; If x < 0 Then y: = –sqr(x); WriteLn ('значение x =', х); WriteLn('значение f(x) =', y); ReadLn; End. 2.3. Cоставной оператор Если после Then или Else необходимо выполнить действия, описанные несколькими операторами, то эти операторы должны быть заключены в операторные скобки begin – end. Такая конструкция называется составным оператором. 1) IF < условие > THEN begin < оператор 1 >; < оператор 2 >; ……………… < оператор n >; end ELSE < оператор >; 2) IF < условие > THEN < оператор > ELSE begin < оператор 1 >; < оператор 2 >; ……………… < оператор n >; end; 3) IF < условие > THEN begin < оператор 1 >; < оператор 2 >; …………. < оператор n >; end ELSE begin < оператор 1 >; < оператор 2 >; …………. < оператор n >; end;
41
В случае группы действий за then или else используем операторные скобки. Обратите внимание на синтаксис: между словами begin и end стоят операторы, следуя правилу языка Паскаль: они отделены точкой с запятой. Перед словом ELSE точки с запятой не может быть, так как это один оператор, состоящий из слов IF...THEN...ELSE. 2.4. Вложенные операторы IF Задача 3 Определить, попадает ли число Х в интервал от –2 до 13. Мы должны проверить два условия: 1) Х должно быть больше –2. Если это условие является истиной, то проверяем второе условие; 2) Х должно быть меньше 13. В том случае, когда оба условия выполняются, мы можем сказать, что данное значение Х удовлетворяет условию: –2 < x < 13. Как это записать? Рассмотрим три программы для решения этой задачи.
Program Lab3_3_1; {Случай 1} {Попадает ли Х в интервал –2 < X < 13} Uses Crt; Var X: Integer; Begin ClrScr; WriteLn('Программа вычисляет попадание Х в интервал'); WriteLn('Введи X'); Read(X); If (X > –2) Then If (X < 13) Then WriteLn ('Х = ', X, 'попадает в интервал') Else WriteLn('Х > = 13 – не попадает в интервал', ' X = ', X) Else WriteLn('Х < = – 2 – не попадает в интервал', ' X = ', X); ReadKey; End. Здесь мы видим, что два оператора IF вложены друг в друга. Вложенность операторов IF неограниченна. Program Lab3_3_2; {Случай 2} {Попадает ли Х в интервал –2 < X < 13} Uses Crt; Var X: Integer; 42
Begin ClrScr; WriteLn('Программа вычисляет попадание Х в интервал') WriteLn('Введи X'); Read(X); If (X > –2) And (X< 13) Then WriteLn('Х = ', X,' попадает в интервал') Else WriteLn('не попадает в интервал, т.к.', 'X = ', X); ReadKey; End. Program Lab3_3_3; {Случай 3} {Попадает ли Х в интервал –2 < X < 13} Uses Crt; Var X: Integer; Begin ClrScr; WriteLn ('программа вычисляет попадание Х в интервал'); WriteLn ('Введи X'); Read (X); If (X > –2) And (X < 13) Then Begin {2} Write ('Х = ', X); Write (' Попадает в интервал'); End {2} Else Begin {3} Write ('Х = ', X); Write (' Не попадает в интервал'); End; {3} ReadKey; End. Дадим некоторые пояснения к программе (случай 3). Из-за наличия двух операторов после THEN (два оператора вывода Write) в программе стоят операторные скобки Begin – End. Фигурные скобки с номерами {2}, {3} стоят для наглядности , они не являются обязательными, их можно опустить. Begin {2} ………… End {2} 43
Аналогично для Else стоят операторные скобки: Begin {3} ………… End; {3} Приведем еще две задачи, демонстрирующие некоторые способы использования оператора IF. Задача 4 Получить максимальное число из трех целых чисел. Составим блок-схему решения задачи (рис. 12).
max : = X max : = Y
max < Z
max : = Z
Рис. 12. Выбор максимального числа из трех
Program Lab3_4;{Максимальное число из трех целых чисел} Var X, Y, Z: integer; max: integer; 44
Begin Write('Введите X,Y,Z ', X,Y,Z); Read(A,B,C); max: = X; If X > Y then max: = X; Else max: = Y; If (Z > max then max: = Z; WriteLn ('max =', max : 5 : 2); End. Пояснения к задаче 4 Сравниваем значения переменных Х и Y, выбираем из них большее и сохраняем значение большей переменной в переменной с именем max, затем значение переменной Z со значением переменной именем max, после чего опять выбираем большее значение. Задача 5 Программа «Исторический тренажер» предлагает историческое событие и меню с выбором дат его свершения под номерами. Проверяется правильность ответа. Пользователь должен выбрать правильный ответ и ввести его номер. Ниже представлен вид экрана во время работы программы .
Архитектор Исаакиевского собора: Доминико Трезини – > 1 Огюст Монферран – > 2 Карл Росси – > 3 Введите номер правильного ответа и нажмите «Enter» – 3 –––––––––––––––––––––––––––––––––––––––––––––––––– Вы ошиблись: архитектор Исаакиевского собора – Огюст Монферран. Program Lab3_5; {Проверка знания истории архитектуры} Uses Crt; Var otv: integer; {Номер ответа} Begin ClrScr; WriteLn ('Архитектор Исаакиевского собора'); WriteLn ('Доминико Трезини – > 1'); WriteLn (‘Огюст Монферран – > 2'); WriteLn ('Карл Росси – > 3'); WriteLn ; WriteLn ('Введите номер правильного ответа и нажмите «Enter» –'); Read (otv); If otv = 2 45
Then WriteLn ('Правильно') Else begin WriteLn ('Вы ошиблись'); WriteLn ('Архитектор Исаакиевского собора –'); WriteLn ('Огюст Монферран'); end; ReadLn; End. Пояснения к задаче 5 Номер ответа otv представлен в разделе описаний как целочисленная переменная Integer. Пользователем был выбран, например, ответ 3. Ответ неверный, поэтому выбирается альтернативная ветка Else и сообщается правильный ответ: архитектор Исаакиевского собора – Огюст Монферран. 3. Практическое задание – решение задач с условием Организовать ввод данных и решение задач с использованием оператора ветвления IF, снабдив распечатки соответствующими заголовками.
Методические указания 1. Составить блок-схему программы, после чего приступить к написанию программы в ИСП. 2. Желательно сделать форматированный вывод результата вычислений. Вариант 1 1. Проверить, делится ли введенное число на 5, 11, 13. Во всех трех случаях при анализе использовать полную конструкцию оператора IF.
2. Составить программу, которая вычисляет значение Z = X/Y, где Y = = SinX + 0,5. В случае Y = 0 вывести на печать сообщение «Деление на 0». 3. Определить, имеется ли среди чисел A, B, C хотя бы одно четное. Вариант 2 1. Проверить, делится ли введенное число на 2, 3, 7. Во всех трех случаях при анализе использовать полную конструкцию оператора IF.
2. Даны два целых числа: А и С. Если число С отрицательное, вычислить остаток от деления А на С. Если число С положительное, вывести на печать число, следующее за суммой А и С.
46
3. Определить, принадлежит ли точка с координатами (X,Y) прямоугольнику (рис. 13) с координатами (X1, Y1; X2, Y2). Координаты точки и прямоугольника задать действительным типом. Рис. 13 Вариант 3 1. Проверить, делится ли введенное число на 12,13,17. Во всех трех случаях при анализе использовать полную конструкцию оператора IF.
2. Определить, попадает ли число Х в интервалы от –14 до 2 и от 5 до 10. Напечатать модуль этого числа в случае положительного ответа. 3. Две точки задаются своими координатами. Определить, какая из них находится дальше от окружности заданного радиуса с центром в начале координат. Вариант 4 1. Проверить, делится ли введенное число на 5, 4, 12. Во всех трех случаях при анализе использовать полную конструкцию оператора IF.
2. Функция Y = f(x) задана своим графиком (рис. 14). Составить алгоритм и программу, определяющую Y по заданному X. 3. В зависимости от введенного признака вычислить длину окружности при k = 1 (L = 2πR); площадь круга k = 2 (L = πR2) ; объем шара k = 2 (L = 4πR3 /3). Радиус один и тот же, задается пользователем.
Рис. 14
Вариант 5 1. Проверить, делится ли введенное число на 3, 7, 8. Во всех трех случаях при анализе использовать полную конструкцию оператора IF.
2. Функция Y = f(x) задана своим графиком (рис. 15). Составить алгоритм и программу, определяющую Y по заданному X. 3. Написать программу вычисления корней квадратного уравнения Ax2 + Bx + C = 0. Корни уравнения могут быть кратные, разные и мнимые. Рис. 15
Вариант 6 1. Проверить, делится ли введенное число на 2, 5, 13. Во всех трех случаях при анализе использовать полную конструкцию оператора IF.
47
2. Функция Y = f(x) задана своим графиком (рис. 16). Составить алгоритм и программу, определяющую Y по заданному X. 3. Определить, попадает ли точка с координатами Х, Y внутрь круга радиусом R (центр круга совпадает с началом координат). Рис. 16
Вариант 7 1. Проверить, делится ли введенное число на 7, 8, 11. Во всех трех случаях при анализе использовать полную конструкцию оператора IF.
2. Даны два действительных числа. Удвоить первое число, если оно меньше второго. В противном случае вычислить модуль суммы этих чисел. 3. Ввести два действительных числа А, В и вычислить значение C:
⎧ 3a 2 + 4b 2 ⎪ c=⎨ 2 ⎪⎩ 3a + 4 b
при a ≤ 2 * b ; при a > 2 * b .
Вариант 8 1. Проверить, делится ли введенное число на 3, 5, 13. Во всех трех случаях при анализе использовать полную конструкцию оператора IF.
2. Функция Y = f(x) задана своим графиком (рис. 17). Составить алгоритм и программу, определяющую Y по заданному X. 3. Радиус окружности, вписанной в равносторонний треугольник, равен R. Составить программу для вычисления стороны (признак N = 1), высоты (признак N = 2) или площади треугольника (признак N = 3).
Рис. 17
Вариант 9 1. Проверить, делится ли введенное число на 2, 7, 9. Во всех трех случаях при анализе использовать полную конструкцию оператора IF.
2. Решить уравнение вида Ax + B = 0. 3. Определить, в каком координатном угле находится точка с координатами (X, Y), вывести на печать координаты этого угла.
48
Вариант 10 1. Проверить, делится ли введенное число на 5, 11, 13. Во всех трех случаях при анализе использовать полную конструкцию оператора IF.
2. Определить, какие из данных трех действительных чисел A, B, C являются целыми. 3. Написать программу вычисления стоимости покупки с учетом скидки. Скидка на 3% предоставляется, если сумма покупки больше 500 руб., на 5% – если сумма покупки больше 1 000 руб. Вариант 11 1. Проверить, делится ли введенное число на 4, 9, 15. Во всех трех случаях при анализе использовать полную конструкцию оператора IF.
2. В зависимости от введенного признака вычислить общее сопротивление электрической цепи. При k = 1 соединение двух резисторов последовательное. При k = 2 соединение двух резисторов параллельное. 3. Заданы площади круга R и квадрата S. Определить, поместится ли квадрат в круге. Задачу решить при следующих значениях: 1) R = 70, S = 36,74; 2) R = 0,86, S = 0,64. Вариант 12 1. Проверить, делится ли введенное число на 7, 17, 23. Во всех трех случаях при анализе использовать полную конструкцию оператора IF.
2. Функция Y = f(x) задана своим графиком (рис. 18). Составить алгоритм и программу, определяющую Y по заданному X. 3. Составить программу для определения подходящего возраста для вступления в брак, используя следующее соображение: возраст девушки равен половине возраста мужчины плюс 7; возраст мужчины определяется соответственно как удвоенный возраст девушки минус 14. Данные для проверки работы программы задать самостоятельно.
Рис. 18
Вариант 13 1. Проверить, делится ли введенное число на 5, 12, 21. Во всех трех случаях при анализе использовать полную конструкцию оператора IF.
49
2. Написать программу, которая проверяет знание даты основания Москвы. В случае неверного ответа программа должна выводить правильный ответ: «Вы ошиблись, Москва была основана в 1147 году». 3. Заданы площади круга R и квадрата S. Определить, поместится ли круг в квадрате. Задачу решить при следующих значениях: 1) R = 3,2, S = 3,5; 2) R = 3,2, S = 4; 3) R = 6, S = 9. Вариант 14 1. Проверить, делится ли введенное число на 3, 7, 33. Во всех трех случаях при анализе использовать полную конструкцию оператора IF.
2. Меньшее из двух значений переменных вещественного типа X, Y заменить на X2 + Y2. В случае их равенства заменить оба нулями. 3. Составить программу для определения наибольшей площади фигур. Одна фигура является квадратом (площадь S1), а другая – кругом (площадь S2). Квадрат задан длиной стороны, а круг – радиусом. Результат вывести в виде ПЛОЩАДЬ КРУГА = … или ПЛОЩАДЬ КВАДРАТА = ... Вариант 15 1. Проверить, делится ли введенное число на 6, 7, 17. Во всех трех случаях при анализе использовать полную конструкцию оператора IF.
2. Две точки задаются своими координатами. Определить, какая из них находится дальше от начала координат. 3. Ввести действительное число Х, значение которого лежит в двух интервалах, и вычислить значение Y: ⎧sin( x − 20, если − 2 < x < 4 Y =⎨ 2 ⎩3 x + 6 x + 2, если x ≥ 4 Вариант 16 1. Проверить, делится ли введенное число на 2, 3, 29. Во всех трех случаях при анализе использовать полную конструкцию оператора IF.
2. Ввести два целых числа: X и Y. Вычислить выражение Y = sin x2 + + cos x2, если число X меньше либо равно 3, иначе вычислить остаток от деления X на 3. 3. Определить, имеется ли среди чисел A, B, C хотя бы одна пара равных между собой чисел.
50
ЛАБОРАТОРНАЯ РАБОТА № 4 ОПЕРАТОР МНОЖЕСТВЕННОГО ВЫБОРА CASE ... OF
Цели работы 1. Освоение структуры программы, в которой используется для своей реализации оператор множественного выбора Case. 2. Получение навыков в организации программ, содержащей оператор множественного выбора Case. Теоретический материал 1. Общие положения Условный оператор IF позволяет выбирать только одно из двух возможных действий в зависимости от логического выражения. Оператор выбора Case является обобщением оператора IF – он дает возможность выполнить одно из нескольких действий в зависимости от значения переключателя. В качестве переключателя используется выражение, которое располагается между ключевыми словами CASE и OF. Результатом этого выражения может быть только значение порядкового типа, общее значение которого не превышает 65 535. Оператор выбора Case имеет следующую структуру: CASE < Переключатель > OF Константа выбора 1 : ОПЕРАТОР 1; Константа выбора 2 : ОПЕРАТОР 2; ………………………………………. Константа-выбора n : ОПЕРАТОР n ELSE ОПЕРАТОР n + 1; End.
ELSE – необязательная ветвь и может быть опущена. Оператор выбора состоит из переключателя и списка операторов, каждый из которых помечен одной или несколькими константами выбора. Все константы выбора должны быть различными, и их тип должен быть идентичен типу переключателя. Переключатель может быть любым стандартным типом: Integer, Char, Boolean (за исключением типа Real). Логику работы оператора выбора можно описать одной фразой: вычисленное значение < Переключателя > определяет, какой из ОПЕРАТОРов должен быть выполнен. Если переключатель принимает одно из значений константы выбора 1, то выполняется ОПЕРАТОР 1, а остальные операторы пропускаются. 51
Если переключатель принимает одно из значений константы выбора 2, то выполняется ОПЕРАТОР 2. Аналогично будут выполняться операторы от ОПЕРАТОРа 3 до ОПЕРАТОРа n. ОПЕРАТОР не будет выполняться в том случае, если значение переключателя не совпало ни с одним из значений константы выбора 1 до константы выбора n-го. Тогда осуществляется переход на альтернативную ветку с Else и будет выполняться ОПЕРАТОР n + 1. В неполной форме оператора CASE альтернативная всем предыдущим вариантам выбора ветвь ELSE отсутствует. В этом случае, если значение переключателя не совпадает ни с одним из значений констант-выбора, то не выполняется ни один из операторов, описанных в CASE, и управление передается оператору, стоящему непосредственно после ключевого слова end, замыкающего оператор CASE. На рис. 19 приведена блоксхема алгоритма, соответствующего Рис. 19. Блок-схема алгоритма CASE инструкции CASE. Ниже приведены примеры, демонстрирующие наиболее характерные приемы составления программ с использованием оператора СASE. Задача 1 Написать программу, которая дает наименование школьных оценок, т. е. надо ввести оценку, а в результате получить ее название (например: «3 – удовлетворительно»). Если ввести число, не являющееся оценкой, то программа выведет: «Такой оценки нет». Program Lab4_1; Uses Crt; Var X: integer; Y: string [17]; Begin ClrScr; WriteLn ('Введи число'); Read (X); Case X of 1: Y: = 'Очень плохо'; 2: Y: = 'Плохо'; 3: Y: = 'Удовлетворительно'; 4: Y: = 'Хорошо'; 5: Y: = 'Отлично'
52
Else Y: = 'Такой оценки нет'; end; WriteLn; WriteLn ('X соответствует –', Y); ReadLn; End. Пояснения к задаче 1 В переменную Х по запросу программы вводим оценку. Эта же переменная Х используется в операторе множественного выбора в качестве переключателя, который объявлен в разделе описаний как целочисленная переменная Integer. Имеющиеся пять альтернатив выбора – это константы выбора, содержащие наименование оценок. Необязательная часть с Else исполнится в том случае, если введенное значение переменной Х не совпадет ни с одним из пяти предложенных вариантов. Переменной Y, объявленной как строковая размерность 17, присваивается словесное наименование оценки в соответствии со значением переключателя X. В случае несовпадения ни с одним из значений константы выбора будет сообщение: «Такой оценки нет». Задача 2 Определить, какая клавиша нажата на клавиатуре – цифра или буква. Program Lab4_2; Uses Crt; Var Symbol: Char; Begin WriteLn ('Введите любую буквенную или цифровую клавишу'); Symbol: = ReadKey; Write('Нажатая клавиша –'); Case Symbol of '0'..'9': WriteLn ('Это цифра'); 'a'..'z': writeLn ('Это строчная латинская буква'); 'A'..'Z': WriteLn ('Это прописная латинская буква'); 'A'..'Я': WriteLn ('Это прописная русская буква'); 'а'..'я': WriteLn ('Это строчная русская буква') Else WriteLn ('Это другой символ'); End; End.
Пояснения к задаче 2 Переключатель Symbol объявлен в разделе описаний как символьная переменная Char. В нее считывается символ нажатой клавиши посредством специализированной функции ReadKey модуля CRT. 53
При использовании СASE указывается диапазон допустимых значений ('0'.. '9'), ('a'..'z'), (‘A'..'Z), (‘A'..'Я'), ('а'..'я') и делается соответствующее сообщение о введенном символе. В случае несовпадения ни с одним из значений константы выбора появится сообщение: «Это другой символ». Задачa 3 Если между begin и end находится только одна инструкция, то слова begin и end можно не писать. Приведем три фрагмента использования константы выбора: 1) case day of l, 2, 3, 4, 5: write ('Рабочий день.') ; 6: write ('Суббота!') ; 7: write ('Воскресенье!'); end; 2) case day of 1..5: write ('Рабочий день.') ; 6: write('Суббота!') ; 7: write ('Воскресенье ! ') ; end; 3) case day of 6: write ('Суббота!'); 7: write ('Воскресенье!') else write ('Рабочий день.'); end; 2. Практическое задание – решение задач с использованием оператора множественного выбора CASE Организовать ввод данных и вывод результатов, снабдив распечатки соответствующими заголовками.
Методические указания 1. Программа должна содержать для своей реализации операцию множественного выбора. 2. Необходимо составить блок-схему программы, после чего приступить к написанию программы в ИСП. Вариант 1 Написать программу, которая запрашивает у пользователя номер месяца и выводит соответствующее название времени года, например: «2 – ЗИМА». Если ввести число, не являющееся номером месяца (например, 14), то программа выведет: «Такого номера месяца нет».
54
Вариант 2 Группу детей, приехавшую в пионерский лагерь, распределяют по отрядам по следующему принципу: с 6 до 7 лет – 5-й отряд; с 7 до 9 лет – 4-й отряд; с 9 до 11 лет – 3-й отряд; с 11 до 13 лет – 2-й отряд; с 13 до 15 лет (включительно) – 1-й отряд. Составить программу-меню, которая позволила бы каждому приезжающему самому определять свой отряд. Вариант 3 Составить программу-меню, реализующую эпизод сказки: она спрашивает, куда предпочитает пойти герой (налево, направо или прямо), и печатает, что его ждет в каждом случае. Текст вопросов и ответов ЭВМ задать самостоятельно. Признак эпизода вводится с клавиатуры. Вариант 4 Известно, что астрологи делят год на 12 периодов, каждому из которых соответствует один из знаков зодиака: 20.1–18.2 (Водолей) 23.7–22.8 (Лев) 19.2–20.3 (Рыба) 23.8–22.9 (Дева) 21.3–19.4 (Овен) 23.9–22.10 (Весы) 20.4–20.5 (Телец) 23.10–22.11 (Скорпион) 21.5–21.6 (Близнецы) 23.11–21.12 (Стрелец) 22.6–22.7 (Рак) 22.12–19.01 (Козерог) Написать программу-меню, которая вводит дату некоторого дня года и печатает название соответствующего знака зодиака. Вариант 5 Составить программу, которая вычисляет площадь круга, заданную либо радиусом R ( признак N = 1), либо диаметром D (N = 2), либо длиной окружности L (признак N = 3):
⎧π ⋅ R 2 ⎪⎪ S = ⎨π ⋅ D 2 / 4 ⎪ 2 ⎪⎩ L ⋅ / 4 ⋅ π Вариант 6 Самолет летит из пункта А в пункт В со средней скоростью V. Составить программу нахождения времени в полете t, если возможны три варианта: а) дует встречный ветер (К = 1); б) ветра нет (К = 2); в) дует попутный ветер (К = 3).
55
Вариант 7 Написать программу-меню, которая выводит на экран дисплея стоимость междугородного телефонного разговора и название города абонента. Исходными данными для программы являются код города и продолжительность разговора (табл. 10). Таблица 10 Город Владивосток Москва Мурманск Самара
Код 423 095 815 846
Цена минуты, руб. 2,2 1,5 1,9 1,3
Вариант 8 Составить программу-меню «Выбор температуры», которая покажет на экране меню температур, а именно: 1 – максимальная температура; 2 – минимальная температура; 3 – средняя температура. Пользователь выбирает нужную ему температуру. Вариант 9 Составить программу-меню «Исторический тренажер». Программа предлагает историческое событие и меню с номерами. Номер вводится с клавиатуры. После этого на экране должна появиться дата свершения исторического события. Вариант 10 Написать программу-меню, которая спрашивала бы сокращенное имя, а печатала полное (например: Саша – Александр) для пяти ваших друзей. Ввод незнакомого имени должен провоцировать заявление типа: «Я с Вами не знаком». Необходимые данные задать самостоятельно. Вариант 11 Составить программу-меню, которая напечатает ваши оценки по предметам за последнюю сессию. Признак предмета вводится с клавиатуры. Вариант 12 Написать программу-меню, которая по введенному признаку печатает соответствующий времени дня набор блюд (завтрак, обед, ужин). Вариант 13 Ввести два целых числа Х и У. Составить программу-меню для операций (MULT, DIVIDE, PLUS, MINUS) и выполнить в зависимости от этого соответствующую операцию над числами Х и У, например: для значения
56
Х = 10, значения Y = 5 операции DIVIDE получим результат выполнения операции деления, равный 2. Вариант 14 Радиус один и тот же, задается пользователем. В зависимости от введенного признака нужно вычислить: 1) длину окружности при k = 1 (L = 2πR); 2) площадь при k = 2 (S = πR2); 3) объем шара при k = 3 (V = 4лRЗ/3). Вариант 15 Составить программу-меню, которая напечатает ваше расписание занятий по предметам в определенный день недели. Признак дня недели вводится с клавиатуры. Вариант 16 Задан проходной балл. Запрашиваются оценки абитуриента на экзаменах и сообщается результат приема в институт, например: для значения оценки «5 – Вы зачислены», для значения оценки « 7 – Такой оценки нет».
ЛАБОРАТОРНАЯ РАБОТА № 5 ОРГАНИЗАЦИЯ РАБОТЫ ПРОГРАММ ЦИКЛИЧЕСКОЙ СТРУКТУРЫ
Цели работы 1. Освоение структуры программы, содержащей оператор цикла с предусловием (while). 2. Освоение структуры программы, содержащей оператор цикла с постусловием (repeat). 3. Освоение структуры программы, содержащей оператор цикла с параметром (for). 4. Освоение структуры программы, содержащей вложенные циклы. 5. Получение навыков в организации программы, содержащей цикл. Теоретический материал 1. Общие положения На практике редко удается задать в явном виде все операции, которые должна выполнить программа. Их число или слишком велико, или определя-
57
ется исходными данными и вообще заранее неизвестно. Необходимо иметь возможность многократно повторять определенные части программы. Для этого предназначен оператор цикла. Цикл – это многократно выполняемый участок алгоритма или программы. Использование циклов приводит к уменьшению длины программы, сокращению времени на составление и отладку. В Паскале имеем три вида оператора цикла (рис. 20): 1. Оператор цикла с предусловием – while. 2. Оператор цикла с постусловием – repeat. Рис. 20. Три вида оператора цикла 3. Оператор цикла с параметром (со счетчиком) – for. Чаще всего вид оператора определяется не единственным образом. Наиболее универсальным является оператор цикла с предусловием. Простой или составной оператор, содержащийся в цикле, называется телом цикла, а переменная, изменяющаяся в нем, – параметром цикла. В одном цикле может быть несколько параметров. Условиями циклов служат логические константы, переменные или выражения с логическим результатом. Чтобы избежать бесконечного повторения ("зацикливания"), необходимо изменять в теле цикла хотя бы один параметр, входящий в логическое выражение. В циклах часто вычисляются суммы и произведения. До сих пор во всех наших программах переменные получали свое значение в результате вычислений или при вводе с клавиатуры. Установка начальных значений переменных обязательно должна предшествовать их использованию в циклах. В противном случае при первом выполнении цикла в операции может участвовать произвольное значение переменной. Более того, эта операция требует тщательного обдумывания и подбора. Начальному значению суммы s перед циклом обычно присваивается нуль или первое слагаемое. Накапливается сумма путем прибавления очередного слагаемого add к текущей сумме предыдущих слагаемых. Оператор присваивания имеет вид: s : = s + add. Он содержит переменную s в левой и правой частях, что обозначает изменение ее значения при каждом прохождении цикла. Аналогично накапливается и произведение р с той лишь разницей, что оператор присваивания имеет вид: р : = р * mult, где mult – очередной множитель, а начальному значению произведения перед циклом присваивается единица или первый множитель. 1.1. Особенности циклов Для всех операторов цикла (рис. 20) характерны следующие особенности: – повторяющиеся вычисления записываются всего лишь один раз; – вход в цикл возможен только через его начало;
58
– переменные оператора цикла должны быть определены до входа в циклическую часть; – нужно предусмотреть выход из цикла. Если этого не сделать, то вычисления будут длиться бесконечно. В этом случае говорят, что произошло «зацикливание». Бесконечный цикл – это циклический участок в алгоритме или программе, в котором не предусмотрены средства выхода из цикла при достижении некоторого условия и который не будет прерван средствами операционной системы; – процедура Break прерывает выполнение цикла, а процедура Continue начинает новую итерацию цикла, даже если предыдущая не была завершена. 2. Оператор цикла с предусловием WHILE ... DO Этот оператор организует так называемый цикл «ПОКА», или цикл с предусловием, так как проверка проводится перед началом очередной итерации (неизвестно количество повторений цикла): WHILE < Условие > DO < тело цикла >;
Оператор while позволяет многократно выполнять одни и те же действия в зависимости от некоторого < Условия >, которое записывается между ключевыми словами while и do и должно быть выражением булевского типа, т. е. принимать только значения Тrue или False. Цикл выполняется, пока < Условие > истинно. Как только < Условие > нарушается, выполнение цикла завершается. БлокРис. 21. Цикл «Пока» с предусловием схема цикла while приведена на рис. 21. Общую структуру оператора цикла с предусловием можно представить одним из двух следующих способов (табл. 11): Случай 1. Если тело цикла состоит из одного оператора, то операторные скобки Begin – End можно не ставить: while < Условие > do Оператор; Случай 2. Если тело цикла состоит из нескольких операторов, то операторные скобки Begin – End необходимо ставить: while < Условие > do begin Оператор; Оператор; Оператор; end; Опишем работу цикла while более подробно. Сначала, при входе в цикл, вычисляется < Условие >: 59
1. Если < Условие > равно False, то вход в цикл не выполняется, управление передается оператору, следующему непосредственно за операторами тела цикла. Так что при определенной ситуации цикл может ни разу не выполниться. 2. Если же < Условие > равно True, то происходит вход в цикл и однократное выполнение операторов его тела. Как только достигнем конца тела цикла, управление снова передается на его заголовок, где снова вычисляется < Условие >. 3. Если значение < Условия > все еще равно True (что зависит от изменения значений переменных во время предыдущего выполнения операторов цикла), то тело цикла выполняется еще один раз, и так далее. Как только очередное вычисление < Условия > цикла достигнет значения False, работа цикла завершается. Рассмотрим работу цикла while в задачах 1–2. Задача 1 При вводе осуществить проверку длины вводимой последовательности. Program Lab5_1; Var N: integer; BEGIN {1} ReadLn (N); While N < = 0 Do Begin {2} WriteLn ('Bведите длину последовательности N = '); ReadLn (N); End; {2} WriteLn ('Длина последовательности N = ', N); END. {1}
Пояснения к задаче 1 До первого входа в цикл переменной N уже должно быть присвоено начальное значение соответственно условию решаемой задачи. N – длина последовательности, что влечет за собой необходимость выполнения логического условия N > 0 (длина не может быть отрицательной). До тех пор пока мы будем вводить отрицательное или равное нулю число, цикл будет работать и требовать «Bведите длину последовательности N = ». Так как в цикле имеем два оператора, необходимо ставить операторные скобки Begin – End. В фигурных скобках {2} стоит номер операторных скобок. Напоминаем, что в фигурных скобках ставится комментарий, служащий для пояснения работы программы. Комментарий не вызывает никаких действий в программе, и его можно убрать без последствий для работы программы. Задача 2 Рассмотрим программу с использованием оператора цикла с предусловием, когда в качестве логического < Условия > стоит выражение 2*A < = 3*N +1.
60
Program Lab5_2; Var N, А: integer; Begin {1} A: = 1; N: = 2; While 2 * A < = 3 * N + 1 Dо Begin {2} A: = A + 2; N: = N + 1; End; {2} WriteLn (‘A = ‘, A =, ‘B = ‘,B =); End. {1} Пояснения к задаче 2 Пока условие 2 * A < = 3 * N + 1 является истинным (т. е. 2 * A оказывается меньше или равно 3 * N + 1), выполняются операторы циклической части: значение А увеличивается на 2 и результат вновь присваивается переменной А; значение N увеличивается на 1 и результат снова помещается в переменную N. Начальные значения переменных присвоены до начала оператора цикла (N: = 1; A: = 1). Переменные А и N, а также логическое выражение 2 * A < = 3 * N + 1 в процессе выполнения программы принимают значения, которые мы видим в табл. 11. Таблица 11 Идентификаторы и выражение A N 2*A<=3*N+1 Условие True или False
Первый 1 1 2<=4 True Истинно
Проходы цикла Второй Третий 3 5 2 3 6<=7 10 < = 10 True True Истинно Истинно
Четвертый 7 4 14 < = 13 False Ложно
Всего цикл проработает четыре раза. При А = 7 и N = 4 логическое выражение 2 * A < = 3 * N + 1 становится ложным (False) и управление передается за пределы цикла (за End {2}). 3. Оператор цикла REPEAT ... UNTIL Этот оператор организует так называемый цикл «ДО», или цикл с постусловием, так как проверка логического < Условия > завершения цикла осуществляется после каждого выполнения тела цикла (количество повторений цикла неизвестно). Вид цикла: REPEAT (Повторять) < тело цикла > UNTIL (До тех пор) < условие >; 61
Оператор цикла с постусловием состоит из ключевого слова repeat, за которым следуют операторы тела цикла, и замыкающего ключевого слова until, после которого указывается < Условие > окончания цикла. Логическое Логическое < Условие > выполнения цикла условие должно быть False, и как только < Условие > станет True (истинным), цикл прерывается. Блок-схема цикла repeat приведена на рис. 22. Упрощенно общую структуру опера- Рис. 22. Цикл «До» с постусловием тора repeat можно представить так: REPEAT Оператор; Оператор; …………. Оператор; UNTIL < Условие >; Оператор repeat не требует использования операторных скобок Begin – End, когда в его теле необходимо записать более одного оператора. Кроме того, оператор repeat является не столь универсальным, как оператор while, поскольку его логическое < Условие > располагается в конце тела цикла и операторы его тела будут всегда выполняться как минимум один раз. Выражение, используемое в качестве логического < Условия > окончания цикла, должно давать результат булевского типа. Общий принцип работы цикла с постусловием repeat такой же, как у цикла с предусловием while. Но логическое < Условие > проверяется не перед выполнением тела цикла, а после него, и управление циклом repeat прямо противоположно управлению циклом while. To есть цикл repeat продолжается, пока логическое < Условие > ложно (False), и заканчивается, когда логическое < Условие > становится истинным (True). В задаче 3 рассмотрим, как выглядит проверка длины вводимой последовательности при использовании оператора repeat (задача уже была рассмотрена нами при использовании оператора while). Задача 3 При вводе осуществить проверку длины вводимой последовательности. Program Lab5_3; Var N: integer; BEGIN {1} Repeat WriteLn ('Bведите длину последовательности N = '); ReadLn (N); Until N > 0; WriteLn ('Длина последовательности N = ' , N); END. {1}
62
Пояснения к задаче 3 Как и в задаче 1, длина последовательности обозначена буквой N и должна быть положительной. В логическое < Условие > ставим N > 0, и до тех пор, пока будет вводиться отрицательное или нулевое значение последовательности, цикл repeat будет работать и требовать: «Bведите длину последовательности N = ». Цикл выполняется до тех пор, пока пользователь будет вводить отрицательное число или ноль, и прервется при вводе положительного числа. Нижняя граница оператора определена словом until, и нет надобности в операторных скобках Begin – End. Но если поставить операторные скобки, то это не будет ошибкой. Задача 4 Вычислить значение функции Y = X2 при Х = 8; Х = 6; Х = 4; Х = 2. PROGRAM Lab5_4; Uses Crt Var X,Y: real; Begin ClrScr; X : = 8; WriteLn('Табулирование функции'); WriteLn(' X Y '); WriteLn('---------- '); Repeat Y : = X * X; WriteLn(X : 4 : 2, Y : 6 : 2); X : = X – 2; Until X = 0; ReadLn; End.
Пояснения к задаче 4 Мы имеем дело с задачей, которая называется «Табулирование функции». У нас аргумент Х меняет свое значение от 8 до 2 с шагом – 2. Переменные X, Y объявляем как REAL. В переменную Y заносим вычисленное значение функции. Для организации цикла используем оператор цикла с постусловием repeat. До входа в цикл присваиваем начальное значение аргументу Х, равное 8. Затем печатаем шапку таблицы (три оператора WriteLn перед оператором Repeat). Шапка таблицы используется для оформления таблицы. В теле цикла делаем вычисления по формуле, печать и изменение значений аргумента на шаг, который равен –2. Окончание цикла осуществляется проверкой в операторе Until. Как только Х примет значение, равное нулю, цикл прервется и далее последует оператор ReadLn.. 63
4. Оператор цикла с параметром (со счетчиком) FОR ... DO Оператор цикла со счетчиком for подходит для программирования только таких циклических фрагментов, в которых до выполнения цикла известны начальное и конечное значения счетчика повторений цикла. Это обусловливает его менее широкую сферу применения, чем более универсальных операторов while и repeat. Однако в тех случаях, когда его использование возможно, оператор for благодаря своей высокой наглядности имеет несомненное преимущество перед операторами циклов с условиями. Схематично цикл со счетчиком изображается Рис. 23. Цикл со счетчиком следующим образом (рис. 23). Упрощенно общую структуру оператора цикла for можно представить одним из следующих способов: 1. Если счетчик при выполнении цикла наращивает свое значение: FOR I : = N1 ТО N2 DO < тело цикла >; где I – управляющая переменная цикла, которая должна быть перечисляемого типа (целая, символьная и т. д.); N1 – начальное значение управляющей переменной цикла; N2 – конечное значение управляющей переменной цикла. Шаг изменения управляющей переменной равен + 1. Чтобы оператор выполнился хотя бы один раз, N1 (начальное значение счетчика) должно быть не больше, чем N2 (конечное значение счетчика). 2. Если счетчик при выполнении цикла уменьшает свое значение, то при программировании может быть использован другой оператор цикла: FOR I : = N2 DOWNTO N1 DO < тело цикла >; где I – управляющая переменная цикла, которая должна быть перечисляемого типа (целая, символьная и т. д.); N2 – начальное значение управляющей переменной цикла; N1 – конечное значение управляющей переменной цикла. Шаг изменения управляющей переменной равен –1. Чтобы оператор выполнился хотя бы один раз, нужно, чтобы N2 (начальное значение счетчика) было не меньше, чем N1 (конечное значение счетчика). Цикл for выполняется заданное число раз. Чтобы прервать выполнение досрочно, необходимо увеличить I до конечного значения. Заметим, что для оператора for, в отличие от while и repeat, установка начального значения счетчика циклов выполняется не перед заголовком цикла, а прямо в заголовке. Кроме того, после окончания тела цикла наращивание (уменьшение) значения счетчика происходит автоматически. Таким образом, специального оператора для увеличения значения счетчика I : = I + l не требуется. Более того, этот оператор приведет к неправильной работе цикла.
64
В большинстве реализаций языка Pascal изменение значений переменных, используемых в заголовке цикла for, запрещено и приводит к выдаче сообщения об ошибке на этапе компиляции. В реализации Turbo Pascal этот запрет снят, однако такие действия в рамках цикла for приводят, как правило, к его непредсказуемому поведению и считаются плохим стилем программирования. В Turbo Pascal, так же как и во всех других реализациях языка Pascal, оператор for имеет два существенных ограничения: – шаг изменения счетчика циклов может быть только или + 1 (если используется ключевое слово to), или – 1 (если используется ключевое слово downto); – переменная, выступающая в роли счетчика циклов, может быть только порядкового типа и должна быть локальной для того блока, в котором находится оператор for. Рассмотрим задачи с применением оператора цикла for. Задача 5 Вычислить значения двух величин по формулам: A = 2I и B = 2I + 1, где I меняется от 1 до 4 с шагом 1. Program Lab5_5 Var I, B, A : Integer; Begin {1} For I : = 1 Тo 4 Do Begin {2} A : = 2 * I; B : = 2 * I + 1; WriteLn (A : 3, B : 3); End; {2} End. {1}
Пояснения к задаче 5 I – управляющая переменная циклом (по ее значению цикл начинается и завершается) принимает значения: I = 1, I = 2, I = 3, I = 4 (шаг = 1). Выполняются операторы циклической части: значения А и B вычисляются по формуле и принимают следующие значения в процессе выполнения программы (табл. 12). Всего цикл проработает четыре раза. При I = 4 последний раз идет вычисление A, B и управление передается за пределы цикла. Таблица 12 I – управляющая переменная циклом; A, B – выражения I A:=2*I B:=2*I+1
Первый 1 2 3
65
Проходы цикла Второй Третий 2 3 4 6 5 7
Четвертый 4 8 9
5. Сравнение работы операторов while, repeat и for Отметим отличия и особенности хорошего стиля работы с рассмотренными циклическими операторами (табл. 13). Таблица 13 Цикл с предусловием while Цикл с постусловием repeat ( пока условие истинно ) ( до истинности условия) 1. До начала цикла должны быть сделаны начальные установки переменных, управляющих условием цикла, для корректного входа в цикл 2. В теле цикла должны присутствовать операторы, изменяющие переменные условия так, чтобы цикл через некоторое число итераций завершился 3. Цикл работает, пока условие истин- 3. Цикл работает, пока условие ложно (пока но ( пока True ) False) 4. Цикл завершается, когда условие 4. Цикл завершается, когда условие становится становится ложным (до False) истинным (до True) 5. Цикл может ни разу не выполнить- 5. Цикл обязательно выполняется как минимум ся, если исходное значение условия один раз при входе в цикл равно False 6. Если в теле цикла требуется более 6. Независимо от количества операторов в теле одного оператора, то необходимо ис- цикла использование составного оператора не пользовать составной оператор требуется Цикл со счетчиком for 1. Начальная установка переменной счетчика циклов до заголовка не нужна 2. Изменение в теле цикла значений переменных, стоящих в заголовке цикла, не допускается 3. Количество итераций цикла неизменно и точно определяется значениями нижней и верхней границ и шага цикла 4. Нормальный ход работы цикла может быть нарушен оператором goto или процедурами Break и Continue 5. Цикл может не выполниться ни разу, если шаг цикла будет изменять значение счетчика от нижней границы в направлении, противоположном верхней границе
6. Вложенные циклы В циклических вычислительных процессах часто встречаются так называемые вложенные (сложные) циклы, содержащие внутри себя один или несколько других циклов. Таким образом, одни циклы оказываются вложенными, включенными в другие. Циклы, охватывающие другие циклы, называют внешними, а входящие во внешние циклы – вложенными, или внутренними. Важно понимать, что для каждого значения управляющей переменной внешнего цикла выполняется оператор, описывающий внутренний цикл. При этом параметр внутреннего цикла принимает все значения, заданные списком этого цикла. Наглядный пример – заполнение таблицы умножения с помощью двух вложенных циклов: for i : =1 to 9 do for j : = 1 to 9 do WriteLn (i, ' x ‘, j , ' = ', i * j);
66
Для каждого из девяти значений параметра внешнего цикла i (множимого) исполнится внутренний цикл, в котором его параметр j (множитель) меняется от 1 до 9. Циклы могут быть вложены один в другой. При их использовании программу составляем таким образом, чтобы внутренний цикл полностью укладывался во внешний цикл (матрешка). 6.1. Структура вложенных циклов
НАЧАЛО ЦИКЛА I; НАЧАЛО ЦИКЛА J; Начало цикла M Конец цикла M КОНЕЦ ЦИКЛА J; КОНЕЦ ЦИКЛА I; Рассмотрим задачу, где применяются вложенные циклы. Задача 6 Вычислить значение функции Y = 2K + I. При этом I меняется от единицы до трех с шагом, равным единице, а К меняется от трех до девяти с шагом, равным двум. Program Lab5_6; Var I, K, Y: integer; BEGIN {1} For N = 1 to 3 Do Внешний цикл по N Begin {2} K : = 3; While K < = 9 Do Begin {3} Внутренний цикл по К Y : = 2 * K + I; WriteLn (I : 4, K : 4, Y : 4); K : = K + 2; End; {3} End;{2} END. {1}
Пояснения к задаче 6 Блок-схема программы представлена на рис. 24. Согласно условию задачи мы должны сделать вычисления по формуле: Y : = 2 * K + I. Поскольку в формуле две переменные I и K меняют свои значения, организовано два цикла : – внешний цикл по I (с шагом 1); – внутренний цикл по K (с шагом 2). 67
Внешним циклом управляет переменная I – это цикл со счетчиком for. Управляющая переменная I принимает значения 1, 2, 3. Значения, которые получают в процессе выполнения программы переменные I, K и вычисленные по формуле значения Y, приведены в табл. 7. Переменная I меняется медленнее, чем К. 1. Внутренним циклом управляет переменная K. Она меняет свое значение от 3 до 9 с шагом 2. Значит, K принимает значения, равные 3, 5, 7, 9. Внутренний цикл организован с помощью оператора цикла while. До входа в цикл присваиваем управляющей переменной внутреннего цикла К начальное значение, равное 3. В цикле делаем вычисления по формуле, печать и изменение значений К на шаг, который равен 2. Окончание цикла осуществляется проверкой условия K < = 9 в операторе Рис. 24. Вычисление значений функции y= 2K + i While. Как только К примет значение, равное 9, цикл выполнится последний раз и прервется, выйдет на End{2}. Как меняются в цикле переменные, мы видим в табл. 14. Таблица 14 N K Y
1 2 5
4 9
2 6 13
8 17
2 6
4 10
3 6 14
8 18
2 7
4 11
6 15
8 19
7. Контрольные вопросы 1. Как называются программы, в основе которых лежит структура повторения? 2. Сколько операторов цикла вам известно? 3. Как называется оператор, синтаксическая диаграмма которого приведена на рис. 25?
Рис. 25
4. Какой тип выражения в операторе цикла с предусловием? 5. Верно ли, что в теле цикла с предусловием должен находиться один оператор? 68
6. Как сделать, чтобы в теле цикла было несколько операторов? 7. Когда проверяется истинность выражения в цикле while? 8. Верно ли, что истинность выражения в цикле с предусловием является условием продолжения цикла? 9. Сколько раз выполнится оператор в теле цикла whi1e, если с самого начала значение выражения равно false? 10. Верно ли, что цикл while используется при вычислении всякого рода сумм и произведений, когда заранее не известно число повторений? 11. Как называется оператор, синтаксическая диаграмма которого приведена на рис. 26?
Рис. 26
12. Сколько операторов можно записать между ключевыми словами repeat и until? 13. Когда проверяется истинность выражения в операторе цикла repeat? 14. Какой тип имеет выражение в операторе цикла с постусловием? 15. Почему в цикле repeat оператор тела цикла всегда будет выполнен хотя бы один раз? 16. Верно ли, что истинность выражения в цикле repeat является условием окончания цикла? 17. С помощью каких служебных слов записывается цикл с параметром? 18. Верно ли, что цикл с параметром применяется в тех случаях, когда заранее известно число повторений? 19. Пусть цикл записан в виде for I : = Nl to N2 do S; Тогда: а) как называется Nl? б) как называется N2? в) как называется I? 20. Сколько раз выполнится оператор S, если N1 = N2, а цикл записан в виде for I : = Nl to N2 do S? 21. Сколько раз выполнится оператор S и можно ли изменить значение переменной I внутри цикла, если N1 > N2, а цикл записан в виде for I : = Nl to N2 do S? 22. Сколько раз выполнится оператор S, если N1 = N2, а цикл записан в виде for I : = Nl downto N2 do S? 23. Сколько раз выполнится оператор S, если N1 < N2, а цикл записан в виде for I : = Nl downto N2 do S? 24. Верно ли, что в качестве параметра цикла for используется простая переменная, описанная в текущем блоке? 69
25. Какой тип должен иметь параметр цикла в цикле for? 26. Какой тип должны иметь начальное и конечное значения в цикле for? 27. Чему равно значение параметра цикла for после завершения цикла? 28. Можно ли войти в тело цикла for, минуя его заголовок? 29. Можно ли войти в тело цикла while, минуя его заголовок? 30. Можно ли войти в тело цикла repeat, минуя его заголовок? 31. Допустим ли выход из тела цикла for? 32. Допустим ли выход из тела цикла while? 33. Допустим ли выход из тела цикла repeat? 34. Какие циклы называются вложенными? 35. Верно ли, что цикл, содержащий в себе другой цикл, называется внешним? 36. Какой цикл называется внутренним? 37. Какому условию должны удовлетворять вложенные циклы? 38. Может ли внешний цикл быть циклом for, а внутренний – циклом repeat? 39. Могут ли внутренний и внешний циклы быть циклами разных видов? 40. Могут ли внутренний и внешний циклы быть циклами одного вида? 41. Может ли вещественная переменная быть параметром цикла for? 42. Можно ли в качестве параметров вложенных циклов for использовать одну и ту же переменную? 43. Какие утверждения являются верными (проиллюстрируйте ответ соответствующими примерами): а) любой цикл for можно записать при помощи цикла while; б) любой цикл while можно записать при помощи цикла for; в) не любой цикл for можно записать при помощи цикла while; г) не любой цикл while можно записать при помощи цикла for. 8. Практическое задание – решение задач с использованием операторов цикла Организовать ввод данных и решение задач с использованием операторов цикла, снабдив распечатки соответствующими заголовками.
Методические указания 1. Составить блок-схему программы, после чего приступить к написанию программы в ИСП. 2. Желательно сделать форматированный вывод результатов вычислений. Вариант 1 1. Написать программу, которая выводит таблицу квадратов первых десяти целых положительных чисел. Ниже представлен рекомендуемый вид экрана во время работы программы.
70
Таблица квадратов Число Квадрат 1 1 2 4 3 9 4 16 5 25 6 36 7 49 8 64 81 9 1 000 10 2. В классе N учеников. Определить средний рост учеников класса, вводя в ЭВМ по очереди рост каждого ученика. 3. Написать программу, которая «задумывает» число в диапазоне от 1 до 10 и предлагает пользователю угадать число за 5 попыток. Ниже представлен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом). Игра «Угадай число». Компьютер «задумал» число от 1 до 10. Угадайте его за 5 попыток. Введите число и нажмите < Enter > – > 5 Нет. – > 3. Вы угадали! Поздравляю! Вариант 2 1. Написать программу, которая выводит таблицу квадратов первых пяти целых положительных нечетных чисел. Ниже представлен рекомендуемый вид экрана во время работы программы. Таблица квадратов нечетных чисел Число Квадрат 1 1 3 9 5 25 7 49 9 81
2. Определить суммарный объем в литрах 12 вложенных друг в друга шаров со стенками толщиной 5 мм. Внутренний диаметр внутреннего шара равен 10 см. Считать, что шары вкладываются друг в друга без зазоров. Указания к решению задачи 2 Необходимо в цикле по номеру шара вычислять объем каждого шара (V = (4/3)πR3) и прибавлять его к суммарному объему. Диаметр каждого следующего вложенного шара отличается от диаметра вложенного в него шара на 10 мм. 71
3. Написать программу, которая определяет максимальное число из введенной с клавиатуры последовательности положительных чисел (длина последовательности неограниченна). Ниже представлен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом). Определение максимального числа последовательности положительных чисел. Вводите после стрелки числа. Для завершения ввода введите ноль. – > 56 – > 75 – > 43 –>0 Максимальное число: 75 Вариант 3 1. Написать программу, которая вычисляет сумму первых n целых положительных чисел. Количество суммируемых чисел должно вводиться во время работы программы. Ниже представлен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом). Вычисление суммы положительных чисел. Введите количество суммируемых чисел – > 20 Сумма первых 20 положительных чисел равна 210
2. В 1985 году урожай ячменя составлял 20 ц с га. В среднем каждые 2 года за счет применения передовых агротехнических приемов урожай увеличивается на 5%. Определить, через сколько лет урожайность достигнет 25 ц с га. 3. Заданы две стороны треугольника A, B. Вводя по очереди еще по два числа и интерпретируя их как длины сторон треугольника, напечатать те из введенных сторон, которые при соответствующем сравнении могут образовать треугольник, подобный первому (со сторонами A, B). Вариант 4 1. Написать программу, которая выводит на экран таблицу умножения, например на 7. Рекомендуемый вид экрана во время работы программы приведен ниже. Данные, введенные пользователем, выделены полужирным шрифтом. Введите n – > 7 Таблица умножения на n = 7 7 х 2 = 14 7 х 3 = 21 7 х 4 = 28 7 х 5 = 35 7 х 6 = 42 7 х 7 = 49 7 х 8 = 56 7 х 9 = 63 72
2. Дана последовательность чисел 1, 2, 4, 8, 16… Найти первый член последовательности, превосходящий заданное число А. 3. В доме шесть комнат, каждая из которых имеет форму прямоугольника. Длина и ширина каждой из шести комнат указаны ниже. Написать программу, которая выводит площадь каждой комнаты Найти суммарную площадь всех комнат в этом доме. Номер комнаты 1 2 3 4 5 6
Длина, м 4,5 3 4,5 5,5 6,5 7
Ширина, м 3,5 2,5 4,5 3,5 3,5 4,5
Вариант 5 1. Написать программу, которая вычисляет сумму первых n членов ряда 1, 3, 5, 7, 9, … Количество суммируемых членов ряда N задается во время работы программы. Ниже представлен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом). Вычисление частичной суммы ряда: 1, 3, 5,7, ... Введите количество суммируемых членов ряда – > 15. Сумма первых 15 членов ряда равна 225
2. Напечатать таблицу значений функции Y = X3 при изменении X от 2 до 12 с шагом 2. 3. Начав тренировки, спортсмен в первый день пробежал 10 км. Каждый следующий день он увеличивал дневную норму на 10% от нормы предыдущего дня. Через сколько дней спортсмен пробежит суммарный путь 100 км? Вариант 6 1. Написать программу, которая вычисляет сумму первых n членов ряда 1 + 1/2 + 1/3 + 1/4 + … Количество суммируемых членов ряда задается во время работы программы. Ниже представлен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом). Вычисление частичной суммы ряда: 1 + 1/2 + 1/3 + ... Введите количество суммируемых членов ряда – > 15 Сумма первых 15 членов ряда равна 3,3182 2. Начав тренировки, спортсмен в первый день пробежал 10 км. Каждый следующий день он увеличивал дневную норму на 10% от нормы предыдущего дня. Какой суммарный путь спортсмен пробежит за 7 дней?
73
3. Cберегательная касса начисляет 2% годовых (т. е. через год вклад увеличивается на 2% без участия вкладчика). Какой станет сумма (в руб.), положенная в сберкассу на N лет? Вариант 7 1. Написать программу, которая выводит таблицу степеней двойки (от нулевой до десятой). Ниже представлен рекомендуемый вид экрана во время работы программы. Таблица степеней двойки 0 1 1 2 2 4 3 8 4 16 5 32 6 64 7 128 8 256 9 512 10 1 024
2. Начав тренировки, спортсмен в первый день пробежал 10 км. Каждый следующий день он увеличивал дневную норму на 10% от нормы предыдущего дня. Через сколько дней спортсмен будет пробегать больше 20 км? 3. Написать программу, которая проверяет для N чисел, является ли целое число, введенное пользователем, простым. Рекомендуемый вид экрана во время работы программы приведен ниже. Данные, введенные пользователем, выделены полужирным шрифтом. Введите N – > 3 Введите целое число и нажмите < Enter > – > 45 45 – не простое число Введите целое число и нажмите < Enter > – > 7 7 – простое число Введите целое число и нажмите < Enter > – > 19 19 – простое число Указания к решению задачи 3 Простым называется число, которое делится только само на себя (например, 3, 5,17 и т. д.). «Число 1 может быть отнесено к простым числам, однако предпочтительно выделять его особо, не относя ни к простым, ни к составным». (Выгодский М.Я. Справочник по элементарной математике.) Вариант 8 1. Написать программу, которая вычисляет факториал числа, введенного с клавиатуры. (Факториалом числа n называется произведение целых чисел
74
от 1 до n, например: факториал числа 1 равен 1, а факториал числа 8 – 40 320.) Рекомендуемый вид экрана приведен ниже. Данные, введенные пользователем, выделены полужирным шрифтом. Вычисление факториала Введите число, факториал которого надо вычислить, и нажмите < Enter > – > 7 Указания к решению задачи 1 Переменной, где будет находиться вычисленное значение факториала, надо присвоить тип Longint. 2. В киоске продается газета стоимостью 3 коп. и журнал стоимостью 20 коп. Составить программу, которая спрашивает о желании покупателя (журнал или газета?), принимает деньги (сумма денег вводится с клавиатуры) и печатает причитающуюся сдачу. Исходные данные задать самостоятельно. Количество покупателей равно N. Указания к решению задачи 2 Покупателю нужно задать по меньшей мере два вопроса: 1. «Что хотите купить: журнал или газету?» После ввода ответа нужно показать соответствующую стоимость издания и задать следующий вопрос. 2. «Сколько платите?» Количество денег покупателя вводится с клавиатуры (в числовую переменную). Далее надо сравнить это количество со стоимостью покупки и напечатать итоговое сообщение. 3. Пусть дано натуральное число N и последовательность из N вещественных чисел, среди которых есть хотя бы одно отрицательное. Найти наибольшее среди отрицательных чисел этой последовательности. Вариант 9 1. Написать программу, которая выводит таблицу значений функции у = –2,4х2 + 5х – 3 в диапазоне от –2 до 2 с шагом 0,5. Ниже представлен рекомендуемый вид экрана во время работы программы: x –2 –1,5 –1 –0,5 0 0,5 1 1,5 2
y –22,60 –15,90 –10,40 –6,10 –3,00 –1,10 –0,40 –0,90 –2,60
75
2. В ЭВМ поступают результаты соревнований по плаванию для трех спортсменов. Выбрать и напечатать лучший результат. Решить задачу для следующих наборов данных: 1) 11,3; 10,6; 11; 2) 10; 10,9; 13; 3) 16; 18; 13. Указания к решению задачи 2 Задача сводится к определению минимального из трех чисел. 3. Написать программу, которая вычисляет сумму первых n членов ря1 1 1 1 да s = 1 + + + + . Количество суммируемых членов ряда задается во 3 5 7 9 время работы программы. Рекомендуемый вид экрана во время работы программы такой же, как в варианте 6 (задача 1). Вариант 10 1. Написать программу, которая вводит с клавиатуры 5 дробных чисел и вычисляет их среднее арифметическое. Рекомендуемый вид экрана во время работы программы приведен ниже. Данные, введенные пользователем, выделены полужирным шрифтом. Вычисление среднего арифметического последовательности дробных чисел. После ввода каждого числа нажимайте < Enter >: – > 5,4 – > 7,8 – > 3,0 – > 1,5 – > 2,3 Среднее арифметическое введенной последовательности: 4,00
2. ЭВМ используется при разборе коллекции марок. Составить программу, подсчитывающую число марок тематически: по спорту, искусству, городам. Подсчитать общее количество марок. Использовать множественный выбор. Указания к решению задачи 2 Названия типов марок закодировать числами 1, 2, 3. В зависимости от введенного значения типа марки для перехода к выполнению нужного оператора использовать оператор множественного выбора. Для окончания ввода можно использовать специальное значение, например ноль. 3. Вводится последовательность ненулевых чисел, ноль – конец последовательности. Определить, является ли последовательность возрастающей. Вариант 11 1. Написать программу, которая вводит с клавиатуры последовательность из пяти дробных чисел и после ввода каждого числа выводит среднее арифметическое полученной части последовательности. Рекомендуемый вид
76
экрана во время работы программы приведен ниже. Данные, введенные пользователем, выделены полужирным шрифтом. Обработка последовательности дробных чисел. После ввода каждого числа нажимайте < Enter > – > 12,3 Введено чисел: 1 Сумма: 12,30 Среднее арифметическое: 12,30 – > 15 Введено чисел: 2 Сумма: 27,30 Среднее арифметическое: 13,65 – > 10 Введено чисел: 3 Сумма: 37,30 Среднее арифметическое: 12,43 – > 5,6 Введено чисел: 4 Сумма: 42,90 Среднее арифметическое: 10,73 – > 11,5 Введено чисел: 5 Сумма: 54,40 Среднее арифметическое: 10,88 2. Напечатать таблицу перевода температуры из градусов по шкале Цельсия (С) в градусы по шкале Фаренгейта (F) для значений от 15ºС до 30ºС с шагом 1ºС. Указания к решению задачи 2 Перевод осуществляется по формуле F = 1,8С + 32. 3. Вводится N чисел. Вывести на экран те числа, делителем которых является целое число А. Вариант 12 1. Написать программу, которая выводит таблицу значений функции у = |х – 2| + |х + 1|. Диапазон изменения аргумента от – 4 до 4, шаг приращения аргумента равен – 0,5. Вид экрана такой, как в варианте 9 (задача 1).
2. Пусть дано шесть целых чисел, которые вводятся по одному. Получить сумму тех из них, которые кратны 5. 3. Написать программу, вычисляющую сумму и среднее арифметическое последовательности положительных чисел, которые вводятся с клавиатуры. Ниже представлен рекомендуемый вид экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом). Вычисление среднего арифметического последовательности положительных чисел. 77
Вводите после стрелки числа. Для завершения ввода введите ноль: – > 45 – > 23 – > 15 –>0 Введено чисел: 3 Сумма чисел: 83 Среднее арифметическое: 27,67 Вариант 13 1. Написать программу, которая генерирует десять случайных чисел в диапазоне от 1 до 10, выводит эти числа на экран и вычисляет их среднее арифметическое. Рекомендуемый вид экрана во время работы программы приведен ниже. Случайные числа 1342749621 Среднее арифметическое: 3,9
2. В ЭВМ по очереди вводятся координаты n точек. Определить, сколько из них принадлежат фигуре, ограниченной осью абсцисс и аркой синусоиды, построенной для аргумента от 0 до π. Указания к решению задачи 2 Для каждой точки нужно проверять ограничение на Х (0 ≤ Х ≤ π.) и на Y (0 ≤ Y ≤ SinX). 3. Стоимость доставки груза самолетом составляет 2 500 руб. за м3 объема груза. Написать программу, которая выводит стоимость доставки каждого из пяти ящиков, размеры которых приведены ниже. Найти общую стоимость груза. Длина, м 4 6 4 3 4
Ширина, м 2 2 2,5 3 2
Высота, м 3 2 2,5 3 6
Вариант 14 1. Написать программу, которая выводит таблицу значений функции у = |х + 2| + sinx. Диапазон изменения аргумента – от –4 до 4, шаг приращения аргумента равен 1. Вид экрана такой, как в варианте 9 (задача 1).
2. Пусть дано семь целых чисел, которые вводятся по одному. Получить сумму тех из них, которые меньше по абсолютному значению квадрата порядкового номера вводимого числа. 78
Указания к решению задачи 2 Нужно организовать цикл по количеству вопросов, а начать так: «Сколько вопросов зададите?» 3. Написать программу, которая бы спрашивала название времени года, а затем печатала названия месяцев, относящихся к этому времени года, например: ВЕСНА – март, апрель, май. В случае неверного ввода программа должна печатать: «Такого месяца нет». Вариант 15 1. Написать программу, которая выводит на экран таблицу стоимости (например, яблок), в диапазоне от 100 г до 1 кг с шагом 100. Ниже представлен рекомендуемый вид экрана программы во время ее работы (данные, введенные пользователем, выделены полужирным шрифтом). Введите цену одного килограмма и нажмите < Enter > (копейки от рублей отделяйте точкой) > 16.50: Вес, г 100 200 300 400 500 600 700 900 900 1000
Стоимость, руб. 1.65 3.30 4.95 6.60 8.25 9.90 11.55 13.20 14.85 16.50
2. Ученикам 1-го класса назначается дополнительно стакан молока (200 мл), если их вес составляет меньше 30 кг. Определить, сколько литров молока потребуется ежедневно для одного класса, состоящего из N учеников. После взвешивания вес каждого ученика вводится в компьютер. Указания к решению задачи 2 Если вес очередного ученика меньше 30 кг, то к числу учеников, которым назначается молоко, нужно прибавить 1. 3. Заданы N троек чисел A, B, C. Вводя их по очереди и интерпретируя как длины сторон треугольника, определить, сколько троек может быть использовано для построения треугольника. Вариант 16 1. Написать программу, которая вычисляет сумму первых n целых положительных четных чисел. Количество суммируемых чисел должно вводиться во время работы программы. Ниже представлен рекомендуемый вид
79
экрана во время работы программы (данные, введенные пользователем, выделены полужирным шрифтом). Вычисление суммы четных положительных чисел Введите количество суммируемых чисел – > 12 Сумма первых 12 положительных четных чисел равна 156 2. Вычислить значения функции y = 4x3 – 2x2 + 5 для значений х, изменяющихся от –3 до 1, с шагом 0,1. 3. Сберегательная касса начисляет 2% годовых (т. е. через год вклад увеличивается на 2% без участия вкладчика). Какой станет сумма (в руб.), положенная в сберкассу на N лет?
ЛАБОРАТОРНАЯ РАБОТА № 6 ОРГАНИЗАЦИЯ ИТЕРАЦИОННЫХ ЦИКЛОВ В ПРОГРАММЕ
Цели работы 1. Получение навыков в выборе и использовании операторов цикла. 2. Знакомство с итерационными процессами. 3. Вычисление суммы бесконечного ряда с заданной точностью. Теоретический материал 1. Общие положения Различают циклы с заданным и неизвестным числом повторений. К последним относятся итерационные циклы, характеризующиеся последовательным приближением к искомому значению с заданной точностью. Итерация [iteration] – это процесс вычислений, основанный на повторении последовательности операций, при котором на каждом шаге повторения используется результат предыдущего шага. 1.1. Способы задания последовательности Пусть каждому натуральному числу поставлено в соответствие определенное действительное число: 1 → a1, 2 → a2, …, n → an, тогда имеем a1, a2, …, an и говорим, что задана числовая последовательность.
80
Имеем следующие способы задания последовательности: 1. Аналитический способ – задается формулой n-го члена ряда, напри1 2 3 n . мер: an = n . Получаем последовательность: , , L 2 3 4 n +1 n +1 2. Рекуррентный способ – это такой способ задания последовательности, когда любой член последовательности, начиная с некоторого, выражается через предыдущие члены. При этом способе задания последовательности указывают ее первый член (или несколько начальных членов) и формулу, позволяющую определить любой член последовательности по известным предшествующим членам. Пример: арифметическая прогрессия an+1 = an + d . При a1 = 2, d = 0,5 получим ряд: –2, –1,5, –1, –0,5, 0, 0,5…. В математике суммы вида а1 + а2 + ... + аn + ... + ak, где ak – заданная числовая последовательность (k принадлежит N), называются числовыми рядами. Конечные суммы S1 = а1, S2 = а1 + а2, ..., Sn = а1 + а2, ..., an называются частичными суммами ряда. Если существует конечный предел последовательности частичных сумм S, то ряд называется сходящимся, а число S – суммой ряда. В противном случае ряд называется расходящимся и суммы не имеет. Ряды, членами которых являются не числа, а функции, определенные в некоторой области изменения аргумента х, называются функциональными: n
s = f1 ( x) + f 2 ( x) + ... f n ( x) = ∑ f ( x) . i =1
Например: sinx + 1/2 sin2x + ... + 1/nsinx + ... Придавая х какое-либо значение x0 из области определения функций an(х), получим числовой ряд: f1(x0) + f2(x0) + ... + fn(x0) + ..., который может сходиться или расходиться. Важным частным случаем функциональных рядов являются степенные ряды. Степенным рядом называется ряд вида a0 + a1(x – a) + ... + an(x – a)n +..., где а и коэффициенты ряда – постоянные. В частности, при а = 0 степенной ряд имеет вид: a0 + a1x + ... + anxn + ... Приведенные начальные сведения из теории рядов будут использоваться в некоторых последующих примерах, так как суммирование рядов имеет учебную и практическую ценность. Различают два основных вида суммирования: – вычисление суммы первых п членов ряда; – вычисление суммы ряда с наперед заданной точностью. 1.2. Вычисление суммы первых n членов ряда Вычисление конечной суммы сводится к нахождению суммы заданного количества слагаемых.
81
Вычисление суммы организуется в виде циклического алгоритма, когда при каждом прохождении цикла номер слагаемого i увеличивается на единицу, а сумма изменяется на величину i-го слагаемого, т. е. si +1 = si + f (i ) , где si и si+1 – соответственно суммы слагаемых. Цикл будет повторяться до тех пор, пока не будут вычислены все n слагаемых. Начальное значение суммы должно быть обнулено (S = 0). Вывод результата осуществляется по окончании цикла. Задача 1 Вычислить сумму десяти членов ряда, 1 в котором an = 4 , т. е. мы должны вычисn 10 1 лить сумму ∑ 4 . i=1 n Составим блок-схему программы (рис. 27). В алгоритме рекуррентное соотношение 1 запишется так: s = s + 4 . n PROGRAM Lab6_1; VAR n : Integer; S : Real; BEGIN S : = 0; For n : = 1 To 10 DO S : = S + 1/exp(4*ln(n)); Рис. 27. Блок-схема программы вычисления суммы 10 членов ряда WRITELN('СУММА = ', S); END.
1.3. Вычисление суммы бесконечного ряда Вычисление суммы бесконечного ряда осуществляется с заданной точностью, которая определяется по члену ряда, который меньше некоторой величины ε. Заранее неизвестно, при каком члене ряда будет достигнута требуемая точность, поэтому это цикл с неизвестным количеством повторений. Выход из цикла осуществляется по достижении требуемой точности. Для вычисления результата используется прием накопления суммы (последовательное нахождение частичных сумм). Вычисление закончим, когда |Sn + 1 – Sn| < = ε, что означает: |S1| < = ε, т. е. когда абсолютная величина очередного члена ряда станет не больше заданной точности вычислений.
82
Задача 2 Пусть требуется найти сумму ряда с точностью ε = 10–4. Общий член ряда вычисляется по формуле 2( n!) 2 an = . 3( 2n)! Как уже указывалось, при рекуррентном способе задания последовательности указывают ее первый член (или несколько начальных членов) и формулу, позволяющую определить любой член последовательности по известным предшествующим членам. Для получения рекуррентной формулы вычислим отношение следующего члена ряда к текущему: an+1 2((n + 1)!) 2 ⋅ 3(2n)! n +1 = , = 2 2(2n + 1) an 3(2n + 2)!2(n!) an (n + 1) . 2(2n + 1) При составлении программы будем считать, что точность вычислений будет достигнута при an < ε. PROGRAM Lab6_2; Const Eps = 0.1E – 3; VAR N : Integer; AN, SUMMA : Real; BEGIN SUMMA : = 0; N : = l; AN : = 1/3; While AN > Eps DO Begin {2} SUMMA; = SUMMA + AN; N : = N + 1; AN : = AN * (N + 1)/(2 * (2 * N + 1)); End; {2} WriteLn('СУММА = ', SUMMA,’ ПОСЛЕДНИЙ ЧЛЕН РЯДА = ', AN); WriteLn('ПОСЛЕДНИЙ ЧЛЕН РЯДА = ', AN); END. {1} Протокол работы программы. Вычисление суммы бесконечного ряда: сумма = 4,72743922744030E – 0001; последний член ряда = 4,11353352529620E – 0005.
откуда an+1 =
Пояснения к задаче 2 Цикл организован с помощью оператора while. Цикл будет выполняться до тех пор, пока не получим очередной член ряда, который будет меньше за83
данной точности вычислений ε. По выходе из цикла печатаем сумму ряда S и последний член ряда. Перед входом в цикл задаются начальные значения переменных S = 0. Здесь накапливается сумма, и AN = 1/3 – это первый член ряда, вычисленный нами. Выводится сумма ряда S и последний член ряда в формате с плавающей запятой. 2. Контрольные вопросы 1. Что такое итерация? 2. Что такое числовая последовательность? 3. Приведите пример числовой последовательности. 4. Назовите особенности обычных и рекуррентных числовых последовательностей. 5. Объясните формулу для вычисления суммы первых n членов арифметической прогрессии. 6. Что называется рекуррентным соотношением? 7. В каких случаях используются безындексные переменные? 8. Какие минимальные изменения следует внести в алгоритм суммирования членов последовательности, чтобы получить алгоритм вычисления произведений членов последовательности? 9. Что такое бесконечный ряд? 10. Как вычисляется сумма бесконечного ряда? 11. Для чего дается точность вычислений ε при вычислении суммы членов бесконечного ряда? 3. Практическое задание – решение задач с организацией итерационного процесса Решить предложенные задачи по вариантам.
Методические указания 1. Составить блок-схему программы, после чего приступить к написанию программы в ИСП. 2. Для получения рекуррентной формулы вычислить отношение следующего члена ряда к текущему. 3. Используя оператор цикла, найти сумму элементов, указанных в конкретном варианте, применяя предложенную методику вычисления суммы ряда. 4. Сделать программе соответствующий заголовок. Получить результат: сумму ряда, последний член ряда согласно заданной точности вычислений. Результат работы программы (сумму ряда, последний член ряда) напечатать в формате с плавающей запятой. Организовать также печать каждого вычисляемого члена ряда. Протокол работы программы должен выглядеть так (образец распечатки дан применительно к задаче 2): 84
Вычисление суммы бесконечного ряда: 1-й член ряда = 3,33333333333485E – 0001; 2-й член ряда = 1,00000000000023E – 0001; 3-й член ряда = 2,85714285714391E – 0002; 4-й член ряда = 7,93650793650613E – 0003; 5-й член ряда = 2,16450216450070E – 0003; 6-й член ряда = 5,82750582750258E – 0004; 7-й член ряда = 1,55400155400054E – 0004; Сумма = 4,72743922744030E – 0001. Последний член ряда равен = 4,11353352529620E – 0005. Вариант 1 Найти сумму ряда с точностью ε = 10–3, общий член которого вычисляется по формуле an = (2n – 1)/2n. Вариант 2 Найти сумму ряда с точностью ε = 10–2, общий член которого определяется выражением an = 5n/n! Вариант 3 Найти сумму ряда с точностью ε = 10–2, общий член которого находится по формуле an = 1/((3n – 2)(3n + 1)). Вариант 4 Найти сумму ряда с точностью ε = 10–2 , общий член которого определяется формулой an = 10n/n! Вариант 5 Найти сумму ряда с точностью ε = 10–3, общий член которого находим по формуле an = 1/2n + 1/3n Вариант 6 Найти сумму ряда с точностью ε = 10–3, общий член которого находим по формуле an = n!/nn Вариант 7 Найти сумму ряда с точностью ε = 10–2, общий член которого определяется выражением an = 2n+1 /(2n + 1)! Вариант 8 Найти сумму ряда с точностью ε = 10–3, общий член которого находим по формуле an = 3n n!/(3n)! Вариант 9 Найти сумму ряда с точностью ε = 10–3, общий член которого находим по формуле an = n!/(3nn).
85
Вариант 10 Найти сумму ряда с точностью ε = 10–5, общий член которого определяется формулой an = (n!)2/2n*n. Вариант 11 Найти сумму ряда с точностью ε = 10–3, общий член которого определяется формулой an = n2/(2n + 1). Вариант 12 Найти сумму ряда с точностью ε = 10–3, общий член которого определяется формулой an = 2n n!/(2n)! Вариант 13 Найти сумму ряда с точностью ε = 10–3, общий член которого находим по формуле an = (n2 + 1)/n! Вариант 14 Найти сумму ряда с точностью ε = 10–3, общий член которого определяется выражением an = (2n – 1)/(2n)! Вариант 15 Найти сумму ряда с точностью ε = 10–3, общий член которого определяется формулой an = (3n – 1)/3n. Вариант 16 Найти сумму ряда с точностью ε = 10–3, общий член которого определяется формулой an = (2n!)2/(3n)!
ЛАБОРАТОРНАЯ РАБОТА № 7 СЛОЖНЫЕ ТИПЫ ДАННЫХ (МАССИВЫ)
Цели работы 1. Освоение структуры программы, в которой используются для своей реализации одномерные массивы. 2. Освоение структуры программы, в которой используются для своей реализации двумерные массивы. 3. Получение навыков в написании программ, содержащих индексную информацию на языке Паскаль. 86
Теоретический материал 1. Общие положения Построение более крупных структур данных для хранения и обработки в программах сложных видов информации обеспечивается структурными типами. Они образуются путем объединения простых элементов данных, называемых компонентами. Компоненты могут быть при этом однородными или разнородными. В первом случае тип данных определяется как тип-массив, а во втором – как тип-запись. Необходимость в массивах возникает всякий раз, когда в памяти нужно хранить большое, но конечное количество однотипных упорядоченных данных. Массив – это структура данных, которую можно рассматривать как набор переменных одинакового типа, имеющих общее имя. Тип элементов массива называется базовым. Используя любой ранее описанный тип, такой, как, например, базовый, можно получить массив массивов, массив записей, массив строк, массив множеств и т. д. 2. Одномерные массивы Простейшая форма – это одномерный массив (линейная таблица). Он аналогичен одномерному числовому вектору и имеет индивидуальное имя, а для обозначения отдельной компоненты к имени массива добавляется индекс, который и выделяет нужную компоненту. Компоненты массива называются переменными с индексами. В обычной математической символике записывают: Х1, Х2, …, Xn; или a1, ..., a50 и т. д. Наименьший индекс называется нижней границей, наибольший – верхней границей, а число элементов – размером массива. Размер массива фиксируется при описании и в процессе выполнения программы не меняется. Индексы можно вычислять. Наиболее часто в качестве типа индекса используется ограниченный целый тип или перечисляемый тип. Описание массивов включает в себя указания: – из переменных какого типа должен состоять массив; – сколько в нем должно быть элементов; – какие индексы должны быть использованы для доступа к его элементам. В общем виде объявление массива выглядит так: Var < Имя массива > : Array [Нижний индекс. .Верхний индекс] Of < Тип элементов >; Для имени массива применяются идентификаторы, отвечающие тем же правилам, что и имена переменных и других элементов программы. Параметры массива – нижний и верхний индексы – должны являться константами и определяют пределы изменения индекса и, соответственно, количество элементов, которые содержатся в массиве. Например, если в качестве нижнего индекса использовано значение 5, а в качестве верхнего индекса – 7, то массив будет включать в себя три элемента, доступ к которым может быть осуществлен по индексам 5, 6 и 7. В качестве типа элемента может быть использован любой необходимый для решения поставленной задачи тип данных, например Integer или String.
87
Задача 1 Рассмотрим примеры описания массивов с пояснениями: Program Lab7_1; Const Start = 100; Finish = 105; Var S : Integer; Al: Array [1..10] Of Integer; массив десяти переменных типа Integer, для доступа будут использоваться индексы 1, 2, 3, 4, 5, 6, 7, 8, 9 и 10. Имя массива – A1 А2: Array [5..10] Of Real; массив шести переменных типа Real, для доступа будут использоваться индексы 5, 6, 7, 8, 9 и 10. Имя массива – А2 Names: Array [5..10] Of String; массив шести переменных типа String, для доступа будут использоваться индексы 5, 6, 7, 8, 9 и 10. Имя массива – Names Sprites: Array [0..99] Of Pointer; массив ста переменных типа Pointer, диапазон индексов – от 0 до 99. Имя массива – Sprites В: Array [Start..Finish] Of Byte; массив шести переменных типа Byte, диапазон индексов задается константами Start и Finish – от 100 до 105. Имя массива – В Bl: Array [Start..110] Of Byte; массив одиннадцати переменных типа Byte, диапазон индексов задается константами Start и 110 – от 100 до 110. Имя массива – Bl IC1: Array [Start..90] Of Byte; некорректное описание массива: нижний индекс (задан константой Start = 100) превышает верхний индекс (задан константой 90) IC2: Array [S..800] Of Byte; некорректное описание массива: верхний индекс задан переменной, а не константой IC3: Array [1..80000] Of Integer; некорректное описание массива: объем оперативной памяти, необходимый для хранения такого массива – 160 000 байт (один элемент типа Integer занимает 2 байта), что превышает максимально допустимый объем Begin {Тело программы} End.
88
2.1. Использование массивов Использование массивов заключается в основном в операциях с его элементами. При этом элементы рассматриваются как отдельные переменные. Для обращения к конкретному элементу в составе массива используются имя массива и индекс необходимого элемента в квадратных скобках: < Имя массива >[< Индекс элемента >] Индекс может быть константой или выражением целого типа, например: Team[1] : = ’Зенит’; D : = koef [1] * koef [1] – 4 * koef [2] * koef [1]; ReadLn (name[n + 1]); WriteLn (temper [I]); 2.2. Ввод–вывод массива Под вводом массива понимают ввод значений элементов массива, а именно: – как и вывод массива, ввод удобно реализовать при помощи инструкции For; – чтобы пользователь программы знал, ввода какого элемента массива ожидает программа, следует организовать вывод подсказок перед вводом очередного элемента массива. В подсказке обычно указывается индекс элемента массива; – в качестве индексов массивов могут использоваться не только константы, но и переменные, в том и числе и счетчики оператора цикла For; – в прикладных программах ввод, как правило, осуществляется либо с клавиатуры, либо из файла; – можно заполнить массив с помощью датчика случайных чисел. Остановимся подробнее на вводе с клавиатуры элементов массива и n–количества элементов в массиве.
Количество элементов массива, их упорядоченность и тип задают явно до начала выполнения программы. Поэтому если границы массива точно неизвестны, то их выбирают «с запасом», так чтобы его размер был не меньше значения n, которое будет введено. Например, после описания a : Array [1..100] of Real; введенное n должно принадлежать диапазону 1..100, а после описания a : Array [Byte] of Real; введенное n должно принадлежать типу Byte. Описание же a : Array [Integer] of Real недопустимо и вызовет сообщение: «Error 22: Structure too large», потому что произведение количества компонентов массива на размер компонента в байтах не может превышать 65 520 байт. Задача 2 Рассмотрим пример заполнения элементов массива с помощью оператора присваивания и вывод без использования оператора цикла For.
89
Program Lab7_2; Var A : Array [1..3] Of Integer; Begin A[l] : = 8; А[2] : = 12; А[3] : = А[1] + А[2]; WriteLn('Первый : ', A[l]); WriteLn('Второй : ', А[2]); WriteLn('Третий : ', А[3]); End. Пояснения к задаче 2 Массив А содержит 3 элемента типа Integer. Размерность массива задана явно в описании массива. Изменение значений элементов массива происходит с помощью оператора присваивания. Результат работы программы мы видим в табл. 14. Таблица 14 A[l] – первый элемент массива 8
A[2] – второй элемент массива 12
A[3] – третий элемент массива 20
Задача 3 Приведем пример программы, заполняющей элементы массива размерностью n квадратами их индексов и вывод результата работы программы с помощью оператора цикла For. Program Lab7_3; Const n = 9; Var A : Array [1..n] Of Integer; I : Integer; BEGIN {1} For i : = l To n Do A[i] : = I * i; WriteLn; For I : = l To n Do Begin {2} WriteLn (i, ‘-й элемент’); WriteLn (A[i]); End; {2} End. {1}
90
Пояснения к задаче 3 Массив А содержит n элементов типа Integer. Размерность массива задана равной 9 в операторе Const перед описанием массива. Изменение значений элементов массива происходит с помощью оператора присваивания в цикле с изменением счетчика i последовательно от 1 до 9. На каждом шаге цикла элементу массива с номером i присваивается значение i * i, т. е. квадрат его индекса. Вывод результата происходит с помощью второго цикла for. На каждом шаге цикла производится вывод значения элемента массива с индексом i. Результатом работы программы будет столбик чисел, представляющих собой квадраты чисел от 1 до 10, т. е.: 1, 4, 9, 16, ..., 81 с соответствующими пояснениями, какой именно элемент массива выводится. 2.3. Стандартные операции с массивами Массивы предусмотрены в подавляющем большинстве языков программирования и используются в широком круге задач. При этом все-таки имеются некоторые стандартные операции с массивами, которые часто применяются вне зависимости от функциональной направленности решаемой задачи. Это операции поиска в массиве или его части минимального и (или) максимального значения, а также упорядочение массива или его части – выстраивание элементов некоторым образом, обычно просто по возрастанию или убыванию. Имеется большое разнообразие задач на одномерные массивы. Как и все задачи вообще, условно их можно разделить на три вида: 1) задачи, решаемые в «одно соображение»; 2) стандартные задачи; 3) задачи, решения которых требуют знания вспомогательных алгоритмов, специальных методов и приемов. Очевидно, что без умения решать задачи первых двух видов невозможно решать нестандартные задачи. Рассмотрим несколько примеров задач первого вида. 1. В массиве а каждый элемент равен 0 или 1. Заменить все нули единицами и наоборот. Решение: достаточно одного оператора присваивания a[i] : = l – a[i] в теле цикла. 2. В массиве каждый элемент равен 0, 1 или 2. Переставить элементы массива так, чтобы сначала располагались все 0, затем все 1 и, наконец, все 2. Дополнительного массива не заводить. Решение: можно не переставлять элементы массива, а подсчитать количества 0, 1, 2 и заполнить массив заново требуемым образом. 3. Даны два n-элементных массива х и у одного типа. Обменять местами все хi и уi (i = 1, ..., n), не используя промежуточные величины. Решение: обмен можно выполнить в цикле для всех i от 1 до n с помощью серии из трех операторов присваивания: x[i] : = x[i] + y[i]; y[i] : = x[i] – y[i]; x[i] : = x[i] – y[i]. Перечислим стандартные (типовые) задачи на одномерные массивы: 1) нахождение наибольшего (наименьшего) элемента;
91
2) суммирование элементов (безусловное и условное); 3) подсчет (замена) элементов, удовлетворяющих заданному условию; 4) поиск заданного элемента: а) в неупорядоченном массиве; б) в упорядоченном массиве; 5) определение заданного расположения элементов; 6) удаление элемента, включение элемента в заданную позицию; 7) переразмещение (инвертирование, циклический сдвиг) элементов; 8) случайная выборка элементов (с повторениями и без повторений); 9) слияние двух упорядоченных массивов в упорядоченный массив; 10) сортировка массива (простые методы). Мы рассмотрим некоторые задачи из перечня 1–10. Они обязательны, так как формируют основные навыки и некоторые приемы обработки массивов. К сожалению, на таких задачах часто останавливаются, а для решения нестандартных задач нужно учиться придумывать новые алгоритмы. Достигается это тренировкой построения, анализом и запоминанием алгоритмов. К сложным задачам можно отнести улучшенные методы сортировки массивов, поиск моды и медианы массива; алгоритмы генерирования комбинаторных объектов, алгоритмы на графах и т. д. Задача 4 В некоторых видах спортивных состязаний выступление каждого спортсмена оценивается независимо несколькими судьями. Затем из всей совокупности оценок удаляются наиболее высокая и низкая, а для оставшихся оценок вычисляется среднее арифметическое, которое и идет в зачет спортсмену. Если наиболее высокую оценку выставило несколько судей, то удаляется только одна такая оценка. Аналогично поступают с наиболее низкими оценками. Дано натуральное число n, положительные действительные числа a1, ..., an (n > 3). Считая, что числа a1, ..., an – это оценки, выставленные судьями одному из участников соревнований, определить оценку, которая пойдет в зачет этому спортсмену. Program LAB7_4; Const n = 10; A : Array [l..n] of Real = (5.4, 5.6, 5.3, 5.8, 5.4, 5.5, 5.5, 5.6, 5.0, 5.7); Var i : 1. .n; min, max, sum: Real; BEGIN {1} min : = a[1]; max : = a[1]; sum : = a[1]; for i : = 2 to n do begin {2} sum : = sum + a[i]; if a[i] > max Then max : = a[i]; if a[i] < min Then min : = a[i]; end; {2} 92
WriteLn(‘Оценка в зачет: ', (sum – max – min)/(n – 2) : 2 : 2); ReadLn; END.{1} Пояснения к задаче 4 Числа-оценки a1, ..., an будем считать элементами массива а. Опишем данные в блоке Const как простую (n) и сложную (массив a) константы. После этого они доступны и хранятся внутри программы. Одномерные массивыконстанты задаются перечислением их элементов в круглых скобках, что равносильно заданию значения присваиванием: а[1] : = 5.4, ..., а[10] : = 5.7. Пусть max – одна из наивысших оценок, min – одна из самых низких оценок, а sum – сумма всех n (n > 3) оценок, выставленных судьями. Тогда искомую оценку найдем по формуле (sum – max – min)/(n – 2). Алгоритм поиска минимального (максимального) элемента в неупорядоченном массиве следующий. Делается предположение, что первый элемент массива является минимальным (максимальным), затем остальные элементы массива последовательно сравниваются с этим элементом. Если во время очередной проверки обнаруживается, что проверяемый элемент меньше (больше) принятого за минимальный (максимальный), то этот элемент принимается за минимальный (максимальный) и продолжается проверка оставшихся элементов. В программе мы делаем поиск минимального и максимального элементов в массиве вещественных чисел. В этом же цикле суммируем оценки судей и заносим в переменную sum. Заметим, что если в массиве несколько наибольших (наименьших) элементов, то программа находит тот, индекс которого минимальный. Чтобы найти эти величины с максимальным индексом, достаточно добавить знаки равенств в условиях операторов ветвления. 3. Многомерные массивы Рассмотрим прямоугольные таблицы, состоящие из чисел и содержащие произвольное число m строк и произвольное число n столбцов. В математике их называют матрицами, а числа, входящие в состав матрицы – ее элементами. Если число строк матрицы совпадает с числом ее столбцов, то матрица называется квадратной. В программировании матрицей называется переменная-массив, компоненты которой опять же массивы. Общий вид задания типа, определяющего двумерный массив, такой же, что и в случае, определяющем одномерный массив. В общем виде описание двумерного массива выглядит так:
имя массива : array [НижняяГраницаИндекса1..ВерхняяГраницаИндекса1, НижняяГраницаИндекса2..ВерхняяГраницаИндекса2} of Тип; array – слово языка Pascal, показывающее, что объявляемый элемент данных является массивом; 93
НижняяГраницаИндекса1, ВерхняяГраницаИндекса1, НижняяГраницаИндекса2, ВерхняяГраницаИндекса2 – целые константы, определяющие диапазоны изменения индексов и, следовательно, число элементов массива; тип – тип элементов массива. 1. Можно, например, задать описание массива следующим образом : Var Map : Array [1..168, 1..9] of Byte; задает двумерный массив, т. е. прямоугольную таблицу, состоящую из 168 строк и 9 столбцов. 2. Этот же массив можно задать иначе, непосредственно при описании полной переменной: Var Map : Array [1..168] of Array [1..9] of Byte; 3. Можно задать описание массива так : Type Vector = Array [1..9] of Byte; Var Map : Array [1..168] of Vector; Во всех трех случаях массив описан верно. В двумерном массиве доступ к любому из элементов осуществляется по двум индексам: номеру строки и номеру столбца, например: Map [100], [7] или Map [100, 7] – это элемент, находящийся на пересечении сотой строки и седьмого столбца. Число элементов массива равно произведению числа строк m на число столбцов n. Следовательно, массив Map содержит 168 * 9 = 1 512 элементов. 3.1. Использование двумерных массивов Двумерный массив хорошо иллюстрирует различие между физическим и логическим представлением данных. Он представляет собой логическую структуру данных, которая удобна для программирования и решения задач. Двумерный массив может оказаться полезным при описании объекта, который является двумерным физически (например, шахматная доска или карта). Его используют также при организации набора значений или при вычислениях, зависящих от двух параметров, например вычислении значений двойных сумм (задача 5). В языке Паскаль допускается работа с массивами, размерность которых больше двух. Трехмерный действительный массив может быть объявлен следующим образом: Var A : Array [1..3, 1..4, 1..5] of Real; Элементы в таком массиве адресуются тремя индексами. Первый индекс задает номер матрицы, второй – номер строки и третий – номер столбца. Такой массив полезен, если некоторое значение определяется тремя параметрами. Например, массив температур может быть проиндексирован по широте, долготе и высоте. При выходе за третье измерение геометрическая аналогия
94
по очевидным причинам невозможна. Количество измерений формально не ограничено, но сумма размеров всех компонентов массива не должна превосходить 64К. 3.2. Ввод–вывод двумерного и многомерного массива Многомерные массивы, как и одномерные, можно задавать одним из способов ввода данных в программу. Значения элементов двумерных массивов выводят на экран и вводят с клавиатуры, как правило, по строкам, т. е. сначала все элементы первой строки, затем второй и т. д. Это удобно выполнять при помощи вложенных инструкций for. Программа Lab7_5; выводит на экран значения элементов массива по строкам. Задача 5 Ввести в матрицу Prod размером 3 строки, 4 столбца следующие значения: 1-я СТРОКА – 1, 1, 1, 1; 2-я СТРОКА – 2, 2, 2, 2; 3-я СТРОКА – 3, 3, 3, 3. Умножить на 3 каждый элемент массива и получить результат на экране дисплея распечатанным по строкам. PROGRAM Lab7_5; Uses Crt; var Prod : array[1..3, 1…4] of Integer; i, j : Integer; BEGIN {1} ClrScr; Textcolor(Yellow); WriteLn(' ***********Ввод по строкам **********'); Textcolor(Green); For i : = 1 To 3 Do Циклы ввода матрицы begin {2} WriteLn (' Введи строку ', i); For j : =1 To 4 Do Read(Prod [i, j] ); end; {2} Textcolor (lightred); WriteLn ('*********** Вывод по строкам **********'); For i : =1 To 3 Do Циклы вывода матрицы begin{3} For j : = 1 To 4 Do Write (Prod [i, j]*3); WriteLn; end; {3}
95
ReadKey; END.{1} Пояснения к задаче 5 Каждый раз, когда внутренний цикл завершается, внешний цикл увеличивает i на единицу и внутренний цикл выполняется вновь. Таким образом, сначала вводятся, а потом выводятся все компоненты массива по строкам. При выводе мы умножаем каждый элемент массива на 3. При описании массивов в программе удобно использовать именованные константы как значения верхних границ индексов массива. При задании массива как сложной константы в блоке Const (или в блоках, если их несколько) в круглых скобках перечисляются элементы-массивы, состоящие из элементов-скаляров. Для двумерного массива это может выглядеть так: Const a: Array [1..2, 1..5] of Integer = ((–1, 23, 0, 7, 6), (2, 0, –12, 6, 4)); Трехмерный массив можно задать аналогично или следующим образом: Type Cube = Array [0..1, 0..1, 0..1] of Integer; Const M : Cube = (((0, 1), (2, 3)), ((4, 5), (6, 7))); Элементы трехмерного массива будут хранить после этого следующие значения: М[0, 0, 0] = 0; М[0, 0, 1] = 1; М[0, 1, 0] = 2; М[0, 1, 1] = 3; М[1, 0, 0] = 4; М[1, 0, 1] = 5; М[1, 1, 0] = 6; М[1, 1, 1] = 7. 3.3. Стандартные (типовые) задачи на двумерных массивах В стандартной матричной задаче может потребоваться: 1) получить новую матрицу (ввести матрицу) по заданному правилу; 2) найти какую-либо величину, используя элементы данной матрицы; 3) преобразовать матрицу требуемым образом; 4) определить, обладает ли матрица (ее один или несколько элементов, строка, столбец) указанным свойством; 5) выполнить ту или иную операцию над матрицей (матрицами). Задача 6 иллюстрирует использование вложенных циклов при вычислении двойных сумм. Задача 6
Вычислить:
100 50
1
∑∑ i + j 2 . i =1 j =1
{$N +, E} PROGRAM Lab7_6; Uses Crt; var sum: extended; 96
i, j : 1..100; Begin ClrScr; sum : = 0; Textcolor (LightRed); For i : = 1 To 100 Do Цикл по i For j : = 1 To 50 Do Цикл по j sum : = sum + 1/ (1 + sqr (j)); WriteLn (' Сумма равна ', sum); ReadKey; End. Пояснения к задаче 6 Заданная сумма sum суть: 1/(1 + 12) + 1/(1 + 22) + ... + 1/(1 + 502) + 1/(2 + 12) + 1/(2 + 22) + ... + + 1/(2 + 502) + 1/(100 + 12) + 1/(100 + 22) + … + 1/(100 + 502); sum содержит 100 * 50 = 5 000 слагаемых, поэтому тип переменной, где будет копиться сумма sum, объявим extended , иначе, если объявить Real, будет переполнение. В программе идет перебор всех значений по индексу i, который меняется от 1 до 100 (внешний цикл), и перебор всех значений по индексу j, который меняется от 1 до 50 (внутренний цикл). Обратите внимание, что до входа в цикл начальное значение суммы приравнивается к нулю (sum : = 0). 4. Контрольные вопросы 1. Что такое массив? 2. Что такое идентификатор массива? 3. Что такое переменная с индексом? 4. Какие значения принимает индекс у переменных массива на языке Паскаль? 5. Верно ли, что массив – это структурированный тип данных, состоящий из фиксированного числа элементов, имеющих один и тот же тип? 6. Какие типы данных недопустимы для компонентов массива? Почему? 7. В каком разделе (разделах) программы допустимо описание данных регулярного типа? 8. Где и как определяется общее число элементов массива? 9. Можно ли размерность массива определить с помощью типа диапазонов? 10. Дайте определение индекса. Какие типы данных можно использовать при описании индекса? 11. Может ли левая граница индексов массива быть меньше правой? 12. Может ли левая граница индексов массива быть положительной? 13. Может ли левая граница индексов массива быть равной нулю? 14. Может ли левая граница индексов массива быть отрицательной? 15. Как осуществляется доступ к каждому элементу массива?
97
16. Когда индекс элемента в массиве совпадает с порядковым номером этого элемента? 17. Верно ли, что название «регулярный тип» массивы получили за то, что в них объединены логически однородные элементы, упорядоченные по индексам, определяющим положение каждого элемента в массиве? 18. Верно ли, что могут существовать массивы массивов? 19. Верно ли, что элементами массива могут быть данные любого типа, включая структурированные? 20. Может ли индекс в правильно составленной программе выходить за пределы, определенные типом «диапазон»? 21. Может ли индекс быть выражением целого типа? 22. Может ли индекс быть выражением вещественного типа? 23. Может ли индекс быть выражением любого порядкового типа? 24. Какой массив называется одномерным? 25. Какой массив называется двумерным? 26. Какой массив называется n-мерным? 27. Верно ли, что одномерный массив соответствует понятию линейной таблицы (вектора)? 28. Верно ли, что двумерный массив соответствует понятию прямоугольной таблицы (матрице, набору векторов)? 29. Существуют ли ограничения на размерность массива? 30. Можно ли в описании массива использовать предварительно определенные константы? 31. В какой последовательности располагаются в памяти элементы одномерного массива? 32. Верно ли, что элементы с большими значениями индекса хранятся в больших адресах памяти? 33. Верно ли, что двумерные массивы располагаются в памяти таким образом, что второй индекс изменяется быстрее, чем первый? 34. Верно ли, что матрица расположена в памяти по строкам? 35. Всегда ли работа с массивом сводится к работе с его компонентами? 36. Обязательно ли количество элементов массива должно быть фиксированным, т. е. определяться при трансляции программы? 37. Может ли процедура read(x) ввести весь массив х целиком? 38. Можно ли с помощью стандартной процедуры write(x) вывести весь массив х целиком? 39. Как можно сымитировать работу с массивом переменной длины? 40. Возможно ли следующее описание: var a: array [Integer]? 41. Предложите способы вывода элементов двумерного массива. 5. Практическое задание – решение задач с использованием массивов Организовать данные в виде массивов и решить предложенные задачи по вариантам. Практическое задание состоит из двух частей: – 1-я часть задания включает 16 вариантов (по три задачи в каждом варианте);
98
– 2-я часть задания предполагает решение двух задач: ЗАДАЧИ (А) – для нечетных вариантов (1, 3, ..., 15) и ЗАДАЧИ (Б) – для четных вариантов (2, 4, ..., 16). Методические указания 1. Определить алгоритм решения задачи, записать намеченный алгоритм в виде блок-схемы программы. 2. Подобрать контрольный пример. 3. Организовать ввод (вывод) исходных данных массива, вывод результатов вычислений, используя разные способы ввода информации в массив: клавиатуру, датчик случайных чисел, сложные константы в блоке Const . 4. Приступить к написанию программы в ИСП. Задания. Часть 1 Вариант 1 1. Составить алгоритм, который строит последовательность из 10 случайных чисел, запоминает ее и выводит на экран.
2. При предоставлении работнику ежегодно оплачиваемого отпуска в n трудовых дней ему начисляются отпускные следующим образом: вычисляется средняя зарплата за последние 12 месяцев, которая делится на 25,4 и умножается на n. Построить алгоритм, запрашивающий необходимые данные и печатающий размер выплаты для n = 12, n = 24, n = 36. 3. В целочисленной таблице размером в 7 строк и 7 столбцов найти: а) число нулевых элементов, расположенных в нечетных строках; б) число элементов, равных (–1), расположенных в четных строках. Вариант 2 1. В одномерном массиве заменить все элементы с нулевыми значениями на единицу. 2. Имеются данные о ценах на десять видов товаров. Определить номер самого дорогого товара, который намерен приобрести покупатель, имеющий заданную сумму денег. 3. Просуммировать элементы строк матрицы размером 4 * 3. Результат получить в одномерном массиве размером 4. Вариант 3 1. Заполнить массив А[1 : 10] случайными числами, вывести на печать содержимое элементов массива с нечетными индексами.
99
2. В таблицу занесена последовательность из 10 чисел, взятых в промежутке от –5 до 5. Найти: а) наименьший член последовательности; б) наименьший из положительных членов; в) наибольшее из всевозможных попарных произведений. 3. Заданы матрица размером N * N и число К. Разделить элементы К-й строки на диагональный элемент, расположенный в этой строке. Вариант 4 1. В заданном массиве В[1 : 6] найти индекс элемента, равного числу Р. Предусмотреть случай, когда такого элемента не будет.
2. Найти сумму элементов одномерного массива размером 4. Разделить каждый элемент исходного массива на полученное значение. Результат получить в том же массиве. Напечатать в одной строке. 3. В матрице А[1 : X, 1 : R] найти количество элементов, которые по модулю меньше заданного числа Т. Вариант 5 1. В массиве А[1 : 10] поменять местами элементы 2 и 7.
2. Решить уравнение ах = b для пяти пар значений а и b, заданных в виде двух массивов. Результат поместить в массив X. 3. Из предложенного одномерного массива длины N сформировать двумерный массив так, чтобы первая строка нового массива содержала четные по номеру элементы исходного массива, а вторая – нечетные (предусмотреть случай нечетности N). Вариант 6 1. Заполнить линейный массив из N элементов числами от –15 до 15 и вывести на экран сумму всех его отрицательных элементов.
2. В массиве А [1:10] определить: а) количество элементов, которые меньше –3; б) номер первого такого элемента (если он есть); в) номер последнего такого элемента. 3. Массив А[1 : N, 1 : M] содержит два одинаковых элемента. Требуется напечатать их индексы. Вариант 7 1. В произвольном одномерном массиве поменять местами элементы в парах «элемент с нечетным номером – элемент с четным номером» (дополнительные массивы не использовать). 100
2. В таблице из 20 чисел, лежащих в промежутке от –50 до 50, заменить все отрицательные числа на их абсолютные значения. 3. Дан массив действительных чисел Р [1 : N, 1 : M]. Найти сумму значений элементов ее строк. Вариант 8 1. Задан одномерный массив А [1 : М], состоящий только из нулей и единиц. Проверить, строго ли они чередуются.
2. В массиве А [1 : 25] найти максимальное и минимальное отношения элементов массива A[i]/A[i + 1]. 3. Даны два двумерных логических массива М1[1 : 3, 1 : 3] и М2[1 : 3, 1 : 3], (т. е. состоящие из 1, обозначающей истину, и 0, обозначающего ложь). Получить двумерные массивы К1 [1 : 3, 1 : 3] и К2 [1 : 3, 1 : 3] в результате следующих действий: а) K1 [i, j] = M1 [i, j] и M2 [i, j] – через операцию логического умножения; б) K2 [i, j] = M1 [i, j] или M2 [i, j] – через операцию логического сложения. На печать выдать исходные массивы М1 и М2, массивы К1 и К2, число единиц в массивах К1 и К2. Вариант 9 1. Заполнить массив А[1 : 10]; А[1] = 1, А[2] = 2. Каждый следующий элемент определяется из соотношения A[n] = (A[n – 1] + A[n – 2])/n. Вывести получившуюся последовательность на экран.
2. Найти среднее значение элементов заданного массива размером M. Преобразовать исходный массив, вычитая из каждого элемента среднее значение. 3. Заполнить прямоугольную таблицу размером в 5 строк и 3 столбца случайными целыми числами. Предусмотреть вывод этой таблицы на экран и найти: а) сумму всех элементов таблицы; б) сумму тех элементов, которые без остатка делятся на 2; в) сумму элементов, имеющих нечетную сумму индексов. Вариант 10 1. Сформировать таблицу значений в соответствии с формулами: а) A[i] = S + M – i (при четном i); A[i] = C – M – i (при нечетном i); б) B[i] = S – M – i (при четном i); B[i] = C + M – i (при нечетном i); в) P[i] = A[i] + B[i], где i изменяется от 1 до 100; С, М, S – заданные числа.
101
2. Переставить элементы одномерного массива в обратном порядке. Нового массива не заводить. 3. В массиве В[1 : X, 1 : R] найти количество элементов, которые по модулю меньше заданного числа Т. Вариант 11 1. Построить таблицу В, состоящую из элементов таблицы А [1 : 75], имеющих четные индексы.
2. В течение 12 часов абонент набирает номер телефона (один набор в час). Установление связи отмечается цифрой 1, отказ – цифрой 0. Определить: – число наборов до первого отказа; – максимальное число успешных наборов между двумя любыми отказами. 3. Дана матрица целых чисел. Заменить отрицательные элементы на –1, положительные на 1, нулевые оставить без изменения. Вариант 12 1. Запрашивается таблица из чисел и выясняется, содержит ли она прогресии: а) арифметическую; б) геометрическую.
2. Для данного одномерного массива указать индексы тех его элементов, сумма которых равна заданному числу (если такие есть). 3. Матрицу А [1 : N, 1 : N] заполнить датчиком случайных чисел. Вычислить след матрицы. Вариант 13 1. Для целочисленного массива А[1 : 15] определить, является ли сумма его элементов четным числом. Вывести на печать «ДА» или «НЕТ».
2. В таблице из 20 чисел, лежащих в промежутке от –50 до 50, заменить все отрицательные числа на их абсолютные значения. 3. Матрица В[1 : Т, 1 : Т) содержит два одинаковых элемента. Напечатать их индексы. Вариант 14 1. Вычислить среднее геометрическое элементов массива А [1 : N], имеющих четные индексы.
2. Задан массив Х размером 5. Вычислить значения функции y = 0,5lnх при значениях аргумента, заданных в массиве X, и поместить их в массив Y. Напечатать результат (массивы Х и Y) в виде двух столбцов. 102
3. Из массива А[1 : М, 1 : М] сформировать одномерный массив В, «развернув» его по столбцам (по строкам). Вариант 15 1. Ввести таблицу оценок за контрольную работу по геометрии. Найти среднее арифметическое оценок. Найти среднее геометрическое. Какое значение больше?
2. Вычислить сумму и разность двух заданных одномерных массивов размером 5. Результат напечатать в виде двух параллельных столбцов. 3. Просуммировать элементы столбцов заданной матрицы размером A [1 : N, 1 : M]. Результат получить в одномерном массиве размером 3. Вариант16 1. Заданы значения А, В, С и массив М[1 : 15]. Построить алгоритм, который по вводимому коду операции К, принимающему значения 1, 2, 3, выполняет следующие действия: а) увеличивает значения элементов массива на А при К = 1; б) уменьшает значения элементов массива на В при К = 2; в) печатает индексы элементов, которые равны С при К = 3.
2. Найти среднее значение элементов заданного массива размером 5. Преобразовать исходный массив, вычитая из каждого элемента среднее значение. 3. Просуммировать элементы строк матрицы B[1 : 4, 1 : 3]. Результат получить в одномерном массиве размером 4. Задания. Часть 2 Задача А (нечетные номера вариантов) Составить программу вывода на экран дисплея элементов матрицы X [1 : 3, 1 : 4], сумма индексов которой равна заданной константе К. Исходные данные приведены в табл. 15. Таблица 15 Варианты нечетные 1 3 5 7 9 11 13 15
Данные для матрицы X[1:3,1:4] 0 16 4 12 –5 30 8 –1
12 0 10 –3 –8 –16 7 99
–8 9 –2 10 –3 10 12 10
2 2 15 –10 –7 0 10 2
5 –11 0 8 10 9 –40 5
7 –3 0 17 3 2 3 7
103
0 –1 –5 0 9 15 0 9
0 7 –2 14 30 4 –1 –40
–5 12 18 –6 40 –7 11 1
К –2 –4 1 2 5 –17 14 12
–2 9 0 0 0 11 0 11
18 15 14 8 8 9 10 0
5 2 3 3 3 5 1 3
Задача Б (четные номера вариантов) Дана матрица Y [1 : 3, 1 : 4]. Найти отношение суммы положительных элементов матрицы к общему числу ненулевых элементов. Исходные данные приведены в табл. 16. Таблица 16 Варианты четные 2 4 6 8 10 12 14 15
Данные для матрицы Y[1 : 3, 1 : 4] 0 12 1 –10 2 8 10 30
16 0 –40 –1 8 12 0 1
4 10 2 0 0 11 12 –40
12 –2 0 –2 3 –1 0 1
–5 9 8 0 9 0 17 10
30 0 7 5 0 0 0 6
8 1 0 7 7 –9 –1 –7
–1 0 –15 0 11 0 0 8
–3 –7 4 9 0 0 7 –1
7 0 10 0 1 0 17 0
2 1 0 1 0 15 0 4
0 0 5 1 0 2 4 0
Литература
1. Алексеев В.Е, Ваулин А.С., Петрова Г.В. Вычислительная техника в инженерных и экономических расчетах. – М.: Высш. шк., 1998. 2. Васюкова Н.Д., Тюляева В.В. Практикум по основам программирования на языке Паскаль. – М.: Высш. шк., 1991. 3. Зеленяк О.П. Практикум программирования на Turbo Pascal. Задачи, алгоритмы и решения. – М.: ДиаСофтЮП, 2002. 4. Карасева Т.В. Сборник задач по основам информатики и вычислительной техники. – М.: Просвещение, 1994. 5. Культин Н. Самоучитель программирования в Turbo Pascal 7.0 и Delfi. – СПб.: БВХ, 1999. 6. Культин Н.Б. Turbo Pascal в задачах и примерах. – СПб.: БХВ, 2000. 7. Марченко А.И., Марченко Л.А. Программирование в среде Turbo Pascal 7.0. – Киев: Век+, 1999. 8. Моргун А.Н. Решение задач средствами языка Turbo Pascal 7.0. – Киев: Юниор, 2002. 9. Першиков В.И., Савинков В.М. Толковый словарь по информатике. – М.: Финансы и статистика, 1995. 10. Светозарова Г.И. и др. Практикум по программированию. – М.: Наука, 1988. 11. Симонович С.В. Информатика: базовый курс. – СПб.: БХВ, 2003. 104
12. Суханов Н.Н. Turbo Pascal 7.0: теория и практика программирования. – СПб.: Наука и техника, 2003. 13. Ускова О.Ф. Программирование на языке Паскаль: Задачник. – СПб.: Питер, 2002. 14. Информатика: Учебник / Под ред. В.Е. Алексеева. – М.: Высш. шк., 2001. 15. Информатика: Учебник / Под ред. Н.В. Макровой. – М.: Финансы и статистика, 2001. 16. Фараонов В. Turbo Pascal 7.0. – М.: Нолидж, 2001.
105
Практикум
Портнягина Вера Васильевна Портнягин Николай Николаевич ПРАКТИКУМ ПО ПРОГРАММИРОВАНИЮ НА ЯЗЫКЕ TURBO PASCAL Часть 1
2-е издание Редактор Г.Ф. Майорова Технический редактор Е.Е. Бабух Компьютерный набор В.В. Портнягина, Н.Н. Портнягин Верстка, оригинал-макет Е.Е. Бабух Подписано в печать 25.03.2008 г. Формат 61*86/16. Печать цифровая. Гарнитура Times New Roman Авт. л. 8,77. Уч.-изд. л. 8,93. Усл. печ. л. 6,67 Тираж 30 экз. Заказ № 46 Издательство Камчатского государственного технического университета Отпечатано полиграфическим участком издательства КамчатГТУ 683003, г. Петропавловск-Камчатский, ул. Ключевская, 35
106