C
Programlama Dili
DERS – 13
Dizi, benzer elemanlardan oluşur. Diğer bir değişle dizi, aynı tip verilerin oluşturduğu küme biçimidir. Bahsettiğimiz küme ise matematikteki kümelerden biraz farklıdır. Biri dizi tanımlandıktan sonra, dizi elemanları bellekte peşpeşe saklanır. Bu yüzden diziler aynı tip verilerin toplanıp tek isimle adlandırılan veri bölgeleridir. Temel olarak iki özelliği mevcuttur.
- Dizi elemanlarının bellekte (program çalıştığı sürece) sürekli biçimde bulunması.
- Dizi elemanlarının aynı türden değişkenler olması.
Dizi elemanlarına ulaşmak için indisler kullanılır. İndisler tam sayı ifadeler olup, n tane dizi elemanının 0 ile n-1 arasında indislere sahip elemanları vardır.
Dizi Tanımı ve Kullanımı
Tip_adı değişken [boyut];
Tip_adı: Dizi elemanlarının tipi (int, float, char, vb.)
değişken: Dizinin adı,
boyut: Dizi boyutu(dizideki eleman sayısı]
ÖRNEK: int a[100];
Burada a isimli değişkenimizi, 100 tam sayı (100 elemanlı) alacak biçimde, bir dizi şeklinde tanıtmış olduk. Bu 100 veriye de a değişkeni ile erişilebilir. Dizideki herhangi bir elemana erişmek için, o elemanın sahip olduğu indis bilgisiyle çağırmak gerekir. Dizilerde ilk eleman 0 indislidir.
int a[100]={8,25,70,5,11,0,9,13,42}; için
a[0]= 8
a[1]= 25
a[5]= 11
a[k]= dizinin k. indisli elemanı olup, dizinin k+1. elemanını belirtir
a[0]= dizinin 1. elemanı
a[1]= dizinin 2. elemanı
a[10]= dizinin 11. elemanı gibi…
1 2 3 4 5 6 7 8 9 |
#include <stdio.h> void main() { int a[10] = {8, 25, 70, 5, 11, 0, 9, 4, 13, 42}; int i; for (i = 0; i <= 9; i++) { printf("%d . elemanin degeri = %d\n", i, a[i]); } } |
ÖRNEK: Kullanıcının istediği sayıda dizi elemanı oluşturma.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <stdio.h> int main() { int a[100]; int i, n; printf("Dizi eleman sayisini gir > "); scanf("%u", &n); for (i = 0; i < n; i++) { printf("Dizinin [%u]. elemanini gir > ", i + 1); scanf("%d", &a[i]); } printf("\n\nOlusturulan dizi ve elemanlari :\n a[%d] = \{ ", n); for (i = 0; i < n; i++) { printf("%d, ", a[i]); } printf("}\n\n"); return 0; } |
Yukardaki programı incelersek; int a[100]; ile tamsayı tipinde 100 elemanlı bir a değişkenli dizi tanımladık. printf(“Dizi eleman sayisini gir > “); scanf(“%u”, &n); ile dizimizin kaç elemandan oluşacağını belirledik.
for (i = 0; i < n; i++) { printf(“Dizinin [%u]. elemanini gir > “, i + 1); scanf(“%d”, &a[i]); }
Burada bir döngü oluşturarak dizi elemanlarının scanf ile klavyeden girilmesini sağladık. i=0 döngü başlangıcımız. n değerimiz yani, dizi eleman sayımız 10 olsun. i değeri 10 dan küçük olduğu sürece döngü gövdesi içindeki işlemler devam edecektir. printf(“Dizinin [%u]. elemanini gir > “, i + 1); %u ile ekranda görülmesini istediğimiz işaretsiz tam sayıyı belirttik. bu değerin karşılığı olarakta i+1 değişkenini tanımladık. i+1 yerine i değerini yazsaydık o zaman Dizinin [1]. elemanını girin yerine, Dizinin [0]. elemanını girin yazacaktı. daha iyi anlaşılsın diye i yerine i+1 değerini yazdık. scanf(“%d”, &a[i]); yazarak dizinin i indisli değişkenine değer atadık. Mesela i=0 için 5 yazarsak, a[0]=5 değerini alır. i=1 için125 yazarsak a[1]=125 değerini alır. Döngü sonlanana kadar a[i] değerlerine atamalar yapılır.
printf(“\n\nOlusturulan dizi ve elemanlari :\n a[%d] = \{ “, n); for (i = 0; i < n; i++) { printf(“%d, “, a[i]); }
Yukardaki kodlardan da anlaşılacağı şeklide artık oluşturduğumuz diziyi ekranda yazdırmak istiyoruz. printf(“\n\nOlusturulan dizi ve elemanlari :\n a[%d] = \{ “, n); ile döngüye girmeden önce ekranda görülmesini istediğimiz yazıları yazıyoruz. Eğer bunları döngü içerisine yazsaydık, o zaman i nin her değeri için bu yazıyı yazacak ve karmaşık bir durum ortaya çıkacaktı. for (i = 0; i < n; i++) ile i=0 dan başlıyarak koşul sağlandığı müddetçe döngü gövdesinin işlemesini sağlıyoruz. printf(“%d, “, a[i]); ile %d yerine i indisli atanmış değerleri yazdırıyoruz. n=10 için a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], a[9], indisli elemanları sırayla yazdırmış oluyoruz.
#define ön işlemci komutu (preprocessor directive)
#define ön işlemci komutu sembolik sabit tanımlamada kullanılır. Diğer bir değişle, kaynak dosyada bir isim yerine başka bir ismin yerleştirilmesini sağlar. Programda kullanılan bu simgesel isimler ana programda kullanıldığı gibi, alt programlarda da aynı değere sahiptir. #define ön işlemci komutuyla tanımlanan şey, bütün fonksiyonlarda kullanılabilir. Bir çeşit, global (genel) değişken gibi davranır. Oldukça basit bir kullanımı vardır. Tek yapmamız gereken, neyin yerine neyi kullanacağımızın kararını vermektir.
Kullanım Şekli:
#define sabit_adı değeri
#define PI 3.1415926
#define : Ön işlemci komutuyla sembolik sabit tanımlanacağı belirtilir.
sabit_adı : İşlemlerde kullanacağımız adı belirtir (PI).
değeri : sabit_adı yazdığımız zaman alacağı değeri belirtir (3.1415926).
Basit bir örnekle başlayalım.
1 2 3 4 5 6 7 8 9 10 11 |
#include <stdio.h> void main() { int a[10] = {8, 25, 70, 5, 11, 0, 9, 4, 13, 42}; int i; for (i = 0; i <= 9; i++) { printf("%d . elemanin degeri = %d\n", i, a[i]); } } |
Daha önce yazmış olduğumuz programda #define ön işlemcisini kullanarak yazalım.
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <stdio.h> #define MAX 10 void main() { int a[MAX] = {8, 25, 70, 5, 11, 0, 9, 4, 13, 42}; int i; for (i = 0; i <= 9; i++) { printf("%d . elemanin degeri = %d\n", i, a[i]); } } |
#define MAX 10 ile simgesel olarak tanıttığımız MAX isminin değerinin 10 olduğunu belirtiyoruz. Artık MAX yazdığımız her yerde 10 değeri atamış oluyoruz.
#define komutuyla basit ve sabit ifadeler yazabiliriz. Ancak kullanımı bununla kalmaz. İstersek bazı fonksiyonların isimlerini bile değiştirebiliriz. Bazı örneklerle açıklamaya çalışalım.
#define ALAN 12.46
#define CEVRE 14.10
Yukardaki örneklerde bir yerin alanını ve çevresini sembolik olarak tanıttık. Artık işlemlerde alan veya çevre değerlerini kullanmak istediğimizde sadece önişlemci adını yazarak bu değerlere ulaşabiliriz.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <stdio.h> #define MAX 10 #define EKRAN printf void main() { int a[MAX] = {8, 25, 70, 5, 11, 0, 9, 4, 13, 42}; int i; for (i = 0; i <= 9; i++) { EKRAN("%d . elemanin degeri = %d\n", i, a[i]); } } |
Yukarıdaki yazılımı derleyiciyle çalıştırdığımızda değişen bir şeyin olmadığını göreceğiz. Burada EKRAN simgesiyle printf fonksiyonu tanımlanmış oldu. Mesela scanf fonksiyonu içinde #define KLAVYE scanf şeklinde bi tanımlama yapabiliriz.
Dizilerde Sıralama
Bazı uygulamalarda bir kısım sayıların büyükten küçüğe ya da küçükten büyüğe sıralanması istenebilir. Bu aslında yazılım uygulamalarının en önemli problemlerinden biridir. Bu problemi çözmek için çeşitli algoritmalar oluşturulmuştur. En basit yöntem ise yer değiştirme yöntemidir. Örnek olarak 5 elemanlı bir diziyi küçükten büyüğe sıralayalım.
Sıralamasını yapmak istediğimiz dizi int dizi[5] = {10, 8, 3, 1, 6} olsun.
Yer değiştirme işlemi geçici bir değişken kullanılarak yapılır. bu değişkenimizin ismi gecici ( temp) olsun.
gecici = dizi[i];
dizi[i] = dizi[j];
dizi[j] = gecici;
a[0] | a[1] | a[2] | a[3] | a[4] | ||
i=0 | j=0 | 10 | 8 | 3 | 1 | 6 |
i=0 | j=1 | 8 | 10 | 3 | 1 | 6 |
j=2 | 3 | 10 | 8 | 1 | 6 | |
j=3 | 1 | 10 | 8 | 3 | 6 | |
j=4 | 1 | 10 | 8 | 3 | 6 | |
i=1 | j=2 | 1 | 8 | 10 | 3 | 6 |
j=3 | 1 | 3 | 10 | 8 | 6 | |
j=4 | 1 | 3 | 10 | 8 | 6 | |
i=2 | j=3 | 1 | 3 | 8 | 10 | 6 |
j=4 | 1 | 3 | 6 | 10 | 8 | |
i=3 | j=4 | 1 | 3 | 6 | 8 | 10 |
Örnek: Basit sıralama ile dizi elemanlarını küçükten büyüğe doğru sıralama.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
#include <stdio.h> #include <stdlib.h> #define MAX 100 void main() { int i, j, n, gecici, dizi[MAX]; printf("Dizinin eleman sayisini giriniz > "); scanf("%d",&n); printf("Dizi elemanlarini giriniz > \n\n"); for(i=0 ; i < n; i++) { printf("%3d. eleman: ",i+1); scanf("%3d",&dizi[i]); } printf(" Girilen dizi :"); for(i=0 ; i < n; i++) { printf("%3d",dizi[i]); } printf("\n"); for(i=0; i<(n-1); i++) { for(j=i+1; jdizi[j]) { gecici=dizi[i]; dizi[i]=dizi[j]; dizi[j]=gecici; } } } printf("\n Dizinin Sirali Hali: { "); for(i=0 ; i < n; i++) { printf("%3d,",dizi[i]); } printf(" }"); getch(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#include <stdio.h> /*fibonacci tanımı; * f[0] = 0, f[1] = 1, f[i+1] = f[i] + h[i-1] */ void main() { int fib[25]; int i; fib[0] = 0; fib[1] = 1; for (i = 2; i <= 24; i++) fib[i] = fib[i - 1] + fib[i - 2]; for (i = 0; i <= 24; i++) printf("%3d. Fibonacci sayisi = %d\n", i, fib[i]); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <stdio.h> int main() { int dizi[12] = {1, 3, 5, 7, 9, 12, 15, 18, 21, 24, 27, 30}; int i, j; printf("%s %11s %15s \n", "ELEMAN", "DEGERI", "SEKIL"); for (i = 0; i < 12; i++) { printf("%3d %12d ", i, dizi[i]); for (j = 1; j <= dizi[i]; j++) printf("%c", '#'); printf("\n"); } return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#include <stdio.h> int main() { int dizi[100], i, j, n, gecici; printf("Dizi kac elemandan olusacak ? > "); scanf("%u", &n); printf("\nDizi elemanlarini gir > \n"); for (i = 0; i < n; i++) { printf("Dizinin [%d] . elemanini gir >", i + 1); scanf("%d", &dizi[i]); } printf("\n\nGirmis oldugunuz dizi elemanlari = "); for (i = 0; i < n; i++) { printf("%3d ", dizi[i]); } for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { if (dizi[i] > dizi[j]) { gecici = dizi[i]; dizi[i] = dizi[j]; dizi[j] = gecici; } } } printf("\n\nDizinin siralanmis hali \t = "); for (i = 0; i < n; i++) { printf("%3d ", dizi[i]); } printf("\n\nDizinin en buyuk elemani \t = "); for (i = 0; i < 1; i++) { printf("%3d ", dizi[0]); } return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#include <stdio.h> int yildiz() { int x; for (x = 0; x < 30; x++) { printf("*"); } printf("\n"); } int main() { int giris, sayi[100], tek[100], cift[100], i, j, k; printf("Kac sayi gireceksiniz ? > "); scanf("%u", &giris); yildiz(); for (i = 0; i < giris; i++) { printf("Lutfen %d . sayiyi girin > ", i + 1); scanf("%d", &sayi[i]); } yildiz(); printf("Girilen sayilar: "); for (i = 0; i < giris; i++) { printf("%d, ", sayi[i]); } printf("\n"); yildiz(); printf("Cift Sayilar = "); for (i = 0; i < giris; i++) { if (sayi[i] % 2 == 0) { printf("%d, ", sayi[i]); } } printf("\n"); yildiz(); printf("Tek sayilar = "); for (i = 0; i < giris; i++) { if (sayi[i] % 2 == 1) { printf("%d, ", sayi[i]); } } printf("\n"); yildiz(); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
#include <stdio.h> int sekil_1() { int x; for (x = 0; x < 50; x++) { printf("%c", 177); } } int sekil_2() { int x; for (x = 0; x < 50; x++) { printf("%c", 240); } } int main() { int dizi[100], i, j, n, gecici; printf("\nDizi kac elemandan olusacak ? = "); scanf("%u", &n); sekil_1(); /****************************************************/ printf("\nLutfen dizi elemanlarini gir > \n"); sekil_2(); printf("\n"); for (i = 0; i < n; i++) { printf("Dizinin [%d]. elemanini girin > ", i + 1); scanf("%d", &dizi[i]); } sekil_1(); printf("\nOlusturulan dizi = { "); for (i = 0; i < n; i++) { printf("%3d ", dizi[i]); } printf(" }\n"); sekil_1(); /****************************************************/ for (i = 0; i < n; i++) { for (j = 0; j < n; j++) { if (dizi[i] > dizi[j]) { gecici = dizi[i]; dizi[i] = dizi[j]; dizi[j] = gecici; } } } printf("\nDizinin en buyuk elemani = "); for (i = 0; i < 1; i++) { printf("%d", dizi[0]); } printf("\n"); sekil_2(); printf("\nDizinin en kucuk elemani = "); for (i = 0; i < 1; i++) { printf("%d", dizi[n - 1]); } printf("\n"); sekil_1(); /****************************************************/ printf("\nEn buyuk ile en kucuk eleman farki = "); for (i = 0; i < 1; i++) { printf("%d", dizi[0] - dizi[n - 1]); } printf("\n"); sekil_1(); printf("\n\n"); return 0; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#include <stdio.h> void main() { int a[10]; int i; for (i = 0; i <= 9; i++) { printf("%d. sayiyi gir > ", i); scanf("%d", &a[i]); } printf("\n-----------------------\n"); for (i = 9; i >= 0; i--) printf("%d . sirada girilen sayi = %d\n", 9 - i, a[i]); } |