Паскаль програмдау тіліндегі файлдармен жұмыс - Информатика - Рефераттар - Скачать Рефераты, слайды, тесты - Қазақстандық оқушыларға тегін рефераттар сайты
MENU
Главная » Файлы » Рефераттар » Информатика

Паскаль програмдау тіліндегі файлдармен жұмыс
[ · Скачать удаленно (183.0Kb) ] 21.11.2012, 17:48
Файлдардың түрлері

Осыған дейін, біз мәліметтерді пернетақтадан негізіп, оларды экранға шығардық, программа жұмысы кезінде олар компьютердің оперативті жадында сақталатын да, есептеулер біткеннен кейін бұл мәліметтер жоғалып кетеьін. Жұмыс нәтижесін келешекте пайдалана алу үшін, мысалы, оларды есептеулерге пайдалану үшін немесе жңа мәліметтерді алу үшін, оларды есте сақтап қалу керек. Ондай тәсілдердің ьірі мынадай: нәтиже экранға шыққан соң қолға қаламсап (қарындаш) және бір бет қағаз алып, бұл мәліметтерді жазып алу. "Дербес компьютерлер” дәуірінің басында оларды "үй тапсырмасы” деп атаған да, шын мәнінде солай болған. Қазіргі кездегі дербес компьютерлердің барлығы ақпаратты сақтауға арналған арнайы құрылғылармен жабдықталған. Қызметтеріне қарай оларды: магниттік ақпарат тасымалдаушылар немесе жазылатын CD- дискілер деп атайды. Ақпаратты сақтау осы тасымалдаушыларда ұйымдастырылады, бұл жағдайда біз алған нәтижелерді солардың жадында сақтаймыз. Барлық мәліметтер осы тасымалдаушыларда файлдар түрінде сақталады.
Файл дегеніміз – мәліметтер сақтауға арналған сыртқы тасымалдаушыдағы жадының ат қойылған аймағы (бөлігі).
File (ағылшын тілінен аударылғанда) бума, іс қағаздар жинағы, сонымен қатар ақпаратты сақтау деген мағынаны білдіреді.
Borland Pascal-да файлдарды екі негізгі белгісі бойынша топтастыруға болады:
файлдың типі бойынша (оның логикалық құрылымына )
файл элементтеріне қатынау тәсілі бойынша
Типтері бойынша файлдар шартты тұрде үш түрге бөлінеді:
мәтіндік файл;
типтік файл;
типтік емес файл.
Біз көбінесе мәтіндік және типтік файлдармен жұмыс істейміз.
Қатынау тәсілі бойынша файлдар келесідей бөлінеді:
Тікелей қатынау файлдары
Кезекпен қатынау файлдары

Олардың айырмашылығы тікелей қатынау файлдарында арнайы
процедуралар және функцияларды пайдалана отырып, мәліметтерді, олардың файлдағы орнына тәуелсіз, оқуға немесе жазуға болады, ал кезекпен қатынау файлында оның ортасында немесе соңында тұрған мәліметті оқу үшін, оның алдындағы мәліметтердің барлығын оқуға тура келеді. Мәтіндік файлдар кезекпен қатынау файлдарына жатады, ал типтік файлдар тікелей қатынау файлдарыа жатады.
2. Мәтіндік файлға мәліметтер жазу.
Бір өлшемді массив.
Ең қарапайым файл типі мәтіндік файл болып табылады. Бұл файлдағы мәліметтер типтік және типтік емес файлдардағыдай машиналық кодта емес, сан, әріп және басқа пернетақта символдары түрінде (ASCII кодында) беріледі. Сондықтан мұндай файлдар мазмұны оңай қаралады, оңай өзгереді және оларды кез келген мәтіндік редактордың, соның ішінде Borland Pascal ортасының да көмегімен өзгертуге болады. Өздеріңіз білетіндей 2.1.2.-ні қара, мәтінді теру кезінде жаңа жолды енгізу үшін "Enter” пернесін басу керек, осы кезде арнайы код гинерацияланады—ол жол соңы коды, ал файлды сыртқы сақтау құрылғысына жазған кезде де арнайы код гинерацияланады—ол файл соңы коды. Мәтіндік файлды оқығанда бұл кодтар көрінбейді.
Келесі есепті шешіп көрейік: Пернетақтадан бірнеше сандар енгізіп, оларды "mayFile.in” атты мәтіндік типтегі файлға жазу керек.
Есепті кезеңдерге бөлейік:
пернетақтадан мәліметтерді енгізу
оларды "mayFile.in” атты файлға жазу керек.

Бірінші кезеңді орындау үшін:
пернетақтадан енгізілетін сандардың мөлшерін (массив өлшемін) көрсету керек
Сан мөлшерін білген соң, параметрлі циклді қолдану арқылы массив элементтеріне осы сандардың нақты мәндерін меншіктейміз
Осы әрекеттерді орындау үшін қолданылатын айнымалыларды сипаттаймыз. Айталық, санымыз 100-ден көп емес және олар басқа да процедураларда қолданылатындықтан, оларды ауқымды айнымалыларды баяндау блогында сипаттаймыз.
рrogram Misal_F1;
var
San: array [1..100] of integer;
i, SanMolcher: integer;

Мәліметтерді енгізу процедурасы келесі түрде болады:
procedure init; begin readln (SanMolcheri);
for i:=1 to SanMolcheri do
begin
write ("San[",i,”]=’);
readln(San[i]);
end;
Мәліметтерді өңдеу процедурасы әзірге бізге қажет емес, сондықтан ол қызмет атқармай-ақ қойсын.
procedure work ;
begin
end;
Енді екіншісі кезеңді қарастырайық, яғни мәліметтерді «mayFile.in» атты мәтіндік типтегі файлға жазу керек. Алдымен өз файлмызды байланыстыратын, айналымның атауын беру керек.Айталық, ол айналымның атауы FileOut болсын, содан кейін біз оны мәтіндік файл ретінде сипаттаумыз керек. Бұл айнымалыны шығару процедурасында пайдаланатын болғандықтан, оны жергілікті айнымалы ретінде сипаттаймыз:
var
FileOut: text;
Одан кейін біз программаға, "мәтіндік” типтегі FileOut атты айнымалының, біздің "mayFile. in” атты нақты файлмызды белгілейтінін көрсетуіміз керек. Ол үшін assign(Name Var, Name File)процедурасы қолданылады. Name Var—бұл файлды белгілеу үшін берілген айнымалы аты, біздің жағдайда Name Var—дың орнына File Out сөзін жазасыз. NameFile—бұл біз жұмыс істейтін файлдың аты, біздің жағдайда”mayFile.in”.
Файл аты мен оның кеңейтілуінен басқа орналасқан орнына қарай сипатталатыны да белгілі. Мысалы,”c,\bp\bin\MyFile.in”. Ал егер толық аты берілмеген жағдайда, үнсіз келісім бойынша сіздің программаңыз орналасқан ағымдағы каталог қолданылады. Енді сіз берілген файлды ашып, оған мәліметтер жазылатындығын көрсетуіңіз керек. Ол үшін rewrite (Name Var)процедурасы қолданылады. Мұндағы, Name Var-бұл файлды белгілеу үшін берілген айнымалы аты, біздің жағдайда Name Var—дың орнына FileOut атауы жазылады. rewrite(
Name Var) процедурасы—файлды жазу үшін ашады және көрсеткішті файлдың басына орналастырады.
Енді мәліметтерді файлға жазуға бәрі дайын. Ол үшін бұрынан белгілі Write() және Write() процедураларын қолданамыз. Жазулар экранға емес файлға жазылуы үшін, мәліметтерді шығару бағытын көрсетеміз. Яғни, жақшаның ішіндегі мәліметтерді жазатын айнымалы атауының алдында, бізді файлмен байланыстыратын assign() процедурасындағы айнымалы атуын көрсетеміз. Айталық, берілгендерді шығыс файлына бір жолға жазу керек болсын, бұл жағдайда бірінші мән ол енгізілетін сандардың мөлшері болады. Жаңа жолға көшу болмайтындықтан,Write() процедурасын қолданып, бастапқыда файлға SanMolcheri айнымалысын мәнін жазамыз да, содан кейін параметрлі циклді пайдаланып енгізу процедурасында енгізілген сандарды жазамыз. Барлық мәліметтер файлға жазылып болған соң, файлды жазу керек. Ол Close() процедурасының көмегімен орындалады.
Close(Name Var) процедурасы—файлдың соңына, файл соңы белгісін жазып, оны жабады. Егер файл Close() процедурасымен жабылмаған болса, онда мәліметтер сақталынбайды.

Мәліметтерді файлға жазу процедурасы қандай болатынын қарастырып көрелік:

procedure exi;
var
FileOut:text;
begin
assing(FileOut,`mayFile.in`);
rewrite(FileOut);
write(FileOut, SanMolcheri);
for i=1 to SanMolcheri do
write(FileOut,San[i]);
close(FileOut);
end;
негізі программаның мәтіні өзгеріссіз қалады
begin
init;
work;
exi;
end.
Осы программаны ‘Misal_F1’ атымен дискіге жазып, оны орындауға жіберіңіз. Программа жұмысын аяқтағаннан кейін, BP редакторының көмегімен біздің программамыз құрған `mayFile.in` файлын ашып, оның мазмұнын көріңіз. Өкінішке орай сандар файлда бос орынсыз тіркесіп жазылған болып шығады. Мұндай жазбадан қандай сандар жазылғанын анықтау қиындық тудырады. Бұл жағдайды қалай түзетуге болады?
Ол үшін, сандары бір бірінен дәл ажыратудың екі мүмкіндігі бар:
а.әрбір мәнді бос орын (``)белгісі арқылы бөліп жазу
в.әрбір мәнді жаңа жолға жазу (баған бойынша).
Бірінші жағдайда енгізілетін айнымалы атауынан кейін бос орын (``) белгісін қоямыз.
write(FileOut, SanMolcheri,``);
for i:= to SanMolcheri do
write(FileOut,San[i],``);
екінші жағдай үшін, writeln() процедурасын қолданамыз:
writeln(FileOut,SanMolcheri);
for i=1 to SanMolcheri do
writeln(FileOut, San[i] );
Тапсырма
1.Енгізілетін мәліметтер `mayFile1.in` атауымен берілген файлға, бір жолға және бос орын арқылы жазылатындай етіп , Misal_F1 программасын өзгерту керек. Жаңа программаны Misal_F2 атымен сақтаңыз.
2. Misal_F1 программасында берілген мәліметтер `mayFile2.in` файлына әрбір мәлімет жаңа жолдан жазылатындай етіп, өзгерту керек. Жаңа програманы Misal_F3 атымен сақтаңыз.
3.Пернетақтадан 20 жол мәтін енгізіп, оны шығу файлына жазатын, Misal_F4 атауымен сақталатын программа жазыңыз.

3. Мәтіндік файлға мәліметтер жазу.
Екі өлшемді массив.
Алдыңғы тақырыпта сіз мәтіндік файлдарды ашуды, оған ақпараттарды жазуды үйреніңіздер. Write()- процедурасын пайдаланып мәліметтерді бір жолға, ал writeln()—процедурасын пайдаланып оларды бағанға жазуды көрдік. Осы білгендерімізді пайдаланып, келесі есепті шешіп көрелік:
Пернетақтадан, өлшемі 100х100, элементтері бүтін сан болатын, екі өлшемді массив енгізіледі. Осы массивті элементтерінің орналасу реті бойынша, `МayFile5.in` атымен, мәтіндік файл түрінде жазатын, программа жазу керек.
Бұл есеп те, алдыңғы тақырыпта қарастырылған есепке ұқсас, екі негізгі кезеңнен тұрады:
1.Пернетақтадан мәліметтерді енгізу
2.Оларды атауы `МayFile5.in` болатын, файлға жазу керек.
Бірінші кезеңді орындау үшін :
Пернетақтадан енгізілетін, массив өлшемдерінің нақты мәндерін кіргізу;
Массив өлшемдерін біле отырып параметрлі цикл операторын қолданып массив элементтеріне нақты мәндерді меншіктеу.
Мәліметтерді енгізу процедурасының мәтінін Misal_8 программасынан алуға болады. Ал мәліметтерді өңдеу процедурасы өзгеріссіз қалатындықтан, Misal_F1программасындағыдай болады.
Массив элементтерін `МayFile5.in` файлына жазу процедурасының қандай болатындығын қарастыралық:
procedure exi;
var
FileOut: text;
begin
{нақтылы файлмен айнымалы арасындағы байланыс}
assing (FileOut,`mayFile.in`);
{файлды жазуға дайындау}
rewrite(FileOut);
{массив өлшемдерiн жазу және курсорды жаңа жолға көшiру}
writeln(FileOut, JolSany,``, BaganSany);
for i=1 to JolSany do
begin
{массив элементтерiн бос орын арқылы жолға жазу}
for j=1 to BaganSany do
write(FileOut,San[i,j],``);
{j-циклiн аяақтаған соң, курсорды жаңа жолға көшiру}
writeln(Fileout);
end;
{файлды жабу}
close(FileOut);
end;
Негiзгi программа мәтiнiнiң өзгерiсiз қалатындығын айтпаса да болады. Осы программаны Misal_F5 атымен сактаңыз. Программаны iске қосудың алдымен, келесi әрекеттердi:
КурсордыExi процедурасын сипаттайтын жолдың басына қойыңыз;
Негiзгi менюдi Debug iшкi менюiн ашыңыз;
Add brekpoint… әрекетiн тандаңыз;
Enter пернесiн басыңыз.
Экранға Add brekpoint… (тоқтату нүктесiн қосу) сұхбат терезесi шығады (2.8-сурет).”Line number” (жол нөмері)өрісінде, курсор тұрған жолдвң нөмірін көрсетіп тұрады, ол Exi процедурасын сипаттайтын жолдың басын көрсетеді.
"Ok” батырмасын (сұхбат терезесіндегі) немесе "Enter” пернесін басыңыз.
Редактор терезесіндегі бұл жол басқа түспен бөлінеді. Енді Ctrl+F9 пернелерін басу арқылы программаны іске қосыңыз. Пернетақтадан бастапқы мәндерді енгізіңіз. Мәліметтерді енгізген соң программа жұмысын тоқтатады және компьютердің экранында қайтадан редактор терезесі шығады. Яғни, біз өзіміздің әрекеттеріміз арқылы программа жұмысын көрсетілген жолда тоқтатуға нұсқау бердік. Жұмысты қайтадан жалғастырву үшін "Ctrl+F9” пернелерін басуымыз керек немесе F7 пернесін пайдаланған тиімді және Exi процедурасының қалай жұмыс істейтінін бақылап көре аламыз.
Бұл әрекеттер, программаның жеке бөліктерімен жұмыс жасағанда (жүріп өткенде) тиімді, себебі үлкен өлшемді программаларды толығымен жүріп өту жалықтырады және керек емес. Олай болса, программалаудың құрылымдылық тәсілін (1.5 тақырып) қолдай отырып бізде бары:
Жеке модульдермен "жұмыс істеу” (программалау) мүмкіндігі.
Бір деңгейдегі "ойша” машиналардың тәуелсіздігі, программаның жекеленген бөліктерін, программаш\ның басқа бөліктеріне әсер етпей тәуелсіз жетілдіруге мүмкіндік береді. Э. Дейкстр атап өткендей: "... программаны жетілдіру, бір түрдегі (ойша) машиналардың басқа қолайлы машиналарға ауысуынан туындайды”.
Құрылымдылық программаның жеке бөліктерімен жұмыс жасау.
Процедура мәтінімен жүріп өткенде құрама операторлардың жұмысына көңіл бөліңіз.

begin
{массив элементтерiн бос орын аркылы жолга жазу}
forj:=1 to BaganSany do
write (FileOut, San[i,j],``);
{j-цикл аякталган сон, курсорды жана жолга кошiру}
writeln(FileOut);
end;
Тоқтату нүктесін алып тастау үшін, келесі әрекеттерді орындаймыз:
Негізгі менюді бес\лсенділеңіз;
Негізгі менюден Debug ішкі менюін ашыңыз;
Breakpoints пернесін басыңыз.
Enter пернесін басыңыз.
Экранда программаға қойылған барлық тоқтату нүктелерінің тізімі көһрсетілген, Breakpoints… (тоқтату нүктелері) сұхбат терезесі (2.9-сурет) шығады.
Қажетті элементті белгілеңіз;
"Delete” (сұхбат терезесінен) батырмасын немесе "D” (пернетақтадан) пернесін басыңыз.
Белгіленген тоқтату нүктесі тізімнен алынып тасталады. Егер сіз барлық тоқтату нүктесін алып тастағыңыз келсе-- "Clear all” батырмасын басу керек.
Тапсырма
Егер exi ішкі программасындағы write және writeln процедураларындағы бірінші параметр FileOut көрсетілмесе San массиві қайда жазылған болар еді?
Егер осы параметр тек writeln процедурасында көрсетілмеген болса не өзгереді?

4. Мәтiндiк файлдан мәлiметтердi оқу
Өткен тақырыптарда сіздер, мәліметтерді мәтіндік файлға жазуды үйреніңіздер. Енді оларды қайтадан файлдан қалай оқуға болатынын қарастырамыз.
Ол үшін `mayFile1/in` файлын пайдаланамыз. Мәліметтерді файлға жазу кезіндегідей, біздің файлмызды байланыстыратын айнымалыға атау беруіміз керек. Айталық, ол атау Fileln болсын, содан кейін біз оны мәтіндік файл ретінде сипаттауымыз керек. Бұл айнымалыны біз енгізу процедурасында пайдаланатын болғандықтан, сол процедураның жергілікті айнымалысы ретінде сипаттаймыз.
var
Filelnt:text;
Одан кейін біз программада, "мәтіндік типті ” Fileln айнымалысы, біздің
`mayFile1.in` атауымен берілген нақтылы файлмызды белгілейтіндігін көрсетуіміз керек. Ол үшін assing(NameVar,NameFile)-процедурасын қолданады.
Енді файлдан мәліметтерді оқу үшін, берілген файлды ашуымыз керек. Ол үшін, reset(NameVar)—процедурасында қолданады, мұндағы NameVar-сіздің файлды белгілеуге берген айнымалыңыздың атауы, біздің жағдайымызда, ол NameVar-Fileln. Reset(NameVar)-процедурасы, мәліметтерді оқуға файлды ашады және курсорды файлдың басына орналастырадв. Егер ондай жоқ болса, қателік туралы хабарлама береді. Енді мәліметтерді файлдан оқуға барлығы дайын болды. Ол үшін өзімізге бұрынан таныс Read() және Readln() процедураларын пайдаланамыз. Мәліметтерді оқу пернетақтадан емес, файлдан жүзеге асу үшін, мәліметтерді оқудың жолын көсетеміз. Яғни, жақшалардың ішіне, assing()- процедурасының көмегімен біздің файлмызды байланыстырып тұрған, айнымалының атауын көрсетеміз.
`MayFile.in`файлындағы бірінші сан, файлдағы барлық сандардардың мөлшерін көрсетеді. Сондықтан, алдымен файлдан
Sanau айнымалысының мәнін оқытамыз,содан кейін параметрлі циклді қолданып, файлдағы сандардың мәндерін оқимыз. Мәліметтер толық оқылып болған соң, өзімізге таныс Close() процедурасын пайдаланып, файлды жабу керек.
Енді, мәліметтерді фйалдан оқу процедурасы қандай болатындығын көрелік:
procedure lnit;
var
i:byte;
Fileln:text;
begin
assing(fileln,`mayFile1.in`);
reset(Fileln);
readln(Fileln,Sanau);
for i:=1 to Sanau do
read(Fileln,San[i]);
close(Fileln);
end;
Дәл осындай, егер өлшемдері белгілі болса, мәліметтерді екі өлшемді массивтен оқу да онша қиыншылық туғызбайды. `MayFile.in5` файлынан мәліметтерді оқитын программадан үзінді мысалға келтірейік:
procedure lnit;
var
i,j:byte;
{айнымалы атауын мәтiндiк файл түрiнде сипаттау}
Fileln :text;
begin
{айнымалыны нақтылы файл атымен байланыстыру}
assing(Fileln,`mayFile5.in`);
{файлды оқуға ашу}
reset(File);
{массив өлшемдерiн оқу, курсорды жаңа жолға көшiру}
readln(Fileln,JolSany,BaganSany);
{массив элементтерiн жол және баған бойынша оқу}
for:=1 to JolSany do
read(Fileln,San[i,j]);
{файлды жабу}
close(Fileln);
end;
Мынаған көңіл аударыңыз, массив элементтерін оқу кезінде, Readln() процедурасын қолданбай, тек қана Read() процедурасы қолданылды. Бұл мүмкін еді, себебі массив элементтерін оқу үшін оның өлшемдері алдын ала белгілі болды. Егер мәтіндік файлдағы элементтер жазбалар саны алдын ала белгісіз болса, онда қайталану саны белгісіз цикл операторларын қолдануға тура келеді.
Тапсырма
Бір өлшемді массивті құрайтын `MayFile.in` файлынан мәліметтерді оқып, оларды компьютре экранына шығаратын программа жазыңыз және оны `MayFile6.pas` атымен сақтаңыз.
Екі өлшемді массивті құрайтын `MayFile5.in` файлынан мәліметтерді оқып, оларды компьютер экранына программа жазып және оны `MayFile7.ipas` атымен сақтаңыз.
MayFile6.pas` программасын пайдаланып, `MayFile2.in` файлынан мәліметерді оқыңыз. Алынған нәтижені 1 тапсырма нәтижесімен салыстырыңыз. Нәтижені түсіндіріңіз.
BP мәтіндік редакторын пайдаланып `MayFile1.in`, `MayFile2.in` және `MayFile5.in` файлдарындағы массив өлшемдерін немесе жазбалар саные көрсететін жолды алып тастаңыз.


5. Мәтiндiк файлдан мэлiметтердi оку
(жалғасы)
Егер мәтіндік файлдардағы жазбалар саны белгілі болса, онда мәліметтерді оқу онша қиын емес. Ал, егер мәтіндік файлдағы жазбалар саны белгісіз болса ше, онда не істейміз? Егер сізге орындалатын әрекеттердің саны белгісіз болса, онда қайталану саны белгісіз цикл операторларын қолдануға болатындығын білесіз.2.8.2 тақырыбында мәтіндік файлдардың қасиеттерін сипаттаған болатынбыз, онда файлдың соңына файл соңын көсететін белгі код қойылатыны жайлы айтылған. Олай болса, мәліметтерді оқу файлдың соңы табылғанша жалғаса береді. Егер файл бос болса, яғни онда ешқандай жазба жоқ, онда одан мәліметтерді оқуға болмайды. Осы айтылғандарды тұжырымдай келе, алғы шарт циклін қолдану керек екеніне көзіміз жетті. Файл соңы белгісін анықтау үшін, EOF(Name Var)-процедурасын қолданады ағылшын тілінде EndOf File—файл соңы деген сөзден қысқартылып алынған. Жақшаның ішіне assing() процедурасында көрсетілген файлдың нақтылы атымен байланыстыратын айнымалы атауы жазылады. EOF(Name Var)-процедурасының мәні, False(жалған)-болады егер файл соңына жетпеген болса Ture(ақиқат)-болады, егер файлдың соңы анықталған болса. Олай болса, алғы шарт циклін қолданғанда Not EOF(Fileln)-шарты әзірше ақиқат болса, онда цикл орындала береді, яғни файл соңы анықталғанша. Бұл жағдайда мәліметтерді енгізу процедурасы келесідей болады:
procdure lnit;
var
{айнымалы атауын мәтiдiк файл түрiнде сипаттау}
Fileln:text;
Begin
{айнымалыны нақтылы файл атымен байланыстыру}
assing(fileln,`mayFile1.in`);
{файлды оғуға әзiрлеу}
reset(Fileln);
{санауыштын бастапқы мәнi}
Sanau:=0;
While Not EOF(Fileln) do
Begin
{санауыштын мәнiн бiрге арттыру}
inc(Sanau);
{массивтен элементтердi оқу}
read(Fileln,San[i]);
end;
{файлды жабу}
close(Fileln);
end.
Sanau-айнымалысы файлдағы жазбалардың санын анықтауға қызмет атқарады. Бұл айнымалыны ауқымды айнымалылар бөлімінде сипаттаған тиімді. Сол сияқты San[] массиві де ауқымды айнымалылар бөлімінде сипатталады:
Var
San: arry[1…100] of integer;
Sanau: byte;
Жазбалар саны белгісіз файлдан мәліметтерді оқу жұмысының дұрыстығын тексеру үшін, оқылған мәліметтер массивін экранға баған түрінде шығарамыз:

procedure exi;
var
i: byte;
begin
for i:=1 to Sanau do
begin
writeln(San[i]);
end;
end;
Егер сіз программа мәтінінің қалған бөлігін дұрыс құрастырыңыз, онда жазбалар саны 100-ден аспайтын мәтіндік файлдан мәліметтерді және жазбалар санын оқитын программа аласыз. Сонымен қатар бұл программа файлдағы барлық жазбалар санын анықтап, оны экранда жазады.
Енді екі өлшемді массив мәліметтерін файлдан қалай оқуға болатындығын қарастырыралық. Жоғарыда айтылғандай мәліметтерді файлдан оқу, оның файл соңын анықтайтын белгісіне байланысты екен. Бірақ екі өлшемді массивтерді жазғанда оның элементтері жол бойынша және баған бойынша жазылады. Сондықтан файлдан мәліметтерді оқығанда, алдымен алғашқы жол бойынша файл соңы белгісі анықталады. Жолдағы мәліметтер толығымен оқылып болған соң келесі жолды оқуды бастау керек. Мәтіндік файлдар қасиеттерін қарастырғанда айтылғандай, онда әрбір жол, жол соңы белгісімен кодымен аяақталады. Осы белгіні анықтау үшін стандартты EOLn(Name Var) процедурасын қолданады. EOLn(), ағылшын тілінде End of length жол соңы сөзінің қысқартылған түрі. Жақшаның ішіне assing() процедурасында көрсетілген файлдың нақтылы атымен байланыстыратын айнымалы атауы жазылады. EOLn(Name Var)-процедурасының мәні, False(жалған)-болады, егер жолдың соңына жетпеген болса, Ture(ақиқат)-болады егер жолдың соңы анықталған болса. Олай болса мәліметтерді оқу жалғаса береді егер Not EOF(Fileln) шарты ақиқат болса, яғни жол соңы анықталғанша. Бұл жағдайда мәліметтерді оқу процедурасының түрі келесідей болады:
procedure lnit;
var
i: byte;
{айнымалы атауын мәтiндiк файл түрiнде сипаттау}
Fileln:text;
Begin
{айнымалыны нақтылы файл атымен байланыстыру}
assing(fileln,`mayFile5.in`);
{файлды оқуға әзiрлеу}
reset(Fileln);
{жолда санауыштың бастапқы мәнi}

Sanau Jol:=0;
{массив элементтерiн жол бойынша оқу}
while Not EOF (Fileln)do
begin
{санауыштың мәнiн бiрге арттыру}
inc(Sanau Jol);
{бағанда санауыштың бастапқы мәнi}
SanauBagan:=0;
{массив элементтерiн жол бойынша оқу}
while Not EOF (Fileln)do
begin
{санауыштың мәнiн бiрге арттыру}
inc(Sanau Bagan);

{массив элементтерiн оқу}
read(Fileln, San[i,j]);
end;
{курсорды жаңа жолдың басына қою}
read(Fileln, San[i,j]);
end;
{файлды жабу}
close(Fileln);
end;
1.Бір өлшемді массивті құрайтын `MayFile.in` файлынан мәліметтерді оқып, оларды компьютре экранына шығаратын программа жазыңыз және оны `MayFile6.pas` атымен сақтаңыз

6. Типті файл. Типті файлдарға мәліметті жазу

Келесі есепті қарастырып көрелік:
Мәтіндік файлға төрт таңбалы 50 сан жазу керек. Әрбір сан жеке жолдарға жазылатын болсын. Нәтижесіндегі файлдың өлшемі қандай болады?
Оны жуықтап бағалап көрелік. Әрбір таңба 1 байт орын алады. Ондай таңбалардың саны 50×4=200. Мәтіндік файлдарға берген анықтама бойынша әрбір жолдың соңында файл соңы белгісі болғандықтан, файл өлшемі 250 байттан асып кетеді.
Бұл мәліметтерді кіші өлшемдегі файлдарда сақтауға бола ма?
Біздің программамыз мәліметтерді өңдей алуы үшін, біз оған алдын ала оперативті жадыдан белгілі бір орын бөлуіміз керек. Жадыдан бөлінетін орынның өлшемі мәліметтердің типіне байланысты болғандықтан, бір элементті сақтау үшін, integer типті элементтерге 2 байт, byte типті бір элементке 1 байт орын бөлінеді.
Мұндай амалдарды мәліметтерді файлда сақтау кезінде қолдануға бола ма? Болады екен. Типті файл деп аталатын арнайы файлдық типтер бар.
Типті файл – барлық элементтері бір типті мәліметтер болып келетін файл түрі. Типті файл элементтері файлдық типетен басқа кез-келген тип бола алады.
Әр элементті файлға жазу үшін, мәліметтердің типіне байланысты, міндетті белгіленген мөлшерде орын бөледі. Типті файлдарды смпаттау бөлімінде ашу үшін, мәтіндік файлды смпаттағандай, файл мәліметтерді смпаттайтын тип жазылады.
<файл атауы>:file of<мәліметтер типі>
Біздің жағдайымызда:

FileOut:File of interger

Бұл жазу, берілген файлдағы мәліметтер – 32768-ден 32767 аралығында жататын бүтін сандар екенін көрсетеді.
Сонымен қатар, типті файлдармен жұмыс істегенде де, assign( ) - процедурассының көмегімен нақтылы файл аты мен байланыстыратын атауды көрсетеміз.
Assign(<файл атауы>,<файлдың нақты атауы>)
Біздің жағдайымызда:
Assign(FileOut ,’may.dat’)
Типті файлдармен жұмыс жасағанда мәтіндік файлдардағы секілді оларды жазуға және оқуға ашуға болады. Ол үшін стандартты функциялар қолданады:
Rewrite(<файл атауы>) – процедурасын файлды жазуға ашады және курсорды файлдың басына орналастырады.
Типті файлдарға мәліметтерді жазу write() процедурасы арқылы жүзеге асырылады. Ол мәтіндік файлдардағы write() процедурасына ұқсас. Алайда write() процедурасын типті файлдарда қолдануында біршама өзгешелік бар. Әрекетті орындау кезінде көрсеткіш келесі жазу блогына көшеді. Типті файлдарда writeln() процедурасын қолдану қателік көрсетеді.
Типті файлдарға writeln() процедурасын қолдануға болмайды.
Типті файлдармен жұмыс аяқталған соң Close<файл атауы>) – процедурасы көмегімен файл жабылады.
Енді тақырып басында берілген есепті шешуді жалғастырайық. 2.8.2 тақырыбындағы Мisal_F1 мәліметтерді шығару программасына келесідегідей өзгертулер енгіземіз:
Procedure Exi;
Var
FileOut :File of integer;
I :integer;
Begin
Assign (FileOut, ‘mayFile.in’);
Rewrite(FileOut);
For i:=1 to Sanau do
Write (FileOut, San[i]);
Close(f);
End;
Программаны толықтырып жазып Мisal_F8 атымен сақтаңыз. Программа орындалғаннан кейін "mayFile.in" файлын ашып көріңіз. Не көрдіңіз?

7. Типті файлдан мәліметтерді оқу

Титі файлдар тікелей қатынау файлдарына жатады, ол оның қатал ұйымдастырылғанына байланысты. Бұрында айтып өткеніміздей, типті файлдың компоненттері біркелкі, қатаң тәртіптегі көлемде орын алады. Сонымен тұтас блок бар делік және оған қатынауды ұйымдастырғанда, оған олардың орналасуы жайлы қосымша ақпараттарды сақтау қажет емес.
Типті файлдардан мәліметтерді оқуға арналған негізгі проуедураларды қарастырамыз.
Типті файлдармен жұмыс жасар алдында, мәтіндік файлдардағыдай, файл атауын жариялау және файлдағы мәліметтердің типін көрсету керек, нақтылы файл атауын байланыстыратын айнымалы атауын сипаттауымыз кереек (2.8.5 тақырыбын қараңыз).
Reset(<файл атауы>) – процедурасы файлдф оқуға ашады және көрсеткішті файлдың басына орналстырады.
Типті файлдан мәліметтерді оқу үшін read( ) процедурасын қолданады. Берілген процедураның жұмысы кезінде, блоктан мәліметті оқыған соң, көрсеткіш автоматтты түрде келесі жазбаға ауысады. Егер көрсеткіш соңғы жазбаның соңынан тұрса, онда программа орындалуында қателік болады.
Бұл қиындықтан шығу үшін FileSize( ) функциясын қолдануға болады.
FileSize(<файл атауы>):longint – функциясы файлдағы компоненттер санын анықтайды. Яғни, бізге файлдағы барлық мәліметтерді оқу керек болса, оқу процедурасын FileSize( ) рет орындауымыз керек. Мisal_F8 программасымен құралған типті файлдан мәліметтерді оқудың программасының мәтінінен үзінді келтіреміз:

Procedure Init;
Var
FileInput : file of integer;
I, Sanau : integer;
San:array[1..100] of integer;

begin

assign(FileInput, ‘mayFile.in’);
reset (FileInput);
Sanau :=FileSize(FileInput);
For i:=1 to Sanau do
Read(FileInput, San [i]);
Close(FileInput)’
End;

Тақырыптың басында типті файлдар – тікелей қатынау файлдарына жататынын айтып кеткенбіз. Яғни, файлдың кез-келген бөлігіндегі мәліметтерді оқу үшін, оның алдында тұрған мәліметтерді оқуды қажет етпейтін файлдар кездеседі.
Көрсеткішті қажетті мәліметті оқуға қою үшін, Seek() – процедурасын қолданады. Оның түрі келесідегідей болады:
Seek(<файл атауы>, <жазбаның нөмері>);
Сонымен қатар типті файлдарда нөмірлеу нөлден басталатыны есте ұстау керек, яғни бірінші лементтің нөмері "Нөл". Олай болса, біз көрсеткішті үшінші элементті оқуға көшіру үшін, Seek( ) - процедурасын қолдануды ескеруіміз керек. Мысалы:
Seek(FileInput, 2);
немесе
Seek(FileInput, 3-1);

8. Әртүрлі базалық типтерді біріктіру. Жазба типі

Массив анықтамасында айтылғандай, массив дегеніміз құрылымына және қолдану тәсіліне байланысты, бір типті нөмірленген тізімдідер. Егер әртүрлі типтегі мәліметтер берілген болсын. Осы тізімнен белгілі бір жлыдар аралығында туған оқушыларды сұрыптап бөліп алу керек болсын.
Мәліметтерді сақтау үшін оған екі массмвке орын бөлуімізге болатын еді. Бірінші массив (snring типті) оқушылардың аты жөнін сақтауға, екіншісі сақтауға арналған. Егер бізге қосымша мәліметтер (мысалы: сыныбы, ұлты, т.б.) енгізу керек болса, онда енгізуге тура келеді. Бір мезгілде бірнеше массивпен жұмыс істеу және оларды смпаттамалары бойынша сұрыптауға, әрине болады, бірақ үлкен жұмысты талап етеді. Сонымен қатар бұл мәліметтерді файлда сақтау керек болса не істейміз?
Файлдар туралы сұрақтарды талдағанда айтылғандай, файл элементтері тек бір типті элементтер болып келеді. Олай болса әр түрлі типтегі элементтерді әрбір типке – жолдық типке айналдырып, мәтіндік файлдармен жұмыс істеуіміз керек.
Мәліметтерді сақтай аламыз, бірақ болашақта бұл мәліметтермен жұмыс істеу жеткілікті қиындық туғызады.
Бұл қиындықтан шығу үшін мәліметтердің құрама типі қолданады. Мәліметтердің бұл типі жазба деп аталады. Жазбалар әр түрлі типтегі элементтер жиынтығынан тұрады. Жазба элелменттерін құраушыларды өріс деп атайды да, әрбір өрістің өзіндік атауы болады. Әрбір жазбаның бірегей атауы болады.

Жазба атауы Тізім
Өрістің атауы Фамилия Аты Туған жылы
Өрістер мәні Ахметов Алдияр 1980

Жазбаны өңдеу элементар объектә түрінде шығады. Мұндай объект типі – record (жазба) деп аталады. Олай болса, мәліметтердің типтеріне байланысты шектеулер алынып тасталады.
Жазбаларды сипаттау үшін, оның атауы, берілген өрісте сақталатын мәліметтердің атауы және типі көрсетілуі керек. Жазбалардың жалпы түрде сипатталуы келесідегідей:

Type<жазба атауы>=Record
<1 өріс>:<1 тип>;
<2 өріс>:<2 тип>;
……………………
:;
end;

9. Сыртқы кітапханалар. Модульдер

Модульдер және олардың қолданылуы туралы айтпастан бұрын, Люйс Кэроллдың "Алиса Ғажайып жлемінде" ертегісінен үзінді оқиық. Алисаның Ақ Серімен әңгімесі:
Иә бұл өте жақсы ара ұясы, - деп Сері еріксіз келісті. – Ең жақсы сапалы! Бірақ ол араларға бір себептен ұнамайды! Менде бұнда тағы тышқан қақпаны бар. Тышқандар араларды қуатын көрінеді. Немесе аралар – тышқандарды. Білмеймін…
Ал мен сізге тышқан қақпаны не үшін керек екенін ойлап тұрғам – деді Алиса. – Аттарда тышқанның өмір сүруін елестету қиын…
Қиын, бірақ болады, - деп Сері жауап берді. – Мен олардың менің денемде жүгіріп жүргенін қаламаушы едім.
Білесің бе, - деп жалғастырды ол, үндемей тұрып, - бәріне дайын болу керек! Міне неліктен менің атымның аяғында білезіктер тағылған.
Ал ол не үшін? – деп қызықты Алиса.
Акулалар тістеп алмауы үшін, - деді Ақ Сері.
Бұны мен өзім ойлап таптым. Атқа шығуға көмектесші. Мен сені шетке шығарамын. Ал мына ыдыс неге арналған?
Бәлішке арналған, - деді Алиса.
Онда оны өзімізбен бірге ала кетейік, - деп ұсынды Сері. – Егер біз бәліш тауып алсақ, ол бізге қажет болады. Дорбаны ұстай тұр, - мен оны осыған салайын…
Бұл оңай болмады. Алиса дорбаны қатты ұстап тұрды, бірақ Ақ Сері өте икемсіз болды: ол дорбаға ыдысты салудың орнына, оған өзі құлай берді. Ақырында ыдыс әрең салынады.
Әрине онда оған орын аз, - деп ескерді Сері. – Дорба шам қоайғыштарға лық толы, бірақ басқа не істейсің!
Ол дорбаны ер тоқымға іліп қойды, одан сәбіздің сабақтары, пештің қықыштары және әр түрлі нәрселер салбырап тұрды.
Ақ Серінің аты және қаруы қалай көрінгенін елестете аласыздар ма?
Borland Pascal сізге, үлкен саннан құралған тұрақтыларға, мәліметтер типіне, айнымалыларға, процедураларға және функцияларға қатынауды қамтамасыз етеалады. Олардың ішіндегі кейбіреулері Borland Pascal үшін ерекше, ал кейбіреулері Windows немесе Dos орталары үшін қолданбалы есептерді программалауда ерекше. Олардың саны өте көп, дегенмен, өз программаңызда олардың бәрін бір мезетте аз қолданасыз. Сондықтан олар модульдер деп аталатын өзара байланысты топтарға бөлінген. Бұл жағдайда тек программаға қажетті модульдерді қолдануға болады.
Программалық модуль (Unit) тұрақтылар, мәліметтер типі, айнымалылар, процедуралар және функциялар жиынтығы болып табылады. Әр модуль Паскальдағы жекеленген программаға ұқсас: сіз программаңызды орындаңға жіберместен бұрын, оның шақырылатын және қажетті инициализацияны жүзеге асыратын негізгі денесі болуы мүмкін. Қысқаша айтқанда модуль, программаға қоюға болатын және программаны жеке компилиаланатын бөлшектерге бөлуге болатын, сипаттамалар кітапханасы болып табылады.
Модуль құрамына кіретін, процедуралар және функциялар, мәліметтер типін және айнымалылар арасындағы тәсілдер жиынтығын қамтамасыз етеді. Бірақ та бұл тәсілдерді нақтылы жүзеге асыру интерфейс және жүзеге асыру (реализация). Егер программа модуьді пайдаланса, модульдің барлық сипттамалары бұл программаға, оның өзінде анықталғандай ашық болады.
Модуль құрылымы программа құрылымына ұқсас. Модульдің ішіндегі барлық сипаттамалар бір-бірімен байланысты. Мысалығы, Strings модулі нөлдік белгімен аяқталатын жолдарды өңдейтін ішкі программаларға қажетті сипаттамалардан тұрады. Сонымен қатар іщкі программалар сияқты, модульдер де стандартты және стандартты емес немесе қолданушының модулі, яғни, програмалаушылар өздері құрастыратын бола алады. Стандартты және стандартты емес модульдер құрылымы бірдей болғандықтан, олардың сипатталуы бірдей ережеде құрылған.
Модульдер программаға оның атын uses компилятор нұсқауында сипаттаудың көмегімен қосылады. Мысалы, былай сипатталғанда:
Uses Dos, Crt;
Аталған модульдердің құрамындағы барлық ішкі программалар, айнымалылар, типтер және тұрақтыларды программада қолдануға болады.
Ескерту. Модульдердің аттары оларды хабарлағанда үтірмен бөлінеді, ал соңғы модульден кейін үтірлі нүкте қойылады!

System модулі

System модулі барлық құралдар үшін, төменгі деңгейлі ішкі программаларды жүзеге асырады, мысалы: енгізу-шығу, жолдық айнымалылармен жұмыс, ауыспалы нүктемен жасалынатын операциялар және жадыны динамикалық бөлу.
System модулі Borland Pascal-дың барлық стандартты және құрылған процедураларынан және функцияларынан тұрады. Стандартты Паскальдің бөлігі болмайтын және басқа модульдерде орналаспаған Borland Pascal-дың кез-келегн ішкі программасы System модулінің құрамында орналасқан.

Ескерту. System модулі программаға автоматты қосылады (үнсіз келісім бойынша) және оны Uses операторында көрсету қажетті емес.

Стандартты емес модуьдерді пайдалану программаларды стандарттау мен құрылымдылығының деңгейін жоғарылатады, бұл программаларды өңдеуді жылдамдатады, олардың түсініктілігін және жетілдірудің қарапаймдылығын қамтамасыз етеді. Мұндай кітапханада, мысалға, жиі пайдаланылатын массивтерді (енгізу процедуралары, матрицаларды шығару, массивтерді сорттау және т.б.) өңдегендегі операцияларды сипаттағандай, бөлек программаға көп көңілді тек берліген есепке тән сұрақтарды шешуге бөледі, сондықтан стандартты және стандартты емес модульдерде іске асырылмайды. Бұл тек программаны өңдеу уақытын қысқартып қана қоймай, оның көлемін де азайтады. Жоғарыда айтылғанда, программалар арнайы сегментте орналасады, оның көлемі компьютердің оперативті жадысын құрайтын басқа сегменттер сияқты 64 Кбайттан аса алмайд. Әрине, бұл үшін оны үлкейтуге қажеттілік туады. Бұл мақсатқа жетуде модульдер бағаланбайтын қызмет көрсетеді. Әр модуль бөлек сегментте орналасады, сондықтан модульдеррі және программалары бар барлық сегменттердің қосындысы, компьютердің оперативті жадысының көлемін ғана шектелген (640 Кбайт).
Осындай алғы сөзден кейін, оқушының стандартты емес модульдерді пайдалануда пайдасы жайлы ешқандай күмәні жоқ екеніне сенімдіміз. Оларды өңдеудің өнеріне үйренуде жеңе алмайтын алдымен модуьдің құрылымымен, оның бөлімдерінің міндеттімен және өңдеу технологиясымен танысайық.
1. Модуль құрылымы

Модуль (unit) келесі бөліктерден тұрады:
аты немесе тақырыбы (мысалы, unit Мy_Мodyl);
интерфейс немесе хабарламалар бөлімі (Interfase);
орындаушы бөлігі немесе іске асыру бөлімі (Implementation);
Бұнда көрсетілген модуль бөлімдерінің тізбегі міндетті болып табылады, дегенмен осы бөлімді құрайтын блоктар (немес тек денелері) жарым-жартылай немесе толығымен болмауы мүмкін (бұрынғыдай осындай элементтерді сипаттағанда тік жақшалар пайдаланылады). Одан кейін модуль ішіндегі бөлімдерін сипаттаймыз.

Модуль тақырыбы
Модуль тақырыбы unit түйінді сөзінен және бірегей атаудан (модуль ішінде қайталанбауы керек) тұрады, оның кез-келеген атау сияқты 64-ке дейін белгісі бола алады.

Модуль интерфейсі
Interface {бұл бөлімнің Uses-тен басқа барлық объектілері, мәліметтер сегментінде орналасады}
[Uses … {Берілген модуль пайдаланатын, модульдердің ататры түгенделеді}]
[Cons … {Осы модуль қосқан программаға немесе басқа модульдерге, рұқсат етілуі тиіс тұрақтылар сипатталады}]
[Var … {Программада көрінетін немесе басқа модульдерде қолданатын айнымалылар сипатталады}]
[Procedure…{Формальды параметрлер сипаттамасымен толық процедураның атауы келтіріледі}]
…{Осы моудьді іске қосқан программа немесе басқа модуьдерден қол жеткізе алатын барлық басқа процедуралар мен модульдер функцияларының толық тақырыптары сипатталады}
Модульдің орындаушы бөлігі
[Uses … {Берілген орындау бөлігінде пайдаланылған және интерфейс көрсетілмеген модуьдер атауы көрсетіледу}]
[Lаbel… {Берілген модуль бөліміндегі, ішкі программаларда пайдаланылған таңбалар аттары көрсетіледі}]
[Сonst… {Берілген модуль бөліміндегі ішкі программаларда пайдаланылған және интерфейс аталмаған тұрақтылар сипатталады}]
[Var … {Берілген модуль бөліміндегі ішкі программаларда пайдаланылған және интерфейсте аталмаған айнымалылар сиптталады}]
[Procedure…{Interface-те сипатталған процедураның қысқаша немесе толық аты келтіріледі}]
{Процедура денесі}
[Function{Interface-те сипат
Категория: Информатика | Добавил: Злой_Админ)) | Теги: тіліндегі, жұмыс, Паскаль, програмдау, файлдармен
Просмотров: 1624 | Загрузок: 267 | Рейтинг: 5.0/1
Всего комментариев: 0
avatar