You are on page 1of 109

BİLGİSAYAR PROGRAMCILIĞI (UE)

Oturum 10: Algoritma ve Programlamaya Giriş

DİZİLER (TEK BOYUTLU)

Osman Bülent Baykal

1
DİZİLER
Değişkenleri öğrenirken gördük ki her değişkene sadece bir değer
atayabiliriz. Bazı durumlarda aynı tipteki değişkenleri bir arada tutma
ihtiyacı duyabiliriz. C# bize aynı tipteki değişkenleri tek bir adla
saklayabileceğimiz dizileri (Array) sunmaktadır. Dizi (array), ortak isimle
anılan aynı tipteki veriler topluluğudur. Diziler bir programlama dilindeki
en önemli veri yapılarından biridir. Bu modül içerisinde dizi oluşturma,
diziye değer girme, diziyi yazdırma, dizilerde arama, dizilerde sıralama,
dinamik diziler yapmayı öğreneceğiz. Bir dizi, aynı tipe ait bir miktar
eleman içeren bir veri yapısıdır. Dizileri hep bir arada yer alan değişkenler
listesi gibi düşünebiliriz. Örneğin 5 tane sebze ismini tek bir liste
içerisinde tutmak istersek bir dizi kullanabiliriz.

ue.aydin.edu.tr 2
DİZİ OLUŞTURMA
Bir dizi, boş parantezler ve bir değişken ismi tarafından takip edilen dizi içindeki
elemanların tipini tanımlayarak bildirilir;

ue.aydin.edu.tr 3
TANIMLAMALAR
1.yol

tip[] dizi-ismi=new tip[eleman-sayısı];


Burada tip, dizinin temel veri türünü belirlemek için kullanılır.
Temel veri türü, dizi içerisinde saklanacak olan verinin türünü
belirler. Tip ifadesinden hemen sonra köşeli parantezler ([ ])
geldiğine dikkat edin. Köşeli parantezler, burada tek boyutlu bir
dizinin tanımlandığını belirtirler. Eleman-Sayısı ile de dizinin
içerisine ne kadar eleman tutulacağını belirtilir. Örneğin, metinsel
ifade (string) türde elemanlarını içeren bir dizi aşağıdaki gibi
belirtilir.
string[] sebzeler=new string[5]; Yukarıda tanımlaması
gerçekleştirilen sebzeler isimli dizi içerisinde 5 adet string
türünde veri tutabiliriz. Oluşturmuş olduğumuz dizi kavramsal
olarak şu şekilde görünür;

4
Dizinin kavramsal görünüşü

Yukarıda tanımlaması gerçekleştirilen sebzeler isimli dizi içerisinde 5 adet string


türünde veri tutabiliriz. Oluşturmuş olduğumuz dizi kavramsal olarak şu şekilde
görünür;
Marul Ispanak Biber Domates Salatalık
sebzeler[0] sebzeler[1] seb zeler[2] seb zeler[3] seb zeler[4]

5
Sebzeler dizisi

ue.aydin.edu.tr 6
Tanımlamalar
2.yol

int[] rakamlar=new int[10];


Eğer tam sayı (integer) türünde eleman içeren bir dizi tanımlamak istiyorsak
yukarıdaki yolu da izleyebiliriz. Yukarıdaki tanımlamada da rakamlar isimli dizi
içerisinde 10 adet int türünde veri tutabiliriz.

ue.aydin.edu.tr 7
Tanımlamalar
3.yol

int[] notlar={65,76,85}; Bu tanımlama yöntemiyle tek boyutlu 3 elemandan oluşan


int türünde bir dizi tanımlamış olduk. Dikkat ederseniz yukarıdaki dizinin
tanımlanması esnasında herhangi bir boyut (eleman sayısı) belirtilmedi. Bu
durumlarda ilk anda kaç adet eleman girişi yapıldıysa dizinin boyutu da o kadar
olur. İstenirse aşağıdaki gibi dizinin boyutu belirtilerek de tanımlama
gerçekleştirilebilir;
int[] notlar=new int[3]{65,76,85};

ue.aydin.edu.tr 8
Diziye değer girme
Bir dizi tanımlandıktan sonra sıra o diziye değer girmeye gelir. Bir diziye değer
girişleri tanımlama esnasında yapılabildiği gibi, programın akışı esnasında da
gerçekleştirilebilir. Dizi tanımlandıktan sonra, dizinin her bir elemanı için indeks
değerleriyle elemana erişerek değer ataması şu şekildedir;
int[] notlar=new int[3];
notlar[0]=65; notlar[1]=76; notlar[2]=85;
Bir diğer yöntemde bir önceki konuda gördüğümüz, dizi oluşturulurken değer
girmeyi tekrar hatırlarsak; int[] notlar=new int[3]{65,76,85};

ue.aydin.edu.tr 9
int[] notlar= {65,76,85}; şeklinde tanımlama esnasında değer girişi yapabiliriz.
Yukarıda her iki örnekte de verilen notlar dizisinin kavramsal gösterimi şu
şekildedir;

ue.aydin.edu.tr 10
Char (karakter) türündeki bir dizinin ilk kullanımına hazırlanması da şu şekillerde
gerçekleştirilir; char[] harfler = new char[]{'r','T','h','Y'};
veya
char[] harfler=new char[4]; harfler[0] = 'r'; harfler[1] = 'T'; harfler[2] = 'h'; harfler[3] =
'Y';
String (metinsel) türdeki bir dizinin ilk kullanımına hazırlanması da şu şekillerde
gerçekleştirilir; string[] sebzeler = new string[] { "Marul", "Ispanak", "Biber",
"Domates", "Salatalık" };
veya
string[] sebzeler=new string[5]; sebzeler[0] = "Marul"; sebzeler[1] = "Ispanak";
sebzeler[2] = "Biber"; sebzeler[3] = "Domates"; sebzeler[4] = "Salatalık";

ue.aydin.edu.tr 11
Bir dizi içerisindeki elemanlara tek tek dizi indeksi yardımıyla erişilebilir.
Dizi indeksi (array index), bir elemanın dizi içerisindeki konumunu ifade
eder. Genellikle programlama dillerinde dizilerin ilk elemanının indeksi
sıfır (0)’dır. Örneğin 10 elemanlı bir dizi varsa, bu dizinin indeks
numaraları 0-9 arasındadır. Dizinin tüm elemanlarına değil de bir kısmına
değer girişi yapmamız isteniyorsa, ilgili değerin barındırılacağı indeksine
değer atama işlemi gerçekleştirilir.
int[] plakalar=new int[10]; plakalar[2] = 43; plakalar[5] = 16; plakalar[6] =
66; plakalar[9] = 6;

ue.aydin.edu.tr 12
Yukarıda tanımlanan plakalar isimli dizinin 2,5,6 ve 9 numaralı indeks
konumlarına değer ataması gerçekleştirilmiş ve kavramsal görüntüsü şu şekilde
oluşmuştur.

ue.aydin.edu.tr 13
Yukarıda tanımlaması gerçekleştirilen sebzeler isimli dizinin kavramsal görüntüsü
de şu şekildedir;

ue.aydin.edu.tr 14
Dikkat ederseniz int türündeki dizilerde boş kalan dizi hücrelerine sıfır(0) değeri,
string türündeki dizilerde de boş kalan hücrelere boş (null-“”) değer
yüklenmektedir.

ue.aydin.edu.tr 15
ÖRNEKLER
Örnek 3-1:
Rakamlar isimli dizi içerisine 0-9 arası rakamları tersten bir döngü yardımıyla
yükleyiniz.
int[] rakamlar = new int[10]; int i; for (i = 0; i <= 9; i++) rakamlar[i] = 9 - i;
Dizilerle çalışırken dikkat etmemiz gereken noktalardan en önemlisi dizi
sınırlarına sadık kalmaktır. Eğer 10 elemanlı bir dizi tanımlamışsak ve bu dizi
tanımlanırken belirlenen eleman sayısından fazla sayıda eleman değeri atamaya
çalışırsak hata alırız.

ue.aydin.edu.tr 16
DİZİYİ YAZDIRMA
Bir dizinin elemanlarına indeks numaraları vasıtasıyla erişebileceğimizi daha
önce de bahsetmiştik. Erişilen bu elemanlarla ilgili işlemlerden birisi de ekrana
yazdırma işlemidir. Erişilen değerlerinin ekrana yazdırılması işlemi şu şekilde
gerçekleştirilir;
int[] plakalar=new int[10]; plakalar[2] = 43; plakalar[5] = 16; plakalar[6] = 66;
plakalar[9] = 6; Aşağıdaki işlemler yukarıda tanımlanmış olan diziye göre
gerçekleştirilmektedir.
Console.WriteLine(plakalar[2]); Console.WriteLine(plakalar[3]);
Console.WriteLine(plakalar[4]); Console.WriteLine(plakalar[5]);
Yukarıdaki kod parçası çalıştırıldığında ekrana
43
0
0
16
değerleri yazılır.

ue.aydin.edu.tr 17
Bir dizi içerisindeki tüm değerleri ekrana yazdırmak istiyorsak döngü kullanmak
gayet mantıklı olacaktır. Örneğin 200 elemanlı bir dizinin tüm elemanlarını ekrana
yazdırmak istersek alt alta 200 satır kod yazmamız mümkün değildir.
Örnek : Plakalar isimli dizi içerisinde bulunan bütün elemanları ekrana yazdıran
programın kodunu yazınız.
int[] plakalar = new int[10]; int sayac = 0; plakalar[2] = 43; plakalar[5] = 16;
plakalar[6] = 66; plakalar[9] = 6; foreach (int note in plakalar)
{ Console.WriteLine("plakalar["+sayac+"] :"+note); sayac++; }

ue.aydin.edu.tr 18
Yukarıdaki kodlar çalıştırıldığı zaman aşağıdaki gibi bir ekran çıktısı ile
karşılarız

ue.aydin.edu.tr 19
Örnek :
Önceki örnekteki plakalar dizisini bir de for döngüsüyle ekrana yazalım.
Ancak, burada dikkat etmemiz gereken husus for döngüsünün bitiş değerini
dizimizin eleman sayısını bildiğimiz için buna göre belirledik.

ue.aydin.edu.tr 20
BAZI DİZİ ÖZELLİKLERİ ve METHODLARI

Diziler, .NET Framework içinde tanımlı Array sınıfı temsil eder. Tüm diziler
Array sınıfında tanımlı özellikleri ve metotları kullanırlar. Bu metotlardan ve
özelliklerden en sık kullanılanları şunlardır;
Length,
Clear,
Reverse

ue.aydin.edu.tr 21
LENGTH
Dizinin saklayabileceği toplam eleman sayısını veren ve int türünde bir
değer veren özelliktir.
Kullanımı: dizi-adi.Length;
Örnek : ciftSayilar isimli dizinin içerisinde kaç adet eleman olduğunu
ekrana yazan programın kodunu yazınız. int[] ciftSayilar = new int[10];
elemanSayisi = ciftSayilar.Length;
Console.WriteLine("ciftSayilar dizi içerisinde toplam {,0} eleman
bulunmaktadır.",elemanSayisi);
Yukarıdaki kodları çalıştırdığımız zaman aşağıdaki gibi bir ekran görüntüsü
alırız;

ue.aydin.edu.tr 22
CLEAR
Parametre olarak verilen dizinin, belirtilen indeks aralığındaki tüm değerlerini
temizler. Temizleme işleminde atanan değer, dizi elemanlarının tiplerine göre
değişir. Örneğin int tipinde tanımlı bir dizinin elemanları temizlenirse 0 değerini
alacaktır. Buna karşın String tipindeki elemanlar ″″ (boş yazı) değerini alır.
Kullanımı: Array.Clear(diziAdi,baslangicIndeksi,Adet);
Örnek 3: Yeni tanımladığımız ve içeriğini oluşturduğumuz bir dizinin
elemanlarının nasıl silindiğini inceleyelim;
int[] sayilar = new int[] { 43, 16, 66, 26 };
Console.WriteLine("Temizlenmeden önce dizinin elemanları");
Console.WriteLine("-------------------------------------");
for (int i = 0; i < sayilar.Length; i++)
Console.WriteLine("sayilar[{0}]: {1}", i,sayilar[i]);

ue.aydin.edu.tr 23
Array.Clear(sayilar, 1, 2);
Console.WriteLine("\nTemizlendikten sonra dizinin elemanları");
Console.WriteLine("-------------------------------------");
for (int i = 0; i < sayilar.Length; i++) Console.WriteLine("sayilar[{0}]: {1}", i,
sayilar[i]);

ue.aydin.edu.tr 24
Yukarıdaki kodları çalıştırdığımız zaman aşağıdaki gibi bir ekran görüntüsü
alırız;
Yukarıdaki Örneği incelediğimizde Array.Clear(sayilar,1,2); komut satırı ile
sayilar dizisinin 1 nolu indeksinden başlayarak 2 adet dizi elemanının değerini
temizlemiş olduk. Yani dizi elemanlarının değerlerinin yerine 0 değeri verilmiş
oldu.

ue.aydin.edu.tr 25
Örnek : Clear metodunu bir de string bir dizi üzerinde deneyip sonuçlarını
inceleyelim.
string[] metin = new string[] { "rtyucel", "moymul", "tavşanlı", "kütahya" };
Console.WriteLine("Temizlenmeden önce dizinin elemanları");
Console.WriteLine("-------------------------------------");
for (int i = 0; i < metin.Length; i++)
Console.WriteLine("metin[{0}]: {1}", i, metin[i]);

ue.aydin.edu.tr 26
Array.Clear(metin, 2, 2);
Console.WriteLine("\nTemizlendikten sonra dizinin elemanları");
Console.WriteLine("-------------------------------------");
for (int i = 0; i < metin.Length; i++)
Console.WriteLine("metin[{0}]: {1}", i, metin[i]);

ue.aydin.edu.tr 27
Yukarıdaki kodları çalıştırdığımız zaman aşağıdaki gibi bir ekran görüntüsü
alırız;
Yukarıdaki örneği incelediğimizde Array.Clear(metin,2,2) satırıyla metin
isimli dizinin 2 numaralı indeksinden başlayarak 2 adet kaydın silinmesi
işlemini gerçekleştirdik. Burada yeni değerlerin “” (boş metin) olduğuna
dikkat ediniz.

ue.aydin.edu.tr 28
REVERSE
Parametre olarak verilen dizinin eleman sırasını tersine çevirir. Dizinin tüm
elemanlarının veya belirli indeks aralığındaki elemanlarının sırası tersine
çevrilebilir.
Kullanımı: Array.Reverse(diziAdi);

ue.aydin.edu.tr 29
Örnek : Alfabe adlı dizi içerisine girilen A-Z’ye harfleri tersten
ekrana yazdıran programın kodunu yazınız.

ue.aydin.edu.tr 30
Yukarıdaki kodlar çalıştırılınca aşağıdaki ekran görüntüsü
karşımıza çıkar;

ue.aydin.edu.tr 31
SORT
Sort(Dizi) Parametre olarak verilen dizinin elemanlarını küçükten büyüğe sıralar.
Eğer dizi numerik ise rakamların büyüklüğüne göre, yazı tiplerinde ise baş
harflerine göre sıralanır. Reverse’ün tersidir.
Kullanımı: Array.Sort(diziAdi);

ue.aydin.edu.tr 32
Örnek : Klavyeden girilen 5 sayıyı küçükten büyüğe sıralayan
programı yazınız.

ue.aydin.edu.tr 33
INDEX
İlk parametrede verilen dizide, ikinci parametrede verilen değeri arar. Aranan
değer dizide bulunursa bulunan elemanın indeks değeri, bulunamazsa -1
döndürür.
Kullanımı: Array.IndexOf(diziAdi,arananDeger);

ue.aydin.edu.tr 34
Örnek : Daha önceden değerleri girilmiş olan bir dizi içerisinde istenilen
değeri bulan programın kodunu yazınız.

ue.aydin.edu.tr 35
Uyarı: Eğer aranan=”KÜTAHYA” veya aranan=”kütahya” yazarsanız
Array.IndexOf(iller,aranan) ifadesi geriye -1 değerini döndürür.

ue.aydin.edu.tr 36
Dev C++ (Dizi Örnekleri)
10 elemanlı isimler isminde metin türünden bir dizi oluşturan C++ Kodları.
#include <iostream>
using namespace std;
int main()
{
setlocale(LC_ALL,"Turkish"); //Türkçe karakter

string isimler[10];
}

ue.aydin.edu.tr 38
10 elemanlı sayilar isminde bir dizi oluşturan C++ Kodları.
#include <iostream>
using namespace std;
int main()
{
setlocale(LC_ALL,"Turkish"); //Türkçe karakter

string sayilar[10];
}

ue.aydin.edu.tr 39
5 elemanlı isimler dizisine değer atayan C++ Kodları.
#include <iostream>
using namespace std;
int main()
{
setlocale(LC_ALL,"Turkish"); //Türkçe karakter
string isimler[5];
isimler[0]="Ali";
isimler[1]="Ayşe";
isimler[2]="Hasan";
isimler[3]="Kemal";
isimler[4]="Fatma";
}

ue.aydin.edu.tr 40
Beş elemanlı isimler dizisine isimler ekleyerek 3 nolu elemanı ekranda
görüntüleyen C++ Kodları.
#include <iostream>
using namespace std;
int main() {
setlocale(LC_ALL,"Turkish"); //Türkçe karakter
string isimler[5];
isimler[0]="Ali";
isimler[1]="Ayşe";
isimler[2]="Hasan";
isimler[3]="Kemal";
isimler[4]="Fatma";
cout<<isimler[2]; }

ue.aydin.edu.tr 41
ue.aydin.edu.tr 42
Beş elemanlı tamsayı türünde sayılar dizisi oluşturarak For döngüsü yardımıyla
kullanıcıdan sayı girişi yapmasını sağlayan C++ Kodları
#include <iostream>
using namespace std;
int main()
{
setlocale(LC_ALL,"Turkish"); //Türkçe karakter
int sayilar[5];
for(int i=0;i<5;i++)
{
cout<<i+1<<". Sayı : ";
cin>>sayilar[i];
}
}

ue.aydin.edu.tr 43
ue.aydin.edu.tr 44
Eleman sayısını kullanıcının belirlediği n elemanlı sayısal bir dizi oluşturarak
kullanıcıdan bu dizi içine değer girmesini isteyen C++ Kodları
#include <iostream>
using namespace std;
int main() {
setlocale(LC_ALL,"Turkish"); //Türkçe karakter
int n;
cout<<"Eleman Sayısını Gir : ";
cin>>n;
int sayilar[n];
for(int i=0;i<n;i++) {
cout<<(i+1)<<". Sayı : ";
cin>>sayilar[i]; } }

ue.aydin.edu.tr 45
ue.aydin.edu.tr 46
10 personele ait numara,isim,telefon ve email bilgileri ayrı ayrı dizilerde tutan ve
aranan numaraya göre ilgili kişinin bilgilerini ekranda gösteren C++ Kodları. (Arama
For Döngüsünde yapıldı.)
#include <iostream>
using namespace std;
int main(){
setlocale(LC_ALL,"Turkish"); //Türkçe karakter
string aranan;
int no=-1;
string ogrno[] = { "101", "102", "103", "104", "105", "106", "107", "108", "109", "110" };
string isim[] ={"Ali","Veli","Hasan","Kemal","Can","Ahmet","Mehmet","Enis","Bilal","Burak"};
string telefon[] = {"111","222","333","444","555","666","777","888","999","1000"};
string mail[] = { "aaaa@aaa.aa", "bbbbb@bbb.bb", "cccc@ccc.cc", "dddd@ddd.dd", "eeee@eee.ee", "ffff@eee.ee", "gggg@eee.ee",
"hhhh@eee.ee", "iiii@eee.ee", "jj@eee.eej" };
cout<<"Kişi No'yu girin: ";
cin>>aranan; for(int i=0;i<(sizeof(ogrno)/sizeof(*ogrno));i++) {
if(aranan==ogrno[i]) {
no=i;
break;}
cout<<"==========================================================================="<<endl;
if(no!=-1){
cout<<"Numara : "<<ogrno[no]<<endl<<"Ad : "<<isim[no]<<endl<<"Telefon : "<<telefon[no]<<"mail : "<<mail[no];}
else{
cout<<"Bulunamadı";}
}

ue.aydin.edu.tr 47
ue.aydin.edu.tr 48
C++ ile dizi içindeki sayıların toplamını ve ortalamasını hesaplama örneği
#include <iostream>
using namespace std;
int main()
{
setlocale(LC_ALL,"Turkish"); //Türkçe karakter
float toplam=0,ortalama=0;
int sayilar[]={5,10,15,13,15,22,42};
int n = sizeof(sayilar) / sizeof(sayilar[0]);
for(int i = 0; i < n; i++) {
toplam += sayilar[i];}
ortalama = toplam / n;
cout<<"Dizi Ortalaması : "<<ortalama;}

ue.aydin.edu.tr 49
ue.aydin.edu.tr 50
Dizi İçindeki En Büyük ve En Küçük Değerli sayıları
bularak ekranda gösteren C++ Kodları
#include <iostream>
using namespace std;
int main(){
setlocale(LC_ALL,"Turkish"); //Türkçe karakter
int sayilar[]={5,10,15,13,15,22,42};
int buyuk=sayilar[0];
int kucuk=sayilar[0];
int n = sizeof(sayilar) / sizeof(sayilar[0]);
for(int i = 0; i < n; i++) {
if(sayilar[i]>buyuk); {
buyuk=sayilar[i];}
if(sayilar[i]<kucuk){
kucuk=sayilar[i];}}
cout<<"En Küçük Sayı : "<<kucuk<<endl;
cout<<"En Büyük Sayı : "<<buyuk;}

ue.aydin.edu.tr 51
ue.aydin.edu.tr 52
Boyutunu kullanıcının belirleyeceği bir dizi oluşturarak bu dizi içine rastgele sayılar ekleyen C++ Kodları

#include <iostream>
#include<stdlib.h>
using namespace std;
int main(){
setlocale(LC_ALL,"Turkish"); //Türkçe karakter
int n;
int toplam=0;
cout<< "Eleman sayisini girin : ";
cin>>n;
int sayilar[n];
for (int i=0;i<n;i++){
sayilar[i]=rand() %99+1;
toplam+=sayilar[i];}
for(int i=0;i<n;i++){
cout<<sayilar[i]<<"\t";}
cout<<endl<<"Sayilarin Toplami = "<<toplam;}

ue.aydin.edu.tr 53
ue.aydin.edu.tr 54
10 elemanlı diziyi küçükten büyüğe sıralayan
C++ Kodları
#include <iostream>
#include<stdlib.h>
using namespace std;
int main()
{
setlocale(LC_ALL,"Turkish"); //Türkçe karakter
int temp;
int dizi[]={5,10,15,13,15,22,42,21,99,4};
for(int i=0;i<10-1;i++)
for(int j=0;j<10-1;j++) {
if(dizi[j]>dizi[j+1]) {
temp=dizi[j];
dizi[j]=dizi[j+1];
dizi[j+1]=temp; }}
for (int i=0;i<10;i++){
cout<<dizi[i]<<" ";}

ue.aydin.edu.tr 55
ue.aydin.edu.tr 56
ue.aydin.edu.tr 57
ue.aydin.edu.tr 58
ALT PROGRAMLAR
(Değer döndürmeyen-Değer döndüren)

Osman Bülent Baykal


ALT PROGRAMLAR
Programlama dillerindeki temel düşünce, programların bloklar halinde
yazılmasıdır. Profesyonel yazılımlar incelenirse, programların mantıksal
bütünlük gösteren parçalar halinde yazıldığı görülecektir. Böylece, programın
yazılması ve istenildiğinde değişiklikler yapılması kolaylaşacaktır. C
programlama dilinde bu amaca yönelik olarak fonksiyonlar bir veya birden
fazla işlemden oluşan alt programlar olarak da düşünülebilir.
C dilinde yazılan ana programın kendisi de aslında main() adında bir
fonksiyondur. main() fonksiyonu yazılmaksızın herhangi bir başka fonksiyonun
kullanılması mümkün değildir. Geleneksel olarak, programcılar tarafından
komut olarak adlandırılmalarına rağmen, scanf, printf, sin, log ve bunlar gibi,
şimdiye kadar kullanmış olduğumuz ve standart C derleyicileri tarafından
desteklenmiş (header dosyalarında yer almış) bütün komutlar gerçekte birer
fonksiyondur. Ancak bu bölümde standart C header dosyalarında yer alan
hazır fonksiyonlardan değil, programcı tarafından yazılarak geliştirilen
fonksiyonlardan söz edilecektir.

ue.aydin.edu.tr 60
GENEL ŞEKİL
dönüş_tipi/void fonsiyon_adı([varsa] parametreler)
{ [varsa] yerel tanımlamaları
işlem1;
işlem2;
işlemN;
[varsa] return değer; }
dönüş_tipi: Eğer fonksiyon bir değer geri döndürecek ise değerin tipi belirtilir ve bu
değer return deyimi ile döndürülür. Döndürülen değer fonksiyon dönüş tipiyle (int,
float, char, v.b) aynı olmalıdır. Değer döndürmeyecek ise dönüş_tipi yerine void
yazılır ve return ifadesiyle herhangi bir değer döndürülmez. fonksiyon_adı:
Fonksiyona çağrıda bulunurken kullanılacak belirleyici ad olup değişken ismi
tanımlarken uyulması gereken kurallar fonksiyon adı tanımlamaları için de geçerlidir.
parametreler: Varsa, fonksiyon içinde kullanılması gerekli değerleri ve tiplerini içerir.
Her parametre değişken tanımlar gibi tanımlanır. Kullanılan parametre birden fazla
ise birbirinden ‘,’ ile ayrılır. yerel tanımlamaları: Fonksiyona özgü değişken ve sabit
gibi tanımlamalardır. Bu bölümde fonksiyonları yakından ilgilendiren değişken
tanımlamalarına da yer vermemiz gerekmektedir.

ue.aydin.edu.tr 61
ALT PROAGRAMLAR (Fonksiyonlar)
Değer döndürmeyen fonksiyonlar (void)
Değer döndüren fonksiyonlar (return)
olarak ikiye ayrılır.
Şimdi bu iki tip fonksiyonu daha yakından inceleyelim.

ue.aydin.edu.tr 62
DEĞER DÖNDÜRMEYEN FONKSİYONLAR
Bu fonksiyonlar, alt program gibi kullanılarak ana fonksiyon (main) veya diğer
fonksiyonlar tarafından çağrıda bulunulur. Fonksiyon içindeki işlemler icra edilir,
fakat çağrıda bulunan fonksiyona herhangi bir değer döndürmezler. Aşağıdaki
programı inceleyelim:
#include
void yaz(); /* fonksiyon ön bildirimi */
void main()
{ yaz(); }
void yaz()
{ printf("C Programlama Notları\n"); }
Program çıktısı:
C Programlama Notları

ue.aydin.edu.tr 63
Bu program çalıştırıldığında yaz() fonksiyon ismi kullanılarak fonksiyon çağrılır.
yaz() fonksiyonu ana fonksiyon ile aynı ortamda yazılmış ve derlenmiştir. yaz()
fonksiyonunun içinde de stdio.h header dosyasında tanımlanmış printf
fonksiyonu kullanılarak ekrana C Programlama Notları yazdırılır. Bu işlem
tamamlandıktan sonra ana programa herhangi bir değer aktarılması söz konusu
değildir.
Tanımlanan fonksiyonlara, çağrıda bulunma esnasında, kullanılmak üzere
parametreler yardımıyla değer aktarılabileceğini biliyoruz. Bu değerler fonksiyon
tarafından kullanılır ve verilen görev yerine getirilir. Ama fonksiyon tarafından
üretilen değerin çağrıda bulunan fonksiyona aktarılması söz konusu olmayabilir.
Çağrıda bulunan fonksiyon tarafından aktarılan değerler, fonksiyon tanımlaması
sırasında (yani fonksiyon yazılırken), fonksiyon adının yanında, parantez
içerisinde parametre olarak listelenir.

ue.aydin.edu.tr 64
ÖRNEK
Aşağıdaki örnek programda carp() fonksiyonuna ana fonksiyondan değer
aktarılmaktadır.
#include
void carp(int x, int y); /* fonksiyon ön bildirimi */
void main()
{ carp(10,20);
carp(5,6);
carp(8,9); }
void carp(int x, int y) /* fonksiyon tanımlaması */
{ printf ("%2d * %2d = %3d\n", x, y, x*y); }
Program çıktısı:
10 * 20 = 200 5 * 6 = 30 8 * 9 = 72

ue.aydin.edu.tr 65
Yukarıdaki program çalıştırıldığında carp() fonksiyonunun ilk defa kullanıldığı
satırda 10 ve 20 sayıları, fonksiyon tanımlaması sırasında parametre olarak
verilen int tipi x ve y değişkenlerine gönderilir. x değişkenine 10, y değişkenine
20 değeri aktarılmış olur. Fonksiyondaki printf bu iki sayının çarpımını
görüntüler. Aşağıda, ana programdan fonksiyona değer aktarımı görülmektedir.
Bu programda carp() fonksiyonu ikinci defa çağrıldığında ise 5 ve 6 değerleri
fonksiyonun parametreleri olan x ve y değişkenlerine gönderilmekte ve
fonksiyondaki printf bu sayıların çarpımını görüntülemektedir. carp()
fonksiyonunun üçüncü çağrılışında ise x ve y değişkenlerine 8 ve 9 değerleri
gönderilmiş ve bunların çarpımı fonksiyon tarafından görüntülenmiştir.

ue.aydin.edu.tr 66
ÖRNEK
Aşağıdaki programda, klavyeden bir sayı girilmekte, kare() fonksiyonu bu sayının
karesini alarak görüntülemektedir.
#include
void kare(int x); /* fonksiyon ön bildirimi */
void main() /* ana fonksiyon */
{ int sayi;
printf("Bir sayı giriniz:");
scanf ("%d", &sayi);
kare(sayi); }
void kare(int x) /* fonksiyon */
{ printf ("Sayı: %d Karesi: %d\n", x, x*x); }
Program çıktısı:
Bir sayı giriniz: 5
Sayı: 5 Karesi: 25

ue.aydin.edu.tr 67
Bu programda ana fonksiyonda klavyeden girilen sayı, kare fonksiyonunun
adının yanında parantez içinde yazılı olan int tipi x değişkenine aktarılmakta ve
fonksiyon bu sayının karesini hesaplayıp görüntülemektedir.

ue.aydin.edu.tr 68
C programlama dilinde değişkenler tanımlandıkları konum itibariyle iki gruba ayrılır.
Bunlar;
Genel değişken (global variable): Programın hemen başında, main fonksiyonunun
dışında tanımlanan değişkenlerdir. Tüm fonksiyonlarda (main dahil) geçerlidir ve
programın her bölümünden değerine erişilebilir.
Yerel değişken (local variable): Herhangi bir fonksiyon içinde tanımlanan
değişkenlerdir. Sadece tanımlandığı fonksiyonda geçerlidir ve sadece bu fonksiyon
içersinde değerine erişilebilir.
Fonksiyonun içinde tanımlanan bir değişkenin (lokal değişken) sadece o fonksiyon
içinde geçerli olduğunu biliyoruz. Hatta aynı isimli değişken hem ana programda hem
de fonksiyon içinde tanımlanabilir ve bu değişkenlerin isimleri aynı olmasına rağmen
farklı değerler taşıyabilir. Aşağıdaki programda x değişkeni hem ana programda hem
de fonksiyon içinde tanımlanmış olmasına rağmen iki ayrı değişken olarak
kullanılmaktadır.

ue.aydin.edu.tr 69
#include

void fonk();
void main() /* ana program */
{ int x;
x=10;
printf("ana programdaki x degeri: %d\n", x);
fonk();
printf("ana programdaki x degeri: %d\n",x);
} void fonk() /* fonksiyon */
{ int x;
x=100;
printf("fonksiyondaki x degeri: %d\n", x);
return; }
Program çıktısı:
ana programdaki x degeri: 10 , fonksiyondaki x degeri: 100 , ana programdaki x degeri: 10

ue.aydin.edu.tr 70
Bu programda önce ana programdaki x değişkenine 10 sayısı aktarılıyor ve
görüntüleniyor. Daha sonra fonk fonksiyon çağrılmış. Fonksiyonda tanımlanmış
olan x değişkenine ise 100 sayısı atanıyor ve bu da fonksiyon tarafından
görüntüleniyor. Fonksiyon icra edildikten sonra tekrar ana programa dönülüp ana
programdaki x değişkeni görüntüleniyor. Görüldüğü gibi, fonksiyondaki x
değişkenine 100 değeri atandığı halde, ana programdaki x değişkeninin değeri
değişmemiştir. Ana programa herhangi bir değer aktarmayan fonksiyonlara, void
fonksiyonlar da denir. Fonksiyon void tipi tanımlanarak, çağrıldığı noktaya
herhangi bir değer göndermeyeceği vurgulanmış olur. Fonksiyon sonlarındaki
return ifadesi iki amaçla kullanılabilir. Bunlardan birincisi fonksiyonun çalışmasını
sona erdirmek için isteğe bağlı olarak kullanılması, ikincisi ise fonksiyonda üretilen
değeri ana programa aktarmaktır. Yukarıdaki kullanımda, return ifadesi fonksiyonun
çalışmasını sona erdirmek amacıyla kullanılmıştır.

ue.aydin.edu.tr 71
DEĞER DÖNDÜREN FONKSİYONLAR
Bu tip fonksiyonlarda, fonksiyon tarafından üretilen değer return ifadesi ile
çağrıda bulunan fonksiyona döndürülmekte ve bu değer orada kullanılmaktadır.
Aşağıdaki programda ana programdan girilen iki sayı fonksiyona gönderilmekte,
fonksiyon bu iki sayıyı çarparak ürettiği sonucu ana programdaki değişkene
aktarmaktadır.

ue.aydin.edu.tr 72
#include int
carp(int x, int y); /* fonksiyon ön bildirimi */ void
main() /* ana program */
{ int a, b, c;
printf ("Birinci sayiyi giriniz:");
scanf("%d", &a);
printf("Ikinci sayiyi giriniz:");
scanf("%d", &b);
c=carp(a, b); printf("Carpim: %d\n", c);
/* veya printf("Carpim: %d\n", carp(a, b)); */
} int carp(int x, int y) /* fonksiyon */
{ int sonuc;
sonuc= x * y;
return sonuc; /* veya return x*y; */

ue.aydin.edu.tr 73
Program çıktısı:
Birinci sayiyi giriniz: 6
Ikinci sayiyi giriniz: 7
Carpım: 42
Bu programda, ana programdan girilen 6 ve 7 sayıları fonksiyondaki integer x ve
y değişkenlerine gönderilmektedir. Bu sayılar fonksiyonda çarpılarak elde edilen
integer 42 değeri lokal c değişkeninde tutulmaktadır. return c ile ise lokal c
değişkeninde tutulan değer ana programa aktarılmakta ve aktarılan bu değer
tekrar main içersinde tanımlanmış sonuc değişkenine aktarılarak sonuc
değişkeninin değeri ana program tarafından görüntülenmektedir.

ue.aydin.edu.tr 74
Örnek: Aşağıdaki programda ise, ana programda dairenin yarıçapı girilmekte, bu
değer fonksiyona gönderilmekte, fonksiyon da dairenin alanını hesapladıktan
sonra bu değeri ana programa aktarmaktadır
#include
#define PI 3.141593 float daire(float y);
/* fonksiyon ön bildirimi */ void main() /* ana program */ { float r, s; printf
("Dairenin yaricapini giriniz: "); scanf ("%f", &r); s = daire(r) ;
/* dairenin alanını hesaplayan fonksiyon */ float daire(float y) { float a; a =PI * y *
y; return(a); }
Program çıktısı:
Dairenin yaricapini giriniz: 5 Dairenin alani: 78.54 dir.

ue.aydin.edu.tr 75
Aşağıdaki programda ise aynı satırda girilen 3 adet tam sayının en büyüğü
bulunarak ekrana yazdırılmaktadır. Bu programda en büyük sayının
bulunması işlemi eb fonksiyonunda yapılmaktadır. Bulunan değer ana
fonksiyona döndürülerek ekrana yazdırılmaktadır. Fonksiyon ön
bildiriminde eb fonksiyonunun üç adet integer değer alacağı bildirilmiş
olup, değişken isimleri bildirilmemiştir.
#include
int eb(int, int, int ); /* fonksiyon ön bildirimi */ void main() { int a, b, c;
printf("3 adet tam sayi giriniz:”); scanf("%d%d%d", &a, &b, &c);
printf("Girilen sayilarin en buyugu: %d\n", eb(a, b, c)); }
int eb(int x, int y, int z ) { int ebs = x; if ( y > ebs ) ebs = y; if ( z > ebs ) ebs =
z; return ebs; }

ue.aydin.edu.tr 76
SIRALI DOSYALARA GİRİŞ
Indeksli Sıralı Erişimli Dosya Yapıları (Indexed Sequential File
Organization) ve Bit Seviyesinde İşlemler (Bit Level and Related
Structures)
Indeksli Sıralı Erişimli Dosya Yapıları (Indexed Sequential File
Organization)
Sıralı dosyalara sıralı bir şekilde erişim gerçekleştirmek ve doğrudan
erişimli dosyalara ise doğrudan erişim gerçekleştirmek performans
açısından avantajlıdır. Fakat bu durumun tersi doğru değildir. Bunun için
indexli sıralı erişimli (indexed sequential file organization) dosya türü
geliştirilmiştir. Bu dosya yapısı ile kayıtlara ister sıralı ister doğrudan
şekilde erişilebilir. Sıralı bir şekilde düzenlenmiş olan kayıtlara doğrudan
erişimlerde veya doğrudan erişimli yapıya sahip kayıtlara sıralı erişimlerde
performans artışı sağlar. Sıralı bir şekilde düzenlenmiş olan kayıtlara sıralı
erişimlerde veya doğrudan erişimli yapıya sahip kayıtlara doğrudan
erişimlerde performansı düşüktür.

ue.aydin.edu.tr 77
Sıralı erişimli dosya yapısında hatırlanacağı gibi herhangi bir kayda
ulaşmak istenildiğinde ilgili kayda ulaşılıncaya kadar kayıtlar üzerinde
dolaşmak gerekir. Böyle bir yapıda arama süresini kısaltmak için kayıtlar
üzerinde belli aralıklarla index noktaları (tablar) yerleştirilebilir. Böylelikle
her bir kaydı arama esnasında arama işlemine ilgili indexten itibaren
başlanabilir. Kayıt sayısının daha da arttığı durumlarda, aynı işlemi ikinci
bir defa daha tekrarlamak mümkündür.
Böyle bir yapıda istenilen bir kayda ulaşmak için gereken arama maliyeti
azaltılmış olur ve etkililik sağlanır. Indexlemenin seviyesi kayıt sayısına
bağlı olarak arttırılabilir. Indexleme görüldüğü üzere bir tür ağaç (Tree)
yapısıdır. Ağaç yapısında arama işlemi kaydın bulunduğu dallar üzerinde
gerçekleştirilir. Kaydın olmadığı dallar budanarak aramanın etkililiği
arttırılır.

ue.aydin.edu.tr 78
Yeni bir X kaydının ekleneceği durumda ise kayıtların ötelenmesi
gerekecektir. Oysaki taşma alanını (overflow) tanımlanması halinde buna
gerek kalmayacaktır. Taşma alanı sayesinde ekleme işlemi sırasında ortaya
çıkan performans kaybı kısmen azaltılmış olur.
Uygulamada Blok adreslenebilir disklerde, birinci seviye indeks trackleri
ve ikinci seviye indeks ise silindirleri gösterirler. Silindir indeks ilgili
silindirdeki en yüksek anahtarı ve o silindir içindeki track indeksini tutar.
Bir silindirdeki her bir track iki çift bilgi tutar. Birisi primary depolama
alanıyla diğeri ise overflow alanıyla ilgilidir. silindir indeksini ve ise track
indeksini göstermektedir. Indeksli sıralı şekilde yapılandırılan dosya
organizasyonları ISAM (Indexed Sequential Access Method) olarak
isimlendirilir.

ue.aydin.edu.tr 79
C dilinde bazı fonksiyonlar
Dosya işlemleriyle ilgili fonksiyonlar stdio.h kütüphane dosyasında
tanımlanmış olup bunlardan bazıları aşağıda verilmiştir;
fopen() Dosya oluşturur, açar fclose() Dosyayı kapatır putc() Dosyaya
karakter yazar getc() Dosyadan karakter okur feof() Dosya sonuna
gelindiğini sorgular fprintf() Dosyaya formatlı veri yazar fscanf() Dosyadan
formatlı veri okur fputs() Dosyaya string yazar fgets() Dosyadan string
okur fwrite() Dosyaya blok halinde veri yazar fread() Dosyadan blok
halinde veri okur fseek() Verilere erişim için konum belirler ftell() Byte
olarak dosya konum göstergecinin yerini döndürür. rename() Dosyayı
yeniden isimlendirir remove() Dosyayı sabit bellekten siler rewind() Dosya
konum göstergecini dosya başına döndürür.

ue.aydin.edu.tr 80
TEXT DOSYALAR
Text dosyalar, ilk defa oluşturma ve bilgi yazma "w", bilgi okuma "r" ve
bilgi ekleme "a" modlarında açılabilir. Bunlar temel modlardır. Bunlara ek
olarak Text dosyalar "w+", "r+" ve "a+" modlarında da açılabilir. Bu modlar
ve aralarındaki farklar sırasıyla incelenecektir. Text dosyalar, BASIC
programlama dilindeki sırasal (sequential) dosyalara benzetilebilir. Text
dosyalara bilgiler sırasal olarak kaydedilir ve kaydedilen bilgilerin en
sonuna dosya sonu işareti (EOF) konur. Dosya sonu işareti (EOF) ekranda
görüntülenmeyen özel bir işarettir.

ue.aydin.edu.tr 81
SIRALI ERİŞİMLİ DOSYALAR

Sıralı erişimli dosyalarda mevcut kayıtlar, kayıt kütüğü içinde kayıt


formatına göre sıra ile yer alırlar ve herhangi bir kayıta erişmek için, dosya
başlangıcından itibaren aranan kayıta kadar olan tüm kayıtların mutlaka
okunması (erişilerek geçilmesi) zorunludur. Bu özelliği nedeniyle bu tür
dosyalar, sınırlı kullanım alanlarına sahiptirler. Genellikle az veri içeren
küçük dosyaların işlenmesi amacıyla, veya kayıtlı dosyalarda zaman içinde
çok fazla değişiklik gerektirmeyen ama bunun yanı sıra tüm bilgilere
çoğunlukla sıra ile yığın halinde gereksinim duyulan liste yapılarında
kullanılırlar. Eğer kayıtlı verilerde sık sık değişiklikler ve düzenlemeler
gerekiyorsa sıralı erişimli dosyalar yerine rastgele erişimli dosyalar tercih
edilir. Sıralı erişimli dosyalarda aynı anda okuma, yazma veya veri ekleme
işlemleri birlikte yapılamaz. Her işlem türü için dosyanın ayrı modda
açılması gerekir. Sıralı erişimli dosyalarda kayıtlar ASCII (standart metin
kodları) kayıt özelliğinde tutulurlar.

ue.aydin.edu.tr 82
RASTGELE ERİŞİMLİ DOSYALAR
Sıralı erişimli dosyalardan farklı bir iç yapıya sahiptirler. Butür dosyalarda,
her bir kayıtın uzunluğu bellidir ve dosya oluşturulması/ işlenmesi
sırasında belirtilir. Rastgele erişimli dosyalarda, gerektiğinde okuma,
yazma/kaydetme, veri ekleme işlemleri aynı anda yapılabilir. Dosyanın
farklı işlemlere yönelik açılması zorunluluğu yoktur. Bu tür dosyalarda,
aranan herhangi bir kayıta doğrudan erişmek mümkündür. Bir veriye
erişmek için tüm dosyanın baştan sona taranması gerekmez. Yalnızca
aranan kayıtın numarasını belirtmek yeterlidir. Rastgele erişimli dosyalarda
da kayıtlar ASCII (standart metin kodları) kayıt özelliğinde tutulurlar.
Rastgele Erişimli Dosyalar, sıralı erişimli dosyalardan farklı olarak, mevcut
kayıtlar arasında ulaşılmak istenen herhangi bir bilgiye doğrudan
ulaşılabilen dosyalar olup, bu tür dosyalarda, bir kayıta ulaşabilmek için,
sıralı erişimli dosyalarda olduğu gibi, o kayıta kadar olan tüm kayırların
sırayla elden geçirilmesi zorunluluğu yoktur. Herhangi bir kayıta, kayıt
numarası vasıtasıyla doğrudan erişilebilir, okunabilir, yazılabilir,
kaydedilebilir, silinebilir. Rastgelel erişimli dosyalarda her kayıt bir kayıt
numarasına ve belirli bir kayıt uzunluğuna sahiptir,

ue.aydin.edu.tr 83
DİZİLER (ÇOK BOYUTLU)

Osman Bülent Baykal


ÇOK BOYUTLU DİZİLER
Tutulan bilgi her ne olursa olsun şayet tablo gibi iki boyutlu bir bilgiyse ya da
daha fazla boyutu varsa bu bilginin tek boyutlu dizilerle modellenmesi ve
işlenmesi güçtür.
Bunun yerine programlama dillerinde birden fazla boyuttan oluşan diziler (
array) kullanılabilir. Bu dizilere çok boyutlu dizi (multi dimensional array) ismi
verilir.

ue.aydin.edu.tr 85
ÇOK BOYUTLU DİZİLERİN TANIMLANMASI
Günümüzde oldukça yaygın olan C yazım kurallarına göre ( C-syntax) bir matris
aşağıdaki şekilde tanımlanabilir:
int a[3][3];
 Yukarıdaki bu satırı, C/C++ programlama dilinde yazarsak hafızada bizim
için 3×3 boyutlarında (3’e 3’lük) bir matris için yer açar (yani toplamda 9
hücreli ve 9 farklı sayı tutmaya yarayan bir yer) ve bu matrisin ismini a
olarak tanımlar. Buradaki a matrisin (yani iki boyutlu dizinin (array)) ismidir
ve herhangi bir değişken ismi verilebilir. Örnek olarak a ismi kullanılmıştır.
 Yukarıdaki tanım satırını JAVA veya C# dillerinde aşağıdaki şekilde
yapabiliriz:
int [ ][ ] a = new int[3][3];
Yukarıdaki bu yazımda farklı olan sadece yazılış şeklidir aslında yapılan iş
aynıdır.

ue.aydin.edu.tr 86
Yukarıdaki şekilde dizi tanımlandıktan sonra bu dizinin istenilen satır ve
sütün değerlerine erişilebilir. Bu durumu aşağıdaki temsili resimden
görebiliriz:

ue.aydin.edu.tr 87
Yukarıdaki resimde ilgili satır ve sütünlara erişmek için yazılması gereken indis
değerleri verilmiştir. Yani örneğin aşağıdaki şekilde bir kod yazarsak:
a[1][2]=5;

ue.aydin.edu.tr 88
ÇOK BOYUTLU DİZİLERİN TANIMLANMASI
Çok boyutlu diziler genelde döngüler (loop) ile birlikte kullanılırlar. Bilindiği üzere
aslında dizi (array) kavramının varlık sebebi birden fazla değişkeni hafızada bir
arada tutmak ve kolayca ulaşmaktır. Dolayısıyla birden fazla değişkene erişirken
indis numaralarından (satır ve sütün numaralarından) erişmek çoğu zaman
avantajlı bir durumdur. İşte bu satır ve sütün numaraları üzerinde çalışan döngüler
de çoğu zaman vaz geçilmez erişim araçlarıdır.

ue.aydin.edu.tr 89
2019 yılının otomobil satışları

ue.aydin.edu.tr 90
Bu tabloda, 1998 yılında çeşitli otomobil markaları için gerçekleştirilen ilk üç
aylık satışları görüyoruz. Bu tür bir bilgiyi bilgisayara yükleyerek aşağıdaki
sorulara cevap olabilecek işlemleri tablo üzerinde gerçekleştirmek isteyebiliriz:
Her marka için 3 aylık satış toplamı nedir? (Tablodaki satır toplamları)
Her ay için tüm markaların satış toplamları nelerdir? (Tabloda sütun
toplamlarının hesaplanması)
Her marka için en çok satışın gerçekleştirildiği ay hangisidir? (Satırlardaki en
büyük elemanların tespiti)
Her ay için en çok satışın gerçekleştirildiği marka hangisidir? (Sütunlardaki en
büyük elemanların tespiti)
Tüm marka ve tüm aylar için otomobil satışları toplamı nedir? (Tablonun genel
toplamının bulunması)

ue.aydin.edu.tr 91
İKİDEN ÇOK BOYUTLU DİZİLER
Şimdiye kadar anlatılan diziler iki boyutluydu. Programlama dillerinde ikiden
yüksek sayıdaki boyutlarda dizi tanımlamak da mümkündür. Temel olarak
programlama dillerinin çoğunda matrisin boyutunun bir limiti yoktur yani 3
boyutlu 4 boyutlu yada 100 boyutlu diziler tanımlanabilir.
Programlama dillerinde çok boyutlu diziler iki boyutlu dizilerde olduğu gibi
boyut miktarını belirten ilave sayılar tanımlayarak gösterilir. Örneğin:
int a[5][5][5];
şeklindeki bir tanım C/C++ dillerinde veya
int [][][] a = new int[5][5][5];
şeklindeki bir tanım JAVA vey C# dillerinde 5x5x5 boyutlarında 3 boyutlu bir dizi
tanımlamak için kullanılabilir.

ue.aydin.edu.tr 92
NxN tipindeki A kare matrisine değer giren ve girilen değerleri ekrana yazdıran
programın akış diyagramını çiziniz.

ue.aydin.edu.tr 93
Klavyeden girilen NxN tipindeki A ve B kare matrislerini toplayan program(C = A + B)
programın akış diyagramını çiziniz.

ue.aydin.edu.tr 94
Çok Boyutlu Dizilere İlk Değer Atama

Çok boyutlu bir diziyi tanımlarken, eleman değerlerini atamak mümkündür.


Aşağıdaki örneği inceleyelim:
int tablo[3][4] = { 8, 16, 9, 52, 3, 15, 27, 6, 14, 25, 2, 10 };

Diziyi tanımlarken, yukardaki gibi bir ilk değer atama yaparsanız, elemanların değeri
aşağıdaki gibi olur. Çok boyutlu dizilerde ilk değer atama, tek boyutlu dizilerdekiyle
aynıdır. Girdiğiniz değerler sırasıyla hücrelere atanır. Bunun nedeni de basittir.
Bilgisayar, çok boyutlu dizileri sizin gibi düşünmez; dizi elemanlarını hafızada arka
arkaya gelen bellek hücreleri olarak değerlendirir.

Satır 0 : 8 16 9 52

Satır 1 : 3 15 27 6

Satır 2 : 14 25 2 10

ue.aydin.edu.tr 95
Çok boyutlu dizilerde ilk değer atama yapacaksanız, değerleri kümelendirmek iyi
bir yöntemdir; karmaşıklığı önler. Örneğin yukarıda yazmış olduğumuz ilk değer
atama kodunu, aşağıdaki gibi de yazabiliriz.
int tablo[3][4] = { {8, 16, 9, 52}, {3, 15, 27, 6}, {14, 25, 2, 10} };
Farkedeceğiniz gibi elemanları dörderli üç gruba ayırdık. Bilgisayar açısından bir
şey değişmemiş olsa da, kodu okuyacak kişi açısından daha yararlı oldu. Peki ya
dört adet olması gereken grubun elemanlarını, üç adet yazsaydık ya da bir-iki
grubu hiç yazmasaydık n'olurdu?
int tablo[3][4] = { {8, 16}, {3, 15, 27} };

ue.aydin.edu.tr 96
Tek boyutlu dizilerde ilk değer ataması yaparken, eleman sayısından az değer
girerseniz, kalan değerler 0 olarak kabul edilir. Aynı şey çok boyutlu diziler için de
geçerlidir; olması gerektiği sayıda eleman ya da grup girilmezse, bu değerlerin
hepsi 0 olarak kabul edilir. Yani üstte yazdığımız kodun yaratacağı sonuç, şöyle
olacaktır.
Belirtmediğimiz bütün elemanlar 0 değerini almıştır. Satır 2'ninse bütün elemanları
direkt 0 olmuştur; çünkü grup tanımı hiç yapılmamıştır.

Satır 0 : 8 16 0 0

Satır 1 : 3 15 27 0

Satır 2 : 0 0 0 0

ue.aydin.edu.tr 97
İki yada Çok Boyutlu Dizilerin Hafıza Yerleşimi

Dizilerin çok boyutlu olması sizi yanıltmasın, bilgisayar hafızası tek boyutludur.
İster tek boyutlu bir dizi, ister iki boyut ya da isterseniz 10 boyutlu bir dizi
içersinde bulunan elemanlar, birbiri peşi sıra gelen bellek hücrelerinde tutulur. İki
boyutlu bir dizide bulunan elemanların, hafızada nasıl yerleştirildiğini aşağıdaki
grafikte görebilirsiniz.

ue.aydin.edu.tr 98
ue.aydin.edu.tr 99
MATRİS
Mühendislik uygulamalarında özelliklede çoklu verilerle ilgili olan işlemlerde
yoğun olarak kullanılan yapılardan biriside matrislerdir. Tablo gibi olan iki
boyutlu diziler (dizilerin yatay(satır) ve düşey doğrultulu (sütun) olarak
oluşturulması matris olarak isimlendirilir. <satır ve sütun sayısı eşit olan
matrislere KARE matris denir.

ue.aydin.edu.tr 100
Örnek: 3 kişilik bir sınıftaki öğrencilerin 2 ayrı dersten (Matematik ve Fizik )
aldıkları notlar
Matematik dersi için A= [ a1,a2,a3 ] = [ 65,80,40 ]
Fizik dersi için B= [ b1,b2,b3 ] = [ 90,35,78 ] şeklinde A ve B dizilerine
aktarılabilir. Verilerin ayrı yerlerde (farklı değişkenlerde) olması işleri zorlaştırır.
Dolayısı ile bu veriler, satırlarında diziler bulunan yeni bir yapıya yerleştirilebilir.
İki boyutlu veriler için çok uygun olan bu yapının adı MATRİS dir. Örnekteki
notlar
C Matrisine aşağıdaki şekilde yerleştirilir.

ue.aydin.edu.tr 101
Klavyeden çoklu verinin girilmesi ve N*N tipinde bir A matrisine
yerleştirilmesi.

ue.aydin.edu.tr 102
Klavyeden girilen N*N tipindeki A matrisinin 2.satır elemanlarının toplamını
bulan akış diyagramı.

ue.aydin.edu.tr 103
ÖZET

Bir dizi aşağıdaki gibi bildirildiğinde bir boyutlu (tek indisli) dizi olarak
adlandırılır. Bu tip dizilere vektör denir. int x[5];
Bir dizi birden çok boyuta sahip olabilir. Örneğin iki boyutlu y dizisi şöyle
tanımlanabilir: int y [5] [10];
İki boyutlu diziler matris olarak adlandırılır.
İlk boyuta satır, ikinci boyuta sütün denir. y matrisinin eleman sayısı
5x10=50 dir

ue.aydin.edu.tr 105
ÖZET

ue.aydin.edu.tr 106
ÇOK BOYUTLU DİZİLERİN BİLDİRİMİ

Çok boyutlu diziler tek boyuta indirgenerek bellekte tutulurlar.


Tek indisli dizilerde olduğu gibi, çok indisli dizilere de başlangıç değeri
vermek mümkündür.
Örneğin 3 satır ve 4 sütunlu (3x4=12 elemanlı) bir x matrisinin elemanları
şöyle tanımlanabilir:
int x[3][4] = {11,34,42,60, 72,99,10,50, 80,66,21,38};
int x[3][4] = {11,34,42,60, /* 1. satır elemanları */ 72,99,10,50, /* 2. satır
elemanları */ 80,66,21,38}; /* 3. satır elemanları */

ue.aydin.edu.tr 107
Satranç Tahtası

ue.aydin.edu.tr 108
Kaynaklar

Algoritmayı Anlamak – Mustafa Eker


Algoritma Tasarlama ve Programlamaya Giriş- Selami Eryılmaz
C ile Programlamaya Giriş – Dr. Hasan H.Balık
Pascal 7.0 ile Programlama A.Oral

ue.aydin.edu.tr 109

You might also like