(C++ tilida dasturlash)
1. Sintaksisga kirish
Dastur yaratish muhiti
Dastur yaratish umumlashgan muhiti Redaktor form – Shakllar
muharriri, Inspektor ob’yektov – Ob’yektlar inspektori, Palitra
komponentov – Komponentlar palitrasi, Administrator loyihaa – Loyiha
administratori va to‘la umumlashgan Redaktor koda – Kodlar muharriri
hamda kodlar va resurslar ustidan to‘liq azoratni ta’minlaydigan, dastur
ilovalarini tezkor yaratadigan Otladchik - instrumentov - Sozlashinstrumentlari kabilarni birlashtiradi.
Komponentlar
palitrasi
Shakl muharriri
Ob’yektlar
navigatori
Kodlar
muharriri
Ob’yektlar
inspektori
Kоmpоnеntlаr Pаlitrаsi ilоvаlаrni qurishdа tаklif qilinаdigаn 100
dаn оrtiq tаkrоrаn qo‘llаnаdigаn kоmpоnеntlаrdаn ibоrаt.
SHаkllаr Muhаrriri dаsturning fоydаlаnuvchi bilаn intеrfеysini
yarаtish uchun mo‘ljаllаngаn.
Kоd Muhаrriri dаstur mаtnini, хususаn, vоqеаlаrgа ishlоv alarning
qiymatlar ro‘yxati (o‘nggda) joylashgan.
Komponentlar ko‘rinadigan (vizual) va ko‘rinmaydigan (vizual
bo‘lmagan) larga bo‘linadi. Vizual komponentlar bajarilish paytidabеrish
funktsiyalаrini yozish uchun mo‘ljаllаngаn.
Оb’еktlаr Nоziri qоtib qоlgаn chigаl dаsturlаsh zаrurаtisiz
оb’еktlаr хususiyatlаrini vizuаl o‘rnаtish imkоnini bеrаdi hаmdа shundаy
vоqеаlаrni o‘z ichigа оlаdiki, bu vоqеаlаrni ulаrning pаydо bo‘lishigа
nisbаtаn оb’еktlаr rеаktsiyasi kоdlаri bilаn bоg‘lаsh mumkin bo‘lаdi.
Оb’еktlаr Хаzinаsi mа’lumоtlаrning shаkl vа mоdullаri kаbi
оb’еktlаrgа egа bo‘lib, ulаr ishlаb chiqishdа muvаqqаt sаrflаrni
kаmаytirish mаqsаdidа ko‘plab ilоvаlаr bilаn bo‘linаdi.
1
Komponentlar
Komponentlarni shaklga o‘rnatish uchun komponentlar palitrasidagi
kerakli piktogramma tanlanadi, so‘ngra shaklning komponent joylanishi
kerak bo‘lgan joyi tanlanadi. Shundan so‘ng komponentlar xossalarini
ob’yektlar inspektori yordamida tahrirlash mumkin. Properties bandida
komponentlar xossalarining ro‘yxati (chapda) va bu xoss loyihalash
paytidagidek paydo bo‘ladi. Bunga knopkalar va tahrirlanuvchi maydonlar
misol bo‘la oladi. Vizual bo‘lmagan komponentlar loyihalash vaqtida
shakldagi piktogramma ko‘rinishida paydo bo‘ladi. Ular bajarilish paytida
hech qachon ko‘rinmaydi, ammo ma’lum funksionallikga ega bo‘ladi
(masalan, berilganlarga murojaatni ta’minlaydi, Windowsning standart
muloqatlarini chaqiradi).
Xossalar
Xossalar komponentlarning tashqi ko‘rinishi va tabiatini aniqlovchi
atributlar hisoblanadi. Xossalar ustunidagi ko‘p xossalar komponentlari
oldindan o‘rnatilgan qiymatlarga ega bo‘ladi (masalan, knopkplar
balandligi). Komponentlar xossalari xossalar varag‘i (Properties) da aks
ettiriladi. Ob’yektlar inspektori komponentlarning nashr etilgan
(published) xossalarini aks ettiradi. Published-xossalardan tashqari
komponentlar umumiy (public), faqat ilovalarning bajarilish paytidagina
murojaat qilish mumkin bo‘lgan nashr qilingan xossalarga ega bo‘ladi.
Xossalar ro‘yxati ob’yektlar inspektori xossalar varag‘ida joylashadi.
Xossalarni loyihalash paytida aniqlash mumkin yoki ilovalarning bajarilish
paytida ko‘rinishini o‘zgartirish uchun kod yozish mumkin. Komponent
xossalarini loyihalash paytida aniqlash uchun shakldagi komponent
tanlanadi, ob’yektlar inspektori xossalari varag‘i ochiladi, aniqlanadigan
xossa tanlanadi va zarur bo‘lsa xossalar muharriri yordamida o‘zgartiriladi
(bu kiritish uchun oddiy maydon yoki son, osilib tushuvchi ro‘yxat,
ochiluvchi ro‘yxat, muloqat paneli va boshqalar bo‘lishi mumkin).
Biror komponentning xossalarini dasturning bajarilish paytida
o‘zgartirish uchun «Imya Komponent» –> «Nazvanie svoystva» tavsifiga
o‘zgaruvchidek murojaat qilish kerak, ya’ni qiymatlarni o‘zimiz
hohlagandek o‘qishimiz yoki almashtirishimiz mumkin.
Xodisalar
Ob’yektlar inspektorining xodisalar varag‘i (Events) komponentlar
tomonidan taniladigan xodisalar ro‘yxatini ko‘rsatadi. Har bir komponent
2
o‘zining shaxsiy xodisalarini qayta ishlovchi to‘plamga ega bo‘ladi. C++
Builder da xodisalarni qayta ishlovchi funksiyalarni yozish va xodisalarni
bu funksiya bilan bog‘lashga to‘g‘ri keladi. Biror bir xodisaga qayta
ishlovchi yozib, siz dasturga bu xodisa ro‘y berganda yozilgan
funksiyaning bajarilishini topshirasiz.
Xodisani qayta ishlovchini qo‘shish uchun shaklda xodisani qayta
ishlovchi komponent tanlanadi. So‘ngra xodisalar varag‘ida ob’yektlar
inspektori ochilib (Event bandi) xodisaning qatoridagi qiymatlar ustunida
sichqonning chap tugmasi ikki marta bosiladi. Bu bilan C++ Builder
xodisalarni qayta ishlash prototipini generatsiya qilishga va uni kodlar
muharririda ko‘rinishiga majbur qiladi. Bu holda bo‘sh funksiya nomi
generatsiya qilinadi va muharrir kod kiritilishi zarur bo‘lgan joyda
ochiladi. Kursor buyruqlar qavslari ichiga joylashadi { … }. So‘ngra
xodisa sodir bo‘lganda bajarilishi kerak bo‘lgan kod kiritiladi. Xodisalarni
qayta ishlovchi funksiya nomidan kyeyin ko‘rsatiladigan parametrlarga
ega bo‘lishi mumkin.
Quyida xodisalarni qayta ishlovchi protseduraning shunday bo‘sh
karkasi ko‘rsatilgan:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
}
Stаndаrt kоmpоnеntаlаr
Kоmpоnеntаlаr pаlitrаsining Standard qo‘shimchа ilоvаlаri
kоmpоnеntаlаri sizning dаsturingizgа Windows stаndаrt intеrfеysli
elеmеntlаrning 14 tаsining ulаnishini аmаlgа оshirаdi.
TMainMenu
Bоsh mеnyu kоmаndаlаri pаnеlini vа ulаrgа mоs kеlаdigаn tushib
qоlаdigаn mеnyulаrni yarаtаdi. Bаrchа mеnyu kоmаndаlаrining
idеntifikаtоrlаri mеnyuning hаr qаndаy kоnkrеt kоmаndаsigа kirish
huquqigа egа bo‘lgаn Items хususiyati bilаn аniqlаnаdi, AutoMerge
хususiyati Merge vа Unmerge mеtоdlаri bilаn birgаlikdа turli shаkldаgi
mеnyulаrning birlаshish jаrаyonini bоshqаrаdi.
TPopUpMenu
3
Shаkl yoki birоntа bоshqа kоmpоnеntа uchun mахsus mеnyu
yarаtаdi. E’tibоrgа оling, аynаn shu mаqsаd uchun hаr qаndаy bоshqа
kоmpоnеntа PopUpMenu хususiyatigа egа bo‘lib, bu хususiyatdа siz
uning bilаn bоg‘liq mеnyugа iqtibоs qilishingiz mumkin.
Аgаr siz sichqоnchаning o‘ng tugmаsini shаklgа yoki bеrilgаn
kоmpоnеntа mаnsub bo‘lgаn birоn bоshqа elеmеntgа bоsish bilаn mахsus
mеnyu ekrаndа pаydо bo‘lishini хоhlаsаngiz, AutoPopup хususiyatining
true qiymаtini o‘rnаting. Vеqеа qаytа ishlаtgichi - OnPopup yordаmidа
bеvоsitа mахsus mеnyuning pаydо bo‘lishi оldidаn bаjаrilаdigаn
prоtsеdurаni аniqlаsh mumkin.
Tlabel
Shаkldа tаhrir qilib bo‘lmаydigаn stаtik mаtnning to‘rtburchаk
sоhаsini аks ettirаdi. Оdаtdа mаtn bоshqа kоmpоnеntа nоmidаn ibоrаt
bo‘lаdi.
Nоm mаtni Caption хususiyatining qiymаtidir.
Alignment
хususiyati mаtnni tеkislаsh usulini аniqlаydi. Shrift o‘lchаmi аvtоmаtik
tаrzdа sоhаning mаksimаl to‘ldirilishigа mоs kеlishi uchun, AutoSize
хususiyatining true qiymаtini o‘rnаting. Kаltа sоhа ichidа mаtnning
hаmmаsini ko‘rish imkоnigа egа bo‘lish uchun, WordWrap хususiyatining
true qiymаtini bеring. Transparent хususiyatining true qiymаtini
o‘rnаtsаngiz, bоshqа kоmpоnеntаning bir qismini to‘g‘ri uning ustidа
jоylаshtirilgаn nоm оrаsidаn ko‘rinib turаdigаn qilishingiz mumkin.
TEdit
Ахbоrоt yakkа sаtrining tаhrir qilinаyotgаn kiritishidаgi
to‘rtburchаk sоhаni shаkldа аks ettirаdi. Tаhrir sоhаsining ichidаgi
bоshlаng‘ich nаrsаlаrni Text хususiyatining qiymаti bo‘lgаn sаtr аniqlаydi.
TЕdit kоmpоnеntаsi TCustomEdit sinfining to‘g‘ridаn-to‘g‘ri
hоsilаsi bo‘lib, uning bаrchа хususiyatlаri, mеtоdlаri vа fоqеlаrigа vоrislik
qilаdi.
TMemo
Ахbоrоt ko‘plаb sаtrining tаhrir qilinаyotgаn kiritishidаgi
to‘rtburchаk sоhаni shаkldа аks ettirаdi. Tаhrir sоhаsining ichidаgi
bоshlаng‘ich nаrsаlаrni Lines хususiyatining qiymаti bo‘lgаn sаtrlаr
mаssivi аniqlаydi. Ushbu хususiyat qiymаti ustunidа tugmаchаni
bоssаngiz, ro‘yхаt elеmеntlаri muhаrririning dаrchаsi оchilаdi.
4
TMemo kоmpоnеntаsi TCustomMemo sinfining to‘g‘ridаn-to‘g‘ri
hоsilаsi bo‘lib, uning bаrchа хususiyatlаri, mеtоdlаri vа vоqеаlаrigа
vоrislik qilаdi.
TButton
Yozuvli to‘rtburchаk tugmаni yarаtаdi. Tugmаchа bоsilgаndа,
dаsturdа birоn-bir хаtti-hаrаkаt nоmlаnаdi (initsiаllаshtirilаdi).
Tugmаchаlаr ko‘prоq diаlоgli dаrchаlаrdа qo‘llаnаdi. Default
хususiyatining true qiymаti tоmоnidаn tаnlаb оlingаn yashirin tugmаchа,
diаlоg dаrchаsidа hаr gаl Enter klаvishаsi bоsilgаndа, OnClick vоqеа
qаytа ishlаtgichini ishgа tushirаdi. Cancel хususiyatining true qiymаti
tаnlаb оlgаn uzish tugmаchаsi, diаlоg dаrchаsidа hаr gаl Escape klаvishаsi
bоsilgаndа, OnClick vоqеа qаytа ishlаtgichini ishgа tushirаdi.
TVutton kоmpоnеntаsi TButtonControl sinfining hоsilаsi
hisоblаnаdi.
TCheckBox
Ikkitа hоlаtgа hаmdа tаvsifiy mаtngа egа bo‘lgаn kvаdrаt chеkbоksni yarаtаdi (bundа tаvsifiy mаtn chеk-bоksning vаzifаsini
spеtsifikаtsiya qilаdi).
Bоks hоlаtini bildiruvchi «check»
birоn-bir vаriаntning
tаnlаnishigа mоs kеlаdi (bоks ustidаn tоrtilgаn chiziq bilаn bеlgilаnаdi),
«uncheck» hоlаti esа tаnlоv оlib tаshlаnishigа mоs kеlаdi - bundа Checked
kоmpоnеntаsining хususiyati mоs rаvishdа o‘zgаrаdi hаmdа OnClick
vоqеаsi yuzаgа kеlаdi. Tаvsifiy mаtn Caption хususiyatidа sаqlаnаdi.
AllowGrayed хususiyatining true qiymаtini o‘rnаtib, bоksni to‘qrоq rаngli
(mаsаlаn, kulrаng) qilish mumkin. State хususiyati jоriy hоlаtni vа bоks
rаngini аks ettirаdi.
TCheckBox kоmpоnеntаsi TButtonControl sinfining hоsilаsidir.
TRadioButton
Ikkitа hоlаtgа hаmdа tаvsifiy mаtngа egа bo‘lgаn yumаlоq
tugmаchаni yarаtаdi (bundа tаvsifiy mаtn yumаlоq tugmаchаning
vаzifаsini spеtsifikаtsiya qilаdi).
Rаdiо-tugmаlаr bir-birini istisnо qilаdigаn tаnlоv vаriаntlаrining
to‘plаmidаn ibоrаt: ya’ni ushbu vаqt dаqiqаsidа fаqаt bittа tugmа tаnlаb
оlinishi mumkin (ichki qоrа dоirаchа bilаn bеlgilаnаdi), аvvаl tаnlаngаn
tugmаdаn esа tаnlоv аvtоmаtik tаrzdа оlinаdi. Rаdiо-tugmа bоsilgаndа,
5
Checked kоmpоnеntаsining хususiyati hаm mоs rаvishdа o‘zgаrаdi vа
OnClick vоqеаsi yuzаgа kеlаdi.
Оdаtdа rаdiо-tugmаlаr аvvаldаn shаkldа o‘rnаtilgаn kоntеynеr
ichigа jоylаshtirilаdi. Аgаr bittа tugmа tаnlаngаn bo‘lsа, ushbu guruhgа
mаnsub bаrchа bоshqа tugmаlаrning tаnlоvlаri аvtоmаtik tаrzdа оlib
tаshlаnаdi. Mаsаlаn, shаkldаgi ikkitа rаdiо-tugmа, аgаr ulаr bоshqаbоshqа kоntеynеrlаrdа jоylаshgаn bo‘lsаginа, bir pаytning o‘zidа tаnlаb
оlinishi mumkin. Аgаr rаdiо-tugmаlаrning guruhlаnishi оchiq-оydin
bеrilmаgаn bo‘lsа, bu hоldа ulаrning hаmmаsi, yashirin hоldа, kоntеynеr
dаrchаlаri (Tform, TGroupBox yoki TPanel) dаn biridа guruhlаnаdi.
TRadioButton kоmpоnеntаsi TButtonControl sinfining hоsilаsidir.
TListBox
Tаnlаsh, qo‘shish yoki o‘chirish uchun mo‘ljаllаngаn mаtn
vаriаntlаri ro‘yхаtining to‘rtburchаk sahifasini аks ettirаdi.
Аgаr ro‘yхаtdаgi bаrchа elеmеntlаr аjrаtilgаn sоhаgа sig‘mаsа,
ro‘yхаtni аylаntirish linеykаsi yordаmidа ko‘rib chiqish mumkin. Ro‘yхаt
elеmеntlаri ltems хususiyatining ichidа, dаstur bаjаrilish vаqtidа tаnlаb
оlinаdigаn elеmеnt rаqаmi esа ltemIndex хususiyatining ichidа jоylаshgаn
bo‘lаdi. Ro‘yхаt elеmеntlаri mаtn muhаrririning dаrchаsi Items хususiyati
qiymаtining grаfаsidа tugmаchа bilаn оchilаdi. Ro‘yхаt elеmеntlаrini
Items оb’еktining Add, Append, Delete vа Insert mеtоdlаri yordаmidа
dinаmik tаrzdа qo‘shish, o‘chirish, оrаsigа jоylаsh vа o‘rnini аlmаshtirish
mumkin. Mаsаlаn:
LisBoxI->Items->Add(«Ro‘yхаtning охirgi elеmеnti»);
Sorted хususiyatining true qiymаti ro‘yхаt elеmеntlаrini аlifbо
tаrtibidа nаvlаrgа аjrаtib jоylаshtirаdi.
TListBox kоmpоnеntаsi TCustomListBox sinfining hоsilаsi bo‘lib,
uning bаrchа хususiyat, mеtоd vа vоqеlаrigа vоrislik qilаdi.
TComboBox
Tаhrir sоhаsi hаmdа mаtn vаriаntlаrining tushib qоlаdigаn ro‘yхаti
kоmbinаtsiyasini tаnlаsh uchun yarаtаdi.
Text хususiyatining qiymаti bеvоsitа tаhrir sоhаsigа kiritib
qo‘yilаdi. Fоydаlаnuvchi tаnlаb оlishi mumkin bo‘lgаn ro‘yхаt elеmеntlаri
Items хususiyatining ichidа bo‘lаdi, dаsturning bаjаrilish pаytidа tаnlаb
оlinishi mumkin bo‘lgаn elеmеnt rаqаmi ItemIndex хususiyatining ichidа
6
bo‘lаdi, tаnlаb оlingаn mаtnning o‘zi esа SelText хususiyatining ichidа
bo‘lаdi. SelStart vа SelLength хususiyatlаri mаtnning qаysi qismini tаnlаb
оlishni bеlgilаb bеrish yoki mаtnning qаysi qismi tаnlаb оlingаnini bilish
imkоnini bеrаdi.
Items оb’еktining Add, Append, Delete vа Insert mеtоdlаri
yordаmidа ro‘yхаt elеmеntlаrini dinаmik tаrzda qo‘shish, o‘chirish оrаsigа
qo‘yish vа o‘rnini аlmаshtirish mumkin, mаsаlаn:
ComboBoxl->Items->Insert(0, «Ro‘yхаtdаgi birinchi elеmеnt»);
Sorted хususiyatining true elеmеnti ro‘yхаt elеmеntlаrini аlifbо
tаrtibidа nаvlаrgа аjrаtilishini tа’minlаydi. TComboBox kоmpоnеntаsining
turini Style хususiyatidаn tаnlаb оlish mumkin.
TComboBox kоmpоnеntаsi TCustomComboBox sinfining hоsilаsi
bo‘lib uning bаrchа хususiyatlаri, mеtоdlаri vа vоqеаlаrigа vоrislik qilаdi.
TScrollBar
Dаrchа, shаkl yoki bоshqа kоmpоnеntа ichidаgilаrini ko‘rib chiqish
uchun, mаsаlаn, birоn-bir pаrаmеtr qiymаtini bеrilgаn intеrvаl ichidа
hаrаkаtlаnishi uchun, yugurgichli аylаntirish linеykаsini yarаtаdi.
Аylаntirilаyotgаn оb’еkt хulq-аtvоrini OnScroll vоqеаlаr qаytа
ishlаtgichi аniqlаydi. Fоydаlаnuvchi linеykаning o‘zidа sichqоnchаni
bоsgаndа (yugurgichning hаr ikkаlа tоmоnidа), yugurgich qаnchаgа
surilishi kеrаkligini LargeChange хususiyatining qiymаti аniqlаb
bеrаdi.Fоydаlаnuvchi sichqоnchаnim strеlkаli tugmаchаlаr (linеykа
охiridаgi) ustidа bоsgаndа yoki pоzitsiyalаsh tugmаchаlаrini bоsgаndа,
yugurgich qаnchаgа surilishi kеrаkligini SmallChange хususiyatining
qiymаti аniqlаb bеrаdi.
Min vа Max хususiyatlаrining qiymаtlаri yugurgichning yo‘l
qo‘yilishi mumkin bo‘lgаn jоy аlmаshinuvlаri intеrvаllаrini bеlgilаydi.
Sizning dаsturingiz yugurgichni Position хususiyatining qiymаti аniqlаb
bеrаdigаn kеrаkli pоzitsiyagа jоylаshtirishi mumkin. SetPcirums mеtоdi
bir pаytning o‘zidа Min, Mаx vа Position gа tеgishli bаrchа хususiyatlаr
qiymаtlаrini аniqlаb bеrаdi.
TGroupBox
To‘g‘ri burchаkli rаmkа ko‘rinishidаgi kоntеynеr bo‘lib, u
qаndаydir bir intеrfеys elеmеntlаrining mаntiqаn bоg‘lаngаn guruhini
7
shаkldа vizuаl birlаshtirаdi. Bu kоmpоnеntа Windows ning bir nоmdаgi
оb’еktning inkаpsulаlаnishidаn ibоrаt.
TRadioGroup
To‘g‘ri burchаkli rаmkа ko‘rinishidаgi kоntеynеr bo‘lib, u bir-birini
mаntiqаn istisnо qilаdigаn rаdiо-tugmаlаr guruhini shаkldа vizuаl
birlаshtirаdi.
Rаdiо-tugmаlаr bittа kоntеynеrgа jоylаshtirilgаndа «guruhlаnаdi».
Bu guruhdаn fаqаt bittа tugmаchа tаnlаb оlinishi mumkin. TRadioGroup
kоmpоnеntаsigа tugmаlаrni qo‘shish uchun, Items хususiyatining tаhriri
bаjаrilishi kеrаk. Items хususiyatining nаvbаtdаgi sаtrigа nоm bеrilsа, shu
tugmа guruhlоvchi rаmkаdа pаydо bo‘lаdi. Ushbu dаqiqаdа qаysi tugmа
tаnlаb оlinishi kеrаkligini ItemIndex хususiyatining qiymаti аniqlаb
bеrаdi. Columns хususiyatining tеgishli qiymаtini jоylаshtirib, siz
rаdiоtugmаlаrni bir nеchа ustungа guruhlаshingiz mumkin.
TPanel
Bоshqа kоmpоnеntlаrni o‘z ichigа оlishi mumkin bo‘lgаn bo‘sh
pаnеlni yarаtаdi. Siz TPanel dаn o‘z shаklingizdа instrumеntlаr pаnеli yoki
hоlаtlаr sаtrlаrini yarаtish uchun fоydаlаnishingiz mumkin.
TPanel pаnеl kоmpоnеntаsi TCustomPanel sinfining hоsilаsi bo‘lib,
uning bаrchа хususiyatlаr, mеtоdlаri vа vоqеаlаri to‘liq vоrislik qilаdi.
1- Misоl
Muharrirlash maydoniga matn kiritishga imkon beruvchi ilova
ko‘ramiz. Formaga Button, Edit va ListBox komponentalarini o‘rnatamiz.
Quyidagi kodni kiritamiz:
8
Добавить tugmasi uchun:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (!(Edit1->Text == ""))
{
ListBox1->Items->Add(Edit1->Text);
Edit1->Text = "" ;
}
}
Удалить tugmasi uchun:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (!(ListBox1->ItemIndex == -1))
ListBox1->Items->Delete(ListBox1->ItemIndex);
}
Выход tugmasi uchun:
Close();
2- Misоl
Ilova formasini loyihalash
Bo‘sh formaga TPanel – komponentasini o‘rnatamiz va Align
xossasiga alTop qiymat beramiz, Caption xossasiga bo‘sh satr.
Formaga TMemo komponentasini o‘rnatamiz va Align xossasiga
alClient, ScrollBar xossasiga ssVertical qiymat beramiz, Lines xossasiga
bosh satrlar massivi.
Fayllar bilan ishlash uchun formaga TOpenDialog va TSaveDialog
komponentalarini o‘rnatamiz. OpenDialog1 komponentasi Filter xossasini
Filter Editor dialog paneli orqali o‘zgartiramiz.
9
Formaga StatusBar komponentasini o‘rnatamiz va Panels xossasini
muharrir yo‘rdamida tahrirlaymiz.
Panel1 komponentasiga 9 ta TSpeedButton komponentasini
o‘rnatamiz. Bu komponentalar Glyph xossasiga qiymat beramiz. Buning
uchun CBuilder\Images\Buttons katalogidan Doorshut.bmp,Filenew.bmp,
Fileopen.bmp, Fileclose.bmp, Filesave.bmp, Cut.bmp, Copy.bmp,
Paste.bmp, Help.bmp fayllarni tanlaymiz.
10
Tugmalarni guruhlab o‘rnatamiz va ShowHint xossasiga True qiymat,
Hint xossasiga - "Выход", "Создать", "Открыть", "Сохранить",
"Сохранить как...", "Вырезать", "Копировать", "Вставить", "О
программе" qiymatlarini beramiz.
Xodisalarni qayta ishlovchilarni yaratish
Endi tugmalar OnClick xodisasi uchun kod yo‘zamiz.
SpeedButton3 tugmasi faylni tahrirlash va fayl nomini panelda
akslantirish uchun javob beradi:
void __fastcall TForm1::SpeedButton3Click(TObject *Sender)
{
if
(OpenDialog1->Execute())
Memo1->Lines>LoadFromFile(OpenDialog1->FileName);
11
StatusBar1->Panels->Items[0]->Text=OpenDialog1->FileName;
}
SpeedButton5 tugmasi faylni tanlangan nom bilan saqlash va fayl
nomini panelda akslantirish uchun javob beradi:
void __fastcall TForm1::SpeedButton5Click(TObject *Sender)
{
if
(SaveDialog1->Execute())
Memo1->Lines>SaveToFile(SaveDialog1->FileName);
StatusBar1->Panels->Items[0]->Text=SaveDialog1->FileName;
}
SpeedButton2 tugmasi tahrirlash oynasini tozalash uchun javob
beradi. Agar buferda matn mavjud bo‘lsa, uni saqlash kerakligini so‘rash
maqsadga muvofiq. Buning uchun Windows API MessageBox
funktsiyasidan foydalanish qulaydir.
Matnni saqlash uchun SpeedButton5Click funktsiyasidan foydalanish
mumkin:
void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
{
if (Memo1->Lines->Count>0)
{
if (MessageBox(0,"Сохранить содержимое окна редактирования?
",
"Подтвердите сохранение",MB_YESNO)==IDYES)
{
SpeedButton5Click(Sender)
}
};
Memo1->Clear();
StatusBar1->Panels->Items[0]->Text="Без имени";
}
SpeedButton1 tugmasi ilova oynasini berkitadi. Matnni saqlash
kerakligini so‘rash uchun SpeedButton2Click funktsiyasidan foydalanish
mumkin:
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{ SpeedButton2Click(Sender);
12
Close();
}
SpeedButton4 tugmasi faylni saqlash uchun javob beradi:
void __fastcall TForm1::SpeedButton4Click(TObject *Sender)
{
if (StatusBar1->Panels->Items[0]->Text=="Без имени")
SpeedButton5Click(Sender);
else
Memo1->Lines->SaveToFile(StatusBar1->Panels->Items[0]>Text)
}
SpeedButton6 va SpeedButton7 tugmalari ajratilgan matn qismini
buferga yoki joyida saqlab ko‘chirish uchun javob beradi:
void __fastcall TForm1::SpeedButton6Click(TObject *Sender)
{
Memo1->CutToClipboard();
}
//-------------------------------------------------------void __fastcall TForm1::SpeedButton7Click(TObject *Sender)
{
Memo1->CopyToClipboard();
}
SpeedButton8 tugmasi faylni saqlash uchun javob beradi:
void __fastcall TForm1::SpeedButton8Click(TObject *Sender)
{
Memo1->PasteFromClipboard();
}
SpeedButton9 tugmasi ekranga "О программе" dialog panelini
chiqarish uchun javob beradi. Buning uchun C++ Builder Ob’ektlar
Хаzinаsidagi About paneli shablonidan foydalanamiz. File/New menyu
punktini tanlab New Items dialog panelidagi Forms sahifasidan Copy
optsiyali AboutBox shablonini tanlaymiz va tahrirlaymiz:
13
Endi ilova 2 formadan iborat. Asosiy forma bu Form1. Loyiha
optsiyalari panelini chaqirib (Options/Project menu punkti) AboutBox ni
Available Forms ro‘yxatga ko‘chiramiz
SpeedButton9 tugmasi uchun quyidagi kod kiritamiz:
void __fastcall TForm1::SpeedButton9Click(TObject *Sender)
{
Application->CreateForm(__classid(TAboutBox), &AboutBox);
AboutBox->ShowModal();
AboutBox->Free();
}
Menu yaratish
14
Menu yaratish uchun asosiy formaga TMainMenu komponentasini
o‘rnatamiz. Sichqoncha o‘ng klavishasini bosib kontekstli menudan Menu
Designer punktini tanlaymiz.
Quyidagi
menularni
yaratamiz:
"&Файл"
("Созд&ать",
"&Открыть...", "&Сохранить", "Сохранить &как...", '"-","В&ыход"),
"&Вид"
("&Инструментальная
панель"),
"&Редактирование"
("&Вырезать"
"&Копировать",
"Вс&тавить")
va
"&?"("&О
программе").
Belgi "&" menu punktlari bilan “issiq” klavishalarni boglash uchun
ishlatiladi.
Tez murojaat klavishalarini ShortCut xossasiga qiymat berish o‘rqali
o‘rnatamiz.
Endi ob’еktlаr nоziridan xodisalar sahifasini tanlaymiz va
SpeedButton1Click, ... SpeedButton9Click funktsiyalarini menu punktlari
cilan boglaymiz.
"Панель инструментов" menu punkti Checked xossasiga true qiymat
beramiz va OnClick xodisasi uchun quyidagi kodni kiritamiz:
void __fastcall TForm1::N9Click(TObject *Sender)
{
N9->Checked=!N9->Checked;
Panel1->Visible=N9->Checked;
}
Asosiy forma turli elementlari uchun kontekstli menular yaratamiz.
Buning uchun formaga ikki TPopupMenu komponentasini o‘rnatamiz –
biri "Вырезать", "Копировать", "Вставить" punktlari bilan, ikkinchisi
"Скрыть" punkti bilan. Bu punktlar uchun OnClick xodisasini qayta
15
ishlovchi funktsiyalarni tanlaymiz. Va Memo1 hamda
komponentalari uchun mos kontekstli menu nomlarini tanlaymiz.
Panel1
C++Builder dа grаfikаni qo‘llаb-quvvаtlаsh
C++Builder dаsturi Windows GDI funktsiyalаrini turli dаrаjаlаrdа
inkаpsulаlаydi. Bu o‘rindа bir usul muhim bo‘lib, uning vоsitаsidа grаfik
kоmpоnеntаlаr o‘z tаsvirlаrini mоnitоr ekrаnidа tаqdim etаdi. GDI
funktsiyasi to‘g‘ridаn-to‘g‘ri chаqirilgаndа, ushbu grаfik kоmpоnеntаlаrgа
qurilmа kоntеksti dеskriptоri (device context handle) ni uzаtish kеrаk. Bu
dеskriptоr siz tаnlаb оlgаn rаssоmchilik аshyolаri - pеrоlаr, mo‘yqаlаmlаr,
shriftlаrni chiqаrib bеrаdi. Grаfik tаsvirlаr bilаn ishlаsh tugаgаch, siz
qurilmа kоntеkstini dаstlаbki hоlаtgа kеltirib qo‘yishgа mаjbursiz vа
shundаn kеyinginа undаn оzоd bo‘lishingiz mumkin.
Shu dаrаjаdа dеtаllаshtirilgаn grаfikа bilаn ishlаshgа sizni mаjbur
qilish o‘rnigа, C++Builder grаfik kоmpоnеntаlаrning Canvas (Kаnvа Аsоs) хususiyati vоsitаsidа sоddа vа tugаl intеrfеysni tаklif qilаdi. Bu
хususiyat qurilmаning to‘g‘ri kоntеkstini nоmlаydi (initsiаllаshtirаdi)
hаmdа siz rаsm chizishni to‘хtаtgаn kеrаkli vаqtdа uni оzоd qilаdi. Аsоs
pеrо, mo‘yqаlаm vа shrift tаvsiflаri nоmidаn ish ko‘rаdigаn bеrilgаn
хususiyatlаrgа egа.
Grаfik kоmpоnеntаlаr bilаsh ishlаshdа fоydаlаnuvchi аmаlgа оshirishi
lоzim bo‘lgаn yagоnа ish - bu qo‘llаnаyotgаn rаsm chizish аshyolаrining
16
tаvsiflаrini аniqlаsh. Аshyolаrni yarаtish, tаnlаsh vа оzоd qilishdа sizdаn
tizim zаhirаlаrini kuzаtib bоrish tаlаb qilinmаydi. Аsоsning o‘zi bu hаqdа
qаyg‘urаdi.
Grаfikа bilаn ishlаshdа C++Builder nаmоyon qilаdigаn аfzаlliklаrdаn
biri - bu tizimning grаfik zаhirаlаri uchun keshlаngаn хоtirаdаn
fоydаlаnish. Аytаylik, аgаr sizning dаsturingiz birоn-bir kоnkrеt turdаgi
pеrоni qаytаdаn yarаtsа, qo‘llаsа vа оzоd etsа, siz ushbu pеrоdаn hаr gаl
fоydаlаngаningizdа bu qаdаmlаrni tаkrоrlаshingizgа to‘g‘ri kеlаdi.
C++Builder kesh-хоtirаdаn grаfik zаhirаlаrni sаqlаsh uchun fоydаlаnаr
ekаn, tеz-tеz qo‘llаnаdigаn rаsm chizish аshyosi hаr gаl yangitdаn qаytа
yarаtilmаy, bаlki kesh-хоtirаdаn tаkrоrаn tаnlаb оlinishi ehtimоli оshаdi.
Buning nаtijаsidа sizning grаfik ilоvаngizning tаkrоrlаnаyotgаn
оpеrаtsiyalаrining sаmаrаsi аnchа оrtishi аniq.
Quyidа Windows uchun ilоvаlаr dаrchаsidа ko‘k kоntur bilаn
аylаntirilgаn sаriq ellipsni chizish mаsаlаsini хаl qilаyotgаn kоd frаgmеnti
kеltirilgаn. Bu mаsаlа rаsm chizish аsоsi vоsitаsidа еchilаdi.
void_fastcall TFormPaint(Tobject*Sender) {
Canvas->Pen->Color=clBlue; // Canvas->Brush->Color=clYellow
kоnturining rаngini tаnlаsh; // Canvas->Ellipse(10, 20, 50, 50) ichining
rаngini tаnlаsh; // ellips rаsmini chizish}
Аsоsdаn fоdаlаnish
Аsоsning оb’еktli sinfi Windows ning grаfik funktsiyalаrini, аlоhidа
chiziqlаr, shаkllаr vа mаtnni chizish uchun mo‘ljаllаngаn yuqоri
dаrаjаdаgi funktsiyalаrdаn bоshlаb, inkаpsulаlаydi. Kеyin rаsm chizish
uchun аsоs bilаn ishlаydigаn o‘rtа dаrаjаdаgi usul vа mеtоdlаr kеlаdi.
Nihоyat, quyi dаrаjаdа Windows GDI funktsiyalаrining o‘zigа qirish
tа’minlаnаdi. Quyidаgi jаdvаldа аsоsning аsоsiy mеtоd vа usullаrining
umumlаshtirilgаn tаvsiflаri bеrilgаn.
Dаrа Хаtti-hаrаkаtlаr
Mеtоdlаr Хususiyatlаr
jа
Yuq Pеrоning
jоriy MoveTo PenPos
оri
pоzitsiyasini bеlgilаydi
To‘g‘ri chiziqni bеrilgаn LineTo PenPos
nuqtаgаchа chizаdi
17
O‘rt
а
Bеrilgаn
o‘lchаmdаgi Rectangl
to‘g‘ri
to‘rturchаk e
chizаdi
Bеrilgаn o‘lchаmdа ellips Ellipse
chizаdi
Mаtn sаtrini chizаdi
TextOut
Mаtn sаtrini chiqаrish TextHei
uchun аjrаtilgаn bo‘yni ght
bеrаdi
Mаtn sаtrini chiqаrish TextWid
uchun аjrаtilgаn enni th
bеrаdi
To‘rburchаk ichidа mаtn TextRect
chiqаrish
Ko‘sаtilgаn to‘rburchаk FillRect
ichigа rаng vа jоriy
mo‘yqаlаm tеksturаsini
quyish
Аsоs sоhаsigа (iхtiyoriy FloodFill
shаkldаgi) bеrilgаn rаng
quyish
Pеrоning rаngi, uslubi,
eni vа rеjimini o‘rnаtish
uchun qo‘llаnаdi
Grаfik shаkllаr vа аsоs
fоnini quyishdа rаng vа
tеksturаni
o‘rnаtish
uchun qo‘llаnаdi
Bеrilgаn rаng, o‘lchаm
vаuslubdаgi
shriftni
o‘rnаtish
uchun
qo‘llаnаdi
Bеrilgаn аsоs piksеlini
o‘qish vа rаngini yozish
uchun qo‘llаnаdi
CopyMode
rеjimidа CopyRec
аsоsning
to‘rtburchаk t
sоhаsidаn
nushа
ko‘chirаdi
18
Pen
Brush
Font
Pixels
CopyMode
Аsоsning
to‘rtburchаk BrushCo
sоhаsidаn
rаngni py
аlmаshtirib
nushа
ko‘chirаdi
Аsоsning bеrilgаn jоyidа Draw
bit
оbrаzini,
piktоgrаmmа
vа
mеtаfаylning
rаsmini
chizаdi
Bit
оbrаzini, StretchD
piktоgrаmmа
vа raw
mеtаfаylning
rаsmini
to‘rtburchаkni
to‘liq
to‘ldirаdigаn
qilib
chizаdi
Quyi Windows
GDI
Handle
funktsiyalаrini
chаqirishdа
pаrаmеtr
sifаtidа qo‘llаnаdi
Rаsmlаr bilаn ishlаsh
C++Builder muhitidа bаjаrilаdigаn grаfik ishlаrning аsоsiy
mundаrijаsi аsоsingiz shаklidа yoki undа jоylаshtirilgаn bоshqа
kоmpоnеntаlаrdа bеvоsitа rаsm chizishdаn ibоrаt. C++Builder shuningdеk
tаshqi tаsvirlаr - bit оbrаzlаri, mеtаfаyllаr, piktоgrаmmаlаr, shu jumlаdаn,
pаlitrаlаrni аvtоmаtik bоshqаrishning qo‘llаb-quvvаtlаnishigа хizmаt
ko‘rsаtаdi.
C++Builder muhitidа rаsmlаr bilаsh ishlаshdа uchtа muhim jihаtni
e’tibоrgа оlish kеrаk.
Rаsm, grаfikа yoki аsоs
C++Builder muhitidа grаfikаgа аlоqаdоr bo‘lgаn uch хil оb’еkt
mаvjud:
-Аsоs shаkldа,grаfik kоmpоnеntаdа, printеrdа yoki bоshqа birоn bit
оbrаzidа rаsm chizish uchun mo‘ljаllаngаn yuzаning bit kаrtаsidаn ibоrаt.
Аsоs mustаqil оb’еkt emаs, u хаmmа vаqt birоn-bir bоshqа grаfik
оb’еktning хususiyati bo‘lib хizmаt qilаdi.
19
-Grаfikа birоn-bir fаyl yoki zаhirаning (bit оbrаzi, piktоgrаmmа yoki
mеtаfаyl) ning rаstrli tаsviridаn ibоrаt. C++Builder dаsturi TGraphic
bаzаviy sinfning hоsilаlаri bo‘lgаn TBitmap, TIcon vа TMetafile оb’еktli
sinflаrini аniqlаydi. Аlbаttа, siz o‘zingiz grаfik оb’еktlаrning shахsiy
sinflаrini e’lоn qilishingiz mumkin. TGraphic sizning ilоvаngizdа
grаfikаning bаrchа turlаridаn fоydаlаnish uchun minimаl stаndаrt intеrfеys
tаqdim etаdi.
-Rаsm - grаfikа uchun kоntеynеr bo‘lib, u grаfik оb’еktlаrning hаr
qаndаy sinflаrini tаqdim etаdi. SHundаy qilib, TPicture kоntеynеrli sinf bit
оbrаzi, piktоgrаmmа, mеtаfаyl yoki fоydаlаnuvchi tоmоnidаn bеlgilаngаn
bоshqа birоn grаfik turgа egа bo‘lishi mumkin. Ilоvа esа «rаsm» оb’еkti
vоsitаsidа kоntеynеrning bаrchа оb’еktlаrigа stаndаrtlаshgаn tаrzdа
murоjааt qilishi mumkin. Dаrhаqiqаt, tаsvirlаrni bоshqаrish
kоmpоnеntаlаrining ko‘pchiligi оb’еktli turdаgi TPicture ning Picture
хususiyatigа egа bo‘lib, u hаr хil turdаgi grаfik tаsvirlаrni tаqdim etish
imkоniyatigа egа.
Shuni hаm tа’kidlаb o‘tаylik: «rаsm» оb’еkti hаmmа vаqt birоn-bir
grаfikаgа egа bo‘lib, bu grаfikа o‘z nаvbаtidа, аsоsgа egа bo‘lishgа ehtiyoj
sеzаdi (аsоsgа egа bo‘lgаn yagоnа stаndаrt grаfik sinf bu TVitmap dir).
Оdаtdа, rаsm bilаn ishlаr ekаnsiz, siz grаfik оb’еktning fаqаt TPicture
kоntеynеri оrqаli kirish uchun оchiq bo‘lgаn qismi bilаnginа ish ko‘rаsiz.
Аgаr sizgа kоnkrеt grаfik оb’еktgа qirish huquqini ko‘rsаtish lоzim bo‘lib
qоlsа, ushbu rаsmning Graphic хususiyatigа murоjааt qiling.
Grаfik fаyllаr
Ilоvаngiz ishlаyotgаn hаr bir dаqiqаdа C++Builder stаndаrt
fоrmаtdаgi tаsvirlаr fаyllаridа rаsmlаr vа grаfiklаrning yuklаnishi vа
sаqlаnishini qo‘llаb-quvvаtlаydi. Sаqlаnаyotgаn vа dаstlаbki fаylning
nоmlаri bir-birigа mоs kеlishi hаmdа bir-biridаn fаrq qilishi mumkin.
Tаsvirni fаyldаn rаsmgа yuklаtish uchun LoadFromFile rаsm
mеtоdidаn fоydаlаning. Fаyldа tаsvirni sаqlаsh uchun rаsm mеtоdidаn
fоydаlаning Ushbu mеtоdlаrning yagоnа pаrаmеtri bu fаyl nоmi bo‘lаdi.
LoadFromFile mеtоdi fаyl kеngаyishidаn o‘zi yarаtаdigаn vа sаqlаydigаn
grаfik оb’еkt turini аniqlаsh uchun fоydаlаnаdi. LoadToFile mеtоdi
sаqlаnаyotgаn grаfik оb’еkt turigа mоs kеlаdigаn kеngаyishli fаylni
sаqlаydi. LoadFromFile
20
Nаvbаtdаgi mаtndа yo‘riqnоmа (instruktsiya) mujаssаm bo‘lib, uni siz
bit оbrаzini kоmpоnеntаli rаsm оb’еktigа yuklаsh uchun kоd mоduli
mаtnigа yozib qo‘yishingiz kеrаk.
void_fastcall TFormI::FormCreate(TObject *Sender) {
Imagel->Picture->LoadFromFile("c:\\windows\\clouds.bmp");
}
Rаsm .bmp bit оrаzlаri fаyllаrining stаndаrt kеngаyishini tаnib оlаdi
hаmdа o‘z grаfikаsini TVitmap sinf оb’еkti sifаtidа yarаtаdi, kеyin esа
ko‘rsаtilgаn ismli fаyldаn tаsvirni yuklаsh LoadFromFile mеtоdini
chаqirаdi.
Pаlitrаgа хizmаt ko‘rsаtish
Fоydаlаnuvchilik intrеfеysining ko‘pchilik elеmеntlаri birоn-bir
pаlitrаgа muхtоjlik sеymаydi. Birоq, grаfik tаsvirlаrgа egа
kоmpоnеntаlаrgа, kоmpоnеntаlаr mа’lumоtlаrini tеgishli tаrzdа аks
ettirish uchun, Windows hаmdа uning ekrаn drаyvеri bilаn o‘zаrо аlоqаgа
kirishish zаrur bo‘lib qоlishi mumkin. Windows оpеrаtsiya tizimigа оid
hujjаtlаrdа bu jаrаyon pаlitrаlаrni ishgа tushirish (palett realizing) dеb
аtаlаdi. Pаlitrаni ishgа tushirish оpеrаtsiyasining vаzifаsi shundаn ibоrаtki,
u eng ustki (ekrаndа sizgа nisbаtаn eng yaqin turgаn) fаоl dаrchа to‘liq
rаng pаlitrаsidаn fоydаlаnishini, fоn dаrchаlаri esа o‘z pаlitrаlаrining
qоlgаn rаnglаridаn mаksimаl dаrаjаdа fоydаlаnishlаrini tа’minlаshi kеrаk.
Bu dеgаni, fоn dаrchаlаri o‘z rаnglаrini «rеаl» pаlitrаdаgi erishish mumkin
bo‘lgаn eng yaqin rаnglаrgа o‘zgаrtirа оlishlаri kеrаk. Dаrchаlаr bir-birini
qismаn yopib jоy аlmаshаr ekаn, Windows hаm muttаsil dаrchа
pаlitrаlаrini ishgа sоlib bоrаdi.
Mulоhаzа. C++Builder bit оbrаzlаri pаlitrаlаridаn bоshqа pаlitrаlаrni
yarаtish vа ulаrgа хizmаt ko‘rsаtish uchun mustаqil vоsitаlаrgа egа emаs.
Birоq, аgаr siz birоn-bir pаlitrаning dеskriptоrini оlgаn bo‘lsаngiz, grаfik
kоmpоnеntаlаr ulаr bilаn ishlаy оlаdi.
Displеy yoki printеr turidаgi qurilmаlаr bilаn ishlаshdа C++Builder
kоmpоnеntаlаri аvtоmаtik tаrzdа pаlitrаlаrni ishgа tushirish mехаnizmini
qo‘llаb-quvаtlаydi. Shundаy qilib, siz TControl bаzаviy kоmpоnеntli
sinfdаn mеrоs qilib оlingаn ikkitа GetPalette vа PaletteChanged
mеtоdlаridаn fоydаlаnishingiz mumkin. Bundа Windows bu pаlitrаgа
qаyndаy munоsbаtdа bo‘lsа, siz hаm uni хuddi shundаy ishlаtа оlаsiz:
-Pаlitrаning kоmpоnеntа bilаn аlоqаsi. Аgаr grаfik kоmpоnеntа uchun
birоn-bir pаlitrаdаn fоydаlаnish zаrurаti tug‘ilgаn bo‘lsа, sizning ilоvаngiz
21
bu хаqdа хаbаrdоr bo‘lishi kеrаk. Pаlitrаni kоmpоnеntаngizgа o‘хshаtish
uchun, uning GetPalette оb’еktli mеtоdini shundаy оrtiqchа yuklаtingki, u
ushbu pаlitrа dеskriptоri (handle) ni qаytаrsin. Shuning bilаn birgа siz,
birinchidаn, kоmpоnеntаngizning mа’lum bir pаlitrаsi ishgа tushishi
lоzimligini ilоvаngizgа mа’lum qilаsiz, ikkinchidаn, ishgа tushishdа qаysi
pаlitrа kоnkrеt qo‘llаnishi kеrаkligini аniqlаysiz.
-Pаlitrа o‘zgаrishigа rеаktsiya (munоsаbаt). Sizning kоmpоnеntаngiz
GetPalette mеtоdini оrtiqchа yuklаtish vоsitаsidа qаndаydir pаlitrа bilаn
o‘хshаtilgаn bo‘lsа, C++Builder tizimi PaletteChanged mеtоdi yordаmidа
Windows ning pаlitrаlаrdаn хаbаrlаrigа munоsаbаt bildirishni аvtоmаtik
tаrzdа o‘z zimmаsigа оlаdi. Nоrmаl ish shаrоitidа siz hеch qаchоn yashirin
bеlgilаngаn bu mеtоdning хulq-аtvоrini qаytа аniqlаsh zаrurаtigа duch
kеlmаysiz. PoletteChanged mеtоdining аsоsiy vаzifаsi pаlitrаni ishgа
tushirish turini (fоnli yoki fаоl dаrchаlаr uchun) аniqlаshdаn ibоrаt.
Pаlitrаlаrning Windows tizimidа ishgа tushirilishigа nisbаtаn C++Builder
bir qаdаm ilgаrilаb kеtdi: dаrchа dеskriptоrlаri yordаmidа, nаfаqаt birbirining ustigа tахlаnаdigаn «dаstа» pаlitrаsi, bаlki fаоl dаrchаning birbirining ustigа tахlаngаn kоmpоnеntаlаrining pаlitrаlаri hаm ishgа
tushirilаdi. Аgаr хоhlаsаngiz, siz pаlitrаlаrning yashirin qаbul qilingаn
bundаy хulq аtvоrini qаytа аniqlаshingiz vа nаtijаdа birоn-bir kоmpоnеntа
to‘liq rаng pаlitrаsigа egа bo‘lishi hаmdа ekrаndа sizgа eng yaqin turgаn
kоmpоnеntаdеk ko‘rinishigа erishishingiz mumkin.
Ekrаndаn tаshqаridаgi bit оbrаzlаri
Windows uchun murаkkаb grаfik ilоvаlаrni dаsturlаshning umum
qаbul qilingаn mеtоdikаsi shundаn ibоrаtki, bundа ekrаndаn tаshqаri bit
оbrаzi yarаtilаdi, bu оbrаzgа kоnkrеt tаsvir tushirilаdi yoki to‘ldirilаdi vа,
nihоyat, yarаtilgаn tаsvir to‘lаligichа bit оbrаzidаn ekrаn dаrchаsining
ko‘rsаtilgаn jоyigа nushа ko‘chirib оlinаdi. Shu tufаyli ekrаn dаrchаsidа
bеvоsitа tаkrоrаn rаsm chizish kеltirib chiqаrаdigаn vа ko‘zni
chаrchаtаdigаn mоnitоr ekrаnidаgi lipillаshlаr kаmаyadi.
C++Builder sizning ilоvаngizdа TBitmap sinfi оb’еktlаrini yarаtish
imkоnini bеrаdiki, bu ekrаndаn tаshqаri tаsvirlаr sifаtidа ishlаy оlаdigаn
fаyl vа bоshqа zаhirаlаr tаsvirlаrini hаm sizning ilоvаngizdа tаqdim etish
uchun qilinаdi.
Bit оbrаzlаridаn nushа ko‘chirish
22
C++Builder bir аsоsdаn ikkinchisigа nushа ko‘chirishning to‘rttа
usulini ko‘zdа tutаdi. Erishish zаrur bo‘lgаn nаtijаgа muvоfiq kеlаdigаn
kеrаkli nushа quchirish usulini quyidаgi jаdvаldаn tаnlаb оling.
Tаlаb qilingаn nаtijа
Grаfikаdаn to‘liq nushа ko‘chirish
Mаsshtаblаb nushа ko‘chirish
Mеtоd
Draw
StretchDr
aw
Аsоsning
to‘rtburchаk CopyRec
uchаstkаsidаn nushа ko‘chirish
t
Rаstrli оpеrаtsiyalаr bilаn nushа BrashCo
ko‘chirish
py
Yarаtish vа хizmаt ko‘rsаtish
Murаkkаb grаfik tаsvirlаrni yarаtishdа ulаrni ilоvаngizning ekrаn
dаrchаsidа turgаn shаkl yoki kоmpоnеntа аsоsidа bеvоsitа chizishdаn
qоchish kеrаk. Buning o‘rnigа siz birоn-bir bit оbrаzining оb’еktining
kоnstruktsiyasini yarаtishingiz vа mаnа shuning аsоsigа rаsm chizishingiz,
kеyin esа uni ekrаn аsоsigа nushа оlib ko‘chirishingiz mumkin. Ekrаndаn
tаshqаridаgi bit оbrаzi аsоsigа rаsm chizishdа grаfik kоmpоnеntаlаrning
Paint mеtоdi ko‘prоq qo‘llаnаdi.
Ekrаndаn tаshqаri bit оbrаzidа murаkkаb tаsvirni yarаtishgа
bаg‘ishlаngаn misоl nаmunаsini Pаlitrаlаr kоmpоnеntаsining Samples
qo‘shimchа ilоvаsidа kеltirilgаn (Gauge) indikаtоridа ko‘rishimiz
mumkin. Tgauge kоmpоnеntаsi dаsturiy mоdulining Gauges.cpp vа
Gauges.h dаstlаbki fаyllаrini \...\CBuilder\Examples\Control\Source
kаtаlоgidаn tоpish mumkin
Gauges.cpp fаylining frаgmеnti ekrаndаn tаshqаri TBitmap bit
оbrаzining аsоsidа Paint rаsm chizish kоmpоnеntli mеtоd bаjаrаdigаn
аsоsiy оpеrаtsiyalаrni ko‘rsаtib bеrаdi. Аvvаl PaintBackgroud funktsiyasi
Color dаn оlingаn rаng bilаn indikаtоrning to‘rtburchаk fоn sоhаsini
bo‘yab chiqаdi. Kеyin King хususiyatining bеrilgаn qiymаtigа muvоfiq
kеrаkli shаkl kоnturi ForeColor хususiyatli rаng bilаn аylаntirib chiqilаdi
hаmdа ichigа BackColor хususiyatli rаng quyilаdi (strеlkаli
King=gkNeedle indikаtоri qo‘llаngаn bizning misоlimizdа bu ishni
PaintАsNeedle funktsiyasi bаjаrаdi). So‘nggi instruktsiyalаr CopyMode
аsоsining nushа ko‘chirish rеjimi хususiyatlаrini bеlgilаydi, indikаtоrni
mаtn bilаn tа’minlаydi (PaintAsText mеtоdi bilаn) vа fаqаt shundаn
23
kеyinginа (Draw mеtоdi yordаmidа) ekrаndаn tаshqаri bit оbrаzining аsоsi
ekrаndа аks ettirilаdi.
void _fastcall TGauge::Paint()
{
std::auto_ptr<Graphics::TBitmap> The Image
(new Graphics::TBitmap() ) ;
std::auto_ptr<TBltBitmap> Overlay Image (new TBitBitmap());
TRect PaintTRect;
The Image->Height = Height;
The Image->Width = Width;
PaintBackgroundtThe Image.get()) ;
PaintTRect = ClientRect;
if (FBorderStyle == bsSingle)
InflateRect(&RECT(PaintTRect), -1, -1);
Overlay Image->MakeLike(The Image.get() ) ;
PaintBackground(Overlay Image.get());
switch(FKind) {
case gkText:
PaintAsNothing(Overlay Image.get(), PaintTRect); break;
case gkHorizontalBar:
case gkVerticalBar:
PaintAsBar(Overlay lmage.get(), PaintTRect); break;
case gkPie:
PaintAsPie(Overlay Image.get(), PaintTRect); break;
case gkNeedle:
PaintAsNeedle(Overlay lmage.get(), PaintTRect); break;
}
The Image->Canvas->CopyMode = cmSrcInvert;
The Image->Canvas->Draw(0, 0, Overlay Image.get()) ;
The Image->Canvas->CopyMode = cmSrcCopy;
if (ShowText == true)
PaintAsText(The Image.get(), PaintTRect);
Canvas->CopyMode = cmSrcCopy;
Canvas->Draw(0, 0, The Image.get()) ;
}
Indikаtоr millаri (strеlkаlаri)ning tаymеr signаllаri bo‘yichа
hаrаkаtlаnishini ishgа sоlаdigаn dаstur mаtni System qo‘shimchа ilоvаsigа
kirаdigаn TTimer kоmpоnеntаsi OnTimer vоqеаlаr qаytа ishlаgichining
24
fаqаt ikkitа sаtridаn ibоrаt. Vоqеаni qаytа ishlоvchi funktsiya
Timer1Timer ning birinchi instruktsiyasi Timer1 оb’еktining bir dаqiqаli
vаqt intеrvаli uchun 1000 qiymаtini (yashirin qаbul qilingаn) o‘rnаtаdi.
Ikkinchi instruktsiya esа Gauge1 оb’еktining Progress хususiyati qiymаtini
inkrеmеntаtsiya qilаdi.
Аgаr siz ushbu ilоvаni yig‘ib, ishgа tushirib yubоrsаngiz, indikаtоr
millаri qаndаy tеzlikdа hаrаkаtlаnmаsin, mоnitоr ekrаnidа lipillаsh bаribir
sоdir bo‘lishigа ishоnch hоsil qilаsiz.
Turlar va C++ da o‘zgaruvchilarni tavsiflash
Har bir nom va har bir o‘zgaruvchi ular ustida bajariluvchi amallar
aniqlovchi turlarga ega bo‘ladi. Masalan, int i; tavsiflash i o‘zgaruvchi int
turiga tegishli, ya’ni i butun o‘zgaruvchi deb aniqlaydi. Tavsiflash dasturga nom kirituvchi buyruqdir. Tavsiflash o‘zgaruvchining turini
aniqlaydi. Tur nom va ifodalardan to‘g‘ri foydalanishni aniqlaydi. Butun
tur uchun quyidagi amallar aniqlangan: +, -, * va /.
Asosiy turlar
Bevosita apparat ta’minotiga javob beradigan asosiy turlar
quyidagilar: char; short; int; long; float; double. Birinchi to‘rtta tur butun
kattaliklarni, oxirgi ikkitasi suzuvchi nuqtali, ya’ni kasr sonlarni tasvirlash
uchun ishlatiladi.
Char turidagi o‘zgaruvchi mazkur kompyuterda belgilarni (odatda
bayt) saqlash o‘lchoviga ega, int turidagi o‘zgaruvchi esa mazkur
kompyuterdagi butun arifmetikaga mos o‘lchovga ega (odatda so‘z).
Turlar bilan tasvirlangan butun sonlar diapazoni uning o‘lchoviga bog‘liq
bo‘ladi (uni sizeof buyrug‘i yordamida hisoblash mumkin).
C++ da o‘lchovlar char turidagi kattaliklar o‘lchovi birligida
o‘lchanadi. Asosiy turlar o‘rtasidagi munosabatlarni quyidagicha yozish
mumkin:
1 = sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) =
sizeof(float) <= sizeof(double).
Umuman, asosiy turlar xususida yana boshqa narsalarni faraz qilish
ma’nosiz. Xususan, ko‘rsatkichlarni saqlash uchun butun tur yetarli, degan
xulosa barcha kompyuterlar uchun to‘g‘ri emas. Asosiy turlarga const
so‘zini qo‘shib tavsiflash mumkin. Bu boshlang‘ich turga shu turning
25
o‘zini beradi, faqat bu holatda const turidagi o‘zgaruvchilarning qiymatlari
initsializatsiyadan so‘ng o‘zgarishi mumkin emas.
const float pi = 3.14;
const char plus = '+';
Bittalik qo‘shtirnoqqa olingan belgilar belgi o‘zgarmaslar
hisoblanadi. Shunga e’tibor berish lozimki, bu usulda tavsiflangan
o‘zgarmaslar xotirada joy egallamaydi. Uning qiymati talab qilingan joyda
bevosita ishlatiladi. O‘zgarmaslar initsializatsiya paytida tavsiflanishi
shart. O‘zgaruvchilar uchun initsializatsiya shart emas, ammo albatta
tavsiya qilinadi. Lokal o‘zgaruvchilarni initsializatsiyasiz kiritish asoslari
juda ko‘p.
Bu turlarning ixtiyoriy kombinatsiyasiga quyidagi arifmetik amallar:
+ (plyus, unar va binar);
- (minus, unar va binar);
* (ko‘paytirish);
/ (bo‘lish).
hamda taqqoslash amallari:
== (teng);
!= (teng emas);
< (kichik);
> (katta);
<= (kichik yoki teng);
>= (katta yoki teng)
qo‘llanilishi mumkin.
Agar operandlar qo‘yilgan shartni qanoatlantirsa , u holda taqqoslash
amallari natijada 1 qiymatni beradi, aks holda esa 0 qiymatni beradi.
Butunga bo‘lish amali butun natijani beradi: 7/2 = 3. Butun
kattaliklar ustida % - qoldiqni hisoblash amali bajariladi: 7%2 = 1.
O‘zlashtirishda va arifmetik amallarda C++ ularni guruhlash uchun
asosiy turlar o‘rtasida barcha ma’noli almashtirishlarni bajaradi:
double d = 1;
int i = 1;
d = d + i;
i = d + i;
26
Satriy turlar
C++ da belgilarning biron-bir ketma-ketligi (massivlar) dan iborat
matn qatorlarini xotirada saqlash uchun maxsus AnsiString ma’lumotlar
turi qo‘llaniladi.
«Stroka» - «Satr» turidagi o‘zgaruvchilar barcha boshqa
o‘zgaruvchilar kabi e’lon va initsializatsiya qilinadi.
Kompilyatorga
navbatdagi
belgilar
ketma-ketligi
yangi
o‘zgaruvchining nomi emas, balki satr ekanligini bildirish uchun satrlar
bittalik qo‘shtirnoq ichiga olinadi.
Misol:
AnsiString st = ‘matn qatori’;
Satr turidagi o‘zgaruvchilar ustida boshqa satr o‘zgaruvchilar bilan
qo‘shish amali bajarilishi mumkin. Bu amal ikkita satrni ularning kelish
tartibida birlashtirish deb tushuniladi.
Misol:
AnsiString s1 = ‘matn’;
AnsiString s2 = ‘ qatori’;
AnsiString s = s1 + s2;
Natijada s o‘zgaruvchi s1 va s2 o‘zgaruvchilardan tashkil topgan
‘matn qatori’ degan qiymatni qabul qiladi.
Qo‘shimcha turlar
Borland C++ da butun qiymatli o‘zgaruvchilarning turlarini
qo‘shimcha ajratish imkoni mavjud. Bu holda o‘zgaruvchilarning barcha
tur nomlari quyidagicha yoziladi - int X, bu erda X o‘zgaruvchiining
bitlardagi maydon o‘lchami. X quyidagi qiymatlardan birini qabul qilishi
mumkin: 8, 16, 32 va 64. Bu turdagi o‘zgaruvchilardan foydalanish
standart turda aniqlangan o‘zgaruvchilardan foydalanishdan farq qilmaydi.
Quyidagi jadvalda bunday turlar bilan ishlash yaqqol ko‘rsatilgan.
Tur nomi
O‘zgaruvchini
O‘lcham
tavsiflashga misol
__int8
__int8 c = 128;
8 bit
__int16
__int16 s = 32767;
16 bit
__int32
__int32 i = 123456789;
32 bit
__int64
__int64 big =
64 bit
12345654321;
27
unsigned
__int64
unsigned __int64 huge =
1234567887654321;
64 bit
Turlarni o‘zgartirish protseduralari
Standart turlarni o‘zgartirish
C++ ning ma’lumotlarning turlari ustida qattiq nazorati tufayli
imkoni boricha qiymatlarni saqlovchi, turlarni o‘zgartirish amallari
kiritilgan.
Boshqa o‘zgaruvchidan ma’lum bir tur qiymatlarini olish uchun
quyidagi konstruksiya ishlatiladi: (yangi tur)o‘zgaruvchi.
Misol:
short S = 100;
int I = (int)S;
Bu misol ortiqcha buyruqlarga ega. C++ da ko‘pgina tur
o‘zgaruvchilarining to‘g‘ridan-to‘g‘ri o‘zlashtirilishi nazarda tutilgan,
ammo ba’zi hollarda bu buyruqlar majburiy hisoblanadi (masalan,
o‘zgaruvchining qiymatini biror funksiyaga uzatishda).
Sonli qiymatlarni satrga almashtirish
C++ turlarning to‘g‘ridan-to‘g‘ri almashtirishda o‘zgaruvchini uning
o‘nlik ko‘rinishidan belgilar qatori ko‘rinishiga yo‘l qo‘ymaydi,
chunonchi, ular shakllarning ko‘pgina komponentlarda ishlatiladi.
To‘g‘ridan-to‘g‘ri almashtirish faqatgina asosiy va qo‘shimcha turlar
uchun amalga oshiriladi. Massiv hisoblanadigan satr kattaliklar hosilaviy
tur bo‘lganligi sababli bunday almashtirishga yo‘l qo‘yilmaydi.
Bunday almashtirishlar uchun quyidagi standart almashtirish
funksiyalari ishlatiladi: IntToStr, StrToInt, FloatToStr va boshqalar.
Ko‘pchilik ma’lumotlar turlari uchun shu kabi satrga va teskari o‘tkazish
funksiyalari mavjud.
Misol:
char S[10];
// belgilar massivi
int I = 100;
// butun qiymatli o‘zgaruvchi
S = IntToStr(I); // o‘tkazish
Shartli buyruq
Dasturda tarmoqlanishni amalga oshirish, ya’ni ba’zi faktorlarga
bog‘liq holda turli amallar bajarilishi uchun if buyrug‘i ishlatiladi.
28
Buyruq quyidagi formatga ega:
if (ifoda){ 1 - operator;} [else { 2 - operator;}]
if buyrug‘ining bajarilishi ifodaning qiymatini hisoblashdan
boshlanadi. So‘ngra ish quyidagi sxema asosida amalga oshiriladi:
agar ifoda rost bo‘lsa (ya’ni 0 dan farqli), u holda 1 - operator
bajariladi.
agar ifoda yolg‘on bo‘lsa (ya’ni 0 ga teng), u holda 2 - operator
bajariladi.
agar ifoda yolg‘on va 2 - operator yo‘q bo‘lsa (kvadrat qavsga
zarur bo‘lmagan konstruktsiya kiritiladi), u holda if dan keyingi
buyruq bajariladi.
Misol:
if (i < j)
{
i++;
}
else
{
j = i-3;
i++;
}
Bu misol 1 - operatorning o‘rnida ham, 2 - operatorning o‘rnida ham
murakkab konstruktsiya qatnashishi mumkinligini bildiradi. Ichma-ich if
buyrug‘ini ishlatish imkoniyati ham mavjud. if buyrug‘i boshqa if
buyrug‘ining if yoki else konstruktsiyalari ichida qatnashishi ham
mumkin.
Misollar:
int t = 2;
int b = 7;
int r = 3;
if (t>b)
{
if (b < r)
{
r = b;
}
29
}
else
{
r = t;
return (0);
}
Bu dastur bajarilganda r ning qiymati 2 ga teng bo‘ladi.
1 - Misol.
Dastur tasnifi
Masala quyidagicha qo‘yiladi: Standart o‘lchovli (8x8) shaxmat taxtasiga
bug‘doy donlari quyidagicha qo‘yiladi: birinchi maydonga bitta don,
keyingi har bir maydonga oldingi maydonga qo‘yilgan donning ikki
baravarida don qo‘yiladi, ya’ni birinchi maydonga bitta, ikkinchi
maydonga ikkita, uchinchiga to‘rtta va hakazo. Taxtaning barcha
maydonlaridagi donlarning umumiy sonini toping.
Zarur ko‘nikmalar
Mazkur dasturni yozish uchun quyidagi ko‘nikmalargi ega bo‘lish zarur:
1. Shakllar yaratish uchun kamida standart panelning oddiy
komponentlaridan tashkil topgan dasturlar yaratish muhitidan
foydalanishni bilish.
Taymer
tizimli
komponentdan
foydalanishni bilish.
2. O‘zgaruvchilar turlarini va ularning qiymatlari chegarasini
bilish.
3. Sonli
o‘zgaruvchilarni
satrga
o‘tkazuvchi
standart
protseduralarni bilish.
4. Shartli buyruqni ishlatishni bilish.
Muammolar
1. Mazkur dasturning asosiy muammosi unsigned __int64 turidagi satr
o‘zgaruvchiga o‘tkazuvchi standart funksiyani ishlatishning va shuncha
katta sonning boshqa tur o‘zgaruvchisida saqlash imkoniyatining
yo‘qligidadir. Bu muammoni hal qilish uchun unsigned __int64 tur
o‘zgaruvchini ikkita __int64 turiga va so‘ngra mos ravishda satrga
o‘tkazuvchi standart funksiyalarni (ya’ni shu nom bilan, ammo boshqa tur
uzatuvchi parametrlar bilan) yuklovchi funksiya tashkil qilingan. Dastur
kodida bu funksiya alohida izoh bilan ajratib ko‘rsatilgan.
30
2. Mazkur dasturning ikkinchi muammosi quyidagilardan iborat: agar
shaklga faqat natijaviy qiymatlarni chiqarsak, u holda dasturning
ko‘rsatmali ishlashi yo‘qoladi. Bu esa bizni sikllardan foydalanishdan
mahrum qiladi.
Bu muammoni sikllarni global o‘zgaruvchilardan foydalanib ishlatishni
simulyatsiya qilish yo‘li bilan hal qilinadi. Shunday qilib, siklning tanasi
alohida protsedura sifatida tashkil qilinadi va biror-bir xodisada u
protsedura ishlatiladi, masalan, foydalanuvchi tomonidan tugmachalar
bosilganda yoki taymerning holatlarida.
Masalaning yechimi
Shakl
Bu dasturni amalga oshirish uchun quyidagi komponentlar ishlatiladi:
«Metka» (Label), «Knopka» (Button) va «Taymer» (Timer). Birinchi
ikkita komponent Standard bandida, taymer esa
System bandida
joylashgan.
Natijalarni tasvirlash uchun Label sinfi komponentlarining “Caption”
xossasi qiymatlarini o‘zgartirish zarur.
Tugmachalar uchun onClick xodisasining va taymer uchun onTimer
xodisasining harakatlarini hosil qiladi (dastur kodi yoziladi).
Blok cxema
31
Boshlash
O’zgaruvchilarni
initsializatsiya qilish
S = 1, I = 1, K=1
Qiymatlarni
ekranga
chiqarish
Qiymatlarni
o’zgartirish
I = I * 2, S = S + K,
K=K+1
ha
I <= 64
Ishni tugallashga tekshirish
Yo’q
Tamom
Dastur kodi
/* __int64 tur bilan ishlatish uchun IntToStr funksiyasini oddiy yuklash
*/
AnsiString __fastcall IntToStr(unsigned __int64 Value)
{
__int64 k = floor(Value/100000);
__int64 l = Value - k*100000;
if(k!=0)
{return IntToStr(k)+IntToStr(l);}
else
{return IntToStr(l);}
}
32
//---------------------------------------------------------------------------/* Global o‘zgaruvchilar*/
unsigned __int64 s = 1, i = 1;
short j = 1;
char T = 0;
//---------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(j<8*8) //Maydonning navbatdagi qiymatini hisoblash
{
j++;
i *= 2;
s += i;
}
Label4->Caption = IntToStr(j); // Ularni shaklga chiqarish
Label5->Caption = IntToStr(i);
Label6->Caption = IntToStr(s);
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button2Click(TObject *Sender)
{
T = !T; // Taymerdan foydaldnishni o‘zgartirish
if(!T) //Sarlavha
{Button2->Caption = "Pusk";}
else
{Button2->Caption = "Pauza";}
}
//--------------------------------------------------------------------------void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
33
if(T){TForm1:Button1Click(Form1);} // Taymerning tiki
}
Nazorat savollari
1)Identifikator nima? Ularrni yozish qoydasini tusuntiring.
2)Dasturda o’zgarmaslar qanday tavsiflanadi?
3)Qo’shimcha turlar qanday turlar?
4)Int va Unsigned turlari qanday farq qiladi?
5)Sonli qiymatlar qanday qilib satrga almashtiriladi?
6)Standart turlarga qanday turlar kiradi?
34
2. Boshqaruvchi strukturalar
Siklik strukturaga kirish
Ko‘pgina takrorlanuvchi elementlarga mos algoritmga dastur kodini
yozish uchun quyidagi buyruqlar yordamida hosil qilinadigan siklik
strukturalarni ishlatishga to‘g‘ri keladi.
for buyrug‘i
for buyrug‘i - sikllarni tashkil qilishning eng umumiy (ommaviy) usulidir.
U quyidagi ko‘rinishga ega:
for ( 1-ifoda; 2-ifoda; 3-ifoda ) {tana}.
1-ifoda odatda siklni boshqaruvchi o‘zgaruvchining boshlang‘ich
qiymatini o‘rnatish uchun ishlatiladi. 2-ifoda sikl tanasi bajarilishi kerak
bo‘lgan shartni ifodalaydi. 3-ifoda sikl tanasining bajarilganidan keyin
o‘zgaruvchining o‘zgarishini boshqaradi.
for buyrug‘ining bajarilish sxemasi quyidagicha:
1. 1-ifoda hisoblanadi.
2. 2-ifoda hisoblanadi.
3. Agar 2-ifoda noldan farqi (rost) bo‘lsa, u holda sikl tanasi
bajariladi. So‘ngra 2-ifoda bajariladi va boshqarish 2-punktga
uzatiladi. Agar 2-ifodaning qiymati nol (yolg‘on) bo‘lsa, u
holda boshqarish for buyrug‘idan keyingi buyruqqa uzatiladi.
Shu narsa ahamiyatliki, shartni tekshirish har safar sikl boshida bajariladi.
Bu narsa esa bajarish sharti boshidayoq nolga teng bo‘lganda sikl
tanasining biror marta ham bajarilmasligini bildiradi.
Misol:
int i, b;
for (i=1; i<10; i++)
{
b=i*i;
}
Bu misolda 1 dan 9 gacha bo‘lgan sonlarning kvadratlari hisoblanadi.
Ba’zi hollarda siklni boshqarish uchun bir nechta o‘garuvchilarni
ishlatishning imkoniyati mavjudligi for buyrug‘ining moslashuvchanligini
oshiradi.
Misol:
35
int top, bot;
char string[100], temp;
for ( top=0, bot=100 ; top < bot ; top++, bot--)
{
temp=string[top];
string[bot]=temp;
}
Belgilar satrini teskari tartibda yozuvchi bu misolda siklni boshqarish
uchun ikkita top va bot o‘zgaruvchilari ishlatiladi. Shuni ta’kidlash
lozimki, bu erda 1- va 2- ifodalar o‘rnida ketma-ket bajariluvchi va vergul
bilan adratilib yozilgan bir nechta ifodalar ishlatilgan.
For buyrug‘ini ishlatishning boshqa varianti cheksiz sikl tashkil qilishdir.
Bunday siklni tashkil etish uchun bo‘sh shartli ifodalarni ishlatish mumkin.
Sikldan chiqish uchun esa odatda qo‘shimcha shartlar yoki break buyrug‘i
ishlatiladi (bu buyruq keyinroq ko‘riladi).
Misol:
for (;;)
{
...
... break;
...
}
C tilining sintaksisiga binoan buyruq ham, for buyrug‘ining tanasi ham
bo‘sh bo‘lishi mumkin. Buyruqning shakli izlashlarni tashkil etishda
qo‘llanilishi mumkin.
Misol:
for (i=0; t[i]<10 ; i++);
Bu misolda sikl o‘zgaruvchisi bo‘lgan i o‘zgaruvchi qiymati 10 dan kichik
bo‘lmagan t massiv birinchi elementi nomerining qiymatini qabul qiladi.
While buyrug‘i
while sikl buyrug‘i sharti oldindan berilgan sikl buyrug‘i deyiladi va
quyidagi ko‘rinishga ega:
while (ifoda) {tana};
Ifoda sifatida C tilining ixtiyoriy ifodasini ishlatish mumkin. Tana sifatida
ixtiyoriy buyruqni, jumladan bo‘sh va tarkibli (murakkab) buyruqlarni
ham, ishlatish mumkin. while buyrug‘ining ishlash sxemasi quyidagicha:
1. Ifoda hisoblanadi.
36
2. Agar ifoda yolg‘on bo‘lsa while buyrug‘ining bajarilishi
tugallanadi va boshqarish navbatdagi buyruqqa uzatiladi, aks
holda while buyrug‘ining tanasi bajariladi.
3. Jarayon 1-punktdan davom ettiriladi.
Quyidagi ko‘rinishdagi sikl buyrug‘i
for ( 1-ifoda; 2-ifoda; 3-ifoda ) {tana};
while buyrug‘i bilan quyidagicha almashtiriladi:
1-ifoda;
while (2-ifoda)
{
tana
3-ifoda;
}
for buyrug‘ining bajarilishidagi kabi while buyrug‘ida ham avvalo
shartning bajarilishi tekshiriladi. Shuning uchun ham buyruq tanasini
bajarish shart bo‘lmagan hollarda while buyrug‘idan foydalanish qulay.
for va while buyruqlarining ichida ma’lum mos turlar bilan e’lon qilingan
lokal o‘zgaruvchilarni ishlatish mumkin.
do while buyrug‘i
do while sikl buyrug‘i sharti oxirida berilan sikl buyrug‘i deyiladi va sikl
tanasini kamida bir marta bajarish zarur bo‘lgan hollarda ishlatiladi. Bu
buyruq quyidagi ko‘rinishga ega:
do {telo} while (ifoda);
do while buyrug‘ining bajarilish sxemasi:
1. Sikl tanasi bajariladi (tarkibli buyruq bo‘lishi ham mumkin).
2. Ifoda hisoblanadi.
3. Agar ifoda yolg‘on bo‘lsa, u holda do while buyrug‘ining
bajarilishi tugallaniladi va navbatdagi buyruq bajariladi. Agar
ifoda rost bo‘lsa, u holda bajarish 1-punktdan davom ettiriladi.
while va do while buyruqlari ichma-ich joylashgan bo‘lishi ham mumkin.
Misol:
int i,j,k;
...
37
i=0; j=0; k=0;
do
{
i++;
j--;
while (a[k] < i)
{
k++;
}
}
while (i<30 && j<-30);
break buyrug‘i
break buyrug‘i birlashgan switch, do, for, while sikllardan eng ichkisining
bajarilishi tugallanilishini ta’minlaydi. break buyrug‘i bajarilgandan so‘ng
boshqarish bajarilishi tugallangan sikldan keyingi buyruqqa uzatiladi.
Shu yo‘l bilan muddatidan avval sikldan chiqish ta’minlanadi.
Continue buyrug‘i
continue buyrug‘i ham break buyrug‘i kabi faqatgina sikl buyruqlarinig
ichida ishlatiladi. Ammo undan farqli ravishda bajarilishi tugatilgan
sikldan keyingi buyruqdan emas, balki bajarilishi tugallangan sikldan
boshlanadi.
Misol:
int a,b;
for (a=1,b=0; a<100; b+=a, a++)
{
if (b%2 != 0) continue;
...
/* juft yig‘indilarni qayta ishlash */
}
Bu misolda ko‘p nuqta bilan belgilangan amallar b ning toq
qiymatlaridagina bajariladi. Chunki 1 dan a gacha sonlar yig‘indisi toq
bo‘lganda continue buyrug‘i qayta ishlash buyruqlarini bajarmasdan,
boshqarishni for siklining tanasini navbatdagi qiymat uchun bajarishga
uzatadi.
Continue buyrug‘i ham break buyrug‘i kabi ichma-ich sikllarning eng
ichkisining ishini to‘xtatadi.
38
2 - Misol.
Dasturning tasnifi
Bu masala progressiyani tasvirlovchi tenglama bilan tavsiflanadi.
Bu masalani tasvirlovchi tenglama quyidagicha yoziladi:
n n juft bo' lganda
yn n 2
, n 0, 100 .
i
n
toq
bo'
lganda
i0
Muammolar
Xuddi oldingidagi kabi bu dasturda ham hisoblashlar ko‘rsatmali bo‘lishi
uchun eng ichki sikl global o‘zgaruvchilardan foydalanish bilan
almashtirilgan. Uning tanasi esa tugmachalarni bosish yoki taymer
yordamida chaqiriladigan alohida protseduraga ko‘chirilgan.
Zarur ko‘nikmalar
Bu dasturni yozishda avvalgi dasturni yozihda orttirilgan bilimlardan
tashqari murakkab ifodalarni hisoblash uchun sikllarni ishlatishni ham
talab qilinadi.
Yechish
Shakl
Bu masalani yechish uchun zarur bo‘lgan shakl oldingi masalaning
shakliga o‘xshash bo‘ladi va unda ba’zi elementlarning sarlavhalari
(Caption xossasi) qatnashmaydi xolos.
39
Blok cxema
Boshlash
O’zgaruvchilarni
initsializatsiya
qilish n = 0
Yo’q
n - juft
y=n
ha
y=0
i=0
i = i+1
Qiymatlarni
ekranga
chiqarish
y =y + i*i
Yo’q
ha
i < n+1
ha
n <= 100
n=n+1
Yo’q
Tamom
Natural sonlar kvadratlarining yig‘indisini hisoblash uchun for sikli
ishlatildi.
Dastur kodi
/* Global o‘zgaruvchilar*/
int n = 0, y = 0;
char T = 0;
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(n%2 == 0) // juftlikka tekshirish
40
{ //ha - juft
y = 0;
for(int i=0;i<n+1;i++)
{
y += i*i;
}
Label5->Caption = "ha";
}
else
{ //yo‘= - toq
y = n;
Label5->Caption = "yo‘q";
}
Label4->Caption = IntToStr(n); // Shaklga chiqarish
Label6->Caption = IntToStr(y);
if(n<100){n++;} // nomerni oshirish
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button2Click(TObject *Sender)
{
T = !T;
if(!T) // Taymerning Pusk/Pauza tugmasi
{Button2->Caption = "Pusk";}
else
{Button2->Caption = "Pauza";}
}
//--------------------------------------------------------------------------void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if(T){TForm1:Button1Click(Form1);} //Taymerning tiki
}
Nazorat savollari
1)Qanday operatorlar boshqarish strukturalariga kiradi?
2)Qanday Sikl operatorlarini bilasiz?
3)Break operatori qanday vazifa bajaradi?
4)Continue qanday vazifa bajaradi?
41
42
3. Massivlar bilan ishlash
Massiv tushunchasi
Massiv bir xil turdagi bir nechta o‘zgaruvchilarning to‘plamidan tashkil
topadi (ba’zi adabiyotlarda ular jadvallar deb ham nomlanadi). Nomi a
bo‘lgan LENGTH elementdan iborat TYPE turidagi massiv quyidagicha
e’lon qilinadi:
type a[length];
Bu buyruqda type turiga tegishli maxsus a[0], a[1], ..., a[length-1] nomli
o‘zgaruvchilar e’lon qilinadi. Massivning har bir elementi o‘z nomeri indeksga ega bo‘ladi. Massivning x - elementiga murojaat qilish
indeksatsiya amali yordamida amalga oshiriladi:
int x = ... ;
TYPE value = a[x];
a[x] = value;
// Butun qiymatli indeks
// x - elementni o‘qish
// x- elementga yozish
Indeks sifatida butun turdagi qiymat beruvchi ixtiyoriy ifodani ishlatish
mumkin: char, short, int, long. C tilida massiv elementlarining indeksi 0
dan (1 dan emas) boshlanadi, LENGTH uzunlikdagi massivning oxirgi
elementining indeksi esa LENGTH-1 (LENGTH emas). Shuning uchun
ham massivning barcha elementlari bo‘yicha sikl quyidagicha yoziladi:
TYPE a[LENGTH]; int indx;
for(indx=0; indx < LENGTH; indx++)
...a[indx]...;
Bu erda indx < LENGTH sharti indx <= LENGTH-1 ga teng kuchli.
Massiv chegarasidan chiqish (mavjud bo‘lmagan elementni o‘qish/yozish)
kutilmagan natijalarga va dastur ishida ham kutilmagan holatlarga olib
kelishi mumkin. Bunday xatolar massivlar bilan ishlashdagi eng ko‘p yo‘l
qo‘yiladigan xatolar hisoblanadi.
Statik massivlarni uning elementlari qiymatlarini {} ichida vergul bilan
ajratib yozish, ya’ni initsializatsiya qilish yo‘li bilan ham e’lon qilish
mumkin. Agar massiv uzunligidan kam elementlar berilgan bo‘lsa, u holda
qolgan elementlari nol deb hisoblanadi:
43
int a10[10] = { 1, 2, 3, 4 };
// va 6 ta nol
Agar massivlarni initsializatsiya qilishda uning o‘lchovi berilmasa u
kompilyator tomonidan hisoblanadi:
int a3[] = { 1, 2, 3 };
// Xuddi a3[3] kabi.
3 - Misol: «Paskal uchburchagi»
Dastur tasnifi
Paskal uchburchagi quyidagi jadval ko‘rinishida bo‘ladi: birinchi qator
birinchi pozitsiyalarda ikkita birdan tashkil topadi, har bir navbatdagisi esa
birinchi pozitsiyada bir, boshqalarida esa oldingi qatordagi mazkur va
oldingi pozitsiyalardagi elementlar yig‘indisi yordamida hisoblanadi.
Oxirgi elementi ham bir bilan almashtiriladi. Shunday qilib quyidagi
uchburchak hosil qilinadi
1
1
1
1
1
1
2
3
4
5
1
3
6
10
1
4
10
1
5
1
Paskal uchburchagi Nyuton binomi koeffitsientlarini oson hisoblashga
yordam beradi. Chunki Paskal uchburchagi qatori Nyuton binomi
yoyilmasining qator nomeriga mos koeffitsientlaridan tashkil topadi.
Vazifa: Yigirma beshinchi qatorgacha Paskal uchburchagi tuzilsin.
Muammolar
Mazkur dasturning bosh muammosi ekranga 25 ta qatorni chiqarish
zaruratidan iborat. Ularning ba’zilarining uzunliklari juda katta bo‘ladi. Bu
muammoni hal qilish uchun standart panelning Memo komponenti
ishlatilgan. U ko‘p qatorli matn maydon bo‘lib, qo‘yilgan masala uchun
eng muvofig‘i hisoblanadi.
Memo (Memo1->Lines->Add(AnsiString)) ob’yektiga tegishli Lines qism
ob’yektining Add protsedurasi matn oxiriga ko‘rsatilgan qatorni qo‘shadi.
44
Zarur ko‘nikmalar
Bu dasturni yozish uchun massivlar bilan bir turidagi ma’lumotlar majmui
kabi ishlashni bilish zarur. Undan tashqari qatorlar bilan ishlash va alohida
tashkil etuvchilardan qatorlar hosil qilishni ham bilishi kerak.
Yechish
Shakl
Mazkur masalaning shakli o‘lchamlari oxirgi qator to‘liq sig‘adigan qilib
tanlangan matn maydonli bitta Memo ob’yektidan va ikkita tugmachadan
iborat. Bu tugmachalar oldingi misoldagi o‘xshash tugmachalarning
vazifalarini bajaradi: «Stroka» tugmachasi dastur algoritmining bitta
qadamini bajaradi, «Pusk/Pauza» tugmachasi esa taymer yordamida
algoritmni bajarish uchun ishga tushiradi.
Blok sxema
Mazkur blok sxema algoritmning bitta qadamini amalga oshiruvchi
protsedurani ifodalaydi. To‘liq natijaga erishish uchun bu protsedura 24
marta bajarilishi kerak. Buning uchun «Stroka» tugmachasi ko‘p marotaba
bosiladi yoki «Pusk/Pauza» tugmachasi yordamida ishga tushiriluvchi
taymer algoritmining bajarilishi bilan amalga oshiriladi. Bu protsedura
bajarilganda A massiv masalaning birinchi qatorini hosil qiladi, ya’ni
massaivning birinchi va ikkinchi elementlari bir, boshqalari nollar. Undan
tashqari dastur o‘lchami A bilan ustma-ust tushadigan yordamchi A1
massivni hosil qiladi.
45
Boshlash
Yo’q
A[26] ≠ 0
Tamom
ha
S qiymatini
Memo1 ga
chiqarish
i=1
A[i] ≠ 0
Yo’q
i=i+1
A1[0] = 1
A1[i] =1
ha
A1[i] = A[i] + A[i-1]
j = 0, S = “”
i=i+1
j <= i
Yo’q
ha
A[j] =A1[j]
j=j+1
S ga A[j] ni matn
ko’rinishida
qo’shish
Dastur kodi
int A[26]; // massiv
//--------------------------------------------------------------------------void __fastcall TForm1::FormCreate(TObject *Sender)
{
for(int i = 0; i<26; i++)
{
A[i] = 0;
}
A[0] = 1;
A[1] = 1; // massivni initsalizatsiya qilish
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(A[25] == 0)
46
{
int A1[26];
AnsiString s = "";
int i = 1;
A1[0] = 1;
while(A[i] != 0)
{
A1[i] = A[i] + A[i-1];
i++;
}
A1[i] = 1;
for(int j = 0; j <= i; j++)
{
A[j] = A1[j];
s = s + IntToStr(A[j]) + ' ';
}
Memo1->Lines->Add(s);
}
}
//asosiy protsedura
//--------------------------------------------------------------------------void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(Button2->Caption == "Pusk")
{
Button2->Caption = "Pauza";
}
else
{
Button2->Caption = "Pusk";
} // taymerni aktivlashtirish
}
//--------------------------------------------------------------------------void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if(Button2->Caption == "Pauza")
//aktivlikka tekshirish
{
Button1->Click();
// asosiy protsedurani chaqirish
47
}
}
4. Ko‘p o‘lchovli massivlar
Ko‘p o‘lchovli massivlar
C++ da massiv deganda ko‘rsatkichni tushunish mumkin.
Ko‘rsatkich esa ixtiyoriy turda bo‘lishi mumkin, ya’ni massiv ixtiyoriy
turdagi elementlardan tashkil topishi mumkin, jumladan, massivdan iborat
ko‘rsatkich bo‘lishi ham mumkin. Boshqa massivlardan tashkil topgan
massivlar ko‘p o‘lchovli deyiladi. Bunday massivlarni e’lon qilganda
kompyuter xotirasida bir nechta har xil ob’yektlar hosil qilinadi. Masalan,
Ikki o‘lchovli int arr[4][3] massivini e’lon qilish bajarilganda xotirada arr
o‘zgaruvchining qiymatlarini saqlash uchun joy ajratiladi, ularning har biri
esa to‘rtta ko‘rsatkichdan iborat massivning ko‘rsatkichi bo‘ladi. To‘rtta
ko‘rsatkichdan iborat bu massiv uchun ham xotira ajratiladi. To‘rtta
ko‘rsatkichning har biri int turidagi uchta elementdan iborat massivning
manzilidan (adres) tashkil topadi. Demak, kompyuter xotirasida int
turidagi to‘rtta massivni saqlash uchun to‘rtta bo‘lak ajratiladi. Ularning
har biri esa uchta elementdan tashkil topadi. Bunday xotira ajratish
quyidagi sxemada ko‘rsatilgan:
Arr
48
↓
arr[0]
arr[1]
arr[2]
arr[3]
arr[0][0] arr[0][1] arr[0][2]
arr[1][0] arr[1][1] arr[1][2]
arr[2][0] arr[2][1] arr[2][2]
arr[3][0] arr[3][1] arr[3][2]
Shunday qilib, arr[4][3] e’lon qilish dasturda uchta har xil ob’yektni
hosil qiladi: arr identifikatorli ko‘rsatkich, to‘rtta ko‘rsatkichdan iborat
nomsiz massiv va int turidagi 12 ta sondan iborat nomsiz massiv. Nomsiz
massivlarga murojaat qilish uchun arr ko‘rsatkichli manzil ifodalari
ishlatiladi. Ko‘rsatkichlar massivining elementlariga murojaat qilish arr[2]
yoki *(arr+2) shaklida bitta indeks ifodasini ko‘rsatish bilan amalga
oshiriladi. Int turidagi ikki o‘lchovli sonlar massiviga murojaat qilish
uchun arr[1][2] yoki unga ekvivalent *(*(arr+1)+2) va (*(arr+1))[2]
ko‘rinishidagi ikkita indeksli ifoda ishlatilishi zarur. Shuni nazarda tutish
kerakki, C tilining sintaksisi nuqtai nazaridan arr ko‘rsatkich va arr[0],
arr[1], arr[2], arr[3] ko‘rsatkichlar o‘zgarmas (konstanta) hisoblanadi va
ularni dasturning bajarilish paytida o‘zgartirish mumkin emas.
Uch o‘lchovli massivlarni joylashtirish ham shu kabi amalga
oshiriladi. float arr3[3][4][5] e’lon qilishi float turidagi oltmishta sondan
iborat uch o‘lchovli massivning o‘zidan tashqari float turidagi to‘rtta
ko‘rsatkichdan iborat massivni, float ga ko‘rsatuvchi ko‘rsatkichlar
massivini ko‘rsatuvchi uchta ko‘rsatkichlar massividan va float ga
ko‘rsatkichlar massivining massiviga ko‘rsatkich.
Ko‘p o‘lchovli massiv elementlarini o‘rnatganda ular xotirada qator
bo‘yicha ketma-ket joylashadi, ya’ni oxirgi indeksi barchasidan tezroq
o‘zgaradi, birinchisi esa sekin o‘zgaradi. Bunday tartib ko‘p o‘lchovli
massivning ixtiyoriy elementiga uning birinchi elementi manzilidan va
faqat bitta indeksli ifodadan foydalanib murojaat qilish imkonini beradi.
Masalan, arr[1][2] elementga int *ptr2=arr[0] shaklidagi ptr2
ko‘rsatkich yordamida ptr2[1*4+2] (bu erda 1 va 2 ishlatilayotgan element
indekslari, 4 esa qatordagi elementlar soni) murojaat kabi yoki ptr2[6] kabi
amalga oshirish mumkin. E’tibor berish lozimki, tashqaridan qaraganda
arr[6] ko‘rinishdagi murojaatni bajarish mumkin emasdek tuyuladi, chunki
6 indeksli
ko‘rsatkich mavjud emas. Uch o‘lchovli massivning
arr3[2][3][4] elementiga murojaat qilish uchun, ptr3[3*2+4*3+4] yoki
ptr3[22] ko‘rinishidagi bitta indeksli ifoda yordamida float
*ptr3=arr3[0][0] ko‘rinishida e’lon qilingan ko‘rsatkichdan foydalanish
mumkin.
49
4-misol: «Sirt»
Dastur tasnifi
Bu dastur uchun masala quyidagicha: Ekranda to‘g‘ri to‘rtburchaklar bilan
yaqinlashtirilgan tasodifiy sirt aks ettirilsin. Buning uchun nuqtada Z
koordinataning tasodifiy qiymatlarini saqlovchi va boshqa koordinatalari
massivning indekslari bilan aniqlanadigan ikki o‘lchovli massiv hosil
qilinsin.
Muammolar
Mazkur dasturni yozishda quyidagi muammolar sodir bo‘ladi:
1. Tasodifiy shakldagi to‘rtburchaklarni ekranga chiqarish uchun
piksellarni shaklga bevosita chiqarishdan foydalanish zarur. Bu
muammoni hal qilishning variantlaridan biri ko‘pburchaklarni chiqarish
uchun funksiyalar to‘plamiga ega bo‘lgan Canvas forma xossasiga
murojaat qilishdir. Tasodifiy ko‘pyoqlilarni ekranda aks ettirish uchun
Canvas forma ob’yektining Polygon protsedurasidan (Form1->Canvas>Polygon(….)) foydalanish mumkin. Bu protseduraga ko‘pyoqlilarning
burchaklari va int turidagi ikkita X va Y o‘zgaruvchilardan iborat TPoint
turidagi ob’yektlar massivi uzatiladi.
Shunday qilib bu protseduradan foydalanish uchun avvalo bunday
ob’yektlar massivi ifodalanadi va har bir nuqta uchun X va Y qiymatlar
beriladi. Ma’lum nuqta uchun koordinatalar <nuqta nomi>.<koordinata
nomi> konstruksiyasi yordamida beriladi.
Misol:
TPoint T;
T.x = 100;
T.y = 117;
2. Tasvirning uch o‘lchovliligini simulyatsiya qilish uchun sirt
joylashgan fazo koordinatalarini ekranning yassi koordinatalariga
almashtirishni bajarishimiz zarur. Bu muammoni yechish
uchun
koordinatalarni almashtiruvchi sodda matematik formulalardan
foydalanamiz.
X, Y, Z lar sirt joylashgan fazoning koordinatalari, U va V monitorning
koordinatalari bo‘lsin. U holda koordinatalarni almashtirish formulalari
quyidagicha bo‘ladi:
50
U X Y
V Y
2
2
Z
.
ConstH
Bu erda ConstH – gorizontal va vertikal o‘lchovlarni bog‘lovchi biror
o‘zgarmas.
3. Katta yaqqollik uchun sirtni approksimatsiyalovchi elementlarni
parallelepipedlar ko‘rinishida tasavvur qilish kerak, buning uchun ularni
turli ranglardagi uchta ko‘pburchak
yordamida tasvirlash zarur.
Keltirilgan
formulalar
yordamida
hisoblangan
koordinatalar
parallelepipedning burchaklaridan birini aniqlasin. Boshqa burchaklarining
koordinatalari osongina, bosh (asosiy) burchak koordinatalariga bir nechta
piksellarni qo‘shish natijasida oson hisoblanadi.
1
3
2
Zarur ko‘nikmalar
Bu dasturni yozish uchun bir o‘lchovli massivlar ustida ishlashni
yaxshi o‘zlashtirgan va ko‘p o‘lchovlilar bilan ishlash tamoyillarini bilishi
kerak. Undan tashqari ixtiyoriy ko‘pburchaklarni shaklga chiqarish
usullarini bilishi kerak.
Yechish
Shakl
Bu dasturda shakl bevosita grafik chiqarish uchun maydon sifatida
ishlatiladi. Shuning uchun ham u faqat boshqarish tugmachalaridan tashkil
topadi. U tugmachalar yordamida sirtlarni aks ettirish, yangi tasodifiy
koordinatalarni tanlash funksiyalari va avvalgi misollardagi tamoyil
bo‘yicha ishlaydigan «Pusk/Pauza» tugmachalari ishlatilgan.
51
Ko‘ptamonlilarni shaklga
to‘g‘ridan to‘g‘ri o‘tkazish
Blok sxema
Mazkur blok sxema sirtni approksimatsiya qiluvchi parallelepipedlar
majmuini bevosita ekranga chiqarishni aniqlaydi. Bu protseduradagi
uchinchi koordinata qiymatlarini aniqlovchi, ikki o‘lchovli Pole[20][20]
massiv berilgan deyiladi.
52
Boshlash
y = 19
y >= 0
Yo’q
Tamom
ha
x=0
x < 20
Yo’q
y=y-1
ha
X, Y, Z larga
bog‘liq U va V
(ekran
koordinatalari),
hisoblanadi, bu
yerda Z =
Pole[x][y]
Parallelepipedni ekranga
chiqarish
x=x+1
Dastur kodi
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//--------------------------------------------------------------------------#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//--------------------------------------------------------------------------int Pole[20][20];
// Maydon
//--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
53
{
}
//--------------------------------------------------------------------------void DrawPole()
{
TPoint P[4];
for(int y = 0; y < 20; y++)
for(int x = 19; x >= 0; x--)
{
P[0].x = x * 20 + y * 10 + 22;
P[0].y = y * 10 - Pole[x][y] + 202;
P[1].x = P[0].x + 16;
P[1].y = P[0].y;
P[2].x = P[0].x + 26;
P[2].y = P[0].y + 6;
P[3].x = P[0].x + 10;
P[3].y = P[0].y + 6;
TPoint P2[4] = {P[0],P[1],P[2],P[3]};
TPoint P1[4] = {P[0],P[1],P[2],P[3]};
P2[1].y = y * 10 + 256;
P2[1].x = P[2].x;
P2[0].y = y * 10 + 256;
P2[0].x = P[3].x;
P1[1].x = P[0].x;
P1[1].y = y * 10 + 250;
P1[2].x = P[3].x;
P1[2].y = y*10 + 256;
Form1->Canvas->Brush->Color = clBlue;
Form1->Canvas->Polygon(P2,3);
Form1->Canvas->Brush->Color = clRed;
Form1->Canvas->Polygon(P1,3);
Form1->Canvas->Brush->Color = clGreen;
54
Form1->Canvas->Polygon(P,3);
}
}
//--------------------------------------------------------------------------void RandomPole()
{
for(int y = 0; y < 20; y++)
for(int x = 0; x < 20; x++)
{
Pole[x][y] = random(50)+10;
}
}
//--------------------------------------------------------------------------void __fastcall TForm1::FormCreate(TObject *Sender)
{
for(int i = 0; i < 20; i++)
for(int j = 0; j < 20; j++)
{
Pole[i][j] = 0;
}
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form1->Refresh();
DrawPole();
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button2Click(TObject *Sender)
{
RandomPole();
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button3Click(TObject *Sender)
55
{
if(Button3->Caption == "Pauza")
{Button3->Caption = "Pusk";}
else
{Button3->Caption = "Pauza";}
}
//--------------------------------------------------------------------------void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if(Button3->Caption == "Pauza")
{
RandomPole();
Form1->Refresh();
DrawPole();
}
}
56
5. Strukturalar bilan ishlash
O‘zgaruvchilarning qo‘shimcha turlari, struct
Struktura - ixtiyoriy tur elementlaridan tashkil topgan murakkab
ob’yekt. Turdosh ob’yekt bo‘lgan massivdan farqli o‘laroq, struktura
turdosh bo‘lmasligi mumkin. Strukturaning turi quyidagicha aniqlanadi:
struct { tavsiflanadiganlar ro‘yxati }
Strukturada kamida bitta komponent ko‘rsatilgan bo‘lishi shart.
Struktura quyidagicha tavsiflanadi:
ma’lumotlar_turi tavsiflovchi;
bu yerda ma’lumotlar_turi tavsiflovchida aniqlanadigan ob’yektlar
strukturasining turini bildiradi.
Sodda hollarda tavsiflovchilar identifikatorlar yoki massivlarni
tasvirlaydi.
Misol:
struct
{
double x,y;
} s1, s2, sm[9];
struct
{
int year;
char moth, day;
} date1, date2;
s1, s2 o‘zgaruvchilar har biri ikkita x va u komponentlardan tashkil
topgan strukturalar kabi aniqlanadi. sm o‘zgaruvchi to‘qqizta strukturadan
iborat massiv sifatida aniqlangan. date1, date2 o‘zgaruvchilarning har biri
uchta year, moth, day komponentlardan tashkil topgan.
Nomlarni struktura turlari bilan bog‘lovchi, struktura turlarining
nomlaridan foydalanishga asoslangan boshqa usullar ham mavjud.
Struktura nomining turi (teg) standart tur nomi bilan o‘xshash.
Strukturaning tegi quyidagicha aniqlanadi:
struct teg { tavsiflar ro‘yxati; };
Bu yerda teg identifikator hisoblanadi.
57
Quyidagi misolda yuqoridagi misoldagi ma’lumotlar struktura
teglaridan foydalanib tasvirlangan.
Misol:
struct
st
{
double x,y;
};
st
s1, s2, sm[9];
struct Date
{
int year;
char moth, day;
}
Date
date1, date2;
Quyida student identifikatori struktura tegi kabi tavsiflangan:
struct student
{
AnsiString name;
AnsiString group;
int phone;
};
// O‘quvchining FISh
// Guruh
// Uy telefoni
Struktura tegi keyinchalik mazkur turdagi kattaliklarni e’lon qilishda
quyidagi ko‘rinishda ishlatiladi:
teg identifikatorlar_ro‘yxati;
Misol:
student st1,st2;
Ctruktura teglaridan foydalanish rekursiv strukturalarni e’lon qilish uchun
zarur. Quyida rekursiv strukturalar teglaridan foydalanishga misol
ko‘rilgan.
struct node
{
58
int data;
struct node * next;
} st1_node;
node struktura tegi haqiqatdan ham rekursiv hisoblanadi, u next
ko‘rsatkichining formalizatsiyasida o‘zini e’lon qilishda ishlatiladi.
Struktura to‘g‘ridan-to‘g‘ri rekursiv bo‘lishi mumkin emas, ya’ni node
strukturasi node ning strukturasi bo‘lgan komponentga ega bo‘lishi
mumkin emas. Ammo ixtiyoriy struktura, yuqoridagi misolda
ko‘rilganidek, o‘z turiga ko‘rsatkich bo‘lgan komponentga ega bo‘lishi
mumkin.
Struktura komponentlariga murojaat struktura nomiga ko‘rsatkich va
nuqtadan keyin ajratilgan komponentning nomi yordamida amalga
oshiriladi, masalan :
st1.name="Ivanov";
st1_node.data=st1.phone;
5 - misol: «Guruh ro‘yxati»
Dastur tasnifi
Strukturalar bilan ishlashni ko‘rsatish uchun bir xil ob’yektlar
to‘plami haqida turli xil ma’lumotlarni qamrovchi, masalan, guruh
o‘quvchilarining to‘plami, misol tavsiya qilinadi. Vazifa: Bitta guruh
o‘quvchilari haqidagi ma’lumotlarni saqlovchi va qayta ishlovchi dastur
tuzilsin. O‘quvchilar haqidagi ma’lumotlarni qo‘shish va o‘zgartirish
imkoniyati ta’minlansin.
Zarur ko‘nikmalar
Berilgan misolni muvaffaqiyatli bajarish uchun strukturalar bilan,
kamida ularning klassik qo‘llanilishi bilan, ishlashni bilish zarur.
Strukturaning ma’lumotlar turlaridan boshqa narsa emasligini tushunish
zarur, ya’ni ular yordamida strukturalar massivini va ularga ko‘rsatkichlar
hosil qilish mumkin.
Yechish
Bu dasturni amalga oshirish uchun student nomli struktura hosil
qilingan. U studentning familiyasini va ismini, hamda telefoni va guruhini
saqlovchi maydonlarga ega. O‘ttizta elementdan iborat bunday strukturalar
massivi ham hosil qilingan. N o‘zgaruvchi oxirgidan keyingi element
59
nomeriga ega bo‘ladi. «Dobavit» yoki «Udalit» tugmachalari bosilganda N
ning qiymati mos ravishda bitta birlikka ko‘payadi yoki kamayadi.
Shakl
Mazkur shaklda jadvalning ustunlari Memo maydoni sifatida
tasvirlangan, boshqarish elementlari GroupBox ob’yekti yordamida
ma’nosiga ko‘ra alohida guruhlarga yig‘ilgan, kiritish maydoni esa Lable
ob’yekti bilan belgilangan.
Dastur kodi
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//--------------------------------------------------------------------------#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//--------------------------------------------------------------------------struct student
{
AnsiString name;
// O‘quvchining FISh
AnsiString group;
// Guruh
int phone;
// Uy telefoni
};
60
student M[30];
int N = 0;
//--------------------------------------------------------------------------void ShowAll()
{
Form1->Memo1->Text = "FISh";
Form1->Memo2->Text = "Telefon";
Form1->Memo3->Text = "Guruh";
Form1->Memo4->Text = "Nomer";
for (int i = 0; i < N; i++)
{
Form1->Memo4->Lines->Add(IntToStr(i+1));
Form1->Memo1->Lines->Add(M[i].name);
Form1->Memo2->Lines->Add(IntToStr(M[i].phone));
Form1->Memo3->Lines->Add(M[i].group);
}
}
//--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------------------void __fastcall TForm1::FormCreate(TObject *Sender)
{
ShowAll();
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(N < 30)
{
M[N].name = Edit1->Text;
M[N].group = Edit2->Text;
M[N].phone = StrToInt(Edit3->Text);
N++;
}
ShowAll();
}
61
//--------------------------------------------------------------------------void __fastcall TForm1::Button2Click(TObject *Sender)
{
int j = StrToInt(Edit4->Text);
for (int i = j; i < N; i++)
{
M[i-1] = M[i];
}
N--;
ShowAll();
}
62
6. Ko‘rsatkichlar bilan ishlash
Ko‘rsatkichlar
Ko‘rsatkich - xotira yacheykasining nomerini saqlovchi unikal
o‘zgaruvchidir. Ko‘rsatkich operativ xotiraning qandaydir o‘zgaruvchi
joylashishi mumkin bo‘lgan biror joyini aniqlaydi. Ko‘rsatkichning
qiymatini o‘zgartirish va variatsiyalash mumkin, bu esa dasturning
moslanuvchanligini oshiradi. Ko‘rsatkich odatda turlangan bo‘ladi va
quyidagicha e’lon qilinadi:
<tur nomi> * <ko‘rsatkich nomi> = <boshlang‘ich qiymat>;
Boshlang‘ich qiymat shu turga tegishli biror o‘zgaruvchidan
ko‘rsatkich olish buyrug‘i yoki nol bo‘lishi mumkin. Turlanmagan
ko‘rsatkichlar ko‘rsatkich turini o‘zgartirish mo‘ljallangan dasturlarda
ishlatiladi va void turdagi o‘zgaruvchining ko‘rsatkichi sifatida
ta’kidlanadi.
Biror o‘zgaruvchining manzilining qiymatini olish va uni
ko‘rsatkichga o‘zlashtirish uchun «&» buyrug‘i ishlatiladi.
Misol:
int I = 100;
int * p = &I;
«*» - manzili ko‘rsatkichni saqlovchi yacheykaning qiymatiga murojaatni
ta’minlovchi teskari buyruq.
Misol:
int I = 100;
int J = 0;
int * p = &I;
J = *(p+sizeof(int));
Ko‘rsatkichlar va massivlar aloqasi
C tilida ko‘rsatkichlar va massivlar o‘rtasida yaqin aloqa mavjud.
Masalan, int array[25] ko‘rinishda massiv e’lon qilinganda massivning
yigirma beshta elementiga joy ajratish aniqlanadi, balki qiymati
massivning tartib bo‘yicha birinchi (nolinchi) elementining manziliga teng
array nomli ko‘rsatkich uchun ham joy ajratiladi. Shunday qilib massiv
nomsiz bo‘ladi, massivning elementlariga murojaat esa array nomli
ko‘rsatkich orqali amalga oshiriladi. Tilning sintaksisi nuqtai nazaridan
63
array ko‘rsatkichi o‘zgarmas hisoblanadi. Uning qiymatini ifodalarda
ishlatish mumkin, ammo bu qiymatni o‘zgartirish mumkin emas.
Massiv ko‘rsatkich bo‘lganligi sababli, masalan, quyidagi
o‘zlashtirish o‘rinli:
int array[25];
int *ptr;
ptr=array;
Bu yerda ptr ko‘rsatkich massivning birinchi elementi manziliga
o‘rnatiladi, undan tashqari ptr=array o‘zlashtirishni unga ekvivalent
bo‘lgan ptr=&array[0] ko‘rinishda ham yozish mumkin.
Massiv elementlariga murojaat qilishning ikkita turli usullari
mavjud. Birinchi usul kvadrat qavslarda oddiy indeksli ifodalarni ishlatish
bilan bog‘liq, masalan, array[16]=3 yoki array[i+2]=7. Murojaatning
bunday usulida ikkita ifoda yoziladi, ulardan ikkinchisi kvadrat qavs ichiga
olinadi. Bu ifodalarning biri ko‘rsatkich, ikkinchisi esa butun turli ifoda
bo‘ladi.
Bu ifodalarni yozish ketma-ketligi ixtiyoriy bo‘lishi mumkin, ammo
kvadrat qavs ichiga ikkinchi kelgan ifoda yoziladi. Shuning uchun ham
array[16] va 16[array] yozuvlari ekvivalent bo‘ladi va massivning o‘n
oltinchi elementi nomerini bildiradi. Indeksli ifodada ishlatilayotgan
ko‘rsatkich qandaydir massivni ko‘rsatuvchi o‘zgarmas bo‘lishi shart
emas, u o‘zgaruvchi ham bo‘lishi mumkin. Xususan ptr=array o‘zlashtirish
bajarilgandan so‘ng massivning o‘n oltinchi elementiga murojaatni ptr
ko‘rsatkich yordamida ptr[16] yoki 16[ptr] ko‘rinishda olish mumkin..
Massiv elementiga murojaatning ikkinchi usuli manzilli (adresli)
ifodalardan foydalanish va
*(array+16)=3 yoki *(array+i+2)=7
ko‘rinishidagi razadresatsiya amali bilan bog‘liq. Murojaatning bunday
usulida massivning o‘n oltinchi element manziliga teng manzilli ifoda turli
usullarda yozilishi mumkin: *(array+16) yoki *(16+array).
Kompyuterda tadbiq etilganda birinchi usul ikkinchi usulga
keltiriladi, ya’ni indeksli ifoda manzilli ifodaga o‘tkaziladi. Ko‘rilayotgan
misollar uchun array[16] va 16[array] lar
*(array+16) ifodaga
almashtiriladi.
Massivning boshlang‘ich elementiga (ya’ni nol indeksli elementiga)
murojaat qilish uchun array yoki ptr ko‘rsatkichlarining qiymatlarini
ishlatish mumkin. Quyidagi ixtiyoriy ifoda
*array = 2;
64
array[0] = 2;
*(array+0) = 2;
*ptr = 2;
ptr[0] = 2;
*(ptr+0) = 2;
massivning boshlang‘ich elementiga 2 qiymatni o‘zlashtiradi, ammo
*array=2 i *ptr=2 o‘zlashtirishlari barchasidan tezroq bajariladi, chunki
ular uchun qo‘shish amalining bajarilishi talab etilmaydi.
Ko‘rsatkichlar bilan amallar
Ko‘rsatkichlar ustida inkrement va dekrement unar amallarini
bajarish mumkin. ++ va -- amallari bajarilganda ko‘rsatkichning qiymati
ishlatilayotgan ko‘rsatkich ko‘rsatayotgan tur uzunligiga oshiriladi yoki
kamaytiriladi.
Misol:
int *ptr, a[10];
ptr=&a[5];
ptr++; /* a[6] element manziliga teng */
ptr--; /* a[5] element manziliga teng */
Qo‘shish va ayirish binar amallarida int turidagi kattalik va ko‘rsatkich
qatnashishi mumkin. Bu holda amalning natijasi joriy turdagi ko‘rsatkich
bo‘ladi, uning qiymati esa joriynikidan ko‘rsatilgan element sonicha ortiq
yoki kam bo‘ladi.
Misol:
int *ptr1, *ptr2, a[10];
int i=2;
ptr1=a+(i+4); /* a[6] element manziliga teng */
ptr2=ptr1-i; /* a[4] element manziliga teng */
Ayirish amalida bitta umumiy turga tegishli ikkita ko‘rsatkich
qatnashishi mumkin. Bu amalning natijasi int turiga tegishli va joriy
turdagi kamayuvchi va ayriluvchi o‘rtasidagi elemenlar soniga teng.
Chunonchi agar birinchi manzil kam bo‘lsa, u holda natija manfiy
qiymatga ega bo‘ladi.
Misol:
int *ptr1, *ptr2, a[10];
int i;
ptr1=a+4;
65
ptr2=a+9;
i=ptr1-ptr2; /* 5 ga teng */
i=ptr2-ptr1; /* -5 ga teng */
Bir xil turli ikkita ko‘rsatkichning qiymatlarini ==, !=, <, <=",">, >=
amallari yordamida taqqoslash mumkin, bu holda ko‘rsatkichlarning
qiymatlari oddiy butun sonlar kabi qaraladi, taqqoslashning natijasi esa 0
(yolg‘on) yoki 1 (rost) ga teng.
Misol:
int *ptr1, *ptr2, a[10];
ptr1=a+5;
ptr2=a+7;
if (prt1>ptr2) a[3]=4;
Bu misolda ptr1 ning qiymati ptr2 ning qiymatidan kichik va shuning
uchun ham a[3]=4 buyrug‘i bajarilmaydi.
Ko‘rsatkichlar massivi
C tilida massivning elementlari ixtiyoriy turga ega bo‘lishi mumkin,
jumladan, ixtiyoriy turdagi ko‘rsatkich ham bo‘lishi mumkin.
Ko‘rsatkichlardan foydalanishga oid bir nechta misollar ko‘ramiz
int a[]={10,11,12,13,14,};
int *p[]={a, a+1, a+2, a+2, a+3, a+4};
int **pp=p;
sxemada tasvirlangan dastur ob’yektlarini hosil qiladi
pp
p
.
.
.
.
.
a
11
12
13
14
15
E’lon qilishda o‘zgaruvchilarning joylashish sxemasi.
pp-p amali bajarilganda nol qiymatga ega bo‘lamiz, chunki pp va p
murojaatlar teng va p ko‘rsatkich bilan bog‘liq (p[0] elementga)
ko‘rsatkich massivining boshlang‘ich elementini ko‘rsatadi. pp+q2 amal
bajarilganda sxema o‘zgaradi va quyidagi ko‘rinishni oladi:
pp
66
p
a
.
.
.
.
.
10
11
12
13
14
O‘zgaruvchilarning pp+q2 amali bajarilgandan so‘nggi joylashish
sxemasi.
pp ning qiymati p massivning uchinchi elementining manzili
bo‘lganligi sababli, pp-p ayirish bajarilganda natija 2 ga teng bo‘ladi. *ppa murojaat ham 2 qiymatni beradi, chunki *pp murojaat a massivning
uchinchi elementining manzili bo‘ladi. a murojaat esa massiv boshlang‘ich
elementining manzilini beradi. **pp murojaat yordamida murojaat
qilinganda 12 qiymatga ega bo‘lamiz, chunki bu a massivning uchinchi
elementining qiymatidir. *pp++ murojaat p massivning to‘rtinchi
elementining qiymatini beradi, ya’ni a massivning to‘rtinchi elementi
manzili.
Agar pp=p deb faraz qilsak, u holda *++pp murojaat a massivning
birinchi elementi qiymatini beradi (ya’ni 11 qiymatni), ++*pp amali p[0]
ko‘rsatkichning qiymatini o‘zgartiradi, shunday qilib u a[1] element
manzilining qiymatiga teng bo‘ladi.
Murakkab murojaatlar ichkaridan boshlab ochiladi. Masalan,
*(++(*pp)) murojaatni quyidagi amallarga ajratish mumkin: *pp p[0]
massivning boshlang‘ich elementining qiymatini beradi, so‘ngra bu qiymat
++(*p) ga inkrementatsiya qilinadi va natijada p[0] ko‘rsatkich a[1]
element manzilining qiymatiga teng bo‘ladi. Oxirgi amalda hosil qilingan
manzilning qiymati olinadi, ya’ni 11 qiymat.
Oldingi misollarda bir o‘lchovli massiv ishlatilgan edi, hozir esa ko‘p
o‘lsovli massiv va ko‘rsatkichlarga misollar ko‘ramiz. O‘zgaruvchilarni
quyidagicha e’lon qilish
int a[3][3]={ { 11,12,13 },
{ 21,22,23 },
{ 31,32,33 } };
int *pa[3]={ a,a[1],a[2] };
int *p=a[0];
e’lon qilish dasturda pastdagi sxemada ko‘rsatilgan ob’yektlarni hosil
qiladi
67
.
Ko‘rsatkichlarning ikki o‘lchovli massivda joylanishi.
Bu sxemaga asosan a[0][0] elementga murojaatni a, p, pa
ko‘rsatkichlar orqali a[0][0], *a, **a[0], *p, **pa, *p[0] murojaat
yordamida olish mumkin.
Hozir esa belgilar qatorini ishlatishga misol ko‘ramiz.
O‘zgaruvchilarni quyidagicha
char *c[]={ "abs", "dx", "yes", "no" };
char **cp[]={ c+3, c+2 , c+1 , c };
char ***cpp=cp;
e’lon qilish pastda keltirilgan rasmdagi sxemadagidek tasvirlashi mumkin.
Ko‘rsatkichlarning satrda joylanish sxemasi.
6 - misol: «ASCII jadvali kodlari»
Dasturning tasnifi
Ko‘rsatkichlar bilan ishlashni ko‘rgazmali tasvirlash uchun ixtiyoriy
kiritilgan qator belgilari kodini tasvirlovchi dastur yozamiz.
Belgilar operativ xotirada ASCII jadvali kodlari sifatida saqlanadi,
shuning uchun ham belgilarning kodlarini bilish uchun xotira
yacheykasidagi byte turidagi o‘zgaruvchi ko‘rinishida saqlanayotgan
belgini o‘qish kifoya.
Bunday dasturni yozish uchun belgilar massivi bir xil elementlar
to‘plamining ketma-ketligi ekanligidan, ularga ko‘rsatkichlarni ma’lum
sondagi baytlarga siljitish yordamida murojaat qilish mumkinligidan
foydalanish mumkin.
Muammolar
Mazkur dasturning eng katta muammosi shundaki, Edit turi
ko‘rinishidagi ob’yektlar o‘z matn qiymatlarini AnsiString turidagi,
belgilar massivi bo‘lmagan o‘zgaruvchilarda saqlaydi. Ya’ni mazkur
68
dasturni yaratish uchun AnsiString turidagi o‘zgaruvchilarni belgilar
massiviga almashtiruvchi protsedura yozishga to‘g‘ri keladi.
Zarur ko‘nikmalar
Mazkur dastur uchun zarur bo‘lgan asosiy ko‘nikma xotira bilan
o‘zgaruvchilar bilan ishlash orqali emas, balki to‘g‘ridan-to‘g‘ri,
ko‘rsatkichlarni siljitish orqali ishlash ko‘nikmasidir. Undan tashqari, turli
xil tur ma’lumotlarining xotirada egallaydigan hajmini bilish, bir turni
ikkinchisiga o‘tkazishni bilish kerak bo‘ladi.
Yana qatorlar bilan ishlashni bilish kerak bo‘ladi, belgilar massiviga
aylantirish uchun qatorning alohida belgilarini ajratib olishni bilish ham
zarur.
Yechish
Shakl
Mazkur masalaning shakli Edit1 maydoniga kiritilgan belgilar
kodlarini chiqarish uchun bitta Memo maydoniga ega. Edit1 maydonining
yonida uni ko‘rsatuvchi Label1 maydoni joylashgan bo‘ladi.
69
Almashtirishni tavsiflash
«belgi» = «uning kodi» turidagi qatorni shakllantirish uchun
qatorning «+» buyrug‘i bilan o‘zaro ta’sir etish xossasidan foydalaniladi.
Buning uchun belgi h qatorga almashtiriladi.
AnsiString h = c[i];
Undan so‘ng q qator hosil qilinadi va Memo1 komponentining
boshqa qatorlariga qo‘shiladi.
AnsiString q = h + " q " + IntToStr(*((byte*)(c+i)));
Memo1->Lines->Add(q);
Belgining kodini bevosita hisoblovchi dastur kodini ko‘rib chiqamiz:
IntToStr(*((byte*)(c+i)));
Bu yerda (c+i) - massivning i-nomerli elementiga ko‘rsatkichdir.
(byte*)(c+i) - bu ko‘rsatkichni byte turidagi butun qiymatli o‘zgaruvchi
ko‘rsatkichi belgisiga almashtiradi. *((byte*)(c+i)) – bu o‘zgaruvchining
byte turidagi bevosita qiymati. IntToStr(…) – sonli o‘zgaruvchini qatorga
almashtiruvchi, bizga tanish bo‘lgan funksiya.
Izoh: Bu fragmentda belgining ko‘rsatkichini butun qiymatli
o‘zgaruvchining ko‘rsatkichiga almashtirish ortiqcha ish edi, chunki C++
bunday almashtirishni turlarni almashtirishni to‘g‘ridan-to‘g‘ri
ko‘rsatmasdan ham bajara oladi, ammo oshkor almashtirish dastur
kodining ko‘rsatmaliligini oshirish maqsadida ishlatilgan.
Dastur kodi
Mazkur dasturning kodi qatorni belgilar massiviga va belgi va uning
kodini Memo1 shaklida aks ettiriluvchi bevosita kodga almashtiruvchi
protsedurani o‘z ichiga oladi. Bu vazifani amalga oshiruvchi protseduraga
Edit1 komponentining onChange xodisasi mos qo‘yilgan. Shu yo‘l bilan
birga bu komponent almashganda avtomatik ravishda Memo1
ob’yektining tarkibi ham o‘zgaradi.
void AnsiStringToCharPointer(char * c, AnsiString s, int n = 0)
{
int k = s.Length();
if(k > n && n != 0){ k = n; }
for(int i = 0; i < k; i++)
{
c[i] = s[i+1];
70
}
}
//--------------------------------------------------------------------------void __fastcall TForm1::Edit1Change(TObject *Sender)
{
Memo1->Text = "";
int l = Edit1->Text.Length();
char c[100];
AnsiStringToCharPointer(c, Edit1->Text,100);
for(int i = 0; i < l; i++)
{
AnsiString h = c[i];
AnsiString q = h + " q " + IntToStr(*((byte*)(c+i)));
Memo1->Lines->Add(q);
}
}
71
7. Xotirani dinamik taqsimlash
Xotirani zaxiralash
C++ da o‘zgaruvchilar yo statik - kompilyatsiya paytida, yo standart
kutubxonadan funksiyalarni chaqirish yo‘li bilan dinamik - dasturning
bajarilish paytida, joylanishi mumkin. Bu usullarni ishlatishning asosiy
farqi ularning effektivligida va moslanuvchanligidadir. Statik joylashtirish
birmuncha effektivroq, chunki xotira ajratish dastur bajarilishidan oldin
bajariladi. Ammo uning moslanuvchanligi ancha pastroq, chunki bu holda
biz joylashtiriladigan ob’yektlarning turlari va o‘lchamlarini oldindan
bilishimiz zarur. Masalan, matn fayllarni qatorlarning statik massivida,
uning o‘lchamini oldindan bilish zarurligidan, joylashtirish ancha qiyin.
Ayniqsa, oldindan noaniq sonli elementlarni saqlash va qayta ishlash bilan
bog‘liq masalalar uchun xotirani dinamik taqsimlash usulidan foydalanish
qulay.
Xotirani statik va dinamik taqsimlash o‘rtasidagi asosiy farq
quyidagilar:
Statik ob’yektlar nomlangan o‘zgaruvchilar bilan belgilanadi.
Shu sababli bunday ob’yektlar ustida amallar bevosita ularning
nomlarini ishlatish orqali amalga oshiriladi. Dinamik ob’yektlar
shaxsiy nomga ega bo‘lmaydi, ular ustidagi amallar bilvosita,
ya’ni ko‘rsatkichlar yordamida bajariladi;
Statik ob’yektlar uchun xotira ajratish va bo‘shatish
kompilyator tomonidan avtomatik ravishda bajariladi.
Dasturchining bu haqda bosh qotirishi shart emas. Dinamik
ob’yektlar uchun xotira ajratish va bo‘shatish butunligicha
dasturchining zimmasiga tushadi. Bu esa hal qilishda xatoga
yo‘l qo‘yish mumkin bo‘lgan murakkab masaladir.
Dinamik ajratilgan xotira bilan ish ko‘rish uchun new va delete
buyruqlaridan foydalaniladi.
Shu paytgacha barcha misollarda xotirani statik ajratish usulidan
foydalanilib kelindi. Masalan, i o‘zgaruvchini aniqlash quyidagicha
bajarilar edi:
int i = 1024;
72
Bu buyruq xotirada int turidagi o‘zgaruvchini saqlash uchun zarur
bo‘lgan soha ajratadi, bu sohani i nom bilan bog‘laydi va u joyga 1024
qiymatni yozib qo‘yadi. Bularning barchasi dasturning bajarilishigacha
bo‘gan kompilyatsiya paytida bajariladi.
O‘zgaruvchi uchun joy ajratishning yana bir usuli mavjud bo‘lib, u
new buyrug‘ini ishlatish yordamida bajariladi.
new buyrug‘i ikkita shaklga ega bo‘ladi. Birinchi shaklda aniq turli
birlik ob’yekt uchun joy ajratadi:
int *pint = new int(1024);
Bu yerda new buyrug‘i int turidagi nomsiz ob’yekt uchun joy ajratadi,
uni 1024 qiymat bilan initsializatsiya qiladi va hosil qilingan ob’yektning
manzilini uzatadi. Bu manzil pint ko‘rsatkichiga joylashtiradi. Bunday
nomsiz ob’yektlar ustidagi barcha amallar mazkur ko‘rsatkich bilan ishlash
orqali bajariladi, chunki dinamik ob’yektlar ustida bevosita ishlash
mumkin emas.
Ikkinchi shaklda new buyrug‘i ma’lum tur elementlaridan tashkil
topgan, ko‘rsatilgan o‘lchamdagi massiv uchun xotira ajratadi:
int *pia = new int[4];
Bu misolda int turidagi to‘rt elementdan iborat massiv uchun xotira
ajratiladi. Afsuski, new buyrug‘ining bu shaklida massiv elementlarini
initsializatsiya qilish imkoniyati yo‘q.
new buyrug‘ining ikkala shaklida ham bir xil ko‘rsatkich aniqlanishi
ba’zi chalkashliklarga olib kelishi mumkin. Qaralayotgan misolda bu
butun turga ko‘rsatkichdir. pint ham, pia ham bir xil e’lon qilingan, ammo
pint int turidagi yagona ob’yektni ko‘rsatadi, pia esa int turidagi to‘rtta
ob’yektdan iborat massivni ko‘rsatadi.
Dinamik ob’yekt kerak bo‘lmay qolganda unga ajratilgan sohani
oshkor ravishda bo‘shatish mumkin. Bu delete buyrug‘i yordamida
bajariladi:
delete pint;
Massivni bo‘shatish ham new buyrug‘i kabi ikki shaklga ega, birlik
ob’yekt uchun va massiv uchun.
delete[] pia;
Agar ajratilgan xotirani bo‘shatishni unutsak, u bo‘shga sarflanadi,
ishlatilmaydi. Agar unga bo‘lgan ko‘rsatkich o‘z qiymatini o‘zgartirgan
bo‘lsa uni tizimga qaytarish ham mumkin emas. Bunday xodisa xotiraning
73
oqib ketishi degan maxsus nom olgan. Oxir oqibatda dastur xotira
etmasligi sababli halokatli (avariyali) to‘xtaydi (agar u uzoq vaqt ishlasa).
7 - misol: «Ko‘rsatkichlardan foydalanuvchi ro‘yxatlar»
Dastur tasnifi
Mazkur dasturda mustaqil ravishda dasturchilar tomonidan tez-tez
ishlatiladigan, «Ikki yo‘nalishli ro‘yxat» konstruksiyasini tuzishga to‘g‘ri
keladi. Bu konstruksiya nomer bo‘yicha tartiblangan strukturalar majmuini
bildiradi. Unda har bir struktura o‘z tarkibida to‘plamning yaqin
o‘zgaruvchilariga ikkitadan ko‘rsatkichga ega bo‘ladi. Tabiiyki, struktura
bu ko‘rsatkichlardan tashqari dastur uchun ba’zi foydali ma’lumotlarga
ham ega bo‘ladi.
Bu misol uchun masala quyidagicha qo‘yiladi: Foydali ma’lumotlar
sifatida belgilar qatorini qamrab oluvchi, ikki yo‘nalishli ro‘yxat hosil
qilish imkoniga ega struktura, hamda ro‘yxatga elementlar qo‘shuvchi va
ro‘yxatdan elementlarni o‘chiruvchi protseduralar tuzilsin. Bu
protseduralar tugmachalar bilan biriktirilsin va ro‘yxatda saqlanuvchi
ma’lumotlarni chiqarish ta’minlansin.
Muammolar
Dinamik xotira bilan ishlashda zaxiralangan ma’lumotlar blokining
o‘z vaqtida bo‘shatilishini nazorat qilib borish, ya’ni bunday protsedurani
nazarda tutish, zarur. Bundan tashqari, dasturni tugatishdan oldin
xotiraning barcha zaxiralangan bloklari bo‘shatilishi kerak. Buning uchun
«Shakllarni yopish» - «Закрытие формы» (FormClose) xodisalarni qayta
ishlash protsedurasidan xotirani bo‘shatish protsedurasini chaqirish zarur.
Zarur ko‘nikmalar
Ikki yo‘nalishli ro‘yxat bilan ishlash uchun ko‘rsatkichlar va
strukturalar bilan ishlash ko‘nikmalari zarur. Dasturda ko‘rsatkichga
ko‘rsatkich bilan bog‘liq murakkab kostruksiyalar ishlatiladi (masalan,
manzilini o‘z navbatida boshqa ko‘rsatkich saqlovchi ko‘rsatkich
saqlanadigan manzilni o‘z ichiga oluvchi o‘zgaruvchiga biror qiymat
o‘zlashtirishda). Bu dasturda “->” buyrug‘i ishlatiladi. Bu buyruq
strukturaning bir qismi bo‘lgan, manzili shu buyruq tadbiq etilayotgan
ko‘rsatkich bo‘lgan o‘zgaruvchini aniqlaydi (qaytaradi). Agar buyruq
aniqlagan o‘zgaruvchi strukturaga ko‘rsatkich bo‘lsa, u holda unga shu
buyruqning o‘zi yana tadbiq qilinishi mumkin. Buning oqibatida ko‘p
o‘tishlardan iborat uzun konstruksiyalar paydo bo‘ladi.
74
Yechish
Shakl
Mazkur dasturning shaklida ro‘yxatning mazmunini ekranga
chiqarish uchun maydon va element qo‘shish, elementni o‘chirish, barcha
elementlarni aks ettirish yoki o‘chirish imkonini beruvchi barcha
funksional tugmachalar joylashgan bo‘lishi kerak. Satrlarni chiqarish
maydonini ma’noli birlashtirish maqsadida yangi element uchun
«Dobavit» tugmachasi bilan birga shu tugmachaga mos nomli, ham kiritish
maydoni, ham tugmachadan iborat guruh tuzilgan.
Ikki yo‘nalishli ro‘yxat sxemasi
Bu yerda uchta elementdan iborat ikki yo‘nalishli ro‘yxat sxemasi
keltirilgan.
0
next
next
next
prev
prev
prev
Data
Data
Data
0
Navbatdagi sxemada ro‘yxat ichiga element qo‘yish sxemasi
ko‘rsatilgan.
75
0
next
next
next
prev
prev
prev
Data
Data
Data
0
next
prev
Data
Bu dasturda elementni qo‘yish ro‘yxatning eng oxiriga qo‘yish bilan
amalga oshiriladi. Ammo u o‘rtaga qo‘yishdan prinsipial farq qilmaydi.
Tabiiyki, ro‘yxatga yangi element qo‘shishda orientatsiya uchun orientr
maqsadida ro‘yxatning biror elementi olinadi va undan oldin yoki keyin
qo‘yish amalga oshiriladi. Mazkur dasturda qo‘yish tanlangan ob’yektdan
keyin amalga oshiriladi. Qo‘yishda quyidagi amallar ketma-ketligi
bajariladi:
1. Qo‘yilayotgan elementning prev xossasiga tanlangan
elementning (undan keyin qo‘yish amalga oshiriladigan
element) qiymati o‘zlashtiriladi.
2. Qo‘yilayotgan elementning next xossasiga tanlangan
elementning next xossasining qiymati o‘zlashtiriladi.
3. Manzili tanlangan elementning next xossasini saqlovchi
elementning prev xossasiga yangi element manzilining qiymati
o‘zlashtiriladi.
4. Tanlangan elementning next xossasiga
yangi element
manzilining qiymati o‘zlashtiriladi.
Mazkur dasturda qo‘yish manzili w ko‘rsatkichda berilgan
elementdan keyin amalga oshiriladi.
76
List * n q new List;
n->prev q w;
n->next q w->next;
if (w->next) {w->next->prev q n;}
w->next q n;
n->Data q data;
initsializatsiya qilish
// Yangi element hosil qilish
// 1 - amal
// 2 - amal
// 3 - amal
// 4 - amal
//
funksional
elementni
Qo‘yish har doim so‘nggi elementdan bajarilganligi uchun w->next
ning qiymati har doim nol bo‘ladi, ya’ni 3-amal hech qachon bajarilmaydi,
shuning uchun uni tushirib qoldirish mumkin. Dasturning asosiy kodida bu
amal tushirib qoldirilgan.
Dastur kodi
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//--------------------------------------------------------------------------#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//--------------------------------------------------------------------------struct List
{
List* prev;
List* next;
AnsiString Data;
};
List* add(List* w, AnsiString data)
{
List * n = new List;
n->prev = w;
n->next = w->next;
w->next = n;
n->Data = data;
// Ro‘yxatga element qo‘shish
77
return n;
}
List* del(List* w)
// Ro‘yxatdan elementni o‘chirish
{
if(w->prev){w->prev->next = w->next;}
if(w->next){w->next->prev = w->prev;}
List * r;
if(w->next) {r = w->next;} else {r = w->prev;}
delete w;
return r;
}
List First;
// Ro‘yxatning boshi
List* Last = &First;
// Ro‘yxatning oxiri
//--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
{
Memo1->Lines->Clear();
List* m = &First;
while(m)
{
Memo1->Lines->Add(m->Data);
m = m->next;
}
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button2Click(TObject *Sender)
{
Last = add(Last,Edit1->Text);
Edit1->Text = "";
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button3Click(TObject *Sender)
{
78
Last = del(Last);
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button4Click(TObject *Sender)
{
while(Last != &First)
{
Last = del(Last);
}
}
//--------------------------------------------------------------------------void __fastcall TForm1::FormCreate(TObject *Sender)
{
First.next = 0;
First.prev = 0;
First.Data = "Ro‘yxatning boshi";
}
//--------------------------------------------------------------------------void __fastcall TForm1::FormDestroy(TObject *Sender)
{
Button4->Click();
}
Nazorat savollari
1) Xotirani dinamik taqsimlash deb nimaga aytiladi?
2) Xotirani statik va dinamik taqsimlash nima bilan farq qiladi?
3) Dinamik ajratilgan xotira bilan ish ko’rish uchun qanday buyruqlardan
foydalaniladi
8. Fayllar bilan ishlash
C++ da fayllar bilan ishlash sinflari
C++ da fayllar bilan ishlash fstream kutubxonasining ba’zi sinflari
yordamida amalga oshiriladi.
fstream kutubxonasi fayllarni o‘qishga mo‘ljallangan ifstream va
ma’lumotlarni faylga yozishga mo‘ljallangan ofstream sinflariga ega.
Biror faylni o‘qish yoki yozish maqsadida ochish uchun mos
ravishda ofstream yoki ifstream turidagi o‘zgaruvchini hosil qilish kerak
79
bo‘ladi. Bunday o‘zgaruvchini initsializatsiya qilishda fayl nomi
o‘zgaruvchining nomidan keyin qavs ichida belgilar massivi ko‘rinishida
beriladi.
Masalan, S diskda joylashgan ‘text.txt’ faylini ochish kerak. Buning
uchun quyidagi fragment kodi ishlatiladi:
ifstream ifl (“C:g‘text.txt”);
ofstream ofl (“C:g‘text.txt”);
// o‘qish uchun
// yozish uchun
Bu erda ifl va ofl fayl bilan ma’lumotlar almashuvchi
o‘zgaruvchilarning nomlari. Agar fayl bajariluvchi fayl saqlanayotgan
papkada joylashgan bo‘lsa, u holda fayl nomi to‘liq ko‘rsatilmasligi
mumkin (ungacha to‘liq yo‘lsiz, faqat nomi). Undan tashqari, fayl nomini
to‘g‘ridan-to‘g‘ri ko‘rsatishning o‘rniga shu nomni saqlovchi belgilar
massivini ishlatish mumkin.
Misol:
char s[20] = “C:g‘text.txt”;
ifstream ifl (s);
Ma’lumotlarni faylga yozish uchun put buyrug‘idan foydalanish
mumkin. U standart turdagi yakka o‘zgaruvchini yoki biror belgilar
massivini uzatadi. Belgilar massivini uzatish zarurati tug‘ilganda
massivdagi belgilar soni ham uzatiladi.
ofstream ofl (“C:g‘text.txt”);
char s[9] = “The text”;
ofl.put(s,9);
int i = 100;
ofl.put(i);
put funksiyasini chaqirishni “<<” buyrug‘ini bajarish bilan
almashtirish mumkin.
ofstream ofl (“C:g‘text.txt”);
ofl << “The text”;
int i = 100;
ofl << i;
Bu buyruqni har xil tur qiymatlarini yoki har xil o‘zgaruvchilardan
uzatib, kodning bir qatorida ko‘p marotaba ishlatish mumkin.
80
ofstream ofl (“C:g‘text.txt”);
char s[9] = “The text”;
int i = 100;
ofl << “The text” << i << s << 200;
Satr bilan ishlaganda chiqarish satr oxiri belgisi -‘g‘n’ paydo
bo‘lguncha davom ettiriladi. Belgi bo‘lmagan turga tegishli barcha
o‘zgaruvchilar oldindan belgi ko‘rinishiga o‘tkaziladi.
Ma’lumotlarni fayldan o‘qish uchun “>>” buyrug‘iga ekvivalent
bo‘lgan get funksiyasi ishlatiladi. put funksiyasiga o‘xshab get funksiyasi
ham o‘zgaruvchilarning va belgilar massivining ixtiyoriy standart turlari
bilan ishlay oladi. Undan tashqari getline funksiyasi ham mavjud. U get
funksiyasidan satr oxirining oxirgi belgisini qaytarmasligi bilangina farq
qiladi.
Fayllarni izlash muloqat oynasi
Windows operatsion tizimida fayllarni izlash uchun fayllarni saqlash
va ochish universal muloqat oynalari nazarda tutilgan. Dialogs bandining
mos komponentlarini shaklda o‘rnatib ulardan foydalanish mumkin.
Bu komponentlarni shaklda o‘rnatib fayllar bilan ishlash standart
muloqat oynalarini chaqirish va keyinchalik bu muloqat ishlari
natijalaridan foydalanish mumkin.
Fayllarni ochish standart muloqat oynasi shu ko‘rinishga ega.
81
Fayllarni saqlash standart muloqat oynasi shu ko‘rinishga ega.
«Saqlash» - «Soxranit» yoki «Ochish» - «Открыть» tugmalari
bosilgandan so‘ng, ammo oynani yopgunga qadar (ya’ni CanClose holati
paytida), foydalanuvchi tomonidan tanlangan fayl nomi AnsiString turiga
ega shakl ob’yektiga mos FileName xossasida joylashadi.
8 - misol: «Matn muharriri»
Dastur tasnifi
Vazifa: Matn fayllarini tashkil qiluvchi va o‘zgartiruvchi dastur
tuzilsin. Diskdagi fayllarni ochish va kritilgan o‘zgartirishlarni saqlash
imkoniyatlari amalga oshirilsin.
Fayllarni izlash, hamda fayllarni saqlash joyini tanlash uchun
fayllarni ochish/saqlash standart muloqatlardan foydalanilsin.
Faylning matni Memo maydonida aks ettirilsin.
Muammolar
ifstream va ofstream sinflarining ob’yektlari fayllarni hosil qilish va
ular bilan ishlashda uzatilayotgan fayl nomini belgilar massivi sifatida
ishlatadi. Standart muloqatlar esa «satr» (AnsiString) turidagi qiymatlarni
qaytaradi. Ya’ni standart muloqat oynalari qaytarayotgan qiymatlarni
to‘g‘ridan-to‘g‘ri ifstream yoki ofstream ob’yektlarga uzatishning imkoni
yo‘q.
Bu muammoni yechish
uchun satrni belgilar massiviga
almashtiruvchi protsedura tuzish tavsiya etiladi.
Zarur ko‘nikmalar
Mazkur dasturni yozish uchun dastur yaratish muhitining standart
komponentlari, fayllarni izlashga mo‘ljallangan muloqat oynalari bilan
82
ishlashni bilish kerak. Undan tashqari matn holatdagi fayllarni o‘qish va
diskda saqlashni ham bilish zarur.
Yechish
Mazkur dasturni yozishda shaklda mos ravishda fayllarni ochadigan
va saqlaydigan tugmachalarni joylashtirishga to‘g‘ri keladi. Yana mos
muloqat oynalarini ham o‘rnatish talab etiladi. Tugmachalarni bosish
xodisalarini qayta ishlovchiga muloqat oynalarini chaqirish o‘rnatiladi:
SaveDialog1->Execute. Muloqat oynasining OnCanClose xodisalarni
qayta ishlovchisiga esa fayllar bilan ishlashni amalga oshiruvchi dastur
kodi o‘rnatiladi.
Fayllar bilan ishlash muloqat oynasining OnCanClose xodisasi sodir
bo‘lganda mos muloqat oynasining FileName xossasida tanlangan faylning
nomi paydo bo‘ladi. Aynan shu fayl bilan ishlash kerak bo‘ladi.
Ifstream sinf ob’yektining satriga yozilgan fayl to‘g‘risidagi
ma’lumotlarni uzatish uchun satrni belgilar massiviga almashtirishga
to‘g‘ri keladi. Bu ishni massivning birinchi elementiga murojaatni va
bevosita satrni uzatish mo‘ljallangan protsedura yaratib osongina amalga
oshirish mumkin. Bu protsedura belgilarni satrdan olib, massivni ketmaket, elementma-element to‘ldiradi. Bu protseduraning yordamida barcha
kerakli almashtirishlarni osongina bajarish mumkin.
Faylning mazmunini Memo1 maydoniga yozish uchun satrni
ifstream sinfining getline() funksiyasi yordamida ketma-ket o‘qish va
uning qism ob’yekti Lines ( Memo1->Lines->Add(stroka); ) ning Add()
funksiyasi yordamida Memo1 maydoniga yozish kerak.
Ma’lumotlarni faylda saqlash uchun faylga Memo1 ob’yektini satrini
belgima-belgi, satr oxiri belgisi (g‘n) ni qo‘shib va yangi satrdan boshlab
yozish zarur.
Shakl
Shaklda ko‘rinuvchi komponentlardan tashqari Dialogs bandining
SaveDialog va LoadDialog komponentlari ham qatnashadi.
83
Dastur kodi
#include <vcl.h>
#include <fstream.h>
#pragma hdrstop
#include "Unit1.h"
//--------------------------------------------------------------------------#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//--------------------------------------------------------------------------__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//--------------------------------------------------------------------------void AnsiStringToCharPointer(char * c, AnsiString s, int n = 0)
{
int k = s.Length();
if(k > n && n != 0){ k = n; }
for(int i = 0; i < k; i++)
{
c[i] = s[i+1];
}
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button1Click(TObject *Sender)
{
OpenDialog1->Execute();
84
}
//--------------------------------------------------------------------------void __fastcall TForm1::Button2Click(TObject *Sender)
{
SaveDialog1->Execute();
}
//--------------------------------------------------------------------------void __fastcall TForm1::OpenDialog1CanClose(TObject *Sender,
bool &CanClose)
{
AnsiString name = OpenDialog1->FileName;
char c[100] = "";
AnsiStringToCharPointer(c,name);
ifstream in(c);
Memo1->Text = "";
while(in.good())
{
in.getline(c,100);
Memo1->Lines->Add(c);
}
in.close();
}
//--------------------------------------------------------------------------void __fastcall TForm1::SaveDialog1CanClose(TObject *Sender,
bool &CanClose)
{
AnsiString name = SaveDialog1->FileName;
char c[1000] = "";
AnsiStringToCharPointer(c,name);
ofstream out(c);
for(int i = 1;i < Memo1->Lines->Count;i++)
{
AnsiString s = Memo1->Lines->operator [](i);
for(int j = 1; j < s.Length()+1; j++)
{
out << s[j];
}
out << 'g‘n';
85
}
out.close();
}
86
0
You can add this document to your study collection(s)
Sign in Available only to authorized usersYou can add this document to your saved list
Sign in Available only to authorized users(For complaints, use another form )