ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 31.03.2021
Просмотров: 6803
Скачиваний: 51
231
end;
case k of
0, 1, 2 : writeln('вы проиграли ');
3 : writeln('получите 3 руб') ;
4 : writeln('получите 100 руб');
5 : writein('получите 1000 руб')
end
end.
Записи
(комбинированный тип) - одна из наиболее гибких и удобных структур данных,
применяющихся при описании сложных объектов, которые характеризуются различными свойст-
вами, а также при создании различных информационных систем. Запись - это последовательность,
состоящая из фиксированного числа величин разных типов, называемых полями или компонента-
ми записи. Так же, как и массив, запись содержит ряд отдельных компонент, но компонентами за-
писи могут быть данные различных типов. Например, адресные данные (индекс, город, улица, но-
мер дома, квартиры) можно представить как запись (record):
type address = record
index : string[6];
city: string[20];
street : string[20];
haus.ilat: integer
end;
Из примера видно, что тип «запись» описывается по схеме
type имя типа записи = record
имя поля 1 : тип;
имя поля 2 : тип;
имя поля N: тип
end;
Как и при описании массивов, можно совместить описание типа записи и соответствующих
переменных. Например, данные о двух студентах можно описать так:
fio
:string[20];
fas
:string[10]
grup
:string[8]
end
Переменную типа «запись» и ее первоначальное значение можно определить как констант-
запись в разделе констант по схеме
const
<имя>:
<имя типа> = <константное значение>
Константное значение - это список имен полей и соответствующих значений, заключенный
в круглые скобки. Элементы списка разделяются знаком «точка с запятой». Например, запись о
начале координат можно определить так:
type point = record
х, у, z: integer
end;
const o: point = (x:0; y:0; z:0);
С компонентами записи можно обращаться как с переменными соответствующего типа.
Обращение к компонентам записи осуществляется с помощью указания имени поля через точку.
232
Пусть, например, переменная х имеет тип address, т.е. в программе имеется описание var x:
address. Тогда допустимы следующие присваивания:
x.haus := 52; х.street:='пр.Мира'; x.city:= 'Красноярск';
x.flat:= 135; x.index :='б60049'
Проиллюстрируем работу с записями на задаче, в которой требуется найти сумму и произ-
ведение двух комплексных чисел:
zl=al+i*blиz2=a2+i*b2.
Программа 16
program cornpl;
type compi =
record
re : real;
im : real
end;
var zl,z2,s,p : compl;
begin
writeln('компл.число a+i*b вводите двумя числами а и Ь: 'it-
write('введи 1 число: '); readln(zl.re,zl.im);
write('введи 2 число: '); readin(z2.re,z2.im);
s.re := zl.re + z2.re;
s.im := zl.re + z2.im;
p.re
:=
zl.re * z2.re - zl.im * z2.im;
p.im := zl.re * z2.im + z2.re * zl.im;
writeln('s=',s.re:4:2,' + i *'
,s.
im:4:2);
write('p=',p.re:4:2,' + i *',p.im:4:2)
end.
Громоздкость обозначений в программе компенсируется большей наглядностью алгоритма
за счет структуризации данных. Во многих случаях, если требуется производить операции с поля-
ми фиксированной записи, можно для сокращения обозначений использовать оператор присоеди-
нения with. Его структура такова:
with <имя записи> do <оператор>;
В этом случае в операторе, написанном после служебного слова do, имена полей указанной
записи описываются без имени записи и точки. Например, печать суммы s в предыдущем примере
можно организовать с использованием оператора with так:
with s do writeln('s=',re:4:2,'+i*',im:4:2);
В операторах присваивания разрешается использовать не только имена полей, но и имена
записей.
Тип поля может быть записью.
Например:
man = record
fio:record
fam, im,
otch
:
string[10];
end;
data : record
day: 1..31;
mes:1..12;
god:integer
233
end;
pol: char;
telef: record
dom,rab : string[10];
end;
end;
В Паскале разрешается использовать тип «запись» при описании других
составных типов
данных, например, можно построить массив записей.
Рассмотрим пример эффективного использования записей в программе начисления стипен-
дии студентам по шаблону:
N
ФИО
Эк1 Эк2 ЭкЗ Балл Сумма
Проф
Итого
1
Васнецов Н.В.
4
4
3
11
50.00
0.25
49.75
Предположим, что вводится список группы с соответствующими оценками за экзамены.
Графа «Балл» вычисляет суммарную оценку за семестр. Графа «Сумма» определяет размер сти-
пендии по упрощенному правилу: если нет двоек и балл равен 15, то стипендия 75 руб.; при усло-
вии, что 12 < «Балл» < 15 стипендия 62 руб 50 коп., а если 9 < «Балл» < 12 , то - 50 руб. (в других
случаях сумма равна нулю). В графе «Проф» указывается профсоюзный взнос в размере 0,5% от
стипендии, а графа «Итого» определяет сумму денег к выдаче.
В программе перед распечаткой итоговой ведомости
можно предусмотреть упорядочение
записей по убыванию в графе «Балл».
Программа 17
program spisok;
type stud = record
fio
:string[20];
ex1, ex2, ex3
: 2 . . 5;
bal
:6 . . 15;
sum
:real;
nalog
:real;
itog
:real;
end;
var x : array[1..30] of stud;
i,k,m,n
:integer;
у
: 6..15;
z
: stud;
begin write('введи число студентов: '); readln(n);
for i:= 1 to n do with x[i] do
begin write('введи ФИО ',i,'-ro студента: ');
readln(fio); write('Bведи его три оценки: ');
readin(exl,ex2,ex3);
end;
for i:= 1 to n do with x[i] do
begin bal:=exl+ex2+ex3;
if (exl=2) or (ex2=2) or (ex3=2)
then sum:=0
else if bal=15 then sum:=75
else if bal>12 then sum:=62.5
else if bal>9 then sum:=50
else sum:=0;
nalog:=sum*0.005; itog:=sum-nalog;
end;
for k:= 1 to n-1 do
begin y:=x[k].bal; m:=k;
for i:=k+l to n do if y<x[i].bal then
begin y:=x[i].bal; m:=i
234
end; z:=x[k]; x(k]:=x[m]; x(m]:=z;
end;
writeln; writeln ('СТИПЕНДИАЛЬНАЯ ВЕДОМОСТЬ ');
for i:=l to 64 do write('-'); writeln;
write ('N | ФИО | эк1 | эк2 | эк3 | балл | сумма | проф | итого |') ;
for i:=l to 64 do write('-'); writeln;
for i:=l to n do with x[i] do
begin write(i:3,fio:20,exi:4, ex2:4,ex3:4);
writeln(bal:5,sum:9:2,nalog:8:2,- itog:7:2);
end
end.
Контрольные вопросы и задания
1. Как определяется перечислимый тип данных?
2. Для чего может понадобиться интервальный тип данных?
3. Как вводятся и используются в программах массивы?
4. Какие действия возможны над величинами строкового типа?
5. Какие операции допустимы над множествами?
6. В чем принципиальные различия между одномерными массивами и записями?
7. В усеченном конусе длина диагонали осевого сечения равна d, образующая составляет с
плоскостью основания угол х и равна а. Вычислите площадь боковой поверхности конуса.
8. Вычислите объем призмы, боковые грани которой квадраты, а основанием служит равно-
сторонний треугольник, вписанный в круг радиуса г.
9. Числа а и b выражают длины катетов одного прямоугольного треугольника, числа с и d -
другого. Определите, являются ли треугольники подобными.
10. Напечатайте числа а, b, с в порядке возрастания.
11. Определите все пары двузначных чисел, обладающих свойством: (20+25^2 = = 2025.
12. Вычислите в числовом массиве а1,а2,...,аn суммы положительных и отрицательных эле-
ментов.
13. Вычислите скалярное произведение двух десятимерных векторов Х и Y.
14. Упорядочите массив х1,х2,...,хn по неубыванию, используя метод сортировки вставка-
ми: пусть первые k элементов уже упорядочены по неубыванию; берется (K+1)-й элемент и раз-
мещается среди первых k элементов так, чтобы упорядоченными оказались уже (k+1) первых эле-
ментов.
15. Составьте программу решения треугольной системы уравнений порядка n.
16. Замените в заданном арифметическом выражении все вхождения sin на cos и sqrt на abs.
17. Для заданного текста определите длину содержащейся в нем максимальной последова-
тельности цифр 0, 1,2,..., 9.
18. Дан текст из латинских букв и знаков препинания. Составьте программу частотного
анализа букв этого текста, т.е. напечатайте каждую букву с указанием количества ее вхождений и
процента вхождений.
19. Найдите и напечатайте в порядке убывания все простые числа из диапазона [2..201].
20. Опишите тип «запись» для следующих данных:
а) адрес(город, улица, дом, квартира);
б) дата(число,месяц.год);
в) студент(фио,факультет,курс,группа).
21. Заданы N точек на плоскости. Найдите точку, ближайшую к началу координат. Исполь-
зуйте тип «запись».
3.4. ПРОЦЕДУРЫ И ФУНКЦИИ
Описание и вызов.
В Паскале подпрограммы называются процедурами и функциями и
описываются в разделе с тем же названием.
Процедура
имеет такую же структуру, как и программа, но с двумя отличиями:
• заголовок процедуры имеет другой синтаксис и включает служебное слово procedure;
235
• описание процедуры заканчивается точкой с запятой (а не точкой). Все имена, описанные
в программе до процедуры, действуют во всей программе и в любой ее подпрограмме (если они
там не описаны заново). Они называются глобальными, в отличие от локальных имен, описанных
в процедуре и действующих лишь в ней.
Данные для обработки могут передаваться процедуре через глобальные имена или через ар-
гументы процедуры. В процедуре каждый аргумент имеет свое имя -формальный параметр, опи-
сываемый в заголовке процедуры по схеме
procedure <имя> (<список описаний формальных параметров>) Описание формальных па-
раметров может иметь вид
<список имен>: <тип> или var <список имен>: <тип>
В первом случае говорят о параметрах-значениях, во втором - о параметрах-переменных. В
простейшем случае заголовок процедуры может содержать только имя процедуры.
Оператор вызова процедуры имеет вид
<имя процедуры> (<список выражений>);
Указанные выражения называют фактическими параметрами. Их список должен точно со-
ответствовать списку описаний формальных параметров процедуры. Во время вызова процедуры
каждому параметру-значению присваивается значение соответствующего фактического параметра
и поэтому их обычно используют для передачи входных данных.
Параметры-переменные следует использовать для представления результатов процедуры.
Пример:
составим программу, которая с помощью строки символов разделит экран на час-
ти, где напечатает таблицу квадратных корней для чисел 1, 2,..., 10 и таблицу натуральных лога-
рифмов для чисел 1, 2,..., 5.
Печать
строки символов оформим как процедуру. Так как никакую информацию переда-
вать из процедуры в программу не надо, то аргументы процедуры (вид и количество символов)
будут описаны как параметры-значения.
Заметим, что процедура в программе выполняется пять раз.
Программа 18
program section;
var x:integer;
procedure line(a:integer;c:char) ;
var j:integer;
begin
for j:=l to a do write (c);
writeln
end;
begin
line(35,'-'); writeln('таблица квадратных корней');
line(35,'-');
for x:=l to 10 do writeln(x:8,sqrt(x):8,4);
line (35,'-'); writein('таблица натуральных логарифмов');
line(35,'-');
for x:=l to 5 do writein(x:8,In(x):8:4);
line(35,'*')
end.
Функция - это подпрограмма, определяющая единственное скалярное, вещественное или
строковое значение. Отличия подпрограммы-функции от процедуры:
• заголовок функции начинается со служебного слова function и заканчивается указанием
типа значения функции:
function <имя> (список описаний формальных параметров): <тип>;