4.Strukturalarga ko‘rsatkich
Struktura elementlariga ko‘rsatkichlar orqali murojaat qilish mumkin. Buning uchun strukturaga ko‘rsatkich o‘zgaruvchisi e‘lon qilinishi kerak. Masalan, yuqorida keltirilgan misolda Talaba strukturasiga ko‘rsatkich quyidagicha e‘lon qilinadi:
Talaba * k_talaba;
Ko‘rsatkich orqali aniqlangan struktura elementlariga
murojaat «.» bilan emas, balki «->» vositasida amalga oshiriladi:
cout<FISh;
Strukturalarni ko‘rsatkich va adresni olish (&) vositasida funksiya argumenti sifatida uzatish mumkin. Quyida keltirilgan programma bo‘lagida strukturani Talaba_Kiritish() funksiyasiga ko‘rsatkich orqali, Talabalar_FISh() funksiyasiga esa adresni olish vositasida uzatishga misol keltirilgan.
...
void Talaba_Kiritish(Talaba *t);
void Talabalar_FISh(Talaba & t);
int main( )
{
Talaba * k_talaba;
k_talaba=(Talaba*)malloc(n*sizeof(Talaba));
Talaba_Kiritish(k_talaba);
Talabalar_FISh(*k_talaba);
return 0;
}
void Talabalar_FISh(Talaba & t)
{
for(int i=0; i
{cout<<(&t+i)->FISh<
}
void Talaba_Kiritish(Talaba *t)
{
for(int i=0; i{
cout<cout<<" Talaba FISh :";
cin.getline((t+i)->FISh,30);
cout<<" Kurs:";
cin>>(t+i)->Kurs;
...
}
}
Shunga e‘tibor berish kerakki, dinamik ravishda hosil qilingan strukturalar massivi elementi bo‘lgan strukturaning maydoniga murojaatda «*» belgisi qo‘llanilmaydi.
Masala. Futbol jamoalari haqidagi ma‘lumotlar - jamoa nomi, ayni paytdagi yutuqlar, durang va mag‘lubiyatlar sonlari, hamda raqib darvozasiga kiritilgan va o‘z darvozasidan o‘tkazib yuborilgan to‘plar sonlari bilan berilgan. Futbol jamoalarining turnir jadvali chop qilinsin. Jamoalarni jadvalda tartiblashda quyidagi qoidalarga amal qilinsin:
1) jamoalar to‘plagan ochkolarini kamayishi bo‘yicha tartiblanishi kerak;
2) agar jamoalar to‘plagan ochkolari teng bo‘lsa, ulardan nisbatan ko‘p g‘alabaga erishgan jamoa jadvalda yuqori o‘rinni egallaydi;
3) agar ikkita jamoaning to‘plagan ochkolari va g‘alabalar soni teng bo‘lsa, ulardan nisbatan ko‘p to‘p kiritgan jamoa jadvalda yuqori o‘rinni egallaydi.
Jamoa haqidagi berilganlar struktura ko‘rinishida, jadval esa struktura massivi sifati aniqlanadi:
struct Jamoa
{
string Nomi;
int Yutuq, Durang, Maglub, Urgan_tup, Utkazgan_tup;
int Uyin, Ochko;
};
Bu erda Uyin maydoni Yutuq, Durang va Maglub maydonlar yig‘indisi, jamoa to‘plagan ochkolar - Ochko=3*Yutuq+1*Durang ko‘rinishida aniqlanadi. Jamoalar massivi Ochko, Yutuq va Urgan_tup maydonlari bo‘yicha tartiblanadi.
Programma matni:
struct Jamoa
{
string Nomi;
int Yutuq, Durang, Maglub, Urgan_tup, Utkazgan_tup;
int Uyin, Ochko;
};
const nom_uzunligi=10;
int jamoalar_soni;
Jamoa * Jamoalar_Jadvali()
{
char *jm_nomi=(char*)malloc(nom_uzunligi+1);
cout<<" Jamoalar soni: ";
cin>>jamoalar_soni;
Jamoa * jm=new Jamoa[jamoalar_soni];
for(int i=0; i
{
cin.ignore();
cout<
cout<<" Nomi: ";
cin.getline(jm_nomi,nom_uzunligi);
while(strlen(jm_nomi)
strcat(jm_nomi," ");
jm[i].Nomi.assign(snomi);
cout<<" Yutuqlar soni: ";
cin>> jm[i].Yutuq;
cout<<" Duranglar soni: ";
cin>>jm[i].Durang;
cout<<" Mag'lubiyatlar soni: ";
cin>>jm[i].Maglub;
cout<<" Raqib darvozasiga urilgan to'plar soni: ";
cin>>jm[i].Urgan_tup;
cout<<" O'z darvozasigan o'tkazgan to'plar soni: ";
cin>>jm[i].Utkazgan_tup;
jm[i].Uyin=jm[i].Yutuq+jm[i].Durang + jm[i].Maglub;
jm[i].Ochko=jm[i].Yutuq*3 +jm[i].Durang;
}
free(snomi);
return jm;
}
void Utkazish(Jamoa & jamoa1, const Jamoa & jamoa2)
{
jamoa1.Nomi=jamoa2.Nomi;
jamoa1.Yutuq=jamoa2.Yutuq;
jamoa1.Durang=jamoa2.Durang;
jamoa1.Maglub=jamoa2.Maglub;
jamoa1.Urgan_tup=jamoa2.Urgan_tup;
jamoa1.Utkazgan_tup=jamoa2.Utkazgan_tup;
jamoa1.Uyin=jamoa2.Uyin;
jamoa1.Ochko=jamoa2.Ochko;
}
Jamoa * Jadvalni_Tartiblash(Jamoa * jm)
{
bool urin_almashdi=true;
for(int i=0;i
{
Jamoa Vaqtincha;
urin_almashdi=false;
for(int j=i; j
{
// j-jamoaning ochkosi (j+1)- jamoa ochkosidan katta
// bo‘lsa, takrorlashning keyingi qadamiga o‘tilsin.
if(jm[j].Ochko>jm[j+1].Ochko) continue;
//j va (j+1)-jamoalarning ochkolari teng va j-jamoa
// yutuqlari (j+1)- jamoa yutuqlaridan ko‘p bo‘lsa,
// takrorlashning keyingi qadamiga o‘tilsin.
if(jm[j].Ochko==jm[j+1].Ochko &&
jm[j].Yutuq>jm[j+1].Yutuq) continue;
//j va (j+1)-jamoalarning ochkolari va yutuqlar soni
// teng va j-jamoa urgan to‘plar soni (j+1)- jamoa
//urgan to‘plardan ko‘p bo‘lsa, takrorlashning keyingi
// qadamiga o‘tilsin.
if(jm[j].Ochko==jm[j+1].Ochko &&
jm[j].Yutuq==jm[j+1].Yutuq &&
jm[j].Urgan_tup>jm[j+1].Urgan_tup) continue;
//yuqoridagi shartlarning birortasi ham bajarilmasa,
//j va (j+1)-jamoalar o‘rinlari almashtirilsin.
urin_almashdi=true;
Utkazish(Vaqtincha,jm[j]);
Utkazish(jm[j],jm[j+1]);
Utkazish(jm[j+1], Vaqtincha);
}
}
return jm;
}
void Jadavlni_Chop_Qilish(const Jamoa *jm)
{
char pr=’ ’;
cout<<" FUTBOL JAMOALARINING TURNIR JADVALI\n" ;
cout<<"------------------------------------------\n";
cout<<"| JAMOA | O | Y | D | M |UrT|O'T|OCHKO|\n";
cout<<"------------------------------------------\n";
for(int i=0; i
{
cout<<"|"<
if(jm[i].Uyin<10)cout<
if(jm[i].Yutuq<10)cout<
if(jm[i].Durang<10)cout<
cout<
if(jm[i].Maglub<10)cout<
cout<if(jm[i].Urgan_tup<10)cout<
cout<if(jm[i].Utkazgan_tup<10)cout<
cout<if(jm[i].Ochko<10)cout<
cout<}
cout<<"------------------------------------------\n";
}
int main()
{
Jamoa *jamoa;
jamoa=Berilganlarni_kiritish();
jamoa=Jadvalni_Tartiblash(jamoa);
Jadvalni_Chop_Qilish(jamoa);
return 0;
}
Programma bosh funksiya va quyidagi vazifalarni bajaruvchi to‘rtta funksiyadan tashkil topgan:
1) Jamoa * Jamoalar_Jadvali()- jamoalar haqidagi berilganlarni saqlaydigan Jamoa strukturalaridan tashkil topgan dinamik massiv yaratadi va unga oqimdan har bir jamoa berilganlarni o‘qib joylashtiradi. Hosil bo‘lgan massivga ko‘rsatkichni funksiya natijasi sifatida qaytaradi;
2) Jamoa*Jadvalni_Tartiblash(Jamoa*jm) - argument orqali ko‘rsa- tilgan massivni masala sharti bo‘yicha tartiblaydi va shu massivga ko‘rsatkichni qaytaradi;
3) void Utkazish(Jamoa & jamoa1, Jamoa & jamoa2) - jamoa2 strukturasidagi maydonlarni jamoa1 strukturasiga o‘tkazadi. Bu funksiya Jadvalni_Tartiblash() funksiyasidan massivdagi ikkita struk- turani o‘zaro o‘rinlarini almashtirish uchun chaqiriladi;
4) void Jadavlni_Chop_Qilish(const Jamoa *jm) - argumentda berilgan massivni turnir jadvali qolipida chop qiladi. Uchta jamoa haqida ma‘lumot berilganda programma ishlashi- ning natijasi quyidagicha bo‘lishi mumkin:
FUTBOL JAMOALARINING TURNIR JADVALI
----------------------------------------------------------
| JAMOA | O | Y | D | M | UrT | O'T | OCHKO |
------------------------------------------------------------
| Bunyodkor | 20 | 15 | 3 | 2 | 30 | 10 | 48 |
| Paxtakor | 20 |11 | 5 | 4 | 20 |16 | 38 |
|Neftchi |20 | 8 | 5 | 7 |22 |20 | 29 |
------------------------------------------
5.Dinamik strukturalar
Berilganlar ustida ishlashda ularning miqdori qancha bo‘lishi va ularga xotiradan qancha joy ajratish kerakligi oldindan noma‘lum bo‘lishi mumkin. Programma ishlash paytida berilganlar uchun zarurat bo‘yicha xotiradan joy ajratish va ularni ko‘rsatkichlar bilan bog‘lash orqali yagona struktura hosil qilish jarayoni xotiraning dinamik taqsimoti deyiladi. Bu usulda hosil bo‘lgan berilganlar majmuasiga berilganlarning dinamik strukturasi deyiladi, chunki ularning o‘lchami programma bajarilishida o‘zgarib turadi. Programmalashda dinamik strukturalardan chiziqli ro‘yxat- lar (zanjirlar), steklar, navbatlar va binar daraxtlar nisbatan ko‘p ishlatiladi. Ular bir - biridan elementlar o‘rtasidagi bog‘lanishlari va ular ustida bajariladigan amallari bilan farqlanadi.
Programma ishlashida strukturaga yangi elementlar qo‘shilishi yoki
o‘chirilishi mumkin.
Har qanday berilganlarning dinamik strukturasi maydonlar-
dan tashkil topadi va ularning ayrimlari qo‘shni elementlar bilan
bog‘lanish uchun xizmat qiladi.
Masala. Noldan farqli butun sonlardan iborat chiziqli
ro‘yxat yaratilsin va undan ko‘rsatilgan songa teng element o‘chiril-
sin.
Butun sonlarning chiziqli ro‘yxat ko‘rinishidagi dinamik
strukturasi quyidagi maydonlardan tashkil topadi:
struct Zanjir
{
int element;
Zanjir * keyingi;
};
Programma matni:
#include
struct Zanjir { int element; Zanjir * keyingi;};
Zanjir * Element_Joylash(Zanjir *z, int yangi_elam)
{
Zanjir * yangi=new Zanjir;
yangi->element=yangi_elem;
yangi->keyingi=0;
if(z) // ro‘yxat bo‘sh emas
{
Zanjir * temp=z;
while(temp->keyingi)
temp=temp->keyingi;// ro‘yxatning oxirgi elementini
// topish
temp->keyingi=yangi;// yangi elementni ro‘yxat
// oxiriga qo‘shish
}
else z=yangi; // ro‘yxat bo‘sh
return z; // ro‘yxat boshi adresini qaytarish
}
Zanjir * Element_Uchirish(Zanjir * z, int del_elem)
{
if(z)
{
Zanjir * temp=z;
Zanjir * oldingi=0; // joriy elementdan oldingi
// elementga ko‘rsatkich
while (temp)
{
if (temp->element==del_elem)
{
if(oldingi) //o‘chiriladigan element birinchi emas
{
// o‘chiriladigan elementdan oldingi elementni
// keyingi elementga ulash
oldingi->keyingi = temp->keyingi;
delete temp; // elementni o‘chirish
temp=oldingi->keyingi;
}
else
{
// o‘chiriladigan element ro‘yxat boshida
z=z->keyingi;
delete temp;
temp=z;
}
}
else // element o‘chiriladigan songa teng emas
{
oldingi=temp;
temp=temp->keyingi;
}
}
}
return z;
}
void Zanjir_Ekranga(Zanjir * z)
{
cout<<"Zanjir elementlari:"<Zanjir * temp=z;
while(temp)
{
cout<element<<' ';
temp=temp->keyingi;
}
cout<
}
Zanjir * Zanjirni_Uchirish(Zanjir * z)
{
Zanjir * temp=z;
while(z)
{
z=z->keyingi;
delete temp;
}
return z;
}
int main()
{
Zanjir * zanjir=0;
int son, del_element;
do
{
cout<<”\nSonni kiriting (0-jaryon tugatish): “;
cin>>son;
if(son) zanjir=Element_Joylash(zanjir,son);
} while (son);
Zanjir_Ekranga(zanjir);
cout<<"\nO’chiriladigan elementni kiriting: ";
cin>>del_element;
zanjir= Element_Uchirish(zanjir,del_element);
Zanjir_Ekranga(zanjir);
Zanjir = Zanjirni_Uchirish(zanjir);
return 0;
}
Programmaning bosh funksiyasida chiziqli ro‘yxat hosil qilish
uchun Zanjir turidagi zanjir o‘zgaruvchisi aniqlangan bo‘lib, unga bo‘sh
ko‘rsatkich qiymati 0 berilgan (uning ekvivalenti - NULL). Keyin
takrorlash operatori tanasida klaviaturadan butun son o‘qiladi va
Element_Joylash() funksiyasini chaqirish orqali bu son ro‘yxatga
oxiriga qo‘shiladi. Funksiya yangi hosil bo‘lgan ro‘yxat boshining
adresini yana zanjir o‘zgaruvchisiga qaytaradi. Аgar klaviaturadan 0
soni kiritilsa ro‘yxatni hosil qilish jarayoni tugaydi. Faraz
qilaylik quyidagi sonlar ketma-ketligi kiritilgan bo‘lsin:
1,2,3,3,5,0. U holda hosil bo‘lgan ro‘yxat quyidagi ko‘rinishda bo‘ladi
(10.1-rasm):
10.1-rasm. Beshta sondan tashkil topgan chiziqli ro‘yxat
Hosil bo‘lgan ro‘yxatni ko‘rish uchun Zanjir_Ekranga() funksiyasi
chaqiriladi va ekranda ro‘yxat elementlari chop etiladi. Ro‘yxat
ustida amal sifatida berilgan son bilan ustma-ust tushadigan
elementlarni o‘chirish masalasi qaralgan. Buning uchun o‘chiriladigan
son del_element o‘zgaruvchiga o‘qiladi va u Element_Uchirish() funksiya-
si chaqirilishida argument sifatida uzatiladi. Funksiya bu son
bilan ustma-ust tushadigan ro‘yxat elementlarini o‘chiradi (agar
bunday element mavjud bo‘lsa) va o‘zgargan ro‘yxat boshining adresi-
ni zanjir o‘zgaruvchisiga qaytarib beradi. Masalan, ro‘yxatdan 3 soni
bilan ustma-ust tushadigan elementlar o‘chirilgandan keyin u
quyidagi ko‘rinishga ega bo‘ladi (10.2-rasm):
10.2-rasm. Ro‘yxatdan 3 sonini o‘chirilgandan
keyingi ko‘rinish
O‘zgargan ro‘yxat elementlari ekranga chop etiladi. Programma
oxirida, Zanjirni_Uchirish() funksiyasini chaqirish orqali ro‘yxat
uchun dinamik ravishda ajratilgan xotira bo‘shatiladi (garchi bu
ishning programma tugashi paytida bajarilishining ma‘nosi yo‘q).
Dinamik strukturalarda o‘zgartirishlar (ro‘yxatga element
qo‘shish yoki o‘chirish) nisbatan kam amallarda bajarilishi, ular vositasida masalalarni samarali echishning asoslaridan biri
hisoblanadi
XULOSA
Ushbu qidiruv usullarini o‘rganish jarayonida biz tuzilmaning shakliga qarab biror kalitga mos elementni qidirishning optimal usulini qo‘llashni o‘rganishimiz va qidiruv usullarining samaradorligini taqqoslashni o‘rganishimiz mumkin.Kompyuterda ma’lumotlarni qidirish asosiy amallardan biri hisoblanadi. Qidirishdan asosiy maqsad berilgan argument bo‘yicha massiv ma’lumotlari ichidan mazkur argumentga mos ma’lumotlarni topish yoki bunday ma’lumot yo‘qligini aniqlashdan iborat. Ixtiyoriy ma’lumot (yoki tuzilma elementi) boshqa ma’lumotdan biror bir belgisi orqali farq qiladi. Mazkur belgi kalit deb ataladi. Kalit noyob bo‘lishi, ya’ni mazkur kalitga ega ma’lumot jadvalda yagona bo‘lishi mumkin. Bunday noyob kalitga boshlang‘ich (birinchi) kalit deyiladi. Ikkinchi kalit bir jadvalda takrorlansada u orqali ham qidiruvni amalga oshirish mumkin
Bu dasturning eng muhim jihati shundaki buni hayotga tatbiq qilsa bo‘ladi. O‘zi hayotda hamma narsa inson kamoloti uchun qurilishi lozimdur.
Do'stlaringiz bilan baham: |