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

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

  Все выпуски  

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


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


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

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

   Доброго времени суток, уважаемые подписчики!!!
Сегодняшний выпуск рассылки я хотел бы посвятить "тонкостям" работы с файлами, а точнее, некоторым полезным процедурам и функциям, используемым при работе с текстовыми, типизированными и нетипизированными файлами. В прошлом же выпуске мы рассматривали стандартные подпрограммы, которые употребляются для всех типов файлов.
Итак, начнём с текстовых файлов:

    settextbuf (f, buf[, size]) - назначение буфера ввода-вывода
    При открытии файла ему присваивается буфер, посредством которого происходит запись в файл и чтение их него. Данной процедурой можно назначить файлу буфер - массив buf.

    flush(f) - процедура освобождения буфера выходного файла.
    Информация из буфера, с которым связана файловая переменная f записывается в файл.

    EOLN (f) Функция принимает значение True, когда достигнут конец строки при чтении файла f

    SeekEof (f) - функция принимает значение True, когда достигнут конец файла (символы пробел и табуляции не учитываются. Именно этим и отличается от Eof(f)).

    SeekEoln (f) - функция, которая также как и Eoln (f) принимает значение True, когда достигнут конец строки текстового файла. Отличается от Eoln (f) также как и SeekEof(f) от Eof(f), т. е. символ пробел и символ табуляции не учитываются. Это значит, что если в строке ещё остался символ пробел, то Seekeoln (f)=true, а Eoln(f)=False.
Теперь переходим к типизированным файлам.
Как уже говорилось в предыдущих выпусках, работая с файлами данного вида мы работаем с компонентами определенного типа. Для облегчения работы с компонентами существуют следующие подпрограммы:
    Seek (f, num) - процедура перехода на компоненту с номером num+1. Данная процедура позволяет перейти на нужную нам копмоненту (по номеру). В файле компоненты нумеруются с нуля, поэтому чтобы перейти на пятую компоненту, переменная num должен быть равна четырём.

    Truncate (f) - процедура удаления части файла, начиная с текущей позиции и до конца файла.

    FilePos (f) - функция, принимающая значение номера текущей компоненты файла. Используя данную функцию, не забывайте о том, что нумерация компонент файла начинается с 0.

    FileSize (f) - функция, возвращающая текущий размер файла.
Это всё, что я хотел написать о типизированных файлах. Теперь поговорим о файлах нетипизированных. Никаких новых для Вас процедур и функций тут нет. Просто знайте, что при работе с нетипизированными файлами можно пользоваться процедурами seek и truncate, функциями filepos и filesize, описание которых приводилось выше.
На этом весь материал (намеченный мной) о работе с файлами исчерпан. Начиная со следующего выпуска мы поговорим с фами о создании и работе с таким типом данных, как запись.

   Ну и как всегда, после блока теории, поговорим о нашем турнире.
С прошлой задачей, к моему великому сожалению, никто не справился. В связи с этим, я оставляю её до субботы. Чтобы дать "толчок" к решению, приведу Вам основную мысль моего решения данной задачи. Начнём с того, что максимальное кол-во цветов, которыми можно закрасить (чтобы ещё и условие выполнялось) любую доску - 3, минимальное - 0 (если ладей вообще на доске нет). Закрашивать ладьи мы будем построчно слева направа, сверху вних. Чтобы закрасить текущую ладью, нам достаточно посмотреть на цвет ладьи, стоящей слева от текущей и цвет ладьи, стоящей сверху от текущей. Если для Вас будет сложно решить задачу с 1

   Кстати, хочу выразить свою благодарность GriFe за то, что он обратил моё внимание на то, что входные данные могут быть столь большими. Честно говоря, когда я решал эту задачу, я решил её для доски 100*100, и вот сейчас мне пришлось исправить то неправильное решение на правильное. Спасибо Вас, GriFe!!! Как я понял, предыдущая задача была достаточно сложна, поэтому помимо той, до воскресенья 00:00 буду ждать от Вас решения и следующей задачи (таким образом, Вы сможете за эти полнедели получить не 10, а 20 баллов!). Вот условие этой задачи:

    "Забавная игра"
    Имя входного файла: input.txt
    Имя выходного файла: output.txt
    Легендарный учитель математики Юрий Петрович придумал забавную игру с числами. А именно, взяв произвольное целое число, он переводит его в двоичную систему счисления, получая некоторую последовательность из нулей и единиц, начинающуюся с единицы. (Например, десятичное число 19 в двоичной системе запишется как 10011.) Затем учитель начинает сдвигать цифры полученного двоичного числа по циклу (так, что последняя цифра становится первой, а все остальные сдвигаются на одну позицию вправо), выписывая образующиеся при этом последовательности из нулей и единиц в столбик - он подметил, что независимо от выбора исходного числа получающиеся последовательности начинают с некоторого момента повторяться. И, наконец, Юрий Петрович отыскивает максимальное из выписанных чисел и переводит его обратно в десятичную систему счисления, считая это число результатом проделанных манипуляций. Так, для числа 19 список последовательностей будет таким:
    10011
    11001
    11100
    01110
    00111
    10011
    :
    и результатом игры, следовательно, окажется число 28 - 11100.
    Поскольку придуманная игра с числами все больше занимает воображение учителя, отвлекая тем самым его от работы с ну очень одаренными школьниками, Вас просят написать программу, которая бы помогла Юрию Петровичу получать результат игры без утомительных ручных вычислений.
    Формат входных данных
    Входной файл содержит одно целое число N (0<=N<=32767).
    Формат выходных данных
    Ваша программа должна вывести в выходной файл одно целое число, равное результату игры.
    Пример
    input.txt
    19
    output.txt
    28
Турнирную таблицу я не буду приводить, так как никаких изменений (кроме отнимания у двух участников по 2 балла) она не претерпела.
Ну вот, теперь на сегодня точно всё. Надеюсь, что у Вас получатся обе задачи. Жду с нетерпеньем Ваших решений, но не торопитесь, а помните, что за присланное неправильное решение с вашего счёта списывается 2 очка (это не распространяется на новых участников турнира, у которых на счету ещё 0).

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

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


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

В избранное