3.17. FAYLLI TIPLAR VA DINAMIK OB’EKTLAR
Faylli tipdagi o'zgaruvchilarni diskdan ma'lumot o'qib oluvchi yoki diskka ma'lumot yozib qo'yuvchi dasturlarda ishlatish mumkin. Faylli tipdagi o'zgaruvchilarni e'lon qilishda file va text xizmatchi so'zlari ishlatiladi:
var mfile 1, mfile 2: file;
afile: file;
Prima: text;
text xizmatchi so'zi faylning matnli ekanligini anglatadi. Matnli fayllar maxsus belgilar bilan ajratilgan, uzunligi noma'lum bo'lgan qatorlardan tashkil topadi.
Ayrim paytlarda fayllarni bir xil tipli hadlar ketma-ketligi ko'rinishida qarash qulayroq bo'ladi. Bu ketma-ketlik qatorlar, butun sonlar yoki yozuvlardan tashkil to-pishi ham mumkin:
var Al: file of byte;
{Al fayli baytlar ketma-ketligidan tashkil topganj
A2: file of integer;
{A2 fayli butun sonlar ketma-ketligidan tashkil topganj
A3: file of string;
{A3 fayli qatorlar ketma-ketligidan tashkil top-gan}
A4: file of string[20];
{A4 fayli 20ta belgili qatorlarning ketma-ketligidan tashkil topganj
A5: text;
{A5 fayli matnli fayl hisoblanadi}
Agar faylning hadlari uchun tip aniqlangan bo'lsa, bunday fayllarni tiplashtirilgan, aks holda esa tiplashtirilmagan deb ataladi:
E'tiboringizga havola etilgan dasturda Assign, Rewrite, Write va Close protseduralaridan foydalanildi. Endi shu protseduralarning va keyingi dasturda ishlatiluvchi Reset va Read protseduralarning vazifalari hamda qanday aniqlanganligi haqida qisqacha ma'lumot berib o'taylik:
Assign protsedurasi.
Vazifasi: Faylli o'zgaruvchiga tashqi fayl ismini o'zlashtiradi.
Aniqlanishi: Assign (f; name: string);bu yerda f — ixtiyoriy tipli faylli o'zgaruvchi; name — qatorli tipdagi ifoda yoki qator, fayl ismi (agar faylning to'liq yp'li ko'rsatilmagan bo'lsa fayl ishlanayotgan katalogda joylashgan bo'ladi).
Close protsedurasi.
Vazifasi: ochiq faylni yopadi.
Aniqlanishi: Close (f);bu yerda f — oldindan ochilgan faylga mos keluvchi faylli o'zgaruvchi.
Read protsedurasi.
Vazifasi: fayl hadini o'zgaruvchiga o'qiydi.
Aniqlanishi: Read (f, u);bu yerda f — faylning ixtiyoriy tipiga mos faylli o'zgaruvchi (faqat matnli tipli emas); v— fayl hadining tipi bilan bir xil tipli o'zgaruvchi.
Reset protsedurasi.
Vazifasi: mavjud faylni ochadi.
Aniqlanishi: Reset (f: file);bu yerdaf — faylning ixtiyoriy tipiga mos faylli o'zgaruvchi va bu o'zgaruvchi fayl bilan Assign protsedurasi orqali bog'langan bo'lishi kerak. Reset protsedurasi mazkur faylni ochadi.
Rewrite protsedurasi.
Vazifasi: yangi faylni yaratadi va ochadi.
Aniqlanishi: Rewrite (f: file);bu yerda f—ixtiyoriy faylli tipdagi faylli o'zgaruvchi. Rewrite protsedura-sini ishlatishdan oldin f o'zgaruvchi Assign protsedurasi yordamida diskdagi fayl bilan bog'lanishi kerak. Rewrite protsedurasi yangi fayl tashkil qiladi.
Write protsedurasi.
Vazifasi: fayl hadiga o'zgaruvchini yozib qo'yadi.
Aniqlanishi: Write (f, u);bu yerda f — faylli o'zgaruvchi; v — f faylining hadi bilan bir xil tipli o'zgaruvchi.
Oldingi tuzgan dasturimiz «d:» diskdagi tp katalogida myfile.dat faylini tashkil qildi. Endi shu fayldan qanday qilib ma'lumotlarni o'qishni ko'rib chiqaylik.
Var
mydata: file of integer;
i, j, sum: integer;
begin
assign (mydata, 'd:\'tp\'myfile.dat');
reset (mydata); fayl o'qish uchun ochilmoqda}
writeln ('Salom noma'lum o'rtoq...');
read (mydata, j);
writeln ('myfile.dat faylidan birinchi son o'qildi');
read (mydata,j);
writeln ('diskdagi myfile.dat faylidan ikkinchi son o'qildi');
read (mydata, sum);
writeln ('myfile.dat faylidan uchinchi son o'qildi’);
close (mydata); {mydata fayli yopiladi}
writeln ('Xayr noma'lum o'rtoq...');
end.
Text standart fayli tip matnli fayllarni aniqlaydi. Matnli fayllar o'zaro yangi qatorga o'tish belgilari bilan ajratilgan qatorlardan tashkil topadi.
Matnli fayllar bilan ishlash uchun maxsus kiritish (Readln), chop etish (Writeln) protseduralari ko'zda tutilgan. Bu protseduralar uzunligi noma'lum qatorlarni fayllardan o'qish va fayllarga yozish uchun ishlatiladi.
Endi matnli fayllar bilan ishlashga doir quyidagi dastur bilan tanishib chiqaylik:
var
mytext: text;
s: string;
begin
assign (mytext, 'd:\'tp\'mytext.txt');
{mytext faylli o'zgaruvchi orqali fayl
ismi va yo'li aniqlanmoqda}
rewrite (mytext);
{fayl yozish uchun ochiq}
writeln ('Sizning ismingiz?');
readln (s);
writeln ('Ismingiz diskdagi mytext.txt fayliga yozilmoqda');
writeln (mytext, s);
{s — qatori mytext.txt fayliga yozilmoqda}
close ( mytext);
{mytext fayli yopildi}
end.
3.17.2. Xotiraning dinamik sohasi
Dasturning (tashqi) o'zgaruvchilari komputer xotirasining ma'lumotlar segmentida joylashgan bo'ladi. Segment uzunligi esa 64 Kb ni tashkil qiladi. Demak, shunday hollar bo'lishi mumkinki, dasturning barcha o'zgaruvchilarini ma'lumotlar segmentiga joylab bo'lmaydi, ya'ni ma'lumotlar segmentga sig'maydi. Masalan, ushbu
var
A: array [1..40000] of byte;
B: array [1..25534] of byte;
begin
end.
dasturni kompilyatsiya qilishga urinish natijasiz tugaydi, ya'ni ekranda «Error 49: Data Segment too large» (berilgan ma'lumotlar segmenti juda katta) deb yo'l qo'yilgan xato haqida ma'lumot chiqadi. Shuning uchun katta xajmli ma'lumotlar bilan ishlashga to'g'ri kelganda bu ma'lumotlarni xotiraning dinamik sohasiga yozish maqsadga muvofiqdir. Xotiraning dinamik sohasi (to'plama deb ham atashadi) dastur egallagan deyarli barcha xotira hisoblanadi. Faqat bu sohaga ma'lumotlar kodlari, stek va ma'lumotlar segmenti xotiralari kirmaydi. Odatda dastur egallagan xotira ko'rinishi quyidagicha bo'ladi:
To'plamaning boshi va oxirini System modulining Heaporg va HeapEnd maxsus o'zgaruvchilari ko'rsatib turadi. Zarur paytdagi to'plama sohasining tugash joyini HeapPtr o'zgaruvchisi aniqlab beradi. To'plamaning o'lchovi kiritilgan ma'lumotlar segmentining o'lchovidan bir necha marta katta bo'lib, taxminan 500 kb (agar kompyuterning umumiy xotirasi 640 Kb bo'lsa) joy egallashi mumkin.
Ma'lumotlar segmentida joylashgan ma'lumotlar statik ma'lumotlar deb ataladi. Bunga asosiy sabab, ular uchun xotira dasturni kompilyatsiya qilish davomida ajratib qo'yiladi. Dasturning ishlashi davomida esa bu xotira o'zgarmay qoladi. To'plamadagi xotira esa dasturning ishlashi davomida to'ldirib boriladi va zarur bo'lgan paytda bu xotira bo'shatib qo'yilishi mumkin. Shuning uchun to'plamada joylashgan o'zgaruvchilarni dinamik o'zgaruvchilar deb ataladi. To'plamadan xotira ajratishni GetMem va New protseduralari orqali amalga oshiriladi, uni bo'shatib qo'yishni esa FreeMem va Dispose protseduralari bajaradi.
3.17.3. Ko'rsatkichlar haqida boshlang'ich ma'lumotlar
Ko'rsatkich shunday o'zgaruvchiki, u ma'lumotning qiymatini emas, balki ularning xotiradagi joylashgan adresini o'zida saqlaydi. Ko'rsatkichlarning ikki xil tipi mavjud: tiplangan va tiplanmagan. Tiplanmagan ko'rsatkichlarni e'lon qilish uchun pointer xizmatchi so'zidan foydalaniladi, tiplangan ko'rsatkichlarni e'lon qilish uchun esa ko'rsatilgan tip oldidan «"» belgisi qo'yiladi.
Ko'rsatkichni ishlatish uchun uni faqat e'lon qilibgina qolmay, uning qanday joyni ko'rsatayotganligiga ham katta ahamiyat berish zarur. Ya'ni, ko'rsatkich operativ xotiraning kerakli ma'lumotlar joylashgan adresini aniq ko'rsatishi kerak. Ko'rsatkich adresini xato ko'rsatish kutilmagan natijalar olishga yoki butunlay dastur ishini chippakka chiqarishga olib kelishi mumkin. Shuning uchun Paskal tilida maxsus protseduralar mavjudki, ular yordamida xotira adresi aniq hisoblanadi.
1. GetMem protsedurasi (tiplanmagan ko'rsatkichlar uchun) — tezkor xotiradan zarur miqdorda joy ajratadi va uning adresini ko'rsatkichga joylashtiradi.
Aniqlanishi: GetMem (var p: Pointer; size : word);
p — ko'rsatkich, size — ajratilgan xotiraning bayt o'lchovidagi miqdori.
Misol:
var
p: pointer;
begin GetMem (p, 1000); {1000 bayt uzunlikdagi xotira sohasi ajratildi}
{p' sohadan foydalanish bloki}
FreeMem (p, 1000); {r adresdagi 1000 bayt uzunlik xotira sohasi bo'shatib qo'yildi}
end.
2. New protsedurasi (tiplangan ko'rsatkichlar uchun) — xotiradan zarur joyni band qilib, uning adresini berilgan ko'rsatkichga jo'natadi.
Aniqlanishi: New (var p: pointer);
p — berilgan ko'rsatkich.
New va GetMem protseduralari nisbatan juda katta hisoblanmish xotiraning dinamik sohasidan zarur miqdordagi xotira so'rab oladi. Shu xotirani band qilib, uning adresini mos ko'rsatkichga jo'natadi. Shunday hollar ham bo'ladiki, xotiraning dinamik sohasida bo'sh joy qolmaydi, u holda shu xotiraga yuqoridagi protseduralar bilan qilingan ko'rsatkich quyidagi ma'lumotli xatoni yuzaga keltiradi:
Runtime Error 203 ...
Shuning uchun xotiraning dinamik sohasini vaqti-vaqti bilan bo'shatib turish kerak. Bu ishlarni Dispose va FreeMem protseduralari bajaradi.
1. Dispose protsedurasi — tiplangan ko'rsatkichdagi adresda joylashgan xotirani bo'shatadi.
Aniqlanishi: Dispose (var p: pointer);
2. FreeMem protsedurasi — tiplanmagan ko'rsatkichda ko'rsatilgan adresdagi xotirani bo'shatadi.'
Aniqlanishi: FreeMem (var p: pointer; size: word);
Ko'rsatkichning vaqtincha ishlamay turishini bildirish uchun Nil xizmatchi so'zidan foydalanish mumkin.
Bu protseduralar bilan bir qatorda quyidagi funksiyalar bilan ham tanishib chiqaylik:
1. MemAvail funksiyasi — xotiraning dinamik sohasidagi bo'sh sohalarning umumiy xajmini aniqlaydi.
Aniqlanishi: MemAvail : Longlnt;
2. MaxAvail funksiyasi — xotiraning dinamik sohasidagi eng katta soha o'lchovini aniqlaydi.
Aniqlanishi: MaxAvail: Longlnt;
Misol sifatida GetMem va FreeMem protseduralaridan foydalanilgan quyidagi dasturni ko'rib chiqaylik:
Var
P: Pointer;
Begin
GetMem(P,1024); {Xotiradan 1024 bayt joy ajratildi, R shu sohani ko'rsatmoqda}
…
FreeMem(P,1024); {R sohadagi 1024 bayt joy bo'shatildi}
End.
New va Dispose protseduralari esa quyidagicha ishlatiladi:
Var
PS:^String;
Begin
New(PS); {Xotiradan 256 bayt joy ajratildi }
PS^:q'Dinamik xotira';
Writeln(PS^);
Dispose(PS); {RS sohasigi tegishli bo'lgan joy bo'-shatildi}
End.
SI PROGRAMMALASH TILI
4.1.1. Tilning asosiy tushunchalari
Si dasturlash tili Yuniks operatsion tizimi bilan bog'langan bo'lib, shu tizimda ishlatiladigan bir qancha dasturlar Si tilida yaratilgan. Si dasturlash tili mashinaning barcha imkoniyatlaridan to'laligicha foydalanishga imkon beradi.
Si tili mo'ljallanishiga ko'ra umumiy bo'lib, u yuqori darajali dasturlash tillari bilan Assembler orasida oraliq vaziyatni egallaydi.
Dasturni boshqaruvchi operatorlar strukturali dasturlash talablariga javob beradi. Unda kiritishchiqarish, xotirani dinamik taqsimlash, multidasturiash, parallel hisoblash vositalari yo'q. Bu vositalar tashqi funksiyalar orqali amalga oshiriladi.
Si tilida dastur tuzish hisoblash mashinalari ishini va uning operatsion tizimini tushunish imkoniyatini yaratadi, shuning uchun ham u kasbiy dasturchilarga mo'ljallangan.
Lekin,Si dasturlash tili biron-bir tizim yoki mashina bilan qattiq bog'lanib qolmagan.
Si tilida dasturlar ma'lumotlar ustida natija olish maqsadida qilinadigan harakatni bildiradi. Dasturda harakatlar operatorlar orqali beriladi, malumotlar esa ob'ektlarni aniqlash va tavsiflash orqali amalga oshiriladi.
Dasturda foydalaniladigan har bir ob'ekt tavsiflanishi zarur. Tavsiflash ob'ekt bilan bir necha xarakteristikalarni bog'laydi. Bu xarakteristikalar: tip, belgilash, xotira sinfi, harakat sohasi, boshlang'ich qiymatlar kabilardir.
Tilda asosiy tiplar: belgi (liter) bilan birgalikda butun va suzuvchi vergulli sonlar ishlatiladi. Bundan tashqari ko'rsatkichlar, massivlar, operandalardan chiqariluvchi
jma'lumotlarning tola iyerarxiyasini hosil qilish mumkin.
Ifoda operandalar va ko'rsatkichlardan tashkil topadi. Qiymat uzatish funksiyasini chaqarishni qo'shib hisoblaganda, har bir ifoda ko'rsatma bo'lishi mumkin.
Ko'rsatkich bu berilgan tipdagi ob'ektni dalillashdan iborat.
M a s s i v bu bir tipdagi ob'ektlar ketma-ketligi bo'lib, ularga yaqinlashish indekslari orqali amalga oshiriladi, lekin qo'shimcha aniqlash rekursiv qoidasi yordamida istalgan o'lchamdagi massivlarni aniqlash mumkin.
Tuzilmalar turli tipdagi ob'ektlar ketma-ketligi bo'lib, ularga yaqinlashish ismlar bo'yicha amalga oshiriladi. Ikki xil tuzilmalar mavjud bo'lib, oddiy tuzilmalarda (struct) elementlar xotirada tavsiflangan tartibda ketma-ket joylashadi. Istalgan paytda ularga yaqinlashish mumkin.
Variantli tuzilmalarda (union) hamma elementlar xotirada tuzilma boshlanishida joylashtiriladi. Bu holat eng keyingi qiymat berilgan elementgagina yaqinlashish imkonini beradi xolos.
O'tkazish bu butun tipdagi ob'ektlar ketma-ketligi bo'lib, ularga yaqinlashish ismi bo'yicha amalga oshiriladi.
Funksiya bu murakkab ob'ekt bo'lib, uni hisoblash natijasida berilgan tipdagi qiymat hosil qilinadi.
Ko'rsatkichlar bog'liqmas adresli mashina arifmetikasini belgilaydi. Si da ko'rsatma tuzuvchi ({}), shart bo'yicha tarmoqlanish (if), ko'pdan bironbir muqobillarini (switch) tanlash, yuqoriga qarab takrorlash (for, while) quyiga qarab takrorlash (do), shuningdek takrorlashni to'xtatish (break) kabi boshqaruvchi tuzilmalar mavjud.
Si tilida har bir funksiyaga rekursiv (yakka tartibda) yondashiladi. Lekin bir funksiyaniig tasviri ikkinchi funksiyaning orasida yotishi mumkin emas.
Mazkur tilning muayyat kamchiligi ham mavjud bo'lib, til tuzilmalari sintaksisi noqulay.
Si dasturlash tili birinchi marta Denis Ritchi («BELL LABORATORIES» AQSH) tomonidan 1972 yilda loyihalashtirilgan. Bu tilda skalyar qiymatlar bilan ham ish olib borib, ular o'rtasida operatsiyalar bajarish mumkin. Taqribiy qiymatlar esa elementlarga yaqinlashishni tartiblash uchun ishlatiladi.
Tilning leksikasi va sintaksisida Bekus-Nuar formasiga yaqin qoidalar qabul qilingan va bu Metaformalar «=» ifoda bilan ajratiladi. Bu belgining chap tomonida metao'zgaruvchi va o'ng tomonida esa uning qiymati yotadi.
Si tili alfavitiga quyidagilar kiradi:
Harflardan yo belgilardan yoxud ostki chiziq bilan boshlangan raqamlar ketma-ketligi identifikator hisoblanadi.
Masalan:
K0M_ 15, sizl 98, - MAX,TIME, time.
Bosma va yozma alifboda yozilgan identifikatorlar bir-biridan farqlanadi. Jumladan, yuqoridagi oxirgi ikkita identifikator bir-biridan farqli.
Identifikator turli uzunlikka ega bo'lishi mumkin, lekin kompyuter 31 tagacha bo'lgan belgini hisobga oladi xolos. Ayrim kompyuterlarda bu cheklov yanada qattiqroq qo'yilib, faqat dastlabki ixtiyoriy identifikatorning 8 ta belgisigacha hisobga olinadi.
Bu holda NUMBER_OF_ROOM va NUMBER— OF_TECT identifikatorlari dastur bajarilishida bir xil bo'ladi.
Xizmatchi (kalit) so'zlar. Dasturchi tomonidan erkin tanlab olib qo'llanilmaydigan identifikatorlar xizmatchi so'zlar deb ataladi. Xizmatchi so'zlar ma'lumotlar tipini, xotira sinfini, tip xususiyatini va operatorlarini aniqlash uchun qo'llanilib, ular quyidagilardir:
auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, siseof, static, struct, with, typedef, union, unsigned, void, volatile, while.
Xizmatchi so'zlar ma'no jihatdan quyidagi guruhlarga ajratiladi.
Ma'lumotlar turlarini sinflarga ajratish uchun:
char — belgili
double —ikkilangan aniqlikdagi suzuvchi vergulli haqiqiy sonlar
enum — sanalma tip
float — suzuvchi vergulli haqiqiy sonlar
int — butun tip
long — uzun butun tip
short — qisqa butun tip
struct — tuzilmali tip
signed — ishorali tip
union — birlashtiruvchi tip
unsigned — ishorasiz tip
void — qiymat ishtirokisiz tip
typedei — tipni aniqlash sinonimini kintish.
Tip xususiyatlarini aniqlash:
const — yagona qiymatga ega bo'lgan faqat o'qish uchun aniqlanadigan sinf xususiyati.
volatile — dasturchining aniq ko'rsatmalarisiz qiymat o'zgartiradigan ob'ekt sinfi.
Xotira sinfini belgilash uchun:
auto — avtomatik
extern — tashqi
register — registrli
static — statik identifikatorlari ishlatiladi.
Operatorlarni qurish uchun quyidagi xizmatchi so'zlar ishlatiladi.
Break — sikldan yoki o'tkazuvchidan chiqish
continue — siklni davom ettirish
do — bajarmoq( shart ostida siklni bajarish operatori-ning bosh qismi)
for — uchun( parametrli takrorlash operatorining bosh qismi)
goto — o'tish( shartsiz o'tish)
if — agar—shartli operatorning belgilanishi
return — qaytish ( funksiyadan)
switch — o'tkazuvchi
wile — hozircha(do sikli yakunlovchisi)
Xizmatchi so'zlarga kiradigan quyidagi identifikatorlar mavjud:
default — switch operatorida kerakli variant topilmasa harakatning davomini aniqlash
case— switch operatori variantlarini tanlash
else — yoki — if shartida muqobil tarmoqni tanlash.
4.1.3. Operatsiya belgilari
Quyidagi 8-jadvalda operatsiyalar ranglari bilan guruhlarga ajratilgan.
Munosabatlar va mantiqiy ifodalar. Munosabat operatsiyalari quyidagicha aniqlanadi:
= = teng; ! = teng emas;
< kichik; < = kichik yoki teng;
> katta; > = katta yoki teng;
1-rang operatsiyalarni yuqorida ko'rib o'tdik.
2-rang operatsiyalar unar yoki bir joyli operatsiyalar deb ataladi.
! — emas — mantiqiy inkorni bildiradi;
masalan: !2=0; !(-5)=0; !0=l;
— bitli inkorni ifodalaydi;
- - unar minus, arifmetik operatsiyaning ishorasini unar minusga o'zgartiradi;
+ — unar plyus, unar minusga simmetrik ravishda kiritilgan (inkrement yoki avtomatik orttirish);
++ — bir birlikka ortishi; ikki xil shakli mavjud:
prefiksli operatsiya — operanda qiymati u foydalanguncha bittaga ortishi;
postfiksli operatsiya — operanda qiymati foydalanilgandan keyin bittaga ortishi;
- - dekrement yoki avtomatik kamaytirish; kamaytirish ikki xil shaklda ishlatiladi:
prefiksli operatsiya — operanda qiymatining bittaga u foydalanilguncha kamayishi;
postfiksli operatsiya — operanda qiymatining bittaga u foydalanilgandan keyin kamayishi;
Masalan
++m m ning qiymatini bittaga ortiradi;
- - n n ning qiymatini bittaga kamaytiradi;
i++ i ning qiymatini operatsiya bajarilgandan so'ng bittaga ortiradi;
j- - jning qiymatini operatsiya bajarilgandan so'ng bittaga kamaytiradi;
n=4 bo'lsa n++*2 ifodaning qiymati 8 bo'lib, n ning qiymati esa 5 ga teng bo'ladi.
++n*2 ifodaning qiymati 10 bo'lib n ning qiymati 5 ga teng bo'ladi.
x+++b yoki z- - d ifodani ko'rsak, bu ifodalar {x
++)+b yoki (z------)—d ifodalar bilan teng kuchlidir.
Multiplikativ operatsiyalar:
— arifmetik tipdagi operandalarni ko'paytirish;
— binar minus — arifmetik operandalarni ayirish yoki ko'rsatkichlarini ayirish uchun;
/ — arifmetik tipdagi operandalarni bo'lish;
% — modul bo'yicha bo'lish; Surilish operatsiyalari
<< — chapga surilish;
>> — o'ngga surilish;
Razryadli operatsiyalar:
& — razryadli kon'yunksiya (va);
! — razryadli diz'yunksiya («yoki»);
" — razryadli yoki;
Surilish razryadli operatsiyalarning bajaralishi natijasida :
4 << 2 16 ga teng
5 >> 1 2 ga teng
Eslatib o'tamizki 4(10)=100(2) ; 5(I0) =100(2) ; 6(I0)= = 110(2) va h.k.
2 ta surilish natajasida 100 kodi 1000 ga aylanadi, uning o'nli qiymati 16 ga teng.
Munosabat operatsiyalari
< — kichik;
> — katta;
<= — kichik yoki teng;
>= — katta yoki teng ;
= = — teng;
!= — teng emas.
Munosabat operatsiyasining operandalari arifmetik tipga tegishli yoki ko'rsatkichdan iborat bo'lishi lozim .
Binar (ikki joyli) operatsiyalar quyidagi guruh-larga bo'linadi:
• additiv;
• multiplikativ;
• surilish;
• razryadli;
• munosabat operatsiyalari;
• mantiqiy;
• qiymat uzatish;
• «vergul» operatsiyasi;
• qavslar operatsiya sifatida.
Additiv operatsiyalar
+ — binar plyus — arifmetik operandalari qo'yish yoki butun tipli operandalar ko'rsatkichini qo'yish uchun;
- - binar minus — arifmetik operandalarni ayirish yoki ko'rsatkichlarini ayirish uchun;
Mantiqiy binar operatsiyalar
&.& — arifmetik operandalar yoki munosabatlar kon'yunksiyasi (va).
Butun sonli qiymat 0 (yolg'on) yoki 1 (rost) qiymat qabul qiladi;
!! — arifmetik operandalar yoki munosabatlar diz'yunksiyasi (yoki) .
Butun qiymatli ifoda (0) yolg'on yoki (1) rost qiymat qabul qiladi;
Vergul operatsiya sifatida
Vergul bilan ajratilgan ifodalar chapdan o'ngga qarab hisoblanadi. Natija tipi sifatida eng o'ngdagi ifoda qiymati tipi saqlanadi:
Si tilida dasturni aniqlash va yozish ixtiyoriy shaklda, matnli fayl sifatida yozilishi mumkin.
Unda har bir dastur protsessoroldi direktivalari, bosh funksiya, ob'ektni tavsiflash va aniqlash ketma-ketligidan iborat.
Protsessoroldi direktivalari buyruqlari dastur matnini kompilyatsiya qilingungacha qayta o'zgartirishni boshqaradi.
'#' belgisi protsessor direktivalarini belgilash uchun ishlatiladi.
Masalan:
# include <stdio.h> protsessor oldi buyrug'i dastur matnini kiritish va chiqarish funksiyalari kutubxonasini kiritadi.
Std — standart (standart); i — input (kiritish);
î — output (chiqarish); h — head (sarlavha); ma'nosini bildiradi.
Formatlangan chiqarishni amalga oshirish uchun printf() buyrug'i ishlatiladi.
printf() funksiyani chaqirish quyidagicha amalga oshiriladi:
printf(format qatori, argumentlar ro'yxati);
Format qatori qo'shtirnoq ichiga olinib, qator o'zgarmaslari, ixtiyoriy matnli boshqaruvchi belgilar va ma'lumotlarni o'zgartirish xususiyatlari ko'rsatilishi mumkin. Masalan ekranga «Calom 01am» so'zini chiqarish uchun quyidagicha dastur tuzish zarur:
# include <stdio.h>
void main()
{
printf'Salom olam \n");
}
«\n» belgisi qator o'tkazib yuborishni bildirib, kursorni yangi qatorga o'rnatadi.
Shuningdek quyidagi belgilardan ham foydalanish mumkin:
Yuqoridagi belgilar boshqaruvchi ketma-ketliklar deb yuritiladi. Bu boshqaruvchi belgilar yordamida displeyda axborotning joylanishini o'zgartirish mumkin.
Axborotlarning tashqi shaklini o'zgartirishni boshqarish uchun o'zgartirishning maxsuslatgich belgilaridan foydalaniladi va ular % belgisi bilan birgalikda ishlatiladi.
Hisoblash xarakteriga ega bo'lgan masalalarda biz ko'proq quyidagi o'zgartirish maxsuslatgichlaridan foydalanamiz.
%d — o'nli butun sonlar uchun(int—tipi);
%u — ishorasiz o'nli butun sonlar uchun(unsigned-tipi);
%f — haqiqiy sonlar uchun(floatba double—tipi);
%1 — suzuvchT vergulli fiaqlqly sorilar uffiuh(dbuble va fioat-tipi);
Agar summa haqiqiy o'zgaruvchi qiymati 2702.3 ga teng bo'lsa:
printf(«\n summa=%f, summa); funksiyasi ekranga:
summa=2702.3 ni chiqaradi.
Quyidagi operatorlar
float m,n;
int k; ning bajarilishi natijasida
m=15.7; k=—75; n=15.33 ni hosil qilamiz.
O'zgaruvchilar dasturning asosiy ob'ekti hisoblanib, uning bajarilishi davomida dastur o'z qiymatini o'zgartiradi.
Arifmetik ifodada sonlar, harflar va o'zgaruvchilar qatnashib +,—, *,/ kabi amallar yordamida yoziladi. Si tilida boshqa standart matematik funksiyalar mavjud. Bu funksiyalar 9-jadvalda keltirilgan.
Si dasturlash tilida o'zgaruvchilar ro'yxati foydalanilmasdan oldin kiritilishi zarur, odatda hamma o'zgaruvchilar foydalaniladigan birinchi funksiyadan avval yoziladi. Funksiyadagi o'zgaruvchilarfnng xususiyati avvaldan e'lon qilinadi.
Int turidagi sonlar 16 razryadli (—32768 dan 32767 gacha)
float turidagi sonlar esa 32 razryadli (3.4*10'38dan 3.4*10'38gacha).
Si da int va float dan tashqari ma'lumotlarning bir qancha bazaviy tiplari mavjud.
Ko'rsatilgan tiplarning o'lchamlari mashina turlariga qarab o'zgarishi mumkin.
Bazaviy tipdan massivlar, tuzilmalar birlashmalar va ko'rsatkichlarni hosil qilish mumkin.
Yuqorida ko'rib o'tganimizdek printf funksiyasi ob'ektni ekranga chiqaribgina qolmay balki uni istalgan ko'rinishda chop etadi.
Axborotni kiritish uchun tilda scanf, read funksiyalaridan foydalaniladi.
scanf ((format qatori), (adresl), (adres2)...)
Bu yerda printf dagi singari format qatorlarini qo'llash mumkin.
scanf funksiyasidan foydalanish boshqa bir muammoni vujudga keltiradi. Birinchi misolimizni qayta bajarib, ism va familyamizni kiritsak, faqat ism chiqadi xolos. Nima uchun? Chunki, ismdan keyin quyiladigan bo'sh joy scanf funksiyasiga qator tugaganligini bildiradi. Âö vaziyatdan qanday chiqish mumkin?
4.2.2. Dastur ob'ektlarining «yashash vaqti» va
«harakat» ko'lami
O'zgaruvchining (global yoki lokal) «yashash vaqti» quyidagi qoida orqali aniqlanadi:
1. E'lon qilingan global o'zgaruvchilar dasturning bajarilishi davomida saqlanadi;
2. Lokal o'zgaruvchilar register yoki auto sinfidagi o'zgaruvchilar e'lon qilingan blok bajarilishi davomidagina «yashaydi». Agar bu o'zgaruvchi static yoki extern tipiga ta'lluqli bo'lsa, u holda o'zgaruvchi butun dastur bajarilishi davomida «yashaydi».
O'zgaruvchi va funksiyalarning dasturdagi ko'rinishi quyidagi qoidalar yordamida aniqlanadi:
1. E'lon qilingan yoki global aniqlangan o'zgaruvchi e'lon qilingan nuqtadan yoki bajariluvchi fayl oxirigacha aniqlangan o'zgaruvchida ko'rinadi. O'zgaruvchini boshqa bajariluvchi fayllarda xam ko'rinadigan qilish mumkin. Buning uchun bu fayllarda uni extern xotira sinfi bilan e'lon qilish kerak.
2. E'lon qilingan yoki lokal aniqlangan o'zgaruvchi e'lon qilingan nuqtadan yoki shu blok oxirigacha ko'rinadi. Bunday o'zgaruvchi lokal o'zgaruvchi deb ataladi.
3. O'zgaruvchi qamrab oluvchi bloklarda ko'riladi. Shuningdek, global e'lon qilingan o'zgaruvchilar ham ichki bloklarda ko'rinadi. Bu ichmaich ko'rinish deb ataladi. Garchi blok ichida e'lon qilingan o'zgaruvchi qamrab oluvchi blokdagi o'zgaruvchining nomi bilan bir xil bo'lsa ham, ammo ular aslida harxil o'zgaruvchilar bo'ladi. Qamrab oluvchi blokdagi o'zgaruvchi ichki blokda ko'rinmaydi.
4. static xotira sinfdagi funksiyalar ular aniqlangan bajariluvchi fayldagina ko'rinadilar. Boshqa har qanday funksiyalar esa butun dasturda ko'rinadi.
Funksiyalardagi metkalar butun funksiya bajarilish davomida ko'rinadilar.
Funksiya prototipida e'lon qilingan formal parametrlar ismlari uni e'lon qilish nuqtasidan boshlab funksiyani e'lon qilish tugagungacha ko'rinadi.
Yana oddiy dasturning tuzilishiga qaytamiz. U faqat bittagina main () funksiyasidan iborat edi.
Protsessor oldi direktivalari
main ()
obektlarn aniqlash;
bajariluvchi_operator
}
Har bir bajariluvchi operator dasturning keyingi qadamdagi harakatini ifoda etadi. Operator qiymatga ega emas. Harakat xususiyati jihatidan operatorlar ikki tipga ajratiladi: ma'lumotlarni o'zgartirish operatorlari va dastur ishini bajaruvchi operatorlar.
Ma'lumotlarni o'zgartirish tipik operatorlari—qiymat uzatish hamda nuqta va vergul bilan yakunlanuvchi ixtiyoriy ifoda bo'ladi.
Dastur ishini boshqaruvchi operatorlar dastur konstruksiyasini boshqaruvchi operatorlar deyiladi. Ularga:
— tarkibiy operatorlar;
— tanlash operatorlari;
— takrorlash operatorlari;
— o'tish operatorlari kiradi.
Quyida tarkibiy operatorlarning qismi keltirilgan:
{n++ ;
sum+= (float)n
}
Tanlash operatorlari esa — shartli operator (if) va qayta ulovchi (switsh) dan iborat.
Takrorlash (sikl) operatorlari: sharti oldindan berilgan operator (while), parametrli takrorlash (for) va sharti keyin keluvchi operator (do) lardan iborat.
O'tish operatorlari boshqarishni shartsiz uzatishni ta'minlaydi. Ularga goto (shartsiz o'tish), continue (takrorlash hozirgi iteratsiyasini yakunlash), break (takrorlashdan yoki qayta ulovchidan chiqish) va return (funksiyalardan qaytish) kabilar kiradi.
Biz bu paragrafda shartli operatorlar bilan tanishib o'tamiz. U quyidagi qisqa ko'rinishga ega:
4.3.2. Takrorlash operatorlari (for, while, do)
Boshqa dasturlash tillari singari SI tilida ham takrorlashlarni hosil qilish uchun maxsus vositalar mavjud. Ko'pchilik dasturlash tillarini takrorlash operatori ikki elementdan: bosh qism va tanadan iborat. Tana takrorlashda bajariladigan operatorlarni o'z ichiga oladi. Bosh qism esa tanadagi operatorlarning takroriy bajarilishini ta'minlaydi. SI tilida takrorlash operatorlarining uch turi ishlatiladi, ular quyidagi xizmatchi so'zlar bilan belgilanadi.
while, for, do.
while va for quyidagi tarh bo'yicha tuziladi:
Takrorlash bosh qismi
takrorlash tanasi
do takrorlashi boshqacha tuzilmaga ega bo'lib, yuqoridan va pastdan konstruksiyasiga asoslanadi. Shuning uchun ham do takrorlashida takrorlashning bosh qismi haqida gapirish o'rinsizdir.
Shuni eslatib o'tamizki, har uchala takrorlash operatorida ham takrorlash tanasi {} belgisi orasidagi alohida yoki tashkiliy operator bo'lishi mumkin. Takrorlash tanasi bo'sh operator bo'lishi ham mumkin.
while — takrorlashi quyidagi ko'rinishga ega:
while (ifoda_shart)
takrorlash tanasi
Ifoda_shart sifatida ko'proq munosabat yoki mantiqiy ifodadan foydalaniladi. Agar u rost qiymat qabul qilsa, takrorlash tanasi ifoda_shart yolg'on bo'lguncha bajariladi.
Shunga e'tibor beringki, ifodaning to'g'riligi takrorlash tanasining bajarilishini ta'minlaydi. Shunday qilib, oldindan yolg'on bo'lgan ifoda_shartda takrorlash biror marta ham bajarilmaydi.
Ifoda_shart arifmetik ifoda bo'lishi ham mumkin
do takrorlashi quyidagi ko'rinishga ega:
do
takrorlash tanasi
while ( ifoda_shart)
Ifoda_shart while takrorlashdagi kabi mantiqiy yoki arifmetik ifoda bo'lishi mumkin. do takrorlashda takrorlash_tanasi hech bo'lmaganda bir marta amalga oshadi.
for takrorlashi (parametrli takrorlash) quyidagi ko'rinishga ega:
takrorlash_tanasi for (ifoda —1; ifoda_shart; ifoda—3) operatordagi birinchi va uchinchi ifoda vergul bilan ajratilgan bir necha ifodalardan iborat bo'lishi mumkin.
Ifoda_l— takrorlash boshlanguncha bo'lgan harakatni bildiradi, ya'ni takrorlash uchun boshlang'ich shartni ifodalaydi. Ko'proq u qiymat uzatishni ifodalaydi. Ifoda_shart
— odatda mantiqiy yoki arifmetik ifoda bo'lishi mumkin. U shartning tugashi yoki takrorlashning davom ettirilishini anglatadi. Agar u rost bo'lsa, u holda takrorlash_tanasi bajariladi. So'ngra ifoda_3 hisoblanadi u bajarilgach, ifoda_shartning to'g'riligi hisoblanadi va hammasi yana qaytariladi. Ifoda_l faqat bir marta bajariladi, ifoda_shart va ifoda_3 takrorlash tanasininig ifoda_sharti yolg'on bo'lguncha davom etadi.
9-rasmda while, do va for takrorlashlarini tashkil qilish keltirilgan.
Yuqorida ko'rib o'tgan misolimizda boshlang'ich ma'lumotlarni qayta kiritish uncha qulay emas, ekranda xatolik haqida hech qanday xabar berilmadi. Bunday holatlardan chiqishning turli yo'llari mavjud.
Ulardan biri metka va o'tkazish operatori goto dan foydalanishdir. Lekin strukturali dasturlash nuqtai nazaridan bunday usul noto'g'ri hisoblanadi.
Bunday natijaga strukturali dasturlash tamoyillarini buzmagan holda takrorlash tanasida uzilish operatori break ni qo'llash orqali ham erishish mumkin.
Bu operator takrorlash bajarilishini tugatadi va boshqarishni takrorlashdan keyingi operatorga uzatadi.
Takrorlash tanasida operatorlarning bajarilishiga aralashish imkoniyatini beruvchi operatorlardan biri continue operatoridir.
U takrorlashning ixtiyoriy qismida takrorlashning bajarilish shartini tekshirishga va uning natijasida takrorlashni tugatish yoki davom ettirishga xizmat qiladi. Bu operatorning bajarilishini quyidagi dastur orqali ko'rishimiz mumkin:
Massivlar bir hil tipdagi (double, float, int va h.k.) elementlar guruhidan iborat bo'ladi. Kompilyator e'lon qilingan massivdan uning elementlari tipi va ularning soni to'g'risida ma'lumotlarga ega bo'lishi kerak. Massivni e'lon qilishning ikki xil formati mavjud:
maxsus_tip [konstantali_ifoda];
maxsus_tip [ ];
Maxsus tip massivning identifikatoridir.
Maxsus_tip esa e'lon qilinayotgan elementlarning tipini beradi. Massiv elementlarining tipi funksiyaga va void tipiga taalluqli bo'lmasligi kerak.
Konstantali-ifoda massiv elementlari sonini bildiradi. Massivni e'lon qilishda quyidagi xollardagina konstantali-ifodani tushirib qoldirish mumkin:
— massiv funksiyaning formal parametri sifatida e'lon qilinganda,
— e'lon qilingan massiv boshqa fayldagi aniq massivga yo'llangan bo'lsa.
Oxirgi misolda w[3][3] massivi e'lon qilingan. Figurali qavslar ichiga olingan ifodalar massivning satriga mos keladi, qavslar qoldirib ketilsa initsializatsiya noto'g'ri bajariladi.
SI tilida massivlarning kesishmasidan ham foydalanish mumkin, lekin bu kesishmalardan foydalanishga ko'p cheklovlar qo'yiladi. Kesishmalar bir yoki bir necha juft kvadrat qavslarni olib tashlash orqali amalga oshiriladi. Massivlarning kesishmasi hisoblash jarayonini tashkil qilishda ishlatiladi.
Misollar:
int s[2][3];
Agar ayrim funksiyaga s[0] orqali murojaat qilinsa, s massivning nolinchi satri olinadi.
int 6[2][3][4];
b massivga b[ 1 ][2] orqali murojaat qilinganda to'rt elementdan iborat vektor uzatiladi, b[1] orqali murojaat qilinganda esa 3x4 ikki o'lchamli massiv uzatiladi.
Belgili massivlarni e'lon qilish quyidagicha bo'ladi:
char str[ ] = «belgili massivni e'lon qilish».
4.4.1. Massivlar ustida amallar
Si tili sintaksiga ko'ra unda uchta hosilaviy tip aniqlanadi: massiv, ko'rsatkich, funksiya. Biz bu bo'limda funksiya haqida fikr yuritamiz.
Funksiyalar borasida, Si tilida ikki tomonlama qarash mavjud. Birinchi tomondan, funksiya hosilaviy tipga taalluqli bo'lsa, ikkinchi tomondan Si tilida funksiya bajariluvchi modul hisoblanadi. Bajaruvchi modul tushunchasi boshqa dasturlash tillaridagi protsedura, qism dastur, qismdastur—funksiya sinonimlari bilan mos keladi. SI tilida harama funksiyalar standart talabiga ko'ra yagona ko'rinishga ega:
tip funksiya _ismi_ (parametrlar _ xususiyati)-
funksiya _tanasi.
Birinchi qator — mazmuniga ko'ra funksiyaning bosh qismi bo'lib, o'zining timsolidan oxirida [;] nuqta vergul qatnashmasligi va albatta rasmiy parametrlarning qatnashishi bilan farq qiladi.
Bu yerda tip qiymat qaytarmaydigan void turiga yoki qiymat qaytaruvchi funksiyalar turiga taalluqli bo'lishi mumkin.
Biz oldingi bo'limlarda qiymat qaytaruvchi bazaviy turlarni ko'rib o'tdik (char, int,double va boshqalar).
Funksiyaning ismi yo bosh funksiya uchun main(), yoki dasturchi tomonidan dasturdagi ixtiyoriy tanlanadigan xizmatchi so'zlar va boshqa ob'ektlar ismi bilan mos tushmaydigan ism (identifikator) bo'lishi lozim.
Parametrlar _ xususiyati esa — bo'sh yoki rasmiy parametrlar ro'yxati bo'lib, ular quyidagi ko'rinishga ega bo'ladi:
tipning _ belgilanishi
parametr _ ismi.
Parametrlar ro'yxati nuqta verguldan keyin [. . .] (ko'p nuqta) bilan tugashi mumkin. Ko'p nuqta funksiyaga ko'p sonli haqiqiy parametrlar bilan murojaat qilishni anglatadi. Bunday imkoniyat funksiya tanasiga maxsus vositalar yordamida biriktirilishi zarur.
Masalan:
int printficonct char * format, . . .);
int scanficonct char * format, . . .);
funksiyalari nazariy jihatdan formatlangan kiritish va chiqarishni cheklamagan miqdordagi haqiqiy parametrlar uchun qo'llashni ta'minlaydi.
Funksiya_tanasi — dasturning figurali qavslar ichiga olingan sarlavhadan keyin keluvchi funksiyalarni aniqlash qismidir.
Funksiya_tanasi blok yoki tarkibiy operator bo'lishi mumkin. Si tilida funksiya tanasi ichida boshqa funksiyani aniqlash imkoni yo'q. Funksiya tanasida funksiya chaqirilgan nuqtasidan chiqish operatori bo'lishi hamisha ham talab etilavermaydi. U ikki xil shaklga ega:
return;
return _ifoda;
Birinchi shakl hech qanday qiymat qaytarmaydigan void tipiga to'g'ri keladi.
Shunday qilib Si tilida funksiya ko'rsatilgan tipda qiymat qaytaruvchi, yoki hech narsa qaytarmaydigan parametrlar bilan hamda parametrlarsiz ham qo'llanishi mumkin.
Funksiyani aniqlashning umumiy shakli quyidagicha:
tip_natija
funksiya_ismi (parametrlar_ro' yxati) parametrlar_-xususiyati;
funksiya_tanasi
4.5.2. Funksiyani e'lon qilish va chiqarish.
Funksiyaga aniq murojaat qilish uchun u haqidagi barcha ma'lumotlar kompilyatorga oldindan ma'lum bo'lishi zarur, ya'ni funksiyani chaqirishdan avval standartga ko'ra o'sha funksiya uning aniqlanishini yoki tavsifini dasturga joylashtirish kerak.
Standart bo'yicha funksiyani uning timsoli aniqlaydi:
tip funksiyajsmi (parametrlar _ xususiyatlari);
Masalan:
double f (int n, float x);
double f (int, float); irodalar bir-biri bilan ekvivalent.
Funksiyaga murojaat qilish uchun «()» operatsiyasi bilan ifodalardan foydalaniladi:
funksiyaning_belgilanishi ( haqiqiy _parametrlar_ro'yxati)
«()» pperatsiyaning operandalari sifatida funksiyaning _belgilanishi va haqiqiy_parametrlar_ro' yxati qatnashmoqda.
Funksiyaning belgilanishi bu uning ismi, haqiqiy jparametrlarjro' yxati argumentlar deb atalib, ularning soni funksiyaning rasmiy parametrlari soniga teng.
Haqiqiy va rasmiy parametrlar orasidagi moslik ularning ro'yxatda o'zaro joylashishiga qarab aniqlanadi. Haqiqiy parametrlarni hisoblash (o'ngdan chapga yoki chapdan o'nga) Si tili standartida aniqlanmagan. Rasmiy va haqiqiy parametrlar tiplari bo'yicha mos bo'lishi zarur. Haqiqiy parametr tipi rasmiy parametr tipi bilan bir xil bo'lgani yaxshiroq. Aks holda, bunday tiplarni keltirish mumkin bo'lsa, kompilyator tiplarni yaratish buyruqlariga avtomatik ravishda qo'shadi.
Masalan funksiya timsoli bilan quyidagicha aniqlangan bo'lsin:
int g (int,long);
Dasturda uni chaqirish quyidagicha:
g (5.0+m,6.3e+2)
Bu yerda ikkala parametr ham double tipiga ega. Kompilyator funksiya timsoliga asoslanib, avtomatik ravishda mana bunday almashtirishni qaraydi:
g ((int)(3.0+m), (long) 6.3e+2)
Funksiya ifoda hisoblanganligi sababli, uning tanasidagi operatorlar bajarilgach, chaqirish nuqtasiga ayrim qiymatlar qaytariladi, uning tipi esa qat'iy ravishda uning timsolida aniqlangan funksiya ismi oldida keluvchi tipga mos keladi.
Masalan:
float ft (douible x, int n)
{
if (x<n) return x;
return n;
}
hamisha float tipidagi qiymatni qaytaradi.
Funksiyani chaqirish—ifoda hisoblanib, bunday ifoda dastur matnida funksiyaning qaytaradigan qiymatlariga bog'liq bo'ladi.
Masalan:
void print (int gg, int mm, int dd)
{
printf («\n yil:%d», gg);
printf (<<\n oy:%d», mm);
printf («\n kun:%d», dd);
}
Unga murojaat
print (2002, 10, 15);
Ekranga quyidagicha natijani chiqarish bilan yakunla-nadi.
Yil: 2002 oy.10 kun:15
4.6 PROTSESSOR DIREKTIVALARI VA
KOMPILYATORGA KO'RSATMA
4.6.1. Nomlangan o'zgaruvchi va makroaniqlashlar
Bizga ma'lumki, Si tilida har bir dastur protsessor oldi direktivalaridan iborat. Protsessoroldi buyruqlari direktivalar deb ataladi. Ularning har biri # belgisi bilan belgilanadi. Biz bundan oldingi boblarda # include direk-tivasini ko'rib o'tdik. Direktivalarning umumiy formati quyidagicha:
direktivasi kompilyatorga keyingi qator o'nli butun o'zgarmas bilan aniqlanadigan raqamga ega bo'lishini ko'rsatadi. Direktiva bir vaqtning o'zida nafaqat qator raqamini, balki fayl ismini ham o'zgartirish imkonini beradi. Uning umumiy shakli:
Si tilida hech qanday harakatni ifodalamaydigan direktiva mavjud bo'lib, u quyidagi ko'rinishga ega:
#
dastur buyruqlari;
# pragma leksem_ketma-ketligi
Mazkur buyruq kompilyator bilan bog'liq aniq harakatni ijro etishni bildiradi.
Bu direktiva tarkibiga ayrim kompilyatorlar dastur matni tarkibida mavjud bo'lgan assembler buyruqlari soni to'g'risidagi variant ham kiradi.
Bu yerda # pragma buyrug'i muhimdir va u turlicha bo'lishi mumkin. Uning uchun standart yo'q. Agar aniq bir protsessor oldi ishlovi unga notanish dasturni uchratsa, uni bo'sh direktiva singari bekor qiladi.
Ayrim kompilyatorlarda
# pragma pack(n)
n bu yerda, 1,2 yoki 4 bo'lishi mumkin.
Bunda tuzilmalardagi va birlashmalardagi pack dasturi qo'shma elementlarga ta'sir etadi.
Oldindan aniqlangan makroismlar mavjud bo'lib, ular quyidagi xabarlarni olish imkonini beradi:
Si dasturlash tili beshta turdagi xotira modeliga ega. Bu modellar uchun quyidagi cheklovlar o'rinli:
— Hech qaysi takrorlanuvchi modul 64 kb dan yuqori hajmni egallamaydi.
— Agar juda katta xotira modeli qo'llanilmasa va ma'lumot elementi (masalan masiv) huge kalit so'zi bilan yozilmasa, u 64kb dan ortiq bo'la olmaydi.
Kichik (small) model
Bunda dastur bir segment ma'lumoti va bir buyruq segmenti bilan yaratiladi (segment 64 kb.ga teng). Bundan kelib chiqadiki, bu modellarda dastur 128 kb dan oshmaydi. Ushbu modelda hech qanday kalitlar ishlatilmasa, hamma ko'rsatkichlar near tipiga ega bo'ladi, lekin far,
huge kalit so'zlari bilan ham kiritishni amalga oshirish mumkin.
O'rta (medltum) model
Dastur buyruqlarning bir necha segmenti va bitta ma'lumot segmenti bilan yaratiladi. Odatda dasturlar uchun buyruqlarning katta o'lchami qo'llaniladi. Bunda har bir bajariluvchi modul o'zining buyruq segmentiga ega bo'ladi.
Kompakt (compact) model
Dastur bir necha ma'lumot segmentlari va bitta buyruq segmenti bilan yaratiladi. Oldindan ko'rsatilmasa hamma kod ko'rsatkichlari bu modelda near tipiga, ma'lumotalar esa far tipiga ega bo'ladi. Boshqa kod ko'rsatichlarini far kalit so'zi yordamida va ma'lumotlarni near va huge kalit so'zlari yordamida ham kiritish mumkin.
Katta (large) model
Dastur bir necha ma'lumotlar segmenti va bir necha buyruqlar segmenti yordamida yaratiladi. Avvaldan ko'rsatilmasa bu modelda element kodi va ma'lumotlar far tipidagi adresga ega bo'ladi. Boshqa kod ko'rsatkichlarini near va huge kalit so'zi yordamida ham kiritish mumkin.
Juda katta (huge) model
Dastur bir necha buyruq va ma'lumot segmentlari bilan to'ldiriladi. Bunday segmentlar bir qancha bo'lishi mumkin. Bu modelda ma'lumot o'lchamiga (masalan massivga) 64 kb. li cheklov olib tashlanadi, ammo segmentlarga quyidagi cheklovlar qoladi:
— ma'lumotning yagona elementi (masalan massiv elementi) 64 kb dan yuqori bo'lmasligi;
— ixtiyoriy 128 kb. dan yuqori massivlar uchun hamma elementlar 2 ga karrali o'lchamga ega bo'lishi kerak.
Sizeol opretorining bajarilish natijasi va ikki ko'rsatkichning farqi int tipiga ega bo'ladi, buning uchun sizeof operatoridan quyidagi konstruksiyada foydalanish kerak:
(long) sizeof (huge_item),
Bunda hugejtem talab qilingan element.
Ikkita ko'rsatkichning farqini hugeda olish uchun, elementlarni quyidagi konstruksiyada olish kerak:
(long) (huge_ptrl -huge_ptr2).
Turbo-Si dasturlash tili yuqorida ko'rsatilgan model-lardan tashqari yana bir xotira modeli (ting)ga ega. Bu eng kichik xotira modelidir. Bunda hamma to'rta (CS,DS,SS,ES) registrlar bitta yagona adresni saqlaydi, shuning uchun 64 kb ma'lumot kodi massivlarni saqlashga ajratiladi. Hamisha near tipidagi ko'rsatkichlar qo'llaniladi. Tiny tipidagi xotira modelidan foydalanuvchi dastur *.com tipidagi formatga ega bo'ladi.
Elementlar yoki ko'rsatkichlarni elementga near, far va huge kalit so'zlari yordamida modifikatsiyalash uchun quyidagi qoidalarni doimo esda tutish zarur:
1. Kalit so'zlar element yoki ko'rsatkichni o'ngdan raodifikatsiyalaydi. Masalan, char far ** p; shuni bildiradiki, r— bu far ga ko'rsatkich char ga ko'rsatkichdir;
2. Agar o'ngda kalit so'zidan keyin identifikator kelsa, u holda bu element standart ma'lumot segmenti nearda yoki far yoxud hugeda joylashishini aniqlaydi. Masalan, char far A; bu yerda A char tipidagi far adresli elementlarga ega;
3. Agar o'ngda kalit so'zdan keyin ko'rsatkich kelsa, u holda u adres o'lchami: 16 bit near yoki 32 bit {huge yo far)n\ aniqlamaydi. Masalan char far*p. Bu yerda r char tipidagi element far ko'rsatkichini (32 bit) bildiradi;
4.8. FAYLLAR USTIDA OPERATSIYALAR
Fayllardan matnlarni o'z ichiga olish uchun #include direktivasi qo'llaniladi va uni yozishning quyidagi uch shakli mavjud:
# include <fayl_nomi>
#include <<fayl_nomi»
#include makrosjismi
Shu vaqtgacha biz misollarda birinchi shaklni qo'lladik. Fayl nomi <> belgisi ichiga olinsa, protsessor faylni katalogning standart tizimidan qidiradi. Agar fayl nomi «» ichiga olinsa, protsessor foydalanuvchining hozirgi katalogini, so'ngra katalogning standart tizimini qidiradi.
Makrosjismi — bu #define direktivasi orqali kiritilgan ism yoki makroslardan iborat.
Foydalanuvchi Si tili bilan ish boshlashda kiritish-chiqarish vositalari bilan to'qnash keladi. Buning uchun dastur matnida quyidagicha direktiva joylashtirilar edi:
#include <stdio.h>
Bu direktivaning bajarilishida dastur kutubxonadan kiritish va chiqarishning aloqalarini ulaydi. Bunda .h kutubxona fayllari timsolini bildiradi.
TURBO Ñ da include fayllarining ayrimlari quyidagilar:
alloc.h — xotirani boshqarish funksiyasini e'lon qiladi (bo'lish, joylashtirish va hokazolar).
asert.h — sozlovchi makrobuyruq assert ni e'lon qiladi.
bios.h — IBM—PC ROM BIOS protsedurasini chaqirishda turli funksiyalarni e'lon qiladi.
conio.h — DOS tizimida konsolga kiritish-chiqarishda turli funksiyalarni e'lon qiladi.
ctype.h — makrobuyruqlarda foydalaniladigan belgilarni o'zgartirish va sinflarga ajratish strukturasini saqlaydi.
dir.h — kataloglar bilan ishlash funksiyalarini ishlash protseduralarini o'z ichiga oladi.
float.h — suzuvchi vergulli ma'lumotlar bilari operatsiyalar bajarganda protseduralar uchun saqlaydi.
math.h — matematik funksiyalar timsollari kutubxonasini o'z ichiga oladi.
stddef.h — ayrim ma'lumotlarning umumiy tiplari makrobuyruqlarini o'z ichiga oladi.
stdio.h — kiritish chiqarish protseduralarini o'z ichiga oladi.
stdlib.h — almashtirish protseduralari, izlash protsedurasi, tartiblash protsedurasi va shu kabilarni o'z ichiga oladi.
string.h — belgilar qatori bilan ishlash.
time.h — vaqtni belgilash uchun.
graphics.h — grafiklar bilan ishlaydi.
4.9. FUNKSIYALAR GRAFIKLARINI HOSIL QILISH
Ranglar bilan ishlash uchun Si tilida turli funksiyalar mavjud bo'lib, ular quyidagilardan iborat:
Setsolog(rang) — bu funksiya ko'rsatilgan chizish rangini o'rnatadi;
GetColor — chizish rangini qaytaradi;
GetBkColor — fon rangini qaytaradi;
GetMaxColor — ranglar sonini qaytaradi;
Masalan:
SetBkColor (GREEN) — ekranga yashil fon beradi.
4.9.1. Nuqta tasvirini hosil qiiish
Nuqtani tasvirlash uchun putpixel operatoridan foydalanamiz.
Uning formati quyidagicha:
putpixel(x,y, rang) — x,y lar nuqtaning koordinatlari, rang — esa uning rangi.
Masalan: (240,220) koordinatali nuqtaning tasvirini qizil rangda yasaylik:
#ihclude<conio.h>
# include<graphic.s.h>
rnain()
{ float x,y;
int gd=DETECT,gm; initgraph(&gd,&gm, «\\tc»);
putpixel(240,220,RED);
getch();
4.9.2. To'g'ri chiziq tasvirini hosil qiiish
To'g'ri chiziq (to'g'rirogi kesma)ni yasash uchun line funksiyasidan foydalaniladi. Uning formati quydagicha :
4.9.3. Aylana va yoy tasvirini hosil qilish
Ellipsni hosilqiiish uchun Ellipse funksiyasidan foydalanamiz. Uning formati.
Ellipse (x,y,a,p,xr,yr) — bunda (x,y) — ellipsning markazi koordinatalari, a — boshlang'ich burchak, P — oxirgi burchak, xt — obsissalar o'qi bo'ylab radiusi, yr — kordinatalar o'qi bo'ylab radiusi.
Soha chegaralarini bo'ó ash.
Ko'rsatilgan soha chegarasini bo'yash uchun
floodfill (x,y, rang chegarasi)
— funksiyadan foydalaniladi, u setfillstyle bilan birgalikda ishlaydi.
void sefillstyle(int bo'yash turi, int rang)
Bu funksiya shablon turini va rangini tanlash imkonini beradi. To'ldirishning 12 xil turi bo'lib, u quyidagi 11-iadvalda keltirilgan.
Si da har-xil yo'g'onlikdagi chiziqlarni selinestyle funksiyasi yordamida yasash mumkin.
void selinestyle(int linesigned, uppatern, int thickness);
linestyleC chiziq to'g'ri") quyidagi 5 ta qiymatdan birini qabul qilishi mumkin.
Ikki argument upatter («foydaluvchi shabloni») birinchi argument USERBIT_LINE bo'lgan holdagina foydalaniladi.
Ikkinchi argument thickness chiziqning yo'g'onligi haqidagi axborotni bildiradi. Afsuski, uning faqatgina quyidagi ikki ko'rinishi mavjud xolos:
Matnlarni joylashtirish uchun outtext (qator) funksiyasidan foydalanib, qatorni ekranga chiqarish mumkin.
Masalan:
Outtextxy (x, y, «NaMPI») — NaMPI qatori ekranga chikadi
Outtextxy (x, y, «matn») — kerakli axborotni ko'rsatilgan koordinatadan boshlab ekranga chiqarish.
Masalan:
Outtextxy (50, 50, «O'zbekiston kelajagi buyuk davlat»)
textwidth (qator) — qator uzunligini qaytaradi.
textheight (qator) — qator bo'yini qaytaradi. settextstyle (shrift, yo'nalish, o'lcham) void far settextstyle (int shrift.int yo'nalish, int o'lchami) font — o'lchami quyidagi qiymatlardan birini qabul qiladi:
Uchunchi o'lcham charsize belgi o'lchamini aniqlaydi va 1,2,..,10 qiymatlarini qabul qiladi.
charsize(K Ê10)
void far setjistify (int horiz, int xert) funksiyasi yordamida matnni istalgan joyga joylashtirish mumkin.
Uning gorizontal, vertikal bo'yicha qiymatlari quyidagi 11-jadvalda ioylashtirilgan.