Bölüm 2 Temel Programlama
Hedefler Bir önceki bölümde bir Java programı yaratmayı, derlemeyi ve çalıştırmayı gördük. Bu bölümden itibaren problemleri programsal olarak çözmeyi öğreneceğiz. Bu problemlerle uğraşırken basit Java data tiplerini ve bunlarla alakalı olarak değişkenleri, sabitleri, operatörleri, giriş ve çıkışları öğreneceğiz.
Amaçlar Basit hesaplamalar yazan Java programları yazmak(§2.2). Scanner sınıfını kullanarak konsoldan veri çekmek(§2.3). Değişkenleri, sabitleri, metotları ve sınıfları tanımlamak için tanıtıcı sözcükler (§2.4). Veri depolamak için değişken kullanma(§§2.5-2.6). Atama ifadeleri kullanarak programlama (§2.6). Verileri kalıcı olarak depolamak için sabit kullanma (§2.7). Basit Java tiplerini tanımlama: byte, short, int, long, float, double, ve char (§§2.8.1). Operatör kullanarak sayısal ifadeler tanımlama (§§2.8.2–2.8.3). Zamanı ve saati gösterme (§2.9). Operatörleri kısayollarla ifade etme(§2.10). Bir tipi başka tipe çevirme (§2.11). Kira ödemesi hesapma (§2.12). Char tipini kullanarak karakterleri simgeleme (§2.13). Kur değişikliklerini hesaplama (§2.14). String tipiyle metin yazma (§2.15). Java dökümentasyonuyla, stiliyle, isimlendirme şekliyle aşina olma (§2.16). Syntax, runtime, mantıksal ve debug hatalarını ayırt etme (§2.17). (GUI) JOptionPane aracığıyla diyalog kutularıyla veri çekme(§2.18).
Bir örnekle başlıyoruz Listing 2.1 Dairenin alanını hesaplma public class AlanHesapla { /** Main methot */ public static void main(String[] args) { double yaricap; double alan; // Yarı çapı ata yaricap = 20; // Alanı hesapla alan = yaricap * yaricap * 3.14159; // Sonucu göster System.out.println("Yarı capı " + yaricap + " olan dairenin alanı " + alan + "dır."); }
Programın çalışmasını takip etme Animasyon Programın çalışmasını takip etme Yarıçap için bellekte yer tutma public class AlanHesapla { /** Main methot */ public static void main(String[] args) { double yaricap; double alan; // Yarı çapı ata yaricap = 20; // Alanı hesapla alan = yaricap * yaricap * 3.14159; // Sonucu göster System.out.println("Yarı capı " + yaricap + " olan dairenin alanı " + alan + "dır."); } yaricap Değer yok
Programın çalışmasını takip etme animation Programın çalışmasını takip etme public class AlanHesapla { /** Main methot */ public static void main(String[] args) { double yaricap; double alan; // Yarı çapı ata yaricap = 20; // Alanı hesapla alan = yaricap * yaricap * 3.14159; // Sonucu göster System.out.println("Yarı capı " + yaricap + " olan dairenin alanı " + alan + "dır."); } Hafıza / RAM yaricap Değer yok alan Değer yok Bu sefer alan için
Programın çalışmasını takip etme animation Programın çalışmasını takip etme 20 değerini atama public class AlanHesapla { /** Main methot */ public static void main(String[] args) { double yaricap; double alan; // Yarı çapı ata yaricap = 20; // Alanı hesapla alan = yaricap * yaricap * 3.14159; // Sonucu göster System.out.println("Yarı capı " + yaricap + " olan dairenin alanı " + alan + "dır."); } yaricap 20 alan Değer yok
Programın çalışmasını takip etme animation Programın çalışmasını takip etme public class AlanHesapla { /** Main methot */ public static void main(String[] args) { double yaricap; double alan; // Yarı çapı ata yaricap = 20; // Alanı hesapla alan = yaricap * yaricap * 3.14159; // Sonucu göster System.out.println("Yarı capı " + yaricap + " olan dairenin alanı " + alan + "dır."); } Hafıza / RAM yaricap 20 area 1256.636 Alanı hesaplayıp değişkene atama
Programın çalışmasını takip etme animation Programın çalışmasını takip etme public class AlanHesapla { /** Main methot */ public static void main(String[] args) { double yaricap; double alan; // Yarı çapı ata yaricap = 20; // Alanı hesapla alan = yaricap * yaricap * 3.14159; // Sonucu göster System.out.println("Yarı capı " + yaricap + " olan dairenin alanı " + alan + "dır."); } Hafıza / RAM yaricap 20 alan 1256.636 Ekrana yazma
ComputeAreaWithConsoleInput Konsoldan veri çekme 1. Scanner nesnesi yaratma Scanner input = new Scanner(System.in); 2. next(), nextByte(), nextShort(), nextInt(), nextLong(), nextFloat(), nextDouble(), nextBoolean() metotlarını kullanarak string, byte, short, int, long, float, double, boolean değerlerini olulturma. Örneğin, System.out.print("double bir değer giriniz:"); double d = input.nextDouble(); ComputeAreaWithConsoleInput ComputeAverage
Identifier’lar (Tanımlayıcılar) Bir identifier harflerin, sayıların ve birtakım özel karakterlerin ( _ ya da $) dizilimiyle oluşur. Bir identifier sayıyla başlayamaz, özel karakter veya harfle başlayabilir. ‘Reserved’ kelimeler identifier olamaz. true, false, null kelimeleri de kullanılmaz. Identifier için uzunluk kısıtlaması yoktur.
Değişkenler // Birinci alanı hesapla yaricap = 1.0; alan = yaricap * yaricap * 3.14159; System.out.println("Yarı capı " + yaricap + " olan dairenin alanı " + alan + " dır."); // İkinci alanı hesapla yaricap = 2.0;
Değişken tanımlama int x; // x isminde bir integer double yaricap;// yarıçap isminde bir // double tanımlama; char a; // a isminde bir karakter
Atama ifadeleri x = 1; // x e bir ata; yarıcap = 1.0; // yarıcap a 1.0 ata; a = 'A'; // a ya 'A‘ ata;
Tanımlama ve atama işlemini aynı anda yapma int x = 1; double d = 1.4;
Sabitler final veritipi SABIT_ISMI = DEGERI; final double PI = 3.14159; final int SIZE = 3;
Sayısal veri tipleri
Sayısal operatörler
Bölme +, -, *, /, ve % 5 / 2 işleminin sonucu 2. 5 % 2 işleminin sonucu 1 (kalanı gösterir)
Mod Operatörü Mod operatörü oldukça faydalıdır. Örneğin çift sayılar % 2 işlemiyle 0 sonucunu verirken tek sayılar 1 verir. Böylece sayının tek ya da çift olduğu kolayca belirlenir. Diyelim ki bugün C.tesi ve arkadaşlarınızla 10 gün içinde buluşacaksınız. 10 gün sonrası hangi gündür? O günün Salı olacağını şu ifadeyle rahatça görebilirsiniz:
Problem: Zamanı gösterme Saniye verisinden saat ve dakikayı bulan programı yazın. DisplayTime
NOT Ondalıklı sayılarla yapılan işlemler yakın değerlere çekilir. Örneğin, System.out.println(1.0 - 0.1 - 0.1 - 0.1 - 0.1 - 0.1); Sonuç olarak 0.5000000000000001 gösterir, 0.5 göstermez. System.out.println(1.0 - 0.9); 0.09999999999999998 gösterir, 0.1 göstermez. Tam sayılarda böyle bir şey yoktur, her işlemin sonucu kesin olarak gösterilir.
Literal (sabitler) değerler Bir literal programın içinde doğrudan görünen sayılardır. Örneğin 34, 1,000,000, 5.0 değerleri: int i = 34; long x = 1000000; double d = 5.0;
Integer Integer değer aralıklarında olan herhangi bir sayı int veri tipiyle tutulabilir. Mesela byte b = 1000 hata verir, çünkü 1000 değerini byte tipiyle tutamazsınız. Integer değerler -231 (-2147483648) ve 231–1 (2147483647) arasındadır. Bir sayıyı long olarak ifade etmek istiyorsanız sayının sonuna L ve l eklerseniz. Genelde büyük L tercih edilir çünkü küçük l harfi sayı olan 1 ile karışabilir.
Ondalıklı sayılar Ondalıklı sayılara double değişken muamelesi yapılır. Örneğin, 5.0 double kabul edilir. Sonuna F harfi koyarak değişkeni float tipine çevirebilirsiniz. Örneğin float olarak 100.2f veya 100.2F, double olarak 100.2d ya da 100.2D yazabilirsiniz.
Bilimsel Gösterim Örneğin, 1.23456e+2 ya da 1.23456e2, 123.456’ya eşittir, 1.23456e-2 ise 0.0123456 ya eşittir. E (ya da e) değeri büyük veya küçük harfle ifade edilebilir.
Matematiksel ifadeler Şu şekilde yazılır: (3+4*x)/5 – 10*(y-5)*(a+b+c)/x + 9*(4/x + (9+x)/y)
İfade nasıl yorumlanır Matematikteki işlem sırası Java için de geçerlidir.
Problem: Sıcaklık değerlerini çevirme Fahrenheit’u Celcius’a çeviren programı yazın: FahrenheitToCelsius
Problem: Zamanı gösterme GMT’de şu anki zamanı gösteren programı yazın. (Mesela 1:45:19). currentTimeMillis metodu System sınıfındadır ve 1 Ocak, 1970 GMT’den itibaren geçen milisaniye değerini gösterir. Bu metodu şu anki saat, dakika ve saniye değerlerini bulak için kullanabilirsiniz. ShowCurrentTime
Atama operatörleri kısayolları Operatör Örnek Eş değeri += i += 8 i = i + 8 -= f -= 8.0 f = f - 8.0 *= i *= 8 i = i * 8 /= i /= 8 i = i / 8 %= i %= 8 i = i % 8
Arttırma ve Azaltma Operatörleri Operatör Tanımlama ++var Önce arttır sonra ata. var++ Önce ata, sonra arttır. --var Önce eksilt sonra ata. var-- Önce ata, sonra eksilt.
Art. ve Az. Op. Devam
Art. ve Az. Op. Devam Bu kısayolları kullanmak işlemleri kolaylaştırır ama bazen okumayı zorlaştırabilir. Şöyle ifadeler kullanmaktan kaçının: int k = ++i + i.
Sayı tipi çevirme Aşağıdaki ifadelere bakalım: byte i = 100; long k = i * 3 + 4; double d = i * 3.1 + k / 2;
Çevirme kuralları İki farklı operand kullanılarak bir işlem yapıldığında Java şu kuralları takip eder: 1. Bir operand double ise diğeri de double’a çevrilir.. 2. Biri float ise diğeri de float’a çevrilir. 3. long is long’a çevrilir. 4. Diğer durumlarda iki operand da int’e çevrilir.
Tür Dönüşümü (Type Casting) Gizli casting double d = 3; (tür genişlemesi) Açık casting int i = (int)3.0; (tür daralması) int i = (int)3.9; (Ondalıklı kısım kaybedilir) Hata nerede? int x = 5 / 2.0;
Problem: Virgülden sonra iki sayı tutma Satış değerini virgülden sonraki iki basamakla beraber ifade eden programı yazın. SalesTax
Problem: Kira ödemesi hesaplama Bu programda kullanıcı faiz oranını, yıl sayısını ve kira tutarını girip aylık ve toplam ödeme miktarını buluyor. ComputeLoan
Char data tipi char harf = 'A'; (ASCII) 16 lık sayı char harf = 'A'; (ASCII) char sayiKarakter = '4'; (ASCII) char harf = '\u0041'; (Unicode) char sayiKarakter = '\u0034'; (Unicode) NOT: Artı ve eksi operatörleri bir sonraki unicode karakterini bulmak için kullanılabilir. Örneğin b harfi şu şekilde ekrana basılabilir: char ch = 'a'; System.out.println(++ch);
Unicode Format Java characters use Unicode, a 16-bit encoding scheme established by the Unicode Consortium to support the interchange, processing, and display of written texts in the world’s diverse languages. Unicode takes two bytes, preceded by \u, expressed in four hexadecimal numbers that run from '\u0000' to '\uFFFF'. So, Unicode can represent 65535 + 1 characters. Unicode \u03b1 \u03b2 \u03b3 for three Greek letters
Problem: Unicode ların gösterimi Ekrana iki Çince üç Yunan karakteri basan programı yazınız. DisplayUnicode
Özel karakterler için kısayollar Tanım Escape Sequence Unicode Backspace \b \u0008 Tab \t \u0009 Linefeed \n \u000A Carriage return \r \u000D Backslash \\ \u005C Single Quote \' \u0027 Double Quote \" \u0022
Appendix B: ASCII Character Set ASCII Character Set is a subset of the Unicode from \u0000 to \u007f
ASCII Character Set, cont. ASCII Character Set is a subset of the Unicode from \u0000 to \u007f
Karakter ve sayısal tipler arasındaki ilişki // int i = (int)'a'; ile aynı şey int i = 'a'; // char c = (char)97; ile aynı şey char c = 97;
Problem: Parasal birimler Ekrana dolar ve sent miktarını belirten ondalıklı bir sayı girin. Bu miktarın single dollars, quarters, dimes, nickels, and pennies karşılıklarını bulun. ComputeChange Run
remainingAmount set edilir Trace ComputeChange 11.56 girilsin int remainingAmount = (int)(amount * 100); // Find the number of one dollars int numberOfOneDollars = remainingAmount / 100; remainingAmount = remainingAmount % 100; // Find the number of quarters in the remaining amount int numberOfQuarters = remainingAmount / 25; remainingAmount = remainingAmount % 25; // Find the number of dimes in the remaining amount int numberOfDimes = remainingAmount / 10; remainingAmount = remainingAmount % 10; // Find the number of nickels in the remaining amount int numberOfNickels = remainingAmount / 5; remainingAmount = remainingAmount % 5; // Find the number of pennies in the remaining amount int numberOfPennies = remainingAmount; remainingAmount 1156 remainingAmount set edilir
numberOfOneDollars assigned animation Trace ComputeChange Suppose amount is 11.56 int remainingAmount = (int)(amount * 100); // Find the number of one dollars int numberOfOneDollars = remainingAmount / 100; remainingAmount = remainingAmount % 100; // Find the number of quarters in the remaining amount int numberOfQuarters = remainingAmount / 25; remainingAmount = remainingAmount % 25; // Find the number of dimes in the remaining amount int numberOfDimes = remainingAmount / 10; remainingAmount = remainingAmount % 10; // Find the number of nickels in the remaining amount int numberOfNickels = remainingAmount / 5; remainingAmount = remainingAmount % 5; // Find the number of pennies in the remaining amount int numberOfPennies = remainingAmount; remainingAmount 1156 numberOfOneDollars 11 numberOfOneDollars assigned
remainingAmount güncellenir. animation Trace ComputeChange Suppose amount is 11.56 int remainingAmount = (int)(amount * 100); // Find the number of one dollars int numberOfOneDollars = remainingAmount / 100; remainingAmount = remainingAmount % 100; // Find the number of quarters in the remaining amount int numberOfQuarters = remainingAmount / 25; remainingAmount = remainingAmount % 25; // Find the number of dimes in the remaining amount int numberOfDimes = remainingAmount / 10; remainingAmount = remainingAmount % 10; // Find the number of nickels in the remaining amount int numberOfNickels = remainingAmount / 5; remainingAmount = remainingAmount % 5; // Find the number of pennies in the remaining amount int numberOfPennies = remainingAmount; remainingAmount 56 numberOfOneDollars 11 remainingAmount güncellenir.
numberOfOneQuarters assigned animation Trace ComputeChange Suppose amount is 11.56 int remainingAmount = (int)(amount * 100); // Find the number of one dollars int numberOfOneDollars = remainingAmount / 100; remainingAmount = remainingAmount % 100; // Find the number of quarters in the remaining amount int numberOfQuarters = remainingAmount / 25; remainingAmount = remainingAmount % 25; // Find the number of dimes in the remaining amount int numberOfDimes = remainingAmount / 10; remainingAmount = remainingAmount % 10; // Find the number of nickels in the remaining amount int numberOfNickels = remainingAmount / 5; remainingAmount = remainingAmount % 5; // Find the number of pennies in the remaining amount int numberOfPennies = remainingAmount; remainingAmount 56 numberOfOneDollars 11 numberOfOneQuarters 2 numberOfOneQuarters assigned
remainingAmount updated animation Trace ComputeChange Suppose amount is 11.56 int remainingAmount = (int)(amount * 100); // Find the number of one dollars int numberOfOneDollars = remainingAmount / 100; remainingAmount = remainingAmount % 100; // Find the number of quarters in the remaining amount int numberOfQuarters = remainingAmount / 25; remainingAmount = remainingAmount % 25; // Find the number of dimes in the remaining amount int numberOfDimes = remainingAmount / 10; remainingAmount = remainingAmount % 10; // Find the number of nickels in the remaining amount int numberOfNickels = remainingAmount / 5; remainingAmount = remainingAmount % 5; // Find the number of pennies in the remaining amount int numberOfPennies = remainingAmount; remainingAmount 6 numberOfOneDollars 11 numberOfQuarters 2 remainingAmount updated
String tipi Char tipi tek bir karakteri ifade etmeye yarar. Birden çok karakteri ifade etmek için String tipi kullanılır. String message = "Welcome to Java"; String System veya JOptionPane sınıfları gibi önceden Java kütüphanesinde tanımlanmıştır. String tipi primitif değil referans tipindedir. Java sınıfları değişkenleri refere ederken kullanılabilir.
String birleştirme // Three strings are concatenated String message = "Welcome " + "to " + "Java"; // String Chapter is concatenated with number 2 String s = "Chapter" + 2; // s becomes Chapter2 // String Supplement is concatenated with character B String s1 = "Supplement" + 'B'; // s1 becomes SupplementB
Programlama biçimi ve dökümantasyonu Açıklayıcı yorumlar İsimlendirme Kuralları Doğru biçimlendirme Block Styles
Yorumlar Programın başına özet olarak programın ne yaptığını, hangi özelliklere sahip olduğunu, hangi veri yapılarını barındırdığını yazın. İsminizi, biriminizi, tarihi, üstünüzü ve kısa bir açıklamayı ekleyin.
İsimlendirme Anlamlı ve açıklayıcı isimler seçin. Değişkenler ve metot isimleri: Küçük harfler kullanın. Birden fazla kelime varsa camel notation. Örnek: computeArea
devam Sınıf isimleri: Sabitler: Büyük harfle başlayın: AlanHesapla. Hepsi büyük harf ve boşluk gelmesi gereken yerlere alt tire konur. For example, the constant PI ve MAX_VALUE
Biçimlendirme Girinti Boşluk Parantezden sonra bir tab içerden başlayın. Boşluk Kod segmentleri arasında bir satır boşluk bırakın.
Block Styles Use end-of-line style for braces.
Programlama Hataları Syntax Hataları Runtime Hataları Mantık hataları Derleyici tespit eder. Runtime Hataları Programın başarısız olmasına sebep olur Mantık hataları Hatalı sonuç üretir.
Sentaks hatası public class ShowSyntaxErrors { public static void main(String[] args) { i = 30; System.out.println(i + 4); }
Çalışma zamanı hataları public class ShowRuntimeErrors { public static void main(String[] args) { int i = 1 / 0; }
Logic Errors public class ShowLogicErrors { // Determine if a number is between 1 and 100 inclusively public static void main(String[] args) { // Prompt the user to enter a number String input = JOptionPane.showInputDialog(null, "Please enter an integer:", "ShowLogicErrors", JOptionPane.QUESTION_MESSAGE); int number = Integer.parseInt(input); // Display the result System.out.println("The number is between 1 and 100, " + "inclusively? " + ((1 < number) && (number < 100))); System.exit(0); }
Debugging Mantık hatalarına bug denir. Hataları bulup düzeltme işlemine debugging denir. Genellikle bug ın buluduğu segmentler kullanılarak hatayı giderme yoluna gidilir. Programı okuyarak ya da basitçe ekrana birtakım değerler bastırarak küçük programları debug edebilirsiniz. Fakat büyük ve karmaşık programlar için yardımcı yazılımlar gerekir.
Debugger Debugger debugging işleminin yapıldığı birimdir. Bir zaman aralığında tek komut çalıştırma. Bir metotu takip etme ya da gerekmiyorsa atlama. Breakpoint oluşturma. Değişkenleri gösterme. Display call stack. Değişkenleri düzenleme gibi işlevleri vardır.
JOptionPane Input Derste iki tip input göreceğiz. Scanner sınıfı (konsol input) JOptionPane input diyalogları
Input diyalog kutusundan input alma String input = JOptionPane.showInputDialog( "Enter an input");
Devam String string = JOptionPane.showInputDialog( null, “Prompting Message”, “Dialog Title”, JOptionPane.QUESTION_MESSAGE);
Metotu çağırmak için iki yol : String string = JOptionPane.showInputDialog(null, x, y, JOptionPane.QUESTION_MESSAGE); x ekrana gelen soru, y kutunun başlığı. JOptionPane.showInputDialog(x); X ekrana gelen soru.
String leri integer a çevirme Integer sınıfında parseInt metotu kullanılır: int intValue = Integer.parseInt(intString); intString bir sayısal String ifadesidir, mesela “123”.
String i double a çevirme Double sınıfından parseDouble metotu kullanılır: double doubleValue =Double.parseDouble(doubleString); doubleString mesela “123.45” olabilir.
Problem: Input diyaloglarıyla kira hesaplama Daha önceki faiz sorusunu bu sefer diyalog kutularıyla yapalım. ComputeLoanUsingInputDialog Run
Companion Website Debugging in NetBeans Supplement II.E, Learning Java Effectively with NetBeans
Companion Website Debugging in Eclipse Supplement II.G, Learning Java Effectively with NetBeans