- •Конспект лекций по информатике
- •Организация данных в эвм и основы программирования
- •1. Основные понятия языка программирования паскаль
- •1.1. Структурное программирование
- •1.2. Основные символы языка
- •1.3. Элементы языка
- •1.4. Интегрированная среда turbo pascal
- •1.5. Структура программы в turbo pascal
- •1.6. Определение типов
- •1.7. Операторы в программе
- •1.7.1. Операторные скобки
- •1.7.2. Операторы ввода
- •1.7.3. Оператор присваивания
- •1.7.4. Условный оператор
- •1.7.5. Пример простой программы
- •1.7.6. Оперетор безусловного перехода
- •1.8. Организация циклов
- •1.8.1. Использование операторов условного и безусловного перехода
- •1.8.2. Цикл с параметром
- •1.8.3. Цикл с предусловием - цикл while
- •1.8.4. Цикл с постусловием - цикл repeat
- •1.9. Оператор выбора варианта
- •1.10. Расположение операторов в программе
- •1.11. Концепция типов данных
- •2. Стандартные простые типы
- •2.1 Целый тип
- •2.1.1. Операции над данными целого типа:
- •2.2. Действительный тип
- •2.2.1. Операции над данными действительного типа:
- •2.3. Логический тип
- •Var p, q, r : Boolean;
- •2.3.1. Алгебра логики в Паскале
- •2.3.2. Законы алгебры логики в Паскале
- •2.4. Символьный тип
- •2.4.1. Символьные строковые константы
- •3. Нестандартные простые типы (определяемые пользователем)
- •3.1. Перечисляемый тип
- •3.2. Ограниченный тип (диапазон, интервал)
- •4. Процедуры и функции
- •4.1. Описание процедур
- •4.2. Стандартные процедуры
- •4.3. Описание функций
- •4.4. Стандартные функции
- •4.5. Итерация и рекурсия
- •4.6. Побочный эффект рекурсии
- •4.7. Предварительное описание (ссылки вперед)
- •5. Регулярные типы
- •5.1. Одномерный массив, или переменные с индексами
- •Алгоритмы сортировки массивов
- •1. Метод пузырька (метод обменной сортировки с выбором)
- •2. Сортировка выбором
- •3. Метод Шелла
- •4. Метод Хoopа
- •5.2. Многомерные массивы
- •5.3. Упакованные массивы
- •5.4. Строки
- •6. Множественные типы
- •6.1. Свойства множеств
- •6.2. Операции над множествами
- •7. Комбинированные типы
- •7.1. Описание записей и действия с ними
- •7.2. Оператор присоединения.
- •7.3. Записи с вариантами
- •8. Типизированная константа
- •8.1. Простая типизированная константа
- •8.2. Структурированная (сложная) типизированная константа
- •8.2.1. Типизированная константа массива
- •8.2.2. Типизированная константа записи
- •8.2.3. Типизированная константа множества.
- •9. Преобразование типов
- •9.1. Неявные преобразования типов
- •9.2. Использование стандартных функций для преобразования
- •9.3. Явные преобразования типов
- •9.5. Совместимость типов
- •10. Файловые типы
- •10.1. Определение файлового типа
- •10.2. Структура файла
- •10.3. Имя файла
- •10.4. Описание файлового типа
- •10.5. Файловая переменная
- •10.6. Операции над файлами
- •10.7. Типизированные файлы
- •10.8. Текстовые файлы
- •10.9. Нетипизированные файлы
- •10.10. Стандартные файлы inpuTиOutput
7.2. Оператор присоединения.
Мы отметили, что обращение к элементам записи происходит с помощью уточнённого имени. Оператор присоединения позволяет упростить обращение к элементу записи. Имя записи выносится в заголовок оператора присоединения, а в блоке Begin–endиспользуются только имена элементов записи.
Оператор присоединения имеет вид:
Withимя_записиdo
Begin
Операторы
End;
Пример.Для 1-ой экзаменационной ведомости (списка 1) оператор присоединения можно записать так:
With C1 do
Begin
Read(N);
Summa := Ball[1] + Ball[3];
End;
Пример. Имеется ведомость учащихся с оценками:
Иванов Иван 2
Петров Пётр 2
Сидоров Сидор 3
Составить программу для вычисления среднего балла.
Поскольку в каждой строке ведомости представлены данные различного типа, введём запись с именем СПИСОК, состоящую из двух полей:
Name– фамилия и имя – упакованный массив из 15 символов;
Ball– оценка – целое число.
Для вычисление среднего балла Midballнаходится сумма всех оценокSumma, которая делится на число студентовN.
ProgramW123;
Const N = 3; (* число учащихся в списке *)
M = 15; (* максимальная длина Name *)
Type T = Record
Name: Packed Array [1..M] of Char;
Ball: Integer;
End;
Var Spisok: T;
I, K: Integer; (* параметры цикла *)
Midball: Real; (* средний балл *)
Summa: Integer; (* сумма оценок *)
Begin
Summa := 0;
Writeln(‘ введите таблицу ‘);
For I := 1 to N do
Begin
For K := 1 to M do
Read(Spisok.Name[K]);
Read(Spisok.Ball);
Summa := Summa + Spisok.Ball;
End;
Midball := Summa / N;
Writeln(‘----------------------------‘);
Writeln(‘ средний балл = ‘, Midball: 5: 2);
End.
Описание записи сделано в разделе Type, где Т – имя типа. В разделе переменныхVarуказано, что переменная СПИСОК тип Т.
Раздел операторов состоит из двух циклов: один вложен в другой. Внешний цикл с параметром Iвыполняется столько раз, сколько имеется фамилий в ведомости (в данном случаеN= 3). Внутренний цикл с параметром К предназначен для ввода фамилии и имени. На фамилию и имя отводится поле из 15 позиций. Лишние позиции поля заполняются пробелами. Внутри поля фамилию и имя можно располагать свободно,например:
_ _ _ _ Иванов _ Иван
или _ _Иванов _ Иван_ _
или _ _ _Иванов _ Иван_
или _ Иванов_ _ Иван_ _
После имени следует оценка.
Пример.Присвоить звание “отличник” тем, у кого по всем предметам пятёрки.
Из исходного списка С1, в котором содержатся фамилии и оценки, нужно сформировать другой список С2, состоящий из отличников. Для формирования списков используется массив массивов.
Programotl;
ConstK= 5; (* количество человек *)
Type Tip = Record
Name: Array [1..K, 1..15] of Char;
Math: Array [1..K] of Integer;
Phis: Array [1..K] of Integer;
Chem: Array [1..K] of Integer;
End;
Var C1, C2: Tip; (* списки *)
I, J, N: Integer; (* параметры циклов *)
Begin
J:= 0;
Writeln(‘ введите фамилию и оценки: ‘);
For I := 1 to K do
Begin
For N := 1 to 15 do Read(C1.Name[I, N]);
Read(C1.math[I], C1.Phis[I], C1.Chem[I]);
If (C1.Math[I] = 5) And
(C1.Phis[I] = 5) And
(C1.Chem[I] = 5) then
Begin
J := J + 1;
C2.Name[J] := C1.Name[I];
End;
End;
If J = 0 then Writeln(‘нет отличников ‘)
else Begin
Writeln(‘-----------------------‘);
Writeln(‘отличники:‘);
For I := 1 to J do
Writeln(C2.Name[I]);
End;
End.
Пример.Дан многочлен 4А + 5В – 8С + 16А – 3А + 9К – 1А
Найти подобные члены для переменной А и вычислить суммарный коэффициент. Один элемент многочлена можно считать записью, так как он состоит из данных различного типа – коэффициента (число) и буквы.
Введём обозначения:
М1 – элемент многочлена (запись),
М2 – результирующий элемент (запись),
Coef– коэффициент (элемент записи),
Buk– буква (элемент записи),
Elem– тип записи,
Sum– сумму коэффициентов.
ProgramEx4;
Type Elem = Record (* тип элемента *)
Coef: Integer; (* коэффициент *)
Buk: Char; (* буква *)
End;
VarM1:Elem; (* входной элемент *)
M2:Elem; (* выходной элемент *)
Sum: Integer; (* сумма коэффициентов *)
Begin
Sum := 0;
Writeln(‘ введите многочлен ‘);
While Not EOLN do (* end of line *)
Begin
Read(M1.Coef, M1.Buk);
If M1.Buk = ‘A’ then Sum := Sum + M1.Coef;
End;
M2.Coef := Sum;
M2.Buk := ‘A’;
Writeln(‘подобный член = ‘,M2.Coef: 3,M2.Buk);
End.
Запись - это комбинированный тип, сложная переменная с несколькими компонентами. В отличие от массивов компоненты записи (поля) могут иметь разные типы, и доступ к ним осуществляется не по индексу, а по имени поля.
Записи могут входить в качестве компонентов в другие переменные, например, можно сформировать массив записей.
К каждому компоненту записи можно обратиться, используя имя переменной типа записи и имя поля, разделённых точкой.
В области действия оператора присоединения Withимена переменных-записей и полей, указанные в его заголовке, можно опускать. Транслятор автоматически формирует полные имена. В области действия оператора присоединения нельзя изменять элементы списка переменных-записей и полей, указанные в заголовке.
Пример.Определить число студентов 1974 г. рождения.
Type Student = Record
Name: Array [1..15] of Char;
Date: Integer;
End; { of record }
Var Grope: Array [1..30] of Student;
K, I: Integer;
Begin
K := 0;
For I := 1 to 30 do
With Grope[I].Date do
If Date = 1974 then K := K + 1;
Writeln(K);
End.
В данном примере в заголовке оператора WithстоитGrope[I] – элемент массива, зависящий от параметраI, поэтому оператор присоединения вставлен внутрь цикла поI.