İçeriğe geç

Kitaplar / Yöntem ile Programlamaya Giriş / Ek C — Alıştırma çözümleri

Ek C — Alıştırma çözümleri

Aşağıdaki çözümlerin hepsi çalıştırılmıştır. Bir alıştırmanın birden çok doğru çözümü olabilir; sizinki farklı olsa da doğru sonucu veriyorsa bir sorun yoktur.

Bölüm 3

1. Daire

Yöntem
program Daire
değişken
  r: ondalık
başla
  yaz('Yarıçap: ')
  oku(r, 1)
  yaz(Biçimle('Alan  : {:.2}', pi * r * r), 1)
  yaz(Biçimle('Çevre : {:.2}', 2 * pi * r), 1)
bitir.
Çıktı
Yarıçap: 2.5
Alan  : 19.63
Çevre : 15.71

2. Süre çevirme

Yöntem
program SüreÇevir
değişken
  toplam, saat, dakika, saniye: tamsayı
başla
  yaz('Saniye: ')
  oku(toplam, 1)
  saat := toplam böl 3600
  dakika := (toplam mod 3600) böl 60
  saniye := toplam mod 60
  yaz(saat + ' saat ' + dakika + ' dakika ' + saniye + ' saniye', 1)
bitir.
Çıktı
Saniye: 3725
1 saat 2 dakika 5 saniye

Bölüm 5

1. FizzBuzz (kısa olsun diye 15’e kadar)

Yöntem
program FizzBuzz
değişken
  i: tamsayı
başla
  1'den 15'e kadar her i için
    eğer i mod 15 = 0 ise yaz('FizzBuzz ')
    değilse eğer i mod 3 = 0 ise yaz('Fizz ')
    değilse eğer i mod 5 = 0 ise yaz('Buzz ')
    değilse yaz(i + ' ')
  yaz('', 1)
bitir.
Çıktı
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz

15 kontrolü başta olmalıdır; yoksa 15 için önce Fizz koşulu tutar.

2. Sıfıra kadar oku

Yöntem
program SıfıraKadar
değişken
  n, adet: tamsayı
  toplam: ondalık
başla
  toplam := 0;  adet := 0
  tekrarla
    yaz('Sayı (bitirmek için 0): ')
    oku(n, 1)
    eğer n <> 0 ise
    başla
      toplam += n
      adet += 1
    bitir
  n = 0 olana dek
  eğer adet > 0 ise
    yaz('Toplam = ' + toplam + ', ortalama = ' + toplam / adet, 1)
  değilse
    yaz('Hiç sayı girilmedi.', 1)
bitir.
Çıktı
Sayı (bitirmek için 0): 4
Sayı (bitirmek için 0): 8
Sayı (bitirmek için 0): 6
Sayı (bitirmek için 0): 0
Toplam = 18.0, ortalama = 6.0

Bölüm 8

1. Ünlü sayısı

Yöntem
program Ünlüler

fonksiyon ÜnlüSayısı(s: metin): tamsayı
değişken
  c: herhangi
başla
  sonuç := 0
  KüçükHarf(s) içindeki her c için
    eğer c içinde 'aeıioöuü' ise sonuç += 1
bitir

başla
  yaz(ÜnlüSayısı('Yöntem Programlama Dili'), 1)
bitir.
Çıktı
8

içinde metinlerde de çalışır: c içinde 'aeıioöuü' karakterin ünlüler arasında olup olmadığını sorar.

2. Fibonacci

Yöntem
program Fibonacci
değişken
  fib: liste
  i: tamsayı
başla
  fib := [0, 1]
  2'den 14'e kadar her i için
    fib.Ekle(fib[i - 1] + fib[i - 2])
  yaz(fib, 1)
  yaz('Çiftlerin toplamı: ' + (fib |> Süz(fonksiyon(x) => x mod 2 = 0) |> Toplam), 1)
bitir.
Çıktı
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
Çiftlerin toplamı: 188

3. Başarılı öğrenciler

Yöntem
program Başarılılar
değişken
  notlar: sözlük
  ad: herhangi
başla
  notlar := ['Mert': 65, 'Ayşe': 92, 'Can': 78, 'Defne': 88, 'Bora': 54]
  Sırala(Süz(Anahtarlar(notlar), fonksiyon(a) => notlar[a] > 70)) içindeki her ad için
    yaz(ad + ': ' + notlar[ad], 1)
bitir.
Çıktı
Ayşe: 92
Can: 78
Defne: 88

Bölüm 11

1. Dikdörtgen ve Kare

Yöntem
program Şekiller
tip
  Dikdörtgen = sınıf
    en, boy: ondalık
    kurucu Oluştur(e, b: ondalık)
    başla en := e;  boy := b; bitir
    fonksiyon Alan: ondalık;  başla dön en * boy; bitir
    fonksiyon Çevre: ondalık; başla dön 2 * (en + boy); bitir
  bitir

  Kare = sınıf(Dikdörtgen)
    kurucu Oluştur(kenar: ondalık)
    başla miras Oluştur(kenar, kenar); bitir
  bitir

değişken
  k: Kare
başla
  k := Kare.Oluştur(4)
  yaz('Alan = ' + k.Alan + ', çevre = ' + k.Çevre, 1)
bitir.
Çıktı
Alan = 16.0, çevre = 16.0

2. İpucu: Sınıfa işlemler: liste; alanı ekleyip kurucuda işlemler := []; yapabilirsiniz. Yatır ve Çek içinde işlemler.Ekle('Yatır ' + miktar); gibi bir kayıt düşmeniz yeterlidir. Geçmiş metodu ise dön işlemler; olabilir. Alanın adı metodun adıyla aynı olmamalı; bu yüzden alana geçmiş değil işlemler dedik.

3. İpucu: Şekiller.y dosyasını birim Şekiller; ile başlatabilirsiniz. Sınıflar arayüzdeki tip bölümüne, metod gövdeleri ise uygulamaya Dikdörtgen.Alan biçiminde yazılır. Programı aynı klasöre koyup kullan Şekiller; demeniz yeterlidir.

Bölüm 14

1. Eğri uydurma

Yöntem
program EğriUydurma
kullan YZ
değişken
  xs, ys: liste
  i: tamsayı
  x: ondalık
  model, opt: herhangi
  geçmiş: liste
başla
  Tohum(0)
  xs := [];  ys := []
  0'dan 19'a kadar her i için
  başla
    x := -1 + i * 2 / 19
    xs.Ekle([x])
    ys.Ekle([2 * x * x - 1])
  bitir
  model := Ardışık([Yoğun(1, 16, 'tanh'), Yoğun(16, 1)])
  opt := Adam(model.Parametreler, 0.02)
  geçmiş := Eğit(model, xs, ys, 'okh', opt, 500)
  yaz(Biçimle('Son kayıp: {:.5}', geçmiş[Uzunluk(geçmiş) - 1]), 1)
  yaz(Biçimle('x = 0.5 için tahmin {:.3} (gerçek -0.5)', model.Tahmin([[0.5]])[0, 0]), 1)
bitir.
Çıktı
Son kayıp: 0.00030
x = 0.5 için tahmin -0.496 (gerçek -0.5)

Sayı tahmininde son katmanda etkinleştirme kullanılmaz; çıktı her değeri alabilmelidir.

2–3. İpucu: Bölüm 14’teki programlardan yola çıkabilirsiniz. Spam filtresinde filtre.Olasılıklar(m) bir sözlük döndürür: ['spam': 0.93, 'normal': 0.07] gibi.

Bölüm 15

1. GHZ durumu

Yöntem
program GHZÖrneği
kullan Kuantum, KuantumAlgoritmaları
değişken
  d: herhangi
başla
  d := Devre(3)
  d.H(0)
  d.CX(0, 1)
  d.CX(1, 2)
  yaz(d.Durum, 1)
  yaz('Aynı mı? ' + (Sadakat(d, GHZ(3)) > 0.9999), 1)
bitir.
Çıktı
0.7071|000⟩ + 0.7071|111⟩
Aynı mı? doğru

Sadakat iki kuantum durumunun ne kadar benzediğini 0 ile 1 arasında ölçer.

2. Grover’da tekrar sayısı

Yöntem
program GroverTekrar
kullan Kuantum, KuantumAlgoritmaları
değişken
  t: tamsayı
başla
  1'den 4'e kadar her t için
    yaz(Biçimle('tekrar = {}: P(1011) = {:.3}', t, Grover('1011', t).Olasılık('1011')), 1)
bitir.
Çıktı
tekrar = 1: P(1011) = 0.473
tekrar = 2: P(1011) = 0.908
tekrar = 3: P(1011) = 0.961
tekrar = 4: P(1011) = 0.582

Olasılık 3 tekrarda en yüksek değerine ulaşır, sonra düşer. Grover algoritmasında fazla tekrar zararlıdır; en iyi sayı yaklaşık (π/4)·√N’dir. 16 olasılık için bu 3’e denk gelir.

3. İpucu: açı := [0.3, 0.1]; ile başlayabilirsiniz. ParametreKaydırma iki elemanlı bir gradyan listesi döndürür; güncellemeyi Bölüm 8’deki gibi Eşle(Eşleştir(açı, grad), fonksiyon(p) => p[0] - 0.4 * p[1]) ile yapabilirsiniz.


Tebrikler, kitabı bitirdiniz. Buradan sonra Yöntem klasöründeki ornekler ve kutuphane klasörlerini okuyabilirsiniz: hepsi bu kitapta öğrendiğiniz yapılarla yazılmıştır. Dilin tam başvuru belgesi README.md dosyasındadır.