LUIDSPREKER 1: Oke. Welkom terug. Dit is Week Twee van CS50, en we hebben tot nu toe gebruik gemaakt van functies, maar grotendeels overgenomen ze voor lief. We hebben printf gebruikt, die de heeft bijwerking druktechnieken dingen op het scherm. We hebben gebruikt krijgen-int, krijg zweven. Maar wat als u daadwerkelijk wilt maken uw eigen functies, zoals sommige van u misschien al begonnen te doen voor Probleemverzameling One, hoewel niet strikt noodzakelijk is? Nou, laten we verder gaan en opnieuw dat probleem van alleen de gebruiker vragen hun naam en afdrukken iets op de scherm, maar probeer factor enkele van de gemeenschappelijkheid die we hebben gezien in onze code tot nu toe. Dus door dat bedoel ik het volgende. Ik ga om te gaan en te creëren een nieuw programma, gewoon bellen het hello.c zoals gewoonlijk. Ik ga om verder te gaan en geef mezelf zijn standaard io.H bovenaan. Ik ga ook geef mezelf preemptively de CS50 bibliotheek, zodat Ik denk niet krijgen schreeuwde door de compiler. En nu ga ik om verder te gaan en verklaren int, belangrijkste, leegte. En dan hier, dit is waar ik wil beginnen te besteden aan functionaliteit een andere functie die ik zelf ben ga schrijven, maar dat niet doet momenteel bestaan. Bijvoorbeeld, veronderstel dat ik wilde schrijf een functie die me in staat stelt om uitprinten hello, komma, en dan is de naam van een aantal gebruikers. In plaats van te blijven printf doen hello,% s, zou het niet mooi zijn als Er waren slechts een functie genaamd niet printf maar naamdruk? Dus met andere woorden, ik wil in staat zijn om Schrijf een programma dat een beetje doet zoiets als dit. Ten eerste, ik ga printf zeggen dat uw naam, waardoor de gebruiker wordt gevraagd om geef mij zijn of haar naam, en dan ben ik gaan naar de vertrouwde tekenreeks s gebruiken om verklaren een string. Geef me een variabele van het type tekenreeks, noemen het s, en op te slaan in dat de gevolg van het bellen te krijgen string. Maar nu in de weken voorbij, zou ik enigszins moeizaam gedaan hello,% s / n. En in andere woorden, we hebben dit gezien bijvoorbeeld een paar keer, en het is een triviaal voorbeeld, want er is maar een regel code, dus het is niet echt een big deal te blijven typen weer in. Maar stel dat deze lijn van code eigenlijk waren steeds een last, en het is niet een regel code, maar het is 10 regels code een paar weken vanaf nu, en je bent gewoon moe van kopiëren en plakken of overtypen dat dezelfde code. Zou het niet mooi zijn in plaats van het doen van printf hello,% s, enzovoort, zou het niet mooi zijn als er gewoon een functie genaamd afdruk naam die neemt een argument - in andere woorden, het duurt ingang - en dan puntkomma. Zodat de functie, zou het niet worden leuk als dat bestond? Dan zou ik geen zorgen te maken over wat printf is, wat% s en alle deze complexiteit die zijn niet zo interessant. Ze zijn nuttig. Dus print naam, helaas, was niet uitgevonden ongeveer 40 plus jaren geleden. Niemand dacht om het te schrijven. Maar dat is de schoonheid van het hebben van een programmeertaal, net als in Scratch kunt u aangepaste blokken definiëren, zodat in C en de meeste elke taal, kunt u definieer uw eigen functionaliteit, kan u uw eigen functies definiëren. Dus ook al krijgen we de belangrijkste door automatisch gratis, kunnen we verklaren onze eigen functies. Dus ik ga wat ruimte omhoog hier te maken tot boven, en ik ga verklaren mijn eigen functie dat gaat een kijken beetje vreemd op het eerste, maar we komen terug naar dit duurde niet lang. Ik ga leegte zeggen, waardoor met vermelding van deze functie doet iets, een neveneffect, maar niet iets terug naar mij in de dezelfde manier dat int krijgen of krijg string zelf doet. En ik ga deze functie te geven noemen van de naam van print, en ik ga aangeven dat deze man gaat nemen een string, en ik ga roepen dat tekenreeksnaam. Ik kon het noemen wat ik wil, maar ik wil mijn code om als zelfstandige te documenteren. Met andere woorden, als een van jullie waren om Open dit bestand en lees het, je kon soort afleiden uit de naam van die ingang welke rol het zou moeten spelen. En nu onder dat, ga ik om te openen accolade en gesloten accolade, en zo merk ik heb het zelfde gevolgd patroon op lijnen vier tot zeven als Ik volg een goede week plus nu tussen, zeg, lijnen negen en 14 waarvan de belangrijkste samen te stellen. Met andere woorden, afdrukken naam is een andere functie. Nu, is de compiler niet van plan om te weten om dit ding automatisch bellen omdat ik letterlijk net uitgevonden, maar het zal nog weten te main bellen automatisch, en dan natuurlijk in lijn 13, roep ik mijn eigen functie. En omdat ik heb verklaard dat de functie up op lijn vier vóór main, dit gaat om de compiler te leren wat citaat, unquote, "print naam" betekent en wat het moet doen. Dus ik ben soort van het geven van een nieuwe aangepaste blokkeren in het kader van, zeg, Scratch. Dus hier, kan ik dat heel gewoon of terugkerend patroon van de code die ik houden schrijven in de klas, printf % S hello,% s / n ", - wat moet ik hier wil zetten? S? Dus ik wil naam in deze context te plaatsen. Dus merken een beetje een tweedeling hier. Want ik ben te verklaren mijn eigen functie en ik heb enigszins arbitrair genoemd het afdrukken naam, en omdat ik heb in haakjes dat functie neemt een argument, het type dat is een string - dus het is een woord of zin of iets dergelijks - en Ik bel dat argument naam, dat de enige variabele die in scope, om zo te zeggen, is de naam. S bestaat alleen tussen wat twee accolades, natuurlijk? Nou echt, net als lijn 10 via 14, dus net als op maandag niet kan gebruiken S, maar wat ik kan doen is voorbij S in de naam print. Print naam gewoon zo gebeurt om het te geven een alias, een synoniem, een bijnaam, roepen zijn naam, en nu het gebruik ervan in deze lijn. Dus nu laat ik deze opslaan, uitzoomen. Laat me ga je gang en maak hallo. Ziet er goed uit. Niet uitspugen eventuele fouten. . / Hello Enter. Wat is mijn naam? David. En hallo David. Dus niet zo spannend, maar denk nu. Je hebt nu dat dezelfde stof zoals we deden in Scratch te maken onze eigen functies. Maar er is een beetje een gotcha. Stel dat ik niet echt had gedacht dit door en ik eigenlijk zonder echt denken over het schreef die functie hier beneden. Voelt heel redelijk. In Scratch is er geen notie de locatie in je scripts. Je kon men hier hier zetten, een omhoog, een omhoog hier, en het zou kunnen beginnen om er een beetje rommelig als je niet leg het netjes, maar het doet niet uit waar fysiek de scripts waren op het scherm. Helaas is het in C - en dit is in tegenstelling tot talen als Java en Python en anderen die je kent misschien wel met - helaas in C, volgorde doet uit want horloge wat is nu gaat gebeuren. De standaard functie die gaat te voeren is, natuurlijk main. Belangrijkste gaat naamdruk roepen lijn acht, maar helaas, de compiler zal niet eens weten dat afdruk naam bestaat totdat het wordt op lijn 11, die helaas gaat te laat zijn. Dus laten we doen maken hello. En nu verdomme, twee fouten gegenereerd. Dus nu laat ik scrollen tot de zeer eerste, zoals we altijd doen, en opmerken dat het tegen me te schreeuwen, "Impliciete declaratie van functie afdrukken naam. " Dus we hebben dit bericht eerder gezien, impliciete verklaring van de functie. Toen hebben we dat soort fout gezien? Toen ik niet onder andere een bibliotheek. Als ik vergat cs50.h en zou ik krijg uitgescholden voor krijg tekenreeks of krijgen int. Maar in dit geval is deze functie druk naam is niet in een bibliotheek, toch? Het is letterlijk in dit bestand, zodat wat is eigenlijk het probleem? Nou helaas in C, het neemt je mee zo ongelooflijk letterlijk dat als je wil een functie genaamd afdruk naam aan bestaan, moet u ofwel te implementeren die functie aan de top van uw code, zodat deze toegankelijk is voor lagere functies, maar eerlijk gezegd, dat wordt slordig zeer snel. Persoonlijk vind ik het zetten belangrijke eerste want dan is het heel duidelijk wat dit programma doet op het eerste gezicht. En plus, je kunt krijgen in rare hoek gevallen waar als x wil bellen y maar y misschien x gewoon bellen, je fysiek kan eigenlijk niet zet een boven elkaar. Maar het blijkt in C, we lossen dit heel eenvoudig. Ik ga een beetje ruimte gezet hier, en ik ga gewoon preventief, zij het iets redundant, gaat het leren compiler dat er een functie riep naam print, het duurt een string, en ik ga bellen noem maar puntkomma. Zodat deze nu in lijn vier, die we nog niet eerder hebt gezien, is een verklaring van een functie afdruk naam, maar het is slechts een belofte die deze functie zal uiteindelijk worden gedefinieerd, eventueel worden uitgevoerd. Dit nu kan ik alleen laten omdat nu is dit de definitie, de implementatie, soort van de laatste mijl van de uitvoering van deze bijzondere functie. Dus eerlijk gezegd het is dom, het is vervelend, maar dit is de manier waarop C is, en het is want het kost je heel letterlijk en, als een computer eerlijk moet, alleen doet precies wat je hem vertelt wat te doen, en zodat bestellen is belangrijk. Dus hou dat in gedachten en weer, beginnen te let op de herhaling van patronen. Kans groot dat u, als u nog niet al, beginnen om berichten tegenkomen als deze die op het eerste gezicht lijken volledig cryptisch, maar als je begint op zoek naar deze belangrijke woorden als "Impliciete verklaring," melding van een functie in dit geval - en eerlijk gezegd, je soms zelfs een beetje groen wortel symbool dat u vertelt waar het probleem waarschijnlijk is - kunt u beginnen om uw weg te werken door middel van nog ongezien foutmeldingen. Voor vragen over het schrijven van uw eigen functie op deze manier? Laten we iets dat een doen weinig meer dwingend. In plaats van gewoon iets dat heeft doen een neveneffect van afdrukken, laat me gaan vooruit en opslaan van een nieuw bestand, en we zullen noemen dit positive.c, ook al is het gaat een beetje anders versus vorige keer. En deze keer, wil ik opnieuw te implementeren positive.C bijvoorbeeld vorige keer, dat wordt dwingen de gebrui- me een positief geheel getal. Maar ik moest gebruiken krijgen int vorige keer. Zou het niet mooi zijn als er een functie genaamd krijgen positieve int dat ik kon gewoon uitbesteden stukje functionaliteit aan? Dus het verschil is hier zullen we implementeren krijgen positieve int, maar in tegenstelling tot afdruk naam die een neveneffect gehad - het niet iets terug voor mij als een getal of een string - krijgen positieve int is, uiteraard, gaat terugkeren, hopelijk, een positieve int. Dus laten we dit doen. Omvatten cs50.h, Include standaard io.h. Int main leegte. En nu hier, ik ga om verder te gaan en laten we zeggen int, noem het n, gelijk krijgen positieve int. En net zoals krijgen int al bestaat omdat het personeel het schreef, ik ga aan te nemen voor het moment dat krijgen positieve int bestaat, en nu ga ik om verder te gaan en te zeggen printf, bedankt voor de% i / n ", n. Dus nu als ik dit programma samen te stellen, wat er gaat gebeuren in mijn terminal venster onderaan het scherm? Ik ga waarschijnlijk dat zelfde fout als voorheen. Dus laten we dit proberen. Maak positief. En nogmaals, de impliciete verklaring van de functie, krijgt positieve int. Dus we kunnen dit oplossen in een paar manieren. Ik ga het simpel en gewoon blijven zet mijn verklaring hier en krijg positieve int. Ik moet de zogenaamde handtekening. De handtekening verwijst gewoon aan de esthetiek van de eerste regel van het programma. Dus wat moet positief te krijgen int terugkeer? Dus een int. Ik bedoel idealiter, zou het terug iets als positief int, maar dat bestaat niet. We hebben niet gezien dat er onder onze data types, dus we hebben te maken met de feit dat we heel weinig datatypes te werken. Maar we kunnen een int en gewoon terug vertrouwen dat het positief zal zijn. Het gaat heten krijgen positieve int. En nu hoe over zijn argumenten? Maakt het enig inbreng te nemen? Maakt het enig inbreng nodig? Zodat het niet te weten op voorhand niets. Krijg string niet, krijg int niet. Printf doet - het moet sommige hebben inbreng overgegaan in het - en naamdruk nodig wat input, maar krijgen positieve int niet. Dus ik ga expliciet vertelt de compiler leegte. Leegte is de afwezigheid van iets anders. Dus leegte betekent niets gaat binnen van deze haakjes puntkomma. En nu op de bodem van mijn dossier - en nogmaals, ik ben gewoon soort van anale hier voornaamste zetten aan de top, die is een goede gewoonte, want op deze manier, wanneer u of iemand anders opent het bestand, de functionaliteit is daar. U kunt duiken in van af. Dus nu ga ik deze te dupliceren, krijg positieve int leegte, maar ik ben niet ga een puntkomma nu geraakt. Ik ga accolades openen, en nu moet ik lenen een aantal ideeën van maandag. Dus als u zich herinneren, dat we iets deden graag het volgende doen terwijl iets waar was. En wat heb ik gedaan? Ik zoiets geven deed me een positief geheel getal, beetje een prompt. Ik kon geen woorden die ik wil gebruiken. En dan gebruikte ik wat? Int n gelijk krijgen int, geen argumenten aan. En merk het verschil. Wanneer u een functie aanroept, wanneer u een functie, hoeft u niet in leegte. Dat doe je alleen bij het declareren van een functie, het onderwijzen van de compiler wat het zou verwachten. Zodat u niet hoeft te zetten vervallen er jezelf. En nu, wat was mijn conditie? Wel, n niet gelijk is aan positieve, maar dat is gewoon pseudo-code. Dus hoe kan ik dit schoner te uiten? Dus minder dan of gelijk aan nul. Dus nogmaals, merk je kunt doen minder dan of gelijk aan. Ook al is het twee aparte symbolen, kunt u dit doen op uw toetsenbord als zodanig. Maar er is nog een bug die Ik heb het verknald vorige keer ook. Ik heb te verklaren - precies. Ik moet n verklaren buiten van de lus. Dus ik moet zetten n hier, en ik doe niet opnieuw wilt verklaren het hier opdat ik een nieuwe variabele. Ik wil gewoon een waarde toekennen in hier. En nu ben ik nog niet helemaal klaar hier. Laat me voor mezelf en doen alsof ik klaar ben. Maak positief, en nu er is een nieuwe fout. CONTROL bereikt eind niet-leegte functie. Dus nieuwe foutmelding, maar als je soort van plagen elkaar elk van de woorden, het Waarschijnlijk zinspeelt op wat er mis is. Beheersen. Controle betekent gewoon tot de orde van de activiteiten in een programma. De computer is in de controle en ging er iets mis. Dus het eind bereikt een niet-leegte functie. Welke functie is het blijkbaar verwijzen naar? Welke functie is niet-leegte? Dus maak je positieve int, en een beetje verwarrend in die goed, het is een soort van leegte. Het heeft een specificatie van leegte voor zijn argumenten, maar zijn uitgang gaat van het type n. Dus het woord aan de linkerkant is de zogenaamde return type. Het woord aan de binnenzijde hier de nul of meer argumenten die een functie neemt. Dus wat moet ik doen? Op dit punt in mijn code, lijn 21 waar de knipperende prompt is nu, ik hebben een positieve int binnen van de variabele genaamd n. Hoe geef ik het terug naar de belangrijkste? Letterlijk. Terug n puntkomma. Dus net als Colton terug een stuk papier met een antwoord aan mij door te laten vallen dat stukje papier in het kleine zwarte doos op de tafel, om dat te doen in code, je letterlijk gewoon schrijven, terug n, en het is alsof Colton waren gaf me iets fysieks terug. In dit geval, wat er gebeurt is krijg positieve int gaat terug te geven wat is vermoedelijk een positief integer aan wie? Waar komt die waarde belanden? Dat komt in deze variabele n, en Vervolgens gaan we verder met lijn negen. Dus met andere woorden, in volgorde van operaties, dit programma start uitvoeren, en de compiler realiseert, oh, je wilt de bibliotheek? Laat me gaan grab wat er in zit dat. Oh, je wilt de standaard IO bibliotheek? Laat me gaan grab wat er in zit dat. Wat doet de compiler te zeggen tegen zichzelf als het hits lijn vier? Oh, je hebt het beloofd aan de uitvoering functie genaamd krijgen positief, maar we komen later terug naar dat, iets in die richting. Int main leegte betekent alleen hier is de ingewanden van mijn programma. Lijn zeven is slechts een accolade. Lijn acht zegt aan de linkerkant, geven me 32 bits voor een geheel getal, noem het n. Aan de rechterkant, het is zeggen krijgen positieve int. Nu laten we pauze dat verhaal want nu Ik wil niet blijven bewegen mijn cursor naar beneden. Mijn cursor gaat nu naar hier omdat nu krijgen positieve int uitvoert. Int n wordt verklaard. Doet u het volgende. Printf geeft me een positief geheel getal. Krijg een int van de gebruiker, opslaan in n, en dit misschien doen opnieuw en opnieuw. Deze lus betekent dat deze code zou voeren op en neer als dit weer opnieuw, maar wanneer de gebruiker uiteindelijk werkt samen en geeft me een positieve int, ik raakte lijn 21, op welk punt de nummer wordt teruggegeven, en welke moet ik nu benadrukken? Negen. Controle, om zo te zeggen, keert naar lijn negen. Dat is de lijn die nu de leiding. Dus dat is wat er gebeurd is alle dit keer onder de motorkap, maar toen wij functies hebben gebruikt zoals printf of zelfs string die iemand anders u geschreven heeft, is controle worden overhandigd off om andermans code lijn per lijn per lijn. Het is gewoon dat we konden het niet zien en we kon niet echt beschrijven in dit programma omdat het in een andere bestand op de harde schijf ons medeweten om. Dus laten we daadwerkelijk samen te stellen en voer dit nu. Maak positief. Compileren, dat is vooruitgang. . / Positief. Geef me een positief geheel getal. Laten we moeilijk. Negatief 1. Nul. Laten we het 50. Bedankt voor de 50, en dus controle is nu teruggekeerd. Heeft u vragen, dan, op dat? Yeah? [Onverstaanbaar]. Zeg dat nog eens. Oh, goede vraag. Dus zou je hier een parallel merken dat Ik ben een soort van snijden een hoek op. In lijn 12, ik zeg, krijg positieve int retourneert een int, maar door diezelfde logica, het staat nu in de rede dat in lijn zes, ik zeg dat de belangrijkste rendement een int, maar wat hebben we nooit had in een van onze programma's? We hebben nooit melding gemaakt van gehad Dit sleutelwoord return. Zo blijkt dat in C, ten minste de versie ervan die we gebruiken gemaakt in 1999, technisch gezien, is dit gebeurt automatisch voor u. Wanneer u een programma en u implementeren implementeren van een functie genaamd de belangrijkste, die functie nul zal terugkeren door standaard als je niet anders zeggen, en nul is slechts een conventie. De wereld keert nul daardoor wat aangeeft dat alles goed is, effectief en laat ons met 4000000000 mogelijke dingen die kunnen gaan verkeerd dus dat als we iemand terug, dat misschien een code betekenen dat betekent dat deze ding ging het mis. We konden twee terugkeren, wat betekent Deze andere zaak ging het mis. We konden 4000000000 terugkeren, die betekent dit nog iets mis ging. En als je nu denkt over je eigen PC of Mac, zou u zich herinneren dat soms cryptische foutmeldingen krijg je van software die je bent gebruikt en soms een menselijke vriendelijke omschrijving, maar er is vaak een code of een aantal op het scherm? Als dit niet voor de geest komen, gewoon houd een oog voor. Dat is typisch wat deze codes verwijzen naar. Ze zijn opgenomen in Microsoft Word en andere programma's, zodat als je een bestand bug report met het bedrijf, kunt u ze vertellen, oh, heb ik fout nummer 45. En sommige programmeur terug bij het bedrijf kan dat opzoeken in zijn of haar code en zeggen: oh, dat is omdat ik maakte deze bug en dat is de reden waarom de gebruiker kreeg deze boodschap. Maar eerlijk gezegd, het is gewoon een beetje afleidende en een beetje vervelend te concluderen dat, althans op onze eerste paar programma's, dus we hebben is het weglaten. Maar al die tijd elk van je functies belangrijkste is het geheim had dit lijn automatisch toegevoegd voor u door de compiler, alleen volgens afspraak u wat tijd besparen. [Onverstaanbaar]. U hoeft niet op te nemen in de belangrijkste. Dat is prima. U hoeft op te nemen als je uitvoering van een functie als deze. Anders wordt de functie flat out zou niet werken. Maar in de belangrijkste, het is niet nodig. In een week of twee, zullen we beginnen met het krijgen in die gewoonte zodra we willen beginnen betekenende fouten. Echt goede vraag. Dus snelle verbale pauze te vermelden dat deze vrijdag, zullen we niet lunchen per se, maar we zullen eten met een aantal van de studenten en medewerkers. Als je wilt om mee te doen, voelen vrij om te gaan naar cs50.net/rsvp. 06:00 deze vrijdag. Ruimte is, zoals altijd, beperkt, maar we zullen blijven doen deze op een bijna wekelijkse basis als de ruimte loopt deze week. Zodat de cliffhanger dat we waren gebleven op Maandag was dat snaren daadwerkelijk kan geïndexeerd worden in, die net betekent dat je kunt krijgen bij het eerste teken, de tweede teken, het derde teken enzovoort, want je kunt effectief denken aan een touwtje, zoals hallo, als zijnde in dit geval vijf brieven binnenkant van dozen. En je kunt krijgen bij elk van deze dozen met wat syntax deden we introduceren op maandag? Die vierkante haken op uw toetsenbord. Dat alleen bedoeld naar locatie nul. We beginnen te tellen bij nul, dus beugel nul betekent h, beugel een betekent e, enzovoort. En dus de hele tijd als we geweest zijn met behulp van strijkers en typen in "hello" en "wereld" en andere dingen op het scherm, het is al opgeslagen in dozen zoals deze. En neem een ​​gok. Wat doet elk vak vertegenwoordigt fysiek binnenkant van uw computer? [Onverstaanbaar]. Sorry? Tekens. Dus een teken, zeker bij van strijkers, en een karakter is gewoon acht bits of een byte. Zodat u waarschijnlijk op zijn minst vaag bekend met het feit dat uw computer heeft een geheugen. Het heeft twee soorten geheugen minimaal. Een daarvan is de harde schijf waar u bespaart spullen permanent, en dat is meestal groot zodat u films kunt hebben en muziek enzovoort. Dan heb je een ander type geheugen genoemd RAM, R-A-M, Random Access Geheugen, en dit is het type geheugen dat wordt gebruikt wanneer de computer is lopen maar als de stroom uitvalt of uw batterij sterft, alles dat is opgeslagen in RAM verdwijnt als de stroom uitvalt helemaal omdat het niet persistent. Meestal hebt u, deze dagen, een optreden van het, twee optredens, misschien meer. En de kop van het RAM-geheugen is dat het veel veel, veel sneller dan harde schijven of zelfs solid state drives van deze dag, maar het is meestal duurder dus je hebt er minder van. Dus vandaag het gesprek echt verwijst naar RAM, dat geheugen voor bestaat alleen terwijl er stroom worden ingevoerd in de computer. Dus wanneer u typt in H-E-L-L-O, Enter op toetsenbord, H gaat in een byte RAM-geheugen, is de E gaat in een byte RAM, zoals de rest van het woord. Dus herinneren wat we konden om laatste keer te doen was dit. Laat me ga je gang en open het bestand dat wij geroepen string.c, en herinneren dat het een beetje leek zoiets als dit. Laat me eigenlijk terugdraaien en wijzigen het precies hoe het eruit zag, snaarlengte van s. Dus kijk naar het programma hier. Wij zijn de CS50 bibliotheek zo die we kunnen gebruiken krijgen string. Wij zijn onder andere standaard io.H dus kunnen we printf gebruiken. Waarom hebben we onder andere string.h? Dit was nieuw op maandag. Dus we wilden snaarlengte. Str Leng. Mensen besloten jaren geleden, laten we gewoon zijn beknopt. In plaats van noemde het "string lengte," laten we noemen het "str Leng" en laat de wereld cijfer dat uit, en dat is dus wat we krijgen toegang tot met string.h. Dit is bekend. Dit is bekend. Dit is bekend. Dit is een beetje nieuw. In lijn 22 - en we zullen terugkomen om deze, maar voor nu weet - en je zou alleen maar weten dit uit het hebben lees de documentatie of indien je wist C al - krijg string kan soms verpesten. Als de gebruiker echt hoor en wederhoor of coöperatief en hij of zij gewoon iets typt niet op het toetsenbord of soorten zo veel op het toetsenbord dat Het overweldigt geheugen van de computer, in theorie, krijg touwtje kon terugkeren iets anders dan een tekenreeks. Het zou een bijzondere waarde genaamd terug NULL in hoofdletters, N-U-L-L, en dit is slechts een zogenaamde sentinel waarde. Het is een speciale waarde, dat betekent er iets ergs gebeurd in dit geval. Het is het ontbreken van een tekenreeks. Dus null Ik controleer om gewoon zo dat, lang verhaal kort, str Leng en andere functies die komen met C, indien ze verwachten een string, maar je ze voorbij de afwezigheid van een string, als je langs hen NULL, de computer of het programma zal gewoon crashen regelrechte. Het zal hangen. Het zal overgeven een foutmelding. Slechte dingen zullen gebeuren. Dus ook al is dit nog steeds niet goed gedefinieerd - Dit zal meer zin in een week of twee - in lijn 22, dit is slechts een voorbeeld van zelf defensieve foutcontrole voor het geval dat een time-out van een miljoen iets misgaat, bij tenminste mijn programma niet zal crashen. Dus als s niet gelijk iets slechts, Ik heb dit voor de lus, en dit was waar we hadden dat andere nieuw stuk van de syntaxis. Ik heb een lus iteratie uit nul tot de lengte van s. En dan hier, was ik een drukkerij uit s bracket ik, maar waarom heb ik gebruik% c al ineens in plaats van% s zelfs hoewel s is een string? Het is een teken, toch? S is een string, maar s beugel iets, s beugel i waarin i nul is of een of twee, die een individu teken in de tekenreeks, en dus voor dat, moet printf te worden geïnformeerd dat het is inderdaad een personage te verwachten. En dan herinneren, wat dit deed programma eigenlijk doen? Gedrukt het uit in de kolommen. Ja, precies. Het is gewoon het woord dat ik typ in gedrukte een kolom, een teken per regel. Dus laten we zien dit weer. Dus zorg string. OK samengesteld. . / String. Laat me typen H-E-L-L-O, Enter, en inderdaad ik snap het, een per regel. Dus laat ik doe een optimalisatie hier. Als je erover nadenkt, vooral als u hebt geprogrammeerd voor, er is misschien wel een inefficiëntie in lijn 24. Met andere woorden, het is niet per se het beste ontwerp. Eenvoudig, tenminste als je eenmaal herinneren wat str Leng is, maar het is iets doms doet potentieel. Wat zou dat zijn? [Onverstaanbaar]. Precies. Het controleren van de lengte van s elke keer, ook al H-E-L-L-O zal altijd zijn vijf karakters. Elke keer via deze lus, de vijf niet verandert. Ik zou kunnen verhogen i, maar wat is de lengte van elke s iteratie van deze lus? Het is vijf, het is vijf, het is vijf, en toch ben ik toch deze vraag vraag opnieuw en opnieuw en opnieuw. Nu eerlijk gezegd, de computer is zo verdomd snel, niemand zal een mededeling verschil in dit geval, maar dergelijke van slecht ontwerp beslissingen kunnen beginnen te kloppen als de compiler zelf niet proberen om dit op te lossen voor je, die het typisch zou niet, bij althans in het apparaat. Dus ik ga dit doen. Ik ga een komma na het voegen mijn eerste variabele, i. Ik ga mezelf een ander te geven variabele, noemde het n, gewoon door conventie voor nummers, en dan ben ik gaat toekennen n de waarde van de string lengte van s. En dan ga ik veranderen mijn conditie te zijn wat? Ik ga mijn conditie te veranderen aan terwijl ik minder dan n. Dus nu, hoe vaak ben ik controleren van de lengte van s? Eens, maar het is OK om i te controleren tegen n opnieuw en opnieuw, want nu die waarden zijn eigenlijk niet veranderen. Nu voor nu, weet alleen dat wanneer je bel een functie, er is een beetje van overhead, niet genoeg om u te ontmoedigen echt van ooit het gebruik van functies, maar zeker als er een regel code als dat - en de lijnen zullen krijgen interessanter het duurde niet lang - waar er is een mogelijkheid om na te denken, als ik Typ deze code, hoeveel keer zal het uit te voeren? Je zult beginnen te zien in de tijd van de prestaties van uw programma's kan inderdaad veranderen. In feite, een van het probleem sets die we hebben gedaan in de afgelopen jaren gaat uitvoering, zoals u zich wellicht herinnert uit week nul, een spellingscontrole, maar een spellingcontrole die is ontworpen om te ondersteunen een woordenboek van 150.000 plus woorden die we geven jullie. U zou hebben om code te schrijven die wordt geladen die woorden in het RAM, zodat in dozen zoals we zagen op het scherm een ​​moment geleden, en vervolgens zo snel als je kan, moet je in staat zijn om een ​​antwoord kwestie van de vorm, is dit woord verkeerd gespeld? Wordt dit woord verkeerd gespeld? Wordt dit woord verkeerd gespeld? En in iets als dat wat we hebben gedaan in de afgelopen jaren is veranderd in, zij het op een opt-in facultatieve basis, een concurrentie van soorten, waarbij de studenten die gebruik maken van de minder RAM en minder tijd, minder CPU-cycli, uiteindelijk borrelen naar de top van een kleine leader board of ranking die we op de cursus homepage zoals we hebben gedaan in de afgelopen jaren. Dus nogmaals, volledig optioneel, maar dit spreekt tot de ontwerpmogelijkheden die voor ons zijn als we eenmaal beginnen bouwen bovenop een aantal van deze fundamentele bouwstenen. Dus laat me terug naar dit diagram voor slechts een moment en onthullen een beetje iets meer. Dit is inderdaad een string, en we hebben genomen voordeel van enkele bibliotheken, standaard io.H die heeft - Printf. Printf, onder andere dingen. cs50.h, die int is te krijgen en touwtje enzovoort, string.h die had str Leng. Maar het blijkt dat er nog een andere. Eerlijk gezegd, er is veel en veel header bestanden die functies te verklaren voor bibliotheken, maar dit ctype.h is daadwerkelijk gaat wat te zijn voordelig, want ik ga om verder te gaan en uit te voeren een andere programma hier. Laat me ga je gang en open iets Ik schreef op voorhand genaamd capitalize.c, en laten we eens kijken hoe dit werkt. Merk op dat ik gebruik, in deze versie ervan, drie bekende bestanden. Merk op dat in de lijn 18, ben ik het krijgen van een tekstregel. Kennisgeving in lijn 21, ben ik te beweren dat de volgende code gaat kapitaliseren s, ongeacht de gebruiker ingetypt in, en hoe moet ik dat doen? Nou, ik neem - les geleerd van de vorige keer - Ik verklaar i en n en iteratie over de karakters in de string. En wat is dan dit blok code in lijn 24 via 27 doet in lekentaal? Kleine letter terug. Precies. Als s bracket i - dus als het i-de s karakter, dat een specifieke char in het koord, groter is dan of gelijk aan een kleine letters en - herinneren dat dubbele ampersand betekenen en - en hetzelfde karakter, s beugel i, is minder dan of gelijk aan z kleine letters dat betekent dat het een a of een b of een c of puntje, puntje, puntje, of een z, wat betekent het is kleine letters. Wat wil ik doen in dat geval? Nou, ik kan deze enigszins doen cryptisch, maar laten we plagen dit apart. Ik ga printf bellen, drukt% c want ik wil deze herdruk karakter op het scherm. Ik ben dan ga s beugel i, de te nemen i-de personage in s, en waarom doe ik dit trucje hier, kleine letter a minus hoofdletter A? Wat is dat gaat geven me, in het algemeen? [Onverstaanbaar]. Precies. Ik heb niet echt herinneren - het was 65 voor het kapitaal A. ik niet echt herinneren wat kleine letter a is, maar maakt niet uit. De computer weet. Dus door te zeggen, kleine letter a minus hoofdletter A, het is raar om te af te trekken van een ander char, maar wat zijn chars onder de motorkap? Ze zijn gewoon nummers. Dus wat die cijfers zijn, laat de computer onthouden in plaats van mij de mens. Dus kleine letter a minus hoofdletter A is gaat me een verschil geven. Het gebeurt te zijn 32, en dat zou het geval voor kleine letters b en kapitaal B enzovoort. Het blijft consistent, gelukkig. Dus ik ben wezen zeggen, neem de kleine letter, aftrekken van dat standaard verschil, en dat effectief veranderingen s beugel i van kleine letters aan, natuurlijk, hoofdletters, zonder dat ik echt na te hoeven denken over of vergeet niet, wat waren die nummers hebben we gesproken over wanneer de acht vrijwilligers kwam op het podium? Nu ondertussen, in het anders, als het niet een kleine letter zoals bepaald door lijn 24, maar print het uit. Ik wil alleen het aanraken tekens waren eigenlijk oorspronkelijk kleine letters. Dus laten we dit zien. Maken kapitaliseren. Gecompileerd, OK. . / Kapitaliseren. En laat me typen in H-E-L-L-O in kleine letters, Enter. En merkt dat het wordt omgezet in hoofdletters. Laat me dit opnieuw doen met een ander woord. Hoe zit het met D-A-V-I-D met de eerste D gekapitaliseerd als een naam is typisch? Enter. Merken dat het nog steeds correct. Het is gewoon uitgestuurd die eerste D ongewijzigd via die else. Dus hou in het achterhoofd, dan, een paar dingen hier. Een, als je ooit wilt twee controleren omstandigheden in een keer, je kan en ze samen als we voorspelden. U kunt tekens vergelijken op deze manier en effectief behandelen tekens aantallen, maar eerlijk gezegd, dit is zo verdomd cryptisch Ik ga nooit onthouden hoe om te komen met dit van de grond af zonder motivering door het voor heel een beetje tijd. Zou het niet aardig zijn als iemand die schreef er een functie genaamd is verlagen die kon antwoorden voor mij waar of vals, dit karakter is kleine letters? Nou gelukkig, wie schreef ctype.h deed precies dat. Laat me gaan hier omhoog en voeg ctype voor c types, en nu laat ik hier naar beneden en herschrijven deze lijn als volgt. Dus als het heet is lager, ik beweer, s bracket ik, dan ga ik om te verwijderen deze twee lijnen geheel. Dus nu iemand anders, ik hoop, schreef een functie genaamd is lager, en het Blijkt dat ze deden en ze verklaard het binnen van ctype.h. En nu ga ik naar lijn 27 vertrekken alleen, ik ga naar lijn 31 vertrekken alleen, maar merken hoeveel ik heb aangescherpt mijn code. Het is nu schoner. Het is minder moeilijk om door te kijken want nu de functie, bovendien is zo heerlijk noemde het net doet wat het zegt. Dus nu ga ik dit redden. Ik ga uit te zoomen. En net als bij Scratch je zou kunnen hebben Booleans, Booleaanse waarden true of vals, dat is precies wat is lager effectief rendement. Laat me opnieuw compileren. Laat me re-run. En nu laten we het nog eens proberen, H-E-L-L-O, Enter. Dat is vrij goed. En probeer het opnieuw, zorg ervoor dat ik is er iets niet verpesten. Dat wordt geactiveerd als goed. Maar dit is niet goed genoeg, want de andere ding dat ik ga nooit herinner me tenzij ik werk door het echt voorzichtig op, zeg, papier dit verdomde lijn. Zou het niet mooi zijn als er een functie genaamd naar boven? Nou, het blijkt dat er is in ctype.h ook. Ik ga om te gaan en typ - laat me brengen die lijn terug. In plaats van deze hier, laat mij ga je gang en zeggen, de plaats van het% c de resultaat van deze functie bellen naar boven de i-de karakter s. En let nu op het wordt steeds een beetje evenwicht. Ik moet bijhouden hoeveel houden haakjes ik heb geopend en gesloten. Dus nu is het nog schoner. Nu dit programma wordt steeds beter en beter aantoonbaar ontworpen omdat het veel, veel beter leesbaar, maar het is geen laten corrigeren. Maken kapitaliseren. . / Kapitaliseren. H-E-L-L-O. Laten we lopen het weer, D-A-V-I-D. OK, dus we zijn nog steeds in vrij goede vorm. Maar nu naar boven. Ik stel voor dat er een meer verfijning we konden maken dat zou zijn echt leuk, dat kon echt vast up deze code en echt geven ons vijf van de vijf voor het ontwerp, bijvoorbeeld. Wat zou leuk zijn om zich te ontdoen van? Nou, kijk eens hoe verdomd lang dit blok code is gewoon om iets simpels te doen. Nu als een terzijde, zoals je zou kunnen hebben gezien in super sectie afgelopen weekend, hoeft u niet strikt nodig de accolades wanneer je alleen maar een regel van de code, ook al hebben we voorgesteld het houden van hen, zodat het veel meer duidelijk, zoals in Scratch's U-vormige blokken, wat er in de branche. Maar zou het niet mooi zijn als de bovenste, wanneer gegeven zijn inbreng, draaide het in hoofdletter als het niet, en wat zou prachtig zijn in het omgekeerde geval, indien het is al hoofdletters? Geef het gewoon door en laat het met rust. Dus misschien is het dat doet. Ik zou kunnen proberen en maar hopen dat het doet, maar laat me introduceren een ander ding. In plaats van deze ingebouwde terminal venster hier beneden, te herinneren dat dit plein zwarte pictogram geeft u een grotere terminal venster dat ik kan vol scherm als ik wil? Dus het blijkt dat ze soort van vreemd genoemd, maar er is deze dingen genoemd man pagina's, handleidingen, man voor de korte, en ik kan deze door toegang typen man - wat wil ik met het type? Man naar boven. En nu merken als er een werken in de computer, in dit geval het apparaat, dat is gewoon het besturingssysteem Linux, het gaat voor mij een wat cryptische reeks geven uitgang, maar u zult na verloop van tijd merken dat het is altijd vrij veel het geformatteerd hetzelfde dus je begint te wennen. Merkt aan de top te boven, en blijkbaar is dezelfde documentatie voor te verlagen. Wie schreef het was te snijden hoeken en zet het allemaal op een pagina. Doel deze dingen 'in het leven is om een ​​bekeerling brief naar hoofdletters of kleine letters. Merk op dat onder Synopsis, de man pagina leert me wat file Ik heb te nemen om dit ding te gebruiken. Het geeft me de handtekeningen van deze functies, beiden, zelfs hoewel we op dit moment alleen zorg over een. Hier is nu een beschrijving. Naar boven zet de letter c naar hoofdletters indien mogelijk. Nog steeds niet dat leerzaam, maar laat me Nu kijk onder return waarde, het ding die terug is overhandigd. Dus de waarde die wordt geretourneerd is dat van de geconverteerd letter of c, indien de conversie niet mogelijk. Wat is c? Het oorspronkelijke karakter. Het oorspronkelijke karakter en we weten dat door, opnieuw, omhoog gaat naar de synopsis, en wie dit schreef functie net besloten dat de input tot aan de bovenste en onderste is gewoon willekeurig gaan heten c. Ze kon het bijna alles hebben genoemd ze willen, maar ze hield het eenvoudig c. Dus ik heb geraadpleegd de man pagina. Deze zin stelt me ​​gerust dat als het is niet een kleine letter, het is gaat geef me terug c, dat is perfect, wat betekent dat ik kan ontdoen van mijn anders staat. Dus laat me teruggaan naar gedit, en Nu laat ik dit gewoon doen. Ik ga mijn printf statement kopiëren. Ik ga vooruit en recht binnen te gaan de lus afdruk die uit, en krijgen ontdoen van nu dit hele indien construct. Was geen slecht idee, en het was erg veel correct en in overeenstemming met alles wat we hebben gepredikt, maar niet nodig. Zodra u een aantal bibliotheken realiseren functie bestaat dat iemand anders schreef, of misschien heb je elders in geschreven het bestand, kunt u deze gebruiken en echt beginnen aan te scherpen van de code. En als ik zeg dingen als goede stijl, het feit dat deze persoon wel de functie om de bovenste, of eerder is lager is heerlijk handig omdat ze zijn erg beschrijvend. Je zou het niet wilt dat uw functies op te roepen x en y en z, die moeten veel, veel minder betekenis. Voor vragen over die serie verbeteringen? Zo volstaat het om een ​​van de zeggen afhaalrestaurants is zelfs als uw eigen probleem set - misschien probleem set een, maar zeker P set twee en verder, zelfs als ze correct zijn niet noodzakelijkerwijs dat ze perfect zijn gewoon nog niet of bijzonder goed ontworpen. Dat is de andere as gaan nadenken over. Dus dit was een string binnenkant van je geheugen van de computer, maar als je een heleboel personages zoals H-E-L-L-O binnenkant van RAM, en veronderstellen dat u in uw programma te bellen krijgen touwtje meerdere malen zodat u bellen zodra je snaar, dan heb je bel krijg tekenreeks weer. Nou ja, wat gaat gebeuren na verloop van tijd? Met andere woorden, als je een lijn van code, zij het uit hun context, zoals tekenreeks s krijgt - laten we dit doen. String naam gelijk krijgen string. Dus stel dat de regel van de code is bedoeld aan de gebruiker voor zijn of haar naam te vragen. Deze volgende regel code is bedoeld om te vragen de gebruiker voor zijn of haar school, en dit volgende regel, enzovoort. Stel dat we blijven vragen de gebruiker voor andere en andere en andere string. Ze gaan om te verblijven in het geheugen tegelijkertijd. Men is niet van plan om de andere afranselen. School is niet overschrijven de andere. Maar waar komen ze allemaal belanden in het geheugen? Nou, als we beginnen te tekenen op het scherm, waar we dit ding kunnen gebruiken hier als een schoolbord, als dit zwart rechthoek stelt mijn computer geheugen, ik ga willekeurig starten verdelen in kleine vierkantjes, die elk een byte van het geheugen. Eerlijk gezegd, als je een gigabyte aan RAM deze dagen, je hebt een miljard bytes van het geheugen in de computer, zodat een miljard van deze vierkanten. Dus het volstaat te zeggen, dit is niet echt op schaal. Maar we konden blijven trekken al deze duidelijk niet naar pleinen schaal, en dit collectief vertegenwoordigt geheugen van mijn computer. Nu gaan we gewoon doen puntje, puntje, puntje. Dus met andere woorden, als ik u nu vragen de gebruiker met get touwtje om mij een te geven snaar, wat gebeurt er? Als types de gebruiker in "hello", die eindigt in H-E-L-L-O. Maar stel dat de gebruiker vervolgens typen in - eigenlijk, zou ik niet heb gedaan hallo omdat we vragen hen voor hun namen. Dus laten we terug gaan als ik dit kan doen. Dus als ik typ in D-A-V-I-D voor mijn naam, maar herinneren dat de tweede regel van code werd weer krijg touwtje en hun school krijgen. Waar is dat woord dat de gebruiker soorten in het gaan naar de volgende te gaan? Nou ja, misschien is het in te gaan op H-A-R-V-A-R-D. Dus ook al heb ik getekend als twee rijen, dit is gewoon een hele hoop van bytes in uw RAM van de computer. Er is een probleem nu, want als ik nu ben RAM gebruik in deze zeer redelijke maar soort van naïeve manier, kan wat je blijkbaar niet onderscheiden? Waar men begint en waar een eindigt, toch? Ze zijn soort samen vervagen. Zo blijkt de computer doet dit niet. Laat me eigenlijk scrollen terug in de tijd een paar personages, en in plaats van Harvard onmiddellijk gaan na de naam van de gebruiker, de gebruiker daadwerkelijk krijgt, achter de schermen, een speciaal teken ingevoegd bij de computer voor hem of haar. / 0, ook wel bekend als het nul karakter hinderlijk genaamd N-U-L, niet N-U-L-L, maar schrijf je het als / 0. Het is gewoon allemaal nulbits is een marker in tussen het eerste woord dat de gebruiker getypt en de tweede. Dus Harvard eigenlijk nu belandt als deze tekenreeks en een meer / 0. Dus met andere woorden, doordat deze sentinel waarden, acht aaneengesloten nul beetjes, kunt u nu beginnen te onderscheiden een teken van een ander. Dus al die tijd wat "hello" is eigenlijk "hello" met een / 0, en Ondertussen zou er heel goed zijn heel wat meer RAM in de computer. Laat mij een ding nu. Het blijkt dat al deze pleinen we hebben al getekend, zijn zij, ja, koorden, maar meer in het algemeen, deze dingen zijn arrays. Een array is gewoon een brok van het geheugen dat is rug aan rug aan rug aan rug, en u doorgaans een array bij wijze van dit plein haakjesnotering. Dus we gaan deze nogal wat te zien na verloop van tijd, maar laat me gaan en openstellen, laten we noemen het veroudert. En let op wat we kunnen doen met deze zelfde trucs, een beetje beetje meer syntax hier. Dus in de lijn 17 van dit programma - eigenlijk, laat ik het programma voor het eerst uitgevoerd zodat we kunnen zien wat dit ding doet. Ik bel maken leeftijden aan compileren dit programma. . / Leeftijden. Hoeveel mensen zijn in de ruimte? Noem het drietal. Leeftijd van de eerste persoon? 18, 19 en 20. En nu enigszins belachelijk, ik heb net hebben een programma dat leeftijden die gemaakt drie mensen. Dus er is duidelijk een kans voor wat plezier rekenkundige hier. Gelukkig, de wiskunde is correct. 18 naar 19, 19 ging tot 20 enzovoort. Maar wat er echt bedoeld om te worden illustratief is hier hoe we het opslaan van die drie mensen leeftijden. Laat me in te zoomen op wat er hier aan de hand. Dus eerst, deze eerste paar regels moeten worden al behoorlijk vertrouwd. Ik ben gewoon de gebruiker vraagt ​​om de aantal mensen in de zaal. Dan gebruik ik krijg int en doen terwijl aan Dit doen opnieuw en opnieuw en opnieuw. We hebben dat patroon eerder gezien, maar lijn 27 is nieuw en eigenlijk heel nuttig, en wordt steeds bruikbaar. Merk op dat wat is er anders in de lijn 27 is dat ik lijken te verklaren een int genaamd leeftijden, maar wacht. Het is niet alleen int leeftijden. Er is deze vierkante haken, binnenste gedeelte is n. Zodat de beugel n in dit verband niet binnenkant van een printf statement hier maar in deze enige lijn 27, deze lijn is zeggen, geef me n gehele getallen, die elk is van het type int. Dus dit is een emmer, om zo te zeggen, van, in dit geval, drie getallen naar rug aan rug, zodat ik effectief drie variabelen. Het alternatief, om duidelijk, zou dit. Als ik wilde de eerste student leeftijd, ik zou dit doen. Als ik wilde de tweede student leeftijd zou ik dit doen. Als ik wilde het derde student leeftijd, ik zou dit doen. En God verhoede dat we nodig hebben ieders leeftijd in deze kamer - Ik bedoel, dit is een deurklink van een heleboel van de kopie, plak opnieuw en opnieuw en opnieuw. En plus zodra ik dit programma te compileren, als een andere student loopt in meer dan uit van die deur, nu mijn nummer van variabelen is ingevuld. Dus wat er leuk is aan een array is zo Zodra je begint te voelen jezelf kopiëren en plakken, zijn de kansen dat is niet de beste aanpak. Een array is dynamisch potentieel. Ik weet niet van tevoren hoeveel mensen zullen worden in de kamer, maar ik weet dat ik moet n van hen, en ik zal achterhalen n wanneer de tijd komt. Deze regel code betekent nu, geef me een stuk van het geheugen dat er zo uitziet waar het aantal vakjes op het scherm is volledig afhankelijk van n dat de gebruiker intikt: Dus nu de rest van dit programma is eigenlijk vrij vergelijkbaar met wat we net deed met de personages. Let op, ik heb een lus te beginnen in lijn 30. Dus direct nadat ik de array, ik itereren van y gelijk aan nul op maximaal n. Ik heb alleen deze leerzame printf bericht alleen maar zeggen, geef me de leeftijd van de persoon #% i, dus nummer een, nummer twee, nummer drie. En waarom heb ik dit doen? Eerlijk gezegd, mensen liever te tellen van de ene Op up terwijl informatici, nul op maximaal. informatici zijn niet van plan om Gebruik dit soort programma's, dus we zijn ga gewoon beginnen met tellen op een als normale mensen. En nu in lijn 33, ziet de lichtjes ander stuk syntax. De i-de leeftijd die variabele type matrix gaat een int te krijgen. En nu tot slot, dit is gewoon rekenkunde hier beneden. Ik besloot in een aparte lus te krijgen enige tijd verstrijkt, en nu in deze aparte lus, deze lijnen uit te voeren. Een jaar vanaf nu, persoon ik zal i jaar oud, maar merken dit is niet de variabele i. Dit is nu% i voor int. En merk als de eerste tijdelijke aanduiding, I plug in i plus 1, dus tellen we als een normaal persoon. En dan voor de waarde van hun leeftijd, voor i jaar oud, ik neem leeftijden beugel i - en waarom doe ik plus een hier? Ze gewoon de leeftijd. Het is mijn stomme keuze van de programma's. Ze hebben net een jaar oud. Ik kon typen in elk nummer dat Ik wil daar eigenlijk. Dus wat is eigenlijk allemaal de relevantie hier? Nou, laat me eigenlijk terugbladeren hier en een beeld te schetsen van wat ons te wachten. Wat zullen we doen met onze volgende Probleemverzameling Twee is ploeteren in de wereld van cryptografie. Dus dit is een reeks tekens, dus een opeenvolging van meerdere tekens, en welke zegt dit? Het is niet in de online versie van de glijbanen. Dus ik beweren dat dit gelijk is aan deze, een stomme reclame van vele jaren geleden dat eigenlijk zou kunnen herinneren een van zijn oorsprong. Dit is dus een voorbeeld van encryptie of cryptografie. Het blijkt dat als je wilt eigenlijk informatie of delen stuur informatie met iemand veilig, als een bericht als dit, kunt u versleutelen van de letters. Maar meestal zijn de woorden niet willekeurig roerei. Ze gepermuteerd op enigerlei wijze veranderd op een bepaalde manier, zodat - oeps. Dat is een leuke spoiler voor de volgende keer. Dus je kunt in kaart wat is blijkbaar O naar B. Merk op dat lijnen kapitalisatie-wise. Blijkbaar r wordt e. Blijkbaar F-H-E-R wordt S-U-R-E. Dus het blijkt dat er een mapping, en in dit geval is er een behoorlijk stom het in kaart brengen als iemand heeft bedacht? Dit is iets genaamd Rot 13, Roteren 13. Het is de stupidest van encryptie mechanismen omdat het letterlijk net voegt 13 om elk een van de brieven, dom in de zin dat als je gewoon heb een beetje vrije tijd op uw handen en een potlood, of je denkt dat het gewoon door in je hoofd, zou je kunnen proberen alle mogelijke toevoegingen - een, twee, drie, punt, punt, punt, 25 tot slechts Draai het hele alfabet, en Uiteindelijk, zult u erachter te komen wat deze boodschap is. Dus als je iets als dit in deed lagere school doorgeven van berichten aan uw beste vriend, als je de lagere school leraar gewoon lezen via de boodschap en brute dwong de oplossing, je zou hebben gekregen een antwoord op die. Nu natuurlijk, in de echte wereld, cryptografie is meer verfijnd. Dit is een tekstfragment uit een computersysteem dat gebruikersnamen en heeft wachtwoorden, zoals bijna alle van ons doen en dit is wat vergeten zou kijk graag indien opgeslagen op uw harde rijden maar in gecodeerde vorm. Dit is niet alleen een rotatie van brieven, A is B en B is C. Dit is veel verfijnder, maar het gebruikt wat algemeen bekend staat als geheime sleutel cryptografie. Deze foto vertelt het volgende verhaal met een aantal iconen. Aan de linkerkant, we hebben wat we zullen platte tekst noemen. In de wereld van cryptografie, plain tekst is gewoon het originele bericht geschreven in het Engels of het Frans of welke taal dan ook. Als je het wilt coderen, zullen we doorgeven het picturaal door een hangslot, zodat enkele soort algoritme, een functie of een programma dat iemand schreef dat krabbelt de letters hopelijk meer complicatedly dan alleen het toevoegen van 13 elk van hen. Wat je uit van dat proces in de midden is er heet cyphertext. Dus een soort van een sexy woord. Het betekent alleen dat het de versleutelde versie van de platte tekst. En alleen als je dat dezelfde geheime, 13 of min 13, bent u in staat om decoderen van een bericht als dat. Dus in Probleem Set Two, een van de dingen je als je doen in de Hacker Edition, moet u code schrijven om kraken deze wachtwoorden, uitzoeken wat ze waren en hoe ze waren gecodeerd, hoewel we geven je een beetje van begeleiding langs de weg. In de Standard Edition, introduceren we een paar cijfers, encryptie mechanismen, een Caesar, een zogenaamde riep Vigenere, die nog rotatie cijfers waarbij A wordt iets, B wordt iets, maar je moet het programmatisch doen omdat er inderdaad een geheim zal zijn belangrijkste betrokkenen die typisch is een aantal of een trefwoord dat alleen de verzender en de ontvanger van deze berichten moeten begrijpen. Nu, dit heeft eigenlijk incarnaties in de echte wereld. Dit is bijvoorbeeld kleine wees Annie's geheime decoder ring, en u daadwerkelijk kan implementeren deze rotatie cijfers - Een wordt iets, B wordt iets - met een paar wielen, een aan de buitenkant, een aan de binnenkant zodanig dat als je het wiel draaien of de ring, kun je eigenlijk line-up van de brieven met verschillende brieven, het krijgen van een geheime code. En zo als de cliffhanger voor vandaag, wat ik dacht dat ik zou doen is een beetje throwback dat als je de TV aanzet op 24 december, kunt u kijken naar de film vervelens toe voor 24 uur in een rij. Maar voor vandaag, ik zal het hier openstellen en geven ons slechts twee minuten van een pedagogisch verantwoorde Kerstverhaal met een kereltje genaamd Ralphie. [VIDEO AFSPELEN] -Laat het bekend om alles en iedereen die Ralph Parker wordt benoemd tot lid van de Little Orphan Annie geheim cirkel en is gerechtigd alle de eer en de voordelen voorkomende daarop. -Signed, Little Orphan Annie. Medeondertekend, Pierre Andre in inkt. Eert en uitkeringen reeds op de leeftijd van negen. [SCHREEUWEN OP RADIO] Kom op, laten we aan de slag gaan. Ik wil niet al die jazz over behoefte smokkelaars en piraten. -Luister morgenavond voor de sluiten avontuur van de zwarte piratenschip. Nu, is het tijd voor Annie's Secret Boodschap voor je leden van de geheime cirkel. Vergeet niet, kinderen. Alleen leden van Annie's Secret Circle kan geheime boodschap Annie's te decoderen. Vergeet niet, Annie is afhankelijk van je. Stel je pinnen naar B2. Hier is de boodschap. 12, 11, 2 - -Ik ben in mijn eerste geheime vergadering. -25, 14, 11, 18, 16 - -Pierre was in grote stem vanavond. Ik kon het bericht dat vanavond vertellen was echt belangrijk. -3, 25. Dat is een boodschap van Annie zichzelf. Vergeet niet, niemand niet vertellen. -90 Seconden later, ik ben in de enige kamer in het huis waar een jongen van negen kon zitten in privacy en decoderen. Aha, B. ging ik naar de volgende. E. Het eerste woord is "te zijn." S. Het werd makkelijker komen nu. U. 25. Dat is R. -Kom op, Ralphie. Ik moet gaan. -Ik ben zo beneden, Ma. Jeetje. -T. O. Zorg dat. Zorg ervoor dat u wat? Wat was Little Orphan Annie probeert te zeggen? Zorg ervoor dat u wat? -Ralphie, heeft Randy moet gaan. Wil je alsjeblieft naar buiten komen? -Oke, Ma. Ik kom er zo aan. -Ik was dichter bij nu. De spanning was verschrikkelijk. Wat was het? Het lot van de planeet kan hangen in de balans. -Ralphie, Randy's gotta go. Rechts uit-Ik voor luid schreeuwen. -We zijn er bijna. Mijn vingers vlogen. Mijn geest was een stalen val. Elke porie getrild. Het was bijna duidelijk. Ja, ja, ja, ja, ja. -Zorg ervoor dat u uw Ovaltine drinken. Ovaltine? Een mollig commercieel? Klootzak. [END VIDEO AFSPELEN] LUIDSPREKER 1: Dit is CS50, en dat zal Probleemverzameling Twee zijn. Zie je volgende week. SPEAKER 2: Bij de volgende CS50, dit gebeurt. LUIDSPREKER 1: Dus een onderwerp hebben we niet bekeken dusver is die van functie pointers. Nu, een functie pointer is gewoon het adres van een openbaar functie, maar net als - zoon van een -