Не люблю суеты. Ни на сцене, ни в жизни…
Лишние слова тоже не нужны.
(Майя Плисецкая)
Статья представляет собой свободный конспект урока для смешанного обучения по теме "Процедуры и функции языка 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