лабораторные работы паскаль. Практикум по программированию на языке Паскаль Учебное пособие
Скачать 0.89 Mb.
|
Тема: “Сложный тип данных – множества” Цель работы 1. Получение навыков в задании переменных типа множество и организации ввода и вывода данных типа множество. 2. Получение практических навыков в выполнении операций над множествами. Краткие сведения из теории 9.1. Объявление переменной типа множества В математике под множеством понимается некоторый набор элементов. Например, множество фигур на плоскости (прямоугольник, круг, ромб, квадрат). К множествам применимы следующие операции: 1. Объединение множеств ( C = A ∪ B ). Каждый элемент множества C является элементом либо множества A, либо множества B. 2. Пересечение множеств ( C = A ∩ B ). Каждый элемент множества C является элементом множеств A и B одновременно. 3. Разность двух множеств ( C = A \ B ). Каждый элемент множества C является элементом множества A, но не является элементом множества B. Например: а) { круг, ромб } ∪ { круг, квадрат } = {круг, ромб, квадрат}; б) { круг} ∩ { круг, ромб, квадрат } = { круг }; в) { круг, ромб, квадрат } \ { круг, квадрат } = { ромб }. Под множеством в языке Турбо - Паскаль понимают ограниченный, неупорядоченный набор различных элементов одинакового типа. Множественный тип задается с помощью двух служебных слов SET и OF, после которых указывается базовый тип. В качестве базового типа можно использовать следующие типы: INTEGER, BYTE, CHAR, перечислимый и ограниченный. При определении множественных типов существует два ограничения: 1) вещественный тип в качестве базового в множествах использовать нельзя; 2) число элементов в множестве определяется каждой конкретной реализацией ЭВМ. Обычно число элементов колеблется между 64 и 256 ( для Турбо - Паскаля - 256). Такая зависимость приводит к потере переносимости программ, обладающих этим типом, с машины на машину. Множества объявляются либо в разделе описания переменных VAR, либо в разделе описании типов TYPE. Объявление множества в разделе описания переменных имеет вид: VAR < имя множества > : SET OF < базовый тип >; Например : Var god : set of 1900..2000; symbol : set of char; Объявление множества с использованием раздела описания типов имеет вид: Type < имя типа > = set of < базовый тип >; Var < имя множества > : имя типа; Например : Type god = set of 1900..2000; symbol = ( 'A'..'Z'); Var 66 g : god; s : set of symbol; Значения переменных и констант множества задаются в разделе операторов с помощью конструктора. Конструктор представляет собой список элементов базового типа, заключенный в квадратные скобки, который затем можно присвоить переменной, или обработать. Конструктор множества можно рассматривать как константу типа множества. Например: figura := [romb]; или figura := [krug,romb,kvadrat]; simv := ['A','B','C']; M1 := [1,3,5,10]; M2 := []; { пустое множество } 9.2. Операции над множествами В языке Турбо-Паскаль имеются следующие группы операций над множествами: 1) объединение, пересечение, вычитание множеств; 2) проверка принадлежности элемента множеству; 3) проверка на равенство и неравенство множеств; 4) проверка на принадлежность одного множества другому. Операции объединения, пересечения и вычитания являются традиционными действиями над множествами и обозначаются символами '+', '*', '-' соответственно. Например: [1,2] + [3,4] = [1,2,3,4]; [1..10] + [5..15] = [1..15]; [1..10] * [5..15] = [5..10]; [1,2] * [3,4] = []; [1..10] - [5..15] = [1..4]; Проверка принадлежности множеству - это логическая операция, которая обозначается служебным словом IN. Правый операнд должен быть множеством, левый - значением базового типа множества. Операция возвращает TRUE, если значение входит в множество, и FALSE в противном случае. Например: 2 in [1..10,12]; { имеет значение true} 5 in [1,2,7,10]; { имеет значение false} Операцию проверки принадлежности удобно использовать для исключения более сложных проверок, например, оператор вида if (symb = 'a') or (symb = 'b') or (symb = 'x') or (symb ='y') then s; может быть переписан в более компактной форме if symb in ['a','b','x','y'] then s;. Второй вариант эффективен с точки зрения быстродействия. Проверка на равенство, неравенство и включение множеств - это бинарные логические операции, которые обозначаются следующими символами: = равенство (совпадение) двух множеств; <> неравенство множеств; <= проверка на вхождение множества из левого операнда в множество из правого операнда; >= проверка на вхождение множества из правого операнда в множество из левого операнда. Все эти операции вырабатывают логическое значение TRUE или FALSE в зависимости от успеха проверки. Например: [1,2,3] = [1,2] - false; [1,2,3] >= [1,2] - true; [S] <= [1..10] - true, если S - целое число из диапазона 1..10; [1,2,3] <> [1,2,2] - true. 67 Синонимом логической операции над множествами является слово "компаратор". Набор операций над множествами в языке Турбо-Паскаль не содержит одной практически важной операции - выборки значений из множества (или близко связанного с ней средства циклического перебора значений множества). Поэтому при необходимости подобных действий приходится организовывать цикл по всему диапазону значений базового типа, проверяя на каждой итерации принадлежность очередного значения данному множеству, например : Var symbols : set of char; s : char; Begin For s := chr(0) to chr(255) do if s in symbols then < действия с переменной s > Контрольные вопросы 1. Что понимается под множеством? 2. Какие вы знаете операции над множесвами в математике? 3. Как записываются операции над множествами в языке Турбо-Паскаль? 4. Как задаются множества на языке Турбо-Паскаль? 5. Что такое пустое множество и как оно задается? 6. Как организовать вывод элементов множества? Задание к работе 1. Выполнить задание А. 2. Выполнить задание Б. Методические указания 1. При выполнении индивидуального задания А необходимо: a) ознакомиться с конечным и упорядоченным множеством символов, определенным на используемой для выполнения задания ЭВМ; b) составить программу для конкретного варианта, работающую для произвольного набора символов. c) входная строка символов может быть длиннее строки экрана терминала, при этом программа работает не с функцией EOLN, а с признаком конца строки, который задается программистом. 2. При выполнении индивидуального задания Б необходимо учесть приемы программирования, использованные в приведенной ниже программе ASMAG. Известен набор продуктов - хлеб, масло, сыр, молоко, имеющихся в ассортименте магазинов. В три магазина доставлены отдельные виды этих продуктов. Требуется построить множества A, B, C, которые содержат соответственно: - продукты, имеющиеся одновременно во всех магазинах; - продукты, имеющиеся по крайней мере в одном из магазинов; - продукты, которых нет ни в одном из магазинов. Program ASMAG; Const N=3; Type product=(bread,butter,cheese,milk); {задается список объектов (продуктов), определяющий базовый тип PRODUCT} assort = set of product; {на базовом типе PRODUCT определя-ется множественный тип ASSORT} 68 magazin = array [1..N] of assort; {информация о наличии продуктов во всех магазинах задается как массив множеств} Var m1 : magazin; x : product; a,b,c, xm1 : assort; i,j,iw,m : integer; Begin for i := 1 to N do {ввод исходной информации} begin xm1 := []; writeln (' введите номера продуктов',i : '-го магазина ='); repeat {в цикле REPEAT формируется множество XM1, характеризующее наличие товаров в одном магазине.} read(iw); case iw of 1: x := bread; 2: x := butter; 3: x := cheese; 4: x := milk end; xm1 := xm1 + [x]; until eoln; m1[i] := xm; {информация о наличии товаров записывается в массив M1} end; for i := 1 to 3 do {формирование множеств A,B,C и их распечатка} begin case i of 1: writeln('продукты, имеющиеся одновременно во всех магазинах'); 2: writeln('ассортимент продуктов'); 3: writeln('продукты, которых нет ни в одном магазине') end; for x := bread to milk do if x IN a then case x of bread: write('хлеб'); butter: write('масло'); cheese: write('сыр'); milk: write('молоко') end; if i = 1 then a := b else a := c; writeln end end. Содержание отчета 1. Титульный лист. 2. Словесная постановка задачи. 3. Графический или текстуальный алгоритм решения задачи. 69 4. Листинг программы. 5. Контрольный тест и результаты тестирования программы. 6. Инструкция по эксплуатации программы. 7. Ответы на контрольные вопросы. Варианты индивидуальных заданий Задание А Дана непустая последовательность символов. Требуется построить и напечатать множество, элементами которого являются символы, встречающиеся в последовательности индивидуального варианта: Вариант Последовательность символов 1 Буквы от 'A' до 'F' и от 'X' до 'Z'; 2 Цифры от '5' до '9' и знаки арифметических операций; 4 Буквы от 'T до 'X' и цифры от '1' до '4'; 5 Знаки препинания и операций отношения; 6 Знаки арифметических операций и буквы от 'E' до 'N'; 7 Буквы от 'A' до 'Z' и знаки препинания; 8 Знаки операций отношения; 9 Цифры от '0' до '9'; 10 Знаки арифметических операций и операций отношения. Задание Б 1. Даны два конечных множества А и В, элементами которых могут быть любые целые числа в диапазоне от 1 до 30. Найти прямое произведение этих множеств и вывести его на экран. 2. Даны два прямоугольника. Множества А и В - это множества точек, принадлежащих соответствующим прямоугольникам. Координаты точек - это натуральные числа от 1 до 10. Определить пересекаются ли данные прямоугольники, если пересекаются, то вывести на экран их общие точки. 3. Даны два конечных множества Х и У, состоящие из целых чисел. Определить выполняется ли равенство: (A ∪B)\B=A. 4. Даны два конечных множества Х и У, состоящие из целых чисел. Определить выполняется ли равенство: (A\B) ∪ (B\A)=(A∪B) \ (A∩B). 5. Пусть А, В, С - конечные множества, такие что В ⊆ А ⊆ С. Найдите множество Х, удовлетворяющее условиям А ∩ Х =В и А ∪ Х =С. 6. Пусть А, В, С - конечные множества, такие что В ⊆ А, А ∩ С= ∅. Найдите множество Х, удовлетворяющее условиям А \ Х=В и Х \ А =С. 7. Даны следующие множества А={1, 2, 3}, B={2, 3, 5, 4}, U={0, 1, 2, 3, .. ,9 }. Найти и вывести на экран A ∪ B, , A \ B, B \ A, U \ A. 8. Даны два конечных множества A и B, состоящие из целых чисел. Найти и вывести на экран (A ∪ B) \ (A ∩ B). 9. Даны два множества A={1, 2}, B={3, 4, 5}. Выведите на экран элементы множеств А × B, B × A. 10. Пусть А={b, o}. Перечислите элементы множеств A 3 и А 4 70 ЛАБОРАТОРНАЯ РАБОТА N 10 Тема: "Комбинированный тип данных - записи" Цель работы 1. Получить навыки в организации ввода и вывода значений комбинированных типов данных. 2. Получить навыки программирования задач с использованием записей. Краткие сведения из теории 10.1. Объявление данных типа записи Комбинированный тип характеризует объекты, называемые записями. Синонимом понятия " комбинированный тип" является понятие "структурный тип". Запись (структура) - это сложная переменная с несколькими компонентами. При определении комбинированного типа задаются имя всей записи, имя и тип каждой компоненты. Описание комбинированного типа начинается со служебного слова RECORD и заканчивается словом END. Записи, как и другие данные, объявляются в разделе описаний и используются в разделе операторов. Записи можно объявлять в разделе TYPE либо VAR. Объявление записи в разделе VAR имеет следующий вид: VAR < имя записи > : RECORD < имя компоненты 1: тип >; < имя компоненты 2: тип >; < имя компоненты N: тип > END; Здесь служебное слово RECORD (запись) выполняет роль открывающей операторной скобки, END - закрывающей. Внутри операторных скобок описываются компоненты записи. Допускается вместо имени записи указывать список имен, т.е. имена записей, разделенные запятыми. Компоненты записи вместе с их описанием называются полями записи. Более универсальной формой объявления записи является описание с использованием раздела TYPE, которое имеет вид: TYPE < имя типа > = RECORD < имя компоненты 1 >: тип; < имя компоненты 2 >: тип; < имя компоненты N >: тип END; VAR < имя записи >: имя типа; Пример . Дана ведомость списка студентов с их оценками (рис.1) Для представленной ведомости объявление записи в разделе переменных выглядит следующим образом: VAR vedom : RECORD n : integer; fio : string[15]; progr,fizika : integer END; 71 № Фамилия Оценка п/п имя, отчество программирование физика 1 Бадмаев И.П. 5 4 2 Иванов А.Р. 4 4 3 Павликова Ю.Т. 5 3 Рис.1. Ведомость успеваемости. В данном примере фамилия имеет тип STRING, состоящий из 15 элементов, порядковый номер и оценки по предметам - тип INTEGER. Длина записи Vedom равна 21 байту. Объявление ведомости с использованием раздела типов имеет вид: TYPE vedom = RECORD n : integer; fio : string[15]; progr,fizika : integer END; VAR v : vedom; Здесь сначала введен тип с именем VEDOM, а затем указана переменная V, имеющая тип записи. Поле записи используется в программе так же, как обычная переменная. Таким образом, поле записи можно указывать как в левой части оператора присваивания, так и в выражениях. Над полем записи можно выполнять действия, допустимые для данных его типа. Если тип поля записи - INTEGER, то выполняются все операции, допустимые для целых данных. 10.2. Доступ к полям записи Доступ к полям записи производится с помощью селектора записи, имеющего следующий вид: NAME_Z.NAME_P , где NAME_Z - имя переменной комбинированного типа (всей записи); NAME_P - имя поля. В практическом программировании такая запись называется уточненным именем данного. Для переменных, введенных выше, допустимы следующие конструкции: Vedom.n := 5; Vedom.fio := 'Иванов А.Р.'; или V.n := 35; V.fio := ' Павликова Ю.Т.'; Комбинированные типы можно использовать для построения более сложных структур: массивов; файлов; вложенных структур с одним или более полей, которые, в свою очередь, могут быть записью. Например: VAR group : array[1..10] of vedom; database : file of vedom; Для переменных GROUP доступ к полям записей, составляющих этот массив, производится следующим образом: Group[i].fio := ' Бадмаев И.П. '; If group[i].fio = ' Бадмаев И.П. ' then WriteLn (group[i].progr) Else writeln ('Нет такой фамилии!'); 72 Рассмотрим случай, когда в составе записи содержатся поля, имеющие тип записи. Пусть для комбинированного типа VEDOM необходимо хранить информацию о дате сдачи экзамена. Эту информацию можно представить в виде трех полей: месяц, день, год, дополняющих предыдущий состав типа VEDOM. Однако, логичнее дату сдачи экзамена определить как отдельный тип. Это позволит использовать тип DATE в описании других типов и переменных: TYPE Date = RECORD Mounth : (jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec); Day : 1..31; Year : 1900..2000 END; Теперь тип DATE можно использовать в записи VEDOM: TYPE Vedom = RECORD N : integer; Fio : string[15]; Progr,Fizika : integer; D_exem : date END; Доступ к полям D_EXEM осуществляется по общим правилам, т.е. при записи селектора слева от символа 'точка ' всегда должна находиться переменная типа запись, а справа идентификатор поля этой записи, например: V.D_exem.Mounth := jan; V.D_exem.Day := 25; Комбинированный тип может употребляться для спецификации параметров подпрограмм. Например, можно определить специальный тип для представления комплексных чисел как пары вещественных переменных (действительную и мнимую части комплексного числа): ТYPE Complex = RECORD Re,Im : real END; Далее можно с помощью процедур определить операции над комплексными числами (сложение, умножение, деление): Procedure Addc( c1,c2: complex; var R: complex); Procedure Mulc( c1,c2: complex; var R: complex); Procedure Divc( c1,c2: complex; var R: complex); 10.3. Записи с вариантами Часто в зависимости от конкретного значения некоторого поля возникает необходимость в пределах одной записи иметь различную информацию. В таких случаях используются записи с вариантами. Рассмотрим тип PERSON, содержащий информацию о человеке. Если поле POL имеет значение М (мужской), то пусть необходимо предусмотреть такие поля: - служил в армии или нет; - если служил, то дату последних военных сборов. Если поле POL имеет значение W (женский), то необходима информация о цвете глаз. Запись с вариантами типа PERSON имеет вид: Type Date = Record Mounth : (jan,feb,mar,apr,may,jun,jul,aug, 73 sep,oct,nov,dec); Day : 1..31; Year : 1900..2000 End; Person = Record Fio : string[20]; Special : word; Birthday : date; PersonPol: (M,W); Case pol : PersonPol of M: (Army : boolean; D_Army : date); W: (EyesColor : (blue,brown, gray,green)) End; Записи с вариантами имеют фиксированную и вариантную части. Изменяющаяся часть записи называется вариантом. Вариант всегда располагается в конце записи. Поле ( в данном случае POL), позволяющее различать варианты, называется полем признака. Вариантная часть содержит несколько альтернатив (в данном примере - M и W), в каждой из которых в круглых скобках задается список полей, присущих данному варианту ( ARMY и D_ARMY -> M, EYESCOLOR -> W ). Списку полей предшествует метка, являющаяся конкретным значением признака POL. Метка служит критерием выбора вариантов. Перечисление альтернатив начинается с определения признака POL. Началом вариантной части является служебное слово CASE; после признака выбора вариантов записывается служебное слово OF. Вариантная часть завершается служебным словом END вместе с завершением всей записи. В определении комбинированного типа может быть только одна вариантная часть и она должна быть задана в конце записи. Альтернативы вариантной части помечаются допустимыми значениями поля POL, которое определено в фиксированной части. Иногда поле, значения которого задают варианты, называют дискриминантом записи. Идентификаторы полей во всех вариантах должны быть различными и отличаться от идентификаторов полей фиксированной части. В этом случае после метки, соответствующей этим значениям может стоять пустой список вида ( ). Любой вариант, в свою очередь, может иметь свою вариантную часть, которая должна располагаться в конце списка полей данного варианта. При использовании вариантных записей необходимо учитывать следующие особенности: 1. Для размещения переменной комбинированного типа всегда отводится фиксированный объем памяти, причем если в записи есть варианты, то объем определяется по самому большому варианту. Различные варианты одной записи как бы накладываются " друг на друга" в памяти, занимая одну и ту же область. 2. Система Турбо-Паскаль не содержит никаких средств контроля за правильностью работы с вариантами записей. За соответствием текущего значения дискриминанты и доступа к полям записи должен следить программист. 10.4. Оператор присоединения Оператор присоединения предназначен для более наглядной и эффективной организации работы с данными комбинированного типа и используется для доступа к полям записи. Оператор присоединения начинается со служебного слова WITH, далее следует имя записи и служебное слово DO. Операторы, содержащие имена полей записи, заключаются в операторные скобки: WITH < имя записи > DO BEGIN < операторы, содержащие имена полей записи > фиксированная часть вариантная часть 74 END; Например : для рассмотренной записи (списка студентов) операции присваивания, суммирования и ввода можно объединить в один оператор: With v do Begin N := 4; SUM := progr + fizika; Read (N) End. Контрольные вопросы 1. Что понимается под записью в языке Паскаль? 2. Как объявляются записи? 3. Какие операции допустимы над полями записи? 4. Как организовать ввод и вывод данных типа записи? 5. Как осуществляется доступ к полям записи? 6. Можно ли использовать в записи поля одного типа? 7. Чем отличается запись от массива? 8. Каково назначение оператора присоединения? Задание к работе Выполнить индивидуальное задание Содержание отчета 1. Титульный лист. 2. Словесная постановка задачи. 3. Графический или текстуальный алгоритм решения задачи. 4. Листинг программы. 5. Контрольный тест и результаты тестирования программы. 6. Инструкция по эксплуатации программы. 7. Ответы на контрольные вопросы. Методические указания 1. При выполнении работы использовать массив записей. 2. Разработать алгоритмы и программы для решения задач заданий. 3. Скомпилировать программы. 4. Составить контрольные тесты и протестировать программы. 5. Составить отчет и представить его к защите. Варианты индивидуальных заданий 1. Дан список учебной группы, включающий 20 человек. Для каждого студента известны: фамилия, имя, дата рождения, оценки по всем дисциплинам за последний семестр. Составить программу, которая обеспечивает ввод информации и отображение ее на экран в виде таблицы. Отобразить на экран анкетные данные студентов-отличников в виде таблицы. Отобразить на экран фамилию и имя студентов, родившихся зимой и весной. 2. Сведения об экзамене содержат следующие данные: дисциплину (программирование, алгебра, история, геометрия), дату сдачи экзамена (год, месяц, день), сведения о студенте (факультет, курс, группа, номер в журнале) и экзаменационную оценку. Задан набор сведений об экзаменах, сданных студентами за последние два года; в них факультет и предмет кодируются первыми буквами названия. Определить количество неуспевающих по программированию на экономическом факультете среди студентов первого курса, сдававших экзамены зимой 1995 года, вывести на экран их группу и номер в журнале. 3. Сведения об экзамене содержат следующие данные: дисциплину (программирование, социология, иностранный язык, физика), дату сдачи экзамена (год, месяц, день), сведения 75 о студенте (фамилия, факультет, курс, группа) и экзаменационную оценку. Задан набор сведений об экзаменах, сданных студентами за последние несколько лет; в них факультет и предмет кодируются первыми буквами названия. Определить количество отличников по программированию на технологическом факультете среди студентов первого курса, сдававших экзамены летом 1995 года, вывести на экран их фамилии и группу. 4. Сведения об экзамене содержат следующие данные: дисциплину (программирование, вычислительная техника, информатика), дату сдачи экзамена (год, месяц, день), сведения о студенте (факультет, курс, группа, номер в журнале) и экзаменационную оценку. Задан набор сведений об экзаменах, сданных студентами за последние несколько лет; в них факультет и предмет кодируются первыми буквами названия. Определить, на каком факультете самый высокий средний балл по программированию среди студентов первого и второго курсов, сдававших экзамены зимой 1995 года. 5. Сведения об экзамене содержат следующие данные: дисциплину (программирование, вычислительная техника, информатика), дату сдачи экзамена (год, месяц, день), сведения о студенте (факультет, курс, группа, номер в журнале) и экзаменационную оценку. Задан набор сведений об экзаменах, сданных студентами за последние несколько лет; в них факультет и предмет кодируются первыми буквами названия. Определить, на каком факультете самый высокий показатель качества успеваемости по информатике (то есть самый высокий процент отличников и хорошистов) среди студентов первого курса, сдававших экзамены зимой 1995 года или летом 1996 года. 6. Справка о междугороднем телефонном разговоре содержит: номер телефона абонента (6 цифр), дату (год, месяц, день), время (час, минута), код города (3 цифры), номер телефона в другом городе (7 цифр), продолжительность разговора (в минутах), категорию (срочный, обычный) и тариф (плата в рублях за минуту). Определить дату такого телефонного разговора, которой является максимальным по продолжительности среди срочных разговоров за указанный месяц. 7. Справка о междугороднем телефонном разговоре содержит: номер телефона абонента (6 цифр), дату (год, месяц, день), время (час, минута), код города (3 цифры), номер телефона в другом городе (7 цифр), продолжительность разговора (в минутах), категорию (срочный, обычный) и тариф (плата в рублях за минуту). Вывести на экран код города и номер телефона в другом городе для телефонных разговоров, состоявшихся с телефона 235678 8 марта 1996 года. 8. Справка о междугороднем телефонном разговоре содержит: номер телефона абонента (6 цифр), дату (год, месяц, день), время (час, минута), код города (3 цифры), номер телефона в другом городе (7 цифр), продолжительность разговора (в минутах), категорию (срочный, обычный) и тариф (плата в рублях за минуту). Вывести на экран номер телефона абонента, код города и номер телефона в другом городе для срочных телефонных разговоров, состоявшихся между 15 марта и 12 апреля 1996 года . 9. Деталь автомобиля описывается инвентарным номером (положительное целое число), весом (в килограммах), ценой и стоимостью (в рублях), датой начала производства (год, месяц, день), статусом (имеет или не имеет знак качества) и объемом производства (в штуках за смену). В заданной последовательности сведений о деталях найти инвентарные номера деталей с наибольшей датой начала производства среди всех заданных деталей. Вывести на экран инвентарный номер, объем производства, цену и стоимость деталей со знаком качества. 10. Деталь автомобиля описывается инвентарным номером (положительное целое число), весом (в килограммах), ценой и стоимостью (в рублях), датой начала производства (год, месяц, день), статусом (имеет или не имеет знак качества) и объемом производства (в штуках за смену). В заданной последовательности сведений о деталях найти инвентарные номера деталей с минимальным весом среди деталей без знака качества. Вывести на экран инвентарный номер, объем производства, цену и стоимость деталей, выпускаемых с февраля 1977 года. |