Файл: Ozbekiston respublikasi oliy va orta maxsus talim vazirligi navoiy davlat pedagogika instituti.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 08.11.2023
Просмотров: 336
Скачиваний: 8
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
1.2-§. O‘zgaruvchi va o‘zgarmas tipli kattaliklar
1.3-§. Dasturlash operatorlari
II BOB. BOSHQARUV OPERATORLARI
2.1-§. C++ dasturlash tilida shartli operatorlar
2.2-§. C++ dasturlash tilida takrorlanuvchi jarayonlar
2.3-§. C++ dasturlash tilida funksiyalar
2.4-§. C++ dasturlash tilida massivlar
2.3-§. C++ dasturlash tilida funksiyalar
Dasturlashni o‘rganishni boshlaganlar ko‘pincha quyidagi savolga duch keladi: “Dasturni funksiyalarsiz bajarish va barcha kodlarni to‘g‘ridan-to‘g‘ri main() funksiyasiga kiritish mumkinmi?” Agar uncha katta bo‘lmagan dastur kodi ustida amallar bajarilsa, main() funksiyasi yetarli hisoblanadi. Funksiyalarning asosiy vazifasi murakkab ko‘p satrli dasturlarning dastur kodini yozishni soddalashtirishdir.
Dasturning hajmi va murakkabligi oshib borishi bilan, barcha kodlarni main() funksiyasi ichida saqlash qiyinlashadi. Shu bois, ushbu muammolarni bajarishda funksiyalardan foydalaniladi. Funksiya asosiy dasturdan alohida bo‘lgan mini-dastur ko‘rinishida yoziladi. Funksiya murakkab vazifalarni kichikroq va sodda vazifalarga ajratishga imkon beradi, bu dasturning umumiy murakkabligini keskin pasaytiradi va hisoblash vaqtini qisqartiradi.
Funsiyalar haqida tushuncha va ularni yaratish
Dasturlash amaliyotida, ma’lum bir maqsadni amalga oshiradigan bir xil operatorlar guruhi ishtirok etgan ko‘p hollarida, dasturning ba’zi bir qismlarida o‘zgarishsiz takrorlash zarur bo‘lgan vaziyatlarga duch kelinadi. Bu holatlarda ortiqcha dastur kodi yozishdan voz kechish uchun qismdasturlar taklif etiladi.
Qismdastur – bu dasturning turli qismida bir necha marotaba qo`llash mumkin bo`lgan til birikmalari guruhidir.
Funksiya – bu ma’lum bir vazifani bajaradigan tavsif va operatorlarning nomlangan to‘plamidir. Funksiya parametrlarni qabul qilishi va hisoblashning natijaviy qiymatini berishi mumkin. Funksiyaga ishlov berish uchun berilgan ma’lumot uning parametri, funksiyani hisoblash natijasi esa uning qiymati deyiladi. Ma’lumki, C ++ dasturi bir yoki bir nechta funksiyalardan tashkil topadi. Dastur ishga tushgach, avval asosiy funksiya bajariladi. Agar funksiyaga murojaat asosiy funksiyaning operatorlari orasida ishlatilsa, u holda boshqarish funksiyani operatorlariga o‘tkaziladi. Funksiyaning barcha operatorlari bajarilgandan so‘ng, boshqaruv funksiyaga murojaat qilingandai so`ngi operatorga o`tkaziladi.
Funksiyaga murojaat qilishda avval, uni e’lon qilish lozim. Funksiya e’loni sarlavha va uning tanasidan iborat bo‘ladi. Ya’ni:
funksiya_tipi funksiya_nomi (o‘zgaruvchilar ro‘yxati)
{
funksiya_tanasi
}
Funksiya sarlavhasi quyidagilarni o‘z ichiga oladi:
– funksiya_tipi – funksiya o‘zlashtiradigan qiymat turi. Agar funksiya hech qanday qiymatni o‘zlashtirmasa, void tipi ko‘rsatiladi;
– funksiya_nomi – foydalanuvchi tomonidan funksiyaga beriladigan nom, ixtiyoriy identifikator;
– o‘zgaruvchilar ro‘yxati – funksiyaga berilgan, bir-biridan vergul bilan ajratilgan qiymatlar ro‘yxati (argumentlar). Ro‘yxatdagi har bir o‘zgaruvchining turi va nomi ko‘rsatiladi. Agar funksiyaning argumentlari bo‘lmasa, u holda void tipi ko‘rsatiladi yoki qavs ichida hech bir operator yozilmaydi;
– funksiya tanasi – bu { } qavslar ichiga olingan tavsif va operatorlar ketma-ketligidir.
Umumiy holda, C++ dasturlash tilining funksiyalarini tuzilishi quyidagi ko‘rinishda bo‘ladi:
kompilyator ko‘rsatmalari
funksiya_tipi 1_funksiya (o‘zgaruvchilar ro‘yxati)
{
1_funksiya_tanasi;
}
funksiya_tipi 2_funksiya (o‘zgaruvchilar ro‘yxati)
{
2_funksiya_tanasi;
}
…
funksiya_tipi n_funksiya (o‘zgaruvchilar ro‘yxati)
{
n_funksiya_tanasi;
}
int main(o‘zgaruvchilar ro‘yxati)
{
asosiy_funksiya_tanasi;
// bu yerda 1_funksiya, 2_funksiya, ... n_funksiya larni chaqirish uchun operatorlar bo‘lishi mumkin.
}
Shu bilan birga, dastur kodini yozishning quyidagi shakli ham mavjud:
kompilyator ko‘rsatmalari
funksiya_tipi 1_funksiya (o‘zgaruvchilar ro‘yxati);
funksiya_tipi 2_funksiya (o‘zgaruvchilar ro‘yxati);
...
funksiya_tipi n_funksiya (o‘zgaruvchilar ro‘yxati);
int main(o‘zgaruvchilar ro‘yxati)
{
asosiy_funksiya_tanasi;
// bu yerda 1_funksiya, 2_funksiya, ... n_funksiya larni chaqirish uchun operatorlar bo‘lishi mumkin.
}
funksiya_tipi 1_funksiya (o‘zgaruvchilar ro‘yxati)
{
1_funksiya_tanasi;
}
funksiya_tipi 2_funksiya (o‘zgaruvchilar ro‘yxati)
{
2_funksiya_tanasi;
}
…
funksiya_tipi n_funksiya (o‘zgaruvchilar ro‘yxati)
{
n_funksiya_tanasi;
}
Yuqorida keltirilgan funksiyalar main() funksiyasidan keyin tavsiflangan. Bunda barcha funksiyalarning sarlavhalari main() funksiyasidan oldin yoziladi. Ushbu ko‘rinishda sarlavhalarni oldindan yozish, funksiya prototiplari deb nomlanadi. Prototip kompilyatorga funksiya o‘zlashtiradigan qiymat turini, argument sifatida foydalaniladigan o‘zgaruvchilar turini va ularning tartibini ko‘rsatib beradi. Prototiplar asosiy dasturda funksiyalarning to‘g‘ri chaqirilishini tekshirish uchun ishlatiladi.
Funksiya prototipida ko‘rsatilgan o‘zgaruvchilarning nomlarini kompilyator e’tiborsiz qoldiradi:
// ushbu yozuvlar teng kuchlidir
int func ( int a , int b);
int func ( int , int );
Funksiya dasturning istalgan qismida chaqirilishi mumkin. Buning uchun uning nomi ko‘rsatiladi va agar argumentlari mavjud bo‘lsa, qiymatlari qavs ichida vergul bilan ajratib yoziladi. Funksiyani chaqirish umumiy holda quyidagicha bo`ladi:
funksiya_nomi (o‘zgaruvchilar ro‘yxati);
Funksiyaga oid quyidagi misolni ko`rib chiqamiz.
1-misol. Argumentlari bo‘lmagan va hech qanday qiymat o‘zlashtirmaydigan funk() funksiyasi yaratilsin. Ushbu funksiya chaqirilganda, ekranda "Navro‘zi olam muborak" jumlasi paydo bo‘lsin.
#include
using namespace std ;
void funk () //funksiyasi tavsiflash
{
cout << "Navro‘zi olam Muborak, " ;
}
int main()
{
funk () ; // Funksiyani chaqirish.
cout <<"talabalar! " << endl ;
funk () ; // Funksiyani chaqirish.
cout <<"ustozlar! " << endl ;
}
Ushbu dastur bajarilishi natijasida quyidagi ikkita satr paydo bo‘ladi:
Navro‘zi olam Muborak, talabalar!
Navro‘zi olam Muborak, ustozlar!
Funksiya tanasida tavsiflangan o‘zgaruvchilar va argumentlar ro‘yxatidagi o‘zgaruvchilar lokal hisoblanadi. Masalan, agar dastur beshta turli funksiyalardan iborat bo‘lib, bu funksiyalarda bir xil N o‘zgaruvchi tavfislangan bo‘lsa, u holda C ++ dasturlash tili uchun bular besh xil o‘zgaruvchilar hisoblanadi. Lokal o‘zgaruvchilarning qiymatlari faqat funksiya tanasida saqlab qolinadi. Bitta funksiyaga takroran qayta murojaatlar o‘rtasida lokal o‘zgaruvchilarning qiymatlari saqlanib qolmaydi. Barcha funksiyalardan oldin e’lon qilingan va ixtiyoriy funksiyada foydalanish mumkin bo‘lgan o‘zgaruvchilar global deb nomlanadi. Agar global o‘zgaruvchi bilan bir xil nomdagi lokal o‘zgaruvchi e’lon qilinmagan bo‘lsa, funksiyalarda global o‘zgaruvchini ajratish mumkin.
Ma’lumotlarni funksiyalar o‘rtasida uzatish uchun global o‘zgaruvchilar ishlatiladi, ammo bu dasturni ishlash tezligini sekinlashtiradi. Funksiyalar o‘rtasida ma’lumot almashish uchun funksiya o‘zlashtiradigan qiymatlar va parametrlardan foydalaniladi.
Funksiya parametrlari
Murojaat qilinayotgan va murojaat qiluvchi funksiyalar o‘rtasida, ma’lumot almashinish jarayoni, parametrlarni uzatish mexanizmi yordamida amalga oshiriladi. Funksiya sarlavhasida yozilgan o‘zgaruvchilar ro‘yxati rasmiy (formal) parametrlar yoki shunchaki funksiya parametrlari deb ataladi. Funksiyani chaqirish operatoridagi o‘zgaruvchilar ro‘yxati – bu haqiqiy parametrlar yoki argumentlar deyiladi.
Parametrlarni uzatish mexanizmi, rasmiy va haqiqiy parametrlarga almashtirishni hamda funksiyani har xil qiymatlar bilan bajarilishini ta’minlaydi.
Funksiyani chaqirish operatoridagi parametrlar va funksiya sarlavhasidagi parametrlar o‘rtasida birma-bir mosliklar tekshiriladi. Bunda rasmiy va haqiqiy parametrlarning soni, turlari va tartibi bir xil bo‘lishi lozim.
Funksiyalarda parametrlar quyidagi tartibda uzatiladi: 1. Haqiqiy parametrlar o‘rnida bo‘lgan ifodalar aniqlanadi; 2. Xotirada rasmiy parametrlar uchun ularning tipiga mos bo‘lgan joy ajratiladi; 3. Rasmiy parametrlarga haqiqiy qiymatlar beriladi; 4. Tiplar mosligi tekshiriladi va agar lozim bo‘lsa konvertatsiya qilinadi.
Parametrlar funksiyaga qiymat va manzil bo‘yicha ham uzatilishi mumkin. Ma’lumotlarni qiymat bo‘yicha uzatishda funksiya haqiqiy parametrlarning nusxalari bilan ishlaydi va u argumentlarning joriy qiymatlariga kirish huquqiga ega bo‘lmaydi.
Ma’lumotlarni manzil bo‘yicha uzatishda funksiyaga o‘zgaruvchilar emas, balki uning manzili uzatiladi. Bunda funksiya argumentlarning qiymatlari saqlanadigan xotira katakchalariga kirish huquqiga ega bo‘ladi.
Funksiya manzil bo‘yicha uzatilgan ma’lumotlardan farqli ravishda, qiymat bo‘yicha uzatilgan ma’lumotlarni o‘zgartira olmaydi.
Agar funksiya ichidagi parametrni o‘zgartirishni taqiqlash talab etilsa, const xizmatchi so‘zidan foydalaniladi. Funksiya sarlavhasi umumiy holda quyidagicha yoziladi:
funksiya_tipi funksiya_nomi (const o‘zgaruvchi_tipi* o‘zgaruvchi_nomi, ...)
Masalan:
#include
using namespace std ;
int funk1 ( int i ) //ma’lumotlar qiymat bo‘yicha uzatiladi
{ return( i++);
}
int funk2 ( int∗ j ) // ma’lumotlar manzil bo‘yicha uzatiladi. Bunda * yo‘naltirish amalidan foydalaniladi
{ return((∗ j )++);
}
int funk3 (const int∗ k) // parametr qiymati o‘zgartirilmaydi
{ return((∗k)++);
}
int main()
{
int a ; cout<<"a=" ; cin>>a ;
funk1 (a) ; cout<<"a="<
funk2(&a) ; //manzil olish & amalidan foydalaniladi
cout<<"a="<
funk3(&a) ; cout<<"a="<
return 0;
}
Ushbu dastur kodida quyidagi natijalar paydo bo‘ladi:
a=5
a=5
a=6
a=6
Agar funksiyaga murojaat qiluvchi dasturdagi o‘zgaruvchilar qiymatlarini o‘zgartirish talab etilsa, ma’lumotlarni manzil bo‘yicha uzatish qulay hisoblanadi.
Funksiyaga qiymat o‘zlashtirish
Funksiyaga natijaviy qiymatni o‘zlashtirish uchun return operatoridan foydalaniladi. Operator quyidagicha ishlaydi: return operatoridan keyin yozilgan ifodaning qiymati funksiya o‘zlashtiradigan qiymat tipiga aylantiriladi.
Funksiya ishini yakunlaydi va natijaviy qiymat chaqiriluvchi funksiyasiga o‘zlashtiriladi. Funksiyadagi return operatoridan keyin yozilgan har qanday operatorlar e’tiborga olinmaydi. Dastur joriy funksiyaga murojaat qilgan operatordan keyingi operator bilan o‘z ishini davom ettiradi. return operatori void tipidagi funksiyalarda qo‘llanilmaydi. Shuningek, ishlash algoritmi talabidan kelib chiqib, funksiyada bir nechta return operatoridan foydalanish ham mumkin.
2-misol. Kvadrat tenglamaning ildizlari sonini aniqlaydigan IldizSoni(a,b,c) butun tipli funksiya tasvirlansin(a, b, c- haqiqiy parametr, a≠0).
Ushbu misolning dastur kodi quyidagicha:
#include
using namespace std;
int IldizSoni(float a, float b, float c){
if (a==0) {
cout<<"a parametr noldan farli son bo‘lishi zarur!\n";
return 0; }
else{
float d=b*b-4*a*c;
if (d<0) { cout<<"Haqiqiy yechim yo‘q "; return 0; }
else
if (d==0) return 1;
else return 2;
}
}
int main() {
float a,b,c;
cout<<"a= "; cin>>a;
cout<<"b= "; cin>>b;
cout<<"c= "; cin>>c;
cout<< IldizSoni(a,b,c);
}
Yuqorida bayon etilgan fikrlarni tekshirib ko‘rish uchun C++ dasturlash tilida funksiyalarga doir bir nechta misollarni ko‘rib o‘tamiz.
3-misol. r radiusli doiraning yuzasini hisoblovchi haqiqiy tipli DoiraS(r) funksiya tasvirlansin. Bu funksiyadan foydalanib, berilgan r radiusli doiraning yuzasini hisoblash dasturi.
Berilgan masalaning dastur kodi quyidagicha:
#include
#include
using namespace std;
float DoiraS(float r){
float s=M_PI*r*r;
return s;
}
int main(){
float r;
cout<<"r= "; cin>>r;
cout<< DoiraS(r);
}
4-misol. Berilgan n (n>1) parametr tub son bo‘lsa true, aks holda false qiymat qaytaruvchi mantiqiy tipli tub(n) funksiyasi tasvirlansin. Bu funksiyadan foydalanib, berilgan 5 ta sonning tub yoki tub emasligini aniqlash dasturi.
Berilgan masalaning dastur kodi quyidagicha:
#include
using namespace std;
bool tub(int n){
int k=0;
for(int i=1; i<=n; i++)
if (n%i==0) k++;
if (k==2) return true;
else return false;
}
int main(){
int n;
for (int i=1; i<=5; i++) {
cout<<"n= "; cin>>n;
if (tub(n)) cout<
else cout<
}
}
5-misol. n faktorialni hisoblovchi haqiqiy tipli Fact(n) funksiyasi tasvirlansin. Bu funksiyadan foydalanib, berilgan 5 ta butun musbat sonning har biri uchun faktoriallarni hisoblash dasturi.
Berilgan masalaning dastur kodi quyidagicha:
#include
using namespace std;
double Fact(int n){
double p=1;
for(int i=1; i<=n; i++)
p*=i;
return p;
}
int main(){
unsigned int n;
for (int i=1; i<=5; i++){
cout<<"n= "; cin>>n;
cout<
}
}
6-misol. Agar burchak o‘lchovi gradusda berilgan bo‘lsa, uni radianda ifodalovchi haqiqiy tipli Almashtirish(d) funksiyasi tasvirlansin (d haqiqiy son 0
Berilgan masalaning dastur kodi quyidagicha:
#include
#include
using namespace std;
float Almashtirish(float d){
float g=d*M_PI/180;
return g;
}
int main(){
float g;
for(int i=1; i<=4; i++) {
cout<<"g= "; cin>>g;
cout<
}
}
7-misol. Berilgan k butun musbat sonining raqamlarini teskari tartibga almashtiruvchi, butun tipli TeskariTartib(k) funksiyasi tasvirlansin (k butun tipli parametr). Bu funksiyadan foydalanib, berilgan 5 ta butun musbat sonning har birining raqamlari joylashish tartibi teskarisiga almashtirish dasturi.
Berilgan masalaning dastur kodi quyidagicha:
#include
using namespace std;
int TeskariTartib(int k){
int x=0;
while (k>0){
x=10*x+k%10;
k=k/10;
}
return x;
}
int main(){
int a;
for (int i=1; i<=5; i++){
cin>>a;
cout<< TeskariTartib(a)<
}
}
8-misol. Berilgan butun k(k>0) parametr, biror butun sonning kvadratiga teng bo‘lsa true aks holda false qiymat qaytaruvchi mantiqiy tipli IsSquare(k) funksiyasi tasvirlansin. Bu funksiyadan foydalanib, berilgan 10 ta butun sondan iborat to‘plamdagi to‘la kvadrat bo‘lgan sonlar miqdorini aniqlash dasturi.
Berilgan masalaning dastur kodi quyidagicha:
#include
#include
using namespace std;
bool IsSquare(int k){
float z=sqrt(k);
if (z-floor(z)==0) return true;
else return false;
}
int main(){
int a,x=0;
for(int i=1; i<=10; i++){
cin>>a;
if (IsSquare(a)) x++;
}
cout<
}
9-misol. Butun k parametr palindrom bo‘lsa true aks holda false qiymat o‘zlashtiradigan mantiqiy tipli palindrom(k) funksiyasi tasvirlansin. (Palindrom son – o‘ng va chapdan bir xil o‘qiladigan sondir). Bu funksiyadan foydalanib, berilgan sonning palindrom yoki polindrom emasligi aniqlash dasturi.
Berilgan masalaning dastur kodi quyidagicha:
#include
#include
using namespace std;
bool palindrom(int k){
int x=0, y=k;
while(k>0){
x=x*10+k%10;
k=k/10;
}
if (x==y) return true;
else return false;
}
int main(){
int a;
cin>>a;
if (palindrom(a)) cout<<"Palindrom ";
else cout<<"Palindrom emas ";
}
Mustaqil bajarish uchun topshiriqlar
1. Kvadrat tenglamaning ildizlari sonini aniqlaydigan RootsCount(a,b,c) butun tipli funksiya tasvirlansin (a, b, c- haqiqiy parametr a≠0). Bu funksiyadan foydalanib, berilgan 5 ta kvadrat tenglamaning har biri uchun ildizlari sonini aniqlash dasturini tuzing.
2. Ikkita r1, r2 (r1>r2) radiusli markazlari umumiy aylanalar bilan chegaralangan xalqa yuzasini hisoblovchi haqiqiy tipli RingS(r1, r2) funksiyasi tasvirlansin (r1 va r2 haqiqiy). Bu funksiyadan foydalanib ichki va tashqi radiuslari berilgan 4 ta xalqaning har biri uchun yuzalarni hisoblash dasturini tuzing.
3. Nol bo‘lmagan haqiqiy a va b sonlari ustida 1 ta arifmetik amal bajaruvchi haqiqiy tipli Calc(a,b,op) funksiyasi tasvirlansin. Bu yerda op parametri 1 bo‘lsa “ayirish”, 2 bo‘lsa “ko‘paytirish”, 3 bo‘lsa “bo‘lish’, boshqa hollarda “qo‘shish” amaliga ekvivalent hisoblanadi. Bu funksiyadan foydalanib, berilgan a va b sonlari uchun k1, k2, k3, k4 amallardagi qiymatlarni chop etish dasturini tuzing.
4. Koordinata boshida yotmaydigan (tekislikdagi) nuqtaning qaysi chorakda joylashganligini aniqlovchi butun tipli chorak(x,y) funksiyasi tasvirlansin. Bu funksiyadan foydalanib, berilgan 4 ta koordinata boshida yotmaydigan nuqtalarning qaysi choraklarda joylashganligini aniqlash dasturini tuzing.
5. Berilgan butun k (k>0) parametr, 5 ning biror darajasiga teng bo‘lsa true aks holda false qiymatini beruvchi mantiqiy tipli IsPowerS(k) funksiyasi tasvirlansin. Bu funksiyadan foydalanib, berilgan 10 ta butun sonlar ichida 5 ning darajalariga teng bo‘lganlari miqdorini topish dasturini tuzing.
6. Berilgan k butun musbat sondagi raqamlar miqdorini aniqlovchi butun tipli raqam_soni(k) funksiyasi tasvirlansin. Bu funksiyadan foydalanib, berilgan 10 ta musbat butun sonning har biri uchun raqamlari sonini aniqlash dasturini tuzing.
7. n!! ni hisoblovchi haqiqiy tipli Fact2(n) funksiyasi tasvirlansin. n !! bu
agar n toq bo‘lsa n !! = 1⋅3⋅ 5 ⋅...⋅ n
agar n juft bo‘lsa n !! = 2 ⋅ 4 ⋅ 6 ⋅...⋅ n
Bu funksiyadan foydalanib, berilgan 10 ta butun musbat sonlarning har biri uchun n !! larni hisoblash dasturini tuzing.
8. t berilgan yil kabisa bo‘lsa true aks holda false qiymat beruvchi mantiqiy tipli Kabisa(y) funksiyasi tasvirlansin. Bu funksiyadan foydalanib, berilgan 5 ta turli butun musbat qiymatlarda funksiyaning qiymatlarini chop etish dasturini tuzing.
9. Berilgan yilning m-oyi uchun Kabisa funksiyasidan foydalanib kunlar sonini hisoblovchi butun tipli Kunlar(m,y) funksiyasi tasvirlansin. Bu funksiyadan foydalanib, berilgan 4 ta turli butun musbat qiymatlar uchun funksiyaning qiymatini chop etish dasturini tuzing.
10. n butun soni va a haqiqiy son berilganda an ni
a0=1
an = a⋅ a ⋅...⋅ a (n marta) agar n>0
(|n| marta) agar n<0
formula asosida hisoblaydigan butun tipli Daraja1(a,n) funksiyasi tasvirlansin. Bu funksiyadan foydalanib, a, k, l, m sonlari berilganda ak, al, am larning qiymatini hisoblash dasturini tuzing.
1 2 3 4 5 6 7 8 9 10 11
2.4-§. C++ dasturlash tilida massivlar
Massivlar haqida tushuncha
Massiv – bu bitta nom ostida birlashtirilgan, bir xil tipdagi elementlar guruhi sifatida taqdim etilgan ma’lumotlar to‘plamidir.
Bir xil turdagi, katta hajmdagi ma’lumotlarni qayta ishlashda massivlardan foydalanish qulay hisoblanadi. Massiv ma’lumotlarining bitta yacheykasi massiv elementi deyiladi. Massiv elementlari har qanday turdagi ma’lumotlar bo‘lishi mumkin (Butun yoki haqiqiy sonlar, satrlar, sanalar va boshqalar). Massivlar bir yoki bir nechta o‘lchovlarga ega bo‘lishi mumkin, ya’ni bir o‘lchovli, ikki o‘lchovli, uch o‘lchovli va n o‘lchovli massivlarga bo‘linadi. Dasturlashda ko‘pincha bir o‘lchovli va ikki o‘lchovli massivlardan foydalaniladi. Ushbu mavzuda biz bir va ikki o`lchovli massivlar bilan ishlashni ko‘rib chiqamiz.
Massivlarni tavsiflash va ulardan foydalanish
7 - jadvalda 8 ta elementdan iborat bo`lgan haqiqiy qiymatlar keltirilgan. Ushbu jadvaldagi ma’lumotlar bir o`lchovli massivga misol bo`ladi. Massivning ma’lum bir elementida saqlangan ma’lumotlariga massiv nomini va indeksi yordamida murojaat qilinadi.
7-jadval.
Bir o‘lchovli massiv
Tartib raqam | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
qiymat | 8.21 | -0.52 | 6.71 | 1.09 | -21.76 | 7.07 | 3.13 | -15.11 |
Agar massivni tavsiflashda uning o‘lchami aniq berilsa, u holda massiv statik deb nomlanadi. Quyida C ++ dasturlash tilidagi bir o‘lchovli statik massivlar bilan tanishib chiqamiz.
Bir o‘lchovli massivlar
Bir o‘lchamli massivni e’lon qilish quyidagi ko‘rinishda yoziladi:
Quyida massivlarni e’lon qilishga oid bir necha misollar keltirilgan:
1) float jadval[7]; // 7 ta haqiqiy elementli massiv;
2) int vektor[6]; // 6 ta butun sonli massiv;
3) bool ab[15]; // 15 ta mantiqiy elementli massiv.
Massiv o‘lchami va uning elementlari tipi massivni saqlash uchun zarur bo‘lgan xotira hajmini aniqlaydi. Massivni tavsiflashning yana bir usulini ko‘rib chiqamiz:
const int k=15; // Butun sonli o‘zgarmasni e’lon qilish;
double A[k]; // 15 ta haqiqiy sonli massiv;
Statik massivni tavsiflashda o‘lchov sifatida musbat butun sondan yoki oldindan belgilangan o‘zgarmasdan foydalanish mumkin.
C ++ dasturlash tilidagi massiv elementlari noldan raqamlangan. Birinchi element har doim nol indeksga ega va oxirgi element indeksi, uning tavsifida ko‘rsatilgan o‘lchovdan bitta kam bo‘ladi:
char z[4]; // bunda 4 ta belgili massiv, elementlari 0 dan 3 gacha raqamlangan.
Massiv elementlariga murojaat qilish oddiy o‘zgaruvchilarga murojaat qilishdan biroz farqli bo’lgan jihati mavjud. Massiv elementiga murojaat qilish, uning indeksi orqali amalga oshiriladi. Masalan:
max[1] = 20; // max massivning 1- elementi 20 qiymat o‘zlashtirish;
max[2] = min[3]; // max massivni 2- elementiga min massivning 3-elementini o‘zlashtirish;
max[5] > min[6]; // max massivni 5- elementi bilan min massivning 6-elementini taqqoslash;
Massivni e’lon qilishda, uning elementlariga boshlang‘ich qiymat berish mumkin va buni bir nechta usullari mavjud.
1) O‘lchami ko‘rsatilgan massivni to‘liq e’lon qilish:
int a[4] = { 5, 6, 7, 8};
Bu yerda 4 ta elementdan iborat bo‘lgan a massivi e’lon qilingan va massivning barcha elementlariga boshlang‘ich qiymat berilgan.
2) O‘lchami ko‘rsatilgan massivni to‘liqmas e’lon qilish:
int b[6] = { 7, 5, 3 };
Bu yerda 6 ta elementdan iborat bo‘lgan b massivi e’lon qilingan va massivning dastlabki 3 ta elementlariga boshlang‘ich qiymat berilgan.
3) O‘lchami ko‘rsatilmagan massivni to‘liq e’lon qilish:
int x[] = { 5, 3, 2, 1, 8, 0};
Agar massiv o‘lchami ko‘rsatilmasa, uni to‘liq e’lon qilish talab etiladi. Bu holda massiv o‘lchami kompilyatsiya jarayonida elementlari soniga qarab aniqlanadi. Bunda massivning o‘lchami 6 ga teng bo‘ladi.
4) O‘lchami ko‘rsatilgan massivning barcha elementlariga boshlang‘ich qiymatda 0 berish: int y[4] = { 0 };
Bir o‘lchamli massivlar uchun ishlatilgan o‘zgaruvchilar bir хil tipdagi berilganlarni хotirada saqlashda foydalaniladi.
Yuqorida bayon qilingan fikrlarni tekshirib ko‘rish uchun C++ dasturlash tilida bir nechta dasturlarni ko‘rib o‘tamiz.
1-misol. n (n>0) butun son berilgan. Dastlabki n ta musbat juft sonlarni saqlaydigan n o‘lchamli butun sonli massiv tashkil etish dasturi.
Berilgan masalaning dastur kodi quyidagicha:
#include
using namespace std;
int main(){
int n; cout<<"n = "; cin>>n;
int a[n];
for(int i=0,k=2; i<=n; i++,k+=2)
a[i]=k;
for(int i=0; i
cout<
}
2-misol. Butun n (n>1) soni, arifmetik progressiyaning birinchi hadi a va uning ayirmasi d berilgan. Ulardan foydalanib, o‘zida arifmetik progressiyaning dastlabki n ta hadini saqlovchi massiv tashkil etish dasturi.
Berilgan masalaning dastur kodi quyidagicha:
#include
using namespace std;
int main(){
int a,d,n; cout<<"n = "; cin>>n;
int b[n];
cout<<"a = "; cin>>a;
cout<<"d = "; cin>>d;
for(int i=0,k=a; i<=n; i++,k+=a)
b[i]=k;
for(int i=0; i
cout<
}
3-misol. n (n>2) butun soni berilgan. f1=1, f2=1, fk=fk-2+fk-1, k=3,4, ... .
fk Fibonachchi sonlar ketma-ketligida birinchi n ta elementni o‘z ichiga oladigan n o‘lchamli butun sonli massivni ifodalash va chop etish dasturi.
Berilgan masalaning dastur kodi quyidagicha yoziladi:
#include
using namespace std;
int main(){
int n; cout<<"n = "; cin>>n;
int a[n];
a[0]=1; a[1]=1;
for(int i=2; i
a[i]=a[i-1]+a[i-2];
for(int i=0; i
cout<
}
4-misol. n (n>2), a va b butun sonlar berilgan. 1-elementi a ga, 2-elementi b, har bir keyingi elementi barcha avvalgi elementlar (o‘zidan oldingi barcha element) yig‘indisiga teng bo‘lgan n o‘lchamli butun sonli massivni ifodalash va chop etish dasturi.
Berilgan masalaning dastur kodi quyidagicha:
#include
using namespace std;
int main(){
int n; cout<<"n = "; cin>>n;
int x[n];
int a, b;
cout<<"a = "; cin>>a;
cout<<"b = "; cin>>b;
x[0]=a; x[1]=b;
int s=a;
for(int i=2; i
s=s+x[i-1];
x[i]=s;
}
for(int i=0; i
cout<
}
5-misol. n o‘lchamli nol bo‘lmagan butun tipli a massiv berilgan. Uning akn tengsizlikni qanoatlantiradigan birinchi ak elementining qiymatini chiqaruvchi dastur.
Berilgan masalaning dastur kodi quyidagicha:
#include
using namespace std;
int main(){
int n; cout<<"n = "; cin>>n;
int a[n];
for(int i=1; i<=n; i++)
cin>>a[i];
for(int i=1; i<=n; i++)
if (a[i]
cout<
break;
}
}
6-misol. n o‘lchamli butun sonli a massiv berilgan. Massivdagi barcha juft sonlar yangi butun tipli b massivga yozilsin. Hosil qilingan b massivning o‘lchami hamda uning elementlarini chiqarish dasturi.
Berilgan masalaning dastur kodi quyidagicha:
#include
using namespace std;
int main(){
int n, k=0; cout<<"n = "; cin>>n;
int a[n], b[n];
for(int i=1; i<=n; i++)
cin>>a[i];
for(int i=1; i<=n; i++)
if (a[i]%2==0){
k++;
b[k]=a[i];
}
cout<
for(int i=1; i<=k; i++)
cout<
}
7-misol. n o‘lchamli butun tipli massiv berilgan. Birinchi juft sonning dastlabki qiymatini massivdagi barcha juft sonlarga ko‘paytirish (Agar massivda juft son bo‘lmasa, massiv o‘zgartirishsiz qoldirilsin) dasturi.
Berilgan masalaning dastur kodi quyidagicha:
#include
using namespace std;
int main(){
int n, k; cout<<"n = "; cin>>n;
int a[n], b[n];
for(int i=1; i<=n; i++)
cin>>a[i];
for(int i=1; i<=n; i++)
if (a[i]%2==0) {
k=a[i];
break;
}
for(int i=1; i<=n; i++)
if (a[i]%2==0) a[i]=k*a[i];
for(int i=1; i<=n; i++)
cout<
}
Ikki o‘lchovli massivlar
Agar ma’lumotlarni jadval ko‘rinishida ya’ni satrlar va ustunlar formatida saqlash talab etilsa, unda ikki o‘lchovli massivlardan foydalanish lozim bo‘ladi.
8 - jadvalda to‘rt qatorli va beshta ustundan iborat massiv berilgan. Bu ikki o‘lchovli massiv hisoblanadi. Undagi qatorlarni birinchi o‘lchov, ustunlarni ikkinchi o‘lcham deb hisoblash mumkin. Ushbu jadvalda saqlangan ma’lumotlarga murojaat qilish uchun massiv nomini va ikkita indeksni ko‘rsatish kerak bo‘ladi. Bunda indeksning birinchisi satr raqamiga, ikkinchisi kerakli element saqlanadigan ustun raqamiga to‘g‘ri keladi.
8-jadval
Ikki o‘lchovli massiv
3.5 | -1.9 | 0.8 | 5.07 | -2.16 |
1.6 | 2.5 | 3.7 | 0.01 | -2.32 |
3.01 | -0.35 | 15.18 | 7.09 | -15.66 |
9.5 | 10.5 | 5.3 | 1.9 | 1.11 |
Ikki o`lchovli massiv – bu matritsa hisoblanadi, uning har bir elementi ikkita indeksga ega: qator raqami – i, ustun raqami – j.
Umumiy holda ikki o‘lchovli massiv quyidagicha e’lon qilinadi:
Bu yerda toifa massiv elementlari turini belgilaydi,
Masalan: double m[5][7];
Bunda satrlar soni 5 ta va ustunlari soni 7 ta bo‘lgan haqiqiy sonli m massiv e’lon qilingan, satrlar 0 dan 4 gacha, ustunlar 0 dan 6 gacha raqamlangan.
Ixtiyoriy o‘zgaruvchiga o‘xshab, matritsaga ham boshlang‘ich qiymat berilishi mumkin, masalan: int B[2][3] ={{2,3,4}, {7,8,9}};
Matritsa elementiga murojaat qilish uchun uning nomiga, to‘rtburchak qavslarda qator va ustun soni ko‘rsatilishi lozim. Masalan, a [2] [4]- uchinchi satrda va beshinchi ustunda joylashgan a matritsaning elementi degan ma’noni bildiradi.
Matritsa elementlari bilan ishlash uchun ikkita sikldan foydalanish talab etiladi. Matritsani qayta ishlash uchun birinchi (tashqi) sikl parametrining qiymatlari matritsa satrlari sonlari, ikkinchi (ichki) sikl parametri qiymatlari esa ustunlar raqamlarini anglatadi (19-rasm). Matritsa elementlariga ishlov berishda tartib bilan birinchi qator (ustun) elementlari, so‘ngra ikkinchisi va boshqalar oxirigacha ko‘rib chiqiladi. Agar matritsani ustunlar bo‘yicha qayta ishlash zarur bo‘lsa, tashqi siklni ustunlar bilan, ichki siklni qatorlar bo‘yicha tashkil qilish kerak (20-rasm).
Massivlarni qayta ishlash
Matritsalar ustida bajariladigan asosiy amallarni ko‘rib chiqamiz.
Matritsalar ham massivlar kabi element bo‘yicha kiritib chiqariladi.
Matritsa elementlarini kiritib chiqarish uchun quyidagi dastur kodi kiritiladi:
#include
using namespace std ;
int main()
{ int i , j ,N,M, a [ 20] [20] ;
cout<<"N=" ; cin>>N; // Satrlar sonini kiritish
cout<<"M=" ;
cin>>M; // Ustunlar sonini kiritish
cout<<"A matritsa elementlarini kiriting"<
for ( i =0;i
for ( j =0;j
cin>>a [ i ] [ j ] ; //Matritsa elementlarini ketma-ket kiritish
cout<<"A matritsa elementlarini chiqarish"<
for ( i =0;i
{ for ( j =0;j
cout<
cout<
}
}
Matritsa elementlarini jadval shaklida chiqarish uchun quyidagi dastur kodidan ham foydalanish mumkin:
for ( i =0;i
for ( j =0;j
cout<
Matritsa elementlarini bir satrda probel bilan yoki tabulyatsiya belgisi bilan yoki Enter tugmasi orqali kiritish mumkin. Quyida keltirilgan masalaning dastur natijasi berilgan:
N=2
M=3
A matritsa elementlarini kiriting
1 2 3 4 5 6
A matritsa elementlarini chiqarish
1 2 3
4 5 6
C++ dasturlash tilida matritsalarni qayta ishlash bo‘yicha amaliy masalalarni ko‘rib chiqamiz. Bundan oldin matritsaning quyidagi asosiy xususiyatlarini eslab o‘tamiz (21-rasm):
-
agar satr tartib raqami bilan ustun tartib raqami teng bo‘lsa (i = j), bu element bosh diagonalda yotishini anglatadi; -
agar satr tartib raqami ustun tartib raqamidan kata bo‘lsa (i > j), bu element bosh diagonaldan pastda yotishini anglatadi; -
agar ustun tartib raqami satr tartib raqamidan kata bo‘lsa (i < j), bu element bosh diagonaldan yuqorida yotishini anglatadi; -
agar matritsaning indekslari quyidagi tenglikni qanoatlantirsa i + j = n – 1, element qo‘shimcha diagonalda yotadi; -
agar i + j < n − 1 tenglik bajarilsa, qo‘shimcha diagonaldan yuqorida joylashgan elementlar uchun taalluqli hisoblanadi; -
element qo‘shimcha diagonaldan pastda joylashishi uchun i + j > n – 1 tenglik bajarilishi kerak:
21-rasm. Matritsaning asosiy xususiyatlari.
Yuqorida bayon qilingan fikrlarni tekshirib ko‘rish uchun C++ dasturlash tilida funksiyalarga doir bir nechta dasturlarni ko‘rib o‘tamiz.
1-misol. Berilgan A(n,n) kvadrat matritsaning diagonal elementlari yig‘indisini topish dasturi.
Berilgan masalaning dastur kodi quyidagicha:
#include
using namespace std;
int main(){
int n, s=0; cout<<"n = "; cin>>n;
int a[n][n];
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
cin>>a[i][j];
for(int i=1; i<=n; cout<
for(int j=1; j<=n; j++)
cout<
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if (i==j) s+=a[i][j];
cout<<"Yig‘indi: "<
}
2-misol. Berilgan A(n,n) kvadrat matritsaning bosh diagonalidan yuqorida joylashgan elementlari yig‘indisini topish dasturi.
Berilgan masalaning dastur kodi quyidagicha:
#include
using namespace std;
int main(){
int n, s=0; cout<<"n = "; cin>>n;
int a[n][n];
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
cin>>a[i][j];
for(int i=1; i<=n; cout<
for(int j=1; j<=n; j++)
cout<
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if (i
cout<<"Yig‘indi: "<
}
3-misol. Berilgan A(n,n) kvadrat matritsaning birlik matritsa ekanligini tekshirish dasturi.
Berilgan masalaning dastur kodi quyidagicha:
#include
using namespace std;
int main(){
int n, s=1; cout<<"n = "; cin>>n;
int a[n][n];
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
cin>>a[i][j];
for(int i=1; i<=n; cout<
for(int j=1; j<=n; j++)
cout<
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if (((i==j)&&(a[i][j]!=1)) || ((i!=j)&&(a[i][j]!=0))){
s=0;
break;
}
if (s) cout<<"Birlik matritsa ";
else cout<<"Birlik matritsa emas ";
}
4-misol. Berilgan A(n,m) matritsaning toq elementlari sonini aniqlash dasturi.
Berilgan masalaning dastur kodi quyidagicha:
#include
using namespace std;
int main(){
int n, m, k=0;
cout<<"n = "; cin>>n;
cout<<"m = "; cin>>m;
int a[n][m];
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
cin>>a[i][j];
for(int i=1; i<=n; cout<
for(int j=1; j<=m; j++)
cout<
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
if (a[i][j]%2==1) k++;
cout<<"Toq elementlari soni: "<
}
5-misol. Berilgan A(n,m) matritsaning har bir satr elementlari o‘rta arifmetigini topish dasturi.
Berilgan masalaning dastur kodi quyidagicha:
#include
using namespace std;
int main(){
int n, m, s=0;
cout<<"n = "; cin>>n;
cout<<"m = "; cin>>m;
int a[n][m];
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
cin>>a[i][j];
for(int i=1; i<=n; cout<
for(int j=1; j<=m; j++)
cout<
for(int i=1; i<=n; s=0, i++){
for(int j=1; j<=m; j++)
s+=a[i][j];
cout<<"s"<
}
}
6-misol. Berilgan A(n,m) matritsaning eng katta va eng kichik elementlari o‘rnini almashtirish dasturi.
Berilgan masalaning dastur kodi quyidagicha:
#include
using namespace std;
int main(){
int n, m;
cout<<"n = "; cin>>n;
cout<<"m = "; cin>>m;
int a[n][m];
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
cin>>a[i][j];
for(int i=1; i<=n; cout<
for(int j=1; j<=m; j++)
cout<
int min=a[1][1], max=a[1][1];
int x, y, k, l;
x=y=k=l=1;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
if (a[i][j]
min=a[i][j];
x=i, y=j;
}
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
if (a[i][j]>max) {
max=a[i][j];
k=i, l=j;
}
int z=a[x][y];
a[x][y]=a[k][l];
a[k][l]=z;
for(int i=1; i<=n; cout<
for(int j=1; j<=m; j++)
cout<
}
7-misol. Chiziqli algebraik tenglamalar sistemasini Gauss usulida yechish dasturi.
Berilgan masalaning dastur kodi quyidagicha:
#include
using namespace std;
int n, i, j, k;
double d, s;
int main()
{
cout << "Tartib: " << endl;
cin >> n;
double **a = new double *[n];
for (i = 0; i <= n; i++)
a[i] = new double [n];
double **a1 = new double *[n];
for (i = 0; i <= n; i++)
a1[i] = new double [n];
double *b = new double [n];
double *x = new double [n];
cout << "Koeffitsiyent va ozod hadlarni kiriting " << endl;
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
cout << "a[ " << i << "," << j << "]= ";
cin >> a[i][j];
a1[i][j] = a[i][j];
}
cout << "b,[ " << i << "]= ";
cin >> b[i];
}
for (k = 1; k <= n; k++)
{
for (j = k + 1; j <= n; j++)
{
d = a[j][k] / a[k][k];
for (i = k; i <= n; i++)
{
a[j][i] = a[j][i] - d * a[k][i];
}
b[j] = b[j] - d * b[k];
}
}
for (k = n; k >= 1; k--)
{
d = 0;
for (j = k + 1; j <= n; j++)
{
s = a[k][j] * x[j];
d = d + s;
}
x[k] = (b[k] - d) / a[k][k];
}
cout << "Natijalar: " << endl;
for( i = 1; i <= n; i++)
cout << "x[" << i << "]=" << x[i] << " " << endl;
return 0;
}
Mustaqil bajarish uchun topshiriqlar
1. n (n>0) butun son berilgan. Dastlabki n ta musbat toq sonlarni saqlaydigan n o‘lchamli butun sonli massiv tashkil etuvchi dastur tuzing.
2. n (n>0) butun son berilgan. 3 ning darajalarini saqlaydigan n o‘lchamli butun sonli massiv tashkil etuvchi dastur tuzing.
3. n o‘lchamli, butun sonli massiv berilgan. Berilgan massivdagi barcha toq sonlarni o‘z ichiga oladigan elementlarni o‘sish tartibida saralab, chop etish hamda ularning miqdori k ni aniqlash dasturini tuzing.
4. n o‘lchamli butun tipli a massiv berilgan. Uning a1kn qo‘shtengsizlikni qanoatlantiradigan oxirgi ak elementining tartib raqamini chiqaruvchi dastur tuzing.
5. Nol bo‘lmagan butun sonli n o‘lchamli massiv berilgan. Uning elementlari geometrik progresssiyani tashkil etishini tekshiruvchi dastur tuzing. Agar tashkil etsa progressiya maxraji aks holda 0(nol) chiqarilsin.
6. n o‘lchamli haqiqiy tipli a massiv berilgan. Uning eng katta va eng kichik elementlari o‘rnini almashtiruvchi dastur tuzing.
7. A(m,n) haqiqiy sonli matritsa va k(1≤k≤m) soni berilgan. Berilgan matritsaning k satridagi elementlarni chop etuvchi dastur tuzing.
8. A(m,n) butun sonli matritsa va k(1≤k≤n) soni berilgan. Berilgan matritsaning k ustunidagi elementlarni chop etuvchi dastur tuzing.
9. Berilgan A(n,n) kvadrat matritsaning bosh diagonalidan pastda joylashgan elementlari yig‘indisini topuvchi dastur tuzing.
10. A(m,n) butun sonli matritsa berilgan. Matritsa satrlarini har birining yig‘indilarini hisoblab, yig‘indisi eng katta bo‘lgan satr tartib raqamini va shu satr yig‘indisini chop etuvchi dastur tuzing.
11. A(m,n) haqiqiy sonli matritsa berilgan. Matritsani har bir satridagi eng katta va eng kichik elementlari o‘rinlarini almashtirib chop etuvchi dastur tuzing.
12. A(m,n) butun sonli matritsa berilgan. Matritsaning eng katta va eng kichik elementlari joylashgan satrlarining o‘rinlari almashtiruvchi dastur tuzing.
1 2 3 4 5 6 7 8 9 10 11