C++

Cərgələr

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>