Камчатский государственный технический университет Кафедра информационных систем
В.В. Портнягина, Н.Н. Портнягин
ПРАКТ...
52 downloads
1718 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 Часть 2 Рекомендовано Дальневосточным региональным учебно-методическим центром (ДВ РУМЦ) в качестве учебно-методического пособия (практикума) для студентов специальности 220201 «Управление и автоматика в технических системах» вузов региона
Петропавловск-Камчатский 2007
УДК 681.3(075.8) ББК 32.973-018 П60 Рецензенты: И.Г. Проценко, доктор технических наук, заместитель директора по научной работе Камчатского центра связи и мониторинга А.С. Латкин, доктор технических наук, профессор заместитель директора по научной работе НИГТЦ ДВО РАН Портнягина В.В., Портнягин Н.Н. П60
Практикум по программированию на языке Turbo Pascal. Часть 2: Учебно-методическое пособие (практикум). – Петропавловск-Камчатский: КамчатГТУ, 2007. – 127 с. ISBN 978–5–328–00128–1 Практикум предназначен для приобретения практических навыков алгоритмизации задач и программирования на языке Turbo Pascal в соответствии со стандартами и действующей рабочей программой специальности 220201 «Управление и автоматика в технических системах». Во второй части приводятся основные приемы и методы программирования при работе со сложными типами данных: строковыми, множествами, записями; затронуты вопросы организации вычислительного процесса с помощью подпрограмм, функций, рекурсий; даны теория и конкретные примеры при работе в системах счисления. Практикум содержит около 300 вопросов и задач, 50 упражнений для самостоятельного решения, систематизированных в соответствии с темами и объединенных в десяти лабораторных работах. УДК 681.3(075.8) ББК 32.973-018
ISBN 978–5–328–00128–1
© КамчатГТУ, 2007 © Авторы, 2007
2
Содержание Введение ................................................................................. Лабораторная работа № 1. Текстовый тип данных .......................................................... Лабораторная работа № 2. Перевод чисел из одной системы счисления в другую систему числения с использованием операторов обработки символьной информации ............... Лабораторная работа № 3. Перечислимый и интервальный типы данных ................... Лабораторная работа № 4. Множественный тип данных (I) ........................................... Лабораторная работа № 5. Множественный тип данных(II) .......................................... Лабораторная работа № 6. Тип данных – запись (I) ........................................................ Лабораторная работа № 7. Тип данных – запись (II) ....................................................... Лабораторная работа № 8. Процедуры и функции .......................................................... Лабораторная работа № 9. Организация программ с использованием подпрограмм и функций ....................................................... Лабораторная работа № 10. Вычисление определенного интеграла методом Симпсона .............................................. Литература ............................................................................. Приложения ...........................................................................
3
4 6
21 33 44 57 60 71 74 94 107 113 115
ВВЕДЕНИЕ Присущий языку Паскаль стиль программирования полностью определяется используемыми в нем типами данных, их организацией. Чтобы овладеть навыками программирования, необходимо понять концепцию организации данных, принятую в языке, как важнейший аспект программирования. Настоящий практикум по программированию является продолжением «Практикума по программированию на языке Паскаль (часть 1)», включает в себя 10 лабораторных работ. В Практикуме рассматриваются задачи с использованием сложных типов данных – строковых, перечислимых и интервальных, множественного и записей, задачи организации программ с использованием подпрограмм, функций, рекурсии; вопросы перехода из десятичной системы счисления в двоичную, восьмеричную, шестнадцатеричную и обратно; вопросы численного программирования – вычисление определенного интеграла методом Симпсона. В лабораторной работе № 1 рассматриваются задачи обработки текстовых данных. В лабораторной работе № 2 рассматриваются вопросы перехода из десятичной системы счисления в двоичную, восьмеричную, шестнадцатеричную и обратно. В лабораторной работе № 3 рассматриваются программы с использованием перечисляемого и интервального типов данных. Лабораторная работа № 4, Лабораторная работа № 5 – теория и упражнения посвящены типу данных множество. В лабораторной работе № 6 рассматривается способ организации данных В лабораторной работе № 6, лабораторной работе № 7 рассматриваются способы организации данных с помощью типа данных запись. 4
В лабораторной работе № 8 рассматриваются вопросы по организации программ с использованием для своей организации процедур, функций, рекурсии. В лабораторной работе № 9 приведены 16 вариантов задач (по три в каждом варианте) для самостоятельного решения, которые предполагают использование подпрограмм и функций. В лабораторной работе № 10 описан численный метод и алгоритм вычисления определенного интеграла по методу Симпсона. В каждой из работ приведены вопросы для защиты соответствующей лабораторной работы и для контроля понимания студентом пройденной темы.
5
ЛАБОРАТОРНАЯ РАБОТА № 1 ТЕКСТОВЫЙ ТИП ДАННЫХ Цель работы 1. Получение навыков в написании программ, содержащих символьную и строковую информацию на языке Паскаль. 2. Подпрограммы стандартных библиотек Теоретический материал 1. Общие положения Pascal оперирует с символьной информацией, которая может быть представлена отдельными символами или строками символов. 2. Символьные данные Для хранения и обработки отдельных символов используются переменные типа Char. Символьные данные могут быть либо константами, либо переменными. Переменная символьного типа должна быть объявлена в разделе описания переменных так: <Имя> : Char ; где имя – имя переменной символьного типа; Пример 1. VAR OTV: Char ; {переменной OTV присвоен тип Char} CH: Char ; {переменной CH присвоен тип Char} Значениями типа Char служат все символы, которые могут высветиться на экране дисплея: цифры, буквы, знаки операций, специальные символы и т. д. Переменная, объявленная как Char, может принимать значение только одного символа. Переменная типа Char может получить значение в результате выполнения операции присваивания или ввода (Read, ReadLn). 2.1. Таблица кодирования символов Все символы упорядочены, то есть каждый из них имеет свой порядковый номер – код. Для кодировки символов ис6
пользуется код ASCII (American Standard Code For InFormation Interchange – американский стандартный код для обмена информацией). Для хранения символа отводится один байт. Мы имеем возможность закодировать 256 символов в диапазоне 0..255 Символы с кодами 0..31 относятся к служебным кодам. Таблица 1 Базовая таблица кодировки ASCII 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
! “ # $ % & ‘ ( ) * + , . /
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
0 1 2 3 4 5 6 7 8 9 : ; < = > ?
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
@ A B C D E F G H I J K L M N O
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
P Q R S T U V W X Y Z [ \ ] ^ _
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
` a b c d e f g h i j k l m n o
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
p q r s t u v w x y z { ? } ~
2.2. Запись символов, специальные и управляющие символы В том случае, если в программе требуется использовать значение символьной переменной или константы, его необходимо заключить в апострофы или записать с использованием знака #, за которым следует код символа. Например, 'А' обозначает букву А, ';' – точку с запятой, ' ' – пробел, #32 или #$20 являются также символами пробела (32 – это код, соответствующий пробелу, а шестнадцатеричное число 20 равно десятичному 32). Рекомендуется применять # (знак номера) только для специальных (служебных) символов, которые не отображаются на экране и имеют мнемонические сокращения, унаследо7
ванные из прошлого. Некоторые из них могут использоваться программистом для выполнения определенных действий: – #07 (BEL) – подача короткого звукового сигнала; – #08 (BS) – удаление символа слева от курсора и смещение курсора на одну позицию назад, соответствует клавише ; – #09 (НТ) – горизонтальная табуляция: смещение курсора в позицию, кратную 8, плюс 1 (9, 17, 25 и т. д.), соответствует клавише <Таb>; – #10 (LF) – перевод строки, курсор смещается по вертикали вниз на одну строку; – #11 (VT) – вертикальная табуляция; – #12 (FF) – прогон страницы; – #13 (CR) – возврат каретки или перевод строки, выполняет перемещение курсора в начало следующей строки экрана (соответствует клавише <Enter>); – #26 (SUB) – конец файла, вводится нажатием комбинации клавиш + ; – #27 (ESC) – конец работы, символ соответствует клавише <Esc>; – #32 (ВL) – пробел и т. д. 2.3. Операции отношения Переменную типа Char можно сравнить с другой переменной типа Char или с символьной константой. Результатом операции сравнения является логическая константа TRUE (истина) или FALSE (ложь). Сравнение основано на том, что каждому символу поставлено в соответствие число, причем символу '0' соответствует число меньшее, чем символу '9', символу 'А' – меньшее, чем 'В' и т. д. Таким образом, можно записать: ' 0 ' < ' 1 ' < ... ' 9 ' ... < ' A ' < ' B ' < ... < ' Z ' <. ' a ' < ' b ' < ...< ' z '. Символам русского алфавита соответствуют числа большие, чем символам латинского алфавита, при этом справедливо следующее: ' А ' < ' Б ' < ' С ' ... < ' Ю ' < ' Я ' < ' а ' < ' б ' < ' в '< ... < ' э ' < ' ю ' < ' я '. Строчные латинские буквы идут друг за другом, не перемешиваясь с другими символами, точно также прописные буквы, цифры, русские буквы строчные и прописные. Из всех 8
символов составлен список, и из двух символов меньше тот, который встречается в списке раньше (a > b, a < b, a < > b). Мы можем использовать упорядоченность множества символов и, в случае необходимости, объявлять переменную цикла со счетчиком типом Char: For k : = ' а ' To ' z ' Do; 2.4. Встроенные функции К символьным данным (тип Char) можно применять встроенные функции (см. таблицу 2). Таблица 2 Наименование
Имя функции Chr (x )
Возвращает значение символа по его коду Возвращает порядковый Ord (ch ) номер Возвращает значение, Pread ( ch ) которое соответствует Ord (x ) – 1 (предыдущий символ) Возвращает значение, Succ ( ch ) которое соотв. Ord (x ) + 1 (следующий символ) Преобразует строчную Upcase ( ch ) букву в заглавную. Обрабатывает только буквы латинского алфавита.
Byte
Тип результата Символьный
Символьный
Целый тип
Символьный
Символьный
Символьный
Символьный
Символьный
Символьный
Тип аргумента
Пример 2. – Ord (' A ') = 65 – функция возвращает код заглавной латинской буквы А (65). – Chr (128) = ' Б ' – функция возвращает заглавную русскую букву ( Б ). – Pread (' Б ') = ' А ' – функция возвращает букву А, предыдущую по отношению к букве Б. – Succ (' Г ') = ' Д ' – функция возвращает букву Д, следующую по отношению к букве Г. – Upcase (' n ') = ' N ' – функция возвращает заглавную букву N, преобразованную из строчной буквы n, 9
Более подробная информация о работе встроенных функций приведена в приложении 1. Задача 1 Написать программу, выводящую на экран символы с кодами от32 до 255. Program Lab1_1; Uses Crt; Var k : Byte; Begin ClrScr; For k : = 32 To 255 Do WriteLn (Chr (k), ' '); ReadLn; End. Протокол работы программы: ! “ # $ % & ‘ ( ) * + , - . / 0 1 2 3 4 5 6… и так далее. Пояснения к программе. В цикле выводим значения параметра цикла k типа Byte. Этот параметр пробегает значения от 32 до 255, задающие коды выводимых символов. На каждой итерации этого цикла на основании значения параметра цикла определяется сам символ с помощью стандартной функции Chr, затем этот символ и пробел (помещенные в одинарные кавычки), выводятся на экран. 3. Строковый тип данных String Строка – это последовательность символов кодовой таблицы ASCII. При использовании в выражениях строка заключается в апострофы. Количество символов в строке (длина строки) может динамически изменяться в пределах от 0 до 255. Для определения данных строкового типа используется идентификатор String, за которым следует заключенное в квадратные скобки значение максимально допустимой длины строки данного типа. Если это значение не указывается, то по умолчанию длина строки принимается равной 255 байтам. Переменную строкового типа можно определить через описание типа в разделе определения типов или непосредственно в разделе описания переменных. 10
Type <имя типа> = String [максимальная длина строки]; Var <идентификатор> : < имя типа >; Переменную типа String можно задать и без описания типа: Var <идентификатор> : String [максимальная длина строки]; Определение строкового типа устанавливает максимальное количество символов, которое может содержать строка. Строковые данные могут использоваться в программе также в качестве констант. Не допускается применение строковых переменных в качестве селектора в операторе Case. Пример 3. Const Address = ' ул. Переверткина, 25 ' ; {Строковая константа} Type Flot = String [125] ; {Длина строки 125 символов} Var Fstr : Flot ; {Описание с заданием типа} Stl : String ; {По умолчанию длина строки – 255} St2 : String [50] ; {Длина строки – 50} Nazv : String [280] ; {Ошибка, длина Nazv превышает 255} Тип String похож на одномерный массив символов, но в отличие от массива символов, количество символов в строке может меняться от 0 до N. К любому символу в строке можно обратиться так же, как к элементу массива, т.е. указав рядом с именем переменной типа String, в квадратных скобках индекс символа в строке. Пример 4. St [2] – 2-ой символ в строке St; St [i] –i-ый символ в строке St. 3.1. Внутреннее представление строки В самом начале строки (под нулевым номером) расположен байт, содержащий значение текущей длины строки. Поэтому для определения объема памяти в байтах, требуемой для размещения строки, к значению ее максимальной длины прибавляется 1. Например, для размещения в памяти переменных Fstr, St2 требуется соответственно 126 байтов и 51 байт. 11
3.2. Операции над строками Для строк применимы операции: операция объединения строк (конкатенация) и операция сравнения. Операция объединения строк обозначается знаком плюс (но это не сложение). Пример 5. St1 : = ' abed ' ; St2 : = ' efk ' ; St := Stl + St2 ; Результат работы функции: St содержит 'abedefk'. Если длина результирующей строки превысит допустимую длину (255), то «лишние» символы отбрасываются. Перечислим операции сравнения: = , > = , > , < > , < , <=. Сравнивать можно строки разной длины. Сравнение осуществляется слева направо в соответствии с ASCII кодами символов. Считается, что отсутствующие символы в более короткой строке имеют код, меньше кода любого действительного символа. Например, 'АВ' больше, чем 'А'. 3.3. Строковые встроенные функции Тип данных String используется при обработке текстов, а это означает, что нам необходимо уметь: – копировать часть строки; – удалять часть строки; – вставлять подстроку (т. е. часть строки) в данную строку; – осуществлять поиск подстроки (т. е. часть строки) в данной строке. Для реализации этих операций в Турбо-Паскале существуют стандартные процедуры и функции (см. табл. 3). Таблица 3 Функции и процедуры 1 Length (Z: String): Integer Concat (Zi, [Z2, ..., Zn] : String) : String; Copy (Z: String; Index: Integer; Count: Integer): String;
Назначение 2 Возвращает текущую длину строки Z Возвращает слияние (конкатенацию) строк Z1, Z2, ..., Zn. Возвращает подстроку строки Z длиной Count, начинающуюся с позиции Index.
12
Окончание табл. 3 1 2 Pos (Substr: String; Z: String): Определяет первое вхождение подстроByte; ки Z в строку Substr и возвращает 0, если Z не содержит Substr или номер первого символа Substr в Z. Insert (Source: String; Var Z : Вставляет в строку Z подстроку Source, String;Index : Integer); начиная с позиции Index . Delete (Var Z: String; Index: Удаляет из строки Z подстроку длиной Integer; Count: Integer); Count, начинающуюся с позиции Index. Str (N : [:Width[:Decimals]]; Var Преобразует числовое значение N в Z: String); строковое Z. Возможно задание формата для N. Val (Z; Var N; Var Code: Integ- Преобразует строковое значение Z er); (строку цифр) в значение числовой переменной N.
3.4. Примеры использования процедур и функций Рассмотрим работу функций на конкретных примерах. Используются две процедуры, которые корректно удаляют и вставляют символы в строку. При удалении символов оставшаяся часть строки подтягивается к началу, чтобы занять образовавшуюся после удаления «дырку». При вставке, наоборот, строка раздвигается, чтобы вместить вставляемые символы. Пример 6. Надо удалить из строки St пять символов, начиная с 1-ой позиции. St : = ' peка Волга ' ; Delete (St, 1, 5) ; В результате St = ' Bолга '. Пример 7. Удалить все пробелы из начала строки st (пробелы в начале строки называются ведущими пробелами): While st [l] = ' ' Do Delete (st, 1, 1) ; Аналогичный фрагмент можно написать для удаления пробелов из конца строки (завершающих пробелов): While St [Length (St)] = ' ' do Delete (St, Length (St), 1) ; 13
Пример 8. Вставить подстроку S2 в строку S1, начиная с 16-ой позиции. S1 : = ' Я разрабатываю программы ' ; S2 : = 'хорошие '; Insert (S2, S1, 16) ; В результате S1 = ' Я разрабатываю хорошие программы '. При вставке в начало и конец строки действие процедуры Insert аналогично выполнению операции конкатенации. Так, в примере со вставкой звездочек в конец строки можно заменить s : = s + ' * ' на Insert (' * ' , s , length ( s ) + l). При вставке символов нужно обязательно контролировать длину полученной строки, чтобы не потерять последние символы. При такой потере никакого сообщения об ошибке не выдается. Пример 9. Определить длину строки 123456789. n : = Length ('123456789'); Результат работы функции n = 9. Пример 10. Выделить из строки S1 пять символов, начиная с 1-ой позиции. S1 : = ' Turbo Pascal '; S2 : = Copy (S1, 1, 5); S3 : = Copy (S1, 7, 3); В результате получим S2 = ' Turbo ', S3 = ' Pas '. Пример 11. Объединить три строки символов в строке s. s : = Concat ('АА1', 'XX', 'Y'); В результате s = ' AAXXY '. Функция Concat выполняет те же действия, что и операция конкатенации. Например, для приведенного случая то же самое можно было записать так: s : = 'АА' + 'XX' + 'Y'; Пример 12. Результат работы функции pоs имеет целочисленный тип и равен номеру той позиции, в которой находится 1-ый символ подстроки. Если в строке подстроки не найдено, результат равен нулю. 14
S1 : = 'Turbo Pascal' ; nl : = Pos ('Pascal' , S1) ; n2 : = Pos ('паскаль', S1) ; В результате nl = 7; n2 = 0 так как 'паскаль' и 'Turbo Pascal' – это разные строки. Задача 2 Проверить, является ли введенная совокупность символов именем месяца. Program Lab1_2; Uses Crt; Const inst: Array [1 .. 12] of String [ 10 ] = ('yanuar', 'febr', 'marz', 'april', 'may', 'juni', 'juli', 'august', 'sebtember', 'оctober', 'november', 'december') ; Month: Boolean = False; Var Str: String [10]; i: Integer; Begin ClrScr; WriteLn ('Введите имя месяца'); ReadLn (Str); For I: =1 To 12 Do Begin If Str = inst [i] Then Month = True; If Month Then WriteLn('Введено имя месяца') Else WriteLn('Нет имени месяца'); End; End. Протокол работы программы: 1 случай: Введите имя месяца ---> august Введено имя месяца. 2 случай: Введите имя месяца ---> aрррril Нет имени месяца Задача 3 Определить колтчество гласных и согласных букв во вводимой строке. 15
Program Lab1_3; Uses Crt; Const n = 30; Var a: String [n]; p: String [7]; g, s, i, j, k: Integer; BEGIN ClrScr; p: = 'aejiouy'; WriteLn (' Введите текст '); k: = 0; Repeat; k: = k + 1; Read (a[k]); Until (k = n) Or (a [k] = '.'); WriteLn; g: = 0; s:= 0; For i: = 1 To k Do For j: = 1 To 7 Do If a [i] = p [j] Then g: = g + 1; s: = k – 1 – g; WriteLn ('Гласных = ', g); WriteLn (' Согласных = ', s); End. Протокол работы программы: введите текст aaeiidf Гласных = 5 Согласных = 2 4. Контрольные вопросы 1. Какие типы данных используются в Pascal для обработки текста? 2. Почему символьный тип относят к порядковым типам? 3. Как отдельные символы представляются в памяти компьютера? 4. Поясните, что означает высказывание: любая буква латинского алфавита всегда меньше любой буквы русского алфавита? 16
5. Что такое строка? 6. Какова максимально возможная длина строки? Как определить текущую длину строки? 7. С какой целью для хранения строки в памяти компьютера выделяется дополнительный байт с номером ноль? 8. Можно ли к символьным переменным применять стандартные процедуры ввода-вывода? 9. Как можно обратиться к отдельным символам строки? Организовать ее вывод? 10. Какие операции допустимы над строковыми данными? Приведите примеры. 11. Что такое конкатенация строк? Приведите примеры. 12. Что произойдет, если значение строковой переменной после выполнения оператора присваивания превысит по длине максимальный размер, указанный при ее объявлении? Почему? 13. Какой порядок называется лексикографическим? 14. На что программист должен обязательно обращать внимание при вставке символов? Почему? 15. Перечислите функции для работы со строками. Приведите примеры их использования. 16. Перечислите процедуры преобразования типов. Приведите примеры их использования. 5. Практическое задание Организовать ввод данных и вывод результатов, снабдив распечатки соответствующими заголовками. Практическое задание включает: – задание на решение задач согласно своему варианту; – задание на решение разных заданий согласно своему варианту (см. таблицу 4) при одном условии задачи. Методические указания – определить алгоритм решения задачи, записать намеченный алгоритм в видеблок – схемы программы; – подобрать контрольный пример; – после чего приступить к написанию программы в ИСП. 17
Содержание отчета 1. 2. 3. 4.
Постановка задачи. Описание алгоритма. Текст программы. Контрольный пример. Задание 1
Вариант 1 Составьте программу шифрования текстового сообщения. Можно использовать простейший способ шифрования, при котором шифровальщик задает ключ шифровки – целое число, определяющее величину смещения букв русского алфавита. Например, при значении ключа, равном 3, в тексте буква 'а' меняется на 'г' и т. д. Составьте программу дешифрования текстового сообщения, зашифрованного вашей программой. Вариант 2 Дана произвольная строка текста. Выполните сортировку ее символов в порядке возрастания их номеров в таблице ASCII. Например, если введено: 'сва' в результате должно быть получено 'авс'. Вариант 3 В заданной строке текста удалите первое и последнее слово. Вариант 4 Пусть вводится последовательность символов длиной 10. Посчитайте, сколько среди них цифр. Вариант 5 В заданной строке текста выведите самое короткое и длинное слово. Удалите эти слова. Вариант 6 В заданной строке текста необходимо выбрать все цифры и записать их в массив. Подсчитайте количество цифр. 18
Вариант 7 Даны два слова. Составьте программу, определяющую, можно или нет из букв слова А составить слово В. Вариант 8 Если в заданный текст входит каждая из букв слова 'KEY', тогда в качестве ответа вывести слово 'YES', а иначе – слово 'NO'. Вариант 9 Дана строка символов. Определить, сколько в ней слов четной длины. Удалить из нее каждое слово четной длины. Вариант 10 Дана строка символов. Определить, сколько в ней слов нечетной длины. Удалить из нее каждое слово нечетной длины. Вариант 11 В заданной строке текста определите слова, которые начинаются и заканчиваются на одну и ту же букву. Вариант12 Вывести значение true, если в заданном тексте буква 'а' встречается чаще, чем буква 'в', и значение false иначе. Вариант 13 Дана произвольная строка текста. Выясните, является ли она палиндромом, т. е. читается ли строка слева направо так же, как и справа налево. Вариант 14 Напечатайте заданную последовательность символов, заменяя каждую точку многоточием. Вариант 15 Ввести строку, содержащую только цифры. Удалить из строки все впереди стоящие нули. 19
Вариант 16 Введите строку, содержащую только цифры. Удалите из строки все нули. Задание 2 Постановка задачи. Введите фамилию, имя и отчество как одно данное строкового типа(String). Определите длину строки и количество букв 'а' в ней. Выполните дополнительно задание своего варианта: Таблица 4 Варианты заданий Вариант № Вариант 1 Вариант 2 Вариант 3 Вариант 4 Вариант 5 Вариант 6 Вариант 7 Вариант 8 Вариант 9 Вариант 10 Вариант 11 Вариант 12 Вариант 13 Вариант 14 Вариант 15 Вариант 16
Текст задания Продублировать первые буквы трех слов. Вывести длины трех слов. Изъять все буквы 'а ' и ' о ' из фамилии. Вывести фамилию и инициалы. Определить начинается ли хотя бы одно слово с буквы ' М '? Убрать пропуски в строке. Определить сколько букв в имени? Каждую букву имени продублировать. Вывести имя и количество букв в третьем слове. Вывести самое длинное слово. Вывести свои инициалы (первые буквы ФИО с точками). Вывести имя в столбик. Вывести имя, отчество и количество букв в фамилии. Вывести имя и количество букв в фамилии. Вывести фамилию в обратном порядке. Вывести самое короткое слово. Вывести отчество в столбик.
20
ЛАБОРАТОРНАЯ РАБОТА № 2 ПЕРЕВОД ЧИСЕЛ ИЗ ОДНОЙ СИСТЕМЫ СЧИСЛЕНИЯ В ДРУГУЮ СИСТЕМУ СЧИСЛЕНИЯ С ИСПОЛЬЗОВАНИЕМ ОПЕРАТОРОВ ОБРАБОТКИ СИМВОЛЬНОЙ ИНФОРМАЦИИ Цели работы 1. Рассмотрение теоретического материала по системам счисления и переводу числа из одной системы счисления в другую систему счисления. 2. Рассмотрение теоретического материала и закрепление навыков в работе с символьной информацией. 3. Освоение алгоритма перевода чисел из произвольной системы счисления в десятичную систему счисления. Теоретический материал 1. Общие положения Счисление (нумерация) – способ выражения и обозначения чисел. Система счисления – совокупность приемов и правил наименования и обозначения чисел, позволяющих установить взаимно – однозначное соответствие между любым числом и его представлением в виде конечного числа символов (алфавита). Все системы счисления можно разделить на непозиционные и позиционные системы счисления. 2. Непозиционная система счисления Непозиционная система счисления (аддитивная) - система, в которой символы, обозначающие то или иное количество, не меняют своего значения в зависимости от местоположения (позиции) в изображении числа. Запись числа A в непозиционной системе счисления D может быть представлена выражением: 21
АD = D1 + D2 + ... + DN =
n
∑D , i
i =1
где AD – запись числа A в системе счисления D, Di – символы системы. К непозиционной системе счисления относится римская. Символы алфавит и обозначаемое ими количество для этой системы счисления представлены в таблице 5. Таблица 5 Римские цифры Значение (обозначаемое колич.)
1 1
V 5
X 10
L 50
C D М 100 500 1000
3. Позиционная система счисления Систему счисления, в которой значение цифры определяется ее местоположением (позицией) в изображении числа, называют позиционной. Количество различных цифр, употребляемых в позиционной системе, называют основанием системы счисления. В вычислительной технике нашли применение следующие позиционные систем счисления: 1) с основанием 2; 2) с основанием 8; 3) с основанием 16; Как мы уже упоминали, под системой счисления понимают способ представления любого числа посредством алфавита символов. Алфавит разных систем счисления и их основания: – двоичной системы Î 0,1 (две цифры, основание 2); – восьмеричной системы Î 0, 1, 2, 3, 4, 5, 6, 7 (восемь цифр, основание 8); – десятичной системы Î 0,1, 2, 3, 4, 5, 6, 7, 8, 9 (десять цифр, основание 10); – шестнадцатеричной системы Î 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F (шестнадцать знаков, основание 16). В шестнадцатеричной системе для изображения чисел употребляется 16 цифр – от 0 до 15. При этом чтобы одну цифру не изображать двумя знаками, приходится вводить специальные обозначения для цифр, больших девяти. Обо22
значим первые десять цифр этой системы цифрами от 0 до 9, а старшие пять цифр – латинскими буквами: десять – А, одиннадцать – В, двенадцать – С, тринадцать – D, четырнадцать – Е, пятнадцать – F. 3.1. Разряды числа Самая привычная для нас – это десятичная система, ее основание Q = 10. Десятичная система счисления основана на том, что десять единиц каждого разряда объединяются в одну единицу соседнего старшего разряда, поэтому каждый разряд имеет вес равный степени 10. 1
9
9
9
ЦИФРЫ
Рассмотрим число 1999. Значение цифры в числе 1999 разное, оно зависит от положения цифры в числе. Каждая цифра в числе имеет двойную нагрузку – это само значение цифры (0, 1, 2, 3, …, 9) и место, которое она занимает в числе (разряд - единицы, десятки, сотни). – 1-ая справа цифра 9 имеет вес 100 (единицы), – 2-ая справа цифра 9 имеет вес 101 (десятки), – 3-ья справа цифра 9 имеет вес 102 (сотни), – 4-ая справа цифра 1 имеет вес 103 (тысячи). Итак, мы видим, что значение каждого разряда больше значения соседнего справа разряда в число раз, равное основанию Q системы счисления. 3.2. Обозначения систем счисления Приняты следующие обозначения для соответствующих систем счисления (см. таблицу 6). Таблица 6 Название системы счисления D – Decimal (десятичное) B – Binary (двоичное) О – Ooctal (восьмеричное) H – Hexadecimal (шестнадцатеричное)
23
Обозначение 1 12D 1100B 14O СH
Обозначение 2 1210 11002 148 С16
3.3. Таблица соответствия чисел в разных системах счисления В таблице 7 мы видим изображение чисел в разных системах счисления. Таблица 7 10-ая 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
Системы счисления 2-ая 8-ая 0 0 1 1 10 2 11 3 100 4 101 5 110 6 111 7 1000 10 1001 11 1010 12 1011 13 1100 14 1101 15 1110 16 1111 17 10000 20 10001 21
16-ая 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11
Примеры изображения для чисел в разных системах счисления: – 1012 Î 510; 3710 Î 1001012 (с основанием 2, 10); – 7148 Î 11 001 1002; 3710 Î 458 Î 1001012 (с основанием 2, 8,10); – 7D216 Î 0111 10101 00102; 3710 Î 2516 Î 001001012 (с основанием 2, 10, 16). 3.4. Представление числа в виде полинома В общем случае в позиционной СС с основанием Q любое число X может быть представлено в виде полинома:
AQ = an · Qn + an–1 · Qn–1 + … + а1 · Q1 + а0 · Q0 + + а–1 · Q–1 + а–m · Q –m = = a k Q k ,
∑
где ai – цифры Q-ной системы (0 ≤ ai ≤ Q – 1). 24
Требуется найти запись этого же числа А в системе счисления с основанием d. 4. Актуальность задач перевода чисел из одной системы счисления в другую – Часто встречается при программировании на языке Ассемблер. – Отдельные стандартные процедуры языков программирования Паскаль, Бейсик, НMTL и СИ требуют задания параметров в 16-ой системе счисления. – Отыскание неисправности в ЭВМ невозможно без представления о 2-ой системе счисления. – 16-ая и 8-я система счисления используется при составлении команд машинных кодов для более короткой и удобной записи двоичных кодов-команд, данных, адресов, операндов. 5. Перевод из Q-ой системы счисления в 10-ую систему счисления Для перевода из Q-ой системы счисления в 10-ую систему надо представить число в виде полинома, подставив в него известные коэффициенты и вычислить сумму. 5.1. Перевод из 2-ой системы счисления в 10-ую В двоичной системе любое число может быть представлено последовательностью двоичных цифр 0,1. Эта запись соответствует сумме степеней числа 2, взятых с указанными в ней коэффициентами:
X = an · 2n + an–1 · 2n–l + ... + a1 · 2l + + a0 * 20 + a–1 * 2–1 + a–2 * 2–2 + … Запишем какое-либо число в двоичной системе счисления: Число 1 0 0 0 1 1 0 1 Пронумеруем биты справа налево, причем нумерацию начнем с нуля: Число 1 0 0 0 1 1 0 1 Номер бита: 7 6 5 4 3 2 1 0 Подпишем под каждым битом результат возведения числа 2 в степень равную номеру бита: 25
Число 1 0 0 0 1 1 0 1 Номер бита: 7 6 5 4 3 2 1 0 Степень числа 2 128 64 32 16 8 4 2 1 Умножим данные числа на значения, находящиеся в соответствующих им битах: Число 1 0 0 0 1 1 0 1 Номер бита: 7 6 5 4 3 2 1 0 Степень числа 2 12 64 32 16 8 4 2 1 8 Произведение 12 0 0 0 8 4 0 1 8 Сложим данные произведения, получив искомое число в десятичной системе счисления: 128 + 0 + 0 + 0 + 8 + 4 + 0 + 1 = 141. Итак, имеем: 100011012 = 14110. 5.2. Перевод из 8-ой системы счисления в 10-ую Любое число в восьмеричной системе и подставляется полиномом: X = an · 8m + an–1 · 8m–l + ... + a1 · 8l + + a0 · 80 + a–1 · 8–1 + a–2 · 8–2 + … Переведем число 215 из восьмеричной системы счисления в десятичную систему счисления. Число 2 1 5 Номер бита 2 1 0 Степень числа 8 64 8 1 Произведение 128 8 5 Сложим произведения и получим: 128 + 8 + 5 = 141. Итак, имеем: 2158 = 14110. 5.3. Перевод из 16-ой системы счисления в 10-ую Любое число в шестнадцатеричной системе преставляется полиномом: X = an · 16m + an–1 · 16m–l + ... + a1 · 16l + + a0 · 160 + a–1 · 16–1 + a–2 · 16–2 + … Переведем число А0Е из шестнадцатеричной системы счисления в десятичную систему счисления. Число А 0 Е Номер бита 2 1 0 26
Степень числа 16 256 16 1 Произведение 2560 0 14 Сложим произведения и получим: 2560 + 0 + 14 = 2574. Итак, имеем: А0Е 16 = 257410. В таблице 8 приведены еще несколько примеров по переводу из Q-ой системы счисления в 10-ую. Таблица 8 Число 45710 258 3АС16
Q-основание СС 10 8 16
n-кол. разрядов 3 2 3
11112
2
4
Полином
Сумма
4 · 102 + 5 · 101 + 7 · 100 2 · 8 1 + 5 · 80 3 · 162 + 10 · 161 + + 7 · 160 + 12 · 10–1 3 1 · 2 + 1 · 22 + 1 · 21 + 1 · 20
45710 2110 94010 1510
6. Перевод чисел из 10-й системы счисления в 2-ую, 8-ую, 16-ую системы Рассмотрим теперь перевод числа из Q-системы в hсиcтему посредством арифметических операций. Правила для перевода целых чисел и дробей различны. Мы остановимся только на случае с целыми числами. 6.1. Правило перевода целых чисел Пусть целое число А представлено в Q-системе, требуется перевести в h-систему счисления. Для перевода целого числа из Q-ой системы счисления в h-ую систему нужно последовательно делить это число и получаемые частные на основание h новой системы счисления до тех пор, пока частное не станет меньше h. Старшей цифрой в записи числа в h-системе служит последнее частное, а следующие за ней цифры дают остатки, выписываемые в последовательности, обратной их получению. 6.2. Перевод числа из десятичной системы в двоичную Возьмем какое-либо число, например, 14110. Будем делить его на 2 до тех пор, пока результат от деления не станет
27
равным нулю. При этом остатки, которые будут получаться при каждом делении, мы будем записывать в строку справа налево. Итак, разделив 141 на 2, получаем число 70 в качестве результата и остаток 1. Начинаем записывать остатки: 1. Далее, делим 70 на 2, получаем 35 и остаток 0. Дополняем список остатков слева: 01. Далее, делим 35 на 2, получаем 17 и остаток 1, дополняем список остатков слева: 101. И так далее, пока результат деления не станет равным нулю (см. таблицу 9). Таблица 9 Номер шага
Делимое
Результат
Остаток
1 2 3 4 5 6 7 8
141 70 35 17 8 4 2 1
70 35 17 8 4 2 1 0
1 0 1 1 0 0 0 1
Список остатков после данного шага 1 01 101 1101 01101 001101 0001101 10001101
Таким образом, в результате последовательной записи остатков мы получаем число: 14110 = 100011012 . 6.3. Перевод числа из десятичной системы счисления в восьмеричную Возьмем число 14110. Будем делить его на основание систеиы счисления 8. При этом остатки, которые будут получаться при каждом делении, мы будем записывать в строку справа налево. 141 : 8 = 17 (остаток 5); 17 : 8 = 2 (остаток 1); 2 : 8 = 0 (остаток 2); Первый остаток равен 5, второй – 1, третий – 2. Поэтому окончательно получим: 14110 = 2158. 6.4. Перевод числа из десятичной системы счисления в шестнадцатеричную
28
Возьмем число 14110. Будем делить его на на основание систеиы счисления 16. При этом остатки, которые будут получаться при каждом делении, мы будем записывать в строку справа налево. 141 : 16 = 8 (остаток 13); 8 : 16 = 0 (остаток 8). В таблице 7 находим, что числу 13 соответствует D. Записав остатки, имеем следующее: 14110 = 8D16. Рассмотрим задачу по переводу числа из р-ой системы счисления в 10-ую. Задача 1 Ввести последовательность символов, представляющую собой запись числа в системе счисления с основанием р. Требуется перевести это число в систему счисления с основанием 10 (десятичную). Program Lab2_1; Uses Crt ; Var a, S, p, code: Integer ; L, I, PR: Integer ; St: String [10 ] ; Begin ClrScr; WriteLn ('Введи число'); Read (St); WriteLn ('Введи основание CC'); Read (p); S: = 0 ; PR: = 1; For i: = LENGTH (St) Downto 1 DO Begin Val ( St [I], a, code); S: = S + PR * a; PR: = PR * p; End; WriteLn ('Результат'); WriteLn ('10-e число = ', S);
29
ReadKey; End. Протокол работы программы. Введи число 326 Введи основание CC 7 Результат: 10-e число = 127 Опишем работу программы Lab2_1. Мы видим два базовых алгоритма: – вычисление суммы S; – вычисление степени рi . Описание переменных: S – Переменная, используемая для накопления суммы, р – основание системы счисления, PR – переменная, где накапливаем вычисленное рi, St – строковая переменная, куда вводим число. Блок-схема программы приведена на рис. 1. Приведем также словесное описание алгоритма: – Вводим число (для примера введено число 326). – Вводим основание системы счисления, в которое нужно перевести число (для примера введено 7). Рис. 1. Блок-схема программы – Перед входом в цикл перевода числа с основанием присваиваем начальные значения р в 10-ую систему счисления переменным (S : = 0; PR : = 1). – Организуем цикл, количество повторений которого равно длине слова (количеству цифр в числе). Цифры числа рассматриваем, начиная с последней. В цикле вычисляем рi (у нас 7i) и суммируем полученные произведения в переменной S. 30
– Выводим S – результат вычислений. 7. Контрольные вопросы 1. Что такое система счисления? 2. В чем отличие позиционной системы счисления и непозиционной? 3. Что называется основанием системы счисления? 4. Что понимают под алфавитом системы счисления? 5. Объяснить понятие разряда. 6. Какие системы счисления являются более эффективными для использования в цифровых автоматах? 7. Какие способы перевода чисел из одной системы счисления в другую вы знаете? 8. В чем заключается преимущество использования восьмеричной и шестнадцатеричной систем счисления? 9. Дайте определение двоично-десятичной системы счисления. 8. Практическое задание Практическое задание включает в себя: – задание на решение задачи по переводу числа из системы счисления с основанием р в десятичную систему счисления; – задание на решение задачи по переводу числа из десятичной систем счисления в систему счисления с основанием р.
Методические указания – Определить алгоритм решения задачи, записать намеченный алгоритм в виде блок-схемы программы. – Подобрать контрольный пример. – После чего приступить к написанию программы в ИСП. Содержание отчета 1. Постановка задачи для конкретного варианта. 2. Текст программы и результаты ее выполнения. 31
3. Блок-схема алгоритма. 4. Выводы. Задание 1 Постановка задачи. Ввести последовательность символов, представляющую собой запись числа в системе счисления р. Требуется перевести это число в десятичную систему счисления и определить, кратно ли оно М (величины р и М определяются вариантом задачи, приведенном в таблице 10). Вывести на печать число в исходной и десятичной системах счисления. Если число кратно М, то напечатать TRUE, в противном случае напечатать FALSE. Задание 2 Постановка задачи. Ввести последовательность символов, представляющую собой запись числа в десятичной системе счисления. Надо перевести это число в систему счисления с основанием р (величина р определяется вариантом задачи, приведенном в таблице 10). Вывести на печать число в десятичной и полученной системах счисления. Таблица 10 Варианты заданий Номер варианта 1 2 3 4 5 6 7 8
Основание системы счисления р 16 8 7 6 4 4 11 12
Число M
Номер варианта
3 4 5 8 9 7 8 10
9 10 11 12 13 14 15 16
32
Основание системы счисления р 16 9 16 5 3 4 8 3
Число M 11 7 3 2 5 7 6 4
ЛАБОРАТОРНАЯ РАБОТА № 3 ПЕРЕЧИСЛИМЫЙ И ИНТЕРВАЛЬНЫЙ ТИПЫ ДАННЫХ
Цели работы 1. Освоение теоретического материала по использованию перечислимого и интервального типов данных. 2. Получение навыков в использовании перечислимого и интервального типов данных.
Теоретический материал 1. Общие положения Алгоритмический язык Pascal дает широкие возможности для задания дополнительных типов, характеристики которых можно определять самостоятельно. Новые типы описываются в специальном разделе типов или определяются непосредственно при описании переменных. В Pascal имеются два дополнительных порядковых типа, которые относятся к пользовательским типам: – перечислимый тип; – интервальный тип или диапазон. Они используются для того, чтобы еще больше ограничить количество значений, принимаемых переменными этого типа, и позволяют: – значительно улучшить наглядность программы; – оптимально выделить память под переменные, т. к. в этом случае компилятор сам подбирает наиболее подходящий размер ячейки памяти; – облегчить поиск ошибок (благодаря возможности контроля тех значений, которые получают соответствующие переменные).
33
2. Перечислимый тип Перечислимый тип данных задается списком значений (объектов), которые могут принимать переменные этого типа. При этом каждый объект есть имя. Числа, логические и символьные константы не могут являться объектами перечислимых типов. Сами значения указываются через запятую, а весь список заключается в круглые скобки. Первое значение имеет порядковый номер 0, второе – 1 и т. д. (при необходимости до 65535). Пример 1 Type Color = (red, blue, green, black); Var A, X, Y, Z : Color ; Можно записать следующие операторы присваивания:
A : = red ; X : = blue ; Y : = green ; Z : = black; В приведенном примере создается новый перечислимый тип данных Color. Переменные этого типа могут принимать всего 4 значения: red, blue, green и black. Для значений перечисления одного и того же типа допустимы операции сравнения. Упорядочение осуществляется по номеру элемента в описании типа. Например, будет истинно выражение blue < green, т. к. blue имеет меньший номер по порядку в описании типа, чем green. Для объектов перечислимых типов определены стандартные функции Pred, Succ и Ord, имеющие тот же смысл, что и для стандартных скалярных типов. Например, для типа Color результатом функции Succ(red) является значение blue, результатом функции Pred (black) – green . Функция Ord (blue) выработает значение, равное единице, так как нумерация объектов в списке начинается с нуля. В языке Pascal применение перечислимого типа ограничено тем, что значения данных этого типа нельзя вводить с клавиатуры или выводить на какое-либо устройство вывода, а также над ними нельзя выполнять обычные арифметические операции. Их можно только присваивать переменной перечислимого типа. 34
Обычно этот тип применяется для хранения промежуточных данных, что позволяет сделать текст программы более выразительным и понятным. Оператор варианта Case удобно использовать для ввода и вывода значений перечислимых скалярных типов. Задача 1 Нужно по названию страны поставить в соответствие столицу этой страны. Program Lab3_1; Uses Crt ; Type Land = (Avstriya, USA, Rusland, Franziya); Stolica = (Vien, Washington, Moskau, Pariz); Var str: Land; Gorod: Stolica; N: Integer; Begin ClrScr; Begin For Land: = Avstriya To Franziya Do Case str Of Avstriya: WriteLn ('Vien'); USA: WriteLn ('Washington'); Rusland: WriteLn ('Moskau'); Franziya: WriteLn ('Pariz'); End; Readln; End. Протокол работы программы: Vien Washington Moskau Pariz Опишем работу программы. Имеем два списка объектов перечислимого типа: Land и Stolica. В цикле перебираем объекты из списка значений перечислимого типа Land , оператор Case выводит на экран из списка значений перечислимого типа Stolica соответствующее значение Stolica.
35
3. Интервальный тип Интервальный тип представляет собой диапазон (интервал) значений какого-либо порядкового типа, называемого базовым. При описании этого типа указывается минимальное и максимальное значения диапазона значений, допустимого для этого типа:
< Минимальное значение > … < Максимальное значение > Пример 2 Type Mec = 1. .12 ; Num = 'а '..' z ' ; Dey = Mon .. Fri ; Номер месяца Mec может принимать значения от 1 до 12 или переменная Num может принимать значения от ' а ' до ' z ' (буквы латинского алфавита), переменная Dey соответственно может принимать значения от Mon до Fri (дни недели); Для каждой операции с переменной интервального типа автоматически выполняется проверка: остается ли значение переменной внутри установленного для нее диапазона. Например, при попытке присвоить номеру месяца значение ноль будет выведено сообщение об ошибке. Автоматическая проверка объявленных границ позволяет не отвлекаться на организацию собственного контроля, что является существенной выгодой от использования интервального типа. К переменным интервального типа применимы все операции и стандартные функции, которые допустимы при работе с переменными соответствующего базового скалярного типа. Задача 2 По дате (месяц и день рождения) определить знак Зодиака. PROGRAM Lab3_2; Uses Crt; Var m: 1 .. 12 ; {месяц} d: 1 .. 31 ; {день} Zod: (Ari, Tau, Cem, Can, Leo, Vir, Lib, Sco, Sag, Cap, Agu, Fis); 36
{Знаки зодиака: Ari – Овен, Tau – Телец, Cem – Близнецы, Can – Рак, Leo – Лев, Vir – Дева, Lib – Весы, Sco – Скорпион, Sag – Стрелец, Cap – Козерог, Agu – Водолей, Fis – Рыбы} Begin ClrScr; WriteLn (' Введите месяц ') ; ReadLn (m) ; WriteLn (' Введите день') ; ReadLn (d) ; Case m of 1 : If d <= 20 Then Zod := Cap Else Zod := Agu ; 2 : If d <= 18 Then Zod := Agu Else Zod := Fis ; 3 : If d <= 20 Then Zod := Fis Else Zod := Ari ; 4 : If d <= 20 Then Zod := Ari Else Zod := Tau ; 5 : If d <= 21 Then Zod := Tau Else Zod := Cem ; 6 : If d <= 21 Then Zod := Cem Else Zod := Can ; 7 : If d <= 22 Then Zod := Can Else Zod := Leo ; 8 : If d <= 23 Then Zod := Leo Else Zod := Vir ; 9 : If d <= 23 Then Zod := Vir Else Zod := Lib ; 10: If d <= 23 Then Zod := Lib Else Zod := Sco ; 11: If d <= 22 Then Zod := Sco Else Zod := Sag ; 12: If d <= 21 Then Zod := Sag Else Zod := Cap End; WriteLn (' Ваш знак Зодиака: ') ; Case Zod Of Ari : WriteLn (' Oven ') ; Tau : WriteLn (' Telec ') ; Cem : WriteLn (' Blicneci ') ; Can : WriteLn (' Rak ') ; Leo : WriteLn (' Lev ') ; Vir : WriteLn (' Deva ') ; Lib : WriteLn (' Beci ') ; Sco : WriteLn (' Skorpion ') ; Sag : WriteLn (' Ctrelec ') ; Cap : WriteLn (' Koserog ') ; Agu : WriteLn (' Vodoley') ; Lib : WriteLn (' Beci ') ; Fis : WriteLn (' Ribi ') ; 37
End ; ReadLn ; End. Протокол работы программы : Введите месяц 8 Введите день 26 Ваш знак Зодиака: Deva Пояснения к программе. Известно, что астрологи делят год на 12 периодов и каждому из них ставят в соответствие один из знаков Зодиака: 20.01 – 18.02 19.02 – 20.03 21.03 – 19.04 Водолей Рыбы Овен 20.04 – 20.05 21.05 – 21.06 22.06 – 22.07 Телец Близнецы Рак 23.08 – 22.09 23.09 – 22.10 23.07 – 22.08 Лев Дева Весы 20.10 – 22.01 23.11 – 21.12 22.12 – 19.01 Скорпион Стрелец Козерог Вводятся день и месяц рождения, далее пользуясь приведенным соответствием дата – месяц – знак Зодиака, с помощью операторов множественного выбора Case определяется сначала знак Zod, а затем ставится в соответствие и выводится на печать название соответствующего знака Зодиака. 4. Практическое задание Практическое задание включает в себя: – задание на составление блок-схемы для задачи, программа которой приведена ниже (по дате рождения определить знак Зодиака); – упражнения и задания на решение задач.
Методические указания При выполнении задания следует: – Ознакомиться с теоретической частью описания и программой, которая вводит день и месяц рождения и определяет знак Зодиака. 38
– Определить алгоритмы решения, приведенных в лабораторной работе задач, записать алгоритмы в виде блоксхем. – Подобрать соответствующие контрольные примеры. – После чего приступить к написанию текстов программ и отладке в ИСП. Содержание отчета 1. 2. 3. 4.
Блок-схема к программе Lab3_1. Ответы на вопросы Ответы к упражнениям. Тексты программ и блок-схемы к программам.
5. Вопросы, упражнения, задачи 5.1. Теоретические вопросы (перечислимый тип) 1. Как определяется перечислимый тип? 2. Какие значения может принимать переменная перечислимого типа? 3. Что представляет собой значение перечислимого типа? 4. Могут ли встречаться одинаковые значения при описании двух различных перечислимых типов? 5. Можно ли в разделе типов описать одновременно два следующих перечислимых типа? Type карандаши = (синий, красный, зеленый) ; цвета = (желтый, голубой, синий) ; 6. Применимы ли операции сравнения к переменным перечислимого типа. Если да, то каков результат различных операций? 7. Может ли переменная перечислимого типа быть параметром цикла For? 8. Какие стандартные функции применимы к переменным перечислимого типа? 9. Ко всем ли значениям перечислимого типа применимы функции Succ и Pred?
39
10. Можно ли к данным перечислимого типа применить стандартные процедуры ввода-вывода? 11. Какие средства имеются в языке Паскаль для вводавывода значений переменных перечислимого типа? 5.2. Упражнения (перечислимый тип) 1. Что будет напечатано в результате выполнения цикла в следующем фрагменте программы: Type colour = (green, yellow, red) ; Var c : colour ; Begin For с : = green To yellow Do Write ( Ord (c ) ) ; End. 2. Измените фрагмент программы из предыдущего вопроса, заменив цикл For циклом While. 3. В разделе типов описан список деталей: Type список деталей = (шуруп, гайка, винт, шпилька) ; Написать фрагмент программы, обеспечивающий распечатку названия детали по указанному номеру. 4. Пусть имеются описания: Type day = (monday, tuesday, wednesday, thursday, friday, saturday, sunday); pmonth = ( m28, m29, m30 , m31 ) ; Var wday, weekday : day ; kday: pmonth ; a) установите, какие значения могут принимать переменные weekday, kday; b) определите, допустимы ли следующие присваивания: weekday : = friday ; kday : = m27 ; weekday : = m30 ; kday : = Ord ( thursday ) ; c) вычислите значения выражений: monday < sunday ; tuesday = m 28 ; wednesday <= wednesday ; tuesday <> m29 ;
40
Succ (m29); Pred (saturday); Pred (m28); Ord (tuesday); Ord (tuesday) + Pred (30); Succ (kday) + 1 + Ord (pmonth). d) Что будет напечатано в результате выполнения следующих операторов: wday : = Succ (friday); If wday = sunday Then WriteLn ('yes') Else WriteLn ('no'); WriteLn (ord (monday)); For wday : = monday To friday Do Write (Ord (wday)); e) Допустимы ли следующие операции ввода-вывода: Read (wday); Write (monday); WriteLn ('sunday'); WriteLn (ord (wednesday)); WriteLn (succ (tuesday)); WriteLn ('pmonth =', ord (m28)); f) Допустимы ли следующие заголовки цикла: For wday : = monday To saturday Do; For wday : = sunday Downto monday Do; For kday : = m28 To m30 Do; For kday : = 1 To 31 Do; 5. Пусть дан представленный ниже фрагмент программы. Присвойте переменной t значение true, если месяц ml предшествует месяцу m2, и значение false в противном случае. Месяцы ml и m2 принадлежат одному году. Type month = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); Var ml, m2 : month; t : boolean; 6. Пусть дан следующий фрагмент программы: Type month = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec) ; Var ml, m2 : month: i: Integer; 41
Присвойте переменной ml: a) название месяца, следующего за месяцем m2 (считайте, что за декабрем идет январь) ; b) название k-го месяца после месяца m; c) название п-го месяца года. 7. Пусть дан фрагмент программы: Type month = (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec); Var k : 1 .. 366; d : 1 .. 31; m : month; a) определите k – порядковый номер того дня високосного года, который имеет дату d и m; b) определите d и m – дату k-го по счету високосного года. 5.3. Теоретические вопросы (интервальный тип) 1. Верно ли то, что ограниченный тип называется также интервальным типом? 2. Почему интервальный тип называется диапазоном? 3. Верно ли, что интервальный тип используется тогда, когда заранее по смыслу задачи известен диапазон изменения переменных? 4. Что делает компилятор при каждой операции с переменной интервального типа? 5. Могут ли константы, определяющие границы интервального типа, иметь тип Real? 6. Верно ли, что значение первой константы, определяющей интервальный тип данных, должно быть меньше второй? 7. Какие символы разделяют константы, определяющие тип диапазон? 8. Где определяется тип диапазон? 9. Можно ли границы диапазона задать не значениями констант, а их именами, определенными в разделе описания констант? 10. Какие значения могут принимать переменные типа диапазон? 11. Можно ли стандартные функции Оrd, Succ, Pred применять к переменным интервального типа?
42
12. Можно ли к переменным интервального типа применять процедуры ввода – вывода? 13. Как описываются переменные ограниченных типов? 14. Можно ли операцию, применимую к переменной некоторого типа, применять к переменной, относящейся к соответствующему диапазону? 15. Могут ли в одном выражении встречаться переменные, относящиеся k раз личным диапазонам одного основного типа? 16. Может ли переменная интервального типа фигурировать в левой части оператора присваивания? 17. Может ли переменная интервального типа фигурировать в правой части оператора присваивания? 5.4. Упражнения (интервальный тип) 1. Описать переменную I как переменную ограниченного типа, принимающую целочисленные значения от 20 до 35. 2. Можно ли задать переменную ограниченного типа, принимающую вещественные значения на отрезке [2;5]? 3. В следующем фрагменте программы определите новый курс корабля К2, если корабль сначала шел по курсу К1, а затем его курс был изменен согласно приказу ПР. Type курс = (север, восток, юг, запад); приказ = (вперед, влево, назад, вправо); Var К1, К2 : курс; ПР : приказ; 4. Пусть даны описания: Type days 1.. 31; Var RabDay, BolnDay : days; t : boolean; k : Integer; а) может ли переменная RabDay принимать значения 1, 2, 30, 0? б) могут ли значения переменных RabDay и BolnDay быть одинаковыми? в) допустимы. ли представленные ниже операторы? RabDay : = 25; BolnDay : = 1;
43
t : = RabDay = BolnDay; For RabDay : = 5 To 30 Do; k : = Ord (RabDay) – 2; k : = Succ(BolnDay); k : = Pred (RabDay); 5. Пусть даны описания: Var z : ' a ' . .' z '; date : 1..31; digit : ' 0' .. ' 9 '; month : 1 .. 12 ; Допустимы ли операторы? a) date : = 1; 2; 31; b) month : = Ord (digit); c) month = Ord (month); d) For z : = ' a ' To ' z ' Do e) For month : = 6 To 31 Do f) Read (month); h) WriteLn (z). 6. Представить задуманное натуральное число при помощи римских цифр. При этом имеем следующее соответствие: 1000 – М, 500 – D, 100 – C, 50 – L, 10 – X, 5 – V, 1 – I.
ЛАБОРАТОРНАЯ РАБОТА № 4 МНОЖЕСТВЕННЫЙ ТИП ДАННЫХ (I)
Цели работы 1. Освоение теоретического материала по использованию перечислимого и интервального типов данных. 2. Получение навыков в использовании перечислимого и интервального типов данных. 44
Теоретический материал 1. Общие положения В Paskal под множеством понимают ограниченный, неупорядоченный набор различных элементов одинакового типа. Например: множество фигур на плоскости (прямоугольник, квадрат, круг, ромб), множество радиодеталей (транзистор, диод, конденсатор), множество транспортных средств (автобус, трамвай, метро, такси). Все элементы множества должны быть одного порядкового типа, который называется базовым типом этого множества. Базовым типом может быть любой ограниченный или скалярный тип, кроме неограниченного целого и вещественного типа. Базовый тип задается диапазоном или перечислением с учетом допустимого количества элементов и того, что элементы (для целых типов) должны лежать в диапазоне от 0 до 255. Элементы множества заключаются в квадратные скобки. Множество, не содержащее элементов, называется пустым. Пустое множество обозначается [ ], оно включено в любое другое множество. Два множества считаются эквивалентными тогда и только тогда, когда все их элементы одинаковы, причем порядок следования элементов во множестве безразличен. Поэтому одинаковы следующие множества: [A, B, C], [B, C, A], [C, B, A]. Записи типа [ 5 .. 5 ] , [ 9 .. 0 ] соответствуют одноэлементному множеству и пустому множеству. Если все элементы одного множества входят также и в другое, говорят о включении первого множества во второе. После задания базового типа совокупность значений соответственного множественного типа определяется автоматически, в нее входят все возможные подмножества, являющиеся произвольными комбинациями базового множества. 2. Описание множественного типа Множества должны быть объявлены либо c использованием раздела описания типов Type, либо в разделе описания переменных Var. Используется словосочетание Set Of.
45
– Объявление множества с использованием раздела типов имеет вид: Type < имя типа > : Set of < базовый тип >; Var < имя множества > : < имя типа >; – Объявление множества в разделе переменных имеет вид: Var < имя множества > : Set of < базовый тип >; 2.1. Присваивание значений переменным множественного типа Для присваивания значений переменным типа множество используется оператор присваивания:
< имя переменной > : = < выражение >; Типы множества и выражения должны совпадать. Конкретные значения множественного типа задаются с помощью конструктора множества, представляющего собой список элементов множества, заключенный в квадратные скобки. Пример 1 Зададим постоянное множество а, опишем тип множества symbol и объявим переменные number , s и cvet соответствующих типов. Const а = [1, 2, 5, 9]; {Задаем постоянное множество} Type symbol : Set Of Char; {Описываем множество символов} {Объявляем переменные number, s, cvet соответствующих множественных типов} Var number : Set Of 1 .. 100; s : symbol; cvet : Set Of (green, black, red); Объявленным выше переменным можно присвоить такие значения: number : = [ ]; number : = [12, 15, 7, 99]; number : = number + [1, 2, 6, 7] * [3, 4, 6, 7] – [4, 7]; s : = [' А ', ' 5 ', ' $ ']; а : = [' R '] * [' X ', ' Y ',' R '] + [' 25 ', ' 20 ', ' r ']; cvet : = [green] ; cvet : = [black]; cvet : = [red]; 46
cvet : = [green, black]; cvet : = [green, red]; cvet : = [black, red]; cvet : = [green, black, red]; cvet : = [ ]; В общем случае, если базовое множество содержит N элементов, производный множественный тип определяет 2N подмножеств. В последнем случае переменная cvet может принимать 23 = 8 различных значений. 2.2. Операции над множествами Над множествами определены операции: пересечение, объединение, разность, сравнение, а также операция принадлежности множеству. Первые три операции (пересечение, объединение, разность) создают производные множества. Демонстрация работы этих операций проведена в задаче 1 Лабораторной работы № 8 настоящего описания. Операции сравнения – это операции отношения, они двухместные и возвращают логическое значение (False или True). Операнды должны быть везде сопоставимы, то есть построены на одном базовом типе.
2.2.1. Пересечение двух множеств Результатом операции пересечения двух множеств А * В будет множество С, состоящее только из тех элементов, которые принадлежат как множеству А, так и множеству В. 2.2.2. Объединение двух множеств Результатом операции объединения двух множеств А + В будет множество С, включающее как все элементы множества А, так и все элементы множества В. 2.2.3. Разность двух множеств Результатом операции разности двух множеств А - В будет множество С, состоящее только из тех элементов множества А, которые не входят в множество В. 2.2.4. Операции сравнения = проверка эквивалентности, возвращает True, если оба множества эквивалентны. 47
<> проверка неэквивалентности, возвращает True, если оба множества неэквивалентны. <= проверка вхождения, результат операции True, если первое множество включено во второе. >= проверка вхождения, результат операции True, если второе множество включено в первое. 2.2.5. Операции включения Операция In осуществляет проверку вхождения элемента во множество, первый операнд должен принадлежать базовому типу, а второй – множественному типу значений, построенному на этом базовом типе. Пример 2 а) объявим символьный множественный тип: Type mn = Set Of Char ; Var с, а, b : mn; a : = ['R0', 'X', 'V', 'Z']; b : = ['С', 'Y', 'А', 'В', 'Z']; Тогда рассмотрим элементы результирующего множества С, если будут использованы операции над множествами: с : = а * b; {Множество с = ['Y', 'Z']}; с : = а + b; {Множество с = ['R', 'Х', 'Y', 'Z', 'А', 'В', 'С']}; 'X' In mn; {результат операции дает True} [ ] <= а; {результат операции дает True} а = b; {результат операции дает False} b) пусть а : = [' 0 ', ' 2 ', ' 3 ', ' 4 ']; b : = [' 4 ' , ' 2 ', ' 3 ', ' 0 ']; а = b; {результат операции дает True} c) объявим множественный тип: Type num = Set Of 0 .. 10; Var A, B : num; K : Bytе; Выполним операции присваивания: К : = 2; А : = [1, K + 2]; B : = [K – 1, 7]; Теперь множество A состоит из элементов: A [1, 4], множество B состоит из элементов: B [1, 7]. d) вычислим значения выражений: 48
[21] <> [21, 21]; {результат операции дает False} [' k ', ' 1 '] = [' k ', ' 1 ']; {результат операции дает True} [ ] <= [' 0 '.. ' 9 ']; {результат операции дает True} ' r ' In [' а '.. ' z ']; {результат операции дает True} Trunc (9.5) In [7, 8, 9]; {результат операции дает True} 2.2.6. Нахождение элемента во множестве В операции проверки вхождения элемента во множество, обозначаемой служебным словом In, первый операнд должен принадлежать базовому типу, а второй – множественному типу значений. Для определения наличия элемента во множестве используют такую конструкцию: If < элемент базового типа > In < множество > Then < команда 1 > Else < команда 2 >; Пример 3 Проверить, принадлежит ли число 25 множеству а : = [21, 4, 12, 25] можно так: n : = 25; а : = [21, 4, 12, 25]; If n In a Then WriiteLn ('Число', n, 'входит во множество') Else WriiteLn ('Число', n, 'во множество не входит'); В результате выполнения операции In имеем : Число 25 входит во множество. 2.3. Приоритеты операций при работе с множествами 1) * 2) +, – 3) In, =, <>, <=, >= В группы объединены операции равного приоритета. При этом последовательность выполнения операций одного приоритета определяется порядком их появления в выражении. Для изменения порядка выполнения используются круглые скобки. 2.4. Эквивалентные соотношения Эквивалентные соотношения, связывающие логические операции с операциями над множествами имеют вид:
49
х In (А + В) = (х In А) Or (х In В); х In (А * В) = (х In А) And (х In В); х In (А – В) = (х In А) And Not ((х In В). 2.5. Недостатки множественного типа Главные недостатки множественного типа: малый размер множеств и невозможность их вывода на экран (ввод множеств возможен только по элементам). Проблема частично решается при помощи встроенного отладчика, либо в некоторых случаях при помощи операции In. Задача 1 Менеджер компьютерного магазина-салона регулярно получает информацию о технике, которую привозят на склады А, В, С. Русским названиям изделий поставлены номера 1 – 9, английским - имена tl – t9. Английские имена описаны с помощью перечислимого типа tovary. Составить программу, которая дает информацию об изделиях, имеющихся в наличии на складах А или В, но которых нет на складе С. Program Lab4_1 ; Uses Crt ; Type tovary = (t1, t2, t3, t4, t5, t6, t7, t8, t9); Const A : Set Of tovary = [t1, t3, t4, t5 ,t6 ,t9]; B : Set Of tovary = [t1, t2, t3, t5, t6, t8 ,t9]; C : Set Of tovary = [t3, t5, t6, t8]; Var tovar : tovary; Begin ClrScr; WriteLn ('У нас такие товары:'); For tovar : = t1 To t9 Do If tovar In A + B – C Then Case Ord (tovar) + 1 of 1 : WriteLn ('Компьютеры Dell Dimension'); 2 : WriteLn ('Компьютеры IBM PC 300'); 3 : WriteLn ('Компьютеры Celebriis XL, QL'); 4 : WriteLn ('Принтеры Epson LX, LQ'); 5 : WriteLn ('Принтеры HP LJ 5L'); 6 : WriteLn ('Сканер Epson GT9000');
50
7 : WriteLn ('Дисковод CD-ROM'); 8 : WriteLn ('Дискеты Verbatim 1.44Mb'); 9 : WriteLn ('Дискеты Polaroid 1.44Mb') End; WriteLn; WriteLn ('Mы ждем вас'); ReadLn; End. Протокол работы программы. У нас такие товары: Компьютеры Dell Dimension 2 Компьютеры IBM PC 300 Принтеры Epson LX, LQ Дискеты Polaroid 1.44Mb Mы ждем вас В разделе типов задается список объектов (товаров), определяющий базовый тип (tovary), на основе которого построены множественные типы А, В, С. Исходные значения (перечень товаров, имеющихся в наличии) в множества А, В, С занесены с помощью типизированной константы. Далее в цикле перебираем все товары и по номеру товара (функция ORD) и, используя операцию включения In печатаем информацию об изделиях, имеющихся в наличии на складах А или В, но которых нет на складе С. Задача 2 Дано натуральное число n (n <=100), определяющее возраст человека (в годах). Дать для этого числа наименование «год», «года» или «лет», например: 1 год, 24 года, 90 лет. Program Lab4_2; Uses Crt; Var n : 1..100; Begin ClrScr; Write ('Введите возраст'); ReadLn (n); GoToXY (WhereX + 20, WhereY – 1); If n In [11 .. 14]
51
Then Write ('лет') Else Case n Mod 10 Of 1 : WriteLn ('год'); 2 .. 4 : WriteLn ('года'); 0, 5 .. 9 : WriteLn ('лет'); End; ReadLn; End. Протокол работы программы. Введите возраст 25 лет. Искомые наименования зависят от остатка, полученного при делении числа n на 10. Исключение составляют числа 11, 12, 13, 14. Используем оператор ветвления If в полной форме, в одной из ветвей которого учитываем исключение с помощью оператора включения In. В другой ветви Else используем оператор выбора Case. Условие n In [11..14] истинное (True), если n является элементом множества [11, 12, 13, 14], оно заменяет составное условие (n > 10) and (n < 15). Задача 3 В заданном множестве В удалить все числа, кратные 2 Program Lab4_3; Uses Crt; Var В : Set Of 0 .. 25; i : byte; Begin ClrScr; For i : = 1 To 25 Do If (i In В) And (i Mod 2 = 0) Then B : = B – [i]; {блок печати множества В} For i : = 1 to 25 Do If i In B Then Write (i : 3); End. Протокол работы программы Lab4-3: 1 3 5 7 9 11 13 15 17 19 21 23.
52
Задача 4 Ввести строку символов и сформировать из нее множество Lat, содержащее латинские буквы из входной строки; Program Lab4_4; Uses Crt; Var Lat : Set Of ' A ' .. ' Z '; C, i : Char; Begin ClrScr; ReadLn; Lat : = [] Write ('Введите строку'); Repeat Read (C); If C In ['A' .. 'Z '] Then Lat : = Lat + [C]; Until Eoln; {Вывод множества Lat} WriteLn ('Латинские буквы'); For I : = ' A ' To ' Z ' Do If i In Lat Then Write (i : 2); End. Протокол работы программы. Введите строку: 45АFYB. Латинские буквы. A B F Y 3. Контрольные вопросы 1. Какие типы данных используются в качестве базовых при построении множественных типов? 2. Может ли базовый тип множества быть вещественным? 3. В каких пределах можно изменять количество элементов, входящих во множество? 4. Может ли множество не содержать ни одного элемента? 5. Как обозначается пустое множество? 6. Какой объем памяти занимает один элемент множества? 7. Каково внутреннее представление множества? 8. Может ли множество содержать элементы различных типов?
53
9. Может ли множество содержать несколько одинаковых элементов? 10. Что называется мощностью множества? 11. Какова мощность множества, базовый тип которого boolean? 12. Может ли тип диапазон быть базовым типом множества? 13. Могут ли два множества содержать одинаковые элементы? 14. Верно ли, что два множества эквивалентны тогда и только тогда, когда все их элементы одинаковы, причем порядок следования элементов во множестве не имеет значения? 15. Какие операции определены над переменными множественного типа и, каков их приоритет? 16. Как работает операция In? 17. Какие множества считают равными; неравными? Имеет ли значение для сравниваемых множеств порядок следования элементов? 18. Каково назначение операций «больше или равно», «меньше или равно», примененных к данным множественного типа? 19. Что называется объединением множеств? 20. Что называется пересечением множеств? 21. Что называется разностью множеств? 22. Верно ли, что спецификациями элементов конструктора множеств могут быть константы или выражения базового типа, а также тип диапазон того же базового типа? 23. Может ли конструктор множества стоять в правой части оператора присваивания? 24. Можно ли конструктор множества использовать в выражении? 25. Если в базовом типе п различных значений то, сколько различных значений в построенном на его основе множественном типе? 4. Практическое задание Практическое задание включает в себя: – упражнения и задания; – задание на решение задач.
54
Методические указания – При выполнении заданий следует ознакомиться с теоретической частью лабораторной работы – Определить алгоритм решения задачи, записать намеченный алгоритм в виде блок-схемы программы. – Подобрать контрольный пример. – После чего приступить к написанию программы в ИСП. Содержание отчета 1. 2. 3. 4.
Постановка задачи. Описание алгоритма. Блок-схема алгоритма. Текст программы и результаты ее выполнения.
4.1. Упражнения, задания, задачи 1. Дано описание переменной множественного типа: Var PM : Set Of (Венера, Сатурн, Марс); Выписать все допустимые значения этой переменной. 2. Будут ли равны множества: a) ['A' .. 'D'] и ['A', 'B', 'C', 'D']; b) [лето, зима] и [зима, лето]. 3. Какие из приведенных ниже выражений являются неправильными с точки зрения языка Паскаль и почему? а) ['А', 'В', 'С'] / ['А', 'В']; b) [5, 6, 1, 3] >= [1, 3, 5, 6]; c) [куб, шар] + [призма]; d) [уравнение, система] * [неравенство, система]; e) [3.5, 7.1, 2.0] – [1, 2]. 4. Пусть дан фрагмент программы. Type bits = Set Of 0 .. 1; Var x : bits; y : Set Of (a, b, с); z : Set Of ' ! ' . . ' ! '; Определите: базовый тип каждого из указанных множественных типов; сколько и каких значений может принимать каждая из переменных х, у и z.
55
5. Пусть дан фрагмент программы: Type День Недели = ( н, вт, ср, чт, пт, сб, вс); Опишите множественный тип, включающий в себя множества из перечисленных ниже элементов: названия любых дней недели; названия рабочих дней недели. 6. Какие из следующих описаний не верны и почему? Type точки = Set Of Real; байт = Array [1 .. 8] Of 0 .. 1; данные = Set Of байт; месяц = (янв, фев, мар, апр, май. июн, июл, авг, сен, окт, ноя, дек); Ml = Set Of set of месяц; М2 = Set Of июн .. авг; МЗ = Set Of дек .. фев; М4 = Set Of (июн, июл, авг); 7. Вычислить следующие выражения: [5] < = [1 .. 3]; ['W' .. 'D', 'K' .. 'M'] + ['D', 'K']; [Москва, Ленинград, Сочи] * [Сочи]; [7, 1, 3 .. 6] = [1 .. 7]; 15 In [1 .. 10]; [6] <> [6, 6, 6]; ['1', '8'] = ['8', '1']; [6, 7, 8] = [6 .. 8]; [1, 7] <= [1 .. 9]; [2, 5 . 8] <= [1 .. 6, 9]; 'g' In ['а' ..'z']; Trunc (6.7) In [1, 5, 6]; Odd (8) In [ ]; 8. Эквивалентны ли выражения: р In [6, 7, 35] и (р = 6) Or (р = 7) Oг (р = 35); p In [2 .. 57] и ( р >= 2 ) and (р <= 57); 9. Вычислить выражение: [1 .. 14] * [5, 12 .. 60] + [4 .. 7] – [2 .. 16] * [6]; 10. Упростить данные выражения множественного типа: [11 .. 17] * [2] + [7, 17 .. 40] * [2 .. 8]; (А – В) * А + (А – В) * В; 56
(А + В) * (А – В) * (В – А); А + В – (А – В) – (В – А); А – (А – В); 11. Для натурального числа k напечатайте фразу «Мы нашли k грибов в лесу», согласовав окончание слова «гриб» с числом k. 12. В заданном множестве С удалить все нечетные числа. 13. Вывести на экран все простые числа от 1 до 101. 14. Var x, y, z : Set Of 8 .. 22; Переменной х присвоить множество всех целых чисел от 8 до 22, переменной y множество всех простых чисел этого диапазона, переменной z множество всех составных чисел этого диапазона. 15. Const n = 3; Type продукт = ( хлеб, масло, сыр, хлеб, молоко, кофе); Ассортимент = Set Of продукт; Магазин = Array [1 .. n]; Известен набор продуктов – хлеб, масло, сыр, хлеб, молоко, кофе, имеющиеся в ассортименте магазинов. В три магазина доставлены отдельные виды этих продуктов. Требуется построить множества A, B, C, которые содержат соответственно: продукты, имеющиеся во всех магазинах; продукты, имеющиеся, по крайней мере в одном из магазинов; продукты, которых нет ни в одном из магазинов.
ЛАБОРАТОРНАЯ РАБОТА № 5 МНОЖЕСТВЕННЫЙ ТИП ДАННЫХ (II)
Цели работы 1. Получение навыков в задании переменных множественного типа и выполнение простейших операций над ними. 2. Знакомство с задачами, в которых целесообразно использовать переменные множественного типа. 57
3. Получение навыков в организации ввода/вывода значений множественных типов. 4. Получение практических навыков в выполнении операций над множествами. 1. Практическое задание Практическое задание включает в себя: – знакомство с конечным и упорядоченным множеством символов. Нужно составить программу согласно своему варианту, приведенному в – таблице 11. – это построение множеств и выполнение операций над множествами, составление программы согласно своему варианту, приведенному в таблице 12.
Методические указания – Ознакомиться с теоретической частью лабораторной работы № 4 и приведенными там программами. – Определить алгоритм решения задачи, записать намеченный алгоритм в виде блок-схемы программы. – Подобрать контрольный пример. – После чего приступить к написанию программы в ИСП. Содержание отчета 1. 2. 3. 4.
Постановка задачи. Описание алгоритма. Блок-схема алгоритма. Текст программы и результаты ее выполнения.
Задание 1 Постановка задачи. Дана непустая последовательность символов. Требуется построить и напечатать множество, элементами которого являются встречающиеся в последовательности символы согласно таблице 11.
58
Таблица 11 Варианты заданий № варианта 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Текст задания Цифры от '0' до '9'. Буквы от 'W' до 'F' и от 'X' до 'Z'. Буквы от 'G' до 'N' и цифры от '0' до '9'. Знаки препинания. Буквы от 'А' до 'Z' и цифры от '0' до '5'. Буквы от 'Т' до 'X' и знаки препинания. Цифры от '5' до '9' и знаки арифметических операций. Знаки арифметических операций и знаки препинания. Цифры и знаки арифметических операций. Знаки препинания и буквы от 'Е' до 'N'. Знаки операций отношения. Цифры от '3' до '9', буквы от 'А' до 'F' и знаки препинания. Знаки арифметических операций и операций отношения. Буквы от 'F' до 'M' и знаки арифметических операций. Знаки препинания и операций отношения. Цифры от '3' до '8', буквы от 'K' до 'S' и знаки препинания.
Задание 2 Постановка задачи. Придумать список некоторых объектов, например, названия товаров в магазинах; виды полезных ископаемых, которые добывают в различных странах; фамилии студентов, которые могут принимать участие в работе определенных кружков и т. п. Построить пять множеств (язык слов англ.), которые складываются из различных комбинаций элементов этого списка. Вывести на экран названия объектов, которые находятся во всех множествах одновременно. Определить, какие объекты не входят ни в одно множество. Выполнить дополнительно задание своего варианта, а именно, определить, какие объекты: Таблица 12 Варианты заданий № варианта 1 1 2
Текст задания 2 Входят в первое и третье множества. Есть только в первом множестве.
59
Окончание табл. 12 1 3 4 5 6 7 8 9 10 11 12 13 14 15 16
2 Есть в первом множестве, но их нет в третьем. Входят в первое, второе и третье множества одновременно. Входят во второе и третье множества. Входят во второе множество, но их нет в четвертом. Входят лишь во второе множество. Входят в первое и третье множества, но не входят в пятое. Входят во второе, третье и пятое множества одновременно. Входят в первое и пятое множества. Входят в третье множество, но их нет в пятом. Входят только в третье множество. Входят только в четвертое множество. Входят в третье и четвертое множества . Входят во второе и четвертое множества. Входят в первое множество, но их нет во втором.
ЛАБОРАТОРНАЯ РАБОТА № 6 ТИП ДАННЫХ – ЗАПИСЬ (I)
Цель работы 1. Изучение комбинированного типа данных – запись. Теоретический материал 1. Общие положения Записи в отличие от массивов, множеств и файлов является составной структурой данных. Если отдельно взятый массив, множество или файл всегда включают элементы одинакового типа, то записи могут объединять в единое целое любое число структур данных других типов: простых переменных, массивов, множеств, записей и файлов.
60
2. Описание записи Запись (Record) – это структура (тип данных), предназначенная для хранения в оперативной памяти компьютера сложных данных, состоящих из отдельных компонент различных типов, которые называются полями. Объявление записи можно сделать в разделе или в разделе переменных Var или в разделе типов Type. Объявление записи в разделе переменных Var имеет следующий вид: Var < имя записи > : Record <имя поля 1> : тип; <имя поля 2 : тип; …………………….. <имя поля n> : тип; End; Здесь служебное слово Record (запись) выполняет роль открывающей операторной скобки, End – закрывающей операторной скобки. Внутри операторных скобок описываются имена полей с указанием их типа. Допускается вместо имени поля указывать список имен, то есть имена полей, разделенные запятыми. Более универсальная форма объявления записи – с использованием раздела типов Type: Type <имя типа > = Record <имя поля 1> : тип; <имя поля 2> : тип; ………………………….. <имя поля n> : тип; End; Var <имя записи> : <имя типа>;
Пример 1 Информацию об анкетных данных студентов можно представить с помощью сдедующего набора данных: – фамилия, имя, отчество; – дата рождения; – пол; – домашний адрес; – телефон; 61
Созданную структуру опишем как тип записи Student. Type Student = Record {Описываем тип записи Student} FIO : String[20]; {Описываем{соответствующие поля} DenR : 1 . .31; MecR : 1 .. 12; GodR : Integer; Pol : (M, F); Adrec: String [50]; Nelefon: String [10]; End; Каждое поле в записи, как уже говорилось, может иметь любой тип (кроме файлового), в частности может быть записью. Это дает возможность объединять информацию по смыслу. Структура записи Student приведена на рис. 2. Студент
Фам, Имя, Отч
Дата рожд
День
Мес
Пол
Год
Рис. 2. Структура записи Student
Type Student = Record FIO : String[20]; DataR : Record DenR : 1..31; MecR : 1..12; GodR : Integer End; Pol : (M, F); Dom : Record Adrec : String [50]; Telefon : String [10] End; End; 62
Дом
Адр
Тел
2.1. Обращение к элементу записи Доступ к элементу конкретной записи в программе обеспечивает уточненное (составное) имя. Уточненное имя содержит имя записи, точку, имя поля и записывается в следующем виде: < имя записи >. < имя поля > Переменные-записи типа Student объявляют в разделе Var так: Var : stud1, stud2 : Student; В программе можно присвоить, например, такие значения: studl. FIO : = 'Петров ИгорьИванович'; stud1. DataR. MecR : = 22; stud1. DataR. GodR : = 1985; Задача 1 Для некоторого количества студентов ввести по четыре оценки, полученных в сессию, и распечатать фамилии неуспевающих студентов. Program Lab6_2; Uses Crt; Const STMAX = 5; Type FIO = String [20]; BAL = Array [1 .. 4] Of Iinteger; {Структура СТУДЕНТА} STUDENT = Recrd SFIO : FIO; SBAL : BAL End; ST = Array [1 .. STMAX] Of STUDENT; Var S : ST; f, b : Integer; two : Boolean; Begin {1} ClrScr; Textcolor(Yellow); WriteLn('Программа СТУДЕНТ'); WriteLn (' '); Textcolor (White); {ФИО студентов}
63
S [1]. SFIO : = 'Иванов В.В.'; S [2]. SFIO : = 'Петров С.В.'; S [3]. SFIO : = 'Сидоров М.В.'; S [4]. SFIO : = 'Яковлев К.П.'; S [5]. SFIO : = 'Пастухов Е.Г.'; {Ввод оценок студентов} For f : = 1 To STMAX Do Begin {2} Writeln ('Введите оценки: '); Writeln ('Студент –', S [f]. SFIO, ' '); For b: = 1 To 4 Do Begin{3} Write ('Оценка', b, ' : '); Read (S [f]. SBAL [b]); End; {3} End; {2} {Определение наличия двоек и печать ФИО неуспевающих} WriteLn (' '); Textcolor (Lightred); For f : = 1 To STMAX Do Begin {4} two : = False; For b : = 1 To 4 Do Begin {5} If S [f]. SBAL [b] < 3 Then two : = True; End; {5} If two Then WriteLn ('Неуспевающий: ', S [f]. sfio); End; {4} End. {1} Протокол работы программы. Программа СТУДЕНТ.
Введите оценки: Студент – Иванов В.В. Оценка 1 : 3 Оценка 2 : 4 Оценка 3 : 4 Оценка 4 : 2 64
Студент – Петров С.В. Оценка 1 : 4 Оценка 2 : 4 Оценка 3 : 2 Оценка 4 : 4 ………………………… Студент – Пастухов Е.Г.: Оценка 1 : 5 Оценка 2 : 5 Оценка 3 : 5 Оценка 4 : 5 Неуспевающий : Иванов П.М. Неуспевающий : Петров С.В. Описание работы программы. Переменные и константы: – SMAX – количество студентов; – S – массив записей STUDENT; – FIO – переменная ФИО строкового типа; – Bal – массив оценок размерностью четыре; – STUDENT – переменна типа запись; – f, b – переменные циклов; – two – вспомогательная логическая переменная. Описываем переменные, далее заполняем массив S записями в два этапа: a) заполняем ФИО с помощью оператора присваивания; b) заполняем массив оценок в цикле с помощью оператора ввода Read. Вывод результата работы программы с помощью циклов: – Внешний цикл – просмотр массива записей S [1.. STMAX] и анализ логической переменной two. Если two = True, то печать фамилии неуспевающего студента. – Внутренний цикл – просмотр массива оценок BAL для выявления неуспевающих. Перед входом в цикл логической переменной two присваивается значение False. Если выявляется неудовлетворительная оценка, то two присваивается True. 2.2. Оператор присоединения Составными именами пользоваться неудобно. Они ведут к громоздким выражениям. Для их упрощения служит опера-
65
тор присоединения With, который дает возможность записывать в программе только имена полей. Общий вид команды With такой: With <имя записи> Do Begin Операторы, содержащие имена полей End ; Этот оператор используется там, где обрабатываются несколько полей одной той же записи. B нашем случае для Stud1 можно записать так: With studl Do Begin FIO : = 'Петров ИгорьИванович'; DataR.DenR : =22; DataR.MecR : = 5; DataR.GodR : = 1985; Pol : = M; Dom. Adrec : = 'Беринга 106, кв. 13'; Dom. Telefon : = '674-35'; End; Задача 2 Используя тип массив записей, составить программу для учета и обработки данных о наличии на складе автомашин. Вывести на экран информацию о моделях и годах выпуска машин, цена которых меньше, чем 3000 долларов. Пусть запись содержит такие поля: модель (marka), год выпуска (year) и цена машины (price). Program Lab6_2; Uses Crt; Type avto = Record marka : String [15]; year price : Integer End; Var al : Array [l .. n] Of avto; i : Integer; 66
Begin ClrScr; For i : = 1 to n Do With a1[i] Do Begin WriteLn ('Введите марку машины:'); ReadLn (marka); WriteLn ('Введите год выпуска:'); ReadLn (year); WriteLn('Цена:'); ReadLn (price); End; WriteLn; WriteLn ('Фирма предлагает такие машины:'); For i : = 1 To n Do With a1 [i] Do WriteLn (marka: 15, year: 10, price, '$'); WriteLn; Write ('Информация о машинах, цена которых меньше 4000 $:'); For i : = 1 To n Do With al [i] Do If price < 4000 Then WriteLn ( marka: 15, year: 10); ReadLn; End. Протокол работы программы. Введите марку машины: 1. Toyоta Введите год выпуска: 1996 Цена: 3000 ……………………….. Введите марку машины: 10 Mirra Введите год выпуска: 2000 Цена: 3500 67
Фирма предлагает машины: Toyota 1996 3000$ ………………………………. Mirra 2000 3500$ Информация о машинах, цена которых меньше 4000$: Toyota 1996 Mirra 2000 Опишем работу программы. Данные записи avto заносятся в массив а1 размерностью n. Ввод исходных данных и вывод результата работы программы осуществляется в цикле с использованием оператора присоединения With. Структура записи auto: Марка машины Год выпуска Цена 3. Контрольные вопросы 1. Верно ли, что запись относится к структурированным типам данных? 2. Дайте определение поля записи. 3. Верно ли, что поля записи должны иметь один и тот же тип? 4. Как осуществляется ссылка на компоненты записи? 5. Может ли компонент записи быть помечен более чем одним именем? 6. Может ли типом поля записи быть массив? 7. Могут ли записи иметь вложенную структуру? 8. Каков максимально допустимый уровень вложенности записей? 9. Могут ли во вложенных записях имена полей повторяться на разных уровнях вложенности? 10. Верно ли, что значения переменных типа запись можно присваивать переменным того же типа? 11. Могут ли совпадать имена полей различных записей? 12. Могут ли совпадать имена полей одной и той же записи? 13. Как можно оценить объем памяти, необходимой для хранения записи? 14. Можно ли значения полей записи использовать в выражениях?
68
15. Дайте определение составного имени. Из каких частей оно состоит и как записывается? 16. Чем запись отличается от массива? 17. Какой оператор используют для упрощения доступа к полям записи? 18. Верно ли, что все поля записи должны быть разных типов? 19. Почему при описании записи ее поля могут перечисляться в любом порядке? 20. Верно ли, что названия полей записи могут совпадать с именами переменных, констант и других объектов программы, но не могут совпадать с названиями полей других записей? 4. Практическое задание Практическое задание включает в себя: – упражнения и задания; – задание на решение задач.
Методические указания – Следует ознакомиться с теоретической частью лабораторной работы. – Определить алгоритм решения задачи, записать намеченный алгоритм в виде блок-схемы программы. – Подобрать контрольный пример. – После чего приступить к написанию программы в ИСП. Содержание отчета – Ответы к упражнениям и заданиям. – Блок-схемы алгоритмов к задачам. – Тексты программ и результаты выполнения. 4.1. Упражнения, задания, задачи 1. В задаче 1 (о студентах) настоящего описания при формировании записи STUDENT используйте оператор ввода Read (для ввода ФИО). Используйте оператор присоединения With. Дополни-
69
те текст программы и выведите на экран информацию, когда неуспевающих студентов нет. 2. В задаче 2 (о машинах) настоящего описания дополните описание типа полем цвет (color) и выведите на экран информацию о машинах красного цвета, выпущенных за последние семь лет. 3. Опишите комбинированный тип для определения следующего понятия: a) цена в рублях и копейках; b) время в часах, минутах и секундах; c) дата (число, месяц, год); d) адрес (город, улица, дом, квартира); e) семинар (предмет, преподаватель, номер группы, день недели, часы занятий, аудитория); f) бланк требования на книгу (сведения о книге: шифр, автор, название; g) сведения о читателе: номер читательского билета, фамилия, дата заказа); h) экзаменационная ведомость (предмет, номер группы, дата экзамена, 25 строчек с полями: фамилия студента, номер его зачетной книжки, экзаменационная оценка). 4. Используя следующий фрагмент программы, найдите самую длинную реку из списка и напечатайте ее название. Type строка = Array [1 .. 15] Of Сhar; река = Record название: строка; длина: Integer end; список = Array [1 .. 30] Of река; 5. Пусть дан фрагмент программы. Используя оператор присоединения, присвойте переменной Адр1 значение, соответствующее адресу: Воронеж, ул. Остужева, д. 1, кв. 70. Кроме того, переменной Адр2 присвойте такое же значение, заменив в нем номер квартиры на 99. Type строка = Array [1 .. 15] Of Char; адрес = Record город, улица: строка; 70
дом, квартира: 1 .. 999 End; Var Адр1, Адр2: адрес; 6. Определите комбинированный тип для представления анкеты школьника, включающий в себя его возраст, номера школы и класса и оценки по каким-либо пяти предметам. Опишите некоторую переменную данного типа и присвойте ей значение, соответствующее следующей анкете: Петров Иван Ильич, 16 лет, 194-я школа, класс 9, оценки: 5, 3, 4, 5, 2.
ЛАБОРАТОРНАЯ РАБОТА № 7 ТИП ДАННЫХ – ЗАПИСЬ (II)
Цели работы 1. Получение навыков в задании переменных типа запись и выполнение операций над ними. 2. Получение навыков в организации ввода/вывода значений типа запись. 3. Получение практических навыков программирования задач с использованием записей. 1. Практическое задание Практическое задание включает: – задания на самостоятельную постановку и решение задачи с использованием типа запись. – задание на решение задачи с использованием типа запись согласно своему варианту, приведенному в таблице 13.
Методические указания – Ознакомиться с теоретической частью лабораторной работы № 6. 71
– Определить алгоритм решения задачи, записать намеченный алгоритм в виде блок-схемы программы. – Подобрать контрольный пример. – После чего приступить к написанию программы в ИСП. Содержание отчета – – – – –
Постановка задачи для конкретного варианта. Исходная информация. Описание алгоритма. Блок-схема алгоритма. Текст программы и результаты ее выполнения.
Задание 1 Постановка задачи. Придумать и описать структуру записи, составить программу для создания массива из шестисеми записей и обработки соответствующих данных согласно некоторому сюжету. В сюжете задать и описать критерий поиска некоторой информации. Результаты работы программы (все введенные и найденные в результате поиска данные) вывести на экран. Примерами структур данных могут быть: адреса и телефоны друзей, характеристики компьютеров, автомобилей, аудиотехники, информация о странах (название, количество населения, площадь) и тому подобное. Пример сюжета: создать и вывести на экран массив записей об автомобиле (название модели, год выпуска, цена, цвет), а также найти в массиве и вывести на экран названия моделей красного цвета, которые выпускались в 1999 году. Задание 2 Постановка задачи. Составить список учебной группы, включающей N человек. Для каждого студента указать дату рождения, год поступления в университет, курс, группу, оценки последней сессии. Информацию о каждом студенте оформить в виде записи. Совокупность записей объединить в массив.
72
Составить программу, которая обеспечивает ввод полученной информации, распечатку ее в виде таблицы, а также распечатку информации согласно конкретному варианту. Таблица 13 Варианты заданий. № N Текст задания варианта (человек) 1 Распечатать анкетные данные студентов, успе15 вающих на 4 и 5. 2 Упорядочить список студентов по году рождения 16 и распечатать его. 3 Вычислить средний балл группы и распечатать 13 список студентов, имеющих средний балл ниже средего. 4 Распечатать анкетные данные студентов15 отличников. 5 Распечатать список студентов, упорядоченный по 14 алфавиту. 6 Распечатать список студентов, фамилии которых 15 начинаются с буквы А и их оценки. 7 Упорядочить список студентов по среднему баллу 14 и распечатать его. 8 Распечатать фамилии и даты рождения студентов, 16 не получивших ни одной оценки 3 за сессию. 9 Распечатать анкетные данные студентов, успе13 вающих на 4 и 5. 10 Вычислить средний балл группы и распечатать 16 список студентов, имеющих средний балл выше среднего балла группы. 11 Распечатать список студентов, фамилии которых 14 начинаются с буквы Б и их даты рождения. 12 Распечатать список студентов, получивших одну 13 оценку 3 за сессию. 13 Распечатать список отличников, упорядоченных 15 по алфавиту. 14 Распечатать анкетные данные студентов, фамилии 16 которых начинаются с букв В и Г. 15 Вычислить средний балл группы и распечатать 14 список студентов, имеющих средний балл равный среднему баллу группы. 16 Распечатать анкетные данные студентов15 неуспевающих.
73
ЛАБОРАТОРНАЯ РАБОТА № 8 ПРОЦЕДУРЫ И ФУНКЦИИ
Цели работы 1. Освоение структуры программы, в которой используется для своей реализации процедуры и функции. 2. Освоение структуры программы, в которой используется для своей реализации рекурсии. Теоретический материал 1. Общие положения Часто бывает, что приходится производить одни и те же вычисления, но при различных исходных данных. Можно выделить эти повторяющиеся вычисления в самостоятельную часть программы, которая может быть использована многократно. Автономная часть программы, реализующая определенный алгоритм и допускающая обращение к ней из различных частей общей программы, называется подпрограммой. В языке Pascal выделяют два вида подпрограмм: – Процедура (Procedure), – Функция (Function). Применение подпрограмм дает возможность конструировать программу как набор отдельных подпрограмм. Это позволяет получить более логичный процесс программирования. В программе описание процедур и функций должно располагаться между разделами переменных и операторов. Каждая процедура или функция определяется только один раз, но может использоваться многократно. Структура процедур и функций аналогична структуре полной программы на языке Pascal. В процедурах и функциях могут быть описаны собственные метки, константы, типы, собственные переменные и даже собственные процедуры и
74
функции. Внутренние описания должны следовать в том же порядке, что и разделы основной программы. Все процедуры и функции, в свою очередь, подразделяются на две группы: – стандартные (встроенные); – определенные пользователем. Cстандартные (встроенные) процедуры и функции входят в стандартные библиотеки и могут вызываться по имени без предварительного описания (например, процедуры ввода и вывода Read и Write). Некоторые наиболее часто используемые стандартные процедуры и функции представлены в Приложении 1 этого методического пособия. Процедуры и функции, определенные пользователем, пишутся самим программистом и объявляются в разделе описания вслед за разделом описания переменных. Пример структуры программы с двумя подпрограммами: PROGRAM <ИМЯ>; (*РАЗДЕЛ ОПИСАНИЙ ГОЛОВНОЙ ПРОГРАММЫ*) LABEL – РАЗДЕЛ МЕТОК; CONST – РАЗДЕЛ КОНСТАНТ; ТУРЕ – РАЗДЕЛ ТИПОВ; VAR – РАЗДЕЛ ПЕРЕМЕННЫХ; ----------------------------------------ПОДПРОГРАММА Р1 ---------------------------------------ПОДПРОГРАММА Р2 --------------------------------------(*РАЗДЕЛ ОПЕРАТОРОВ ГОЛОВНОЙ ПРОГРАММЫ*) ВЕGIN ОПЕРАТОРЫ; ВЫЗОВ ПОДПРОГРАММЫ Р1; ОПЕРАТОРЫ; ВЫЗОВ ПОДПРОГРАММЫ Р2; ОПЕРАТОРЫ; END. Выполнение программы начинается с операторов основной программы. Затем вызывается подпрограмма, и выполняются ее операторы, и снова управление передается в ос75
новную программу, которая продолжает выполняться. Любая подпрограмма в свою очередь также может содержать подпрограммы внутри себя. 2. Описание процедуры, оператор процедуры Описание каждой процедуры начинается с заголовка, в котором задаются имя процедуры и список формальных параметров с указанием их типов. Заголовок начинается со служебного слова Procedure. Процедура может быть и без параметров, тогда в заголовке указывается только ее имя. Общий вид записи процедуры: Procedure <имя> (<список формальных параметров>); <разделы описаний и объявлений процедуры>; Begin <раздел команд процедуры>; End; Процедура вызывается по ее имени: <имя> (список фактических параметров) 2.1. Формальные и фактические параметры С помощью формальных и фактических параметров данные передаются из программы в процедуру и, наоборот, из процедуры в программу. Каждый формальный параметр указывается вместе со своим типом. Соответствующий ему фактический параметр (там, где мы вызываем подпрограмму) указывается без типа. Между формальными и фактическими параметрами должно быть соответствие по количеству параметров, по их типу и порядку следования. Если несколько формальных параметров имеют одинаковый тип, тогда их можно объединить в список, т.е. перечислить параметры через запятую, а затем указать тип. Пусть имеется заголовок процедуры: Procedure Summa (A, B, C : Integer); где А, В, С – формальные параметры. Вызвать процедуру можно следующим образом: Summa (5, М, 7); где 5, М, 7 – фактические параметры. Каждый формальный параметр принимает значение соответствующего
76
фактического параметра. Таким образом, в процедуре будем иметь следующие значения: А = 5, В = М, С = 7. 2.2. Параметры-значения и параметры-переменные Среди параметров процедуры выделяют: – Параметры-значения; – Параметры-переменные. Параметры-значения выполняют роль входных параметров процедуры. Они могут получать значения фактических параметров, но не могут передавать свои значения фактическим параметрам. Параметры-переменные могут выполнять роль как входных, так и выходных параметров процедуры. Они могут получать значения фактических параметров, изменять их в процедуре и возвращать новые значения фактическим параметрам. Для выделения параметров-переменных перед ними ставится слово Var в формальных параметрах.
Пример Procedure Expres (A, B, C : Real; Var X, Y : Real); Var Z : Real; Begin Z : = A + B + C; X : = Z * Z; Y : = Sqrt (Z); End; Здесь имеем: А, В, С – параметры-значения; X, Y – параметры-переменные. Процедуру Еxpres можно вызвать разными способами, некоторые из них мы перечислим: 1. Еxpres ( 25.4, 44.6, 30, X1, Y1); Формальные входные параметры А, В, С принимают значения соответствующих фактических параметров А = 25.4, В = 44.6, C = 30. При этих значениях выполняется процедура. Результатом выполнения процедуры являются X, У, которые передают свои значения соответствующим фактическим параметрам XI, У1. Таким образом, в основной про77
грамме будем иметь Х1 = 10000, У1 = 10. 2. Допускается одинаковое обозначение соответствующих формальных и фактических параметров. Например, вызов процедуры может иметь вид: Еxpres (25.4, 44.6, 30, X, Y); 3. В качестве фактических параметров могут быть константы, переменные, выражения. Их тип должен соответствовать типу формального параметра. Например, вызов процедуры может быть таким: a) А = 25.4; С = 30; Еxpres (А, 44.6, С, X1, Y1); или б) D = 44.6; R = 10; Еxpres (25.4, D, R + 20, Z, Т); В любом случае формальные параметры получат значения: А = 25.4, В = 44.6, С = 30. 2.3. Область действия имен – Имена, объявленные в разделе описания основной программы, действуют в разделе операторов основной программы и в любой подпрограмме (процедуре и функции), эти имена называются глобальными. – Имена, объявленные в подпрограмме, действуют только в этой подпрограмме и в любой объявленной в ней процедуре и функции. Такие имена называются локальными. Они недоступны для операторов головной программы. При совпадении имен локальной и глобальной переменных (типов, констант) сильнее оказывается локальное имя, т. е. именно оно используется внутри содержащей его подпрограммы. 2.4. Процедуры без параметров Допускается использование процедур без параметров. В этом случае в заголовке указывается только имя процедуры, параметры отсутствуют. Использование процедуры без параметров мы видим в задаче 1, задаче 2. В процедуре, как и в основной программе, может отсутствовать раздел описаний.
78
Задача 1 Продемонстрируем операции объединения, пересечения, разности при работе с множеством. Для вывода результата используем подпрограмму без параметров. Program Lab8_1; {Демонстрация операций +, *, – при работе с множеством} Uses Crt; Type MN = 1 .. 6; MN1 = set of MN; Var A, B, C : MN1; {Подпрограмма вывода результата вычислений} Procedure RESULT; Var K : Integer; Begin For K : = 1 To 6 Do If K In C Then Write (K : 4); WriteLn; End; {Исполнимая часть головной программы} Begin ClrScr; A : = [1, 3, 4]; B : = [2, 4, 6]; C:=A+B; WriteLn ('ОБЪЕДИНЕНИЕ [1, 3, 4] + [2, 4, 6]'); RESULT; C : = A * B; WriteLn ('ПЕРЕСЕЧЕНИЕ [1, 3, 4] * [2, 4, 6 ]'); RESULT; C : = A – B; WriteLn ('РАЗНОСТЬ [1, 3, 4] – [2, 4, 6]'); RESULT; End. Протокол работы программы: ОБЪЕДИНЕНИЕ [1, 3, 4] + [2, 4, 6] 1 2 3 4 6 ПЕРЕСЕЧЕНИЕ [1, 3, 4] * [2, 4, 6]
79
4 РАЗНОСТЬ [1, 3, 4] – [2, 4, 6] 3 4 Задача 2 Банк выплачивает р % годовых. В какую сумму обратится вклад величиной Х, положенный на n лет? Lab8_2; Uses Crt; Var X: Extended; {начальная сумма} n: Byte; {срок вклада} {Описание процедуры Initialize} Procedure Initialize; Begin {1} Write ('Введите сумму вклада:'); ReadLn (X); Write ('Введите срок вклада:'); ReadLn (n); End; {1} {Описание процедуры Calculate} Procedure Calculate; Const p = 8; {процент годовых} Var Хn: Extended; Begin {2} Xn: = X * Exp (n * Ln (1 + 0.01 * p)); Write ('Сумма составит: ', Xn: 10 : 3); ReadLn; End; {2} {Исполнимая часть головной программы} Begin {3} Initialize; Calculate; End. {3} Протокол работы программы: Введите сумму вклада: 1000 Введите срок вклада: 5 Сумма составит: 1469.328 Опишем работу программы. В этой программе имеется
80
две процедуры. Имя первой процедуры Initialize, она служит для ввода начальных данных, имя второй процедуры – Calculate, она служит для вычисления искомой суммы и вывода результата, который определяется по известной в теории процентов формуле «сложных процентов»: Х n = Х (1 + 0,01 р)n. Заголовки процедур содержат только их имена. Такие процедуры называются процедурами без параметров. В телах процедур Initialize и Calculate соответственно четыре и три оператора. Имена процедур используются в основной программе для вызова процедур. Во второй процедуре введены константа р и переменная Xn. Они существуют только внутри этой процедуры, это локальные параметры. Глобальные параметры объявлены в головной программе вне процедур или функций. Таковыми являются переменные X и n, которые содержатся в обеих процедурах. Задача 3 Оформить в виде процедуры вычисление суммы 1 + 2 + 3 + ... + n и произведения 1, 2, 3 ... n целых чисел. Program Lab8_3; Var n: Integer; Sum, Pr: Real; {процедура вычисления суммы и произведения} Procedure summa (k: Integer; Var x, y: Real); {k, x, y – глобальные параметры} Var i: Integer; Begin {1} x: = 0; y: = 1; For i: = 1 to k Do {i-локальный параметр} Begin {2} x: = x + i; y: = y * i; End; {2} End; {1} {Исполнимая часть головной программы} Begin {3}
81
WriteLn ('Bведите значение n'); Read (n); Summa (n, Sum, Pr); {Вызов процедуры по имени с указанием фактических параметров} WriteLn ('Sum =', Sum: 5); WriteLn ('Pr =', Pr: 5); End. {3} Протокол работы программы. Введите значение n: 5 Sum = 15 Pr = 120 Пояснения к программе. Сумму и произведение можно вычислить, используя формулы арифметической и геометрической прогрессии. Однако мы воспользуемся циклом, чтобы лучше продемонстрировать назначение различных параметров. Имеем следующие переменные в головной программе: n – количество суммируемых элементов, Sum – переменная, где копим сумму, Pr – переменная, где копим произведение. Это фактические параметры при обращении к процедуре Summa (n, Sum, Pr). В заголовке процедуры Procedure Summa (k: Integer; Var x, y: Real); в скобках имеем формальные значения: k – это параметр-значение типа Integer (количество суммируемых элементов); x, y – это параметры-переменные типа Real (для накопления суммы и произведения). Имеем следующее соответствие формальных и фактических параметров: – Формальный параметр k (процедура) Æ фактический параметр n. – Формальный параметр x (процедура) Æ фактический параметр Sum. – Формальный параметр y (процедура) Æ фактический параметр Pr. 3.1. Массив в процедуре Если в процедуру нужно передать в качестве параметра не просто одно значение, а массив, то фактическим параметром должно быть имя массива. При этом формальный параметр указывается после слова Var вместе с типом массива.
82
Само же описание массива делается в разделе Тype основной программы. Например, в основной программе имеется следующее описание массива А: Сonst N =10; Тype Мas = Аrray [1 .. N] of Real; Var А: Мas; Тогда формальные параметры заголовка процедуры Рrim могут иметь вид: Рrocedure Prim (k: Integer; Var Х: Мas); при следующих фактических параметрах (т. е. вызов процедуры по имени): Рrim (N, А); Имеем следующее соответствие формальных и фактических параметров: – Формальный параметр k (процедура) Æ фактический параметр N. – Формальный параметр Х (процедура) Æ значения массива А. В процедуре значения массива Х могут измениться, и тогда новые значения получит массив А. Задача 4 Найти максимальные элементы массивов a, b и номера и номера этих элементов. Подпрограмму поиска оформить в виде процедуры. Program Lab8_4; Uses Crt; {Тип данныхVector будет определять тип формального параметра} Type Vector = Array [1 .. 200] of Real; Var a, b: Vector; i, k: Integer; max: Real; {максимальный элемент} nmax: Integer; {номер максимального элемента} {Описание процедуры нахождения максимального элемента в массиве} Procedure Max1 (x: Vector; L: Integer; Var rmax: Real; Var
83
n: Integer); Var j: Integer; Begin {1} rmax: = x [1]; n: = 1; For j: = 2 To L Do If x [j] > rmax Then Begin {2} rmax: = x [j]; n: = j; End; {2} End; {1} {Исполнимая часть головной программы} Begin {3} ClrScr; Write ('Введите размер массивов:'); ReadLn (k); TextColor (Yellow); Randomize; {Заполнение массива а с помощью датчика случайных чисел} For i: = 1 To k Do Begin {4} a [i]: = Random (10); Write ('a[', i, '] = ', a [i]: 4: 2); End; {4} {Обращение к процедуре Max1 для поиска максимального элемента и его номера в массиве а} Max1 (a, k, max, nmax); TextColor (Red); WriteLn ('max =', max: 4: 2, 'nmax =', nmax: 4); WriteLn (' '); TextColor (Yellow); {Заполнение массива b с помощью датчика случайных чисел} For i:= 1 To k Do Begin {5} b [i]: = Random (100); Write ('b [', i, '] = ', b [i]: 4: 2); 84
End; {5} TextColor (Red); {Обращение к процедуре Max1 для поиска максимального элемента и его номера в массиве в} Max1 (b, k, max, nmax); WriteLn ('max = ', max: 4: 2, 'nmax = ', nmax: 4); WriteLn ('Нажмите любую клавишу'); ReadKey; End. {3} Протокол работы программы. Введите размер массивов: 4 a [1] = 0.00 a [2] = 7.00 a [3] = 1.00 a [4] = 6.00 max = 7.00 nmax = 2 b [1] = 2.00 b [2] = 15.00 b [3] = 27.00 b [4] = 25.00 max = 27.00 nmax = 3 Пояснения к программе. Решение этой задачи мы начали с написания процедуры поиска максимального элемента и его номера в массиве, которой присвоили имя Max1. У этой процедуры имеем 4 параметра: – параметры – значения: массив х и его размер L (тип Integer). Для указания типа массива необходимо ввести новый тип данных (назовем его Vector); – параметры – переменные: rmax (в ней возвращается максимальный элемент массива х) типа Real и n (номер максимального элемента в массиве) типа Integer. Заголовок процедуры выглядит так: Procedure Maxl (x: Vector; L: Integer; Var rmax: real; Var n: Integer); В головной программе мы вводим размер массивов k, заполняем значениями массив а с помощью датчика случайных чисел, обращаемся к процедуре поиска максимума, распечатываем значения массива (желтым цветом). Затем выводим максимальный элемент массива а и его номер 85
(красным цветом). Эти же действия повторяем для массива b. 3. Описание функции Другой вид подпрограммы – функция – оформляется аналогично процедуре. Отличительные особенности функции: она имеет только один результат выполнения (но может иметь несколько входных параметров). Результат обозначается именем функции и передается в основную программу. Функция описывается так: Function <имя> (<список формальных параметров>); <тип результата>; <Разделы описаний и объявлений функции>; Begin <Раздел команд функции, где должна быть Такая команда: имя: = выражение>; End; Если функция изменяет значения формальных параметров-переменных или значения глобальных по отношению к данной функции переменных, то говорят, что функция имеет побочный эффект. Применение функций с побочным эффектом нарушает структурированность программы, поэтому их использование нежелательно. Среди входящих в функцию операторов должен обязательно присутствовать хотя бы один оператор присваивания, в левой части которого стоит имя данной функции. Этот оператор и определяет значение, вырабатываемое функцией. Допустимыми типами результата являются: – все разновидности вещественного типа; – строковый тип; – скалярный тип (то есть все разновидности целого типа, булев, символьный, перечислимый типы) ; – указатель. Вызов функции осуществляется только из выражений с помощью указателя функции: <имя> (<список фактических параметров>); После выполнения функции выработанный ею результат используется в качестве значения указателя функции в том выражении, в которое входит этот указатель. При вызове 86
функции передача фактических параметров производится так же, как и при вызове подпрограммы. Задача 5 Требуется найти разность факториалов F = т! – k! Напомним, что факториал представляет собой произведение n чисел натурального ряда: n! = 1 * 2 * 3 .. n. Program Lab8_5; Uses Crt; Var m, k: Integer; F: Integer; {Описание функции вычисления факториала} Funktion Fact (n: Integer): Integer; Var p, i: Integer; Begin p: = 1; For i: = 1 to n Do p: = p * i; Fact: = p; End; {Исполнимая часть головной программы} Begin ClrScr ; Write ('Bведи значения m, k:'); ReadLn (m, k); F: = Fact (m) – Fact (k); WriteLn ('F = ', F: 5); End. Пояснения к программе. Вычисление факториала мы оформили в виде функции с именем Fact: Funktion Fact (n: Integer): Integer; Результат вычисления факториала обозначается ее именем. Тип функции – Integer. Формальным параметром является переменная целого типа n. Вызывается функция по своему имени Fact с указанием фактических параметров m и k: F: = Fact (m) – Fact (k); Протокол работы программы. Bведи значения m, k: 5 4
F = 96 Задача 6
87
С помощью функции, определяющей большее из двух чисел, найти большее из четырех чисел. Program Lab8_6; Uses Crt; Var al, a2, a3, a4, x, y: Integer; {Описание функции вычисления максимального из 2-х чисел} Function Max2 (a, b: Integer): Integer; Begin {1} If a > b Then Max2: = a Else Max2: = b; End; {1} {Исполнимая часть головной программы} Begin {2} Write ('Введите четыре целых числа:'); ReadLn (al, a2, аЗ, a4); {l случай – решение с использованием промежуточных переменных} x: = Max2 (al, a2); у: = Мах2 (аЗ, а4); WriteLn ('l случай:', Мах2 (х, у)); {2 случай – решение с использованием только обращений к функции} WriteLn ('2 случай:', Мах2 (Мах2 (al, а2), Мах2 (аЗ, а4))); {3 случай – имя функции используется в выражении как операнд} WriteLn ('3 случай:', 100 + Max2 (х, у)); ReadLn; End. {2} Протокол работы программы. Введите четыре целых числа: 5 6 9 2. l случай: 9 2 случай: 9 3 случай: 109 Пояснения к программе. Вычисление максимального из двух чисел мы оформили в виде функции Мах2. В теле функции с двумя параметрами имеется оператор присваивания, который присваивает имени функции Мах2 значение – боль88
шее из двух чисел. Тип возвращаемого значения Integer указан в заголовке функции. В 1-м случае мы находим большее из четырех чисел, используя промежуточные переменные х и у: х – большее среди чисел al и а2, у – большее среди чисел аЗ и а4. Третий вызов функции Мах2 (х, у) содержится в операторе WriteLn. – результат работы функции – максимальное из четырех чисел. Во 2-м случае используются только обращения к функции. Обратим внимание на то, что аргументы функции Мах2 являются обращениями к этой же функции. Подобные алгоритмы, называющиеся рекурсивными. 3-ий случай – это пример использования имени функции в качестве операнда в операторе вывода. 4. Рекурсия Рекурсия широко применяется в математике. Рекурсия – это такой способ организации вычислительного процесса, при котором процедура или функция в ходе выполнения обращается сама к себе. В качестве примера дадим рекурсивное определение суммы первых п натуральных чисел. Сумма первых п натуральных чисел равна сумме первых (п – 1) натуральных чисел плюс п, а сумма первого числа равна 1. Или: Sn = Sn-1 + n; S1 = 1. Задача 7 Вычислить сумму первых n натуральных чисел, используя рекурсию. Program Lab11_7; Uses Crt; Var n: Integer; S: Integer; {Описание функции вычисления суммы ряда} Function Sum (k: Integer): Integer; Begin If k = 1 Then Sum: = 1 {Стоп-условие} Else Sum: = Sum (k – 1) + k; End;
89
{Исполнимая часть головной программы} Begin ClrScr; WriteLn ('Введи количество членов ряда n'); ReadLn (n); S: = Sum (n); WriteLn ('Сумма S =', S: 5); ReadKey; End. Протокол работы программы. Введи количество членов ряда n 10
Сумма S = 55 Опишем работу программы. Операция суммирования будет повторяться ровно n – 1 раз, поскольку функция Sum обращается n – 1 раз к самой себе, при этом параметр каждый раз уменьшается на единицу. В конце концов параметр станет равным 1, и рекурсивные вызовы закончатся, после чего все уже вызванные функции одна за другой завершат свою работу. Обратим внимание на следующие обстоятельства. Вопервых, рекурсивная процедура или функция содержит всегда, по крайней мере, одну терминальную ветвь и условие окончания (If n = 1 Then Sum = l). Во-вторых, при выполнении рекурсивной ветви (Else Sum: = Sum (n – l) + n) процесс выполнения подпрограммы приостанавливается, но его переменные не удаляются из стека. Происходит новый вызов подпрограммы, переменные которой также помещаются в стек, и т. д. Так образуется последовательность прерванных процессов, из которых выполняется всегда последний, а по окончании его работы продолжает выполняться предыдущий процесс. Целиком весь процесс считается выполненным, когда стек опустеет, или, другими словами, все прерванные процессы выполнятся. Рекурсия полезна, прежде всего, в случаях, когда основную задачу можно разделить на подзадачи, имеющие ту же структуру, что и первоначальная задача. Не следует путать рекурсию с итерацией, которая реализуется при помощи циклов. Большинство алгоритмов можно реализовать двумя способами: итерацией и рекурсией. Вспомним пример с суммой, 90
который очень легко реализуется при помощи цикла (ЗАДАЧА 3 этой лабораторной работы). В задаче 6 используем рекурсию для определения большего из четырех чисел ( 2 - й случай ). В задаче 5 вычисление факториала было сделано с помощью цикла, в задаче 8 используем рекурсию для вычисления факториала.. Задача 8 Cоставить рекурсивную функцию Factorial для вычисления факториала числа n (n! = 1 * 2 * 3 … * n, 0! = 1, 1! = 1), которая основывается на многоразовом (рекурсивном) использовании формулы n! = n * (n – 1)!. Текст программы: Program Lab11_8; Uses Crt; Var k: Integer; F: Integer; {Описание функции вычисления факториала} Function Factorial (N: Integer): Integer; Begin If N = 0 Then Fact: = 1 {Это стоп – условие} Else Fact: = N * Fact (N – 1); End; {Исполнимая часть головной программы} Begin ClrScr; Write ('Введи количество k'); ReadLn (k); F: = Factorial (k); WriteLn ('F =', F: 5); ReadKey; End. Контрольный пример. Введи количество k 5. F = 120 4.1. Особенности рекурсии – рекурсивная форма организации алгоритма обычно
91
выглядит изящнее итерационной и дает более компактный текст программы; – недостатки рекурсии состоят в следующем: – если глубина рекурсии очень велика, то это может привести к переполнению стека; – рекурсивные алгоритмы, как правило, выполняются более медленно; – при рекурсивном программировании велика вероятность ошибок зацикливания. В целях повышения безопасности работы рекомендуется: – использовать директиву компилятора {$s+} для включения проверки переполнения стека; – использовать директиву компилятора {$R+} для включения проверки диапазона. 5. Контрольные вопросы 1. Дайте определение подпрограммы. 2. Что лежит в основе метода программирования сверху вниз? 3. Существуют ли подпрограммы без параметров? 4. Дайте определение параметра. 5. Как называются параметры, определяемые в заголовке подпрограммы? 6. Какие параметры называются фактическими? 7. Чем синтаксически отличается описание процедуры от описания функции? 8. Какое количество значений возвращает функция? 9. Как определить тип значения, возвращаемого функцией? 10. Существуют ли ограничения на тип возвращаемого функцией значения? 11. Каким образом осуществляется обмен данными между основной программой и подпрограммой без параметров? 12. Сколько элементов может содержать список формальных параметров? 13. Сколько элементов должен содержать список фактических параметров? 14. Могут ли фактические параметры быть выражениями?
92
15. Могут ли фактические параметры быть именами переменных? 16. Могут ли фактические параметры быть именами других процедур или функций? 17. Каково соответствие между фактическими и формальными параметрами? 18. Могут ли имена формальных параметров совпадать с именами фактических? 19. Могут ли имена формальных параметров не совпадать с именами фактических? 20. Какие переменные называются локальными? 21. Чем глобальные переменные отличаются от локальных переменных? 22. Что такое время жизни переменной? Что такое область видимости переменной? 23. Может ли имя локальной переменной совпадать с именем глобальной? 24. Можно ли утверждать, что одноименные глобальные и локальные переменные – это разные переменные? 25. Какие два способа передачи параметров вы знаете? В чем их отличие? 26. При каком способе передачи параметров изменение соответствующего формального параметра внутри процедуры изменяет и фактический параметр? 27. Может ли в качестве параметра при вызове подпрограммы, имеющей формальный параметр-значение, выступать: переменная, выражение, константа? 28. Может ли в качестве параметра при вызове подпрограммы, имеющей формальный параметр-переменную, выступать: переменная, выражение, константа? 29. Может ли в основной программе функция вызываться внутри выражения? 30. Наличие, какого оператора необходимо для возвращения значения из функции в вызывающую программу? 31. Что называется побочным эффектом при вызове подпрограммы? 32. Почему следующее описание процедуры недопустимо? Procedure S (А: Array [1 .. 10] of real); 93
33. Может ли элемент массива быть формальным параметром? 34. Почему недопустимо следующее описание функции? function F (s: Char): String [10]; 35. Может ли быть функция или процедура параметром подпрограммы? 36. Что такое рекурсия?
ЛАБОРАТОРНАЯ РАБОТА № 9 ОРГАНИЗАЦИЯ ПРОГРАММ С ИСПОЛЬЗОВАНИЕМ ПОДПРОГРАММ И ФУНКЦИЙ
Цели работы 1. Получение навыков в написании программ с использованием подпрограмм и функций. 2. Изучение механизмов передачи параметров в задачах с использованием подпрограмм и функций. 1. Практическое задание Решить задачи с использованием подпрограмм и функций.
Постановка задачи Организовать решение задач по вариантам. Каждый вариант задания содержит три задачи. Методические указания – При выполнении заданий следует ознакомиться с теоретической частью лабораторной работы № 8. – Определить алгоритм решения задачи, используя 94
подпрограмму или функцию, записать намеченный алгоритм в виде блок-схемы программы. – Подобрать контрольный пример. – Организовать ввод контрольного примера, вывод результатов вычислений, используя разные способы ввода информации: c клавиатуры, датчик случайных чисел, сложные константы в блоке Const . – Организовать прохождение программы в ИСП. Содержание отчета 1. 2. 3. 4.
Постановка задачи для конкретного варианта. Текст программы и результаты ее выполнения. Блок-схема алгоритма. Выводы.
Вариант 1 1. Заданы коэффициенты и свободные члены системы двух линейных уравнений с двумя неизвестными:
⎧a1 х + b1 y = c1 , ⎨ ⎩a2 x + b2 y = c2 . Известно, что не все коэффициенты системы а1, b1, а2, b2 равны нулю одновременно. Построить алгоритм решения системы. Указания к решению задачи 1. Вычисление x, y производить с помощью формул Крамара:
c1 b1 x=
c2 b2 a1 b1 a2 b2
a1 c1 ,
y=
a 2 c2 a1 b1
.
a2 b2
Каждое из неизвестных равно дроби, знаменатель которой есть определитель, составленный из коэффициентов при неизвестных, а числитель получается из определителя заме95
ной коэффициентов при соответствующем неизвестном на свободные члены. 2. Элементы матрицы А (n * n) вычисляются по формуле: Ai . j = i * sin( j ) + sin(i ) (i, j = 1, 2, 3, ..., n). Требуется: а) сформировать матрицу В: Ai , j
Bi , j =
Ai2, j + i 2 + j 2
, (i, j = 1, 2, 3, ..., n);
b) вывести на печать сформированные матрицы A, В и их произведение А * В. 3. Напишите функцию, вычисляющую целую степень числа а: ⎧ ⎪a n , n > 0 , ⎪ y = a n = ⎨1, n = 0 , ⎪ 1 ⎪ n , n < 0. ⎩a Вариант 2 1. Даны вещественные числа s, t. Получите:
H (s, t) + (max(H2(s – t, s * t), H4(s – t, s + t)) + H (1, 1), где H (a, b) =
a 2
+
b − ( a − b) 3 . 2 1+ a
1+ b 2. Два треугольника заданы координатами своих вершин А, В и С. Вычислите площади треугольников, не используя формулу Герона, и определить, какой треугольник имеет большую площадь. При решении задачи используйте следующие данные: для первого треугольника А (1; 1), В (5; 2), С (3; 3); для второго треугольника А (2; 5), В (4; 3), С (6; 4). Вычисление площади треугольника оформите в виде функции. Указания к решению задачи 2. Площадь треугольника, заданного вершинами А (х1, y1), 2
96
B (x2, y2) и С (x3, y3), вычисляется по формуле: S = ½|(x2 – x1) (y3 – y1) – (x3 – x1) (y2 – y1)|. Предусмотрите печать необходимой текстовой информации. 3. Расположите элементы строк двумерного массива с четными номерами в возрастающем порядке, а элементы строк с нечетными номерами расположите в убывающем порядке. Определите подпрограмму сортировки в одномерном массиве. Вариант 3 1. Вычислите выражение z(x) = (sign(x) + sign(y)) – sign(x + у). При решении задачи определите, и используйте функцию sign:
⎧− 1, х < 0, ⎪ sign( x) = ⎨0, x = 0, ⎪1, x > 0. ⎩ 2. Заданы координаты вершин треугольника ABC: (XA, YA), (XB, YB), (XC, YC). Нужно составить программу, в которой определяется принадлежит ли вводимая точка O (x, y) заданному треугольнику. Указания к решению задачи 2. Процедура проверки основана на том факте, что если сумма площадей треугольников AOB, BOC, AOC, образованных точкой О и вершинами исходного треугольника равна площади треугольника ABC, то точка О лежит внутри треугольника. Если эта сумма больше площади треугольника, то точка О лежит вне его. Площадь треугольника вычисляем по формуле Герона (смотри указание к решению задачи 2 варианта 15). Длины сторон треугольника вычисляются по формуле:
r = ( X i − X j ) 2 + (Yi − Y j ) 2 . 3. Создайте программу вычисления числа сочетаний из n по m. Указания к решению задачи 3. n! Число сочетаний определяется по формуле , m !( n − m ) ! 97
где n – количество элементов перебора. Используйте подпрограмму вычисления факториала. Вариант 4 1. Имеется квадратный лист бумаги со стороной а. Из листа делается коробка следующим образом: по углам листа вырезается четыре квадрата и коробка склеивается по швам. Какова должна быть сторона вырезаемого квадрата, чтобы коробка имела наибольшую вместимость? Решить задачу при а = 6 см и а = 18 см. Решение квадратного уравнения оформите в виде подпрограммы. Указания к решению задачи 1. Если обозначить через х сторону вырезаемых квадратиков, то получающаяся коробка будет иметь квадратное основание со стороной а – 2 х и высоту х. Следовательно, вместимость коробки (обозначим ее f (x)) будет равна f ( x) = (a − 2 x) 2 x = 4 x 3 − 4ax 2 + a 2 x. Далее, из необходимого условия максимума (f'(x) = 0) получаем уравнение x2 – 8ax + a2 = 0. Решаем полученное уравнение при соответствующих а и анализируем корни. В программе предусмотреть анализ корней. 2. Составить программу, определяющую, как заданная сумма денег выражается минимальным числом банкнот ценностью по 100, 50, 25, 10, 5, 3, 1 рублей. На печать выводится количество банкнот каждого вида и общее число банкнот. Решение оформить в виде подпрограммы. 3. Вычислите сумму: 1! + 2! + 3! + ... + n!, используя функцию вычисления факториала числа n! Вариант 5 1. Чего больше: всех возможных трехзначных чисел, записываемых цифрами 1, 2, 3, 4, 5; всех двузначных чисел, записываемых цифрами 2, 4, 6, 8; всех четырехзначных чисел, записываемых цифрами 1, 3, 7, 8, 9? Подсчет количества
98
соответствующих чисел оформить в виде подпрограммы. Указания к решению задачи 1. Количество k-значных чисел, составляемых из п различn! ных цифр (кроме 0), равно Ank = , т.е. равно числу раз(n − k )! мещений из п по k. 2. При х, изменяющемся от –2 до 3 с шагом 0.5, найти максимальное значение суммы многочлена х8 – 7х7 + 5х5 – 3x4 + 27 и его третьей производной. Вычисление коэффициентов r-й производной многочлена степени п оформить в виде подпрограммы. Вычисление коэффициентов суммы двух многочленов оформить в виде подпрограммы. Поиск максимального элемента массива оформить в виде подпрограммы. Указания к решению задачи 2. Вычисления значений многочленов использовать схему Горнера, которую оформить в виде подпрограммы. Далее смотри указания к решению задачи 2 варианта 8 и варианта 12. 3. В двух последовательностях a1, …, an; b2, …, bn; замените все элементы, следующие за элементом с максимальным значением, на значение минимального элемента. Вариант 6 1. Составьте программу нахождения наименьшего общего кратного трех целых чисел НОК (I, J, K). Указания к решению задачи 1. Найти НОК двух любых из этих чисел, например, НОК (I, J), затем найти НОК оставшегося числа К и полученного НОК (I, J) на предыдущем шаге. Наибольшее общее кратное вычисляется по формуле: НОК (I, J) = I*J / НОД (I, J), где знаменатель – наибольший общий делитель двух чисел (НОД определяется с помощью алгоритма Евклида). Используйте функцию для вычисления НОК. 2. Заданы три вещественных массива a, b и c размерностью n. Вычислите t (при n = 50):
99
max(ci ) ⎧ min(bi ) + при min(ai ) < max(bi ) ⎪ t = ⎨ max(ai ) min(bi + ci ) ⎪max(b + c ) + min(c ) иначе i i i ⎩ 3. Два треугольника заданы координатами своих вершин a, b, c. Вычислите площади треугольников с помощью формулы Герона и определите, у какого треугольника площадь больше. При решении задачи используйте следующие данные: для первого треугольника a (1; 1), b (4; 2), c (2; 3,5); для второго треугольника a (1; 2), b (4; 1), c (3; 3,5). Вычисление длин сторон треугольника и его площади по формуле Герона оформите в одной подпрограмме. Указания к решению задачи 3. Длина отрезка, соединяющего точки Р (x1, y1) и Q (x2, y2) вычисляется по формуле: PQ = ( x2 − x1 ) 2 + ( y2 − y1 ) . Далее смотрите указания к решению задачи 2 варианта 15. Вариант 7 1. Пусть заданы три последовательности вещественных чисел a0, a1, …, a30; b0, b1, …, b30; c0, c1, …, c30. Вычислите значение выражения для заданного x:
a0 x 30 + a1 x 29 + ... + a29 x + a30 − (c0 (2 x + 1) 30 + b0 ( x − 1) 30 + b1 ( x − 1) 29 + ... + b30 + c1 (2 x + 1) 29 + ... + c29 (2 x + 1) + c30 ). Указания к решению задачи 1. Для вычисления значений многочленов используйте схему Горнера, которую оформите в виде подпрограммы. Далее смотрите указания к решению задачи 2 варианта 8 и варианта 11). 2. Оформите процедуру проверки права пользователя работать с программой. Используйте для этого пароль SCHOOL. В случае ввода неправильного пароля выход из программы осуществляется при помощи инструкции Halt. 3. Определите все пары «близнецов» из отрезка [2, n], где 100
n – заданное число больше двух. Указания к решению задачи 3. Два простых числа называются «близнецами», если они отличаются друг от друга на 2 (таковы, например, числа 41 и 43). Вариант 8 1. Два треугольника заданы координатами своих вершин так, что координаты вершин первого треугольника это элементы одного массива, координаты вершин другого треугольника это элементы второго массива. Вычислите длины сторон треугольника. Указания к решению задачи 1. Смотрите указания к решению задачи 2 варианта 2. 2. Вычислите коэффициенты третьей производной многочлена х7 + 6х6 + 3х4 – 5х3 и четвертой производной многочлена х9 – 7х5 + 3х4 – 2х2 + 23. Вычисление коэффициентов r-й производной многочлена n-й степени оформить в виде подпрограммы. Указания к решению задачи 2. Если дан многочлен n-й степени a0 x n + a1 x n −1 + ... + an , то
коэффициенты его r-ой производной b0 x n − r + b1 x n − r −3 + ... + bn− r вычисляются через коэффициенты исходного многочлена по формулам:
bk = ak
r −1
∏ (n − k − i),
k = 0, 1, ..., n − r
i =0
В программе необходимо предусмотреть ввод коэффициентов исходного многочлена в виде массива и передачу этого массива в подпрограмму. Результатом работы должен быть массив коэффициентов производной. 3. Создайте программу для подсчета числа четных цифр, используемых в записи n-значного числа m. Вариант 9 1. Имеем два массива целых чисел х (20) и y (20), вычислите значение u:
101
15 ⎧ 20 2 xi yi > 0 ⎪ xi при ⎪ i =1 i =1 u = ⎨ 20 ⎪ y 2 иначе ⎪⎩ i =10 i 2. Для двух представленных ниже квадратных уравнений определите, имеют ли они одинаковые корни. Напечатайте те корни уравнений, которые не совпадают.
∑
∑
∑
а1 х2 + b1 x + cl = 0, а2 х2 + b2 x + с2 = 0. 3. Определите наибольший общий делитель трех чисел. Указания к решению задачи 3. Напишите функцию для определения наибольшего общего делителя NOD (x, у), используя алгоритм Евклида. Вариант 10 1. Сколькими способами можно отобрать команду в составе 5 человек из 8 кандидатов; из 10 кандидатов; из 11 кандидатов? Подсчет количества способов отбора оформить в виде подпрограммы. Указания к решению задачи 1. Выбрать k кандидатур из n человек можно С nk способаn! – число сочетаний из n по k. Составьми, где C nk = k! ( n − k ) ! n
те подпрограмму вычисления С по формуле: С = k n
k т
∏i
i =n −k + 1
. k! Объясните, почему вторая формула предпочтительнее первой. 2. При х, изменяющемся от 0 до 3 с шагом 0.5, найдите максимальное значение третьей производной многочлена x7 + 6x6 – 5x5 + x2 – x + 7 и минимальное значение четвертой производной того же многочлена. Вычисление коэффициентов производной оформите в виде подпрограммы. Поиск максимального элемента массива оформите в виде подпро-
102
граммы. Поиск минимального элемента оформите в виде подпрограммы. Указания к решению задачи 2. Для вычисления значений многочленов используйте схему Горнера, которую оформите в виде подпрограммы. Далее смотрите указания к решению задачи 2 Варианта 8 и варианта 11. 3. На плоскости координатами своих вершин заданы два треугольника. Определите одинакового ли они типа (прямоугольный, остроугольный, тупоугольный). Указания к решению задачи 3. Тип треугольника по отношению к углам может быть определен, исходя из теоремы Пифагора. Вариант 11 1. Найдите все числа в интервале от 1 до 1000, которые совпадают с последними разрядами своих квадратов, например: 52 = 25, 252 = 625. 2. Используя схему Горнера, разделите: a) многочлен Р1(x) = x4 + 2x3 – 4x + 3 на двучлен (х + 3) и вычислите
P1 (–3); 5
в) многочлен Р2(x) = x + 6x3 – 7x + 2 на двучлен (х – 2) и вычислите P2(–2); Вычисление многочлена по схеме Горнера оформите в виде подпрограммы. Указания к решению задачи 2. Согласно схеме Горнера при делении многочлена n-ой степени a0 x n + a1 x n −1 + ... + an на линейный двучлен (х – с) коэффициенты частного b0 x n −1 + b1 x n − 2 + ... + bn −1 и остаток r вычисляются по формулам: b0 = a0, b = cbk – 1 + ak, где k = 1, 2, …, n – 1, и r = cbn – 1 + an. При этом значение исходного многочлена при х = с равно остатку r. В программе необходимо предусмотреть ввод коэффициентов исходного много103
члена в виде массива и передачу этого массива в подпрограмму. Результатом работы должен быть массив коэффициентов частного и остаток. Обратите внимание на то, что в массиве коэффициентов должны содержаться и нулевые коэффициенты. 3. Даны две квадратные вещественные матрицы п-го порядка (n = 10). Выведите на экран квадрат той из них, в которой наименьший след, считая, что такая матрица одна. Указания к решению задачи 3. След матрицы – это сумма элементов, расположенных на главной диагонали. Вариант 12 1. Пусть даны натуральные числа k, l, m, вещественные х1, х2, ..., xn, х1, х2, ..., xn, y1, y2, ..., yn. Получите:
⎧min( y1 , ..., yi ) + max( z1 , ..., z m ), если max( x1 , ..., xk ) ≥ 2, t=⎨ 2 ⎩1 + (max( x1 , ..., xk )) , если max( x1 , ..., xk ) < 2. 2. Дана непустая последовательность слов, в каждом из которых от 1 до 6 латинских букв; между соседними словами – запятая, за последним точка. Вывести все слова, у которых одинаковые «соседи», т. е. совпадают предыдущие и последующие слова. Указания к решению задачи 2. Определите процедуру readword (w), которая вводит очередное слово и присваивает его 6-ти символьной строке w, а запятую или точку, следующую за словом, присваивает некоторой глобальной переменной. 3. В ЭВМ поступают результаты соревнований по плаванию для трех спортсменов. Выберите и напечатайте лучший результат. Решите задачу для следующих наборов данных: 1) 11,3; 10,6; 11; 2) 10; 10,9; 13 3) 16; 18; 13. Указания к решению задачи 3. Используйте процедуру определения минимального из трех чисел. Вариант 13
104
1. Пусть дано n параллелограммов координатами своих вершин. Определите номер параллелограмма, у которого площадь максимальна. Напишите функцию для определения площади параллелограмма по его заданным координатам вершин. Указания к решению задачи 1. Площадь параллелограмма можно представить как сумму площадей двух треугольников, полученных, если соединить две противоположные вершины параллелограмма. Далее смотрите указания к решению задачи 2 варианта 2. 2. По заданным вещественным числам a0, a1, …, a30; b0, b1, …, b30; c0, c1, …, c30. Вычислите значение выражения для заданного x: (a0 x 30 + a1 x 29 + ... + a30 ) 2 − (b0 y 30 + b1 y 29 + ... + b30 ) c0 ( x + z ) 30 + c1 ( x + z ) 29 + ... + c30 Указания к решению задачи 2. Для вычисления значений многочленов используйте схему Горнера, которую оформите в виде подпрограммы. Далее смотрите указания к решению задачи 2 варианта 8 и варианта 11. 3. В целочисленном одномерном массиве расположите четные элементы в порядке возрастания, а нечетные – в порядке убывания. Предусмотреть анализ ситуации, когда в массиве нет либо ни одного четного, либо ни одного нечетного элемента. Вариант 14 1. В трех автопарках работают по 20 машин с заданными госномерами и указанными марками: ГАЗ, ЗИЛ, ЛИАЗ и т. д. Каждый водитель сдает сводку о том, сколько километров прошла его машина в каждый день недели, и о размере выручки. Подсчитайте общий километраж в каждом автопарке по каждому дню отдельно. В каком из автопарков самый больший автопробег? Какой день недели соответствует самой большой прибыли? 2. Вычислите значения функции y = Cos x + x Sin x в n точках отрезка [a, b]. Вычисляемые значения поместите
105
в одномерный массив парами xi, yi(i = 1, …, n). Напечатайте полученный массив в два столбца (аргумент и функция), используя для аргумента вывод по формату с фиксированной точкой, а для функции – по формату с плавающей точкой (с порядком). Указания к решению задачи 2. Для каждого I помещайте х(I) в (2*I – 1)-ый, y(I) в (2*I)-й элементы одномерного массива. Использовать подпрограмму. 3. Напишите программу поиска максимального из 4-х чисел. Указания к решению задачи 3. Используйте подпрограмму поиска большего из двух чисел. Вариант 15 1. Даны действительные числа s, t. Напишите программу вычисления выражения f (t, –2 s, 1.17) + f (2.2, t, s – t), где f (a, b, c) = (2a – b – sIn (c)) / (5 + | c |). 2. Два треугольника заданы своими сторонами a, b и c (т. е. заданы длины сторон а, b и с). Вычислите площади треугольников по формуле Герона и определите, какой треугольник имеет большую площадь. При решении задачи надо взять следующие данные: для первого треугольника а = 3, b = 4, с = 5; для второго треугольника а = 2, b = 37 ,
c = 37 . Вычисление площади треугольника по формуле Герона оформите в виде функции. Указания к решению задачи 2. По формуле Герона площадь треугольника со сторонами a, b, c равна S = р( p − a) ( p − b) ( p − c) , где р – полупериметр треугольника 3. Найти сумму двух наибольших простых чисел в массиве A (n). Используйте подпрограмму. Вариант 16 1. В порт в среднем приходит 3 корабля в день. Какова вероятность того, что в порт в день придет 2 корабля; 4 ко106
рабля? Вычисление вероятности оформите в виде подпрограммы. Указания к решению задачи 1. Вероятность того, что в указанный порт придет k кораблей равна: 3k e −3 Р (k ) = k! 2. Элементы матрицы А(п * п) вычисляются по формуле:
Ai , j = sin(i * j ), (i, j = 1, 2, 3, ..., n); Требуется построить матрицу В, каждый элемент которой вычисляется но формуле: Bi , j =
1 j
j
∑A
i ,k
;
k =1
3. Результаты переписи населения хранятся в памяти ЭВМ. Используя массивы фамилий и года рождения, напечатайте фамилии и подсчитате общее число жителей, родившихся раньше 1940 года. Указания к решению задачи 3. Задача сводится к определению числа элементов массива года рождения со значениями меньше 1940 и вывода на печать соответствующих элементов массива фамилий.
ЛАБОРАТОРНАЯ РАБОТА № 10 ВЫЧИСЛЕНИЕ ОПРЕДЕЛЕННОГО ИНТЕГРАЛА МЕТОДОМ СИМПСОНА
Цель работы 1. Получение практических навыков в программировании численных методов интегрирования с использованием подпрограмм и функций. 107
Теоретический материал Описание метода Симпсона. Вычисление определенных интегралов реализуют с помощью соответстствующих численных методов, к которым относится и метод Симпсона. Этот метод предусматривает вычисление определенного интеграла: b
y=
∫ f ( x)dx a
по формуле:
у=
n −1 n−2 ⎤ h⎡ f ( a ) f ( b ) 4 f ( x ) 2 f ( x j )⎥, − + + ⎢ i 3⎣ i =1 j =2 ⎦
∑
∑
где i = 1, 3, 5, …, n – 1; j = 2, 4, 6, …, n – 2; h = (b – a)/n – шаг интгрирования при разбиении интервала [a, b] на n отрезков (n – четное); f (a), f(b), f(xi), f(xj) – значение подинтегральной функции при соответствующих при соответствующих значениях аргумента из последовательности x0 = a, x1 = a + h, x2 = a + 2h, …, xn – 2 = a + (n – – 2) * h = b – 2h, xn – 1 = a + (n – 1) * h = b – h, xn = b.
Очевидно, что чем меньше h (больше n), тем более точно решается задача. Для обеспечения заданной точности ее решения έ (έ << 1) рекомендуется вычислять интеграл (значение y) по формуле Симпсона неоднократно, каждый раз удваивая число отрезков разбиения интервала [a, b]. В итоге получается последовательность значений интеграла y0, y1, y2, …, yi, …, ym, для n0, n1 = 2n0, n2 = 2n1, 2n0, …, ni = 2ni – 1 …, nm = 2nm – 1 сответстенно ( здесь n0 – начальное число отрезков разбиения интервала интегрирования. При этом считается, что достигнута заданная точность вычислений έ, если выполняется условие | ym – ym – 1 | < = έ. Описанный вычислительный процесс является иторационным и его алгоритм (основной алгоритм задачи) может бить представлен в виде схемы, изображенной на рис. Этот алгоритм носит циклический характер, так как предусматри108
вает многократное выполнение процедур соответствующих блокам 3–6. При этом для организации итерационного цикла здесь целесообразно использовать только простые переменные. Taк, исходной переменной цикла является переменная n и увеличение ее значения вдвое при очередном повторении цикла задается рекуррентной формулой n = 2n (блок 3). Переменные z и y представляют соответственно предыдущее (yj - 1) и очередное (yj) в итерационой последовательности значения интеграла. Причем в качествае значения Z при подготовке первого выполнения цикла (блок 2) предусматривается значение интеграла при предварительно введенном в компьютер значении n, а при подготовке следующего выполнения цикла (блок 5) задается изменение значения Z на значение толькоь что вычисленного в очередной раз интеграла (Z = V). Алгоритм вычисления значения интеграла для некоторого n (процедуры y (n)) удобно представить в виде блок-схемы отдельно (рис. 3). Он также как и основной алгоритм является циклическим, поскольку вычисления по формуле Симпсона целесообразно организовать, используя принцип накопления суммы ординат (значений) подинтегральной функции. При этом удобно предварительно вычислять в одном цикле: S1 =
n −1
∑ f ( x ) = f (a + h) + f (a + 3h) + ... + f (b − h), i
i =1
S2 =
n−2
∑ f ( x ) = f (a + 2h) + f (a + 4h) + ... + f (b − 2h). j
j =2
Методические указания – Для решения поставленной задачи необходимо уяснить сущность численных методов нахождения значений определенных интегралов и метода Симпсона в частности. – При программировании задачи необходимо предусмотреть автоматический выбор шага интегрирования h (числа отрезков n, на которые разбивается интервал интегрирования [a, b]), обеспечивающего заданную точность вычислений. – Программу вычисления определенного интеграла це109
лесообразно представить в виде основной программы и подпрограммы. В основной программе следует описать общий алгоритм решения задачи, предусматривающий ввод исходных данных в ЭВМ, итерационный цикл получения искомого результата с заданной точностью έ и вывод результата на печать. В подпрограмме же следует задать собственно процедуру вычисления интеграла для конкретного шага интегрирования, т. е. вычисление по формуле Симпсона. Подинтегральную функцию при этом удобно определить с помощью подпрограммы-функции ( см. блок-схему алгоритма). – После чего приступить к написанию программы в ИСП. – Структура программы должна иметь такой вид: заголовок программы, описание переменных, описание функции, описание процедуры вычисления интеграла, раздел операторов.
110
Рис. 3. Блок-схема вычисления определенного интеграла методом Симпсона – основной алгоритм
111
Рис. 4. Блок-схема вычисления определенного интеграла методом Симпсона – вспомогательный алгоритм
Содержание отчета – – – – – –
Постановка задачи для конкретного варианта. Исходная информация. Описание численного метода интегрирования. Тест и результаты отладки. Текст программы и результаты ее выполнения. Выводы. 112
Постановка задачи. Согласно своему варианту подготовить и организовать вычисление с точностью (абсолютной погрешностью) έ = 10–4 вычисление определенного интеграла: b
y=
∫ f ( x)dx a
используя метод Симпсона. Подинтегральная функция f(x) определена и непрерывна на интервале a <= x <= b. Вид подинтегральной функции f(x), а также интервал интегрирования [a, b] и начальное число отрезков разбиения его n0 определяется номером варианта (см. табл. 1). При программировании задачи процедуру значения интеграла при некотором значении ni (ni – число отрезков, на которые разбивается интервал интегрирования [a, b]) описать в виде подпрограммы. Таблица 13 Варианты заданий Номер варианта
Подинтегральная функция f (x)
1 1
2 ln x
2 3 4
x 1 + ln x ln 2 x x x ⋅ e x ⋅ Sinx 1
Пределы интегр. a b 3 4 1 3,5
Число отрезков n0 5 30
1
4
52
0
1
48
0
2
208
1
2,5
44
0
3
36
9 + x2
5
1 1 ⋅ Sin( ) x2 x
6 Arc sin
x 1+ x
7
x x ⋅ (1 + ln x )
1
3
40
8
x 2 − 0,16 x
1
2
160
113
Окончание табл. 13 1 9
10 11 12
2 e3 x + 1 ex + 1 x e ⋅ (1 + Sinx ) 1 + Cosx Sinx ⋅ ln(Tgx ) 1
3 0
4 2
5 48
0
1,5
132
1 0
1,5 0,75
52 40
( x + 1) ⋅ x 2 + 1
13
1 ( 3 Sin x + 2 Cos x ) 2
0
1
78
14
ln x 3 ) x x 4 ( x + 3x 2 + 2 )
1
2
50
1
2
72
2
3
40
15 16
(
1 dx x lg x
Литература
1. Алексеев В.Е, Ваулин А.С., Петрова Г.В. Вычислительная техника в инженерных и экономических расчетах. – М.: Высш. шк., 1998. 2. Васюкова Н.Д., Тюляева В.В. Практикум по основам программирования на языке Паскаль. – М.: Высш. шк., 1991. 3. Зеленяк О.П. Практикум программирования на Turbo Pascal. Задачи, алгоритмы и решения. – М.: ДиаСофтЮП, 2002. 4. Культин Н. Самоучитель программирования в Turbo Pascal 7.0 и Delfi. – СПб.: БВХ, 1999. 5. Культин Н.Б. Turbo Pascal в задачах и примерах. – СПб.: БХВ, 2000. 6. Марченко А.И., Марченко Л.А. Программирование в среде Turbo Pascal 7.0. – Киев: Век+, 1999. 114
7. Моргун А.Н. Решение задач средствами языка Turbo Pascal 7.0. – Киев, Юниор, 2002. 8. Першиков В.И., Савинков В.М. Толковый словарь по информатике. – М.:, Финансы и статистика, 1995. 9. Пильщиков В.Н. Язык Паскаль: упражнения и задачи. – М.: Научный мир, 2003. 10. Попов В.Б. Паскаль и Дельфи самоучитель. – СПб.: Питер, 2004. 11. Рапаков Г.Г., Ржеуцкая С.Ю. Программирование на языке Pascal. – СПб.: БХВ-Петербург, 2004. 12. Светозарова Г.И. и др. Практикум по программированию. – М.: Наука, 1988. 13. Симонович С.В. Информатика, базовый курс. – СПб.: Питер, 2003. 14. Суханов Н.Н. Turbo Pascal 7.0: теория и практика программирования. – СПб.: Наука и техника, 2003. 15. Ускова О.Ф. Программирование на языке Паскаль: Задачник. – СПб.: Питер, 2002. 16. Информатика: Учебник / Под ред. О.Н. Акулова, Н.В. Медведева. – М.: ОМЕГА-Л, 2005. 17. Информатика: Учебник / Под ред. А.П. Алексеева. – М.: СОЛОН-Р, 2001. 18. Информатика: Учебник / Под ред. А.Н. Данчула. – М.: Изд. РАГС, 2004. 19. Информатика: Учебник / Под ред. Н.В. Макровой. – М.: Финансы и статистика, 2001. 20. Информатика: Учебник / Под ред. В.А. Острековского. – М.: Высшая школа, 2000. 21. Фараонов В. Turbo Pascal 7.0. – М.: Нолидж, 2001.
115
Приложение 1 ПОДПРОГРАММЫ СТАНДАРТНЫХ БИБЛИОТЕК
Настоящее приложение содержит полные списки процедур и функций, реализованных в наиболее часто используемых стандартных библиотеках CRT и System. Подпрограммы модуля CRT. Модуль CRT содержит подпрограммы вывода информации на экран в текстовом режиме и установки различных видов текстовых режимов, а также поддерживает ввод информации с клавиатуры.
Процедура ClrScr Описание в модуле
Procedure ClrScr
Стирает все символы с экрана с учетом положения активного окна вывода, установленного процедурой WIndow. Каретка перемещается в левый верхний угол активного окна, при стирании символов используются текущие настройки цвета символов и фона, установленные с помощью процедур TextColor и TextBackground Процедура ClrEol Описание в модуле
Procedure ClrEol
Стирает все символы с экрана от текущего положения каретки до конца строки. Положение каретки не изменяется. При стирании символов используются текущие настройки цвета символов и фона, установленные с помощью процедур TextColor и TextBackground. При определении конца строки учитывается положение активного окна вывода, установленное процедурой WIndow
116
Процедура Delay Описание Procedure Delay(Ms: Word) в модуле Осуществляет приостановку программы на время, заданное в качестве параметра. Время задается в миллисекундах Процедура GotoXY Описание ProcedurefX, Y: Integer) в модуле Устанавливает каретку в положение, заданное параметрами. При изменении положения каретки учитывается положение активного окна вывода, установленное процедурой WIndow Функция KeyPressed Описание Function KeyPressed: Boolean в модуле Определяет, нажата ли клавиша, значение которой еще не прочитано функцией ReadKey Функция ReadKey Описание Function ReadKey в модуле Возвращает символ, сопоставляемый клавише, нажатой на клавиатуре Процедура TextBackground Описание Procedure TextBackground(Color: Byte) в модуле Устанавливает текущий цвет фона, заданный в качестве параметра Процедура TextColor Описание Procedure TextColor(Color: Byte) в модуле Устанавливает текущий цвет символов, заданный в качестве параметра. При добавлении к номеру цвета константы BlInk модуля CRT (значение 128) выводимые символы будут мигать 117
Функция WhereX Описание Function WhereX в модуле Возвращает горизонтальную координату каретки Функция WhereY Описание Function WhereY в модуле Возвращает вертикальную координату каретки Подпрограммы модуля System. Данный модуль существенно отличается от всех остальных, его не нужно подключать в разделе подключения библиотек Uses, это происходит автоматически. Подпрограммы работы с порядковыми типами данных
Процедура Dec Описание Procedure Dec(Var X [; N: LongInt]) в модуле Присваивает переменной, заданной в качестве, предыдущее значение из области допустимых значений для ее типа. Для целочисленных переменных данное действие аналогично уменьшению значения переменной на единицу. Целочисленный параметр N позволяет выполнять смещение значения более чем на единицу Процедура Inc Описание Procedure lnc(VarX [; N: LongInt]) в модуле Присваивает переменной, заданной в качестве, следующее значение из области допустимых значений для ее типа. Для целочисленных переменных данное действие аналогично увеличению значения переменной на единицу. Целочисленный параметр N позволяет выполнять смещение значения более чем на единицу 118
Функция Odd Описание Function Odd(X: LongInt): Boolean в модуле Проверяет, является ли значение параметра нечетным числом Функция Pred Описание Function Pred(X): <Same type as parameter> в модуле Проверяет, является ли значение параметра четным числом Функция Succ Описание Function Succ(X): (Same type as parameter) в модуле Возвращает следующее значение из области допустимых значений для типа переменной, заданной в качестве параметра. Для целочисленных переменных данное действие аналогично увеличению значения переменной на единицу Подпрограммы преобразования типов.
Функция Chr Описание Function Chr(X: Byte): Char в модуле Возвращает символ, номер которого в таблице символов равен значению, заданному параметру Функция Ord Описание Function Ord(X): LongInt в модуле Возвращает порядковый номер значения заданного параметра в области возможных значений для его типа Функция Round Описание Function Round(X: Real): LongInt в модуле Возвращает целое значение ближайшее к значению параметра 119
Функция Trunc Описание Function Trunc(X: Real): LongInt в модуле Возвращает целое значение путем отбрасывания дробной части значения параметра
Арифметические подпрограммы.
Функция Abs Описание Function Abs(X): <Такой же, как тип пав модуле раметра> Возвращает модуль значения параметра Функция АrсТап Описание Function ArcTan(X: Real): Real в модуле Возвращает арктангенс значения параметра Функция Cos Описание Function Cos(X: Real): Real в модуле Возвращает косинус значения параметра Функция Exp Описание в моFunction Exp(X: Real): Real дуле Возвращает экспоненту (число е в степени, равной значению параметра – е*) значения параметра Функция Frac Описание Function Frac(X: Real): Real в модуле Возвращает дробную часть значения параметра
120
Функция Int Описание Function lnt(X: Real): Real в модуле Возвращает целую часть значения параметра (округляет значение параметра в сторону нуля) Функция Ln Описание Function Ln(X: Real): Real в модуле Возвращает значение натурального логарифма значения параметра Функция Pi Описание Function Pi: Real в модуле Возвращает число «Пи» (3.1415926535897932385) Функция SIn Описание Function SIn(X: Real): Real в модуле Возвращает синус значения параметра Функция Sqr Описание Function Sqr(X): в модуле <Такой же, как тип параметра> ВВозвращает квадрат значения параметра Функция Sqrt Описание Function Sqrt(X: Real): Real в модуле Возвращает квадратный корень значения параметра Подпрограммы обработки строк.
Функция Length Описание Function Length(S: String): Integer в модуле Возвращает размер (количество символов) заданной строки 121
Функция Concat Описание Function Concat(s1 [, s2, ..., sn]: в модуле String): String Возвращает сумму строк, заданных в качестве параметров (операция конкатенации) Функция Сору Описание Function Copy(S: String; Index: Integer; в модуле Count: Integer): String Возвращает подстроку заданной строки, заключенную между двумя символами с индексами, заданными параметрами Процедура Delete Описание Procedure Delete(Var S: String; Index: в модуле Integer; Count: Integer) Удаляет подстроку заданной строки, заключенную между двумя символами с индексами, заданными параметрами Процедура Insert Описание Procedure lnsert(Source: String; Var S: в модуле String; Index: Integer) Вставляет заданную параметром Source строку в строку, заданную параметром S, начиная с заданного индекса Функция Pos Описание Function Pos(Substr: String; S: String): в модуле Byte Возвращает номер символа, который начинает первое вхождение подстроки, заданной параметром Substr, в строке S Процедура Str Описание Procedure Str(X [: Width [:Decimals ]]; в модуле Var S: String) Заносит в заданную строку символьное представление параметра X. В качестве необязательных ' параметров можно указать формат представления числа 122
Процедура Val Описание Procedure Val(S; Var V; Var Code: Integer) в модуле Заносит в переменную, заданную в качестве параметра V, числовое значение, задаваемое параметром S любого строкового типа. Результат операции (0, если преобразование успешно) помещается в переменную, заданную в качестве параметра Code Подпрограммы контроля выполнения программы.
Процедура Exit Описание Procedure Exit в модуле Досрочно прекращает выполнение текущей подпрограммы, в том числе и основной части программы, если в данный момент выполняется она Процедура RunError Описание Procedure RunError [(Errorcode: Byte)] в модуле Останавливает выполнение программы. Необязательный параметр определяет номер ошибки, которая будет выведена после завершения программы Подпрограммы ввода/вывода.
Процедура Assign Описание Procedure Assign(Var f; S: String) в модуле Сопоставляет файловую переменную любого типа файлу на диске с заданным именем Функция lOResult Описание Function IOResult: Integer в модуле Возвращает код ошибки последней операции ввода/вывода 123
Функция Eof для нетипизиFunction Eof(Var F): рованных Boolean Описание файлов: в модуле для текстовых Function Eof [(Var F: Text)]: файлов: Boolean Определяет, достигнут ли конец заданного файла Подпрограммы работы с текстовыми файлами.
Функция Eoln Описание Function Eoln [(Var F: Text) ]: Boolean в модуле Определяет, достигнут ли в заданном файле конец строки Процедура Read Описание Procedure Read (F, V1 [, V2..Vn]) в модуле Читаетет информацию Процедура Write Описание Procedure Write(F, V1 [, V2..Vn]) в модуле Записывает информацию Другие подпрограммы.
Процедура Exclude Описание Procedure Exclude(Var S: Set Of T; 1: T) в модуле Исключает заданный элемент из заданного множества Процедура Include Описание Procedure lnclude(Var S: Set Of T; 1: T) в модуле Включает заданный элемент в заданное множество 124
Функция Random Описание Function Random [(Range: Word)]: в модуле <Такой же, как тип параметра> Возвращает случайное значение от нуля (включительно) до значения параметра (не включая его). Если параметр не задан, возвращается случайное число типа Real Процедура Randomize Описание Procedure Randomize в модуле Изменяет базу генерации случайных чисел на основе системных часов Функция UpCase Описание Function UpCasefCh: Char): Char в модуле Переводит латинские символы заданной строки в верхний регистр
125
Приложение 2 СООБЩЕНИЯ ОБ ОШИБКАХ Сообщения компилятора. 1 1 2 3 4 5 6 7 8 10 11 12 13 14 17 20 21 23 25 26
2 Out of memory IdentIfier expected
3 Недостаточно памяти В данном месте должен находиться какой-либо идентификатор. Unknown identIfier Неизвестный идентификатор (неописанная константа, переменная, название процедуры и т. д.). Duplicate identIfier Попытка повторного описания идентификатора. Syntax error Синтаксическая ошибка (использование недопустимых символов). Error In real Constant Ошибка представления вещественного значения Error In Integer Constant Ошибка представления целочисленного значения String Constant exceeds Строковая константа превышает размеline ры строки Unexpected End of file Отсутствует признак окончания программы (ключевое слово End с точкой). Line too long Cлишком длинная строка е (максимально допустимая длина строки – 126 символов). Type identIfier expected В этом месте должен находится тип идентификатора Too many open files Слишком много открытых файлов. Invalid file name Некорректное имя файла. Имя файла неверно или указывает на несуществующий файл. Invalid compiler directive Неправильная директива компилятору. Variable identIfier Нужен идентификатор переменной expected Error in type Ошибка в определении типа. Structure too large Структура имеет слишком большой размер (превышающий 65535 байт). Invalid String length Некорректная длина строки (строка может иметь длину от 1 до 255). Type mismatch Несоответствие типов.
126
Продолжение табл. 1 27 28 29 30 31 32 34 35 36 37 38 39 40 41 42 43 44 46 50 61 62 66 74 76 79 80
2 3 Invalid sub range base type Недопустимо использовать данный тип для формирования типа-диапазона. Lower bound > than upper нижняя граница типа-диапазона больше bound верхней. Ordinal type expected В данном месте должен быть использован порядковый тип данных. Integer сonstant expected Нужна целая константа. Constant expected Нужна константа. Integer or real сonstant Нужна целая или вещественная конexpected станта. Invalid function result type Неправильный тип возвращаемого функцией значения. Label identIfier expected В данном месте должна быть использована метка безусловного перехода. BEGIN expected Нужен BEGIN. END expected Нужен END. Integer expression Нужно выражение типа Integer. expected OrdInal expression Нужно выражение порядкового типа. expected Boolean expression Нужно выражение с результатом типа expected Boolean. Operand types do not Типы операндов не соответствуют опеmatch ратору. Error In expression Ошибка в выражении. Illegal assignment Неверное присваивание. Field identIfier expected Нужен идентификатор поля. UndefIned EXTERN Не найдена указанная внешняя процедура. Do expected Требуется ключевое слово Do. Invalid typecast Неправильное преобразование типов. Division by zero Деление на ноль. String variable expected Нужна строковая переменная. Constant and case types Типы констант и тип выражения операdon't match тора case не соответствуют друг другу. Constant out of range Константа выходит за пределы допустимых значений. Integer or real expression Должно быть использовано выражение expected целочисленного или вещественного типа. Label not within current Метка безусловного перехода находитblock ся за пределами текущего блока.
127
Окончание табл. 1 85 96 97 98 100 101 108 109 131 133 143
2 «;» expected Too many variables Invalid FOR control variable Integer variable expected String length mismatch Invalid orderIng of fields Overflow In arithmetic operation No enclosIng For, While or Repeat statement Header does not match previous defInition
3 Должен быть использован символ «;». Слишком много переменных. используется некорректный счетчик цикла. Нужна переменная целого типа. Несоответствие длин строк. Неправильный порядок полей записи. Переполнение при выполнении арифметической операции. Обнаружен незакрытый оператор For, While или Repeat. Заголовок подпрограммы в описательной части не соответствует заголовку в интерфейсной части. Cannot evaluate this Невозможно вычислить значение данного выражения. expression Invalid procedure or func- Некорректная ссылка на подпрограмму. tion reference
Ошибки времени выполнения. Динамические ошибки, возникающие в процессе выполнения программы, называются ошибками времени выполнения программы приводят к появлению на экране сообщения вида: Runtime error nnn at xxxx: yyyy – Ошибка времени выполнения номер nnn по адресу хххх: уууу. Ошибок времени выполнения достаточно много, а мы приведем только некоторые. 162 200 205
Hardware failure Division by zero FloatIngpoInt overflow
206
FloatIng poInt underflow
207
Invalid floatIng poInt operation
Сбой аппаратуры. Деление на ноль. Переполнение при операции с плавающей точкой. Потеря порядка при операции с плавающей точкой. Недопустимая операция с плавающей точкой.
128
Учебно-методическое пособие (практикум)
Портнягина Вера Васильевна Портнягин Николай Николаевич ПРАКТИКУМ ПО ПРОГРАММИРОВАНИЮ НА ЯЗЫКЕ TURBO PASCAL
Часть 2 В авторской редакции Технический редактор Е.Е. Бабух Набор текста Н.Н. Портнягин, В.В. Портнягина Верстка, оригинал-макет Е.Е. Бабух Подписано в печать 15.02.2007 г. Формат 61*86/16. Печать офсетная. Гарнитура Times New Roman Авт. л. 6,65. Уч.-изд. л. 6,83. Усл. печ. л. 8,0 Тираж 50 экз. Заказ № 755 Издательство Камчатского государственного технического университета Отпечатано полиграфическим участком издательства КамчатГТУ 683003, г. Петропавловск-Камчатский, ул. Ключевская, 35
129