Камчатский государственный технический университет Кафедра информационных систем
В.В. Портнягина, Н.Н. Портнягин
ПРАКТ...
50 downloads
1604 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 и т. д.), соответствует клавише ; – #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 ' 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), то «лишние» символы отбрасываются. Перечислим операции сравнения: = , > = , > , < > , < , 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 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), тем более точно решается задача. Для обеспечения заданной точности ее решения έ (έ