Upload
others
View
2
Download
0
Embed Size (px)
Citation preview
Dr. Bülent ÇOBANOĞLU
ve
Hedefler
Bu üniteyi çalıştıktan sonra;
Java dilinde tek boyutlu dizi tanımlamasını öğreneceksiniz,
Dizi elemanlarına değer aktarmayı öğrenebileceksiniz,
Dizi elemanlarının dışarıdan(klavyeden) girilmesini öğrenebileceksiniz,
Dizi elemanlarını başka bir diziye kopyalamayı öğreneceksiniz,
Dizi elemanlarını arama ve sıralamayı öğreneceksiniz.
İki boyutlu dizi (matris) tanımlamasını öğreneceksiniz,
DİZİLER (ARRAYS)
ve MATRİSLER
Dr. Bülent ÇOBANOĞLU
İçindekiler
8. DİZİLER ve MATRİSLER
8.1. Tek boyutlu diziler
8.2. İndis kavramı
8.3. Dizi elemanlarına değer aktarma
8.4. Dizi elemanlarının dışarıdan girilmesi
8.5. Dizi elemanlarını başka bir diziye kopyalama
8.6. Dizi elemanlarını sıralama
8.7. Dizi elemanlarında arama
8.8. İki Boyutlu diziler (Matrisler)
8.9. Konunun Özeti
8.10. Çoktan Seçmeli Değerlendirme Soruları
Dr. Bülent ÇOBANOĞLU
DİZİLER (ARRAYS)
TEK BOYUTLU Dİ Zİ LER
Giriş
Bellekte sürekli yer kaplayan aynı türden verilerin oluşturduğu kümeye dizi adı verilir.
Tanımdan da anlaşılacağı üzere bir dizinin dizi olabilmesi için;
1 – Bellekte sürekli yer kaplaması
2 – Aynı tür elemanlardan oluşmuş olması gerekir.
Dizilerin her elemanı ayrı bir nesne (object) gibi ele alınmalıdır. Dizi tanımlarken; o dizinin
adını ve dizi içerisindeki elemanlara erişmek amacıyla onun kaçıncı eleman olduğunu belirten
indisini yazmak gerekir.
Java dilinde dizi tanımlamak için; Dizi tanımlama şekilleri, kullanılan programlama dillerine göre farklılık gösterse de temel
mantık aynıdır. Yani dizinin adı, eleman sayısı (boyutu) ve tipi belirtilir.
Tip [ ] dizi adı = new Tip [Eleman Sayısı];
Veya
Tip dizi adı [ ] = new Tip [Eleman Sayısı]; yapıları kullanılabilir.
Java dilinde dizilerin ilk elemanı, 0. indisli elemanıdır. Son elemanı da dizi tanımında
belirtilen eleman sayısının 1 eksiğidir.
A[7] A[0] A[1] A[2] A[3] A[4] A[5] A[6]
5 7 9 23 45 12 04
İçerisinde tamsayıları sakladığımız 7 elemanlı bir A dizisini aşağıdaki gibi tanımlayabiliriz:
int [ ] A=new int[7];
int A[ ];
A=new int[7];
int A [] = new int [7];
int A[ ]={5, 7, 9, 23, 45, 12, 4};
Bu şekilde tanımlanan 7 elemanlı bir A dizisinin ilk elemanı A[0], son elemanı ise A[6]
indisli elemanıdır. Dizinin herhangi bir elemanına dizi adı ve köşeli parantez içerisindeki indis
numarası ile birlikte erişilir. Örneğin ‘A dizisinin 2. indisli elemanı’ A[2] şeklinde okunabilir
ve değeri bu örnek için 9 dur.
Bu şekilde tanımlanan dizilere tek boyutlu dizi denir ve matematiksel olarak da vektör adı
verilir. Tek boyutlu dizileri programlarken;
dizi elemanlarının girilmesi,
Dr. Bülent ÇOBANOĞLU
dizi ile ilgili işlemler, dizi elemanlarının ekranda gösterilmesi,
için for döngüleri kullanılır. Bu üç işlem, tek bir döngü içerisinde gerçekleştirilebileceği gibi
her bir işlem için farklı bir döngüde kullanılabilir
İndis (Index) Kavramı: Dizilerde değişken ismini takiben köşeli parantez içerisinde belirtilen numaraya indis
(index/subscript) adı verilir. Değişken tanımlamada olduğu gibi dizi tanımlamada da veri
tipini mutlaka belirtmemiz gerekir. Java dilinde dizinin indisi köşeli parantez içerisinde
belirtilir.
Dizi tanımlama esnasında indis değeri verilmez (boyutu belirtilmez) ise dizinin boyutu tanımlanan eleman sayısı kadardır. Örneğin “int A[ ]={1, 2, 3, 4, 5};” şeklindeki
tanımlamada dizinin boyutu yani dizinin eleman sayısı 5 dir.
Dizinin ilk indis değeri 0 (sıfır) dır. Dolayısıyla n elemanlı bir dizinin n. elemanının indis değeri n-1 dir.
Bir dizinin eleman sayısını (boyutunu) bulmak için “length” metodu kullanılır. Bu metodun döndürdüğü değer "int" tipindedir. Örneğin int A[] = { 8, 9, 12, 4, 5, 7, 1, 0,
6 }; şeklinde tanımlanan bir dizinin boyutunu (eleman sayısını) öğrenmek için
A.length komutunu kullanırız. Dizinin son indisli elemanı ise ‘A.length -1’ dir.
Dizi Elemanlarına Değer Aktarımı
Tek boyutlu dizilere değer aktarmak için farklı yöntemler kullanılabilir. Bunlar;
1) Her bir elemana ayrı ayrı değer girilebilir:
int[] dizi = new int[10];
dizi[0] = 2;
dizi[1] = 3;
..
2) Tüm elemanlara bir kerede, dizi tanımlaması sırasında değer girilebilir:
Tip dizi[ ] = { değer1, değer2, değer3, ... , değerN };
Not: Bu şekildeki dizi tanımında new komutunun kullanılmadığına ve eleman sayısının
belirtilmediğine dikkat ediniz.
3) Bir döngü içerisinde indis numarası belirtilerek değer aktarılabilir
for(int i = 0 ; i < dizi.length ; i++)
{
dizi[i] = i;
}
Örnek 1.
“8, 9, 12, 4, 5, 7, 1, 0, 6, 11” sayılarını A dizisine aktarıp ekranda gösteren programı yazınız.
Çözüm:
Dr. Bülent ÇOBANOĞLU
Java Programlama Dilinde Kodlanması;
class Dizi1 {
public static void main(String args[]) {
int A[] = { 8, 9, 12, 4, 5, 7, 1, 0, 6, 11 };
for(int i=0; i < 10; i++) {
System.out.print(A[i]+" ");
}
}}
Programın ekran çıktısı;
Kendiniz Uygulayınız:
“ 0, 3, 8, 15, 24, 35, 48, 63, 80, 99” şeklindeki diziyi oluşturup ekranda gösteren
programı yazınız
Bir Diziye Otomatik Değer Aktarımı
Dizi elemanlara otomatik olarak sabit bir değer vermek için ‘import java.util.Arrays;’ sınıfı
içerisindeki fill metodu kullanılabilir. Örneğin A dizisinin tüm elemanlarına ‘1.0’ değerini
vermek için 3 farklı yöntem kullanabilirsiniz. Bunlar;
Program başında ‘ import java.util.Arrays; ’ deyimi kullanılır ve
Arrays.fill(A, 1.0);
Program başında import edilmezse fill metodunun tam yolu yazılır.
java.util.Arrays.fill(A, 1.0);
Eğer fill metodunu doğrudan kullanmak istersek ‘fill (A,1.0)’ şeklinde o zaman program başında aşağıdaki tanımlamayı yapmamız gerekir.
import static java.util.Arrays.fill;
Örnek 2.
10 elemanlı bir A dizisine 1 ile 9 arasında rastgele sayılar aktarıp ekranda gösteren programı
yazınız. import java.util.Arrays;
public class RastgeleDizi {
Dr. Bülent ÇOBANOĞLU
static int A[] =new int [10];
public static void main(String[] args) {
for (int i=0; i
Dr. Bülent ÇOBANOĞLU
Dizi elemanları Input iletişim kutuları ile yukarıdaki gibi tek tek girilir ve girilen elemanlar
ekranda/konsolda aşağıdaki gibi görülür.
Örnek 4.
Girilen rakam değerine göre yılın kaçıncı ayı olduğunu hesaplayıp ekranda gösteren programı
yazınız. { Not: Ay değerleri 1 ile 12 arasında girilmezse kullanıcıya uyarı mesajı verilecektir
}
Çözüm: import java.util.Scanner;
class Ay {
public static void main(String args[]) {
String A[] = { "", "Ocak", "Şubat", "Mart", "Nisan", "Mayıs",
"Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim",
"Kasım","Aralık" };
Scanner tara = new Scanner(System.in);
int y;
System.out.println("Ay değerini giriniz");
y = tara.nextInt();
if (y > 0 && y
Dr. Bülent ÇOBANOĞLU
for(int i=0; i < 10; i++) top += A[i];
yapısı ile çözeriz ama for döngüsünün for-each stilinde kullanımı ile de aynı programı
kodlayabiliriz. Şöyleki;
int A[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int top = 0;
for(int x: A) top += x;
bu şekildeki tanımlama ile A dizisinin 0. indisli elemanından en büyük indisli (bu örnek için
9) elemanına kadarki tüm değerler x değişkeninde tutulur.
Java Programlama Dilinde Kodlanması;
class Ornek11 {
public static void main(String args[]) {
int A[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int top = 0;
for (int x : A) {
System.out.println("Dizi elemanları: " + x);
top += x;
}
System.out.println("Toplam: " + top);
}
}
Programın ekran çıktısı aşağıdaki gibidir.
Dizi Elemanlarını Başka Bir Diziye Kopyalamak
Dizi elemanlarını başka bir diziye kopyalamak için dizi değişken adlarını birbirine { int
[]A=B } eşitlemek yeterlidir. Örneğin;
int A[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int B[]= A;
Dr. Bülent ÇOBANOĞLU
Şeklindeki komut satırları ile A dizisinin tüm elemanları B dizisine kopyalanmış olur. Fakat
Java dilinde dizi elemanlarını başka bir diziye kopyalamak için daha işlevsel olan
System.arraycopy() yöntemi kullanılır. Bu yöntemin kullanım şekli aşağıdaki gibidir;
System.arraycopy (a, baslangic, b, baslangic, miktar);
Bu komut satırı; miktar ile belirtilen sayıdaki elemanı, a dizisinin baslangic elemanından
itibaren, b dizisine baslangic elemanından başlayarak kopyalar.
Örnek 6.
a dizisinin 2. elemanından itibaren 5 elemanını b dizisine kopyalayan programı yazınız.
Çözüm:
class DiziKopyala {
public static void main(String[] args) {
char[] a = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'
};
char[] b = new char[5];
System.arraycopy(a, 2, b, 0, 5);
System.out.println(b);
}
}
Programın ekran çıktısı aşağıdaki gibidir;
Kendiniz Uygulayınız: a dizisinin elemanlarını, ters sırada b dizisine kopyalayan
ve elemanları ekranda gösteren programı yazınız.
Dizi Elemanlarını Sıralama
Sıralama, bir grup veriyi artan ya da azalan bir şekilde art arda yerleştirme işlemidir. Sıralama
işlemi için birçok algoritma geliştirilmiştir. (Bubble sort, Quick sort, Selection sort gibi). Java
dilinde Quick sort (hızlı sıralama) algoritmasının yerleşik bir fonksiyon hali olan sort metodu
Dr. Bülent ÇOBANOĞLU
ile dizi elemanlarını otomatik sıralayabiliriz. Dizi elemanlarını otomatik olarak sıralamak için
‘import java.util.Arrays’ sınıfı içerisindeki sort metodu kullanılabilir.
Bir A dizisinin elemanlarını sıraladıktan sonra dizinin en küçük elemanını, 'A[0]' ve en
büyük elemanını ise 'A[A.length-1]' ifadeleri ile kolayca öğrenebiliriz.
Dizi Elemanlarında Arama
Sıralı ya da sırasız listedeki bir elemanın yerinin bulunması işlemine ( örneğin sözlükten bir
kelime aranması ) arama denir. Bir liste ya da dizi içerisindeki veriler (sayısal ya da string
olabilir) belirli bir anahtar (key) ifadeye göre aranır. Java programlama dilinde arama işlemini
yapmak için hazır algoritmalar ‘binarySearch- ikili arama algoritması’ kullanılabilir.
Dizi içerisindeki herhangi bir elemanı aramak için ‘import java.util.Arrays’ sınıfı
içerisindeki binarySearch metodu {Arrays.binarySearch(diziadi, key)} şeklinde
kullanılabilir.
Burada Arrays.binarySearch(diziadi, key ) komutu ile aranan eleman dizi içerisinde varsa o
elemanın indis numarası, yoksa negatif bir değer geri döndürülür.
Örnek 7. 10 elemanlı bir dizinin elemanlarını küçükten büyüğe sıraladıktan sonra en küçük ve en büyük
elemanını bulan, dizi içerisinde ‘56’ verisi varsa “Var” ya da “Yok” diyen bir programı yazınız.
Çözüm:
Java Programlama Dilinde Kodlanması;
import java.util.Arrays; public class AramaSiralama { public static void main(String args[]) { int say[] = { 99, -10, 1001, 18, -78, 56, 46, -9, -97, 49 }; Arrays.sort(say); for (int i = 0; i < say.length; i++) { System.out.print(say[i] + "\t"); } System.out.println("\n en küçük sayı: " + say[0]); System.out.println(" en büyük sayı: " + say[say.length - 1]); int indis = Arrays.binarySearch(say, 56); if (indis > 0) { System.out.println("Var"); } else { System.out.println("Yok"); } } }
Dr. Bülent ÇOBANOĞLU
Açıklama:
say dizisinin eleman değerlerini program içerisinde girdik. Arrays.sort(say) komutu ile say
dizisini küçükten büyüğe sıraladıktan sonra say[0] ile dizinin en küçük elemanını, say[say.length-
1] ile de en büyük elemanını ekrana yazdırdık.
Yine Arrays.binarySearch(say, 56) komut satırı ile 56 sayısının dizi içerisinde
olup olmadığını sorguladık
Buna göre programın ekran çıktısı şöyle olur;
İ Kİ BOYUTLU Dİ Zİ LER (MATRİ SLER)
Bellekte ard arda sıralanmış satır ve sütunlardan oluşan yapıya iki boyutlu dizi ya da matris adı
verilir. İki boyutlu dizileri aşağıdaki şekilde gösteririz.
Yukarıdaki şekil 4 satır ve 7 sütundan oluşan bir matrisdir. Yani her biri 7 elemanlı, 4
vektörün (tek boyutlu dizinin) oluşturduğu yapıdır.
Bu yapıya A matrisi ismini verelim, 4 satır ve 7 sütundan oluşan bu A matrisini Java dilinde
aşağıdaki gibi kodlayalım.
int A[ ][ ] =new int [4] [7]; şeklinde tanımlarız.
Şekilde de görüldüğü gibi bu şekilde tanımlanan A matrisi 4*7 yani 28 elemandan
oluşmaktadır. Bu matrisin 1. satır, 3. sütununa 9 değerini aktarmak için A[1][3]=9; ifadesini
kullanmak yeterlidir.
İki boyutlu dizileri tanımlamak için aşağıdaki yapı kullanılır;
Tip Dizi_adı[][] = new Tip [satir_boyutu][sütun_boyutu];
Dr. Bülent ÇOBANOĞLU
Örneğin; 15 elemanlı yani 3 satır, 5 sütundan oluşan bir float tipindeki B dizisini üç
farklı şekilde aşağıdaki gibi tanımlayabiliriz:
float[ ][ ] B= new float[3][5]; float [ ][ ] B; B= new float[10][365];
float [][] B = { {8,1,2,2,9}, {1,9,4,0,3}, {0,3,0,0,7} }; //Doğrudan değer aktarma
.
Örneğin;
Şeklindeki bir iki boyutlu diziyi int [ ][ ] A = new int [4][5] ; şeklinde ifade edebiliriz ve
bu diziyi 4 adet, 5 elemanlı A dizisi veya 4 satırlı, 5 sütunlu A matrisi şeklinde okuyabiliriz.
Dikkat ederseniz bu dizinin ilk elemanı A[0][0] iken son elemanı ise A[3][4] indisli
elemanıdır.
Örnek 9.
Aşağıdaki A matrisini oluşturup ekranda gösteren programı yazınız.
NOT:
Tek boyutlu dizileri örneklerimizde for döngüleri ile
iki boyutlu dizileri (matrisleri) de iç içe for döngüleri
ile gösterebiliriz.
Matematiksel olarak Aij şeklinde tanımlanan A
matrisi, bilgisayar ortamında A[i][j] şeklinde
gösterilir. Böyle bir matrisin eleman sayısı i*j dir.
Dr. Bülent ÇOBANOĞLU
Çözüm:
Şekilde verilen matris, 1 den 12 ye kadar olan sayıların 3 satır, 4 sütun halinde
gösterilmesinden ibarettir. Örneğimizde bu 3 satır 4 sütundan oluşan matrisi A matrisi olarak
tanımladık. A matrisinin satırlarını t, sütunlarını ise i değişkeni ile gösterdik. “(t*4)+i+1”
formülü ile 1 den 12 ye kadar olan sayıları ürettik. Programın kodlaması aşağıdaki gibidir.
Java Programlama Dilinde Kodlanması; class Matris1 {
public static void main(String args[]) {
int t, i;
int A[][] = new int[3][4];
for (t = 0; t < 3; ++t) {
for (i = 0; i < 4; ++i) {
A[t][i] = (t * 4) + i + 1;
System.out.print(A[t][i] + "\t");
}
System.out.println();
}
}
}
Örnek 10.
Aşağıdaki birim matrisi oluşturup ekranda gösteren programı yazınız.
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
Çözüm:
Birim matris; bir köşegeni üzerindeki elemanları 1 diğerleri sıfır olan kare matristir. Böyle bir A
matrisinin köşegen (aynı satır ve sütun) değerleri 1 {yani A[1][1]=1, A[2][2]=1, A[3][3]=1,
A[4][4]=1, A[5][5]=1}, diğerleri ise 0 dır.
Java Programlama Dilinde Kodlanması;
class Matris { public static void main(String args[]) { int j, i; int A[][] = new int[5][5]; for (i = 0; i < 5; ++i) { for (j = 0; j < 5; ++j) { if (i == j) A[i][j] = 1; else A[i][j] = 0; System.out.print(A[i][j] + " "); } System.out.println(); } } }
Dr. Bülent ÇOBANOĞLU
Programın ekran çıktısı:
Örnek 14. 10 kişilik bir sınıftaki öğrencilerin her birinin bir dersten aldığı 4 notu (Vize,
KısaSınav1, KısaSınav2, Ödev, Final) bir A matrisine atayan ve ortalamaları ile birlikte
aşağıdaki gibi ekranda gösteren programı yazınız.
İpucu: Notlar bilgisayar tarafından (10 ile 100 arasında) rastgele girilecektir. Ortalama ise,
ADAMYO başarı notu hesaplamasına göre aşağıdaki gibi hesaplanacak;
Yıl içi Notu= 0.2 x Ödev+ 0.3 x (Kısa Sınavlar Ortalaması) + 0.5 x Vize
Başarı Notu = 0.2 x Yıl içi Notu + 0.8 x Final
Çözüm:
class BasariNotu { public static void main(String[] args) { double ort; double A[][] = new double[10][7]; for (int i = 0; i
Dr. Bülent ÇOBANOĞLU
Konunun O zeti
Bellekte sürekli yer kaplayan aynı türden verilerin oluşturduğu kümeye dizi adı verilir.
İçerisinde tamsayıları sakladığımız 7 elemanlı bir A dizisini faklı şekillerde tanımlayabiliriz:
• int [ ] A=new int[7]; • int A[ ];
A=new int[7];
• int A [] = new int [7]; • int A[ ]={5, 7, 9, 23, 45,12,4};
Dizinin ilk indis değeri 0 (sıfır) dır. Dolayısıyla n elemanlı bir dizinin n. elemanının indis
değeri n-1 dir. Bir dizinin boyutunu (eleman sayısını) öğrenmek için A.length komutunu,
dizinin en son indisli elemanını ise ‘A.length -1’ komutu ile öğrenebiliriz.
Dizi elemanlara otomatik olarak sabit bir değer vermek için ‘import java.util.Arrays;’ sınıfı
içerisindeki fill metodu { Arrays.fill(A, 1.0);} kullanılabilir.
Java dilinde dizi elemanlarını başka bir diziye kopyalamak için daha işlevsel olan
System.arraycopy() yöntemi kullanılır. Bu yöntemin kullanım şekli aşağıdaki gibidir;
System.arraycopy (a, baslangic, b, baslangic, miktar); Bu komut satırı; miktar ile belirtilen sayıdaki elemanı, a dizisinin baslangic elemanından
itibaren, b dizisine baslangic elemanından başlayarak kopyalar.
• Dizi elemanlarını otomatik olarak küçükten büyüğe doğru sıralamak için ‘import java.util.Arrays’ sınıfı içerisindeki sort metodu {Arrays.sort(diziadi);}
kullanılabilir.
• Dizi içerisindeki herhangi bir elemanı aramak için ‘import java.util.Arrays’ sınıfı içerisindeki binarySearch metodu {Arrays.binarySearch(diziadi, key)} şeklinde
kullanılabilir.
• İki boyutlu dizileri tanımlamak için aşağıdaki yapı kullanılır;
Tip Dizi_adı[][] = new Tip satir_boyutu][sütun_boyutu];
Kaynakça: 1-Java ile Programlama ve Veri Yapıları, Genişletilmiş 4. Baskı, ISBN: 978-9944-711-10-
4, Yayınevi: Pusula Yayıncılık, Mayıs. 2016
2- Yeni başlayanlar için Java, 1. Baskı, Abaküs Yayınları, 2018.
http://www.kitapyurdu.com/kitap/default.asp?id=131578&sa=94151119http://www.kitapyurdu.com/kitap/default.asp?id=131578&sa=94151119
Dr. Bülent ÇOBANOĞLU
Çoktan Seçmeli Değ erlendirme Soruları
1. Aşağıdaki komutlardan hangisi A dizisinin son elemanını verir?
a) A.length-1 b) A.length c) UBound(A) d) A(n)
2. Aşağıdaki program parçasının ekran çıktısı ne olur?
int A[ ][ ] = new int[2][3];
for(int i=0; i < 1; ++i) {
for(int j=0; j < 3; ++j) {
A[i][j] = j;
System.out.print(A[i][j] + "\t");
}
System.out.println(); }
a) 1 2 3 b) 0 1 2 c) 0 1 2 3 d) 0, 1
3. “int A[ ][ ]=new int [4][5];” şeklinde tanımlanan bir A dizisinin eleman sayısı kaçtır?
a)12 b) 20 c) 60 d) 45
4. Aşağıdaki program parçasının ekran çıktısı ne olur?
int a [ ] ={2,4,6,5,7};
int[ ] b = new int[a.length];
System.arraycopy(a, 1, b, 0, 3 );
for(int i=0; i