1-laboratoriya mashg’uloti Statik ma'lumotlar tuzilmalarini o'rganish
Download 40.96 Kb.
|
Laboratoriya topshiriq - 1 (3)
- Bu sahifa navigatsiya:
- Nazariy qism.
- Massivlar .
- To‘plamlar.
- Yozuv va jadvallar
- Ishni bajarishga namuna
- Dastu r kodi
- Nazorat savollari
- Topshiriqlar.
1-laboratoriya mashg’uloti Statik ma'lumotlar tuzilmalarini o'rganish Ishdan maqsad: Statik ma’lumotlar tuzilmasini o‘rganish va ularni tadqiq qilish. Qo‘yilgan masala: C++ tilida statik toifadagi ma’lumotlar tuzilmalarini yaratish va ularga doir misollarning dasturini ishlab chiqish. Ish tartibi: Tajriba ishi nazariy ma’lumotlarini o‘rganish; Berilgan topshiriqning algoritmini ishlab chiqish; C++ dasturlash muhitida dasturni yaratish; Natijalarni tekshirish; Hisobotni tayyorlash va topshirish. Nazariy qism. Ma’lumotlar tuzilmasi (MT)ni quyidagicha tasniflash mumkin. Statik tuzilma deb dastur bajarilishi mobaynida elementlari soni yoki ular orasidagi bog’liqliklari o’zgaruvchan bo’lgan tuzilmaga aytiladi.Statik tuzilmalarni ko’rib chiqamiz. Massivlar.Massiv bu bir xil toifadagi elementlarning tartibli ketma-ketligidir. Massiv bir yoki ikki o’lchovli bo’lishi mumkin. Bir o’lchovli massivlar C++ da quyidagicha e’lon qilinadi: Masalan, int a[12]; Ikki o’lchovli massivlar esa quyidagicha ifodalanadi:
Masalan, int a[2][3]; 1-misol. Massivni elyemyentlarini yig’indisini toping. Misolni yechilishi quyidagicha:
2-misol. Bir o’lchamli n ta elyemyentdan iborat massiv byerilgan. Quyidagilarni bajaring: a) manfiy elyemyentlarning yig’indisini; b) maksimal va minimal qiymatli elyemyentlar orasida joylashgan elyemyentlardan yangi massiv tuzing; v) massiv elyemyentlarini o’sish tartibida joylashtiring. Misolni dasturi: #include using namespace std; int main() { int x,y,n,h,a[1000],min,max; cin >> n; for(int i=0;i cin >> a[i]; int s=0; for(int i=0;i if(s!=0){ cout << "Manfiy elementlar yigindisi:"; cout << endl; cout << s; cout << endl; } else { cout << "Manfiy elementlari yoq;";cout << endl; } min=a[0];x=0; for(int i=0;i if(a[i] x=i; } max=a[0];y=0; for(int i=0;i if(a[i]>max) y=i; } cout << "maksimal va minimal elementlar orasidagi sonlar:"; if(y>x){ for(int i=x+1;i cout << endl; cout << a[i]; } } else { for(int i=y+1;i cout << endl; cout << a[i];} } cout << endl; min=a[0];int m=1; for(int j=0;j { for(int i=m;i if(min>=a[i]){ h=min; min=a[i];a[i]=h; } } a[j]=min; min=a[j+1]; m++;cout < } return 0; } Vektorlar. Vektor bu bir xil toifadagi elementlarning tartibli ketma ketligi bo’lib, massivdan farqi uning o’lchami dastur bajarilishi davomida o’zgarishi mumkin,yani vektor bu dinamik massiv hisoblanadi. Vektorlarni turlicha initsializatsiyalash usullari mavjud: vector const int size = 8; const int value = 1024; vector vector inta[4] = { 0, 1, 1, 2 }; vector vector Vektorlarning massivga nisbatan qulayligi haqida quyidagilarni bayon qilmoqchimiz: Vektorlar bilan ishlash uchun test.at(i) - test[i] kabi yozuv bilan bir xil, faqat bunda agar i-element mavjud bo’lmasa, dastur hatolik ko’rsatmaydi; test.asign(n,m)–vektorga n ta elementni m qiymat bilan yozadi; test.asign(start,end)–boshqa vektorning boshi va oxirini ko’rsatuvchi iteratorlar startdan end gacha bo’lgan elementlarni ushbu vektorga kiritadi; test.front()–1-elementga murojaat; test.back() –oxirgi elementga murojaat; test.begin()–vektor 1-elementi iteratori; test.end()–vektor oxiri iteratori(oxirgi elementidan keying adresni ko’rsatadi); test.clear()–vektorni tozalash; test.erase(i)yokitest.erase(start,end)–i-iterator elementini yoki start va end oralig’idagi elementlarni o’chiradi; test.size()–vektordagi elementlar sonini aniqlaydi; test.swap(test2) - test va test2 vektorlar elementlarini almashtiradi; test.insert(a,b) - test vektoriga iterator ko’rsatayotgan a elementdan oldin b elementni kiritadi, bunda iterator kiritilgan elementni ko’rsatadi; test.insert(a,n,b)– b elementdan n ta kiritadi; test.insert(a,start,end) - start va end iteratorlari oralig’idagi elementlarni a dan oldin kiritadi. begin() va end() iteratorlari mos ravishdaxotirada vektorning birinchi elementini va oxirgi elementidan keyingi adresni ko‘rsatadi.Shu o‘rinda iterator nimaligiga aniqlik kiritsak. Iterator bi birorta o‘zgaruvchiga ko‘rsatkich hisoblanadi. Iterator bizga kerak qiymatlarni qayerdaligini biladi va uning qiymatini bizga chiqarib beradi. Itaratorlar asosan konteynerlar bilan ishlashda qo‘llaniladi. Iterator yaratish uchun quyidagini yozish kerak: iterator_nomi Masalan:vector string::iterator end,cur; Satrlar ham konteyner hisoblanadi. Endi iterator ko‘rsatayotgan element quyidagicha olinadi. cout<<*cur< Bu erda tushunarliki, * belgisi cur iteratorni emas, u ko‘rsatayotgan qiymatni ko‘rsatadi. cur++; // keying elementga o‘tish cur+=10; // <=>cur=cur+10 10 ta elementdan keyinga o‘tish Vektor elementlarinni iterator bilan ekranga chiqarishni ko‘ramiz:
1-misol. Vektor va vektorlar ustida amal bajarish dasturi. #include #include using namespace std; int main() { vector q.push_back(10); q.push_back(11); q.push_back(12); vector for(int i=0; i<5; ++i){ v.push_back(i); } // v vektori elementlari 0 1 2 3 4 std::vector // 2-el.dan oldin 33 ni kiritish: it = v.insert(it, 33); // v vektori elementlari 0 33 1 2 3 4 //q vektor elementlarini v vector 2-el.dan oldin kiritish: v.insert(it, q.begin(), q.end()); // v vektori elementlari 0 10 11 12 33 1 2 3 4 it = v.begin() + 3; // it v vektorning 4-el.ni ko‘rsatyapti // 4-el.dan oldin 3 marta -1ni kiritamiz: v.insert(it, 3, -1); // v vektor el.lari 0 10 11 -1 -1 -1 12 33 1 2 3 4 // v vektorning 5 – el-tini o‘chiramiz it = v.begin() + 4; v.erase(it); // v vektor el.lari 0 10 11 -1 -1 12 33 1 2 3 4 v.clear();//v vektorni o‘chirish return 0; } To‘plamlar. To‘plam bu bir xil toifadagi elementlarning tartibsiz majmuasidir va unda elementlar takrorlanmas bo‘ladi. To‘plam ustida bajariladigan amallar quyidagilar: element kiritish, o‘chirish, elementlar sonini aniqlash, bo‘shlikka tekshirish. To‘plamni C++ da quyidagicha e’lon qilinadi: set for(int i = 1; i <= 100; i++) { s.insert(i); // to‘plamga element kiritish } s.insert(42); // 42 to‘plamda avjudligi sababli hech nima yuz bermaydi for(int i = 2; i <= 100; i += 2) { s.remove(i); // juft sonlarni o‘chiramiz } // set::size() funksiyasi unsigned int toifasida qiymat qaytargani uchun uni int toifasiga o‘giramiz int N = int(s.size()); // N=50 To‘plamda push_back() funksiyasi yo‘q. Chunki unda elementlar tartibsiz va indeks degan tushuncha yo‘q. Shu sababli to‘plam elementlarini iterator bilan chiqarish mumkin. set ... // S to‘plam elementlari yig‘indisini hisoblaymiz intr = 0; for(set r+=(*it); To‘plam bilan ishlashning afzalligi tezlikdir.Ayniqsa, qidiruvda.Set::find() funksiyasi 1 ta argumentga ega va uning qaytaradigan qiymati yoki topilgan elementni ko‘rsatadi, yoki end() iteratoriga teng bo‘ladi. set ... if(s.find(42) != s.end()) { // 42 mavjud } else { // 42 mavjud emas } To‘plamdan elementni o‘chirish uchun erase() funksiyasidan foydalaniladi. set ... s.insert(54); ... s.erase(29); s.erase(s.find(57)); Bu funksiyaning oraliqli ko‘rinishi ham mavjud: set ... set it1 = s.find(10); it2 = s.find(100); if(...) { s.erase(it1, it2); // 10 dan 100 gacha bo‘lgan elementlar //o‘chiriladi(10,100 o‘chirilmaydi) } else { // it2 iteratorni bitta element keying suramiz // set::iterator uchun += operatori qo‘llanilmaydi, lekin ++ va – //ishlatilishi mumkin it2++; s.erase(it1, it2); } To‘plamni e’lon qilishning huddi vektordagi kabi oraliqli konstruktori ham mavjud: int data[5] = { 5, 1, 4, 2, 3 }; set Misol.Matn faylida berilgan so‘zlardan to‘plam xosil qiling.To‘plamdan bironta satrni izlash dasturini tuzing. #include #include #include #include #include using namespace std; int main() { set ifstream f("bas.txt"); copy( istream_iterator istream_iterator inserter(s, s.end()) ); copy( s.begin(), s.end(), ostream_iterator ); string a=""; cin>>a; if(s.find(a)!=s.end()) cout<<"bor"; else cout<<"yo‘q"; system("pause"); } Misol.Satrdagi belgilarning to‘plamga tegishli yoki yo‘qligini aniqlash dasturi. #include #include #include using namespace std; int main() { set for(int i='A';i<='Z';i++) cs.insert(i); string str="A1bZzh2;"; for(int i=0;i if(cs.find(str[i])!=cs.end()) cout< else cout< system("pause"); return 0; } Yozuv va jadvallar. Yozuv bu turli toifadagi ma’lumotlarning tartibli ketma-ketligidir.Yozuv maydonlardan tashkil topadi. Har bir maydon o‘z nomi va o‘z toifasiga ega bolib, ular xotirada ketma-ket joylashadi. Yozuv uchun ajratiladigan xotira hajmi uning maydonlariga ajratilgan xotira hajmlari yig‘indisidan kelib chiqadi. Yozuvlar C++ da quyidagicha e’lon qilinadi. struct Guruh{ int t_r; char fio[30]; float bali; } talaba1, talaba2; Bu erda Guruh nomli nostandart toifa yaratilib, bu toifaga tegishli 2 ta yozuv e’lon qildik. Shu yozuvlarga tegishli maydonlarga murojaat quyidagicha amalga oshiriladi: talaba1.fio=”Ahmad”; talaba2.bali=1.5; Bu erda ko‘rib turganingizdek,Guruh toifasida 2 ta yozuv yaratildi. Agar bu toifaga tegishli massiv yaratiladgan bo‘lsa, yani yozuvlar massividan jadval xosil bo‘ladi. 2 ta yozuvni solishtirishva o‘zlashtirish mumkin, bunda ulaning mos maydonlari solishtiriladi yoki o‘zlashtiriladi va maydonlarni alohida yozib ko‘rsatish shart emas. Misol. 2 ta ishchilar ma’lumotlaridan iborat jadval berilgan.Har ikkala jadvalda ismlari takrorlangan ishchilardan yangi jadval hosil qiling.
Berilgan topshiriq variantlariga o‘xshash bo‘lgan bitta masalani bajarib ko‘ramiz. Quyidagicha masala qo‘yilgan: Berilgan familiyalardan imlo qoidasiga mos ravishda ismlar hosil qiling. Algoritm Familiya kiritilishini so‘rash. Kiritilgan familiya uzunligini o‘lchash. Familiya oxirgi va oxiridan 1 ta oldingi simvolini tekshirish, ya’ni familiya oxiri “ev” bilan tugasa, satrning oxirgi 3 ta simvolini o‘chirish va 7-qadamga o‘tish, aks holda 4-qadamga o‘tish. Familiya oxirgi va oxiridan 1 ta oldingi simvolini tekshirish, ya’ni familiya oxiri “ov” bilan tugasa, satrning oxirgi 2 ta simvolini o‘chirish va 7-qadamga o‘tish, aks holda 5-qadamga o‘tish. Familiya oxirgi va oxiridan 2 ta oldingi simvolini tekshirish, ya’ni familiya oxiri “eva” bilan tugasa, satrning oxirgi 4 ta simvolini o‘chirish va 7-qadamga o‘tish, aks holda 6 qadamga o‘tish. Familiya oxirgi va oxiridan 2 ta oldingi simvolini tekshirish, ya’ni familiya oxiri “ova” bilan tugasa, satrning oxirgi 3 ta simvolini o‘chirish va 7-qadamga o‘tish. Hosil bo‘lgan ismni ekranga chiqarish. Talabalar algoritmni so‘z bilan yoki blok-sxema ko‘rinishida ifodalashlari mumkin. Dastur kodi: #include #include using namespace std; int main(){ int l; char a[100]; cout << " Familiyani kiriting: "; gets(a); l=strlen(a); if(a[l-1] ==‘v' && a[l-2] ==‘e'){ l = l-3; } if(a[l-1] ==‘v' && a[l-2] ==‘o‘){ l = l-2; } if(a[l-1] ==‘a' && a[l-3] ==‘e'){ l = l-4; } if(a[l-1] ==‘a' && a[l-3] ==‘o‘){ l = l-3; } cout << "\n Natija: \n "; for(int i = 0; i < l; i++) cout< getch(); } Nazorat savollari Statik malumotlar tuzilmalari qanday tuzilmalar? Statik ma’lumotlar tuzilmalariga qanday tuzilmalar kiradi? Struct va vector toifalarini tushuntiring. Class va massivlar qanday e’lon qilinadi? To‘plamlar qanday tuzilma? Topshiriqlar. Variantlar: Berilgan sonlar ketma-ketligidagi maksimal va minimal elementlarning o‘rnini almashtiring. Berilgan sonlar ketma-ketligidagi har bir elementni o‘zi, o‘zidan oldingi va o‘zidan keyingi element bilan yig‘indisiga almashtiring. k-darajagacha bo‘lgan Nyuton binomi sonlaridan vektor hosil qiling. Nyuton binomi sonlari quyidagicha aniqlanadi. 1 1 1 2 1 2 1 3 3 1 3 1 4 6 4 1 … 1 5 10 10 5 1 k nxn matritsaning yuqori chap uchburchagidagi elementlaridan vektor hosil qiling nxn matritsaning yuqori o‘ng uchburchagidagi elementlaridan vektor hosil qiling nxn matritsaning pastki o‘ng uchburchagidagi elementlaridan vektor hosil qiling nxn matritsaning pastki chap uchburchagidagi elementlaridan vektor hosil qiling Matritsani matritsaga ko‘paytiring Jadval hosil qiling va unga ma’lumotlarni kiriting, ekranga chiqaring. Talabalar ism-familiyasi, yoshi va ballaridan iborat jadval yarating va talabalarni ism-familiyasini alfavit bo‘yicha tartibga keltiring. 10-variantdagi jadvaldan bali bo‘yicha eng katta va eng kichik talabalarning o‘rnini almashtiring 2 ta bir xil tipdagi jadval berilgan. Ikkala jadvalni o‘zaro solishtiring va aynan bir xil bo‘lgan yozuvlarni o‘chiring. Birlashma tipidagi (tipda 2 ta element e’lon qiling) 2 ta o‘zgaruvchini bir-biridan farqli elementlariga qiymat bering va ularning yig‘indisini ikkala o‘zgaruvchining qiymat berilmagan elementlariga o‘zlashtiring. Har ikkala o‘zgaruvchining barcha elementlarini ekranga chiqaring va natijani tushuntiring. Avtomobil nomli klass yarating va unda turli o‘zgaruvchi va funksiyalar yarating. Ushbu klassdan foydalanib, turli markali avtomobillar uchun o‘zgaruvchilarni yaratib, ular haqida ma’lumotlar kiritib, ekranga chiqaring. Berilgan matnli fayldan simvollarni o‘qib, ekranga chiqaring va raqamlarni ajratib ko‘rsating. Berilgan matnli faylda a harfi necha marta qatnashganini sanang. Berilgan matnli fayldagi satrlar sonini aniqlang. Talabalar ism-familiyasi, yoshi va ballari maydonidan iborat klass yarating va talabalar ro‘yhatini tuzing. So‘ralayotgan talaba ro‘yhatda bor yo‘qligini aniqlang. Oy nomlaridan iborat sanaladigan toifa yarating. So‘ralayotgan oy qaysi faslga tegishliligini aniqlang. Mahsulot nomlaridan iborat elementlar va ularning qiymati sifatida narxlari kiritilgan sanaladigan toifa yarating. So‘ralayotgan narxda qanday mahsulot yoki mahsulotlar to‘plamini xarid qilsa bo‘ladi, shuni aniqlash dasturini tuzing. Kiritilgan ismning harflarini alfavit bo‘yicha tartibga keltiring. Satrli toifadagi vektor berilgan. Bir xil qiymatdagi elementlarni aniqlang, ekranga chiqaring. Berilgan ismlardan imlo qoidasiga mos ravishda familiyalar hosil qiling. Berilgan satrda nechta undosh harflar borligini aniqlang. Berilgan satrdagi sonlar yig‘indisini aniqlang. F faylda berilgan satr necha marta uchrashini aniqlang. G fayldan nusxa ko‘chiring. F fayldan matritsa hosil qiling, ya’ni fayldagi har bir qator matritsaning satri va qatordagi’#’ belgisi bilan ajratilgan satrlar ustunlar qilib belgilansin. Matritsaning juft va toq elementlaridan 2 ta vektor hosil qiling. Massivdagi tub sonlarni va indekslarini ekranga chiqaring. Download 40.96 Kb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling