3.9.2.Variant tanlash operatori
Ayrim algoritmlarning hisoblash jarayonlari o'zlarining ko'p tarmoqliligi bilan ajralib turadi. Umuman olganda, tarmoqli jarayonlarni hisoblash uchun shartli operatordan foydalanish yetarlidir. Lekin, tarmoqlar soni ko'p bo'lsa, shartli operatordan foydalanish algoritmning ko'rinishini qo'pollashtirib yuboradi. Bu hollarda shartli operatorning umumlashmasi bo'lgan variant tanlash operatoridan foydalanish maqsadga muvofiqdir.
Variant tanlash operatorining sintaksis aniqlanmasi quyidagicha:
<variant tanlash operatori>::= case <operator selektori>
of <variant ro'yxatining hadlari> end;
bu yerda <operator selektori>::= <ifoda>;
<variant ro'yxatining hadi>::=<variantlar metkalarining ro'yxati>:<operator>;
<variantlar metkalarining ro'yxati>::=<variant metkasi>{,< variant metkasi>};
<variant metkasi>::=<o'zgarmas>
Variant tanlash operatori bajarilish paytida oldin selektorning qiymati hisoblanadi, shundan so'ng selektorning qiymatiga mos metka bilan jihozlangan operator bajariladi va shu bilan variant tanlash operatori o'z ishini yakunlaydi. Shuni esda tutish kerakki, <variant metka>si bilan <operator metka>si bir xil tushuncha emas va variant metkasi metkalar (Label) bo'limida ko'rsatilmasligi kerak. Bundan tashqari, ular o'tish operatorida ishlatilishi mumkin emas.
3. Case kun of
dush, sesh, chor, pay, jum: writeln('ish kuni');
shan, yaksh: writeln('dam olish kuni') end.
Variant tanlash operatorining tana qismiga kirish faqat case orqali amalga oshiriladi.
Endi shartli operatornng variant tanlash operatori orqali ifodalanishini ko'rib chiqaylik:
Quyidagi shartli va variant tanlash operatorlari bir-biriga mos keladi:
Quyidagi chala shartli va variant tanlash operatorian bir-biriga mos keladi:
Variant tanlash operatorlaridan sanalma tiplar qiymatlarini ko'rishga qulay holda chop etish uchun foydalanish mumkin. Buni quyidagi misolda ko'rib chiqamiz:
Sanalma tipli qiymatlarni kiritish ancha qiyin masala hisoblanib, bu ishni tashkil qilish uchun to'g'ridan-to'g'ri variant tanlash operatoridan foydalanish mumkin emas. Ma'lumotlarni kiritishda asosan qatorli (String) tiplarning imkoniyatlaridan foydalaniladi.
Faraz qilaylik, «n» o'zgaruvchisi dasturda qaysidir oyning biror kunini ifodalovchi butun son bo'lsin. Bu o'zgaruvchini integer tipi bilan e'lon qilsak, «n»ga ixtiyoriy butun sonni o'zlashtirish mumkin. Lekin, yechilayotgan masalaning mohiyatiga ko'ra «n»ning faqat [1; 31] oraliqdagi qiymatlarigina ma'noga ega xolos. O'zgaruvchining boshqa qiymatga ega bo'lishi uning xato hisoblanayotganligini yoki dasturga berilgan ma'lumotlarning xatoligini anglatadi. Shunga o'xshash, dasturchi dasturni tuzish davomida ma'lum bir o'zgaruvchilar qiymatlarining o'zgarish oraliqlari haqida ma'lumotga ega bo'ladi. Bunday ma'lumotlarning dasturda ko'rsatib qo'yilishi, dastur ishining to'g'ri bajarilayotganligi ustidan nazorat qilib turish imkoniyatini yaratadi.
Shunday cheklashlarni amalga oshirish uchun Paskal tilida cheklangan tiplar kiritilgan. Har bir shunday tip oldindan ma'lum bo'lgan tiplarga cheklashlar kiritish orqali aniqlanadi.
Yuqorida aytganimizdek, cheklanma oldindan aniqlangan tipga nisbatan aniqlanadi. Masalan, (dush, sesh, chor, pay, jum, shan, yaksh) sanalma tipini aniqlamasdan turib dush...jum cheklangan tipini kiritish mumkin emas.
Cheklanma tip ham boshqa tiplar kabi yangi tip aniqlash bo'limida yoki o'zgaruvchilarning tiplarini e'lon qilish bo'limida aniqlanishi mumkin.
Cheklangan "tiplarni e’lon qilishga doir bo’lgan misollardan yana ko'rib chiqaylik:
type
3.10. KOMBINATSIYALI TIPLAR (YOZUVLAR)
E'tiboringizga yana bir yangi, boshqa algoritmik tillarda mavjud bo'lmagan Paskal tilining hosilaviy tiplaridan birini — kombinatsiyali tipni havola qilamiz. Kombinatsiyali tipning qiymati ham xuddi massivlarniki kabi bir nechta haddan tashkil topadi. Lekin massivdan farqli o'laroq, uning har bir hadi turlicha tipli bo'lishi mumkin. Bu tipning hadlariga ularning joylashgan tartib raqamlari bilan emas, balki ismlari orqali murojaat qilinadi.
Kombinatsiyali tipni odatda soddagina qilib — yozuv-lar deb ataladi.
Kombinatsiyali tip qiymatlari asosan murakkab, bir jinsli emas tashkil etuvchilarga ega bo'lgan ob'ektlarni ifoda-lashga bag'ishlangan. Bu tipdan amalda turli xil ma'lumotlar majmuasini yaratishda keng foydalaniladi. Masalan, biror tashkilotda ishlovchi xodimlar haqidagi ma'lumotlar majmuasi — xodimlarning turli xil anketali xabarlarini o'zida jamlaydi:
familiyasi,
ismi-sharifi,
tug'ilgan yili—oyi—kuni,
yashash manzili, ishchi va uy telefon raqamlari,
ma'lumoti, mutaxassisligi,
oilaviy ahvoli,
harbiyga aloqadorligi va h.k.
Sanab o'tilgan va bitta shaxsga tegishli bo'lgan ushbu ma'lumotlarning turli xil tipga tegishligiga ahamiyat bering:
telefonlar,tug'ilgan yili—oyi—kunlari — butun sonlardan, boshqa ma'lumotlar esa belgili qatorlardan tashkil topgan.
Shunday qilib, kombinatsiyali tip qiymati — maydonlar deb atalmish chekli sondagi hadlardan tashkil topgan ma'lumotlar strukturasidir. Yozuvning har bir maydoniga o'ziga xos ism beriladi va bu maydon qiymatining tipi ko'rsatiladi. Bunda maydon qiymatining tipiga hech qanday cheklashlar qo'yilmaydi. Shuning uchun yozuv hadlari o'z navbatida yana yozuv bo'lishi mumkin. Demak, yozuv aniq ifodalangan iyerarxik (shajarali) tuzilishga ega bo'lishi mumkin. Bir xil darajada turgan bitta yozuvning barcha ismlari turli xil bo'lishi lozim, xuddi shuningdek, turli yozuvlar bir xil ismli maydonlarni o'z ichiga olishi mumkin. Bunda bu maydonlarga murojaat qilishda hech qanday anglashilmovchilik bo'lmaydi, chunki murojaat tashqi yozuv orqali amalga oshiriladi.
Yozuvlardan foydalanib mukammal dasturlar yaratishdan oldin sodda hollarda uning imkoniyatlari bilan tani-shib chiqaylik.
Oddiy kombinatsiyali tiplar. Soddalik uchun, bir avlodli struktura orqali yozilgan kombinatsiyali tip ma'lu-motlari bilan tanishib chiqaylik.
Yozuvlarni aniqlash (kiritish) quyidagi sintaksis qoida bo'yicha amalga oshiriladi:
<kombinatsiyali tipni aniqlash>::= record < maydon-lar ro'yxati> end
<maydonlar ro'yxati>::=<>yozuv seksiyasi>{;<'yozuv seksiyasi>}
<"yozuv seksiyasi>::=<maydon ismi>{,<maydon ismi>}: <tip>
Bu tipni quyidagicha tushuntirish mumkin: CompLex tipiga tegishli ixtiyoriy qiymat ikkita hadli (maydonli) yozuvdan tashkil topgan strukturadir. Yozuv maydonlari re va im nomlari bilan ataladi va ular real tipiga tegishlidir.
re va im bir xil tipli bo'lgani uchun ularni bitta ro'yxatga birlashtirib yozsa ham bo'ladi:
type
Endi barcha kompleks (mavhum) qiymatlar qabul qiluvchi o'zgaruvchilarning tiplarini var bo'limida aniqlash mumkin:
Bu tipdagi o'zgaruvchilarga biror qiymat o'zlashtirish uchun ularning maydonlarini tashkil etuvchilarga qiymat berish kerak bo'ladi. Masalan, x o'zgaruvchiga 4,5 + + i * 6,75 qiymatni o'zlashtirish uchun, re va im ismli maydonlarga qiymat berish kerak:
Bir xil kombinatsiyali tipga tegishli o'zgaruvchilar uchun faqat o'zlashtirish amaligina o'rinli xolos:
Yozuvlarga doir quyidagi misol ustida ular bilan ishlash malakamizni oshiraylik:
Misol: x va ó mavhum sonlari ustida qo'shish, ayirish va ko'paytirish amallarini bajarish dasturini tuzing.
Iyerarxik (shajarali) yozuvlar. Oldingi mavzuda biz kiritgan yozuvlarning maydonlari skalyar (o'zgarmas) miqdorlar edi. Paskal tilida esa, yuqorida ta'kidlaganimizdek, yozuv maydonining tiplariga hech qanday cheklashlar qo'yilmaydi. Shuning uchun yozuvning hadlari yana yozuvlardan, ularning hadlari ham o'z navbatida yozuvlardan tashkil topishi mumkin.
Yozuv maydonining tipi ikki xil usul bilan aniqlanishi mumkin:
■ to'g'ridan-to'g'ri kombinatsiyali tip ichida;
■ oldindan aniqlangan tiplar orqali.
Iyerarxik (avlodli) struktura bo'yicha aniqlangan yozuvdagi eng past darajada faqat oddiy skalyar tiplargina qatnashadi. Avlod darajasining o'sib borishi davomida tiplarning murakkablik darajasi ham ortib boradi.
Misol sifatida «Ilmiy_xodim» degan yozuvli tipni ko'rib chiqaylik. Bu tipni kiritishdan avval bir nechta yordamchi tiplarni aniqlab olamiz. Bu tiplar asosiy «Ilmiy_xodim» tipini aniqlashda kerak bo'ladi:
Bog'lama operatori. Oldingi mavzuda havola qilingan dasturdan ko'rinib turibdiki, yozuvlar bilan ishlash dasturning matnini juda uzun qilib yuborib, har doim yozuvning to'liq ismlarini yozishga to'g'ri keladi. Jumladan, bu misolda 18 marta «shaxs» so'zi takrorlandi. Shunday takrorlanuvchi yozuv hadlarini kamaytirish maqsadida bog'lama operatori kiritilgan:
<bog'lama operatori>::=<sarlavha> <operator>
<sarlavha>::=with<yozuvli o'zgaruvchilar ro'yxati> do
<yozuvli o'zgaruvchilar ro'yxati>::=<yozuvli o'zgaruvchi>{,<yozuvli o'zgaruvchi>}
Endi bu operatorlarni amalda ishlatilishini ko'rib chiqamiz:
with R do S
bu yerda with va do — xizmatchi so'zlar;
r - kombinatsiyali tipga tegishli o'zgaruvchi;
S — ixtiyoriy operator.
Bog'lama operatorining bajarilishi S operatorining bajarilishi demakdir. Faqat S operatorining ichki qismida R.p yozuvi o'rniga ( p— maydon ismi) faqat p yoziladi xolos.
Masalan, oldingi misolimiz uchun with shaxs do operatoridan keyin o'zgaruvchilarning qiymatlarini yozsak: fish.ism :='Ahmad'; va h.k.
Bu yerda ko'rinib turibdiki, dastur matni o'zlashtirish operatorining chap tomonidagi ismlarda «Shaxs» so'zi tushirib qoldirilganligi sababli ancha ixchamlashdi.
Operatorning ishlashini yaxshiroq tushunish uchun qisqaroq dasturni ko'rib chiqaylik.
Quyidagi o'zgaruvchilarning qiymatlar tiplarini e'lon qilish bo'limi mavjud bo'lsin:
3.11.1. Paskal tilida to'plamlarni belgilash
To'plam tushunchasi matematika kursidan yaxshi ma'lum bo'lib, dasturlash tillarida ham keng ma'noda ishlatiladi. To'plamning hadlari bir xil tipli va chekli sondagi bo'lishi kerak. To'plamdagi hadlarning soni 256 tadan ortmasligi yoki umuman to'plam bo'sh bo'lishi ham mumkin. To'plamning hadlari o'rta qavs ichiga olinib, o'zaro vergul bilan ajratilib yoziladi.
Paskal tilida to'plam tiplari sifatida oldingi mavzularda ko'rib chiqilgan ixtiyoriy skalyar tip qabul qilinishi mumkin, faqat Real tipini qabul qilishi mumkin emas.
To'plamlarning umumiy nazariyasidagi kabi Paskalda ham to'plam hadlarining tartib joyi hech qanday vazifa bajarmaydi va har bir had faqat bir marta hisobga olinadi:
l)[true, false] va [false, true] to'plamlari ekvivalentdir;
2) [1,2,3,2..5,6,4,3] to'plam [1,2,3,4,5,6] to'plamga ekvivalent, u esa o'z navbatida [1..6] to'plamiga ekvivalent.
Noto'g'ri yozilgan to'plamlardan namunalar:
1) [5.3, 2.5] — to'plam hadlari Real tipidagi son bo'lishi mumkin emas;
2) [9, 7, «P»,0] — to'plam hadlari bir xil tipli bo'lishi lozim edi;
3) ['abc'.'Axad'] — to'plam hadlari hosilaviy tiplarga tegishli bo'lishi mumkin emas.
To'plamlar ustidagi munosabat amallarining quyidagi jadvalini e'tiboringizga havola qilamiz:
3.11.2.To'plamlar ustida amallar
3.11.3.To'plamli tipni berish va to'plamli o'zgaruvchilar
To'plamli tiplarni aniqlash quyidagicha amalga oshiriladi:
Set of <to'plam tipi>;
bu yerda Set, of — Paskal tilining xizmatchi so'zlari.
3.12. MASSIVLAR (JADVAL KATTALIKLAR)
Biz shu paytgacha qiymatlarning oddiy (skalyar) tiplaridan foydalanib, turli xil dasturlar tuzishni o'rgandik. Skalyar tipga tegishli har bir qiymat yagona ma'lumot hisoblanib, trivial (qat'iy) tuzilishga egadir. Amalda esa, turli xil hosilaviy tiplar bilan ishlashga, ulardan foydalanib murakkab dasturlar yaratishga to'g'ri keladi. Bu tiplarga tegishli qiymatlarning har biri trivial bo'lmagan tuzilishga ega, ya'ni bu qiymatlar o'z navbatida yana bir nechta qiymatlardan tashkil topadi.
Endi shunday tiplardan biri bo'lgan, dasturlashda eng ko'p qo'llaniladigan dastur ob'ekti — massivlar bilan tanishib chiqamiz.
3.12.1. Bir o'lchamli massivlar
Massiv — bu bir xil tipli, chekli qiymatlarning tartiblangan to'plamidir. Massivlarga misol sifatida matematika kursidan ma'lum bo'lgan vektorlar, matritsalar va tenzorlarni ko'rsatish mumkin.
Dasturda ishlatiluvchi barcha massivlarga o'ziga xos ism berish kerak. Massivning har bir hadiga murojaat esa uning nomi va o'rta qavs ichiga olib yozilgan tartib hadi orqali amalga oshiriladi:
<massiv nomi>[<indeks>] ;
bu yerda <indeks> — massiv hadining joylashgan o'rnini anglatuvchi tartib qiymati.
. Umuman olganda, <indeks> o'rnida <ifoda> qatnashishi ham mumkin. Indeksni ifodalovchi ifodaning tipini — indeks tipi deb ataladi. Indeks tipining qiymatlar to'plami albatta raqamlangan to'plam bo'lishi, shu bilan bir qatotda massiv hadlari sonini aniqlashi va ularning tartibini belgilashi kerak.
Massivlarni e'lon qilishda indeks tipi bilan bir qatorda massiv hadlarining tipi ham ko'rsatilishi kerak. Bir o'lchamli massivni e'lon qilish quyidagicha amalga oshiriladi:
array [<indeks tipi>] of <massiv hadining tipi>;
Ko'pincha <indeks tipi> sifatida cheklanma tiplardan foydalaniladi, chunki bu tipga tegishli to'plam tartiblan-gan va qat'iy raqamlangandir. Misol uchun, 100 ta haqiqiy sonli hadlardan iborat massiv quyidagicha e'lon qilinadi:
array [1.. 100] of real;
Massivlarni e'lon qilish haqida to'liqroq ma'lumot berish uchun turli tipdagi indekslarga oid misollarni e'tiboringizga havola qilamiz:
Endi massivlar ustida tipik amallar bajaruvchi bir nechta dastur bilan tanishib chiqaylik.
3.12.2. Ko'p o'lchamii massivlar
Bir o'lchamii massivlarning hadlari skalyar miqdorlar bo'lgan edi. Umumiy holda esa, massiv hadlari o'z navbatida yana massivlar bo'lishi mumkin. Agar bu massivlar skalyar miqdorlar bo'lsa, natijada ikki o'lchamii massivlar hosil bo'ladi. Ikki o'lchamii massivlarga misol sifatida matematika kursidagi matritsalarni keltirish mumkin. Agar bir o'lchamii massivning hadlari o'z navbatida matritsalar bo'lsa natijada uch o'lchovli massivlar hosil qilinadi va h.k.
Ikki o'lchamii massiv tipini ko'rsatish quyidagicha bajariladi:
array [<indeks tipi>] of array [<indeks tipi>] of <skalyar tip>;
Ikki o'lchamii massivlarning tiplarini bir necha xil usulda aniqlashni quyidagi misolda ko'rib chiqaylik: A matritsa 10 ta satr va 20 ta ustundan iborat bo'lib, uning xadlari haqiqiy tipga tegishli bo'lsin:
3.13. PROTSEDURA-OPERATORLAR
Dastur tuzish jarayonida uning turli joylarida ma'nosiga ko'ra bir xil, mustaqil xarakterga ega bo'lgan va yechilayotgan asosiy masalaning biror qismini hal qilishga mo'ljallangan murakkab algoritmdan bir necha marotaba foydalanishga to'g'ri keladi. Masalan, matritsalarni ko'paytirish, matritsani vektorga ko'paytirish, chiziqli boimagan tenglamani yechish, chiziqli algebraik tenglamalar tizimini yechish, faktorial hisoblash, yig'indi hisoblash va hokazo kabi masalalarni hal qilish algoritmlari ko'plab masalalarni yechishning bosh algoritmlarida qaytaqayta ravishda, turli boshlang'ich ma'lumotlar bilan birgalikda qatnashishi mumkin. Bunday hollarda, malakali dasturchi dastur matnini ixchamlashtirish, dasturning . ishonchlilik darajasini oshirish, dasturni tahrir qilish (otladka) ni tezlashtirish va dasturning umumiyligini (universalligini) ta'minlash uchun protsedura hamda funksiyalardan kengroq foydalangan holda mukammal dastur yaratishga harakat qiladi.
Protsedura va funksiyalar mustaqil dasturli ob'ektlar hisoblanadi. Bu mustaqil dasturli ob'ektni dasturchi o'z xohishiga va undan olinadigan natijalarga ko'ra protsedura yoki funksiya ko'rinishida aniqlashi mumkin. Odatda olinadigan natija yagona qiymatli bo'lsa funksiyadan, olinadigan natijalar soni bir nechta bo'lsa protseduradan foydalanish maqsadga muvofiqdir.
Protsedurani yozish strukturasi xuddi asosiy dastur strukturasi kabi bo'lib, faqat sarlavhalari bilangina farq qiladi xolos:
procedure <protsedura ismi>(<formal parametrlar ro'yxati>);
label <metkalar ro'yxati>;
const <o'zgarmaslarni kiritish>;
type <yangi tiplarni aniqlash>;
var <o'zgaruvchilarning tiplarini e'lon qilish>;
<qism dasturgagina tegishli bo'lgan ichki protsedura va funksiyalar e'loni>;
begin
<protseduraning tana qismi>
end;
Protseduralar va funksiyalarni aniqlash asosiy dasturning var (o'zgaruvchilarning tiplarini e'lon qilish) bo'limida bajariladi. Protseduradan dasturda foydalanish uchun uning ismi va faktik parametrlar ro'yxati yoziladi. Shunda protsedura o'ziga belgilangan ishni bajarib, o'zining faktik parametrlari orqali asosiy dasturga o'z natijasini beradi.
Protseduraning e'loni va unga murojaat qilishni kelgusida ko'riladigan misollar orqali o'zlashtirib olamiz.
3.13.1.Parametrsiz protseduralar
Yuqorida aytib o'tilganidek, protsedura hisoblab bergan natijalar uning faktik parametrlari orqali asosiy dasturga uzatiladi. Lekin, ayrim paytlarda protsedura parametrsiz ham bo'lishi mumkin. Bu holda asosiy dasturning barcha parametrlari protsedura parametrlari rolini bajaradi. Parametrsiz protsedurada ham protseduraning barcha bo'limlari saqlanib qoladi, faqat parametrlar ro'yxatigina qatnashmaydi.
Protseduralarni aniqlash va ulardan foydalanishni quyidagi misolda ko'rib chiqaylik:
Asosiy dasturning operatorlar qismida ikki marta yozilgan maxl parametrsiz protsedurasiga murojaat e'lon qilingan protsedurani ikki marta asosiy dasturga olib kelib ishlatishni ta'minlaydi. Ahamiyat berilsa, ikkinchi dastur birinchi protsedurasiz tuzilgan dasturga ko'ra ixchamroq va soddaroqdir. Biz kiritgan protsedura hozircha faqat ikkita haqiqiy son ichidan kattasini aniqlab berdi xolos. Shuning uchun dasturning hajmini kamaytirishdan erishgan yutuq salmoqli bo'lmadi. Lekin, protseduralar asosan ko'p hajmli matndagi amallarni, vazifalarni bajarishga mo'ljallanadi va bu holda erishilgan yutuq salmog'i ancha yuqori bo'ladi.
Parametrsiz protseduraning asosiy kamchiligi — uning asosiy dasturga va undagi ma'lum parametrlarga bog'lanib qolganligidir.
3.13.2.Parametrli protseduralar
Protsedura bilan asosiy dasturni bog'laydigan bosh omil — protsedura parametrlaridir. Parametrlarni ikkita tipga ajratiladi: qiymatli parametrlar (parametr-qiymat), o'zgaruvchili parametrlar (parametr - o'zgaruvchi).
Parametr-qiymatlar protseduraning ishlash jarayonini ta'minlovchi parametrlar hisoblanadi, ya'ni ular asosiy dastur qiymatlarini protseduraga uzatadigan parametrlardir.
Endi yuqorida ko'rib chiqilgan sonlarning eng kattasini topish algoritmining dasturini qiymatli parametr bilan yozilgan protseduralar orqali amalga oshiraylik:
Protseduraga murojaat qilishda formal va faktik parametrlarning tiplari o'zaro mos kelishi kerak, aks holda dastur xato tuzilgan hisoblanadi. Yuqoridagi dasturdan ko'rinib turibdiki, a va b formal parametrlar o'rniga natijaviy qiymatlari ma'lum bo'lgan ifodalar qo'yildi. Demak, qiymatli faktik parametrlar o'rniga shu tipli natijaga erishuvchi ifodani yozish mumkin. Bundan tashqari, protsedurada kiritilgan a va b parametrlar faqat protseduraning ichidagina ma'noga ega, tashqarida, misol uchun asosiy dasturda ular tushunarsiz, qiymatlari aniqlanmagan miqdorlardir. Shuning uchun qiymatli parametrlarga protsedura natijalarini o'zlashtirib, asosiy dasturga uzatib bo'lmaydi.
Yuqorida tuzilgan dasturning asosiy kamchiligi shundaki, topilgan katta son doim S o'zgaruvchiga o'zlashtirilayapti. Misolimiz shartiga ko'ra esa natijalar u va v o'zgaruvchilarga o'zlashtirilishi kerak. Shuning uchun, dasturda ikki marta qo'shimcha u:=S va v:=S o'zlashtirish operatorlari yozildi.
Bu kamchilikni tuzatish uchun protseduraga yana bir parametrni kiritamiz. Lekin, kiritilgan bu parametr protseduraga qiymat olib kirmaydi balki, protsedura natijasini asosiy dasturga olib chiqib ketadi. Bunday parametrni parametr-o'zgaruvchi deb ataladi.
Parametr-o'zgaruvchini parametr-qiymatdan farq qilish uchun protsedurani aniqlashdagi parametrlar ro'yxatida o'zgaruvchi oldidan var xizmatchi so'zi yoziladi. Parametr-o'zgaruvchidan so'ng albatta uning tipi ko'rsatib qo'yiladi. Yuqorida aytganimizdek, formal parametr-qiymat o'rniga protseduraga murojaat qilganda shu tipli ifodani yozish mumkin bo'lsa,
parametr-o'zgaruvchi uchun bu hoi mutlaqo mumkin emas.
Protsedurani mukammallashtirib borish dinamikasini his etish uchun yana, yuqorida ko'rilgan maksimumni ,to-pish misolini parametr-o'zgaruvchi ishlatgan holda ko'rib chiqamiz:
Shunday qilib, bitta dasturni protseduraning uch xil varianti uchun tuzib chiqib, natijada ixcham va sodda dasturga ega bo'ldik.
Protseduralarni aniqlashda shu paytgacha oddiy tipli parametrlardan foydalanib keldik. Lekin, biz shuni yaxshi bilamizki, Paskal tilida hosilaviy tiplar ham mavjud.
Parametr-o'zgaruvchiga hosilaviy yangi tiplar berish xuddi oddiy skalyar tip berish kabi amalga oshirilaveradi. Ammo parametr-qiymatlarda yangi tiplar masalasiga batafsilroq yondashish kerak.
Biz yuqorida eslatib o'tdikki, faktik parametr formal parametr-qiymatga mos tipli ixtiyoriy ifoda bo'lishi mumkin. Lekin, Paskal tilida ixtiyoriy tipli qiymatlar uchun shu tipdagi natija beruvchi hech qanday amal ko'zda tutilmagan. Shuning uchun, bu tiplar uchun faktik
paraffietnaf fakat shu tipgal mos o’zgaruvchlar bo'lishi mumkin xolos. Bunday hol, xususiy holda massivlar uchun ham o'rinlidir.
Protseduradagi A vektorni parametr-qiymat sifatida yozib qo'yganimiz uchun, protseduraga qilinayotgan har bir murojaatda A vektorga mos ravishda XvaY vektorlar ko'chirib yoziladi va so'ng protsedura o'z ishini bajaradi. Biz bilamizki, bir tarafdan, massivlarning ustida ko'chirish amalini bajarishga ancha vaqt ketadi, ikkinchi tarafdan, har safar yangidan protseduraga qilingan murojaatda A vektor uchun xotiradan qo'shimcha joy ajratiladi. Shuning uchun, protseduraning sarlavhasida quyidagicha almashtirish qilsak, yuqoridagi ikki kamchilikni bartaraf qilgan bo'lamiz:
procedure maxl (var A: vector; var S: real);
Endi protsedurani e'lon qilish, undan foydalanib dastur yaratish malakasini hosil qilganimizdan so'ng uni e'lon qilishning sintaksis qoidalarini ko'rib chiqaylik.
Protsedurani aniqlash (e'lon qilish) quyidagicha amalga oshiriladi:
<protsedurani aniqlash>::=<protsedura sarlavhasl>; <blok> .
Bu yerda. <blok> tushunchasi to'liqligicha <dastur ta-nasi> tushunchasi bilan bir xil sintaksis qoida asosida aniqlangani tufayli bu tushunchaga ortiq qaytib o'tirmaymiz.
Endi esa <protsedura sarlavhasi>ga ta'rif beramiz:
<protsedura sarlavhasi>::=Procedure <protsedura ismi>| Procedure <protsedura ismi>(<formal parametrlar ro'yxati>)
Protsedura ismi dasturchi tomonidan tanlanadigan oddiy identifikator hisoblanadi.
Formal parametrlar ro'yxati quyidagicha aniqlanadi:
< formal parametrlar ro'yxati >::=<formal parametrlar seksiyasi > {;. < formal parametrlar seksiyasi >}
Formal parametrlar seksiyasi deganda protsedura pa-rametrlarining parametr-qiymat va parametr-o'zgaruvchi-lardan iborat bo'lishi tushuniladi:
< formal parametrlar seksiyasi >::={< ism > {, < ism >}: <ism tipi> var <ism>{,<ism>}:<ism tipi>
bu yerda <ism> — formal parametrlar sifatida ishlatiladigan identifikator.
Endi yuqoridagi aniqlashlarga tushuntirishlar berib o'tamiz.
Yuqoridagi Bekus—Naur formulalaridan ko'rinib turibdiki, formal parametrlar ro'yxati (agar u mavjud bo'lsa) bitta yoki bir nechta o'zaro nuqta- vergul (;) belgisi bilan ajratilgan seksiyalardan tashkil topgan. Har bir seksiyada esa o'z navbatida bitta yoki bir nechta o'zaro nuqta-vergul bilan ajratilgan formal parametrlar qatnashishi mumkin. Protseduradagi formal parametrlar sonini dasturchining o'zi protsedurani aniqlash mohiyatidan kelib chiqqan holda tanlaydi.
3.14. LOKALLASHTIRISH TAMOYILI
Hajmi katta va murakkab dasturlarni ishlab chiqishda, tabiiyki katta qiyinchiliklarga duch kelinadi. Katta, kompleks dasturlarni lozim bo'lgan muddatda yaratishga esa bitta dasturchining vaqti yetmaydi. Bunday hollarda dasturlarni ishlab chiqish uchun dasturchilarning katta guruhini jalb etishga to'g'ri keladi. Yagona dasturni yaratishda parallel ravishda ish olib boriladi va protsedura hamda funksiyalaming roli juda katta bo'ladi. Bajarilishi kerak bo'lgan ishni mustaqil bo'limlarga ajratilib, har bir mustaqil ish alohida dasturlanib, keyin ular yagona — asosiy dasturga birlashtiriladi.
Asosiy dasturda ishlatiluvchi o'zgaruvchilar va protseduralar parametrlarini qanday tanlab olish kerak degan muammo bajariladigan ishning eng og'ir qismlaridan biri bo'lib qoladi. Agar ularni bir-birlariga bog'lab yuborilsa u holda asosiy dasturdagi biror o'zgaruvchiga kiritilgan o'zgartirish, protsedurada ishlatilgan va shu o'zgaruvchiga bog'liq barcha ishlarni qaytadan tahlil qilib, tekshirib chiqishga to'g'ri keladi. Bunday chalkash va og'ir ishni bajarishning qiyinligi dastur tuzishda bir nechta dasturchining parallel ravishda, ish olib borishiga to'sqinlik qiladi.
Shuning uchun protsedura va funksiyalarni yozishda har bir dasturga o'zi yechayotgan masalaga muvofiq holda turli xil ichki o'zgaruvchilar, dasturli ob'ektlar o'zgaruvchilarining turli qiymatlarini tanlab olish huquqi beriladi. Hattoki bitta o'zgaruvchini turli xil vazifalarda ishlatsa ham bo'ladi. Paskal tilida bunday masalani hal qilish uchun lokallashtirish tamoyili ishlab chiqilgan. Bunda protsedura yoki funksiyada ishlatilgan o'zgaruvchi shu protsedura yoki funksiyaning ta'sir doirasida (ichida) gina o'z qiymatini saqlab qoladi. Protsedura va funksiyalaming ichida aniqlanib, qiymatlangan o'zgaruvchilarni lokal (ichki) o'zgaruvchilar deb ataladi. Tashqarida, ya'ni asosiy dasturda kiritilgan o'zgaruvchilar esa umuman olganda dasturning ixtiyoriy joyida o'z qiymatini saqlab qola oladi.
Matematika kursidan funksiya tushunchasi bizga yaxshi tanish bo'lib, uning yordamida funksiya va argument o'rtasidagi bog'liqlik aniqlanadi. Paskal tilida ham funksiya tushunchasi kiritilgan bo'lib, uni shartli ravishda ikki turga ajratsak bo'ladi: standart funksiyalar, dasturchi tomonidan aniqlangan protsedura-funksiyalar. Standart funksiyalar har bir algoritmik til uchun aniqlanib, amalda ko'p uchrab turuvchi funksiyalarning qiymatlarini hisoblab berishga mo'ljallangan. Masalan, sin (x), cos(x), exp(x), abs(x), sqrt(x) va h.k.
Xuddi standart funksiyalar kabi dasturchi ham o'zi uchun zarur, mustaqil dastur ob'ektlarini funksiyalar ko'rinishida. aniqlab, undan kerakli paytda foydalanishi mumkin.
Funksiya Paskal tilida quyidagi struktura bo'yicha aniqlanadi:
function <funksiya ismi>(<formal parametrlar ro'yxa-ti>):
<funksiya qiymatining tipi>;
label
<metkalar ro'yxati>;
const
<o'zgarmaslarning qiymatlarini aniqlash>;
type <yangi tiplarni kiritish>; var
<o'zgaruvchilarning tiplarini e'lon qilish>;
<funksiya uchun ichki protseduralar va funksiyalarni aniqlash>; begin
<funksiyaning tana qismi>
end;
Yuqorida eslatib o'tganimizdek, funksiyalar ham protseduralar kabi mustaqil dasturlar hisoblanib, asosiy dastur orqali boshqariladi va xuddi asosiy dastur va protseduraga o'xshash strukturada yoziladi.
Funksiyani ham protsedura kabi dasturning var (o'zgaruvchilar tiplarini e'lon qilish) bo'limida aniqlab qo'yiladi. Protsedura uchun aytilgan gaplarning deyarli barchasi funksiya uchun ham o'rinlidir. Funksiyaning protseduradan asosiy farqi quyidagilardir:
■ funksiya sarlavhasi boshqacha aniqlanadi;
■ funksiyaning ishi davomida olinadigan natija funksiyaning ismiga o'zlashtiriladi, ya'ni funksiyaning tana qismida albatta funksiya ismiga mos tipli qiymat o'zlashtirilgan bo'lishi kerak;
■ funksiyadan asosiy dasturga uning ismi orqali bittagina qiymat beriladi.
Funksiyaga murojaat ham xuddi protseduradagi kabi amalga oshiriladi, lekin funksiyaning mos tipli ifodada qatnashish kabi qo'shimcha imkoniyati ham mavjud.
Endi funksiyani aniqlash va unga murojaat qilishni to'liqroq o'rganish uchun quyidagi misolni e'tiboringizga havola qilamiz:
Funksiyalarni aniqlashda doim shunday harakat qilish lozimki, uning tana qismida formal parametrlar va funkiyani aniqlash uchun zarur bo'lgan lokal o'zgaruvchilargina atnashsin. Dasturning global o'zgaruvchisiga iloji boricha rotsedura yoki funksiya ichidan turib qiymat bermaslik erak, aks holda dastur xato natija berishi mumkin.
Bu dasturning ishlashi natijasida x=5, y=11 va x=7 qiymatlar ekranga chiqariladi, ya'ni funksiyaning ichki qis-midagi x=7 qiymati asosiy dasturdagi natijaviy qiymatlarga o'z ta'sirini o'tkazmoqda.
Paskal tilida protsedura-funksiyalar bilan ishlashda funksiyalarning rekursivlik xossasidan foydalanish imkoniyati yaratilgan.
Rekursiya tushunchasiga misol qilib oddiy faktorial hisoblashni keltirish mumkin:
bu yerda ko'rinib turibdiki n! qiymati (n — 1)! orqali aniqlanayapti (rekursiya so'zi o'zi orqali o'zini aniqlash ma'nosini anglatadi).
Paskal tili ham funksiyalarni rekursiv aniqlash imkoniyatini beradi. Funksiyani rekursiv aniqlash uning tana qismida o'ziga o'zi murojaat qilish orqali amalga oshiriladi.
Yuqoridagi faktorial hisoblashni rekursiv funksiyalar orqali amalga oshiraylik:
Funksiyalarni rekursiv aniqlash qisqa va tushunarli tilda bo'ladi. Rekursiv bo'lmagan tarzda aniqlash esa uzoq vaqtni oladi va funksiyaning samarasini kamaytiradi. Rekursiv
aniqlash holida esa sarflangan EHM vaqti va xotira ancha yuqori bo'ladi.
Yuqorida ko'rib chiqilgan va aniqlangan barcha protsedura hamda funksiyalarning parametrlari qandaydir tipli qiymat yoki o'zgaruvchilar bo'lgan edi. Ammo shunday hollar ham uchrab turadiki, ayrim parametrlarni funksiyalar yoki protseduralar orqali aniqlash lozim bo'ladi. Bu holga misol sifatida
■
3.16.TURBO — PASKALDA MODULLAR
3.16.1. Turbo—Paskalning modullari.
Foydalanuvchi modulini yaratish
Shaxsiy kompyuterlarning eng katta kamchiligi ularda amaliy dasturlar kutubxonasining to'liq emasligidadir. Katta EHMlarda dastur tuzuvchilar uchun juda katta dasturlar kutubxonasi xizmat qilar va ulardan foydalanib tuzilgan dasturlar o'zlarining ishonchlilik darajasi bilan yuqori turar edi. Shaxsiy kompyuterlarning bu kamchiligini yo'qotish uchun Turbo—Paskalda modullar tushunchasi kiritilgan. Umuman olganda, har bir malakali dasturchi o'z dasturini protsedura va funksiyalardan foydalanib tuzadi. Lekin, bu protsedura va funksiyalardan boshqa dasturlarda foydala-nish uchun ularning matnlarini qayta ko'chirib yozish lozim bo'ladi.
Turbo — Paskalda bu masalani yechish uchun modullar yaratilib, ularni kompilyatsiya qilinadi va bu moduldan boshqa dasturlarda bemalol foydalanilaveriladi.
Turbo — Paskal tilining yaratuvchilari quyidagi zarur va foydali modullarni yaratib, dasturchilar uchun juda katta qulayliklar yaratishgan:
1) System moduli— standart protsedura va funksiyalarni o'z ichiga olib, avtomatik tarzda barcha dasturlar uchun ochiqdir;
2) DOS moduli — MS DOS operatsion tizimi bilan ishlashni tashkil qiluvchi funksiya va protseduralar-dan tashkil topgan;
3)Crt moduli — ekran, klaviatura va IBM rusumida-gi kompyuterlarning tovushli dinamigi bilan ishlash protseduralarini o'z ichiga olgan;
4) Graph moduli — kompyuterning grafik imkoniyatlaridan foydalanib yaratilgan funksiya va protsedu-ralarning katta to'plami;
5) Printer moduli — bu kichkinagina modul printer qurilmasi bilan ishlashni osonlashtiradi;
6) Overlay moduli — katta dasturlarni bir nechta bo'laklarga ajratishning kuchli vositasi bo'lib, bir qancha protseduralar va funksiyalardan tashkil topgan.
Modullardan foydalanish uchun dastur sarlavhasi
Program <programma nomi>;
dan keyin quyidagi qator yozilishi kerak:
Uses <modul ismi>;
Agar dasturda bir nechta modul ishlatilsa, ularning ismlari ketma-ket yozib qo'yiladi:
Uses <modul ismil>,<modul ismi2,>,...,<modul ismiN>;
Turbo — Paskal bizga o'zimizning modullarimizni yaratib olish imkonini ham beradi. Foydalanuvchi modullari quyidagicha tuzilishda bo'ladi:
Unit<modul ismi>;
Interface
…
( ochiq e'lonlar bo'limi — interfeys seksiyasi}
…
Implementation
…
{ yopiq e'lonlar bo'limi}
…
Begin
…
{Initsializatsiya bo'limi}
End. "
Agar modul o'z ichida boshqa modullardan foydalansa Interface xizmatchi so'zidan keyin
Uses <modullar ro'yxati>;
yoziladi.
Interfeysli bo'lim modulning bir qismi bo'lib, Interface va Implementation so'zlari orasida joylashadi. Bu bo'limda o'zgarmaslar, ma'lumotlar tipi, o'zgaruvchilar, protsedura va funksiyalarni aniqlash mumkin. Bu kiritilganlar mazkur modulda qatnashuvchi barcha dasturlar va modullarda bemalol ishlatilishi mumkin. Bo'limda sanab o'tilgan protsedura va funksiyalarning tana qismlari Implementation so'zidan keyin aniqlanadi (ularning sarlavhalari aynan saqlanib qolishi kerak). Bu bo'limda ham, faqat shu bo'lim uchungina «Ko'rinadigan» (ishlatilishi mumkin bo'lgan) e'lonlar bo'limi qatnashishi mumkin.
Initsializatsiya* bo'limi Begin va End so'zlari ichiga olib yoziladi. Agar Begin so'zi tushirib qoldirilgan bo'lsa, demak bu bo'lim yo'q hisoblanadi. Initsializatsiya bo'limida boshqarishni asosiy dasturga uzatgungacha bajariladigan operatorlar joylashgan bo'ladi. Bu operatorlar asosan dasturni ishga tushirishga tayyorlab beradi.
Biz zarur modulni hosil qildik, endi uni kompilyatsiya qilishimiz lozim. Kompilyatsiya natijasida Stud.tpu ismli fayl hosil qilinishi kerak. Kompilyatsiya qilinmagan modulning ismi esa shunga mos holda Stud.pas bo'lishi kerak.
3.16.2. System modulining protsedura va funksiyalari
Yuqorida aytganimizdek, System modulining protseduralari va funksiyalari barcha dasturlar uchun ochiq bo'lib, ulardan keng foydalanish mumkin. System modulining ismini modullar ro'yxatida ko'rsatish shart emas.
Quyida ushbu moduining ma'lum bir qism protseduralar va funksiyalari bilan qisqacha tanishib chiqamiz:
1. Dastur ishini bajarish protseduralari. Exit protsedurasi. V a z i f a s i: aktiv ishchi blokidan chiqish, bajarilayotgan ishni yakunlash;
Aniqlanishi: Exit.
Halt protsedurasi. V a z i f a s i: dastur bajarilishini to'xtatadi va OS ga boshqarishni qaytaradi;
Aniqlanishi: Halt[(ExitCode:Word)]; bu yerda majburiy bo'lmagan (o'rta qavs majburiy emas belgisi) ExitCode parametri dasturning yakunlanish kodini beradi, agar bu parametr bo'lmasa bu kod nolga teng bo'ladi.
RunError protsedurasi. Vazifasi: dasturning bajarilishini to'xtatadi va bajarilish vaqtidagi xatolarni aniqlaydi;
Aniqlanishi: RunError[(ErrorCode:Word)]; bu yerda ErrorCode pararnetrining xatolik raqami haqidagi ma'lumoti ekranga chop etiladi.
2. Tiplarni almashtirish funksiyalari.
Chr funksiyasi. Vazifasi: ASCII jadvalidan berilgan butun songa mos bo'lgan belgini aniqlaydi;
Aniqlanishi: Chr(N:Byte):Char; bu yerda N — belgining ASCII jadvalidagi qiymatini ifodalovchi butun musbat son.
Ord funksiyasi. Vazifasi: sanalma tipli qiymatlar bo'yicha uning tartib sonini aniqlash;
Aniqlanishi: Ord(X):LongInt; bu yerda X — sanalma tipli qiymat.
Round funksiyasi. Vazifasi: haqiqiy tipli qiymatni yaxlitlab, katta butun, son hosil qiladi;
Aniqlanishi: Round(X:Real):LongInt;
Trunc funksiyasi. Vazifasi: haqiqiy tipli qiymatning kasr qismini tashlab yuborib, butun son hosil qiladi;
Aniqlanishi: Trunc(X:Real):LongInt;
3. Arifmetik funksiyalar.
Bu funksiyalarning yozilishi va ulardan foydalanish qoidalari o'zlashtirish operatori mavzusida to'liq berib o'tilganligi uchun ularga to'xtalib o'tirmaymiz.
4. Sanalma tip funksiyalari va protseduralari.
Dec protsedurasi. Vazifasi: o'zgaruvchi qiymatini kamaytiradi;
Aniqlanishi: Dec(Var X[;n]:LongInt); bu yerda yozilishi majburiy bo'lmagan «n» o'zgaruvchi argumentning qiymatini qanchaga kamaytirish lozimligini ko'rsatadi. Bu o'zgaruvchi yozilmasa argument qiymati bir soniga kamayadi.
Inc protsedurasi. Vazifasi: o'zgaruvchi qiymatini orttiradi;
Aniqlanishi: Inc(Var X[;n]: Integer); bu yerda Dec protsedurasiga teskari ish bajariladi.
Odd funksiyasi. Vazifasi: argumentning toq yoki juft sonligini tekshiradi;
Aniqlanishi: Odd( X:LongInt):Boolean; bu yerda natijaviy qiymat rost (True) bo'lsa son toq, aks holda son juft.
Pred protsedurasi. Vazifasi: argumentning oldingi qiymatini aniqlash;
Aniqlanishi: Pred(X);
Succ protsedurasi. Vazifasi: argumetning keyingi qiymatini aniqlash;
Aniqlanishi: Succ(X);
5. Satrlar bilan ishlash funksiyalari va protseduralari.
ConCat funksiyasi. Vazifasi: satrlarni ketma-ket ulaydi;
Aniqlanishi: ConCat(Sl[,S2,...,SN]:String):String; bu yerda SI qatorni keyingi sanab o'tilgan qatorlar bilan ularning yozilish tartibida ulaydi.
Copy funksiyasi. Vazifasi: satr ichidan yangi satr hosil qilish;
Aniqlanishi: Copy(S:String;Index,Count:Ineger):String; bu yerda S — berilgan satr;
Index-S satrining nechanchi belgisidan boshlab yangi satr hosil qilish kerakligini aniqlaydi;
Count — yangi satrdagi belgilar soni.
Delete protsedurasi. V a z i f a s i: berilgan satr ichidan satr ostini olib tashlaydi;
Aniqlanishi: Delete(Var S:String;Index:Integer; Count:Integer);
bu yerda S — berilgan satr;
Index — shu tartib raqamli belgidan boshlab S satr-dan satr osti olib tashlanadi;
Count — olib tashlanadigan satrdagi belgilar soni.
Insert protsedurasi. Vazifasi: berilgan satrga yangi satr qo'shadi;
Aniqlanishi: Insert (Sl:String; Var S2:String; Index: Integer);
bu yerda S2—berilgan satr;
SI— qo'shiladigan satr;
Index—S2 satrning qaysi tartib raqamli hadidan boshlab yangi satr qo'shilishini anglatadi.
Length funksiyasi. Vazifasi: satr uzunligini aniqlaydi;
Aniqlanishi: Length(S:String):Integer; bu yerda S satridagi belgilarning soni aniqlanadi:
Pos funksiyasi. V a z i i a s i: satrdan satr ostini qidiradi;
Aniqlanishi: Pos(SubStr,S:String):Byte; bu yerda SubStr — S satrda qidirilayotgan satr osti.
Agar SubStr satr osti S satrida topilsa, Pos funksiyasi mos kelgan birinchi belgining tartib raqamini beradi, agar bu satr osti S satrda bo'lmasa, funksiya nul qiymat beradi.
Str protsedurasi. Vazifasi: sonli qiymatni uning satrli ko'rinishiga o'tkazadi;
Aniqlanishi: Str(X[:Width[:decmals]];Var S:String);
bu yerda yozilishi shart bo'lmagan Width va decmals parametrlari mos ravishda S satrining hadlar sonini va haqiqiy sonning verguldan keyingi hadlar sonini ifodalaydi.
Val protsedurasi. Vazifasi: satrli qiymatni uning sonli ko'rinishiga o'tkazadi;
Aniqlanishi: Val(S:String;Var V; Var Code: Integer); bu yerda S — berilgan satr;
V — S satrning uning sonli ko'rinishiga o'tkazganidan keyin hosil bo'lgan sonni saqlash joyi;
Code — butun tipli o'zgaruvchi.
Agar S satrni songa aylantirib bo'lmasa Val protsedurasi bajarilganidan so'ng Code o'zgaruvchisi nul qiymatni qabul qiladi.
6. Parametrlar bilan ishlash funksiyalari.
Dasturni ishga tushirishda unga uzatiladigan qiymatlarni parametrlar deb hisoblaymiz.
Misol: Tizimli dasturlashning quyidagi Copy buyrug'ini ko'raylik:
Copy file.dat c:\ prog\ file 2. dat
ya'ni, aktivlashgan katalogdagi file.dat faylining nusxasini «S» diskning prog katalogiga file2.dat nomi bilan ko'chirish. Bu yerda Copy buyrug'iga parametr sifatida «filel.dat»va «file2.dat» qatori uzatilmoqda.
Turbo—Paskalda parametrlar bilan ishlash uchun ParamCount va ParamStr funksiyalari mavjud.
ParamCount funksiyasi. Vazifasi: buyruqli qatordan dasturga uzatilgan parametrlar sonini aniqlaydi;
Aniqlanishi: ParamCount: Word;
ParamStr funksiyasi. Vazifasi: ko'rsatilgan raqamdagi parametrni aniqlaydi;
Aniqlanishi: ParamStr (N:Integer): String;
7. Adreslar bilan ishlash funksiyasi.
Addr funksiyasi. Vazifasi: ko'rsatilgan ob'ektning adresini (o'rnini) aniqlaydi;
Aniqlanishi: Addr(X):Pointer; bu yerda X — ixtiyoriy tipli o'zgaruvchi yoxud dasturda e'lon qilingan protsedura yoki funksiya ismi.
Seg funksiyasi. Vazifasi: ko'rsatilgan o'zgaruvchi adresining segment qiymatini aniqlaydi;
Aniqlanishi: Seg(X):Word;
bu yerda X — ixtiyoriy tipli o'zgaruvchi yoxud dasturda e'lon qilingan protsedura yoki funksiya ismi.
8. Boshqa protsedura va funksiyalar.
FillChar protsedurasi. Vazifasi: ko'rsatilgan qiymat bilan ketma-ket kelgan va chekli sondagi baytlarni to'ldiradi;
Aniq lanishi: FillChar(Var X;Count:Word;Value);
Hi funksiyasi. V a z i f a s i: argumentning katta baytini aniqlaydi;
Aniqlanishi: Hi(X):Byte; .
Lo funksiyasi. V a z i f a s i: argumentning kichik baytini aniqlaydi;
Aniqlanishi: Lo(X):Byte;
Move protsedurasi. V a z i f a s i: ko'rsatilgan miqdordagi baytlardan tezkor (operativ) xotiraning bir qismidan ikkinchi qismiga nusxa ko'chiradi;
Aniqlanishi: Move(Var Cource,Dest;Count:Word);
Random funksiyasi. Vazifasi: tasodifiy sonni aniqlaydi;
Aniqlanishi: Random([Range:Word]); bu yerda aniqlanadigan tasodifiy son 0 va Range sonlari oralig'ida yotadi.
Randomize protsedurasi. Vazifasi: tasodifiy sonni hosil qiluvchi generatorni ishga tushiradi;
Aniqlanishi: Randomize;
UpCase funksiyasi. Vazifasi: kichik lotin harf-larni katta harflarga o'tkazadi;
Aniqlanishi: UpCase(Ch:Char):Char; funksiya rus alifbosi harflarini ham katta harflarga o'tkazadi.
3.16.3. Crt modulining protsedura va funksiyalari
Yuqorida qisqacha aytib o'tganimizdek, Crt moduli matnli ekran, klaviatura va tovush dinamigi bilan ishlashni tashkil etuvchi dasturlar bilan jihozlangan.
Matnli rejimdagi ekran odatda 25 ta qator va har bir qatorda 80 ta belgi sig'dirish imkoniyatiga ega. Ekranda hosil qilish mumkin bo'lgan ranglar soni esa 16 ta (oqqora rangli ekran rangini ko'zda tutmayapmiz).
Ekranda kerakli belgini zarur joyda chiqarish, matn va fon rangini o'zgartirish hamda ekranning ishini to'liq boshqara olish Crt modulining vazifalaridan hisoblanadi:
■ GotoXY(I,J:Byte) protsedurasi ekranning I ustun va J satriga kursorni ko'chirib beradi;
■ Write(S) protsedurasi kursor turgan joydan S qatorni chop etadi;
■ TextColor(ColonByte) protsedurasi ekranga chiqariladigan matn rangini o'rnatadi;
■ TextBackGround(Color:Byte) protsedurasi chop etiluvchi matn uchun ekran fonining rangini o'rnatadi;
■ ClrScr protsedurasi TextBackGround protsedurasi o'rnatgan rang bilan ekranni tozalaydi, agar rang o'rnatilmagan bo'lsa ekran qora rang bilan tozalanadi, kursor ekranning chap yuqori qismiga chiqariladi;
■ AssignCrt(Var F:Text) protsedurasi Crt modulini o'rnatish uchun matnli faylni ta'minlaydi;
■ ClrEol protsedurasi kursor turgan joydan boshlab ekranni tozalaydi. Agar Window protsedurasi bilan oyna ochilgan bo'lsa tozalov shu oyna ichida bo'ladi. Kursor o'z o'rnini o'zgartirmaydi;
■ Delay(N:Word) protsedurasi N millisekund davomida to'xtashni tashkil etib beradi;
■ DelLine protsedurasi kursor turgan qatorni o'chiradi. Qolgan qatorlar bir satrga yuqoriga siljiydi va ekranning oxirgi qatori tozalanadi;
■ High Video protsedurasi chop etilayotgan belgilar uchun yuqori yorug'lik o'rnatadi;
■ InsLine protsedurasi kursor turgan joyga bo'sh qator o'rnatadi;
■ KeyPressedrBoolean funksiyasi agar klavish bosilsa True, klavish bosilmagan bo'lsa False qiymatni qaytaradi;
■ LowVideo protsedurasi chop etilayotgan belgilar uchun past yorug'lik o'rnatadi;
■ NormVideo protsedurasi chop etilayotgan belgilar uchun o'rtacha yorug'lik o'rnatadi;
■ NoSound protsedurasi tovush dinamigini o'chiradi;
■ ReadKey:Char funksiyasi klaviaturadan belgini o'qiydi;
■ Sound(X:Word) protsedurasi tovush dinamigini ulaydi va uni berilgan X chastotada tovush chiqa-rishga majbur qiladi;
■ TextMode(N:Integer) protsedurasi kerakli N— matnli rejimni o'rnatadi;
■ WhereX:Byte [unksiyasi kursor turgan joyning ustun raqamini (qaralayotgan oynada), ya'ni X koor-dinatasini aniqlaydi;
■ WhereY:Byte [unksiyasi qaralayotgan oynaga nisbatan kursor joyining qator raqamini, ya'ni Y koordinatasini aniqlaydi;
■ Window(Xl,Yl,X2,Y2:Byte) protsedurasi ekranda matnli oyna hosil qiladi. Bu oyna o'zini xuddi to'liq ekrandek his etadi.
Ranglar bilan ishlashni qulaylashtirish maqsadida Crt modulida quyidagi o'zgarmaslar kiritilgan:
3.16.4 MSDOS modulining protsedura va funksiyalari
DOSning tizimli moduli 6 kilobayt atroiidagi joy egallab, MSDOS muhiti bilan ishlashga hamda uning imkoniyatlaridan foydalanishga mo'ljallangan protseduralar va funksiyalarga ega. Aslida bu protseduralar va funksiyalar Paskal tilining sintaktik qoidalariga moslashtirilgan MSDOSni chaqirish iunksiyalaridir.
DOS modulidagi protsedura va funksiyalarni bajaradigan ishlarining ma'nolariga ko'ra oltita funksional guruhga ajratish mumkin:
■ MSDOS parametrlarining so'rovi va ularni o'rnatish;
■ SHEHMda taqvim (kalendar) va soatlar bilan ishlash;
■ Disk resurslarining tahlili (analizi);
■ Katalog va fayllar bilan ishlash;
■ MSDOS uzilishlari(prerivaniye) bilan ishlash;
■ Rezident dasturlar va subprotsesslar bilan ishlash.
1. MSDOS parametrlarining so'rovi va ularni o'rnatishning protseduralari hamda funksiyalari:
■ DOSVersion:Word funksiyasi MSDOS versiyasining kodlashtirilgan raqamini aniqlaydi;
■ GetCbreak (Var B: Boolean) protsedurasi Break parametrining qiymatini o'qiydi;
■ SetCbreak(Var B: Boolean) protsedurasi Break qiymatini o'rnatadi;
■ GetVerify(Var VrBoolean) protsedurasi Verify/ parametrining qiymatini o'qiydi; ; ■ SetVerify(V:Boolean) protsedurasi Verify qiymatini o'rnatadi;
■ EnvCountrlnteger funksiyasi MSDOSning tizimli o'zgaruvchilari sonini aniqlaydi;
■ EnvString(N:Integer):String funksiyasi N raqamli MSDOS o'zgaruvchisining to'liq vazifa qatorini beradi;
■ GetEnv(E:String):String funksiyasi E tizimli o'zgaruvchining qiymatini aniqlaydi.
2. SHEHMda taqvim va soatlar bilan ishlash protsedura hamda funksiyalari:
DOS modulida kompyuter soati va taqvim bilan ishlash hamda fayllarni tashkil qilish kuni va vaqtini o'rnatish protseduralari mavjud:
■ GetDate(Var Year,Month,Day,Dw:Word)
SHEHM soatidan yil, oy, kun va hafta kunini o'qiydi;
■ SetDate(Year,Month,Day:Word) SHEHMning soatiga yil, oy va kunni o'rnatadi;
■ GetTime(Var Hour,Min,Sec,SeclOO:Word) SHEHM soatidan hozirgi vaqtni aniqlaydi;
■ SetTime(Var Hour,Min,Sec,SeclOO:Word) SHEHM soatiga yangi vaqtni o'rnatadi;
■ PackTime(Var DtrDatetime; Var T:Longint) kun,oy, yil va vaqt ma'lumotlarini faylga yozish uchun ixcham holda tayyorlaydi.
■ UnPackTime(Var T:Longint;Var Dt:Datetime) fayldan o'qilgan kun, oy, yil va vaqt yozuvini ochib beradi;
■ GetFtime(Var F; Var T:Longint) ochiq F fayl uchun kun, oy, yil va vaqtning ixcham yozuvini o'qib beradi;
■ SetFtime(Var F; Var T:Longint) ochiq F fayl uchun yil, oy, kun va vaqtning ixcham yozuvini yozib qo'yadi.
3. Disk resurslari tahlilining funksiyalari:
DOS moduli o'z ichiga disk holatini tahlil qilishning ikkita funksiyasini oladi:
■ DiskFree(D:Word):Longint diskdagi bo'sh joy o'lchovini aniqlaydi;
■ DiskSize(D:Word):Longint diskning to'liq hajmini baytlarda aniqlab beradi. Bu yerda D butun qiymatli parametr yoki butun son bo'lib, uning qiymati aniq bir diskni ko'rsatadi:
■ Agar D=0 bo'lsa ishlatilayotgan joriy disk, D=l bo'lsa A disk, D=2 bo'lsa  disk va hokazolar tahlil qilinadi;
■ Agar mazkur tizim D ning kiritilgan qiymatiga mos diskni topa olmasa funksiya — 1 ga teng qiymat beradi;
4. Kataloglar hamda fayllar bilan ishlash funksiyalari va protseduralari.
Paskal tilining tashqi fayllar bilan ishlash imkoniyatlari juda cheklangan bo'lib, ular asosan quyidagilardan tashkil topgan: faylni ochish, yopish, qayta nom berish va o'chirish. Bu kamchiliklarni bartaraf qilish uchun DOS
modulida quyidagi funksiyalar va protseduralar ko'zda tutilgan:
■ Find Firs t( Path: String; At tr: Word; Var SnSearchRec) protsedurasi Path so'rovi bo'yicha Attr atributli birinchi mos ismni topadi;
■ FindNext(Var SnSearchRec) protsedurasi FindFirst protsedurasidan keyin chaqirilib, keying! mos ismlarni topish uchun ishlatiladi;
■ FSearch(Path:PathStr; DirList:String):PathStr funksiyasi DirList kataloglar ro'yxatidan Path ismli faylni qidiradi;
■ GetFattr(Var F:File; var Fa:Word) protsedurasi F fayl bilan bog'liq diskdagi faylning Fa atributini o'qiydi;
■ SetFattr(Var F:File; var Fa:Word) protsedurasi F fayl bilan bog'liq diskdagi faylga atribut o'rnatadi;
■ Fsplit(Path:PathStr; Var Dir:DirStr; Var Name:NameStr; Var Ext:ExtStr) protsedurasi Path faylining to'liq ismini uni tashkil etuvchilariga ajratadi: Dir—yo'li, Name—ismi, Ext—kengaytmasi.
5. MSDOS uzilishlari bilan ishlash.
MSDOS ning tizimli funksiyalarini chaqirish uzilishlar ko'rinishida hal qilinadi. Har bir uzilish aktivlashtirilgandari keyin turli xil funksiyalar to'plamiga murojaat qilish imkoniyatini yaratadi. Masalan, 16H raqamli uzilish operatsion tizim darajasidagi klaviatura bilan muloqotni tashkil etuvchi funksiyalarga yo'l ochib beradi, 25H raqamli uzilish esa diskni o'qish ishlarini boshqarishni o'z zimmasiga oladi va hokazo. Juda katta vazifalar 21H uzilish zimmasidadir, chunki u operatsion tizim (OT)ni tashkil etuvchi o'nlab funksiyalardan foydalanishni tashkil qilib beradi.
Quyida e'tiboringizga Paskal dasturidan turib MSDOSning funksiyalariga murojaat qilishni tashkil qilib beruvchi DOS moduli protseduralarining vazifalari va aniqlanishlarini havola qilamiz:
■ GetIntVec(N:byte; Var Adress:pointer) protsedurasi Adress ko'rsatkichiga berilgan N raqamli uzilish qism dasturining adresini aniqlab beradi;
■ SetIntVec(N:byte; Var Adress:pointer) protse-durasi N-raqamli uzilishning yangi qism dasturini DOS ga o'rnatib, adresning eski qiymatini Adress ko'rstkichiga joylaydi;
■ Intr(N:byte; Var R:Register) protsedurasi N dasturli uzilishni aktivlashtirib, funksiya raqami va parametrlarini R o'zgaruvchiga uzatadi;
■ MSDOS(Var R:Register) protsedurasi 21H raqamli uzilishni maxsus chaqirish vazifasini bajaradi.
Oxirgi protsedurada yangi Register tipi kiritildi. Bu tip DOS modulida aniqlangan quyidagi yozuvdan iborat:
Type
Register = Record
case Integer of
0:(AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags:Word);
l:(AL,AH,BL,BH,CL,CH,DL,DH:Byte);
end;
Bu tipdagi o'zgaruvchilar mikroprotsessor registrlarga Intr va MSDOS larni chaqirishda yo'l ochish uchun ishlatiladi:
0—variantida 16 razryadli registrlarga 1—variantda esa 8 razryadli protsessor yacheykalariga murojaat qilinadi.
6. Rezident dasturlar va subjarayon (subpro-tsess)larni tashkil qilish.
MSDOS operatsion tizimi subjarayonlarni tashkil qilish bo'yicha katta imkoniyatlarga ega. Subjarayonda bir dastur boshqa bir dasturni ishga tushirsa, boshqa bir dastur esa o'z navbatida keyingi dasturni ishga tushiradi va hokazo. Bu holda ishga tushiruvchi dastur (jarayon) subjarayonning ishini tashkil qilib o'zi ishdan to'xtaydi, lekin SHEHM xotirasida saqlanib turadi. Subjarayon esa xotiraning qolgan qismida ixtiyoriy dastur kabi bajariladi. U o'z ishini yakunlagach keyingi jarayon dasturi ish boshlaydi.
MSDOS ning bu xossasi integrator-dasturlarni yaratish imkoniyatini hosil qiladi. Hammaga tanish bo'lgan Norton Commander dasturi subjarayonlardan aktiv foydalanuvchi, rezident bo'lmagan dastur hisoblanadi.
Oddiy dasturlar o’z isfiirn yaKunlagacn SHEHM"xctirasini bo'shatib qo'yadi. Subjarayonlar esa ishini yakunlagach, boshqarishni o'zlarini chaqirgan dasturlarga, ular esa o'z navbatida keyingisiga uzatadi va jarayon oxirida boshqarish ÎÒ (operatsion tizim)ga uzatiladi.
Rezident dasturlar esa boshqacha ishlaydi. Ular ishga tushgach darrov qandaydir amallarni bajarishi mumkin, yoki ÎÒ uzilishlari bilan turli xil tushunarsiz ishlarni amalga oshirishi mumkin. Ularning asosiy hislati shundaki, o'z ishini yakunlagach SHEHM xotirasida saqlanib qoladi va biror bir shartning bajarilishiga qarab qayta «tirilishi», ya'ni yana ishlay boshlashi mumkin. Rezident dasturlarga misol qilib quyidagi dasturlarni ko'rsatish mumkin: Side Kick tizimi, ALFA va BETA kirill drayverlari, antivirus dasturlari, virus dasturlari va hokazo.
Rezident dasturlarning barchasini bir xil narsa birlash-tiradi, bu ham bo'lsa ularning ichki(tezkor) xotira (OZU)da joylashishi va maxsus shartlarda ( ALFA, BETA klavishlarini bosishda, antivirus dasturlarga murojaatda, qo'yilgan vaqt yetib kelganida va h.k.) qayta «tirilishi». Passiv holatlarda rezident dasturlar faqat ortiqcha joy ushlab tunshadi hamda boshqa oddiy dasturlar ishiga halaqit berishmaydi.
SHEHM xotirasidan unumli foydalangan holda subjarayonlarni tashkil qilish va rezident dasturlar bilan ishlashning maxsus protseduralaridan foydalanish mumkin:
■ Swap Vectors protsedurasi ishga tushirilayotgan subjarayonlar uchun tizimli yoki vaqtinchalik uzilishlar vektorlarini tiklaydi;
■ Exec (ExeFile, Combine: String) protsedurasi ComLine satrli parametr bilan ExeFile (subjarayon) bajariluvchi faylni ishga tushiradi;
■ DosExitCode: Word funksiyasi subjarayon yakunlanganligi haqidagi kodni aniqlaydi;
■ Keep(ExitCode:Word) protsedurasi SHEHM xotirasidan o'chmagan holda dastur ishini yakunlaydi (rezident kodini tashkil qiladi).
Paskal tilining kutubxonasida sanab o'tilgan modullar qatorida Printer moduli ham o'zining munosib joyini egallagan, chunki olingan natijalarni printer orqali qog'ozga chop etish muhim ishdir. Bu modulning asosiy vazifasi, dastur va chop etuvchi qurilma (odatda printer) o'rtasida aloqa o'rnatishdir.
Bu kichik modul boryo'g'i bitta o'zgaruvchi va bajariluvchi matnning ikki qatoridan tashkil topgan. Bu modul Lst o'zgaruvchisi va LPT1 (birinchi parallel port) tizimli qurilma mosligini o'rnatadi. Modulning to'liq matni quyidagicha:
Unit Printer;
Interface
Var
Lst:Text;
Implementation
Begin
Assign(Lst,'LPTl');
Rewrite(Lst)
End.
Printer moduli ulangandan so'ng Write(Lst,...) va WriteLn(Lst,... ) operatorlari natijaviy ma'lumotlarni to'g'ridanto'g'ri printerga chiqaradi.
Agar printer boshqa qurilma orqali, masalan ikkinchi port LPT2 yoki ketma-ket S0M1 porti orqali ulangan bo'lsa, u holda dasturchi o'zining Printer2 nomli modulini yaratib olishi mumkin. U holda yuqoridagi modul dasturi matnidagi LPT1 yozuvi boshqa ismga (LPT2 yoki S0M1) almashtirilib translyatsiya qilib olinadi.
Natijalarni yoki maxsus buyruqli kodlarni printerga Lst fayli (yoki shunga o'xshash fayl) orqali chiqarish, chop etishni boshqarishning yagona yo'li emas. BSVV17N uzilishi orqali printerga belgilar yoki ularning ketma-ketligi-ni uzatish mumkin. Bundan tashqari mazkur uzilishdan foydalanish chop etish qurilmasining holatini so'rash imkoniyatini yaratadi.
17 N izilishiT prmterga"xrzmat Korsatisnning ucn xu funksiyasidan foydalanishga ruxsat beradi:
— belgilarni printerda chop etish (0-raqamli funksiya);
— printer portini ishga sozlash (1-raqamli funksiya);
— printer holatini o'qish (2-raqamli funksiya).
3.16.6. Overlay modulining protsedura va funksiyalari
Juda ko'p holatlarda dastur kompilyatsiya qilingandan so'ng ma'lum bo'ladiki, dastur uchun SHEHM ning ichki tezkor xotirasi yetishmay qoladi, ya'ni dastur talab qilgan xotira joyining miqdori SHEHM ning xotirasidan katta bo'ladi. Bu holatda ekranda Not enough memory («xotira yetishmayapti») ma'nosidagi xato ko'rsatilgan ma'lumot hosil bo'ladi. Bunday holatlarda dasturchiga Overlay moduli yordamga oshiqadi
Dasturni overleyli qurish. Overlay moduli dasturni alohida bo'laklarga ajratishning kuchli vositasi hisoblanadi. Bunday bo'laklar soni ixtiyoriy sonda bo'lishi va bu bo'laklarga zarur bo'ladigan joy miqdori SHEHM imkoniyatidan ancha yuqori bo'lishi mumkin. Overleyli tarzda tuzilgan dastur bitta YEXE kengaytmali fayldan va shunday nomli lekin OVR kengaytmali yana bitta fayldan tashkil topgan bo'ladi. Bunda YEXE fayli dasturning doimiy qismini, OVR fayli esa zarur paytda xotiraga yuklanadigan kodlarni saqlab turadi. Overleyli tarzda tuzilgan dasturda xotirada faqat xozirdagina zarur bo'ladigan overleyli protsedura va funksiyalargina saqlanadi. Ular kerakli paytdagina o'zlarining joylarini boshqa protsedura va funksiyalarga bo'shatib beradilar. Bu holda qo'shimcha xotira joyi talab qilinmaydi, chunki dasturning overleyli qismlari xotiraning faqat bir qisminigina navbat bilan ish-latadi xolos. Xotiraning mazkur qismi overleyli bufer deb ataladi. Overleylarni xotiraga yuklash va xotiradan bo'shatish kabi ichki amallarning barchasini overley administratsiyasi avtomatik tarzda bajaradi. Dasturchidan esa faqat dasturning overleyli parchalarini e'ion qilish va uning administratsiyasini ishga solish talab qilinadi xolos.
Overleyli dasturlarni rasmiylashtirish qoidalari.
Turbo—Paskalda overleylar modullar darajasidagina yaratilishi mumkin. Overleylar xuddi oddiy modullar kabi e'lon bo'limi (INTERFACE) va hisoblash bo'limi (IMPLEMENTATION) hamda uni faollashtiradigan qismlardan tashkil topadi. Shu bilan bir qatorda quyidagi shartlarning bajarilishi ham talab qilinadi:
■ xar bir overley modul uchun unga oldindan overleylilik huquqini beruvchi {$F+} kompilyatsiya rejimi o'rnatilishi lozim;
■ overleyli qismdasturlardan bevosita va bilvosita foydalanuvchi barcha protsedura va funksiyalar {$F+} kompilyatsiya qilinishi lozim.
Bu shartlarni bajarish uchun overleyli modulning bosh qismiga {$F+, $0+} direktivalarini o'rnatib, asosiy dasturning birinchi qatorlariga {$F+} kompilyatsiya rejimining kaliti yozib qo'yiladi.
Bundan tashqari, asosiy dastur overlay moduliga ulangan bo'lishi va uses direktivasidagi qaysi modullar overleyli ekanligi ko'rsatib qo'yiladi.
Misol sifatida quyidagi dasturning bosh qismini ko'rsatib o'tamiz:
Program MultiCalc;
{$F+}
uses crt.dos,Overlay, MultiCalc, divCalc AddCalc, Subcalc;
{ $0 MultiCalc} { MultiCalc moduli —overley }
{ $0 DivCalc} { DivCalc moduli —overley }
{ $0 AddCalc} { AddCalc moduli —overley }
{ $0 SubCalc} { SubCalc moduli —overley }
Ahamiyat bergan bo'lsangiz { $0 <modul ismi >} di-rektivasi overleyli modullarni ko'rsatish uchun yozilishga majburdir, bundan tashqari, uses direktivasining modul-lari ro'yxatida overlay moduli overleyli modullar ro'yxati-ning boshida kelishi shart.
Overleyli dasturlar xotirada kompilyatsiya qilinmaydi, endi ular faqat disklardagina hosil qilinadi. Dastur kompilyatsiyasidan so'ng (bu dasturni MULTICALC.PAS nomi bilan ataylik) MULTICALC.EXE bajaruvchi fayli va overleyli deb e'lon .qilingan barcha modullardagi protseduralarning kodlarini saqlovchi yo'ldosh fayli hosil qilinadi.
3.16.6.1. Overley ishini initsializatsiya qilish
1. Overleylar administratorini yuklash
Overley administratorini yuklash dasturning ishlashi davomida faqatgina bir marta bajarilishi shart. Bu ish quyidagi overlay modulida e'lon qilingan protseduraga murojaat orqali amalga oshiriladi:
Ovrlnit (Ovr File Name: string )
Bu protsedura overley administratorini ishga yuklaydi va ovr overleyli faylni ochadi.
2. Overleyni yuklash natijalarining tahlili uchun Overlay modulidagi oldindan aniqlab qo'yilgan butun tipli OvrResult o'zgaruvchisi mavjud bo'lib, u mazkur modul protsedura va funksiyalarining, shu jumladan Ovrlnit protsedurasining ishlarini yakunlash kodini o'zida saqlaydi. OvrResult o'zgaruvchisi yetti hil qiymat qabul qilishi mumkin va bu qiymatlarning har biriga mos ravishda o'zgarmaslar biriktirib quyilgan.
Bu ma'lumotlar 7- jadvalda keltirilgan
Endi sanab o'tilgan xatoliklar haqida to'liqroq to'xtalib o'taylik:
■ OvrEror xatosi — overleyli bo'lmagan faylni yuklashga xarakat qilinganda ro'y beradi
■ OvrNotFound xatosi — overleyli iaylni diskka noto'g'ri joylash oqibatida yuzaga kelishi mumkin ;
■ OvrNoMemory xatosi — SHEHM ning bo'sh xotirasi yetishmasligidan ro'y berishi mumkin ;
■ OvrlOEror xatosi — kelib chiqishiga ko'proq tashqi omillar sababchi bo'ladi ( faylning shikastlanishi, MS — DOS ichidagi buzilishlar ) ;
■ OvrEMSDriver va OvrNoEMSMemory xatoliklari — Ovrlnit protsedurasining emas, balki OvrlnitEMS qo'shimcha protsedurasining ishidagi xatoliklaridan kelib chiqadi.
Overley buferini boshqarish. Overley buferining o'lchovlarini boshqarish va uni tozalash uchun Overlay modulida maxsus protsedura va funksiyalar kiritilgan:
OvrGetBuf funksiyasi. V a z i f a s i : ishchi buferning baytlardagi o'lchovlarini aniqlaydi;
Aniqlanishi: OvrGetBuf :Longint ; bu yerda funksiyaning qiymati ba'zi hollarda 64 kb dan oshishi mumkin, shuning uchun, funksiya qiymatini longint deb e'lon qilinadi.
OvrSetBuf protsedurasi. Vazifasi: bufer o'lchovini moslashtirib turadi;
Aniqlanishi: OvrSetBuf (Size: longint); bu protsedura Ovrlnit va OvrlnitEMS protseduralari yordamida overleylar administratsiyasi yuklangandan so'ng ishga tushishi lozim. Buferning talab qilinayotgan baytlardagi miqdori Size parametri orqali beriladi.
OvrClearBuf protsedurasi. Vazifasi: overley buferini majburiy tarzda tozalash uchun ishlatiladi.
Aniqlanishi: OvrClearBuf ;
bu protsedura buferda turgan barcha overleyli dasturlarni chiqarib tashlash vazifasini bajaradi. Overleylar administratorining o'zi bu protsedurani chaqirmaydi.
3.16.7. Graph modulining protsedura va funksiyalari
Barcha dasturlash tillari kabi Paskal tili ham dasturchiga faqat matnli axborotlar bilangina emas, balki grafik ma'lumotlar bilan ham ishlash imkoniyatini beradi. Graph moduli turli xil displey adapterlari (CGA,EGA,VGA,MCGA,Hercules,PC3270,AT&T6300va IBM8514)ning grafik rejimlarini to'liq boshqarish imkoniyatini yaratuvchi saksondan ortiq protsedura va funksiyalarning kutubxonasini ifoda etadi.
Grafika rejimida ekran holati. Ma'lumki, ekran to'rtburchak maydon bo'lib, juda ko'p nuqta (Pixel) lardan tashkil topgan. Grafik ekran ishchi maydon va bordyur (ekranning chetki qismi)dan iborat bo'ladi.
Grafik rejimda ekrandagi barcha nuqtalarning ranglarini o'zgartirib chiqish mumkin (eslatib o'tamiz, matnli rejimda bu mumkin emas). Turli rangga bo'yalgan nuqtalar yordamida chiziqlar, matnlar va boshqa har xil tasvirlar hosil qilinadi. Ekran turiga qarab ranglar son; turli hil bo'lishi mumkin, eng kami bilan esa 2 xil rang bo'ladi.
Kompyuter ekrani yo matnli rejim yoxud grafik rejim holatida bo'ladi. Bir vaqtning o'zida ekranning bir qismi grafik rejimda, bir qismi matnli rejimda bo'lishi mumkin emas. Chunki ekranda ko'rinayotgan barcha tasvirlar video xotiradagi ma'lumotlarning aksi — tasviridir.
Ekranning grafik yoki matnli rejimlariga qarab videoxotiradagi ma'lumotlar turlicha bo'ladi.
Videoxotira, yorug'lik trubkasining kontrolleri, kirish-chiqish portlari va shu kabilar bitta platada joylashadi va displey adapted deb ataladi. Amalda bir necha xil displey adapterlari mavjud bo'lib, ular quyidagi ko'rsatkichlari bilan bir-biridan farq qiladi:
— ekranning tasvirni ko'rsatish sifati;
— ekranda bir vaqtda ko'rsatish mumkin bo'lgan ranglar soni.
Quyida amalda keng tarqalgan videoadapterlar sanab o'tilgan:
■ CGA(Color Graphics Adapter) ;
■ MCGA(Multi Color Graphics Array);
■ EGA(Enhanced Graphic Adapter);
■ VGA(Video Graphics Array).
Kompyuterda qanday adapterning o'rnatilishidan qat'i nazar Turbo—Paskalning protsedura va funksiyalaridan to'liq foydalanish mumkin. Ularning o'zaro sozlashuvi avtomatik tarzda kechadi. Bu sozlashlarni grafik drayverlar deb ataluvchi maxsus dasturlar bajaradi. Drayverlar *.
BGI kengaytmasi bor bo'lgan fayllarda joylashgan.
Misol uchun, EGA va VGA adapterlari bilan ishlash uchun zarur drayverlar EGAVGA.BGI faylida.CGA va MCGA adapterlariga mos drayverlar esa CGA.BGI faylida joylashgan.
Turli xil drayverlarni ko'rsatish uchun Graph modulida quyidagi o'zgarmaslar aniqlangan:
const
Detect=O;{Drayverni avtomatik tarzda aniqlash}
CGA=1;
MCGA=2;
EGA=3;
EGA64=4;
EGAM0NO5;
IBM8514=6;
HERCM0N0=7;
ATT400=8;
VGA=9;
PC327=10.
Graph modulida grafik rejimlarni ko'rsatish uchun esa quyidagi o'zgarmaslar aniqlangan (CGA,EGA va VGA adapterlari uchun); const
CGAC0=0; {320x200 ta nuqta, 4 xil rang}
CGAC1 = 1; {320x200 ta nuqta, 4 xil rang}
CGAC2=2; {320x200 ta nuqta, 4 xil rang}
CGAC3=3; {320x200 ta nuqta, 4 xil rang}
CGAHi=4; {640x200 ta nuqta, 4 xil rang}
EGALo=0; {640x200 ta nuqta, 16 xil rang, 4 ta varaq}
EGAHi=l; {640x350 ta nuqta, 16 xil rang, 2 ta varaq}
EGA64Lo=0; {640x200 ta nuqta, 16 xil rang.l ta varaq}
EGA64Hi=l; {640x350 ta nuqta, 4 xil rang, 4 ta varaq}
VGALo=0; {640x200 ta nuqta, 16 xil rang, 4 ta varaq}
VGAMed=l; {640x350 ta nuqta, 16 xil rang, 2 ta varaq}
VGAHi=2. {640x480 ta nuqta, 16 xil rang, 1 ta varaq}
Displeyni grafik rejimga o'tkazish. Displeyning doimiy rejimi — matnli rejim hisoblanadi. Displeyni grafik rejimiga o'tkazish uchun Graph modulining InitGraph protsedurasidan foydalaniladi:
InitGraph(GD,GM,Path)
bu yerda GD — drayver raqami ;
GM — rejim raqami ;
Path — kerakli drayver joylashgan fayl yo'li.
GD va GM raqamlarni qanday aniqlashni oldingi mavzuda ko'rib chiqdik. Agar Path o'zgaruvchisi bo'sh satr qatorini tashkil qilsa (Path=I ') drayvernj ishchi katalogdan qidiriladi.
GD va GM o'zgaruvchi parametrlar hisoblanadi. Agar InitGraph protsedurasini ishga tushirishda GD=0 bo'lsa, zarur drayver va bu drayver uchun eng yaxshi rejim avtomatik tarzda aniqlanadi.
Graph modulida qulaylik uchun Detect o'zgarmasi (Detect=0) kiritilgan. Misollarda undan qanday foydalanganligiga ahamiyat bering.
InitGraph protsedurasiga simmetrik protsedura CloseGraph hisoblanadi. Bu protsedura drayverni xotiradan chiqarib tashlaydi va oldingi videorejimni tiklaydi.
Quyidagi dastur displeyni grafik rejimga o'tkazadi va shu zahotiyoq uni asli holiga qaytaradi:
uses Graph;
var
Gd,Gm:Integer;
begin
GD:=detect;{Drayverni avtomatik tarzda aniqlaydi, chunki Detect=0}
InitGraph(GD,GM7d:pp'); {Grafflc rejimnio'rnatish}
ReadLn; {Enter bosqichining bosilishini kutish} CloseGraph; end.
Ba'zi hollarda, masalan .BGI kengaytmali fayl yo'lini xato ko'rsatilsa yoki grafik rejimni o'rnatish uchun tezkor xotira yetishmasa, InitGraph protsedurasi o'z ishini muvaffaqiyatli yakunlay olmaydi. Bunday hollarda yo'l qo'yilgan xatoliklarni aniqlash uchun GraphResult funksiyasidan foydalanish mumkin. Bu funksiya grafik rejimni ishga tushirishga harakat qilganda quyidagi qiymatlardan birini beradi:
■ 0 — xatolar yo'q;
■ 2 — grafik plata o'rnatilmagan;
■ 3 — drayver fayli topilmadi;
■ 4 — noto'g'ri drayver o'rnatilgan;
■ 5 — grafik rejimni o'rnatish uchun tezkor xotira yetishmagan;
GraphResult funksiyasidan foydalanishga doir quyidagi dasturni ko'rib criiqaylik:
uses Graph;
var
GD,GM,ErrCode:integer;
begin
GD:=Detect; {Drayverni avtomatik tarzda aniqlash}
InitGraph(GD,GM,’ '); {Grafik rejimni ishga tushirish}
ErrCode:=GraphResult;
if ErrCode<>0 then WriteLn(ErrCode,'raqamli xato') {Xatoga yo'l qo'yilgan}
else CloseGraph;{Xato topilmagan va grafik rejimning ishi yakunlandi} end.
Nuqta, chiziq va ranglar. Biz ekranda grafik rejimini qanday o'rnatishni ko'rib chiqdik. Endi ekranda turli xil nuqtalar, chiziqlar va shakllar chizishni tashkil
qilaylik. Graph modulida 80 taga yaqin funksiya va protseduralar mavjud bo'lib, ulardan foydalanib quyidagi ishlarni qilish mumkin:
■ nuqtalar yasash;
■ kesmalar chizish;
■ ellips va aylanalar chizish;
■ to'g'ri to'rtburchaklar va ko'pburchaklar chizish;
■ yopiq shakllarni turli ranglarga bo'yash hamda bir necha xil standart va keragicha nostandart usullar bilan sohalarni shtrixlash;
■ ekranga turli shriftdagi matnlarni chiqarish;
■ ekran sohalarini eslab qolish va ularni surish.
Grafik rejimda ishlash xuddi matematika fanidagi
Dekart koordinatalar tizimida nuqtalar orqali turli xil shakllar yasashga o'xshab ketadi. Ekrandagi har bir nuqta o'zining koordinatalariga ega. Ekranning chapdan eng tepadagi nuqtasining koordinatasi (0,0)ga teng. X koordinatasi chapdan o'ngga o'sib borsa, Ó koordinatasi yuqoridan pastga qarab o'sib boradi. Nuqta koordinajtfisini aniqlovchi (x,y) juftlikdagi birinchi qiymat OX o'qidan, ikkinchi qiymat esa OY o'qidan aniqlanadi. Ekranning o'ngdan eng pasidagi nuqtasi oxirgi nuqta hisoblanadi va uning koordinatasi grafik rejimning turiga bog'liq.
Masalan, VGAHi rejimida ekrandagi nuqtalar soni 640x480ga teng. O'ngdan eng pastki nuqta koordinatasi esa (639,479) ga teng bo'ladi.
Endi Graph modulining eng ko'p ishlatiladigan funksiya va protseduralari bilan tanishib chiqaylik.
Turli xil shakllar. Yuqoridagi mavzuda ko'rib chiqilgan funksiya va protseduralar yordamida faqat chiziqlar chizish mumkin. Endi boshqa turli xil ranglar bilan to'ldirilgan shakllar chizishni tashkil etishga yordam beruvchi yana bir nechta protsedura va funksiyalar bilan tanishib chiqamiz.
1. SetFillStyle(Style,Color) protsedurasi — Color rangi bilan sohalarni to'ldirish va ularni ko'rsatilgan uslubda to'ldirish (shtrixlash) uchun ishlatiladi;
Sohani turli ranglar bilan to'ldirish o'zgarmaslari:
Grafik rejimdagi matnlar. Grafik rejimda matnlarni yozish uchun ikki xil tipdagi shriftdan foydalanish mumkin: nuqtalar matritsasi hamda simvolni tashkil etuvchi vektorlar qatori orqali.
Shriftlar fayllari .CHR kengaytmasiga ega bo'ladi va shriftni ishga sozlaganda kerakli fayllar ishchi katalogda yoki .BGI grafik drayveri joylashgan katalogda bo'lishi kerak.
Shriftni tanlash va masshtab o'rnatish SetTextStyle protsedurasi yordamida amalga oshiriladi:
SetTextStyle(Font, Direction, Size)— kerakli shriftni o'rnatadi, matnni chiqarish yo'nalishini aniqlaydi va belgilar o'lchovini belgilab beradi. Font— shriftni aniqlovchi o'zgaruvchi, Direction—matnni chop etish yo'nalishini ko'rsatuvchi o'zgaruvchi (chapdan o'ngga yoki pastdan yuqoriga), Size—shrift o'lchovini aniqlovchi o'zgaruvchi. Matritsali shriftda o'lchovga Size=l, vektor shriftida esa Size=4 qiymatlarida erishiladi.
Turli xil shriftlarni ko'rsatish va matnlarni chop etish yo'nalishlarini tanlash uchun quyidagi o'zgarmaslar aniqlangan:
const
{shriftlar}
DefaultFont=0;{8x8 nuqtali standart matritsali shrift}
TriplexFont=l;{vektorli shrift}
SmallFont=2;{vektorli shrift}
SansSerifFont=3;{vektorli shrift}
GothicFont=4;{vektorli shrift}
{matn yo'nalishi}
HorizDir=0;{chapdan o'ngga}
VertDir=l;{pastdan yuqoriga}
OutTextXY(jt,y,TextString) protsedurasi — oldindan aniqlangan shriftda, yo'nalishda va belgi o'lchovida TextString qatorini (x,u) nuqtadan boshlab chop etadi.
SetTextJustify(Horiz,Vert) protsedurasi — OutTextXY protsedurasi chop etadigan matnni avtomatik tarzda tekislab beradi. Horiz — gorizontal, Vert — vertikal tekislashlar.
Matnlarni tekislash uchun quyidagi o'zgarmaslar aniqlangan:
const {gorizontal tekislash uchun}
LeftText=O;{chap tomonga nisbatan tekislash}
CenterText=l;{markazga nisbatan tekislash }
RightText=2;{o'ng tomonga nisbatan tekislash} {vertikal tekislash uchun}
BottomText=0;{pastki tomonga nisbatan tekislash}
CenterText=l;{markazga nisbatan tekislash}
TopText=2;{yuqori tomonga nisbatan tekislash}
Ekran sohalari. Getlmage, Putlmage protseduralari va ImageSize funksiyasi yordamida tasvirlarning to'g'ri to'rtburchakli sohalarini hotirada eslab qolish va ularni ekranga chiqarishi mumkin.
1. ImageSize(xl,yl,x2,y2) funksiyasi — ekranning to'g'ri to'rtburchakli sohasini saqlash uchun zarur bo'lgan xotira o'lchovini (baytlarda) beradi.(x1,y1) to'g'ri to'rtburchakli ko'rinishning chapdan yuqoridagi, (x2,y2) — esa pastdan o'ngdagi burehak nuqtalari uchun koordinatalar.
2. GetImage(õ1, y1,x2,y2 Area) protsedurasi— xotiraning Area sohasida to'g'ri to'rtburchakli ekran tasvirini saqlaydi. (xl,yl) va (x2,y2) lar yuqoridagi ma'noda qayta ishlatilmoqda.
3. Putlmage(x,y/, Area,Mode) protsedurasl — ekranning ko'rsatilgan joyiga tasvir ko'rinishini chop etadi. (x,y) — xotiraning Area sohasidagi tasvir ko'rinishi nusxasini chop etiladigan ekranning chapdan yuqoridagi nuqtasining koordinatasi. Mode—tasvirni ekranga chiqarish rejimi.
Tasvirlarni ekranga chiqarish rejimini aniqlash uchun foydalaniladigan o'zgarmaslar:
const {Putlmage protsedurasi uchun o'zgarmaslar}
NormalPut=0;{ mavjud tasvirni almashtirish}
XorPut=l;{XOR mantiqiy amali}
OrPut=2;{OR mantiqiy amali}
AndPut=3;{AND mantiqiy ko'paytirish amali}
NotPut=4;{NOT mantiqiy rad etish amali}
Xatolar tahlili. Grafik rejimni o'rnatish mavzusida yo'l qo'yilgan xatolar diagnostikasi uchun GraphResult funksiyasidan foydalangan edik. Hozir shu funksiya beradigan xatolar kodi bilan to'liqroq tanishib chiqaylik.
Quyida GraphResult funksiyasi beradigan kodlarga mos o'zgarmaslar ro'yhati keltirilgan:
const
grOk=0;{xatolar yo'q}
grNoInitGraph=—l;{Grafik rejim o'rnatilmagan (InitGraph protsedurasini ishga tushiring )}
grNotDetected=—2; {Grafik plata o'rnatilmagan}
—6 — sohalarni ko'chirishda xotira chegarasidan chiqish;
—7 — zarur sohani bo'yash paytida xotira chegarasidan chiqish;
—8 — shrift fayli topilmagan;
—9 — shrift faylini ishga tushirish uchun xotira
yetishmayapti;
—10 — tanlangan drayver uchun noto'g'ri grafik rejim.