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

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

  Все выпуски  

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


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


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

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

   Доброго времени суток, уважаемые подписчики!
Итак, Вы уже почти полностью освоили язык программирования Turbo Pascal. Остались только подпрограммы пользователя и работа с графикой. Всё!!! Сегодня мы поговорим о подпрограмма, написанных самим программистом.
Итак, приступим. Очень часто приходится делать одни и те же операции, например, вывод элементов массива. Если у Вас в программе используется эта операция несколько раз, то Вам лучше оформить её ввиде подпрограммы процедуры. Что такое процедура? Процедура - это маленькая подпрограммка, описанная в разделе описания процедур и функций, имеющая своё собственное имя и вызываемая при помощи указания имени и параметров. Этих самых параметров может и не быть, так что сначала мы поговорим об описании процедуры без параметров. Например, нужно нам будет в программе каким-то хитрым образом обрабатывать массив (причём, к примеру, 3 раза) и каждый раз выводить наш измененный массив. Тогда мы оформляем этот вывод в процедуру, которую лично я написал бы следующим образом:

    procedure vivod;
    var
      i:integer;
    begin
      for i:=1 to n do write (a[i],' ');
    end;
Теперь, чтобы вывести наш одномерный массив, нам достаточно в программе просто написать vivid; Теперь разберем нашу процедуру: начинаться она должна обязательно со слова procedure, чтобы компилятор знал, что дальше идёт подпрограмма процедура и имени процедуры (что нам нужно набирать, чтобы вызывать к исполнению процедуры). Далее идёт обычная маленькая программка, которая может иметь свой var, другие разделы, ну и конечно - само тело процедуры, заключенное в операторные скобки begin .. end;
Остановимся подробней на разделе описания переменных. Если тут Вы опишите переменную, имя которой уже существует (описанно в основной программе), а так можно, то у Вас эта переменная как бы перекроет глобальную, описанную в самой программе и обращаясь к этой переменной, например, i, Вы будете изменять значение переменной, которая создается при вызове процедуры и удаляется из памяти при отработке процедуры. Поэтому разделяют глобальные и локальные переменные. Глобальные, описанные в основной программе, их можно использовать в самой программе и во всех подпрограммах: локальные - описанные в какой-либо подпрограмме и действительны лишь в пределах этой подпрограммы.
Теперь рассмотрим случай, когда мы одновременно будем работать над массивом a и массивом b. Ну не создавать же нам ещё одну процедуру только ради вывода массива b! Для того, чтобы сделать написание процедур и функций менее строгим, более используемым, вводят параметры, которые описываются в заголовке процедуры и передаются ей при вызове. Модификация нашей процедуры будет выглядеть слудующим образом:
    procedure vivod (c:mas);
    var
      i:integer;
    begin
      for i:=1 to n do write (c[i],' ');
    end;
Здесь mas - тип пользователя, объявленный в разделе описания типов type как array [1..100] of integer; Чтобы вызвать эту процедуру и чтобы она вывела на экран элементы массива b достаточно написать следующее:
    vivod (b);
И всё. На параметрах мы остановимся подробнее. Вообще параметров может быть несколько, так же разным может быть и тип параметров. В нашёй процедуре vivod (второй вариант) в качестве параметра выступает переменная типа массив. Когда мы вызываем на выполнение процедуру, происходит копирование данной переменной и если мы в самой процедуре попытаемся изменить переменную c, то это изменение никак не повлияет на значение элементов переменной b. Чтобы получить возможность менять значение параметров, необходимо их перечислить после слова var, тогда переменные копироваться не будут и подпрограмма получит адрес оригинала переменной. Например:
    procedure vivod (var c:mas);
С этим нужно быть поаккуратней, чтобы нечаяно не менять значение переменной. Те параметры, которые перечисляются без слова var называются параметры-значения (процедруа получает только значение переменной), а те, которые после слова var - параметры переменные (процедура получает в качестве параметра саму переменную с возможностью изменения её значения).
Так же в качестве параметров могут передаваться и параметры-процедуры и параметры-функции. В качестве параметра в этом случае используется соответствующая процедура или функция, имеющая необходимое количество параметров требуемых типов. Надеюсь, что в этом материале для Вас не было ничего сложного. Теперь Вы научились писать процедуры. Вы уже пользовались процедурами, но написанными другими людьми (тот же write). Все эти процедуры (стандартные) хранятся в автоматически подключаемом модуле System. В следующем выпуске мы научимся писать свои функции и рассмотрим пример использования параметров-процедур и параметров-функций.

   Теперь поговорим о нашем турнире.
В прошлый раз я предложил Вам 2 задачи, одна из которых наиболее интересна. Я имею ввиду задачу про Деда Мазая. В этой задаче не надо было загонять какие-нибудь циклы, рекурсии и т. д., тут было достаточно на простых примерах проследить одну закономерность. Итак, эту "простую игру" выигрывает второй игрок, если кол-во морковок делится на 3 без остатка, иначе, чтобы выиграть первому игроку, ему достаточно взять в самом начале такое кол-во морковок, которое равно остатку от деления кол-ва всех морковок на 3. Вот такая вот закономерность.
Другая задача элементарна и с ней большинство справилось. Единственно, в чём была проблема у многих - это путанница, связанная с шириной и длиной минного поля. Внимательно читайте условие задачи!
Ну а теперь пара новых условий задач:
Задача №1. "Интервалы"

    Даны действительные числа a(1), ...,a(n), n -чётное. Эти числа определяют n/2 интервалов числовой оси: (a(1),a(2)),(a(3),a(4)), ..., (a(n-1),a(n)). Составьте программу для выяснения:
      a) имеют ли все данные интервалы общий подинтервал? Если да, то указать концы этого интервала;
      b) является ли интервалом объединение данных интервалов? Если да, то указать концы этого интервала.
    Технические требования
      Входной файл input.txt содержит в первой строке число n, во второй строке - последовательность действительных чисел.
      В выходном файле output.txt должны содержаться:
        - в певрой строке - пара чисел или слово "нет";
        - во второй строке - пара чисел или слово "нет".
    Пример файлов входных и выходных данных:
      input.txt
      6
      1 7.5 2 4.5 5 10
      output.txt
      нет
      1 10
Задача №2. "137"
    В множестве, состоящем из натуральных чисел, в десятичной записи которых встречаются только цифры 1, 3, 7, все элементы занумерованы в порядке возрастания. По заданному n определить n-й элемент этого множества.
    Технические требования:
      Входной файл input.txt содержит в первой строке число n.
      В выходном файле output.txt должно содеражаться n-е число множества.
    Пример файлов входных и выходных данных:
      input.txt
      4
      output.txt
      11
Уважаемые подписчики, если у Вас есть олимпиадные задачи, пришлите мне их пожалуйста, а то мне скоро нечего будет публиковать!!! Желательно с тестами и комментариями, на а если ни того, ни того нет, то можно просто условие. Буду очень благодарен.
Ну и теперь, как всегда, лидеры нашего турнира:
1 место - Strory - 96 баллов - 6 задач;
2 место - Grife - 81 балл - 6 задач;
3 место - Nkey - 46 баллов - 5 задач. Ну вот и всё. Жду Ваших задач и решений.

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

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


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

В избранное