лабораторные на Pasca (Кудрявцев)l
.pdfСтроковый тип данных |
103 |
|
|
будет пробел, если Poz > 255, то возникнет ошибка при вы- полнении. Poz, N – целочисленные выражения.
Пример: St := 'ABCDEF'; Copy (St, 2, 3) выделит 'BCD'.
Concat (Str1, Str2, ..., StrN) – выполняет сцепление строк Str1, Str2, ¼
в том порядке, как они указаны в списке. Сумма символов сцеплен- ных строк не должна превышать 255.
Пример: Concat ('индекс', ' 656099') даст 'индекс 656099'.
Length (St) – вычисляет длину в символах строки St. Результатиме- ет целочисленный тип.
Пример: St := '1234567890', Length (St) даст 10.
Роz (Str1, Str2) – обнаруживает первое появление в строке Str2 под- строки Str1. Результат имеет целочисленный тип и равен номеру той позиции, где находится первый символ подстроки Str1. Если подстрока Str1 в строке Str2 не найдена, результатравен нулю.
Пример: Роs ('тройка', 'перестройка') будет равно 6.
UpCase (Ch) – преобразует строчную букву в прописную (только латинский алфавит). Параметр и результатимеют литерный тип.
Обработка строковых данных – необходимый элемент таких про- грамм, как текстовые редакторы. Ниже приведен пример програм- мы простейшей лингвистической обработки, в котором к строко-
вым данным применяются наиболее часто употребляемые функции и процедуры.
Program DemoStr;
{Программа формирует строку из трех исходных строк. Определяется номер позиции первого появления в результирующейстроке буквы 'а' и общая длина строки. }
Var А, В, С: string [12]; |
{А, В, С – исходные строки} |
Str, Str1: string [40]; |
{Str – результирующаястрока, |
Ch1: string [1]; |
Str1 – инвертированная строка} |
Ch: char ; |
|
i, n: integer ; |
|
104 |
Лабораторная работа № 9 |
|
|
Begin
A := 'electronic';
B := 'digit'; C := 'machine';
Ch1 := Copy (A, 1,1); |
{Выделение первой буквы в А }; |
Writeln; |
|
Ch := UpCase(Ch1[1]); |
{Преобразование выделенной буквы |
Writeln; |
из строчной в прописную }; |
|
|
Str := Сoncat(A, В, C); |
{Конкатенация строк А, В, С}; |
Writeln; |
|
Delete(Str, 1, 1); |
{Стирание первой буквы для последующей |
Writeln(Str); |
записи в первую позицию прописной буквы}; |
|
|
Insert(Ch, Str, 1); |
{Вставка прописной буквы} |
Insert(' ', Str, 11); |
{Вставка первого пробела} |
Insert(' ', Str, 17); |
{Вставка второго пробела} |
Writeln(Str); |
{Вывод результирующейстроки} |
Writeln('Первая буква “а” появилась в позиции ', Pos('a',Str)); n := Length(Str);
WriteIn('Длина строки = ', n); Str1 := ";
For i := 1 to n do
Str1 := Str1 + Copy(Str, n–i + 1, 1);
Writeln(Str1) |
{Получение и вывод инвертированной строки} |
End. |
|
|
КОНТРОЛЬНЫЕ ЗАДАНИЯ |
1.Дано несколько слов. Составить программу, которая определяет, одинако- вы ли длины слов или нет, и определяет наибольшее и наименьшее по длине слова.
2.Составить программу, которая меняет местами первые и последние буквы слов данного предложения.
3.Дано предложение. Составить программу, обращающую отдельные слова в предложении, но сохраняющую порядок слов.
4.Составить программу, которая подсчитывает количество сдвоенных букв в предложении.
5.В строке длиной 30 содержится имя, отчество и фамилия так, что каждая часть занимает 10 позиций. Напечатать фамилию и инициалы.
6.Целочисленные переменные i, j, k содержат информацию о длинах сторон треугольника. Напечатать фразу «Рассмотрим треугольник со сторонами ...
см, ... см,... см», где вместо многоточий указаны соответствующие значения.
Строковый тип данных |
105 |
|
|
7.Составить программу, которая печатает отдельно каждое слово из заданно- го предложения.
8.Дана дата в виде «месяц–число–год». Напечатать дату в виде «число– месяц–год».
9.В переменной содержится существительное первого склонения, оканчи- вающееся на «а». Напечатать слово во всех падежах.
10.Дано несколько строковых переменных. В каждой из них даны имена и фамилии (например: Илья Муромец, Александр Невский). Напечатать от- дельно первые, а затем вторые слова из пар.
11.Определить, какая гласная встречается в заданной фразе наиболее часто.
12.Определить длину предъявленного слова. Напечатать «В этом слове N букв». Употребить форму «буква», «буквы» или «букв».
13.Дано предложение. Напечатать длины слов, встречающихся в предложе- нии.
14.Дано предложение. Напечатать все слова из этого предложения, которые содержат букву «а».
15.Составить слово, содержащее первые буквы слов заданного предложения.
106
Лабораторная работа № 10
ПРОЦЕДУРЫ И ФУНКЦИИ
При решении задач часто возникает необходимость повторять одни и те же вычисления при различных значениях параметров. Для уменьшения размера программ целесообразно выделить эти вычис- ления в отдельную подпрограмму. В основной программе при не- обходимости осуществляются обращения к подпрограмме. В языке Turbo Pascal в качестве подпрограмм используются функции и про- цедуры.
Функции представляют собой группу операторов, в результате вы- полнения которых вычисляется одно значение, присваиваемое име- ни функции.
Функция включает в себя заголовок функции, разделы описаний (меток, констант, типов, переменных, дополнительных функций и процедур, являющихся локальными по отношению к описываемой функции), тело функции.
В заголовке функции за ключевым словом Function указывается имя функции, а в скобках – список параметров со своими типами. В за- головке должен быть определен тип значения, возвращаемого функцией. Окончательный результатприсваивается имени функции в конце тела функции. Общая структура записи функции имеет та- кой вид:
Function F(q1: T1; q2: T2; ¼): T;
{Разделы определений и описаний локальных параметров и подпрограмм} begin
p1;
p2;
• • •
F:= < вычисленное начение >
end;
где F – имя функции, q1, q2 – имена формальных параметров, Т1, T2
– типы параметров, Т – тип имени функции, р1, p2 – операторы тела функции.
Процедуры и функции |
107 |
|
|
Функция может иметь свои локальные константы, типы, перемен- ные и вспомогательные процедуры и функции.
Обращение к функции осуществляется в правой части оператора присваивания указанием имени функции и фактических параметров в виде F(b1, b2, ¼), где F – имя функции, bi – фактические парамет- ры.
Пример 1. Составить программу для определения числа сочетаний
Cnm = |
n! |
|
, |
|
m!(n − m)! |
||||
|
|
используя функцию при вычислении факториала.
Program Number; Var
n, m: byte; nсm: longint;
Function Fact (k: byte): longint; Var
p:longint;
i:byte;
begin p:= 1;
for i:= 1 to k do p:= p*i;
Faсt:= p; end;
Begin
writeln('Введите данные для определения числа сочетаний'); readln(n, m);
nсm:= Fact(n) div Fact(m) div Fact(n–m); writeln('Число сочетаний = ', ncm);
End.
Пример 2. Составить программу для вычисления функции
|
20 |
20 |
40 |
y = ax2 |
+ bx + c, где a = å pi , b = åti , c = åri . |
||
|
i=1 |
i=1 |
i =1 |
108 |
Лабораторная работа № 10 |
|
|
Решение. Функция для вычисления сумм в общем виде может быть
k
представлена как Sum = åzi .
i=1
Program Runy;
Const
MaxSize = 50; Type
md = 1..MaxSize;
mas = array [md] of real; Var
np, nt, nr, i: integer; p, t, r: mas;
х, y: real;
Function Sum(z: mas; nd: integer): real; Var
j: integer; s: real;
begin s:= 0;
for j:= 1 to nd do s := s + z [ j ];
Sum:= s; end;
Begin
write('Введите х:'); readln(x);
write('Введите число элементов в массивах p, t, r'); readln(np, nt, nr);
writeln('Вводите элементы массива p'); for i:= 1 to np do
read(p[i]);
writeln('Вводите элементы массива t'); for i:= 1 to nt do
read(t[i]);
writeln('Вводите элементы массива r'); for i:= 1 to nr do
read(r[i]);
Процедуры и функции |
109 |
|
|
y:=Sum(p, np) x x + Sum(t, nt) x + Sum(r, nr); writeln('y= ', y);
End.
Процедуры используются в тех случаях, когда в подпрограмме не- обходимо получить несколько результатов. Процедура определя- ется в разделе описания процедур.
Описание процедуры включает в себя заголовок, разделы описаний (меток, констант, типов, переменных, процедур, функций), тело процедуры.
В заголовке процедуры за ключевым словом Procedure указывают имя процедуры и в скобках – список формальных параметров со своими типами. Эти параметры используются только в теле проце- дуры и локальны по отношению к ней. Общая структура записи процедуры имеет такой вид:
Procedure F(var q1: T1; q2: T2 ; ...);
{Разделы определений и описаний локальных параметров и подпрограмм} begin
p1;
p2
• • •
end;
где F – имя процедуры, qi – имена формальных параметров, Тi – типы формальных параметров, рi – операторы тела процедуры.
Имена формальных параметров, являющихся результатами вычис- лений в процедуре, записываются после зарезервированного слова
var.
Обращение к процедуре осуществляется оператором процедуры, в котором записывается имя процедуры и фактические параметры:
F (b1, b2 , …);
где bi – фактические параметры, которые должны соответствовать формальным по количеству, типу и месту расположения.
Пример 3. Составить программу для вычисления функции
110 |
Лабораторная работа № 10 |
|
|
z = |
th a + th2 (a − b) |
, |
|
th(a2 − b2 ) |
|
используя для вычисления процедуру
th x = |
ex − e− x |
= |
e2x −1 |
. |
||
|
|
|
||||
ex + e− x |
e2x +1 |
|||||
|
|
|
Решение. Формальными параметрами процедуры будет переменная х и результат с именем R. Чтобы избежать двукратного вычисления e2x, вводится дополнительный оператор присваивания c:=ехр(2.0 х).
Program Fun1; Var
a, b, z, t1, t2, t3: real; Procedure Th(x: real; var r: real);
Var
c: real; begin
c:= exp(2 x); r:= (c–1)/(c+1);
end; Begin
writeln('Введите а и b'); read(a, b); Th(a, t1);
Th((a – b), t2); Th(sqr(a) – sqr(b), t3); z:= (t1 + sqr(t2))/sqrt(t3); writeln('z= ', z);
End.
Если в процедуре и главной программе используются одни и те же имена параметров (процедура связана с главной программой по- средством глобальных переменных), то процедура может быть ор- ганизована без параметров.
Процедуры и функции |
111 |
|
|
Пример 4. Составить программу с процедурой без параметров для вычисления полярных координат ρ = x2 + y2 и ϕ = arctg( yx) по прямоугольнымх и у (х>0) координатам.
Program PolKorl; Var
х, у, r, f: real; n, i: integer;
Procedure Polar; begin
r:= sqrt(sqr(х) + sqr(y)); f:= arctan(y/x);
end; Begin
write('Введите количество точек'); readln(n); for i:= 1 to n do
begin
write('Введите координаты точки: '); readln(х, у);
Polar;
writeln(' Прямоугольным координатам:', x:6:1, y:6:1);
writeln('– соответствуют полярные координаты:', r:6:1, f:10:2);
end
End.
Формальные параметры функций и процедур можно указывать в любом порядке, параметры одного типа не обязательно группиро- вать в одном месте. При обращении к процедуре или функции фак- тические параметры следует записывать в той же последовательно- сти, что и формальные.
При выборе имен, содержащих процедуры и функции, целесо- образно, чтобы имена локальных и глобальных параметров не сов- падали. Это делает программу нагляднее. Правилами определения
области действия допускается использование одного имени для глобального и формального параметров. В этом случае глобальный
112 |
Лабораторная работа № 10 |
|
|
параметр теряет свое имя внутри блока процедуры или функции, так как с этим именем связан локальный параметр.
При организации процедур и функций в языке Turbo Pascal разли- чают параметры–значения и параметры–переменные.
Параметры–значения определяют исходные данные для работы процедур и функций при каждом обращении к ним. В списке фор- мальных параметров они описываются в виде:
(q1: T1; q2 : T2) или (q1, q2 : T);
где qi – имена параметров, T, Ti – тип параметров.
При обращении фактический параметр может быть любым выра- жением, результат вычисления которого принадлежит тому же ти- пу, что и формальный параметр. В качестве простейшего выраже- ния указанного типа может быть константа или переменная. При обращении к процедуре выражение вычисляется, результаткопиру- ется в выделенную область параметров, передается в процедуру, а при выходе из нее эта область освобождается.
Параметры–переменные определяют выходные данные процедуры (результаты обработки данных), которые передаются в основную программу. Поэтому фактический параметр, определяющий ре- зультат, должен описываться как переменная. Параметры–пере-
менные в списке формальных параметров описываются в виде
(var q1, q2, …, qn: T);
где qi – параметры–переменные, Т – их тип.
Параметры–переменные в заголовке функции не используются, т.к. результатприсваивается имени функции.
При обращении фактические параметры должны быть переменны- ми того же типа. В процедуру передается адрес переменной, и опе- раторы непосредственно используют данную переменную. Вы- числение адресов производится в момент обращения к процедуре, поэтому, если переменная является элементом массива, то ее ин- дексное выражение вычисляется при обращении к процедуре.
При использовании процедур и функций может встречаться рекур- сивное обращение – обращение к самим себе. Рекурсия в языке Turbo Pascal возможна благодаря тому, что при вызове процедуры