Отправляет email-рассылки с помощью сервиса Sendsay

Олимпиады на Turbo Pascal'е

  Все выпуски  

Turbo Pascal для школьников Выпуск N22


Информационный Канал Subscribe.Ru


Turbo Pascal для школьников

Выпуск №22
Перейти в архив>>

   Доброго времени суток, уважаемые подписчики!!!
Сегодня, как и обещал, поговорим о создании функций.
И функция, и процедура - почти идентичные подпрограммы, которые, правда, имеют некоторые отличия. Основное из этих отличий Вы уже могли заметить при использовании стандартных процедур и функций. Приведу пример: Использование процедуры: inc(i); Использование функции: i:=pos('a',s); Если Вы ещё не поняли, то поясняю: функция возвращает какое-то значение - результат выполнения операции в какую-нибудь переменную, стоящую перед знаком присваивания. Процедура же просто выполняет свои операторы и прекращает что-либо делать. Тем не менее, и в процедуре, и в функции можно менять значения тех или иных переменных разными способами (их Вы уже знаете). Ну а теперь я на примере описания функции, которая высчитывает сумму двух чисел типа integer :) постараюсь объяснить как её описывать.
Итак:

function 
 sum (i, j:integer):longint;
begin
 sum:=i+j;
end; 
На самом деле пример может и не совсем удачный, но тем не менее, на нём можно показать основные отличия функции от процедуры. Начнём с заголовка: функция так же как и процедура должна иметь своё имя и, возможно, параметры. С параметрами тут то же самое, что и с параметрами процедуры. Далее - отличие: после двоеточия указывается тип, который должна иметь переменная, в которую возвращается результат работы функции. Далее всё как и при работе с процедурами, НО! в каждой функции должен быть оператор, присваивающий какое-то значение функции, которая указывается по имени без параметров (см. пример). Если этого не сделать, то функция не возвратит никакого значения переменной, стоящей перед знаком присваивания при вызове функции. Кстати, как вызывать функцию Вы уже наверное знаете: <имя переменной>:<имя функции (параметры - если есть)>;
Ну вот в принципе и всё с функциями.

   Опять же, как и обещал, приведу пример использования параметра-процедуры и параметра-функции при описании процедур и функций. Этот пример я взял из книги Епанешникова "Программирование в среде Turbo Pascal 7.0".
Итак, решение задачи, которая печатает таблицы сложения и умножения двух целых чисел в заданном диапазоне:

type
 Func=function (x,y:integer):integer;

functinon add (x,y:integer):integer;
begin 
 add:=x+y;
end;

function Multiply (x,y):integer;
begin
 Multiply:=x*y;
end;

procedure PrintTable (a,b:integer; Operation:func);
var
 i,j:integer;
begin
 for i:=1 to A do
  begin
   for j:=1 to b do
    write (operation(i,j):5);
  writeln;
 end;
writeln;
end;

begin
PrintTable (10,10,add);
PrintTable (10,10,multiply);
end.
На самом деле - это не так сложно, как кажется с первого взгляда. Попробуйте придумать своё применение данной возможности Паскаля.
Говоритя об процедурах и функцих нельзя не упоминуть такое понятие, как рекурсия. Рекурсия - это вызыв внутри подпрограммы самой себя (рекурсивный вызов). Это возможность осуществляется за счёт того, что при новом вызове подрограммы новые параметры добавляются в память, при этом вызывающая подпрограмма свои значения не потеряет. После того, как вызываемая подпрограмма отработает, продолжит свою работу процедура или функция, вызвавшая её. Приведу пример рекурсии на простом примере - вычислении факториала. Напомню, что факториал - это произведение всех чисел начиная с 1 до n-1 на число n и обозначается как n! . Итак, функция, которая будет высчитывать факториал числа может выглядет следующим образом:
function factorial (n:byte):longint;
begin
if n=1 then factorial:=1 else 
 factorial:=n*factorial(n-1);
end;
Попробуйте разобраться сами с этим простым примером. В следующем выпуске я дам турнирную задачу, которая решается с применение рекурсии.

   Ну а теперь о нашем турнире:
Лидеры нашей турнирной таблицы:
1 место - Strory - 136 очков - 8 задач;
2 место - GriFe - 81 очко - 6 задач;
3 место - Cemist - 58 очков - 4 задачи.
Ну и напоследок, новая парочка задач:
Задача №1. Путник

    Путник двигается по лабиринту, делая петил. Путь записывается последовательностю шагов 'NENNESE': N - север, S - юг, E - восток, W - запад. У лабиринта один вход и выход. По смвольной (литерной) строке найти наиболее короткий путь к выходу из лабиринта.
    Примечание. Убрать все петли.
    Формат входных файлов<
      Файл input.txt содержи путь - набор симоволов в верхнем регистре.
      Файл output.txt содержит тот же путь, но с удалёнными петлями.
    Пример:
      input.txt
      NESWWNNEEESSSSEEEE
      output.txt
      WNNEEESSSSEEEE
Задача №2. Основание
    Задано десятичное число (x) и его запись (y) в другой системе счисления (p<9). Определить эту систему счисления (p).
    Формат входных данных
      Файл input.txt содержит число x и на следующей строке - y.
      Файл output.txt содержит единственное число - P.
    Пример:
      input.txt
      15
      1111
      output.txt
      2
На этом сегодня всё. Желаю Удачи!!!

На сегодня это всё. Пожелания и предложения пишите мне на e-mail: qsman1987@mail.ru

Рассылки Subscribe.Ru
Turbo Pascal для школьников    
   Рассылка 'Turbo Pascal для школьников'


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное