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;
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;
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;
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;
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 |


