Java’nin Temelleri
2025-04-09
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:
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.
Bir problemi algoritmik olarak çözmek için sistematik bir yaklaşım izlemek gerekir. Bu süreç dört temel aşamadan oluşur:
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ı, 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ş | Algoritmanın başladığı veya bittiği noktayı belirtir. | |
| İşlem | Bir hesaplama, atama veya değer değiştirme gibi bir eylemi temsil eder. | |
| Karar | Bir koşula bağlı olarak (Evet/Hayır) iki farklı yola ayrılmayı sağlar. | |
| Girdi/Çıktı | Kullanıcıdan veri okumayı (girdi) veya sonucu ekrana yazdırmayı (çıktı) temsil eder. | |
| Akış Yönü | Adımlar arasındaki sırayı ve yönü gösterir. |
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):
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.
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.
Problem: Bir tamsayı listesinde, kullanıcının girdiği bir sayıyı arayan algoritma.
Akış Şeması Adımları:
hedef)liste)index değişkenini 0 olarak ataindex < listenin uzunluğu mu?
liste[index] == hedef mi?
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.
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, 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.
Problem: Bir tamsayı listesinde, belirli bir değerden büyük olan elemanların sayısını bulan algoritma.
Akış Şeması Adımları:
esik)liste)sayac değişkenini 0 olarak ataindex değişkenini 0 olarak ataindex < listenin uzunluğu mu?
sayac değerini yazdır ve Bitir’e git.liste[index] > esik mi?
sayac’ı 1 arttır.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.
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.
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.
Problem: Bir listedeki tüm sayıların toplamını bulan algoritma.
Akış Şeması Adımları:
liste)toplam değişkenini 0 olarak ata (biriktirici)index değişkenini 0 olarak ataindex < listenin uzunluğu mu?
toplam değerini yazdır ve Bitir’e git.toplam = toplam + liste[index]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.
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.
min veya max değişkenine listenin ilk elemanı atanır.Integer.MAX_VALUE veya Integer.MIN_VALUE.Problem: Bir listedeki en büyük elemanı bulan algoritma.
Akış Şeması Adımları:
liste)enBuyuk değişkenine listenin ilk elemanını ata (liste[0])index değişkenini 1 olarak ata (ilk elemanı zaten atadık)index < listenin uzunluğu mu?
enBuyuk değerini yazdır ve Bitir’e git.liste[index] > enBuyuk mu?
enBuyuk = liste[index] yap.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.
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.
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.
Problem: Bir listede en az bir çift sayı olup olmadığını kontrol eden algoritma.
Akış Şeması Adımları:
liste)ciftVarMi bayrağını false olarak ataindex değişkenini 0 olarak ataindex < listenin uzunluğu ve ciftVarMi == false mu?
ciftVarMi değerini yazdır ve Bitir’e git.liste[index] % 2 == 0 mı?
ciftVarMi = true yap.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ç