76
Составитель А.М. Сулейманова УДК 681.3 ББК 32.973.26–018.2.75 Типы данных языка Турбо Паскаль: Методические указания к лабораторному практикуму по курсу «Информатика и программирование»/ Уфимск. гос. авиац. техн. ун-т; Сост. А.М. Сулейманова.– Уфа, 2004.– 55 с. Содержатся сведения, необходимые для изучения применения типов данных, приведены способы реализации программ с использованием простых типов, строк, массивов, записей и множеств, а также правила совместимости типов данных. Практическое применение иллюстрируется различными примерами. Обсуждается методика выполнения лабораторной работы. Приведены перечни заданий на выполнение лабораторных работ. Предназначены для студентов специальности «Прикладная информатика в экономике». Библиогр.: 3 назв.

Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

Составитель А.М. СулеймановаУДК 681.3ББК 32.973.26–018.2.75

Типы данных языка Турбо Паскаль: Методические указания к лабораторному практикуму по курсу «Информатика и программирование»/ Уфимск. гос. авиац. техн. ун-т; Сост. А.М. Сулейманова.– Уфа, 2004.– 55 с.

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

Предназначены для студентов специальности «Прикладная информатика в экономике».

Библиогр.: 3 назв.

Рецензенты: Ю.Б. Головкин, Т.Д. Тарасова

© Уфимский государственный авиационный технический университет, 2004

Page 2: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

СОДЕРЖАНИЕ

1. ЦЕЛЬ РАБОТЫ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.1. Понятие типа данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.2. Простые типы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.3. Строки . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.4. Структурированные типы данных . . . . . . . . . . . . . . . . . . . . 20 2.5. Совместимость типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 2.6. Приведение типов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ . . . . . . . . . . . . . . . . . . . 464. ТРЕБОВАНИЯ К ОТЧЕТУ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465. КОНТРОЛЬНЫЕ ВОПРОСЫ . . . . . . . . . . . . . . . . . . . . . . . . . . 466. ВАРИАНТЫ ЗАДАНИЙ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

СПИСОК ЛИТЕРАТУРЫ. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

ЛАБОРАТОРНАЯ РАБОТА

ТИПЫ ДАННЫХ ЯЗЫКА ТУРБО ПАСКАЛЬ

1. ЦЕЛЬ РАБОТЫ

Целью настоящей работы является изучение типов данных и методов применения различных типов данных при программировании в среде Turbo Pascal.

2. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ

3

Page 3: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

2.1. Понятие типа данныхТип однозначно определяет, как будет интерпретироваться та

или иная информация; в результате исключаются попытки проводить над ней неприемлемые операции. Например, если в программе фигурирует переменная, имеющая смысл "количество штук", понятно, что ее значение не должно представлять собой дробное число. Чтобы этого избежать, такой переменной при объявлении должен быть присвоен один из целочисленных типов (например, Integеr). Также недопустимы арифметические операции над символами, чтобы этого не случилось, соответствующие переменные должны принадлежать символьному типу (Сhar). А если в программе имеется переменная, способная принимать только значения, имеющие смысл "Да" или "Нет" (либо "Правда" или "Ложь”), чтобы обеспечить правильную интерпретацию ее значения, эта переменная должна принадлежать логическому типу (Вооlеаn). Иными словами, принятая в Тиrbо Раsсаl типизация переменных направлена на повышение надежности программ.

2.2. Простые типыК простым относятся такие типы данных, как вещественные,

целочисленные, символьный, логический, перечислимый и интервальный (или диапазон). Первые четыре из упомянутых (вещественные, целочисленные, символьный и логический) относятся в к стандартным типам данных. А перечислимый и интервальный – к типам, определяемым пользователем. Для указанных типов возможна еще одна градация. Все они, за исключением вещественных, относятся к порядковым типам данных.

2.2.1. Вещественные типы. К вещественным типам данных, используемых в языке программирования Тurbо Раsсаl, относятся Rеаl, Singlе, Double, Ехtended и Соmр. Между собой они отличаются диапазонами допустимых значений (т.е. значений, которые могут принимать переменные этих типов). Для хранения переменных того или иного вещественного типа требуются различные объемы памяти. Соответствующие характеристики вещественных типов представлены в табл.1.

Таблица 1

4

Page 4: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

Характеристики вещественных типов, принятых в Тurbо Раsсаl

Вещественный тип

Диапазон значений Число значащих цифр мантиссы

Требуемая память

Real 2.9E-39..1.7E38 11-12 6Single 1.5E-45..3.4E38 7-8 4Double 5.0E-324..1.7E308 15-16 8Extended 1.9E-4951..1.1E4932 19-20 10Comp 2E+63+1..2E+63-1 19-20 8

Вот как выглядят описания переменных вещественных типов:

vаr а:rеаl; b:single; с:double; d:extended; е:соmр;

Для чего потребовалось иметь несколько типов данных, имеющих сходный смысл? Почему бы не обойтись единственным вещественным типом, например Rеаl? Дело в том, что, в зависимости от программируемой задачи, разные переменные могут иметь отличающиеся диапазоны допустимых значений, в соответствии с которыми и следует выбирать для той или иной переменной тип данных.

Почему бы не назначать для всех переменных наибольший диапазон допустимых значений, подходящий для всех случаев? Такой подход не годится потому, что для содержания переменных разных вещественных типов выделяется различный объем памяти (см. табл.1), и это оказывает влияние на быстродействие программы. В самом деле, на обработку 4-байтового числа уйдет больше времени, чем 1-байтового. Поэтому в зависимости от диапазона значений, которые может принимать та или иная переменная, следует выбрать для нее наиболее подходящий тип.

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

5

Page 5: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

2.2.1.1. Применимые операции. К вещественным числам применимы четыре арифметических действия; полученный при этом результат также будет вещественным числом. Речь идет о таких действиях, как сложение (+), вычитание (-), умножение (*) и деление (/). В одном выражении могут присутствовать переменные как одного, так и разных вещественных типов. Например, объявленные выше переменные А, В, С, D и Е могут участвовать в следующих выражениях:

a+b+е; с-d; (а*b+с*d)/2; е/(с+d);

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

Что касается операций сравнения, то выражения, в которых применены эти операции, дают логический результат. Например, если A=333.44, а В=32.55, то выражение а>b даст результат ТRUЕ, а выражения а<b и а=b – результат FALSE. К вещественным значениям применимы все операции сравнения, эти операции представлены в табл.2.

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

участствовать переменные как одного, так и разных вещественных типов (совместимость в выражении). Кроме того, переменной вещественного типа может присваиваться выражение вещественного типа, если возможые значения выражения принадлежат диапазону значений, допустимых для переменной (совместимость по присваиванию).

Таблица 2 Операции сравнения

Значение Операция= Равно

<> Не равно> Больше

6

Page 6: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

< Меньше>= Больше или равно<= Меньше или равно

2.2.1.2. Применимые стандартные подпрограммы. К переменным и значениям, принадлежащим вещественному типу, применимы все математические функции, а также две функции преобразования типов – Round и Тrunc.

2.2.2. Порядковые типы. Данное понятие включает в себя все целочисленные, символьный логический, перечислимый и интервальный типы.

2.2.2.1. Целочисленные типы. К целочисленным относятся такие типы данных, как Integеr, ShortInt, LongInt, Вуtе и Word. Так же, как и с вещественными типами, между собой они отличаются диапазонами допустимых значений и объемом памяти, требуемой для содержания переменных этих типов. Соответствующие характеристики для перечисленных типов представлены в табл. 3.

Существование в Тurbо Раsсаl нескольких целочисленных типов обусловлено теми же причинами, что и для вещественных типов, о которых шла речь выше. В самом деле, если в некоторой программе имеется переменная, определяющая порядковый номер дня в году, понятно, что допустимые для нее значения лежат в диапазоне от 1 до 366. В этом случае объявить данную переменную как принадлежащую типу Longint нерационально, а типы Shortint и Вуtе здесь просто не подходят, поскольку значения переменной могут выйти за пределы соответствующих диапазонов. Для этой переменной наиболее подходят типы Integеr и Word, причем последний предпочтительнее, поскольку наша переменная может принимать только положительные значения (т.е. исключаются ситуации, когда переменная случайно может принять отрицательное значение).

Таблица 3 Характеристики целочисленных типов

Целочисленный тип (байт)

Диапазон значений Требуемая память

7

Page 7: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

Integеr -32768..32767 2ShortInt -128..127 1LongInt -2147483648..2147483647 4

Вуtе 0..255 1Word 0..65535 2

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

В Тurbо Раsсаl, помимо переменных и констант, явно указываемые в программе числа тоже разделяются на целые и вещественные. Если в записи числа использована точка, то оно вещественное; если точки нет – число целое.

Применимые операцииК значениям целочисленных типов применимы те же

арифметические операции, что и к вещественным значениям. Причем если операции сложения (+), вычитания (-) и умножения с двумя целыми значениями дадут целочисленный результат, то операция деления (/), примененная к двум целым значениям, даст вещественный результат. (Об этом уже шла речь, когда мы рассматривали вещественные типы.)

Кроме обычных арифметических операций, к целочисленным значениям в Тurbо Раscаl применимы две специальные операции деления, обозначаемые зарезервированными словами DIV и МОD. Что собой представляют эти операции? Предположим, в программе определены две целочисленные переменные: А и В. Тогда результатом операции a div b будет целая часть частного от деления А на В. Например:

33 div 2=16;

8

Page 8: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

3 div 7=0;8 div 2=4;

А результатом операции а mod b будет остаток от деления А на В (не путать остаток с дробной частью), например:

33 mod 2=1;3 mod 7=3;8 mod 2=0;

Что касается операций сравнения, то здесь все обстоит так, как и с вещественными значениями.

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

Применимые стандартные подпрограммыК переменным и значениям, принадлежащим одному из

целочисленных типов, применимы процедуры и функции для работы с порядковыми типами, математические функции, а также некоторые функции преобразования типов (такие как Chr, High, Low, Ord).

2.2.2.2. Символьный тип. В Тurbо Раsсаl принят единственный стандартный символьный тип данных – Chаr. Переменные этого типа предназначены для хранения отдельных символов – букв, цифр и специальных знаков. Например, если переменная Symbol принадлежит типу Char, то оператор Symbol:='В' присвоит этой переменной значение, соответствующее букве "В". А если этой переменной присвоить значение '3', то необходимо понимать, что это всего лишь символ, а не число, над которым можно производить арифметические действия. К символьным значениям относятся все символы таблицы ASCII, кроме символа "штрих" ('), который используется при явном указании в программе значения типа Chаr.

Применимые операции

9

Page 9: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

Над значениями типа Chаr возможны операции сравнения =, <>, > >=, <, <= (см. табл.2). Причем они дают тот же результат, что и будучи применены к кодам соответствующих символов. Например, 'а'<'b' точно так же, как и 97<98 (97 – это код символа ‘а’, а 98 – код символа 'b' – см. таблицу ASCII). Результатом применения операций сравнения к значениям типа Chаr будет значение типа Вооlеаn (так же, как и при применении этих операций к значениям других типов).

Применимые стандартные подпрограммыК переменным и значениям, принадлежащим символьному типу,

применимы процедуры и функции для работы с порядковыми типами, а также некоторые функции преобразования типов (такие как High, Low, Оrd). Кроме упомянутых выше, к символьным значениям применима функция UpCase, преобразующая аргумент (значение типа Chаr) в символ верхнего регистра.

2.2.2.3. Логический тип. Переменные типа Вооlеаn принимают значения TRUE и FALSE (правда и ложь), которые также могут быть представлены в виде двоичных цифр – соответственно 1 и 0.

Применимые операцииНад значениями логического типа допустимы операции

сравнения (см. табл.2), причем считается, что TRUE больше FALSE. Возможно, такое утверждение вызовет недоумение, однако если эти логические значения заменить эквивалентными им двоичными цифрами, все становится на место. Конечно же 1>0.

К логическим значениям также применимы логические операции, которые перечислены в табл.4.

Таблица 4. Логические операции

Обозначение операции Выполняемое действие

АND (И) Логическое умножениеОR (ИЛИ) Логическое сложениеХОR (исключающее ИЛИ) Сложение по модулю 2N0T (НЕ) Логическое отрицание

Предположим, в программе определены переменные А и В, 10

Page 10: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

принадлежащие типу Вооlеаn. Результаты применения к этим переменным (при различных значениях) логических операций демонстрирует табл. 5.

Таблица 5Результаты применения логических операций

Значения Операцииа B а аnd b а оr b а хоr b nоt а

false false false false false truefalse true false true true truetrue false false true true falsetrue true true true false false

Здесь, вероятно, уместно напомнить, что результат типа Вооlеаn возвращают операции сравнения, примененные к вещественным, целочисленным и символьным значениям. Например, 4>3 имеет значение TRUE; 5.33<>3.22 даст значение ТRUЕ; 'а' >'b' имеет значение FALSЕ.

Применимые стандартные подпрограммыЛогический тип относится к перечислимым типам, причем

переменные и значения типа Вооlеаn могут принимать только два значения: TRUE и FALSЕ (TRUЕ>FALSЕ).

К переменным и значениям, принадлежащим логическому типу, применимы (с учетом особенностей этого типа, изложенным в предыдущем абзаце) все процедуры и функции для работы с порядковыми типами, а также некоторые функции преобразования типов (такие как High, Low, Оrd).

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

11

Page 11: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

tуре dау = (Sundау, Моndау, Тuеsdау, Wednesdау, Тhursdау, Friday,

Saturdау);vаrх,у,z: dау;

Объявленный здесь тип dау относится к перечислимым типам. Переменные x, y, z – переменные типа dау (перечислимого), объявленного пользователем.

Конечно, переменные x, y, z здесь можно было бы объявить как принадлежащие типу integеr и обозначить дни недели соответствующими цифрами. Однако цифры не всегда и не у всех ассоциируются напрямую с днями недели, поэтому предложенное выше решение следует признать более удобным и естественным.

Три переменные, соответствующие дням недели, можно объявить в программе и следующим образом:

vаrх,у,z: (Sundау, Моndау, Тuеsdау, Wednesdау, Тhursdау, Friday,

Saturdау);

Иными словами, перечислимый тип можно также определить анонимно (без имени). Для этого в разделе VAR для соответствующей переменной вместо типа следует указать (в скобках) перечень допустимых значений. Тем не менее, первый подход (создание нового перечислимого типа с именем) предпочтительнее, поскольку в этом случае программа получается нагляднее.

Имена значений перечислимого типа, указанные в круглых скобках, очень удобно использовать в операторе САSЕ, например:

саsе х оf Sundау: writе('Воскресенье');Моndау: writе('Понедельник');Тuesdау: write('Вторник') ;Wednesday: write(' Среда');Thursday: write('Четверг');Friday: write(' Пятница');

12

Page 12: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

Saturday: write('Суббота') end;

Здесь оператор САSЕ использован для перевода названий дней недели с английского языка на русский. (Названия дней являются здесь идентификаторами, а мы помним, что в программе на языке Тurbо Pascal нельзя использовать буквы русского алфавита).

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

vаrх:(bluе, rеd, white);у: (уеllоw, white, grееn);

Здесь объявлены две переменные перечислимого типа. Среди допустимых значений обеих переменных имеется значение WHITЕ. Подобное писание переменных некорректно если в программе встретится идентификатор WHITE, то не ясно, к какой переменной он относится – X или Y.

Применимые операцииСчитается, что представленные в скобках значения

перечислимого типа упорядочены по возрастанию. Поэтому к переменным и значениям перечислимого типа могут применяться операции сравнения =, <>, >, >=, <, <= (см. табл.2), если сравниваемые значения или переменные относятся к одному типу. Например, если обратиться к объявленному выше типу dау, то значение Sundау считается меньше значения Моndау.

Применимые стандартные подпрограммыК переменным и значениям, принадлежащим перечислимому

типу, применимы процедуры и функции для работы с порядковыми типами, а также некоторые функции преобразования типов (такие как Нigh, Low, Ord).

2.2.2.5. Диапазоны. Для создания нового типа, помимо

13

Page 13: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

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

Вот примеры объявления интервальных типов:

vаr х:1..12;у:-10..10;z:'А'..'Z';

Здесь объявлены три переменные интервального типа, причем если для первых двух базовым является один из целочисленных типов, то для третьего – символьный тип (Сhаr). Кстати, две точки, разделяющие минимальное и максимальное значения интервала, рассматриваются как единый символ. Иными словами, пробел между ними недопустим.

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

tуреТуре1=1..12;Туре2=-10..10;Туре3='А'..'Z';vаr х:Туре1;у:Туре2;z:Туре3;

Приведенные два объявления переменных X, Y и Z эквивалентны.

14

Page 14: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

Применимые операцииИнтервальный тип наследует все свойства базового типа, в том

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

Применимые стандартные подпрограммыКак уже отмечалось, интервальный тип наследует все свойства

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

2.3. СтрокиСтроки занимают промежуточное положение между простыми и

структурированными типами данных. Почему строки нельзя отнести к простым типам? Здесь все ясно. Строка – это последовательность символов, иными словами – структура, состоящая из элементов простого типа.

Почему строки нельзя отнести к структурированным типам? Это объяснить сложнее. Во-первых, строковый тип в Тurbо Раsсаl относится к стандартным типам данных, а ни один из структурированных типов, с которыми мы познакомимся позже, стандартным не является.

Во-вторых, над строками применимы некоторые действия, допустимые для данных простых типов и неприменимые к структурированным типам. Например, строку можно ввести с клавиатуры или вывести на экран, воспользовавшись операторами Read(х) и Write(х) соответственно, где Х – строковая переменная. Также допустимо сравнивать целые строки. Однако эти действия невозможны с данными структурированных типов – массивами или записями, о которых речь пойдет позже.

Строковый тип данных известен также как тип STRING. (STRING – не идентификатор, а зарезервированное слово). Тип

15

Page 15: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

STRING наряду с целочисленными и вещественными типами, а также типами Сhаr и Boolean, о которых речь шла выше, относится к стандартным типам данных. Значение типа STRING представляет собой строку, длиной до 255 символов. Вот примеры таких значений:

‘12345' '@#$&' 'TRUE' 'АБВГД' 'Введите значение А'

Следует понимать, что строка '12345' не имеет ничего общего с числами и над ней нельзя проводить арифметических действий, как и со значениями типа Сhar '1 ' 5' ' 8'. Также строка 'TRUE' вовсе не является значением типа Вооlеаn.

Так может выглядеть раздел описаний переменных, в котором объявлены переменные типа STRING:

vаr а:string; b:string[80];

Как уже отмечалось, значение типа STRING представляет собой строку, длиной до 255 символов (с 1 по 255). При этом нулевой байт строки содержит информацию о ее текущей длине.

В случае, если максимальная длина строки не указана явно (как у переменной А в примере выше), по умолчанию она считается равной 255 символов. Однако при объявлении переменной можно задать иную максимальную длину строки. Так, значение переменной В (см. выше) представляет собой строку, длиной до 80 символов.

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

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

16

Page 16: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

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

2.3.1.1. Действия над отдельными символами. Обратиться к отдельному символу строки можно, указав имя строковой переменной, а также порядковый номер символа в строке. Например:

а[5]:='F’;write(b[33]);

Поскольку отдельные символы строки представляют собой значения типа Сhаr, над элементами строки допустимы те же действия, что и над символьными значениями – прежде всего операции сравнения =, <>, >=, <, <= (см. табл.2). Результатом применения этих операций к элементам строки будет значение типа Вооlеаn (так же, как и при применении этих операций к значениям других типов). Вот примеры использования операций сравнения с элементами строк:

if а[5]>'F' then ... while b[11]='4' dо ...

2.3.1.2. Действия над строкой. Что касается операций над строкой в целом, то, как указывалось в начале раздела о строках, можно значения типа STRING вводить с клавиатуры и отображать на экране с помощью единственного оператора. Например:

Read(a);Write(b);

В первом случае значение переменной A (цепочку символов, длина которой не превышает максимальной длины строки) придется ввести с клавиатуры (опустив при этом апострофы). Во втором случае значение строковой переменной В (последовательность символов) окажется выведено на экран.

Также можно всей строке (т.е. строковой переменной) сразу

17

Page 17: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

присвоить нужное значение. При этом явно заданное значение типа STRING заключается в апострофы. Например:

а:= 'Это строка' b:= ‘’

В последнем случае строковой переменной В присвоена в качестве значения так называемая "нулевая строка" (т.е. строка, включающая только нулевой символ с информацией о ее длине, которая равна нулю).

Кроме того, для строк допустима операция объединения (или сцепления, или конкатенации). Вот как это выглядит:

а:= 'Это строка, '+'которая '+'служит примером.'

После выполнения этого оператора значением переменной А станет строка:

'Это строка, которая служит примером.'

При этом, если длина объединенной строки превысит максимальную длину, допустимую для переменной А, "лишние" символы окажутся отброшены.

Операцию объединения можно применять не только к явно заданным значениям, но и к переменным типа STRING:

а:=b+с;

Здесь А, В и С – строковые переменные. В результате выполнения этого оператора текущие значения переменных В и С окажутся слиты и полученное строковое значение будет присвоено переменной А.

Также к строкам применимы операции сравнения. Например, в программе могут встретиться операторы:

'АВС'<'АВс';a<b;

18

Page 18: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

В первом случае сравниваются строковые значения, заданные явно, во втором – переменные строкового типа.

2.3.1.3. Манипулирование длиной строки. Возможно также воздействие на длину строки. Как уже упоминалось, информация о текущей длине строки содержится в ее нулевом байте, к которому можно обратиться так же, как и к остальным элементам строки, например,

j:=оrd(а[0])

Таким образом, можно выяснить текущую длину строки. (Правда, для этого существует специальная функция Length, о которой мы узнаем дальше.) Таким же образом можно изменить текущую длину строки, например, уменьшить, присвоив иное значение, чтобы "отсечь" ненужное содержимое строковой переменной.

Судя по оператору j:=оrd(а[0]), информация о длине строки хранится в ее нулевом байте не как число, а в виде символа таблицы АSCII, код которого и соответствует длине. Это предположение подтверждает тот факт, что максимальная длина строки составляет 255 символов (не считая нулевого байта), а в таблице АSCII содержится 256 символов (с 0 по 255). Иными словами, если воспользоваться оператором write(а[0]), то на экран окажется выведено не число, а символ.

2.3.2. Применимые стандартные процедуры и функции. Подпрограммы, предназначенные для работы со строками, содержатся в модуле SYSTEМ. Речь идет о таких процедурах и функциях, как Соnсаt, Сору, Delete, Insert, Length, Роs, Str и Val.

2.4. Cтруктурированные типы данныхПростые типы (как стандартные, так и определенные

пользователем) назначены для элементарных значений, для хранения которых достаточно единственной ячейки памяти. Однако часто при программировании различных задач возникает необходимость оперировать логически связанными наборами простых данных. Структурированные типы, которым посвящен данный раздел, как раз

19

Page 19: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

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

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

tyре s=аrrау [i] of а

Здесь ARRAY и ОF – зарезервированные слова, имеющие смысл массив и из; S – имя регулярного типа; I – тип индексов (указывается в квадратных скобках); А – тип элементов массива (базовый тип). Элементы массива могут представлять собой значения любого типа. Для индексирования массива в Тurbо Раsсаl используется тип данных. Это может быть любой из целочисленных типов (за исключением Longint), и Вооlеаn, а также перечислимый и интервальный типы (за исключением интервальных типов на основе Longint). Вещественные типы для индексирования массивов не годятся.

Вот примеры описания регулярных типов (анонимных):

var a1:аrrау [byte] оf bооlеаn; a2:аrrау [сhаr] оf bооlеаn; a3:аrrау [Red,Yеllоw,Grееn] оf сhаr; а4:аrrау [1..100] оf integеr;

Здесь А1 (первый пример) представляет собой массив из 256 (0..255) значений типа Вооlеаn. А2 – это массив также из 256 значений типа Вооlеаn, однако, в отличие от массива А1, он

20

Page 20: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

индексируется значениями типа Сhаr. Обращения к отдельным элементам массивов А1 и А2 выглядят так:

а1 [90]:=fаlsе;а2 [z]:=truе;

Содержимое массивов А1 и А2 может быть следующим:

1-й элемент 2-й элемент 3-й элемент 4-й элемент ... 256-й элемент TRUE FALSE TRUE FALSE … TRUE

(Элементы 1 – 256 массива А1 будут обозначаться числами с 0 по 255, а массива А2 – символами таблицы ASCII по порядку.)

Третий пример (А3) представляет собой массив из трех элементов типа Сhаr. Элементы этого массива обозначаются именами Red, Yеllоw и Grееn (для индексирования здесь использован перечислимый тип). Примеры обращений к элементам этого массива можно видеть в табл.6.

Содержимое массива А3 может выглядеть так:

А3[Red] А3[Yе11оw] А3[Grееn] 'А' '$' '8'

Таблица 6 Манипуляции над элементами массива

Пример обращения

Комментарий

A3[Red]:=chr(100) Элементу Red массива A3 присваивается значение типа Char, соответствующее букве ‘d’

A3[Red]:=’d’ Эквивалент предыдущего оператораWrite(a3[Yellow]) Значение элемента Yellow массива A3 выводится

на экранread(a3[Green]) Значение элемента Green массива A3 вводится с

клавиатуры

21

Page 21: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

Наконец четвертый пример (массив А4) – это массив из 100 элементов, принадлежащих типу integеr. Индексным типом здесь служит интервальный тип (диапазон). (Кстати, для индексирования массива этот тип используется очень часто, поскольку наиболее наглядно задает границы изменения индексов.)

Следует понимать, что индексы массива могут представляться не только в виде явно заданных значений, но и переменных, и выражений. Предположим, в некоторой программе объявлены переменные А5 и I:

Varа5:аrrау[1..20] оf integеr;i:integеr;

Затем элементам массива А5 и переменной I присвоены некоторые значения. После этого в программе могут фигурировать следующие обращения к элементам массива А5:

а5[i+1];а5[2*i];а5[i/2-5];а5[22-i];

При этом необходимо, чтобы значения выражений в квадратных скобках (т.е. значения индекса) не выходили за пределы допустимых значений (в нашем случае 1..20).

Само собой разумеется, массивы можно объявлять не только в качестве анонимных типов, но и как типы с собственным именем – в разделе описания типов:

Tуре LogScalе=аrrау [bytе] оf bооlеаn;vаr а1:LogScale;

Можно заметить, что массивы очень похожи на строки. Действительно, массив – это последовательность однотипных элементов, так же, как и строка, однако если символы строки

22

Page 22: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

представляют собой только значения типа Сhаr, то элементы массива могут принадлежать различным типам – как простым, так и структурированным.

Обращения к отдельным элементам строк и массивов выглядят одинаково – для этого достаточно указать имя строки или массива и индекс. Однако имеются и отличия: если текущей длиной строки можно манипулировать, то для массивов ничего подобного не предусмотрено. Длина строки также ограничена 255 символами, в то время как для массивов такого ограничения нет. Кроме того, можно ввести или вывести значение всей строковой переменной с помощью единственного оператора (например, Read(Х) или Write(Х), где Х – значение типа STRING), а для массивов это невозможно.

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

2.4.1.1. Многомерные массивы. В Тurbo Раsсаl элементы массива могут представлять собой значение не только простых, но и структурированных типов. Допускается, например, существование массивов, элементами которых являются также массивы. Описание подобного массива выглядит так:

а1=аrrау[1..5] оf аrrау [1..4] оf integer;

Этот массив можно представить в качестве двумерной матрицы с 20 элементами (4 на 5). Возможна сокращенная запись приведенного выше описания массива:

а1=аrrау [1..5, 1..4] оf integеr;

Эти описания эквивалентны. Обращение к одному из элементов данного массива выглядит так:

а1[3][4] илиа1[3,4]

А вот так выглядит этот двумерный массив (или матрица)

23

Page 23: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

полностью:

а1[1,1] а1[1,2] а1[1,3] а1[1,4] а1[2,1] а1[2,2] а1[2,3] а1[2,4] а1[3,1] а1[3,2] а1[3,3] а1[3,4] а1[4,1] а1[4,2] а1[4,3] а1[4,4] а1[5,1] а1[5,2] а1[5,3] а1[5,4]

Возможны не только двумерные, но и многомерные массивы, причем число измерений не ограничивается. Однако при этом сохраняется ограничение в 64К (или 65520 байт) на размер переменных регулярного типа. Это связано с максимальным объемом памяти, выделяемой для данной переменной.

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

Действия над элементами массиваПоскольку элемент массива трактуется как переменная, он

может фигурировать в выражениях. Набор операций над элементами массива соответствует операциям, допустимым для базового типа. Примеры манипулирования элементами массива можно видеть в табл.7.

Таблица 7Действия над элементами массива

Пример действия КомментарийWrite(6?a1[5]) На экране отображается число 6, а затем

значение 5-го элемента массива A1a4[5]:=а4[3]+а4[2] Значения 3 и 2-го элементов массива А4

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

abc:=аbс+а4[88] Значение 88-го элемента массива А4 суммируется со значением переменной abс, и полученная сумма присваивается этой же переменной

24

Page 24: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

abс:=а4[55]+а4[56] Значения 55 и 56-го элементов массива А4 cкладываются, и полученная сумма присваивается переменной abс

a4[33]:=а4[33]+20 Значение 33-го элемента массива А4 увеличивается на 20

Действия над массивамиЧто касается набора операций над массивами в целом, то

скопировать все элементы из одного массива в другой можно единственным оператором присваивания. Например, если Х и Y –массивы, принадлежащие одному типу, то правомерен оператор

X := Y;

Этот оператор копирует значения всех элементов массива X в массив Y.

Однако нельзя использовать с массивами операции сравнения. Неверно, например, было бы к массивам Х и Y применить оператор

while х=у do...

Тем не менее, если такая необходимость существует, можно организовать поэлементное сравнение массивов.

Также абсолютно неприменимы к массивам арифметические и логические операции.

Кроме того, напомним, что к массивам (в отличие от строк) нельзя применять стандартные процедуры Read и Write. Однако можно организовать считывание или вывод на экран каждого элемента массива в отдельности.

2.4.2. Записи. Подобно массиву запись представляет собой совокупность родственных данных. Однако, в отличие от массива, запись может содержать элементы, принадлежащие различным типам. Этим обуславливаются различия в механизмах доступа к отдельным элементам. Место элемента в массиве определяется его индексом, и элементы массива можно различным образом сортировать. Что касается записей, то здесь каждый элемент имеет собственное имя, а операция сортировки для элемента записи смысла

25

Page 25: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

не имеет.Запись (или комбинированный тип данных) очень хорошо

подходит для объединения разнородной информации о каком-либо объекте. Это могут быть технические характеристики некоторого устройства, экономические данные предприятия или сведения о человеке. Элементы, образующие запись, называются полями.

Описание записи имеет вид:

Tyре а=rесоrd х,у:m; . . . z:n еnd;

Здесь А – имя объявляемого комбинированного типа.RECORD и ЕND – зарезервированные слова, имеющие смысл

запись и конец;X, Y, Z – имена полей;М и N – типы, которым принадлежат те или иные поля.После зарезервированного слова RECORD точка с запятой не

ставится. Описания отдельных полей (или групп полей, принадлежащих одному типу) завершаются точкой с запятой (кроме последнего поля перед служебным словом END). Описания полей записи похожи на описания обычных переменных. Поля могут принадлежать любым типам – как простым, так и структурированным, как стандартным, так и определимым пользователем. Например, допустимы записи, поля которых представляют собой также записи или, например, массивы.

Количество полей в записи фиксировано и определяется описанием записи. Имена полей в пределах записи не должны повторяться. Если в программе объявлены несколько комбинированных типов, имена полей, принадлежащих разным типам, могут совпадать; конфликта имен при этом не будет, поскольку обращение к отдельным полям производится с оказанием имени записи (об этом далее). Как и с другими идентификаторами в программах на Тurbо Раsсаl, следует стремиться, чтобы имена полей соответствовали смыслу информации в том или ином поле. А инфор-

26

Page 26: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

мация, в свою очередь, должна соответствовать типу своего поля.Организация данных о людях – один из наиболее типичных

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

Tyре Еmрlоуее=rесоrd ID:word; {Идентификатор (личный номер)} FirstName, SecondName, SurName : string[20]; {Имя, фамилия, отчество} Standing: bytе; {Стаж} Salary:rеаl {Зарплата} end;var Аssistant:Еmрlоуее;

Описанный выше комбинированный тип Еmрlоуее включает шесть полей, три из них – FirstName (Имя), SecondName (Отчество) и SurName (Фамилия) – представляют собой строки по 20 символов каждая. Для остальных полей – ID (Идентификатор), Standing (Стаж) и Salary (Зарплата) – выбраны типы, также подходящие для соответствующей информации.

Содержимое одной из записей, принадлежащих типу Еmрlоуее, выглядит так:

ID SurName FirstName SecondName Standing Salary14873 Петров Иван Кузьмич 15 1000

Доступ к отдельным полям проводится с помощью составных имен, включающих имя записи и имя поля, разделенные точкой. Вот как можно обратиться к различным полям переменной Assistant из примера выше:

27

Page 27: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

Assistant.ID:=19876;write(Аssistant.FirstName);read(Аssistant.SecondName);Аssistant.Surname:='Петров';а:=Аssistant.Standing;Аssistant.Salary/100;

Иными словами, манипулировать полями записи можно так же, как переменными, с учетом типа, которому принадлежит то или иное поле.

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

write(Аssistant:FirstName[1]);

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

writе(Петров ');write(Аssistant.FirstName[1],'. ');write(Аssistant.SecondName[1],'.');

В результате выполнения этой последовательности операторов на экране отобразится:

Петров И. К.

2.4.2.1. Оператор WITН. Как указывалось выше, если в операторах используются составные имена (имя записи плюс имя поля), такие операторы получаются чересчур громоздкими. Ситуация еще больше ухудшится, если несколько подобных операторов окажутся сосредоточены в одном месте программы. В этом случае

28

Page 28: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

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

Оператор WITН имеет вид:

With p do s;

Использованные здесь зарезервированные слова WIТН и DO имеют смысл с и выполнить соответственно. Идентификатор Р – имя переменной комбинированного типа. Идентификатор S – оператор (часто составной).

Обращения к шести полям записи Аssistant, представленные выше, можно преобразовать так (предполагается, что эти операторы следуют в программе один за другим):

with Assistant dо begin ID:=19876; write(FirstName); read(SecondName); SurName:='Петров'; а:=Standing; Salary/100 end;Здесь имя переменной Аssistant употребляется всего один раз –

после оператора WIТН. Затем все действия над полями (в составном операторе) выполняются только с указанием имен полей.

Иными словами, оператор WIТН особенно полезен, когда обрабатывается несколько полей одной переменной комбинированного типа. Однако злоупотреблять использованием оператора WIТН также не следует, поскольку в результате часто неочевидно, к чему относится тот или иной идентификатор. Например, идентификатор Аssistant.ID более информативен, чем просто ID. Это особенно верно, если составной оператор, выполнение которого инициирует оператор WITН, включает множество операторов.

2.4.2.2. Иерархические (вложенные) записи. Возможно существование записей, отдельные поля которых представляют собой

29

Page 29: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

также записи. Для того чтобы понять, как это реализуется, попробуем добавить в описание комбинированного типа Еmрlоуее пару полей-записей. Пусть это будут поля, содержащие информацию об адресе служащего (почтовый код, город, улица, дом, квартира) и его дате рождения (число, месяц, год). В принципе соответствующие поля (пять полей и три поля с данными соответственно об адресе и дате рождения) можно добавить непосредственно в описание комбинированного типа Еmрlоуее. А что если эту информацию впоследствии потребуется использовать в качестве полей еще в каких-нибудь комбинированных типах? Поэтому лучше для адреса и даты рождения создать самостоятельные комбинированные типы в разделе описаний программы, которые затем добавить как поля в тип Еmрlоуее. Описание этих типов может выглядеть так:

tуреAddress = rесоrd РоstСоdе:1.. 999999; {Почтовый код} City,Street:string[20]; {Город, улица} House:word; {Дом} Араrtment:word {Квартира} end; {address} Date = rесоrd Dау:1..31; {Число} Моnth:1..12; {Месяц} Yеаr;1900..2000 {Год} end; {date} NеwЕmрlоуее = record ID:word; {Идентификатор (личный номер)} FirstName, SecondName, SurName : string[20]; {Имя, фамилия, отчество} Standing: bytе; {Стаж} Salary:rеаl {Зарплата} BirthDate:date; {Дата рождения} Habitation:address {Место жительства} end;vаr NewAssistant: NеwЕmрlоуее;

30

Page 30: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

Описанный выше комбинированный тип NеwЕmрlоуее включает восемь полей, два из которых – BirthDate (Дата рождения) и Habitation (Место жительства) – представляют собой записи, типы которых (Date и Address соответственно) объявлены перед описанием типа NеwЕmрlоуее. Структура комбинированного типа NеwЕmрlоуее представлена на рис.1.

Рис.1. Тип NewEmployee

Составные имена, с помощью которых можно обращаться к полям вложенных записей, должны включать имя основной записи, имя вложенной записи и имя поля. Например:

NеwЕmрlоуее.Аddress.РоstСоdеили NеwЕmрlоуее.Date.Dау

Если имеют место несколько уровней вложения записей, составные имена могут быть очень длинными. Однако ничто не мешает в этих случаях широко применять оператор WIТН.

2.4.2.3. Записи с вариантами. Иногда возникает необходимость, чтобы в зависимости от значения определенного поля записи структура этой записи частично изменялась. Например, одно из полей комбинированного типа Еmрlоуее, которое представляет собой

31

Page 31: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

вложенную запись, содержит информацию о месте жительства служащего. Однако городской адрес обычно выглядит не так, как загородный. Что если кто-либо из членов коллектива проживает за пределами города? Для решения этой проблемы Turbo Раsсаl позволяет в структуре комбинированного типа Аddress создать вариантную часть, в которой набор полей мог бы изменяться в соответствии с видом адреса. Итак, в структуре адреса необходима некоторая фиксированная часть – группа полей, присутствующих постоянно, независимо от характера адреса, и вариантная часть с изменяющимся набором полей. Фиксированная часть в нашем случае могла бы включать поля PostCode (почтовый код), Street (улица) и Ноusе (дом) – элементы, присутствующие в любом адресе. Вариантная часть записи для городского адреса могла бы включать поля City и Apartment (город и квартира), а для загородного адреса – поля Аrеа (область), District (район) и Community (населенный пункт). Для управления вариантной частью адреса введем в структуру комбинированного типа Address поле City_оr_Country (город/загород), для которого допустимы только значения City и Country. Вот как может выглядеть описание такого преобразованного комбинированного типа (присвоим ему имя NewAddress):

tуреNewAddress = rесоrd РоstСоdе:1.. 999999; {Почтовый код} Street:string[20]; {Город, улица} House:word; {Дом}саsе City_оr_Country : City,Country оf City:(City:string[20]; {Город} Appartment:word); {Квартира} Соuntrу :(Аrеа,District, {Область, район} Community:string[20]); {Населенный пункт} end; {NewAdress}

Фиксированная часть записи всегда предшествует вариантной части. Описание фиксированной части ничем не отличается от описания обычной записи (без вариантов). Вариантная часть начинается со строки,

32

Page 32: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

саsе City_оr_Countrу : City,Countrу оf

которая объявляет специальное поле City_оr_Countrу, способное принимать только два значения (Citу и Сountrу – т.е. принадлежит перечислимому типу). Это поле, которое называется полем признака (или селектором выбора – по аналогии с оператором САSЕ), определяет вариантную часть записи.

Строка, начинающая вариантную часть, включает зарезервированные слова CASE и OF, имеющие смысл вариант и из соответственно Дальше следует перечень меток, представляющих собой все допустимы значения поля признака (в нашем случае две метки – City и Country). После каждой метки (за двоеточием, в круглых скобках) представлен перечень полей для данного варианта, причем для каждого поля указывается тип. Завершение данной конструкции CASE-OF – перечень меток ключевым словом ЕND не предусмотрено. Правда, в конце описание комбинированного типа NewAddress слово ЕND все же имеется, однако оно здесь служит парой зарезервированному слову RECORD, а не CASE. Иначе говоря, то, что мы здесь видим, вовсе не представляет собой оператор CASE, а является всего лишь конструкцией, внешне похожей на оператор САSЕ, описывающей вариантную часть записи.

Структура комбинированного типа NewAddress представлена на рис.2.

При использовании записей с вариантами следует иметь в виду следующие особенности.

• В записи может быть только одна вариантная часть, которая должна быть описана непременно после фиксированной части.

• Поле признака вариантной части не принадлежит ни к фиксированной, ни к вариантной частям и выносится в заголовок вариантной части.

• Идентификаторы всех полей записи – как в фиксированной, так и в вариантной части – должны быть уникальными (не совпадать).

• Для некоторых меток допускается "пустой вариант". В этом случае после двоеточия следует пара круглых скобок, без перечня полей.

• Объем памяти, выделяемый для записи, определяется суммой длин полей. Объем памяти для записи с вариантами определяется по

33

Page 33: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

самому объемному варианту.

Рис.2. Тип NewAddress

В созданном нами комбинированном типе NеwЕmрlоуее мирно сосуществуют вложенные записи (Date и NewAddress) и записи с вариантами. Собственно, вложенная запись NewAddress одновременно является записью с вариантами. Этот пример наглядно иллюстрирует, насколько сложные структуры данных можно создавать с использованием записей.

И это еще не все, что касается сложности структур, которые позволяют создавать комбинированные типы.

2.4.2.4. Применимые операции. В этом разделе суммируются сведения о действиях, позволяющих манипулировать записями. Причем выделяются две категории действий: применимые к полям записей и к записям в целом.

Действия над полями записиПоскольку поле записи трактуется как переменная, оно может

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

34

Page 34: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

Действия над записямиЗдесь, вероятно, уместно повторно упомянуть оператор WITH,

который так и называется: оператор над записями. Кроме того, как и с массивами, значения переменных,

принадлежащих комбинированному типу, можно присваивать другим переменным того же типа. Например, если переменные Х и Y представляют собой записи, принадлежащие одному комбинированному типу, то допустим оператор присваивания

х:=у;

В результате значения всех полей записи Х окажутся присвоены полям записи Y.

Однако нельзя использовать с записями операции сравнения. Неверно, например, было бы к записям Х и Y применить оператор

while х=у do...

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

Совершенно не применимы к записям (в целом) арифметические и логические операции.

Кроме того, следует особо подчеркнуть, что к записям (подобно массивам, но в отличие от строк) нельзя применять стандартные процедуры Read и Write. Однако можно организовать считывание или вывод на экран каждого поля записи в отдельности.

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

Описание множественного типа:

Tуре s=set of а

Здесь SЕТ и OF – зарезервированные слова, имеющие смысл

35

Page 35: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

множество и из; S – имя объявляемого множественного типа; А – базовый тип множества.

Вот примеры описаний множественных типов и переменных, принадлежащих этим типам:

tуре а1=set of 1..3; а2=set of а..е; а3=set of char;vаr х:а1; у:а2; z:а3;

В качестве базового для множественного типа А1 задан интервальный тип (1..3). Переменная X, принадлежащая множественному типу А1, может принимать значения [], [I], [2], [1,2], [3], [1,3], [2,3], [1,2,3] (всего 8 (2³) значений). Иными словами, значениями множества могут быть все входящие в него подмножества – от нуля элементов (пустое множество) до всех возможных значений базового типа. Кстати, в Тurbo Pascal допускается использование (например, в операторах присваивания) явно заданных значений множественного типа, подобно, например, целочисленным или вещественным значениям. В этом случае элементы множества задаются через запятую и все значение заключается в квадратные скобки. Например:

х:=[1,3];х:=[];

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

В качестве базового для множественного типа А2 задан диапазон а..е. Переменная Y, принадлежащая множественному типу А2, может принимать значения, соответствующие всем подмножествам, входящим в это множество (всего 32 (25) значения).

Наконец, в качестве базового для множественного типа А3 выбран стандартный тип Char. Число значений, которые может принимать переменная Z (объявленная как принадлежащая типу А3),

36

Page 36: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

равно 2256, причем значения эти представляют собой произвольные наборы символов из таблицы ASCII. Например, переменная Z может иметь значение

[‘3’, ‘f’, ‘(‘, ‘#’, ‘п’, ‘Л’]

Значение переменной Z можно представить и так:

[сhr(45),сhr(54),сhr(58),сhr(65),сhr(73),сhr(78),сhr(89)].

Помимо того, что множество может включать произвольное число элементов, имеет место еще одно отличие множеств от массивов. Если массив – это упорядоченная совокупность элементов, то в множестве порядок элементов никак не фиксируется. Так. [1,2,3,4,5] и [5,2,1,4,3] – это одно множество. Кроме того, все элементы в множестве должны быть различными. Иными словами, [1,2,3] и [1,1,2,3,3,3] – это также одно множество.

Представление множества возможно путем перечисления входящих в него элементов или заданием диапазона (если члены множества образуют неразрывную последовательность), т.е. множество [1,2,3,4,5] можно также представить как [1..5]. Допускается сочетание двух методов: [1..5,7,9].

Число элементов множества в Turbo Pascal не должно превышать 256 (причем, для целочисленных типов эти значения должны лежать в диапазоне (0,...,255). Вследствие этого ограничения в качестве базовых типов для множеств (из стандартных типов) могут служить только Byte, Char и Boolean. Не удастся использовать для множества в качестве базового, например, тип Integer, хотя подходят интервальные типы, образованные на основе integer.

2.4.3.1. Применимые действия. Набор допустимых для множеств операций включает проверку принадлежности элемента множеству; объединение, пересечение и вычитание множеств; сравнение множеств (проверку равенства и неравенств множеств, а также проверку принадлежности одного множества другому).

Проверка принадлежности элемента множествуДля этой операции в Turbo Pascal имеется специальный

оператор IN. Выражение с этим оператором возвращает значение

37

Page 37: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

типа Boolean. Вот пример использования оператора IN:

а in [1,3,5,7,9]

Это выражение проверяет, принадлежит ли значение переменной A данному множеству и возвращает значение TRUE либо FALSE. В случае, если бы оператора IN не существовало, нам пришлось бы воспользоваться гораздо более громоздким выражением для проверки данного условия:

(а=1) оr (а=3) оr (а=5) оr (а=7) оr (а=9)

В случае, если переменная А принадлежит множеству [1,3,5,7,9] оба выражения возвратят значение TRUE. Еще примеры:

3 in [1,3,5,7,9];4 in [1,3,5,7,9];

Эти выражения возвратят значения TRUE и FALSE соответственно.

Объединение, пересечение и вычитание множествЭти операции, будучи применены к двум множествам,

формируют третье. В Turbo Pascal эти операции обозначаются символами: + (объединение), * (пересечение), - (вычитание).

В результате объединения двух множеств А и В формируется третье, содержащее все элементы, встречающиеся в первых двух множествах (см. рис.3). Примеры можно видеть в табл.8.

Таблица 8Примеры объединения двух множеств

Объединение множеств Результат[1,2,3,4,5]+[3,4,5,6,7] [1,2,3,4,5,6,7]

[1,2]+[3,4] [1,2,3,4] [‘a’,’b’,’c’]+[‘A’,’B’,’C’] [‘a’,’b’,’c’,’A’,’B’,’C’]

[‘1’,’3’,’5’,’7’,’9’]+[‘1’,’3’,’5’,’A’,’B’] [‘1’,’3’,’5’,’7’,’9’,’A’,’B’]

38

Page 38: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

Часто возникает необходимость добавить в множество новый элемент (частный случай операции объединения). Эта задача может быть решена следующим образом:

[1,2,3,4,5]+[6]

В результате пересечения двух множеств А и В формируется третье множество, содержащее только элементы, одновременно принадлежащие первым двум множествам (см. рис.3). Примеры можно видеть в Табл.9.

Таблица 9 Примеры пересечения двух множеств

Пересечение множеств Результат[1,2,3,4,5]*[3,4,5,6,7] [3,4,5]

[1,2]*[3,4] [] [‘a’,’b’,’c’]*[‘A’,’B’,’C’] []

[‘1’,’3’,’5’,’7’,’9’]*[‘1’,’3’,’5’,’A’,’B’] [‘1’,’3’,’5’]

При вычитании множества В из множества А формируется третье множество, содержащее только элементы, принадлежащие множеству А и не принадлежащие множеству В (см. рис.3). Примеры можно видеть Табл.10.

Таблица 10Примеры вычитания двух множеств

Вычитание множеств Результат[1,2,3,4,5]-[3,4,5,6,7] [1,2]

[1,2]-[3,4] [1,2] [‘a’,’b’,’c’]-[‘A’,’B’,’C’] [‘a’,’b’,’c’]

[‘1’,’3’,’5’,’7’,’9’]-[‘1’,’3’,’5’,’A’,’B’] [’7’,’9’]

Необходимо иметь в виду, если в случае объединения и пересечения множества А и В поменять местами, результат не изменится, но, однако это вовсе не так для вычитания множеств.

39

Page 39: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

Пример можно видеть в табл.11.

Таблица 11Перестановка множеств при вычитании

Вычитание множеств Результат[‘1’,’3’,’5’,’7’,’9’]-[‘1’,’3’,’5’,’A’,’B’] [’7’,’9’][‘1’,’3’,’5’,’A’,’B’]-[‘1’,’3’,’5’,’7’,’9’] [‘A’,’B’]

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

Рис. 3. Объединение, пересечение и вычитание множеств

Сравнение множествК операциям сравнения множеств относятся проверка равенства

неравенства множеств, а также проверка принадлежности одного множества другому. Символы, которыми в Turbo Pascal обозначаются эти операции, представлены в табл.12.

Таблица 12Операции сравнения множеств

Обозначение Действие= Проверка равенства множеств

<> Проверка неравенства множеств<= Проверка вхождения множества слева в множество

справа>= Проверка вхождения множества справа в множество

40

Page 40: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

слева

Результат сравнения представляет собой значение типа Boolean (TRUE или FALSE – в зависимости от успеха проверки). Два сравниваемых множества должны иметь один базовый тип.

Операции = и <> проверяют, совпадает ли набор элементов в сравниваемых множествах. Примеры этих операций можно видеть в табл.13 и 14.

Таблица 13Проверка равенства множеств

Сравниваемые множества Результат[1,2,3]=[1,2,4] FALSE[1,2,3]=[1,2,3] TRUE[1,2,3]=[3,2,1] TRUE

[1,2]=[1,1,2,2,3] FALSE

Таблица 14Проверка неравенства множеств

Сравниваемые множества Результат[1,2,3]<>[1,2,4] TRUE[1,2,3]<>[1,2,3] FALSE[1,2,3]<>[3,2,1] FALSE

[1,2]<>[1,1,2,2,3] TRUE

Операции <= и >= проверяют, входит ли одно множество в другое. Множество слева входит в множество справа, если все элементы левого множества встречаются среди элементов правого множества. Примеры проверок по вхождению одного множества в другое представлены втабл.15 и 16.

Таблица 15Проверка вхождения левого множества в правое

Сравниваемые множества Результат[1,2,3]<=[1,2] FALSE

[1,2,3]<=[1,2,3,4,5] TRUE41

Page 41: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

[1,2,3]<=[4,3,2,1] TRUE[1,2,3]<=[1,3] FALSE

Множество справа входит в множество слева, если все элементы правого множества встречаются среди элементов левого множества.

Таблица 16 Проверка вхождения правого множества в левое

Сравниваемые множества Результат[1,2,3]>=[1,2] TRUE

[1,2,3]>=[1,2,3,4,5] FALSE [1,2,3]>=[4,3,2,1] FALSE

[1,2,3]>=[1,3] TRUE

2.5. Совместимость типовВ Turbo Pascal различают два вида совместимости типов:

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

2.5.1. Совместимость в выражении. Два типа данных считаются совместимыми в выражении, если соблюдается хотя бы одно из следующих условий.

• Типы идентичны.• Оба типа принадлежат вещественным типам (возможно,

разным).• Оба типа принадлежат целочисленным типам (возможно,

разным).• Один тип представляет собой поддиапазон другого.• Оба типа представляют собой поддиапазоны одного и того же

третьего (базового) типа.• Оба типа представляют собой множества с совместимыми

базовыми типами.• Один тип является строковым, а второй – строковым либо

42

Page 42: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

символьным.• Один тип является нетипизированным указателем (POINTER),

второй – любым другим ссылочным типом.

2.5.2. Совместимость по присваиванию. Выражение считается совместимым по присваиванию с переменой, если соблюдается одно из следующих условий.

• Типы идентичны и ни один из них не является файлом или принадлежит иному структурированному типу, компонентами которого являются файлы.

• Оба принадлежат совместимым порядковым типам, и при этом возможные значения выражения принадлежат диапазону значений, допустимых для переменной.

• Оба принадлежат вещественным типам, и при этом возможные значения выражения принадлежат диапазону значений, допустимых для переменной.

• Переменная относится к одному из вещественных типов, выражение – одному из целочисленных типов, и при этом все возможные значения выражения принадлежат диапазону значений, допустимых для переменной.

• Переменная принадлежит строковому типу, а выражение –символьному.

• Оба принадлежат совместимым множественным типам и при этом возможные значения выражения принадлежат диапазону значений, допустимых для переменной.

• Оба являются совместимыми типами указателей.Если переменная и выражение совместимы по присваиванию,

данное выражение может быть присвоено переменной и при этом ошибки зафиксировано не будет.

2.6. Приведение типовБывают случаи, когда без использования в операторе

присваивания переменных разных типов не обойтись. Тогда можно применить допускаемый Turbo Pascal прием, известный как приведение типов переменных. Предположим, в некоторой программе раздел описания переменных выглядит так:

var

43

Page 43: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

х:type1; y:type2;

После того как переменные Х и Y в программе получат некоторые значения, допустимы такие операторы присваивания:

x:=tуре1(у);y:=tуре2(х);

В первом операторе значение переменной Y (типа type2) трактуется как принадлежащее типу type1 и присваивается переменной Х (т.е. тип 2 приводится к типу tуре1). В этом случае данные типа tуре2 рассматриваются как данные tуре1, к которым просто можно обратиться с помощью идентификатора Y. Второй оператор проделывает то же со значением переменной X, которое присваивается переменной Y.

Конкретизируем пример. Предположим, что type1 – это Char, а type2 – Byte. Известно, что для переменных этих типов требуется один байт памяти, поэтому при преобразовании из одного типа в другой данные в этом случае ни расширяются, ни сокращаются. Для переменных X и Y допустимы операторы присваивания:

x:=byte(у);y:=char(х);

Здесь первый оператор присваивает переменной X (принадлежащей типу Char) значение переменной Y (типа Byte), представляя его при этом тоже как принадлежащее типу Char. А второй оператор приводит тип Char к типу Byte.

При приведении типов преобразуемый тип и тип, к которому происходит преобразование, должны быть перечислимыми или указателями.

Помимо приведения типов переменных, Turbo Pascal допускает приведение типов значений:

tуре(ехрression);

Здесь expression – выражение, принадлежащее некоторому типу,

44

Page 44: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

которое данный оператор позволяет трактовать как принадлежащее типу Туре (т.е. выражение Expression здесь приводится к типу Туре), например:

Byte(‘F’);

Здесь выражение 'F' приводится к типу Byte (т.е. символ преобразуется в соответствующий код). Еще пример:

Char(77);

В этом случае целочисленное значение (являющееся частным случаем выражения) 77 преобразуется в символ, соответствующий данному коду. Несколько примеров приведения типов можно видеть в табл.17.

Таблица 17Примеры приведения типов

Дейтвие РезультатBoolean(0) FalseBoolean(1) TrueChar(57) ‘9’

Integer(‘9’) 57

При приведении типов значений может иметь место как расширение, так и сокращение размера исходного значения. В случае расширения значения его знак всегда сохраняется.

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

3. ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

Для выполнения работы необходимо:1. Повторить правила техники безопасности при работе с

вычислительной техникой.2. Изучить раздел "Типы данных" лекционного курса, а также

теоретическую часть настоящих методических указаний.3. Получить у преподавателя вариант задания (варианты

45

Page 45: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

заданий приведены в разделе 6 настоящих методических указаний).4. Написать программу на Турбо Паскале (при необходимости

используя предварительно разработанный алгоритм).5. Ввести программу в компьютер, отладить и результаты

выполнения показать преподавателю.6. В соответствии с требованиями, приведенными в разделе 4,

оформить отчет по лабораторной работе.7. Защитить лабораторную работу, продемонстрировав препода-

вателю:отчет по лабораторной работе; умение решать аналогичные задачи;теоретические знания.При подготовке к защите для самопроверки рекомендуется

ответить на контрольные вопросы, приведенные в разделе 5.

4. ТРЕБОВАНИЯ К ОТЧЕТУ

Отчет по выполненной лабораторной работе должен содержать:титульный лист;условие задания;текст программы на языке Турбо Паскаль.

5. КОНТРОЛЬНЫЕ ВОПРОСЫ

1. Какие типы данных языка Паскаль относятся к простым типам, а какие к порядковым тимпам?

4. Что такое строка?3. Что такое массивы?4. Что такое записи?5. Для чего используется оператор WITH?6. Что такое вложенные записи?7. В каких случаях используются записи с вариантами?8. Что такое множество?9. Какие существуют виды совместимости типов в языке

Паскаль?10.Что такое приведение типов в Паскале?

6. ВАРИАНТЫ ЗАДАНИЙ

46

Page 46: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

Вариант 11. type mes = (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec); day = 1..31; var d1, d2: day; m1, m2: mes; t: boolean;Переменной t присвоить значение true, если дата d1, m1

предшествует (в рамках года) дате d2, m2, и значение false иначе.2. Дан текст из 30 литер. Напечатать только строчные русские

буквы, входящие в этот текст.3. Дан текст, содержащий от 1 до 70 букв, за которым

следует точка. Напечатать этот текст в обратном порядке.4. Создать массив записей, содержащих сведения о студентах

университета. Структура записи:фамилия, имя, отчество;факультет, специальность, группа;количество троек в последнюю сессию;количество четверок в последнюю сессию;количество пятерок в последнюю сессию;размер стипендии.Количество записей произвольноеВывести на экран число студентов специальности ПИЭ,

получающих повышенную стипендию.5. type M=set of 0..99; Составить программу, использующую функцию card(A),

подсчитывающую количество элементов в множестве A типа M. (Например, card([5, 8, 23])=3).

Вариант 2 1. type mes = (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec); day = 1..31; var m1, m2: mes; k:1..maxint; n:1..12;Присвоить переменной m1 название месяца, следующего за

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

точка. Напечатать этот текст заглавными русскими буквами.3. Дан непустой текст из цифр, за которым следует точка.

47

Page 47: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

Напечатать цифру, наиболее часто встречающуюся в этом тексте (если таких цифр несколько, напечатать любую из них).

4. Ввести массив записей о музыкантах. Каждая запись массива содержит следующие сведения об одном из музыкантов:

паспортные данные – фамилия, имя, отчество, год рождения;профессиональные данные – инструмент, стаж, число

записанных пластинок.Число записей произвольное.Вывести на экран фамилии всех музыкантов, играющих на

тромбоне и имеющих, по крайней мере, одну записанную пластинку.5. type letters=set of ‘a’..’z’;Составить программу, использующую процедуру print(A),

печатающую в алфавитном порядке все элементы множества A, имеющего тип letters.

Вариант 3 1. Вычислить s – сумму порядковых номеров всех букв,

входящих в слово SUM.2. Дан непустой текст из заглавных русских букв, за которым

следует точка. Определить, упорядочены ли эти буквы по алфавиту.3. const n = 100; vаr х:аrrау [1..n] оf rеаl;Упорядочить массив x по неубыванию, используя следующий

алгоритм сортировки: сортировка выбором. Отыскивается максимальный элемент и переносится в конец массива; затем этот метод применяется ко вcем элементам, кроме последнего (он уже находится на своем окончательном месте), и т.д.

4. Ввести массив записей о животных. Каждая запись массива содержит следующие сведения о некотором животном:

сведения о виде – вид, место обитания;сведения об особи – кличка, год рождения, вес, окрас, рацион.Число записей произвольное.Вывести на экран клички и рацион всех рыжих кошек не старше

10 лет.5. const n=10; type number=1..n; matr=array [number, number] of real; num=set of number;

48

Page 48: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

Составить программу, использующую функцию sum(A, s1, s2) для вычисления суммы тех элементов матрицы A, номера строк и столбцов которых принадлежат соответственно непустым множествам s1 и s2 типа num.

Вариант 41. Напечатать текст, образованный литерами с порядковыми

номерами 65, 71 и 69.2. type stroka = packed array [1..80] of char; var s:stroka;Известно, что в начале строки s находится не более 40

латинских букв, за которыми следуют пробелы. Напечатать эту строку, предварительно заменив все вхождения abc на def.

3. const n = 100; vаr х:аrrау [1..n] of rеаl;Упорядочить массив х по неубыванию y, используя

следующий алгоритм сортировки: сортировка обменом (метод пузырька). Последовательно сравниваются пары соседних элементов xk и xk+1 (k=1,2,3,...,n-1) и, если хk>xk+1, то они переставляются; тем самым наибольший элемент окажется на своем месте в конце массива; затем этот метод применяется ко всем элементам, кроме последнего, и т.д.

4. Ввести массив записей о пациентах больницы. Каждая запись массива содержит следующую информацию о пациенте:

фамилия, имя, отчество;пол, возраст, место жительства;диагноз.Число записей произвольное.Вывести на экран число пациентов – женщин старше X лет с

диагнозом Y и число пациентов, прибывших из города N c диагнозом K.

5. var x, y, z:set of 8..22;Переменной x присвоить множество всех целых чисел от 8 до

22, переменной y – множество всех простых чисел из этого диапазона, а переменной z – множество всех составных чисел из этого же диапазона.

49

Page 49: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

Вариант 51. type mes = (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec); day = 1..31; var m1, m2: mes; k:1..maxint; n:1..12;Присвоить переменной m1 название k-го месяца после месяца m.2. type stroka = packed array [1..80] of char; var s:stroka;Известно, что в начале строки s находится не более 40

латинских букв, за которыми следуют пробелы. Напечатать эту строку, предварительно удалив первое вхождение w, если такое есть (образовавшуюся «дыру» заполнить последующими буквами, а в конец добавить пробел).

3. const n = 100; vаr х:аrrау [1..n] of rеаl;Упорядочить массив х по неубыванию, используя следующий

алгоритм сортировки: сортировка вставками. Пусть первые и элементов массива уже упорядочены по неубыванию; берется (k+1 )-й элемент и размещается среди первых k элементов так, чтобы упорядоченными оказались уже k+1 первых элементов; этот метод применяется при k от 1 до n-1.

4. Создать массив записей, содержащих сведения о сотрудниках университета. Структура записи:

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

работающих на кафедре X и список профессоров пенсионного возраста с указанием стажа работы.

5. var A,B: set of char; x:char;Переменной B присвоить множество, полученное из A

добавлением элемента x.

Вариант 6 1. type mes = (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov,

dec); day = 1..31;

50

Page 50: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

var m1, m2: mes; k:1..maxint; n:1..12;Присвоить переменной m1 название n-го месяца года.2. type stroka = packed array [1..80] of char; var s:stroka;Известно, что в начале строки s находится не более 40

латинских букв, за которыми следуют пробелы. Напечатать эту строку, предварительно удалив все вхождения th.

3. Дана вещественная матрица размером 7×4. Переставляя ее строки и столбцы добиться того, чтобы наибольший элемент (один из них) оказался в верхнем левом углу.

4. Создать массив записей, содержащих сведения о месячной заработной плате рабочих предприятия. Каждая запись содержит поля:

фамилия и инициалы рабочего;наименование цеха;размер месячной заработной платы.Количество записей произвольное.Вычислить сумму выплат за месяц по цеху X, а также

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

5. var A,B: set of char; x:char;Переменной B присвоить множество, полученное из A

удалением элемента x.

Вариант 71. type mes = (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec); day = 1..31; var d: 28..31; m: mes; Переменной d присвоить количество дней в месяце m (год

считать невисокосным).2. type stroka = packed array [1..80] of char; var s:stroka;Известно, что в начале строки s находится не более 40

латинских букв, за которыми следуют пробелы. Напечатать эту строку, предварительно заменив на ks первое вхождение x, если такое есть.

51

Page 51: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

3. Определить, является ли заданная целая квадратная матрица 10-го порядка симметричной (относительно главной диагонали).

4. Создать массив записей, содержащих сведения об автопарке предприятия. Каждая запись содержит сведения об автомашинах:

марка автомобиля, номер государственной регистрации;год выпуска, пробег, дата последнего капитального ремонта;расход топлива за последний месяц;пробег за последний месяц;количество перевезенных грузов или пассажиров за последний

месяц.Количество записей произвольное.Вывести на экран общее количество перевезенных грузов и

пассажиров за последний месяц и число автомобилей, которые проходили капитальный ремонт более 3 лет назад.

5. type food = ( broad, butter, milk, meat, fish, salt, cheese, saucers, sugar, tea, cafe); assort = set of food; shop = array [1..20] of assort;Описать процедуру Nal(sh, A), которая по информации из

массива Sh типа shop (Sh(i) – это множество продуктов, имеющихся в i-м магазине) присваивает параметру A типа assort множество всех продуктов, которые есть во всех магазинах.

Вариант 81. type mes = (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec); day = 1..31; var d,d: 1..31; m, m1: mes; y:1901..2010; y1:1901..2011; По дате d, m, y определить d1, m1, y1 – дату следующего дня.2. type stroka = packed array [1..80] of char; var s:stroka;Известно, что в начале строки s находится не более 40

латинских букв, за которыми следуют пробелы. Напечатать эту строку, предварительно после каждой буквы q добавить букву u.

3. Элемент матрицы назовем седловой точкой, если он является наименьшим в своей строке и одновременно наибольшим в столбце или, наоборот, является наибольшим в своей строке и наименьшим в своем столбце. Для заданной целой матрицы размером 10×15

52

Page 52: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

напечатать индексы всех ее седловых точек.4. Создать массив записей, содержащих сведения о нанимателях

жилья. Каждая запись содержит поля:фамилия, имя, отчество нанимателя, адрес;вид жилья: часть коммунальной квартиры, квартира, отдельный

дом;число комнат, площадь занимаемого жилья;число проживающих;размер квартирной платы;долг по квартирной плате.Число записей произвольное.Вывести на экран число должников за последний месяц, за

последние три месяца и за последние полгода и более.5. type food = ( broad, butter, milk, meat, fish, salt, cheese, saucers, sugar, tea, cafe); assort = set of food; shop = array [1..20] of assort;Описать процедуру Nal(sh, A), которая по информации из

массива Sh типа shop (Sh(i) – это множество продуктов, имеющихся в i-м магазине) присваивает параметру A типа assort множество всех продуктов, каждый из которых есть хотя бы в одном магазине.

Вариант 91. type mes = (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec); day = 1..31; var k:1..366; d:1..31;Определить k – порядковый номер того дня високосного года,

который имеет дату d, m.2. type stroka = packed array [1..80] of char; var s:stroka;Известно, что в начале строки s находится не более 40

латинских букв, за которыми следуют пробелы. Напечатать эту строку, предварительно заменив все вхождения ph на f, а все вхождения ed на ing.

3. Дана вещественная матрица размером 7×7, все элементы которой различны. Найти скалярное произведение строки, в которой находится наибольший элемент матрицы, на столбец с наименьшим

53

Page 53: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

элементом.4. Создать массив записей, содержащих сведения о рейсах из

аэропорта Уфы. Каждая запись содержит сведения о рейсах:номер рейса, дата вылета, аэропорт назначения;марка самолета, количество мест;аэропорт промежуточной посадки, если таковой имеется;количество проданных билетов на рейс, за сутки до вылета и за

3 часа до отлета.Количество записей произвольное.Вывести на экран сведения о загруженности рейса N за сутки до

вылета и рейса M за 3 часа до вылета. Указать количество рейсов, имеющих промежуточный пункт назначения, а также количество рейсов, которыми можно добраться до пункта K.

5. type food = ( broad, butter, milk, meat, fish, salt, cheese, saucers, sugar, tea, cafe); assort = set of food; shop = array [1..20] of assort;Описать процедуру Nal(sh, A), которая по информации из

массива Sh типа shop (Sh(i) – это множество продуктов, имеющихся в i-м магазине) присваивает параметру A типа assort множество продуктов, которых нет ни в одном магазине.

Вариант 101. type mes = (jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec); day = 1..31; var k:1..366; d:1..31;Определить d, m – дату k-го по счету дня високосного года. 2. Заданное целое число от 1 до 1999 напечатать римскими

цифрами.3. Определить, является ли заданная целая квадратная матрица

9-го порядка магическим квадратом, т.е. такой, в которой суммы элементов во всех строках и столбцах одинаковы.

4. Создать массив записей, содержащих сведения о характеристиках компьютеров учреждения. Каждая запись содержит следующие сведения:

место размещения (этаж, комната);тип процессора;

54

Page 54: Составитель: Аasu.ugatu.ac.ru/library/39/metod_inf_3.doc  · Web viewСодержатся сведения, необходимые для изучения применения

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

17 дюймов, емкость жесткого магнитного диска не менее 40 мегабайт и имеющих выход в Интернет.

5. type town = (a,b,c,d,e,f,g,h); towns = set of town; path = array [town] of towns;Описать процедуру travel(P,H,K), которая по рейсам P (P[x] –

множество городов, в которые можно за один рейс доехать автобусом из города x) определяет K – множество городов, в которые можно попасть автобусом (за один рейс или через другие города) из города H.

СПИСОК ЛИТЕРАТУРЫ1. Меженный О.А. Turbo Pascal: учитесь программировать. –

М.: Издательский дом «Вильямс». 2001.– 448 с.2. Милов А.В. Основы программирования в задачах и примерах.–

Харьков: Фолио. 2002.– 397 с.3. Климова Л.М. Pascal 7.0 практическое программирование.

Решение типовых задач.– М.: Кудиц-Образ, 2000.– 425 с.

55