BİLİŞİM - BİLGİSAYAR - EĞİTİM
  Çok Boyutlu Diziler
 

5.3  Çok Boyutlu Diziler:

 

                Çok boyutlu bilgileri veya veri tablolarını saklamak için kullanılır.  İki boyutlu diziler daha sık kullanılır. Örneğin; yıllara ve aylara enflasyon rakamının takibi, matematikteki matriş işlemlerinin gerçeklenmesi, öğrenciler ve aldıkları derslerin takibi.

 

Tanımlama biçimi :  İki türlü yapılabilir.

Tip  Değişken_Adı[ indis1 ][ indis2 ][ indisn ];

 

Örneğin ;

 

float Enf[5][12];

Enf tipi iki boyutlu bir dizidir. Birinci boyut ( satır ) yılları, ikinci boyut ( sütun ) ayları gösterir.

 

 

C dilinde boyut sayısında bir sınır yoktur. Biligisayarın belleği boyutu sınırlar.

Dizilerin bellekte saklanma biçimi : 

 

Erişimin kolay olması için dizinin tüm elemanları peşpeşe saklanır. Burada önce satır sonra sütunlar (tanımlanış sırasına göre) saklanır .

 

!!! Çok boyutlu dizileri bir işleve gönderirken ilk boyut dışındaki boyutların büyüklüklerini vermek zorunludur.

 

Örnek :  İki boyutlu dizi üzerine.

 

#include <stdlib.h>

#define SATIR 5

#define SUTUN 5

double enbuyuk(double [][SUTUN], int );

void  matris_oku(double [][SUTUN]);

main()

{

double a[SATIR][SUTUN];

double b[SATIR];  /* satirlardaki en buyuk elemanlar */

  double c[SATIR];  /* satirlardaki sutunlarin toplami */

  int   i, j;

matris_oku(a);

  for (i = 0; i < SATIR; i++)

b[i] = enbuyuk(a,i);

/* Satirdaki elemanlarin toplamlarinin olusturdugu matris */

for (i = 0; i < SATIR; i++)

{

c[i] = 0;

for (j = 0; j < SUTUN; j++)

           c[i] = c[i] + a[i][j];

     }

clrscr();

  for (i = 0; i < SATIR; i++) {

      for (j=0; j<SUTUN; j++)

          printf("%3.0f ", a[i][j]);                            /* Biçimli yazdırma */

printf("  %4.0f  %4.0fn",b[i],c[i]);

  }

}

double enbuyuk(double a[][SUTUN], int sat)

{

double  r;

int     i;

r = a[sat][0];   /*  ilk eleman en buyuk  */

for (i = 1; i < SUTUN; i++)

if (a[sat][i] > r)

r = a[sat][i];

return r;

}   /* Function EnBuyuk */

void  matris_oku(double a[][SUTUN])

{

int i, j;

for (i = 0; i < SATIR; i++)

for (j = 0; j < SUTUN; j++)

a[i][j] = random(10);

}  /* matris_oku */

 

 

 

 

 

Örnek : Bir kare matrisin

 

  o. Matrisin simetrik olup olmamasını sınayan program

  o. Matrisin transpozesini bir diğer matrise kopyalayan program

  o. İki matrisinin çarpımını gerçekleştiren program

  o. köşegeninin alt kısmındaki elemanları sıfırlayan yöntemi,

  o. Determinantını hesaplayan fonksiyonu,

  o. M<=P ve N<=Q olmak üzere A matrisi MxN ve B matrisi PxQ    boyutlarındadır. B matrisi içerisinde A                    matrisininin olup olmadığı    belirlenecektir.  A matrisinin B matrisi içerisinde kaç kez    bulunduğunu ve                          bunların B matrisi içerisinde başlangıç konumlarını    (satır ve sütun olarak) veren programı yazınız.

  o. MxN elemanlı bir matrisi tek boyutlu bir diziye dönüştüren program

  o. P elemanlı bir diziyi MxN boyutlu matrise dönüştüren program (P sayısı M ve N e tam bölünür).

 

 /* Program Matris-2  */

#include <stdlib.h>

#define SATIR 3

#define SUTUN 3

void  matris_oku(int [][SUTUN]);

void matris_yaz(int [][SUTUN]);

int simetrik(int [][SUTUN]);      /* matrisin simetrikliğini sınar */

void transpoze(int [][SUTUN], int [][SUTUN]); /* 2. = 1.nin transpozesi */

void matris_carp(int [][SUTUN], int [][SUTUN], int [][SUTUN]); /* 3 = 1*2 */

/*

  alt_ucgen_sifirla(a);

 matris_yaz(a);

  printf("------------------------n");

  transpoze(a, b);

matris_yaz(b);

  matris_carp(a, b, c);

  printf("------------------------n");

  matris_yaz(c);

if (simetrik(a))

printf("Simetriktirn");

else

printf("Simetrik değildirn");

*/

getch();

}

void  matris_oku(int a[][SUTUN])

{

  int i, j;

for (i = 0; i < SATIR; i++)

for (j = 0; j < SUTUN; j++)

a[i][j] = 1 + random(5);

}  /* matris_oku */

void matris_yaz(int mat[][SUTUN])

{

int i, j;

for (i = 0; i<SATIR; i++) {

for (j = 0; j<SUTUN; j++)

printf("%3d ",mat[i][j]);

printf("n");

}

}

int simetrik(int a[][SUTUN])

{

int i,j;

int durum;

durum = 1; /*simetrik olduğunu varsay */

for (i = 0; i<SATIR; i++)

for (j = 0; j<SUTUN; j++)

if (a[i][j] != a[j][i]) {

durum = 0;

break;

}

  return durum;

}   /* simetrik */

void transpoze(int a[][SUTUN], int b[][SUTUN])

{

int i, j;

for (i = 0; i<SATIR; i++)

for (j = 0; j<SUTUN; j++)

b[i][j] = a[j][i];

}

void matris_carp(int a[][SUTUN], int b[][SUTUN], int c[][SUTUN])

/* c = a * b */

{

int i, j, k;

for (i = 0; i<SATIR; i++)

for (j = 0; j<SUTUN; j++) {

c[i][j] = 0;

for (k=0; k<SUTUN; k++)

c[i][j] = c[i][j] + a[i][k]*b[k][j];

}

}

void alt_ucgen_sifirla(int a[][SUTUN])

{

  int i,j;

  for (i = 0; i<SATIR; i++)

      for (j = 0; j<i; j++)

          a[i][j] = 0;

}

int det(int a[][SUTUN])

{

  int i, j, k;

int s, sx1, sx2;

s = 0;

/*

  for (j = 0; j<SUTUN; j++) {

      sx1 = 1;

      sx2 = 1;

      for (k = 0; k<SATIR; k++) {

          i = (j + k) % SUTUN;

          sx1 = sx1 * a[k][i];

          sx2 = sx2 * a[k][SATIR-k];

      }

      s = s + sx1 - sx2;

  }

*/

  return s;

}

 
 
  Bugün 143 ziyaretçi (225 klik) www.bilisim-egitim.tr.gg  
 
Bu web sitesi ücretsiz olarak Bedava-Sitem.com ile oluşturulmuştur. Siz de kendi web sitenizi kurmak ister misiniz?
Ücretsiz kaydol