Witam i witam ponownie.
W tym wykładzie chcę iść poprzez
demonstrację rozwiązania naszego poprzedniego wyzwania, które było stworzenie
niektórych funkcji, głównie funkcji GCD oraz a funkcja para, funkcja wartości bezwzględnej i
funkcja pierwiastka kwadratowego.
Mam zamiar stworzyć projekt i Prawdopodobnie
zamierzam tylko nazwać funkcje projektu, zamierzam aby zamknąć mój istniejący projekt tutaj.
Będzie inny Aplikacja konsoli.
Tak naprawdę nie dostaliśmy do bibliotek lub dowolnego rodzaju
oprogramowania graficznego.
To będzie jak tylko o niektórych funkcjach.
Zwykle chcesz mieć dobre imię, ale to tylko
do celów edukacyjnych.
Więc jesteśmy trochę sprawiedliwi udostępnianie funkcji ogólnych.
Gdyby to był program GCD, zrobiłbym to napisz największy wspólny dzielnik.
Ale pierwsza rzecz, którą zrobimy czy zamierzamy wdrożyć nasz
największy wspólny program dzielników.
To będzie funkcja, która znajduje największy wspólny dzielnik między dwiema
nieujemnymi liczbami całkowitymi wartości, a następnie zwraca wyniki.
Powinniśmy zapewniać funkcje prototypy, abyśmy mogli je nazwać i
umieścić je w dowolnym miejscu funkcji.
Więc zróbmy to.
W przypadku pierwszej funkcji this jest deklaracją funkcji.
Dlaczego tworzymy funkcję deklarację, abyśmy
mogli ją wywołać w dowolnym miejscu programu.
Właściwie nie musimy zaimplementuj tę
funkcję powyżej funkcji głównej, kiedy ją wywołujemy.
I to po prostu dobra praktyka bardzo łatwo jest jasno zobaczyć,
co się dzieje w programie ze wszystkimi plikami deklaracje funkcji u góry.
To zwróci wartość int.
Więc pamiętaj, nagłówek funkcji jako pierwszy co musisz zrobić, to określić typ danych, które mają
zostać zwrócone.
GCD zwróci int.
Będzie wtedy nazwać funkcja, którą jest GCD.
A następnie wewnątrz nawiasów są dane przekazywane do GCD.
I to będzie być też int.
Przekażemy dwie pozycje danych.
Więc oddzielamy je przecinkami.
Określamy typ danych dla każdy i nazwę zmiennej.
Powiem tylko do ciebie i v.
A potem mam średnik do zakończ definicję funkcji.
Teraz mogę zdefiniować moją funkcję poniżej main i nadal mogę go wywołać
i nie mieć żadnych problemów.
Więc teraz, kiedy naprawdę chcesz zdefiniuj
funkcję zaimplementuj ją, zrobisz tę samą funkcję nagłówek int zwracana wartość GCD.
Musi pasować do oświadczenie w zakresie typów.
Możesz nazwać to inaczej jak int x dla nazw, ale
będziemy konsekwentni.
Powiemy tylko, że int v.
Wiemy, że to funkcja definicja, ponieważ istnieją
nawiasy, które definiują treść.
To jest kod implementacji.
Rzeczywisty algorytm dla GCD jest dość proste.
Wszystko, co musisz zrobić, to napisać pętlę i przejdź przez pętlę i spójrz na
wartości temp na podstawie reszty.
Więc mam zamiar stworzyć lokalną zmienna w mojej funkcji GCD.
Skąd wiemy, że jest lokalny, ponieważ jest w nawiasach od 12 do 14.
Ta zmienna nie jest dostępna wewnątrz funkcji głównej.
Jest lokalna tylko dla tego bloku.
Tutaj po prostu zamierzam temp. rozmowy, ponieważ jest lokalna.
Teraz też utworzę moją pętlę.
Użyję pętli while.
A moja pętla while właśnie się uruchamia przejść do v, co byłoby naszym
największym wspólnym dzielnikiem.
Pamiętaj, największy wspólny dzielnik przyjmuje dwa parametry.
Wymagałoby to parametru.
Na podstawie obu tych parametrów ma algorytm do stworzenia, aby
znaleźć największy wspólny dzielnik.
Więc jeśli próbujemy znaleźć dzielnik, musimy
upewnić się, że v nie jest równe zero, nasz drugi parametr.
To jest po prostu standard części algorytmu.
Podczas gdy v nie jest równe do zera,
wstawimy nawiasy dla pętli.
To, co zamierzamy zrobić, to my
zamierzam najpierw przypisać temp do wartości modułów u mod v.
Następnie ustawimy cię równe v i ustawimy
v równe temp.
A potem chcemy wrócić dane z tej funkcji.
Jak więc zwracamy dane z funkcja? używamy słowa kluczowego
return i po prostu zwracamy dane, które chcemy zwrócić.
W takim przypadku chcemy Ci zwrócić.
Teraz pamiętaj, że jeśli ta funkcja nie zwrócił żadnych danych,
musielibyśmy zmienić typ na void.
A potem moglibyśmy po prostu mieć zwrot bez danych.
Ale to jest zwracanie danych.
Więc musimy się dopasować.
A my byśmy to zrobili powiedz powrót ponownie u.
Także gdybyśmy nie przekazywali danych do tej funkcji
moglibyśmy umieścić void jako parametry lub moglibyśmy pozostaw je puste, a
to oznacza, że funkcja nie pobiera danych, ale przekazujemy dwie zmienne.
A te zmienne uiv są zmienne lokalne do funkcji GCD.
Możemy ich używać wewnątrz funkcji.
I właśnie to robimy.
To wszystko są cechy funkcji.
Wartość zwracana, dane, które przekazujesz, używając zmiennych lokalnych,
a następnie zwracając dane.
Na wszystkie te rzeczy zwróć uwagę składnię z nawiasami, a następnie
z deklaracją na górze.
Teraz chcemy spróbować przetestuj tę funkcję.
Więc chcemy to przetestować dla wszystkich różne rzeczy.
Śmiało i pamiętajmy o tym funkcja zwraca dane, więc prawdopodobnie będziemy chcieli utworzyć zmienną
lokalną w naszym głównym, nazwiemy to po prostu wynikiem.
Możemy go zainicjalizować do zera.
A potem chcemy po prostu wywołaj funkcję.
Jak wywołać funkcję?
Po prostu określamy funkcję nazwa, po której następuje przekazanie do
niego danych.
Ponieważ ta funkcja zwraca dane, powiem, że wynik równa
się, a następnie nazwa funkcji.
Nazwa funkcji to GCD.
I mam zamiar zdać to 150 za mój pierwszy test i 35.
Mam zamiar zrobić dwa inne testy po prostu przekazać różne liczby, ale ja
chcę to zrobić wydrukować dane, które są
zwracane jako wynik.
Więc powiem printf i jestem powiem, że GCD 150 i 35 to procent
wysuwu wiersza, a następnie wynik.
Dobrze. Więc linia 10 jest ważna.
Odzyskujemy dane z GCD, więc przypisujemy go do zmiennej.
I możemy nazwać funkcję pass w dwóch stałych tutaj, 150 i 35.
Moglibyśmy również przekazywać zmienne.
Sposób, w jaki wywołujemy funkcję z przekazanymi do niego danymi
znajduje się w nawiasach, umieszczamy wartości oddzielone przecinkami, a na końcu
znajduje się średnik.
Chcę zrobić wiele testów.
Więc mam zamiar skopiować wiersze 10 i 11 i po prostu wprowadź inne dane.
Zamierzam wstawić 1026 i 405, a następnie również 83.
Właściwie to, co moglibyśmy zrobić, to zamiast zwracać zmienną, moglibyśmy
po prostu umieścić ją w formacie wywołanie funkcji
wewnątrz printf i wydrukowanie tego właśnie tam, nie musimy go nawet zapisywać.
Możemy więc po prostu powiedzieć GCD 83, 240.
Musielibyśmy to zmienić
wypisujemy tutaj, powiedzmy, wartości zakodowane na stałe 1026, 405, a następnie również 240 i 83.
Więc przejdźmy dalej i skompilujmy to.
Upewnijmy się, że dostaniemy brak błędów i ostrzeżeń.
Nie mamy żadnych błędów i ostrzeżeń.
Więc uruchommy to.
Kiedy go uruchomimy, powinniśmy zobaczyć największy wspólny dzielnik
trzykrotnie dla określonych liczb.
Widzimy więc, że GCD 150 i 35 to 5.
GCD 1026 i 405 to 27.
A GCD 83 i 240 to 1.
Największy wspólny dzielnik oznacza czynniki, które mieszczą się w tych dwóch
liczbach, jaki jest czynnik najwyższy.
Więc 5 mieści się w 35, a 5 mieści się w 150.
I to jest najwyższy.
27 idzie również do 405 i 1026, to znaczy najwyższy między nimi.
Więc wygląda na to, że działa.
Omówiliśmy podstawy przekazywanie danych i zwracanie danych.
Teraz chcemy poćwiczyć parę inne rzeczy w zakresie samych
algorytmów i rozwiązywania problemów.
Stwórzmy inną funkcję zwana wartością bezwzględną.
Działa funkcja wartości bezwzględnej aby zwrócić float i wziąć float.
To będzie bardzo prosta funkcja.
Więc zamierzamy zadeklarować funkcja w linii piątej.
Powiemy, że float jest absolutny wartość, to nazwa, po której następują parametry, i jesteśmy
po prostu powiemy float x, a
następnie zakończymy średnik.
Ponownie zwróć uwagę na funkcję deklaracja, wartość zwracana,
parametry określane za pomocą typów danych a następnie nazwa funkcji.
Następnie możemy przejść dalej i zdefiniować ta funkcja znajduje się
poniżej funkcji GCD i będzie bardzo prosta.
Funkcję definiujemy za pomocą typu który zostanie zwrócony, nazwa, a
następnie parametr, tak jak w przypadku deklaracja z tą różnicą, że teraz mamy
nawiasy na początek bloku kodu.
Jest to łatwe, ponieważ wszystko, co musimy zrobić sprawdza parametr, który jest
przekazywany i czy jest mniejszy od zera.
Jeśli jest mniej niż zero, to zamierzamy po prostu przypisać
mu odwrotność, która będzie minus x.
Więc jeśli jest to wartość ujemna, pomnoży się
przez minus i zwróci wartość dodatnią.
Chcemy zwrócić te dane.
Więc powiemy return x.
Teraz jedna rzecz, o której wspomniałem w
Po co były wykłady, których nie dostałem jako przykładu jeśli zwrócisz dane przez cały czas.
Ponieważ moglibyśmy mieć kilka plików if, a moglibyśmy zwracać w każdej
instrukcji if.
Twoja funkcja może więc w Teoria, ma wiele instrukcji powrotu, jeśli znajdują się one
wewnątrz ifów lub pętli.
A potem możesz mieć jeden na dole.
Problem z tym jest to naprawdę trudne do naśladowania.
Jeśli chcesz zwrócić inny części kodu, po prostu przechowują dane
w zmiennej i zwróć na dole.
Ale tutaj jest to prosta funkcja.
Zwracamy tylko wartość.
Chodźmy dalej i spróbujmy użyć ta funkcja i to naprawdę fajne, że wymaga
pływaków, więc możemy używaj go z liczbami całkowitymi i zmiennoprzecinkowymi.
Więc zamierzam tworzyć kilka zmiennych tutaj,
które przekażemy.
I ja też jadę aby utworzyć liczbę całkowitą.
Mam zamiar to zrobić u góry mojej strony głównej.
Mam zamiar tworzyć pływak dla F1 F2 F3.
I utworzę liczbę całkowitą I1.
I mam zamiar stworzyć inny zmienna przechowująca wynik, ale musi to
być liczba zmiennoprzecinkowa.
Więc będę musiał
tworzyć kolejna zmienna, a to
będzie po prostu powiedzieć wartość bezwzględną wyniku, a ja zainicjalizuję ją
na 0. 0.
Teraz mam zamiar wywołać funkcji i wydrukuj wyniki.
Więc mam zamiar skopiować i wklej tutaj kod.
Mogę wywołać funkcję i zapisać dane, które są zwracane lub mogę po prostu
przekazać je do funkcji printf.
Prawdopodobnie chciałbym zrobić kilka komentarzy tutaj
testujących funkcję wartości bezwzględnej.
A kiedy użyjesz gwiazdek na singlu linia, to trochę ją podkreśla.
Więc tutaj wkleiłem tylko kilka wywołań do absolutu value, a następnie wyświetla wyniki.
Więc tutaj w 24 dzwonię wartość bezwzględna z f1.
Pamiętaj, f1 to liczba zmiennoprzecinkowa.
Jest równe minus 15. 5.
Mam zamiar sformatować plik wynik i wydrukuj go.
A potem ja też zamierzam wydrukować f1.
Więc zobaczymy, czy wynik zmienia się
przez wywołanie funkcji niż oryginał.
Więc zamierzam wydrukować wynik wywołania funkcji, a
następnie oryginalna wartość.
To nam powie, czy to się w ogóle zmieniło.
Jeśli pierwotnie był negatywny i zmieniony na pozytywny.
Robię to na wielu linie do wielu testów.
A potem w linii 37, jedyny
różnica polega na tym, że zamiast przechowywać wartość w zmiennej, Po prostu go wydrukuję.
Więc muszę zmienić wyniki tutaj do prawej zmiennej.
Więc zróbmy to i.
Więc tutaj, chcę to zrobić.
Kiedy pierwotnie pisałem program, napisałem je jako osobne.
Mam więc nadzieję, że nie popełnię tutaj błędów.
I zmień wszystkie, których potrzebuję zmienić i to powinno wystarczyć.
Pozostałe tak naprawdę nie są wypisywanie wyników wszystkich
zmiennych, tylko tych z linii 26.
W przeciwnym razie jesteśmy po prostu pokazując wyniki.
Pierwsza tylko to pokazuje zmieniło się, ponieważ
f1 jest wartością ujemną.
Cóż, zbudujmy to.
Nie mamy żadnych błędów ani ostrzeżeń.
Wynik, który chcemy Zwróć uwagę, to tylko
bezwzględna wartość wyjściowa.
Więc może lepiej w rzeczywistości dodaj kilka nowych linii.
Po tym, jak wyświetlimy nasz ostatni, dodajmy kilka linijek.
Łatwiej to odczytać i uruchomić.
Więc teraz widzimy, że wynik to 15. 5.
Więc faktycznie to zmieniło z negatywnej na pozytywną, ponieważ f1
pierwotnie wynosiło 15. 5.
I wszystkie inne wyniki są również wartościami dodatnimi.
Ostatnia wydrukowana instrukcja nie została wydrukowana wyszedł wynik, po prostu
wypisał wartość zwróconą przez funkcję.
Wygląda na to, że to działa.
Ostatnia funkcja, którą chciałem define była funkcją pierwiastkową.
To byłaby funkcja, która oblicza pierwiastek kwadratowy z liczby.
A jeśli argumentem negatywnym jest powiodło się, wiadomość zostanie wyświetlona
i zostanie zwrócony minus 1.
Zdefiniujmy więc deklarację ta funkcja działa jako zmiennoprzecinkowy pierwiastek kwadratowy
i przyjmuje liczbę zmiennoprzecinkową o dowolnej nazwie.
I faktycznie jest pierwiastek kwadratowy aby użyć funkcji wartości bezwzględnej.
Więc możemy to zdefiniować powyżej it i nadal go używać ze
względu na deklarację funkcji.
Więc zdefiniujmy to, i wymaga pływania.
Więc stajemy się całkiem przydatni definiowanie tych funkcji, typ danych
dla parametrów zwracanych, nawiasy.
Stworzymy parę zmienne lokalne tutaj.
To może być tylko dostępne wewnątrz bloku.
To tylko pomoże z naszym algorytmem pierwiastka kwadratowego.
Zauważysz tutaj w liniach 59, Stworzyłem stałą zmienną.
Nie rozmawialiśmy o tym, ale to tylko sposób na stworzenie
stałej, w przeciwieństwie do używania definicji.
Stworzyliśmy zmienną typu float o nazwie epsilon, to jest. 001, pomocne przy obliczaniu
pierwiastka kwadratowego pewny, że mieści się w podanym zakresie.
Domyślamy się, że jest to 1. 1 i tutaj deklaracja wartości bezwzględnej.
W rzeczywistości nie musimy zapewniać deklarację, ponieważ zdefiniowaliśmy ją u
góry, więc mogę się tego pozbyć.
Teraz pamiętaj, że musimy sprawdź parametry, chcemy przeprowadzić
walidację parametrów.
Jeśli parametr jest mniejszy
od zera, chcemy wydrukować komentarz i zwrócić wartość ujemną.
Więc jeśli x jest mniejsze od zera, drukuj wyciągnij ujemny argument do pierwiastka kwadratowego
i zwróć ujemny argument.
Oto, gdzie będziemy mieć wiele wartości zwracanych,
a pokażę ci, jak możesz zwrócić raz i po prostu umieść go na dole.
W przeciwnym razie mamy nasze algorytm dla pierwiastka kwadratowego.
Nie będę wyjaśniał algorytm, ponieważ nie ma związku z tym,
czego się uczymy.
Ale w zasadzie, żeby znaleźć kwadrat pierwiastek z liczby, jej wartość
bezwzględną uzyskujemy mnożąc to, a następnie minus w x.
Więc przypuszczam, że zgadniemy.
Więc pierwotnie zamierzamy zgadnąć i następnie sprawdź, czy
to jest algorytm, sprawdź, czy mieści się w określonym zakresie.
A jeśli tak, to jedziemy aby ustawić nasze przypuszczenie na coś i podzielić to
przez dwa i gotowe być przypuszczeniem, że wrócimy.
Więc na samym dole, my powiedziałby zgadnij zwrotny.
Więc używamy funkcja wartości bezwzględnej.
Jest zdefiniowane poniżej nas, ale nasza deklaracja znajduje się na górze,
więc to dobrze.
Mamy jedną rzecz wielokrotne instrukcje powrotu.
Jest to całkowicie legalne, ale powinno należy unikać, ponieważ trudniej jest
dowiedzieć się, co się dzieje.
Więc co bym tutaj zrobił, to zrobiłbym prawdopodobnie przechowuj to ujemne w zmiennej innej
niż przypuszczenie, ale zobaczmy tutaj, jak możemy to zrobić.
Więc zgaduję jest inicjowany na 1. 0 i zwracamy
ujemną.
Prawdopodobnie stworzyłbym inny zmienna o nazwie float zwracana wartość.
Możemy ustawić to na 0. 0.
A potem przed zwróceniem go tutaj
ponieważ to jest wyskakiwanie z funkcji matematycznej, mogę po prostu powiedzmy, że zwracana wartość
jest równa minus 1. 0 zamiast zwrotu.
Wtedy mogę sprawdzić i powiedzieć jeśli zwracana wartość nie jest równa
ujemnej 1. 0, bo nie mam
chcę to zrobić, jeśli mam już unieważniony numer, nieprawidłowa liczba i mógłbym zawrzeć to w
instrukcji if.
Następnie w instrukcji while Mogę powiedzieć, że wartość zwracana jest równa domysłowi.
W ten sposób zwracam poprawną rzecz, jeśli to był prawidłowy wpis.
A potem zamiast wracać domyślam się, że
zwracam wartość zwracaną.
Ten kod jest nieco bardziej przejrzysty ponieważ
powraca tylko raz na dole i jest łatwiejszy do śledzenia.
Zatem wartość zwracana jest ujemna jeden, jeśli jest to nieprawidłowy argument lub będzie
to rzeczywisty kwadrat root, jeśli nie jest to nieprawidłowy argument.
Mogliśmy nawet zrobić jest to proste, po prostu nie sprawdzając nawet
zwracanej wartości tutaj prawdopodobnie łatwiej byłoby po
prostu powiedzieć inaczej i utworzyć plik inna część oryginału, jeśli.
Więc jeśli jest to liczba dodatnia, to uczyniłoby to nawet czystszym w ten sposób,
że nie masz tego oświadczenia if.
Teraz musimy to przetestować.
Chodźmy dalej i przetestujmy to.
Po prostu zadzwonimy do funkcjonować kilka razy.
Powiemy, że testowanie pierwiastka kwadratowego.
Nie zamierzam nic robić fantazyjne drukowanie tutaj.
Po prostu upewnię się, że ja może dodać kilka nowych linii, aby
było łatwiejsze do odczytania.
Naciśnij tam przycisk wstawiania.
W porządku. Więc teraz zrobię kilka printfs, gdzie wyślę
trochę dobrych i wartościowych danych oraz trochę danych nieważnych i sformatuję to w ten sam sposób.
Powiedzmy tylko pierwszy telefon będzie pierwiastkiem kwadratowym z jakichś dobrych, poprawnych
pierwiastków kwadratowych.
Cóż, najpierw sprawdzimy liczbą ujemną.
Więc powiemy po prostu minus 3 powinno to spowodować wyświetlenie błędu.
W przeciwnym razie przetestujemy to z kilkoma prawidłowymi numerami.
Więc powiemy pierwiastek kwadratowy z 16, i po prostu miniemy int, zostaną przekonwertowani,
mogę otrzymać ostrzeżenia.
Cóż, nie chcę żadnego dostać ostrzeżenia, a my zrobimy 165.
Teraz uruchommy to i przetestujmy.
Miejmy nadzieję, że się skompiluje.
Wystąpił błąd w pisowni z wartością typu float.
Teraz, kiedy go uruchomię, mam nadzieję, otrzymamy dobry wynik pierwiastka kwadratowego.
Więc tutaj mamy negatywny.
Wydrukowaliśmy negatyw wyniki argumentów, więc to dobrze.
A potem są inni, ja wierzyć, prawidłowe pierwiastki kwadratowe.
Więc wygląda na to funkcja działa całkiem nieźle.
Zrobiliśmy pierwiastek kwadratowy z 16 czyli 4, 25, czyli 5, 9, czyli 3,
165 to 12. 85.
Więc popełniłem tam błąd w obliczeniach.
Próbowałem o tym pomyśleć 15 razy 15, czyli 225.
Więc jeśli wstawię tutaj 225, to będzie wróć jako 15 jako pierwiastek kwadratowy.
Mam zamiar dostarczyć ten kod
źródłowy dla Ciebie, abyś mógł to przeanalizować, ale rozumiesz deklaracje
funkcji, zrozumieć, jak zdefiniować funkcję z typem zwracanym i
rozszerzeniem parametry przekazujące dane, rozumieć zmienne lokalne, rozumieć, jak to zrobić wrócić tylko raz na dół.
Sam algorytm nie jest takie ważne.
Mam nadzieję, że to pomogło. Dziękuję Ci.