Процедуры и функции языка Pascal

Разделы: Информатика


Не люблю суеты. Ни на сцене, ни в жизни…
Лишние слова тоже не нужны.
(Майя Плисецкая)

Статья представляет собой свободный конспект урока для смешанного обучения по теме "Процедуры и функции языка Pascal" через призму олимпиадной подготовки. Основная идея данного урока в том, что он может проведен в разных возрастных группах, с разным уровнем начальной подготовки учащихся, формируя для них индивидуальные образовательные траектории, благодаря очень доступному объяснению материала и ранжированию задач. К уроку прилагается интерактивная презентация с тестом в формате SWF, разработанная в среде iSpring Suite. Формат теста для проверки знаний обучающихся позволяет легко размещать ресурс в сети Internet.

 Цель урока - Объяснить довольно сложную тему за короткое время настолько доступно и просто, чтобы дети с разноуровневой подготовкой в программировании смогли свободно и уверенно использовать данный материал в задачах различной сложности.

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

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

1. результат выполнения функции - одно значение, а процедуры - одно или несколько;

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

Пример стандартных математических функций, которые мы использовали в программах, решая математические задачи на вычисления (SIN,COS,SQR, SQRT )).

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

Теперь разберемся с параметрами.

1. Параметры формальные и фактические.

При описании процедуры указывается список формальных параметров. Каждый параметр является локальным по отношению к описываемой процедуре, к нему можно обращаться только в пределах данной процедуры (в нашем примере х, у, z — формальные параметры). Фактические параметры — это параметры, которые передаются процедуре при обращении к ней (а, b, с — фактические параметры). Число и тип формальных и фактических параметров должны совпадать с точностью до их следования.   В качестве формальных параметров могут быть только переменные с указанием типа, а в качестве фактических параметров могут быть константы, переменные, выражения без указания их типа.

2. Параметры-значения.

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

3. Параметры-переменные.

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

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

ЗАДАЧА: Во входном файле записано натуральное число не превышающее 10100. Требуется найти сумму цифр этого числа.

Входные данные: В единственной строке входного файла INPUT.TXT записано одно число.

Выходные данные: В файл OUTPUT. TXT выведите сумму цифр числа.

Пример: INPUT. TXT  1111111111, OUTPUT. TXT 10.

var x: char; res: integer; input, output: text;
begin
res:=0;
Assign(input,'input.txt');
Reset(input); Assign(output,'output.txt');
Rewrite(output);
while not EOF (input) do begin
Read(input,x); res:= res + (ord(x)-48);
end;
Write(output,res);
Close(input); Close(output);
end.

Суть решения в том, что наше длинное число нужно представить в виде строки,  либо считать из файла каждую цифру как символ. А дальше использовать функцию ORD.

Как мы видим, если из кода символа (который представляет цифру) просто вычесть код нуля (48), то мы получим нашу цифру, (т.е. символ "5" превращается в цифру 5), и числа остается только сложить! Всего лишь одна функция, а сколько пользы.

Вопросы теста для первичного закрепления материала: см. Приложение1.

В зависимости от того, насколько мы поняли тему, и каких результатов хотим достичь  на данном уроке, предлагается  самостоятельно оценить свой уровень знания программирования,  ответив на вопросы, которые помогут  выбрать уровень сложности задачи для самостоятельного решения:

1. Хочу отработать данную тему на очень простых задачах с целью лучше понять материал урока (задачи с одной звездочкой*)

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

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

В группах задачи также расположены с постепенным увеличением сложности, которое отмечено знаком (!).

КРАТКАЯ СПРАВКА ПО МАТЕМАТИКЕ ДЛЯ РЕШЕНИЯ ЗАДАЧ

1. Факториал

Произведение n первых натуральных чисел называется n-факториал и обозначается n!; По определению: .

Перестановки без поворений

Теорема: число способов расположить в ряд n различных объектов есть

2.

3.

4. Палиндром (число которое одинаково читается слева направо и справа налево):

  

ПРАКТИЧЕСКАЯ ЧАСТЬ

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

Задача1*!. Для делимости на 5 необходимо, чтобы последняя цифра числа была  0 или 5. Написать функцию проверки делимости числа n, вводимого с клавиатуры, на  5.

Фрагмент  решения

Function Div5(x : Integer ) : Boolean;
Begin
Div5 :=  (x  Mod 10 = 0) or (x Mod 10 = 5);
End;

Задача3*!!. (В качестве справочного материала можно раздать формулы для вычисления площадей фигур, если класс еще не проходил данную тему по математике)

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

var
choice: char;
a, x, y, z: real;
 function circle(d: real): real;
const pi = 3.14159;
begin
circle := pi * sqr(d) / 4.0;
end;
 function rectangle(a, b: real): real;
begin
rectangle := a * b
end;
 function triangle(a, b, c: real): real;
var x: real;
begin
x := (a + b + c) / 2;
triangle := sqrt(x * (x - a) * (x - b) * (x - c))
end;
 begin
repeat
read(choice);
case choice of
'c': begin
readln(x);
a := circle(x)
end;
'r': begin
readln(x, y);
a := rectangle(x, y)
end;
't': begin
readln(x, y, z);
a := triangle(x, y, z)
end
end;
writeln('Square: ', a:8:2);
until choice = 'q';
end.

Задача4**!. Дано n целых чисел. Подсчитать количество чисел, в записи которых нет цифры 8.

Program Task_6_22;
Const n=10;
Function Count(q : Integer) : Integer;
{Функция возвращает 1 , если в числе нет цифры 8, а в противном случае - 0 }
Var test : Boolean;
Begin
Count := 0; test := True;
While q>0 Do Begin;
test := (q Mod 10 <>8) And test;
q := q Div 10;
End;
If test Then Count :=1;
Function SearchNumb (q : Integer) : Integer ;
{Функция нахождения количества чисел , В записи которых нет цифры 8 };
Var x, s, i : Integer;
Begin
s := 0;
For i := 1 To q Do Begin
ReadLn (x);
Inc (s, Count (Abs (x)));
End;
SearchNumb := s;
End;
Begin
WriteLn{ ‘ Количество чисел без цифры 8 ’ ,   SearchNumb (n)};
End.

Задача 5**!!Среди трехзначных чисел найти такие, в которых сумма факториалов цифр равнялась бы самому числу.

program pr2;
var a,b,c,i,s1,s2,s3:integer;
procedure fak(x:integer; var s:integer);
var i:integer;
begin
s:=1;
for i:=1 to x do
s:=s*i;
end;
begin
for i:=100 to 999 do
begin
a:=i div 100; b:=(i-a*100) div 10; c:=i - a*100 - b*10;
fak (a,s1); fak (b,s2); fak (c,s3);
if s1+s2+s3=i then writeln (i);
end;
end.

Задача 6***!!.  Дана шахматная доска размером  n*n и n ладей. Определить количество способов расположения ладей на шахматной доске так, чтобы они не могли бить друг друга.

Примечание.   

Исследовать,  для каких значений  n работоспособны типы данных Integer, Word, LongInt.
Function Rook(n:Integer) : LongInt;
{Рекурсивный вариант функции нахождения факториала числа: n!=n*(n-1)*...*2*1.}

Begin;
If n<=1 Then Rook :=1
Else Rook := n*Rook(n-1);
End;                                                                                                                 

Задача7 ***!!. Введено число n, например 59. Оно не палиндром. “Перевернем” его, получим 95. Найдем сумму чисел 59 и 95 – 154. “Перевернем” это число – 451. Находим сумму – 605. Еще раз: 506 и  605. Получили палиндром – 1111. Найти для всех натуральных числе из интервалов от 50 до 80 количество шагов, необходимых для сведения их к палиндромам, с помощью описанной схемы.

Program Task_6_15;
Const a=50; b=80;
Var n, t: LongInt;
cnt, i : Integer;

Function Pal (n:Integer) : LongInt;
Var x : LongInt;
Begin
x:=0;
While n<>0 Do Begin
x :=x*10+n Mod 10;
n := n Div 10;
End;
Pal :=x;
End;
Begin {Основная программа }
For i := a To b Do Begin
cnt := 0; n := i;
While Pal(n)<>n Do Begin
t := Pal(n);
n := n+t;
Inc(cnt);
End;
WriteLn(i,'',cnt);
End;
End.

Задача 6**! Дано n целых чисел. Найти среди них число, у которого сумма цифр имеет максимальное значение.

Program Task_6_18;
Const n=10;
Function Count (q : Integer) : Integer; { Функция нахождения суммы цифр числа q }
Var sum : Integer;
Begin
sum :=  0;
While q>0 Do Begin
sum  :=  sum+q  Mod 10;
q := q Div 10 ;
End;
Count  :=  sum;
End;
Function Searchnumb (q : Integer)  :  Integer;
{Функция выбора числа с максимальной суммой цифр}
Var x , s, max, I : Integer;
Begin
max := -1;
For I :=  1 To q Do Begin
ReadLn (x) ;
S := Count (x) ;
If s > max Then Begin max := s;
Searchnumb := x; End;
End;
End;
Begin
whiteLn (‘Число с максимальной суммой цифр ‘ ,  SearchNumb (n) );
End.

P.S. Усложнять просто, сложно упрощать! «Закон Мейера».

Источники информации.

1. Сеть Internet.

2. Задачи по программированию. Авторы:С.М. Окулов, Е.В. Разова, М.А. Корчёмкин, Н.А. Бушмелева, Р.В. Шарыгин>,Т.В. Ашихмина

3. http://learnpascal.ru/vvedenie-v-paskal/procedure-and-function-pascal.html

4. http://abyssal-being.livejournal.com/73531.html

5. http://i3.pin-im.com/original/2015-06-08/pin-im.com-142797.jpg