Bölüm 2.1: Programlama

Java ile Nesne Yönelimli Programlama
Programlama dilleriDerleme ve yorumlamaParadigmalarSöz dizimi ve anlam Hata türleriİfadeler ve öncelikDeğişkenler ve atamaStatik ve dinamik tipleme Dizgiler ve tiplerAlgoritmadan programa
Sercan KÜLCÜ · Giresun Üniversitesi · Elektrik-Elektronik Mühendisliği

Giriş

Öğrenme Çıktıları

Programlama dilleri

Programlama dilini tanımlamak; dilleri soyutlama düzeyi, uygulama alanı, yürütme biçimi ve paradigmaya göre sınıflandırmak.

Java'nın çalışması

Kaynak kodun javac ile bytecode'a derlenip JVM'de çalıştırılmasını açıklamak.

Söz dizimi ve anlam

Söz dizimi, statik anlam ve anlam kavramlarını ayırmak; derleme, çalışma zamanı ve mantık hatalarını tanımak.

İfadeler

İşleç önceliği, soldan sağa değerlendirme ve tam sayı bölmesiyle bir ifadenin değerini bulmak.

Değişkenler ve tipler

Değişken tanımlamak, atamayı iki adımda izlemek; statik ve dinamik tiplemeyi, tipler arası işlemleri açıklamak.

Algoritmadan programa

İfade ile deyimi ayırt etmek; bir algoritmayı Java programına çevirmek ve deyim sırasının önemini göstermek.

Giriş

Bu Bölümün Amacı

1Dilin yapı taşlarıBir programlama dilinin temel yapı taşlarını, söz dizimini (syntax) ve anlamını (semantics) öğrenmek.
2Tarifi çevirmekBir problemin çözüm tarifini, bu yapı taşlarıyla bilgisayarın anlayacağı bir biçime, yani programa dönüştürmek.
3Hesaplamalı düşünmeBir problemi çözmek için ayrıştırma, örüntü bulma, soyutlama ve algoritma tasarımı gibi yöntemleri bir arada kullanabilmek.
Bu bölüm, her programlama dilinde ortak olan kavramları Java örnekleriyle tanıtır.

Programlama Dilleri

Programlama Dili Nedir?

  • Programlama dili (programming language): bir makinenin yapabileceği hesaplamaları ifade etmek için tasarlanmış yapay bir dildir.
  • Makinenin davranışını kontrol eden programlar yazmak için kullanılır:
    • algoritmaları açık ve kesin biçimde ifade etmek için,
    • programcılar arasında bir iletişim aracı olarak.
  • Bilgisayarlara, telefonlara ve gömülü cihazlara işlevsellik kazandırır.
  • Soyutlama düzeyine göre: makine dili ve assembly düşük düzeyli; Java, Python yüksek düzeyli.
  • Dil seçimi projenin ihtiyaçlarına göre yapılır.
  • Örnekler: C, C++, Java, Python, Prolog, Haskell, Scala…
Probleminsan dilinde tariftasarlaAlgoritmakesin adımlar dizisikodlaProgramJava gibi bir dilde kodçalıştırMakinekomutları çalıştırır

Programlama Dilleri

Genel Amaçlı ve Hedefe Odaklı

  • Diller, uygulama alanına göre genel amaçlı (general-purpose) ya da hedefe odaklı (targeted, domain-specific) olabilir.

Genel amaçlı

  • Çok çeşitli uygulamaları destekleyen geniş bir temel komut kümesi.
  • Java, C, C++, Python: masaüstü, web, mobil, gömülü sistem…

Hedefe odaklı

  • Belirli bir uygulama türüne odaklanır, o işlemleri kolaylaştırır.
  • MATLAB: sayısal hesaplama; matris ve vektör işlemleri optimize. SQL: veri tabanı sorguları.

MATLAB · matris çarpımı

C = A * B;   % tek satır

Java · aynı iş, elle yazılan döngüler

for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
        for (int k = 0; k < n; k++)
            C[i][j] += A[i][k] * B[k][j];

Programlama Dilleri

Derlenen ve Yorumlanan Diller

Diller, kodun yürütülme biçimine göre derlenen (compiled) ve yorumlanan (interpreted) olarak sınıflandırılır.

Derlenen dil (C, C++, Go, Rust)

Kaynak kodDerleyicitek seferde çevirirMakine koduçalıştırılabilir dosyaÇalıştır

Yorumlanan dil (Python, JavaScript)

Kaynak kodYorumlayıcısatır satır oku ve yapÇıktı
DerlenenYorumlanan
Nasıl?Tüm kaynak kod, çalıştırılmadan önce derleyiciyle nesne (object) / makine koduna çevrilir.Yorumlayıcı kaynak kodu okur ve komutları sırayla o anda çalıştırır.
HızHızlı ve optimize yürütmeGenellikle daha yavaş
HatalarBirçoğu derleme sırasında bulunurÇoğu ancak o satır çalışınca görülür

Java ikisini birleştirir: javac → bytecode (.class) → JVM (yorum + JIT).

Programlama Dilleri

Programlama Paradigmaları

Paradigma (paradigm): bir problemi çözerken izlenen temel yaklaşım. Diller, problemi farklı yaklaşımlarla çözebilir.

Buyruksal (imperative)Programcı makineye, durumunu nasıl değiştireceğini adım adım söyler. FORTRAN, BASIC, Pascal, C…
xfyFonksiyonel (functional)Hesaplamayı matematiksel fonksiyonların değerlendirilmesi olarak ele alır; durum değiştirmekten kaçınır. Lisp, Scheme, Haskell…
olgukural?Mantıksal (logic)Hesaplamanın mantığını (olgular ve kurallar) açıklar; kontrol akışını ayrıntılandırmaz. Prolog
nesneverimetot()Nesne yönelimli (object-oriented)İlişkili veri ve metotları bir nesne altında toplar; komutlar, üzerinde çalıştıkları durumla birlikte gruplanır. C++, Java, C#, Python…
Java temelde nesne yönelimli ve buyruksaldır; Java 8'den beri fonksiyonel öğeler (lambda, akışlar) de içerir. Birden çok paradigmayı destekleyen dillere çok paradigmalı denir.

Programlama Dilleri

Aynı Problem: Buyruksal ve Fonksiyonel

Problem: 1'den 5'e kadar sayıların toplamını bul.

import java.util.stream.IntStream;

public class Paradigma {
    public static void main(String[] args) {
        // Buyruksal: adım adım durum değiştir
        int toplam = 0;
        for (int i = 1; i <= 5; i++) {
            toplam = toplam + i;
        }
        System.out.println("Buyruksal: " + toplam);

        // Fonksiyonel (Java 8+): ne istediğini söyle
        int sonuc = IntStream.rangeClosed(1, 5).sum();
        System.out.println("Fonksiyonel: " + sonuc);
    }
}

Çıktı

Buyruksal: 15
Fonksiyonel: 15
  • Buyruksal: toplam değişkeni her adımda değiştirilir; “nasıl” yapılacağı yazılır.
  • Fonksiyonel: “1..5 aralığının toplamı” istenir; değişken güncellenmez.

Programlama Dilleri · Adım adım kod izleme

Buyruksal ve Fonksiyonel: Kod İzleme

i değerleri12345toplam0

Buyruksal yaklaşımda toplam adlı bir durum değişkeni 0 ile başlar.

i değerleri12345toplam10 + 1 = 1

i = 1: 1 <= 5 doğru → toplam = 0 + 1 = 1. Durum her turda değişir.

i değerleri12345toplam31 + 2 = 3

i = 2: 2 <= 5 doğru → toplam = 1 + 2 = 3.

i değerleri12345toplam63 + 3 = 6

i = 3: 3 <= 5 doğru → toplam = 3 + 3 = 6.

i değerleri12345toplam106 + 4 = 10

i = 4: 4 <= 5 doğru → toplam = 6 + 4 = 10.

i değerleri12345toplam1510 + 5 = 15

i = 5: 5 <= 5 doğru → toplam = 10 + 5 = 15.

i değerleri12345toplam15

i 6 oldu: 6 <= 5 yanlış → döngü biter.

i değerleri12345toplam15

Sonuç yazdırılır: beş turda biriken toplam 15.

i değerleri12345rangeClosed(1, 5).sum() → 15

Fonksiyonel: rangeClosed(1, 5) 1…5 sayılarını üretir, sum() hepsini toplar. Hiçbir değişken adım adım güncellenmez.

i değerleri12345rangeClosed(1, 5).sum() → 15

İki yaklaşım aynı sonucu verir; fark, nasıl yapılacağını mı yoksa ne istendiğini mi yazdığımızdadır.

int toplam = 0;
for (int i = 1; i <= 5; i++) {
    toplam = toplam + i;
}
System.out.println("Buyruksal: " + toplam);

int sonuc = IntStream.rangeClosed(1, 5).sum();
System.out.println("Fonksiyonel: " + sonuc);

Programlama Dilleri

Mantıksal ve Nesne Yönelimli

Mantıksal · Prolog

% olgular
ebeveyn(ali, ayse).
ebeveyn(ayse, can).
% kural
dede(X, Z) :- ebeveyn(X, Y),
              ebeveyn(Y, Z).
% sorgu
?- dede(ali, can).
true.

Yalnızca olgular ve bir kural verilir; sorunun nasıl çözüleceğine (arama sırasına) Prolog kendisi karar verir.

Dikdortgen nesnesi hem veriyi (en, boy) hem de o veri üzerinde çalışan metodu (alan()) taşır.

Nesne yönelimli · Java

public class Dikdortgen {
    double en, boy;          // veri (durum)

    Dikdortgen(double en, double boy) {
        this.en = en;
        this.boy = boy;
    }

    double alan() {          // davranış
        return en * boy;
    }

    public static void main(String[] args) {
        Dikdortgen d = new Dikdortgen(3, 4);
        System.out.println("Alan: " + d.alan());
    }
}

Çıktı

Alan: 12.0

Programlama Dilleri · Adım adım kod izleme

Nesne Yönelimli: Kod İzleme

Yığın (stack)Heapmaind—

main çalışmaya başlar. Yığında main çerçevesi var; d henüz bir nesneyi göstermiyor.

Yığın (stack)Heapmaind—Dikdortgen(…)this = •en = 3.0boy = 4.0Dikdortgenen = 0.0boy = 0.0

new heap'te nesneye yer ayırır; alanlar varsayılan 0.0. Yapıcı çağrılır: 3 ve 4, double'a genişletilir.

Yığın (stack)Heapmaind—Dikdortgen(…)this = •en = 3.0boy = 4.0Dikdortgenen = 3.0boy = 0.0

this.en nesnenin alanıdır, sağdaki en parametredir: alan 3.0 olur.

Yığın (stack)Heapmaind—Dikdortgen(…)this = •en = 3.0boy = 4.0Dikdortgenen = 3.0boy = 4.0

boy alanı 4.0 olur. Yapıcı biter, çerçevesi yığından kalkar.

Yığın (stack)Heapmaind•Dikdortgenen = 3.0boy = 4.0

new ifadesinin değeri nesnenin referansıdır; d artık bu nesneyi gösterir.

Yığın (stack)Heapmaind•alan()this = •Dikdortgenen = 3.0boy = 4.0

d.alan(): this ile d aynı nesneyi gösterir. en * boy = 3.0 × 4.0 = 12.0 döndürülür.

Yığın (stack)Heapmaind•Dikdortgenen = 3.0boy = 4.0

Dönen 12.0 dizgiyle birleştirilir: Alan: 12.0. Veri (en, boy) ve davranış (alan) aynı nesnede durur.

public class Dikdortgen {
    double en, boy;
    Dikdortgen(double en, double boy) {
        this.en = en;
        this.boy = boy;
    }
    double alan() {
        return en * boy;
    }
    public static void main(String[] args) {
        Dikdortgen d = new Dikdortgen(3, 4);
        System.out.println("Alan: " + d.alan());
    }
}

Söz Dizimi ve Anlam

Temel Yapılar ve Söz Dizimi

Programlama dilleri ile doğal diller birçok ortak yön paylaşır.

Türkçe (doğal dil)Java (programlama dili)
Temel yapılarkelimeler, noktalama işaretlerisayılar, dizgiler, basit işleçler (+ - * /), anahtar sözcükler
Söz dizimi (syntax)“kedi köpek çocuk”: kelimeler doğru ama cümle kuruluşu yok → geçersizhangi karakter ve sembol dizilerinin düzgün olduğunu belirler

Söz dizimi dilin kurallarını belirler ve dilin anlaşılırlığını etkiler. Derleyici, kurala uymayan bir sembol dizisini kabul etmez:

✓ Geçerli

int x = 5;

✗ Geçersiz: sıralama yanlış

int = x 5;
Hata.java:3: error: not a statement
        int = x 5;
        ^
...
4 errors

Söz Dizimi ve Anlam

Statik Anlam

  • Statik anlam (static semantics): söz dizimi doğru olan bir ifadenin anlamlı olup olmadığını, program çalışmadan önce denetler.
  • İngilizce: “I are big” biçim olarak <isim> <fiil> <isim> kalıbına uyar; ama “I” tekil, “are” çoğuldur → dil açısından geçersiz.
  • Java: <değer> <işleç> <değer> geçerli bir kalıptır; ama bir sayıyı bir dizgiye bölmenin anlamı yoktur → statik anlam hatası.
double sonuc = 2.3 / "abc";
error: bad operand types for binary operator '/'
  first type:  double
  second type: String
int x = "beş";
error: incompatible types:
  String cannot be converted to int
Kaynak kodHata.javaSöz dizimiint = x 5;Statik anlamint x = "beş";Çalışma (anlam)(a + b) / 2
Java statik tipli bir dildir: derleyici her işlecin işlenenlerinin tipini denetler. Bu tür hatalar program hiç çalışmadan yakalanır.

Söz Dizimi ve Anlam

Anlam (Semantics)

  • Anlam (semantics): söz dizimi doğru bir ifadenin ne anlama geldiğini belirler.
  • Doğal dillerde çok anlamlılık olabilir: “They saw the man with the telescope.”
    • adamı teleskopla gördüler, ya da
    • teleskobu olan adamı gördüler.
  • Programlama dilinde her geçerli ifadenin tek bir anlamı vardır.
  • Ancak bu anlam, programcının beklediği şey olmayabilir: yanlış bir işlem beklenmeyen bir sonuç üretir.
int a = 7, b = 8;
int ortalama = (a + b) / 2;
System.out.println(ortalama);       // 7.5 beklenirken
System.out.println(a + b / 2);      // öncelik
System.out.println((a + b) / 2.0);  // doğru

Çıktı

7
11
7.5

7 ile 8'in ortalaması 7.5'tir. İlk satır tam sayı bölmesi yapar, ikinci satırda / işlemi +'dan önce yapılır. Derleyici bu satırlarda hata görmez.

Söz Dizimi ve Anlam · Adım adım kod izleme

Anlam Hatası: Kod İzleme

/+2a7b8

a = 7, b = 8; ikisi de int. Ağaç, (a + b) / 2 ifadesinin yapısını gösterir.

/+152a7b8

Parantez önce: a + b = 15 (int).

/7+152a7b8

15 / 2: iki işlenen de int → tam sayı bölmesi, kesir atılır: 7.

/7+152a7b8

7 yazılır. Program hatasız çalıştı ama anlamı beklenenden farklı.

+a7/4b82

Parantez yok: / önceliği + işlecinden yüksek. Önce b / 2 = 4.

+11a7/4b82

Sonra 7 + 4 = 11 yazılır.

/7.5+152.0a7b8

2.0 bir double: 15 de double'a genişletilir, 15 / 2.0 = 7.5.

int a = 7, b = 8;
int ortalama = (a + b) / 2;
System.out.println(ortalama);       // 7.5 değil
System.out.println(a + b / 2);      // öncelik
System.out.println((a + b) / 2.0);  // doğru

Söz Dizimi ve Anlam

Neler Yanlış Gidebilir?

Hata türüNe zaman fark edilir?Java örneğiBelirti
Söz dizimiderlemede (derleyici)System.out.println("Merhaba")';' expected
Statik anlamderlemede (tip denetimi)int x = "beş";incompatible types
Çalışma zamanıprogram çalışırkena / b (b sıfırken)çökme: ArithmeticException
Mantıkderleyici fark etmez; ancak testle(a + b) / 2 ile ortalamayanlış sonuç, sonsuz döngü
  • Söz dizimi hataları yazım hataları gibi açıkça tanımlanmış kurallara aykırılıktır; bilgisayar tarafından kolayca tespit edilir.
  • Statik anlam hataları program çalışmadan önce dile özgü denetimlerle aranır. Bu denetimi zayıf olan dillerde yakalanmayan hatalar programın davranışını öngörülemez kılar.
  • Söz dizimi ve statik anlam açısından kusursuz bir program bile beklenen sonucu üretmeyebilir: çöker, sonsuz döngüye girer ya da istenmeyen bir sonuç verir.

Söz Dizimi ve Anlam

Hata Mesajlarını Okumak

Derleme hatası

public class Selam {
    public static void main(String[] args) {
        System.out.println("Merhaba")
    }
}
Selam.java:3: error: ';' expected
        System.out.println("Merhaba")
                                     ^
1 error
  • Selam.java:3: dosya ve satır numarası
  • error: ';' expected: ne bekleniyordu
  • ^ işareti: hatanın konumu
  • Hata varsa .class dosyası oluşmaz; program hiç çalışmaz.

Çalışma zamanı hatası (istisna)

public class Bolme {
    public static void main(String[] args) {
        int a = 10, b = 0;
        System.out.println(a / b);
    }
}
Exception in thread "main"
java.lang.ArithmeticException: / by zero
	at Bolme.main(Bolme.java:4)
  • Kod derlenir, ama çalışırken istisna (exception) fırlatılır.
  • / by zero: tam sayı sıfıra bölünemez.
  • (Bolme.java:4): hatanın oluştuğu satır.
  • İstisna try-catch ile yakalanmazsa program bu satırda sonlanır.

Birden çok hata listelendiğinde düzeltmeye ilkinden başlanır; sonrakiler çoğu zaman ilk hatanın yan etkisidir.

İfadeler ve Değişkenler · Adım adım

İfade Değerlendirme Adım Adım

Bilgisayar bir ifadeyi tek seferde değil, öncelik kurallarına göre adım adım sadeleştirir.

(72 - 32) / 9 * 5

Önce parantez içi hesaplanır: 72 − 32 = 40.

40 / 9 * 5

/ ile * aynı önceliktedir → soldan sağa: önce 40 / 9.

4 * 5 (40 / 9 = 4, kalan 4 atıldı)

İki işlenen de int → tam sayı bölmesi: 4.44… değil, 4.

20

Sonuç 20. Matematiksel olarak beklenen 22.22… idi: bir anlam (mantık) hatası.

(72.0 - 32) / 9 * 5

Şimdi 72.0 yazalım: double − int işleminde int önce double'a genişletilir; sonuç 40.0.

40.0 / 9 * 5

40.0 / 9 artık gerçek bölmedir: 4.444444444444445.

4.444444444444445 * 5

Çarpma: double × int → double.

22.22222222222222

Doğru sonuç. Ondalıklı sonuç gerekiyorsa işlenenlerden en az biri double olmalıdır.

×/5−972321.2.3.

İfade ağacı: alttaki işlem önce yapılır; numaralar işlem sırasıdır.

İfadeler ve Değişkenler

Dinamik ve Statik Tipleme

Dinamik tipli diller (Python, JavaScript)

  • Değişkenin tipi önceden belirtilmez; değer atanınca belirlenir.
  • Tip çalışma zamanında değişebilir.
  • Esneklik sağlar, ama hatalar ancak çalışırken ortaya çıkar.

Statik tipli diller (Java, C, C#)

  • Değişkenin tipi açıkça belirtilir ve değişmez.
  • Dizgi ile tam sayı gibi uyumsuz işlemler derleme zamanında hata olarak bulunur.
  • Daha güvenli; derleyici hızlı kod üretebilir.

Python

x = 5          # x şimdi int
x = "beş"      # artık str: sorun yok
print(x + 1)   # çalışırken:
# TypeError: can only concatenate
#   str (not "int") to str

Java

int x = 5;
x = "beş";     // derlenmez:
// error: incompatible types:
//   String cannot be converted to int

Java 10+: var adet = 3; tipi yazmadan tanımlar, ama tip yine derlemede (int olarak) sabitlenir; Java statik tipli kalır.

Dizgiler ve Tipler

Farklı Tipler Karşılaştırılmamalıdır

  • Farklı veri tiplerini doğrudan karşılaştırmak hataya yol açar: bir tam sayı ile bir dizgi karşılaştırılamaz.
  • Diller, tiplerin karşılaştırılması için kurallar ve tip dönüşümü (type conversion) yolları tanımlar.

✗ Doğrudan karşılaştırma

int sayi = 5;
String metin = "5";
boolean b = sayi == metin;
error: bad operand types for binary operator '=='
  first type:  int
  second type: String

✓ Önce aynı tipe dönüştür

int sayi = 5;
String metin = "5";
System.out.println(Integer.parseInt(metin) == sayi);
System.out.println(metin.equals(String.valueOf(sayi)));
System.out.println(metin.equals(sayi));
true
true
false

metin.equals(sayi) derlenir ama her zaman false döndürür: String hiçbir zaman bir Integer'a eşit değildir. Dizgiler == ile değil equals ile karşılaştırılır.

Dizgiler ve Tipler

Farklı Tiplerde İşlemler

İşlemler farklı tipler üzerinde farklı davranır: dizgiler üzerinde + toplama değil birleştirmedir (concatenation).

İfadeJava sonucuTipiAçıklama
3.0 + 4.07.0doubleiki ondalıklı sayı
3 + 47intiki tam sayı
3 + 4.07.0doubleint otomatik olarak double'a genişletilir (widening)
"3" + "4""34"Stringbirleştirme
3 + "4""34"Stringbir taraf dizgiyse diğeri dizgiye çevrilir. Hata değildir (Python'da TypeError)
3 + truederlenmez—bad operand types for binary operator '+'
'a' + 198intchar bir sayısal koddur ('a' = 97)

Farklı tipler arasında işlem, dilin kuralları bilinmiyorsa beklenmeyen sonuçlara ya da hatalara yol açar. Java'da bu kurallar kesindir ve derleyici uygular.

Program ve Algoritma · Adım adım kod izleme

Bir Program Nedir? Sıra Önemlidir

Program bir talimatlar dizisidir; bilgisayar talimatları birer birer ve sırayla işler. Bu yüzden işlem sırasını doğru belirlemek önemlidir.

a3b5

Amaç: a ile b'nin değerlerini takas etmek (yer değiştirmek).

a5b5

a = b: a'ya 5 yazılır. a'nın eski değeri 3 kayboldu!

a5b5

b = a: b'ye a'nın şimdiki değeri (5) yazılır.

a5b5

Çıktı 5 5: takas başarısız. Deyimlerin sırası sonucu belirler.

c3d5gecici?

Doğru yöntem: üçüncü bir geçici değişken.

c3d5gecici3

c'nin değeri önce gecici'de saklanır.

c5d5gecici3

Artık c'nin üzerine yazılabilir: c = 5.

c5d3gecici3

d'ye saklanan eski c değeri (3) yazılır.

c5d3gecici3

Çıktı 5 3: takas başarılı.

int a = 3, b = 5;
a = b;
b = a;
System.out.println(a + " " + b);

int c = 3, d = 5;
int gecici = c;
c = d;
d = gecici;
System.out.println(c + " " + d);

Program ve Algoritma

İfadeler, Deyimler ve Programlar

İfade (expression) → değerBir değeri hesaplar ve sonucunu döndürür: 3 + 4 ifadesinin değeri 7'dir.
Deyim (statement) → etkiBir etki yaratır: pi = 3.14159; değişkene değer atar, System.out.println(pi); ekrana yazar. Java'da deyimler ; ile biter.
İfadeler iç içe geçebilirBir ifade, başka ifadelerin ve deyimlerin içinde yer alabilir: double alan = pi * r * r;
Program = deyimler dizisiBir program, sırayla çalışan birçok deyimden oluşur.

Bir deyim, bir ifadenin içinde yer alamaz. println ekrana yazar (etki) ama bir değer döndürmez (void):

double d = 3 + System.out.println(pi);
error: 'void' type not allowed here
3 + 4;      // değer üretir ama etkisi yok
error: not a statement

Java'da atama da bir değer üretir: int y = (x = 4) + 1; → x = 4, y = 5. Derlenir ama okunması zor olduğundan tercih edilmez.

Popüler Diller

Popüler Programlama Dilleri

  • Programlama dilleri farklı görevler için farklı avantajlar sunar.
  • Programcılar, projenin ihtiyaçlarına göre en uygun dili seçer.
  • Dillerin popülerliği her yıl anketler ve dizinlerle (Stack Overflow anketi, TIOBE, IEEE Spectrum) değerlendirilir.
  • 2023'te öne çıkan dillerden bazıları yandaki tabloda.
DilÖne çıktığı alan
Pythonveri analizi, yapay zekâ, web geliştirme
Javabüyük ölçekli kurumsal uygulamalar, Android
JavaScriptweb tarayıcıları, web geliştirme
C#Windows uygulamaları, oyun geliştirme
C++oyun, sistem programlama, performans odaklı yazılım
Rustgüvenli ve hızlı sistem programlama
SwiftApple platformlarında uygulama geliştirme
KotlinAndroid uygulama geliştirme (JVM üzerinde çalışır)
Go (Golang)basit ve etkili; ağ ve bulut uygulamaları

Özet

Özet

KonuHatırlanacaklar
Dil sınıflarıdüşük / yüksek düzey; genel amaçlı / hedefe odaklı; derlenen / yorumlanan
Javajavac → bytecode (.class) → JVM (yorum + JIT); “bir kez yaz, her yerde çalıştır”
Paradigmalarbuyruksal, fonksiyonel, mantıksal, nesne yönelimli; Java: nesne yönelimli + buyruksal
Söz dizimi / anlamsöz dizimi: biçim; statik anlam: derlemede tip denetimi; anlam: tek ve kesin, ama beklenen olmayabilir
Hata türlerisöz dizimi ve statik anlam (derleme), çalışma zamanı (istisna), mantık (yanlış sonuç)
İfadelerparantez → * / % → + -, soldan sağa; int / int tam sayı bölmesi; üs için Math.pow
Değişken ve atamatip + ad; önce sağ taraf hesaplanır, sonra yazılır; = atama, == karşılaştırma
TiplerJava statik tipli; int + double → double; dizgi + herhangi → birleştirme
Programönce algoritma, sonra kod; ifade değer üretir, deyim etki yaratır; deyimler sırayla çalışır

Özet

Sık Yapılan Hatalar

Noktalı virgülü unutmakSystem.out.println("Merhaba") → ';' expected. javac, ^ ile ; eksik satırın sonunu gösterir.
= ile == karıştırmakif (x = 100) → int cannot be converted to boolean. Karşılaştırma =='dir.
Tam sayı bölmesi(a + b) / 2 ile 7 ve 8'in ortalaması 7 çıkar. Gerçek bölme için / 2.0 gerekir.
Üs için ** ya da ^2 ** 3 → illegal start of expression; 2 ^ 3 derlenir ama XOR'dur (1). Doğrusu Math.pow(2, 3).
Dizgi + sayı sırası"Toplam: " + 2 + 3 → Toplam: 23. Toplama için "Toplam: " + (2 + 3).
Büyük/küçük harfSayi tanımlayıp sayi kullanmak → cannot find symbol. Java harf duyarlıdır.
Değer atamadan kullanmakint s; System.out.println(s); → variable s might not have been initialized.
Ondalık ayırıcıTürkçe bölge ayarlı bilgisayarda nextDouble() girdisi 7,5 biçimindedir; 7.5 yazmak InputMismatchException verir.

Özet

Örnek Problemler

  1. Değerlerini bulun: (a) 10 + 6 / 4 * 2 (b) (10 + 6) / 4 * 2 (c) 10 + 6 / 4.0 * 2
  2. Çıktıları nedir? System.out.println("Toplam: " + 2 + 3); ve System.out.println(2 + 3 + " toplam");
  3. Kod çalıştıktan sonra a ve b kaçtır? int a = 4; int b = a * 3; a = b - a; b = b / a;
  4. Hata türünü söyleyin: (a) int n = 4.5; (b) System.out.println("Merhaba"; (c) dairenin alanı için alan = 2 * pi * r;
  5. double c = (f - 32) * 5 / 9; ile f = 100 için sonuç nedir? f ve c int olsaydı?
Cevapları göster
  1. (a) 6 / 4 = 1, 1 * 2 = 2 → 12 (b) 16 / 4 = 4, 4 * 2 → 8 (c) 6 / 4.0 = 1.5, × 2 = 3.0 → 13.0
  2. Toplam: 23 (soldan sağa birleştirme) ve 5 toplam (önce iki int toplanır).
  3. b = 12, a = 12 − 4 = 8, b = 12 / 8 = 1 (tam sayı bölmesi) → a = 8, b = 1.
  4. (a) statik anlam: possible lossy conversion from double to int (b) söz dizimi: ')' or ',' expected (c) mantık hatası: derlenir ama çevreyi hesaplar; doğrusu pi * r * r.
  5. 68 × 5 / 9 = 37.77777777777778. int ile: 340 / 9 = 37 (kesir atılır).

Özet

Alıştırmalar

  1. Değerlerini ve tiplerini yazın: 7 % 3, -7 / 2, 1 / 3 * 3, 1.0 / 3 * 3, Math.pow(2, 10).
  2. Hangileri geçerli değişken adıdır? toplam2, 2toplam, _sayac, ogrenci sayisi, $fiyat, int, ortalamaNot
  3. Kullanıcıdan Fahrenhayt değeri okuyup Celsius'a çeviren programın önce algoritmasını, sonra Java kodunu yazın.
  4. Şunları ifade ya da deyim olarak sınıflandırın: x * 2, x = 5;, x > 3, System.out.println(x);
  5. 5 / 9 * (f - 32) ifadesi int f = 100 için neden 0 verir? İki farklı biçimde düzeltin.
Cevaplar / ipuçları
  1. 1 (int), -3 (int, sıfıra doğru kesilir), 0 (int: 1 / 3 = 0), 1.0 (double), 1024.0 (double).
  2. Geçerli: toplam2, _sayac, $fiyat, ortalamaNot. Geçersiz: 2toplam (rakamla başlar), ogrenci sayisi (boşluk), int (anahtar sözcük).
  3. Oku → c = (f - 32) * 5 / 9 → yazdır; double f = giris.nextDouble();. 100 → 37.77777777777778.
  4. İfadeler: x * 2, x > 3 (değer üretir). Deyimler: x = 5;, System.out.println(x); (etki yaratır).
  5. 5 / 9 tam sayı bölmesiyle 0'dır, 0 × 68 = 0. Çözüm: 5.0 / 9 * (f - 32) ya da (f - 32) * 5 / 9 (önce çarpma: 37).

Özet

Kaynaklar

  • Oracle, The Java Tutorials: “Language Basics” (değişkenler, işleçler, ifadeler, deyimler ve bloklar).
  • J. Gosling ve diğerleri, The Java Language Specification, Java SE 21 Edition, Oracle, 2023 (Bölüm 3: Sözcük yapısı, Bölüm 15: İfadeler).
  • P. Deitel ve H. Deitel, Java: How to Program, Early Objects, 11. baskı, Pearson, 2017 (Bölüm 1–2).
  • A. B. Downey ve C. Mayfield, Think Java: How to Think Like a Computer Scientist, 2. baskı, O'Reilly, 2019 (Bölüm 1–2).
  • K. Sierra ve B. Bates, Head First Java, 3. baskı, O'Reilly, 2022.
  • C. S. Horstmann, Core Java, Volume I: Fundamentals, 12. baskı, Pearson, 2022 (Bölüm 2–3).
  • J. Guttag, Introduction to Computation and Programming Using Python, 3. baskı, MIT Press, 2021 (Bölüm 2: söz dizimi, statik anlam ve anlam).

Son

Bölüm 2.1: Programlama
Sonraki bölüm: Bölüm 2.2: Söz Dizimi Kuralları · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.