|
Администрация |
Amadeus:1280040Nobilis:412791793 |
|
Объявления |
|
Объявляется набор модераторов на сайт. Все желающие стучите в ICQ#: 128-00-40 |
|
|
 |
|
|
Примеры решения творческих задач |
|
Автор Amadeus
|
|
02.05.2007 г. |
Рассмотрите решение творческих заданий учащихся. Наберите программы на компьютере и просмотрите их действие. Подумайте, как ребятам удалось придумать и выполнить такие работы. Эти программы помогут Вам определиться с выбором своей творческой работы.
Задача 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.
Задание. Выбрав какую-либо категорию файлов, проанализировать их в своей программе, пользуясь возможностями обработки нетипизированного файла, и решить некоторую поставленную Вами задачу. Протестированную программу и листинг покажите учителю для оценки.
Приготовьте рабочие программы и оцененные листинги для проверки учителем.
Проверьте свои знания по теме, ответив на следующие вопросы: Дайте определение нетипизированному файлу.
В чем Вы видите преимущества и недостатки работы с нетипизированными файлами по сравнению с типизированными и текстовыви файлами?
Объясните назначение параметров специфических для нетипизированных файлов процедур чтения и записи.
Какой вид файлов из рассмотренных выше Вам понравился больше и почему?
Объясните назначение процедур Аssign, Сlosе, Eof и их параметров.
В чем особенность применения процедуры rewrite и какой дополнительный параметр при работе с нетипизированными файлами она имеет?
В чем особенность применения процедуры reset и какой дополнительный параметр при работе с нетипизированными файлами она имеет?
Объясните назначение процедур Seek, FileSize, FilePos и их параметров.
Объясните назначение процедур rename, Truncate, Еrase и их параметров.
Расскажите как Вы работали над творческим заданием.
Для любознательных
Дополнительные процедуры и функции работы с файлами
Рассмотрим некоторые процедуры работы с файлами, входящие в модуль 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.
|
|
|
 |
 |
 |
|
|
Совет Дня |
|
Надо пилить сук, на котором сидишь, пока ты на нем не висишь
|
|
Помощь сайту |
|

wmR381968438342 wmZ908421463397 |
|
|
 |
|