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.
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:
- Scanner’ın üç satırı:
import java.util.Scanner;,new Scanner(System.in),input.nextInt(). next()tek kelime,nextLine()bütün satır. nextInt’ten sonra nextLine boş döner.- String indeksi 0’dan başlar, son indeks
length() - 1. - String’ler
equalsile karşılaştırılır, asla==ile. 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.
| Metot | Ne okur | Örnek girdi → değer |
|---|---|---|
nextInt() | bir int | 42 → 42 |
nextDouble() | bir double | 3.4 → 3.4 |
next() | boşluğa kadar tek kelime | Ali Veli → "Ali" |
nextLine() | satırın geri kalanının tamamı | Ali Veli → "Ali Veli" |
nextBoolean() | true ya da false | true → 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ı
abcyazarsa 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
| Metot | Döndürdüğü | Not |
|---|---|---|
length() | int | parantezli! (dizilerde length parantezsiz) |
charAt(i) | char | i geçersizse StringIndexOutOfBoundsException |
substring(a, b) | String | a dahil, b hariç; uzunluk b - a |
substring(a) | String | a’dan sona kadar |
indexOf(x) | int | ilk geçtiği indeks, yoksa -1 |
toUpperCase(), toLowerCase() | String | yeni String |
trim() | String | baştaki ve sondaki boşlukları siler |
equals(t) | boolean | büyük/küçük harf duyarlı |
equalsIgnoreCase(t) | boolean | harf 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 + 3ifadesidd = 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üşünce | Doğrusu |
|---|---|
import main’in içine yazılır | Dosyanın en üstüne, class’tan önce |
next() bütün satırı okur | Tek kelime; satır için nextLine() |
| nextInt’ten sonra nextLine ismi okur | Boş String döner; araya input.nextLine(); |
s.length | String’de metot: s.length() |
İlk karakter charAt(1) | charAt(0) |
substring(2, 5) 4 karakter | 3 karakter: 2, 3, 4 |
s.toUpperCase(); s’yi değiştirir | Değ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ç.
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
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.
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
w = "Bau", n = 2. Soldan sağa: "Bau" + 2 = "Bau2" (String), sonra + 1 = "Bau21". Toplama yapılmaz, çünkü sol taraf zaten String.
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
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".
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
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.
What is printed?
String s = "Bahcesehir";
System.out.println(s.length() + " " + s.charAt(3) + " " + s.substring(2, 5));Cevabı göster
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".
What is printed?
String s = "computer";
System.out.println(s.indexOf('t') + " " + s.indexOf("put") + " " + s.indexOf('x'));Cevabı göster
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.
What is printed?
String s = "java";
s.toUpperCase();
System.out.println(s + s.length());Cevabı göster
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.
What is printed?
int a = 5;
int b = a++ + ++a;
System.out.println(a + " " + b);Cevabı göster
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.
What is the value of x at the end?
int x = 7;
x += 3;
x -= 2;
x *= 3;
x %= 5;Cevabı göster
7 + 3 = 10, 10 - 2 = 8, 8 * 3 = 24, 24 % 5 = 4.
What is printed?
int q = 10;
q /= 4;
q += 1.9;
System.out.println(q);Cevabı göster
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.
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
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".
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
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.