Ф Е Д Е Р АЛ Ь Н О Е АГ Е Н Т С Т В О П О О Б Р АЗО В АН И Ю В О Р О Н Е Ж С К И Й Г О С У Д АР С Т В Е Н Н Ы Й У Н И В Е Р С И Т Е Т
С адовская О .Б .
П рограммирование в среде Delphi Часть III Ф айлы У чебное пособие С пец иальность 010100 (510100) – М атематика
В О РО Н Е Ж 2006
2 У тверж д ен о н а у чн о-м етод ическим совет ом м а т ем а т ического ф а ку льт ет а 9 д ека б ря 2005 год а , прот окол № 4
А вт ор Са д овска я О.Б. Рецен зен т
д оцен т , к. ф -м . н . В .Ю . Са н д б ерг
У чеб н ое пособ ие под гот овлен о н а ка ф ед ре ф у н кцион а льн ого а н а лиза и опера т орн ых у ра вн ен ий м а т ем а тического ф а ку льт ета В орон еж ского госу д а рст вен н ого у н иверсит ет а . Реком ен д у ет ся д ля ст у д ен т ов 2 ку рса д н евн ого от д елен ия м а т ем а т ического ф а ку льт ет а , об у ча ю щихся по специа льн ости «м а т ем а т ика » (010100).
3
3.1 Д иалоговые окна В сост а в Windows вход ит ря д типовых д иа логовых окон , пред н а зн а чен н ых д ля от крытия и сохра н ен ия ф а йлов, выб ора ш риф т а , цвет а и н екоторые д ру гие. В Delphi реа лизова н ы кла ссы, об ъект ы кот орых д а ю т програ м м исту способ ы созд а н ия и использова н ия т а ких окон . Ра ссм от рим свойства н екот орыхком пон ен тов, с пом ощью кот орых в Delphi реа лизу ю т ся д иа логовые окн а . Диа логовое окн о выб ора им ен и от крыва ем ого ф а йла OpenDialog пред н а зн а чен о д ля просм отра ф а йловой сист ем ы ком пью т ера и выб ора им ен и т реб у ем ого ф а йла . Ком пон ен т OpenDialog н е пред н а зн а чен д ля а вт ом а тического открытия ф а йлов. Он позволя ет лиш ь полу чит ь им я выб ра н н ого пользова т елем ф а йла . Непосред ст вен н ое от крыт ие ф а йла осу щест вля ет ся при пом ощи ст а н д а рт н ых процед у р я зыка Object Pascal либ о специа льн ых м ет од ов, опред елён н ых, н а прим ер, в кла ссе TStrings. Ра ссм от рим осн овн ые свойст ва кла сса TOpenDialog, э кзем пля ром кот орого я вля ет ся ком пон ен т OpenDialog. property DefaultExt : string; Сод ерж ит ра сш ирен ие, д об а вля ем ое к им ен и ф а йла , если у н его н е у ка за н о ра сш ирен ие. property FileName : string; Сод ерж ит им я выб ра н н ого ф а йла . property Files : TStrings; Сод ерж ит список им ён выд елен н ых ф а йлов. property Filter : string; Сод ерж ит описа н ие од н ого или н ескольких ф а йловых ф ильт ров. На прим ер, ф ильтр * . pas пом ож ет пользова т елю от об ра ж а т ь в д иа логовом окн е только ф а йлы, им ею щие ра сш ирен ие . pas. property InitialDir : string; Опред еля ет па пку , сод ерж им ое кот орой поя вля ет ся при от крытии д иа логового окн а . function Execute : boolean; Ра зм еща ет д иа логовое окн о н а э кра н е в м од а льн ом реж им е. М од а льн ый реж им озн а ча ет , что выполн ен ие прилож ен ия приост а н а влива ется д о т ех пор, пока пользова тель н е за кроет м од а льн ое окн о. Ф у н кция возвра ща ет зн а чен ие true, если окн о за крыт о кн опкой О ткрыть, и false, если за крыто кн опкой О тмена. Диа логовое окн о SaveDialog очен ь похож е н а окн о OpenDialog, н о в отличие от н его использу ет ся при сохра н ен ии ф а йла . Диа логовое окн о FontDialog позволя ет пользова т елю выб ира т ь ш риф т и у ст а н а влива т ь его ха ра кт ерист ики. Осн овн ым свойст вом ком пон ен т а FontDialog я вля ет ся свойст во Font, за д а ю щее ха ра кт ерист ики ш риф т а . Ра ссм от рим прим ер использова н ия ком пон ен тов OpenDialog, SaveDialog и FontDialog.
4 Созд а д им простой т екст овый ред а ктор, кот орый позволил б ы с пом ощью д иа логовых окон от крыва т ь и сохра н я т ь т екст овые ф а йлы, а т а кж е изм ен я ть ха ра кт ерист ики ш риф т а . Ра зм ест им н а ф орм е след у ю щие ком пон ен ты: OpenDialog1, SaveDialog1, FontDialog1 выб ерем из ст ра н ицы Dialogs, Memo1, Button1, Button2, Button3 – из стра н ицы Standard. В ыб ерем свойст во Filter ком пон ен та OpenDialog1 и щёлкн ем по поя вивш ейся кн опке с т рем я т очка м и. П оя вит ся д иа логовое окн о Filter Editor, с пом ощью кот орого м ож н о за д а т ь ф ильтры. Filter Name Filter Т екст овые ф а йлы (*.txt, *.doc) В се ф а йлы (*.*)
*.txt; *.doc *.*
П осле за полн ен ия н а ж а т ь кн опку Ok. Для ком пон ен т а SaveDialog зн а чен ие свойст ва DefaultExt у ста н овим ра вн ым txt. т .е., если при сохра н ен ии ф а йла ра сш ирен ие н е б у д ет у ка за н о, т о по у м олча н ию д об а вит ся ра сш ирен ие txt. Кн опка м Button1, Button2, Button3 у ст а н овим свойство Caption ра вн ым ′От крыт ь′, ′Сохра н ит ь′, ′Ш риф т′.
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; FontDialog1: TFontDialog; Memo1: TMemo;
5 Button1: TButton; Button2: TButton; Button3: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); begin if not opendialog1.execute then exit; memo1.Lines.LoadFromFile(OpenDialog1.filename) end; procedure TForm1.Button2Click(Sender: TObject); begin if not savedialog1.execute then exit; memo1.Lines.SaveToFile(savedialog1.filename) end; procedure TForm1.Button3Click(Sender: TObject); begin if not fontdialog1.execute then exit; memo1.Font:=fontdialog1.font end; end.
3.2 Ф айловые типы и ф айловые переменные Object Pascal ра спола га ет сред ст ва м и созд а н ия и об ра б от ки ф а йлов ра зличн ых т ипов. Дост у п к ф а йлу осу щест вля ет ся с пом ощью перем ен н ых ф а йлового типа . В Object Pascal су щест ву ет т ри ф а йловых т ипа : TextFile – текстовый ф а йл, пред ст а вля ю щий соб ой н а б ор сим вольн ых ст рок перем ен н ой д лин ы; File of < т ип > – т ипизирова н н ый ф а йл, пред ст а вля ю щий соб ой н а б ор д а н н ых у ка за н н ого типа ; File – н ет ипизирова н н ый ф а йл, пред ст а вля ю щий соб ой н а б ор н естру кт у рирова н н ых д а н н ых. П рим еры описа н ия ф а йловых перем ен н ых:
6 var f1: textfile; f2: file of integer; f3: file of char; f4: file; Зд есь f1 – т екст овый ф а йл, f2 и f3 – т ипизирова н н ые ф а йлы, f4 – н ет ипизирова н н ый ф а йл.
3.3 С тандартные подпрограммы для досту па к ф айлам Ра б от а с ф а йла м и за клю ча ет ся в за писи и считыва н ии ин ф орм а ции. Для т ого чтоб ы у ка за т ь, с ка ким э лем ен том б у д ет производ ит ься очеред н а я опера ция чтен ия или за писи, су щест ву ет пон я т ие у ка за т еля н а д ост у пн ый э лем ен т ф а йла . П осле ка ж д ого чт ен ия или за писи у ка за т ель перем еща ет ся н а след у ю щий э лем ен т ф а йла . П еред использова н ием ф а йловой перем ен н ой он а д олж н а б ыт ь свя за н а с вн еш н им ф а йлом ( ф а йлом н а д иске) с пом ощью вызова процед у ры AssignFile(< ф а йлова я перем ен н а я >, < им я ф а йла >); зд есь <ф а йлова я перем ен н а я > – им я перем ен н ой ф а йлового т ипа , об ъя влен н ой в програ м м е; <им я ф а йла > – сим вольн а я ст рока , сод ерж а ща я им я ф а йла . Е сли ф а йл н а ход ится в од н ой па пке с об ра б а тыва ю щей его програ м м ой, то д ост а точн о у ка за т ь т олько им я ф а йла , в прот ивн ом слу ча е н а д о у ка за т ь полн ый пу т ь к ф а йлу , н а прим ер: ′c:\files\z1.txt′ Когд а свя зь с вн еш н им ф а йлом у ст а н овлен а , его м ож н о от крыт ь д ля ввод а или вывод а ин ф орм а ции. Су щест ву ю щий ф а йл м ож н о от крыт ь с пом ощью процед у ры Reset(<ф а йлова я перем ен н а я >); П роцед у ра reset открыва ет су щест ву ю щий вн еш н ий ф а йл, им я кот орого б ыло свя за н о с ф а йловой перем ен н ой. Е сли вн еш н ий ф а йл с у ка за н н ым им ен ем от су т ст ву ет , т о возн ика ет ош иб ка период а выполн ен ия програ м м ы. Е сли ф а йл у ж е от крыт , то он сн а ча ла за крыва ет ся , а за тем от крыва ется вн овь. Ф а йловый у ка за т ель у ст а н а влива ется н а э лем ен т ф а йла с поря д ковым н ом ером 0. Т екст овый ф а йл, от крыт ый процед у рой reset, д ост у пен т олько д ля чт ен ия . Для т ипизирова н н ых и н етипизирова н н ых ф а йлов, от крыт ых процед у рой reset, д опу ска ет ся выполн я т ь опера ции чт ен ия и за писи в ф а йл. Новый ф а йл м ож н о созд а ть и от крыт ь д ля за писи с пом ощью процед у ры Rewrite(<ф а йлова я перем ен н а я >); П роцед у ра rewrite созд а ёт н овый ф а йл, им я которого свя за н о с ф а йловой перем ен н ой. Е сли ф а йл с у ка за н н ым им ен ем у ж е су щест ву ет , т о он у д а ля ет ся и н а его м ест е созд а ёт ся н овый пу ст ой ф а йл. Т еку ща я позиция в ф а йле у ст а н а влива ет ся н а н а ча ло ф а йла , т.е. у ка за т ель б у д ет у ка зыва т ь н а э лем ен т с поря д ковым н ом ером 0. Е сли процед у ра rewrite от крыва ет т екст овый ф а йл, то он ста н овится д ост у пн ым только д ля за писи. Для типизирова н н ых и н етипизи-
7 рова н н ых ф а йлов, от крытых процед у рой rewrite, д опу ска ет ся выполн я т ь опера ции чтен ия и за писи в ф а йл. Т екст овый ф а йл м ож ет б ыт ь от крыт процед у рой Append(<ф а йлова я перем ен н а я >); П роцед у ра append от крыва ет у ж е су щест ву ю щий вн еш н ий ф а йл, свя за н н ый с ф а йловой перем ен н ой, д ля д об а влен ия н овой ин ф орм а ции. Если ф а йла с у ка за н н ым им ен ем н е су щест ву ет , т о возн ика ет ош иб ка . Е сли ф а йл у ж е от крыт , то он сн а ча ла за крыва ет ся , а за т ем от крыва ет ся за н ово. У ка за тель б у д ет у ка зыва т ь н а кон ец ф а йла . В резу льт а т е об ра щен ия к append т екстовый ф а йл ст а н овит ся д ост у пн ым т олько д ля за писи. Когд а програ м м а за верш а ет об ра б от ку ф а йла , он д олж ен б ыт ь за крыт с пом ощью ст а н д а рт н ой процед у ры CloseFile(<ф а йлова я перем ен н а я >); П роцед у ра closefile за крыва ет от крытый ф а йл. П ри э том об еспечива ет ся сохра н ен ие в ф а йле всех н овых за писей и регист ра ция ф а йла в па пке. П роцед у ра closefile н е ра зрыва ет свя зь ф а йла с ф а йловой перем ен н ой, поэ том у ф а йл м ож н о от крыт ь сн ова б ез повт орн ого использова н ия процед у ры assignfile. У н ичтож ит ь ф а йл f м ож н о с пом ощью процед у ры Erase(var f). П ереим ен овыва ет ф а йл процед у ра Rename(var f; NewName : string). Зд есь NewName – строка , сод ерж а ща я н овое им я ф а йла . П еред выполн ен ием э т их процед у р н еоб ход им о за крыт ь ф а йл.
3.4 Т екстовые ф айлы Т екст овый ф а йл пред ст а вля ет соб ой послед ова т ельн ост ь сим волов, сгру ппирова н н ых в строки произвольн ой д лин ы, гд е ка ж д а я ст рока за ка н чива ется м а ркером кон ца ст роки – EOLN (end of line), сост оя щим из д ву х сим волов: CR=#13 и LF=#10. За ка н чива ет ся ф а йл сим волом кон ца ф а йла EOF (end of file, код #26). Ч тен ие д а н н ых из произвольн ого т екст ового ф а йла м ож н о осу щест вит ь с пом ощью процед у р read и readln. П ри э том в списке их па ра м етров первой д олж н а стоя т ь соот вет ст ву ю ща я ф а йлова я перем ен н а я . На прим ер, процед у ра read(f, x, y, z); осу щест вля ет чтен ие из ф а йла , свя за н н ого с ф а йловой перем ен н ой f, зн а чен ия перем ен н ых x, y, z. П роцед у ра readln(f, a); прочит а ет из ф а йла , свя за н н ого с перем ен н ой f, зн а чен ие перем ен н ой a и перейд ёт в э том ф а йле к след у ю щей ст роке. В ывод д а н н ых в т екст овый ф а йл производ ит ся процед у ра м и write и writeln, у кот орых первой в списке па ра м етров у ка за н а соот вет ст ву ю ща я ф а йлова я перем ен н а я . На прим ер, процед у ра write(f, ′ s = ′, s) осу щест вля ет за пись в ф а йл, свя за н н ый с перем ен н ой f, сим вольн ой ст роки ′ s = ′ и зн а чен ия перем ен н ой s. П роцед у ра writeln(f) за пиш ет в ф а йл, свя за н н ый с перем ен н ой f, пу ст у ю ст року .
8 П ри ра б от е с текст овым и ф а йла м и использу ю т ся логические ф у н кции eof(<ф а йлова я перем ен н а я >) и eoln(<ф а йлова я перем ен н а я >). Ф у н кция eof возвра ща ет зн а чен ие true, если д остигн у т кон ец ф а йла , и false в противн ом слу ча е. Ф у н кция eoln возвра ща ет зн а чен ие true, если д остигн у т кон ец ст роки в т екст овом ф а йле, и false в противн ом слу ча е. Т екст овый ф а йл м ож н о созд а т ь в сред е Delphi, выб ра в в м ен ю ком а н д у File„New„Text. В от крывш ем ся окн е н у ж н о н а б ра т ь сод ерж им ое т екст ового ф а йла и сохра н ит ь ф а йл с пом ощью ком а н д ы File„Save. Т екст овый ф а йл м ож н о т а кж е созд а т ь програ м м н ым способ ом . Ра ссм отрим н есколько возм ож н ых ва риа н тов програ м м ы д ля созд а н ия т екст ового ф а йла . За д а ча 1. Созд а т ь т екст овый ф а йл и за полн ит ь его ин ф орм а цией, введ ён н ой в ред а кторе Memo. Окн о ра б от а ю щего прилож ен ия :
Созд а н ие т екст ового ф а йла с использова н ием м етод а SaveToFile: procedure TForm1.Button1Click(Sender: TObject); begin memo1.Lines.SaveToFile('c:\Files\z1.txt'); end; Созд а н ие т екст ового ф а йла б ез использова н ия м етод а SaveToFile: procedure TForm1.Button1Click(Sender: TObject); var f : textfile; n, i : integer; begin assignfile(f, 'c:\Files\z1.txt'); rewrite(f); n:=memo1.Lines.Count; for i:=0 to n-1 do writeln(f, memo1.lines.strings[i]); closefile(f); end; П ривед ён н ый зд есь т екст програ м м ы сод ерж ит им я созд а ва ем ого ф а йла (c:\Files\z1.txt) . П оэ т ом у , чт об ы созд а т ь д ру гой ф а йл, н у ж н о
9 б у д ет вн ест и изм ен ен ия в т екст програ м м ы. Доб а вив н а ф орм у ком пон ен т SaveDialog, м ы полу чим у д об н ое сред ст во д ля выб ора им ен и созд а ва ем ого ф а йла н а э т а пе ра б оты прилож ен ия . Окн о прилож ен ия после д об а влен ия ком пон ен т а SaveDialog:
П реоб ра зова н н а я процед у ра Button1Click: procedure TForm1.Button1Click(Sender: TObject); var f : textfile; n, i :integer; begin if not savedialog1.Execute then exit; assignfile(f, savedialog1.filename); rewrite(f); n:=memo1.Lines.Count; for i:=0 to n-1 do writeln(f, memo1.lines.strings[i]); closefile(f); end; За д а ча 2. В ычислит ь количест во ст рок из четырёх сим волов д а н н ого текст ового ф а йла . Для выб ора им ен и ф а йла использова т ь ком пон ен т OpenDialog. В ыб ра н н ый ф а йл от об ра зит ь в окн е Memo. Окн о прилож ен ия :
procedure TForm1.Button1Click(Sender: TObject); var f : textfile; s : string; k : byte;
10 begin if not opendialog1.Execute then exit; assignfile(f, opendialog1.FileName); memo1.Lines.LoadFromFile(opendialog1.FileName); reset(f); k:=0; while not eof(f) do begin readln(f, s); if length(s)=4 then inc(k); end; closefile(f); label1.Caption:='От вет ' + inttostr(k) end; За д а ча 3. П ока за т ь ст роки ф а йла , н а чин а ю щиеся с б у квы ″ф ″. Для выб ора им ен и ф а йла использова т ь ком пон ен т OpenDialog. Для от об ра ж ен ия в ф орм е н у ж н ых строк ф а йла использова т ь ком пон ен т Memo. Окн о ра б ота ю щего прилож ен ия :
procedure TForm1.Button1Click(Sender: TObject); var f : textfile; s : string; begin if not opendialog1.execute then exit; assignfile(f, opendialog1.filename); reset(f); while not eof(f) do begin readln(f, s); if s[1]='ф ' then memo1.Lines.Add(s); end; closefile(f); end; procedure TForm1.Button2Click(Sender: TObject); begin memo1.Lines.Clear; end;
11 З а да чи За д а ча 4. П од счит а т ь число ст рок ф а йла , за ка н чива ю щихся ру сской б у квой ″а ″. Для выб ора им ен и ф а йла использова т ь ком пон ен т OpenDialog. В ыб ра н н ый ф а йл отоб ра зит ь в окн е Memo. Окн о ра б от а ю щего прилож ен ия :
За д а ча 5. П ока за т ь все ст роки ф а йла , н а чин а ю щиеся и за ка н чива ю щиеся од н им и т ем ж е сим волом . Для выб ора им ен и ф а йла использова т ь ком пон ен т OpenDialog. Для отоб ра ж ен ия н у ж н ых ст рок ф а йла в ф орм е использова ть ком пон ен т Memo. Окн о ра б от а ю щего прилож ен ия :
За д а ча 6. П ереписа т ь в н овый ф а йл все строки исход н ого т екст ового ф а йла , сод ерж а щие ру сску ю б у кву ″т ″, д об а вля я в кон ец ст роки сим вол ″;″ . Для выб ора им ён исход н ого и созд а ва ем ого ф а йла использова т ь д иа логовые окн а . Окн о ра б от а ю щего прилож ен ия :
12 В э т ом прилож ен ии им ен а ф а йлов, выб ра н н ые в окн е OpenDialog1 и SaveDialog1, от об ра ж а ю т ся н а ф орм е в поле м еток Label1 и Label2. type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; OpenDialog1: TOpenDialog; SaveDialog1: TSaveDialog; Memo2: TMemo; Label1: TLabel; Label2: TLabel; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var f, f1 : textfile; s:string; begin if not opendialog1.execute then exit; assignfile(f, opendialog1.FileName); label1.Caption:=opendialog1.FileName; memo1.Lines.LoadFromFile(opendialog1.FileName); if not savedialog1.execute then exit; assignfile(f1, savedialog1.filename); label2.Caption:=savedialog1.filename; reset(f); rewrite(f1); while not eof(f) do begin readln(f, s); if pos(' т ', s) <>0 then writeln(f1, s, ' ; ') end; closefile(f); closefile(f1); memo2.Lines.LoadFromFile(savedialog1.FileName); end; end. За д а ча 7. Дополн ить н овым и ст рока м и у ж е су щест ву ю щий т екст овый ф а йл. Для выб ора им ен и ф а йла использова т ь ком пон ен т OpenDialog. Окн о ра б от а ю щего прилож ен ия :
13
За д а ча 8. На йт и количест во ст рок д а н н ого т екстового ф а йла и д об а вит ь к д а н н ом у ф а йлу ст року , сод ерж а щу ю н а д пись ″Количест во ст рок ф а йла ра вн о ″ и н а йд ен н ое число. Для выб ора им ен и ф а йла использова т ь ком пон ен т OpenDialog. Окн о ра б от а ю щего прилож ен ия :
За д а ча 9. В н а ча ло ка ж д ой ст роки ф а йла вст а вит ь её н ом ер и за писа т ь преоб ра зова н н ые ст роки в н овый ф а йл. Для выб ора им ён исход н ого и созд а ва ем ого ф а йла использова т ь д иа логовые окн а . Окн о ра б от а ю щего прилож ен ия :
14 За д а ча 10*. Да н текст овый ф а йл, сод ерж а щий строки. П ереписа т ь сод ерж им ое ф а йла в д ру гой ф а йл, сд вига я циклически ка ж д у ю ст року впра во н а 3 сим вола . На прим ер, резу льт а т ом сд вига строки abcdewrt б у д ет ст рока wrtabcde. Для выб ора им ён исход н ого и созд а ва ем ого ф а йла использова т ь д иа логовые окн а . Окн о ра б от а ю щего прилож ен ия :
За д а ча 11*. Да н текст овый ф а йл, сод ерж а щий строки. И склю чит ь из ф а йла слова begin и end. Окн о ра б от а ю щего прилож ен ия :
За д а ча 12. Да н т екст овый ф а йл, сод ерж а щий ст роки. П ереписа т ь в д ру гой ф а йл все ст роки д а н н ого ф а йла , за м ен я я в ка ж д ой ст роке сим вол ′ , ′ н а сим вол ′ . ′ Окн о ра б от а ю щего прилож ен ия :
15
За д а ча 13. Да н т екст овый ф а йл, сод ерж а щий ст роки. П ереписа т ь в д ру гой ф а йл все ст роки д а н н ого ф а йла в перевёрн у т ом вид е. Окн о ра б от а ю щего прилож ен ия :
За д а ча 14. Да н т екст овый ф а йл, сод ерж а щий ст роки. В ыя сн ит ь, им еет ся ли в н ём ст рока , н а чин а ю ща я ся с б у квы ′w′. Если д а , т о опред елит ь н ом ер первой из т а ких строк. Окн о ра б ота ю щего прилож ен ия :
За д а ча 15. Да н т екст овый ф а йл, сод ерж а щий строки. На йт и м а ксим а льн у ю д лин у ст роки в д а н н ом ф а йле. П ока за т ь са м у ю д лин н у ю
16 ст року ф а йла . Е сли т а ких строк н есколько, т о пока за т ь перву ю из н их. Окн о ра б от а ю щего прилож ен ия :
За д а ча 16*. Да н т екст овый ф а йл, сод ерж а щий строки. Бу д ем счит а т ь, чт о д лин а строк н е превыш а ет 30 сим волов. П реоб ра зова т ь ф а йл т а к, чтоб ы все ст роки б ыли отцен трирова н ы: строки, сод ерж а щие м ен ее 30 сим волов, д ополн я ю т ся сим вола м и зн а к под чёркива н ия ′_′ , т екст ст роки ра зм еща ет ся по цен тру поля ра зм ером 30 сим волов. Окн о ра б от а ю щего прилож ен ия :
За д а ча 17. Да н т екст овый ф а йл, сод ерж а щий целые числа . На йт и количест во чисел в ф а йле. Окн о ра б от а ю щего прилож ен ия :
17 procedure TForm1.Button1Click(Sender: TObject); var f : textfile; k, m : integer; begin if not opendialog1.Execute then exit; assignfile(f, opendialog1.FileName); label1.Caption:=Opendialog1.FileName; memo1.Lines.LoadFromFile(opendialog1.FileName); reset(f); k:=0; while not eof(f) do begin read(f, m); inc(k) end; closefile(f); label2.Caption:='Количест во чисел в ф а йле ра вн о ' + inttostr(k); end; За д а ча 18. Да н т екст овый ф а йл, сод ерж а щий целые числа . На йт и су м м у чёт н ых чисел ф а йла . Окн о ра б ота ю щего прилож ен ия :
За д а ча 19. Да н т екст овый ф а йл, сод ерж а щий целые числа . На йт и сред н ее а риф м етическое чисел в ф а йле. Окн о ра б от а ю щего прилож ен ия :
За д а ча 20. Да н т екст овый ф а йл, сод ерж а щий целые числа . На йт и су м м у чисел в ка ж д ой ст роке ф а йла . На йд ен н ые числа за писа т ь в н о-
18 вый т екст овый ф а йл по од н ом у в ст роке. лож ен ия :
Окн о ра б от а ю щего при-
procedure TForm1.Button1Click(Sender: TObject); var f, f1 : textfile; s, m : integer; begin if not opendialog1.Execute then exit; assignfile(f, opendialog1.FileName); label1.Caption:=Opendialog1.FileName; memo1.Lines.LoadFromFile(opendialog1.FileName); if not savedialog1.Execute then exit; assignfile(f1, savedialog1.FileName); label2.Caption:=savedialog1.FileName; reset(f); rewrite(f1); while not eof(f) do begin s:=0; while not eoln(f) do begin read(f, m); s:=s + m end; writeln(f1, s); readln(f) end; closefile(f); closefile(f1); memo2.Lines.LoadFromFile(savedialog1.FileName); end; За д а ча 21. Да н т екст овый ф а йл, сод ерж а щий целые числа . На йт и м а ксим а льн ое число в ка ж д ой строке ф а йла . На йд ен н ые числа за писа т ь в н овый т екст овый ф а йл по од н ом у в ст роке. Окн о ра б от а ю щего прилож ен ия :
19 За д а ча 22. Да н т екст овый ф а йл, сод ерж а щий ст роки. Созд а т ь н овый т екст овый ф а йл, в ка ж д ой строке кот орого за писа т ь д ва числа : количест во за пя тых и количест во точек в соот вет ст ву ю щей строке исход н ого ф а йла . Окн о ра б от а ю щего прилож ен ия :
За д а ча 23*. Да н т екст овый ф а йл, сод ерж а щий строки. Созд а т ь н овый т екст овый ф а йл, в ка ж д ой строке кот орого за писа ть все н а т у ра льн ые числа , вст реча ю щиеся в соот вет ст ву ю щей ст роке исход н ого ф а йла . Окн о ра б ота ю щего прилож ен ия :
За д а ча 24**. Да н т екст овый ф а йл, в кот ором встреча ю т ся д а ты (н а прим ер, 08.05.1672) . На йт и в э т ом ф а йле все окт я б рьские д а ты прош лого столетия (н а прим ер, 07.10.1931). За писа т ь э т и д а ты в н овый ф а йл по од н ой в ст роке. Окн о ра б ота ю щего прилож ен ия :
20 За д а ча 25. Да н т екст овый ф а йл, сод ерж а щий целые числа . На йт и количест во от рица т ельн ых чисел в ка ж д ой строке ф а йла . На йд ен н ые числа за писа т ь в н овый т екстовый ф а йл по од н ом у в ст роке. Окн о ра б от а ю щего прилож ен ия :
За д а ча 26. Да н т екст овый ф а йл, сод ерж а щий целые числа , количест во которых кра т н о 3. За писа т ь в н овый т екстовый ф а йл все числа исход н ого ф а йла по три числа в строке. Окн о ра б от а ю щего прилож ен ия :
За д а ча 27. Да н т екст овый ф а йл, в первой строке кот орого за писа н ы д ва числа n и m, а в след у ю щих ст рока х – пря м оу гольн а я т а б лица целых чисел ра зм ером n× m. За полн ит ь целочислен н ый м а ссив ра зм ером n× m числа м и из э той т а б лицы. В ка ж д ой ст роке м а ссива все э лем ен т ы, м ен ьш ие первого э лем ен т а д а н н ой ст роки м а ссива за м ен ить н у ля м и. П олу чен н ый м а ссив за писа т ь в н овый т екст овый ф а йл. Окн о ра б ота ю щего прилож ен ия :
21 procedure TForm1.Button1Click(Sender: TObject); var t, t1 : textfile; a : array of array of integer; n, m, i, j : byte; begin if not opendialog1.Execute then exit; assignfile(t, opendialog1.filename); label1.Caption:=opendialog1.filename; memo1.Lines.LoadFromFile(opendialog1.filename); if not savedialog1.Execute then exit; assignfile(t1, savedialog1.filename); label2.Caption:=savedialog1.filename; reset(t); rewrite(t1); readln(t, n, m); setlength(a, n, m); i:=0; while not eof(t) do begin j:=0; while not eoln(t) do begin read(t, a[i,j]); inc(j) end; inc(i); readln(t) end; for i:=0 to n-1 do for j:=0 to m-1 do if a[i,j]
22 За д а ча 29. Да н т екст овый ф а йл, в первой строке кот орого за писа н ы д ва числа n и m (m>n), а в след у ю щих строка х – пря м оу гольн а я т а б лица целых чисел ра зм ером n× m. За полн ит ь целочислен н ый м а ссив ра зм ером n× m числа м и из э той та б лицы. В ка ж д ой ст роке м а ссива у д а лит ь э лем ен т, н ом ер которого ра вен н ом еру соответ ст ву ю щей ст роки. П олу чен н ый м а ссив за писа т ь в н овый текст овый ф а йл. Окн о ра б от а ю щего прилож ен ия :
За д а ча 30. Да н т екст овый ф а йл, в первой ст роке кот орого за писа н ы д ва числа n и m, а в след у ю щих ст рока х – пря м оу гольн а я т а б лица целых чисел ра зм ером n× m. За полн ит ь целочислен н ый м а ссив ра зм ером n× m числа м и из э т ой т а б лицы. В ка ж д ой ст роке м а ссива у д а лит ь послед н ий отрица т ельн ый э лем ен т (счит а т ь, чт о в ка ж д ой ст роке ест ь от рица т ельн ый э лем ен т ). П олу чен н ый м а ссив за писа т ь в н овый т екст овый ф а йл. Окн о ра б ота ю щего прилож ен ия :
За д а ча 31. Да н т екст овый ф а йл, в первой строке кот орого за писа н ы д ва числа n и m, а в след у ю щих ст рока х – пря м оу гольн а я т а б лица целых чисел ра зм ером n× m. За полн ит ь целочислен н ый м а ссив ра зм ером n× m числа м и из э той т а б лицы. У д а лит ь из м а ссива строку , сод ерж а щу ю м а ксим а льн ый э лем ен т м а ссива . (Счит а т ь, что та кой э лем ен т ед ин ст вен н ый). П олу чен н ый м а ссив за писа т ь в н овый т екст овый ф а йл. Окн о ра б ота ю щего прилож ен ия :
23
За д а ча 32*. Да н текст овый ф а йл, в первой строке которого за писа н ы д ва числа n и m, а в след у ю щих строка х – за ш иф рова н н ый т екст , за писа н н ый в пря м оу гольн у ю т а б лицу сим волов ра зм ером n× m. П оря д ок след ова н ия сим волов (клю ч к ш иф ру ) у ка за н в д ру гой т а б лице т ого ж е ра зм ера , в кот орой за писа н ы целые числа от 1 д о n× m. Ра сш иф рова т ь т екст и резу льт а т за писа т ь в н овый т екст овый ф а йл. Окн о ра б от а ю щего прилож ен ия :
За д а ча 33**. Да н т екст овый ф а йл, в первой ст роке кот орого за писа н ы д ва целых числа n и m, во вт орой ст роке – целое число r, а в след у ю щих ст рока х – за ш иф рова н н ый текст , за писа н н ый в пря м оу гольн у ю т а б лицу сим волов ра зм ером n× m. Ч т об ы ра сш иф рова т ь т екст , н у ж н о ка ж д у ю ст року м а т рицы сд вин у т ь циклически впра во н а число позиций, ра вн ое н ом еру ст роки, а за тем ка ж д ый н ечетн ый ст олб ец сд вин у ть циклически вверх н а за д а н н ое число позиций r. Ра сш иф рова т ь т екст и резу льт а т за писа т ь в н овый т екст овый ф а йл. Окн о ра б от а ю щего прилож ен ия :
24
За д а ча 34. Да н т екст овый ф а йл, в первой строке кот орого за писа н ы д ва числа n и m, а в след у ю щих ст рока х – пря м оу гольн а я т а б лица целых чисел ра зм ером n× m. За полн ит ь целочислен н ый м а ссив ра зм ером n× m числа м и из э т ой т а б лицы. В ка ж д ой ст роке м а ссива вст а вит ь число, ра вн ое i∗100 ( i – н ом ер ст роки), после т рет ьего э лем ен т а . П олу чен н ый м а ссив за писа т ь в н овый текст овый ф а йл. Окн о ра б от а ю щего прилож ен ия :
За д а ча 35. Да н т екст овый ф а йл, в первой строке кот орого за писа н ы д ва числа n и m, а в след у ю щих ст рока х – пря м оу гольн а я т а б лица целых чисел ра зм ером n× m. За полн ит ь целочислен н ый м а ссив ра зм ером n× m числа м и из э той та б лицы. В ста вит ь в м а ссив перву ю ст року после т рет ьей ст роки м а ссива . П олу чен н ый м а ссив за писа т ь в н овый т екст овый ф а йл. Окн о ра б ота ю щего прилож ен ия :
25
3.5 Т ипизированные ф айлы Т ипизирова н н ый ф а йл сод ерж ит э лем ен ты од н ого типа . Тип э лем ен тов м ож ет б ыть лю б ым , кром е ф а йлового. Созд а ть и просм отрет ь т а кой ф а йл при пом ощи т екст ового ред а кт ора ка к т екст овый ф а йл н ельзя . П оэ том у об ра б отка т а ких ф а йлов д олж н а осу ществля т ься програ м м н ым пу т ём . На пом н им , что описа н ие ф а йловой перем ен н ой, соот вет ст ву ю щей типизирова н н ом у ф а йлу им еет вид : var <им я ф а йловой перем ен н ой> : file of <тип>; Для чт ен ия д а н н ых из типизирова н н ого ф а йла прим ен я ет ся процед у ра read. Список ввод а процед у ры read д олж ен сод ерж а т ь перем ен н ые т ого ж е типа , что и э лем ен т ы ф а йла . Для за писи в т ипизирова н н ый ф а йл использу ет ся процед у ра write, список вывод а которой д олж ен сод ерж а т ь перем ен н ые того ж е т ипа , что и э лем ен ты ф а йла . П роцед у ры readln и writeln д ля типизирова н н ых ф а йлов н е прим ен я ю т ся . Дост у п к т екст овым ф а йла м возм ож ен только послед ова т ельн о, то ест ь, когд а э лем ен т считыва ет ся или за писыва ет ся , у ка за т ель ф а йла перем еща ет ся к след у ю щем у по поря д ку э лем ен т у ф а йла . К типизирова н н ым ф а йла м м ож н о орга н изова т ь пря м ой д ост у п с пом ощью ст а н д а рт н ой процед у ры procedure seek( var f; n:longint); кот ора я перем еща ет ф а йловый у ка за т ель в т ипизирова н н ом ф а йле, свя за н н ом с ф а йловой перем ен н ой f, н а э лем ен т с н ом ером n. Ну м ера ция э лем ен тов в ф а йле н а чин а ет ся с н у ля . Для опред елен ия т еку щей позиции в ф а йле использу ет ся ф у н кция function filepos( var f):longint; Для опред елен ия ра зм ера ф а йла использу ет ся ф у н кция function filesize( var f):integer;
26 На прим ер, д ля у ст а н овки ф а йлового у ка за т еля н а послед н ий э лем ен т ф а йла f д ост а точн о за писа т ь seek(f, filesize(f)–1); н а первый э лем ен т ф а йла seek(f, 0); верн у т ься н а од ин э лем ен т н а за д seek(f, filepos(f)–1); П рим ен ен ие процед у р assignfile и closefile д ля т ипизирова н н ых ф а йлов н е отлича ет ся от текст овых ф а йлов. П роцед у ра reset, в от личие от т екст овых ф а йлов, д опу ска ет д ля т ипизирова н н ых ф а йлов н е т олько чт ен ие, н о и за пись в ф а йл. П роцед у ра rewrite, в отличие от т екст овых ф а йлов, д опу ска ет н е т олько за пись, н о и чтен ие из ф а йла . П роцед у ра append и ф у н кция eoln д ля т ипизирова н н ых ф а йлов н е ра б от а ю т. За д а ча 36. Созд а т ь т ипизирова н н ый ф а йл, сост оя щий из сим волов, введ ён н ых в окн о ввод а Edit. В ывест и сод ерж им ое созд а н н ого ф а йла в поле м ет ки Label.
Созд а н ие т ипизирова н н ого ф а йла сим волов: procedure TForm1.Button1Click(Sender: TObject); var f : file of char; i : integer; begin if not savedialog1.execute then exit; label1.Caption:=savedialog1.FileName; assignfile(f, savedialog1.FileName); rewrite(f); for i:=1 to length(edit1.Text) do write(f, edit1.text[i]); closefile(f); end; В ывод сод ерж им ого типизирова н н ого ф а йла в поле м ет ки Label2: procedure TForm1.Button2Click(Sender: TObject); var f : file of char; d : char; begin if not opendialog1.execute then exit; assignfile(f, opendialog1.FileName); reset(f); label2.Caption:=''; while not eof(f) do
27 begin read(f, d); label2.caption:=label2.caption + d end; closefile(f) end; За д а ча 37. Созд а т ь т ипизирова н н ый ф а йл, сост оя щий из сим волов, введ ён н ых в окн о ввод а Edit. Доб а вит ь в кон ец ф а йла сим вол ′ ! ′.
var Form1: TForm1; f : file of char; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin if not savedialog1.execute then exit; label1.Caption:=savedialog1.FileName; assignfile(f, savedialog1.FileName); rewrite(f); for i:=1 to length(edit1.Text) do write(f, edit1.text[i]); closefile(f); end; procedure TForm1.Button2Click(Sender: TObject); var c:char; begin if not opendialog1.Execute then exit; assignfile(f, opendialog1.FileName); label1.Caption:=opendialog1.FileName; reset(f); c:='!'; seek(f, filesize(f)); write(f, c); closefile(f) end; procedure TForm1.Button3Click(Sender: TObject); var d:char; begin if not opendialog1.Execute then exit; assignfile(f, opendialog1.FileName); reset(f); label2.Caption:='';
28 while not eof(f) do begin read(f, d); label2.caption:=label2.caption + d end; closefile(f) end; За д а ча 38. Созд а т ь т ипизирова н н ый ф а йл, сост оя щий из сим волов, введ ён н ых в окн о ввод а Edit. За м ен ит ь послед н ий сим вол ф а йла н а сим вол ′ ∗ ′ .
За д а ча 39. Созд а т ь т ипизирова н н ый ф а йл, сост оя щий из сим волов, введ ён н ых в окн о ввод а Edit. За писа ть в н овый типизирова н н ый ф а йл все м а лые а н глийские б у квы исход н ого типизирова н н ого ф а йла .
П роцед у ра об ра б отки соб ыт ия щелчка по кн опке В ы пол н и ть : procedure TForm1.Button2Click(Sender: TObject); var f, h : file of char; d : char; alp : string; begin alp:='abcdefghijklmnopqrstuvwxyz'; if not opendialog1.Execute then exit; assignfile(f, opendialog1.FileName); label1.Caption:=opendialog1.FileName; if not savedialog1.Execute then exit; assignfile(h, savedialog1.FileName); label2.Caption:=savedialog1.FileName; reset(f); rewrite(h);
29 while not eof(f) do begin read(f, d); if pos(d, alp) <> 0 then write(h, d) end; closefile(f); closefile(h) end; За д а ча 40. Созд а т ь т ипизирова н н ый ф а йл, сост оя щий из сим волов, введ ён н ых в окн о ввод а Edit. За писа ть в н овый типизирова н н ый ф а йл все циф ры из исход н ого типизирова н н ого ф а йла .
За д а ча 41. Созд а т ь т ипизирова н н ый ф а йл, сост оя щий из сим волов, введ ён н ых в окн о ввод а Edit. За м ен ит ь второй сим вол ф а йла сим волом ′ # ′ . ( Не использу я вспом ога тельн ый ф а йл. )
За д а ча 42. Созд а т ь т ипизирова н н ый ф а йл, сост оя щий из сим волов, введ ён н ых в окн о ввод а Edit. П ереписа т ь всё сод ерж им ое исход н ого т ипизирова н н ого ф а йла кром е пред послед н его э лем ен т а в н овый т ипизирова н н ый ф а йл.
30 За д а ча 43. Созд а т ь т ипизирова н н ый ф а йл, сост оя щий из сим волов, введ ён н ых в окн о ввод а Edit. За м ен ит ь в ф а йле все циф ры сим волом ′ ? ′ . ( Не использу я вспом ога тельн ый ф а йл. )
За д а ча 44. Доб а вить н овый сим вол ′ $ ′ в н а ча ло су щест ву ю щего типизирова н н ого ф а йла . ( И спользова т ь вспом ога т ельн ый ф а йл. )
type fch = file of char; var Form1: TForm1; f : fch; implementation {$R *.dfm} procedure copy(var t1, t2 : fch); var d : char; begin while not eof(t1) do begin read(t1, d); write(t2, d) end; end; procedure TForm1.Button1Click(Sender: TObject); var c : char; h : fch; begin if not opendialog1.Execute then exit; assignfile(f, opendialog1.FileName); label1.Caption:=opendialog1.FileName; assignfile(h, 'buf.dat'); reset(f); rewrite(h);
31 copy(f, h); reset(f); c:='$'; write(f,c); reset(h); copy(h, f); closefile(f); closefile(h) end; procedure TForm1.Button2Click(Sender: TObject); var d : char; begin reset(f); label2.Caption:=''; while not eof(f) do begin read(f, d); label2.caption:=label2.caption + d end; closefile(f) end; За д а ча 45. В ста вит ь н овый сим вол ′ + ′ после четвёрт ого по поря д ку э лем ен т а су щест ву ю щего типизирова н н ого ф а йла . ( И спользова т ь вспом ога т ельн ый ф а йл. )
За д а ча 46. У д а лит ь из су щест ву ю щего т ипизирова н н ого ф а йла все сим волы ′ , ′ . ( И спользова т ь вспом ога т ельн ый ф а йл.)
32 За д а ча 47. Созд а т ь т ипизирова н н ый ф а йл, сост оя щий из сим волов, введ ён н ых в окн о ввод а Edit. За м ен ит ь в ф а йле ка ж д у ю а н глийску ю б у кву ′ e ′ б у квой ′ i ′ . ( Не использу я вспом ога т ельн ый ф а йл. )
П роцед у ра об ра б отки соб ыт ия щелчка по кн опке В ы пол н и ть : procedure TForm1.Button2Click(Sender: TObject); var f:file of char; c, d:char; begin if not opendialog1.Execute then exit; assignfile(f, opendialog1.FileName); label1.Caption:=opendialog1.FileName; reset(f); c:='i'; while not eof(f) do begin read(f, d); if d='e' then begin seek(f, filepos(f)-1); write(f,c) end end; closefile(f) end; За д а ча 48. Созд а т ь т ипизирова н н ый ф а йл, сост оя щий из сим волов, введ ён н ых в окн о ввод а Edit. За м ен ит ь в ф а йле ка ж д ый проб ел сим волом ′ _ ′ . ( Не использу я вспом ога т ельн ый ф а йл. )
За д а ча 49. П ереписа т ь сод ерж им ое д а н н ого сим вольн ого ф а йла в н овый сим вольн ый ф а йл, за м ен я я ка ж д у ю встреча ю щу ю ся ст рочн у ю
33 а н глийску ю б у кву ( кром е б у квы z ) н а след у ю щу ю по а лф а вит у , а все ост а льн ые э лем ен ты ост а вля я б ез изм ен ен ия .
За д а ча 50*. Созд а ть сим вольн ый ф а йл, количест во э лем ен тов кот орого чётн о. П ереписа т ь сод ерж им ое д а н н ого сим вольн ого ф а йла в н овый сим вольн ый ф а йл, изм ен я я поря д ок э лем ен тов след у ю щим об ра зом : 1ый сим вол пом ен я т ь м ест а м и со 2ым , 3ий с 4ым и та к д а лее.
За д а ча 51*. П ереписа т ь все э лем ен ты д а н н ого сим вольн ого ф а йла в н овый сим вольн ый ф а йл в об ра тн ом поря д ке.
34 За д а ча 52. Созд а т ь т ипизирова н н ый ф а йл, сост оя щий из сим волов, введ ён н ых в окн о ввод а Edit. П ереписа т ь сод ерж им ое ф а йла в н овый сим вольн ый ф а йл, изм ен я я поря д ок э лем ен тов след у ю щим об ра зом : сн а ча ла все зн а ки а риф м етических опера ций, встреча ю щиеся в ф а йле, а потом все оста льн ые сим волы ф а йла .
var Form1: TForm1; f, h : file of char; П роцед у ра об ра б отки соб ыт ия щелчка по кн опке В ы пол н и ть : procedure TForm1.Button1Click(Sender: TObject); var c,d:char; str:string[4]; begin if not opendialog1.Execute then exit; assignfile(f, opendialog1.FileName); label1.Caption:=opendialog1.FileName; if not savedialog1.Execute then exit; assignfile(h, savedialog1.FileName); label2.Caption:=savedialog1.FileName; str:='+*-/'; reset(f); rewrite(h); while not eof(f) do begin read(f, d); if pos(d, str)<>0 then write(h, d) end; seek(f, 0); while not eof(f) do begin read(f, d); if pos(d, str)=0 then write(h, d) end; closefile(f); closefile(h) end; За д а ча 53. Созд а т ь т ипизирова н н ый ф а йл, сост оя щий из сим волов, введ ён н ых в окн о ввод а Edit. П ереписа т ь сод ерж им ое ф а йла в н овый сим вольн ый ф а йл, изм ен я я поря д ок э лем ен тов след у ю щим об ра зом :
35 сн а ча ла все зн а ки препин а н ия , встреча ю щиеся в ф а йле, а потом все ост а льн ые сим волы ф а йла .
За д а ча 54. Созд а ть т ипизирова н н ый ф а йл, состоя щий из целых чисел, введ ён н ых в ст олб ик в окн о т екст ового реа кт ора Memo. В ывест и сод ерж им ое созд а н н ого ф а йла в поле м ет ки Label.
type fint = file of integer; var Form1: TForm1; f : fint; implementation {$R *.dfm} П роцед у ра об ра б отки соб ыт ия щелчка по кн опке С оздать ф айл : procedure TForm1.Button1Click(Sender: TObject); var d, i : integer; begin if not savedialog1.execute then exit; label1.Caption:=savedialog1.FileName; assignfile(f, savedialog1.FileName); rewrite(f); for i:=0 to memo1.Lines.Count-1 do begin d:=strtoint(memo1.Lines.Strings[i]); write(f, d); end; closefile(f) end;
36 об ра б от ки соб ытия щелчка
П роцед у ра по кн опке ф айл : procedure TForm1.Button2Click(Sender: TObject); var d:integer; begin reset(f); label2.Caption:=''; while not eof(f) do begin read(f, d); label2.caption:=label2.caption + inttostr(d) + ' ' end; closefile(f) end;
П оказать
За д а ча 55. Да н т ипизирова н н ый ф а йл целых чисел. На йт и су м м у э лем ен тов ф а йла и н а йд ен н ое число за писа ть после послед н его э лем ен т а ф а йла .
За д а ча 56. Да н т ипизирова н н ый ф а йл целых чисел. П ереписа т ь сод ерж им ое ф а йла в н овый т ипизирова н н ый ф а йл целых чисел, изм ен я я поря д ок э лем ен т ов след у ю щим об ра зом : сн а ча ла все отрица т ельн ые э лем ен ты, а пот ом все н еот рица т ельн ые э лем ен т ы ф а йла .
За д а ча 57**. Созд а т ь т ипизирова н н ый ф а йл целых чисел, сод ерж а щий б ольш ое количест во н у лей. П ереписа ть сод ерж им ое ф а йла в н овый т ипизирова н н ый ф а йл целых чисел, за м ен я я гру ппы э лем ен тов, состоя щие из н ечёт н ого количест ва н у лей, н а од ин н у левой э лем ен т , а из чётн ого – н а д ва .
37
За д а ча 58*. Да н ы д ва типизирова н н ых ф а йла , причём первый a – целочислен н ый, а вт орой b – сим вольн ый. В ывести в поле м ет ки ря д ом с ка ж д ым числом первого ф а йла э лем ен т второго ф а йла с э тим н ом ером ; если э лем ен т а второго ф а йла с д а н н ым н ом ером н ет, то сооб щит ь об э том . И сход н ые ф а йлы a.dat 18 0 47 6 21 64 10 23 b.dat File,Edit,Search,View,Project
За д а ча 59. Да н т ипизирова н н ый ф а йл целых чисел. П ереписа т ь сод ерж им ое ф а йла в н овый типизирова н н ый ф а йл целых чисел, д об а вив перед первым э лем ен т ом количест во чёт н ых чисел исход н ого ф а йла , а
38 после послед н его э лем ен т а – количест во н ечёт н ых чисел исход н ого ф а йла . П олу чен н ый ф а йл вывести в поле м ет ки. И сход н ый ф а йл: 39 15 62 27 8 11 43 16
За д а ча 60. Да н типизирова н н ый ф а йл целых чисел. За м ен ит ь ка ж д ое число ф а йла , кром е первого, н а ост а ток от д елен ия д а н н ого числа н а первое число ф а йла . ( Не использу я вспом ога тельн ый ф а йл. ) И сход н ый ф а йл: 17 58 19 35 63 15 98
За д а ча 61*. Да н т ипизирова н н ый ф а йл целых чисел. Ч исло э лем ен тов ф а йла кра тн о 5. За писа т ь в н овый типизирова н н ый ф а йл н а иб ольш ее зн а чен ие первых 5 э лем ен т ов, за т ем след у ю щих 5 э лем ен т ов и т а к д а лее. И сход н ый ф а йл: 14 8 -23 59 0 -18 31 67 24 52 -98 -45 -110 -37 -5 16 0 48 20 7
За д а ча 62**. Да н т ипизирова н н ый ф а йл, сод ерж а щий ра зличн ые целые числа . На йти количест во э лем ен т ов в н а иб олее д лин н ой ″пилооб ра зн ой ″ послед ова т ельн ости ф а йла , т о ест ь т а кой, чт о ai-2 < ai-1 > ai < ai+1 > …
39 И сход н ый ф а йл: 14 8 -23 59 0 -18 31 67 24 52 -98 -45 -110 -37 -5 16 0 48 20 7
3.6 Н етипизированные ф айлы С т очки зрен ия Object Pascal, н етипизирова н н ый ф а йл пред ст а вля ет соб ой послед ова т ельн ост ь б а йтов, сод ерж а щих д а н н ые произвольн ого т ипа и стру кт у ры. Осн овн ое н а зн а чен ие н ет ипизирова н н ых ф а йлов – об еспечен ие совм естим ости с лю б ым и т ипа м и ф а йлов и орга н иза ция высокоскоростн ого об м ен а д а н н ым и м еж д у вн еш н им и за пом ин а ю щим и у ст ройства м и и опера т ивн ой па м я т ью . Описа н ие н етипизирова н н ого ф а йла f им еет вид : var f : file; В процед у ра х reset и rewrite д ля н ет ипизирова н н ых ф а йлов у ка зыва ется д ополн ительн ый па ра м етр RecSize, чт об ы за д а т ь ра зм ер за писи, использу ем ой при перед а че ф а йла : procedure reset (var f : file {; RecSize : word}); procedure rewrite (var f : file {; RecSize : word}); Е сли па ра м етр RecSize н е у ка за н , то прин им а ем а я по у м олча н ию д лин а за писи ра вн а 128 б а йт а м . Длин а за писи изм еря ет ся в б а йт а х и м ож ет б ыт ь за д а н а произвольн ым целым числом – от 1 б а йт а д о 2 Гб а йт. Е сли за д а т ь д лин у за писи, кра т н у ю 512 б а йт, то э т о позволит выполн я т ь опера ции чтен ия -за писи д ля н ет ипизирова н н ого ф а йла с м а ксим а льн ой скорост ью . За исклю чен ием процед у р read и write д ля н етипизирова н н ых ф а йлов м ож н о использова т ь все ст а н д а рт н ые процед у ры, кот орые д опу ска ет ся использова т ь д ля т ипизирова н н ых ф а йлов. В м есто процед у р read и write использу ю т ся процед у ры blockread и blockwrite, позволя ю щие пересыла ть д а н н ые с высокой скорост ью : procedure blockread( var f : file; var buf; count : integer; {var at : integer}); procedure blockwrite( var f : file; var buf; count : integer; {var at : integer}); Зд есь f – им я ф а йловой перем ен н ой, свя за н н ой с н ет ипизирова н н ым ф а йлом , buf – перем ен н а я , в кот ору ю б у д у т пом еща т ься д а н н ые при чтен ии из ф а йла или из которой б у д у т извлека т ься д а н н ые при за писи в ф а йл. Count – па ра м ет р целого т ипа , у ка зыва ю щий, ка кое
40 количест во за писей н еоб ход им о прочит а т ь или за писа ть за од н о об ра щен ие к ф а йлу . П ерем ен н а я buf д олж н а им ет ь д лин у н е м ен ьш у ю , чем count∗RecSize б а йт. Необ я за т ельн ый па ра м етр at сод ерж ит количест во реа льн о прочит а н н ых или за писа н н ых за писей. За д а ча 63. Сост а вит ь програ м м у д ля копирова н ия ф а йла . Е сли за д а т ь д лин у за писи ( RecSize ), кра тн у ю 512 б а йт , то скорост ь копирова н ия б у д ет б ольш а я , н о т а к ка к д лин а ф а йла в об щем слу ча е н е кра т н а за д а н н ой д лин е за писи, т о в ф а йле б у д у т прису т ст вова т ь н еполн ые за писи. В ча стн ости, если д лин а ф а йла ока ж ет ся м ен ьш е RecSize, то созд а н н ый в резу льта т е копирова н ия ф а йл б у д ет пу ст ой. Е сли за д а ть д лин у за писи, ра вн у ю од н ом у б а йт у , т о э т о позволит точн о отра зить ра зм ер лю б ого ф а йла , т а к ка к в э т ом слу ча е в ф а йле н е м огу т прису т ст вова т ь н еполн ые за писи, т о ест ь за писи с д лин ой м ен ьш ей, чем RecSize. Ра зм ер од н ой за писи в процед у ра х reset и rewrite у ст а н овим ра вн ым 1 б а йт у . В процед у ра х blockread и blockwrite па ра м етр count у ст а н овим ра вн ым 10 (за пись и счит ыва н ие б у д у т осу ществля т ься по 10 за писей). Зн а чен ие па ра м етра count д олж н о б ыт ь ка к м ож н о б ольш е при копирова н ии б ольш их ф а йлов. В ка чест ве б у ф ера б у д ем использова ть перем ен н у ю b, я вля ю щу ю ся м а ссивом т ипа byte, сод ерж а щим 10 э лем ен тов. Для вывод а сооб щен ия об окон ча н ии переписыва н ия ф а йла б у д ем использова т ь процед у ру showmessage(str), па ра м етром кот орой я вля ет ся строка вывод им ого сооб щен ия . procedure TForm1.Button1Click(Sender: TObject); var f1, f2:file; at1, at2:integer; b:array[1..10] of byte; begin if not opendialog1.Execute then exit; assignfile(f1, opendialog1.filename); if not savedialog1.Execute then exit; assignfile(f2, savedialog1.filename); reset(f1, 1); rewrite(f2, 1); repeat blockread(f1, b, 10, at1); blockwrite(f2, b, at1, at2); until at1<10; label1.Caption:='И сход н ый ф а йл ' + opendialog1.filename + #13 + 'Количест во за писей ' + inttostr(filesize(f1)); label2.Caption:='Копия ' + savedialog1.filename + #13 + 'Количест во за писей ' + inttostr(filesize(f2)); closefile(f1); closefile(f2); showmessage('За пись за кон чен а '); end; На прим ер, пу ст ь копиру ет ся ф а йл C:\files\j.dat, сод ерж а щий след у ю щу ю ин ф орм а цию :
41 file,edit,search,view,project,run. Количест во за писей э того ф а йла ра вн о 34. П оэ том у н а первых т рёх ш а га х цикла repeat зн а чен ие перем ен н ой at1 ра вн о 10, а н а чет вёрт ом ш а ге at1=4<10 и, след ова тельн о, цикл за верш ит свою ра б от у . Окн о прилож ен ия б у д ет выгля д ет ь след у ю щим об ра зом :
42
Л итерату ра. 1. Ка н д зю б а С.П . Delphi 5. Ба зы д а н н ых и прилож ен ия . Л екции и у пра ж н ен ия / С.П . Ка н д зю б а , В .Н. Гром ов – К. : Диа Соф т, 2001. – 592 с. 2. Ф а рон ов В .В . Сист ем а програ м м ирова н ия Delphi / В .В . Ф а рон ов – СП б . : БХ В – П ет ерб у рг, 2004. – 912 с.
43
С одерж ание 3.1 Диа логовые окн а .......................................................................................3 3.2 Ф а йловые типы и ф а йловые перем ен н ые............................................5 3.3 Ст а н д а ртн ые под програ м м ы д ля д ост у па к ф а йла м ..........................6 3.4 Т екст овые ф а йлы.......................................................................................7 3.5 Т ипизирова н н ые ф а йлы...........................................................................25 3.6 Нет ипизирова н н ые ф а йлы.......................................................................39 Л итера т у ра .........................................................................................................42
А вт ор Са д овска я Ольга Борисовн а Ред а кт ор Т ихом ирова О.А .