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

Değişkenler, primitive tipler ve printf

Değişken tanımlama, sekiz primitive tip, char aritmetiği, casting ve printf ile biçimli çıktı. Çıktı sorularında 7 ile 7.0 farkını buradan öğrenirsin.

variabledeclarationassignmentinitializationprimitive typeliteralwidening conversionnarrowing conversioncastingoverflowformat specifierprintf

Değişkenler programın hafızası. Her değişkenin bir tipi var ve tip, hem ne saklayabileceğini hem de ekrana nasıl basılacağını belirler. Çıktı sorularında 7 yerine 7.0 yazmak ya da 'A' + 1 sonucunu B sanmak, bu sayfadaki kuralları bilmemekten gelir.

Altın kurallar:

  1. Tip önce, ad sonra: int age = 19;. Tip bir kez yazılır, sonra sadece adı kullanırsın.
  2. Ondalıklı sayı literali double’dır. 2.5 double, 2.5f float.
  3. Küçükten büyüğe otomatik, büyükten küçüğe cast: int → double kendiliğinden olur, double → int için (int) gerekir.
  4. char aslında bir sayı. 'A' + 1 int verir: 66.
  5. printf’te %.2f yuvarlar, (int) cast keser.

Değişken tanımlama ve atama

int age;            // tanımlama (declaration)
age = 19;           // atama (assignment)
int goals = 3, assists = 5;   // tanım + ilk değer (initialization)
double gpa = 3.25;
char grade = 'B';
boolean passed = true;
System.out.println(age + " " + goals + " " + assists + " " + gpa + " " + grade + " " + passed);
age = age + 1;      // sağ taraf önce hesaplanır, sonra age'e yazılır
System.out.println(age);
19 3 5 3.25 B true
20

= matematikteki eşitlik değil, atamadır: sağdaki değeri hesapla, soldaki kutuya koy. Bu yüzden age = age + 1 anlamlıdır: eski değeri al, bir ekle, geri yaz.

Değişken adı kuralları: harf, rakam, _ ve $ içerebilir, rakamla başlayamaz, int ya da class gibi ayrılmış kelime (keyword) olamaz. Gelenek olarak küçük harfle başlar ve kelimeler büyük harfle birleşir: totalScore, studentCount (camelCase).

TUZAK · değer atanmamış değişken. int count; deyip hiç değer vermeden System.out.println(count); yazarsan derlenmez: variable count might not have been initialized. Metot içindeki yerel değişkenlerin varsayılan (default) değeri yoktur.

Sekiz primitive tip

Java’da sekiz temel (primitive) tip var. Sınavda en çok int, double, char ve boolean geçer; diğerlerinin varlığını ve sırasını bilmen yeter.

TipBoyutNe saklarÖrnek literalAralık
byte1 byteküçük tam sayı100-128 … 127
short2 bytetam sayı3000-32768 … 32767
int4 bytetam sayı (varsayılan)42-2147483648 … 2147483647
long8 bytebüyük tam sayı3000000000Lyaklaşık ±9.2 × 10^18
float4 byteondalıklı (az hassas)2.5f
double8 byteondalıklı (varsayılan)2.5
char2 bytetek karakter'A'0 … 65535
booleandoğru/yanlıştrue, false

Aralıklar Java’nın kendi sabitlerinden alındı:

System.out.println(Byte.MIN_VALUE + " " + Byte.MAX_VALUE);
System.out.println(Integer.MIN_VALUE + " " + Integer.MAX_VALUE);
System.out.println(Long.MAX_VALUE);
-128 127
-2147483648 2147483647
9223372036854775807

String primitive değildir. Bir sınıftır (class), çift tırnakla yazılır: "Ali". char tek tırnakla ve tek karakterdir: 'A'. 'Ali' derlenmez.

Taşma (overflow)

int’in sınırını aşarsan Java hata vermez, sayı öbür uçtan geri gelir:

int m = Integer.MAX_VALUE;
m = m + 1;
System.out.println(m);
-2147483648

char bir sayıdır

Her karakterin bir kodu var (Unicode). Ezber için üç tane yeter: 'A' = 65, 'a' = 97, '0' = 48. char ile aritmetik yapınca sonuç int olur.

char c = 'A';
System.out.println(c + 1);            // char + int = int
System.out.println((char) (c + 1));   // tekrar char'a çevir
System.out.println('a' + 'b');        // 97 + 98, iki sayı
System.out.println("" + 'a' + 'b');   // önce String, sonra birleştirme
char c2 = 'A';
c2++;                                 // ++ char olarak kalır
System.out.println(c2);
System.out.println((int) '0');
66
B
195
ab
B
48

TUZAK · iki char toplamı. 'a' + 'b' sonucu ab değil, 195. + iki tarafta da String yoksa toplama yapar. Birleştirme istiyorsan başa "" koy.

Tip dönüşümü ve casting

Genişletme (widening conversion): küçük tipten büyüğe otomatik olur, veri kaybı yoktur. Sıra: byte → short → int → long → float → double.

Daraltma (narrowing conversion): büyükten küçüğe. Veri kaybı olabileceği için derleyici zorla ister: cast yazarsın. Cast ondalık kısmı keser (truncate), yuvarlamaz.

int i = 7;
double dd = i;                  // widening, otomatik
System.out.println(dd);
double x = 9.99;
int t = (int) x;                // narrowing, cast şart
System.out.println(t);
System.out.println((int) -3.7);                 // sıfıra doğru keser
System.out.println((int) 3.7 + (int) 2.6);      // 3 + 2
System.out.println((int) (3.7 + 2.6));          // (int) 6.3
System.out.println(Math.round(3.7));            // yuvarlama böyle yapılır
7.0
9
-3
5
6
4

Cast yazmazsan:

int x = 2.5 * 2;
float f = 1.5;
Narrow.java:3: error: incompatible types: possible lossy conversion from double to int
        int x = 2.5 * 2;
                    ^
Narrow.java:4: error: incompatible types: possible lossy conversion from double to float
        float f = 1.5;
                  ^
2 errors

2.5 * 2 = 5.0 olsa bile tipi double’dır; derleyici değere değil tipe bakar.

printf ile biçimli çıktı

System.out.printf bir biçim metni (format string) alır, içindeki % ile başlayan belirteçlerin (format specifier) yerine argümanları sırayla koyar. println gibi otomatik satır atlamaz; satır sonu için %n (ya da \n) yazarsın.

BelirteçNe içinÖrnekÇıktı
%dint, longprintf("%d", 42)42
%fdouble (6 basamak)printf("%f", 2.5)2.500000
%.2fdouble, 2 basamakprintf("%.2f", 78.456)78.46
%sStringprintf("%s", "Ali")Ali
%ccharprintf("%c", 'Z')Z
%bbooleanprintf("%b", false)false
%5dgenişlik 5, sağa yaslıprintf("[%5d]", 42)[ 42]
%-5dgenişlik 5, sola yaslıprintf("[%-5d]", 42)[42 ]
%8.2fgenişlik 8, 2 basamakprintf("[%8.2f]", 3.14159)[ 3.14]
String name = "Deniz";
int score = 87;
double avg = 78.456;
System.out.printf("%s scored %d points%n", name, score);
System.out.printf("Average: %.2f%n", avg);
System.out.printf("Average: %.1f%n", avg);
Deniz scored 87 points
Average: 78.46
Average: 78.5

TUZAK · %.2f yuvarlar, cast keser. printf("%.1f", 78.456) → 78.5. Ama (int) 78.9 → 78. İkisini karıştırma.

İPUCU · Türkçe bilgisayarda virgül. printf sistemin yerel ayarını (locale) kullanır. Türkçe ayarlı bir bilgisayarda %.2f sonucu 78,46 diye virgülle basılabilir. Sınavda İngilizce kabul edilir: nokta yaz.

Çözümlü örnek: takas (swap)

İki değişkenin değerini değiştirmek için üçüncü bir kutu gerekir. Yoksa biri kaybolur.

int a = 3, b = 8;
int temp = a;   // a'nın değerini sakla
a = b;
b = temp;
System.out.println(a + " " + b);
8 3
              a   b   temp
başlangıç     3   8   -
temp = a      3   8   3
a = b         8   8   3
b = temp      8   3   3

Sık yapılan hatalar

Yanlış düşünceDoğrusu
String primitive bir tiptirSınıftır; primitive’ler 8 tane, hepsi küçük harf
char c = "A";char tek tırnak: 'A'
'A' + 1 → B66; B için (char) ('A' + 1)
(int) 9.99 → 109, cast keser
int x = 5.0; derlenir, değer tamDerlenmez; tip double
float f = 1.5;1.5f yazılmalı
MAX_VALUE + 1 hata verirSessizce MIN_VALUE olur
printf satır atlarAtlamaz; %n ekle
printf("%d", 2.5)%d sadece tam sayı; double için %f
a = b; b = a; takas ederİkisi de b olur; temp kullan

Kendini test et

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

Soru 1kolay

What is printed?

int p = 5;
int q = p;
p = 10;
System.out.println(p + " " + q);
Cevabı göster
10 5

q = p satırında p'nin o anki değeri (5) q'ya kopyalanır. Sonra p'yi değiştirmek q'yu etkilemez. Primitive değişkenler birbirine bağlı değildir.

Soru 2kolay

What is printed?

System.out.printf("%d-%d%n", 7, 3);
Cevabı göster
7-3

printf biçim metnini (format string) aynen yazar, %d gördüğü yere sırayla argümanları koyar: önce 7, sonra 3. - sıradan bir karakter. %n satır sonu.

Soru 3kolay

What is printed?

System.out.printf("Total: %.2f%n", 12.0 / 7);
Cevabı göster
Total: 1.71

12.0 / 7 = 1.7142857... %.2f virgülden sonra 2 basamak gösterir ve yuvarlar: 1.714 → 1.71.

Soru 4orta

What is printed?

System.out.printf("[%4d][%-4d]%n", 7, 7);
Cevabı göster
[ 7][7 ]

%4d sayıyı 4 karakterlik alana sağa yaslı yazar: 3 boşluk + 7. %-4d eksi işaretiyle sola yaslar: 7 + 3 boşluk. Köşeli parantezler sadece boşlukları görebilmek için.

Soru 5orta

What is printed?

char ch = 'C';
System.out.println(ch + 2);
System.out.println((char) (ch + 2));
Cevabı göster
69
E

'C' karakterinin kodu 67. char + int işleminin sonucu int: 67 + 2 = 69, ekrana sayı basılır. İkinci satırda 69 tekrar char'a çevrilir: 69 = 'E'.

Soru 6zor

What is printed?

System.out.println('x' + "y" + 'z');
System.out.println('x' + 'y' + "z");
Cevabı göster
xyz
241z

Birinci satır: 'x' + "y" → String "xy", sonra + 'z' → "xyz". İkinci satırda soldan sağa ilk işlem iki char: 'x' (120) + 'y' (121) = 241, sayı toplamı. Sonra 241 + "z" = "241z".

Soru 7orta

What is printed?

double v = 5.9;
int w = (int) v * 2;
int w2 = (int) (v * 2);
System.out.println(w + " " + w2);
Cevabı göster
10 11

Cast sadece hemen sağındakine uygulanır. (int) v = 5 (kesilir), 5 * 2 = 10. İkincide önce parantez: 5.9 * 2 = 11.8, sonra (int) → 11.

Soru 8zor

What is printed?

int r = 2147483647;
r++;
System.out.println(r);
Cevabı göster
-2147483648

2147483647 int'in en büyük değeri (Integer.MAX_VALUE). Bir artırınca taşma (overflow) olur ve değer en küçük int'e, -2147483648'e döner. Java hata vermez, sessizce sarar.

Soru 9orta

What is printed?

int k = 4;
double z = k / 8;
double z2 = k / 8.0;
System.out.println(z + " " + z2);
Cevabı göster
0.0 0.5

k / 8 iki int: 4 / 8 = 0, double'a atanınca 0.0. k / 8.0 double bölme: 0.5.

Soru 10orta

Which lines cause a compile-time error?

int a = 2.5 * 2;       // line 1
double b = 7;          // line 2
float c = 1.5;         // line 3
long d = 100;          // line 4
Cevabı göster
line 1 and line 3

Satır 1: 2.5 * 2 double, int'e otomatik atanamaz (possible lossy conversion from double to int). Satır 3: 1.5 literali double'dır, float'a sığmaz; 1.5f yazılmalı. Satır 2 ve 4 genişletme (widening): int → double ve int → long otomatik ve güvenli.

Soru 11orta

The code below is meant to swap s1 and s2. What is printed, and what is the fix?

int s1 = 1, s2 = 2;
s1 = s2;
s2 = s1;
System.out.println(s1 + " " + s2);
Cevabı göster
2 2

s1 = s2 ile s1'in eski değeri (1) kaybolur, ikisi de 2 olur. Sonra s2 = s1 yine 2. Doğru takas için geçici değişken (temp) gerekir: int temp = s1; s1 = s2; s2 = temp; → 2 1.

Soru 12kolay

What is printed?

System.out.printf("%s is %d years old and has a %.1f GPA%n", "Ali", 20, 3.456);
Cevabı göster
Ali is 20 years old and has a 3.5 GPA

Argümanlar sırayla yerleşir: %s ← "Ali", %d ← 20, %.1f ← 3.456 tek basamağa yuvarlanır: 3.5. Argüman sayısı ve tipleri belirteçlerle (specifier) uyuşmalı; %d yerine double verirsen program çalışırken hata verir.

Doğrulama: Tüm kod parçaları JDK 26 ile çalıştırıldı (verify/SEN1001/W02a.java). Derleme hataları verify/SEN1001/err/Narrow.java ve Uninit.java javac ile derlenerek alındı. printf çıktıları en_US yerel ayarında (locale) alındı.

Deftere not kartı

Tanım: tip ad = değer; int x = 5; double d = 2.5; char c = 'A'; boolean b = true; 8 primitive: byte short int long float double char boolean (String primitive DEĞİL) int ±2.1 milyar · long 100L · float 2.5f · double varsayılan ondalık Değer atanmamış yerel değişken kullanılamaz → "might not have been initialized" Genişletme otomatik: int → long → double int x; double d = x; ✔ Daraltma cast ister: int i = (int) 9.99; → 9 (KESER, yuvarlamaz) (int) v * 2 → önce cast (int)(v * 2) → önce çarpım char + int = int: 'A'+1 = 66 (char)('A'+1) = 'B' 'a'+'b' = 195 ""+'a'+'b' = "ab" A=65 a=97 '0'=48 MAX_VALUE + 1 → MIN_VALUE (overflow, hata yok) printf: %d int %f double (6 basamak) %.2f 2 basamak YUVARLAR %s String %c char %b boolean %n satır sonu %5d sağa yasla (genişlik 5) %-5d sola yasla Takas: temp = a; a = b; b = temp;