Ф Е Д Е Р АЛ Ь Н О Е АГ Е Н Т С Т В О П О О Б Р АЗО В АН И Ю В О Р О Н Е Ж С К И Й Г О С У Д АР С Т В Е Н Н Ы Й У Н И В ...
7 downloads
509 Views
1MB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Ф Е Д Е Р АЛ Ь Н О Е АГ Е Н Т С Т В О П О О Б Р АЗО В АН И Ю В О Р О Н Е Ж С К И Й Г О С У Д АР С Т В Е Н Н Ы Й У Н И В Е Р С И Т Е Т
С адовская О .Б .
П рограммирование в среде 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]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