Функция, определенная пользователем, состоит из заголовка и тела функции. Заголовок содержит зарезервированное слово function, идентификатор (имя) функции, заключенный в круглые скобки, необязательный список формальных параметров и тип возвращаемого функцией значения. Тело функции представляет собой локальный блок, по структуре аналогичный программе:
function <имя>(Формальные параметры): <тип результата>;
const …;
type …;
var . . . ;
begin
<операторы>
end;
В разделе операторов должен находиться, по крайней мере, один оператор, присваивающий имени функции значение. В точку вызова возвращается результат последнего присваивания.
Задачи
1. Даны фамилия, имя, отчество. Вывести на экран инициалы.
program zadacha_1;
uses crt;
var
s: string;
procedure fio(s1: string);
var
i: integer;
l: integer;
st: string;
begin
l:=length(s1);
i:=1;
st:=s1[1]+'. ';
for i:=1 to l do
begin
if s1[i]=' ' then
begin
st:=st+s1[i+1]+'. ';
end;
end;
writeln ('Новая строка');
writeln (st);
readln;
end;
begin
clrscr;
writeln ('Введите фио');
readln (s);
fio (s);
end.
2. Выяснить сколько раз встречается каждая буква алфавита в строке.
program zadacha_2;
uses crt;
var
st: string [100];
procedure alphavit (st: string);
var
s: string;
k, i,l,j,n: integer;
begin
s: ='абвгдеёжзиклмнопрстуфхцчшщьыъэюя';
l: =length(s);
n: =length (st);
for i: =1 to l do
begin
k: =0;
for j: =1 to n do
begin
if s[i] = st[j] then
begin
k:=k+1;
end;
end;
if k>0 then
begin
writeln('Буква ',s[i],' встречается в предложении ',k,'раз');
4. Составить процедуру для нахождения суммы элементов некоторого столбца двумерного массива.
program zadacha_6;
uses crt;
var
m,n: integer;
procedure sum (l,k:integer);
var
a: array [1..30,1..30] of integer;
s,i,j: integer;
begin
for i:=1 to l do
for j:=1 to k do
begin
write('a(',i,',',j,')=');
readln (a[i,j]);
end;
s:=0;
for i:=1 to l do
begin
s:=s+a[i,2];
end;
write('сумма элементов второго столбца равна',s);
readln;
end;
begin
clrscr;
writeln ('Введите количество строк ');
readln (m);
writeln ('Введите количество столбцов ');
readln (n);
sum(m,n);
end.
5. Составить программу для проверки, является ли счастливым троллейбусный биле, т.е. сумма первых трех цифр билета равна сумме трех последних цифр билета.
program zadacha_7;
uses crt;
var
x: longint;
procedure stast (y: longint);
var
a,b,c,d,e,f,s1,s2:integer;
begin
y:=abs(y);
a:=y div 100000;
b:=y div 10000 mod 10;
c:=y div 1000 mod 10;
d:=y div 100 mod 10;
e:=y div 10 mod 10;
f:=y mod 10;
s1:=a+b+c;
s2:=d+e+f;
if s1=s2 then
writeln('Билет счастливый')
else
writeln('Билет не счастливый');
readln;
end;
begin
clrscr;
writeln('Введите шестизначный номер троллейбусного билета ');
readln(x);
stast(x);
end.
6. Дан одномерный массив A[N]. Найти max (a2, a4,….,a2k) + min(a1,a3,…,a2k+1).
program zadacha_8;
UsesCRT
Var
y:integer;
procedure sum(n:integer);
var
a:array[1..30] of integer;
i,min,max:integer;
s:integer;
begin
for i:=1 to n do
begin
write('a[',i,']=');
readln(a[i]);
end;
max:=a[2];
min:=a[1];
for i:=1 to n do
begin
if (a[i] mod 2=0) and (a[i]>max) then
begin
max:=a[i];
end;
if (i mod 2>0) and (a[i]< min) then
begin
min:=a[i];
end;
end;
s:=min+max;
writeln('s=',s);
readln;
end;
begin
clrscr;
writeln('введите количество элементов');
readln(y);
sum(y);
end.
7. Описать процедуру, которая находит все натуральные числа, не превосходящие заданного числа a, которые делятся на каждую из своих чисел
program zadacha_9;
uses crt;
var
m:integer;
procedure nat (var a: integer);
label l,q,w;
var
i,x,n,b:integer;
begin
for i:=1 to a do
begin
q: b:=i;
if i>a then
begin
goto w;
end
else
n:=i;
l: x:=n mod 10;
if x=0 then
begin
i:=i+1; goto q;
end
else
if b mod x=0 then
begin
if n=x then
begin
writeln (b);
readln;
i:=i+1; goto q;
end
else
n:=n div 10; goto l;
end
else
n:=n+1;
end;
readln;
w: end;
begin
clrscr;
writeln ('m=');
readln (m);
nat(m);
end.
8. Дана последовательность чисел 1, 2, 3…n (n не больше 100). Среди них найти автоморфное число (число и последние цифры его квадрата равны). Например: 5 и 25, 25 и 625.
15. В последовательности чисел определить четные. Использовать функцию, определяющую четное число или нет.
program zadacha_13;
uses crt;
var
a: array [1..100] of integer;
n,i,z: integer;
function chot(m: integer):integer;
var
x: integer;
begin
if m mod 2=0 then
begin
writeln ('Число ',m,' чётное');
end;
end;
begin
clrscr;
write ('введите количество чисел в последовательности');
readln (n);
for i:=1 to n do
begin
write ('a[',i,']=');
readln (a[i]);
end;
for i:=1 to n do
begin
z:=chot(a[i]);
end;
readln;
end.
Контрольные вопросы:
1. Что такое процедура?
2. Чем отличаются процедуры без параметров от процедур с параметрами?
3. Что такое глобальные и локальные данные? Чем они отличаются?
4. Что такое параметр? Какие бывают параметры?
5. Как устанавливается связь между аргументами и параметрами?
6. Могут ли быть процедуры вложенными? Приведите примеры.
7. Как передать массив в процедуру с помощью метода аргумент-параметр?
8. Объясните разницу в передаче массива в качестве параметра:
const nn=100;
type mas=array[1..nn]of real;
var a:mas;
procedure p1(const b:mas);
begin {тело процедуры} end;
procedure p2(b:mas);
begin {тело процедуры} end;
procedure p3(var b:mas);
begin {тело процедуры} end;
procedure p4(b:array of real);
begin {тело процедуры} end;
begin {ввод массива а}
p1(a); {1}
p2(a); {2}
p3(a); {3}
p4(a); {4}
end.
Укажите, в какой точке - первой, второй или третьей - массив может изменить своё значение.
9. Установите, что будет напечатано в результате работы первого и второго варианта программы. Сравните результаты, сделайте выводы:
program FirstVariant; program SecondVariant;
var x:real; var x:real;
procedure writeX; procedure writeX;
var x:real;
begin write(x) end; begin write(x) end;
begin x:=pi; begin x:=pi;
writeX; writeX;
end. end.
10. Установите, вычисляют ли приведенные ниже процедуры одно и то же значение? Объясните своё решение. Посмотрите, как изменяются описания переменных p и q.
1) var n,m:integer; {исходные целые числа}
c:integer; {число сочетаний из n по m}
fn,fm,fnm:integer; {переменные для хранения n!, m! и (n-m)!}
p:integer; {хранит факториал}
q:integer; {исходное число для вычисления факториала}
procedure fact1;
var i:integer;
begin p:=1; for i:=1 to q do p:=p*i end;
begin write('Введите n и m ');
readln(n,m);
q:=n; fact1; fn:=p;
q:=m; fact1; fm:=q;
q:=n-m; fact1; fnm:=p;
write('число сочетаний = ',fn div (fm*fnm))
end.
2) var n,m:integer; {исходные целые числа}
c:integer; {число сочетаний из n по m}
fn,fm,fnm:integer; {переменные для хранения n!, m! и (n-m)!}
procedure fact2(q:integer;var p:integer);
var i:integer;
begin p:=1; for i:=1 to q do p:=p*i end;
begin write('Введите n и m ');
readln(n,m);
fact2(n,fn);
fact2(m,fm);
fact2(n-m,fnm);
write('число сочетаний = ',fn div (fm*fnm))
end.
11. Определите результат выполнения программы:
procedure XX(n : word);
begin write(n:4);
if n<150 then XX(2*n);
write(n:4)
end;
begin XX(1);
writeln;
write('Нажмите <Enter>');
readln;
end.
12. Что такое описание процедуры или функции и чем они отличается от оператора процедуры или указателя функции? Могут ли быть процедуры и функции вложенными? Приведите примеры
13. Напишите функцию без параметров и функцию с параметрами, которая находит номер максимального элемента последовательности, заданной формулой общего члена: ai=F(i,x). Вычисление очередного элемента последовательности оформите в виде функции.
14. Найдите все ошибки в следующем фрагменте программы:
type M = set of char;
function f(a,b : M; x:char):M;
begin if a*b<0
then a:=[x]
else if a<b
then a:=b+x
else if ord(x) in a-b
then a:=a-[x..'<='];
f:=a+b
end.
15. Укажите правильные описания функций для вычисления факториала:
1) function f(n:integer):integer;
begin f:=n*f(f(n-1) end;
2) function f(n:integer):integer;
begin if n=0 then f:=1 elsee f:=f(n+1)/(n+1) end;
3) function f(var n:integer):integer;
begin if n=0 then f:=1 else f:=f(n-1)*n end;
4) function f(n:integer):integer;
begin if n=0 then f:=1 else f:=n*(n-1)*f(n-2) end;
5) function f(n:integer):integer;
begin if n<=1 then f:=1 else f:=n*(n-1)*f(n-2) end;
6) function f(n:integer):integer;
begin if n=0 then f:=1 else f:=n*f(n-1) end.
16. Рассмотрите следующее описание функции:
function f(x,y:real):real;
begin if x>=y
then f:=(x+y)/2
else f:=f(f(x+2,y-1),f(x+1,y-2))
end.
Определите f(1,10). Каким более простым способом можно представить и вычислить f(a,b)?
17. Что будет напечатано после выполнения программы:
var a:integer;
function f(var x:integer):integer;
begin f:=x; x:=0 end;
begin a:=1;
writeln(f(a)-f(a)) end.
18. Напишите процедуру без параметров, процедуру с параметрами и функцию, которые находят номер максимального элемента последовательности, заданной формулой общего члена: ai=F(i,x). Вычисление очередного элемента последовательности оформите в виде функции.