Merhaba, tekrar hoş geldiniz.
Bu konuşmada, şu konulara değinmek istiyorum önceki
meydan okumamızın bir çözüm gösterimi aracılığıyla bazı fonksiyonlar
oluşturmaktı, özellikle GCD fonksiyonu ve bir çift fonksiyonu, mutlak değer fonksiyonu ve karekök
fonksiyonu.
Bir proje oluşturacağım ve Muhtemelen proje
fonksiyonlarına isim vereceğim. buradaki mevcut projemi kapatmak için.
Bir tane daha olacak. konsol uygulaması.
Biz gerçekten alamadım kütüphanelere veya her türlü grafik programlamaya.
Bu nasıl olacak sadece bazı fonksiyonlar hakkında.
Genellikle, bir iyi bir isim, ama bu sadece
öğrenme amaçlı.
Yani biz sadece genel işlevler sağlar.
Eğer bu bir GCD programı olsaydı en büyük ortak bölenleri yazınız.
Ama yapacağımız ilk şey en büyük ortak bölen programımızı
uygulayacağız.
Bu bir fonksiyon olacak negatif olmayan iki tamsayı arasındaki en büyük ortak
böleni bulur değerlerini alır ve ardından sonuçları döndürür.
İşlev sağlamalıyız prototipleri de çağırabiliriz ve böylece
onları onları işlevin herhangi bir yerinde.
Hadi yapalım şunu.
İlk fonksiyon için, bu bir işlev bildirimidir.
Neden bir fonksiyon yapıyoruz bildirimini kullanabiliriz,
böylece programın herhangi bir yerinde çağırabiliriz.
Biz aslında zorunda değilsiniz Bu fonksiyonu
çağırdığımızda ana fonksiyonun üzerinde uygulayın.
Ve bu sadece iyi bir pratik. programda neler olup bittiğini
net bir şekilde görmek çok kolay. işlev bildirimleri en üstte.
Bu bir int döndürecektir.
Unutmayın, fonksiyon başlığı ilk Yaptığınız şey, döndürülecek veri türünü
belirtmektir.
GCD bir int döndürecektir.
O zaman isim verecek GCD olan fonksiyon.
Ve sonra parantezlerin içinde GCD'ye aktarılan veriler.
Ve bu da aynı zamanda int.
İki veri öğesi aktaracağız.
Bu yüzden bunları virgülle ayırıyoruz.
için veri türünü belirtiriz her biri ve değişken adı.
Sadece U ve V'ye diyeceğim.
Ve sonra noktalı virgül var fonksiyon tanımını sonlandırın.
Şimdi fonksiyonumu aşağıda tanımlayabilirim ve hala onu çağırabilirim
ve herhangi bir sorun yaşamam.
Yani şimdi gerçekten istediğinizde fonksiyonu
tanımlarsanız, aynı fonksiyonu uygularsınız başlık int dönüş değeri GCD.
Birbiriyle uyumlu olmalı. türler açısından bildirim.
Adını başka bir şey koyabilirsin. isimler için int x gibi, ancak tutarlı
olacağız.
Sadece int v diyeceğiz.
Bunun bir işlev olduğunu biliyoruz. çünkü gövdeyi tanımlayan
parantezler vardır.
Bu uygulama kodudur.
için gerçek algoritma GCD oldukça basittir.
Tek yapmanız gereken bir döngü yazmak ve döngüden geçip kalanlara göre
geçici değerlere bakın.
Bu yüzden yerel bir değişkenini GCD fonksiyonumun içine yerleştirdim.
Yerel olduğunu nereden biliyoruz? 12'den 14'e kadar olan parantezlerin içinde.
Bu değişkene erişilemez ana fonksiyonun içinde.
Sadece bu blok için yerel.
Burada sadece yerel olduğu için temp'i arayın.
Şimdi de döngümü oluşturacağım.
Bir while döngüsü kullanacağım.
Ve benim while döngüm sadece En büyük ortak bölenimiz olan v'ye
kadar gitmek için.
Unutmayın, en büyük ortak bölen iki parametre alır.
Bir parametre alacaktır.
Ve bu iki parametreye dayanarak, en büyük ortak böleni bulmak için oluşturulmuş
bir algoritmaya sahiptir.
Yani eğer bulmaya çalışıyorsak bölen, v'nin aşağıdakilere
eşit olmadığından emin olmalıyız sıfır, ikinci parametremiz.
Bu sadece standart algoritmanın parçaları.
v eşit olmasa da sıfıra ayarladığımızda, döngü için
parantez koyacağız.
Yapacağımız şey. önce sıcaklığı
u mod v'nin modül değerine atayacağız.
Daha sonra u'yu ayarlayacağız v'ye eşittir ve v'yi temp'ye
eşit olarak ayarlayacağız.
Ve sonra geri dönmek istiyoruz bu işlevden gelen veriler.
Peki, şu veriyi nasıl döndürürüz bir fonksiyon mu? return anahtar sözcüğünü
kullanırız ve sadece döndürmek istediğimiz veriler.
Bu durumda, u değerini döndürmek istiyoruz.
Şimdi unutmayın ki eğer bu fonksiyon herhangi bir veri döndürmezse, türü
void olarak değiştirmemiz gerekir.
Ve sonra biz sadece veri içermeyen bir iade var.
Ancak bu veriler geri dönüyor.
Bu yüzden eşleşmeliyiz.
Ve işte biz Tekrar döndüğünü söyle.
Ayrıca veri aktarmıyor olsaydık bu fonksiyona parametre
olarak void koyabilir veya bunları boş tutarsanız, işlevin veri almadığını
söyleyebilirsiniz, ancak iki değişken geçiriyoruz.
Ve bu u ve v değişkenleri GCD işlevine yerel değişkenler.
Bunları fonksiyon içinde kullanabiliriz.
Biz de bunu yapıyoruz.
Bunların hepsi bir fonksiyonun özellikleridir.
Geri dönüş değeri, veri yerel değişkenleri kullanarak ve ardından
verileri döndürerek geçiriyorsunuz.
Tüm bu şeylere dikkat edin sözdizimini parantezlerle ve ardından en üstteki
bildirimle birlikte girin.
Şimdi denemek istiyoruz bu işlevi test edin.
Bu yüzden bunu herkes için test etmek istiyoruz farklı şeyler.
Devam edelim ve şunu hatırlayalım fonksiyonu veri döndürür, bu yüzden muhtemelen bir yerel değişken
oluşturmak isteriz ana sistemimiz, ona sadece sonuç diyeceğiz.
Sıfır olarak başlatabiliriz.
Ve sonra biz istiyoruz temel olarak işlevi çağırın.
Bir fonksiyonu nasıl çağırırız?
Sadece fonksiyonu belirtiriz adını ve ardından kendisine aktarılan
verileri içerir.
Çünkü bu fonksiyon veri, sonuç eşittir ve ardından
işlev adı diyeceğim.
Fonksiyon adı GCD'dir.
Ve 150'yi geçeceğim. ilk testim ve 35 için.
İki test daha yapacağım sadece farklı sayıları geçmek için, ama yapmak istediğim
şey Sonuç olarak döndürülen verileri yazdırmak
için.
Bu yüzden printf diyeceğim ve 150 ve 35'in GCD'sinin yüzde satır beslemesi ve ardından
sonuç olduğunu söyleyecek.
Doğru. Bu yüzden 10. satır önemlidir.
GCD'den verileri geri alıyoruz. bir değişkene atıyoruz.
Ve fonksiyonu şu şekilde çağırabiliriz Burada iki sabit var, 150 ve 35.
Değişkenleri de aktarabiliriz.
Fonksiyonu çağırma şeklimiz parantezler içindeyken,
değerleri koyarız virgülle ayrılır ve noktalı virgül de en
sonda yer alır.
Birden fazla test yapmak istiyorum.
Bu yüzden 10. ve 10. satırları kopyalayacağım. 11 ve diğer bazı verileri ekleyin.
1026'yı koyacağım. ve 405 ve sonra da 83.
Ve aslında yapabileceğimiz şey değişkenini döndürmek
yerine, aslında onu sadece printf içindeki fonksiyonun
çağrısı ve orada yazdırılması, kaydetmemize bile gerek yok.
Yani sadece GCD 83, 240 diyebiliriz.
Neyi değiştirmemiz gerekecek?
burada sabit kodlanmış değerler açısından yazdırıyoruz, örneğin 1026, 405 ve daha sonra 240 ve 83.
Şimdi devam edelim ve bunu derleyelim.
Emin olalım ki hata veya uyarı yok.
Hiçbir hata ve uyarımız yok.
O zaman çalıştıralım.
Çalıştırdığımızda şunları görmeliyiz Belirli sayılar
için üç kez en büyük ortak bölen.
Böylece 150 ve 35'in GCD'sinin 5 olduğunu görüyoruz.
1026 ve 405'in GCD'si 27'dir.
Ve 83 ile 240'ın GCD'si 1'dir.
En büyük ortak bölen şu anlama gelir Bu iki sayıya giren faktörler,
en yüksek faktör nedir?
Yani 5, 35'e giriyor, ve 5 150'ye gider.
Ve bu en yüksek olanı.
27 ayrıca 405 ve 1026'ya da giriyor, bu ikisi arasında en yüksek olanıdır.
İşe yarıyor gibi görünüyor.
Ve şu konuların temellerini ele aldık veri aktarma ve veri döndürme.
Şimdi bir çift pratik yapmak istiyoruz sadece algoritmalar ve problem
çözme açısından diğer şeyler.
Başka bir fonksiyon oluşturalım mutlak değer olarak adlandırılır.
Mutlak değer fonksiyonu gidiyor bir float döndürmek ve bir float almak için.
Bu bir çok basit bir işlev.
Bu yüzden ilan edeceğiz fonksiyonu beşinci satıra kadar.
Mutlak yüzer diyeceğiz değeri, bu bir isim ve ardından parametrelerdir ve biz sadece
float x diyeceğiz ve sonra noktalı virgülle
bitireceğiz.
Yine, fonksiyona dikkat edin bildirimi, dönüş değeri, veri
türleri ile belirtilen parametreler ve ardından işlevin adını girin.
Daha sonra devam edebilir ve tanımlayabiliriz Bu fonksiyon GCD fonksiyonunun
altında yer alacak ve çok basit olacak.
Fonksiyonu şu tipte tanımlıyoruz döndürülecek olan, isim ve
ardından parametre, tıpkı bildirimi dışında, şimdi kod bloğunu başlatmak
için parantezlerimiz var.
Bu kolay çünkü tek yapmamız gereken geçen parametreyi kontrol etmek ve sıfırdan
küçük olup olmadığını kontrol etmektir.
Eğer sıfırdan küçükse, o zaman sadece eksi x olacak
şekilde tersini atayacağız.
Yani eksi bir değer ise, eksi ile çarpıp
artıya dönecektir.
Ve bu verileri geri döndürmek istiyoruz.
Bu yüzden x'i döndür diyeceğiz.
Şimdi, konuşmamda bahsettiğim bir
şey Örnek veremediğim dersler eğer baştan sona veri döndürürseniz.
Çünkü bir sürü if deyimleri ve her if deyiminde geri dönüyor
olabiliriz.
Ve böylece fonksiyonunuz Teorik olarak, if'lerin veya döngülerin içindeyse çok sayıda
geri dönüş ifadesine sahip olun.
Ve sonra yapabilirsin altta bir tane var.
Bununla ilgili sorun şu Takip etmesi gerçekten zor.
Farklı bir iade yapmanız gerekiyorsa Kodunuzun bazı bölümlerinde, temel olarak,
verileri bir değişkende saklayın ve en altta iade edin.
Ancak burada bu basit bir işlevdir.
Sadece bir değer döndürüyoruz.
Hadi devam edelim ve Bu fonksiyonun kayan değerleri alması gerçekten
güzel, böylece tamsayılar ve kayan sayılar ile kullanın.
Bu yüzden ben de Burada birkaç değişken var,
onları geçeceğiz.
Ve ben de gidiyorum bir tamsayı oluşturmak için.
Bunu yapacağım. ana sayfamın en üstünde.
Ben yaratacağım F1 F2 F3 için bir float.
Ve bir tamsayı I1 oluşturacağım.
Ve bir tane daha yaratacağım değişkeni sonucu depolar, ancak bunun bir float
olması gerekir.
Bu yüzden, benim de başka
bir değişken ve bu sadece mutlak
değer sonucu diyecek ve bunu 0 olarak başlatacağım.
0.
Şimdi şu komutu çağıracağım işlevini kullanın ve sonuçları yazdırın.
Bu yüzden kopyalayacağım ve buraya biraz kod yapıştırın.
Fonksiyonu çağırabilir ve ya da sadece printf fonksiyonuna
aktarabilirim.
Muhtemelen burada mutlak değer fonksiyonunu test
eden bazı yorumlar yapmak istiyorum.
Ve tek bir yıldız işareti kullandığınızda çizgisi, onu biraz öne çıkarıyor.
Bu yüzden buraya sadece bir grup mutlak çağrıyı yapıştırdım değer fonksiyonu ve ardından bazı sonuçları göstermiştir.
Yani burada 24'te, arıyorum f1 ile mutlak değer.
Unutmayın, f1 bir şamandıradır.
Eksi 15'e eşit. 5.
Biçimlendireceğim sonuç ve çıktısını alın.
Ve sonra ben de F1'in çıktısını alacağım.
Bu yüzden göreceğiz ki fonksiyonun çağrılmasıyla
sonuç orijinaline göre değişir.
Bu yüzden çıktısını alacağım. işlevi çağırmanın sonucu,
ardından orijinal değer.
Bu bize şunları söyleyecektir hiç değişmedi.
Eğer başlangıçta negatifse ve pozitif olarak değiştirildi.
Bunu birden fazla çoklu testler için çizgiler.
Ve sonra 37. satırda, sadece Buradaki
fark, değeri bir değişkende saklamak yerine Bunu basacağım.
Bu yüzden sonuçları değiştirmek zorundayım burada doğru değişkene.
O zaman bunu yapalım.
Bu yüzden burada, bunu yapmak istiyorum.
İlk yazdığımda programında, onları ayrı olarak yazdım.
Umarım burada bir hata yapmamışımdır.
Ve ihtiyacım olanları değiştir ve bu iş görür.
Diğerleri aslında değil tüm değişkenlerin sonuçlarını
yazdırır, sadece 26. satırdakileri yazdırır.
Aksi takdirde, biz sadece sonuçları gösteriyor.
İlki sadece şunu gösteriyor f1 negatif bir değer
olduğu için değişti.
Hadi şunu inşa edelim.
Hiçbir hata ya da uyarı almadık.
İstediğimiz çıktı dikkat etmeniz gereken sadece
mutlak değer çıktısıdır.
Bu yüzden daha iyi olabilir aslında bazı satır beslemeleri ekleyin.
Sonuncusunu gösterdikten sonra, birkaç satır beslemesi ekleyelim.
Bunu okumak ve çalıştırmak daha kolay.
Şimdi sonucun 15 olduğunu görüyoruz. 5.
Yani aslında değiştirdi f1 başlangıçta 15 olduğu için negatiften
pozitife dönüşür. 5.
Ve diğer tüm sonuçlar aynı zamanda pozitif değerlerdir.
Son print deyimi yazdırılmadı sonucu yazdırmak yerine, sadece fonksiyondan
döndürülen değeri yazdırdı.
İşe yarıyor gibi görünüyor.
Yapmak istediğim son fonksiyon bir karekök fonksiyonuydu.
Bu bir fonksiyon olacaktır bir sayının karekökünü hesaplar.
Ve eğer olumsuz bir argüman geçilirse bir mesaj görüntülenecek
ve negatif 1 döndürülecektir.
Öyleyse şu ifadeyi tanımlayalım bu fonksiyon float karekök
olarak ve herhangi bir isimde bir float alır.
Ve karekök aslında mutlak değer fonksiyonunu kullanmak için.
Bu yüzden yukarıda tanımlayabiliriz ve işlev bildirimi nedeniyle
hala kullanabilir.
Öyleyse tanımlayalım, ve bir şamandıra alır.
Bu yüzden oldukça becerikli olmaya başladık. Bu fonksiyonların tanımlanması, dönüş
parametreleri için veri tipi, parantezler.
Bir çift yaratacağız yerel değişkenler burada.
Bunlar sadece blok içinden erişilir.
Bu sadece yardımcı olacak karekök algoritmamız ile.
Burada 59. satırda fark edeceksiniz, Sabit bir değişken oluşturdum.
Bu konuda konuşmadık, ancak bu sadece bir tanımlama kullanmak
yerine bir sabit oluşturmanın bir yoludur.
Adında bir float değişkeni oluşturduk Epsilon, bu . 001 yapmak için karekök hesaplamamıza
yardımcı olur. Belirli bir aralıkta olduğundan emin olun.
Tahminimiz 1. 1 ve burada bir mutlak değer bildirimi.
Aslında, bizim bir şey sağlamamıza gerek yok. çünkü onu üstte tanımladık,
bu yüzden ondan kurtulabilirim.
Şimdi unutmayın ki parametreleri kontrol edin, parametre doğrulaması
yapmak istiyoruz.
Parametre sıfırdan küçükse, bir
yorum yazdırmak ve negatif bir değer döndürmek istiyoruz.
Yani x sıfırdan küçükse, şunu yazdırın negatif argümanın karekökünü alır ve negatif
bir argüman döndürür.
İşte burada birden fazla dönüş değeri ve size
bir kez nasıl dönüş yapabileceğinizi göstereceğim ve sadece en alta koy.
Aksi takdirde, bizim karekök için algoritma.
Açıklamayacağım. Algoritma çünkü öğrendiğimiz şeyle
ilgili değil.
Ama temel olarak, kareyi bulmak için bir sayının kökü ile çarparak
mutlak değerini elde ederiz. ve sonra x'te eksi.
Yani tahmin edeceğiz.
Yani aslında tahmin edeceğiz ve sonra algoritmanın bu olup olmadığını
kontrol edin, belirli bir aralıkta olup olmadığını kontrol edin.
Ve eğer öyleyse, o zaman gidiyoruz tahminimizi bir şeye ayarlayıp ikiye böleceğiz
ve bu da geri döndüğümüzü tahmin etmek için.
Yani en altta, biz geri dönüş tahmini diyebilirim.
Ve bu yüzden mutlak değer fonksiyonu.
Bizim altımızda tanımlanmış, ama en üstte beyanımız
var, yani bu iyi.
Burada bir şey var ki çoklu geri dönüş ifadeleri.
Bu tamamen yasaldır, ancak kaçınılmalıdır çünkü neler olup bittiğini
anlamak daha zordur.
Yani burada yapacağım şey muhtemelen bu negatif olanı tahmin dışında bir değişkende
saklayın, ancak Bunu nasıl yapabileceğimizi görelim.
Yani yapacağım şey tahmin etmek 1 olarak başlatılır. 0 ve negatif bir değer döndürüyoruz.
Muhtemelen başka bir değişkenine float dönüş değeri adı verilir.
Bunu 0 olarak ayarlayabiliriz. 0.
Ve sonra buraya iade etmeden önce çünkü
bu matematik fonksiyonundan atlıyor, ben sadece dönüş değerinin negatif 1'e eşit
olduğunu söyler. 0 yerine geri dönüşe sahip olmak.
O zaman kontrol edebilirim ve diyebilirim ki dönüş değeri negatif 1'e
eşit değilse. 0 çünkü ben Geçersiz kılma numaram
zaten varsa bunu çalıştırmak istiyorum, Geçerli olmayan sayı ve bunu bir if deyimine sarabilirim.
Ve sonra while deyiminin içinde, Geri dönüş değerinin tahmine eşit olduğunu söyleyebilirim.
Bu şekilde doğru eğer geçerli bir girişse.
Ve sonra geri dönmek yerine Sanırım yaptığım şey dönüş
değerini döndürmek.
Ve bu kod biraz daha temiz çünkü sadece altta
bir kez dönüyor ve takip etmesi daha kolay.
Yani dönüş değeri ya negatiftir geçersiz bir argüman mı yoksa gerçek
kare mi olacak? geçersiz bir argüman değilse kök.
Ve biz de yapabiliriz dönüş değerini bile kontrol etmeyerek
bu kadar basit Burada muhtemelen sadece
başka demek ve orijinal if'in başka bir parçası.
Yani eğer pozitif bir sayı ise hatta daha temiz hale getirecektir, bu şekilde
if ifadesine gerek kalmaz.
Şimdi bunu test etmemiz gerekiyor.
Devam edelim ve bunu test edelim.
Biz sadece fonksiyonunu birkaç kez çalıştırdım.
Karekök testi diyeceğiz.
Hiçbir şey yapmayacağım. Burada süslü baskılar var.
Ben sadece emin olacağım okumayı kolaylaştırmak için bir sürü satır
beslemesi ekleyebilir.
Şuradaki ekle düğmesine basın.
Tamam. Bu yüzden şimdi sadece bir sürü printfs burada bazı
iyi ve değerli verileri ve bazı geçersiz verileri göndereceğim ve ben de aynı şekilde biçimlendireceğim.
İlk arama diyelim bazı iyi geçerli kareköklerin karekökü
olacaktır.
Pekala, önce kontrol edeceğiz negatif bir sayı ile.
Bu yüzden sadece eksi 3 diyeceğiz. bir hata yazdırması gerekir.
Aksi takdirde, test edeceğiz bazı geçerli sayılarla.
Yani 16'nın karekökü diyeceğiz, ve sadece bir int geçeceğiz, dönüştürülecekler, bazı
uyarılar alabilirim.
Şey, herhangi bir şey almak istemiyorum uyarılar, ve biz 165 yapacağız.
Şimdi bunu çalıştıralım ve test edelim.
Umarım derlenir.
Float ile ilgili bir yazım hatası var.
Şimdi çalıştırdığımda, umarım, iyi bir karekök çıktısı alacağız.
Yani burada olumsuz bir durum var.
Ve aslında negatif çıktı aldık tartışma skorları, yani bu iyi.
Ve sonra diğerleri, ben doğru karekökler olduğuna inanıyorum.
Yani görünüşe göre işlevi oldukça iyi çalışıyor.
16'nın karekökünü aldık 4 olan 25, 5 olan 9, 3 olan 165,
12'dir. 85.
Yani orada biraz yanlış hesaplama yaptım.
Bir şeyler düşünmeye çalışıyordum. 15 kere 15, yani 225.
Yani buraya 225 koyarsam karekök olarak 15 olarak geri gelir.
Bu kaynak kodunu sağlayacağım Böylece analiz
edebilirsiniz, ancak işlev bildirimlerini anlayabilirsiniz,
dönüş tipi ile bir fonksiyonun nasıl tanımlanacağını ve veri
aktaran parametreler, yerel değişkenleri anlamak, nasıl sadece bir kez altta dönmek için.
Algoritmanın kendisi o kadar da önemli değil.
Umarım bu yardımcı olmuştur. Teşekkür ederim.