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

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

  Все выпуски  

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


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


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

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

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

    f:text;
    f1:file of char;
эквивалентны. Как и в указанном примере, чтобы описать типизированный файл необходимо написать file of и затем указать тип наполнения файлов. Это очень удобно, например, при работе с записями (о них речь пойдёт чуть позже). Не пытайтесь внести данные в файл, а затем прочитать их из типизированного файла. В этом случае лучше воспользоваться стандартными текстовыми файлами. Типизированные файлы чаще всего используются для программной записи информации и программного считывания. Приведу пример: если вручную набрать числа в файл, а затем прочитать их из файла, воспользовавшись file of byte; у Вас ничего не получится, так как в этом случае он будет запоминать не те числа, которые Вы написали, а код символа (в том числе и пробел). Кроме того, при работе с типизированными файлами не допускается использование процедур writeln/readln. Можно пользоваться только read/write Так что лично я советую Вам просто запомнить, что есть такие типизированные файлы (они Вам пригодятся). Если хотите, то поэкспериментируйте с ними, чтобы получше понять преимущества и недостатки их. Попробуйте придумать, где можно применять эти файлы.

   Теперь попробуем разобраться с нетипизированными файлами. Чтобы описать переменную-нетипизированный файл, достаточно после двоеточия просто указать слово file. Например:

    F: file;
Работа с этими файлами на мой взгляд ещё более сложна. Восновном эти файлы используются, если надо записать/считать большой объём информации. Если считывать и записывать поэлементно, то это будет достаточно долго при большом кол-ве элементов (это связано с особенностями работы жёсткого диска). Чтобы ускорить этот процесс придумали считывать (или записывать) массив элементов buf. Для этого существуют процедуры blockread (чтение) и blockwrite (запись). Синтаксис:
    blockread (f,buf,n [,rezult]);
    blockwrite (f,buf,n[,rezult]);
Здесь f - переменная нетипизированный файл; buf - переменная буфер; <n - кол-во элементов, которое необходимо считать (записать); rezult - необязательный параметр (необязательные параметры всегда берутся в []. При использовании процедуры скобки не используются) - кол-во элементов, которое считалось (записалось) на самом деле.
При работе с нетипизированными файлами нельзя использовать стандартные процедуры ввода/вывода.

   Теперь Вы уже знаете основные элементы, используемые при работе с файлами. Напоследок приведу несколько полезных процедур и функций, также использующихся при работе с файлами.

    chdir(path) - процедура, позволяющая изменять текущий каталог на каталог path, где path - переменная строкового типа, не включающая в себя имя файла (только путь);
    erase (f) - процедура, позволяющая удалять файл, с которым связана файловая переменная f;
    getdir (n,s) - получение текущего каталога накопителя, где n - номер накопителя (0 - текущий накопитель; 1 - накопитель A; 2 - накопитель B и т. д.), s - переменная типа string, в которую и записывается текущий каталог;
    Mkdir (path) - процедура, создающая каталог, путь к которому указывается переменной path строкового типа;
    rename(f,newname) - переименовывает файл, с которым связана файловая переменная f в файл с именем newname;RmDir (path) - удаляет ПУСТОЙ каталог, путь до которого указан переменной типа string - path;
    Eof(f) - функция, которая принимает значение true, если указатель текущей компоненты файла находится за последней компонентой файла (конец файла), false - в ином случае;
    IoRezult - функция, в которой хранится 0, если последняя операция ввода/вывода завершилась успешно, или другое число в противном случае. Например, файл не открылся, тогда выполнится следующее условие: Iorezult<>0

   На этом сегодня всё. Всё - это имеется ввиду из теории. Теперь осталась домашняя задача и первые места нашего турнира:
Домашняя задача. Участники турнира просили дать задачку посложней. Ну чтож, ловите:

    "Ладьи"
      Дана шахматная доска размером N*N (1<=N<=1000), в некоторых клетках которой стоят ладьи. Будем считать, что две одноцветные ладьи бьют друг друга, если они стоят на одной горизонтали или вертикали и между ними нет других ладей.
      Требуется создать программу для выполнения раскраски расположенных на шахматной доске ладей наименьшим количеством цветов таким образом, чтобы одноцветные ладьи не били друг друга.
    Технические требования:
      Входной файл: Input.txt
      Выходной файл: output.txt
    Формат входных данных:
      Входной файл input.txt содержит последовательность N+1 строк. В первой строке записано целое число N. Каждая из последующих N строк служит для описания расположения ладей на шахматной доске по горизонталям. Клетка с ладьей обозначается буквой "Л", без ладьи - буква "П". Символы в одной строке разделены пробелами.
    Формат выходных данных:
      Выходной файл Output.txt должен содержать одно число - искомое количество цветов.
    Пример файла входных данных:
      3
      Л Л Л
      П Л П
      Л П П
    Пример файла выходных данных (для приведенного выше входного файла):
      2
Ну а теперь о нашем турнире!
В настоящее время, первые 3 места таблицы распределены между участниками турнира следующим образом:
1 место - Strory - 40 баллов;
2 и 3 место - GriFe и Pavel Strapko - по 25 баллов.


Желаю всем удачи и надеюсь, что с новой задачей проблем не будет!

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

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


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

В избранное