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
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.Yarıçap: 2.5
Alan : 19.63
Çevre : 15.712. Süre çevirme
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.Saniye: 3725
1 saat 2 dakika 5 saniyeBölüm 5
1. FizzBuzz (kısa olsun diye 15’e kadar)
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.1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz15 kontrolü başta olmalıdır; yoksa 15 için önce Fizz koşulu tutar.
2. Sıfıra kadar oku
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.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.0Bölüm 8
1. Ünlü sayısı
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.8içinde metinlerde de çalışır: c içinde 'aeıioöuü' karakterin ünlüler arasında olup olmadığını sorar.
2. Fibonacci
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.[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
Çiftlerin toplamı: 1883. Başarılı öğrenciler
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.Ayşe: 92
Can: 78
Defne: 88Bölüm 11
1. Dikdörtgen ve Kare
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.Alan = 16.0, çevre = 16.02. İ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
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.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
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.0.7071|000⟩ + 0.7071|111⟩
Aynı mı? doğruSadakat iki kuantum durumunun ne kadar benzediğini 0 ile 1 arasında ölçer.
2. Grover’da tekrar sayısı
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.tekrar = 1: P(1011) = 0.473
tekrar = 2: P(1011) = 0.908
tekrar = 3: P(1011) = 0.961
tekrar = 4: P(1011) = 0.582Olası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.