Bil141 ch6 by R9r6VJE

VIEWS: 4 PAGES: 30

									Bil 102


Bölüm 6
Diziler




          1
Diziler
   Örn. 40 tane öğrencinin son not
    ortalamasını tutmak gerekiyor.
    double ogrenci1   = 65.5;
    double ogrenci2   = 45;
    double ogrenci3   = 83.5;
    double ogrenci4   = 66;
    …                      double [ ] notlar = new double [40];
                                          ?
    double ogrenci40 = 91;

                                                                  2
Dizi
 Aynı veri türüne veya sınıfa ait birbirleri
  ile ilişkili veriler topluluğu.
 Dizinin elemanları basit veri türüne ait
  veya nesneye ait olabilir. Bu duruma göre
  hafızada uygun yer ayrılır.
   veri_türü [ ] dizi_adı = new veri_türü [dizi_uzunluğu]   ;
   int [] a = new int[10];



                                                                 3
Dizi
 Dizilerde indisler 0’dan başlar.
 String de olduğu gibi, uzunluğu 5 olan bir dizinin
  ilk elemanının indisi (bulunduğu pozisyon) 0, son
  elemanının indisi 4 olur.
 Örn. 7 günlük sıcaklık derecelerini tutmak
  istersek:
    ◦   int gun1, gun2, gun3, gun4, gun5, gun6, gun7;
    ◦   int [ ] sicaklik = new int [7];
    ◦   7 adet int tipinde değişken tanımlamaya eşdeğerdir:
    ◦   sicaklik[0], sicaklik[1], sicaklik[2], sicaklik[3], sicaklik[4],
        sicaklik[5], sicaklik[6]

                                                                       4
Dizi
   Dizi tanımlandıktan sonra her bir elemanına
    değer atanabilir:
   sicaklik[0] = 7;
   sicaklik[1] =4;
   sicaklik[2] =-1;
   sicaklik[3] =-3;
   sicaklik[4] =0;
   sicaklik[5] =2;
   sicaklik[6] =3;


                                                  5
Dizi - Örnekler
   Kullanıcının bir aylık sıcaklık değerini
    klavyeden gireceği ve bu değerlerin
    ortalamasını, en düşük ve en yüksek
    sıcaklığı bulan bir kod yazın:




                                               6
import java.util.*;
public class ortalamaSicaklik
{
          public static void main(String [] args)
          {     Scanner klavye = new Scanner(System.in);
          double [] sicaklik = new double [30];
          int indis, gun1, gun2;
          double toplam,ortalama, enDusuk, enYuksek;
                toplam = 0.0;
                for (indis=0; indis <= 29; indis++) {
                               System.out.print (“Gun: “ + (indis+1) + “ sicaklik: “);
                               sicaklik[indis] = klavye.nextDouble();
                               toplam += sicaklik[indis]; }
                ortalama = toplam / 30.0;
                System.out.println (“Kasim ayi ortalamasi = “ + ortalama);
                enDusuk = sicaklik[0];
                gun1 = 0;
                enYuksek = sicaklik[0];
                gun2 = 0;
for (indis=1; indis <=29; indis++) {
          if (enDusuk > sicaklik[indis]) {
                enDusuk = sicaklik[indis];
                gun1 = indis; }
          if (enBuyuk < sicaklik[indis])       {
                enBuyuk = sicaklik[indis];
                gun2 = indis; } }
System.out.println (“En dusuk sicaklik = “ + enDusuk + “ Gun = “ + (gun1+1));
System.out.println (“En yuksek sicaklik = “ + enYuksek + “ Gun = “ + (gun2+1)); } }
                                                                                         7
Dizi tanımlanması
   double [] sinavNotu = new double [50];

Dizi elemanlarının veri türü
            Dizinin adı        Dizide kaç
                          eleman var
 double [] sinavNotu;
  sinavNotu = new double[50];
 sinavNotu[3] = 78.3;
    ◦ Dizinin dördüncü elemanı (3 numaralı indis) = 78.3


                                                           8
    length
   Length ile dizinin büyüklüğünü (eleman sayısını) bulabiliriz.
     ◦ sinavNotu.length              dizinin büyüklüğünü
                                     verir
   double[] sinavNotu = new double[50];
    System.out.println (“Dizinin uzunlugu: “ + sinavNotu.length );
   Dizinin uzunluğu atama yoluyla değiştirilemez:
     ◦ sinavNotu.length = 100; // Yazılamaz, hatalı
   Dizinin boyutlarının dışına çıkmamaya dikkat edilmeli!
     ◦ sınavNotu[50] = 65.1;         //Max indis aşıldı
   Derleyici hatası olmaz ama program çalışması sırasında Array
    index out of bounds mesajı alınır (çalışma zamanı hatası)
   Yukarıdaki sınavNotu dizisinin tanımına göre en son elemanın
    indisi 49 olur. (0 ile 49 arasında olacak. Toplam 50 eleman.)



                                                                     9
Diziye İlk Değer Atama
   Diziler yaratıldığı sırada ilk değerlerini
    alabilirler:
    ◦ int [] sicaklik = {17,16,14,15,18,17,16};
    ◦ Dizinin 7 elemanlı bir dizi olduğunu anlıyoruz.
   Veya dizi tanımlandıktan sonra tek tek
    değer ataması yapılabilir:
    ◦ int [] sicaklik = new int [7];
    ◦ sicaklik[0]=17; sicaklik[1]=16; …;
      sicaklik[6]=16;


                                                        10
Diziye İlk Değer Atama
 int veri tipindeki diziler eğer ilk değer
  almazlarsa otomatik olarak 0’a atanırlar. Fakat
  programın daha anlaşılır olması için, daha sonra
  değiştirilmek üzere bütün değerler bir döngü
  kullanarak 0’a da atanabilir.
 Kod:
    int [] sicaklik = new int[365];
    int i;
    for (i=0; i < sicaklik.length; i++)
      sicaklik[i] = 0;

                                                     11
Örnekler
  Bir dizi yapın ve bu diziyi başka bir diziye kopyalayın:
…
int dizi1 = { 7, 4, 8, 1, 4, 1, 4};
float dizi2 = new float[dizi1.length];
//diziyi yazdir
…
//dizi1’i dizi2’ye kopyala
for(i=0; i< dizi1.length; i++)
   dizi2[i] = (float) dizi1[i];
//dizi2 yazdir
…
Örnek 2) Math.random() metodunu kullanarak 500
   elemanlı int veri türünde bir dizi yapıp bu dizinin
   ortalaması, min ve max umunu ekrana basacak programı
   kodlayınız.                                                12
Sınıf ve Metotlarda Dizi Kullanımı
   Bir sınıf içinde bir değişken tanımlanabildiği gibi
    bir dizi de tanımlanabilir. (gerçekleştirme
    değişkeni)
   Dizilerin tamamı metotlara gönderilebilirler –
    parametre olarak-, bu durumda bir nesne olarak
    gönderildikleri için referans ile çağırma
    tekniğiyle gönderilmiş olurlar.
   Eğer dizinin bir elemanı metoda gönderilirse ve
    dizi elemanlarının veri tipi basit ise değer ile
    çağırma tekniği uygulanır, eğer dizi elemanları
    nesne ise referans ile çağırma tekniği uygulanır.

                                                      13
   Elemanları Ogrenci adında bir sınıf tipinde
    olan kayit adında bir dizi oluşturun:
     Ogrenci [] kayit;
     kayit[i] = new Ogrenci(); // kayit dizisinin her bir
     elemani Ogrenci sinifinin bir nesnesi




                                                            14
Metoda Giren İndisli Dizi Elemanları
 Dizinin bir elemanı metoda parametre olarak
  yollanabilir.
 ortalama = ortalamaBul (birinciDeger, sicaklik[i]);
 Bu örnekte sicaklik ve birinciDeger parametrelerinin
  ortalamaları ortalamaBul metoduyla hesaplanmaktadır.
  Bu durumda sicaklik[i] metot tanımındaki veri tipinde
  sıradan bir değişken olarak metoda gönderilmiştir.
 Eğer metoda gönderilen dizinin veri tipi basit veri
  tipiyse, metot bu indisli dizi elemanın değerini
  değiştiremez. Eğer, veri tipi bir nesne ise, referans ile
  çağırma vasıtasıyla bu indisli elemanın değeri değişebilir.



                                                            15
Metoda Giren Diziler
   Bir diziyi metoda gönderirken köşeli parantezler kullanılmaz.
    Gönderilen dizi bir nesne olarak gönderilmiş olur.
    double [] sicaklik = new double[30];
    ortalama = ortalamaBul (sicaklik);
 Bu durumda ortalamaBul metodu bir diziyi argüman olarak
  almaktadır ve bir double değeri alan ortalama geri vermektedir.
 ortalamaBul değerinin tanımı ise aşağıdaki şekilde olabilir.
public double ortalamaBul (double[] deger)
{
  int i, toplam = 0;
  for (i = 0; i < deger.length; i++ )
          toplam = toplam + deger[i];
  return (toplam/deger.length);
}



                                                                    16
 Diziler de birer nesne gibi düşünüldüğü için
  diziler için atama “=” ve eşitlik “==” kavramları
  dizilerde de geçerli değildir.
 İki dizi için “=” ifadesi kullanıldığında bu iki
  dizinin referansı (bellekteki gösterimleri
  eşitlenmiş olur, dolayısıyla iki dizi de aynı diziyi
  gösteriyor olurlar.)
 Aynı şekilde “==” gösterimi ancak iki dizi aynı
  referansa sahip olduğunda doğru olmaktadır.
  Bunun yerine nesnelerde olduğu gibi bir equals
  metodu tanımlamak gerekmektedir.

                                                         17
int [] a = new int[3];
int [] b = new int[3];
int i;
for (i = 0; i < a.length; i++ )
    a[i] = i;
for (i = 0; i < a.length; i++ )
    b[i] = i;
if (b==a)
    System.out.println (“== kullanarak esittirler.”);
else
    System.out.println (“== kullanarak esit degildirler.”);

== kullanarak esit degildirler


                                                              18
public class TestEsitlik
{
   public static void main(String[] args)
   {
      int[] a = new int[3]; int[] b = new int[3]; int i;
      for (i = 0; i < a.length; i++)
          a[i] = i;
      for (i = 0; i < b.length; i++)
          b[i] = i;
      if (b == a)
          System.out.println("== ile esit.");
      else
          System.out.println("== ile esit degil.");
      if (esit(b,a))
          System.out.println(“Esit metodu ile esit.");
      else                                                                 == ile esit degil
          System.out.println(" Esit metodu ile esit degil.");
   }                                                                       Esit metodu ile esit
  public static boolean esit(int[] a, int[] b) {
     boolean denkmi;
     if (a.length != b.length)                                  Static bir metod icinden
         denkmi = false;
     else                                                       (main) static bir baska
     {                                                          metodu (esit) cagirdigimiz
         denkmi = true; //gecici olarak true degeri ata         icin, ve her ikisi de ayni sinif
         int i = 0;
         while (denkmi && (i < a.length))           {           icinde tanimli oldugu icin
             if (a[i] != b[i])                                  sadece adini kullanmamiz
                 denkmi = false;
             i++;           }    }
                                                                yeterli. Nesne olusturup
     return denkmi; } }                                         onun uzerinden
                                                                cagirmamiza gerek yok.

                                                                                                   19
Dizi Döndüren Metotlar
 public int faktoriyel(int sayi)
 Javada metotlar bir nesne döndürebilirler.
  Diziler de birer nesne olarak kabul edildikleri
  için metotlarda dizi döndürmek mümkündür. Bu
  tip bir metot aşağıdaki gibi tasarlanır.
 public veri_tipi[] metot_ismi (parametre listesi)
 Metodun ulaşılabilirliği public ya da private
  olabilir. Ayrıca metot static olarak da
  tanımlanabilir.


                                                      20
Dizi Döndüren Metotlar
public static char [] sesliHarfler ()
{
  char[] yeniDizi = new char[8];
  yeniDizi [0] = ‘a’;
  yeniDizi [1] = ‘e’;
  yeniDizi [2] = ‘ı’;
  yeniDizi [3] = ‘i’;
  yeniDizi [4] = ‘o’;
  yeniDizi [5] = ‘ö’;
  yeniDizi [6] = ‘u’;
  yeniDizi [7] = ‘ü’;
  return yeniDizi;
}



                                        21
Dizi Değerlerinin Sıralanması
 Değerleri küçükten büyüğe veya tersi şekilde sıralamak
  için.
 Kabarcık sıralama (Bubble Sort) (n sayıyı küçükten
  büyüğe sıraya dizmek için bir algoritma)
 Algoritma için iç içe iki döngü ve bir yineleme sayacı
  kullanılır. Bu yineleme sayacının bir turunda, dizideki
  kalan en büyük sayı dizinin sonuna gider. Buna göre ilk
  yinelemede dizinin en büyük sayısı en sona gider. Bundan
  sonra artık en son sayıyı denetlemeye gerek yoktur.
  İkinci yinelemede en büyük ikinci sayısı sondan bir
  önceki yere gider. Bu şekilde n-1 yinelemede n sayı
  sıraya dizilmiş olur. Her yinelemede ise denetlenmesi
  gereken sayı adedi 1 azalır.

                                                         22
Kabarcık Sıralama (Bubble Sort)

    12 4 15 7 20 13
     ◦ 4 12 15 7 20 13
     ◦ 4 12 7 15 20 13
     ◦ 4 12 7 15 13 20
    4 12 7 15 13 20
     ◦ 4 7 12 15 13 20
     ◦ 4 7 12 13 15 20  Tamamlandı


                                      23
public class kabarcikSiralama
{ final static int maksEleman = 2000;
     public static void main(String[]args)
     {
                 int n;
                 Scanner klavye = new Scanner(System.in);
                 int[] liste = new int[maksEleman];
                 //listeyi yarat
                 System.out.print("Liste boyunu giriniz:");
                 n = klavye.nextInt();
                 for(int i=0; i<n; i++)
                                    liste[i] = (int)Math.round(Math.random()*5)+1;
                 liste = kabarcik(liste,n);
                 System.out.println("Sirali Liste:");
                 for(int i=0; i<n; i++)
                    System.out.println(liste[i]);

      }
//------------------------------------------
   public static int[] kabarcik(int[] x, int boy)                              Static bir metod icinden
   {                                                                           (main) static bir baska
      int gecici;                                                              metodu (kabarcik)
      for(int k=1; k<boy; k++)
        for(int i=0; i<boy-k; i++)                                             cagirdigimiz icin, ve her ikisi
                     if(x[i]>x[i+1])                                           de ayni sinif icinde tanimli
                     {
                                         gecici = x[i];
                                                                               oldugu icin sadece adini
                                         x[i] = x[i+1];                        kullanmamiz yeterli. Nesne
                                         x[i+1] = gecici;                      olusturup onun uzerinden
                     }
       return x; }}                                                            cagirmamiza gerek yok.



                                                                                                                 24
Dizilerde Veri Türü Olarak Nesne
Kullanılması
Bir dizinin eleman tipi nesne olabilir.
public class Kisi
{                                                      Kisi [] ogrenci = new Kisi [maksMevcut];
      private String isim;
      private String ePosta;                           ogrenci[i] = new Kisi(); //nesne kurucu
      private String dogumYeri;
      private double gpa;                              ogrenci[i].setIsim(“Ali Veli”);
//----------------------------------------------------
      public Kisi(String a, String b, String c, double o)
      {
                 isim=a;ePosta=b;dogumYeri=c;gpa=o;
      }
//----------------------------------------------------
      public Kisi()
      {
      }
//----------------------------------------------------
      public void setIsim(String adSoyad)
      {
                 isim=adSoyad;
      }
…
}



                                                                                                  25
Çok Boyutlu Diziler
    Matris veya çok boyutlu veri        80   65   55    70
     gösterimi için kullanılırlar.
    2 Boyutlu bir dizi:
                                         67   70   55    90

    veri_turu [] [] matris = new        45   80   73    36
     veri_turu [4] [4];
    Bir elemana ulaşmak için yerini 2   25   16   81    96
     indisi de kullanarak tespit etmek
     lazım.
    matris[1][1] = 70;
    matris[0] [0]= 80;
    matris[1][0]=67;
    matris[2][3]=36;



                                                    26
Çok Boyutlu Diziler
   Çok boyutlu diziler aslında her boyut içinde yer
    alan birer boyutlu dizilerin bileşkesidir. Tüm
    dizinin uzunluğu (büyüklüğü) her boyuttaki
    dizilerin uzunluğunun çarpımına eşittir.
   Örnek:
   int [][] tablo = new int [10][20];
   tablo[3][5] = 23;
   System.out.println (“Tablo cok boyutlu dizisinin
    uzunlugu: “ + tablo.length);  10


                                                       27
  Ayrıca her boyuttaki dizilere de ayrı ayrı erişebiliriz,
   bunları da birer boyutlu diziler olarak kullanabiliriz.
 Örnek:
int [][] tablo = new int [3][10]         yazmak yerine
int [][] tablo;
tablo = new int [3][];
tablo[0] = new int [10];
tablo[1] = new int [10];
tablo[2] = new int [10];
 yazılabilir ve bu iki ifade de birbirine denktir. Bu şekilde
   çok boyutlu diziyi oluşturan tek boyutlu dizilerin
   uzunluklarını da ayrı ayrı kullanmak mümkün olabilir.
   Buna göre
 tablo[0].length ifadesi 0. indisteki dizinin uzunluğunu
   gösterir.


                                                                 28
int [][] matris = new int [4][4];
for (sira = 0; sira <4; sira++ )
   for (sutun = 0; sutun <4; sutun++ )
        matris [sira][sutun] = (int) (Math.random()*5) + 1;
for (sira = 0; sira <4; sira++ )
{
   for (sutun = 0; sutun <4; sutun++ )
        System.out.print (matris[sira][sutun] + “ “);
   System.out.println ();
}
Çıktı:
7 4 5 3
6 5 4 1
2 4 5 8
9 6 5 3

                                                              29
Referans : kadioğlu




                      30

								
To top