function Summa (var x: array of real): real;

var i: integer;

s: real;

begin

s:=0;

for i:=1 to high(x) do s:=s+x[i];

summa:=s;

end;

5.9 Рекурсия в подпрограммах

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

Многие математические алгоритмы имеют рекурсивную природу, поэтому рекурсия широко используется в программировании. В качестве примера приведем известный алгоритм вычисления факториала неотрицательного целого числа:

(0!=1)

1!=1

N!=1*2*3*…*(N-1)*N

алгоритм основан на соотношении N!=(N-1)!*N

Пример:

function fact(N: word): longint;

begin

if (n=0) or (n=1) then fact:=1

else fact:=n*fact(n-1);

end;

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

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

Схема вызовов при вычислении 5!:

fact(5); 1*2*3*4*5

fact(4); 1*2*3*4

fact(3); 1*2*3

fact(2); 1*2

fact(1); 1

Задачи для самоконтроля

5.1 Определите значение переменных a, b после выполнения следующих программ:

а)

var a, b: integer;

procedure proc(x: integer; y: integer);

begin

y:= y+2; x:= x+2;

~

 
end;

begin

a:=15; b:=15;

proc(a, b);

writeln(‘a = ’,a,’ b= ‘,b);

end.

б)

var a, b: integer;

procedure proc(x: integer; var y: integer);

begin

y:= y+2; x:= x+2;

~

 
end;

begin

a:=15; b:=15;

proc(a, b);

writeln(‘a = ’,a,’ b= ‘,b);

end.

в)

var a, b: integer;

procedure proc(var x: integer; y: integer);

begin

y:= y+2; x:= x+2;

~

 
end;

begin

a:=15; b:=15;

proc(a, b);

writeln(‘a = ’,a,’ b= ‘,b);

end.

г)

var a, b: integer;

procedure proc(x: integer; var y: integer);

begin

y:= y+2; x:= x+2;

~

 
end;

begin

a:=15; b:=15;

proc(a, b);

writeln(‘a = ’,a,’ b= ‘,b);

end.

6. Строковый тип данных

НЕ нашли? Не то? Что вы ищете?

6.1 Описание строк

Строка – это последовательность символов произвольной длины (до 255 символов). Строку можно рассматривать, как массив символов переменной длины. Максимальное количество символов в строке указывается при ее описании в квадратных скобках:

var str1: string[80];

str2: string;

Если в квадратных скобках не указан максимальный размер строки, то он считается равным 255.

Строка может быть описана как типизированная константа:

const str10: string[10]=’январь’;

В памяти для строки длины N отводится N+1 байт, пронумерованных от 0 до N. В нулевом байте хранится текущее значение длины строки.

… 10

6

я

н

в

а

р

ь

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

l:=ord(str10[0]);

writeln(l);

Допустимо обращение к отдельным символам строки:

var s: string;

begin

s:=’стол’;

writeln(s); стол

s[3]:=’у’;

writeln(s); стул

end.

6.2 Операции со строками

Сцепление строк (конкатенация) «+»

Эта операция добавляет к первой строке вторую.

Пример 1:

var st1, st2, st3: string[20];

begin

st1:=’Турбо’;

st2:=’Паскаль’;

st3:=st1+’ ’+st2;

writeln(st3); Турбо Паскаль

end.

Пример 2:

var st1, st2: string[7];

begin

st1:=’student’; student

st2:=’123’; 123

st1:=st2+st1; 123stud

end.

Сравнение строк (>, <, >=, <=, =, <>)

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

‘abc’=’abc’ ‘Abc’<’abc’

‘ab’<’abc’ ‘Abc’<’1ab’

‘ABC’<’ab’

6.3 Процедуры и функции для работы со строками

length (s: string): integer; - функция возвращает текущий размер строки (т. е. количество символов в строке; пробел тоже считается символом).

var n: integer;

str: string[15];

begin

str:=’Turbo Pascal’;

n:=length(str);

write(‘n=’,n); n=12

end.

copy (s: string; n1, n2: integer): string; - функция копирует из сроки S n2 символов, начиная с символа n1.

st1:=’abcdef’;

st2:=copy(st1,2,3); bcd

delete (var s: string; n1, n2: integer); - процедура удаляет из строки S n2 символов, начиная с символа n1.

st1:=’abcdef’;

delete(st1,1,3); def

insert (s1: string; var s2: string; n1: integer); - процедура вставляет строку s1 в строку s2, начиная с символа n1.

st1:=’abcdef’;

insert(‘++’,st1,4); abc++def

pos (s1,s2: string): byte; - функция возвращает номер позиции первого вхождения строки s1 в строку s2. Если строка s1 не входит в строку s2, то возвращает 0.

st:=’abcdef’;

n:=pos(‘d’,st); n=4

k:=pos(‘dc’,st); k=0

str (x[:M[:N]]; var s: string); - процедура преобразует число х в строку символов S; M, N – необязательные форматы вывода числа, аналогичные write.

var x: real;

n: integer;

st: string;

begin

x:=3.141592;

n:=5;

str(x, st); st=’3.141592’;

str(n, st); st=’5’;

str(x:4:2,st); st=’3.14’;

end.

val (s: string; var x, cod: integer); - процедура преобразует строку s в целое или вещественное число х. Если преобразование прошло успешно, то cod=0, иначе cod=номер символа, вызвавшего ошибку.

var x: real;

n, cod: integer;

st: string;

begin

st:=’3.14’;

val(st, x,cod); cod=0

val(st, n,cod); cod=2

end.

upcase (c: char): char; - функция преобразует строчную латинскую букву в заглавную

1) var st: string;

begin

st:=’a bc’;

st[3]:= upcase(st[3]);

write(st); a Bc

end.

2) repeat

write(‘Завершить? (Y/N)’);

readln(c);

until (upcase(c)=’Y’);

Пример 1: Удалить из строки все точки.

var st: string;

n: integer;

begin

write(‘введите строку’);

readln(st);

repeat

n:=pos(‘.’,st);

delete(st, n,1);

until n=0;

writeln(st);

end.

Пример 2: Удалить из строки все цифры.

var st: string;

n: integer;

c: char;

begin

write(‘введите строку’);

readln(st);

for c:=’0’ to ‘9’ do

repeat

n:=pos(c, st);

delete(st, n,1);

until n=0;

writeln(st);

end.

Пример 3: Поменять в строке порядок символов на обратный (abcd на dcba).

var st: string;

n: integer;

c: char;

begin

write(‘введите строку’);

readln(st);

for i:=1 to length(st) div 2 do

begin

c:=st[i];

st[i]:=st[length(st)-i+1];

st[length(st)-i+1]:=c;

end;

writeln(st);

end.

Задачи для самоконтроля

6.1 Определите значение переменной n после выполнения следующей программы:

var n: integer;

str: string[25];

begin

str:=Лев Толстой’;

n:=length(str);

write(‘n=’,n);

end.

6.2 Определите значение переменной st2 после выполнения следующих фрагментов программ:

а) st1:=’abc def’;

st2:=copy(st1,5,2);

б) st2:=’abcdef’;

delete(st2,3,2);

в) st2:=’abcd’;

insert(‘***’,st2,2);

7. Стандартные модули Турбо-Паскаля

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

В составе Турбо-Паскаль 6.0 имеются 8 стандартных модулей:

-  system

-  dos

-  crt

-  printer

-  overlay

-  graph

-  Турбо3

-  graph3

strings модули Турбо-Паскаль 7.0. используются для совместимости с другими

-  windows языками и средой Windows

Для использования процедур или функций данного модуля необходимо подключить его с помощью оператора

uses имя модуля1 [, имя модуля2, …];

Модуль system подключается автоматически.

7.1 Модули ТУРБО3 и GRAPH3

Обеспечивают совместимость с программами, разработанными ранее для ТР 3.0

7.2 Модуль OVERLAY

Предоставляет средства для разработки оверлейных программ (размер которых превышает объем доступной оперативной памяти, и которые загружаются в память по частям)

7.3 Модуль DOS

Содержит средства доступа к операционной системе DOS (процедуры и функции для работы с дисками, файлами, системной датой, временем).

7.4 Модуль SYSTEM

Содержит процедуры и функции стандартного Паскаля и некоторые другие основные процедуры и функции.

inc (x[,n]) – увеличение значения переменной x на n единиц (инкремент).

dec (x[,n]) – уменьшение значения переменной x на n единиц (декремент).

Пример:

x:=x+1; inc(x);

x:=x+5; inc(x,5);

y:=y-1; dec(y);

y:=y-6; dec(y,6);

high(x) – получение максимального значения величины х; если х – массив, то максимального значения индекса.

Пример:

var y: word;

writeln(high(y)); 65535

low(x) – получение минимального значения величины х; если х – массив, то минимального значения индекса.

Пример:

var y: integer;

writeln(low(y)); -32768

exit – немедленный выход из подпрограммы.

halt – прекращение выполнения программы и передача управления операционной системе.

Пример:

writeln(‘Введите x>0’);

readln(x);

if x<=0 then halt;

7.5 Модуль PRINTER

Делает доступным вывод результатов работы программы на печатающее устройство, связывая стандартную переменную LST с принтером.

Пример:

uses printer;

var a: integer;

begin

a:=20;

writeln(lst,’a=’,a); {вывод на принтер a=20}

end.

7.6 Модуль CRT

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

При работе в текстовом режиме весь экран разбивается на позиции (25 строк по 80 позиций в каждой). Для каждой позиции можно задать цвет фона и цвет символа, символ можно сделать мерцающим.

Координаты 1 позиции (верхний левый угол) – (1,1), последней позиции (нижний правый угол) – (80,25).

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

Процедуры и функции модуля CRT (управление звуком и клавиатурой)

keypressed: boolean; - возвращает true, если была нажата любая клавиша (кроме ^, shift, alt…) и false в противном случае. Не останавливает программу в ожидании нажатия клавиши, поэтому можно repeat…until keypressed; (вместо readln;)

readkey: char; - считывает символ нажатой клавиши (без отображения на экране). Приостанавливает выполнение программы до нажатия любой клавиши, кроме служебных (ctrl, alt, shift…)

if keypressed then ch:=readkey:

Код обычных клавиш (цифры, алфавит) хранится в 1 байте, коды функциональных клавиш (F1…F12) – в двух байтах: первый = 0, второй – код клавиши. Поэтому, чтобы считать код функциональной клавиши, надо 2 раза вызвать функцию readkey: при первом вызове она считает 0, при втором – непосредственно код клавиши.

Пример:

uses Crt;

var ch:char;

begin

writeln(‘Нажмите клавишу’);

ch:=readkey;

if ch<>#0 then writeln(‘Клавиша ’, ch)

else begin

ch:=readkey;

writeln(‘функциональная клавиша ’, ord(ch));

end;

end.

delay (t); - приостанавливает работу программы на время t (милисекунд).

sound (f); - включает звук заданной частоты (в Гц).

nosound; - выключает звук

Пример:

sound(440); delay(500); nosound;

Пример: Имитация музыкального инструмента.

uses crt;

const m: array [1..8] of integer = (262,294,330,350,392,440,494,523);

var i: integer;

ch: char;

begin

writeln(‘Играйте на клавишах 1-8; 0 - выход’);

while true do

begin

ch:=readkey;

case ch of

#49: i:=1;

#50: i:=2;

#56: i:=8;

#48: halt;

end;

sound(m[i]);

delay(1000);

nosound;

end;

end.

Константы модуля CRT (коды цветов и режимов)

Коды режимов: Коды цветов:

Имя

Значение

Назначение

BW40

0

25x40 черно-белый

CO40

1

25x40 цветной

BW80

2

25x80 черно-белый

CO80

3

25x80 цветной

Font8x8

256

50x80цветной(EGA/VGA)

Mono

7

25x80 для ч/б адаптера

Имя

Значение

Цвет

Black

0

черный

Blue

1

синий

Green

2

зеленый

Cyan

3

голубой

Red

4

красный

Magenta

5

фиолетовый

Brown

6

коричневый

LightGrey

7

светло-серый

DarkGrey

8

темно-серый

Lightblue

9

светло-синий

Lightgreen

10

светло-зеленый

Lightcyan

11

светло-голубой

Lightred

12

розовый

Lightmagenta

13

светло-фиолетовый

Yellow

14

желтый

White

15

белый

Blink

128

мерцание символа

Процедуры и функции управления экраном

clrscr; - очистка активного окна и перевод курсора в верхний левый угол.

clreol; - очистка строки активного окна от текущей позиции курсора до конца строки.

insline; - вставляет новую пустую строку в позицию курсора, заполняет ее цветом фона.

delline; - удаляет строку, на которой стоит курсор. Остальные строки сдвигаются (↑ или ↓).

highvideo; - переход к более яркому цвету символов (0→8, 1→9,…, 7→15).

lowvideo; - переход к менее яркому цвету символов (8→0, 9→1,…, 15→7).

normvideo; - переход к стандартному цвету символов (7)

textmode (m); - установка текстового режима. По умолчанию - СО80.

textbackground (col); - установка цвета фона (col = 0-7).

textcolor (col); - установка цвета символов (col = 0-15).

window (x1,y1,x2,y2); - определяет текстовое окно на экране.

gotoxy (x,y); - переводит курсор в заданную позицию окна. (х, у) – координаты нового положения курсора.

whereX: byte; - возвращает координату х текущей позиции курсора.

whereY: byte; - возвращает координату у текущей позиции курсора.

Пример 1: Сформировать на экране текстовое окно другого цвета и напечатать в середине окна приветствие.

uses crt;

begin

textmode(3);

textbackground(2);

clrscr;

textcolor(14);

window(20,10,60,15);

textbackground(6);

clrscr;

gotoxy(15,3);

writeln(‘Hello’);

delay(1000);

textmode(3);

end.

Пример 2: Программа выводит на экран последовательность цифр 0..9, стрелками ← → выбирает и подсвечивает любую цифру.

25

13

0

9

uses crt;

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6