SEN1001 · 2. hafta · Introduction to Java Applications /Elementary Programming

Scanner ile girdi, String temelleri, ++ ve +=

Klavyeden sayı ve metin okumak, String metotları (length, charAt, substring, indexOf, equals) ve artırma/bileşik atama operatörleri. Yazma sorularının ilk satırları ve tracing'in en sinsi kısmı burada.

ScannerimportSystem.intokennextIntnextLineInputMismatchExceptionStringindeximmutableconcatenationincrementdecrementprefixpostfixcompound assignment

Bu sayfa iki işi birleştiriyor: kullanıcıdan veri almak (Scanner) ve metinle çalışmak (String). Bir de ++ ile += var; tracing sorularının en çok tuzak kurulan yeri. Yazma sorularında “kullanıcıdan bir sayı al” diye başlayan her soru Scanner’ın üç satırını ister; bunları refleks gibi yazabilmen lazım.

Altın kurallar:

  1. Scanner’ın üç satırı: import java.util.Scanner;, new Scanner(System.in), input.nextInt().
  2. next() tek kelime, nextLine() bütün satır. nextInt’ten sonra nextLine boş döner.
  3. String indeksi 0’dan başlar, son indeks length() - 1.
  4. String’ler equals ile karşılaştırılır, asla == ile.
  5. x++ önce kullanır sonra artırır, ++x önce artırır sonra kullanır.

Scanner ile klavyeden okuma

Scanner, Java’nın hazır kütüphanesindeki bir sınıf. Kullanmadan önce dosyanın en üstüne import yazarsın, sonra bir Scanner nesnesi oluşturursun.

import java.util.Scanner;                    // 1) import, class'ın üstüne

public class Profile {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);  // 2) klavyeye bağlı Scanner
        System.out.print("Enter age: ");
        int age = input.nextInt();               // 3) tipine göre oku
        System.out.print("Enter GPA: ");
        double gpa = input.nextDouble();
        System.out.print("Enter name: ");
        String name = input.next();
        System.out.println(name + " is " + age + ", GPA " + gpa);
    }
}

Konsolda (kullanıcı 19, 3.4 ve Deniz yazdığında):

Enter age: 19
Enter GPA: 3.4
Enter name: Deniz
Deniz is 19, GPA 3.4

Soru metninden önce print (println değil) kullanmak gelenek: imleç aynı satırda kalır, kullanıcı cevabı sorunun yanına yazar.

MetotNe okurÖrnek girdi → değer
nextInt()bir int42 → 42
nextDouble()bir double3.4 → 3.4
next()boşluğa kadar tek kelimeAli Veli → "Ali"
nextLine()satırın geri kalanının tamamıAli Veli → "Ali Veli"
nextBoolean()true ya da falsetrue → true

Token mantığı

Scanner girdiyi boşluklarla parçalara (token) ayırır. next, nextInt, nextDouble bir sonraki parçayı alır. nextLine ise parçalamaz, satırın kalanını olduğu gibi alır.

String first = input.next();
String line = input.nextLine();
System.out.println("[" + first + "]");
System.out.println("[" + line + "]");

Girdi Ali Veli Can olduğunda:

[Ali]
[ Veli Can]

Baştaki boşluğa dikkat: next “Ali”yi aldı, nextLine kalan her şeyi, boşluk dahil aldı.

nextInt’ten sonra nextLine tuzağı

System.out.print("Age: ");
int age = input.nextInt();
System.out.print("Full name: ");
String name = input.nextLine();
System.out.println("[" + name + "] " + age);

Kullanıcı 20 yazıp Enter’a basıyor, sonra Deniz Yilmaz yazacak. Ama program beklemeden bitiyor:

Age: Full name: 
[] 20

nextInt sadece 20’yi aldı, Enter tuşunun ürettiği satır sonu girdide kaldı. nextLine o satır sonunu görüp hemen boş String döndürdü. Çözüm: araya boş bir input.nextLine(); koyup satır sonunu yut.

int age = input.nextInt();
input.nextLine();                      // kalan satır sonunu at
String name = input.nextLine();
Age: Full name: 
[Deniz Yilmaz] 20

(Doğrulamada girdi dosyadan verildiği için yazılan değerler ekrana yansımadı.)

TUZAK · yanlış tipte girdi. nextInt beklerken kullanıcı abc yazarsa program çöker: java.util.InputMismatchException. Bu bir runtime error, derleme sırasında görünmez.

String temelleri

String bir karakter dizisidir. Her karakterin bir indeksi (index) vardır ve sayım 0’dan başlar.

 S   o   f   t   w   a   r   e
 0   1   2   3   4   5   6   7        length() = 8, son indeks 7
String s = "Software";
System.out.println(s.length());
System.out.println(s.charAt(0) + " " + s.charAt(7));
System.out.println(s.substring(4));        // 4'ten sona
System.out.println(s.substring(0, 4));     // 0,1,2,3 (4 hariç)
System.out.println(s.indexOf('w') + " " + s.indexOf("ware") + " " + s.indexOf('z'));
System.out.println(s.toUpperCase() + " " + s.toLowerCase());
System.out.println("  hi  ".trim() + "|");
System.out.println(s.equals("software") + " " + s.equalsIgnoreCase("software"));
System.out.println(s.charAt(s.length() - 1));
8
S e
ware
Soft
4 4 -1
SOFTWARE software
hi|
false true
e
MetotDöndürdüğüNot
length()intparantezli! (dizilerde length parantezsiz)
charAt(i)chari geçersizse StringIndexOutOfBoundsException
substring(a, b)Stringa dahil, b hariç; uzunluk b - a
substring(a)Stringa’dan sona kadar
indexOf(x)intilk geçtiği indeks, yoksa -1
toUpperCase(), toLowerCase()Stringyeni String
trim()Stringbaştaki ve sondaki boşlukları siler
equals(t)booleanbüyük/küçük harf duyarlı
equalsIgnoreCase(t)booleanharf büyüklüğünü yok sayar

String değişmezdir (immutable)

Hiçbir String metodu var olan String’i değiştirmez. Hepsi yeni bir String döndürür. Sonucu bir yere atamazsan kaybolur.

String t = "bau";
t.toUpperCase();          // sonuç atılmadı
System.out.println(t);
t = t.toUpperCase();      // sonucu t'ye ata
System.out.println(t);
bau
BAU

Birleştirme (concatenation)

+ işaretinin iki tarafından biri String ise birleştirme yapılır. İşlem soldan sağa gider, bu yüzden sıra her şeyi belirler.

int x = 3, y = 4;
System.out.println("x + y = " + x + y);     // "x + y = 3" + 4
System.out.println("x + y = " + (x + y));   // parantez önce
System.out.println(x + y + " toplam");      // önce 3 + 4
String msg = "Skor";
msg += ": ";
msg += 90;
System.out.println(msg);
x + y = 34
x + y = 7
7 toplam
Skor: 90

Artırma ve azaltma: ++ ve —

x++ ve ++x ikisi de x’i bir artırır. Fark, ifadenin içinde hangi değeri verdikleri:

  • Postfix x++: ifadeye eski değeri verir, sonra artırır.
  • Prefix ++x: önce artırır, ifadeye yeni değeri verir.
int i = 5;
int j = i++;        // j eski değeri alır
System.out.println(i + " " + j);
int k = ++i;        // önce artır, sonra ver
System.out.println(i + " " + k);
int n = 3;
System.out.println(n++ + " " + n);
System.out.println(--n * 2);
6 5
7 7
3 4
6
satır              i    j    k    açıklama
int i = 5          5
int j = i++        6    5         j eski 5'i aldı, i sonra 6
int k = ++i        7    5    7    i önce 7, k yeni 7'yi aldı

Tek başına bir satırda (x++; ya da ++x;) ikisi arasında fark yoktur. Fark sadece başka bir işlemin içinde çıkar.

Bileşik atama (compound assignment)

x += 3 kısaca x = x + 3 demek. Aynısı -=, *=, /=, %= için.

int p = 10;
p += 5;  System.out.print(p + " ");
p -= 3;  System.out.print(p + " ");
p *= 2;  System.out.print(p + " ");
p /= 5;  System.out.print(p + " ");   // 24 / 5 = 4, int bölme
p %= 3;  System.out.println(p);
int c = 5;
c += 2.7;              // gizli cast: c = (int) (c + 2.7)
System.out.println(c);
int dd = 4;
dd *= 2 + 3;           // sağ taraf önce: dd = dd * 5
System.out.println(dd);
15 12 24 4 1
7
20

TUZAK · *= sağ tarafı bütün olarak alır. dd *= 2 + 3 ifadesi dd = dd * 2 + 3 (11) değil, dd = dd * (2 + 3) (20). Atama operatörlerinin önceliği en düşüktür; sağ taraf her zaman önce hesaplanır.

Sık yapılan hatalar

Yanlış düşünceDoğrusu
import main’in içine yazılırDosyanın en üstüne, class’tan önce
next() bütün satırı okurTek kelime; satır için nextLine()
nextInt’ten sonra nextLine ismi okurBoş String döner; araya input.nextLine();
s.lengthString’de metot: s.length()
İlk karakter charAt(1)charAt(0)
substring(2, 5) 4 karakter3 karakter: 2, 3, 4
s.toUpperCase(); s’yi değiştirirDeğiştirmez; s = s.toUpperCase();
if (s == "yes")if (s.equals("yes"))
charAt(1) + charAt(2) iki harf yan yanaİki char toplanır, sayı çıkar
x++ ile ++x her yerde aynıİfade içinde farklı değer verirler

Kendini test et

Sınavdaki gibi İngilizce sorular. Önce kâğıt kalemle çöz, sonra cevabı aç.

Soru 1kolay

The user types 17 5 and presses Enter. What is printed?

Scanner input = new Scanner(System.in);
int a = input.nextInt();
int b = input.nextInt();
System.out.println(a / b + " " + a % b);
Cevabı göster
3 2

nextInt boşlukla ayrılmış parçaları (token) sırayla okur: a = 17, b = 5. 17 / 5 = 3 (int bölme), 17 % 5 = 2. Önce / ve %, sonra String birleştirme.

Soru 2orta

The user types Bau 2 and presses Enter. What is printed?

String w = input.next();
int n = input.nextInt();
System.out.println(w + n + 1);
Cevabı göster
Bau21

w = "Bau", n = 2. Soldan sağa: "Bau" + 2 = "Bau2" (String), sonra + 1 = "Bau21". Toplama yapılmaz, çünkü sol taraf zaten String.

Soru 3zor

The user types 42 is the answer and presses Enter. What is printed?

int n = input.nextInt();
String rest = input.nextLine();
System.out.println(n + "|" + rest + "|");
Cevabı göster
42| is the answer|

nextInt sadece 42'yi okur ve imleci hemen arkasında bırakır. nextLine satırın geri kalanını okur, baştaki boşluk dahil: " is the answer".

Soru 4orta

The user types yes. What is printed?

String answer = input.next();
System.out.println(answer == "yes");
System.out.println(answer.equals("yes"));
Cevabı göster
false
true

== String'lerde içeriği değil, iki değişkenin aynı nesneyi gösterip göstermediğini karşılaştırır. Scanner'ın okuduğu "yes" yeni bir nesne, kodtaki "yes" başka bir nesne: false. İçerik karşılaştırması her zaman equals ile yapılır.

Soru 5orta

What is printed?

String s = "Bahcesehir";
System.out.println(s.length() + " " + s.charAt(3) + " " + s.substring(2, 5));
Cevabı göster
10 c hce

Uzunluk 10 harf. İndeksler 0'dan başlar: B0 a1 h2 c3, yani charAt(3) = 'c'. substring(2, 5) 2, 3, 4. indeksleri alır (5 hariç): h, c, e → "hce".

Soru 6orta

What is printed?

String s = "computer";
System.out.println(s.indexOf('t') + " " + s.indexOf("put") + " " + s.indexOf('x'));
Cevabı göster
5 3 -1

c0 o1 m2 p3 u4 t5 e6 r7. 't' 5. indekste. "put" 3. indekste başlıyor. 'x' yok: indexOf bulamayınca -1 döndürür.

Soru 7orta

What is printed?

String s = "java";
s.toUpperCase();
System.out.println(s + s.length());
Cevabı göster
java4

String değişmezdir (immutable). toUpperCase() yeni bir String üretir ama sonuç hiçbir yere atanmadığı için kaybolur; s hâlâ "java". Büyük harf için s = s.toUpperCase(); yazmalısın.

Soru 8zor

What is printed?

int a = 5;
int b = a++ + ++a;
System.out.println(a + " " + b);
Cevabı göster
7 12

Soldan sağa: a++ değer olarak 5 verir, sonra a = 6. ++a önce artırır: a = 7, değer olarak 7 verir. b = 5 + 7 = 12, a = 7.

Soru 9kolay

What is the value of x at the end?

int x = 7;
x += 3;
x -= 2;
x *= 3;
x %= 5;
Cevabı göster
4

7 + 3 = 10, 10 - 2 = 8, 8 * 3 = 24, 24 % 5 = 4.

Soru 10zor

What is printed?

int q = 10;
q /= 4;
q += 1.9;
System.out.println(q);
Cevabı göster
3

q /= 4 → 10 / 4 = 2 (int bölme). q += 1.9 aslında q = (int) (q + 1.9) demektir: bileşik atama gizli bir cast içerir. 2 + 1.9 = 3.9 → 3. Aynı şeyi q = q + 1.9; diye yazsan derlenmezdi.

Soru 11zor

What is printed?

String s = "Hello";
System.out.println(s.charAt(1) + s.charAt(2));
System.out.println("" + s.charAt(1) + s.charAt(2));
Cevabı göster
209
el

charAt bir char döndürür, String değil. 'e' (101) + 'l' (108) = 209, sayı toplamı. İkinci satırda başta "" olduğu için birleştirme olur: "el".

Soru 12orta

Write a code fragment that reads a full name such as Deniz Yilmaz into full and prints the initials (DY). Assume the name has exactly one space.

Cevabı göster
"" + full.charAt(0) + full.charAt(full.indexOf(' ') + 1)

Boşluğun yerini indexOf ile bul, baş harfler 0. indeks ve boşluktan sonraki indeks. Başa "" koymazsan iki char toplanıp sayı basılır.Scanner input = new Scanner(System.in);String full = input.nextLine();int sp = full.indexOf(' ');System.out.println("" + full.charAt(0) + full.charAt(sp + 1));"Deniz Yilmaz" için çıktı: DY. Burada next() değil nextLine() gerekli, çünkü ad boşluk içeriyor.

Doğrulama: Tüm kod parçaları JDK 26 ile çalıştırıldı (verify/SEN1001/W02b.java). Scanner örnekleri girdi stdin'den verilerek çalıştırıldı: printf '19 3.4 Deniz' | java W02b.java body1 gibi; konsolda görünen kullanıcı girdisi okunabilirlik için eklendi.

Deftere not kartı

import java.util.Scanner; (class'ın ÜSTÜNE) Scanner input = new Scanner(System.in); nextInt() nextDouble() next() = tek kelime nextLine() = satırın geri kalanı nextInt sonrası nextLine → boş String! araya input.nextLine(); koy sayı beklerken harf → InputMismatchException (runtime) String: "çift tırnak", indeks 0'dan, son harf s.charAt(s.length()-1) length() charAt(i) substring(a,b) [b hariç] substring(a) indexOf(x) (yoksa -1) toUpperCase() toLowerCase() trim() → YENİ String döner, s değişmez s.equals(t) s.equalsIgnoreCase(t) ASLA s == t charAt char döner: 'e'+'l' = 209 ""+'e'+'l' = "el" "x="+3+4 = "x=34" 3+4+"x" = "7x" "x="+(3+4) = "x=7" x++ eski değeri ver sonra artır ++x önce artır sonra ver b = a++ + ++a (a=5) → 5 + 7 = 12, a = 7 x += 2.7 → x = (int)(x + 2.7) x *= 2 + 3 → x = x * (2 + 3)