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

5.   Diziler

Şu ana kadar basit değişkenler kullandık ( her değişkinin bir değeri var).

Yapısal değişken: benzer verilerin tek bir değişken altında gruplandırılması.

Dizi  veri yapısı: Aynı tip verilerin toplanıp tek isim verilmesi.

 

5.1  Dizi Tanımı ve Kullanımı

Tip_Adı   değişken[boyut];

 

Örneğin

    float  a[100];

 

Bu tanımlama ile a isimli değişkeni 100 gerçel değerin saklandığı bir diziyi gösterir. Bu 100 veriye a değişkeni ile erişilir.

Dizinin herhangi bir elemanına erişmek veya değiştirmek için kaçıncı eleman olduğunu gösterir indis bilgisini vermek gerekir. İlk elemanın indisi 0 dır.

 

                A[4]   dizinin 5. elemanı

                A[0]   dizinin ilk elemanı

                A[1] := 45;   dizinin 2. elemanına 45 atanır

                A[7] := A[7] + A[1];   dizinin 8. elemanına kendisi ile 2. elemanın toplamı atanır

 

Dizinin eleman değerler tanımlama anında yapılabilir.

int a[10] = {25, 18, 20, 0, 29, 5, 4, 8,19,13}

 

 

Örnek:  Dizi elemanlarına değer ata, yazdır.

 

/* 1-10 arsındaki sayıların karesini dizi elemanlarına yükle yazdır */

main()

{

  int a[10];

  int i;

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

      a[i] = (i+1)*(i+1);

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

printf("%d . elemanın değeri = %dn", i, a[i]);

}

 

Ekranda çıkacak görüntü

0 . elemanın değeri  = 1

1 . elemanın değeri  = 4

...

9 . elemanın değeri = 100

 

Örnek : Dizide ilk 20 Fibonacci  sayıyı oluştur

 

/* ilk 20 Fibonacci

   f[0] = 0, f[1] = 1, f[i+1] = f[i] + h[i-1] */

#include <stdio.h>

main()

{

  int fib[20];

  int i;

  fib[0] = 0;

  fib[1] = 1;

  for (i=2; i<=19; i++)

      fib[i] = fib[i-1] + fib[i-2];

  clrscr();

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

      printf("%d . Fibonacci sayısı = %dn", i, fib[i]);

}

 

Ekranda çıkacak görüntü

0. Fibonacci sayısı = 0

1. Fibonacci sayısı = 1

2. Fibonacci sayısı = 1

...

19. Fibonacci sayısı = 4181

 

Örnek :  Klavyeden 10 sayı oku. Tersten yazdır.

 

#include <stdio.h>

main()

{

  int a[10];

  int i;

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

    printf("%d. sayıyı gir ",i);

      scanf("%d", &a[i]);

  }

 

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

 

  for (i=9; i>=0; i--)

      printf("%d . sırada girilen sayı = %dn", 9-i, a[i]);

}

 

Diziyi Bir İşleve Gönderme

 

Şu ana kadar öğrenilen bilgi çerçevesinde işlevlere gönderilen parametrelerin içeriklerinin işlev içerisinde değiştirilmesi mümkün değildir. İşleve değişkenin değeri gönderilir. İşlev içerisindeki işlemlerden parametre etkilenmez.

 

Dizilerde durum böyle değildir. Normal kullanımda (şu ana kadar görülen) dizi işleve gönderildiğinde elemanlar değiştirilebilir (referans). Dizinin sadece herhangi bir elemanı gönderildiğinde ise değeri değiştirilemez (değer)

 

Diziyi işleve gönderirken sadece adını parametre olarak yazmak yeterlidir.

 

 

 

Örnek:  işlev içerisnde dizi eleman değerlerinin değiştirilmesi

 

#include <stdio.h>

void kareleri(int []);

main()

{

  int a[10];

  int i;

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

      a[i] = i + 1 ;

  clrscr();

  printf("Dizinin elemanlarının değerlerin");

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

      printf("%d  ",a[i]);

  kareleri(a);

printf("nnKare alma işlemi sonrası dizinin elemanlarının değerlerin");

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

printf("%d  ",a[i]);

}

void kareleri(int a[])

{

  int i;

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

      a[i] = a[i] * a[i];

}

 

Ekranda çıkacak görüntü

Dizinin elemanlarının değerleri

1  2  3  ..                                       10

Kare alma işlemi sonrası dizinin elemanlarının değerleri

1  4  9  ..                                                 100

 

Notlar

 

*  Tanımlanan dizi boyutunun dışında bir eleman kullanımı durumunda C dili hata vermez (uyarmaz).

*  İlk indisin değerinin sıfır olması dolayısıyla  dizinin n. elemanın indisi n değil n-1 dir.

*  Gerektiği durumlarda dizi elemanlarının ilklendirilmesi (sıfırlamak) unutulmamalı

                - tanımlama anında  int a[10] = {13, 45 ..};    /* fazla eleman yazılırsa hata oluşur */

                                                 int a[] = { 13, 45, 56};   /* boyut belirtilen değer kadar olur */

 

                - giriş yaptırarak      scanf("%d", &a[i]);

                - doğrudan değer atayarak  a[i] = 4;

 

Dizinin Boyutunu Değişken Kılma

  

#define önişlemcisi direktifi (preprocessor directive)

 

Simgesel sabit tanımlanmasını sağlar. C dili deyimlerinden biri değildir (#include gibi). Kullanım biçimi

 

#define SabitAdı  Değeri

 

Program çalıştırıldığınde derleme işlemi öncesinde program içerisinde SabitAdı simgesinim geçtiği yerlere Değeri konur.

 

Örnek : 25 kişilik bir sınıftaki öğrencilerin sınav sonuçlarını okuyup ortalamasını bulan program.

 

                * not bilgilerin saklanacağı veri yapısını belirle ve tipi tanımla

                * notları girdiren yöntemi yaz

                * Ortalamayı bulan fonksiyonu yaz

 

#include <stdio.h>

#define OGR_SAY 25

void giris(int []);

float ortalama(int []);

main()

{

  int ogr[OGR_SAY];

  clrscr();

  giris(ogr);

printf("Ortalama = %fn", ortalama(ogr));

}

void giris(int ogr[])

{

  int i;

for (i=0; i<OGR_SAY; i++)  /* 0 dan başladığı için < kullanıldı */

  {

      printf("%d. öğrencinin notunu gir : ",i+1);

      scanf("%d", &ogr[i]);

  }

}

float ortalama(int ogr[])

{

  float x;

  int i;

x = 0;

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

      x = x + ogr[i];

  return x / OGR_SAY;

}

 

 * 50'den küçük değerleri yazan işlev

 * 50'den küçük değerlerin sayısını veren işlev

 * en yüksek notu veren işlev

 * Standart sapmayı veren işlen ( (abs(Xi - Xort) / OGR_SAY))

 

Örnek : İki dizinin toplamını üçüncü bir diziye yazan programı yazınız (A, B aynı tip dizi, C = A + B ).

 

Doğrudan C := A + B yazılamayacağı için dizinin ilgili elemanlarını tek tek toplamalıyız.

 

#include <stdio.h>

#define MAX 20

void dizitopla(int [], int [], int []);

main()

{

  int a[MAX], b[MAX], c[MAX];

  int i;

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

      a[i] = i;

      b[i] = 2 * i;

  }

  dizitopla(a, b, c);

  clrscr();

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

      printf(" %4d + %4d = %4d n", a[i], b[i], c[i]);

}

 

void dizitopla(int a[], int b[], int c[])

/* c = a +b */

{

  int i;

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

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

}

 
 
  Bugün 141 ziyaretçi (220 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