Пәндердің оқу-әдістемелік кешенінің тізімдемесі



бет31/85
Дата11.10.2023
өлшемі2.35 Mb.
#480347
1   ...   27   28   29   30   31   32   33   34   ...   85
Сараптаушы жүйелер

Мысал. Қайсыбір (еркін түрде алынған) файл мазмұнын экранға шығаруды қамтамасыз ететін предикат жазу керек. Предикаттың қатарлық типті бір параметрі болады, ол файлдың сыртқы дискілік атауын сипаттайды.
Бұл предикатты жүзеге асыру барысында төмендегідей кірістірілген предикаттарды қолданамыз:
Existfile предикаты дискіде файлдың бар екендігін анықтайды;
openread предикаты табылған файлды оқу үшін ашады;
readdevice предикаты файлды енгізу режимінде қайта ашады;
eof предикаты файл ішінде мәлімет бар не жоқ екендігін анықтайды;
readchar предикаты файлдан символданды оқиды;
write предикаты оқылған символдарды экранға шығарады.
Алдымен қосымша предикат жазу керек, ол файлдан символдарды оқиды да оларды файл соңына жеткенше экранға шығарып отырады.
Негізгі предикат оның параметрі ретінде көрсетілген файлдың бар болуын тексереді. Егер осындай атаумен берілген файл болмаса сәйкесті хабарлама шығады. Егер көрсетілген атаудағы файл болса, оны openread предикатымен оқуға ашамыз және оны readdevice предикатын қолданып, ақпаратты енгізудің ағымдағы құрылысы ретінде анықтаймыз. Әрі қарай көмекші предикатты қолданамыз. Closfile предикатымен файлды жабамыз. Readdevice предикатын қолданып ағымдағы оқу құрылғысы ретінде пернетақтаны таңдаймыз. Негізінен осы жерден тоқтауға болады немесе readchar предикатын қолданып, кез келген пернені басу арқылы үзіліс ұйымдастыруға болады. Программаны толық жазайық. Ішкі мақсатты сипаттау бөлімінде файл атын енгізуді және негізгі предикатты шақыруды ұйымдастырамыз:
DOMAINS /* доменді баяндау бөлімі */
File = f /* f – файлдың ішкі атауы */
PREDICATES /* предикатты баяндау бөлімі */
Write_file(file)
WriteFile(String)
CLAUSES /*сөйлемдерді, ұсыныстарды баяндау бөлімі*/
Write_file (f): -
Not (eor(f)) , ! , /* егер f файлы аяқталмаса */
Readchar(C) , /*ондағы символдарды оқимыз*/
Write(C, “ “) , /*символды экранға шығару */
Write_file (f) . / * процесті жалғастырамыз*/
Write_file(_) : -
writeFile(F_N) : -
existfile(F_N) , ! , /* F_N файлының бар болуына көз жеткіземіз */
Openread( f, F_N) , /* F_N сыртқы файлы мен f ішкі файлын байланыстырамыз және оқуға ашамыз*/
Readdevice(f) , ‘ /* f файлын оқуды ұйымдастырамыз*/
Write_file(f) , ‘ /* f файлының барлық символдарын экранға шығаратын предикатты шақырамыз*/
Closefile(f) , /* файлды жабамыз */
Readdevice (keyboard) , / * енгізуді пернелерге бұрамыз */
n1, n1, /* қатарларды өткіземіз */
write(“ кез келген пернені басыңыз”) /* хабарламаны экранға шығарамыз */
readchar( _ ) . /* кез келген перненің басылуын күтеміз */
writeFile(F_N): -
write(“ F_N атаулы файлдар табылған жоқ! ”)
GOAL /* ішкі мақсатты баяндау бөлімі*/
Write(“ файл атын енгізіңіз: ”) ,
Readln(F_N) ,
writeFile(F_N).
Мысал. Енді пернетақтадан енгізілетін символдардан файл құрастыратын предикат құрайық.
Предикат файлдың ішкі атуын беретін параметрден тұратын болады.
Ақпаратты шығарудың ағымдық құрылғысы ретінде экранды таңдап, қолданушыға символды енгізуге ұсыныс шығарамыз, қандай символ енгізу процесін аяқтайтынын хабарлаймыз. Символды пернетақтадан оқып, оны экранға шығарып, енгізуді аяқтайтын символмен салыстырамыз. Егер символдар сәйкес келсе, файлды жабамыз. Керісінше жағдайда: файл жазбаларын ағымдық құрылғы етіп, символды файлға жазып, ннегізгі предикатты шақырамыз.
Ішкі мақсатты сипаттау бөлімінде файл атауын енгізуді, жазу үшін файлды ашуды және негізгі предикатты шақыруды ұйымдастырамыз:
DOMAINS /* доменді сипаттау бөлімі */
File = f /* f – файлдың ішкі атауы */
PREDICATES /* предикатты сипаттау бөлімі */
Readfile
CLAUSES /*ұсыныстарды сипаттау бөлімі*/
Readfile : -
Writedevice (screen) ,
Write (“ символды енгізіңіз (# - енгізу соңы) ”) , n1, /* хабарламаны шығарамыз */
Readchar(C) , /* пернетақтадан символдарды оқимыз*/
Write(C, “ “) , /*символды экранға шығару */
C<>’#’, ! , /*егер де ол # болмаса*/
Write(C), /* символды файлға жазамыз */
Readfile.
Readfile : -
Closefile(f) . /* егер де енгізілген символ # символына тең болса, онда файлды жабамыз*/
GOAL /* ішкі мақсатты баяндау бөлімі*/
Write(“ файл атын енгізіңіз: ”) ,
Readln(F_N) ,
Openwrite(f, F_N) ,
Readfile(f).
Енді бұл программаны файлға пернетақтадан символдар емес, бүтін жолдар (қатарлар) жазылатындай етіп өзгертейік. Бұл жағдайда файлға жолды жазуда қатар соңын анықтайтын символдарды қосуды және каретканы ауыстыруды ұмытпау керек. Мұны кірістірілген n1 предикаты немесе жазылатын қатарға 13 не 10 кодтарымен берілетін екі символмен қоса жазу, яғни тіркеу арқылы жүзеге асыруға болады.
Мысалы, файл мазмұнын экранға және принтерге шығаратын предикатты жазамыз. Предикат файлдың ішкі атауынан анықтайтын бір параметрден тұрады.
Программаны файлдың бар екендігін анықтау, бар болса оқу үшін ашу сияқты әрекеттерін сипаттайтын фрагментін жазбай-ақ (бұл процестер алдыңғы мысал программаларында бар) қажетті предикатты ғана жазайық. Біздің предикатымыз файл соңына жеткенімізді анықтауы керек. Файл соңына жеткенде оны жабу қажет. Егер файл соңына жетпесек, readchar предикатын қолданып, символды оқимыз. Оны экранға write предикаты көмегімен шығарып, символды принтерге шығаруды writedevice предикатымен қайта бағыттаймыз, принтерді flush предикатын қолданып тез арада символды басып шығаруға мәжбүрлейміз және келесі символды шығарудың белсенді құрылғысы ретінде экранды бекітеміз. Бұл процесті бастапқы файлдың барлық символдары таусылғанша қайталаймыз:
WriteFile_to_scr_and_pr(f) :-
Not(eof(f)) ,!,
Readchar(c) ,
Write(c) ,
Writedevice(printer) ,
Write(c) ,
Flush(printer) ,
Writedevice(screen) ,
writeFile)to_scr_and_pr(f).
writeFile_to_scr_and_pr:-
closefile(f).
Flush стандарт предикатының орындалуына назар аударайық. Әдетте, принтер деректерді оның ішкі буфері толғанда ғана басып шығарады. Flush предикаты буферге жинақталған ақпаратты басып шығарушы құрылғыға жылдам өткізуге мүмкіндік береді.
Мысалы, бір файлдың компоненттерін басқа файлға көшіруге мүмкіндік беретін предикатты жазайық, нәтижесінде нәтижелік файлда барлық ағылшын әріптері бас әріптерге өзгертілуі керек. Предикаттың екі аргументі болады. Бірінші параметрі бастапқы файлдың сыртқы атауы болады, екіншісі – нәтижелік файлдың сыртқы атауы.
Бірінші файлдан қатарларды(жолдарды) оқитын, олардың символдарын upper_lower кірістірілген предикаты көмегімен жоғарғы регистрге ауыстыратын, ал алынған қатарларды екінші файлға жазатын көмекші предикатты құрудан бастайық. Бірінші файл аяқталғанда бұл предикат екі файлды да жабуы керек.
Негізгі предикат бастапқы файлдың бар не жоқтығын тексереді. Егер көрсетілген атаудағы файл бар болмаса, ол сәйкесті хабарлама шығаруы тиіс. Егер файл бар болса, ол оқу үшін ашылады. Нәтижелік файл жазу үшін ашылады. Бірінші файл ағымдағы оқу құрылғысы ретінде орнатылады, ал екіншісі ағымдағы мәлімет жазу құрылғысы ретінде бекітіледі. Мұнан соң көмекші предикатты шақыру ғана қалды.
Бұл екі предикаты жазайық. Программаның сипаттау бөлімдері қарастырлмаған, яғни оны пайдаланушы өзі толықтырады (алдыңғы мысалдарға қарап), тек негізгі предикаттардың қолданылуын сипаттайтын фрагментті ғана жазып шығайық:
Transform:-
not(eof(f)) , ! ,
readln(S) ,
upper_lower(S_U, S) ,
write(S_U) , n1,
transform.
Transform:
Closefile(f) ,
Closefile(f_o).
Upper_file(N_F, N_O_F):-
Existfile(N_F) ,!,
Openread(f, N_F) ,
Readdevice(f) ,
openwrite(f_o, N_o_F),
writedevice(f_o) ,
transform.
Upper_file(N_F, _):-
Write(“ N_F атты файл табылған жоқ!”).


Тапсырма. Файлдан оқу, және сәйкесті түрде экран мен принтерге шығару жеке символдар түрінде емес, қатар бойынша орындалатындай етіп Flush предикатын өзгертіңіз.
Түсініктеме: Readchar предикатын Read1п предикатына өзгертіңіз. Қатар соңы символы мен қайтару кареткасын пайдалану қажет.
Бақылау сұрақтары

  1. Файл ұғымына анықтама беріңіз.

  2. Файлдық домен деген не?

  3. Файлдың ішкі және сыртқы атауы деген не?

  4. Турбо Прологтың файлдармен жұмысқа арналған стандарт предикаттарына сипаттама беріңіз.

  5. Файлға ақпарат жазу қалай ұйымдастырылады?

  6. Файлдан ақпарат оқудың стандарт предикатын атаңыз?

  7. Ақпаратты файлдан файлға көшіру қалай ұйымдастырылады?





Достарыңызбен бөлісу:
1   ...   27   28   29   30   31   32   33   34   ...   85




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет