Cevapla  Konu Gönder  Paylaş
 
Derecelendir
  • 0 Oylar - 0 Yüzde
  • 1
  • 2
  • 3
  • 4
  • 5
C Programlama Dili Diziler
Yazar Mesaj
µGµr Çevrimdışı
www.ugurgorgulu.com
*******

Katılım: Jan 2009
Mesajlar: 1,246
Cinsiyet: Male
Nerden:
Karma Puanı: 20

Paylaşım Puanı: +1382
Mesaj: #1
C Programlama Dili 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}

0 1 2 3 4 5 6 7 8 9
25 18 20 0 29 5 4 8 19 13


Dizi Kullanıma Örnekler

Ö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+1)*(i+1);

for (i=0; i<=9; i++)
printf(\"%d . elemanın değeri = %d\n\", i, a);
}

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 + 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 = fib[i-1] + fib[i-2];


clrscr();
for (i=0; i<=19; i++)
printf(\"%d . Fibonacci sayısı = %d\n\", i, fib);
}


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);
}

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

for (i=9; i>=0; i--)
printf(\"%d . sırada girilen sayı = %d\n\", 9-i, a);
}

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 + 1 ;


clrscr();
printf(\"Dizinin elemanlarının değerleri\n\");
for (i=0; i<=9; i++)
printf(\"%d \",a);

kareleri(a);

printf(\"\n\nKare alma işlemi sonrası dizinin elemanlarının değerleri\n\");

for (i=0; i<=9; i++)
printf(\"%d \",a);
}

void kareleri(int a[])
{
int i;

for (i=0; i<=9; i++)
a = a * a;
}


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);
- doğrudan değer atayarak a = 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 = %f\n\", 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);
}
}
float ortalama(int ogr[])
{
float x;
int i;

x = 0;
for (i=0; i<OGR_SAY; i++)
x = x + ogr;
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;
b = 2 * i;
}

dizitopla(a, b, c);

clrscr();
for (i=0; i<MAX; i++)
printf(\" %4d + %4d = %4d \n\", a, b, c);
}

void dizitopla(int a[], int b[], int c[])
/* c = a +b */
{
int i;

for (i=0; i<MAX; i++)
c = a + b;
}



5.3 Sıralama
Dizi elemanlarının küçükten büyüğe veya büyükten küçüğe doğru dizilmesi işlemi. Farklı performansa sahip birçok yöntem vardır. Şimdilik en basit olanlardan biri incelenecektir.

Selection Sort (seçim)

Dizinin en küçük elemanı bulunur ve birinci eleman ile yer değiştirilir. Bu işlem (n-1). elemana kadar tekrar edilir. Her adımda en küçük eleman dizinin kalan elemanlarından bulunur. Örneğin aşağıda 4 elemanlı bir diziye yöntemin uygulanması gösterilmiştir.



Buble Sort

Bu yöntemde ardışıl iki eleman karşılaştırılır. Eğer önceki eleman sonrakinden büyük ise elemanlar yer değiştirilir. Bu şekilde dizi taranır. Eğer herhangi bir değişiklik yapılmış ise işlem tekrar edilir.


Başlangıç 1. adım 2. adım 3. adım
34 21 18 18
21 18 21 21
18 25 25 25
25 34 34 34

Görüldüğü gibi, bu yöntemde dizi sıralandıktan sonra bir defa daha taranıyor.


Selection Sort Kodlaması

1. Dizinin en küçük elemanının indisini veren işlev
2. Bu işlevi kullanarak diziyi sıralama

Bubble Sort Kodlaması


5.4 Ç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.

1.Ay 2.Ay 3.Ay 4.Ay 5.Ay 6.Ay 7.Ay 8.Ay 9.Ay 10.Ay 11.Ay 12.Ay
1
2
3
4
5


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 = enbuyuk(a,i);

/* Satirdaki elemanlarin toplamlarinin olusturdugu matris */
for (i = 0; i < SATIR; i++)
{
c = 0;
for (j = 0; j < SUTUN; j++)
c = c + a[j];
}

clrscr();

for (i = 0; i < SATIR; i++) {
for (j=0; j<SUTUN; j++)
printf(\"%3.0f \", a[j]); /* Biçimli yazdırma */

printf(\" %4.0f %4.0f\n\",b,c);
}

}


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] > r)
r = a[sat];
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[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©;

if (simetrik(a))
printf(\"Simetriktir\n\");
else
printf(\"Simetrik değildir\n\");


*/

getch();

}

void matris_oku(int a[][SUTUN])
{
int i, j;

for (i = 0; i < SATIR; i++)
for (j = 0; j < SUTUN; j++)
a[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[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[j] != a[j]) {
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[j] = a[j];
}

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[j] = 0;
for (k=0; k<SUTUN; k++)
c[j] = c[j] + a[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[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];
sx2 = sx2 * a[k][SATIR-k];
}
s = s + sx1 - sx2;
}

*/
return s;
}



RadyouGur.com Wink
01-16-2009 21:42
Kullanıcının websitesini ziyaret et Bu kullanıcının gönderdiği tüm mesajları bul Bu mesaji bir cevapta alıntı yap
« Önceki | Sonraki »
Cevapla 


Benzeyen Konular
Konu: Yazar Cevaplar: Görüntüleyenler: Son Mesaj
  C Programlama Dili Problem Çözme ve Algoritmalar µGµr 0 142 01-16-2009 21:48
Son Mesaj: µGµr
  C Programlama Dili Programlamaya Giriş µGµr 0 261 01-16-2009 21:46
Son Mesaj: µGµr
  C Programlama Dili Döngü ve Koşul Deyimleri µGµr 0 260 01-16-2009 21:44
Son Mesaj: µGµr
  C Programlama Dili İşlevler µGµr 0 137 01-16-2009 21:43
Son Mesaj: µGµr
  C Programlama Dili Karakter işleme µGµr 0 122 01-16-2009 21:41
Son Mesaj: µGµr

Foruma Git:


Bize Ulaşın | PaylasimTR.net | En üste Dön | İçeriğe Dön | Arşiv | RSS Beslemesi
Damar Radyo | Alem FM Dinle |Slow Türk Dinle |Radyo Fenomen Dinle |Meltem Radyo Dinle |Radyo Mydonose Dinle | Power Türk Dinle | Park Fm Dinle
Oyun Oynayalım