Pascaler
О проекте Теоретический материал Тестирование Архив задач
Войти в личный кабинет



О проекте


Преподавателям


Тема: Примеры решения творческих задач.

Рассмотрите решение творческих заданий учащихся. Наберите программы на компьютере и просмотрите их действие. Подумайте, как ребятам удалось придумать и выполнить такие работы. Эти программы помогут Вам определиться с выбором своей творческой работы.

Задача 1. С помощью нетипизированного файла проанализировать файлы с расширением .mp3 в заданном пользователем каталоге и создать текстовый файл, содержащий следующую информацию: название песни, исполнитель, имя файла.

Program SedihGetTag;
  {$I-}
Uses
  Crt;
Var
  f : file;
  c : char;
  S : string;
  i : LongInt;
  DirInfo : seachrec;
  Txt : text;
Procedure Extract;
Begin
  assign(f, DirInfo.name);
  reset(f, 1); {размер буфера записи равен 1 байту}
  l := FileSize(f); {переменной l присваиваем размер файла в байтах}
  Seek(f, l-125); {ставим указатель, на 125 символов отступив от конца файла}
{вычислил сам, проанализировав файл данного типа}
  while not Eof(f) do
    Begin
      blockread(f, c, 1); {читаем посимвольно}
      S := S + c; {формируем строковую переменную, содержащую нужный тэг}
    end;
  close(f);
  writeln(Txt, copy(S, 1, 30)+'-'+copy(S, 31, 30)+'-'+DirInfo.Name);
{записываем выделенную информацию в файл)}
End;
Begin
  ClrScr;
  assing(txt,'list.txt');
  rewrite(txt);
  FindFirst('*.mp3', Arhive, DirInfo);
  while DosError=0 do
    begin
      S := '';
      Extract;
      FindNext(DirInfo);
    end;
  close(Txt);
End.

Задача 2. С помощью нетипизированного файла проанализировать файлы-архивы (архиватор WinRar) и вывести на экран имена заархивированных файлов.

Program LipovcevMaksim;
Uses
  Crt;
Var
  i, pos : integer;
  f : file;
  FileName, Ima : string;
  s : char;
Procedure Name(Var s : char); Forward;
Procedure Poisk(Var s : char);
Begin
  case Ord(s) of
    20 : begin
    blockread(f, s, 1);
    case Ord(s) of
      20 : Poisk(s);
      48..57 : begin
      blockread(f, f, S, 1);
        case Ord(S) of
          20 : Poisk(S);
          1..19 : Name(S);
          21..32 : Name(S);
        end;
      end;
    end;
  end;
end;
End;
Procedure (Name(Var S : char);
Var
  k : integer;
Begin
  k:=0;
  for i := 1 to 5 do
    blockread(f, S, 1);
    while (S<>'.') and (k<9) do
      begin
        blockread(f, S, 1);
        k := k+1;
        ima := Ima+S;
        if S=''
          then
            k := 0;
      end;
    if Pos('.', Ima)<>0
      then
        begin
          for i := 1 to 3 do
            begin
              blockread(f, S, 1);
              Ima := Ima+S;
            end;
          writeln(Ima);
        end;
  Ima := '';
End;
Begin
  ClrScr;
  writeln('Введите полное имя архивного файла RAR');
  write('->');
  readln(FileName);
  reset(f, 1);
  writeln('Имена заархивированных файлов:');
  while not EOF(f) do
    begin
      blockread(f, S, 1);
      Poisk(S);
    end;
  close(f);
  readKey;
End.

Задача 3. С помощью нетипизированного файла преобразовать файл c расширением .BMP следующим образом:

разделить рисунок на две части по горизонтали, верхнюю часть поместить на место нижней, разделить её на две части по вертикали и поменять их местами.

Примечание. При исследовании файлов с расширением ВМР выяснилось следующее их описание в зависимости от количества употребляемых цветов:

16 цветов - 118 байт, 256 цветов - 1086 байт, 24 бита - 55 байт. Это количество байт влияет на значение переменное Кol в программе.

Program BaranovA;
Uses
  Crt;
Const
  n=1234; {установка размера буфера}
  Kol=118;
Var
  F1, F2 : file;
  Name1, Name2 : string;
  Buf : Array [1..n] of byte;
  AllSize, PicSize, HalfSize : LongInt;
  i : integer;
Begin
  write('Имя файла >');
  readln(Name1);
  Name2 := Name1;
  if Pos('.', Name2) <> 0
    then
      begin
        Delete(Name2, Pos('.', Name2), Lenth(Name2)-Pos('.', Name2)+1);
        Name2 := Name2+'.tmp';
        assign(F1, Name1);
        reset(F1, 1);
        assign(F2, Name2);
        rewrite(F2, 1);
        AllSize := FileSize(F1); {размер всего файла}
        PicSize := AllSize-Kol; {размер всего файла без описания}
        HalfSize := PicSize div 2; {половина файла}
        blockread(F1, Buf, Kol);
        blockwrite(F2, Buf, Kol);
        seek(F1, Kol+HalfSize-1);
        for i := 1 to HalfSize div n do
          begin
            blockread(F1, Buf, n); {считываем и записываем из середины файла}
            blockwrite(F2, Buf, n);
          End;
        blockread(F1, Buf, HalfSize mod n); {переписываем оставшиеся байты из не полностью заполненного буфера}
        blockwrite(F2, Buf, HalfSize mod n);
        Seek(F1, Kol-1);
        blockread(F1, Buf, HalfSize mod n);
        blockwrite(F2, Buf, HalfSize mod n);
        close(F1);
        close(F2);
     end;
End.

Задание. Выбрав какую-либо категорию файлов, проанализировать их в своей программе, пользуясь возможностями обработки нетипизированного файла, и решить некоторую поставленную Вами задачу. Протестированную программу и листинг покажите учителю для оценки.

Приготовьте рабочие программы и оцененные листинги для проверки учителем.

Проверьте свои знания по теме, ответив на следующие вопросы:

  1. Дайте определение нетипизированному файлу.


  2. В чем Вы видите преимущества и недостатки работы с нетипизированными файлами по сравнению с типизированными и текстовыви файлами?


  3. Объясните назначение параметров специфических для нетипизированных файлов процедур чтения и записи.


  4. Какой вид файлов из рассмотренных выше Вам понравился больше и почему?


  5. Объясните назначение процедур Аssign, Сlosе, Eof и их параметров.


  6. В чем особенность применения процедуры rewrite и какой дополнительный параметр при работе с нетипизированными файлами она имеет?


  7. В чем особенность применения процедуры reset и какой дополнительный параметр при работе с нетипизированными файлами она имеет?


  8. Объясните назначение процедур Seek, FileSize, FilePos и их параметров.


  9. Объясните назначение процедур rename, Truncate, Еrase и их параметров.


  10. Расскажите как Вы работали над творческим заданием.

Для любознательных

Дополнительные процедуры и функции работы с файлами

Рассмотрим некоторые процедуры работы с файлами, входящие в модуль Dos. Напомним, что для его подключения требуется указать

Uses
  Dos;

Ряд свойств файла, хранящегося на диске, кодируются так называемыми атрибутами. Атрибуты файла записываются не в сам файл, а в информационный раздел каталога, в котором хранится файл. Для хранения атрибутов отводится один байт, единица в определенном бите которого означает наличие свойства, а нуль - отсутствие. Соответствие битов и свойств показывает схема, приведенная на рисунке.

0 - Только чтение readOnly=1,

1 - Скрытый файл Hidden=2,

2 - Системный файл Sysfile=4,

3 - Метка томаVolumeID=8,

4 - Подкаталог Directory=16,

5 - Архивный файл Arhive=32.

Каждому атрибуту соответствует определенная константа, равная 2k, где k - номер бита. Эти константы описаны в модуле Dos, их значения и имена приведены на схеме. В целом байт атрибутов образуется как сумма соответствующих ему констант. Установка атрибута «только чтение» приводит к невозможности изменения содержимого файла или его удаления.

Скрытые файлы игнорируются некоторыми командами операционной системы, в частности, они не показываются по команде Dir. Системные файлы - файлы операционной системы Dos. Атрибут «Архивный» означает, что для этого файла не была создана резервная копия командой BackUp.

Большинство файлов имеют этот атрибут. Определить атрибуты файла можно с помощью процедуры

GetFAttr(MyFile,Attr);

которая возвращает переменную Attr, содержащую код атрибутов файла.

Например, проверить свойство «только для чтения» можно процедурами

GetFAttr(MyFile,Attr);
if Odd(Attr)
  then
    write ('Только для чтения')
  else
    write(' Не только для чтения');

Установка требуемых атрибутов файла производится процедурой

setFAttr (MyFile,Attr);

Процедуры для поиска на диске требуемых файлов используют специальный тип записи Seachrecord, определенный в модуле Dos. Запись

Туре
  Seachrecord= record
      Fill : аrrау [1..21] оf bytе;
      Attr : bytе;
      Time : longint;
      Size : longint;
      Name : string[12]
end;

Первое поле записи - массив Fill - используется операционной системой и не должно изменяться в пользовательских программах. Содержание поля Attr - атрибуты файла, рассмотренные выше. Поле Time содержит время записи файла в упакованном виде. Упакованный вид записи времени может быть получен из даты, часов, минут, секунд и сотых долей секунды процедурой РасkTime. Size - размер файла в байтах. Name - имя файла, включая разделительную точку и расширение.

Процедура

FindFirst (SeachPath, Аttr, Seachresult);

ищет в каталоге первый файл, удовлетворяющий заданной спецификации. Параметры SeachPath и Аttr содержат исходные данные для поиска. Возвращаемый результат поиска - Seachresult. SeachPath - строка, содержащая полное имя файла, в том числе каталог, в котором необходимо искать файл, и имя файла. Имя файла (но не путь) может содержать символы звездочки и вопросительного знака, которые, соответственно, заменяют любую последовательность символов или один произвольный символ.

Если путь не приводится, поиск идет в рабочем каталоге. Следовательно, SeachPath = '*.dat' указывает на все файлы с расширением "dat" в текущем каталоге.

Процедура FindNext(Seachres) употребляется только после процедуры FindFirst и продолжает последовательно поиск файлов с определенным процедурой FindFirst шаблоном.

Функция FSeach(SeachString, DirList) ищет файл, заданный строкой SeachString, в заданном списке каталогов DirList. Список каталогов записывается так же, как в команде DOS Path, то есть различные каталоги разделены точкой с запятой. Результат этой функции - полное имя файла, если он найден по указанным путям.

Функция FExpand(FileName), получив имя файла FileName, расширяет его до полного имени, используя для этого текущий каталог. Если в качестве FileName задано имя с полным путем, функция не изменяет его. Если задано только имя файла, то дописывается текущий каталог. Если запись FileName начинается с символа "обратный слэш", то берется текущий диск и к нему дописывается имя FileName. Если запись FileName начинается с символов "..", то берется часть текущего каталога на уровень выше.

Процедура FSplit(WholeFileName, Dir, Name, Ext), получив в качестве аргумента полное имя файла WholeFileName, разделяет его на три составные части и возвращает переменные параметры Dir - каталог, Name - имя файла, Ext - расширение. Для каталога, имени файла и расширения в модуле DOS предусмотрены специальные типы - строки ограниченной длины: PathStr, NameStr, ExtStr.

Обратим внимание, что типизированные переменные пишутся в файл в том виде, в каком они используются в памяти ЭВМ. Если мы пытаемся прочитать содержимое такого файла обычными средствами DOS, например, нажав F3 в Norton Commander, или непосредственно в среде Паскаль, то каждый байт этих записей воспроизведется как соответствующий символ кодовой таблицы ASCII. Например, если файл имеет байтовый тип, и в него пишутся числа 65, 66, 67, то при его чтении мы увидим АВС. Такая запись данных компактна и удобна, если создаваемые файлы читаются другими программами, для которых эта кодировка естественна. В тех случаях, когда файлы предназначены для просмотра человеком, требуется перевод данных в текстовую форму.

Внешние устройства в качестве файловов

Связь с внешними устройствами в языке Паскаль осуществляется также через файловые переменные.

В Турбо Паскале существует два типа внешних устройств: устройства операционной системы и текстовые устройства.

Устройства операционной системы, с которыми осуществляется обмен информацией, могут быть описаны как файлы со стандартными именами. Эти имена следующие:

CON - консоль (клавиатура, дисплей). С этим устройством стандартно связаны файловые переменные Input и Output.

LPT1, LPT2, LPT3 - печатающие устройства. Если в системе один принтер, то он будет иметь имя LPT1. Если в программе используется стандартный модуль Printer (указан в разделе Uses), можно использовать для вывода на принтер стандартную файловую переменную Lst.

PRN - синоним LPT1.

COM1, COM2 - имена двух портов.

AUX - синоним COM1.

NUL - фиктивное внешнее устройство.

К текстовым устройствам относятся устройства, не поддерживаемые операционной системой или имеющие другие способы обращения. Например, устройство CRT, поддерживаемое стандартным модулем Сrt. Оно эквивалентно CON в операционной системе, но более быстродействующее и позволяет использовать разные цвета и окна.

С текстовым устройством нельзя связаться процедурой assign. Для связи с ним служит специальная модификация этой процедуры, например, для связи с устройством CRT следует использовать процедуру AssignCrt в модуле Crt.

Вернуться назад
2003—2012 © Группа «Vimedia»
Проект «Pascaler» — лучший на ХI Всероссийской конференции молодых исследователей с международным участием «Шаг в будущее», Россия, Москва, 12 – 16 апреля 2004г.