C'ye Buradan Başlasak 3 (Diziler)

Başlatan sema, 23 Şubat 2010 - 03:12:44

« önceki - sonraki »

0 Üyeler ve 2 Ziyaretçi konuyu incelemekte.

sema

Dizilere Giriş

Aynı tip verilerin seri olarak depolandığı ünitelerdir (hafızada ayrılmış bölümler).
Dizilerin kullanılmasını gerektiren iki önemli özelliği verilen tanımdan çıkarmaya çalışırsak:
1) Dizi elemanları bellekte ardışıl (continuous) olarak bulunurlar (ayrı nesne tanımlamadan en belirgin farkı)‏.
2) Dizi elemanları aynı türden nesnelerdir.
   İnt dizi[10];    //ardışıl olarak 10  tam sayı
   char dizi[10]; //ardışıl olarak 10  karekter

Diziler de bir veri türü olduğuna göre dizilerin de kullanılmadan önce tanımlanmaları gerekir.
Genel kullanım:

<tür> <dizi ismi> [<eleman sayısı>];
float      sema          [19];
float sema[19]

Her dizinin bir adı (adresi) var. Dizinin her bir parçasına eleman diyip (aslında 'deyip' herhâlde, sanırsam), bunlara da dizi indeksi ile ulaşılır.
            
Yukarıdaki komut sema'nın bir dizi (array) olduğunu, 19 elemanı bulunduğunu ve bunların tiplerinin float olduğunu belirtir.

Dizinin birinci ve ikinci elemanları sırasıyla
         sema[0] ve sema[1]
Dizinin son elemanı
         sema[18] ('0' dan başladık demeyeceğim artık).
Dizinin ilk elemanı sıfırıncı indisli elemandır ve sıfırıncı indisi elemanın adresini gösterir: dizi=&dizi[0];

Eğer sema dizisinin 5. elamanının 5 olmasını istiyorsak
         sema[4]=5.0 deriz.

Dizi İndisleri:

Dizi kullanımının getirdiği en büyük avantaj döngü deyimleri kullanarak tüm dizi elemanlarına kolay bir şekilde erişilebilmesidir.

Dizi indis ifadelerinde ++ ya da -- operatörlerinin kullanıldığı sık görülür.

int a[20];
int k = 10;
int i =5;

a[k++] = 100;  /* a dizisinin 10 indisli elemanına yani 11. elemanına 100 değeri atandı. */
a[--i] = 200;      /* a dizisinin 4 indisli elemanına yani 5. elemanına 200 değeri atandı. */

Dizi türü C türlerinden her hangi biri olabilir. Örnek:

#include<stdio.h>
#define BOYUT 10
int main(void)
{
int index, skore[BOYUT];
int toplam = 0;
float ortalama;
printf("Futbol sonuçlarını %d gir:\n", BOYUT);
for(index = 0; index < BOYUT; index++)
scanf("%d", &skore[index]); // 10 sonucu gir
printf("Girdiğiniz sonuçlar aşağıdadır:\n");
for (index = 0; index < BOYUT; index++)
printf("%5d", skore[index]); // sonuçların sağlaması
printf("\n");
for (index = 0; index < BOYUT; index++)
toplam += skore[index]; // sonuçların toplamı
ortalama = (float) toplam / BOYUT; // ortalama
printf("Sonuclar toplamı = %d, ortalama = %.2f\n", toplam, ortalama);
return 0;
}


su@su:~$ gcc /home/su/Masaüstü/falanca.c -o falanca
su@su:~$ ./falanca
Futbol sonuçlarını 10 gir:
4
3
7
9
7
5
4
3
2
3
Girdiğiniz sonuçlar aşağıdadır:
    4    3    7    9    7    5    4    3    2    3
Sonuclar toplamı = 47, ortalama = 4.70



Diziler ve Döngü Kullanımı:

For  ve While deyimleri  dizilerin elemanlarına ulaşmak için sık kullanılan yöntemlerdendir. Örnek verelim:
for(i = 0; i < 19; ++i)‏
dizi[i] = 0; //Dizi elemanlarını sıfırladık.


while(i < SIZE) {
     dizi[i] = 0;
     ++i;
} /* dizinin bütün elemanları sıfırlandı*/


Tanımlarken İlk Değer Nasıl Verilir? Şöyle:
double sema[]={2.5, 3.5, 5.8, 6.0};
char gokyuzu[6]={'g','o','k','y','u',z'};
int dizi[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9}; şekillerinden herhangi biri ile verilebilir.

Dizinin tüm elemanlarını sıfırlamanın en kolay yolu

İnt a[20] = {0};

İlk değer verilmeyen tüm elemanlar '0' değerini alır.

Diziye ilk değer verme işleminde dizinin eleman sayısından fazla sayıda değer vermemiz hataya neden olur:
int a[5] = {1, 2, 3, 4, 5, 6};

Bir örnek yapıp kaçayım:

Klavyeden girilecek 11 elemanlı bir dizinin maksimum elemanını bulan C programı:

#include <stdio.h>
int main()
{         
float  a[11],max;
int i;
printf("\nDizi elemanlarini girin\n");
for(i=0;i<=10;i++){
scanf("%f",&a[i]);
}
max=a[0];
for(i=0;i<=10;i++){
if(a[i]>max)
max=a[i];
}
printf("\nMaksimum dizi elemani=%f\n\n",max);
return 0;
}


Dizi elemanlarini girin
5
6
3
56
23
19
23
24
54
65
7

Maksimum dizi elemani=65.000000


Diziler matris gibi düşünülebilir:

İnt sema[4][3]={  {1,2,3},
                  {4,5,6},
                  {7,8,9},
                  {10,11,12}
                       };


Dizilerde boyut sınırı yoktur: int dizi[][][][][][.......]

Not 1: Gece gece uğraştığımdan biraz esprisi az oldu :P (bu yeter)
Not 2: Yine aynı sebeplerden yanlışları olabilir ve bazı önemli konular da detaysız kalmış olabilir, farkındayım, yarın akşama doğru kontrol edeceğim.
Not 3: falanca/filanca'lar çok sıktı, yaşamımın geri kalan kısmında kullanmayı düşünmüyorum :P

C'ye Giriş/Genel Bilgiler      http://forum.ubuntu-tr.net/index.php/topic,15404.0.html
Kontrol Yapıları (Döngüler)  http://forum.ubuntu-tr.net/index.php/topic,16719.0.html
Pointer, String'ler ile devam edecek, yakında, umarım..
susema

hitokiri

Eline sağlık @semagkyz;
gece gece iyi uğraşılıyomuş demekki :D

heartsmagic

Ara çok kısa oldu bu sefer :)
Eline sağlık.
Hayattan çıkarı olmayanların, ölümden de çıkarı olmayacaktır.
Hayatlarıyla yanlış olanların ölümleriyle doğru olmalarına imkân var mıdır?


Böylece yalan, dünyanın düzenine dönüştürülüyor.

sema

Alıntı yapılan: hitokiri - 23 Şubat 2010 - 04:47:37
Eline sağlık @semagkyz; gece gece iyi uğraşılıyomuş demekki :D
Şöyle bir baktım da galiba haklısın :D Yine de eksiği var, düzeltilmesi gereken bir de derinlemesine değil (zaten giriş :) ), teşekkür ederim.

Alıntı yapılan: heartsmagic - 23 Şubat 2010 - 14:13:18
Ara çok kısa oldu bu sefer :) Eline sağlık.
İnşallah daha kısa aralar da görürüz, burayı programlama ile doldurmaya karar verdim, yoldan geçen yolculara hem gittiğimde hatıra kalır. Teşekkür ederim.
susema

sem

Teşekkürler @semagkyz;
Eline sağlık çok güzel bir döküman olmuş. Teşekürler uğraşların için. Bir şeye takıldım da sormak isterim onu da. C'de artık dizi uzunlukları değişken olabiliyor diye biliyorum. Deneme amaçlı şu kodu çalıştırdım oldu.


#include <stdio.h>
int main()
{
   int diziboyutu,k;
   char ch;
   printf("dizinin boyutu ne olsun:");
   scanf("%d",&diziboyutu);
   ch = getchar();//stdin tamponu için

   char dizi[diziboyutu]; //--->>diziboyutu sabit değil
   
   for(k = 0; k <= diziboyutu; ++k)
   {  printf("dizi[%d] elemanini girin:",k);   
      scanf("%c",&dizi[k]);
      ch = getchar();//stdin tamponu için
   }   
   printf("Girilen dizi:%s\n",dizi);
return 0;
}


Dediğinizi ben mi yanlış anladım acaba. İyi geceler...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

sema

Yok gayet güzel anlamışsınız. Durun düzelteyim. Aslında dizileri gece geç yazmıştım hata bekliyordum da ses çıkaran olmayınca ses çıkarmamıştım. Teşekkür derim :)
susema

sem

Biz teşekkür ederiz paylaşım için...
".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

hitokiri

http://wiki.ubuntu-tr.net/index.php/C%27ye_Buradan_Ba%C5%9Flasak
Evet galiba üçünü de ekledim ,
Heehe şablon manyağı oldu wiki :D :P
teşekkür ederiz paylaşım için... :)

pwl

@ semagkyz, ellerinize emeklerinize sağlık.

sema

Alıntı yapılan: hitokiri - 13 Mayıs 2010 - 04:34:24
http://wiki.ubuntu-tr.net/index.php/C%27ye_Buradan_Ba%C5%9Flasak
Evet galiba üçünü de ekledim .

:D Eline sağlık, galiba üçünü de eklemişsin. Zahmetli iş cidden :P

Alıntı yapılan: pwl - 13 Mayıs 2010 - 04:39:04
@ semagkyz, ellerinize emeklerinize sağlık.

Çok teşekkürler @pwl  :)
susema