Veri Yapıları – 2007 Java Programlama Diline Giriş Yrd. Doç. Dr. Aybars UĞUR 1 Java • Java, ilk olarak Sun Microsystems tarafından geliştirilen nesne yönelimli programlama dilidir. • 1995 yılında piyasaya sürülmüştür. James Gosling, Haziran 1991’de “Oak” adıyla geliştirmiştir. • Platform bağımsızlığı (programı bir kere yaz, derle ve her platformda çalıştır), tasarım amaçlarındandır. Birçok donanım, işletim sistemi ve platformda çalışabilmektedir. 2 Önemli Java Gerçekleştirimleri Sürüm Ad Açıklama JDK 1.1 (1995) Java 1.0 İlk sürüm J2SE 1.2(1998) J2SE Java 2 J2SE (Java 2 Platform, Standard Edition) J2EE (Java 2 Platform, Enterprise Edition) J2ME (Java 2 Platform, Micro Edition). J2SE 5.0(2004) J2SE Tiger Generic yapılar, Autoboxing/Unboxing Gelişmiş for döngüsü, Varargs (Değişken sayıda argüman) J2SE 6 (2006 sonu) : Mustang J2SE 7 (Ağustos 2006-2008) : Dolphin 3 JVM ve Bytecode • JVM (Java Virtual Machine) veya Java Sanal Makinesi: Java’nın özgün sanal makine modelini gerçekleştiren bilgisayar programları ve yapılarından oluşan bir bütündür. • “Java Bytecode” adı verilen, bilgisayar ara dilini kabul eder. Bir programın bytecode’u, Java dili derleyicileri tarafından üretilir. 4 İlk Java Programı Prog1 adlı java programı : class Prog1 { public static void main(String args[]) { System.out.println("Merhaba"); } } ekrana merhaba yazdırmaktadır. 5 Java Uygulaması Java programlarında // Satırın geri kalan kısmının açıklama satırı olduğunu gösterir. Geleneksel /* Açıklama */ işaretleri de özellikle çok satıra yayılan açıklamalarda kullanılır. Deyimler “;” ile sonlandırılmalıdır. Her java programı en az bir sınıf tanımı içermelidir. 6 Java Programının Çalıştırılması JVM’i (Java Virtual Machine) açmak üzere Java komutu kullanıldığında işletilen bilgisayar programına Java uygulaması (application) denilir. DERLEME Kaynak Kod Byte Kod javac derleyicisi Prog1.class Prog1.java class Prog1 { public static void main(String args[]) { System.out.println("Merhaba"); } } Byte Kod Prog1.class .. .. .. .. > javac Prog1.java .. 80 1a .. .. .. .. .. JVM tarafından yorumlanabilir. ÇALIŞTIRMA java yorumlayıcısı .. .. .. .. .. 80 1a .. .. .. .. .. > Merhaba > java Prog1 7 Entegre Geliştirme Ortamları • Programların IDE (Integrated Development Environment) kullanılarak yazılması, işletilmesi, test edilmesi ve hatalardan arındırılması kolay olduğu için, bu şekilde uygulama yazılması işlemine RAD (Rapid Application Development) adı verilmektedir. • • • • • Eclipse (http://www.eclipse.org/) NetBeans (http://www.netbeans.org/products/platform/) JDeveloper (from Oracle) IntelliJ (JetBrains) JCreator (http://www.jcreator.com/) … 8 Veri Tipleri • Java’da iki tür veri tipi vardır: – Temel – Referans • İki tür veri tipi arasındaki fark atama işlemi sırasında ortaya çıkar. • Temel tipteki bir değişkenin diğer bir değişkene ataması sırasında veri kopyalanır. • Referans değişkeninin diğer bir değişkene ataması sırasında ise, her iki değişken de aynı veriyi gösterir. Referanslar, C/C++ işaretçilerine (pointer) benzerler. • Diziler ve Nesnelerin tümü referans veri tipindedir. 9 Java’da Temel Veri Tipleri Type Size in bits Values boolean 1 true or false byte 8 -128 to +127 char 16 Unicode short 16 integer int 32 integer long 64 integer float 32 float double 64 double 10 Temel Veri Tiplerinin Sınırları • Tamsayıların Sınırları • Ondalıklı Sayıların Sınırları 11 Java’nın 8 Temel Veri Tipi Type Values Standard 8 16 8 16 32 true or false ’\u0000’ to ’\uFFFF’ (ISO Unicode character set) long 64 float 32 double 64 –9,223,372,036,854,775,808 to +9,223,372,036,854,775,807 –3.40292347E+38 to +3.40292347E+38 –1.79769313486231570E+308 to +1.79769313486231570E+308 boolean char byte short int Fig. 25.1 Size in bits –128 to +127 –32,768 to +32,767 –2,147,483,648 to +2,147,483,647 (IEEE 754 floating point) (IEEE 754 floating point) The Java primitive data types. Sarmalayıcı (Wrapper) Sınıflar • • • • java.lang.Byte java.lang.Short java.lang.Integer java.lang.Long • java.lang.Float • java.lang.Double • java.lang.Character • java.lang.Boolean 12 ASCII ve UNICODE Karakter Setleri • ASCII, 8 bit kodlama düzenindedir ve en yaygın karakter setidir. 256 karakterle sınırlıdır. • Unicode, 16 bitlik kodlama düzenindedir ve 65536 karakterlik sahası vardır. • Java programlama dili Unicode’u kullanır. 13 Değişkenler - I Tip değişken ismi int sayi1; // int veri tipidir. /* sayi1 değişkeninin tamsayı tipinde olduğunu belirtir */ ........ sayi1=5; float sayi=5.7f; 14 Değişkenler - II • Değişkenler, tanımlandıkları gibi değer alırlar: int a = -5; double b = 10.3; • Aynı satırda birden çok değişken tanımı yapılabilir. • C++ programlama Dilinde olduğu gibi değişkenler, herhangi bir yerde tanımlanabilir. Metodun en üstünde tanımlanma zorunluluğu yoktur. • Değişkenlerin, gerekli olduğu yerde tanımlanması uygundur. • Java Dilinde değişkenlerin kullanılmadan önce değerleri olması gerekir. • Değişkenler sadece tanımlandıkları blokta kullanılabilirler. 15 Veri Tipi Dönüştürme (Casting) • Daha geniş bir tipi, daha dar bir veri tipine dönüştürürken “casting” yapmak gerekir. double sayi1=5; // float sayi2 = sayi1; // Yanlış float sayi2 = (float)sayi1; // Doğru double sayi3 = sayi2; /* Geniş tip olduğundan problem yok */ 16 Yazdırma Komutu • System.out.print ve System.out.println System.out.print(“Merhaba”); System.out.println(“Java Dili”); Merhaba Java Dili System.out.println(“\nOrtalama="+57); System.out.println(5); int sayi = 5; System.out.println("Sayi\tKaresi"); System.out.println(sayi+"\t"+(sayi*sayi)); • Sayi Karesi • 5 25 • System.out.printf (J2SE 5.0’ın yeni özelliklerindendir) String str = "Java"; double versiyon = 5.0; System.out.printf("Merhaba %s %f ", str, versiyon); 17 OPERATÖRLER - I Hesaplamalarda kullanılan operatörler : Aritmetik : +, -, *, /, % (Mod, kalan), ++, -Mantıksal : &&, ||, !, &, |, ..... İlişkisel : == (eşittir) != (eşit değildir) >, <, >=, <= 18 OPERATÖRLER - II Atama Operatörü : değişken = deyim; int x = 5; double sayi = -3.5; int a, b, c; a=b=c=100; // Atama zinciri Bileşik Atamalar : +=, -=, *=, /=, ..... x-=10; // x = x - 10 ile eşdeğer 19 Operatörler ve Öncelik Sırası Gruplama Postfix Unary Creation, cast Multiplicative Additive Shift Relational Equality Bitwise AND Bitwise EXOR Bitwise OR Logical AND Logical OR Conditional Assignment Operatorler [] . (params) exp++ exp-++exp --exp +exp -exp ~ ! new (type)exp * / % + << >> >>> < > <= >= instanceof == != & ^ | && || ?: = *= /= %= += -= >>= <<= >>>= &= ^= |= 20 YAPISAL PROGRAMLAMA Yapısal Programlamada üç tür denetim yeterlidir: • Sıra (Sequence) • Seçim (Selection) • Tekrar (Repetition) Sıralı işletim ? 21 PROGRAM DENETİM YAPILARI • SEÇİM YAPILARI – if – if/else – switch • TEKRAR YAPILARI (Döngüler) – while – do/while – for 22 SEÇİM YAPILARI : IF if (koşul) ifade if(notu>=60) System.out.println("Geçti"); Koşul : boolean veri tipindedir. true veya false olabilir. int notu=65, sayac=0; if(notu>=60) // İfade bloğu { System.out.println("Gecti"); sayac++; }; 23 SEÇİM YAPILARI : IF/ELSE if (koşul) ifade; else ifade; if(notu>=60) System.out.println("Gecti"); else System.out.println("Kaldı"); 24 CONDITIONAL OPERATOR (?:) System.out.println(notu>=60? "Geçti":"Kaldı"); Eşdeğer ifade : if (notu>=60) System.out.println("Geçti"); else System.out.println("Kaldı"); 25 IF-ELSE-IF MERDİVENİ (CASCADING IF) if(koşul) ifade else if (koşul) ifade else if (koşul) ifade ............... else ifade; if (notu>=90) str = “A”; else if (notu>=80) str = “B”; else if (notu>=70) str = “C”; else if (notu>=60) str = “D”; else str = “E”; System.out.println(str); 26 SEÇİM YAPILARI : SWITCH Çoklu Seçim switch (deyim) { case sabit1: ifade1; break; case sabit2: ifade2; break; .... default : ifade; break; } int sayi = 4; switch(sayi) { case 0 : System.out.println(" Sayı 0"); break; case 1 : System.out.println(" Sayı 1"); break; case 2 : System.out.println(" Sayı 2"); break; default : System.out.println("X"); break; 27 DÖNGÜLER : FOR sayac : kontrol değişkeni olmak üzere, for(int sayac=0; sayac<10; ++sayac) ifade for(başlangıç; devam koşulu; kontrol değişkeni değişimi) ifade for(int sayac=0; sayac<10; ++sayac) { ifadeler } 28 DÖNGÜLER : WHILE ve DO-WHILE while(koşul) ifade do { ifadeler } while (koşul); int sayac=1, toplam=0; while(sayac<10) { toplam+=sayac; sayac++; }; 29 DÖNGÜDEN ÇIKMAK : BREAK for(int x=1; x<10; ++x) { toplam+=x; if (x==5) break; } System.out.println("1 ile 5 arasındaki sayıların toplamı = "+toplam); break sadece en içteki döngüden çıkar. 30 DÖNGÜDE ERKEN TEKRAR : CONTINUE 1 ile 100 arasındaki tek sayıları yazan program : for(int i=0; i<100; ++i) { if ( (i%2)!=1) continue; System.out.println(i); } 31 Mantıksal Operatörler • VE : Conditional AND && • VEYA : Conditional OR || if ( (yas>50) && (boy>170) ) …; Conditional ve/veya, kısa devre hesaplaması yapabilir. • VE : Boolean Logical AND & • VEYA : Boolean Logical OR | if ( (yas>50) && (boy>170) ) …; Boolean mantıksal ve/veya, tüm operand’ları hesaplar. 32 DİZİLER - I Dizi (array), aynı tipteki değişkenler topluluğudur. int[] arr = new int[10]; int[] dizi = {5,7,12,2,9,8,14,21,-6,5}; 0 1 2 3 4 5 6 7 8 9 5 7 12 2 9 8 14 21 -6 5 double[] sayilar; sayilar = new double[5]; -3.4 12.5 27.0 1.1 25.33 33 Diziler - II Diziler, temel veri tipi listesi veya referans listesi içerebilirler. Diziler, köşeli parantezlerle ifade edilirler : [] Köşeli parantezler veri tipinden sonraya yerleştirildiğinde, tüm değişkenleri dizi olarak tanımlar: int[] sayilar, numaralar; Köşeli parantezlerin değişkenden sonraya yerleştirilmesi sadece o değişkeni dizi yapar: int sayilar[], sayac; 34 Diziler - III Diğer referans tipleri (nesneler) gibi diziler de, ya bazı verileri gösteriyordur veya hiçbir yere işaret etmiyordur. Hiçbir yeri göstermiyorsa, int sayilar[] = null; şeklinde olduğu gibi tanımlanmalıdır. Bellekten 15 tamsayılık yer ayırmak için : sayilar = new int[15]; şeklinde kullanılabilir. “new” operatöründen sonraki veri tipi, tanımlı değişkenin veri tipi ile aynı olmalıdır. Java dizinin her elemanına default olarak 0 değerini atar. 35 DİZİ KULLANIM ÖRNEKLERİ dizi[2]++; dizi[3]=dizi[1]+dizi[2]; System.out.println(dizi[5]); Dizi elemanlarının toplamını bulduran programı yazınız : dizi.length kullanınız! 36 İKİ BOYUTLU DİZİLER (MATRİSLER) tablo • MxN • M satır, N sütun M=4 0 1 2 2 15 9 0 21 33 8 1 3 17 61 2 89 3 5 3 N=3 • Oluşturulması : int[][] tablo = new int[4][3]; • Kullanımı : tablo[0][2] 37 ÇOK BOYUTLU DİZİLER • Tip []…[] isim = new tip[büyüklük1]...[büyüklükN] • Tip isim[]…[] = new tip[büyüklük1]...[büyüklükN] Örnek : float cbDizi[][][][]; // 4 boyutlu dizi cbDizi = new float[3][4][2][6]; 38 STRING’LER ve KARAKTER DİZİLERİ • Karakter dizisi : Karakterlerden oluşan dizidir. char harfDizi[] = { ‘T', 'e', ‘s', ‘t' }; for(int i=0; i<harfDizi.length;++i) System.out.println(harfDizi[i]); • String : Karakter dizisinden farklıdır. Çok sayıda metot içerir. Java’nın String sınıfı kullanılır. String str = "Merhaba"; System.out.println(str); str = new String(harfDizi); System.out.println(str); 39 Dizilerden Oluşan Diziler int[][] list = new int[10][]; list[0] = new int[5]; list[1] = new int[10]; list[1][6] = 23; list[0][6] = 23; /* Hata! Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6 at Ornek3.main(Ornek3.java:34) */ 40 BÖL ve ÇÖZ (Divide and Conquer) • Yazılım Mühendisliği deneyimleri, büyük programlar geliştirmenin en iyi yolunun küçük program parçaları (modül) yazıp onları birleştirmek olduğunu göstermiştir. • Böl ve Çöz olarak bilinen bu yöntem aynı zamanda, hatalardan arındırmayı, programı gelişen şartlara göre büyütmeyi, değişiklikler yapmayı kolaylaştırmak ve anlaşılırlığı artırmak gibi birçok avantajı da beraberinde getirmektedir. • Java’da temel modüller, sınıf (class) ve metotlardır (method). Metotlar yazılım içinde yeniden kullanılarak kodu ve yazılım geliştirme süresini kısaltmaktadır. 41 METOTLAR (METHOD) • Bir işlemin yapılması için bir veya daha fazla ifade kullanmak gerekir. Verilen bir matrisi ekrana yazdırmak gibi. İlgili kodu “yazdir()” adını verdiğimiz bir metot içine yazarak istediğimiz zaman, ismi ile çağırabiliriz. • Java, matematik hesaplamalarını, string, karakter, girdi/çıktı işlemlerini ve diğerlerini yapmak için hazır sınıflar ve metotlar içermektedir. Ayrıca değişik alanlarda hazırlanmış veya kendimizin daha önceden hazırladığı metotları da kullanmak mümkündür. • Hazır veya kullanıcı tanımlı paketleri, import java.util.Random; import java.util.*; biçimlerinde görüldüğü gibi “import” kullanılarak yüklenirler. 42 Java Paketleri • Hazır Java paketleri içerisinde, birçok sınıf mevcuttur. java.applet Java.net java.awt Java.text java.awt.event Java.util java.io Java.swing Java.lang Java.swing.event … • Java.lang paketi, Java’da çok kullanılan sınıfları içerir. Bu paketteki java.lang.Math sınıfı içerisinde bulunan bazı sahalar ve metotlar sonraki slaytlarda gösterilmiştir. (Sadece “lang” paketine özgü olarak, kullanıcının getirme “import” zorunluluğu yoktur) 43 Field Summary static double E static double PI Method Summary static double abs(double a) static float abs(float a) static int abs(int a) static long abs(long a) Returns the absolute value of a double value. Returns the absolute value of a float value. Returns the absolute value of an int value. Returns the absolute value of a long value. static double acos(double a) Returns the arc cosine of a value; the returned angle is in the range 0.0 through pi. static double asin(double a) Returns the arc sine of a value; the returned angle is in the range -pi/2 through pi/2. static double atan(double a) Returns the arc tangent of a value; the returned angle is in the range pi/2 through pi/2. static double atan2(double y, double x) Returns the angle theta from the conversion of rectangular coordinates (x, y) to polar coordinates (r, theta). static double ceil(double a) Returns the smallest (closest to negative infinity) double value that is greater than or equal to the argument and is equal to a mathematical integer. static double cos(double a) Returns the trigonometric cosine of an angle. static double exp(double a) Returns Euler's number e raised to the power of a double value. static double floor(double a) Returns the largest (closest to positive infinity) double value that is less than or equal to the argument and is equal to a mathematical integer. 44 Hazır java.lang.Math sınıfının bazı metotları static double log(double a) Returns the natural logarithm (base e) of a double value. static double log10(double a) Returns the base 10 logarithm of a double value. static double max(double a, double b) Returns the greater of two double values. static double min(double a, double b) Returns the smaller of two double values. static double pow(double a, double b) Returns the value of the first argument raised to the power of the second argument. static long round(double a) static double sin(double a) Returns the trigonometric sine of an angle. static double sqrt(double a) double value. static double tan(double a) Returns the closest long to the argument. Returns the correctly rounded positive square root of a Returns the trigonometric tangent of an angle. static double toDegrees(double angrad) Converts an angle measured in radians to an approximately equivalent angle measured in degrees. static double toRadians(double angdeg) Converts an angle measured in degrees to an approximately equivalent angle measured in radians. http://java.sun.com/javase/6/docs/api/java/lang/Math.html 45 METOTLARIN GENEL BİÇİMİ erişim dönüş_tipi isim(parametre listesi) { metodun gövdesi } Erişim : public, private gibi Dönüş_tipi : metodun döndürdüğü veri tipi. Değer döndürmüyorsa void. Parametre listesi : “,” lerle ayrılmış tip ve parametre ismi. 46 Değer Döndürmeyen Metotlar void metotları public void yazdir() { System.out.println("Merhaba"); } Çağrılması : yazdir(); 47 Değer Döndüren Metotlar public int topla(int a, int b) { return (a+b); } Çağrılması : int y=topla(5,6); Metodun iki de parametresi var. 48 Parametre, Argüman, Return Argüman : Metoda aktarılan değer Parametre : Argümanı kabul eden değişken Return : Metottan çıkmak veya geri dönmek 49 Değişkenlerin Kapsama Alanı { … int x = 5; if(sayi>5) { int y = 12; … y değişkeninin tanımlı olduğu bölge } // y tanımlı değil // x tanımlı } for(int i=0; i<5; ++i) System.out.println(i); i=10; // Hatalı! 50 Metotlar – Örnek 1 int dizi[] = { 5,6,7,8 }; veya benzer şekilde verilen bir tamsayı dizisinin elemanlarının toplamını bulan metodu içeren java programını yazınız. class DiziTopla { public static void main(String args[]) { int dizi[] = { 5,6,7,8 }; System.out.println(topla(dizi)); } public static int topla(int dizi[]) { int toplam = 0; for(int i=0; i<dizi.length; ++i) toplam+=dizi[i]; return toplam; } } 51 Metotlar – Örnek 2 class Ornek2 { public static void main(String args[]) { String str = "test"; nyazdir(str,10); } public static void nyazdir(String str, int n) { for(int i=0; i<n; ++i) System.out.println(str); } } 52 Metotlar – Örnek 3 Faktöriyel class Ornek3 { public static String f(int n) { int carpim = 1; if (n<0) return "Invalid Input For Function"; else for(int i=1; i<=n;++i) carpim*=i; return ""+carpim; Sayı döndüren } public static void main(String args[]) { int sayi = 5; System.out.println(f(sayi)); } faktöriyel fonksiyonunu yazınız. } 53