Стандартные процедуры и функции для строк 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Стандартные процедуры и функции для строк



Турбо Паскаль представляет в распоряжение пользователя целый ряд функций и процедур, предназначенных для обработки строк.

Функция Length

Встроенная функция Length (длина) позволяет определить фактическую длину текстовой строки, хранящейся в указанной переменной.

Пример.

var

word: string;

begin

write ('Введите, пожалуйста, слово: ');

readln (word);

writeln ('Это слово состоит из ', length(word): 3, ' букв!')

end.

При подсчете фактической длины строки учитываются все входящие в нее символы, в том числе и пробелы.

Функция Upcase

Функция Upcase позволяет преобразовывать символ любой литеры из строчного в прописной. Эта функция рассчитана на обработку отдельного символа, поэтому для обработки строки символов с помощью этой функции приходится организовывать цикл.

Пример.

var

word: string;

i: byte;

begin

word:= 'Фирма Microsoft';

for i:= 1 to length (word) do

word [i]:= upcase (word[i]);

writeln (word); {Выводится текст " фирма MICROSOFT"}

end.

Русские литеры не могут обрабатываться этой функцией, поэтому в результате работы этой программы на терминал выдается строка, содержащая большие английские и маленькие русские буквы.

Функция Copy

Функция Copy позволяет копировать фрагмент некоторой строки из одной переменной в другую. Вызывая функцию copy, необходимо указывать следующие параметры:

1) имя строки, из которой должен извлекаться копируемый фрагмент;

2) позицию в строке, начиная с которой будет копироваться фрагмент;

3) число копируемых символов.

Пример.

var

ws: string [79];

w1,w2,w3: string [20];

begin

ws:= 'фотографирование';

w1:= copy (ws, 1, 4); writeln (w1);

w2:= copy (ws, 5, 4); writeln (w2);

w3:= copy (ws, 10, 3); writeln (w3);

end.

В результате выполнения программы на экран выводится:

фото

граф

ров

Сообщения об ошибке не будет в случаях, если начальная или конечная позиции копируемого фрагмента находятся вне пределов исходной строки символов. Результатом выполнения операции в первом случае будет строка нулевой длины, во втором - фрагмент от начальной позиции копирования до конца исходной строки.

Функция Роs

С помощью функции Pos осуществляется поиск определенного фрагмента в строке. Если заданный фрагмент в строке присутствует, то функция возвращает номер позиции в строке, с которой фрагмент начинается. Если в строке фрагмент не найден, то функция возвращает ноль.

var

ws string [79];

sw string [20];

p: byte;

begin

ws:= 'Электрификация';

sw:= 'Эл'; p:= Pos (sw,ws); writeln(p);

sw:= 'три'; p:= Pos (sw,ws); writeln(p);

sw:= 'к'; p:= Pos (sw,ws); writeln(p);

end.

В результате выполнения программы на экране появляется:

Функция Pos требует полного совпадения искомого фрагмента и фрагмента строки, в которой производится поиск. Большие и маленькие буквы считаются различными символами.

Процедура Delete

Удаление из строки. Для этого используется процедура Delete (Str,n,t), которая вырезает из строки Str t символов, начиная с n-го, таким образом сама строка изменяется.

Пример: Дан фрагмент программы:

Strl:='ABCDEFGH':

Delete(Strl, 3, 4);

Wrlteln(Strl);

После выполнения этих операторов из строки будут удалены четыре символа, начиная с третьего, то есть строка будет такой: Strl='ABGH'.

Процедура Insert

Вставка подстроки в строку. Это можно сделать, применяя процедуру Insert(Strl,Str2,n) — вставка строки Str1 в строку Str2, начиная с n-го символа, при этом первая строка остается такой же, как и была, а вторая получает новое значение.

Пример:

Strl:='ABCDEFGH';

Str2:='abcdefgh';

Insert(Strl, Str2, 3);

В результате выполнения данной процедуры строка будет такой — Str2=’abABCDEFGHcdefgh’. Этот же результат будет и после выполнения такой последовательности операторов:

Str2:='abcdefgh';

Insert('ABCDEFGH', Str2, 3);

Числа и строки

Надо заметить, что число 13 и строка ‘43' — это не одно и то же. Для работы с числами и строками применяются две процедуры.

Str(N,Strl) — переводит числовое значение N в строковое и присваивает результат строке Strl, причем можно переводить как целые числа, так и вещественные.

Пример:

Str(1234, Strl) - после выполнения Strl='1234';

Str(452.567,Strl) — переводим вещественное чис­ло в нестандартном виде, результат Strl='452.567';

Str(4.52567e-st-2,Strl) — переводим вещественное число в стандартном виде, в итоге:

Strl='4.52567e+2'.

Вторая процедура выполняет обратное действие. Val(Str, N, К) — переводит строковое значение в числовое, если данная строка действительно является записью числа (целого или вещественного), то значение к=0, а N — это число, иначе К будет равно номеру символа, в котором встречается первое нарушение записи числа N.

Пример 5.19 Ввести в ЭВМ строку символов. Количество символов в строке (n <40). Вывести встречающиеся в ней символы без повторов и количество этих символов.

Решение задачи сводится к следующему. Каждый символ строки сравнивается со всеми остальными, находящимися после него. Если данный элемент имеет номер i, то следующий – i+1 и т.д., до конца. При этом i изменяется от 1 до n-1. Если в результате сравнения окажется, что анализируемый символ встречается в правой части строки, то он не уникальный. Пока его можно не выводить, он будет выведен потом. Если i-тый элемент не равен ни одному из последующих, то он уникальный и его нужно вывести.

Например для строки 'АВВСА' уникальные символы будут выведены в следующем порядке: ВСА

Program Unicum;

Var

s: string;

n, i, j, k, kols: integer;

Begin

writeln('Введите строку');

readln(s);

n:=length(s);

kols:=0;

writeln('Символы строки без повторов ');

for i:=1 to n-1 do

Begin

k:=0;

for j:=i+1 to n do {п.4.2}

if s[i]=s[j] then

k:=k+1;

if k=0 then

Begin

kols:=kols+1;

write(s[i]:2);

end;

end;

writeln('Количество различных символов в строке - ',kols);

writeln('Работа окончена. Нажмите клавишу ENTER');

readln;

End.

Пример 5.20 Ввести в ЭВМ строку из n символов латинского алфавита (n<30). Расположить их по алфавиту.

Воспользуемся тем, что буквы латинского алфавита 'A' – 'Z', 'a' –'z' имеют коды, значения которых возрастают. При этом для решения задачи можно применять алгоритм сортировки "пузырьком".

Program Sorts;

Var

s: string;

sr: char;

n, i, k: integer;

Begin

writeln('Введите строку');

readln(s);

n:= length(s);

for k:= 1 to n-1 do

for i:= 1 to n-k do

if s[i]>s[i+1]then

Begin

sr:=s[i];

s[i]:= s[i+1];

s[i+1]:= sr;

end;

writeln('Строка с упорядоченными символами:');

writeln(s);

End.

Пример 5.21 Задана последовательность символов S1 … Sn Подсчитать количество "!" знаков. Ввод каждого символа завершается ENTER.

Program pod;

Var

s: array [1…100] of char;

p, i, n: integer;

Begin

readln (n);

for i:=1 to n do

readln (s[i]);

for i:=1 to n do

if s[i]= '!' then p:=p+1;

writeln (p);

End.

Пример 5.22 Задана последовательность символов S1…Sn Подсчитать сколько цифр (0¸9) в этой последовательности.

Program pod1;

var;

s: array [1…100] of char;

i, n, p: integer;

Begin

readln (n);

for i:=1 to n do resdln (s[i]);

for i:=1 to n do

if (ord (s[i])>=ord ('0')) and

(ord (s[i])<=ord('9')) then

p:=p+1;

writeln (p);

End.

Ord - выдает код символа.

'0', '9' - символьные константы.

Каждый символ в строковой переменной можно рассматривать как переменную типа char, доступ к ним через индекс в квадратных скобках, можно применить все функции типа char

word [1]:='M'

word [2]:='0'.

Пример 5.23 В произвольном тексте заменить все “чя” на “ча”.

Program pp;

Var

text: string;

i: integer;

Begin

readln (text);

for i:=1 to length (text)-1 do

if copy (text, i, 2)=‘чя’ then

Begin

delete (text, i+1, 1);

insert (‘a’, text, i+1);

end;

text [i+1]=‘a’

writeln (text);

End.

Пример 5.24 Подсчитать сколько раз слово word встретилось в тексте text и первую букву в этом слове сделать заглавной (текст латинский).

Program word_ text;

Var

text, word: string;

s, i: integer;

Begin

writeln (‘Введите текст’); readln (text);

s: =0

writeln (‘Введите слово’); readln (word);

for i:=1 to length (text) - lenght (word)+1 do

if copy (text, i, length (word))=word then

Begin

s:=s+1;

word [i]:=upcase (word [i]);

end;

writeln (s);

End.

Пример 5.25 Заменить в произвольном тексте все word1 слова на слово word2.

Program ww;

Var

text, word1, word2: string;

i: integer;

Begin

readln (text); readln (word1); readln (word2);

Repeat

i:=pos (word1, text)

if i<>0 then

Begin

delete (text, i, length (word1));

insert (word2, text, i);

end;

until i=0;

writeln (text);

End.

Пример 5.26 Составить программу заменяющую все малые буквы русского алфавита на большие.

Program pp;

Var

t: string;

p: char;

k, i: byte;

Begin

readln (t); (ввод текста);

for i:=1 to length (t) do

Begin

k:=ord (t[i]);

Заменить

if k>=160 and k<=175 then

Begin

delete (t, i, 1);

insert (chr (k-32), t, i);

end;

if k>=224 and k<=239 then

Begin

delete (t, i, 1);

insert (chr (k-80), t, i);

end;

if k=241 then

Begin

delete (t, i, 1);

insert (‘Е’, t, i);

end;

en

writeln (t);

End.


Глава 6 Процедуры и функции

Программы, которые не разделяются на отдельные структурные элементы, называются монолитными. Большие монолитные программы сложны для разработки, отладки и сопровождения.

В больших программах часто встречаются фрагменты, одинаковые по выполняемым действиям и различающиеся только в значениях исходных данных. При таком построении программы приходится задавать фактически одну и ту же группу операторов для каждого повторения фрагментов одного предназначения. Для эффективного программирования подобных повторений фрагментов в языках программирования введено понятие подпрограммы.

Подпрограмма - это группа операторов, оформленных как самостоятельная программная единица. Подпрограмма записывается однократно в определенной части программы, а затем в нужных местах программы обеспечивается только обращение к ней. Таким образом, подпрограмма - это эффективное средство экономии памяти. При обращении к подпрограмме в нее передаются исходные данные, а после выполнения операторов подпрограммы в основную программу передаются результаты расчетов. Использование аппарата подпрограмм позволяет сократить объем и улучшить общую структуру программы с точки зрения наглядности и читаемости, уменьшить вероятность ошибок и облегчить процесс отладки программы. Разложение монолитной программы на подпрограммы дает возможность выполнять разработку отдельных подпрограмм разными программистами и во многом независимо друг от друга.

Кроме того, подпрограмма может быть рассмотрена как самостоятельный блок, что позволяет использовать ее в общем подходе при конструировании алгоритма и программы по принципам нисходящего или восходящего проектирования. В языке Паскаль подпрограммы реализуются в виде процедур и функций.

Процедуры и функции, входящие в программу, могут содержать свои подпрограммы и вызвать процедуры и функции более низкого уровня и т.д. Последовательное структурирование программы продолжается до тех пор, пока реализуемые подпрограммами алгоритмы не станут настолько простыми, чтобы их можно было легко запрограммировать. Таким образом, программа приобретает иерархическую структуру. Именно такие программы в литературе принято называть блочными (модульными). Программисты с большим практическим опытом предпочитают использовать такие программы, поскольку они легче для разработки, проще для понимания и легко подвергаются, модификации.

Процедуры

Процедура — это независимый программный блок (программная единица), выполняющий решение некоторой самостоятельной подзадачи.

Процедуры (и функции) размещаются в программе сразу же после описания переменных (в разделе Var) и перед словом Begin, указывающим начало ее основной части, т.е. следующим образом:

Program

Const

Var

.....

Процедура_1

.....

Процедура_n

Begin { Начало основной программы }

......

End.

Сама процедура оформляется следующим образом:

Procedure Имя(Формальные_параметры); {заголовок процедуры}

Описание локальных переменных

Begin

Операторы <= Тело процедуры

End;

Из этого текста видно, что процедура описывается так же, как программа. Отличие заключается в том, что текст программы заканчивается служебным словом End с точкой, а процедура заканчивается служебным словом End с точкой с запятой после него. Поэтому саму Паскаль-программу можно считать главной процедурой.

Формальные параметры – это список, который содержит имена переменных, массивов и типов, являющихся исходными данными и результатами процедуры. Он может отсутствовать. Элементы списка параметров описываются полностью, с указанием типов.

Локальныепеременные — это переменные, которые используются только внутри данной процедуры.

На вход процедуры (в качестве исходных данных) поступает совокупность параметров – аргументов, а на выходе формируются параметры – результаты. Причем процедура позволяет получить один или несколько результатов, а функция — только один.

Например, процедура, выводящая горизонтальную линию из n одинаковых символов, может быть такой.

Procedure GorLine(n: Integer; Sim: char);

{Изображение горизонтальной линии символом Sim}

Var

I: Integer;

Begin

For i:= 1 To n Do

Write(Sim);

End;

Здесь n и Sim – формальные параметры, являющиеся входными величинами; i – локальная переменная.

Процедуры в программе выполняются не в том порядке, в каком они записаны. К ним обращаются (их вызывают) из главной программы по имени с указанием фактических параметров.

Например:

Имя; { если процедура не имеет параметров } или

Имя (Фактические_параметры); {если процедура с параметрами}

Обращения к процедуре GorLine возможны в следующих формах:

GorLine(25);

GorLine(WhereX + 10);

После выполнения процедуры происходит возврат в основную программу к оператору, стоящему после вызывающего.

Пример 6.1. Пусть в массиве Dan имеются 20 значений целого типа (1≤ Dan[i] ≤75), которые нужно представить в виде гистограммы (графика, представляемого столбцами символов). Значения элементов массива можно получить с помощью генератора случайных чисел. Для простоты примем, что ось Y располагается вдоль экрана.

При составлении программы воспользуемся ранее написанной процедурой GorLine. Столбцы графика будем изображать символом "*" (звездочка).

Program Graf1;

Const

N = 20;

Var

Dan: Array[1..N] of Integer;

K,I: Integer;

Procedure GorLine(n: Integer; Sim: char);

Var

I: Integer;

Begin

For i:= 1 To n Do

Write(Sim);

End; { GorLine }

Begin { Основная программа }

Randomize;{Инициализация генератора случайных чисел}

For I:=1 To N Do { Заполнение массива }

Dan[I]:= Random(75)+1; { случайными числами }

For I:=1 To N Do

Begin

K:= Dan[i];

GorLine(K, ’*’);

WriteLn;

End;

WriteLn(’Нажмите ENTER’);

ReadLn;

End.

Здесь N — формальный параметр (в процедуре), K — фактический (в основной программе).

Различие между формальными и фактическими параметрами такое же, как между символами в общей формуле для нахождения корней квадратного уравнения и значениями, которые подставляются в эту формулу при решении конкретного уравнения. Другими словами, формальные параметры – это просто объекты, которые позволяют описать, что будет делать процедура. Сами действия будут выполняться над теми значениями объектов, которые передаются процедуре при ее вызове. Поэтому при вызове процедуры должны соблюдаться следующие требования:

– количество передаваемых фактических параметров должно равняться количеству описанных в процедуре формальных параметров.

– порядок следования фактических параметров и их типы должны соответствовать порядку следования и типам формальных параметров. Это, в частности означает, что массивы должны иметь одинаковую размерность и содержать данные одного типа.

Например, пусть в программе описана процедура P1 так, как это показано ниже.

Procedure P1(X,Y,Z:Real;K:Integer);

.......

Begin

{ Тело процедуры }

End;

.......

Begin { Основная программа }

.....

P1(A,B,C,N); { Вызов процедуры P1}

.....

End.

При вызове процедуры P1 будет установлено следующее соответствие между фактическими и формальными параметрами:

Для обеспечения соответствия массивов и некоторых других типов данных (записей, файлов) стандарт языка Паскаль требует их описания в разделе Type. Типы, определяемые таким образом, имеют тот же статус, что и стандартные: Real, Integer и др. Описатель типов в программе располагается после описания констант и перед описанием переменных. В общем виде типы пользователя описываются так.

Параметры процедур делятся на 2 класса:

1) параметры– значения;

2) параметры– переменные.

Параметр–значение используется в процедуре, но после окончания ее работы не изменяется. Как правило, это аргумент (исходное данное) процедуры.

Так, в процедуре GorLine параметры n, Sim, а в Р1 – все 4 параметра являются параметрами–значениями. При обращении к процедуре Р1 значения фактических параметров A, B, C, N присваиваются соответствующим формальным параметрам X, Y, Z, K. Поэтому, если в ней был, например, оператор Z:=Z+1, то изменится именно значение Z, а переменная A - нет. Другими словами, после завершения работы процедуры все переданные ей параметры–значения в главной программе не меняются.

Если формальный параметр является параметром–значением, то фактический параметр может быть выражением соответствующего типа, например:

GorLine (20,’+’);

GorLine (2*K-1, Pred(Simvol));

Параметр–переменная не только используется в процедуре, но и позволяет изменять значение соответствующего фактического параметра. Это – результат работы процедуры. При вызове процедура получает доступ к области памяти, в которой хранится значение фактического параметра, соответствующего параметру–переменной. Таким образом, обеспечивается возможность изменения этого фактического параметра.

В заголовке параметру-переменной должен предшествовать описатель (слово) Var.

Например:

Procedure SumXY(X,Y:Real;Var Z,Q:Real);

Begin

Z:=X+Y;

If Z<0 Then

Q:= -Z

Else

Q:= Z;

End; { SumXY }

Описатель Var записывается столько раз, сколько разных типов параметров-переменных используется в процедуре. Параметр-переменная при вызове не может представляться выражением.

Пример 6.2 Применение процедур при работе с массивами.

Program pr;

Type

mas: array [1…10] of integer;

Var

i, n: integer;

k: mas;

procedure input _ mas (var k: mas; n: integer);

Var

j: integer;

Begin

for j:=1 to n do

readln (k[ j ]);

end;

Begin

writeln ('введите n'); readln (n);

input _ mas (k, n);

for i:=1 to n do

writeln (k[i]);

End.

j - локальная переменная.

i, n, k - массив - глобальные переменные.

Пример 6.3 Выполнить упорядочение по возрастанию нескольких массивов вещественных чисел. В программе используется процедура сортировки методом «пузырька», алгоритм которой описан ранее.

Исходными данными для процедуры являются массив вещественных чисел и его размерность. Стандарт языка Паскаль, как отмечалось выше, требует описания массива в разделе Type (в программе это новый тип - MasReal). При использовании процедуры сортировки для согласования параметров необходимо в основной программе и процедуре ссылаться только на этот тип.

Program Sort;

Const

M = 200; { Максимальный размер массива }

Type

MasReal = Array [1..M] Of Real;

Var

A,B: MasReal;

I,N: Integer;

Procedure SortY (L:Integer; Var Y:MasReal);

{ Сортировка вещественных чисел методом "пузырька" }

{ L – размер массива; Y – массив вещественных чисел}

Var

i,k: Integer;

Z: Real;

Begin

For k:=1 To L-1 Do

For i:=1 To L-k Do

If Y[i]>Y[i+1]Then

Begin

Z:= Y[i];

Y[i]:= Y[i+1];

Y[i+1]:= Z

End;

End; { SortY }

Begin {Основная программа}

Writeln(’ Введите размер массивов’);

ReadLn(n);

Writeln(’Введите первый массив’);

For i: =1 To n Do

ReadLn(A[i]);

Writeln (’Введите второй массив’);

For i:= 1 To n Do

ReadLn(B[i]);

SortY (n,A); { Сортировка массива А }

SortY (n,B); { Сортировка массива В }

Writeln (’Первый массив’);

For i:= 1 To n Do

Write (A[i]:8:3);

Writeln;

Writeln (’Второй массив’);

For i:= 1 To n Do

Write(B[i]:8:3);

Readln; { Ожидание нажатия клавиши ENTER }

End.

Пример 6.4 Составить программу нахождения палиндромов в диапазоне 0 9999, используя процедуру.

program palindrom;

Var

f, i: integer;

procedure two (var f: integer; i: integer);

Var

a, b: real;

Begin

a: =int (i/10); b:=i-a*10;

if a=b then f:=1;

end;

procedure thr (var f: integer; i: integer);

Var

a, c: real;

Begin

a:= int(i/100); c:= i-int(i/10)*10;

if a=c then f:=1;

end;

procedure fo (var f: integer; i: integer);

Var

a, b, c, d: real;

Begin

a: =int (i/100); b: =int((i-a*1000)/100);

c: =int ((i-a*1000-b*100)/10);

d: =i-a*1000-b*100-c*10;

if (a=d) and (c=b) then f=1;

end;

Begin

for i=0 then 9999 do

Begin

f:=0

Case i of

0.. 9: f:=1;

10.. 99: two (f, i);

100.. 999: thr (f, i);

1000.. 9999: fo (f, i);

end;

if f=1 then writeln (i);

end;

End.

Функции

Функция — это независимый программный блок (программная единица), который позволяет получить только один результат.

Примером являются стандартные функции Паскаля. Имеется возможность писать свои функции. Располагаются они в программе так же, как процедуры: после описания данных и перед операторами.

Program

Const

Var

.....

Функция_1

.....

Функция_n

Begin { Начало основной программы }

......

End.

Функция оформляется так же, как процедура. Отличие имеется в заголовке и способе передачи результата. В общем виде функция оформляется так:

Function Имя(формальные_параметры):Тип_Результата;

Описание локальных переменных

Begin

....

Имя:= Выражение;

....

End;

Формальные параметры – это аргументы функции. Они могут отсутствовать. Результат передается через имя функции, поэтому в заголовке указывается тип результата. По этой же причине среди операторов в теле функции должен быть хотя бы один, в котором имени функции присваивается значение. Именно это значение и будет возвращено функцией в качестве результата.

Например, оформить в виде функции операцию возведения вещественного числа в целую степень.

Function Stepen(x:Real;n:Integer):Real;

Var

i:Integer;

P:Real;

Begin

If X = 0 Then

If n = 0 Then

Stepen:= 1

Else

Stepen:= 0

Else

If n = 0 Then

Stepen:= 1

Else

If n > 0 then

Begin

P:= 1;

For i:= 1 to n do

P:= P*X;

Stepen:= P;

End

Else

Begin

P:=1;

For i:= 1 to Abs(n) do

P:= P/X;

Stepen:= P;

End;

End; { Stepen }

Для вычисления значения функции с конкретным параметром ее, как и процедуру, вызывают из основной программы с указанием фактических параметров–аргумен­тов. В отличие от процедуры имя функции может встречаться в выражениях в качестве операнда. Когда выражение вычисляется, функция выполняется и значением операнда становится величина, возвращаемая функцией.

Формальные параметры функции могут быть только параметрами–значениями. При ее вычислении они не изменяются. Аргументы функции могут быть любых типов:

1) скалярные — числа, символы, булевские;

2) массивы;

3) другие типы.

Сама функция (результат) имеет только скалярный тип, (т.е. число - целое или вещественное, а также символ или булевская переменная).

При обращении к функции (вызове ее) на место формальных параметров подставляются фактические, как в процедуре. Типы, количество и порядок следования фактических и формальных параметров должны совпадать.

В теле функции могут использоваться (вызываться) и другие функции, стандартные или написанные пользователем.

Например, вычислить гиперболический синус по формуле:

Sinh(x) = (ex – e-x)/2

Функция будет иметь вид

Function Sinh(X:Real):Real;

Begin

Sinh:= (Exp(X)-Exp(-X))/2;

End;

К функции можно обращаться из основной программы; из другой функции и из самой себя.

Функции, которые вызывают сами себя, называются рекурсивными. Такие функций часто встречаются в математике, например, вычисление факториала, возведение числа в целую степень, вообще, нахождение любых значений методом математической индукции. Так, факториал вычисляется по формуле:

n! = n*(n -1)! - при n>0 и

n! = 1 - при n=0.

Для рекурсивных функций необходимо вырабатывать условие завершения (иначе произойдет зацикливание). Это условие для n! записано во второй строчке (при n=0) – так как рекурсия производится на основе второго сомножителя - (n-1)!=(n-1)*(n-2)! и т.д. - до нуля.

Запишем рекурсивную функцию вычисления факториала.

Function Fact (N:Integer):Integer;

Begin

If N=0 Then

Fact:= 1

Else

Fact:= N*Fact(N-1);

End;

Пример 6.5 Найти сумму элементов в нескольких массивах.

Program Count_Sum;

Const

Nmax = 200;

Type

Mas = Array[1..Nmax] Of Real;

Var

A,B: Mas;

Suma,Sumb: Real;

i,n: Integer;

Function SumMas (k:Integer;X:Mas):Real;

{Нахождение суммы элементов массива вещественных чисел}

Var

I: Integer;

S: Real; { Вспомогательная переменная - сумма}

Begin

S:= 0;

For i:= 1 to k Do

S:=S + X[i];

SumMas:=S;

End; { SumMas }

Begin

{ Основная программа }

Writeln(’Введите размер массивов’);

ReadLn(n);

Writeln(’Введите первый массив’);

For i:= 1 to n Do

ReadLn (A[i]);

Writeln(’Введите второй массив’);

For i:= 1 to n Do

ReadLn (B[i]);

Suma:= SumMas(n,A);

Sumb:= SumMas(n,B);

Writeln(’Сумма чисел 1-го массива =’,Suma:8:2);

Writeln(’Сумма чисел 2-го массива =’,Sumb:8:2);

WriteLn(’Работа окончена. Нажмите клавишу ENTER’);

Readln;

End.

Пример 6.6 Составить программу вычисления n! С использованием функции.

Первый вариант задачи.

program factorial;

Описательная часть основной программы:

Var

n, k: integer;

function fac (k: integer): integer;

Описательная часть подпрограммы:

Var

P, i: integer

Begin

Исполнительная часть подпрограммы:

p:=1

for i:=1 to k do

p: = p*i;

fac: =p;

end;

Исполнительная часть основной программы:

Begin

write ('введите n');

readln (n);

for k: = 1 to n do

writeln (fac(k));

End.

n, k - глобальные переменные.

p, i - локальные переменные.

fac - имя "функции", возвращает результат в основную программу. Может в подпрограмме присутствовать в операторах присваивания только слева от знака "=".

Второй вариант задачи вычисления n!

program factorial;

Var

n: integer;

function fac (i: integer): integer;

Begin

if i=1 then fac: = 1

else fac: = i * fac(i-1);

end;

Begin

writeln ('введите n');

readln (n);

writeln ('n! = ', fac(n));

End.

Подпрограмма-функция многократно обращается сама к себе. Вычисление начинается с конца i = n и до i = 1.

Пример 6.7 Составить программу для вычисления определенного интеграла tk 2t I= S--------------- dt sqrt(1-sin2t) tnпо методу Симпсона. Вычисление подинтегральной функции реализовать с помощью функции, имя которой передается как параметр. Значение определенного интеграла по формуле Симпсона вычисляется по формуле:ISimps=2*h/3*(0.5*F(A)+2*F(A+h)+F(A+2*h)+2*F(A+3*h)+... +2*F(B-h)+0.5*F(B)) где A и B - нижняя и верхняя границы интервала интегрирования, N - число разбиений интервала интегрирования, h=(B-A)/N, причем N должно быть четным. Program INTEGRAL; type Func= function(x: Real): Real; var I,TN,TK:Real; N:Integer;{$F+} Function Q(t: Real): Real; begin Q:=2*t/Sqrt(1-Sin(2*t)); end;{$F-} Procedure Simps(F:Func; a,b:Real; N:Integer; var INT:Real); var sum, h: Real; j:Integer; begin if Odd(N) then N:=N+1; h:=(b-a)/N; sum:=0.5*(F(a)+F(b)); for j:=1 to N-1 do sum:=sum+(j mod 2+1)*F(a+j*h); INT:=2*h*sum/3 end; begin WriteLn(' ВВЕДИ TN,TK,N'); Read(TN,TK,N); Simps(Q,TN,TK,N,I); WriteLn('I=',I:8:3) end.

 



Поделиться:


Последнее изменение этой страницы: 2017-02-17; просмотров: 163; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.133.144.217 (0.399 с.)