JAVA DERS NOTLARI Yrd.Doç.Dr. Nurşen TOPÇUBAŞI Java Dilinde İfadeler ve İşlem Operatörleri Yazdığınız program bir veri üzerinde işlem görecekse, öncelikle o verilerin tanımlanması gerekir. Bu tanımlanma bilgisayarın o verileri nasıl ve hangi şekilde kullanacağının önceden belirlenmesi olarak da nitelendirilebilir. Java da Veri Tipleri, Değişkenler, Tip Dönüşümleri Veri tipleri bütün programlama dillerinde geçerli özelliklere sahiptir. Veri tiplerini değişkenleri tanımlarken mutlaka kullanmamız gerekir. • İlkel(Primitif) veri tipleri • Referans tipler • Null Veri tipi Ama Java gibi nesne yönelimli programlama dillerinde veri tiplerinin hepsi bir sınıftır ancak çok sık kullanıldıkları için Java bazı veri tiplerine ayrıcalık tanımıştır bu türden veri tiplerine ilkel (primitif) veri tipleri denir. Java dili bu veri tiplerini nesneler yaratmadan kullanmamıza izin verir. İlkel (Primitif) Veri Tipleri • • • • Tam Sayılar için: long, int, short, byte Ondalıklı Sayılar: double, float Mantıksal Sınamalar: boolean Karakter: char ÖRNEK: package sayi1; public class sayi1ornek Referans Tipler İlkel veri tiplerinden bahsettik şimdi de onların gömüldüğü sınıflardan bahsedeceğiz. Bunlar: Byte, Short, Integer, Double, Character, Float, Double, Boolean sınıflarıdır. Yukarıda bahsi geçen int bir primitif veri tipdir, Integer ise bir nesnedir. Integer gibi sınıflar immutable (değişmez) özelliğe sahiptirler, sıradan nesneler gibi davranmazlar. Bu verilen örnekler (byte-Byte), (short-Short), (floatFloat), (double-Double), (char-Character), (booleanBoolean) için de geçerlidir. int Türü İfadeler int türünde tamsayı sabit ya da değişken içeren ifadeler, sonuçta tamsayı (int) değer üretecektir. Örneğin, int a,b,c; a=9; b=12; c=13; şeklindeki atamalar ile, a + b / c ifadesi, 9+12/13=9+0=9 olarak hesaplanacaktır. b – c % a + ‘x’ – 3 + (int) 8.7 ifadesi ise 12 –13%9+120 –3+8 12 – 4 + 120 –3+8=133 • aşamalarından geçerek 133 olarak hesaplanır. ’x’ karakter sabiti yerine onun ASCII kodu olan 120 değeri alınır. 13%9 ifadesi ise 13’ün 9 ile bölümünden elde edilecek olan kalanı hesaplanır. (int) 8.7 ifadesi ise 8.7 ondalık sayısını int türüne yani 8’e dönüştürür. Aşağıdaki program bu hesaplamaları gerçekleştiriyor: package uygulama; public class uyg2 { float Türündeki İfadeler Programlamada özellikle hesaplama aşamasındayken, sadece tamsayılar üzerinden gidilmez. Rasyonel sayıları kullanmak istediğinizde, Java dilinde float ve double türündeki değişkenler ile rasyonel sayıları tutabilirsiniz. Float ve double türünden değişkenlerin adını kayan noktalı (floating point) değişkenler olarak da duyabilirsiniz. Buradaki nokta kısmı, tam sayı kısmı ile ondalıklı sayı kısmını bölen virgül oluyor. Float ve double türlerinin arasındaki fark, virgülden sonraki ondalık kısımda tutabildikleri hane sayısıdır. Bu yüzden bir float değişken sanal bellekte 32 bitlik yer tutarken, double türündeki bir değişken 64 bit yer tutacaktır. Kayan noktalı bir tip yerine tamsayı tipini kullandığınızda; package float; public class FloatDeneme1 public class FloatDeneme2 Tip Dönüşümleri (Type-Casting) int’i String’e dönüştürme işlemi int sayi= 77 ; String donusenKelime = String.valueOf(sayi) ; System.out.println("Dönüşen Kelime: "+donusenKelime); String’i int’e dönüştürme String ifade = "17" ; int donusenSayi = Integer.valueOf(ifade) ; System.out.println("Dönüşen sayı: "+donusenSayi); String’i byte,short,long,double ve float’a dönüştürme işlemleri String’i byte,short,long,double ve float’a dönüştürme işlemleri package don2; public class donusturme2 { Byte, short, long, double ve float’ı String’e dönüştürme işlemleri package donusturme; public class donusturme1 { Tablo T.1-Tekli Operatörler operatör Sembo kullan işlem sonucu -lü lışı tekli negatif – alma son artım ön artım son azaltım ön azaltım ++ ++ –– –– –a a’nın negatifini alır a++ önce a’nın değerini al, kullan, sonra 1 artır. ++a önce a’nın değerini 1 artır, sonra kullan. a–– önce a’nın değerini al, kullan, sonra 1 son azaltım azalt. ––a önce a’nın değerini 1 azalt, sonra kullan. package uygulama; public class uyg5 { public class uyg6 { public class uyg7 { public class uyg8 { İkili Aritmetiksel Operatörler Operatör Sembolü Kullanılışı İşlem Sonucu çarpma * a*b a ile b’nin çarpımı bölme / a/b a’nın b’ye bölümü kalan % a%b a’nın b’ye bölümünden kalan toplama + a+b a’nın b ile toplanması çıkarma – a-b b’nin a’dan çıkarılması *, / ve % operatörleri, + ve –'ye göre önceliklidir. *, /, + ve – operatörlerinin int veya float (double) türde operand kabul etmelerine karşılık kalan operandları sadece int türde operand olarak kabul eder. % operandı bölmede kalanı hesaplar. package uygulama; public class uyg9{ Aritmetiksel Atama Operatörleri Operatör Sembolü Kullanılışı İşlem Sonucu Atama = x=y y’nin değerini x’e ata Topla-ata += x+=y x + y’nin değerini x’e ata Çıkar-ata –= x–=y x – y’nin değerini x’e ata Çarp-ata *= x*=y x * y’nin değerini x’e ata Böl-ata /= x/=y x / y’nin değerini x’e ata Kalanını ata %= x%=y x % y’nin değerini x’e ata package uygulama; public class uyg10 { public class Uyg10{ public static void main(String[ ] args){ int k; double l; l = k =13.72; System.out.println("l="+l); System.out.println("k="+k); } } ÖRNEK PROGRAMIN ÇIKTISI x + = y ifadesi x = x + y ifadesine, x % = y ifadesi de x = x % y ifadesine denktir. = operatörünün atama amacı ile kullanıldığını biliyoruz. Sembolün sol tarafındaki operand bir sol taraf operandı (left hand operand, Lvalue) olmalıdır. Sol taraftaki operand (değişken, dizi elemanı, yapı elemanı vb.) sağ taraftaki operandın değerini bellekte saklar. ÖRNEK: • int k; double l; l = k = 13.72; Yukardaki komutlar ile (=) sembolünün birleşme özelliği sağdan sola olduğu için, • ( l = (k = 13.72)); sırasıyla atamalar yapılacaktır. Java hassasiyetin kaybolmasına izin vermeyeceği için k=13.72 atamasında, • “possible loss of precision” veya Eclipse'te "cannot convert from double to int" • şeklinde bir hata mesajı verilecektir. Java’da sadece programcının açıkça cast ifadeleri ile, • (int) 13.72 • gibi, hassasiyetin kaybolmasına özellikle izin verdiğini belirtmesi halinde bu tür atamalar yapılır. ÖRNEK PROGRAM: CAST İFADESİNİN KULLANIMI package uygulama; public class uyg10 { public static void main(String[ ] args){ int k; double l; l = k =(int)13.72; System.out.println("l="+l); System.out.println("k="+k); } } Java’da Operatör Kavramı ve Kullanımı • Unary Operator: Operand Operator örnek: ( ++degisken ), ( --degisken), ( degisken++),( degisken--) • Binary Operator: Atama operatörü; iki değişken alır ve sağdaki işleneni soldaki işlenene atar. • (+) , (-), (/), (*), (%) gibi aritmetik operatörler de binary operatörlerdir. • Ternary operator: “?:” 3 tane işlem alan tek operatördür. if ile yapılanları tek satırda yapar. int x = 6, y = 4; int max = (int) ((x <= y) ? y : x); /*koşullu olasılık gibi çalışır X değeri y değerinden küçük ve eşit ise y değerini yazar, değilse x değerini yazar. */ Örnekler • • • • package aritmetik; public class art1 { public class art2 { public class art3 { İlişkisel Operatörler: <, >, >=, <=, ==, != • public class art4 { Mantıksal (Logic) Operatörler: package aritmetik; public class art5 { public class art6 { System.out.println() metodu Bu metod java tarafından tanınan ve daha önce yazılmış bir metoddur. Bu metodu kullanırken parantezler içerisine yazılan (parametre olarak yazılan) degisken ve sabitler ekranda görüntülenir. Eğer parantez içerisine bir değişken yazılmış ise bu değişkenin içerisindeki değer ekrana yazılacaktır. Ayrıca + operatörü yardımıyla parantez içerisine birden fazla tür yanyana yazılabilir. Örneğin: package degisken; public class Degiskenler { Özel Karakterler _liskin Bir Not: C ve C++ programla dillerinde de olduğu gibi Java'da klavyeden girilen bir takım özel karakterlerin karşılığı vardır. Bu özel karakterler bip sesi, enter tuşu, alt satır bası, tab tuşu gibi karakterlerdir. Bu karakterler kullanılırken başlarına \ işareti koyulur ve uygun sembol yerleştirilir. Buna göre: • \n : alt satır basına • \t : tab tuşu • \\ : \ işareti • \” : “ işareti • \b : backspace (bir önceki karakteri silme) • \r : kendisinden önce gelen tüm karakterleri satır basına kadar silme • anlamına gelmektedir. Java: printf() Metodu İle Çıktıyı Biçimleme Java’da String formatlamayı printf() metodu ile yapabiliyoruz. printf() kullanımında sözdizimi şöyledir: • System.out.printf(format, argümanlar); Format deyimi, çıktının biçemini belirleyen nakıştır (pattern). printf() metodunda Nakışı Belirleyen Sözdizimi: • printf(%[argument_index$][flags][width][.precision]conversion ) () içindeki terimlerin anlamları şöyledir: • % Dönüşümü başlatan simge • [] Bu parantezlerin içleri isteğe bağlıdır. Gerekli ise yazılır. • argument_index$ Değişken_damgası, değişken değeri için yer tutucu; değişkenin çıktıda nereye konuşlanacağını belirtir. • Flags Bayraklar: - , ^ , 0 , # • conversion : d,o,x,f,g,a,c,s,b,h,n harfleri dönüşümün ne olacağını belirler. Dönüşümlerin tanımları aşağıdaki listede verilmiştir. argument_index: "1$" ilk değişkene yer tutar "2$" ikinci değişkene yer tutar '<' önceki formatın kullanılacağını belirtir. flags: '-' left-justified (sola dayalı yaz) '^' and uppercase (Büyük harfle yaz) '+' output a sign for numerical values. (pozitif/negatif işareti koy) '0' forces numerical values to be zero-padded. (nakışın hanelerini doldur) Width : (genişlik) Çıktının kaç kolona yazılacağını belirler. Precision: (duyarlık) Kesir hanelerinin sayısını belirler. typechar dönüşüm tipini belirleyen karekterdir. Örnekler: System.out.printf(“%d”, 123.6) nın çıktısı 124 tür. d dönüştürücüsü sayıyı decimal tamsayıya dönüştürür. System.out.printf(“%f”,1234567.123) ün çıktısı 1234567,123000 dır. f dönüştürücüsü sayıyı kesirli sayıya dönüştürür. Aksi istenmezse, kesir hanelerinin öntanımlı (dafault) sayısı 6 dır. int c = 65; out.printf(«cikti: [%2x] : %3d : %1c\n", c, c, c ); deyiminin çıktısı şudur: // prints : cikti:_[41]_:__65_:_A Bu deyimi ve çıktıyı irdeleyelim: // %2x ilk değişken için 2 harf genişliğinde yer tutar; hex olarak yazar // %3d sonraki değişken için 3 harf genişliğinde yer tutar; decimal olarak yazar // %1c sonraki değişkene 1 harf genişliğinde yer tutar; Unicode olarak yazar // Geri kalanların hepsi [] dahil dekoratiftir Tip dönüştürme karekterleri 'd': decimal integer 'o': octal integer 'x': hexadecimal integer 'f': decimal notation for float 'g': scientific notation (with an exponent) for float 'a': hexadecimal with an exponent for float 'c': for a character 's': for a string. 'b': for a boolean value, so its output is "true" or "false". 'h': output the hashcode of the argument in hexadecimal form. 'n': "%n" has the same effect as "\n". (10 tabanlı tamsayı) (8 tabanlı tamsayı) (16 tabanlı tamsayı) (kesirli sayı göster) (kesirli sayıyı üstel göster) (16 tabanlı sayıyı üstel göster) (karekter göster) (stringe dönüştür) (mantıksal değere dönüştür) ((hash kodunu hex olarak göster) (satırbaşı yap) Örnekler package printf; public class Jprintf01 { public class Jprintf02 { public class Jprintf03 { public class Jprintf04 { public class Jprintf05 { public class Jprintf06 { public class Jprintf07 { public class Jprintf08 { SCANNER SINIFI VE KLAVYEDEN VERİ OKUNMASI Java Kütüphaneleri • Java’da kütüphaneler paket olarak adlandırılır – Paket belirli bir mantıksal çerçeveye göre biaraya getirilmiş sınıflardan oluşur ve bu sınıflara erişim kolaylığı sağlar. – Herhangi sınıfı kullanabilmek için o sınıfın ait olduğu paketi import kullanarak ithal etmek gerekir. – java.lang paketi içerisindeki sınıflar otomatik olarak import edilirler import java.util.Scanner; // sadece Scanner sınıfını import eder import java.util.*; // java.util paketindeki bütün sınıfları import eder – (*) kullanmak yerine belirli bir sınıfı import etmek daha doğrudur. Scanner Sınıfı ile Konsol Girişi • Scanner kullanıcıdan veya başka kaynaklardan giriş almak için kullanılır. • Scanner java.util paketi içinde olduğundan kullanabilmek için bu paketi import etmek gerekir import java.util.Scanner • Bu komut Java’ya – Scanner sınıfını kullanıma hazır hale getirmesini – Scanner sınıfını java.util paketinde bulmasını anlatır Scanner nesnesi • Scanner nesnesi farklı kurucu metodlar kullanılarak oluşturulabilir: – Scanner(File kaynakDosya) Belirtilen kaynak dosyadan değerleri okuyabilecek bir Scanner nesnesi oluşturur. – Scanner(InputStream kaynak) – Scanner(Readable source) – Scanner(String kaynakString) Belirtilen Stringden değerleri okuyabilecek bir Scanner nesnesi oluşturur. Scanner sınıfı ile kullanıcı girişi • Scanner kullanarak klavyeden giriş almak için System.in InputStream kaynağı kullanılır • System.in değişkeni: – Standart input stream – klavye • Scanner Sınıfı ile kullanımı Scanner klavye = new Scanner (System.in); Klavyeden giriş • nextInt metodu klavyeden bir adet int değer okumak ve bir değişkene atamak için kullanılır : int ogrenciSayısı = klavye.nextInt(); • nextDouble metodu klavyeden bir adet double değer okumak ve bir değişkene atamak için kullanılır double maas = klavye.nextDouble(); • Birden fazla giriş için girilen değerler boşluklarla ayrılmalı ve uygun metod kullanılarak okunmalıdır: – Boşluk karakteri olarak boşluk, tab, yeni satır karakterleri kullanılabilir Scanner ile String okuma • next metodu boşluklarla ayrılmış karakterleri okumak ve String değişkenlerine atamak için kullanılır: • Aşağıdaki komutlar String kelime1 = klavye.next(); String kelime2 = klavye.next(); giriş olarak Kuru fasulye verilince, kelime1 değişkenine Kuru, kelime2 değişkenine fasulye, değerlerini atar Scanner ile Satır okuma • nextLine metodu klavyeden girilen satırın tamamını okur String satir = keyboard.nextLine(); komutu satırı girilen satırın tamamını satir değişkenine atar • Satırın sonu '\n' karakterleri ile belirtilir – Bu karakterler Enter tuşuna basılınca okunur – Ekranda üst satırdan alt satıra geçilerek gösterilir • nextLine komutu bir satır okuyunca '\n' karakterini de okur, dolayısıyla bir sonraki giriş sonraki satırdan başlar – Ancak, '\n' karakteri atanan String değerinin parçası olarak algılanmaz (yani t satır değişkenine atanan değer '\n' karakteri ile sona ermez) Package mathfonk; public class Matematik { Scanner metodları public Scanner(InputStream in) public Scanner(String s) // Scanner(): constructor for reading from a InputStream // Scanner(): constructor to read from a file object // Scanner(): constructor to scan from a string public int nextInt() public short nextShort() public long nextLong() public double nextDouble() public float nextFloat() public String next() public String nextLine() public boolean hasNext() // nextInt(): next input value as an int // nextShort(): next input value as a short // nextLong(): next input value as a long // nextDouble(): next next input value as a double // nextFloat(): next next input value as a float // next(): get next whitespace-free string // nextLine(): return contents of input line buffer // hasNext(): is there a value to next public Scanner(File f) equals() Kullanımı: Java’da stringleri karşılaştırmak için kullanılan metottur. isim1.equals(isim2); şeklinde kullanılır. ‘= =’ karsılaştırma ifadeleri kullanırsak iki nesnenin ayni olup olmadığına bakar. Bizim burada equals() ile yaptığımız ise iki String nesnesinin aldığı değerlerin karşılaştırılmasıdır. package equals; public class JavaEqualsKullanımı { Java'da String Metodları String sınıfı Java'da metinler tanımlamak için kullanılır ve bize metinler üzerinde çeşitli işlemler gerçekleştirmemiz için yardımcı fonksiyonlar sunar. Java'da bir metin aşağıdaki gibi tanımlanabilir: • package stringornek; • public class stringornek1 { Bu şekilde myString adında bir değişkene "Merhaba dunya" yazısını atamış oluyoruz. • Bu metinin uzunluğunu (karakter sayısını) merak edersek length metodunu çağırmamız gerekir: • package stringornek; • public class stringornek2 { Böylece tanımlanan değişkende kaç karakter olduğunu konsola yazdırmış olduk. Şimdi ise konsola sadece "dünya" kelimesinin yazılmasını sağlayalım: • package stringornek; • public class stringornek3 { Eğer elimizdeki "Merhaba dunya" metnini bir dizi olarak düşünürsek harflerin dizinleri (index) aşağıdaki şekilde olacaktır: m e r h a b a d ü n y a 0 1 2 3 4 5 6 7 8 10 11 12 Sadece "dunya" kelimesini yazdırmamız için 8. karakterden başlayarak son karaktere kadar olan bölümü almamız gerekir. substring metodu başlangıç ve bitiş dizinleri arasında kalan karakterleri bir String olarak döndürür: "Merhaba" kelimesi ise aşağıdaki şekilde görüntülenir: • package stringornek; • public class stringornek4 { Bir harfin ya da String değerinin kaçıncı dizinden (index) itibaren başladığını merak ediyorsanız, indexOf metodunu kullanabilirsiniz. Örneğin "dunya" kelimesinin kaçıncı dizinde olduğunu öğrenmek için • package stringornek; • public class stringornek5 { NOT: indexOf metodu eğer aranan metni bulamazsa -1 döndürür. Bu şekilde metinler içinde arama yapabilirsiniz. (örneğin “ahmet.mail.com”.indexOf(“@”) == -1 ise eposta adresi yanlış girilmiştir gibi) Bir metni başka bir metinle karşılaştırmak için equals ya da equalsIgnoreCase metodlarını kullanabilirsiniz. equalsIgnoreCase metodu, karşılaştırılan metni öncelikle küçük harflere çevirir ve ardından karşılaştırma yapar. • package stringornek; • public class stringornek6 { Bir metni küçük harflere çevirmek için toLowerCase, büyük harflere çevirmek içinse toUpperCase metodlarını kullanabilirsiniz: • package stringornek; • public class stringornek7 { Bir metin içerisindeki boşluklardan kurtulmak için trim metodu kullanılır. trim metodu, metnin sonunda ve başında yer alan boşlukları yok ederken kelime aralarındaki boşluklara dokunmaz. • package stringornek; • public class stringornek8 { Bir metni parçalara bölmek için (örneğin boşluklara göre ayırıp kelimeleri ayıklama) split metodu kullanılır. split metodu regex bir ifade içerisindeki kurallara göre String değişkenini böler ve bir String[] dizisi haline getirir. • package stringornek; • public class stringornek9 { Yukarıdaki örnekte "Merhaba dunya" metni boşluklara göre parçalanmış ve dizinin içerisinde "Merhaba" ve "dunya" değerini taşıyan iki adet String oluşturulmuştur. Bir metin değerini İnternet bağlantısı ya da başka bir akış (Stream) üzerinden yollamak istersek byte[] değerine çevirmemiz gerekebilir. Bir String içerisindeki her harfin byte değerini hesaplayıp String'i byte dizisine çeviren metod getBytes metodudur. • package stringornek; • public class stringornek10 { String Metotlarıyla İlgili Örnek Java Programları Örnek 1: equals • package stringuyg; public class stringuyg1 { AÇIKLAMA: Yukardaki programda bulunan 3 adet if’ten ilki ve üçüncüsü doğru, ikincisi ise yanlış olacaktır. Bu nedenle 2 mesaj alınır. Örnek 2: length • package stringuyg; public class stringuyg2 { AÇIKLAMA: Bu program verilen bir String'i karakterlerine parçalayarak her karakteri bir satıra yazdırmaktadır. String'in uzunluğunu (kaç karakterden oluştuğunu) bulmak için length metodu kullanılır. ÖRNEK 3: compareTo fonksiyonu • package stringuyg; public class stringuyg3 { • AÇIKLAMA: Melisa sözcüğü alfabetik ortamda Zehra'dan önce gelir ve dolayısıyla daha küçük kabul edilir; bu nedenle i’nin sayısal değeri negatif bir tam sayı olarak atanmıştır. ÖRNEK 4: compareTo fonksiyonu • package stringuyg; • public class stringuyg4 { AÇIKLAMA: Melisa alfabetik olarak Ayse'den önce gelmediği için i’nin değeri pozitif bir sayı olarak çıkmıştır. ÖRNEK 5: indexOf fonksiyonu • package stringuyg; • public class stringuyg5 { AÇIKLAMA: Programda, st1 String'i içindeki anadolu karakter dizisinin her harfi ve bu harfin karakter dizisi içindeki indisi birer satıra yazdırılmıştır. ÖRNEK 6: getChars fonksiyonu • package stringuyg; • public class stringuyg6 { AÇIKLAMA: anadolu String'inin, indisi 3 olan d karakterinden, indisi 7-1=6 olan karakterine (u) kadar olan kısmı karDiz adlı diziye kopyalanmıştır. karDiz adlı dizinin içeriği “dolu” olarak atanmıştır. ÖRNEK 7: startsWith ve endsWith fonksiyonları • package stringuyg; • public class stringuyg7 { AÇIKLAMA: Elemanları "ankara", "antalya", "burdur", "bursa", "anadolu" olan st1 adlı String dizisi oluşturulmuş, bu dizinin elemanları arasında “an” ile başlayanlar, ”a” ile bitenler ve 2 ile 3 indisli karakterleri “ka” olanlar listelenmiştir. Java'da Tarih İşlemleri Java’da tarih ile ilgili işlem yapmak için Date sınıfında faydalanırız. Date sınıfı belirli bir zaman değerini bir değişkene atamamızı ve üzerinde ekleme, çıkarma ya da dönüştürme gibi işlemler yapmamızı sağlar. Date sınıfını new Date() yapıcısıyla oluşturduğumuzda o anın tarihine ve saatine (kodun çalıştığı bilgisayarın saati) sahip bir zaman değişkenine sahip oluruz. • package date; • import java.util.Date; • public class dateornek1 { Bir zamanın, UNIX Timestamp değerini öğrenmek için getTime metodunu kullanabilirsiniz. • package date; • import java.util.Date; • public class dateornek2 { NOT: UNIX Timestamp, 1 Ocak 1970 00:00 tarihinden bu yana geçen zamanın milisaniye cinsinden değeridir. Eğer tarihi farklı bir şekilde ekrana yazmanız gerekirse, SimpleDateFormat sınıfından yardım alabilirsiniz. Bir Date değişkenini son kullanıcının anlayabileceği bir formatta yazdırmak için kullanılan SimpleDateFormat, aynı zamanda kullanıcının elle girdiği bir tarihi Date değişkenine çevirebilir. Aşağıdaki örnekte zaman bilgisi, tarih yıl - ay - gün olarak yazdırılıyor. • package date; • public class dateornek3 { Eğer yine aynı formatta bir tarihi (örneğin 1984/01/01) Date tipinde bir değişkene atamak isterseniz parse metodundan faydalanabilirsiniz. Bu metod verilen bir String tarih değerini Date tipine çevirecektir. Eğer çevirme işlemi başarısız olursa ParseException fırlatılır. • package date; • public class dateornek4 { • DateFormatter ile kullanabileceğiniz diğer tanımlar aşağıdaki şekildedir: Harf Temsil ettiği parça Örnek y Yıl 1996; 96 M Yıl içinde ay July; Jul; 07 w Yıl içinde hafta 27 W Ay içinde hafta 2 D Yıl içinde gün 189 d Ay içinde gün 10 F Ay içinde haftanın günü 2 E Haftanın günü Tuesday; Tue a Sabah/akşam PM H Gün içinde saat (0-23) 0 k Gün içinde saat (1-24) 24 K Sabah/akşam için saat (0-11) 0 h Sabah/akşam için saat (1-12) 12 m Saat içinde dakika 30 s Dakika içinde saniye 55 S Milisaniye 978 Tarih içerisinde belli bir günü bir değişkene atamak için Java bizlere Calendar adında bir sınıf sunar. Bu sınıf sayesinde tarih akışı içinde herhangi bir güne ulaşabiliriz. Aşağıda 1 Ocak 1984 tarihini temsil eden bir değişken tanımlaması yapılmıştır. • package date; • import java.util.Calendar; • import java.util.Date; • import java.util.GregorianCalendar; • public class dateornek5 { Java'da Kontrol Yapıları Diğer programlama dillerinde olduğu gibi Java'da da kontrol yapıları dilin en önemli parçasını oluşturur. Bu bölüme kadar verilen programlar bir bakıma düz hat programları olarak görülebilir. Bir bilgisayar programında komutlar normal olarak yazılış sırasına göre çalıştırılır. Örneğin, herhangi bir programlama dilinde yazılmış olan, Komut 1 Komut 2 ........ Komut n1 Komut n şeklindeki bir programda, önce Komut 1 sonra Komut 2 daha sonra Komut 3 ... Komut n-1 ve en son da Komut n çalıştırılır. Programlama dillerinin gücü, aynı işi tekrar tekrar yapabilmelerinden ya da farklı parametre değerleri için değişik işler yapabilmelerinden gelir. Bir bilgisayar programında programın kontrolünün aradaki komutlar atlanarak bir komuttan diğerine sıçramasına dallanma (branching) diyoruz. Diğer programlama dillerinde olduğu gibi, Java dilinde de esas olarak iki farklı tür kontrol yapısı ya da komutu mevcuttur: Seçme (selection) işlemini gerçekleştiren kontrol komutları: Bu tip kontrol komutlarında bir ifade kontrol edilerek ifadenin değerine göre çeşitli seçeneklerden bir tanesinde dallanma işlemi gerçekleştirilir: if, if else, switch case gibi yapılar bu tür komutları oluşturur. Tekrarlama (loop, repetition): Bu tip kontrol yapılarında bir işlemler grubu bir koşula bağlı olarak belirli sayıda (10 kez, 50 kez vb.) tekrarlı olarak çalıştırılabilir. if Deyimi if deyimi, "ifadeyi denetleyerek, ifadenin değerine göre uygun yollardan bir tanesiyle dallanma işlemini gerçekleştiren" bir kontrol deyimidir. Bu sayede şartlı dallanma (conditional branching) adı verilen işlem gerçekleştirilir. Şartlı dallanma, bir programlama dili için en temel kontrol yapısıdır. • Java dilinde şartlı dallanma if ve else anahtar sözcükleriyle gerçekleştirilir. İf deyiminin basit gösterimi şöyledir: • if (şart) komut 1; komut 2; Burada şartın değeri doğru (true) olarak sağlanıyorsa ancak komut 1 çalıştırılır. Daha sonra program normal bir akışla komut 2’yi çalıştırmaya geçer. Şartın değeri yanlış (false) ise, bu durumda program doğrudan komut 2’ye geçer ve onunla devam eder. "else" deyimi sadece if ile birlikte kullanılan bir şartlı dallanma deyimidir. İkisinin beraber kullanımı şöyle bir yapıda gerçekleşir: • if (şart) komut 1; else komut 2; komut 3; if (fiyat==1) { //fiyat 1 ise çalıştırılacak komutlar } else { //fiyat 1 değilse çalıştırılacak komutlar } if(şart) { komut 1 komut 2 ... komut n } else { komut x komut y .... } komut z ... Örnek: package sartlidallanma1; public class SartliDallanmaOrnek1 { Örnek: import java.io.IOException; import java.util.Scanner; public class SartliDallanmaOrnek2 { Problem 2: Bir satış elemanının sattığı ürün miktarına göre alacağı günlük ücret aşağıdaki gibi belirleniyor: Günlük satış miktarı 50 adetten az ise 15 TL tutarındaki sabit ücrete, satılan ürün başına 1 TL değerinde prim eklenerek günlük ücret belirlenir. Günlük satış miktarı 50 adet ya da daha fazla ise, bu durumda günlük sabit ücret 15 TL alınarak, satılan ürün başına da ilk 50 adet ürün için 2 TL, 50 adedi aşan kısım için de 3 TL prim verilerek günlük ücret belirlenir. Bir satıcının günlük satış miktarı bilgisayara girildiğinde satıcının alacağı günlük ücreti hesaplayan bir Java programı yazınız. • public class Satis { Problem 3: Bilgisayara negatif olmayan bir sayı girildiğinde bu sayının karekökünü hesaplayan, negatif bir sayı girildiğinde ise kullanıcıyı uyaran bir Java programı yazalım. • import java.util.Scanner; • public class KareKok { İç içe if Deyimleri pratikte daha fazla dallanmaya ihtiyaç duyan uygulamalar yapmanız gerekir. Birinci karardan sonra ikinci, ikinciden sonra üçüncü kararın (dallanmanın) alınması gerekebilir. Bu şekilde giden bir program akışı için iç içe if deyimleri (nested if statements) kullanmalısınız. Örneğin şöyle kullanabilirsiniz: if (koşul) { //koşul 1'in komutları //if (koşul1a) { //koşul 1a'nın komutları //... } } İlk şartlı dallanmanın içinde tekrar bir şartlı dallanma yapmak gerektiğinde, iç içe if kullanabilirsiniz. Bunun kullanımına ilişkin şu örneğe göz atınız: public class IcIceIfDeyimi1 { NOT: İç içe if kullanırken dikkat etmemiz gereken şey, koşulları yazarken programın adım adım bunları denetleyeceğini dikkate almamız gerektiğidir. En dıştaki veya en üstteki şart, ondan sonra gelenlerle çelişmemelidir. Yukarıdaki if deyimlerini daha kısa olacak şekilde şöyle de yazabiliriz: public class IcIceIfDeyimi1 { Bu şekilde bir yazım genelde if'ten sonraki komut/deyim tek satırlık olacaksa kullanışlıdır. Şimdi biraz daha gerçek bir iç içe if deyimi örneği üzerinde duralım. Bu örnekte kullanıcıdan 3 tane sayı girmesini istiyoruz ve bu 3 sayıdan en küçüğünü bulup ekrana basıyoruz. import java.io.IOException; import java.util.Scanner; public class IcIceIfDeyimi2 { • if-else-if Basamak Yapısı • Birbirini izleyen çok sayıda koşul kontrolünü gerçekleştirmeye yarayan bir yapı if-else-if basamağı adını alır ve yazılış biçimi aşağıdaki gibidir: if(ifade1) Deyim1; else if (ifade2) Deyim2; else if (ifade3) Deyim3;........ else Deyim_n; Deyim_n+1; Örnek Problem: Bu örnekte basit bir vergi hesabı programı geliştirmek istiyoruz. Gelir vergisinin aşağıdaki kurallara göre belirlendiğini varsayalım: • Gelir ≤ 150,000,000 ise vergi oranı %25 Gelir ≤ 300,000,000 ise vergi oranı %30 Gelir ≤ 600,000,000 ise vergi oranı %35 Gelir ≤ 1,200,000,000 ise vergi oranı %40 Gelir > 1,200,000,000 ise vergi oranı %50 Bu problemi Java dilinde programlayabilmek için aşağıdaki basit algoritmayı uygulayacağız: Gelir bilgisi klavyeden girilecek. Gelir bilgisi, yukardaki vergi hesaplama kurallarına göre kontrol edilerek vergi hesaplanacak. Hesaplanan vergi ekrana yazdırılacak. import java.util.Scanner; public class Vergi { Soru İşareti Operatörü if / else deyimi yerine kullanılabilecek bir seçenek de ? üçlü operatörüdür. ? operatörü ile kontrol yapısının yazılış biçimi aşağıdaki gibidir: • İfade1 ? İfade2:İfade3; Çalışma biçimi şu şekildedir: İfade1 hesaplanır. İfade1’in değeri doğru (true) ise bu durumda ifade2 hesaplanır ve bir sonraki deyime geçilir. İfade1’in değeri yanlış (false) ise, ifade3 hesaplanır ve bir sonraki deyime geçilir. ? operatörü ile oluşturulan yukardaki kalıp, • if(ifade1) ifade2 else ifade3; yapısına denktir. ? operatörü, ifade1’in doğru ya da yanlış olması durumunda sadece bir deyimin çalıştırılacağı durumlar için if / else yapısı yerine kullanılabilir. İfade2 ve ifade3 yerinde fonksiyonlar da bulunabilir. import java.io.IOException; import java.util.Scanner; public class Soru { switch / case Yapısı switch deyimi, tek bir ifadenin değerine göre sınırsız sayıda çalıştırma yolu belirlemeyi sağlayan bir komuttur. • switch sözcüğünden hemen sonra gelen ifade parantez içinde yer almalı ve bir tamsayı ifade olmalıdır. • case anahtar sözcüklerini izleyen ifadeler tamsayı sabit türünde ifadeler olmalıdır, yani değişken içermemelidir. switch deyiminin çalışma prensibi basittir. switch ifadesi hangi case’i izleyen sabitle çakışıyorsa, programın kontrolü o case’i izleyen kısma geçer. Bu case’den sonraki deyimler de kontrol edilmeden çalıştırılır. case sabitlerinden hiçbiri ifade ile uyuşmuyorsa, programın akışı default‘u izleyen kısma geçer. (Bu kısım mevcutsa) default‘un en sonda olması şart değildir. Fakat en sona koymak iyi bir programlama stilidir. İki case sabiti aynı değeri alamaz. Switch/case yapısında, programın kontrolünün ifadenin değerine göre case seçeneklerinden sadece birini çalıştırıp bundan sonra switch/case yapısını terketmesini isiyorsak bu durumda her case seçeneğinden sonra break komutu yerleştirmeliyiz. C DİLİ: Switch/case yapısında, programın kontrolünün ifadenin değerine göre case seçeneklerinden sadece birini çalıştırıp bundan sonra switch/case yapısını terketmesini istiyorsak bu durumda her case seçeneğinden sonra break komutu yerleştirmeliyiz. C# DİLİ: Her case’den sonra break kullanmamız gerekir. Örnek Program: import java.util.Scanner; public class Cases { switch / case yapısıyla ilgili örnek: Bir turizm şirketi farklı tur çeşitlerinden oluşan bir liste sunuyor. Kullanıcı bu listeden ilgilendiği bir turu seçtiğinde, o turla ilişkili ayrıntılı bilgiye ulaşıyor. Burada aşağıdaki basit algoritmayı uygulayacağız 1.Tur seçenekleri ekrana yazdırılır. 2.Kullanıcıdan bu tur seçeneklerinden bir tanesini seçmesi istenir. 3.Kullanıcının seçimine uygun olan tur hakkındaki bilgiler ekrana yazdırılır. public class Cases2 { DÖNGÜLER Döngüsel işlem veya tekrarlı işlem (iterasyon, İng. iteration), bilgisayarı aynı işlem grubunu belirli bir koşul sağlanana kadar tekrar tekrar yapmak için yönlendirir. Java dilinde döngü yapısını oluşturmak için while döngüsü, do-while döngüsü ve for döngüsü kullanılır. while döngüsü While döngüsü bir şart sağlanıyor iken sürekli içindeki komutları çalıştırır. Kelime anlamı olarak "olduğu müddetçe" anlamı çıkar. Yapısı şöyledir: • while (koşul) { • //komut 1 • //komut 2 • //... • //komutlar} While döngüsünde koşulun en başta olması ayırt edici bir özelliktir. Program akışı önce buradaki koşulu mantıksal bir süzgeçten geçirir. Buna göre eğer koşula yazılan ifade matematiksel olarak true (doğru) değer döndürüyorsa, süslü parantezlerle çevrili bloktaki komutlar sırasıyla çalıştırılır. Ancak false (yanlış) değerini döndürüyorsa, bu komutlar hiçbir zaman çalışmayacaktır. Bu durumda program akışına döngünün bittiği yerden devam eder. while döngüsünü kullanarak 10'dan geriye doğru giden ve bu sırada sayıları ekrana basan bir Java uygulaması yapılırsa: public class WhileDongusu1 { 1'den 10'a kadar olan sayıların faktöriyelini ekrana basan bir Java programı yapılırsa: public class WhileDongusu2 { do ... while Döngüsü while deyiminin önemli bir özelliği, test koşulunun döngünün başlangıcında olmasıdır. Bunun anlamı, ilk anda koşulun yanlış olması halinde, while gövdesinin hiçbir zaman çalıştırılmayacağıdır. Ancak gövdeyi hiç olmazsa bir kere çalıştırmamız gereken durumlar vardır. Bu durumda do...while deyimini kullanmalıyız. do..while döngü yapısının yazılışı şu şekildedir: do { Deyim1; Deyim2; ... Deyim_n; } while(İfade) ; do...while ve while döngüleri arasındaki tek fark, test koşulunun (ifadenin) do while döngüsünde, döngünün sonunda yer almasıdır. Bunun anlamı, programın döngüyü hiç olmazsa bir kez çalıştırmasıdır (ilk kez). for Döngüsü for deyimi ve for deyimi kullanılarak oluşturulacak döngü yapısı, işlemlerin tekrar sayısının önceden belli olduğu durumlarda kullanılır. for deyiminin yazılışı: for(ifade1;ifade2;ifade3) Deyim; Deyim_x; veya for(ifade1;ifade2;ifade3) { Deyim1; Deyim2; ... Deyim_n; } Deyim_x; şeklindedir. İlk olarak ifade1 hesaplanır; bu genellikle değişkene ilk değeri veren bir atama deyimidir. Sonra ifade2 hesaplanır. Bu, deyimin koşulsal kısmıdır. ifade2 yanlışsa, programın kontrolü for deyiminden çıkar ve program akışı programdaki bir sonraki deyime geçer (deyim_x). Eğer ifade2 doğru ise, deyim veya deyimler grubu uygulanır. Deyim ya da blok yapılı şekilde deyimler grubu çalıştırıldıktan sonra, ifade3 çalıştırılarak hesaplanır. O zaman çevrim yine geriye, ifade2'ye döner. İfade1 sadece bir kez çalıştırılır; ifade2 ve ifade3 ise, çevrimin her tekrarında (iteration) çalıştırılır. for deyiminin while deyimiyle karşılaştırılması for (ifade1; ifade2; ifade3) deyim; yapısı ifade1; while (ifade2) { deyim; ifade3;} yapısı ile tamamen aynıdır. ÖRNEK: for İLE TAM SAYILAR TOPLAMININ BULUNMASI public class PozTop { ÖRNEK: FAKTÖRİYEL HESABI public class Faktoriyel { ÖRNEK: ALTERNE SERİ TOPLAMI 1.2/(3.4)- 5.6/(7.8) + 9.10/(11.12) - 13.14/(15.16) şeklindeki alterne seri toplamını hesaplayalım. public class Alterne { İç İçe Döngüler Bir döngü yapısının içine başka bir döngü yapısının yerleştirilmesiyle elde edilen yapıya iç içe döngü (nested loop) adı verilir. Java dilinde, if deyimlerini herhangi bir derinliğe kadar iç içe kullanmak nasıl mümkünse, döngü deyimlerini de iç içe kullanmak olasıdır. Şu kural iç içe döngüler için daima geçerlidir: İç İçe for Döngüleri İçin Örnekler ÖRNEK 1: Aşağıdaki programda, dış döngü olan a parametreli döngü 5 kez çalışıyor (a=1, 2, 3, 4, 5). a’nın her değeri içinse içteki döngü 3 kez çalışıyor (i=1, 2, 3). Böylece aşağıdaki çıktı elde ediliyor: KOD BLOĞU: public class IcIce { İç içe döngülerde en içteki döngü en önce tamamlanır. ÖRNEK: ÇARPIM TABLOSU 1’den 10’a kadar sayılar için bir çarpım tablosu hazırlamak istenirse iç içe 2 döngü kullanılır ve her iki döngünün de parametresi 1’den 10’a kadar değişecektir. Programın kodu şu şekildedir: public class CarpimTablosu { ÖRNEK : FAKTÖRİYELLİ TERİMLERDEN OLUŞAN SERİ TOPLAMI Aşağıdaki seri toplamını hesaplayacak bir Java programı yazalım: 1/ 2! + 1/3! + 1/4! +...+ 1/10! Bu seri toplamını hesaplamak istediğimizde, iç içe iki döngü kullanmak gerektiğini hemen anlarız: public class FaktoriyelliSeri { SORU: Yukarıdaki seri toplamını, sadece bir for döngüsü kullanarak hesaplatabilir miyiz? public class FaktoriyelliSeri2 { break Deyimi break deyiminin Java programları içinde iki farklı kullanım alanı vardır: switch yapısındaki case seçeneklerinden birinde switch yapısını terk etmek ve switch’i izleyen deyime geçmek için kullanılır. (Bu tip kullanımla ilgili örnekler switch deyimi anlatılırken verilmiştir.) Bir döngü (loop) yapısı içinden, döngüyü kontrol eden koşul ifadesini beklemeksizin döngü dışına çıkmak için kullanılır. break deyimi bir döngü içinde yer almışsa bu durumda break deyimi ile karşılaşır karşılaşmaz döngü dışına çıkılır ve döngüyü izleyen deyime geçilir. ÖRNEK PROGRAM: public class BreakClass { continue Deyimi continue deyimi, döngü içinde belirli bir koşulun kontrolüyle bir sonraki döngü adımına gidilmesini gerçekleştirir. ÖRNEK: Aşağıdaki programda for döngüsünün parametresi olan i değişkeni 3 ile tam bölünemeyen bir değer alınca, bu değer ile işlem yapılmayıp bir sonraki adıma geçilmesi continue deyimi ile sağlanıyor. Böylece program, kullanıcı tarafından girilen bir üst limite kadar, 3 ile bölünebilen sayıların toplamını ve bu tip sayıların adedini buluyor. ÖRNEK PROGRAM: package contornek; public class Cont { Diziler Aynı veri türünden birbiriyle ilişkili verilerin bir arada tutulmasını sağlayan yapılara dizi denir. Dizinin içerisinde yer alan her bir ayrı veriye eleman denilmektedir. Bu elemanlara indis numaraları verilir ve bu numaralar üzerinden yerlerine ulaşılır. Dizilerin tasarlanış amaçları gayet basittir. Diziler basitçe, aynı tipe sahip bir dizi elemanı, tek bir noktada gruplayarak bu verilere daha kolay bir şekilde ulaşılmasını sağlayarak, yazılım geliştirme sürecini daha basit ve yönetilebilir bir hale sokar. Java’da diziler nesne olduğu için, dizi oluşturmak için kullanılan yöntem, aynen nesnelerin oluşturulması gibidir. new anahtar sözcüğü kullanarak dizi oluşturabiliriz. Tek fark, sadece derleyiciye bir dizi oluşturacağımızı bildirdiğimiz ‘ [ ] ‘ (dizi operatörü) operatörü değişken tanımlamasında belirtilir. Dizileri tek boyutlu ve çok boyutlu diziler şeklinde sınıflandırabiliriz. Tek Boyutlu Diziler Dizi, bilgisayar belleğinde aynı isim altında genellikle aynı tipten çok sayıda veriyi bir arada saklayan veri yapısıdır. Aşağıda, x adlı bir dizinin mantıksal görünümü verilmiştir: x 4 2 7 22 11 3 5 0 1 2 3 4 5 6 Dizinin bir adı ve dizi içerisindeki elemanın dizinin kaçıncı elemanı olduğunu belirten bir indisi (subscript, index) vardır. Örneğin, yukarıdaki x adlı dizi için x[3] ifadesi bu dizinin 3 numaralı elemanını yani 22 değerini göstermektedir. Dizinin indisi Java dilinde daima köşeli parantez ile belirlenir: Java dilinde bir dizinin ilk elemanının indisi daima 0’dır; son elemanın indisi ise diziye ayrılan yer sayısının 1 eksiğine eşittir. Yukarıdaki x dizisinin 7 elemanı vardır; ilk elemanının indisi 0 ve son elemanının indisi de 6’dır. Java Programı içinde Dizinin Bildirilmesi Bir Java programı içinde diziyi tanıtmak için, new sözcüğünü kullanarak belirli bir tipten yeni bir nesne tanımlama yolu izlenir. Dizinin tipi, adı ve maksimum eleman sayısı bir bildiri deyimi içinde belirtilir: Tip DiziAdı[ ] = new Tip [ Eleman Sayısı ]; veya eşdeğeri Tip [ ] DiziAdı = new Tip [ Eleman Sayısı ]; Örneğin, yukarıdaki x dizisi için, int [ ] x= new int [6] ; şeklinde bildirimde bulunulacaktır. x dizisi 6 elemanlıdır ve elemanları int türündedir. Dizi yapısına, aynı türden bir veri grubunu tümüyle bellekte saklı tutmanın gerekli olduğu uygulamalarda ihtiyaç duyulur. Örneğin, verilerin sıralanması, bir veri grubuna ait bazı istatistiksel bilgilerin hesaplanması (standart sapma vb.) gibi uygulamalar bu tür uygulamalardandır. Örnek: Dizi kullanmayan sürüm public class Dizi1{ Dizi kullanan sürüm public class Dizi2{ Dizilere Değer Ataması Java’da dizilere 2 türlü değer atanabilir. Birinci yöntem, dizi referansı oluşturulan satırda dizi elemanlarına açıkça atama yapmak. Bu yöntemde dikkat edilmesi gereken nokta, nesne referansı oluşturulan satırda bu atamanın yapılması şart. Nesne referansı oluşturduktan sonra bu atamayı kodun başka yerinde yapmak derleme hatasına neden olur. String[] stringDizisi = {"Java", "C++", "Python", "Haskell"}; // geçerli String[] baskaDizi; baskaDizi = {"Php", "Perl", "Ruby"}; // Error : Derleme Hatası Dizilere değer atamada kullanılan başka bir yöntem, dizi referansına bir dizi nesnesi oluşturup atama yapmaktır. Dizi boyutunu belirledikten sonra, dizi elemanlarını kodun herhangi bir yerinde atamak mümkündür. int[] intDizisi; intDizisi = new int[10] // 10 luk bir int dizisi oluştur intDizisi[0] = 1; intDizisi[1] = 2; //.. intDizisi[9] = 10; //dizinin son elemanı Dizilere Başlangıç Değeri Atanması Birçok bilgisayar dilinde olduğu gibi, Java dilinde de dizilere dizinin tanımlanması esnasında başlangıç değeri atanması mümkündür. Örneğin, int [ ] x ={3,-2,1,4,11}; şeklindeki bildiri deyimi ile, x dizisine aşağıdaki gibi değerler atanmıştır: x 3 -2 1 4 11 0 1 2 3 4 Örnek: Başlangıç Değeri Atanması public class Dizi3 { Dizi tanımında diğer bir yöntem Dizi boyutunu bir değişken olarak tanımladıktan sonra diziyi tanımlarken bu değişkeni kullanmamız da mümkündür. Aşağıdaki komutlarla 5 elemanlı bir dizi tanımlayabiliyor fakat diziye ilk değer ataması yapamıyoruz: int DIZI_BOYUT=5; int [] sayi; sayi=new int[DIZI_BOYUT]; Örnek: Dizi Boyutunun Bir Değişkenle Belirtilmesi public class Dizi4{ Dizi Uzunluğu Java’da diziler birer nesne olduğu için, sınıfların sağladığı tüm esnekliği ve gücü diziler ile de kullanmak mümkün. Örneğin Java, dizi boyutunu (uzunluğunu) döndüren length adında bir özellik (property) sunar. dizi.length şeklinde, dizi adındaki dizinin uzunluğu bulunabilir. Örnek: Oluşturulan 10 luk bir int dizisine 30 dan büyük 10 çift sayıyı atansın. int[] dizi; dizi = new int[10]; int altSinir = 30; for(int i = 0; i < dizi.length; altSinir++) { if(altSinir % 2 == 0) { dizi[i] = altSinir; i++; } } // dizi içeriğini ekrana bastıralım for(int i=0;i<dizi.length;i++) { System.out.printf("%d ", dizi[i]); } // Program Çıktısı 30 32 34 36 38 40 42 44 46 48 Bir fonksiyon parametresi olarak diziler Bir dizi, bir fonksiyon parametresi olarak kullanılabilir. Çağıran fonksiyon ya da program, dizi türündeki bu parametreye yine dizi türünde olmak üzere bir argüman geçirebilir. Bir dizi, bir fonksiyon parametresi olacaksa; dizinin tipi, adı ve içi boş olan köşeli parantezler fonksiyonun parametre listesinde görünmelidir. Örneğin, static int topla_dizi(int[] x, int n) gibi bir fonksiyon başlığında x tam sayı tipinde bir dizidir. n parametresi ise dizinin eleman sayısıdır. Bu fonksiyonu çağıran fonksiyon veya program içinde, a dizisi, int[ ]a={2,8,3,7,5}; şeklinde tanımlanmışsa, yukardaki topla_dizi adlı fonksiyon, toplam=topla_dizi(a,5); şeklinde çağrılabilir. Örnek: "n" Elemanlı Bir "x" Dizisinin Toplamını Bulan Bir Fonksiyon ve Çağıran Programla Birlikte Kullanılması public class Dizi5 { FOR Döngüsünün Farklı Kullanımı: Dizi elemanlarına sıralı ulaşmak için; for (int adizi:dizi){ Toplam=toplam+adizi;} Dizi elemanlarını sıralamak için; Arrays.sort(dizi); Dizi uzunluğunu bulmak için; dizi.length Dizi elemanlarına istenilen değeri atamak için; Arrays.fill(dizi,0); package forEach; import java.util.*; public class forornak { public static void main(String args[]){ int dizi[]={10,8,8,7,4,3}; int toplam=0; for (int adizi:dizi){ toplam=toplam+adizi;} System.out.println("\ntoplam=" + toplam); Arrays.sort(dizi); System.out.println("siralanmis dizi"); for (int adizi:dizi) System.out.print(" " + adizi); System.out.println("\ndizi uzunlugu:"+dizi.length); Arrays.fill(dizi,5); System.out.println("5 yapılmış dizi"); for (int adizi:dizi) System.out.print(" " + adizi); } } Java da Çok Boyutlu Diziler Java’da diziler istenilen boyutta tanımlanabilir. İki, Üç boyutlu ( Two Dimensional, Three Dimensional Arrays) ve daha fazla boyutta dizi tanımlamak tamamen programcılara bırakılmıştır. Çok boyutlu diziler basitçe, dizilerin dizileri (arrays of arrays) olarak düşünülebilir. Ancak, uygulama kodunun basitliği ve kodu okuyan kişilerin kodda dönen olayları daha iyi anlayabilmesi için 2 boyuttan daha yüksek boyutta dizilerin kullanılması pek önerilmez. Nadiren 3 boyutlu diziler kullanılmaktadır. Örneğin 2 boyutlu diziler belirli bir satır ve sütundan oluşan bir matris gibi düşünülebilir. Burada ilk dizi satır sayısını, diğer dizi ise sütun sayısını temsil eder. C/C++ da, sütun sayısı sabitdir. Her satır için aynı boyutda dizi (sütun) kullanılarak 2 boyutlu diziler oluşturulur. Ancak Java’da bu böyle değildir. Java’da her satır için farklı sütun sayısında (dizi boyutu) dizi oluşturulabilir. Java'da, 5 satır ve 3 sütundan oluşan bu tabloyu aşağıdaki şekilde tanımlayabiliriz: int [][] satis=new int [5][3]; Burada satis adlı iki boyutlu dizinin bir elemanına referans vermek için program içinde, şeklinde bir ifade kullanırız. Burada satis dizinin adı, i satır indisi ve j de sütun indisidir. Satis dizisinin satır indisleri 0'dan başlar ve 4'e kadar devam eder. Sütun indisleri ise, 0 ile 2 arasında değerler alır. String[][] dizi = { {"Ali", "Ayşe"}, {"Bey", "Hanım"} }; System.out.println(dizi[0][0] + " " + dizi[1][0]); System.out.println(dizi[0][1] + " " + dizi[1][1]); // Program Çıktısı Ali Bey Ayşe Hanım Aşağıdaki örnek programda 3 satır ve 2 sütunu olan satis adlı tablonun elemanları klavyeden giriliyor ve daha sonra tablo ekrana aktarılıyor; public class CokBoyutluDizi1 { Aşağıdaki Java programı, satisTablosu adlı diziye ilk değer ataması yapıyor ve tablo elemanlarını ekrana yazdırıyor: public class CokBoyutluDizi2{ Çok Boyutlu Dizi Uzunlukları length fonksiyonu ile iki boyutlu dizinin her bir boyutundaki eleman sayısını bulmak mümkün. Örnekteki dizi adındaki dizinin uzunluğunu aşağıdaki gibi bulabiliriz. Çıktı dizinin eleman sayısını beklendiği gibi verecektir. String[][] dizi = { {"Ali", "Ayşe"},{"Bey", "Hanım“} }; System.out.println(dizi.length); //Çıktı 2 dizi adındaki dizinin elemanları da bir dizi olduğu için, dizi[0] şeklinde bir ifade dizi içerisindeki ilk diziyi verecektir. Yine aynı şekilde bu dizilerin uzunluklarına da aşağıdaki şekilde ulaşabiliyoruz. dizi[0].length dizi[1].length public class CokBoyutluDizi3 { ÖRNEK: Satış Tablosunun Satır ve Sütun Toplamlarının ve Tablodaki Elemanların Genel Toplamının Bulunması public class CokBoyutluDizi4 { ÖRNEK: Önceden belirleyeceğimiz 3'e 4'lük bir tabloda yer alan elemanların en küçük ve en büyük değerdeki elemanı bulan bir Java programı yazalım. Ayrıca bu program her satırdaki ve sütundaki en küçük ve en büyük elemanları da bulabilsin. public class CokBoyutluDizi6 { Dizilere bağlı diğer dizilerin aynı uzunlukta olma zorunluluğu yoktur. public class cokboyutludiz13 { METODLAR Metodlar: Program içerisinde yazılmış olan küçük program parçalarına verilen addır. Metodlar, belirli bir görevi yapan kod bloklarıdır, Metodların özellikleri; • Erişim belirleyici (modifier ) metoda nasıl erişileceğini belirtmektedir.Yazmak zorunlu degildir. • Metodun adı belirtilmelidir. • Metodun parametreleri ise parantez içerisinde belirtilmelidir. • Metod parametrelerini ayırmak için ” , ” işareti kullanılmalıdır. • Eğer metod parametre almaz ise, sadece parantez açılıp kapatılır. Metodların oluşturulması Metotlar aşağıdaki gibi tanımlanmaktadır. Erişim belirleyici | Dönüs tipi | Metod adi (parametre listesi) { //islemler } Metod Tanımlama Metod ismini belirtmemiz gerekmektedir. Metodların geri dönüş tipinin tanımlanması gerekmektedir. Eğer metodun geri dönüş tipi yoksa void olarak tanımlanmalıdır. Metod Parametreleri Öncelikle olarak parametrelerin veri tiplerini ve adlarını belirtmek gerekir. Metodlar parametre almayabilir. PARAMETRESİZ METODLAR Parametre değeri almayan metotlardır. Parametresiz metodlar ile ekrana bir metin yazdırabılır, bir değer döndürebilir ve bunun gibi işlemler yapılabılır. Örnek: Parametresiz metodlara örnek olarak bir uygulama yazılırsa, public class parametresizmetodlar { Örnek: Bu uygulamada toplama, çıkarma, çarpma, bölme işlemleri metodlar kullanarak gerçekleştirilmekte. public class parametresizmetodlar2 { Örnek: Bu uygulamada ise parametresiz metodlar ile ilgili fakat değer döndüren bir uygulama yazılıyor. public class degerdondurme { PARAMETRELİ METODLAR parametre alan metodlarda parantez içerisinde önce parametrenin tipini ardından ise ismini yazmaktayız. Birden fazla parametre varsa eğer, “,” virgül ile ayırabiliriz. Örnek: Bu uygulamamizda ise; toplama, çıkarma, çarpma, bölme işlemlerini parametreli metodlar yardimi ile yapacağız. package metot; public class parametrelimetodlar { Örnek: Şimdi ise, Scanner sınıfını kullanarak kullanıcıdan değer alalım ve aldığımız bu değerin faktöriyelini hesaplayalım. import java.util.Scanner; public class faktoriyelhesap { Java’da Yapılandırıcılar (Constructors) Constructor’lar sınıfın ismiyle aynı isimde tanımlanan metoda benzeyen yapılardır. Ancak metotlar gibi geri dönüş tipleri yoktur. package yapilandiricilar; public class Araba { public Araba() { } } Tanımlanırlarken başlarına tüm erişim denetleyicilerini (access modifiers) alabilirler. Bir sınıfta birden fazla constructor olabilir. Constructor’lar çok detaylı bir konudur ve çok fazla kuralı vardır. Constructor’ların iki önemli görevi vardır. 1- Sınıf değişkenlerine (global değişkenlere) belirli işlemlerden sonra ilk değerlerini atamak için kullanılırlar. Sınıf değişkenleri, sınıftaki tüm metotlar tarafından erişilebilen global olarak tanımlanmış değişkenlerdir. Bu değişkenlerin tanımları yapılırken ilk değerleri atanmak zorunda değildirler. Kullanılacakları zaman eğer ilk değerleri atanmamışsa varsayılan değerlerini alırlar. Sınıf değişkenlerinin ilk değerleri belirli işlemler sonucunda atanacaksa yapılandırıcılar kullanılır. package yapilandiricilar; public class Araba { private int maxHiz; public Araba(int maxHiz) { if (maxHiz > 0) { this.maxHiz = maxHiz; } else { maxHiz = 220; } } } Araba sınıfının maxHiz adında bir değişkeni olsun. Sınıfın instance’ı yaratılırken parametre olarak gönderilen değer sıfırdan büyükse sınıf değişkenine atayalım değilse 220 olsun diyebiliyoruz. Bu tarz kontroller yapılandırıcı içerisinde yapılabilir. 2- Instance yaratmak yani bellekten objeye yer ayırmak için kullanılırlar. package yapilandiricilar; public class Araba { public Araba() { // yazılmasa da yazılmış varsayıl acaktı } } Bir sınıfta parametre alan en az bir constructor yazıldıysa default constructor yazılmış varsayılmaz. package yapilandiricilar; public class Araba { private int maxHiz; public Araba(int maxHiz) { this.maxHiz = maxHiz; package yapilandiricilar; } } public class Araba { private int maxHiz; public Araba(int maxHiz) { this.maxHiz = maxHiz; } } Artık Araba sınıfımız başka bir sınıftan new Araba(); komutuyla yaratılamaz. Mutlaka parametre olarak int tipinde bir değişken göndermemiz gerekir. Bir constructor’dan başka bir constructor çağrılabilir. Fakat bu çağrım mutlaka ilk komutta yapılmalıdır. Eğer bir constructor’dan başka birine çağrım yapılmadıysa ilk komutta kendi ata sınıfının default constructor’ı çağrılmış varsayılır. Tüm sınıflar, yazılmasa bile Object sınıfından türediklerinden en son çağrım mutlaka Object sınıfının default constructor’ına yapılır. package yapilandiricilar; public class Araba { private int maxHiz; public Araba() { this(120); } public Araba(int maxHiz) { this.maxHiz = maxHiz; }} Yukarıdaki örnekte default constructor’dan parametre alan constructor’a çağrım yapılmış. Eğer yapılmasaydı super class’ının default constructor’ına çağrım yapılmış varsayılacaktı. Yani super(); komutu yazılmış varsayılacaktı. package yapilandiricilar; public class Araba { public Araba() { super(); // yazılmasa da yazılmış varsayılacaktı } } Obje hiyerarşisindeki sınıflarda instance yaratma işlemleri super class’tan başlayarak gerçekleşir. Bir örnek verelim. public class Araba { public Araba() { System.out.println(1); }} • public class Ford extends Araba { public Ford() { System.out.println(2); }} public class Test { public static void main(String[] args) { new Ford(); }} Bir sınıfta hiç parametre almayan constructor’a default constructor, tüm sınıf değişkenlerini parametre olarak alan constructor’a ise full constructor denir. Yapılandırıcı metodlar sınıflardan bir nesne üretildiğinde otomatik olarak çalıştırılırlar. Bu metodların en önemli özelliği içinde bulunduğu sınıfla aynı isimde olmak zorunda olmasıdır. Örnek gösterimi şu şekildedir. public class Student{ //üye değişkenlerimiz public Student(){ //yapıcı metod kodlarımız }} Not: Yukarıda basit bir şekilde yapıcı metodun nasıl kullanılacağını gösterdik. Ayrıca bir sınıf içerisinde birden fazla yapıcı metod da kullanılabilir. Bunda bir sınır yoktur. Şimdi değişkenlerle yapıcı metodların nasıl olduğunu görelim. package metot; public class Kare { new Operatörü Ne İşe Yarar? Görüldüğü üzere nesne oluşturma işlemi iki aşamalıdır. Önce sınıfın adını ve nesne adını belirtiriz. Bu aşamada null değerinde bir nesnemiz olur. Çünkü henüz bir gerçek nesneyi temsil etmemektedir. Gerçek bir nesne olabilmesi için bellekte bir yere sahip olmalı. İkinci aşamada new operatörünü kullanarak bellekte nesnemize bir yer açmış oluruz ve bu yeri nesnemize atarız. İşte şimdi hakiki bir nesneye sahip olduk. package metot; public class MetotYapisi { package metot; public class YapilandiriciMetot { • Bu örnekte gördüğümüz üzere yapılandırıcı metotumuzu daha nesneyi oluştururken kullanmış olduk. new anahtar sözcüğüyle birlikte verdiğimiz değerler, gerekli işlemler yapılarak yapılandırıcı metot içerisindeki değişkenlere atandı. Bu değişkenleri de ekrana yazdık. • Dikkat ettiyseniz aynı değişkenleri ekrana yazdırıyoruz fakat farklı sonuçlar alıyoruz. Çünkü yapılandırıcı metotlar her nesne için ayrı ayrı sonuçlar saklar. Yukarıdaki maddelerde de belirttiğimiz üzere her çağırıldıklarında yeni bir nesne oluştururlar. Bu sebeple değişkenlerin değerlerinde herhangi bir çakışma söz konusu olmaz. THIS • Java, this anahtar sözcüğünü bir metot içinde geçerli nesneye bir referansta bulunmak için kullanır. O metodu çağıran ifadelerin özel olduğunu göstermek için kullanırız. Örnek anahtar gizleme işlemi yapar(instance variable hiding). Aynı ada sahip 2 tane yerel değişken tanımlamak mümkün değildir ancak sınıfın örnek değişkenleriyle aynı ada sahip olan (metodun parametreleri dâhil) yerel değişkenlere sahip olabilirsiniz. Yerel değişken örnek değişkenle aynı ada sahip ise örnek değişken gizlenir. • package metot; • public class kutuDemo { METOD OVERLOADING Farklı işlevler yapan ama aynı isme sahip metodlar var ise, metod overloading olmuş oluyor. Örneğin; int veri tipinde iki sayının farkını alan calculate () isminde metod tanımlayalım. Aynı şekilde double veri tipinde bölme işlemini yapan calculate() isminde bir metod daha tanımlayalım. Aynı isimde iki metod bulunduğundan, burada metod overloading yani aşırı yükleme meydana gelmektedir. Overloading kavramında, aynı isimde iki metod olabilmektedir. Fakat bu metodların parametre tipleri, parametre sıraları ve sayılarından herhangi birisinin farklı olması gerekmektedir. Örnek: Bu uygulamamızda overloading ile ilgili bir uygulama yapacağız. Örneği daha iyi kavrayabilmeniz açısından yukarıda overloading ile ilgili belirtmiş olduğum özellikleri anlamanız gerekmektedir. package metot; public class metodoverloading { metodoverloading isminde bir class yapisi tanimliyoruz. OVERLOADİNG Function Overloading ve Operator Overloading özelliklerini destekler. Function Overloading aynı isimdeki fonksiyonların değişik tip ve sayıdaki parametreler alarak hangisinin çağrılmasına derleyici tarafından karar verilmesini sağlayan mekanizmadır. Gerek fonksiyonlar için olsun gerekse operatörler için, Overloading nesnel yönelimli dillerde genelde varolan bir yöntemdir. Java aynı adlı metodların aynı sınıf içerisinde kullanılmasına izin verir. Aynı sınıfta(class) kullanılan metodların girdi değişkenlerinin değişken türlerinin veya değişken sayılarının farklı olması gerekir. Java aynı isimli ve ayni degişkentürlü iki metodu birbirinden ayıramaz. Public double Ametodu(double Adeğişkeni) Ve Public double Ametodu(double Bdeğişkeni) Veya Public int Ametodu(double Cdeğişkeni) Java tarafindan ayırt edilemez. Fakat Public double Ametodu(double Adeğişkeni) Ve Public double Ametodu(int Bdeğişkeni) ayırt eder. • package metot; • public class Sinif { • Burada overlodaing islemi gerçekleşir ve fonksiyon string olarak cağrıldığından iki goster fonksiyonundan altaki çağrılır. Java'da Dosya İşlemleri Java’da yer alan Dosya İşlemleri Sınıfları‘nı 4 ana gruba ayırmaktayız. Ve bu 4 ana grupta kendi içlerinde alt sınıflara ayrılmaktadır. 1.InputStream: Byte tabanlıdır. Byte’ların tek tek okunmasını sağlamaktadır. Alt sınıfları: FileInputStream ByteArrayInputStream FilterInputStream 2.OutputStream: Byte tabanlıdır. Byte’ların tek tek dosyalara yazılmasını sağlamaktadır. Alt sınıfları: FileOutputStream ByteArrayOutputStream FilterOutputStream 3.Reader: Karakter tabanlıdır. Dosyalardaki karakterlerin okunmasını sağlamaktadır.Alt sınıfları: BufferedReader InputStreamReader StringReader 4.Writer: Karakter tabanlıdır. Karakterlerin dosyalara yazılmasını sağlamaktadır. Alt sınıfları: BufferedWriter OutputStreamWriter StringWriter PrintWriter İlk örneğimizde bir string değişkeni içerisinde saklanan veriyi disk üzerinde bir .txt (metin) dosyasına yazmayı anlatacağız. package dosya; public class filewriterornek { Başka bir örnek: Bu uygulamamızda arkadaşlar, BufferedWriter ile dosyaya yazma işlemini gerçekleştireceğiz. package dosya; public class ornek1 { Dosyaya yazma işleminde FileWriter yazma=new FileWriter(f,false); kullanıldığında yeni dosya yaratılır. FileWriter yazma=new FileWriter(f,true); Kullanıldığında ise var olan dosyaya ekleme yapılır. Dosyaya yazma işlemi fonksiyonlarda yapılırsa; package com.dosya.islemler; public class DosyaIslemleri { package dosya; public class MainPage { UYGULAMA Eğer bir resmi ya da İnternet üzerinden çektiğimiz bir dosyayı diske kayıt etmek istiyorsak, metin dosyası yerine binary dosya kullanmamız gerekir. Java bu amaçla aşağıdaki sınıfları sunmaktadır: import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class byteYazma { public class byteOkuma {