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

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

• Типы идентичны.

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

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

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

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

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

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

• Один тип является нетипизированным указателем (POINTER), второй – любым другим ссылочным типом.

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

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

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

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

НЕ нашли? Не то? Что вы ищете?

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

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

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

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

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

2.6. Приведение типов

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

var

х: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, а type2Byte. Известно, что для переменных этих типов требуется один байт памяти, поэтому при преобразовании из одного типа в другой данные в этом случае ни расширяются, ни сокращаются. Для переменных X и Y допустимы операторы присваивания:

x:=byte(у);

y:=char(х);

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

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

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

tуре(ехрression);

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

Byte(‘F’);

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

Char(77);

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

Таблица 17

Примеры приведения типов

Дейтвие

Результат

Boolean(0)

False

Boolean(1)

True

Char(57)

‘9’

Integer(‘9’)

57

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

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

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

Для выполнения работы необходимо:

1. Повторить правила техники безопасности при работе с вычислительной техникой.

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

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

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

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

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

7. Защитить лабораторную работу, продемонстрировав препода­вателю:

отчет по лабораторной работе;

умение решать аналогичные задачи;

теоретические знания.

При подготовке к защите для самопроверки рекомендуется ответить на контрольные вопросы, приведенные в разделе 5.

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

Отчет по выполненной лабораторной работе должен содержать:

титульный лист;

условие задания;

текст программы на языке Турбо Паскаль.

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

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

4. Что такое строка?

3. Что такое массивы?

4. Что такое записи?

5. Для чего используется оператор WITH?

6. Что такое вложенные записи?

7. В каких случаях используются записи с вариантами?

8. Что такое множество?

9. Какие существуют виды совместимости типов в языке Паскаль?

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

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

Вариант 1
1. 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. Дан непустой текст из цифр, за которым следует точка. Напечатать цифру, наиболее часто встречающуюся в этом тексте (если таких цифр несколько, напечатать любую из них).

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;

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

Вариант 4

1. Напечатать текст, образованный литерами с порядковыми номерами 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 – множество всех составных чисел из этого же диапазона.

Вариант 5

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 название 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;

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.

Вариант 7

1. 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, если такое есть.

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 множество всех продуктов, которые есть во всех магазинах.

Вариант 8

1. 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 напечатать индексы всех ее седловых точек.

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 множество всех продуктов, каждый из которых есть хотя бы в одном магазине.

Вариант 9

1. 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, все элементы которой различны. Найти скалярное произведение строки, в которой находится наибольший элемент матрицы, на столбец с наименьшим элементом.

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 множество продуктов, которых нет ни в одном магазине.

Вариант 10

1. 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. Создать массив записей, содержащих сведения о характеристиках компьютеров учреждения. Каждая запись содержит следующие сведения:

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

тип процессора;

тактовая частота;

емкость оперативной памяти;

емкость жесткого магнитного диска;

тип монитора;

подключен ли к локальной сети;

подключен ли к глобальной сети.

Количество записей произвольное.

Вывести на экран сведения о компьютерах, имеющих монитор 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 с.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4