- •Программирование на языке высокого уровня
- •1 Часть Учебное пособие Москва 2007
- •Оглавление
- •1. Основы алгоритмизации
- •1.1. Алгоритмизация и требования к алгоритму
- •1.2. Блок-схемы алгоритмов
- •1.2.1. Способы записи алгоритма
- •1.2.2. Блок-схемы
- •1.2.3. Следование, ветвление, цикл
- •1.3. Этапы разработки программы
- •1.3.1. Язык программирования. Программа
- •1.3.2. Этапы разработки
- •1.4. Ошибки
- •1.4.1. Компилятор. Синтаксис и семантика
- •1.4.2. Типы ошибок
- •2. Алфавит языка Турбо Паскаль. Программа
- •2.1. Идентификаторы
- •2.2. Разделители
- •2.3. Специальные символы
- •2.4. Структура Pascal-программы
- •Пример простейшей программы на языке Pascal
- •3. Типы данных
- •3.1. Структура типов данных
- •3.2. Простые типы
- •3.2.1. Порядковые типы
- •3.2.1.1 Целые типы.
- •3.2.1.1.1. Встроенные процедуры и функции, применимые к целым типам
- •3.2.1.2. Логический тип.
- •3.2.1.3. Символьный тип.
- •3.2.1.4. Перечисляемый тип.
- •3.2.2. Вещественные типы
- •3.3. Константы и переменные
- •3.4. Преобразование типов
- •4. Операторы
- •4.1. Ввод данных
- •4.2. Вывод данных
- •4.3. Составной оператор
- •4.4. Условный оператор
- •4.5. Операторы циклов
- •4.5.1. Оператор for
- •4.5.2. Оператор while
- •4.5.3. Оператор repeat
- •4.5.4. Стандартные функции для циклов
- •4.6. Оператор выбора case
- •5. Массивы
- •5.1 Определение массива
- •5.2. Ввод/вывод одномерного массива (вектора).
- •5.3 Типизированные константы – массивы
- •5.4. Сортировка массивов (ранжирование)
- •6. Процедуры и функции
- •6.1. Подпрограммы
- •6.2. Параметры. Глобальные и локальные описания
- •6.3. Процедуры
- •6.4. Функции
- •6.5. Процедура exit
- •6.6. Рекурсия
- •6.7. Директивы подпрограмм
- •6.8. Открытые массивы
- •7. Записи
- •7.1.Определение и правила записи
- •7.2. Оператор присоединения
- •7.3. Записи с вариантами (экономия пространства)
- •8. Множества
- •8.1. Понятие множества
- •8.2. Конструктор множества
- •8.3. Операции над множествами
- •8.4. Примеры программ, использующих множества.
- •Литература
7.2. Оператор присоединения
Чтобы упростить доступ к полям записи, используется оператор WITH (оператор присоединения). Оператор WITH экономит время и чернила.
WITH <список записей> do <оператор>
<список записей> - список переменных типа <запись>
WITH , do – зарезервированные слова
Пример.
With a do
begin
name := ‘Петрова’;
sex := wom;
age := 25;
married := false;
end;
Пример.
with group[4] do
name :=’Васильев’;
Один раз указав var типа запись в операторе with, можно работать с именами полей, как с обычным var.
Таким образом, оператор with используется в тех случаях, когда нужно произвести несколько действий подряд с полями записи.
Имена var-записей и полей, указанные в заголовке оператора присоединения, можно опустить при обращении к компонентам записи в области действия оператора with. Транслятор автоматически формирует полные имена. Доступ к каждой записи массива записей осуществляется при помощи индекса.
Пример.
Приведенный фрагмент подсчитывает число мужчин в возрасте 40 лет
-----------------------------------
K:=0;
For i:=1 to 20 do
With group [i] do
If (sex=men) and (age=40) then inc(k);
Writeln (‘Число мужчин в группе =’,k:3);
------------------------------------------------------------
Если фрагмент программы содержит операции над несколькими записями, то в операторе присоединения необходимо указать список переменных записей, разделенных запятыми.
Пример.
With a, bd do
Begin
name := ‘Акимов’;
sex := men;
Year : =1900;
Month :=8;
Day :=25;
married := false;
end;
Нельзя использовать в операторах ввода-вывода запись целиком.
Writeln (a); –{ ошибка.}
Присваивать записи можно.
A:=b; { значения полей b в a }
7.3. Записи с вариантами (экономия пространства)
Вариантная запись означает, что разные var, хотя они и относятся к одному типу, могут иметь различные структуры. Записи с вариантами состоят из фиксированной и вариантной частей. Вариантная часть формируется с помощью оператора case .. of и может состоять из нескольких вариантов.
Пример. Анкетные данные содержат информацию о человеке, указав фамилию, дату рождения, а также если это мужчина, то сообщить военнообязанный он или нет, а если женщина – указать семейное положение и количество детей.
Type
Sex (men, wom);
People = record
Fam : string [15]; { array [1…15] of char;}
Dr:birthday;
Case mw : sex of
Men : ( voen:boolen; prof : string [20]);
Wom : ( mar:boolen; childs:integer)
End;
Var
M1,w1 : people;
---------------------------------------------------
With w1,dr do
Begin
Fam := ‘Иванова’;
year := 1980;
month := 12;
day :=1;
Mw:=wom;
mar := true;
childs := 2;
End.
Вариантная часть начинается оператором case и следует за общей частью, после ее окончания в записи не могут появляться никакие другие поля, поэтому case не закрывается служебным словом end.
Ключ выбора (или поле признака, дискриминанта, поле тега (этикетка)) обычно указывает вариант. При определении вариантной записи в стандартном Паскале требуется, чтобы все до одного значения ключа выбора были налицо, т.е. каждому значению был сопоставлен определенный вариант. Следовательно, если описать ключ выбора с типом integer , то пришлось бы описать 65535 вариантов (-32768..32767)
В turbo pascal все иначе.
Пример
Case N: integer of
1,12 : (cartons : integer);
13,144 : (crates : integer);
32000 : (truckboad : integer; datpos : array [1..5] of char)
У N всего пять значений.
Планируя размещение вариантной записи в памяти компьютера, компилятор всегда резервирует пространство, достаточное для самого протяженного из возможных вариантов. Таким образом, все варианты как бы накладываются друг на друга. Поскольку ключ выбора в предложении case … of фактически игнорируется компилятором., требование Паскаля к нему:
-
Ключ должен определять некоторый стандартный или предварительно объявленный порядковый тип.
-
Перед тем как использовать один из вариантов записи переменной выбора варианта (ключу выбора) следует присвоить соответствующее значение.
Пример использования массива записи
Задача. Программа вводит информацию о 30 студентах:
- фамилия;
- год рождения;
- год поступления в институт;
- оценки последней сессии.
Результат программы – список отличников.
Program zap;
Type
Student = record
Fam : string [15];
Yr : 1900.. 2000;
Yp : 2000...2007;
Marks : record
progr,mathem, engl, ist :1..5;
s:real
End
End;
Const
N=25;
Type
Var
Group : array [1..n] of student;
Person:student;
I,j:integer;
Begin
Writeln;
For i:=1 to n do
With group[i], marks do
Begin
Writeln (‘Введите данные’, I,’-го студента’);
Write (‘Введите фамилию’); Readln (fam);
Writeln (‘Введите год рождения, год поступления, оценки по программированию, математике, английскому, истории’);
Readln (yr,yp,progr,mathem, engl,ist);
End;
Writeln (‘Список отличников’);
For I :=1 to n do
With group[i], marks do
If (progr=5) and (mathem=5) and (engl=5) and (ist=5)
then writeln (fam,yr :6, yp:6)
end.
Пример:
Вывести данные о студентах, фамилии которых начинаются на букву «С» и средний балл у которых >4,5.
For I :=1 to n do
With group[i], marks do
begin
S:=(progr+mathem+engl+ist)/4;
(fam[1]=’C’) and (s>4.5) then
Writeln(fam, yr:6,yp:6)
End;
Пример: Упорядочить список студентов в порядке убывания среднего балла.
For I :=1 to n do
With group[i], marks do
S:=(progr+mathem+engl+ist)/4;
For I :=1 to n-1 do
For J :=i+1 to n do
If group[i].marks.s< group[j].marks.s then
Begin
Person:=group[i];
group[i] :=group[j];
group[j]:= Person
end;
{вывод}
For I :=1 to n do
With group[i], marks do
begin
write(fam);
Writeln(yr,’ ‘, yp,’ ‘, progr,’ ‘,mathem,’ ‘ , engl,’ ‘, ist,’ ‘, s:5:2)
End;