Delete (St r ,Po z ,N) — удаление N символов строки St r, начиная с позиции Poz. Если значение Poz > 255, возникает программное прерывание.
Например:
Значение St r | Выражение | Результат |
'абвгде' 'река Волга' | Delete(Str, 4, 2); Delete(Str, 1, 5); | 'абве' 'Волга' |
Insert (Strl, Str2, Ро z ) –вставка строки Str 1 в строку Str 2, начиная с позиции Poz.
Например :
Var
Sl, S2 : string[ll] ;
…
S1 := ' ЕС ';
S2 := 'ЭВМ1841';
Insert(S1,S2,4) ;
В результате выполнения последнего выражения значение строки S2 станет равным 'ЭВМ ЕС 1841'.
Str (IBR,St) — преобразование числового значения величины IBR и помещение результата в строку St. После IBR может записываться формат, аналогичный формату вывода. Если в формате указано недостаточное для вывода количество разрядов, поле вывода расширяется автоматически до нужной длины.
Например:
Значение IBR | Выражение | Результат |
1500 4.8Е+03 76854 | Str(IBR:6,St) Str(IBR:10,St) Str(-IBR:3,St) | '_1500' '____4800' '—76854' |
Val (St,IBR,Code) — преобразует значение St в величину целочисленного или вещественного типа и помещает результат в IBR. Значение St не должно содержать незначащих пробелов в начале и в конце. Code — целочисленная переменная. Если во время операции преобразования ошибки не обнаружено, значение Code равно нулю, если ошибка обнаружена (например, литерное значение переводится в цифровое), Code будет содержать номер позиции первого ошибочного символа, а значение IBR не определено.
Например:
Значение St | Выражение | Результат |
'1450' '14.2Е+02' '14.2А+02 | Val(St,IBR,Cod) Val(St,lBR,Cod) Val(St,IBR,Cod) | Code=0 Code=0 Code=5 |
Copy (St,Po z ,N) — выделяет из строки St подстроку длиной N символов, начиная с позиции Poz. Если Poz > Length(St), то результатом будет пробел; если Poz > 255, возникнет ошибка при выполнении. Функция Length описана ниже. Poz, N — целочисленные выражения.
Например:
Значение St | Выражение | Результат |
'ABCDEFG' 'ABCDEFG' | Copy(St, 2, 3) Copy(St, 4, 10) | 'BCD' 'DEFG' |
Concat (Strl,Str2,...,StrN) — выполняет сцепление строк Strl, Str2,..,StrN в том порядке, в каком они указаны в списке параметров. Сумма символов всех сцепленных строк не должна превышать 255.
Например:
Выражение | Результат |
Concat('AA','XX','Y') Соnсаt('Индекс','394063') | 'AAXXY' 'Индекс 394063' |
Length (St) — вычисляет текущую длину в символах строки St. Результат имеет целочисленный тип.
Например:
Значение St | Выражение | Результат |
'123456789' 'System 370' | Length(St) Length(St) | 9 10 |
Pos (Strl,Str2) — обнаруживает первое появление в строке Str2 подстроки Strl. Результат имеет целочисленный тип и равен номеру той позиции, где находится первый символ подстроки Strl. Если в Str2 подстроки Strl не найдено, результат равен 0.
Например:
Значение Str 1 | Выражение | Результат |
'abcdef ' 'abcdef' | Pos('de',Strl) Pos('r',Strl) | 4 0 |
UpCase (Ch) — преобразует строчную букву в прописную. Параметр и результат имеют литерный тип. Обрабатывает буквы только латинского алфавита.
Значение Ch | Выражение | Результат |
'd' | UpCase(Ch) | 'D' |
В целом, работу со стандартными строковыми процедурами и функциями можно свести в следующую таблицу:
Процедура/Функция | Описание |
Delete (St,Poz,N) | Удаление N символов строки St, начиная с позиции Poz |
Insert (Str1,Str2,Poz) | Вставка строки Str1 в строку Str2, начиная с позиции Poz |
Str (IBR, St) | Преобразование числового значения величины IBR и помещение результата в строку St |
Val (St,IBR,Cod) | Преобразует значение St в величину целочисленного или вещественного типа и помещает результат в IBR. Значение St не должно содержать незначащих пробелов в начале и в конце. Cod - целочисленная переменная, в которой содержится 0, если ошибки не обнаружено, и номер позиции первого ошибочного символа, если произошла ошибка. Значение IBR в этом случае не определено. |
Copy (St,Poz,N) | Выделяет из строки St подстроку длиной N символов, начиная с позиции Poz.Poz N-целочисленные выражения |
Concat (Str1,Str2,…,StrN) | Выполняет сцепление строк Str1,Str2,…,StrN в том порядке, в каком они указаны в списке параметров. |
Length ( St ) | Вычисляет текущую длину в символах строки St.Результат имеет целочисленный тип. |
Pos(Str1,Str2) | Обнаруживает первое появление в строке Str2 подстроки Str1. Результат имеет целочисленный тип и равен номеру той позиции, где находится первый символ подстроки Str1.Если в Str2 подстроки Str1 не найдено, то результат равен нулю. |
UpCase (С h ) | Преобразует строчную букву в прописную. Параметр и результат имеют литерный тип. |
Пример программы работы со стандартными строковыми процедурами и функциями
Program DemoString;
Uses Crt;
Var
Stroka:String[80];
Str1,Str2,Str3:String[20];
Search_Str:String[20];
Poz:byte;
Begin
Stroka:='ПРИВЕТ';
Writeln(Stroka);
Str1:=Copy(Stroka,2,3);
Writeln(Str1);
Writeln('Слово ПРИВЕТ состоит из',Length(Stroka):3,' букв');
Delete(Stroka,2,3);
Writeln(Stroka);
writeln;
Str2:='Строка - ';
Stroka:='Это текст!';
Writeln('Новая строка: ', Stroka);
Insert(Str2,Stroka,1);
Writeln(Stroka);
Repeat Until KeyPressed;
End.
Задание 1
Составьте программу для решения одной из следующих задач.
1.1. Определить, какое из двух слов длиннее и на сколько.
1.2. Определить, является ли какое-нибудь из двух слов частью другого.
1.3. Определить, есть ли в записи квадрата данного числа цифра 1.
1.4. Поменять в слове первую и последнюю буквы.
1.5. Если в слове нечетное число букв, то удвоить среднюю.
1.6. По последнему символу определить тип предложения (повествовательное, вопросительное, восклицательное).
1.7. Определить, является ли данный символ латинской буквой.
1.8. Удалить из слова среднюю букву (или две средних).
Задание 2
Составьте программу для решения одной из следующих задач.
2.1. Заменить в арифметическом выражении знаки "+" на знаки "-", а знаки "-" на знаки "+".
2.2. Удалить все буквы "я" в данном слове.
2.3. Удвоить все четные буквы слова.
2.4. Удалить все предлоги "на" в данном предложении.
2.5. Вставить после каждой буквы данного слова букву "о".
2.6. Удалить лишние пробелы в данном предложении.
2.7. Удвоить каждую букву данного слова.
2.8. Заменить каждую точку многоточием (т.е. тремя точками).
Программузапишитена диск.
Задание 3
Вызовите программу, составленную Вами при выполнении задания 2, и переделайте ее так, чтобы в ней использовалась только одна строковая переменная.
Задание 4
Составьте и исполните программу для решения одной из задач.
4.1 Заменить в тексте все маленькие латинские буквы на большие.
4.2 Заменить в тексте все большие латинские буквы на маленькие.
Задание 5
Составьте и исполните программу для решения следующей задачи.
5.1. Удвоить все согласные буквы.
5.2. Удалить из данного слова все согласные буквы.
5.3. Проверить, имеются ли в данном слове одинаковые буквы.
5.4. Оставить в данном слове из каждого набора одинаковых букв, идущих подряд, только одну букву.
5.5. Определить возможность составления одного данного слова из букв другого данного слова с учетом кратности.
5.6. Определить возможность составления одного данного слова из букв другого данного слова без учета кратности.
5.7. Для подсчета количества слов в предложении, учитывая что между словами может быть несколько пробелов.
5.8. Выяснить, можно ли из символов заданного слова составить слово "море".
Лабораторная работа №7
Программирование с использованием процедур и функций[С1]
Цель работы: познакомиться с понятиями "процедура" и "функция" в языке программирования Pascal, рассмотреть их сходства и различия, закрепить практические навыки работы Pascal на примере реализации алгоритмов при помощи процедур и функций, научиться применять метод последовательной детализации в практическом программировании; применять процедуры и функции при решении задач.
Теоретические сведения
Функции
Функция, определенная пользователем, состоит из заголовка и тела функции.
Заголовок содержит зарезервированное слово function, идентификатор (имя) функции, заключенный в круглые скобки необязательный список формальных параметров и тип возвращаемого функцией значения. Тело функции представляет собой локальный блок, по структуре аналогичный программе. В целом структура функции, определенной пользователем имеет вид:
function <имя> (Формальные параметры) : <тип результата>;
const ...
type ...
var
begin
< операторы >
end ;
В разделе операторов должен находиться, по крайней мере, один оператор, присваивающий имени функции значение. В точку вызова возвращается результат последнего присваивания.
Обращение к функции осуществляется по имени с необязательным указанием списка аргументов. Каждый аргумент должен соответствовать формальным параметрам, указанным в заголовке, и иметь тот же тип.
Пример программы с использованием функции, определенной пользователем
Пусть требуется разработать программу вычисления выражения:
Z=( + )/2* ,
в которой возведение в степень выполняется функцией Step.
program DemoFunc;
Var
М : integer;
А,Z,R : real ;
{Функция вычисления степени. N - степень, X – число, возводимое в данную степень. N, X — формальные параметры; результат, возвращаемый функцией в точку вызова, имеет вещественный тип}
function Step(N : integer; X : real): real;
Var
I : integer;
Y : real;
begin
Y:=1;
for I:=1 to N do{ Цикл вычисления N— й степени числа X)
Y:=Y*X;
Step:=Y ; {Присваивание функции результата вычисления степени}
end; {Конец функции}
Begin {Начало основной программы}
Write('Введите значение числа А и показатель степени М');
Readln(A,M) ;
Z:=Step(5,А) ; {Вызов функции с передачей ей фактических параметров N =5, X =А}
Z:=Z+ Step(3,l/A); {Вызов функции с передачей ей фактических параметров N =3, X =1/А}
if M=0 then R:=l {если число возводится в нулевую степень, то результат всегда равен 1}
else if M>0 then R:=Step(M,A){Вызов функции Step с передачей ей фактических параметров М, А}
else R:=Step(-M,A); {Вызов функции с передачей ей фактических параметров: - М, отрицательная степень}
Z:=Z/(2*R) ;
Writeln(' Для А= ',А,'М= ',М,' Значение выражения= ',Z);
end.
В начале программы описываются переменная целого типа М и переменные вещественного типа А, Z, R, после этого описывается функция вычисления степени числа Step с формальными параметрами N и X, результат, возвращаемый функцией в точку вызова, - вещественного типа.
В описании функции вводятся две локальных (местных) переменных I и Y. Переменная I служит для подсчета числа повторений цикла, а в Y накапливается значение степени как произведения N одинаковых сомножителей. В заключение функции присваивается значение вычисленного произведения.
В начале выполнения основной программы на экран выводится запрос "Введите значение числа А и показатель степени М" и считывается с клавиатуры значение вещественного числа А и целого числа М.
Затем выполняется оператор:
Z := Step (5, A );
Осуществляется вызов функции Step с передачей ей фактических параметров 5, А. Их значения присваиваются формальным параметрам функции N и X. По окончании вычисления степени числа значение функции Step, вычисленное для фактических параметров 5 и А, присваивается переменной Z. Аналогично в операторе:
Z := Z + Step (3, l / A );
сначала осуществляется вызов функции Step с передачей ей фактических параметров 3, 1/A, после чего значение переменной Z увеличивается на величину возвращенного в основную программу результата вычисления функции Step.
Операторы:
if M=0 then R:=1
else if M>0 then R:=Step(M,A)
else R:=Step(- M,A);
проверяют условия М=0, М>0 и в зависимости от их соблюдения либо присваивает переменной R значение 1 (при М=О), либо выполняет вызов функции Step для фактических значений М, А или -М, А, а после вычисления значения функции Step присваивает его переменной R.
Оператор:
Z := Z /(2* R );
выполняет вычисление значения выражения, а затем присваивает вычисленное значение переменной Z.
В заключение программы стандартная процедура Write l n выводит на экран сообщение о результате вычислений степени М числа А.
Процедура
Описание процедуры включает заголовок (имя) и тело процедуры. Заголовок состоит из зарезервированного слова procedure, идентификатора (имени) процедуры и необязательного, заключенного в круглые скобки, списка формальных параметров с указанием типа каждого параметра. Имя процедуры — идентификатор, уникальный в пределах программы. Тело процедуры представляет собой локальный блок, по структуре аналогичный программе.
Описания меток, констант, типов и т. д. действительны только в пределах данной процедуры. В теле процедуры можно использовать любые глобальные константы и переменные. Общая структура описания процедур:
procedure <имя> (Формальные параметры);
const ... ;
type . . . ;
var . . . ;
begin
<операторы>
end ;
Пример программы с использованием процедуры, определенной пользователем
В качестве примера опишем процедуру, которая прерывает выполнение программы и выдает соответствующее сообщение об ошибке.
procedure Abort(Msg: string);
begin
Writeln(' Ошибка : ', Msg);
Halt (1);
end ;
В данной процедуре пользователя использована переменная Msg типа string, в которой хранится текст сообщения о характере ошибки, вызвавшей прерывание программы. Для прерывания выполнения программы используется стандартная процедура Halt из стандартного библиотечного модуля System.
Процедура не может выполниться сама, ее необходимо вызвать по имени и указать фактические параметры того же типа, что и формальные. Количество и тип формальных параметров равны количеству и типу фактических параметров.
В качестве примера приведем фрагмент программы, в котором используется описанная выше процедура Abort.
program DemoProc; {Подсчет суммы десяти введенных целых положительных чисел: если будет введено отрицательное число, прервать выполнение}
const
Limit= 10; {Ограничение на количество вводимых чисел)
var
Count, Item, Sum : integer;
procedure Abort(Msg: string); { описание и реализация процедуры Abort}
begin
Writeln('Ошибка: ', Msg);
Halt(1);
end ;
Begin {основная программа}
Count:= 0;
Sum: = 0 ;
while (Count < Limit) do { Условие выполнение цикла }
begin
Count:= Count+1;
Write('Введите ', Count, '-e целое число: ');
Readln(Item);
if Item < 0 then { Если введено отрицательное число }
Abort('Введено отрицательное число! '); {Вызов процедуры}
Sum:= Sum+Item;
end;
Writeln('Сумма введенных чисел равна ', Sum);
end.
В разделе описания программы описываются константа Limit, ограничивающая количество вводимых чисел; в разделе описания переменных описываются переменные Count, Item, Sum типа integer.
В начале программы обнуляются значения количества введенных чисел Count и их сумма Sum. Потом выполняется цикл, пока очередное вводимое число меньше предельного, заданного значением константы Limit. Сначала устанавливается номер очередного числа, затем на экран выводится приглашение "Введите 1-е (2-е и т.п.) число", считывается значение числа с клавиатуры в переменную Item. Затем проверяется условие Item<0.
Если условие выполняется, то вызывается Abort, которой передается фактический параметр-значение типа string: "введено отрицательное число". Это значение присваивается формальному параметру Msg процедуры Abort. Процедура Abort выводит на экран сообщение об ошибке и печатает текст сообщения - значение параметра Msg: "Ошибка: введено отрицательное число", после чего вызывает стандартную процедуру Halt(1), которая прерывает выполнение программы.
Если условие Item<0 не выполняется, то значение суммы Sum увеличивается на значение введенного числа Item, и управление передается в заголовок цикла для проверки условия Count < Limit. Если условие соблюдается, то тело цикла выполняется еще раз, иначе цикл завершается, а управление в программе передается на оператор, следующий за циклом, т. е. за резервированным словом end, обозначающим окончание составного оператора в теле цикла. После этого на экран выводится сообщение: "Сумма введенных чисел равна" и печатается значение переменной Sum. На этом выполнение программы завершается.
Механизм передачи параметров
Как было показано в приведенных выше примерах программ с использованием процедур и функций, в заголовке процедуры или функции может быть задан список параметров, которые называются формальными. Название "формальные" эти параметры получили в связи с тем, что в этом списке заданы только имена для обозначения исходных данных и результатов работы процедуры, а при вызове подпрограммы на их место будут подставлены конкретные значения (выражений) и имен. Этот список указывается после имени подпрограммы и заключается в круглые скобки.
В списке формальных параметров должны быть перечислены имена формальных параметров и их типы. Имя параметра отделяется от типа двоеточием, а параметры друг от друга - точкой с запятой. Имена параметров одного типа можно объединять в подсписки, в которых имена отделяются друг от друга запятой.
Между формальными и фактическими параметрами должно быть полное соответствие:
• формальных и фактических параметров должно быть одинаковое количество
• порядок следования фактических и формальных параметров должен быть один и тот же;
• тип каждого фактического параметра должен совпадать с типом соответствующего формального параметра.
Параметры-значения.
Параметры-значения используются только для передачи исходных данных из основной программы в подпрограмму (процедуру или функцию), в списке формальных параметров они перечисляются через запятую с обязательным указанием их типов, как было, например, в выше приведенных примерах:
procedure Abort(Msg: string);
function Step(N : integer; X : real): real;
Если формальный параметр объявлен как параметр-значение, то фактическим параметром может быть произвольное выражение. При вызове подпрограммы фактические параметры вычисляются и используются как начальные значения формальных параметров, т. е. осуществляется подстановка значений. Если формальный параметр определен как параметр-значение, то перед вызовом процедуры это значение вычисляется, полученный результат помещается во временную память и передается процедуре. Даже если фактический параметр - простейшее выражение в виде константы или переменной, все равно процедуре будет передана лишь копия этой константы (переменной). В процессе выполнения подпрограммы формальные параметры могут изменяться, но это никак не отразится на соответствующих фактических параметрах-переменных, которые сохранят те значения, которые имели до вызова подпрограммы, так как меняются не они, а их копия. Поэтому параметры-значения нельзя использовать для передачи результатов из подпрограммы в основную программу.
Пример программы с использованием передачи параметров по значению:
program Pr1;
var
А,В : real;
{Процедура вычисления квадратов двух чисел и вывода их суммы}
procedure Sum_Square(X, Y : real); {X,Y - формальные параметры }
begin
Х:=Х*Х;
Y:=Y*Y;
Writeln('Cyммa квадратов = ',X+Y);
end; {Конец процедуры}
begin {Начало основной программы}
А:=1.5;
В:=3.4;
Sum_Square (А,В) ; {Вызов процедуры Sum _ Square с передачей ей значений фактических параметров А и В}
end.
При вызове процедуры Sum_Square с фактическими параметрами А, В значения этих параметров (один раз) копируются в соответствующие формальные параметры X, Y, и дальнейшие преобразования формальных параметров X,Y внутри процедуры Sum_Square уже никак не влияют на значения переменных А, В.
Параметры-переменные
Параметры-переменные используются для определения результатов выполнения процедуры и в списке формальных параметров перечисляются после зарезервированного слова Var с обязательным указанием типа. Каждому формальному параметру, объявленному как параметр-переменная, должен соответствовать фактический параметр в виде переменной соответствующего типа, например:
procedure Example(var M,N : integer; var Y : real) ;
Если формальный параметр определен как параметр-переменная, то при вызове процедуры ей передается сама переменная, а не ее копия, и изменение параметра-переменной приводит к изменению фактического параметра в вызывающей программе. Следовательно, исходные данные в процедуру из программы могут передаваться как через параметры-значения, так и через параметры-переменные, а результаты работы процедуры возвращаются в вызывающую программу только через параметры-переменные.
Пример программы, использующей параметры-переменные:
program Sum_Sub_Square;
var
A,В : real ;
SumAB, SubAB : real;
{Процедура с параметрами-переменными Sum , Sub }
procedure Sum_Sub(X,Y : real; var Sum, Sub : real);
begin
Sum:=X*X+Y*Y;
Sub:=X*X-Y*Y;
end; { Конец процедуры }
begin {Начало основной программы}
А:=1.5;
В:=3.4;
Sum_Sub(A,B, SumAB,SubAB); {Вызов процедуры с передачей ей фактических параметров-значений А, В и параметров-переменных SumAB , SubAB}
Writeln('Сумма квадратов чисел',А,' и ',В,'= ', SumAB);
Writeln("Разность квадратов чисел',А,’и',В,'=', SubAB);
end.
Задания.
1. Даны действительные числа х1, у1, х2, у2, …,х10, у10. Найти периметр десятиугольника, вершины которого имеют соответственно координаты (х1, у1), (х2, у2), …, (х10, у10). (Определить процедуру вычисления расстояния между двумя точками, заданными своими координатами.)
2. Даны действительные числа a, b, c, d, e - стороны пятиугольника. Найти площадь пятиугольника. (Определить процедуру вычисления площади треугольника по его сторонам.)
3. Даны координаты вершин двух треугольников. Определить, какой из них имеет большую площадь.
4. Дано натуральное число n. Выяснить, является ли оно полным квадратом. Определить функцию, позволяющую распознавать полные квадраты.
5. Дан массив A[1..50], элементы которого отличны от нуля. Расположить их в таком порядке, чтобы первыми были все положительные элементы, а затем - все отрицательные, причем порядок следования как положительных, так и отрицательных элементов должен сохраниться (при решении задачи новый массив не заводить!).
6. Составить функцию для нахождения точного значения суммы натуральных чисел, в десятичной записи которых более 20 знаков. Указание. Исходные данные и ответ представить в виде массивов цифр.
7. Рассмотрим произвольное натуральное число и найдем сумму его цифр, затем сумму цифр полученного числа и так далее, пока не получим однозначное число. Назовем это число цифровым корнем. Требуется написать программу, которая для заданного N (N<10100) находит его цифровой корень.
Лабораторная работа №8
Дата: 2019-02-02, просмотров: 380.