7. Metotlar

Java’nin Temelleri

Teknik Kitap Yazarı

2025-04-09

7. Metotlar

Bölüm 7: Algoritmik Problem Cozme Desenleri

7.1 Algoritmik Düşünmenin Temelleri ve Akış Şeması Yaklaşımı

Algoritma Nedir? Günlük Hayattan Algoritma Örnekleri

Algoritma, bir problemi çözmek veya belirli bir hedefe ulaşmak için izlenen adım adım, sıralı ve kesin talimatlar bütünüdür. Günlük hayatta farkında olmadan sürekli algoritmalar kullanırız. Örneğin, bir yemek tarifi, bir mobilyayı kurma kılavuzu veya bir yol tarifi, aslında birer algoritmadır.

Günlük Hayattan Algoritma Örnekleri:

  • Çay Demleme Algoritması:
    1. Su ısıtıcısını çalıştır.
    2. Su kaynayana kadar bekle.
    3. Demliğe çay koy.
    4. Kaynayan suyu demliğe ekle.
    5. 5 dakika demlenmeye bırak.
    6. Çayı bardağa doldur.
  • ATM’den Para Çekme Algoritması:
    1. Kartı tak.
    2. Şifreyi gir.
    3. İşlem türünü seç (Para Çekme).
    4. Çekilecek miktarı gir.
    5. Onayla.
    6. Parayı al.
    7. Kartı geri al.

Pedagojik Kutu: Algoritmaların günlük hayattaki varlığını anlamak, soyut kavramları somutlaştırmanın ilk adımıdır. Öğrenciler, kendi günlük rutinlerinden algoritma örnekleri çıkarmaya teşvik edilmelidir.

Problem Çözme Sürecinin Aşamaları: Anlama → Planlama → Uygulama → Değerlendirme

Bir problemi algoritmik olarak çözmek için sistematik bir yaklaşım izlemek gerekir. Bu süreç dört temel aşamadan oluşur:

  1. Anlama: Problemi dikkatlice okuyun, girdileri ve çıktıları belirleyin. “Problem tam olarak ne istiyor?” sorusuna cevap verin.
  2. Planlama: Problemi çözmek için bir yol haritası oluşturun. Adımları sıralayın, gerekirse akış şeması veya sözde kod kullanın.
  3. Uygulama: Planladığınız adımları bir programlama dilinde (örneğin Java) kodlayın.
  4. Değerlendirme: Kodunuzu farklı test senaryolarıyla çalıştırın. Beklenen çıktıları alıp almadığınızı kontrol edin. Varsa hataları düzeltin (debugging).

Pedagojik Kutu: Bu dört aşamalı döngü, profesyonel yazılım geliştirme süreçlerinin temelidir. Özellikle “Anlama” aşaması, yeni başlayanların en çok atladığı ama en kritik olan aşamadır.

Akış Şeması Sembolleri ve Anlamları

Akış şeması, bir algoritmanın adımlarını görsel olarak temsil eden bir diyagramdır. Standart semboller kullanarak algoritmanın mantığını anlaşılır kılar.

Sembol İsim Anlamı
Başlangıç/Bitiş Başlangıç/Bitiş Algoritmanın başladığı veya bittiği noktayı belirtir.
İşlem İşlem Bir hesaplama, atama veya değer değiştirme gibi bir eylemi temsil eder.
Karar Karar Bir koşula bağlı olarak (Evet/Hayır) iki farklı yola ayrılmayı sağlar.
Girdi/Çıktı Girdi/Çıktı Kullanıcıdan veri okumayı (girdi) veya sonucu ekrana yazdırmayı (çıktı) temsil eder.
Ok Akış Yönü Adımlar arasındaki sırayı ve yönü gösterir.

Akış Şeması ile Algoritma İfade Etmenin Avantajları

  • Görsellik: Karmaşık mantığı basit ve anlaşılır bir şekilde görselleştirir.
  • Kolay İletişim: Programcı olmayan kişilerle bile algoritmanın mantığını paylaşmayı kolaylaştırır.
  • Hata Ayıklama: Algoritmadaki mantıksal hataları görmeyi ve düzeltmeyi kolaylaştırır.
  • Dilden Bağımsız: Herhangi bir programlama diline bağımlı olmadan algoritmayı tasarlamaya olanak tanır.

Kod Örneği: Akış Şemasından Java Koduna Dönüşüm

Problem: Kullanıcıdan bir sayı alıp ekrana yazdıran algoritmayı akış şeması ile gösterip Java koduna dönüştürün.

Akış Şeması (Sözel Anlatım):

  1. Başla
  2. Girdi: Kullanıcıdan bir sayı oku (sayi)
  3. İşlem: sayi değişkenine okunan değeri ata
  4. Çıktı: “Girilen sayı:” + sayi metnini yazdır
  5. Bitir

Java Kodu:

// Dil: Java
// Açıklama: Kullanıcıdan bir sayı alıp ekrana yazdıran basit bir program.
// Karmaşıklık: O(1)

import java.util.Scanner;

public class SayiOkuYazdir {
    public static void main(String[] args) {
        // 1. Başla (main metodu çalışmaya başlar)
        Scanner input = new Scanner(System.in);

        // 2. Girdi: Kullanıcıdan bir sayı oku
        System.out.print("Bir sayı giriniz: ");
        int sayi = input.nextInt(); // sayi değişkenine okunan değeri ata

        // 3. Çıktı: Sonucu yazdır
        System.out.println("Girilen sayı: " + sayi);

        // 4. Bitir (main metodu sonlanır)
        input.close();
    }
}

Uygulama: Bir öğrencinin vize ve final notlarını alıp, ortalamasını (vize %40, final %60) hesaplayan ve geçip geçmediğini (ortalama >= 60) söyleyen bir algoritmanın akış şemasını çiziniz.

Pedagojik Kutu: Bu uygulama, öğrencilerin hem akış şeması sembollerini (karar, işlem, girdi/çıktı) kullanmalarını hem de gerçek bir problemi modellemelerini sağlar.

7.2 Doğrusal Arama (Linear Search) Deseni

Doğrusal Aramanın Temel Mantığı: Sıralı Kontrol Etme

Doğrusal arama, bir listede belirli bir elemanı bulmak için kullanılan en basit arama algoritmasıdır. Listenin başından sonuna kadar sırayla her bir elemanı kontrol eder. Aranan eleman bulunduğunda arama durur; listenin sonuna kadar bulunamazsa, elemanın listede olmadığı sonucuna varılır.

Hangi Durumlarda Kullanılır?

  • Sırasız Listeler: Liste sıralı değilse, doğrusal arama tek seçenektir.
  • Küçük Veri Kümeleri: Liste çok küçükse (örneğin 10-20 eleman), doğrusal arama yeterince hızlıdır.
  • Tek Seferlik Arama: Arama işlemi çok sık yapılmayacaksa.

Akış Şeması ile Doğrusal Arama Algoritmasının Gösterimi

Problem: Bir tamsayı listesinde, kullanıcının girdiği bir sayıyı arayan algoritma.

Akış Şeması Adımları:

  1. Başla
  2. Girdi: Aranacak sayıyı al (hedef)
  3. Girdi: Listeyi al (liste)
  4. İşlem: index değişkenini 0 olarak ata
  5. Karar: index < listenin uzunluğu mu?
    • Evet: Devam et.
    • Hayır: “Eleman bulunamadı” yazdır ve Bitir’e git.
  6. Karar: liste[index] == hedef mi?
    • Evet: “Eleman bulundu, indeks: index” yazdır ve Bitir’e git.
    • Hayır: index’i 1 arttır ve 5. adıma git.

Kod Örneği: Bir Listedeki Elemanı Arayan Java Fonksiyonu

// Dil: Java
// Açıklama: Bir tamsayı dizisinde belirli bir sayıyı arayan doğrusal arama fonksiyonu.
// Karmaşıklık: O(n)

public class LinearSearch {

    /**
     * Bir dizide hedef değeri arar.
     * @param dizi Aranacak tamsayı dizisi.
     * @param hedef Aranacak değer.
     * @return Hedef değerin bulunduğu indeks, bulunamazsa -1.
     */
    public static int linearSearch(int[] dizi, int hedef) {
        for (int i = 0; i < dizi.length; i++) {
            if (dizi[i] == hedef) {
                return i; // Eleman bulundu, indeksini döndür
            }
        }
        return -1; // Eleman bulunamadı
    }

    public static void main(String[] args) {
        int[] sayilar = {10, 23, 45, 70, 11, 15};
        int aranan = 70;
        int sonuc = linearSearch(sayilar, aranan);

        if (sonuc == -1) {
            System.out.println(aranan + " sayısı dizide bulunamadı.");
        } else {
            System.out.println(aranan + " sayısı dizide " + sonuc + ". indekste bulundu.");
        }
    }
}

Uygulama: Bir String dizisinde (“Ali”, “Ayşe”, “Ahmet”, “Zeynep”) “Ayşe” ismini arayan bir Java programı yazınız.

Değerlendirme: Doğrusal aramanın zaman karmaşıklığı O(n)’dir. Bu, listenin boyutu arttıkça arama süresinin de doğrusal olarak arttığı anlamına gelir. En kötü durumda (aranan eleman sonda veya hiç yok) tüm liste taranır. Bu nedenle büyük ve sıralı listeler için verimsizdir.

7.3 Sayma (Counting) Deseni

Sayma Deseninin Temel Prensibi: Koşul Sağlayan Elemanları Sayma

Sayma deseni, bir koleksiyondaki (liste, dizi, metin) belirli bir koşulu sağlayan elemanların sayısını bulmak için kullanılır. Temel mantık, bir sayaç değişkeni kullanmak ve koşul sağlanan her eleman için bu sayacı bir arttırmaktır.

Sayaç Değişkeni Kullanımı ve Başlangıç Değeri Atama

Sayaç değişkeni, sayma işlemini gerçekleştirmek için kullanılan bir tamsayı değişkendir. Sayma işlemi başlamadan önce mutlaka 0 değeri ile başlatılmalıdır. Aksi takdirde, rastgele bir değer üzerinden sayma yapılır ve yanlış sonuç elde edilir.

Sayma İşleminin Akış Şeması ile Gösterimi

Problem: Bir tamsayı listesinde, belirli bir değerden büyük olan elemanların sayısını bulan algoritma.

Akış Şeması Adımları:

  1. Başla
  2. Girdi: Eşik değerini al (esik)
  3. Girdi: Listeyi al (liste)
  4. İşlem: sayac değişkenini 0 olarak ata
  5. İşlem: index değişkenini 0 olarak ata
  6. Karar: index < listenin uzunluğu mu?
    • Evet: Devam et.
    • Hayır: sayac değerini yazdır ve Bitir’e git.
  7. Karar: liste[index] > esik mi?
    • Evet: sayac’ı 1 arttır.
    • Hayır: Hiçbir şey yapma.
  8. İşlem: index’i 1 arttır ve 6. adıma git.

Kod Örneği: Belirli Bir Değerden Büyük Elemanları Sayan Fonksiyon

// Dil: Java
// Açıklama: Bir tamsayı dizisinde belirli bir eşik değerinden büyük olan elemanların sayısını bulan fonksiyon.
// Karmaşıklık: O(n)

public class CountingExample {

    /**
     * Bir dizide eşik değerinden büyük elemanların sayısını sayar.
     * @param dizi Tamsayı dizisi.
     * @param esik Karşılaştırma eşiği.
     * @return Eşik değerinden büyük eleman sayısı.
     */
    public static int countGreaterThan(int[] dizi, int esik) {
        int sayac = 0; // Sayaç başlangıç değeri 0
        for (int eleman : dizi) {
            if (eleman > esik) {
                sayac++; // Koşul sağlanırsa sayacı arttır
            }
        }
        return sayac;
    }

    public static void main(String[] args) {
        int[] notlar = {45, 78, 90, 34, 88, 67};
        int gecmeNotu = 60;
        int gecenSayisi = countGreaterThan(notlar, gecmeNotu);
        System.out.println("Geçen öğrenci sayısı: " + gecenSayisi);
    }
}

Kod Örneği: Metin İçinde Sesli Harfleri Sayan Program

// Dil: Java
// Açıklama: Bir metin içindeki sesli harflerin (a, e, i, o, u) sayısını bulan program.
// Karmaşıklık: O(n)

public class CountVowels {

    /**
     * Bir metindeki sesli harflerin sayısını sayar.
     * @param metin Kontrol edilecek metin.
     * @return Sesli harf sayısı.
     */
    public static int countVowels(String metin) {
        int sayac = 0;
        String kucukMetin = metin.toLowerCase(); // Büyük/küçük harf duyarlılığını kaldır
        for (int i = 0; i < kucukMetin.length(); i++) {
            char harf = kucukMetin.charAt(i);
            if (harf == 'a' || harf == 'e' || harf == 'i' || harf == 'o' || harf == 'u') {
                sayac++;
            }
        }
        return sayac;
    }

    public static void main(String[] args) {
        String yazi = "Merhaba Dünya!";
        int sesliSayisi = countVowels(yazi);
        System.out.println("Metindeki sesli harf sayısı: " + sesliSayisi);
    }
}

Uygulama: Bir sınıftaki 20 öğrencinin sınav notlarını içeren bir listede, 50’nin altında kalan (kalan) öğrenci sayısını hesaplayan bir Java programı yazınız.

Değerlendirme: Sayma deseni, birçok farklı probleme uyarlanabilir. Örneğin, bir listede kaç tane çift sayı olduğunu bulma, bir metinde kaç tane boşluk olduğunu bulma gibi problemlerde kullanılabilir.

7.4 Toplama (Summation) ve Ortalama Deseni

Toplama Deseninin Temeli: Biriktirici (Accumulator) Değişken Kullanımı

Toplama deseni, bir listedeki tüm sayısal değerlerin toplamını bulmak için kullanılır. Biriktirici adı verilen bir değişken kullanılır ve listenin her bir elemanı bu değişkene eklenir. Biriktirici değişkeninin başlangıç değeri 0 olmalıdır.

Toplama ve Sayma Desenlerinin Birlikte Kullanımı ile Ortalama Hesaplama

Ortalama hesaplamak için hem toplama desenine (tüm notların toplamı) hem de sayma desenine (kaç tane not olduğu) ihtiyaç vardır. Ortalama = Toplam / Eleman Sayısı formülü ile hesaplanır.

Akış Şeması ile Toplama İşleminin Gösterimi

Problem: Bir listedeki tüm sayıların toplamını bulan algoritma.

Akış Şeması Adımları:

  1. Başla
  2. Girdi: Listeyi al (liste)
  3. İşlem: toplam değişkenini 0 olarak ata (biriktirici)
  4. İşlem: index değişkenini 0 olarak ata
  5. Karar: index < listenin uzunluğu mu?
    • Evet: Devam et.
    • Hayır: toplam değerini yazdır ve Bitir’e git.
  6. İşlem: toplam = toplam + liste[index]
  7. İşlem: index’i 1 arttır ve 5. adıma git.

Kod Örneği: Bir Listedeki Sayıların Toplamını Bulan Fonksiyon

// Dil: Java
// Açıklama: Bir tamsayı dizisindeki tüm elemanların toplamını bulan fonksiyon.
// Karmaşıklık: O(n)

public class SummationExample {

    /**
     * Bir tamsayı dizisinin toplamını hesaplar.
     * @param dizi Tamsayı dizisi.
     * @return Dizideki elemanların toplamı.
     */
    public static int sumArray(int[] dizi) {
        int toplam = 0; // Biriktirici başlangıç değeri 0
        for (int eleman : dizi) {
            toplam += eleman; // Her elemanı toplama ekle
        }
        return toplam;
    }

    public static void main(String[] args) {
        int[] sayilar = {1, 2, 3, 4, 5};
        int toplam = sumArray(sayilar);
        System.out.println("Dizinin toplamı: " + toplam);
    }
}

Kod Örneği: Kullanıcıdan Alınan 10 Sayının Ortalamasını Hesaplayan Program

// Dil: Java
// Açıklama: Kullanıcıdan alınan 10 sayının ortalamasını hesaplayan program.
// Karmaşıklık: O(n)

import java.util.Scanner;

public class AverageCalculator {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int toplam = 0;
        int sayiAdedi = 10;

        for (int i = 1; i <= sayiAdedi; i++) {
            System.out.print(i + ". sayıyı giriniz: ");
            int sayi = input.nextInt();
            toplam += sayi; // Toplama deseni
        }

        double ortalama = (double) toplam / sayiAdedi; // Sayma deseni (sayiAdedi değişkeni ile)
        System.out.println("Girilen sayıların ortalaması: " + ortalama);
        input.close();
    }
}

Uygulama: Bir mağazanın bir haftalık günlük satış miktarlarını (bir dizi olarak düşünün) kullanarak haftalık toplam satışı ve günlük ortalama satışı hesaplayan bir Java programı yazınız.

Değerlendirme: Toplama deseni, kayan noktalı (float/double) sayılarla çalışırken hassasiyet sorunlarına yol açabilir. Ayrıca, çok büyük sayılar toplanırken, toplam değişkeninin veri tipinin (int, long, BigInteger) yeterli büyüklükte olmasına dikkat edilmelidir.

7.5 Minimum/Maksimum Bulma (Min/Max) Deseni

Min/Max Deseninin Temel Mantığı: Karşılaştırmalı Güncelleme

Bu desen, bir listedeki en küçük (minimum) veya en büyük (maksimum) elemanı bulmak için kullanılır. Bir değişkene (min veya max) listenin ilk elemanı atanır. Daha sonra liste taranır ve her bir eleman bu değişkenle karşılaştırılır. Eğer daha küçük (min için) veya daha büyük (max için) bir eleman bulunursa, değişken güncellenir.

Başlangıç Değeri Seçimi

  • İlk Eleman: En yaygın ve güvenli yöntemdir. min veya max değişkenine listenin ilk elemanı atanır.
  • Sabit Değer: Listenin alabileceği en büyük değerden büyük (min için) veya en küçük değerden küçük (max için) bir sabit değer kullanılabilir. Örneğin, Integer.MAX_VALUE veya Integer.MIN_VALUE.

Akış Şeması ile Min/Max Bulma Algoritmasının Gösterimi

Problem: Bir listedeki en büyük elemanı bulan algoritma.

Akış Şeması Adımları:

  1. Başla
  2. Girdi: Listeyi al (liste)
  3. İşlem: enBuyuk değişkenine listenin ilk elemanını ata (liste[0])
  4. İşlem: index değişkenini 1 olarak ata (ilk elemanı zaten atadık)
  5. Karar: index < listenin uzunluğu mu?
    • Evet: Devam et.
    • Hayır: enBuyuk değerini yazdır ve Bitir’e git.
  6. Karar: liste[index] > enBuyuk mu?
    • Evet: enBuyuk = liste[index] yap.
    • Hayır: Hiçbir şey yapma.
  7. İşlem: index’i 1 arttır ve 5. adıma git.

Kod Örneği: Bir Listedeki En Büyük ve En Küçük Elemanı Bulan Fonksiyon

// Dil: Java
// Açıklama: Bir tamsayı dizisindeki en büyük ve en küçük elemanı bulan fonksiyon.
// Karmaşıklık: O(n)

public class MinMaxExample {

    /**
     * Bir dizideki en büyük elemanı bulur.
     * @param dizi Tamsayı dizisi.
     * @return Dizideki en büyük eleman.
     */
    public static int findMax(int[] dizi) {
        int enBuyuk = dizi[0]; // Başlangıç değeri ilk eleman
        for (int i = 1; i < dizi.length; i++) {
            if (dizi[i] > enBuyuk) {
                enBuyuk = dizi[i]; // Daha büyük bir eleman bulundu, güncelle
            }
        }
        return enBuyuk;
    }

    /**
     * Bir dizideki en küçük elemanı bulur.
     * @param dizi Tamsayı dizisi.
     * @return Dizideki en küçük eleman.
     */
    public static int findMin(int[] dizi) {
        int enKucuk = dizi[0]; // Başlangıç değeri ilk eleman
        for (int i = 1; i < dizi.length; i++) {
            if (dizi[i] < enKucuk) {
                enKucuk = dizi[i]; // Daha küçük bir eleman bulundu, güncelle
            }
        }
        return enKucuk;
    }

    public static void main(String[] args) {
        int[] notlar = {85, 92, 78, 95, 88};
        int enYuksekNot = findMax(notlar);
        int enDusukNot = findMin(notlar);
        System.out.println("En yüksek not: " + enYuksekNot);
        System.out.println("En düşük not: " + enDusukNot);
    }
}

Kod Örneği: En Yüksek ve En Düşük Sınav Notunu Bulan Program

// Dil: Java
// Açıklama: Bir öğrenci grubunun sınav notlarından en yüksek ve en düşük notu bulan program.
// Karmaşıklık: O(n)

public class ExamMinMax {
    public static void main(String[] args) {
        int[] ogrenciNotlari = {45, 78, 92, 34, 88, 67, 100, 56};

        int enYuksek = ogrenciNotlari[0];
        int enDusuk = ogrenciNotlari[0];

        for (int i = 1; i < ogrenciNotlari.length; i++) {
            if (ogrenciNotlari[i] > enYuksek) {
                enYuksek = ogrenciNotlari[i];
            }
            if (ogrenciNotlari[i] < enDusuk) {
                enDusuk = ogrenciNotlari[i];
            }
        }

        System.out.println("Sınıfın en yüksek notu: " + enYuksek);
        System.out.println("Sınıfın en düşük notu: " + enDusuk);
    }
}

Uygulama: Bir haftanın günlük sıcaklık değerlerini (Pazartesi=25, Salı=28, Çarşamba=22, Perşembe=30, Cuma=27, Cumartesi=26, Pazar=24) içeren bir diziden en sıcak ve en soğuk günün sıcaklık değerini bulan bir Java programı yazınız.

Değerlendirme: Min/Max deseni sadece sayılarla değil, karşılaştırılabilir (Comparable) herhangi bir veri tipiyle (String, Date) de kullanılabilir. Örneğin, bir listedeki en uzun veya en kısa metni bulmak için kullanılabilir.

7.6 Bayrak Değişkeni (Flag Variable) Deseni

Bayrak Değişkeninin Amacı: Bir Durumun Gerçekleşip Gerçekleşmediğini İzleme

Bayrak değişkeni, bir döngü veya işlem sırasında belirli bir koşulun gerçekleşip gerçekleşmediğini izlemek için kullanılan bir boolean (mantıksal) değişkendir. Başlangıçta genellikle false olarak atanır ve istenen durum gerçekleştiğinde true yapılır.

Boolean Bayrak Kullanımı ve Mantıksal Operatörler

Bayrak değişkeni genellikle boolean tipindedir (true veya false). Mantıksal operatörler (&&, ||, !) ile birlikte kullanılarak daha karmaşık koşullar ifade edilebilir.

Bayrak Deseninin Akış Şeması ile Gösterimi

Problem: Bir listede en az bir çift sayı olup olmadığını kontrol eden algoritma.

Akış Şeması Adımları:

  1. Başla
  2. Girdi: Listeyi al (liste)
  3. İşlem: ciftVarMi bayrağını false olarak ata
  4. İşlem: index değişkenini 0 olarak ata
  5. Karar: index < listenin uzunluğu ve ciftVarMi == false mu?
    • Evet: Devam et.
    • Hayır: ciftVarMi değerini yazdır ve Bitir’e git.
  6. Karar: liste[index] % 2 == 0 mı?
    • Evet: ciftVarMi = true yap.
    • Hayır: Hiçbir şey yapma.
  7. İşlem: index’i 1 arttır ve 5. adıma git.

Kod Örneği: Bir Listedeki En Az Bir Çift Sayıyı Kontrol Eden Fonksiyon

// Dil: Java
// Açıklama: Bir tamsayı dizisinde en az bir çift sayı olup olmadığını kontrol eden fonksiyon.
// Karmaşıklık: O(n) (erken çıkış ile optimize edilebilir)

public class FlagExample {

    /**
     * Bir dizide en az bir çift sayı olup olmadığını kontrol eder.
     * @param dizi Tamsayı dizisi.
     * @return En az bir çift sayı varsa true, yoksa false.
     */
    public static boolean hasEvenNumber(int[] dizi) {
        boolean ciftVarMi = false; // Bayrak başlangıçta false
        for (int eleman : dizi) {
            if (eleman % 2 == 0) {
                ciftVarMi = true; // Koşul sağlandı, bayrağı true yap
                break; // Erken çıkış optimizasyonu
            }
        }
        return ciftVarMi;
    }

    public static void main(String[] args) {
        int[] sayilar = {1, 3, 5, 7, 8, 9};
        if (hasEvenNumber(sayilar)) {
            System.out.println("Dizide en az bir çift sayı var.");
        } else {
            System.out.println("Dizide hiç çift sayı yok.");
        }
    }
}

Kod Örneği: Bir Metnin Palindrom Olup Olmadığını Kontrol Eden Program

```java // Dil: Java // Aç