Cərgələr
İndiyə kimi biz baxdığımız nümunə proqramlarda elə də çox sayda dəyişəndən istifadə etmirdik. Maksimum halda 1, 2 və ya 3 dəyişən. Aydındır ki, bütün bunlar nümunə proqramlardır və materialı izah etmək üçün verilir. Real tətbiqi proqramlar isə, 10 000-lərlə və ya 100 000-lərlə müxtəlif məlumatlar üzərində əməliyyatlar aparmalı olur.
Sadə misala baxaq:
Tutaq ki, univeristetdə bu il bütün fakultələr üzrə təhsil alan tələbələrin, bütün fənlər üzrə qış imtahanlarının yekun nəticələrinin orta qiymətini hesablamaq lazımdır. Əgər universitetdə 6000 tələbə 5 fəndən imtahan veribsə, bu, 30 000 imtahan nəticəsi deməkdir. Başqa sözlə, bu proqramı qurmaq üçün biz 30 000 dəyişən elan etməliyik, hansı ki, praktiki olaraq mümkün deyil (əlbəttə mümkündür, amma heç kim bu işi görməz).
Bu zaman cərgələrdən istifadə olunur.
Cərgə elan edən zaman biz yaddaşda lazım olan sayda dəyişən (10, 5000, 100 000 ) yerləşdirmək üçün sahə ayırırıq və bu sahəyə bütövlükdə bir ad veririk. Dəyişənlər bu sahəyə ardıcıl düzülür, cərgə şəklində. Daha sonra, bu cərgədən istənilən elementə müraciət etmək üçün həmin sahəyə verdiyimiz addan və həmin dəyişənin indeksindən (cərgədəki sıra nömrəsindən) istifadə edirik.
Cərgədə dəyişənlərin nömrələnməsi 0-dan başlayır, yəni cərgənin ilk elementinə müraciət eləmək üçün cərgənin adı və 0 indeksindən istifadə olunur. Cərgə elan eləmək üçün aşağıdakı çox sadə sintaksisdən istifadə edirik:
tip cərgənin_adı [elementlərin_sayı];
Misal üçün, int tipli 100 elementdən ibarət netice adlı cərgə elan etmək üçün yazırıq:
int netice[100];
Yaddaşa nəzər salaq:
Eyni sətirdə biz, həm də adi dəyişən və ünvan dəyişəni elan edə bilərik:
int x, netice[100], *dey;
6.1 Cərgənin elementlərinə müraciət
Qeyd elədik ki, cərgənin elementlərinə müraciət etmək üçün cərgənin adı və müraciət etmək istədiyimiz elementin indeksindən istifadə edirik.
Aşağıdakı kimi:
cergenin_adı[index]
Misala baxaq:
int x, y[ 10 ], *dey;
// y cərgəsinin 1-ci elementinə (indeks -0) 127 qiyməti mənimsədək
y[ 0 ] = 127 ;
// y cərgəsinin 2-ci elementinə (indeks -1) 600 qiyməti mənimsədək
y[ 1 ] = 600 ;
// x-a y cərgəsinin 2-ci elementini mənimsədək
x = y[ 1 ];
Göründüyü kimi, cərgələrlə işləmək kifayət qədər maraqlı və asandır.
Proqram nümunəsi:
Cərgədən istifadə etməklə, elə proqram tərtib edək ki, istifadəçidən 10 dənə ədəd daxil etməsini xahiş etsin, daha sonra, bu 10 ədədin cəmini hesablasın.
//prg_6_1.cpp
#include <iostream>
int main( int argc, char *argv[])
{
int cəm,x[ 10 ],z,i;
std::cout<<"10 dənə ədəd daxil edin \n" ;
// cərgənin elementlərinin daxil edilməsi
for (i= 0 ; i< 10 ; ++i)
std::cin>>x[i];
// cərgənin elementlərinin cəminin hesablanması
// əvvəlcə cəm dəyişənin 0-a mənimsədirik
cəm = 0;
for (i= 0 ; i< 10 ; ++i)
cəm = cəm + x[i];
std::cout<<"daxil etdiyiniz ədədlərin cəmi = "<<cəm<<" \n " ;
return 0;
}
Nümunə
Proqramı icra edək:
C:\cpp\prog2\Debug>
C:\cpp\prog2\Debug>prog2.exe
10 dənə ədəd daxil edin
1 23 4 56 7 78 9 7 234 6
daxil etdiyiniz ədədlərin cəmi = 425
C:\cpp\prog2\Debug>
C:\cpp\prog2\Debug>
6.2 Cərgələrin elan olunma qaydaları
Cərgələr aşağıdakı kimi elan oluna bilər:
Birinci qayda:
int x[10];
İkinci qayda:
int x[]={1,2,3,4,5,6,7,8,9,10};
Bu zaman cərgənin elementlərinin sayı [] mötərizələri arasında verilmir, onun təşkil olunduğu elementlər {} mötərizələri arasında göstərilir, vergüllə ayrılır.
6.3 Cərgə ilə ünvan dəyişənləri arasında əlaqə
C++ dili ünvan dəyişənlərini çox sevir və hər şeyi onunla əlaqələndirməyə çalışır. Bu da səbəsiz deyil, ilk əvvəllər bir az çətin gəlsə də, ünvan dəyişənləri çox praktikdirlər. Cərgələr ilə ünvan dəyişənləri bir-biri ilə çox əlaqəlidir və onların bu əlaqəsindən proqramlaşdırmada geniş isitfadə olunur.
C++ dilində cərgənin adı onun ilk elementinə istinad edən ünvan tipli dəyişəndir.
Aşağıdakı kimi adi dəyişən, ünvan dəyişəni və cərgə elan edək, onların əlaqələrini izah etməyə çalışaq.
int x, *y, z[10];
z yalnız ilk elementə (z[0]-a) istinad edir və ayrı yerə ünvanlana bilməz. Bu deyilənə əsasən, z cərgəsinin ilk elementinə z[0]-dən başqa aşağıdakı kimi də müraciət etmək olar.
*z;
Yəni adi x dəyişəninə z-in ilk elementini aşağıdakı iki yolla mənimsədə bilərik:
x = z[0]; və ya x = *z;
Ancaq ilk elementə əlbəttə ki;
Digər tərəfdən, z ünvan tipli dəyişən olduğundan və özündə cərgənin ilk elementinin ünvanını saxladığından, mən y = z; yazsam, onda y də z cərgəsinin ilk elementinə istinad edəcək. Əgər mən y-i cərgənin ikinci elementi üzərinə sürüşdürmək istəyirəmsə, onda yazıram:
y = y + 1; və ya y = z + 1;
Beləliklə, y-i cərgənin ilk elementinə mənimsətməklə və onun üzərində artırma və azaltma əməlləri aparmaqla, onu cərgənin elementləri boyu yuxarı-aşağı sürüşdürmək olar.
6.4 Cərgələrin funksiyaya parametr kimi ötürülməsi
Cərgələr funksiyaya parametr kimi ötürülə bilər. C++ dilində cərgələr funksiyaya ancaq bir yolla, ünvana görə ötürülə bilər. Tutaq ki, aşağıdakı kimi x cərgəsi elan etişik.
int x[10];
Əgər hər hansı funk funksiyasına x cərgəsini parametr kimi ötürmək istəyiriksə, onda funk-da ünvan tipli parametr elan etməliyik.
int funk(int *);
ünvan dəyişənlərində olduğu kimi (cərgənin adının ünvan tipli dəyişən olması elə buradan da görünür, eyni elan ilə funksiyaya biz həm ünvan tipli dəyişən ötürə bilərik, həm də cərgə). Daha sonra x-i funk-a parametr kimi ötürmək istəsək, sadəcə funk(x); yazırıq.
Proqram nümunələri:
Proqram 1. eks.c
Elə proqram tərtib edək ki, istifadəçinin daxil etdiyi rəqəmləri əks sıra ilə çap etsin:
//prg_6_2.cpp
#include <iostream>
int main( int argc, char *argv[])
{
int i, x[ 100 ], say;
std::cout<< "100-dən kiçik hər hansı bir ədəd daxil edin \n" ;
std::cin>>say;
std::cout<<say<< "sayda ədəd daxil edin \n" ;
for (i= 0 ; i<say; i++ )
std::cin>>x[i];
std::cout<< "sizin daxil etdiyiniz ədədlər əks siyahıda \n" ;
for (i=(say- 1 ); i>= 0 ; i--)
std::cout<<x[i]<< " " ;
std::cout<< " \n " ;
return 0;
}
Nümunə
Proqramı kompilyasiya edib icra edək:
C:\cpp\prog2\Debug>prog2.exe
100-dən kiçik hər hansı bir ədəd daxil edin > 0
6
6 sayda ədəd daxil edin
1 2 3 4 5 6
sizin daxil etdiyiniz ədədlər əks siyahıda
6 5 4 3 2 1
C:\cpp\prog2\Debug>
C:\cpp\prog2\Debug>
Proqram 2. max.c
Cərgələrdən istifadə edib elə proqram quraq ki, verilmiş sayda ədədlərin içindən ən böyüyünü tapsın.
// prg_6_3.cpp
#include <iostream>
int main( int argc, char *argv[])
{
int i, x[ 100 ], say, max;
std::cout<< "100-dən kiçik hər hansı bir ədəd daxil edin \n" ;
std::cin>>say;
std::cout<<say<< " sayda ədəd daxil edin \n" ;
for (i= 0 ; i<say; i++ )
std::cin>>x[i];
max = 0 ;
for (i= 0 ; i<say; i++)
if (x[i] > max) max = x[i];
std::cout<< "sizin daxil etdiyiniz ədədlərin içində ən böyüyü" <<max<<"-dir \n" ;
return 0;
}
Nümunə
Nəticə:
C:\cpp\prog2\Debug>
C:\cpp\prog2\Debug>prog2.exe
100-dən kiçik hər hansı bir ədəd daxil edin
7
7 sayda ədəd daxil edin
1 23 45 678 2 321 89
sizin daxil etdiyiniz ədədlərin içində ən böyüyü 678-dir
C:\cpp\prog2\Debug>
C:\cpp\prog2\Debug>
Proqram 3. max_func.c
Proqram 2-ni funksiyadan istifadə etməklə tərtib edək.
// prg_6_4.cpp
#include <iostream>
int max_ədəd( int *, int );
int main( int argc, char *argv[])
{
int i, x[ 100 ], say, max;
std::cout<< "100-dən kiçik hər hansı bir ədəd daxil edin \n" ;
std::cin>>say;
std::cout<<say<< " sayda ədəd daxil edin \n" ;
for (i= 0 ; i<say; i++ )
std::cin >>x[i];
max = max_ədəd(x,say);
std::cout<< "sizin daxil etdiyiniz ədədlərin içində ən böyüyü " <<max<<"-dir \n" ;
return 0;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int max_ədəd( int *x, int say)
{
int net,i;
net = 0 ;
for (i= 0 ; i<say; i++)
if (x[i] >net) net = x[i];
return net;
}
Nümunə
Nəticə:
C:\cpp\prog2\Debug>
C:\cpp\prog2\Debug>prog2.exe
100-dən kiçik hər hansı bir ədəd daxil edin
5
5 sayda ədəd daxil edin
23 456 7 89 0
sizin daxil etdiyiniz ədədlərin içində ən böyüyü 456-dir
C:\cpp\prog2\Debug>
C:\cpp\prog2\Debug>