Nesne Tabanlı Programlama

13 - Alıştırmalar

Emre Can Yılmaz

Ondokuz Mayıs Üniversitesi

2024

1. E-posta Adresi Ayrıştırma

Kullanıcıdan bir e-posta adresi girmesini isteyin. Girilen e-posta adresini @ işaretine göre ikiye bölün. İlk parçayı kullanıcı adı, ikinci parçayı ise alan adı olarak iki ayrı değişkene atayın. Eğer e-posta adresinde @ işareti yoksa veya birden fazla @ işareti varsa, kullanıcıya “Geçersiz e-posta adresi” mesajı gösterin. Son olarak, kullanıcı adını ve alan adını ekrana yazdırın.

  • İpuçları:

    • Kullanıcıdan girdi almak için input() fonksiyonunu kullanın.
    • Stringleri belirli bir karakterden bölmek için split() metodunu kullanın.
    • Stringlerde @ karakterinin olup olmadığını ve sayısını kontrol etmek için in operatörü ve count() metodunu kullanın.
    • Koşullu ifadeler (if-elif-else) ile farklı durumları ele alın.
  • Örnek Girdi/Çıktı:

    E-posta adresinizi girin: [email protected]
    Kullanıcı adı: test
    Alan adı: example.com
    
    E-posta adresinizi girin: gecersiz_email
    Geçersiz e-posta adresi
    
    E-posta adresinizi girin: test@example@com
    Geçersiz e-posta adresi

2. Dosya İstatistikleri

Kullanıcıdan bir metin dosyasının adını girmesini isteyin. Dosyayı satır satır okuyarak aşağıdaki istatistikleri hesaplayın ve ekrana yazdırın:

  • Dosyadaki toplam satır sayısı
  • Dosyadaki toplam kelime sayısı
  • Dosyadaki toplam karakter sayısı
  • Dosyadaki en uzun satırın uzunluğu
  • Dosyadaki en kısa satırın uzunluğu

Eğer dosya bulunamazsa, kullanıcıya “Dosya bulunamadı!” mesajı gösterin.

  • İpuçları:
    • Dosya açmak için open() veya with open() kullanın.
    • Dosyayı satır satır okumak için for döngüsü ve readlines() veya readline() metodunu kullanın.
    • Bir stringi kelimelere ayırmak için split() metodunu kullanın.
    • Hata yakalama için try-except bloklarını kullanın.
    • len() fonksiyonu ile stringlerin ve listelerin uzunluğunu bulabilirsiniz.
    • max() ve min() fonksiyonlarını bir döngü içerisinde kullanarak en uzun ve en kısa satırları bulabilirsiniz.

3. Film Kütüphanesi

Film bilgilerini (adı, yönetmeni, yılı, türü) içeren bir sözlük yapısı oluşturun. Her film için, film adını anahtar, diğer bilgileri ise iç içe sözlük olarak değer olarak saklayın. Örnek:

filmler = {
    "Matrix": {"yönetmen": "Wachowski Kardeşler", "yıl": 1999, "tür": "Bilim Kurgu"},
    "Yüzüklerin Efendisi": {"yönetmen": "Peter Jackson", "yıl": 2001, "tür": "Fantastik"},
    # ... daha fazla film
}

Kullanıcıya aşağıdaki seçenekleri sunan bir menü oluşturun:

  1. Film Ekle: Kullanıcıdan yeni bir film adı, yönetmeni, yılı ve türünü alarak kütüphaneye ekleyin.
  2. Film Ara: Kullanıcıdan bir film adı girmesini isteyin ve film kütüphanede mevcutsa, tüm bilgilerini yazdırın. Film bulunamazsa, “Film bulunamadı” mesajını gösterin.
  3. Yıla Göre Filtrele: Kullanıcıdan bir yıl girmesini isteyin ve o yılda yayınlanan filmleri listeleyin.
  4. Türe Göre Filtrele: Kullanıcıdan bir tür girmesini isteyin ve o türdeki filmleri listeleyin.
  5. Tüm Filmleri Listele: Kütüphanedeki tüm filmleri, bilgileriyle birlikte ekrana yazdırın.
  6. Çıkış: Programı sonlandırın.
  • İpuçları:
    • Sözlükler ve listeler kullanın.
    • input() fonksiyonu ile kullanıcıdan girdi alın.
    • Döngüler ve koşullu ifadeler ile program akışını kontrol edin.
    • Fonksiyonlar kullanarak kodunuzu düzenleyin ve tekrar kullanımını sağlayın.
    • Hata yakalama (try-except) kullanarak geçersiz girdi durumlarını ele alın.

4. Dosyadan Öğrenci Not Ortalaması Hesaplama

  • Bir dosyada (örneğin, “notlar.txt”), her satırda bir öğrencinin adı ve sınav notları virgülle ayrılmış şekilde saklanmaktadır. Örnek dosya içeriği:
Ahmet,70,80,90
Mehmet,60,75,85
Ayşe,90,95,100
  • Bu dosyayı okuyan ve her öğrencinin not ortalamasını hesaplayan bir program yazın.
  • Sonuçları, “ortalama.txt” adlı yeni bir dosyaya, her satırda öğrenci adı ve ortalaması olacak şekilde (virgülle ayrılmış) yazdırın.
  • Ortalama hesaplanırken ondalık kısmı 2 basamak olarak yazdırın.
  • İpuçları:
    • Dosya açma, okuma ve yazma işlemlerini kullanın.
    • split() metodu ile satırları parçalara ayırabilirsiniz.
    • float() veya int() ile stringleri sayıya dönüştürebilirsiniz.
    • try-except blokları ile hata yakalama işlemlerini yapmayı unutmayın.
    • round() fonksiyonunu kullanarak ondalık basamak sayısını ayarlayabilirsiniz.
    • with open(...) as ... yapısını kullanarak dosyaları otomatik olarak kapatabilirsiniz.

Örnek notlar.txt içeriği:

Ahmet,70,80,90
Mehmet,60,75,85
Ayşe,90,95,100

ortalama.txt dosyasının içeriği:

Ahmet,80.00
Mehmet,73.33
Ayşe,95.00

5. Sözlük ve Listelerle İstatistikler

  • Bir şirketin çalışanlarının departman ve maaş bilgilerini içeren bir liste veriliyor. Her eleman, bir çalışanın bilgilerini içeren bir sözlük. Örnek:
calisanlar = [
    {"isim": "Ahmet", "departman": "İnsan Kaynakları", "maas": 5000},
    {"isim": "Mehmet", "departman": "Bilgi İşlem", "maas": 7000},
    {"isim": "Ayşe", "departman": "İnsan Kaynakları", "maas": 6000},
    {"isim": "Fatma", "departman": "Pazarlama", "maas": 6500},
    {"isim": "Ali", "departman": "Bilgi İşlem", "maas": 7500}
]
  • Bu verileri kullanarak aşağıdaki işlemleri yapan bir program yazın:
    1. Her departmanın ortalama maaşını hesaplayın ve ekrana yazdırın.
    2. En yüksek maaş alan çalışanın adını ve maaşını ekrana yazdırın.
    3. Bilgi İşlem departmanında çalışanların isimlerini ve maaşlarını ekrana yazdırın.
    4. Her departmanda kaç kişi çalıştığını bulun ve ekrana yazdırın.
  • İpuçları:
    • Sözlük ve liste metotlarını kullanın.
    • Döngüler ve koşullu ifadelerden faydalanın.
    • Verileri saklamak için yeni sözlükler ve listeler oluşturabilirsiniz.

6. Metin Analizi ve Dosya Çıktısı

Kullanıcıdan bir metin dosyası adı girmesini isteyin. Dosyayı okuyarak aşağıdaki bilgileri hesaplayın ve sonuc.txt adlı bir dosyaya yazdırın:

  • Dosyadaki toplam kelime sayısı.
  • Dosyadaki toplam cümle sayısı (cümlelerin “.” , “!” veya “?” ile bittiğini varsayabilirsiniz).
  • Dosyadaki her kelimenin kaç kez geçtiğini gösteren bir sözlük (büyük/küçük harf duyarsız olacak şekilde).
  • En sık geçen 5 kelimeyi, kullanım sıklıklarıyla birlikte ekrana yazdırın.

İpuçları:

  • Dosya açma, okuma ve yazma işlemlerini kullanın.
  • Stringleri büyük/küçük harfe dönüştürmek için upper() veya lower() metotlarını kullanabilirsiniz.
  • Stringleri belirli bir karaktere göre bölmek için split() metodunu kullanın.
  • Kelimelerin sayısını saymak için bir sözlük kullanın.
  • Sözlükleri sıralamak için sorted() fonksiyonunu ve lambda ifadelerini kullanabilirsiniz.

7. Sayı Listesi Analizi ve Fonksiyonlar

Aşağıdaki görevleri yerine getiren fonksiyonlar yazın:

  • kare_al(sayi_listesi): Bir sayı listesi alır ve her sayının karesini içeren yeni bir liste döndürür.
  • tek_sayilari_filtrele(sayi_listesi): Bir sayı listesi alır ve sadece tek sayıları içeren yeni bir liste döndürür.
  • en_buyuk_uc(sayi_listesi): Bir sayı listesi alır ve listedeki en büyük 3 sayıyı içeren yeni bir liste döndürür.
  • ortalama_ustu(sayi_listesi): Bir sayı listesi alır ve bu listedeki sayıların ortalamasından büyük olan sayıları içeren yeni bir liste döndürür.

Daha sonra, kullanıcıdan virgülle ayrılmış sayılar girmesini isteyen ve bu sayıları bir listeye dönüştüren bir ana program yazın. Ana program, yukarıda tanımladığınız fonksiyonları sırasıyla çağırarak sonuçları ekrana yazdırsın.

İpuçları:

  • Fonksiyonları tanımlarken def anahtar kelimesini kullanın.
  • Listeler, döngüler ve koşullu ifadeler kullanın.
  • input() ve split() ile kullanıcıdan alınan string’i sayı listesine dönüştürebilirsiniz.
  • int() ile string’i tam sayıya dönüştürün.
  • map(), filter() ve lambda fonksiyonlarını kullanmayı düşünün.
  • sort() veya sorted() fonksiyonlarını kullanabilirsiniz.
  • Liste dilimleme ([:3] gibi) kullanabilirsiniz.

8. İki Kişilik Taş-Kağıt-Makas Oyunu

İki kişilik bir taş-kağıt-makas oyunu yazın. Oyun, 5 tur oynansın.

  • Her turda, her iki oyuncudan da seçimlerini alın (“taş”, “kağıt” veya “makas”).
  • Kazananı belirleyin ve ekrana yazdırın.
  • Her turun sonunda, her iki oyuncunun da o ana kadar kaç tur kazandığını yazdırın.
  • 5 turun sonunda, toplamda en çok tur kazananı belirleyin ve yazdırın.

İpuçları:

  • Oyuncu seçimlerini saklamak için değişkenler kullanın.
  • Kazanma durumunu kontrol etmek için koşullu ifadeler (if-elif-else) kullanın.
  • Tur sayısını ve kazanma sayılarını takip etmek için değişkenler kullanın.
  • Döngüler kullanarak 5 turu yönetin.
  • input() ile kullanıcıdan girdi alın.
  • Kazananı belirlemek için iç içe if veya elif kullanabilirsiniz. Ya da bir sözlükte olası kombinasyonları tanımlayabilirsiniz.

9. Metin Şifreleme ve Şifre Çözme

  • Sezar şifrelemesi kullanarak bir metni şifreleyen ve şifresini çözen iki fonksiyon yazın.
  • Sezar şifrelemesinde, her harf alfabede belirtilen anahtar (key) kadar kaydırılır. Örneğin, anahtar 3 ise, ‘A’ harfi ‘D’ olur, ‘B’ harfi ‘E’ olur, ‘Z’ harfi ‘C’ olur (alfabe döngüsel olarak düşünülür).
  • Şifreleme fonksiyonu, şifrelenecek metni ve anahtarı (pozitif bir tamsayı) parametre olarak almalı ve şifrelenmiş metni döndürmelidir.
  • Şifre çözme fonksiyonu, şifrelenmiş metni ve anahtarı parametre olarak almalı ve orijinal metni döndürmelidir.
  • Fonksiyonlarınız sadece İngiliz alfabesindeki büyük ve küçük harfler (A-Z, a-z) üzerinde çalışmalıdır. Diğer karakterler (sayılar, noktalama işaretleri, boşluklar) değişmeden kalmalıdır.
  • İpuçları:
    • ord() ve chr() fonksiyonlarını kullanarak harflerin ASCII kodlarına erişebilir ve üzerinde işlem yapabilirsiniz.
    • Büyük ve küçük harfler için ayrı ayrı işlem yapmanız gerekecektir.
    • Modüler aritmetik (% operatörü) kullanarak alfabeyi döngüsel olarak düşünebilirsiniz.

Örnek:

metin = "Merhaba Dünya!"
anahtar = 3
sifrelenmis_metin = sifrele(metin, anahtar)
print(sifrelenmis_metin) # Çıktı: "Phukded Gxqc!"
orijinal_metin = sifre_coz(sifrelenmis_metin, anahtar)
print(orijinal_metin) # Çıktı: "Merhaba Dünya!"