Hallo, en welkom terug.
In deze lezing wil ik gaan door
een oplossingsdemonstratie van onze vorige uitdaging die: was
om enkele functies te creëren, voornamelijk de GCD-functie en a koppelfunctie, absolute waardefunctie
en een vierkantswortelfunctie.
Ik ga een project maken, en Ik ga
waarschijnlijk de projectfuncties een naam geven, ik ga om mijn bestaande project hier af te sluiten.
Wordt een andere console applicatie.
We zijn niet echt geraakt in bibliotheken of enige vorm van
grafische programmering.
Dit wordt hoe over slechts enkele functies.
Meestal wil je een goede naam daar, maar dit
is alleen voor leerdoeleinden.
Dus we zijn een beetje gewoon het bieden van generieke functies.
Als het een GCD-programma was, zou ik schrijf grootste gemene deler.
Maar het eerste wat we gaan doen is dat we ons
grootste gemene deler-programma gaan implementeren.
Dit wordt een functie die: vindt de grootste gemene deler tussen
twee niet-negatieve gehele getallen waarden en retourneert vervolgens de resultaten.
We zouden een functie moeten bieden ook prototypes zodat we ze kunnen
bellen en kunnen plaatsen ze overal in de functie.
Dus laten we dat doen.
Voor de eerste functie is dit is een functiedeclaratie.
Waarom maken we een functie? verklaring, zodat
we het overal in het programma kunnen aanroepen.
We hoeven eigenlijk niet implementeer deze
functie boven de hoofdfunctie wanneer we deze aanroepen.
En het is gewoon een goede gewoonte, het is heel gemakkelijk om
duidelijk te zien wat er in het programma gebeurt met alle functieverklaringen bovenaan.
Dit gaat een int teruggeven.
Dus onthoud, functiekop de eerste wat u doet, is dat u het type gegevens specificeert
dat wordt geretourneerd.
GCD gaat een int.
Het gaat dan naam de functie die GCD is.
En dan tussen haakjes staan gegevens die worden doorgegeven aan de GCD.
En dit gaat worden ook int.
We gaan twee gegevens doorgeven.
Die scheiden we dus met komma's.
We specificeren het gegevenstype voor elk en de naam van de variabele.
Ik ga gewoon in u en v zeggen.
En dan heb ik de puntkomma naar beëindig de definitie van de functie.
Nu kan ik mijn functie hieronder definiëren de main en ik kan het nog steeds
aanroepen en geen problemen krijgen.
Dus als je nu echt wilt
definieer de functie implementeer het, u doet dezelfde functie header int retourwaarde GCD.
Het moet overeenkomen met de verklaring in termen van soorten.
Je zou het iets anders kunnen noemen zoals int x voor de namen, maar
we zullen consistent zijn.
We gaan gewoon zeggen int v.
We weten dat het de functie is definitie omdat er haakjes
zijn die het lichaam definiëren.
Dit is de implementatiecode.
Het eigenlijke algoritme voor de GCD is vrij eenvoudig.
Het enige wat je hoeft te doen is een lus schrijven en ga door de lus en kijk
naar tijdelijke waarden op basis van restanten.
Dus ik ga een local maken variabele in mijn GCD-functie.
Hoe weten we dat het lokaal is omdat het staat tussen de haakjes voor 12 tot 14.
Deze variabele is niet toegankelijk binnen de hoofdfunctie.
Het is alleen lokaal in dit blok.
Hier ga ik gewoon heen bel temp omdat het lokaal is.
Ik ga nu ook mijn lus maken.
Ik ga een while-loop gebruiken.
En mijn while-lus gaat gewoon door om door te gaan tot v, wat onze grootste
gemene deler zou zijn.
Onthoud, de grootste gemene deler heeft twee parameters.
Er zou een parameter voor nodig zijn.
En op basis van beide parameters, het heeft een algoritme om te creëren om
de grootste gemene deler te vinden.
Dus als we proberen te vinden de deler,
moeten we ervoor zorgen dat v niet gelijk is aan nul, onze tweede parameter.
Dit is gewoon standaard onderdelen van het algoritme.
Terwijl de v niet gelijk is op nul zetten, gaan we
haakjes voor de lus plaatsen.
Wat we gaan doen is dat we ga
eerst de temp toewijzen aan de modulewaarde van u mod v.
We gaan je dan instellen gelijk is aan v, en we gaan
v gelijk stellen aan temp.
En dan willen we terugkeren gegevens van deze functie.
Dus hoe retourneren we gegevens van een functie? we gebruiken het return-sleutelwoord
en we retourneren gewoon de gegevens die we willen retourneren.
In dit geval willen we u retourneren.
Onthoud nu dat als deze functie geen gegevens heeft geretourneerd, zouden we
het type moeten wijzigen in void.
En dan konden we gewoon een retour hebben zonder gegevens.
Maar dit is het retourneren van gegevens.
We moeten dus matchen.
En hier zouden we zeg weer terug u.
Ook als we geen gegevens doorgeven voor deze functie kunnen we
void als parameters plaatsen of we kunnen: houd ze leeg en dat zou zeggen
dat de functie geen gegevens nodig heeft, maar we geven twee variabelen door.
En deze variabelen u en v zijn lokale variabelen naar de GCD-functie.
We kunnen ze binnen de functie gebruiken.
En dat is wat we doen.
Dit zijn allemaal kenmerken van een functie.
De retourwaarde, de gegevens die u geeft door, gebruikt lokale
variabelen en retourneert vervolgens gegevens.
Op al die dingen letten in de syntaxis met de haakjes en dan ook
met de verklaring bovenaan.
Nu willen we proberen om test deze functie.
Dus we willen het voor iedereen testen allerlei verschillende dingen.
Laten we doorgaan en onthouden dat dit functie retourneert gegevens, dus we willen waarschijnlijk een lokale
variabele maken in onze belangrijkste, we noemen het gewoon resultaat.
We kunnen het op nul initialiseren.
En dan willen we in principe de functie aanroepen.
Hoe roepen we een functie aan?
We specificeren gewoon de functie naam gevolgd door de gegevens die eraan
worden doorgegeven.
Omdat deze functie terugkeert data, ik ga zeggen resultaat is
gelijk aan en dan de functienaam.
De functienaam is GCD.
En ik ga het doorgeven 150 voor mijn eerste test en 35.
Ik ga nog twee andere tests doen om gewoon verschillende nummers door te geven, maar wat ik wil doen
is ik wil om de gegevens af te drukken die
het resultaat worden geretourneerd.
Dus ik ga printf zeggen, en ik ben gaan zeggen dat de GCD van 150 en 35 een
procentuele regelinvoer is en dan het resultaat.
Rechts. Dus regel 10 is belangrijk.
We krijgen gegevens terug van GCD dus we wijzen het toe aan een variabele.
En we kunnen de functie passeren noemen in twee constanten hier, 150 en 35.
We kunnen ook variabelen doorgeven.
De manier waarop we de functie aanroepen met gegevens die eraan zijn
doorgegeven, staan tussen haakjes, we plaatsen de waarden gescheiden door komma's en dan staat de
puntkomma daar aan het einde.
Ik wil meerdere testen doen.
Dus ik ga regel 10 kopiëren en 11 en voer gewoon wat andere gegevens in.
Ik ga in 1026 en 405 en dan ook 83.
En eigenlijk wat we zouden kunnen doen is in plaats van de variabele terug te
geven, zouden we hem eigenlijk gewoon op de kunnen zetten aanroep van de
functie in de printf en print hem daar uit, we hoeven het niet eens op te slaan.
Dus we zouden gewoon GCD 83, 240 kunnen zeggen.
We zouden moeten veranderen wat?
we printen hier uit in termen van de hardgecodeerde waarden, zeg: 1026, 405 en dan ook nog 240 en 83.
Dus laten we doorgaan en dat compileren.
Laten we ervoor zorgen dat we krijgen geen fouten of waarschuwingen.
We hebben geen fouten en waarschuwingen.
Dus laten we het uitvoeren.
Als we het uitvoeren, moeten we zien driemaal de grootste
gemene deler voor bepaalde getallen.
Dus we zien dat de GCD van 150 en 35 5 is.
De GCD van 1026 en 405 is 27.
En de GCD van 83 en 240 is 1.
Grootste gemene deler betekent de factoren die in die twee getallen passen,
wat is de hoogste factor.
Dus 5 gaat in 35, en 5 gaat in 150.
En dat is de hoogste.
27 past ook in 405 en 1026, dat is de hoogste tussen de twee.
Het lijkt er dus op dat het werkt.
En we hebben de basis van gegevens doorgeven en teruggeven.
Nu willen we een paar oefenen andere dingen in termen
van alleen algoritmen en probleemoplossing.
Laten we een andere functie maken absolute waarde genoemd.
De absolute waarde-functie gaat om een vlotter terug te brengen en een vlotter te nemen.
Het wordt een zeer eenvoudige functie.
Dus we gaan aankondigen de functie op regel vijf.
We gaan zeggen float absoluut waarde, dat is een naam gevolgd door de parameters, en we zijn gewoon
we gaan float x zeggen, en dan eindigen
we met een puntkomma.
Nogmaals, let op de functie declaratie, de retourwaarde, de
parameters specificeren met gegevenstypen en dan de naam van de functie.
We kunnen dan doorgaan en definiëren deze functie onder de
GCD-functie en het wordt heel eenvoudig.
We definiëren de functie met het type dat wordt geretourneerd, de naam
en dan de parameter, net als de verklaring behalve dat we nu haakjes hebben
om het codeblok te starten.
Dit is gemakkelijk, want alles wat we moeten doen is controleer de parameter die wordt
doorgegeven en controleer of deze kleiner is dan nul.
Als het minder dan nul is, dan we gaan het gewoon de
inverse toewijzen, wat een min x zou zijn.
Dus als het een minwaarde is, het gaat vermenigvuldigen met
een min en een positief teruggeven.
En die gegevens willen we teruggeven.
Dus we gaan zeggen keer x terug.
Nu een ding dat ik noemde in
de colleges waar ik geen voorbeeld van mocht geven was wat als u overal gegevens retourneert.
Omdat we een heleboel kunnen hebben if-statements, en we zouden in elke if-statement
kunnen terugkomen.
En dus kan uw functie, in theorie, hebben veel return-statements als ze zich in
ifs of loops bevinden.
En dan zou je kunnen heb er een aan de onderkant.
Het probleem hiermee is: het is echt moeilijk te volgen.
Als je anders moet retourneren delen van uw code slaat u in principe gewoon de
gegevens op in een variabele en geef het onderaan terug.
Maar hier is dit een eenvoudige functie.
We geven gewoon een waarde terug.
Laten we doorgaan en proberen te gebruiken deze functie en het is heel fijn dat er drijvers
voor nodig zijn, zodat we dat kunnen gebruik het met gehele getallen en floats.
Dus ik ga creëren een paar variabelen hier die
we gaan doorgeven.
En ik ga ook om een geheel getal te maken.
dat ga ik doen bovenaan mijn hoofd.
ik ga creëren een vlotter voor F1 F2 F3.
En ik ga een geheel getal I1 maken.
En ik ga er nog een maken variabele die het resultaat opslaat, maar het moet
een float zijn.
Dus ik zal moeten
creëren een andere variabele en dit
is gewoon het resultaat van de absolute waarde, en ik zal dat initialiseren
op 0. 0.
Nu ga ik een beroep doen op de functie en print de resultaten.
Dus ik ga kopiëren en plak hier wat code.
Ik kan de functie aanroepen en opslaan de gegevens die worden geretourneerd of ik kan
het gewoon doorgeven aan de printf-functie.
Ik wil hier waarschijnlijk wat opmerkingen plaatsen om
de absolute waarde-functie te testen.
En als je de sterretjes op een single gebruikt lijn, het benadrukt het een beetje.
Dus hier heb ik een paar telefoontjes naar het absolute geplakt waardefunctie en vervolgens enkele resultaten weergegeven.
Dus hier over 24 bel ik absolute waarde met f1.
Onthoud dat f1 een float is.
Het is gelijk aan min 15. 5.
Ik ga de . formatteren resultaat en print het uit.
En dan ben ik ook ik ga f1 printen.
Dus we gaan kijken of de resultaat verandert door
de functie aan te roepen dan het origineel.
Dus ik ga uitprinten het resultaat van het aanroepen van de functie
en vervolgens de oorspronkelijke waarde.
Dit zal ons vertellen of het is helemaal veranderd.
Als het oorspronkelijk negatief was en veranderd in positief.
Dat doen op meerdere lijnen voor meerdere tests.
En dan in regel 37, de enige verschil hier
is dat in plaats van de waarde op te slaan in een variabele, Ik ga het gewoon uitprinten.
Dus ik moet de resultaten veranderen hier naar de juiste variabele.
Dus laten we dat doen en.
Dus hier beneden wil ik dat doen.
Toen ik oorspronkelijk de . schreef programma, heb ik ze apart geschreven.
Dus hopelijk maak ik hier geen fouten.
En verander al degene die ik nodig heb veranderen en dat zou het moeten doen.
De andere zijn dat eigenlijk niet het afdrukken van de resultaten
van alle variabelen, alleen die op regel 26.
Anders zijn we gewoon de resultaten tonen.
De eerste laat dat gewoon zien het is dat het is veranderd
omdat f1 een negatieve waarde is.
Laten we dit bouwen.
We hebben geen fouten of geen waarschuwingen.
De output die we willen let op is alleen
de absolute waarde output.
Dus misschien is het beter om voeg eigenlijk wat regelfeeds toe.
Nadat we onze laatste hebben getoond, laten we een paar regelfeeds toevoegen.
Makkelijker om dit te lezen en uit te voeren.
Dus nu zien we dat het resultaat 15 is. 5.
Dus het heeft het eigenlijk veranderd van negatief naar positief omdat
f1 oorspronkelijk 15 was. 5.
En alle andere resultaten zijn ook positieve waarden.
De laatste printopdracht is niet afgedrukt uit het resultaat, het drukt gewoon de waarde
af die is geretourneerd door de functie.
Het lijkt erop dat het werkt.
De laatste functie die ik wilde definiëren was een vierkantswortelfunctie.
Dit zou een functie zijn die: berekent de vierkantswortel van een getal.
En als een negatief argument is doorgegeven, wordt een bericht weergegeven
en wordt negatief 1 geretourneerd.
Dus laten we de verklaring van . definiëren deze functie als float-vierkantswortel en
er is een float voor nodig met een willekeurige naam.
En vierkantswortel gaat eigenlijk om de absolute waardefunctie te gebruiken.
Dus we kunnen het hierboven definiëren het en gebruik het nog
steeds vanwege de functiedeclaratie.
Dus laten we het definiëren, en het duurt een float.
Dus we worden behoorlijk handig in definiëren van deze functies,
gegevenstype voor retourparameters, haakjes.
We gaan een koppel maken lokale variabelen hier.
Deze kunnen alleen worden toegankelijk binnen het blok.
Dit gaat gewoon helpen met ons vierkantswortelalgoritme.
U ziet hier op lijn 59, Ik heb een constante variabele gemaakt.
Daar hebben we het niet over gehad, maar dat is slechts een manier om een
constante te creëren in plaats van een definitie te gebruiken.
We hebben een float-variabele gemaakt met de naam epsilon, het is . 001, het helpt bij het
maken van onze vierkantswortelberekening zeker dat het binnen een bepaald bereik valt.
We hebben een gok die 1 is. 1 en hier een absolute waardeverklaring.
We hoeven eigenlijk niet te voorzien de verklaring omdat we die bovenaan
hebben gedefinieerd, dus daar kan ik vanaf.
Onthoud nu dat we moeten controleer de parameters, we
willen parametervalidatie doen.
Als de parameter kleiner is
dan nul, we willen een opmerking afdrukken en een negatieve waarde retourneren.
Dus als x kleiner is dan nul, print out negatief argument naar vierkantswortel
en retourneer een negatieve.
Hier gaan we het hebben meerdere retourwaarden, en
ik zal je laten zien hoe je één keer kunt retourneren en zet het gewoon onderaan.
Anders hebben we onze algoritme voor vierkantswortel.
Ik ga het niet uitleggen algoritme omdat het niet relevant is voor
wat we leren.
Maar eigenlijk, om het plein te vinden wortel van een getal, we krijgen de absolute
waarde ervan door te vermenigvuldigen het en dan min in de x.
Dus de gok is dat we gaan raden.
Dus oorspronkelijk gaan we raden en controleer dan of dit
het algoritme is, controleer of het binnen een bepaald bereik valt.
En als dat zo is, dan gaan we om onze gok op iets te zetten en het door twee te
delen en dat gaat om de gok te zijn dat we terugkeren.
Dus helemaal onderaan, we zou zeggen terug raden.
En dus gebruiken we de absolute waarde functie.
Het is onder ons gedefinieerd, maar we hebben onze verklaring bovenaan,
dus dat is goed.
Een ding hier is dat we hebben meerdere aangiften.
Dit is volkomen legaal, maar het zou moeten worden vermeden omdat het moeilijker is om erachter te
komen wat er aan de hand is.
Dus wat ik hier zou doen, is dat ik dat zou doen sla deze negatieve waarschijnlijk op in een
andere variabele dan raden, maar laten we hier kijken hoe we dit kunnen doen.
Dus wat ik zou doen is raden wordt geïnitialiseerd op 1. 0, en we geven een
negatieve terug.
Ik zou waarschijnlijk gewoon een andere maken variabele genaamd float-retourwaarde.
We kunnen dit op 0 zetten. 0.
En dan voordat je het hier
terugbrengt omdat dit uit de wiskundige functie springt, kan ik gewoon stel dat de retourwaarde gelijk
is aan negatief 1. 0 in plaats van het rendement te hebben.
Dan kan ik controleren en ik kan zeggen als de retourwaarde niet gelijk is aan
een negatieve 1. 0 omdat ik dat niet doe
dit wil uitvoeren als ik mijn ongeldige nummer al heb, ongeldig nummer, en ik zou dit in een if-statement
kunnen verpakken.
En dan in de while-statement, Ik kan zeggen dat de retourwaarde gelijk is aan de gok.
Op die manier geef ik de juiste terug ding als het een geldige invoer was.
En dan in plaats van terug te keren raad eens wat ik
doe, ik retourneer de retourwaarde.
En deze code is een beetje schoner omdat het
maar één keer onderaan terugkeert en het gemakkelijker te volgen is.
Dus de retourwaarde is ofwel negatief één als het een ongeldig argument is of als
het het eigenlijke vierkant wordt root als het geen ongeldig argument is.
En we zouden zelfs kunnen maken zo eenvoudig door gewoon niet eens de retourwaarde
te controleren hier zou waarschijnlijk gemakkelijker zijn om gewoon anders
te zeggen en de . te maken anders een deel van het origineel als.
Dus als het een positief getal is dat zou het zelfs schoner maken op die
manier dat je die if-verklaring niet hebt.
Nu moeten we het testen.
Laten we doorgaan en dit testen.
We bellen gewoon de een aantal keer functioneren.
We zullen zeggen vierkantswortel testen.
ik ga er niks aan doen mooie afdrukken hier.
ik zal er gewoon voor zorgen dat ik kan een aantal regelfeeds toevoegen, zodat
het gemakkelijker te lezen is.
Druk daar op de invoegknop.
Oke. Dus nu ga ik gewoon een heleboel doen
printfs waar ik wat goede en val-gegevens en wat inval-gegevens zal sturen en ik zal het op dezelfde manier formatteren.
Laten we zeggen de eerste oproep zal de vierkantswortel zijn van wat enkele goede geldige
vierkantswortels zijn.
Nou, eerst gaan we kijken het met een negatief getal.
Dus we zeggen gewoon negatief 3 dat zou een fout moeten afdrukken.
Anders testen we het met enkele geldige nummers.
Dus we zeggen de vierkantswortel van 16, en we geven gewoon een int door, ze worden bekeerd,
ik krijg misschien wat waarschuwingen.
Nou, ik wil er geen krijgen waarschuwingen, en we doen 165.
Laten we dit nu uitvoeren en testen.
Laten we hopen dat het zal compileren.
Ik heb een spelfout met float.
Als ik het nu run, hopelijk, we krijgen een goede vierkantsworteluitvoer.
Dus hier hebben we een negatieve.
En we hebben zelfs negatief uitgeprint argument scores, dus dat is goed.
En dan zijn de andere, ik geloof, de juiste vierkantswortels.
Dus het lijkt erop dat de functie werkt redelijk goed.
We deden vierkantswortel van 16 dat is 4, 25 dat is 5, 9, dat is 3,
165 is 12. 85.
Dus daar heb ik een rekenfout gemaakt.
Ik probeerde te denken aan 15 keer 15 wat 225 is.
Dus als ik er 225 in zou stoppen, zou het kom terug als 15 als een vierkantswortel.
Ik ga deze broncode verstrekken voor
u zodat u het kunt analyseren, maar functiedeclaraties begrijpt, begrijpen hoe
je een functie definieert met het retourtype en de
parameters die gegevens doorgeven, lokale variabelen begrijpen, begrijpen hoe om maar één keer onderaan terug te keren.
Het algoritme zelf is niet zo belangrijk.
Ik hoop dat dit heeft geholpen. Dank u.