ПЕНЗЕНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ v КАФЕДРА С А П Р
И Г О Ш И Н А Л. В. Методические указания к выполнению лаборат...
31 downloads
194 Views
566KB 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
ПЕНЗЕНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ v КАФЕДРА С А П Р
И Г О Ш И Н А Л. В. Методические указания к выполнению лабораторных и индивидуальных работ по курсу "Алгоритмические языки и программирование" Часть 1
Пенза 1999
Содержание 1. Алфавит языка Паскаль 2. Данные в языке Паскаль 2.1 Порядковые типы данных 2.1.1 Целые типы данных 2.1.2 Логический тип данных 2.1.3 Символьный тип данных 2.1.4 Перечислимый тип данных 2.1.5 Ограниченный тип данных 2.2 Вещественные типы данных 3. Структура программы на языке Паскаль 3.1 Описание меток 3.2 Описание переменных 3.3 Описание типов 3.4 Описание простых и типизированных констант 4. Арифметические выражения 5. Логические выражения 6. Составной оператор 7. Оператор присваивания 8. Процедуры ввода и вывода данных Лабораторная работа № 1 9. Операторы условной и безусловной передачи управления Лабораторная работа № 2 10. Оператор варианта 11. Операторы циклов 11.1 Оператор цикла с предусловием 11.2 Оператор цикла с постусловием 11.3 Оператор цикла с параметром Лабораторная работа № 3 Лабораторная работа № 4 12. Массивы и их описание 12.1 Работа с одномерными массивами Лабораторная работа № 5 12.2 Работа с двумерными массивами Лабораторная работа № 6 13. Строковый тип данных. Операции над строками 14. Множества в Паскале, их описание. Операции над множествами 15. Тип данных - записи, их описание и использование. Оператор присоединения 15.1 Работа с массивом из записей Лабораторная работа № 7 16. Подпрограммы
16.1
Процедуры. Описание процедур. Область действия имён Локальные и глобальные параметры Лабораторная работа №8 16.2 Подпрограммы типа FUNCTION, их описание Лабораторная работа №9 17. Задача сортировки: алгоритмы и программы 17.1 Сортировка выбором 17.2 Обменная сортировка 17.3 Сортировка слиянием Лабораторная работа №10 18. Задача поиска: алгоритмы и программы 18.1 Линейный поиск 18.2 Двоичный поиск Лабораторная работа №11
1. Алфавит языка Паскаль Алгоритмический язык Pascal (Паскаль) был разработан Никлаусом Виртом в 1969-71гг. Современный вариант - язык Turbo Pascal - расширение американского стандарта ANSI Pascal. Система Turbo Pascal (TP) является интегрированной средой, включающей: - универсальный текстовый редактор; - компилятор входного языка; - редактор связей; - встроенный символический отладчик. Текст программы на языке ТР представляет собой последовательность строк, состоящих из символов, образующих алфавит языка. Строки программы завершаются специальными управляющими символами, не входящими в алфавит (CR - возврат каретки - клавиша Enter и LF - новая линия). Максимальная длина строки составляет 126 символов. 1.
В алфавит языка входят: Буквы латинского алфавита от a до z и от A до Z, а также знак подчеркивания "_", который приравнивается к буквам. (В ТР нет различия между прописными и строчными буквами алфавита, кроме случаев, когда они входят в символьные и строковые выражения).
2.
Арабские цифры от 0 до 9.
3.
Специальные символы, их 23: + - * / = . , : ; ' < > ( ) { } [ ] $ @ # ^ и пробел.
Символы из языка используются для построения базовых элементов лексем. В ТР определены следующие классы лексем: 1) Служебные (ключевые или зарезервированные) слова: Begin, End, Var, Type, Label, Const, If, Then, Else, For, Do, While, Repeat и другие. Служебные слова нельзя использовать не по назначению. Они не могут использоваться в качестве идентификаторов. 2) Имена (или идентификаторы) вводятся программистом для обозначения (в программе) переменных, констант, типов, меток, процедур, функций, объектов, моделей, полей в записях и т.п. Они формируются только из букв и цифр, причем первой должна быть буква. Длина имени может быть произвольной, но компилятор воспринимает только первые 63 символа. Идентификаторы вводятся в программу посредством описаний.
3) Изображения - группа лексем, обозначающих числа, символьные строки и некоторые другие значения. 4) Знаки операций, которые формируются из одного или нескольких специальных символов или служебных слов: а) арифметические операции: + (сложение), - (вычитание), * (умножение), / (деление вещественных чисел), mod (деление целых чисел), div (остаток от деления двух целых чисел); б) операции отношения: < - (меньше), > - (больше), <= - (не больше), >= - (не меньше), = - (равно), <> - (не равно); в) логические операции: and - логическое И, or - логическое ИЛИ, not логическое НЕ, xor - исключительное ИЛИ; г) операции над множествами: * - пересечение множеств, + - объединение множеств, - - вычитание множеств, IN - принадлежность множеству. 5) Разделители, которые формируются из специальных символов. 6) Комментарии - произвольная последовательность символов, в том числе и русских букв, заключенных в фигурные скобки {…} или (* … *), предназначенная для пояснений в программе. Комментарии могут находиться между любыми двумя лексемами программы. 7) Пробел, не имеющий графического изображения, используется для отделения лексем друг от друга.
2. Данные в языке Паскаль В языке Паскаль любая переменная характеризуется своим типом. Под типом, в данном случае, понимается множество значений, которые может принимать переменная, а также множество операций, допустимых над данной переменной. Тип определяет формат внутреннего представления данных в памяти компьютера. Тип переменной определяется при ее описании, и он не может быть изменен в процессе выполнения программы. Переменная может участвовать только в операциях, допустимых ее типом. Паскаль имеет развитую систему типов. Классификация типов данных, приведенная на рисунке 1, взята из книги [1] и не является единственной. В языке предусмотрен механизм создания новых типов данных на основе базовых. Поэтому общее число типов, используемых в программе, может быть сколь угодно большим.
Рассмотрим сначала так называемые простые или базовые типы, являющиеся основой для построения других типов. Их иногда называют также стандартными типами данных. Типы
Простые
Структурированные
Порядковые
Целые
Вещественные
Логический
Массивы
Символьный
Ссылочный
Записи
Перечислимый
Строковый
Множества
Ограниченный
Процедурный
Файлы
Объекты Рисунок 1 2.1 Порядковые типы данных Порядковые типы характеризуются тем, что каждый из них имеет конечное число возможных значений и с каждым из них можно сопоставить некоторое целое число - порядковый номер значения. К порядковым типам относятся: - целый тип; - логический (или булевой) тип; - символьный тип; - перечислимый (или перечисляемый) тип; - ограниченный (или интервальный) тип, который также называют тип-диапазон. К любому из них применима стандартная функция ORD(Х), результатом которой является порядковый номер значения Х. К порядковым типам можно также применять функции: PRED(X) - возвращает предыдущее значение порядкового типа; SUCC(X) - возвращает следующее значение порядкового типа. 2.1.1 Целые типы данных
Эта группа типов обозначает множество целых чисел в различных диапазонах. Диапазон возможных значений целых типов зависит от их внутреннего представления, которое может занимать один, два или четыре байта. В таблице 1 приведены имена (или названия) всех возможных целых типов (их всего 5), а также длина их внутреннего представления в байтах и диапазоны возможных значений каждого из типов. Таблица 1 Целые типы Название
Длина, байт
Byte ShortInt Word Integer LongInt
1 1 2 2 4
Диапазон значений 0…255 -128…+127 0…65535 -32768…+32767 -2147483648…+2147483647
Значения целых типов могут изображаться в программе двумя способами: в десятичном виде (в виде последовательности цифр от 0 до 9) и в шестнадцатеричном виде (в виде последовательности цифр от 0 до 9 и букв от A до F, перед которыми ставится знак $). Над целыми значениями допустимы следующие арифметические операции: + - сложение, - - вычитание, * - умножение, / - деление и две дополнительные операции "типа деление", а именно, Div - деление нацело, с отбрасыванием дробной части и Mod - взятие остатка от целочисленного деления. При применении к целым значениям всех этих операций, кроме / деления получается результат целого типа, а деление (/) всегда дает вещественный результат. К значениям целых типов могут быть применены стандартные процедуры и функции, некоторые из них приведены в таблицах 2 и 3. При действиях с целочисленными значениями тип результата будет соответствовать типу операндов, а если операнды относятся к различным целым типам, - типу того операнда, который имеет максимальный диапазон значений. Возможное переполнение результата никак не контролируется, что может привести к непредсказуемым результатам.
Таблица 2
Стандартные функции, применимые к целым типам Обращение Hi(X) Lo(X) Odd(X) Swap(X)
Тип аргумента Integer Word Integer Word LongInt Integer Word
Тип результата Byte Byte Byte Byte Boolean Integer Word
Действие Возвращает старший байт аргумента Возвращает младший байт аргумента Возвращает значение True, если Х - нечетное Меняет местами байты в слове
Таблица 3 Стандартные процедуры, применимые к целым типам Описание процедуры Randomize
Тип параметров
Inc(X) Dec(X) Inc(X,N) Dec(X,N)
X - целое X - целое Dec(X,N) Dec(X,N)
Без параметров
Назначение Гарантирует несовпадение последовательностей случайных чисел, выдаваемых функцией Random Увеличивает значение Х на 1 Уменьшает значение Х на 1 Увеличивает значение Х на N Уменьшает значение Х на N
2.1.2 Логический тип данных Логический тип (Boolean) состоит из 2-х значений: False (Ложь) и True (Истина). Над значениями этого типа допустимы операции сравнения, причем False < True. Для них справедливы правила: ORD(False) = True; ORD(True) = False; SUCC(False) = True; PRED(True) = False. Значения логического типа занимают 1 байт. С логическим типом связаны логические операции: AND (И), OR (ИЛИ), NOT (НЕ). 2.1.3 Символьный тип данных
являются символы из Значениями символьного типа (Char) множества ASCII (American Code for Information Interchange - Американский стандартный код для обмена информацией). Это множество состоит из 256 различных символов, упорядоченных определенным образом. Оно содержит символы строчных и прописных букв, цифр и других символов, включая специальные управляющие символы. Каждому символу приписывается целое число в диапазоне от 0 до 255. Это число служит кодом внутреннего представления символа, его возвращает функция ORD. Если символьное значение имеет графическое изображение, то оно изображается в программе соответствующим знаком, заключенным в апострофы (одинарные кавычки): 'A', 'B', …, 'a', 'b', …, '1', '2', …, '*', '+' и т. д. Если символ не имеет графического изображения, то используют другую форму записи: #K, где К - целочисленный код символа. Например: #13 - Enter; #27 - Esc; #8 - Backspace. Так как символы упорядочены, то к типу Char применимы операции сравнения, например: 'A' < 'M'; 'A' < 'a' и т. п., а также стандартные функции: CHR(b) - преобразует выражение b типа byte в символ и возвращает его своим значением. Например: Chr(90) возвращает в качестве результата символ 'Z'. ORD(S) - возвращает в качестве результата код символа S в таблице символов ASCII. Например: Ord('Z') возвращает код, равный 90. UPCASE(CH) - возвращает прописную латинскую букву, если CH строчная латинская буква, в противном случае возвращает сам символ CH. Например: Upcase('z') возвращает символ 'Z'. PRED(S) - возвращает символ, предшествующий символу S. SUCC(S) - возвращает символ, следующий за символом S. 2.1.4 Перечислимый тип данных Перечислимый (или перечисляемый) тип данных задается списком значений (объектов), которые могут принимать переменные этого типа. При этом каждый объект имеет имя. Соответствие между значениями перечисляемого типа и порядковыми номерами этих значений устанавливается порядком перечисления: первое значение в списке получает порядковый номер 0, второе - 1 и т.д. Максимальное число объектов в перечисляемом типе равно 65366 значений. К значениям перечислимого типа применимы стандартные функции Ord, Pred, Succ, а также операции отношений. Переменные этого типа повышают наглядность программы и позволяют автоматически контролировать допустимость значений переменных. Рассмотрим примеры порядковых типов.
1. Описание дней недели: TypeDays=(Monday,Tuesday,Wednsday,Thday,Friday,Sutterday,Sunday). 2. Описание месяцев года: TypeYear=(jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec). 2.1.5 Ограниченный тип данных На основе четырех рассмотренных порядковых типов можно определить новые, порядковые типы: например, можно сузить диапазон значений любого из 4-х порядковых типов. Такие типы называют ограниченными (или интервальными) типами. Другое их название диапазоны. Такие типы задаются границами своих значений внутри базового типа: <минимальное значение> .. <максимальное значение> Примеры определения типов - диапазонов: Typedate=1..31; TypeMonth=1..12; TypeSim='A'..'Z' Можно сразу определить переменную типа - диапазон: Day:1..31; Month:1..12; Sim:'A'..'Z' и т.п. Необходимо помнить, что левая граница диапазона не должна превышать правой. К значениям этого типа могут быть применены стандартные функции: HIGH(X) - возвращает максимальное значение типа - диапазона, к которому принадлежит переменная Х; LOW(X) - возвращает минимальное значение типа - диапазона, к которому принадлежит переменная Х. 2.2 Вещественные типы данных Эта группа типов представляет множества значений в различных диапазонах. ТР поддерживает пять различных вещественных типа (табл. 4). Таблица 4 Название Real Single Double Extended Comp
Длина, байт Число цифр мантиссы 6 4 8 10 8
11-12 7-8 15-16 19-20 0
Диапазон значений 2.9 E-39…1.7 E +38 1.5 E-45…3.4 E+38 5.0 E-324…1.7 E+308 3.4E-4951…1.1E+4932 -2 E+63… +2 E+63 -1
Все вещественные типы, кроме Real, используются если в ПК есть арифметический сопроцессор.
Данные вещественного типа могут быть представлены в двух видах: с фиксированной точкой и с плавающей точкой. Значения с фиксированной точкой изображаются десятичным числом с дробной частью, которой может быть нулевой, например: 0.5, 5.25, 5.0, -16. 055 и т.п. Значения с плавающей точкой изображаются следующим образом: m E p, где m - мантисса вещественного числа, Е - признак порядка (число 10), р - порядок числа; m - целое или вещественное число с фиксированной точкой, положительное или отрицательное; р - только целое, положительное или отрицательное, например: 22 −5 4 -1.6 Е 22 (−1.6 ⋅ 10 ) . 4 Е -5 ( 4 ⋅ 10 ), 0.62 Е 4 ( 0.62 ⋅ 10 ), Над значениями вещественных типов допустимы четыре арифметических операции: *, /, +, -. Целые и вещественные числа именуются как "число без знака". В таблице 5 приведены некоторые стандартные математические функции и функции преобразования типов, которые используются при работе с целыми и вещественными значениями. Таблица 5 Вызов Функции
Тип аргумента
Abs(X)
Тип результата
Целый Вещественный Sin(X) Вещественный Cos(X) Вещественный ArcTan(X) Вещественный Sqrt(X) Целый Вещественный Sqr(X) Целый Вещественный Exp(X) Вещественный Ln(X) Вещественный
Целый Вещественный Вещественный Вещественный Вещественный Вещественный Вещественный Целый Вещественный Вещественный Вещественный
Pi Trunc(X) Frac(X) Int(X) Round(X)
Нет аргумента Вещественный Вещественный Вещественный Вещественный
Вещественный Longint Вещественный Вещественный Longint
Random
Нет аргумента Вещественный
Назначение функции Вычисление абсолютного значения Х Синус Х радиан Косинус Х радиан Арктангенс Х радиан Квадратный корень из Х, (Х>0) Значение Х, возведенное в квадрат Значение е в степени Х Натуральный логарифм Х, (Х>0) Значение числа π Целая часть числа Х Дробная часть числа Х Целая часть числа Х Округление Х до ближайшего целого Случайное число из диапазона (0...1)
Random(X) Word
Word
Odd(X)
Логический
Целый
Случайное число из диапазона (0...Х) Возвращает значение True, если Х - нечетное
Замечания к таблице 5: 1. Под целым типом понимается один из типов языка (Byte, ShortInt, Word, Integer, LongInt); 2. Под вещественным типом понимается тип Real или иной тип с плавающей точкой. Математические функции очень чувствительны к диапазону своих аргументов. Кроме того, возвращаемые значения целых типов должны в них умещаться, иначе возможны фатальные последствия. 3. Функция ArcTan(X) возвращает главное значение арктангенса (в диапазоне от - π /2 до + π/2). 4. Функции Trunc и Int отличаются только типом возвращаемого значения.
3. Структура программ на языке TurboPascal Любая программа на языке TurboPascal(ТР) состоит из двух основных разделов: раздела описаний данных и раздела операторов, и заканчивается всегда символом «.».
Раздел описаний Begin Раздел операторов End. Раздел описаний может включать в себя подразделы описания меток, констант, типов, переменных, а также подпрограмм, реализуемых в виде процедур или функций. Если в программе используются стандартные или библиотечные модули (Unit), то первой должна стоять директива Uses, в которой перечисляются используемые модули. Рекомендуется всегда включать в программу директиву: Uses CRT; Она подсоединяет стандартный модуль CRT, содержащий описание процедур, функций, констант, типов и переменных, позволяющих работать с цветом, звуком, экраном и ускорить операции ввода-вывода данных. Кроме двух основных разделов в программу можно и нужно включать комментарии: пояснения к программе, данные о разработчиках и т.п. Раздел описаний может содержать следующие подразделы:
1. Список имен, используемых модулей. 2. Объявление меток. 3. Объявление констант. 4. Объявление типов. 5. Объявление переменных. 6. Описание процедур и функций. Не все подразделы обязательны. Каждый из подразделов раздела описаний начинается своим ключевым словом. Список имен модулей начинается с ключевого слова USES. Раздел меток начинается с ключевого слова LABEL , раздел констант CONST , раздел типов - TYPE , раздел переменных - VAR . Раздел операторов следует за разделом описаний и всегда заключается в операторные скобки, определяемые ключевыми словами Begin ... End. Операторы отделяются друг от друга символом ";". Запись операторов в строке может начинаться с любой позиции. В одной строке можно записать несколько операторов. Один оператор может быть записан в нескольких строках. 3.1 Описание меток Метка представляет собой правильный идентификатор или любое целое без знака от 1 до 9999. Метки должны быть описаны в подразделе Label. Каждая метка описывается только один раз в каждой программной единице (основной программе или подпрограммах). Label метка; или Label метка1, метка2, …, меткаN; В программе метка ставится перед оператором, на который передается управление и отделяется от него символом ":". Метка : выполняемый оператор; Примеры описания меток: Label m1, m2, met1, l1, lab, 125; 3.2 Описание переменных Любая переменная, используемая в программе (и подпрограммах) должна быть определена (описана) в подразделе Var раздела описаний, причем каждая переменная описывается только один раз в каждой программной единице. Определение переменной должно содержать имя переменной и ее тип, разделенные двоеточием. VAR имя переменной : тип; Примеры:
Var x:real; i: byte; S: char; b: boolean; Days: 1..31; Переменные одного типа записываются друг за другом через запятые: Var a, b, c : real; I,j,k:byte; m, months:1..12; Для переменных, описанных в каждой программной единице, отводится определенный объем памяти. Переменные, описанные в основной (главной) программе, называют глобальными переменными. Общий объем памяти, отведенный под глобальные переменные, не должен превышать 64 Кбайта. Переменные, описываемые в подпрограммах, называются локальными переменными. 3.3 Описание типов В простейших случаях тип переменных указывается явно, при их описании в разделе Var: Var Имя переменной: тип; Можно сопоставить типу некоторое имя и описать его в разделе Type: Type Имя типа = Тип; Например: Type Diapason = 1..1000; T_days = 1..31; T_symbol = 'a'..'z'; T_Month = (j,f,mr,ap,may,jn,jl,ag,s,o,n,d); Это дает возможность программисту определять и использовать свои собственные типы, а не стандартные. Далее можно имена типов, введенные в подразделе Type, использовать в подразделе Var: Var i, n :Diapason; Day: T_days; Sim, ch: T_symbol; Mes: T_Month; 3.4 Описание простых и типизированных констант
Простые константы могут быть заданы явно своим значением (0.5, 0, 100, 3.14, 'A', -5 и т.п.) или обозначены именем и в этом случае константы должны быть описаны в подразделе Const: Const Имя константы = Значение; Например: Const N=200; A=0.5; sym='*'; В качестве значений константы могут быть использованы целые и вещественные числа, строки символов, идентификаторы других констант, константные выражения. Например: Const Max=100; Min=10; S=(Max+Min) div 2; Кроме простых констант используют так называемые типизированные константы или переменные со стартовым значением. Они занимают промежуточное положение между простыми константами и переменными, что отражается в следующих их свойствах: 1. Типизированные константы описываются в подразделе Const своим именем. 2. Они, как и константы, получают свое начальное значение. 3. Аналогично переменным, они имеют тип, который задается при их описании. 4. Они могут, как переменные, получать новые значения, в процессе работы программы. Таким образом, название "константа" достаточно условное. Типипзированные константы можно использовать как обычные переменные, но им присваиваются начальные значения. Описание типизированных констант: Const Имя типизированной константы: Тип = Типизированная константа; В свою очередь, понятие типизированной константы может включать одно из: Обычная константа Константа ссылочного типа Идентификатор программы Изображение массива Изображение множества Изображение записи Изображение объекта Примеры: Const
Max:integer=999; Min:real=-0.01; Index:1..1000=1; Примеры более сложных типизированных констант (массивов, множеств, записей) будут приведены при описании соответствующих типов. Замечание: простые константы могут использоваться в описании других констант или типов, а типизированные нет!
4. Арифметические выражения Арифметические выражения строятся из арифметических констант, переменных, функций и операций над ними. Все данные, входящие в арифметические выражения, должны быть одного типа, хотя иногда допускается использовать в одном выражении данные целого и вещественного типов. При построении арифметических выражений следует учитывать следующие правила: 1. Выражение записывается в строчку. Например, выражение:
2⋅ a ⋅ x + 3⋅b ⋅ y − 4 ⋅ x 2 .5 ⋅ ( a + b + c )
на Паскале будет записываться следующим образом: (2*a*x+3*b*y-4*x)/(2.5*(a+b+c)) 2. Скобки в арифметических выражениях только круглые. Число открывающихся скобок должно равняться числу закрывающихся скобок. 3. Нельзя записывать два знака операций подряд, без скобок, например в выражении:
3⋅ a + b следует записать: (3*a+b)/(-x). −x
4. Порядок выполнения арифметических операций соответствии со старшинством операций: 1) значения функций; 2) *, /, div, mod; 3) +, -. Рассмотрим порядок вычисления на примере:
слева
направо
(a ⋅ Sinx + b ⋅ Cosy ) 2 x (a 2 + b 2 ) ⋅ Sin( ) y Представленное выражение будет вычисляться в седующем порядке: 1) Вычисление функции Sin(x); 2) a*Sin(x); 3) Cos(y); 4) b*cos(y); 5) aSin(x)+b*Cos(y); 6) SQR(aSin(x)+b*Cos(y)) - получено значение в числителе; 7) Вычисление x/y; 8) Sin(x/y); 8) a*a; 9) b*b; 10) SQR(a*a+b*b); 11) SQR(a*a+b*b)*Sin(x/y) - получено значение в знаменателе;
в
12) числитель/знаменатель - получен результат.
5. Логические выражения Логические выражения строятся из логических (булевых) данных, логических операций (OR, AND, NOT) и операций отношений. В операциях отношений могут участвовать арифметические и логические выражения, а также символьные данные. Результатом логического выражения является значение True или False. Приоритет операций в логических выражениях следующий: 1) NOT 2) * , /, Div, Mod, AND 3) +, -, OR 4) <, <=, >, >=, =, <>. Внутри каждой группы приоритет равный. В логических выражениях допускается использование только круглых скобок. Сначала выполняются действия в скобках, начиная с самых внутренних. В круглые скобки обязательно заключаются части выражения, стоящие слева и справа от логических операций AND и OR. Примеры логических выражений: A<=B; Not a =b; (a
6. Оператор присваивания Оператор присваивания имеет вид: Переменная:= Значение; Слева в операторе присваивания всегда стоит имя переменной, а справа - то, что представляет собой её значение (это может быть конкретное значение, арифметическое или логическое выражение, вызов функции, либо другая переменная). После выполнения операции присваивания переменная слева получает новое значение. Программист должен следить за совместимостью типов данных, участвующих в операции присваивания. Например: А:=0.5; - переменной А будет присвоено конкретное значение, равное 0,5. Х:= 2*А+1; - переменной Х, после вычисления правой части, будет присвоено найденное значение.
7. Составной оператор Составной оператор - это объединение нескольких операторов в одну группу или блок. Форма записи данного оператора: Begin Оператор 1;
Оператор 2; . . . Оператор n; End; Составной оператор представляется как единый оператор и его можно вставлять в любое место программы, где допускается один оператор. Любой из операторов, входящих в составной оператор, в свою очередь, может быть составным. После ключевого слова Begin точка с запятой не ставится.
8. Процедуры ввода и вывода данных Для ввода и вывода данных используются стандартные процедуры: Read, Readln, Write и Writeln. Read (Список ввода); Readln(Список ввода); - ввод данных; Write(Список вывода); Writeln(Список вывода); - вывод данных. Процедуры Readln и Writeln отличаются от Read и Write тем, что после ввода (вывода) указанного списка данных курсор перемещается на новую строку. Список ввода содержит последовательность имён переменных, значения которых должны быть введены в процессе выполнения программы. Список вывода может содержать значения выводимых на экран дисплея переменных, выражений или сообщения. Текст сообщений может содержать допустимые символы языка или русский текст и заключается в апострофы: 'текст'. Например, в программе стоит оператор: Read(a,b,c); Пользователь должен ввести значения переменных a, b и c, в соответствии с типом, указанным в подразделе Var. Курсор остается на той же строке, где располагаются значения переменных. В том случае если используется оператор Readln(a,b,c); - действия пользователя те же, но курсор после ввода перемещается на следующую строку экрана. Числовые данные при вводе отделяются друг от друга пробелами. При выводе данных, как правило, выводятся как значения переменных, так и пояснения. Например, необходимо вывести полученное значение Y: Writeln(' Полученное значение Y = ',Y); В результате выполнения на экране появится сообщение, заданное в апострофах, и значение переменной Y. После чего курсор будет установлен в начало новой строки. Процедуры Write и Writeln удобно использовать для вывода сообщений перед вводом данных с клавиатуры, что упрощает ввод данных. Например, перед вводом данных в предыдущем примере перед процедурой ввода Read нужно поставить: Writeln(' Введите a, b и c'); Лабораторная работа №1
Линейные алгоритмы и программы Цель работы: 1. Построение схемы линейного алгоритма; 2. Изучение структуры программ на языке TurboPascal 3. Использование оператора присваивания. 4. Использование процедур ввода - вывода; 5. Использование стандартных математических функций. Перед выполнением данной лабораторной работы необходимо изучить разделы 1-8. Типовой пример Составить схему алгоритма и программу для вычисления значений функций Y и F для заданных значений переменной x и постоянных a и b. Значения переменной x>=0. Включить в программу комментарии. Вывести на экран значения F,Y для соответствующих значений x.
Y = e − ax ⋅ ( x ⋅ Sin (ax + b) − x ⋅ Cos (bx )); F = ln | ax 2 + b | − 1. Схема линейного алгоритма вычислений Начало Ввод х
Вывод YиF
Вычисле ние Y, F
Конец
Текст программы {Лабораторная работа 1} {Студенты гр. ..... Фамилии …} { Пример программы с линейной структурой} { Раздел описания данных} Const a=2.0; b=3.0;
Var x,Y,F: real; { Раздел операторов} Begin Writeln(' Введите x>=0 '); {Запрос на ввод x} Readln(x); {Ввод значения x} {Вычисление значений Y и F} Y:= Exp (-a*x)*(x* Sin (a*x+b) -Sqrt (x)* Cos (b*x)); F:= Ln (Sqrt( Abs (a*x*x-b)))-1; {Вывод результатов} Writeln(' При x = ',x,' Y = ',Y,' F = ',F); End. Варианты самостоятельных заданий
(
)
1. Y = ln | x | ⋅ x ⋅ arctg (ax ) − | x 3 | + ln(| bx | +3) ;
(ax
F=
2
(
)
+ bx − e −ax ; a = 2,5; b = 0,5; при x = 8 и x = 1.
)
2. Y = x 5 ⋅ x ⋅ arctg (a + x ) − | x − a | + ln(| x | +1) ;
(ax
F=
2
2
)
+ bx ⋅ e −ax + ln(| x | +1); a = 0,5; b = 1,5; при x = 9,5 и x = 1,5.
(
))
(
3. Y = ( x + a) 5 ⋅ arctg x − ( x − a) 2 | + ln 2 x 2 + 1 ; F = sin x − e −ax + ln(| x − a | +2); a = 2,5; b = 0,5; при x = 8,5 и x = 0,5.
(
)
4. Y = x 5 arctg (a + x ) − | ( x − a) 2 | ; F=
(
(ax
2
2
)
+ bx − e −ax + ax ⋅ ln( x + a); a = 4; b = 0,25; при x = 8 и x = 1.
))
(
5. Y = ( x − a) ⋅ arctg (a + x ) − 3 | ( x − a) | + x ⋅ ln x 2 + 2 ; F=
(
(ax
2
)
+ bx + e −ax + ln(| x | +4); a = 2,5; b = 0,5; при x = 3,5 и x = 1,5.
(
))
6. Y = x 5 ⋅ Cos(a + x ) − 3 | (2 x − a) | + ln ( x − 2) 2 + 2 ; F=
(
(ax
2
)
+ bx ⋅ e −ax + ln(| a − x | +3); a = 4; b = 2; при x = 3 и x = 1.
(
))
7. Y = x ⋅ Sin 2 (a + x ) − 3 | ( x − a) | + ln ( x − b) 2 + 1 ; F=
2
(ax
2
)
+ x + ae −ax + ln(| 1 − x | +1); a = 2,5; b = 1,5; при x = 0,5 и x = 1.
8.Y = ln | x + a 2 | (ax ⋅ arctg x − | x | + ln(| b + x | +1)) ; F = (ax 2 + x) + e − ax ; a = 1,5; b = 0,5; при x = 4 и x = 1.
9. Y = ax 5 (ax ⋅ arctg (a + x) − | ( x − a) | + ln(| x | +1) 2 ) ; F = x (ax 2 + bx) + e − x + ln(| x − a | +1) ; a = 3,5; b = 1,5; при x = 5 и x = 1. 10. Y = ( x + a) 3 (arctg (a x) − ( x − a) 2 + ln 2 (ax 2 + 1)) ; F = Sin(ax) − e − x + ln(| x − a | +2) ; a = 0,5; b = 2,5; при x = 2,5 и x = 0,5.
(
)
11. Y = ln | x − b | ⋅ ax ⋅ arctg (a + x ) − | x 3 − 1 | + ln(| b + x | +1) ;
(ax
F =1+
2
(
)
+ b − ae −ax ; a = 1,5; b = 0,5; при x = 4 и x = 1.
)
12. Y = x 3 ⋅ x ⋅ arctg (a / x ) − | x + b | + ln(| x − a | +1) ; F=
(ax
2
2
)
+ b + x ⋅ e −ax + ln(| x | +1); a = 2,5; b = 1; при x = 5 и x = 1,5.
(
))
(
13. Y = ( x + a) ⋅ arctg x − ( x − a) 3 | + ln x 3 + 1 ; F = Sin x − e −ax + ln(| x + a | +2); a = 2; b = 0,5; при x = 4,5 и x = 1,5.
(
)
14. Y = x 2 arctg (ax + b ) − | ( x − a) 2 − b | ; F=
(ax
2
)
+ b + x − e −a + x + ax ⋅ ln( x + a − 5); a = 2; b = 0,5;
2
(
)
x = 4 и x = 1.
15. Y = ( x − a) ⋅ arcctg (a + x ) − 3 | ( x + a) | + x ⋅ ln(a + x) ; F=
(ax
2
(
)
+ x + ae −ax + ln(| x | −3); a = 2; b = 0,5; при x = 3 и x = 1,5.
))
(
16. Y = x 4 ⋅ Cos(ax ) − 3 | (2 + x − a) | + ln ( x + 2) 2 + 2a ; F=
(1 + ax
(
2
)
+ bx ⋅ e −ax + ln(| a − x |); a = 3; b = 2,5; при x = 3 и x = 1.
)
17. Y = x ⋅ Sin 2 (a + x ) − 3 ( x − a) + ln(( x − b) + 1) ; F=
(ax
3
2
)
+ x + a / e −ax + ln(1 − x); a = 2,5; b = 0,5; при x = 0,5 и x = 1.
18. Y = ln(bx − a 2 )(ax ⋅ arctg x − | x | + ln(| b + x | +1)) ; F = (ax 2 + x − 4) + e −ax ; a = 1,5; b = 0,5; при x = 2 и x = 1. 19. Y = ax 5 (arctg (a + x) − | ( x − a) | + ln( x + 1) 2 ) ; F = x (ax 2 + bx) + e − x + ln( x − a + 1) ; a = 3; b = 5; при x = 5 и x = 2. 20. Y = ( x − a) 3 (arctg (b + x) − ( x − a) 2 + ln(ax 2 + 1)) ; F = Sin(ax) − e − x + ln( x − a + 2) ; a = 5; b = 2; при x = 5 и x = 1.
9. Операторы условной и безусловной передачи управления Условный оператор дает возможность, в зависимости от заданного в нём условия, выполнить то или иное действие, что позволяет разветвлять вычислительный процесс. Этот оператор имеет следующий вид: IF <условие> Then <оператор 1> Else <оператор 2>; где условие - логическое выражение; оператор 1, оператор 2 - любые операторы языка ТР. Условный оператор работает следующим образом: если <условие> принимает значение TRUE (истина), то выполняется оператор 1, а оператор 2 пропускается; если - FALSE (ложь), то оператор 1 пропускается, а выполняется оператор 2. На месте оператора 1 или оператора 2 может стоять группа операторов, заключенных в операторные скобки (Begin ... end). Часть Else (оператор 2) может быть опущена. Тогда при значении TRUE условного выражения выполняется оператор 1, в противном случае выполняется оператор, стоящий за оператором IF. Пример: Вычислить значение функции Y, в зависимости от значения x.
⎧ a ⋅ x + b, x > 0 ⎫ Y =⎨ ⎬ 2 ⋅ + ≤ , 0 a x b x ⎩ ⎭ Условный оператор будет иметь вид: If x>0 Then Y:=a*x+b Else Y:=a*x*x+b; Кроме передачи управления, в зависимости от некоторого условия, порядок выполнения операторов можно изменить с помощью оператора безусловной передачи управления вида: GOTO метка; Действие оператора Goto состоит в передаче управления в программе соотвествующему помеченному оператору. При использовании меток необходимо помнить: - метка, на которую ссылается оператор Goto, должна быть описана в подразделе Label и она обязательно должна встретиться в теле программы; - метка может ставиться перед ключевым словом End, что означает переход на конец текущего блока Begin … End; - следует избегать переходов (и расстановки меток), передающих управление внутрь операторов циклов; зато выход из циклов с помощью Goto может быть использован для их досрочного завершения;
- область действия оператора goto и связанных с ним меток строго локализована. Метки, описанные в основной части программы, действуют только в ней. Метки, описанные в подпрограммах, определенных программистом, действуют только внутри этих подпрограмм и поэтому передача управления извне подпрограммы на метку внутри нее невозможна. Кроме того, ТР обладает средствами безусловного выхода из программных блоков (процедур, функций или основной программы), что позволяет завершать программу или подпрограммы без предварительных переходов по меткам. Для этого используются системные процедуры EXIT и HALT. Вызов Exit вызывает завершение работы только того программного блока, в котором он используется. Процедура Halt завершает выполнение всей программы. Лабораторная работа №2 Алгоритмы и программы с разветвлением Цель работы: 1. Построение схемы разветвляющегося алгоритма; 2. Изучение структур разветвления (условных операторов) ТР. Типовой пример Составить схему алгоритма и программу для вычисления значений функции F для заданных значений переменной x и постоянных a, b. F = a tgx +√ |x-2| , при x < 2; F = (a2 - b2) Cos π , при x = 2; F = (x-2)3 Sin πx/2 , при x > 2.
(1) (2) (3)
Примечание: При составлении алгоритма и программы не забывайте анализировать знаменатель (он не должен равняться нулю), учитывайте область определения математических функций, значения подкоренных выражений и типы данных, участвующих в выражениях. В рассматриваемом примере значение подкоренного выражения всегда больше 0, арифметические функции Sinх и Cosх определены для любых значений х.
При вычислении значений функции tgx необходимо использовать выражение tgx = sinx /cosx. В связи с этим нужно анализировать значение, которое может принимать знаменатель: cosx не должен равняться 0. Все данные вещественного типа. Схема алгоритма
Начало
x>2
Ввод х
Cos(x) =0
х
нет Вычисление F по форм. (1)
x<2 х=2
Вычисление F по форм. (2)
Вывод F
Вычисление F по форм. (3)
Конец
да
Вывод сообщения
Текст программы с использованием структуры if ... then ... { Лабораторная работа 2} { Тема:…} { Выполнили: студенты гр. ... Фамилии …} { Пример программы с разветвляющейся структурой} { Любые другие комментарии к программе } { Раздел описаний данных} Const a=2.0; b=3.0;
Var x,F: real; { Раздел операторов} Begin Writeln(' Введите x'); {Запрос на ввод x} Readln(x); {Ввод значения x} if x>2 then F:= (x-2)*(х-2)*(х-2)* Sin(Pi *х/2); if x=2 then F:= (a*a-b*b)* Cos (Pi); if x<2 then if Cos (x) <> 0 then F:= a*Sin(x)/Cos(x)+Sqrt (Abs(x-2)) else begin Writeln(' Знаменатель равен 0'); exit { Выход из программы } end; {Вывод результатов} Writeln(' При x = ',x:6:2,' F = ',F:8:3); readln; End. Текст программы с использованием структуры if ... then ... else ...; {Лабораторная работа 2} {Студенты гр. ..... Фамилии …} { Пример программы с разветвляющейся структурой} { Раздел описаний данных} Const a=2.0; b=3.0; Var x,F: real; { Раздел операторов} Begin Writeln(' Введите x'); {Запрос на ввод x} Readln(x); {Ввод значения x} if 0 x>2 then F:= (x-2)*(х-2)*(х-2)* Sin(Pi/2*x) else if x=2 then F:= (a*a-b*b)* Cos (Pi) else if Cos(x) <> 0 then F:= a* Sin(x)/Cos(x)+ Sqrt(Abs(x-2)) else begin Writeln(' Знаменатель равен 0'); exit { Выход из программы } end; {Вывод результатов} Writeln(' При x= ',x:6:2,' F= ',F:8:3); readln; End. Варианты самостоятельных заданий
F = Sin x +
x − 5 ,
при
x < 5
1. F = a 2 ⋅ Cos π + ln ( x + a ), F = ( x − 5 ) 3 ⋅ tg
x , 2
F = ctg x + a ⋅
x + 2,
при x = 5 , a − const
при x > 5
при x < − 2
2 2 2. F = ( a − b ) ⋅ cos π , при x = − 2 , a , b − const π ⋅x 3
F = ( x − 2 ) ⋅ sin
F = Arctg x +
,
2
x + 3,
при x < 0
3. F = ( a − b ) + cos π x , F = x 3 ⋅ ctg
π ⋅x 2
при x > − 2
при x = 0 , a , b − const
при x > 0
,
F = tg ( x − a ) + | x + 4 |, 2 2 4. F = ( a − b ) + cos π , F = ( x − 2 ) 3 ⋅ sin π ⋅ x ,
F = a ⋅ tg x + ln x − 2 ,
при x < 2
при x = 2 , a , b − const при x > 2 F = arctg x +
при x < 2
x − 2,
при x < 2
5. F = ( x 2 − b 2 ), при x = 2, a , b − const 6. F = (5 − b 2 ) + cos π ⋅ x, при x = 2, b − const F = ( x − 2 ) ⋅ sin
π ⋅x 2
,
F = ln( x − 2) ⋅ sin
при x > 2
7.
x , 2
при x > 2
8.
F = a ⋅ x + tg x + ln | x − 5 |,
при x < 5
F = tg x + 1+ | x − 2 |,
F = ( x 2 − b 2 ) + cos π ,
при x < 0
при x = 5, b − const F = ( a 2 + x ) + cos π , при x = 0, a − const F = ( x − 2) ⋅ sin 2π ⋅ x, при x > 5 F = x 3 ⋅ sin π ⋅ x, при x > 0 F = a ⋅ x + ctg x +
ln | x − 3 |,
при x < 3
2 2 9. F = ( x − b ) + cos π ⋅ x , при x = 3 , b − const F = ( x − b ) ⋅ sin 2 π ⋅ x , при x > 3
F = tg x + 1+ | x |,
при x < 0
10. F = ( a 2 + 2 x ) + sin π , при x = 0, a − const F = 3 x + sin π ⋅ x , при x > 0
F = Sin x +
x + 5,
при
x > −5
11. F = x ⋅ Cos π + ln ( x + b ), 2
x , 2
F = ( x − 5 ) 3 ⋅ tg
F = tg x + a ⋅ x ⋅
x = − 5 , b − const
x < −5
при
x + 2,
при
при x < − 2
12. F = ( a 2 − x 2 ) ⋅ cos x ⋅ π , при x = − 2 , a − const F = ( x − 2 ) ⋅ sin
π ⋅x 2
,
при x > − 2
F = Arctg x + x + 3 , при x > − 3 13. F = ( a − b ) + Cos x , при x = − 3 , b − const π ⋅x F = x 3 ⋅ tg , при x < − 3 2
F = tg ( x − 4) + | x + 4 |,
при x < 4
F = x ⋅ tg x + ln x − 2 ,
при x < 2
2 2 2 14. F = (a − x ) + cosπ , при x = 4, a − const 15. F = ( x + b) ⋅ x, при x = 2, b − const π ⋅x F = ( x − 4)3 ⋅ sin π ⋅ x, при x > 4 F = ( x − 2) ⋅ sin , при x > 2
2
F = arctg x +
2⋅ x − 2,
при x < 2
2 16. F = ( 4 − x ) + cos π ⋅ x ,
F = ln( x − 2 ) ⋅ sin
x , 2
F = ctg x + 1+ | x − 2 |,
при x < 5
при x = 2 17. F = ( x 2 − 52 ) + sin π ⋅ x, при x = 5 F = ( x − 2) ⋅ cos 2π ⋅ x, при x > 5 при x > 2
при x < 0
18. F = (a + x) + sin π , при x = 0, a − const F = a ⋅ x ⋅ cos π ⋅ x, при x > 0 F = 2 ⋅ x + tg x + ln | x − 3 |, при x < 3 2 2 19. F = ( x − 3) − sin 2 ⋅ x, при x = 3 F = ( x + 3) − cosπ ⋅ x, при x > 3
F = ctg x + 3+ | x |,
F = a ⋅ x + tg x + ln | x − 5 |,
при x < 0
2 20. F = (a ⋅ x + 1) + sin π , при x = 0, a − const F = (3 − x) ⋅ sin π ⋅ x, при x > 0
10. Оператор выбора Для разветвления в программе более чем в 2-х направлениях, можно использовать оператор выбора: Case <Выражение - ключ выбора> OF <Список выбора> End Или Case <Выражение - ключ выбора> OF <Список выбора> Else <Операторы> End Ключ выбора - выражение любого порядкового типа; <Список выбора> - одна или более конструкций вида: <Константа выбора> : <Оператор>; <Константа выбора> - выражение того же типа, что и ключ выбора; Оператор выбора работает следующим образом: вычисляется значение выражения <ключ выбора>, а затем в последовательности операторов <список выбора> отыскивается такой, которому предшествует константа, равная вычисленному значению. Найденный оператор выполняется, после чего оператор выбора завершает работу. Если в списке выбора нет такой константы, то управление передается оператору, стоящему за ключеваым словом Else. Часть Else может отсутствовать и в этом случае оператор выбора завершает свою работу. 11. Операторы циклов В языке ТР имеются три различных оператора, с помощью которых организуются циклические (повторяющиеся) фрагменты программ. 11.1 Оператор цикла с предусловием Оператор цикла с предусловием имеет вид: While <условие> Do <оператор>; где <условие> - логическое выражение. Если логическое выражение принимает значение TRUE (истина), то выполняется оператор, стоящий после ключевого слова Do, в противном случае оператор While прекращает свою работу. На месте одного оператора может располагаться группа операторов, заключённых в операторные скобки (Begin ... end). 11.2 Оператор цикла с постусловием Оператор цикла с постусловием имеет вид: Repeat <Тело_цикла> Until <условие> где <Тело цикла> - последовательность операторов ТР;
<условие> - логическое выражение. Операторы "тела цикла" выполняются хотя бы один раз, после чего вычисляется значение логического выражения и если это значение FALSE, то операторы "тела цикла" повторяются, в противном случае оператор цикла завершает свою работу. 11.3 Оператор цикла с параметром Оператор цикла с параметром имеет вид: For <параметр_цикла> := <нач.знач.> To < конеч.знач.> Do <оператор>; где <параметр_цикла> - переменная любого порядкового типа; <нач.знач.> - начальное значение - выражение того же типа; <конеч.знач.> - конечное значение - выражение того же типа; На месте одного оператора может располагаться группа операторов, заключённых в операторные скобки (Begin ... end). Для более гибкого управления операторами циклов For, While, Repeat в ТР введены две процедуры: BREAK - реализует немедленный выход из цикла; действие процедуры заключается в передаче управления оператору, стоящему сразу за после последнего оператора цикла. CONTINUE - обеспечивает досрочное завершение очередного прохода цикла, что эквивалентно передаче управления в самый конец циклического оператора. Лабораторная работа №3 Циклические алгоритмы и программы Цель работы: 1. Построение схем циклических алгоритмов; 2. Использование операторов циклов (повторений): Типовой пример Составить схему алгоритма и программу для вычисления значений функции Y для значений переменной х, изменяющейся в интервале от a до b с заданным шагом h.
Y = 3 (6 x 2 − x 3 ) Решение Так как в языке Pascal нет стандартной функции извлечения корня любой степени кроме квадратного, для вычисления функции Y воспользуемся переходом к функциям Exp и Ln.
Y = 3 (6 x 2 − x 3 ) = Exp (1.0 / 3.0 * Ln(6 x 2 − x 3 )). При программировании необходимо учесть, что выражение, стоящее под знаком Ln, может быть только положительным: (6x2-x3) > 0.
Исходными данными в этой задаче являются значения a,b и h. Начальное значение х принимаем равным а (х:=а). Каждое следующее значение х вычисляется по формуле х:=х+h. Вычисления функции Y для новых значений х заканчиваются, когда значение х становится больше, чем заданное значение b. Схема алгоритма и программа вычислений зависит от того, какой оператор цикла используется в программе. Рассмотрим три различных варианта решения поставленной задачи. Вариант 1 Схема алгоритма с использованием цикла While ... Do
6x2-x3 >0
Начало
нет
да Ввод a, b, h
Вычисление F
x := a
Вывод F
Вывод сообщения А Конец
А Пока x≤b
x := x+h
Текст программы {Лабораторная работа 3} {Программирование циклов с использованием оператора WHILE} {Студенты гр. ..... Фамилии …} Uses crt; {Подключение стандартного модуля TP} Var x,y,H,A,B: real; BEGIN Clrscr; { Очистка экрана} Writeln(' Введите A B H'); read(A,B,H); x:=A; While x<=B Do Begin if (6*x*x-x*x*x)<=0 then
Writeln('При x= ',x:5:3,' под знаком логарифма недопустимое значение') Else begin y:= Exp (1.0/3.0* Ln(Abs(6*x*x-x*x*x))); Writeln('x=',x:8:3,' y=',y:8:3); end; {Конец else} x:=x+H; Еnd; {Конец while} Readkey; { Ожидание нажатия любой клавиши} END. Вариант 2 Схема алгоритма с использованием цикла Repeat ... Until
2
Начало
6x -x >0
3
нет
Вывод сообщения
да Ввод a, b, h
Вычисление F
x := a
Вывод F
x := x+h
нет
x>b да
Конец Текст программы {Лабораторная работа 3} {Программирование циклов с использованием конструкции REPEAT…UNTIL} {Студенты гр. ... Фамилии ...} Uses crt; {Подключение стандартного модуля TP} Var x,y,A,B,H: real; BEGIN Clrscr; { Очистка экрана} Writeln(' Введите A B H'); readln(A,B,H); x:=A; Repeat if (6*x*x-x*x*x)=<0 then Writeln('При x= ',x:5:3, ' под знаком логарифма недопустимое значение') Else begin y:= Exp(1.0/3.0* Ln(Abs(6*x*x-x*x*x)));
Writeln(' end; x:=x+H; Until x>B; END.
x= ',x:8:3,'
y= ',y:8:3);
Readkey;{Ожидание нажатия любой клавиши}
Вариант 3 Схема алгоритма с использованием цикла For ... Do Для организации цикла For необходимо сначала определить число повторений цикла - n. Это можно сделать с помощью формулы: n=(b-a)/h+1. При программировании необходимо учитывать тип переменных, участвующих в выражении. При вычислении значения n в правой части формулы получается результат вещественного типа, а слева стоит переменная целого типа, поэтому необходимо применить операцию округления полученного значения n до целого значения получаемого в результате операции деления. Для этого можно использовать стандартную функцию Round. For i:=1 to n
Начало A Ввод a, b, h
6x2-x3 >0
Вывод сообщения
нет
да n=(b-a)/h+1
Вычисление F
x := x+h
A x := a
Вывод F
Конец
Текст программы {Лабораторная работа 3} {Программирование циклов с использованием оператора FOR}
{Студенты гр. ....} Uses crt; Var x,y,A,B,H:real; n,i: integer; BEGIN Clrscr; Writeln(' Введите A B H'); read(A,B,H); n:= Round((B-A)/H)+1; x:=A; For i:=1 To n Do begin if (6*x*x-x*x*x)<=0 then Writeln('При x= ',x:5:3,' под знаком логарифма недопустимое значение') else begin y:= Exp(1.0/3.0*Ln(Abs(6*x*x-x*x*x))); Writeln(' x= ',x:8:3,' y= ',y:8:3); end; x:=x+H; end; { Конец For} END. Варианты самостоятельных заданий 1. Y = xSinx/Cosx; A = -1.6, B = 1.6, H = 0.2 2. Y = tgx2 + ctgx2; A = -2, B = 2, H=0.5 3. Y = Ln(x2 -9)/x; A = -6, B = 6, H = 1 4. Y = xLn(Cosx); 5. Y = tgx/x;
A = -3, B = 3, H = 0.3
A = -2, B = 2, H = 0.2
6. Y = Sinx/(x-5); A = -6, B = 6, H = 0.5 7. Y = x/(1-Cosx); A = -4, B = 4, H = 0.5 8. Y = 1/xtg(x/2); A = -3, B = 3, H = 0.5 9. Y = 1/(x2 -3);
A = -4, B = 4, H = 0.5
10. Y = 1/Ln(x2/8); A = -3, B = 3, H = 0.6
11. Y = 1/x ctg(x/3); A = -4, B = 4 , H = 0.5 12. Y = Ln(16-x2)/x ex; 13. Y = x tg x/ Lnx;
A = -6, B = 6, H = 0.5 A = -3, B = 3, H = 0.5
14. Y = x2Ln|x|/Sinx;
A = -2, B = 2, H = 0.2
15. Y = x/Sinx+ Ln(x2 - 4); A = - 6, B = 6, H = 0.5 16. Y = x2Cosx/Ln(x2-1);
A = -2, B = 2, H = 0.1
17. Y = xSinx/Ln(x2-9);
A = -5, B = 5, H = 0.5
18. Y = x2/(Cosx+Ln(x2-1)); 19. Y = (x2+ tgx)/Ln(x2-4); 20. Y = (x2- Cosx)/xLn(x2-1);
A = -2, B = 2, H = 0.2 A = -4, B = 4, H = 0.8 A = -2, B = 2, H = 0.2
Лабораторная работа №4 Использование циклических алгоритмов и программ для вычисления суммы членов ряда Цель работы: 1. Построение схемы итерационного процесса; 2. Приобретение навыков в выборе и использовании операторов цикла. Типовой пример Составить схему алгоритма и программу определения суммы членов ряда с точностью ε=10-3, общий член которого an задан формулой: (1) an = xn (2n-1) / n! Решение Для сокращения вычислений в программе (при подсчете значения факториала и возведении числа в степень) будем использовать рекуррентную формулу (для определения следующего элемента ряда). Для получения рекуррентной формулы вычислим отношение (n+1) члена ряда к nму:
an+1 x n+1 ⋅ (2 ⋅ ( n + 1) − 1) ⋅ n! x ⋅ (2 ⋅ n + 1) = n = ; an x ⋅ ( 2 ⋅ n − 1) ⋅ (n + 1)! (2 ⋅ n − 1) ⋅ (n + 1) тогда an+1 =
an ⋅ x ⋅ (2 ⋅ n + 1) (2 ⋅ n − 1) ⋅ (n + 1)
( 2)
Вычислим a1 по исходной формуле (1): а1 = x(2-1)/1!=x. Воспользуемся этим результатом для задания начального значения а и суммы членов ряда S. При составлении алгоритма и программы будем считать, что точность получена, если на очередном шаге вычислений значение аn < ε. Входные данные: х и ε (еps - обозначение в программе). Схема алгоритма с использованием цикла While ... Do Начало Ввод хиε
n:=n+1
a:=x; n:=1; S:=a;
a>=ε
Вычисление а по ф-ле (2)
нет
Вывод S
Конец
S:=S+a
да продолжение цикла Текст программы {Лабораторная работа 4} {Вычисление суммы членов ряда с использованием оператора WHILE} {Студенты гр. ..... Фамилии…} Uses crt; {Подключение стандартного модуля TP} Var x,a,eps,S: real; n:integer; BEGIN Clrscr; { Очистка экрана} Writeln(' Введите x,eps'); read(x,eps);
{ Задание начальных значений переменных} a:=x; n:=1; S:=a; While а>=eps Do Begin n:=n+1; {Вычисление очередного члена ряда по формуле (2)} a:=a*x*(2*n+1)/((2*n-1)*(n+1)); s:=s+a; end; Writeln(' Cумма членов ряда S = ',S:10:4,' Число итераций n = ',n:5); END. Рекомендация: При составлении программы не забывайте анализировать знаменатель (он не должен равняться нулю) и типы данных участвующих в выражениях. Варианты самостоятельных заданий 1. an = (2n-1)*x / 2n; 2. an = x /((3n-2)(3n+1)); 3. an = 10n / xn!; 4. an = xn! /(2n)!; 5. an = x* 2n / n!; 6. an = x ( 3n * n!) / (3n)!; 7. an = 3nx / (n+2)!; 8. an = (2n-1) * x / 2n; 9. an = nx / 3(n+1)/2; 10. an = (x+1) * 5n / n!;
11. an = x/n2; 12. an = 2nx / (n+1)!; 13. an = 3nx * 3n / n!; 14. an = x(n+1) / (n+2)!; 15. an = nx / 2(n+1); 16. an = 2xn! / (2n)!; 17. an = xn! / (3n)!; 18. an = x * 5n / (n+5)!; 19. an = x * 2n /(2n+1)!; 20. an = x(2n+1)(2n-1)/(2n+1)!;
12 Массивы и их описание Массивы относятся к структурированным типам данных в ТР. Массив состоит из фиксированного числа элементов (компонент) одного типа и характеризуется общим именем. Доступ к отдельным элементам массива осуществляется с помощью общего имени и порядкового номера (индекса или адреса) необходимого элемента. Имя массива - это любое допустимое в ТР имя, отличное от служебных слов, имен функций и процедур. Массив может быть описан в подразделе Var или в подразделах Var и Type, одновременно.
Первая форма описания - в подразделе Var: Var Имя_массива: Array [T1] OF [T2]; где Array (Массив) и Of (Из) - служебные слова. T1 - список типов индексов (в качестве индексов чаще всего используются переменные типа - диапазон, но возможно использование перечислимого типа); Т2 - тип элементов массива (любой тип ТР как простой, так и структурированный). Например: 1) Var Mas: Array[1..10] of integer; - описание массива, состоящего из 10 целых чисел и имеющего имя Mas; 2) Var S: array[1..20] of real; - описание массива, состоящего из 20 вещественных чисел и имеющего имя S; 3) Var Matr:array[1..20,1..20] of byte; - описание массива (матрицы размером 20 на 20), содержащего 400 элементов типа byte. Если массив объявлен, то к любому его элементу можно обратиться с помощью его имени и индексов. Например: 1) Mas[5]:=21; - пятому элементу массива Mas присвоено значение, равное 21. 2) For i:=1 to 20 do S[i]:=0.0; - присвоение всем 20 элементам массива S значения, равного 0.0 (обнуление массива). 3) For i:=1 to 20 do For j:=1 to 20 do Matr[i,j]:=random(100); заполнение массива (матрицы) на 400 чисел случайными числами из диапазона от 0 до 100. Вторая форма описания - в подразделах Var и Type: Type Имя_типа_массива = Array [T1] OF [T2]; Var Имя_массива: Имя_типа_массива; Например: 1) Type Tm=array[1..100] of byte; - описание нового типа для массива, состоящего из 100 чисел типа byte Var Mas:Tm; - описание массива с именем Mas. 2) Type Typ_Mas = array[1..100] of char; Var M:Typ_Mas; - описание массива содержащего 100 символов. 3) Type Tmatr = Array[1..25,1..10] of real; Var Matr1,Matr2:Tmatr; - описание матриц с именами Matr1 и Matr2. Массив с одним индексом называют одномерным, с двумя - двумерным, с тремя - трехмерным и т.д. Число индексов у массива в ТР не ограничивается, но необходимо помнить, что размер массива не должен превышать 64 Кбайт. Любой двумерный массив представляет собой матрицу: первому индексу можно поставить в соответствие строки, а второму - столбцы
матрицы. Кроме того, двумерный массив можно интерпретировать как одномерный, элементами которого является другой одномерный массив. Описание такого массива имеет вид: Type tstr=array[1..25] of real; Var masssiv:array[1..10] of tstr; - это описание равносильно описанию в примере 3, приведенному выше для массивов с именами Matr1 и Matr2. Оперативная память под элементы массива выделяется на этапе трансляции. В памяти компьютера элементы массива следуют друг за другом. Если массив двумерный, то память под него выделяется так, что быстрее меняется самый правый индекс. В качестве примера рассмотрим порядок выделения оперативной памяти под массив, описанный следующим образом: Var M:array[1..2,1..4] of byte; Этот массив будет располагаться в памяти в следующем порядке: M[1,1]; M[1,2]; M[1,3]; M[1,4]; M[2,1]; M[2,2]; M[2,3]; M[2,4]. В ТР можно одним оператором присваивания передать все элементы одного массива другому массиву того же типа. Например: Var m1,m2:array[1..10] of word; ... Begin . . . m1:=m2; { перезапись из одного массива в другой} ... End. Для сравнения содержимого двух массивов необходимо использовать оператор цикла с параметром и указываться индексы. Типизированные константы - массивы В качестве начального значения используется список констант, отделенных друг от друга запятыми. Список заключается в круглые скобки. Примеры: 1) Const Mas:array[1..10] of byte=(1,1,1,1,1,1,1,1,1,1); - заполнение массива из 10 целых чисел значением, равным единице. 2) Const massim: array[0..5] of char = ('a','b','c','d','e','f'); - заполнение массива из 6 элементов символами - буквами латинского алфавита. 3) Const Matr: array[1..5,1..2]of byte = ((0,0),(0,0),(0,0),(0,0),(0,0)); обнуление матрицы из 10 целых чисел. Замечание: количество переменных в списке констант должно строго соответствовать объявленной длине массива по каждому индексу! Лабораторная работа №5
12.1 Работа с одномерными массивами Цель работы: 1. Построение схем алгоритмов с использованием массивов; 3. Разработка программ с использованием одномерных массивов Типовой пример Составить схему алгоритма и программу определения суммы S всех положительных элементов одномерного массива M, содержащего К вещественных чисел (К≤20). Числа в массив M ввести с экрана дисплея, результат суммирования (S) также вывести на экран. Схема алгоритма
S := 0.0
Начало
Ввод К
Цикл i:=1,K
Цикл i :=1,K
нет
Вывод S
Конец
M[i]>0 да
Ввод в М[i]
S:=S + M[i]
Текст программы {Лабораторная работа 5} {Работа с одномерными массивами Студенты гр. Фамилии …} Uses crt; {Подключение стандартного модуля TP} Var m:array[1..20] of real; {Описание массива вещественных чисел}
S:real; {описание переменной для хранения суммы} i,K:byte; {описание переменных для счетчика и количества чисел} Begin Clrscr; {Очистка экрана} Write(' Введите число элементов в массиве К ='); Readln(K); Writeln(' Введите ',K,' вещественных чисел через пробел'); For i:=1 to K do read(M[i]); { Ввод вещественных чисел} writeln; { Переход на новую строку на экране} S:=0.0; { Присвоение начального значения суммы} For i:=1 to K do If M[i]>0 then S:=S+M[i]; { Суммирование положительных чисел} Writeln(' S = ',S); { Вывод полученной суммы} End. Варианты самостоятельных заданий 1. Составить схему алгоритма и программу определения суммы наибольшего и наименьшего элементов вещественного массива А={ai}, i=1,N, N- число элементов массива (N<100). Вывести на экран найденную сумму, а также наибольшее и наименьшее значения и их адреса (индексы) в массиве А. 2. Составить схему алгоритма и программу определения разности наибольшего и наименьшего элементов массива вещественных чисел М={mi}, i=1,t, t- число элементов массива (t≤50). Вывести на экран найденную разность, а также наибольшее и наименьшее значения и их адреса в массиве М. 3. Составить схему алгоритма и программу определения суммы всех четных чисел массива К={kj}, j=1,m, m - число элементов в массиве К (m≤60). Вывести на экран найденное значение суммы, а также все четные числа и их адреса. 4. Составить схему алгоритма и программу определения суммы всех нечетных чисел массива T={tj}, j=1,s, s - число элементов в массиве T (s≤40). Вывести на экран найденное значение суммы, а также все нечетные числа и их адреса. 5. Составить схему алгоритма и программу определения количества четных чисел массива К={kj}, j=1,m, m - число элементов в массиве К (m≤80). Вывести на экран найденное количество, а также все четные числа и их адреса. 6. Составить схему алгоритма и программу определения количества нечетных элементов массива T={tj}, j=1,s, s - число элементов в массиве T (s≤400). Вывести на экран найденное количество, а также все нечетные числа и их адреса. 7. Составить схему алгоритма и программу определения количества и адресов элементов массива целых чисел К={kj}, j=1,m, m - число
8.
9.
10.
11.
12.
13.
14.
15.
16.
элементов в массиве К (m≤55), значения которых не превышают заданного значения К0. Вывести на экран найденное количество, а также все найденные адреса. Составить схему алгоритма и программу определения количества и адресов элементов массива вещественных чисел P={pj}, j=1,r, r число элементов в массиве P (r≤140), значения которых не меньше заданного значения P0. Вывести на экран найденное количество, а также все найденные адреса. Составить схему алгоритма и программу определения произведения наибольшего и наименьшего элементов массива целых чисел М={mi}, i=1,t, t- число элементов массива (t≤250). Вывести на экран найденное произведение, а также наибольшее и наименьшее значения и их адреса в массиве М. Составить схему алгоритма и программу определения количества и адресов нулевых элементов массива вещественных чисел К={kj}, j=1,m, m - число элементов в массиве К (m≤90). Вывести на экран найденное количество, а также все найденные адреса. Составить схему алгоритма и программу определения сумм всех положительных и отрицательных элементов массива вещественных чисел М={mi}, i=1,t, t- число элементов массива (t≤200). Вывести на экран найденные значения. Составить схему алгоритма и программу определения количества положительных и отрицательных элементов массива вещественных чисел К={кi}, i=1,t, t- число элементов массива (t≤120). Вывести на экран найденные значения. Составить схему алгоритма и программу определения количества и адресов элементов массива вещественных чисел P={pj}, j=1,r, r число элементов в массиве P (r≤180), значения которых равны заданному значению P0. Вывести на экран найденное количество, а также все найденные адреса. Составить схему алгоритма и программу определения суммы и количества положительных элементов массива вещественных чисел К={кi}, i=1,t, t- число элементов массива (t≤170). Вывести на экран найденные значения. Составить схему алгоритма и программу определения суммы и количества отрицательных элементов массива вещественных чисел К={кi}, i=1,t, t- число элементов массива (t≤260). Вывести на экран найденные значения. Составить схему алгоритма и программу определения количества и адресов положительных элементов массива вещественных чисел К={kj}, j=1,m, m - число элементов в массиве К (m≤190). Вывести на экран найденное количество, а также все найденные адреса.
17. Составить схему алгоритма и программу определения суммы и адресов положительных элементов массива вещественных чисел К={kj}, j=1,m, m - число элементов в массиве К (m≤900). Вывести на экран найденное количество, а также все найденные адреса. 18. Составить схему алгоритма и программу определения количества и адресов отрицательных элементов массива вещественных чисел К={kj}, j=1,m, m - число элементов в массиве К (m≤110). Вывести на экран найденное количество, а также все найденные адреса. 19. Составить схему алгоритма и программу определения суммы и адресов отрицательных элементов массива вещественных чисел К={kj}, j=1,m, m - число элементов в массиве К (m≤450). Вывести на экран найденное количество, а также все найденные адреса. 20. Составить схему алгоритма и программу определения количества и адресов нулевых элементов массива целых чисел К={kj}, j=1,m, m число элементов в массиве К (m≤300). Вывести на экран найденное количество, а также все найденные адреса. Лабораторная работа №6 12.2 Работа с двумерными массивами Цель работы: 1. Построение схем алгоритмов с использованием вложенных циклов; 2. Разработка программ с использованием двумерных массивов Типовой пример Составить схему алгоритма и программу определения сумм элементов в каждой строке матрицы М={mij}, i=1,n; j=1,k, где n - число строк, k - число столбцов матрицы, mij - целые числа из диапазона: от 0 до 500. Записать полученные значения сумм в одномерный массив SUM, а затем вывести их на экран дисплея. Числа в массив М занести с помощью функции Random. Определить и вывести на экран номер строки с минимальным значением суммы. Схема алгоритма
Начало
Вывод матрицы на экран
Вывод SUM[i], i=1,n
Ввод nиk
Цикл i=1,n
Цикл i=1,n
SUM[i]:=0
Цикл j=1,k
Цикл j=1,k
M[i,j]= Random(500)
SUM[i] := SUM[i] +M[i,j]
Конец
Текст программы Uses crt; { Описание данных} Var M:array[1..50,1..100]of integer; Sum:array[1..50] of longint; n,k,i,j,imin:integer; Min:longint; BEGIN clrscr; { Ввод данных} writeln(' Введите число строк и столбцов'); readln(n,k);
Min:=Sum[1] imin:=1
Цикл i=1,n
Sum[i] <=Min да Min:=Sum[i] imin:=i
Вывод Min, imin
Randomize; { Стандартная процедура см. теорию} { Заполнение матрицы случайными числами} for i:=1 to n do for j:=1 to k do M[i,j]:=Random(500); writeln(' Элементы заполненной матрицы'); for i:=1 to n do begin for j:=1 to k do write(M[i,j]:4); writeln; end; writeln(' Сумма элементов в каждой строке'); write(' Hомера строк : '); for i:=1 to n do write(i,' ');writeln; write(' Сумма в строке : '); for i:=1 to n do begin Sum[i]:=0; for j:=1 to k do Sum[i]:=Sum[i]+M[i,j]; write(Sum[i], ' '); end;writeln; { Поиск минимального значения} Min:=Sum[1]; imin:=1; for i:=1 to n do if Sum[i] <= Min then begin Min:=Sum[i]; imin:=i; end; writeln(' Минимальная сумма = ',Min,' в строке ',imin); readln; END. Варианты заданий 1. В прямоугольной матрице размером Т*М, имеющей имя МАТР содержаться целые числа. Т - число строк, М - число столбцов. Ввести элементы матрицы с клавиатуры. Определить и вывести на экран сумму элементов в каждой строке. Определить строку с максимальным значением этой суммы и вывести ее номер на экран. 2. В прямоугольной матрице размером М*Т, имеющей имя МАS содержаться целые числа. М - число строк, Т - число столбцов. Ввести элементы матрицы с клавиатуры. Определить и вывести на экран
сумму элементов в каждой строке. Определить строку с минимальным значением этой суммы и вывести ее номер на экран. 3. В прямоугольной матрице размером К*М, имеющей имя МАTR содержаться целые числа. К- число строк, М- число столбцов. Ввести элементы матрицы с клавиатуры. Определить и вывести на экран сумму положительных элементов в каждой строке. Определить строку с максимальным значением этой суммы и вывести ее номер на экран. 4. В прямоугольной матрице размером М*К, , имеющей имя МАT содержаться целые числа. М- число строк, К- число столбцов. Ввести элементы матрицы с клавиатуры. Определить и вывести на экран сумму отрицательных элементов в каждой строке. Определить строку с максимальным значением этой суммы и вывести ее номер на экран. 5. В прямоугольной матрице размером L*М, имеющей имя МАTR содержаться целые числа. L- число строк, М- число столбцов. Ввести элементы матрицы с клавиатуры. Определить и вывести на экран сумму положительных элементов в каждой строке. Определить строку с минимальным значением этой суммы и вывести ее номер на экран. 6. В прямоугольной матрице размером М*К, имеющей имя МАT содержаться целые числа. М- число строк, К- число столбцов. Ввести элементы матрицы с клавиатуры. Определить и вывести на экран сумму отрицательных элементов в каждой строке. Определить строку с минимальным значением этой суммы и вывести ее номер на экран. 7. В прямоугольной матрице размером М*К, имеющей имя МА содержаться целые числа. М- число строк, К- число столбцов. Ввести элементы матрицы с клавиатуры. Определить и вывести на экран сумму элементов в каждом столбце. Определить столбец с максимальным значением этой суммы и вывести его номер на экран. 8. В прямоугольной матрице размером М*К, имеющей имя М содержаться целые числа. М- число строк, К- число столбцов. Ввести элементы матрицы с клавиатуры. Определить и вывести на экран сумму элементов в каждом столбце. Определить столбец с миниимальным значением этой суммы и вывести его номер на экран. 9. В прямоугольной матрице размером М*К, , имеющей имя ММ содержаться целые числа. М- число строк, К- число столбцов. Ввести элементы матрицы с клавиатуры. Определить и вывести на экран сумму положительных элементов в каждом столбце. Определить столбец с максимальным значением этой суммы и вывести его номер на экран. 10. В прямоугольной матрице размером М*К, , имеющей имя МАМ содержаться целые числа. М- число строк, К- число столбцов. Ввести элементы матрицы с клавиатуры. Определить и вывести на экран сумму отрицательных элементов в каждом столбце. Определить столбец с миниимальным значением этой суммы и вывести его номер на экран.
11. В квадратной матрице размером К*К, имеющей имя МА содержаться целые числа. К- число строк и столбцов. Ввести элементы матрицы с клавиатуры. Определить и вывести на экран сумму положительных элементов в каждом столбце. Определить столбец с минимальным значением этой суммы и вывести его номер на экран. 12. В квадратной матрице размером Т*Т, имеющей имя МКА, содержаться целые числа. Т - число строк и столбцов. Ввести элементы матрицы с клавиатуры. Определить и вывести на экран сумму отрицательных элементов в каждом столбце. Определить столбец с максимальным по модулю значением этой суммы и вывести его номер на экран. 13. В квадратной матрице размером Т*Т, имеющей имя МКА, содержаться целые числа. Т - число строк и столбцов. Ввести элементы матрицы с клавиатуры. Определить и вывести на экран число элементов равных 1 в каждой строке. Определить строку с максимальным числом единиц и вывести ее номер на экран. 14. В квадратной матрице размером Т*Т, имеющей имя МКА, содержаться целые числа. Т - число строк и столбцов. Ввести элементы матрицы с клавиатуры. Определить и вывести на экран сумму отрицательных элементов в каждом столбце. Определить столбец с минимальным по модулю значением этой суммы и вывести его номер на экран. 15. В квадратной матрице размером М*М, имеющей имя МКМ, содержаться целые числа. М - число строк и столбцов. Ввести элементы матрицы с клавиатуры. Определить и вывести на экран число элементов равных 1 в каждой строке. Определить строку с минимальным числом единиц и вывести ее номер на экран. 16. В квадратной матрице размером М*М, имеющей имя МНМ, содержаться целые числа. М - число строк и столбцов. Ввести элементы матрицы с клавиатуры. Определить и вывести на экран число элементов равных 0 в каждой строке. Определить строку с минимальным числом нулевых элементов и вывести ее номер на экран. 17. В квадратной матрице размером К*К, имеющей имя Ма, содержаться целые числа. К - число строк и столбцов. Ввести элементы матрицы с клавиатуры. Определить и вывести на экран число элементов равных 0 в каждой строке. Определить строку с максимальным числом нулевых элементов и вывести ее номер на экран. 18. В квадратной матрице размером М*М, имеющей имя МКМ, содержаться целые числа. М - число строк и столбцов. Ввести элементы матрицы с клавиатуры. Определить и вывести на экран минимальный элемент в каждой строке. Определить строку с максимальным значением из найденных минимумов и вывести ее номер на экран. 19. В квадратной матрице размером М*М, имеющей имя МКМ, содержаться целые числа. М - число строк и столбцов. Ввести элементы матрицы с клавиатуры. Определить и вывести на экран максимальный
элемент в каждой строке. Определить строку с минимальным значением из найденных максимумов и вывести ее номер на экран. 20. В прямоугольной матрице размером М*Т, имеющей имя МТМ, содержаться целые числа. М - число строк Т- число столбцов. Ввести элементы матрицы с клавиатуры. Определить и вывести на экран минимальный элемент в каждой строке. Определить строку с максимальным значением из найденных минимумов и вывести ее номер на экран.
13 Строковый тип данных. Операции над строками Для работы с символьной информацией в ТР используют новый тип данных - строковый, именуемый ключевым словом STRING (или просто строка). Этот тип данных во многом похож на одномерный массив символов (Array[0..N] of char), но длина строки (максимальное количество символов N ограничивается числом 255). Значение N определяется при объявлении типа STRING(N) и может быть любой константой порядкового типа, но не больше 255. Значение N при объявлении типа STRING можно не указывать: в этом случае длина строки принимается равной 255 символам. Строка в ТР трактуется как цепочка символов и к любому символу в строке можно обратиться по адресу (индексу), подобно одномерным массивам типа Array[0..N] of char. Самый первый байт в строке, имеющий адрес 0 (ноль), содержит код, равный числу символов в строке (длине строки). Например, дана строка, имеющая следующее описание: Var St:string; Тогда длину строки St можно определить как значение функции Ord(St[0]). Значением строки может быть любая последовательность символов, заключенная в одинарные кавычки (апострофы). Можно присваивать строке пустое значение, обозначаемое как '' (две одинарные кавычки подряд). При попытке записать в переменную строку длиннее, чем задано в описании, "лишняя" часть будет отсечена. Строки можно присваивать, сливать и сравнивать. Например: Var st1,st2,st3,sts:string; Begin ... { Операции присваивания} st1:='Фамилия'; st2:='Имя'; st3:='Отчество'; { Операция слияния} sto:=st1+' '+st2+' '+st3;
{ В результате в строке sto будет 'Фамилия Имя Отчество'} End; ... Сравнение строк основывается на порядке расположения символов в таблице ASCII. Например: 'abcd' = 'abcd' - результат сравнения True (истина); 'abc'<'bcd' так как код символа 'a' меньше кода символа 'b' и т.п. Для работе со строками в ТР разработан ряд стандартных процедур и функций. Первоначально любая описанная в разделе Var строка содержит "мусор" и рекомендуется инициализировать (заполнять) строки пустыми значениями или чем-либо другим. Для заполнения достаточно длинных строк одинаковыми символами используется встроенная процедура FillChar, например: Var S:string[80]; Begin ... FillChar(S[1],80,' '); {Заполнение строки пробелами} или FillChar(S,Sizeof(S),' '); {Заполнение строки пробелами} S[0]:=Chr(80); {Занесение кода длины строки} ... End; Длину строки можно определить также, используя встроенную функцию Length(S), где S - строка типа String. В ряде случаев возникает необходимость преобразования числовых значений в строку и наоборот. Для этого можно использовать две процедуры: 1) STR(X,S) - преобразует числовое значение X в строковое S. Возможно задание формата для Х в виде: X:F:n (для вещественных чисел, где F - общее число позиций выделяемых под число, включая десятичную точку, а n - число знаков в дробной части) или X:F (для целых чисел). Эта функция чаще всего используется при работе с процедурами модуля GRAPH. Например: STR(55,s); - строковая переменная s принимает значение, равное '55'. 2) VAL(S,Х,ErrCode) - преобразует строку S в числовое значение, если это возможно. Параметр ErrCode содержит ноль, если преобразование прошло успешно, и тогда в Х помещается результат преобразования, в противном случае он содержит номер позиции в строке S, где обнаружен ошибочный символ. Например: Val('125',K,kod) - в результате выполнения этой процедуры переменная К получает целое значение, равное 125, параметр kod=0; Val(' 1.05',M,code) - M=1.05, code=0; Val('100, ',N,code) - это ошибочный вызов, т.к. в исходной строке на 4-й позиции располагается недопустимый для числа символ ',' и поэтому параметр code=4, а переменная N остается без изменения.
Кроме перечисленных, в ТР имеется еще 5 функций и процедур: 1) Concat (S1,S2,…,Sn) -функция, результат которой равен слиянию строк S1,S2,…,Sn. Например: Ssum:=Concat(s1,s2,s3). 2) Copy (S,Start,L) - функция, результатом которой является подстрока длиной L, начинающаяся с позиции Start строки S. Например: Stcop:=Copy('TTTx1+++',4,2) - результатом является подстрока Stcop='x1'. 3) Delete (S,Start,L) - процедура, которая удаляет из S подстроку длиной L, начиная с позиции Start в строке S. 4) Insert (S,Subs,Start) - процедура, которая вставляет подстроку Subs в строку S начиная с позиции Start строки S. Например: S:='Фамилия Адрес'; Insert(S,' Имя Отчество',9); В результате строка S будет иметь вид: 'Фамилия Имя Отчество Адрес'; 5) Pos(Subs,S) - функция поиска вхождения подстроки Subs в строку S; результатом поиска будет номер (адрес) первого символа подстроки Subs в S, если заданная подстрока найдена, или 0, если подстроки в строке нет.
14.
Множества в Паскале, их описание. Операции над множествами
Под множеством в языке Паскаль понимают ограниченный неупорядоченный набор различных элементов одинакового типа, логически связанных друг с другом. Количество элементов, входящих в множество, может изменяться (в пределах от 0 до 255). Множество, не содержащее элементов, называется пустым. Множество имеет имя. Тип элементов, входящих в множество, называется базовым. В качестве базового типа можно использовать любой порядковый тип, кроме Word, Integer, Longint. Множества должны быть объявлены либо в разделе Var, либо в разделах Type и Var, одновременно: Var Имя множества:Set of базовый тип; или Type Имя типа=Set of базовый тип; Var Имя множества:Имя типа; Например: Type TM=Set of 1..100; TS=Set of 'a'..'z'; Var Mch:TM; {Множество целых чисел от 1 до 100} MSym:TS; {Множество строчных латинских букв} M: Set of 1..10; {Множество целых чисел от 1 до 10}
Значения переменных множества задаются в разделе операторов с помощью конструктора множества, который представляет собой список элементов базового типа, заключенный в квадратные скобки. Например: Var M1,M2,M3:set of 1..99; Begin . . . M1:=[]; { Множество пустое} M2:=[1,3,5,7,9]; { Множество нечетных чисел в первом десятке} M3:=[2,4,6,8]; { Множество четных чисел в первом десятке} ... End. В качестве элементов в изображении множеств допускается использовать константы и выражения, тип которых совместим с базовым типом. Типизированная константа - множество задается в виде правильного конструктора множества, например: Type Type_month=(Jn,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec); TDays=Set of 1..31; Tmonth=Set of 1..12; Tsym=Set of 'A'..'Z'; Tmno=Set of Type_month; Const SymMno:Tsym=['A','E','I','O','U']; {подмножество гласных букв} DaysMno:TDays=[1,8,15,22,29]; {подмножество выходных дней месяца} Spring_Mes:Tmonth=[3,4,5]; {подмножество весенних месяцев года} Spring_Month:Tmno=[Mar,Apr,May]; {то же, что и предыдущее} Над множествами определены следующие операции: 1) ∗ - пересечение множеств: результат содержит элементы, общие для обоих множеств. Например: пусть имеется описание: Var S1,S2,S3,S4,S5:Set of 1..10; Begin S1:=[1,3,4,6]; S2:=[2,4,5,1]; S3:=S1*S2; - в S3 будет содержаться [1,4]. 2) + - объединение множеств : результат содержит элементы первого множества, дополненные недостающими элементами из второго множества: S4:=S1+S2; - в S4 будет содержаться [1,3,4,6,2,5]. 3) − - разность множеств: результат содержит элементы из первого множества, которые не принадлежат второму: S5:=S1-S2; - в S5 будет содержаться [3,6].
4) = - проверка эквивалентности (или равенства): возвращает TRUE, если оба множества эквивалентны, т.е. содержат все одинаковые элементы. 5) <> - проверка неэквивалентности (или неравенства): возвращает TRUE, если оба множества неэквивалентны, т.е. содержат неодинаковые элементы. 6) <= - проверка вхождения: возвращает TRUE, если первое множество включено во второе (т.е. все элементы первого множества присутствуют также и во втором). 7) >= - проверка вхождения: возвращает TRUE, если второе множество включено в первое. 8) IN - проверка принадлежности элемента множеству. Эта операция возвращает результат TRUE, если элемент (или выражение), стоящий слева принадлежит множеству, указанному справа. Дополнительно к этим операциям можно использовать две процедуры: Include - включает новый элемент во множество: Include(M,elem); где М - множество элементов некоторого базового типа, а elem - элемент того же типа, который необходимо включить в множество М. Exclude - исключает элемент из множества: Exclude(M,elem). В отличие от операций "+" и "-", реализующих аналогичные действия над двумя множествами, эти процедуры оптимизированы для работы с одиночными элементами множества и поэтому отличаются высокой скоростью выполнения. Основным достоинством использования множеств является экономия памяти: внутреннее устройство множества таково, что каждому его элементу ставится в соответствие один двоичный разряд (один бит). Если элемент включен во множество, то соотвествующий разряд имеет значение 1, в противном случае - 0. Минимальной единицей памяти является 1 байт (8 бит), поэтому для хранения множества мощностью 256 элементов выделяется память 32 смежных байта. Рассмотрим работу с множествами на следующем примере. Из множества целых чисел от 1 до 20 выделить: 1) множество чисел, делящихся на 2 и 3 одновременно; 2) множество чисел, делящихся на 2 или на 3. Первая задача соответствует нахождению пересечения множеств чисел, одно из которых содержит числа, делящиеся на 2, а другое на 3. Вторая объединению этих двух множеств. Обозначим множество чисел, делящихся на 2 через М2; множество чисел, делящихся на 3 через М3; множество чисел, делящихся на 2 и 3 через М2and3; множество чисел, делящихся на 2 или 3 через М2or3. Текст программы Type TM=Set of 1..20; {Описание типа множества целых чисел от 1 до 20} Var M2,M3,M2and3,M2or3:TM; {Описание множеств} k:1..20; {Описание переменной}
Begin M2:=[]; M3:=[]; {Пустые множества} for k:=1 to 20 do begin if k mod 2 = 0 then Include(M2,k); {Включение элемента делящегося на 2 в множество М2} if k mod 3 = 0 then Include(M3,k); { Включение элемента делящегося на 3 в множество М3} end; M2and3:=M2*M3; {Пересечение двух множеств} M2or3:=M2+M3; {Объединение двух множеств} write(' На 2 и 3 делятся числа: '); for k:=1 to 20 do { Цикл для опеределения элементов в множестве} if k in M2and3 then write(k:3); { вывод элементов делящихся на 6} writeln; write(' На 2 или 3 делятся числа: '); for k:=1 to 20 do if k in M2or3 then write(k:3); readln; {Остановка для просмотра} End.
15. Тип данных - записи, их описание и использование. Оператор присоединения Запись - это структура данных, состоящая их фиксированного числа компонентов, называемых полями. Запись имеет имя. Каждое поле записи также имеет имя. Обращение к любому элементу записи осуществляется по составному имени, имеющему вид: Имя записи.Имя поля В отличие от массива компоненты (поля или элементы) записи могут быть различного типа. Записи удобно использовать в тех случаях, когда необходимо описать атрибуты (характеристики или свойства) одного объекта, имеющие различный тип. Запись может быть объявлена в разделе Var, а также в разделах Type и Var, одновременно. 1. Var Имя записи:RECORD Имя поля 1:тип; Имя поля 2:тип; ... Имя поля n:тип END; или 2. Type Имя типа для записи=RECORD Имя поля 1:тип; Имя поля 2:тип;
... Имя поля n:тип END; Var Имя записи:Имя типа для записи; Второй способ описания более предпочтителен, будем использовать его. Например, пусть необходимо описать список студентов, имеющий следующую структуру: № п/п
Фамилия Факультет Группа Экзаменационные оценки Имя Физика Математика Программиров Отчество Описание представленной структуры будет иметь следующий вид: Type T_Stud=Record Nom:word; FIO:string[40]; Fac:string[5]; Group:string[6]; Ball:array[1..3] of byte; End; Var Stud : T_Stud; {Описание одной записи} Записи могут быть составными частями массивов или других записей. Так для описания всего списка студентов, состоящего, допустим, из 1000 записей необходимо записать: Spisok:Array[1..1000] of T_Stud; {Описание массива из записей} Элементы записи (поля) используются в программе как обычные переменные данного типа. Чтобы обратиться к i - той записи представленного списка (массива Spisok) и к его полю FIO необходимо записать: Spisok[i].FIO. Для того, чтобы обратиться к той же записи и выбрать оценку по математике необходимо записать Spisok[i].Ball[2]. Для упрощения обращения к элементам записи используется оператор присоединения WITH Имя записи DO Begin Операторы обращения к элементам записи End; Для нашего примера используем этот оператор при суммировании трех оценок i-го студента: . . . Sum:=0; With Spisok[i] do
Begin For j:=1 to 3 do Sum:=Sum+Ball[j]; . . . End; Рассмотрим пример использования записи внутри другой записи. Пусть имеется структура: № п/п Ф.И.О. Дата рождения Пол Национальность Причем поле дата рождения состоит из полей: число, месяц, год. Тогда описание в программе будет иметь вид: Type Date=Record Days:1..31; Month:1..12; Year:1900..2000; End; Tzap=Record Nom:word; FIO:string[40]; Birthday:Date; Pol:(Man,Woman); Nac:string[20]; End; Var Zap:Tzap; Для того чтобы обратиться к элементам записи дата рождения, необходимо записать: D:=Zap. Birthday.Days; M:= Zap. Birthday.Month; G:= Zap. Birthday.Year; или с использованием оператора присоединения With Zap. Birthday do Begin D:=Days; M:=month; G:=Year; End; Типизированные константы - записи имеют вид: Имя константы : Тип = (Список значений полей записи); Список значений полей записи - это список из последовательностей вида: Имя поля: Константа; Например: 1) Type
Tdate=Record Day:1..31; Month:1..12; Year:1000..2000; End; Const Date:Tdate=(day:25;month:10;year:1999); 2) Type Tkoord=record Xk,Ykreal; end; Tmas=array[1..3] of Tkoord; Const Maskoord:Tmas=((Xk:0.0; Yk:0.0), Xk:1.5; Yk:2.5), Xk:3.0; Yk:4.5)); 15.1 Работа с массивом из записей Лабораторная работа №7 Цель работы: 1. Научиться описывать записи с заданной структурой 2. Освоить приемы ввода данных по полям записи Типовой пример Дан список, содержащий N записей (N≤100) следующей структуры: № рейса
Пункт отправления
Пункт назначения
День недели
Время отправления Час Мин 0..23 0..59
5 15 символов 15 симв. 1..7 символов 1) Ввести заданый список с экрана в массив записей Spis. 2) Ввести искомый номер рейса - Isk_nom. 3) Найти в списке рейс с заданным номером. 4) Вывести информацию о найденном рейсе на экран.
Текст программы Uses crt;
Цена билета Real
Type
Var
T_Time=record Hour:0..23; Min:0..59; end; tzap=record {Описание типа для одной записи списка} nom:string[5]; p1,p2:string[15]; day:1..7; time:T_Time; price:real; end; Spis:array[1..100]of tzap; {Описание списка} N,i:byte; Isk_nom:string[5];
Begin Write(' Введите число записей в списке N = '); Readln(N); Writeln('Введите список по полям - каждое поле с новой строки'); For i:=1 to N do With Spis[i] do begin Write(' Номер очередного рейса - 5 символов '); Readln(nom); Write(' Пункт отправления - 15 символов '); Readln(p1); Write(' Пункт назначения - 15 символов '); Readln(p2); Write(' День недели - от 1 до 7 '); Readln(day); Write(' Время отправления - часы (от 0 до 23) и минуты (от 0 до 59), через пробел '); Readln(time.hour,time.min); Write(' Цена билета = '); Readln(price); end; writeln(' введите искомый номер рейса - 5 символов '); Readln(Isk_nom); {Oрганизация поиска заданного рейса в массиве записей Spis} for i:=1 to N do with Spis[i] do if nom = Isk_nom then begin
writeln(' Рейс найден'); writeln(nom,' ',p1,' ',p2,' ',day,' ',time.hour,':',time.min,' ',price); readkey; halt; end; writeln(' Рейс не найден'); readkey; End. Примечание: При вводе символьной информации необходимо учитывать, что пробел также является символом. Варианты заданий Вариант 1 1. Дан список, содержащий не менее 10 записей, каждая из которых имеет структуру: Шифр книги Ф.И.О. авторов Название Год тип строка тип строка тип строка издания 5 символов 20 символов 15 символов целое 2. Разработать программу, выполняющую следующие функции: - ввод данного списка в массив записей; - вывод массива записей на экран; - поиск книг, изданных в 1960 году и шифром, начинающимся с буквы "А" с выводом найденных записей на экран. Вариант 2 1. Дан список, содержащий не менее 10 записей, каждая из которых имеет структуру: Шифр товара Наименование Цена (в руб.) Количество тип строка тип строка вещественное экземпляров 5 символов 20 символов число целое число 2. Разработать программу, выполняющую следующие функции: - ввод данного списка в массив записей; - вывод массива записей на экран; - поиск товаров, имеющих цену меньше 20000 руб. и количеством экземпляров больше 100 с выводом найденных записей на экран. Вариант 3 1. Дан список, содержащий не менее 10 записей, каждая из которых имеет структуру: Номер рейса Пункт отправления Пункт назначения Дни тип строка тип строка тип строка полетов 5 символов 10 символов 10 символов от 1 до 7
2. Разработать программу, выполняющую следующие функции: - ввод данного списка в массив записей; - вывод массива записей на экран; - поиск рейсов, вылетающих из города " Волгоград" в среду(3день) с выводом найденных записей на экран. Вариант 4 1. Дан список, содержащий не менее 10 записей, каждая из которых имеет структуру: Год Ф.И.О. Домашний адрес Номер участка тип строка тип строка тип рождения 15 символов 20 символов integer 1900..2000 2. Разработать программу, выполняющую следующие функции: - ввод данного списка в массив записей; - вывод массива записей на экран; - поиск всех граждан из списка, родившихся до 1950 года и номером участка = 55 с выводом найденных записей на экран. Вариант 5 1. Дан список, содержащий не менее 10 записей, каждая из которых имеет структуру: Шифр товара Наименование товара Цена(руб.) Признак тип строка тип строка число типа наличия или 5 символов 20 символов real отсутствия 2. Разработать программу, выполняющую следующие функции: - ввод данного списка в массив записей; - вывод массива записей на экран; - поиск всех товаров, имеющихся в наличии и цена которых не превышает 15000 руб., с выводом найденных записей на экран. Вариант 6 1. Дан список, содержащий не менее 10 записей, каждая из которых имеет структуру: Ф.И.О. Факультет Группа Год рождения 20 символов 5 символов 6 символов целое число 2. Разработать программу, выполняющую следующие функции: - ввод данного списка в массив записей; - вывод массива записей на экран; - поиск всех студентов, группы " 97ВС1", родившихся в 1979 году с выводом найденных записей на экран. Вариант 7 1. Дан список, содержащий не менее 10 записей, каждая из которых имеет структуру:
Ф.И.О. авторов Название Год Шифр тип строка тип строка издания строка 20 символов 20 символов целое 8 символов 2. Разработать программу, выполняющую следующие функции: - ввод данного списка в массив записей; - вывод массива записей на экран; - поиск книг, названия которых начинаются с буквы " П" и изданных до 1990 года с выводом найденных записей на экран. Вариант 8 1. Дан список, содержащий не менее 10 записей, каждая из которых имеет структуру: Ф.И.О. авторов Название Год Шифр тип строка тип строка издания строка 20 символов 20 символов целое 8 символов 2. Разработать программу, выполняющую следующие функции: - ввод данного списка в массив записей; - вывод массива записей на экран; - поиск книг, поле шифр которых начинаются с буквы " Т" и изданных после 1990 года с выводом найденных записей на экран. Вариант 9 1. Дан список, содержащий не менее 10 записей, каждая из которых имеет структуру: Номерр рейса Пункт отправления Пункт назначения Дни полетов тип тип строка тип строка integer 20 символов 10 символов от 1 до 7 2. Разработать программу, выполняющую следующие функции: - ввод данного списка в массив записей; - вывод массива записей на экран; - поиск всех рейсов с номерами большими, чем 50, и вылетающими в " Краснодар", с выводом найденных записей на экран. Вариант 10 1. Дан список, содержащий не менее 10 записей, каждая из которых имеет структуру: Ф.И.О. Домашний адрес Номер участка Год тип строка тип строка тип рождения 15 символов 30 символов integer 1900..2000 2. Разработать программу, выполняющую следующие функции: - ввод данного списка в массив записей; - вывод массива записей на экран; - поиск всех граждан, родившихся до 1970 года и фамилия которых
начинается с буквы " П" с выводом найденных записей на экран. Вариант 11 1. Дан список, содержащий не менее 10 записей, каждая из которых имеет структуру: Шифр книги Ф.И.О. авторов Название Год тип строка тип строка тип строка издания 5 символов 20 символов 15 символов целое 2. Разработать программу, выполняющую следующие функции: - ввод данного списка в массив записей; - вывод массива записей на экран; - поиск книг, изданных до 1950 году и шифром " СС11" с выводом найденных записей на экран. Вариант 12 1. Дан список, содержащий не менее 10 записей, каждая из которых имеет структуру: Шифр товара Наименование Цена(в руб.) Количество тип строка тип строка вещественное экземпляров 5 символов 20 символов число целое число 2. Разработать программу, выполняющую следующие функции: - ввод данного списка в массив записей; - вывод массива записей на экран; - поиск товаров, имеющих цену не меньше 20000 руб. и количеством экземпляров больше 180 с выводом найденных записей на экран. Вариант 13 1. Дан список, содержащий не менее 10 записей, каждая из которых имеет структуру: Номер рейса Пункт отправления Пункт назначения Дни тип строка тип строка тип строка полетов 5 символов 12 символов 10 символов от 1 до 7 2. Разработать программу, выполняющую следующие функции: - ввод данного списка в массив записей; - вывод массива записей на экран; - поиск рейсов, вылетающих из города " Владивосток" в 1 или 3 день недели с выводом найденных записей на экран. Вариант 14 1. Дан список, содержащий не менее 10 записей, каждая из которых имеет структуру: Ф.И.О. Домашний адрес Номер участка Год тип строка тип строка тип рождения
15 символов 20 символов integer 1900..2000 2. Разработать программу, выполняющую следующие функции: - ввод данного списка в массив записей; - вывод массива записей на экран; - поиск всех граждан из списка, родившихся до 1980 года и номером участка не более 100 с выводом найденных записей на экран. Вариант 15 1. Дан список, содержащий не менее 10 записей, каждая из которых имеет структуру: Шифр товара Наименование товара Цена(руб.) Признак тип строка тип строка число типа наличия или 5 символов 20 символов real отсутствия 2. Разработать программу, выполняющую следующие функции: - ввод данного списка в массив записей; - вывод массива записей на экран; - поиск всех товаров, которых нет в наличии и имеющих цену, не меньше 25000 руб. с выводом найденных записей на экран. Вариант 16 1. Дан список, содержащий не менее 10 записей, каждая из которых имеет структуру: Ф.И.О. Факультет Группа Год рождения 20 символов 5 символов 6 символов целое число 2. Разработать программу, выполняющую следующие функции: - ввод данного списка в массив записей; - вывод массива записей на экран; - поиск всех студентов, группы " 97ВС2", родившихся до 1980 году с выводом найденных записей на экран. Вариант 17 1. Дан список, содержащий не менее 10 записей, каждая из которых имеет структуру: Ф.И.О. авторов Название Год Шифр тип строка тип строка издания строка 20 символов 20 символов целое 8 символов 2. Разработать программу, выполняющую следующие функции: - ввод данного списка в массив записей; - вывод массива записей на экран; - поиск книг, фамилии авторов которых начинаются с буквы " В", и изданных после 1990 года с выводом найденных записей на экран. Вариант 18
1. Дан список, содержащий не менее 10 записей, каждая из которых имеет структуру: Ф.И.О. авторов Название Год Шифр тип строка тип строка издания строка 20 символов 20 символов целое 8 символов 2. Разработать программу, выполняющую следующие функции: - ввод данного списка в массив записей; - вывод массива записей на экран; - поиск книг, поле шифр которых начинаются с буквы " Т" и изданных в 1990 году с выводом найденных записей на экран. Вариант 19 1. Дан список, содержащий не менее 10 записей, каждая из которых имеет структуру: Номер рейса Пункт отправления Пункт назначения Дни тип тип строка тип строка полетов integer 20 символов 10 символов от 1 до 7 2. Разработать программу, выполняющую следующие функции: - ввод данного списка в массив записей; - вывод массива записей на экран; - поиск всех рейсов с номерами меньшими, чем 100 и вылетающими в из пункта " Краснодар" с выводом найденных записей на экран. Вариант 20 1. Дан список, содержащий не менее 10 записей, каждая из которых имеет структуру: Ф.И.О. Домашний адрес Номер участка Год тип строка тип строка тип рождения 15 символов 30 символов integer 1900..2000 2. Разработать программу, выполняющую следующие функции: - ввод данного списка в массив записей; - вывод массива записей на экран; - поиск всех граждан, родившихся после 1970 года и фамилия которых начинается с буквы " А" с выводом найденных записей на экран.
16 Подпрограммы
При разработке сложных программ используют так называемый структурный подход к программированию и нисходящее проектирование программ, когда сложная программ разбивается на более (или менее) функционально-законченные части, каждая из которых проще исходной программы. Такие программы легче отлаживать и использовать. Отдельные части программы называют подпрограммами. Использование подпрограмм наиболее эффективно в тех случаях, когда одна и та же подпрограмма может использоваться в программе не один раз, возможно с различными параметрами. Это позволяет экономить память компьютера. Подпрограммы, в свою очередь, могут разбиваться на более мелкие части, реализуемые также в виде подпрограмм более низкого уровня. В языке Турбо Паскаль используют подпрограммы двух типов: процедуры (Procedure) и функции (Function). Подпрограммы по структуре сходны с программой, но они обязательно имеют оригинальное имя, которое указывается в заголовке. Подпрограммы описываются в разделе описаний, использующих (вызывающих) их программ (или подпрограмм). 16. 1 Процедуры. Описание процедур. Область действия имён Локальные и глобальные параметры Описание процедур в Паскале имеет вид: Procedure Имя процедуры (формальные параметры); Раздел описаний Begin Раздел операторов End; Формальные параметры вместе с круглыми скобками могут отсутствовать. Формальные параметры представляют собой список переменных с указанием их типа. Все типы, используемые в заголовках процедур и функций (кроме простых), должны быть описаны в подразделе Type программной единицы, вызывающей эти процедуры или функции. Те параметры, которые изменяются в процедуре, называют выходными и перед ними в заголовке процедуры обязательно ставится слово Var. Параметры, имеющие файловый тип, должны быть обязательно описаны как Var параметры и в процедурах и в функциях. Вызов процедуры в использующих ее программных единицах (основной программе или подпрограммах) имеет следующий вид: Имя процедуры (фактические параметры); Фактические параметры могут отсутствовать вместе со скобками, в том случае, если нет формальных параметров в описании указанной процедуры.
Если параметры все же необходимы, то между фактическими и формальными параметрами должно быть установлено соответствие по их количеству, порядку следования и типу данных. Имена фактических и формальных параметров могут быть как одинаковыми, так и различными. Пусть в программе две процедуры Р1 и Р2 вызываются из основной программы. В свою очередь в процедуре Р1 используется процедура Р11 и она должна быть описана в разделе описаний вызывающей ее процедуры Р1. Раздел описаний основной программы Procedure P1; Раздел описаний процедуры P1 Procedure P11 Раздел описаний процедуры P11 Begin Раздел операторов процедуры P11 End; Begin Раздел операторов процедуры P1 End; Procedure P2; Раздел описаний процедурв P2 Begin Раздел операторов процедуры P2 End; BEGIN Раздел операторов основной программы END.
Имена, объявленные в разделе описаний основной программы, действуют в разделе операторов основной программы и в любой подпрограмме. Эти имена называются глобальными. Имена, объявленные в какой-либо подпрограмме, действуют в этой подпрограмме и в любой, объявленной в ней процедуре или функции. Такие имена называются локальными. Они недоступны для операторов основной программы. Область действия меток переходов в пределах каждой программной единицы своя. Нельзя перейти по оператору GOTO из одной процедуру в другую. Рассмотрим пример разработки программы, содержащей две процедуры, каждая из которых используется дважды с различными фактическими параметрами. Даны два массива М1 и М2, содержащие К1 и К2 целых чисел, соответственно. Определить максимальные числа в каждом из этих массивов, сравнить найденные значения между собой и вывести большее из них на экран. Схема алгоритма Начало
Ввод К1 М1
нет
Мах1> Max2 да
Ввод К2 М2
Вывод Мах1
Поиск Мах1 в М1
Вывод Мах2
Поиск Мах2 в М2
Конец
Выделим глобальные переменные, которые используются в главной программе: М1, М2, К1, К2, Мах1, Мах2. Текст программы Uses crt;
Type Tmas=array[1..1000] of integer; Var M1, M2: Tmas; K1, K2, Max1, Max2 : integer; { Процедура ввода длины массива и самого массива } Procedure Vvod(Var K:integer; Var M:Tmas); Var i:integer; Begin Write(' Введите длину массива'); Readln(K); Writeln(' Введите элементы массива целых чисел, через пробел'); For i:=1 to K do Read(M[i]); readln; End; { конец процедуры ввода} { Процедура поиска максимального элемента в массиве} Procedure Poisk_max(K:integer; M:Tmas; Var Max:integer); Var i:integer; Begin Max:=M[1]; { За максимум принимаем первый элемент} For i:=2 to K do If M[i]>Max then Max:=M[i]; {Запоминаем новый максимум} End; { Начало основной программы} Begin Clrscr; Writeln(' Ввод первого массива'); Vvod(K1, M1); Writeln(' Ввод второго массива'); Vvod(K2,M2); Poisk_max(K1, M1, Max1); Poisk_max(K2, M2, Max2); If Max1>Max2 then writeln(' Max1 больше и оно = ',Max1) Else writeln(' Max2 больше и оно = ',Max2); Readkey; { Останов для просмотра результатов} End. Лабораторная работа №8 Цель работы: 1. Получить навыки разработки программ с использованием процедур Типовое задание
Для задания из лабораторной работы №7 разработать программу с использованием процедур: оформить в виде процедур каждый из пунктов задания. 16.2 Подпрограммы типа FUNCTION, их описание Подпрограммы - функции (Function) имеют следующие отличительные особенности (по сравнению с процедурами): 1. Функция имеет только один результат выполнения. Этот результат обозначается именем функции и передается в вызвавщую эту функцию программную единицу. 2. Для функции обязательно указывается ее тип. Тип может быть простым (скалярным) или строковым. Описание функции в Паскале имеет вид: Function Имя функции (формальные параметры):Тип результата; Раздел описаний Begin Раздел операторов End; Вызов функции производится по ее имени с указанием фактических параметров. Аналогично процедурам, фактические и формальные параметры в функции могут отсутствовать. Правила использования фактических и формальных параметров, а также локальных и глобальных переменных, совпадают с использованием их в процедурах. Если функция кроме выдачи своего значения меняет значения какихлибо глобальных переменных, то говорят, что она имеет побочный эффект. Рассмотрим пример создания программ с использованием функций. Пусть необходимо произвести следующие вычисления: n
S=
m
∑x +∑y i =1
i
j =1 m
an + b
j
,
где a, b, n, m - целые переменные; {xi}, {yj} - массивы, содержащие n и m соответственно.
вещественных чисел,
В Паскале нет стандартных функций сумммирования элементов массива и возведения чисел в степень больше 2. Разработаем свои функции для решения этих задач и будем использовать их для решения поставленной задачи. Текст программы Uses crt; Type Tmas=array[1..100] of real; Var a,b,n,m,i,j:byte; X,Y:Tmas; S:Real; Function Summa(Dlmas:byte; Mas:Tmas):Real; Var Sum:real; i:byte; Begin Sum:=0.0; For i:=1 to Dlmas do Sum:=Sum+Mas[i]; Summa:=Sum; End; Function step(Pok:byte;Osn:byte):real; Var i:byte; St:real; Begin St:=Osn; For i:=2 to Pok do St:=St*Osn; step:=St; End; { Главная программа} BEGIN Write(' Введите длину первого массива - N '); Readln(N); Write(' Введите длину второго массива - M '); Readln(M); Writeln(' Введите элементы массива X'); For i:=1 to N do Read(X[i]); readln; Writeln(' Введите элементы массива Y'); For j:=1 to M do Read(Y[j]); readln; Write(' Введите a и b '); Readln(a,b); S:=(Summa(N,X)+Summs(M,Y))/(step(N,a)+step(M,b)); Writeln(' Полученный результат S = ',S);readkey; END.
Рекурсии Рекурсия - это такой способ организации вычислительного процесса, при котором подпрограмма обращается сама к себе. Такая рекурсия называется прямой. Рекурсии позволяют писать более короткие программы, но при выполнении они работают медленнее и могут вызвать переполнение стека, так как при каждом входе в подпрограмму ее локальные переменные размещаются в программном стеке, размер которого ограничен. Типичным примером прямой рекурсии является вычисление n!.
n!= 1 ⋅ 2 ⋅ 3 ⋅ ... ⋅ (n − 1) ⋅ n
Текст программы с использованием прямой рекурсии для вычисления n!. Var n:integer; {Рекурсивная функция} Function Fact(n:integer):real; Begin If n=0 then Fact:=1 Else Fact:=n*Fact(n-1); End; { Главная программа} Begin Repeat Writeln(' Введите положительное n<=33'); Readln(n); Writeln(Fact(n)); Until Eof; End. Примечание: для выхода из этой программы можно задать значение n>33 или нажать Ctrl/z и Enter. При n>33 возникает переполнение при умножение чисел с плавающей запятой. Рекурсивный вызов может быть также косвенным. В этом случае подпрограмма обращается к себе опосредованно, путем вызова другой подпрограммы, в которой, в свою очередь, содержится обращение к первой. Такой вызов иногда называют закольцованным. Для реализации такой возможности в ТР используется опережающее описание процедур и функций и директива Forward. Для этого в самом начале программы вставляют только заголовки процедуры или функции в виде: Procedure имя-процедуры(параметры);Forward; или Function имя_функции(параметры);Forward; Позже, в необходимых местах, описываются сами процедуры или функции в обычном виде и в их заголовке параметры уже указывать не нужно.
Например: процедура с именем А вызывает процедуру с именем В, а процедура В, в свою очередь, вызывает процедуру А. Procedure A(y:тип);Forward; {Опережающее описание процедуры А} Procedure B(x:тип); { Заголовок процедуры В} . . . {Раздел описаний процедуры В} begin ... A(p); {Вызов процедуры А из В} ... end; Procedure A; {Основное описание процедуры А} ... {Раздел описаний процедуры А} Begin ... B(g); {Вызов процедуры В из А} ... End; Лабораторная работа №9 Цель работы: Преобрести навыки разработки программ использованием функций, представленных в теоретической части.
с
Типовое задание Составить программу, максимально используя заданных выражений, подпрограммы типа FUNCTION.
для
Варианты заданий t
m
yj
n F x a = ( + ) +∑ m ∑ i 1. c i =1
j =1
2.
F=
( a + b) n m
∑ ((a + b)
m
j =1
n
m
yk n F x a = + + ∑ ∑ i 3. аc m i =1
k =1
4.
F=
(a m − b n ) m
∑ ((a − b)
m
j =1
t
5. F =
∑ (x − c ) i =1 t +2
с
k
t
i
⋅ (t − 2)!
6. F =
− yj)
∑ (x i =1
i
− c) k
c!−(k − c)!
− yj)
вычисления
s
7.
(n + m)!
F = (a n + b m ) +
p
t
∑ zk − ∑ s j k =1
F=
8.
j =1
∑ (x i =1 n
∑ (a k =1
n
9.
F=
a −b k
k
∑ (x
i
i =1
11.
F=
t
t
+ b)
+ ∑ ( yi + a )
∑ (a i =1
F=
i
i =1
k
xi − b)
n
k
+ ∑ (b yi − a )
i =1
− bk ) n − n!
− yi ) n − (n + 3)!
F=
12.
− bk ) n − n!
k
a k + bt
m
t
+ ∑ yi
k
∑x i =1
i =1
i
a⋅ yj F x y ( ) = + + ∑ ∑ i i m 14. i =1 j =1 c
yj
m
13. F = ∑ ( xi − c) + ∑ c m n
k
∑ (a
t
i =1
− y i ) s + s!
n
k =1
a k + 2 + b t −2 t
10.
i =1
∑ (x
i
j =1
n
n
k
t
15.
m
F = ∑ ( xi + a ⋅ t )t + ∑ i =1 n
j =1
c⋅ yj m
m
n
yk F = x + + n! ∑ ∑ i m n 17. i =1 k =1 а + c k
19. F =
∑ (c − x ) i =1 k
20.
F=
k
i
i =1
c!−k! m
yk = ( + ) + F x a ∑ ∑ i 18. аm n
i =1
k
i
с ⋅ (c!−k!)
16. F =
(a + c ) t
∑ (c + x )
a k + bt k
∑ (x i =1
i
− b)
k =1
t
+ ∑ yi i =1
Примечание: При разработке программ не забывайте анализировать область допустимых значений функций.
17. Задача сортировки: алгоритмы и программы Сортировка данных при решении задач на ЭВМ занимает значительную часть времени. В настоящее время разработано большое число алгоритмов сортировки (упорядочения), отличающихся друг от друга различными признаками: сложностью алгоритма, временем решения, затратами памяти ЭВМ, числом сортируемых элементов, до какой степени элементы уже отсортированы, где располагаются сортируемые данные: во внешней памяти
(например, на диске) или в оперативной памяти. Очевидно, что с отсортированными данными работать легче, чем с произвольно расположенными данными. Когда элементы отсортированы, их проще найти или определить, что их нет среди данных. Наиболее простыми алгоритмами сортировки считаются алгоритмы, известные в литературе под названиями - обменная (или пузырьковая) сортировка и сортировка выбором. Эти алгоритмы, в худшем случае, решают задачу сортировки за время пропорциональное N2, где N - число сортируемых элементов. Такие алгоритмы называют алгоритмами с квадратичной сложностью. Эти алгоритмы используют, когда число сортируемых элементов относительно не велико (до 1000). Для сортировки данных больших объемов используют более сложные, с точки зрения реализации, алгоритмы. Сложность этих алгоритмов определяется по формулам: N*lnN или N*log2N. Такие алгоритмы называют алгоритмами с логарифмической сложностью или быстрой сортировки. Эти алгоритмы используют чаще всего при сортировке данных в оперативной памяти, например в массивах или в динамических списках. Для сортировки данных во внешней памяти можно использовать алгоритм сортировки слиянием. Кроме перечисленных алгоритмов существует большое число других алгоритмов, с которыми можно ознакомиться, например, в [2,3]. 17.1 Сортировка выбором В литературе описано несколько различных модификаций сортировки выбором, но суть их всех заключается в том, что на очередном шаге выбирается необходимый элемент, и он помещается на заданное место в сортируемой последовательности. Рассмотрим одну их модификаций сортировки выбором. Пусть дан одномерный неупорядоченный массив, содержащий целые числа М={mi}, i=1,n; n - число элементов. Необходимо упорядочить элементы этого массива по возрастанию их значений. На первом шаге из элементов массива выбирается минимальный, и он меняется местами с элементом, стоящем на первом месте. На втором шаге из оставшихся неупорядоченных элементов, начиная со второго, выбирается следующий минимальный элемент, и он меняется местами с элементом, стоящем на втором месте. Процесс повторяется до тех пор, пока не будут переставлены все элементы. Последний элемент можно не проверять, так как к этому времени все элементы уже будут стоять на своих местах. В том случае, если требуется упорядочить элементы по убыванию их значений, осуществляется поиск и перемещение максимального элемента. Рассмотрим работу алгоритма по схеме.
Схема алгоритма сортировки выбором
Начало Ввод n и M[i], i=1,n
Обмен M[i_min]:= M[i]
Цикл i=1,n-1
M[i]:=Min
Min:=M[i] i_min:=i
нет
Цикл j=i+1,n
Вывод нового M
M[j]< Min
Конец да
Min:=M[j] i_min:=j
Min - минимальный элемент i_min - адрес минимального элемента Текст программы сортировки выбором
Uses crt; Var M:array[1..1000] of integer; n, i, j, Min, i_min:integer; Begin Clrscr;
Write(' Введите длину массива n = '); Readln(n); { Вместо ввода с клавиатуры заполним массив случайными числами из диапазона от 0 до 500} For i:=1 to n do M[i]:=Random(500); For i:=1 to n-1 do Begin {принимаем за минимум i-й элемент} Min:=M[i]; i_min:=i; For j:=i+1 to n do If M[j]<Min then Begin {найдено меньшее число - запоминаем его и его адрес} Min:=M[j]; i_min:=j; End; {Обмен} M[i_min]:=M[i]; M[i]:=Min; End; Writeln(' Упорядоченный массив'); For i:=1 to n do write(M[i],' '); readkey; End.
17.2 Обменная сортировка Обменная сортировка основывается на последовательном сравнении двух рядом стоящих элементов и если порядок следования нарушен, элементы меняются местами. Сравнения производятся до тех пор, пока при очередном цикле просмотра всех рядом стоящих пар элементов, ни одна пара элементов не менялась местами. В том случае, если элементы массива уже упорядочены, алгоритм закончит свою работу после одного цикла просмотра всех рядом стоящих пар. Просмор пар может начинаться с начала массива или с его конца, в последнем случае алгоритм называют алгоритмом пузырьковой сортировки. Подробнее об этом можно ознакомиться в [2,3]. Рассмотрим работу алгоритма по схеме. Схема алгоритма обменной сортировки
Начало
Обмен Z= M[i] M[i]=M[i+1]
Ввод данных
M[i+1]=Z Key=1
А Key=0
Key=0
нет
да А Цикл i=1,n-1
нет
M[i]> M[i+1]
Вывод нового М
да
Конец
Key - ключ, определяющий была ли перестановка пар элементов; Z - переменная, необходимая для хранения промежуточного элемента при перестановке. Текст программы обменной сортировки Uses crt; Var M:array[1..1000] of integer; i,Z,n:integer; Key:byte; Begin Clrscr; {Ввод n и формирование массива М как в предыдущей программе} Repeat
Key:=0; For i:=1 to n-1 do If M[i] > M[i+1] then begin Z:=M[i]; M[i]:=M[i+1]; M[i+1]:=Z; Key:=1; end; Until Key=0; Writeln(' Упорядоченный массив'); For i:=1 to n do write(M[i],' '); readkey; End. 17.3 Сортировка слиянием Алгоритм сортировки слиянием используется в тех случаях, когда данные расположены на внешних носителях информации или сортируется данные очень большого объема, которые невозможно расположить в оперативной памяти целиком. В этом случае данные могут быть сохранены, например, в отдельных файлах, таких размеров, которые могут быть помещены в оперативную память, например в массивы. Производится загрузка данных из файлов в массивы и сортировка данных каждого из массивов отдельно. Упорядоченные данные снова записываются в файлы. Затем производится сортировка слиянием уже упорядоченных данных, расположенных в отдельных файлах. Поскольку мы пока не знакомы с работой с файлами в ТР, рассмотрим алгоритм сортировки слиянием на примере слияния двух предварительно упорядоченных массивов Х и Y в один массив Z. Данные в массивах расположены в порядке возрастания их значений. Обзначим через переменные dx, dy - длину (размер) массивов X, Y соответственно. Переменные ix, iy - счетчики (адреса) тех же массивов. Переменная iz - счетчик числа элементов нового массива Z. Схема алгоритма сортировки слиянием Начало Ввод dx, dy, X, Y
ix:=1; iy:=1; iz:=0;
X[ix]≤ Y[iy]
нет да
iz:=iz+1; Z[iz]:=X[ix]; ix:=ix+1; да
iz:=iz+1; Z[iz]:=Y[iy]; iy:=iy+1; да
iy≤dy
ix≤dx нет
нет
Цикл i:=iy,dy
Цикл i:=ix,dx
iz:=iz+1; Z[iz]:=Y[i]
iz:=iz+1; Z[iz]:=X[i]
Вывод Конец Z[i],i:= 1,iz Текст программы сортировки слиянием Uses crt; Var { Описание массивов и переменных} X, Y: array[1..1000] of integer; Z: array[1..2000] of integer; dx,dy,ix,iy,iz,i:integer; Begin Clrscr; { Ввод данных} Write(' Введите длину массива Х '); readln(dx);
Writeln(' Введите упорядоченный по возрастанию массив Х'); For i:=1 to dx do read(X[i]); readln; Write(' Введите длину массива Y '); readln(dy); Writeln(' Введите упорядоченный по возрастанию массив Y'); For i:=1 to dy do read(Y[i]); readln; ix:=1; iy:=1; iz:=0; While (ix<=dx) and (iy<=dy) do if X[ix]dx then { Переписан массив Х, дописываем все for i:=iy to dy do begin inc(iz); Z[iz]:=Y[i]; end else { Переписан массив Y, дописываем все оставшееся из X } for i:=ix to dx do begin inc(iz); Z[iz]:=X[i]; end; { Вывод результата слияния на экран} writeln(' Полученный массив Z'); for i:=1 to iz do write(Z[i],' '); readln; End. Лабораторная работа №10 Цель работы: 1. Изучить алгоритмы сортировки. 2. Приобрести навыки программирования различных типов.
задач
сортировки
данных
Типовое задание Разработать схему алгоритма и программу решения задачи с использованием алгоритмов сортировки.
Варианты самостоятельных заданий Вариант 1 Дана квадратная матрица размером n x n, содержащая вещественные числа. Определить сумму элементов в каждой строке матрицы и упорядочить номера строк по убыванию значений найденных сумм с помощью алгоритма сортировки выбором. Вывести упорядоченный список номеров строк и соответствующих им сумм. Вариант 2 Дана прямоугольная матрица размером n x м, содержащая вещественные числа. Определить сумму элементов в каждой строке матрицы. Упорядочить номера строк по убыванию значений найденных сумм с помощью алгоритма сортировки обменом. Вывести упорядоченный список номеров строк и соответствующих им сумм. Вариант 3 Дана прямоугольная матрица размером n x м, содержащая вещественные числа. Определить сумму положительных элементов в каждой строке матрицы и упорядочить номера строк по возрастанию значений найденных сумм с помощью алгоритма обменной сортировки. Вывести упорядоченный список номеров строк и соответствующих им сумм. Вариант 4 Дана квадратная матрица размером n x n, содержащая вещественные числа. Определить сумму элементов в каждом столбце матрицы и упорядочить номера столбцов по убыванию значений найденных сумм с помощью сортировки выбором. Вывести упорядоченный список номеров столбцов и соответствующих им сумм. Вариант 5 Даны два одномерных массива, содержащие вещественные числа. Упорядочить по убыванию значений каждый из массивов с помощью алгоритма сортировки выбором, а затем получить новый массив, содержащий элементы двух заданных массивов также упорядоченный по убыванию, используя алгоритм сортировки слиянием. Вариант 6
Дана квадратная матрица размером n x n, содержащая вещественные положительные числа. Определить сумму четных элементов в каждом столбце матрицы и упорядочить номера столбцов по убыванию значений найденных сумм с помощью обменной сортировки. Вывести упорядоченный список номеров столбцов и соответствующих им сумм. Вариант 7 Дана квадратная матрица размером n x n, содержащая целые положительные числа. Определить сумму элементов в каждой строке матрицы и упорядочить номера строк по убыванию значений найденных сумм с помощью алгоритма сортировки выбором. Вывести упорядоченный список номеров строк и соответствующих им сумм. Вариант 8 Дана прямоугольная матрица размером n x м, содержащая целые положительные числа. Определить сумму элементов в каждой строке матрицы и упорядочить номера строк по убыванию значений найденных сумм с помощью алгоритма сортировки обменом. Вывести упорядоченный список номеров строк и соответствующих им сумм. Вариант 9 Дана прямоугольная матрица размером n x м, содержащая целые числа. Определить сумму положительных элементов в каждой строке матрицы и упорядочить номера строк по возрастанию значений найденных сумм с помощью алгоритма обменной сортировки. Вывести упорядоченный список номеров строк и соответствующих им сумм. В а р и а н т 10 Дана квадратная матрица размером n x n, содержащая целые положительные числа. Определить сумму элементов в каждом столбце матрицы и упорядочить номера столбцов по убыванию значений найденных сумм с помощью сортировки выбором. Вывести упорядоченный список номеров столбцов и соответствующих им сумм. В а р и а н т 11 Даны два одномерных массива, содержащие целые числа. Упорядочить по убыванию значений каждый из массивов с помощью алгоритма сортировкивыбором, а затем получить новый массив, содержащий элементы
двух заданных массивов также упорядоченный по убыванию, используя алгоритм сортировки слиянием. В а р и а н т 12 Дана квадратная матрица размером n x n, содержащая целые положительные числа. Определить сумму четных элементов в каждом столбце матрицы и упорядочить номера столбцов по убыванию значений найденных сумм с помощью обменной сортировки. Вывести упорядоченный список номеров столбцов и соответствующих им сумм. В а р и а н т 13 Дан массив, состоящий из записей. Каждая запись содержит два поля: 1 - табельный номер (целое число в диапазоне от 0 до 999) и 2 - фамилия (символьное поле длиной 20). Упорядочить массив записей по убыванию значений табельных номеров с помощью алгоритма сортировки выбором и вывести новый массив. В а р и а н т 14 Дан массив, состоящий из записей. Каждая запись содержит два поля: 1 - табельный номер (целое число в диапазоне от 0 до 999) и 2 - фамилия (символьное поле длиной 20). Упорядочить массив записей по убыванию значений табельных номеров с помощью алгоритма обменной сортировки и вывести новый массив. В а р и а н т 15 Дан массив, состоящий из записей. Каждая запись содержит два поля: 1 - табельный номер (целое число в диапазоне от 0 до 999) и 2 - фамилия (символьное поле длиной 20). Упорядочить массив записей по возрастанию значений табельных номеров с помощью алгоритма обменной сортировки и вывести новый массив. В а р и а н т 16 Дан массив, состоящий из записей. Каждая запись содержит два поля: 1 - табельный номер (целое число в диапазоне от 0 до 999) и 2 - фамилия (символьное поле длиной 20). Упорядочить массив записей по возрастанию значений табельных номеров с помощью алгоритма сортировки выбором и вывести новый массив.
В а р и а н т 17 Дан массив, состоящий из записей. Каждая запись содержит два поля: 1 - табельный номер (целое число в диапазоне от 0 до 9999) и 2 - фамилия (символьное поле длиной 30). Упорядочить массив записей по полю фамилия (в алфавитном порядке) с помощью алгоритма сортировки выбором и вывести новый массив. В а р и а н т 18 Дан массив, состоящий из записей. Каждая запись содержит два поля: 1 - табельный номер (целое число в диапазоне от 0 до 9999) и 2 - фамилия (символьное поле длиной 30). Упорядочить массив записей по полю фамилия (в алфавитном порядке) с помощью алгоритма обменной сортировки и вывести новый массив. В а р и а н т 19 Дан массив, состоящий из записей. Каждая запись содержит два поля: 1 - табельный номер (целое число в диапазоне от 0 до 9999) и 2 - фамилия (символьное поле длиной 30). Упорядочить массив записей по полю фамилия (в порядке обратном алфавитному) с помощью алгоритма обменной сортировки и вывести новый массив. В а р и а н т 20 Дан массив, состоящий из записей. Каждая запись содержит два поля: 1 - табельный номер (целое число в диапазоне от 0 до 9999) и 2 - фамилия (символьное поле длиной 30). Упорядочить массив записей по полю фамилия (в порядке обратном алфавитному) с помощью алгоритма сортировки выбором и вывести новый массив.
Задача поиска: алгоритмы и программы Наряду с задачей сортировки актуальной при работе с данными большого объема является поиск данных по заданному признаку. Если данные не упорядочены, то для поиска приходится просматривать весь объем информации. В том случае, если данные упорядочены, для поиска используют один из двух известных алгоритмов поиска: линейный и двоичный поиск. Рассмотрим эти алгоритмы и реализующие их программы.
Пусть задан массив Х, содержащий n целых чисел, расположенных в порядке возрастания значений. Требуется найти заданное число isk. 18.1 Линейный поиск Линейный поиск заключается в последовательном сравнении элементов упорядоченного массива Х с искомым значением isk. Поиск заканчивается в двух случаях: 1. Очередной элемент массива Х равен искомому значению isk, в этом случае элемент найден. 2. Очередной элемент массива Х больше искомого значения, а так как все последующие элементы также больше isk, то искомого элемента не может быть в Х. Схема алгоритма линейного поиска
Цикл i=1,n
Начало
нет
Ввод данных n,X,isk нет
X[i] > isk
да
X[i] = isk
Элемента найден
да Элемента нет
Конец
В худшем случае для поиска заданного элемента алгоритмом линейного поиска приходится проводить n сравнений, т.е. временная сложность алгоритма ∼ n. Текст программы линейного поиска Uses crt; Var
X:array[1..10000] of integer; i, n, isk:integer; Begin write(' Введите число элементов в массиве - n '); readln(n); write(' Введите элементы массива Х '); for i:=1 to n do read(X[i]); writeln; write(' Введите искомое число'); readln(isk); for i:=1 to n do if X[i]=isk then begin writeln(' Элемент найден по адресу i = ' ,i ); readln; exit end else if X[i]>isk then break; writeln(' Заданного элемента нет'); readln; End. 18.2 Двоичный поиск Двоичный поиск заключается в следующем: вычисляется середина массива и элемент xi, находящийся по найденному адресу, сравнивается с искомым. Если элементы xi и isk равны, то поиск закончен. Если xi < isk, то искомый элемент может находиться в последующей xi части массива, в противном случае поиск надо осуществлять в предшествующей xi части массива. Такой подход позволяет сократить число просматриваемых элементов в 2 раза. Далее в выделенной части массива также определяется средний элемент, и он сравнивается с искомым. Подобная процедура повторяется до тех пор, пока ни будет найден заданный элемент или пока не совпадут начальный и конечный адрес просматриваемой, на очередном шаге, части массива. Если эти адреса совпадут и к этому моменту элемент не найден, то его в массиве нет. Временная сложность алгоритма двоичного поиска ∼ log2n. Схема алгоритма двоичного поиска Начало
Ввод данных n,X,isk
First:=1 Last:=n
First - адрес начала просматриваемой части. Last - адрес конца просматриваемой части
Цикл Last ≥ First Элемент не найден
adr:=(First+ Last) div 2
<
=
isk : X[adr]
Конец
>
Last:=adr-1
First:=adr+1
Вывод элемента
Текст программы Uses crt; Var X:array[1..10000] of integer; isk,i,n,adr,First,Last:integer; Begin write(' Введите число элементов в массиве - n '); readln(n);
write(' Введите элементы массива Х '); for i:=1 to n do read(X[i]); writeln; write(' Введите искомое число'); readln(isk); First:=1; Last:=n; while First <= Last do begin adr:=(First+Last) div 2; if isk=X[adr] then begin writeln('Yes! isk = ',isk,' adr = ',adr); exit end else if isk<X[adr] then Last:=adr-1 else First:=adr+1; end; writeln(' Not found'); end. Лабораторная работа №11 Цель работы: 3. Изучить алгоритмы поиска. 4. Приобрести навыки программирования задач поиска данных различных типов. Типовое задание Разработать схему алгоритма и программу решения задачи поиска в массиве записей по заданным полям, с использованием алгоритмов линейного и двоичного поиска. Варианты самостоятельных заданий Вариант 1 Дан список, содержащий 10 записей, каждая из которых имеет структуру: Шифр книги Ф.И.О. авторов Название Год тип строка тип строка тип строка издания 5 символов 20 символов 15 символов целое Список упорядочен по возрастанию года издания. Разработать алгоритмы и программы линейного и двоичного поиска всех книг, изданных до 1960 год с выводом найденных записей на экран.
Вариант 2 Дан список, содержащий 10 записей, каждая из которых имеет структуру: Шифр товара Наименование Цена (в руб.) Количество тип строка тип строка вещественное экземпляров 5 символов 20 символов число целое число Список упорядочен по убыванию цены товара. Разработать алгоритмы и программы линейного и двоичного поиска всех товаров, имеющих цену меньше 20000 руб. с выводом найденных записей на экран. Вариант 3 Дан список, содержащий 10 записей, каждая из которых имеет структуру: Номер рейса Пункт отправления Пункт назначения Дни тип строка тип строка тип строка полетов 5 символов 10 символов 10 символов от 1 до 7 Список упорядочен по наименованию пунктов отправления (по алфавиту). Разработать алгоритмы и программы линейного и двоичного поиска рейсов, вылетающих из всех пунктов, наименование которых начинается с буквы "К" с выводом найденных записей на экран. Вариант 4 Дан список, содержащий 10 записей, каждая из которых имеет структуру: Год Ф.И.О. Домашний адрес Номер участка тип строка тип строка тип рождения 15 символов 20 символов integer 1900..2000 Список упорядочен по возрастанию года рождения. Разработать алгоритмы и программы линейного и двоичного поиска всех граждан из списка, родившихся до 1950 года с выводом найденных записей на экран. Вариант 5 Дан список, содержащий 10 записей, каждая из которых имеет структуру: Шифр товара Наименование товара Цена (руб.) Признак тип строка тип строка число типа наличия или 5 символов 20 символов real отсутствия Список упорядочен по убыванию цены товара. Разработать алгоритмы и программы линейного и двоичного поиска всех товаров, цена которых не превышает 15000 руб., с выводом найденных записей на экран. Вариант 6 Дан список, содержащий 10 записей, каждая из которых имеет структуру: Ф.И.О. Факультет Группа Год рождения
20 символов 5 символов 6 символов целое число Список упорядочен по убыванию года рождения. Разработать алгоритмы и программы линейного и двоичного поиска всех студентов, родившихся до 1979 года с выводом найденных записей на экран. Вариант 7 Дан список, содержащий 10 записей, каждая из которых имеет структуру: Шифр Ф.И.О. авторов Название Год тип строка тип строка издания строка 20 символов 20 символов целое 8 символов Список упорядочен по убыванию года рождения. Разработать алгоритмы и программы линейного и двоичного поиска книг, изданных до 1990 года с выводом найденных записей на экран. Вариант 8 Дан список, содержащий 10 записей, каждая из которых имеет структуру: Ф.И.О. авторов Название Год Шифр тип строка тип строка издания строка 20 символов 20 символов целое 8 символов Список упорядочен по возрастанию года издания. Разработать алгоритмы и программы линейного и двоичного поиска книг, изданных после 1990 года с выводом найденных записей на экран. Вариант 9 Дан список, содержащий 10 записей, каждая из которых имеет структуру: Номер рейса Пункт отправления Пункт назначения Дни тип тип строка тип строка полетов integer 20 символов 10 символов от 1 до 7 Список упорядочен по возрастанию номеров рейсов. Разработать алгоритмы и программы линейного и двоичного поиска всех рейсов с номерами большими, чем 50 с выводом найденных записей на экран. В а р и а н т 10 Дан список, содержащий 10 записей, каждая из которых имеет структуру: Ф.И.О. Домашний адрес Номер участка Год тип строка тип строка тип рождения 15 символов 30 символов integer 1900..2000 Список упорядочен оп убыванию года рождения. Разработать алгоритмы и программы линейного и двоичного поиск всех граждан, родившихся до 1970 года с выводом найденных записей на экран. В а р и а н т 11 Дан список, содержащий 10 записей, каждая из которых имеет структуру:
Шифр книги Ф.И.О. авторов Название Год тип строка тип строка тип строка издания 5 символов 20 символов 15 символов целое Список упорядочен по убыванию года издания. Разработать алгоритмы и программы линейного и двоичного поиска книг, изданных до 1950 году с выводом найденных записей на экран. В а р и а н т 12 Дан список, содержащий 10 записей, каждая из которых имеет структуру: Шифр товара Наименование Цена(в руб.) Количество тип строка тип строка вещественное экземпляров 5 символов 20 символов число целое число список упорядочен по возрастанию цены. Разработать алгоритмы и программы линейного и двоичного поиска товаров, имеющих цену не меньше 20000 руб. с выводом найденных записей на экран. В а р и а н т 13 Дан список, содержащий 10 записей, каждая из которых имеет структуру: Номер рейса Пункт отправления Пункт назначения Дни тип строка тип строка тип строка полетов 5 символов 12 символов 10 символов от 1 до 7 Список упорядочен по полю "Пункт назначения" (по алфавиту). Разработать алгоритмы и программы линейного и двоичного поиска рейсов, вылетающих в города, начинающиеся с буквы "В", с выводом найденных записей на экран. В а р и а н т 14 Дан список, содержащий 10 записей, каждая из которых имеет структуру: Ф.И.О. Домашний адрес Номер участка Год тип рождения тип строка тип строка 15 символов 20 символов integer 1900..2000 Список упорядочен по убыванию года рождения. Разработать алгоритмы и программы линейного и двоичного поиска всех граждан из списка, родившихся до 1980 года с выводом найденных записей на экран. В а р и а н т 15 Дан список, содержащий 10 записей, каждая из которых имеет структуру: Шифр товара Наименование товара Цена(руб.) Признак тип строка тип строка число типа наличия или 5 символов 20 символов real отсутствия Список упорядочен по возрастанию цены.
Разработать алгоритмы и программы линейного и двоичного поиска всех товаров, имеющих цену, не меньше 25000 руб. с выводом найденных записей на экран. В а р и а н т 16 Дан список, содержащий 10 записей, каждая из которых имеет структуру: Ф.И.О. Факультет Группа Год рождения 20 символов 5 символов 6 символов целое число Список упорядочен по убыванию года рождения. Разработать алгоритмы и программылинейного и двоичного поиска всех студентов, родившихся до 1980 года с выводом найденных записей на экран. В а р и а н т 17 Дан список, содержащий 10 записей, каждая из которых имеет структуру: Ф.И.О. авторов Название Год Шифр тип строка тип строка издания строка 20 символов 20 символов целое 8 символов Список упорядочен по возрастанию года издания. Разработать алгоритмы и программы линейного и двоичного поиска книг, изданных после 1990 года с выводом найденных записей на экран. В а р и а н т 18 Дан список, содержащий 10 записей, каждая из которых имеет структуру: Шифр Ф.И.О. авторов Название Год тип строка тип строка издания строка 20 символов 20 символов целое 8 символов Список упорядочен по полю "Шифр" (по алфавиту). Разработать алгоритмы и программы линейного и двоичного поиска книг, поле шифр которых начинаются с буквы " Т" с выводом найденных записей на экран. В а р и а н т 19 Дан список, содержащий 10 записей, каждая из которых имеет структуру: Номер рейса Пункт отправления Пункт назначения Дни тип тип строка тип строка полетов integer 20 символов 15 символов от 1 до 7 Список упорядочен по убыванию номеров рейсов. Разработать алгоритмы и программы линейного и двоичного поиска всех рейсов с номерами меньшими, чем 100 с выводом найденных записей на экран. В а р и а н т 20
Дан список, содержащий 10 записей, каждая из которых имеет структуру: Ф.И.О. Домашний адрес Номер участка Год тип строка тип строка тип рождения 15 символов 30 символов integer 1900..2000 Список упорядочен по возрастанию года рождения. Разработать алгоритмы и программы линейного и двоичного поиска всех граждан, родившихся после 1970 г. с выводом найденных записей на экран. Литература 1. В.В. Фаронов ТурбоПаскаль 7.0. Начальный курс. Учебное пособие. М.: «Нолидж», 1997 2. Вирт Н. Алгоритмы + структуры данных = программы.- М.: Мир, 1985 3. Кнут Д. Искусство программирования для ЭВМ. Т. 3. Сортировка и поиск.- М.:Мир, 1978.