Файл: Могилев А.В. Информатика.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 31.03.2021

Просмотров: 6803

Скачиваний: 51

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

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); 
 
С  компонентами  записи  можно  обращаться  как  с  переменными  соответствующего  типа. 

Обращение к компонентам записи осуществляется с помощью указания имени поля через точку. 


background image

 

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 


background image

 

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  


background image

 

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; 


background image

 

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 <имя> (список описаний формальных параметров): <тип>;