Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по практике программирования-1.doc
Скачиваний:
11
Добавлен:
31.08.2019
Размер:
2.93 Mб
Скачать

Контрольные вопросы.

  1. Формальный параметр подпрограммы описан как const a:word. Соответствующий ему аргумент (фактический параметр) может быть:

  1. Только константой типа word с именем a;

  2. Выражением любого целого типа;

  3. Переменной любого целого типа;

  4. Выражением любого типа.

  1. Выберите правильные утверждения:

  1. Глобальные переменные располагаются в сегменте данных.

  2. Компилятор инициализирует нулями локальные и глобальные переменные.

  3. Функция может возвращать через свое имя значение любого типа.

  4. Глобальные переменные можно передавать в подпрограмму через список параметров.

  5. Место под формальные параметры выделяется на стадии выполнения программы.

  1. Чем отличаются формальные и фактические параметры?

  2. Как описываются параметры процедурного типа, для чего они предназначены?

  3. Как объявляются локальные и глобальные переменные?

Структуры данных: массивы, строки, записи. Размещение в памяти. Пользовательские типы данных.

Цель: Закрепить знания по решению нетиповые задачи при разработке алгоритмов и программ обработки строк, массивов, записей.

В Паскале, кроме простых типов данных (integer, real, char и т.д.), имеются и сложные типы. К ним относятся массивы.

Массив (array, от французского – сплошной) – это область памяти, в которой размещается совокупность конечного числа данных одного типа с одним именем. Каждый элемент такой совокупности обозначается именем массива с индексом (номером элемента в массиве).

Элемент массива – отдельная переменная, входящая в массив;

Индекс (index) – это числовая константа или целочисленное арифметическое выражение (частный случай - целочисленная переменная), которым снабжаются элементы массива, чтобы отличать их друг от друга.

Индекс элемента массива – номер элемента в массиве.

Особенность массивов заключается в том, что все элементы массива являются данными одного типа (возможно и структурированного). При назначении массиву имени соблюдаются те же требования, какие предъявляются к именам переменных простых типов.

a11

a12

a1n

a21

a22

a2n

am1

am2

amn

В зависимости от количества используемых индексов, массивы могут быть одномерные (строка), двухмерные (таблица), трехмерные и т.д.

Одномерный массив

В одномерном массиве для указания местоположения элемента достаточно одного индекса,

В

Двухмерный массив

двухмерном массиве – два индекса, для строк и граф.

Размерность массива определяется количеством индексов.

Размер массива – диапазон изменения индексов массива.

Данные типа String или строковые данные

Строка – это особая форма одномерного массива символов.

Отличие строки от массива в том, что массив имеет фиксированную длину (количество элементов), которая определяется при описании.

Строковые данные описываются следующим образом:

Var S: string[n]; SS: string; где

n – число символов в строковой переменной, изменяется от 1 до 255.

Длина описанной переменной S - n+1 байт.

Максимально возможная длина строковой переменной – 255 символов.

S[i] – общий вид элемента строковой переменной

Строка имеет две разновидности длины:

  • общую длину строки (n), которая характеризует размер памяти, выделяемый строке при описании.

- текущую длину строки (p) (p<=n), которая показывает количество смысловых символов в каждый конкретный момент времени. При выдаче на экран значения нулевого символа (Write(ord (s[0]));), получим величину р.

Записи

В программах часто возникает необходимость логического объединения данных. Например, база данных предприятия содержит для каждого сотрудника его фамилию, дату рождения, должность, оклад и т.д.; программа моделирования движения поездов – пункты отправления и прибытия, время и количество вагонов, и многое другое. Однотипные данные, как вы уже знаете, организуются в массивы, а для объединения разнотипных данных предназначен тип “запись”. Он вводится с помощью ключевого слова record. Элементы записи называются полями.

Type имя_типа=record

описание 1-го поля записи;

описание 2-го поля записи;

описание n-го поля записи;

end;

Поля записи могут быть любого типа, кроме файлового. Переменные типа «запись» описываются обычным образом. Можно задавать описание типа при описании переменной, создавать массивы из записей, записи из массивов и т.д.

С записями целиком можно делать то же, что и с массивами: присваивать одну запись другой, если они одного типа. Все остальные действия выполняются с отдельными полями записи. Есть два способа доступа к полю записи: либо с помощью конструкции имя_записи.имя_поля, либо с использование оператора with, например:

g1.price:=200;

with g1 do begin

price:=200; number:=10

end;

Оператор with удобнее использовать, если требуется обращаться к нескольким полям одной и той же записи.

Множества

Множественный тип данных в языке Pascal соответствует математическому представлению о множествах: это ограниченная совокупность различных элементов. Множество создается на основе элементов базового типа – это может быть перечисляемый тип, интервальный или byte. В множестве не может быть более 256 элементов, а их порядковые номера должны лежать в пределах от 0 до 255.

Множество описывается с помощью служебных слов set of.

type имя_типа=set of базовый тип

Примеры описания множественных типов:

Type Caps =set of ‘A’… ‘Z’;

Colors=set of (RED, GREEN, BLUE);

Numbers = set of byte;

Константа вида [] означает пустое подмножество.

Тип «множество» задает набор всех возможных подмножеств его элементов, включая пустое.

Всему множеству дается имя, которое образуется так же, как и имена простых переменных и массивов. Однако к именам множества нет прямого доступа (по индексам этих элементов, как в массивах). Поэтому ввод-вывод множеств производится с использованием операций объединения (при вводе) и проверки принадлежности (при выводе). Под мощностью множества понимается число элементов, содержащихся в данном множестве. Мощность пустого множества равна нулю.

Для множеств определены операции + (объединение), - (разность), * (пересечение), = (равенство), <> (неравенство), <= (вложено) и   >= (содержит). Множества с совместимыми базовыми типами неявно преобразуются одно к другому. При присваивании множеству при необходимости происходит усечение его элементов до значений базового типа.

Задания:

Записи

Вариант №1. Дана ведомость абитуриентов, сдавших вступительные экзамены в институт. В каждой строке данной ведомости записана фамилия абитуриента, его постоянное место жительства и полученные им оценки по отдельным дисциплинам (физике, математике, литературе). Надо определить количество абитуриентов, проживающих в городе Минске и сдавших экзамены со средним баллом не ниже 4, распечатать их фамилии в алфавитном порядке.

Вариант №2. В справочной аэропорта хранится расписание вылета самолетов на следующие сутки. Для каждого рейса указан его номер, тип самолета, пункт назначения, время вылета. Определить все номера рейсов, типы самолетов и времена их вылетов для заданного пункта назначения.

Вариант №3. У администратора железнодорожных касс хранится информация о свободных местах в поездах по всем направлениям на ближайшую неделю. Данная информация представлена в следующем виде: дата выезда, конечный пункт назначения, время отправления, число свободных купейных мест, число свободных плацкартных мест. Оргкомитет международной конференции обращается к администратору с просьбой зарезервировать 50 купейных мест до Берлина на субботу. При этом время отправления поезда должно быть не позднее 10 часов вечера. Выдать на печать время отправления или сообщение о невозможности выполнить заказ в полном объеме.

Вариант №4. Дан список очередности запуска деталей в обработку. Из данного списка определить общее количество деталей, тип которых начинается с Д2 и объем партии запуска не меньше 15. Исходные данные:

Тип детали

Д11

Д21

Д31

Д22

Д41

Д23

Д32

Д25

Размер партии

20

10

15

30

25

6

22

30

Вариант №5. Дана ведомость абитуриентов, сдавших вступительные экзамены в институт. В каждой строке данной ведомости записана фамилия абитуриента и полученные им оценки по отдельным дисциплинам (физике, математике, литературе). Необходимо определить средний балл по институту и распечатать список абитуриентов, средний балл которых выше среднего балла по институту. Первыми в списке должны идти студенты, сдавшие все экзамены на 5.

Вариант №6. В радиоателье хранятся квитанции о сданной в ремонт радиоаппаратуре. Каждая квитанция содержит следующую информацию: наименование группы изделий (телевизор, радиоприемник и т.п.), марка изделия, дата приемки в ремонт, состояние готовности заказа (выполнен, не выполнен). Необходимо выдать информацию начальнику ателье о состоянии заказов на текущие сутки по группам изделий.

Вариант №7. Написать программу формирования ведомости об успеваемости студентов. Каждая запись этой ведомости должна содержать номер группы, фамилию студента, средний балл за последнюю сессию. Необходимо распечатать списки студентов по группам. В каждой группе фамилии студентов разместить в порядке убывания среднего балла.

Вариант №8. На складе комплектующих деталей хранятся N деталей, каждая из которых характеризуется записью следующего вида:

Type

ZAP=record

DTL:string[10];

PR1:integer;

PR2,PR3:boolean;

end;

Здесь dtl – наименование детали; pr1,pr2,pr3 – некоторые признаки детали. Необходимо подготовить детали к запуску в сборочный цех. Для этого их следует разбить на пары (z1,z2), где z1, z2 переменные типа zap, таким образом, чтобы разность |z1.pr1–z2.pr1| была как можно меньше для каждой пары (z1,z2). Вывести на печать все наименования пар запуска.

Вариант №9. На складе комплектующих изделий хранятся N деталей (см. задание №8). Необходимо рассортировать детали по группам с учетом признаков pr2 и pr3. Первая группа – это детали, для которых pr2=False и pr2=False, для второй группы pr2=False, pr3=True и т.д. Вывести на печать перечень наименований деталей по каждой группе.

Вариант №10. В магазине имеется список лиц, записавшихся на покупку мебельного гарнитура. Каждая запись этого списка содержит порядковый номер, фамилию, домашний адрес покупателя и дату постановки на учет. Предполагается, что список упорядочен в порядке возрастания даты постановки на учет. Требуется удалить в нем все повторные записи, проверку осуществлять по фамилии и домашнему адресу.

Вариант №11. В больнице имеется общий список больных, каждый из которых характеризуется записью:

Type

zap=record

fio:string[25];

np:integer;

dgn:string[20];

end;

где fio – фамилия и инициалы больного, np – номер палаты, dgn – диагноз. Требуется вывести на печать перечень больных по каждой палате и отдельно по каждому диагнозу. Разместить больных по палатам так, чтобы больные с одинаковым диагнозом располагались по возможности вместе.

Вариант №12. Имеется список учета нуждающихся в улучшении жилищных условий. Каждая запись этого списка содержит фамилию, имя, отчество и дату постановки на учет. Список упорядочен по дате постановки на учет. Известно число квартир, выделяемых по данному списку в течении года. Рассчитать, какое количество лет в среднем необходимо ожидать получения квартиры, и вывести на экран весь список с указанием ожидаемого года получения квартиры.

Вариант №13. В предвыборной кампании проводится регистрация кандидатов в депутаты. Каждый кандидат, подавая заявление на регистрацию, указывает номер округа, в котором он собирается баллотироваться, наименование партии, которую он представляет, свой возраст и профессию. Пресс-служба центральной избирательной комиссии выдает информационный бюллетень, в котором приводит следующую информацию: число поданных заявлений на регистрацию кандидатов каждой политической партии; средний возраст кандидатов от каждой политической партии; наиболее часто встречающаяся профессия для кандидатов по каждой партии. Написать соответствующую программу.

Вариант №14. Имеется N различных деталей, которые необходимо обработать на одном станке. Каждая деталь характеризуется записью вида:

Type

zar=record

i,dn,dl:inteer;

end;

где i - номер детали; dn - длительность наладки станка (в часах) для обработки i-й детали; dl - длительность обработки i-й детали на станке (в минутах). Очередность обработки всех N деталей на данном станке хранится в виде массива int SP[n]. Сначала обрабатывается деталь с номером SP[1], затем SP[2] и т.д. Суммарное время обработки каждой детали включает время наладки станка и непосредственно время ее обработки. Определить время обработки всей последовательности деталей.

Вариант №15. Разработать программу ("электронную сваху") для службы знакомств. Имеется два списка: список женихов и список невест. В каждом списке кандидат (жених или невеста) характеризуется записью вида:

Type

zap=record

Nom:integer;

MyData:record

Vz,Rst,Vs:inteer;

end;

Critery:record

VzMin,VzMax:integer;

RstMin,RstMax:inteer;

VsMin,VsMax:integer;

end;

end;

где nom – порядковый номер кандидата; mydata – данные о кандидате (возраст, рост, вес); critery – аналогичная запись, содержащая требования к партнеру (в виде диапазона: min - max). Требуется объединить эти списки в список пар (без повторений женихов и невест) с учетом требований кандидатов.

Вариант №16. В библиотеке имеется список книг. Каждая запись этого списка содержит фамилии авторов, название книги, год издания. Определить, имеются ли в данном списке книги, в названии которых встречается некоторое ключевое слово ("ПЭВМ"). Если имеются, то выдать на печать фамилии авторов, названия и год издания всех таких книг.

Множества

1. Даны три множества X1,X2,X3, содержащие целые числа из диапазона 1...100. Известно, что мощность каждых из этих множеств равна 10. Сформировать новое множество Y=(X1+X2)*(X1\X2), из которого выделить подмножество нечетных чисел. На экран вывести исходные и полученные множества. Значения исходных множеств ввести с клавиатуры.

2. Даны три множества X1, X2, X3, содержащие целые числа из диапазона 1...100. Известно, что мощность каждого из этих множеств равна 10. Сформировать новое множество Y=(X1+X2)\(X1*X3) и вывести на экран его мощность. Проверить, есть ли в множестве Y числа, делящиеся на 6 без остатка. Значения элементов исходных множеств ввести с клавиатуры.

3. Даны два множества M и N, состоящие из 10 целых чисел из диапазона 1...100. Из данных множеств выделить соответственно подмножество M1 чисел, делящихся на 3 без остатка, и N1 чисел, делящихся на 2 без остатка. Множества M и N описать как типизированные константы. На печать вывести мощность и значение элементов множества MN=M1*N1.

4. Даны три множества X1, X2, X3, содержащие целые числа из диапазона 100...200. Известно, что мощность каждого из этих множеств равна 10. Сформировать новое множество Y=(X1*X2)+(X1+X3). На печать вывести множества X1, X2, X3 и Y. Проверить выполнение условий X1 in Y и 150 in Y.

5. Даны три множества X1={1,2,...,20}, X2={10,11,...,30} и X3={1,3,5,...,19,21}. Сформировать множество Y=(X1+X2)*(X1+X3)\(X2+X3), из которого выделить подмножество Y1 чисел, делящихся на 4 без остатка. На печать вывести множество Y и мощность множества Y1.

6. В восточном календаре года носят названия животных: крысы, быка, тигра, зайца, дракона, змеи, лошади, овцы, обезьяны, петуха, собаки, свиньи. Кроме того, через каждые два года меняется цвет в следующем порядке: синий, красный, желтый, белый, черный. Таким образом, 1992-й год - это год черной обезьяны, 1993-й - год черного петуха, 1994-й - год синей собаки и т.д. Написать программу, которая переводит заданный год в его название по восточному календарю.

7. Даны три множества X1={1,2,...,20}, X2={10,20,30,...,200} и X3={10,11,...,40}. Сформировать множество Y=(X2*X3)\((X1*X2)+(X1*X3)) и множество Y1, состоящее из элементов Y, деленных на 2. Если полученное в результате деления число не целое, то округлить его до ближайшего целого. На печать вывести множества Y и Y1.

8. Даны три множества X1={Т2,Т4,Т6,Т8,Т10}, X2={Т1,Т2,Т3,Т4,Т5} и X3={Т2,Т3,Т5,Т7,Т8}. Сформировать множество Y=(X2\X3)+(X1\X2). На печать вывести Y и его мощность. Проверить выполнение условия X3 in Y. Исходные множества описать как типизированные константы.

9. Разработать программу для определения, какому алфавиту (латинскому или русскому) принадлежит введенный с клавиатуры символ. На печать вывести введенный символ с комментарием, например: Набран символ "А" на русском регистре.

10. Разработать учебную программу для проверки знаний студентами алфавита языка Turbo Pascal. Программа должна формировать запрос на ввод очередного символа, проверять, принадлежит ли он алфавиту языка Turbo Pascal, нет ли попытки повторно ввести один и тот же символ, и выводить соответствующие комментарии и оценку (например, введены все символы верно-отлично, не более двух ошибок - хорошо и т.д.).

11. Разработать игровую программу для тренировки памяти. В ее основу положить следующее правило игры. Необходимо ввести как можно больше чисел при соблюдении следующих условий: числа должны быть из диапазона 0...255; запрещается последовательно вводить два числа, абсолютная разность между которыми меньше 7 (например, 5 и 6, 7 и 11). Программа должна заканчивать свою работу после обнаружения первой ошибки игрока. На печать выводить количество правильно введенных чисел.

12. Разработать игровую программу. В ее основу положить следующее правило игры. В игре участвуют два человека. Первый последовательно вводит 10 букв русского алфавита. Второй пытается угадать то, что ввел его соперник, и вводит свои 10 символов. Затем игроки меняются ролями.

13. Дан одномерный массив вещественных положительных чисел. Последовательно преобразовать этот массив согласно следующему алгоритму. Сначала обнуляется минимальный элемент массива, затем максимальный из оставшихся, далее минимальный из оставшихся и т.д. Вывести на экран сначала последний оставшийся ненулевой элемент, потом множество индексов элементов, которые были минимальными, а затем множество индексов элементов, которые были максимальными. В программе не следует использовать в целях экономии памяти вспомогательные массивы.

14. Необходимо написать программу, которая позволяла по порядковому номеру дня в году и типу года (високосный или нет) определять день недели и месяц года, на которые приходится указанный день (используйте типы данных, заданные перечислением).

15. Написать программу для ввода букв латинского алфавита. Если введенный символ не является буквой латинского алфавита, заменить ее на знак '?'. Следить за тем чтобы буквы не повторялись. Введенная повторно буква заменяется символом '*'. Скорректированный результат ввода вывести на экран.

16. Написать программу, которая бы для указанного года распечатывала все даты, попадающие на воскресенье, и все месяцы, начинающиеся с понедельника (используйте типы данных, заданные перечислением). С клавиатуры ввести год и день недели, на который приходится в заданном году 1 января.