>> [Muziek]
DAVID J. MALAN: Oke.
Dit is CS50, en dit is eind Week 2.
Dus vandaag gaan we onze blik verder
hoe we de dingen vertegenwoordigen onder de hood-- af te stappen
van nummers zoals integers en floating point waarden
en zich te concentreren op de snaren en uiteindelijk meer interessante programma's.
Maar we zullen ook een kijkje nemen op een te nemen paar domeinspecifieke problems--
de eerste daarvan zal zijn met betrekking tot cryptografie,
de kunst van het klauteren informatie, in die u hier ziet u hierboven
is een beeld van Radio Orphan Annie's geheime decoder ring van weleer.
>> Dit is eigenlijk heel primitieve vorm en kind-vriendelijke vorm van cryptopgraphy
waarbij deze ring heeft twee disks-- een binnen en een buiten.
En door het draaien van een van deze, kunt u wezen line-up letters zoals A
Z door andere letters als B tot A. Met andere woorden,
kunt u letterlijk het alfabet te draaien, waardoor de proppen komen met een afbeelding van
brieven aan brieven, zodat, als je wilde een geheim bericht
iemand als Annie, kon je schrijft onderaan uw boodschap en draai
de brieven, waarbij, als je bedoelt te zeggen "A", je in plaats daarvan zeggen: "B,"
je bedoelt te zeggen "B" je in plaats daarvan zeggen "C" -
of iets een beetje slimmer dan dat-- en dan, uiteindelijk,
zolang Annie heeft deze decoder ring, kan ze de boodschap te ontcijferen.
Nu, jullie mogen herdenken, in feite, dat deze werd gebruikt in een zeer bekende film die
speelt vervelens toe tijdens de kerstperiode.
Laten we eens een kijkje nemen hier.
RALPHIE PARKER: "Of het nu bekend bij iedereen in samenvatting
dat Ralph Parker wordt benoemd lid van Little Orphan Annie Secret
Circle en heeft recht op alle eert en voordelen, welke ontstaan. "
>> RALPHIE PARKER (vertellen): Ondertekend Little Orphan Annie.
Medeondertekend, Pierre Andre!
Met inkt.
Eer en voordelen, al op de leeftijd van negen.
>> [Muziek]
>> [RADIO GERATEL]
RALPHIE PARKER: Kom op.
Laten we aan de slag gaan.
Ik wil niet al die jazz nodig over smokkelaars en piraten.
RADIO Omroeper: Luister morgen nacht voor de afsluitende avontuur
van The Black Pirate Ship.
Nu, is het tijd voor Annie's Geheime boodschap voor je leden
van de Secret Circle.
Onthoud kinderen, alleen voor leden van Annie's Secret Circle
kan geheime boodschap Annie's te decoderen.
>> Vergeet niet, Annie is afhankelijk van je.
Stel je pinnen om B-2.
Hier is de Message-- 12, 11, 2--
RALPHIE PARKER (vertellen): I ben in mijn eerste geheime vergadering.
RADIO Omroeper: -25, 14, 11, 18, 16--
RALPHIE PARKER (vertellen): Oh, Pierre was in grote stem vanavond.
Ik kon vertellen dat vanavond boodschap was echt belangrijk.
>> RADIO Omroeper: --3, 25.
Dat is een boodschap van Annie zichzelf.
Vergeet niet, niet verder vertellen.
>> [HIJGEN]
RALPHIE PARKER (vertellen): Negentig seconden later, ben ik
in de enige kamer in het huis waar een jongen van negen
in privacy en decoderen kon zitten.
Ah.
"B."
>> [Grinnikt]
>> RALPHIE PARKER (vertellen): Ik ging naar de volgende.
"E."
Het eerste woord is "zijn."
Yes!
Het kwam nu gemakkelijker.
"U."
>> [Grinnikt]
>> RANDY PARKER: Ach, kom op, Ralphie.
Ik moet gaan!
>> RALPHIE PARKER: Ik kom er zo aan, Ma.
Jeetje.
"T." "O." "Zorg ervoor dat u aan. "" Zorg ervoor dat "wat?
Wat was Little Orphan Annie probeer te zeggen? "Zorg ervoor dat" wat?
MOEDER: Ralphie, Randy heeft om te gaan.
Wil je alsjeblieft naar buiten komen?
>> RALPHIE PARKER: Oke, mam!
Ik kom eraan!
RALPHIE PARKER (vertellen): Ik was dichter nu krijgt.
De spanning was verschrikkelijk.
Wat was het?
Het lot van de planeet kan hangen in de balans.
>> MOEDER: Ralphie, Randy's got to go!
>> RALPHIE PARKER: Ik zal gelijk hebben out, notabene!
RALPHIE PARKER (Vertellen): We zijn er bijna!
Mijn vingers vlogen!
Mijn geest was een stalen val.
Elke porie getrild.
Het was bijna duidelijk!
Yes!
>> RALPHIE PARKER: "Zorg ervoor dat u om uw Ovaltine drinken. "
Ovaltine?
Een mollig commercieel?
>> [Muziek]
>> RALPHIE PARKER: Klootzak.
>> [Lacht]
>> DAVID J. Malan: Dus dat is dan een blik op wat cryptografie
kan zijn voor een dit-- drinken van weleer.
Dus een snelle aankondiging.
Als je vrij bent deze Vrijdag om 13:15 en zou
graag om met ons mee voor CS50 lunch, ga naar deze URL hier.
Wie het eerst komt, het eerst maalt zoals gewoonlijk.
Maar na verloop van tijd, zullen we ervoor zorgen dat bijna iedereen die het leuk vinden om deel te nemen
kunnen plannen-wise.
>> Dus strings.
We hebben Zamyla-- wie je nu hebt ontmoet waarschijnlijk
in Probleemverzameling 1-- wiens naam wordt zo gespeld.
En stel dat je haar naam getypt in een computerprogramma dat
met behulp van iets als getString.
Om halen die toetsaanslagen, hoe
gaan we over wat neerkomt op een touw, een woord, een paragraaf,
of meerdere letters zoals deze hier?
>> We spraken vorige keer over integers en problemen
die zich voordoen met integer overflow en floating point waarden
en problemen ontstaan ​​binnen de precisie.
Met strijkers, we tenminste een beetje meer flexibiliteit
omdat strings-- net in de echte wereld--
een vrij willekeurige lengte.
Vrij kort, vrij lang.
Maar zelfs dan, we gaan vinden dat computers soms
opraken van het geheugen en zelfs niet slaan een groot genoeg string.
>> Maar voor nu, laten we beginnen te visualiseren een string als iets in deze vakken
hier.
Dus zes van dergelijke dozen, die elk staat voor een teken of "char."
Zo herinneren dat "char" - c-h-a-r-- is een van de ingebouwde datatypes in C.
En wat leuk is dat je kunt gebruiken dat soort als een bouwsteen,
een puzzel stuk, als je wil, een vorm grotere type gegevens dat we blijven
een "string." call
>> Nu, wat is handig over het denken over zaken als strings op deze manier?
Nou, het blijkt dat we kunnen daadwerkelijk te benutten deze structuur
om daadwerkelijk toegang te krijgen tot de individuele tekens in een vrij eenvoudige manier.
Ik ga om te gaan en te creëren Een bestand "stringzero.c '
maar u kunt het noemen wat je wilt.
En op de website van de cursus is al dit voorbeeld tevoren,
dus je hoeft niet te typt u alles uit.
>> En ik ga om verder te gaan en eerst doen int main leegte.
En binnen een paar dagen, we beginnen om elkaar te plagen
wat leegte is hier, waarom het int naast de belangrijkste, enzovoort.
Maar voor nu, laten we doorgaan om te kopiëren plakken dat.
>> Ik ga naar een string genaamd s verklaren.
En ik ga terug te keren van GetString wat de gebruiker typt in.
Dit wordt eenvoudig worden programma geen instructies,
Ik ga gewoon blindelings verwachten dat de gebruiker weet
wat te doen om het simpel te houden.
>> En nu ga ik een hebben voor de lus.
En de binnenkant van mijn for loop ik ben gaat hebben int i krijgt nul.
En i is, nogmaals, slechts een conventie, een index variabele voor het tellen,
maar ik kon dit wat ik wil noemen.
Ik ga doen ik minder than-- goed Naam Zamyla is zes letters lang.
Dus ik ga hard code dat er voor nu.
>> En dan ++ i.
En nu de binnenkant van deze krullend braces Ik ga printf doen,
en ik wil een afdrukken teken tegelijk.
Dus ik ga naar% c te gebruiken voor misschien de eerste keer.
En dan wil ik elke af te drukken karakter op zijn eigen lijn.
Dus ik ga een zetten weinig backslash n daar.
Sluiten offerte.
>> En nu wil ik hier iets aan te doen.
Ik wil uitprinten bepaalde letter in de tekenreeks
s, zoals ik itereren van nul tot zes.
Met andere woorden, ik wil print het i'th karakter van s.
Nu hoe kan ik dit doen?
>> Nou net als de dozen in Deze voorstelling here,
soort, roepen de notie van het boksen letters in, dan kun je op dezelfde manier doen
syntactisch in C door simpelweg te specificeren, Ik wil uitprinten s's i'th karakter.
De haken op het toetsenbord van uw computer
van een Amerikaans toetsenbord zijn algemeen boven uw terugkeer sleutel.
>> Dus dit is niet helemaal goed nog, zoals je misschien al opgevallen.
Maar ik ga soort hier blindelings streven naar vooruitgang.
En ik ga doen snaren is 0.
Maar voordat ik dit doen, laten we eens kijken of we niet kan anticiperen op een aantal veel voorkomende fouten.
Gaat dit te compileren?
Nee, ik mis een hele hoop dingen.
Bibliotheken ik hoorde.
>> Dus welke bestanden header zou ik hier willen toevoegen?
Yeah.
>> PUBLIEK: Je moet standaard I / O [onverstaanbaar]
>> DAVID J. MALAN: Excellent.
Dus ik moet standaard I / O. Voor wat doel wil ik standaard I / O?
Voor printf.
Dus omvatten stdio.h.
En je ook voorstellen dat ik onder de CS50 bibliotheek voor welke reden?
Om strings te hebben.
Dus we zullen zien wat Bibliotheek CS50's doet
dit begrip string te maken.
Maar voor nu, kun je gewoon denken het als een feitelijke gegevenstype.
>> Dus dat lijkt een beetje opgeruimd.
En nu ga ik om verder te gaan en inderdaad doen snaren is 0.
Samengesteld.
Dus dat is goed.
Dus ./string0 laat me in te zoomen, zodat we kunnen Bekijk meer nauwgezet wat er gebeurt.
Enter.
Z-A-M-Y-L-A invoeren.
En we hebben uitgeprint op naam Zamyla's.
>> Dus dat is best goed.
Dus laten we nu verder gaan en opnieuw uitvoeren van dit programma,
en uittypen volledige naam Daven's.
Surprise, surprise.
Enter.
Hmm.
We hebben niet afgedrukt Daven's volledige voornaam correct.
Nu dit duidelijk in moeten zijn terugblik door wat,
soort, dom ontwerp beslissing?
>> Ja, ik hard gecodeerd de zes binnenkant van mijn voor-lus.
Nu heb ik dat alleen maar omdat Ik kende de naam Zamyla's
zou gaan om zes letters zijn.
Maar zeker is dit niet Een algemene oplossing.
Dus het blijkt dat we kunnen dynamisch achterhalen van de lengte van een string
door te bellen naar een functie genaamd strlen.
>> Nogmaals, opzettelijk bondig zojuist genoemde
om het gemakkelijker te typen.
Maar dat is synoniem met om de lengte van een tekenreeks.
Ik ga terug naar mijn terminal raam-en re-run van de compiler.
Maar het is schreeuwen tegen me.
Impliciet verklaren bibliotheekfunctie strlen met type unsigned int const--
Ik ben verloren.
Volledig.
>> Dus, in het bijzonder als uw ogen beginnen te glazuur over
met foutmeldingen als deze, focus eerlijk gezegd op de eerste paar woorden.
We kennen het probleem in lijn 8, zoals hier aangegeven.
En het is in string-0.c.
Impliciet verklaren bibliotheekfunctie strlen.
Zodat algemeen gaat zijn een patroon van foutmeldingen.
Impliciet verklaren iets.
>> Dus in het kort, wat heb ik leek te hebben gedaan met betrekking tot lijn 8, hier.
Wat kunnen de oplossing zijn, zelfs als je nog nooit strlen zelf hebt gebruikt?
>> PUBLIEK: Een deel van een andere bibliotheek?
DAVID J. MALAN: Part van een andere bibliotheek.
Dus het wordt verklaard, bij wijze van spreken.
Het wordt vermeld in een bestand andere dan stdio.h en CS50.h.
Nu waar is het gedefinieerd?
Om eerlijk te zijn, ofwel moet je gewoon weet dat dit uit de top van je hoofd,
of u deze Google en uit te vinden.
Of weet dit, ik heb in de CS50 geopend Apparaat Het terminal programma, dat
is alleen de grote, full screen versie van wat zit er in de onderkant van het venster gedit's.
>> En het blijkt dat er een bondig eveneens commando, genaamd
man voor handmatige, waar als je typt de naam van een functie en druk op Enter,
je zult vrij terug arcane documentatie.
Het is gewoon de tekst die in het algemeen ziet er een beetje iets als dit.
Het is een beetje overweldigend op het eerste gezicht.
Maar eerlijk gezegd ik ga laat mijn ogen glazuur over
en alleen gericht op het deel Ik geef om voor het moment.
>> Dat is dit.
Die ziet er structureel als iets waar ik bekend mee zijn.
Inderdaad de man pagina, dus te spreken, zal u vertellen
in welke header-bestand een functie als strlen is gedefinieerd.
Dus ik ga nu terug naar gedit.
En ik ga om verder te gaan en voegen hier #include in
en sla het bestand op.
>> Ik ga naar het scherm te wissen met Control L Als u zich afvraagt.
En ik ga opnieuw uitvoeren make string.0, compileert deze tijd.
./string.0 Zamyla.
Dat leek te werken Laat me gaan vooruit en start het opnieuw op met Davenport.
Enter.
En ook dat leek te werken.
>> Dus we kunnen een beetje beter dan dit te doen, hoewel, kunnen we beginnen met het netjes dingen
up maar een klein beetje.
En ik ga eigenlijk introduceren nu een ander ding.
Ik ga om te gaan en bewaar deze in een ander bestand.
En ik ga bellen Dit bestand string1.c gewoon
in overeenstemming met de code te je zult in staat zijn om online te vinden.
>> En laten we focussen op precies dezelfde code.
Het blijkt dat ik heb geweest soort nemen
vanzelfsprekend het feit dat mijn laptop, en op zijn beurt, de CS50 apparaat
heeft veel geheugen, een veel RAM, veel bytes ruimte
waarin ik strings kan opslaan.
>> Maar de realiteit als ik typte lang genoeg en voldoende toetsaanslagen,
Ik kon in het type theorie in meer tekens
dan mijn computer heeft fysiek geheugen voor.
En dat is problematisch.
Net als een int kan alleen tellen zo hoog, in theorie,
je kunt alleen proppen zo veel personages in het RAM van de computer of een willekeurige
Access Memory.
>> Dus ik had beter verwacht dit probleem zelfs
hoewel het een zeldzaam misschien hoek geval, bij wijze van spreken.
Gebeurt niet zo vaak, zou kunnen gebeuren.
En als het gebeurt en ik niet anticiperen op en het programma voor het,
mijn programma kon doen wie weet wat.
Freeze, hangen, reboot, wat dan ook.
Iets verwacht zou kunnen gebeuren.
>> Dus wat ik ga doen nu voortaan echt,
is voordat ik ooit blindelings Gebruik als een variabele, dat
is toegewezen de return waarde van een andere functie, zoals getString,
Ik ga ervoor zorgen dat dat zijn waarde geldig is.
Dus ik weet alleen van het lezen Documentatie CS50's voor getString,
die uiteindelijk zullen we u wijzen op, dat getString geeft een speciaal symbool
genaamd NULL, N-U-L-L in alle caps, als er iets misgaat.
>> Dus normaal gesproken, het geeft een string.
Maar voor de rest als het weer N-U-L-L-- zullen we uiteindelijk zien wat die echt
means-- dat betekent iets ergs gebeurd.
Nu betekent dit, net als in Scratch, Ik kan een aandoening controleren hier in C,
Als s niet gelijk NULL.
Dus als je dit nog niet eerder hebt gezien, Dit betekent gewoon niet gelijk.
>> Dus het is het tegenovergestelde van gelijke gelijken, die, herinneren,
verschilt van enkele evenaart, die opdracht.
Dus als s niet gelijk NULL, dan pas
Ik wil deze regels code uit te voeren.
Dus met andere woorden, voordat ik duik in blindelings
en start itereren dan s en behandelen
alsof het een reeks personages, ik ga eerst te controleren,
wacht eens even, is het is zeker niet gelijk is aan deze speciale waarde, NULL?
>> Want als dat zo is, kan slechte dingen gebeuren.
En voor nu, neem aan dat slechte dingen gebeurt betekent het programma crasht,
en je kunt niet per se terug te krijgen.
Dus eerlijk gezegd, het ziet er lelijker.
Het is een beetje verwarrend nu een blik te werpen op.
Maar dit zal meer worden vertrouwde het duurde niet lang.
>> Maar ik ga voor te stellen Nu een andere verbetering.
Dat is een verbetering van correctheid.
Mijn programma is nu juist, want in het zeldzame geval dat er niet genoeg geheugen
bestaat, zal ik het wel aan, en ik zal gewoon niets doen.
Ik in ieder geval niet zal crashen.
>> Maar laten we een definitieve versie hier.
En een bestand genaamd string2.c.
Ik ga om te plakken dat dezelfde code voor slechts een moment,
en ik ga dit markeren lijn, 11, hier, voor slechts een moment.
Nu de realiteit is dat slimme compilers zoals Clang dit voor ons zou kunnen oplossen
achter de schermen zonder dat wij ooit te weten.
Maar laten we eens over nadenken fundamenteel als een problematische ontwerp.
>> Deze lijn van code is, natuurlijk zeggen, initialiseren enkele variabele i op 0.
Dat is vrij eenvoudig.
En wat ook dit is verklaring, hier, ik ++, aan het doen?
We hebben het al eerder gezien, maar we niet echt over praten.
>> PUBLIEK: Verhogen i.
>> DAVID J. MALAN: Verhogen van i.
Dus elke iteratie door deze lus elke cyclus,
je oplopende i voor een.
Dus het wordt groter en groter, en groter totdat de lus beëindigd.
Hoe gaat dat eindigen?
Wel is er dit midden voorwaarde die we eerder hebben gebruikt.
Je hebt gezien en in walkthroughs in de P-set.
>> Maar wat is deze uitspraak?
Doe het volgende lus, zodat Zolang ik minder dan wat?
Publiek: De lengte van de snaar.
DAVID J. MALAN: De lengte van de tekenreeks.
Dus het vertaalt vrij netjes in het Engels in die zin.
Nu is het probleem dat elke keer als ik Doorloop deze lus in theorie,
Ik stel deze vraag.
Is i minder dan de lengte van de string van s?
>> Nu wordt ik veranderen op elke iteratie?
Het is.
Vanwege de ++.
Dus elke iteratie i wordt steeds groter.
Maar is s steeds groter, of kleiner, of het veranderen te allen?
Nee
Dus in termen van design, een van de assen waarlangs we proberen om de code te evalueren
in de klas, dit voelt soort dom.
>> Alsof je letterlijk, elke iteratie
van deze lus het stellen van de Dezelfde verdomd vraag opnieuw,
en opnieuw, en opnieuw, en letterlijk het wordt nooit veranderen.
Tenminste als ik niet aanraken s en probeert de inhoud van s veranderen.
Dus ik kan een beetje beter doen dan dit.
>> En wat ik ga doen is niet verklaren slechts een variabele i,
maar een tweede variabele zal ik willekeurig, maar conventioneel, noem het n.
Toewijzen n gelijk is aan de snaar lengte van s.
En dan hier, ik ga doe een slimme kleine optimalisatie, dus
spreken, dat aan het eind van de dag niet meer correct is of niet minder correct
dan voorheen.
Maar het is een beter ontwerp.
In het feit dat ik gebruik minder tijd, minder CPU, dus
spreken in dezelfde beantwoorden vraag, maar slechts een keer.
>> Eventuele vragen over deze algemene beginsel verbetering,
zeggen efficiency van een programma?
Yeah?
PUBLIEK: Waarom denk je Gebruik de [onverstaanbaar]?
DAVID J. MALAN: Goede vraag.
Dus waarom doen we de ++ op het einde van i in plaats van het begin van de i?
In casu heeft geen functionele gevolgen.
En in het algemeen, heb ik de neiging om gebruik maken van de postfix operator
zodat het een beetje meer duidelijk als wanneer de operatie gebeurt.
>> Voor wie niet vertrouwd, is er een ander uitspraken waarbij je kon ++ doen i.
Dit zijn functioneel equivalent in casu
want er is niets anders rond die incrementering.
Maar je kunt komen met gevallen en regels code
waarin dat maakt een verschil.
Dus over het algemeen, dat doen we niet zelfs praten over deze.
Want eerlijk gezegd, het maakt je code sexier, en soort van gelikter,
en minder tekens.
Maar de realiteit is dat het een stuk moeilijker, Ik denk dat, zelfs voor mij om mijn gedachten te wikkelen
eromheen soms de volgorde van de bewerkingen.
Dus als een terzijde, als je echt niet als dit,
ook al is dit soort sexy op zoek, dan kunt u ook doen i + = 1,
die de uglier versie van de Hetzelfde idee voor postfix incrementatie.
>> Ik dit en je zegt moet leuk van maken,
maar u zal komen om code te zien als iets moois voor lang.
>> [Lachen]
>> DAVID J. MALAN: Recht?
Yeah.
Vraag in het midden.
>> PUBLIEK: Moet u int n zeggen?
DAVID J. MALAN: Je doet niet nodig om int n zeggen.
Dus omdat we al hebben gezegd int, je hoeft niet nog eens zeggen.
De vangst is dat n moet zijn het dezelfde soort gegevens als i.
Dus dat is gewoon een gemak hier.
Yeah.
>> PUBLIEK: Kun je over de afdrukken karakter s beugel i weer?
DAVID J. MALAN: Absoluut.
Dus% c, herinneren van vorig tijd, is slechts een tijdelijke aanduiding.
Het betekent dat we hier een char.
backslash n, natuurlijk: middel zet hier een regeleinde.
Zodat alleen verlaat, nu, dit stuk nieuwe syntaxis.
En dit is letterlijk zeggen, grijp de string genaamd s en ga je haar
i'th karakter, zo te zeggen.
>> En ik blijf zeggen i'th karakter want op elke iteratie van deze lus
het is alsof we afdrukt in de eerste s beugel 0,
als programmeur zou kunnen zeggen.
Dan s beugel 1, dan s beugel 2, dan 3 en dan 4.
Maar natuurlijk is het een variabele, dus ik druk het alleen met i.
>> Sleutel, is echter te realiseren, vooral als je hebt niet
is wennen aan deze wereld van de programmering, waar we allemaal
lijken te tellen vanaf nul, moet beginnen te tellen vanaf nul nu.
Omdat de snaren, eerste teken, de z in Zamyla is voor beter of slechter
gaan op locatie nummer nul te leven.
>> Oke, dus laat me brengen ons hier tot Zamyla terug
en zien wat er werkelijk aan de hand op onder de motorkap.
Dus er is deze notie van typecasting.
Je zou eigenlijk gespeeld met dit al,
misschien voor de hacker editie van P set een.
Maar typecasting gewoon verwijst naar de vermogen in C en enkele andere talen
een gegevenstype omrekenen.
>> Maar hoe kunnen we dit zien vrij rechtlijnig?
Dus dit, recall, is het begin van het Engels alfabet.
En de context, herinneren, uit net als een week geleden is ASCII.
De American Standard Code for Information Interchange.
Dat is gewoon een heel lange weg zeggen een mapping van brieven
om nummers, en van cijfers naar letters.
>> Dus A tot en met M hier, dot dot dot, lijn staat met, recall,
het decimale getal 65 op maximaal.
En we niet praten over dit expliciet,
maar zeker is er gelijkaardige nummers voor kleine letters.
En inderdaad, er zijn.
De wereld besloot enkele jaren geleden dat kleine een, kleine letter a,
gaat worden 97.
En kleine b gaat zijn 98, enzovoort.
>> En voor een andere toets op je toetsenbord, er is
naar een vergelijkbaar patroon bits zijn.
Oftewel, een decimaal getal.
Dus de vraag bij de hand, is dus hoe kunnen we
dit daadwerkelijk te zien onder de motorkap?
Dus ik ga weer opnieuw naar gedit.
En in plaats Type deze van de grond af,
Ik ga om te gaan en gewoon openstellen iets
van de huidige code genoemd ASCII nul.
>> En ASCII nul ziet er als volgt uit.
Dus laten wikkelen onze gedachten rond dit.
Dus eerst, heb ik commentaar de code, dat is leuk.
Want het is letterlijk mij vertellen wat te verwachten,
weer een mapping voor hoofdletters.
Nu weet ik niet goed wat ik daarmee bedoel, dus laten we afleiden.
>> In het Engels, misschien enigszins techneut Engels,
wat doet lijn 18 verschijnen te doen voor ons?
Gewoon lijn 18.
Wat is het induceren van?
Wat gaat het hier aftrap?
>> Publiek: Een lus.
>> DAVID J. MALAN: Een lus.
En hoe vaak is dat gaat herhalen?
PUBLIEK: [onderbreekt hem VOICES] zes keer.
DAVID J. MALAN: Niet zes keer.
Publiek: 26 keer.
DAVID J. MALAN: 26 keer.
Ja, sorry.
26 keer.
Waarom?
Nou, het is een beetje raar, maar Ik ben begonnen met het tellen van 65.
Dat is raar, maar niet verkeerd.
Het is niet slecht per zeggen.
En ik doe dat alleen want voor dit voorbeeld
Ik ben een beetje anticiperen dat hoofdletter A was 65.
Nu is dit niet de meest elegante manier om dit te doen, om een ​​beetje moeilijk code
esoterische waarden die niemand is ooit verwacht te onthouden.
>> Maar voor nu, merk ik dat ik ben dit te doen omhoog door 65 plus 26.
Want blijkbaar Ik wil er niet eens aan het rekenkundig doen in mijn hoofd.
Dus ik laat de compiler doen.
Maar dan op elke lus, elke iteratie van de lus, ik ben het verhogen i.
>> Dus nu dit ziet er een beetje cryptisch.
Maar we moeten de basis-gebouw hebben blokken met om deze te begrijpen.
% C is slechts een tijdelijke aanduiding voor een char.
% I is een tijdelijke aanduiding voor een int.
Het blijkt dat met deze nieuwe syntax, deze haakjes, dus
spreken, zodat een gegevenstype in een haakjes
Ik kan de compiler te dwingen om te behandelen i niet een geheel getal, maar als char.
>> Daarbij toont me het karakter equivalent van dat nummer.
Nu hier beneden, deze code is vrijwel identiek.
Ik wilde alleen maar om ervoor super expliciet het feit
dat ik ben beginnen bij 97, die kleine letter a.
Op omhoog door 26 meer letters.
En ik ben weer doing--, casting ik, bij wijze van spreken.
Of typecasting ik, bij wijze van spreken.
>> Van een int naar een char.
Dus het eindresultaat zal zijn, eerlijk gezegd, informatie die we al kennen.
Ik ga maken ascii-0 dot-- niet dot c.
Let op, u waarschijnlijk gemaakt dat fout als ik deed gewoon per ongeluk.
Maak ascii-0.
Nu ik ga doen ./ascii-0.
Ik zal in te zoomen, en helaas het gaat om af te scrollen op het scherm.
Maar we zien een hele grafiek waar een kaarten tot 97, b kaarten tot 98,
en als we schuiven verder omhoog Een natuurlijk kaarten 65.
Dit is alleen dat wat we hebben gepredikt,
er is deze gelijkwaardigheid wordt in feite het geval is in de werkelijkheid.
Dus een snelle wijziging van deze.
Laat me openstellen ascii-1.c.
En merk op deze slimme, sorteren van, verduidelijking van dit.
Dit is ascii-1.c, en merkt dit gekke ding.
>> En dit is echt raakt de kern van wat computers doen.
Hoewel we mensen zouden niet rekenen in termen van letters--
Ik wil niet gaan denken, oke een dan b,
en gebruiken die om fysieke objecten te tellen.
Je kunt wel zeggen dat ik wil initialiseren van een aantal variabele genaamd c--
maar ik kon dit anything-- hebben genoemd dus c wordt geïnitialiseerd tot kapitaal A.
>> Omdat aan het eind van de dag, de computer maakt het niet uit wat je het opslaan,
Het geeft alleen maar hoe je wilt om die informatie te presenteren.
Hoe beoordeelt u de computer te willen interpreteren patroon bits?
Dus dit is niet iets wat ik zou adviseren over het algemeen doen.
Het is eigenlijk gewoon een voorbeeld om over te brengen dat je kan absoluut
initialiseren een integer naar een char.
Omdat onder de motorkap van een char, natuurlijk
is maar een getal van 0 tot 255.
>> Dus je kan zeker zet het in een int.
En wat dit ook laat zien, is dat we
kunt converteren van het ene type naar het andere, hier,
uiteindelijk het afdrukken van het zelfde ding.
En in feite, deze zal ik vast online-- bedoeld was om dit te zeggen, nogmaals, hier.
Laat me dit opruimen online, en we zullen zien in een online walkthrough als nodig is,
wat er werd bedoeld.
>> OK.
Dus laatste voorbeeld nu met a's en b's en dan gaan we
nemen de dingen een inkeping.
Dus met een en b's en c's in de kapitalisatie
en de gelijkwaardigheid daarvan, laten we een kijkje nemen op dit voorbeeld hier.
Een andere code voorbeeld.
We zullen een die openen al gemaakt, dus we
niet hoeft te typen allemaal vanaf nul.
>> En bericht in afwachting we gebruik van meerdere header
bestanden, waaronder is onze nieuwe vriend, string.h.
Nu lijkt dit op het eerste blik, een beetje cryptisch.
Maar laten we eens kijken of we niet kunnen beredeneren door wat er aan de hand hier.
Eerst krijg ik een string van de gebruiker, en ik zet die string in een variabele
genaamd s.
Copy paste van voor.
In lijn 22, ik ben blijkbaar doet precies wat
Ik heb daarnet, ik itereren over de personages in s.
>> En de nieuwe trucs hier gebruikt lengte van de string, de minderjarige optimalisatie
opslaan van de string lengte n, eerder dan roeping weer strlen,
en opnieuw, en opnieuw.
En gewoon controleren dat ik minder dan n.
Nu hier, dingen wat interessant.
Maar het is gewoon een toepassing ditzelfde nieuw idee.
Wat in het Engels doet s beugel i vertegenwoordigen?
>> PUBLIEK: Tellen elke karakter [onverstaanbaar].
>> DAVID J. MALAN: Het tellen van elk personage.
En nog beknopter, s beugel i vertegenwoordigen wat?
Zou je zeggen.
Niet om u op de plek zetten hier.
>> PUBLIEK: goed--
DAVID J. MALAN: Dus als het woord is-- als de string is Zamyla, die starts--
PUBLIEK: --u omgaan met de personages separately--
DAVID J. MALAN: Goed.
Precies.
Het plein haakjesnotering kunt u toegang tot de afzonderlijke karakter,
dus s beugel 0 gaat het worden eerste teken in de reeks.
s beugel 1 gaat worden de tweede, enzovoort.
Dus de vraag die ik ben gevraagd, Hier, in deze toestand is wat?
Is de i'th karakter van s groter dan of gelijk aan een kleine letters?
En wat betekent dit, hier, met de dubbele ampersand?
PUBLIEK (SAMEN): En.
DAVID J. MALAN: En.
Het is gewoon gelijk aan deze.
En is het niet een trefwoord in C, moet je gebruik, hinderlijk, ampersand-teken.
En dat, omgekeerd, zich stelt is s's i'th karakter kleiner dan of gelijk
naar kleine letters z?
En nogmaals, hier is waar begrijpen van de onderliggende
implementatie van een computer zinvol.
Merk op dat, ook al heb ik de dot dot dot daar,
ziet eruit als een tot z in kleine letters worden alle aangrenzende waarden op van 97 naar boven.
>> En hetzelfde voor hoofdletters beginnen bij 65.
Dus het afhaalrestaurant, dan, is dat in het Engels,
hoe zou u welke lijn 24 aan het doen is?
Yeah?
>> PUBLIEK: Op 24 het is het controleren om te zien of elk personage is een kleine letter.
DAVID J. MALAN: Het is het controleren of elk personage is een kleine letter.
Dus zelfs beknopter, is de i'th karakter van s kleine letters?
Dat is alles wat we hier uiten logisch,
een beetje cryptisch, maar uiteindelijk vrij rechttoe rechtaan.
Is s's i'th karakter kleine letters?
>> Als dat zo is, en hier is waar dingen een beetje breinbrekende
voor slechts een moment, als dat zo is, ga vooruit en afdrukken van een personage.
Dus dit is slechts een tijdelijke aanduiding, maar wat karakter?
Waarom doe ik s beugel i minus deze uitdrukking hier?
>> Wel merkt het patroon hier.
De werkelijke aantallen doen er niet toe zo veel.
Maar merk op dat 97 is hoe ver weg van 65?
>> Publiek: 32.
>> DAVID J. MALAN: 32.
Hoe ver is 98 uit 66?
>> Publiek: 32.
>> DAVID J. MALAN: Little c van grote C?
32.
Dus er is 32 hop uit ene letter naar de andere.
Dus eerlijk gezegd, kon vereenvoudigen dit naar dat.
Maar dan ben ik soort van harde codering dit lage inzicht
dat geen enkele lezer ooit gaan begrijpen.
Dus ik ga het generaliseren als ik weet de kleine letters zijn groter.
Ik weet dat de hoofdletters zijn kleinere waarden, ironisch genoeg.
>> Maar dit is feitelijk gelijkwaardig aan zeggen aftrekken 32 uit s beugel i.
Dus in de context van deze brieven, als de brief
gebeurt er met een, kleine letters een, en ik trek 32,
welk effect heeft dat, mathematisch, op kleine letter a?
PUBLIEK: Capitalizes--
DAVID J. MALAN: Maakt van het.
En inderdaad, dit is de reden waarom onze programma heet kapitaliseren nul.
Dit programma ofwel kapitaliseert een brief,
nadat is gecontroleerd of het inderdaad een kleine letter.
Anders, in lijn 30, wat moet ik doen als het is niet een kleine letter, dat ben ik
kijken op een bepaald iteratie in de lus.
Gewoon uitprinten.
>> Dus niet dingen veranderen dat is niet eens kleine letters.
Jezelf beperken tot beetje een door kleine z.
Nu is dit vrij geheimzinnig.
Maar aan het eind van de dag, het is hoe we, Once upon a time,
had om dingen te implementeren.
Als ik in plaats daarvan openen kapitaliseren een, oh god zij dank.
Er is een functie riep bovenste die kunnen
doen alles wat we net gedaan bij vrij laag.
>> Nu tot de bovenste is interessant want het wordt verklaard in een bestand,
en je zou alleen dit weten door het controleren van de documentatie,
of wordt verteld, laten we zeggen, in de klas, waar het bestaat, in een bestand genaamd ctype.h.
Dus dit is weer een nieuwe vriend van ons.
En tot de bovenste precies doet wat de naam doet vermoeden.
>> Je kunt pas in, als een argument, tussen deze haakjes, wat karakter.
Ik ga pas in de i'th karakter van s met behulp van onze mooie nieuwe notatie
waarbij vierkante haken.
En neem een ​​gok, wat is het rendement waarde van de bovenste schijnbaar gaan
te zijn?
Een hoofdletter.
>> Dus als ik pas in kleine letters a, hopelijk, per definitie van de bovenste,
het gaat om een ​​terug hoofdletter A. Anders
als het niet een kleine letter in de eerste plaats, ik print het gewoon uit.
En inderdaad, let op de tweede vriend hier.
Niet alleen om de bovenste bestaat, maar kleiner, wat
daadwerkelijk beantwoordt die vraag voor mij.
>> Nu wie deze dingen schreef, 10s van jaren geleden, weet je wat?
Geïmplementeerd om de bovenste en is verlagen met behulp van code als deze.
Maar nogmaals, in overeenstemming met Dit idee van abstraheren weg,
soort, lager niveau implementatie details.
En staande op de schouders van de mensen die voor ons kwamen, met behulp van functies
als de bovenste en onderste, welke wonderlijk genoeg zijn mooi
genoemd om te zeggen wat ze doen, is een prachtige paradigma aan te nemen.
>> Nu, het blijkt dat als ik lees de man pagina voor, laten we zeggen, de bovenste,
Ik leer iets anders.
Dus man toUpper.
Het is een beetje overweldigend.
Maar let op, hier is dat de vermelding van het header-bestand dat ik moet gebruiken.
Even terzijde, want dit misleidend, de functie
gebruikt ints plaats van chars om redenen van foutcontrole.
Maar we zullen misschien komen naar die in de toekomst.
>> Maar let op, hier, om de bovenste bekeerlingen de letter c in hoofdletters indien mogelijk.
Dus dat is vrij eenvoudig.
En laten we nu een beetje meer specifiek.
Laten we eens kijken naar het deel van de man pagina onder return waarde.
De geretourneerde waarde is dat van de geconverteerde brief.
Of c, indien de conversie niet mogelijk was,
waarbij c de oorspronkelijke ingang.
Waarvan ik weet van hier, van het argument om naar de bovenste.
>> Dus wat is de afhaal van deze?
De geretourneerde waarde is dat van de geconverteerde brief,
of c de oorspronkelijke brief, indien de conversie niet mogelijk.
Wat verbetering kan ik dan ook leveren aan het ontwerp van mijn code's?
Yeah?
>> PUBLIEK: U kunt het anders verwijderen.
DAVID J. MALAN: ik kan verwijder de else
en niet alleen de instructie else.
>> PUBLIEK: U kunt verwijderen [onverstaanbaar].
>> DAVID J. MALAN: ik kan verwijder de hele vork
in de weg, het zo heel anders.
Dus inderdaad, laat me openen de definitieve versie van dit,
kapitaliseren-2 en merk op hoe, wanneer je zult, sexy, de code krijgt nu,
in die ik heb teruggebracht van enkele zeven of zo lijnen slechts vier,
de functionaliteit die ik van plan was door gewoon te bellen naar de bovenste,
passeren in s beugel i, en printen uit, met de tijdelijke aanduiding% c,
dat specifieke karakter.
>> Nu misschien wel, er is een bug, of ten minste het risico van een bug,
in dit programma.
Dus gewoon om terug te komen naar een eerdere, eten
wat moet ik waarschijnlijk ook doen in dit programma om het robuuster te maken,
zodat er geen manier het kan crashen, zelfs in uitzonderlijke gevallen?
PUBLIEK: Zorg ervoor dat het niet NULL.
DAVID J. MALAN: Zorg ervoor dat het niet NULL.
Dus echt, om deze super maken juist, ik zou zoiets doen,
als s niet NULL is, dan ga je gang en uit te voeren
de volgende regels code, die Ik kan dan streepje als dat,
en vervolgens in mijn nauwe brace.
Zo goed aan elkaar knopen van de twee ideeën.
Yeah?
Publiek: Kunt u gebruik maken van een doen terwijl lus, in plaats daarvan?
DAVID J. MALAN: Kon Ik doe een do while lus?
PUBLIEK: --u willen ervoor zorgen dat je eigenlijk [onverstaanbaar].
DAVID J. MALAN: Kon u een doe gebruiken terwijl?
Korte antwoord nee.
Want je staat op het punt introduceren andere hoek case.
Als de string is van lengte nul.
Als ik bijvoorbeeld gewoon op Voeren, zonder ooit te typen Zamyla.
Ik ga u terug te geven een echte snaar, als we uiteindelijk zullen zien,
dat nul karakters.
Het is nog steeds een string, het is gewoon super kort.
Maar als je een doe gebruiken terwijl, je gaat blindelings
proberen om iets te doen met respect voor die string,
en niets gaat om daar te zijn.
>> PUBLIEK: Nou, als je dat deed doen [onverstaanbaar], terwijl S--
DAVID J. MALAN: Oh ik zie, houden om een ​​koord van de gebruiker.
Dus kort antwoord, je kon, en blijf pesten
hen om u een string dat is geven kort genoeg om te passen in het geheugen.
Absoluut.
Ik koos gewoon niet aan.
Als ze niet geef me de string I wil, ga ik stoppen, ben ik het opgeven.
Maar absoluut, voor dat doel, kon je absoluut doen.
>> Dus header bestanden van de bibliotheek die we zijn nu bekend bent met deze, hier.
Standaard I / O, CS50.h, string.h, ctype.h, en er zijn inderdaad anderen.
Sommigen van jullie hebben ontdekt de wiskunde bibliotheek in math.h.
Maar laat me je voorstellen, nu, naar deze bron die CS50 personeel, Davin,
en Rob, en Gabe bijzonder hebben samengesteld.
Dat zal binnenkort te koppelen aan de website van de cursus.
Het heet CS50 referentie.
>> Die alleen maar om u een snelle geven smaak te pakken, werkt als volgt.
Laat me gaan naar reference.cs50.net.
Je ziet aan de linkerkant kant een overweldigende lijst
van functies die komen met c.
Maar als ik de zorg, voor het moment, over iets als strlen,
Ik kan het daar te typen.
Het filtert de lijst om gewoon wat ik zorg over.
Ik ga het klikt.
En nu aan de linkerzijde, je zult zien wat we hopen
is een eenvoudiger, menselijke vriendelijke uitleg van hoe
deze functie werkt.
>> Geeft de lengte van een string.
Hier is een overzicht, hier is hoe je gebruiken in termen van het header bestand,
en in termen van wat de functie lijkt in termen van zijn argumenten.
En dan hier terug de lengte van een tekenreeks.
Maar voor degenen onder u meer comfort, je kunt eigenlijk op meer comfortabele,
en de inhoud van deze pagina, nu, zal veranderen
de standaardwaarden welke zijn je krijgt door het gebruik van de man-pagina.
>> Met andere woorden, CS50 verwijzing is een vereenvoudiging
van de man-pagina's van het personeel, voor de studenten.
In het bijzonder, die minder comfortabel en in tussen, zodat je
hoeven niet te proberen te wikkelen je geest rond, eerlijk gezegd,
aantal vrij cryptische syntaxis en documentatie ergens.
>> Dus hou dat in gedachten in de komende dagen.
Dus hier, nogmaals, is een Zamyla.
Laten we nu een vraag stellen dat is iets meer menselijke toegankelijk.
Dankzij Chang, die al afdrukken meer olifanten
non-stop voor de laatste paar dagen.
We hebben een kans om te geven ten minste een van hen weg.
Als we slechts een vrijwilliger kon krijgen om op te komen tot op het scherm tekenen.
Hoe zit het hier?
>> Kom maar naar boven.
Wat is je naam?
ALEX: Alex.
DAVID J. MALAN: Alex.
Oke.
Alex, kom op.
We staan ​​op het punt om te zien uw handschrift op het scherm hier.
Oke, leuk je te ontmoeten.
>> ALEX: Leuk je je te ontmoeten.
>> DAVID J. MALAN: Oke.
Dus, super eenvoudige oefening.
Bar is niet hoog te krijgen een olifant vandaag.
Je speelt de rol van getString.
En ik ga gewoon vertellen de string die je hebt gekregen.
En stel dat je, getString, zijn geroepen.
En de mens, net als ik, heeft ingetypt Zamyla, Z-A-M-Y-L-A.
Gewoon doorgaan en schrijf Zamyla op de scherm alsof je hebt het gekregen
en bewaard het ergens in het geheugen.
>> Ruimte wordt gelaten voor wat meerdere zullen zijn andere words-- dat is OK, ga door.
>> [Lachen]
>> Dus Zamyla, Excellent.
Dus nu veronderstellen dat u, getString, worden opnieuw opgeroepen.
En daarom geef ik u, bij het toetsenbord, met een andere naam, Belinda.
Oke.
En nu de volgende keer getString is genaamd, typ ik in iets als Gabe,
G-A-B-E. Je bent echt van de grond tot hart random access memory.
Die trekt alles volledig willekeurig.
OK.
>> [Lachen]
ALEX: Sorry mijn handschrift is slecht.
DAVID J. MALAN: Nee, dat is OK.
En wat te denken van Rob, R-O-B. OK.
Goed.
Dus ik heb je niet verwachten zou soort dingen uit te leggen op deze manier.
Maar we kunnen dit werk te maken.
Dus hoe ga je over het leggen van deze tekens in het geheugen?
Met andere woorden, als we denken Dit rechthoekige zwart scherm
als vertegenwoordiger van een De RAM van de computer of het geheugen.
>> En herinneren dat RAM is gewoon een hele hoop van bytes,
en bytes zijn een hele hoop bits.
En bits zijn een of andere manier uitgevoerd, meestal
met een vorm van elektriciteit in hardware.
Dus dat is een soort van de gelaagdheid we hebben gesproken over
en kan nu voor lief nemen.
Hoe heb je over beslissen waar te schrijven
Rob versus Gabe versus Belinda versus Zamyla?
>> ALEX: Ik deed het gewoon in de bestellen dat je me vertelde.
>> DAVID J. Malan: En dat is waar.
Maar wat beheerst waar je Naam Belinda's en de naam van Gabe's?
>> ALEX: Niets?
DAVID J. MALAN: [Lacht] Dus dat werkt, dat is prima.
Dus computers little ordelijker dan dat.
En dus toen implement-- we daar blijven voor slechts een moment-- toen we eigenlijk
zoiets te implementeren getString in een computer,
Zamyla kan vrij veel worden aangelegd zoals je deed op het scherm, is er.
>> En wat is belangrijk op te merken hier, wat Alex deed,
is er een soort van een afbakening onder elk van deze woorden, toch?
Je schreef niet Z-A-M-Y-L-A-B-E-L-I-N-D-A-G-A-B--
Met andere woorden, er is een soort scheidingslijn die lijkt te zijn,
soort, willekeurige afstand tussen deze verschillende woorden.
Maar dat is goed, want wij mensen kunnen nu
visualiseren dat deze vier snaren.
Het is niet alleen een opeenvolging van veel tekens.
Dus een computer, dan, ondertussen, misschien een string te nemen zoals Zamyla,
zet elk van deze brieven binnenkant van een byte geheugen.
Maar dat aantal is veel groter, natuurlijk dan zes tekens.
>> Er is een hele hoop RAM.
En dus voortaan, deze raster van dozen gaat
wat Alex gewoon vertegenwoordigen heeft hier op het scherm.
En nu, Alex, kunnen wij u een aanbieden blauwe of een oranje olifant van Chang.
ALEX: Ik zal een blauwe olifant nemen.
DAVID J. MALAN: Een blauwe olifant.
Dus een groot applaus, als we konden, voor Alex hier.
>> [Applaus]
>> ALEX: Dank je wel.
DAVID J. MALAN: Dank je wel.
Dus de afhaalmaaltijd dat, hoewel de patroon soort veranderd in de tijd, hier
op het bord, was er dit afbakening tussen de verschillende snaren
dat Alex voor ons kregen.
Nu computers, eerlijk gezegd, zou hetzelfde doen.
Ze konden soort plop strings overal in RAM.
Hier, hier, hier beneden, hier beneden.
>> Ze konden precies dat te doen.
Maar natuurlijk, dat waarschijnlijk niet de beste planning.
Rechts?
Als ik bleef maar vragen naar Alex krijgen namen, waarschijnlijk had hij
zet wat meer down hier, misschien tot hier, hier, hier, uiteindelijk
hier.
Maar met een beetje meer planning, zeker, we konden dingen schoner lay-out.
En inderdaad, dat is wat een computer doet.
>> Maar de vangst is dat als de volgende snaar krijg ik
na Zamyla is iets zoals de Belinda,
stellen waar we zouden kunnen schrijven de letter b ten opzichte van dit raster?
Waar zou je gaan?
Rechts van de a, onder de z, onder de a?
Wat zou uw eerste instincten zijn?
PUBLIEK: Onder de z.
DAVID J. MALAN: Dus onder de z.
En dat is vrij eenvoudig, toch?
Het is een soort van nette, het is wat we doen op een toetsenbord als we druk op Enter,
of een e-mail bij het maken van een opsommingstekens lijst van dingen.
Maar de realiteit is dat computers proberen om efficiënter te werken,
en proppen zeker zo veel gegevens in het RAM mogelijk,
zodat u geen bytes verspillen.
Zodat u geen afval elk scherm onroerend goed.
Het probleem is echter dat als we letterlijk de brief
b na een, hoe gaan we om weten waar de naam Zamyla eindigt
en de naam van de Belinda begint?
Dus je mensen gewoon voorgesteld, goed, druk op de Enter-toets, in wezen.
Zet het hieronder neer.
Of zelfs als Alex deed, gewoon beginnen met schrijven de volgende naam onder de vorige,
en daaronder, en dan onder die ene.
Dat is een visuele cue.
>> Computers hebben een andere visuele cue, maar het is een beetje meer beknopt.
Het is deze funky karakter.
Backslash 0, dat is misschien wel doet denken aan backslash n,
enzovoort, nu.
De speciale escape sequences.
Backslash 0 is de weg van waarbij acht nul bits in een rij.
0000 0000.
>> De manier waarop je dat uit te drukken is niet te raakte het getal nul op je toetsenbord,
want in feite, dat is een ASCII-tekens.
Het ziet eruit als een nummer, maar is eigenlijk een decimaal getal
dat is de circulaire glyph, de cirkelvormige lettertype.
Ondertussen, backslash nul betekent, letterlijk
zet acht nul bytes hier voor mij.
>> Dit is enigszins arbitrair.
We konden hebben gebruikt elke patroon bits, maar de wereld
besloten enkele jaren geleden, dat te vertegenwoordigen
het einde van een string in het geheugen, gewoon een hele hoop nullen.
Want we kunnen detecteren dat.
Nu dat betekent dat er geen brief van de alfabet kan worden weergegeven met nullen.
>> Maar dat is OK, we hebben al gezien dat we met behulp van 65 op in 97 op maximaal.
We hebben niet overal sluiten om alle nullen.
Dus Belinda in het geheugen van een computer er werkelijk gaande is om hier te gaan.
Ik heb het gemaakt in het geel net om onze aandacht op te vestigen.
En let ook deze is arbitrair.
Ik heb het getekend als een raster.
Zoals, RAM-geheugen is slechts enkele fysieke object.
Het hoeft niet noodzakelijk rijen en kolommen, per se.
Het is net een heel bos van bytes geïmplementeerd in hardware of andere manier.
Maar als na Belinda I getypt in naam van Gabe's,
hij gaat hier uiteindelijk op in het geheugen, en als ik getypt in naam Daven's,
Zo, hij gaat hier eindigen.
En ik kan blijven schrijf nog meer namen.
>> Helaas, als ik probeer te schrijf een super lange naam,
Ik zou uiteindelijk opraken van het geheugen.
In welk geval, getString is gaat NULL terug, zoals we al zeiden.
Maar gelukkig, in ieder geval in deze visuele Hier hadden we niet helemaal zo ver te krijgen.
>> Nu, wat is leuk, is dat deze algemeen idee van de behandeling van zaken
als zijnde in dozen is vertegenwoordiger van een kenmerk van C
en een groot aantal andere talen, bekend als een array.
Een array is een ander type data.
Het is een datastructuur, als je wil.
Structuur in de zin van het echt, soort, op zoek als een doos, op zijn minst
in het oog van je geest.
Een array is een aaneengesloten opeenvolging van identieke types data,
rug aan rug aan rug aan rug.
>> Dus een koord, in andere woorden, is een array van chars.
Een array van karakters.
Maar het blijkt dat je kunt hebben arrays van trossen van de dingen.
In feite kunnen we zelfs zetten getallen in een array.
Dus de vorm waarin we gaan beginnen
verklaren deze gegevens structuur bekend als een array
gaat ook vierkante haken te gebruiken.
Maar deze vierkante haken gaan verschillende betekenis in deze context.
>> En laten we zien het als volgt.
Stel dat ik geopend een nieuw bestand hier.
En ik sla dit als ages.c.
En ik zal dit in mijn map hier besparen.
En nu ga ik om verder te gaan en iets gaan typen
zoals onder CS50.h bevatten stdio.h, int main leegte.
En dan de binnenkant van hier, ik wil om eerst een int genaamd leeftijd.
>> En ik ga dat gebruiken om een ​​te krijgen int van de gebruiker voor zijn of haar leeftijd.
Maar dit programma moet worden door meerdere mensen, om wat voor context.
Ik heb een lijn van mensen gekregen.
Allemaal hebben ze te typen in hun leeftijd voor misschien wat, ik weet het niet,
wedstrijd of evenement dat ze aangekomen voor.
Dus de volgende persoon, I nodig een andere variabele.
>> Want als ik het gewoon doen leeftijd krijgt getInt, dat is
gaan afranselen, of overschrijven leeftijd van de vorige persoon.
Dus dat is niet goed.
Dus mijn eerste instinct zou kunnen zijn, oh, oke,
als ik wil meerdere mensen te krijgen ages-- laten we noemen dit AGE1,
int age2 krijgt int, int leeftijd 3 krijgt getInt.
En nu ga ik gebruiken sommige pseudo-code hier.
>> Doe iets met die getallen.
We vertrekken voor een andere dag wat we daar aan het doen, omdat we alleen
zorg voor het moment over AGE1, age2, leeftijd 3.
Helaas, zodra ik dit programma te compileren
en zet het in de voorkant van echte gebruikers, wat is het fundamenteel slecht ontwerp
beslissing die ik lijken te hebben gemaakt?
Yeah?
PUBLIEK: [onverstaanbaar]
DAVID J. MALAN: Ja, Ik heb niet eens geprobeerd
om erachter te komen hoeveel leeftijden heb ik eigenlijk schelen?
Als ik minder dan drie mensen hier, en dus minder dan drie eeuwen,
Ik ben nog steeds blindelings verwacht drie.
God verhoede vier mensen opdagen.
Mijn programma gewoon niet hen zelfs steunen.
>> En dus dit, lang verhaal Kortom, is het niet een goede gewoonte.
Rechts?
Ik was in wezen het kopiëren en code plakken en gewoon tweaken
de namen van variabelen.
En, mijn god, als je had, niet drie leeftijden, maar 10 of 100 of zelfs 6.500
studenten, bijvoorbeeld.
Dit is niet van plan om in het bijzonder te zijn elegante code, of duurzaam.
Je gaat te hebben om herschrijven het programma elke keer
uw aantal mensen verandert.
>> Zo gelukkig, in onze huidige ages.c bestand voor vandaag,
we hebben een meer slimme oplossing.
Eerst ga ik naar het lenen construeren we hebben een paar keer gebruikt,
dit doen terwijl lus, om te krijgen het aantal mensen in de kamer.
Ik ga gewoon voor de gebruiker lastig te vallen, weer en weer, totdat hij of zij geeft me
een waarde van n is dat een positief geheel getal.
>> Ik had kunnen gebruiken, laatste tijd te krijgen positieve int.
Maar we hebben niet dat voor echt, dus ik ging vooruit
en opnieuw geïmplementeerd dit idee.
Nu hier beneden, dit is de nieuwe truc.
In regel 27, als de opmerkingen in lijn 26 aangeeft,
verklaren een array waarin tot ieders leeftijd slaan.
>> Dus als je wilt krijgen, niet een int, niet twee ints, maar een hele hoop ints.
Specifiek n integers, waren n zou drie, misschien 100, misschien 1000.
De syntax, heel eenvoudig, is om zeg, welke gegevens het type wil je?
Wat wil je bellen dat deel van het geheugen?
Wat wil je aan het net te bellen dat ziet er zo uit picturaal?
>> En tussen haakjes hier, zeg je hoe groot je wilt dat de array te zijn.
En dus eerder, toen ik zei dat de syntax is hier een beetje anders,
we zijn nog steeds met behulp van vierkante haken, maar als ik verklaren een array,
Het nummer in van de vierkante haken middelen
hoe groot wil je de array zijn.
>> Daarentegen, toen we met behulp van s bracket ik een moment geleden, s, een string,
inderdaad een reeks tekens, maar als je niet declareren van een variabele,
zoals met dit zoekwoord hier, je bent gewoon krijgen
een specifieke index, een specifieke element van de matrix.
Zodra we dat weten, de rest deze is eenvoudig.
Als nieuwe ik eerst ga om uit te printen wat is de leeftijd van de persoon getal i.
Waar zeg ik gewoon persoon nummer een, persoon nummer twee, persoon nummer drie.
>> En ik doe gewoon rekenen, zodat als normale mensen,
we optellen ve voor deze programma en niet van nul.
Dan roep ik getint, maar ik bewaar het antwoord in tijden beugel i.
Wat is de i'th leeftijd in de array.
Dus dat de laatste keer dat we behandelden deze vakken als tekens voor de naam Zamyla's,
en anderen.
Nu, deze dozen vertegenwoordigen 32 bits, of vier bytes
waar we kunnen opslaan een int, int, int.
Dit alles, weer, hetzelfde gegevenstype.
>> Nu doe ik iets geks, als de tijd verstrijkt, net
te rechtvaardigen het schrijven van dit programma.
En dan naar beneden hier, ik nogmaals herhalen meer dan de array zeggen een jaar vanaf nu,
persoonsnummer zal men zijn iets jaar oud.
En om erachter te komen dat math-- Ik bedoel, dit
is niet erg ingewikkeld arithmetic-- Ik voeg slechts een aan hun leeftijd.
Gewoon om aan te tonen, nogmaals, dit.
>> Net zoals ik kan indexeren in een string, s, dus kan ik index in een array van leeftijden,
als dat.
Dus waar gaat dit worden ons naartoe?
Dus we zullen zien, uiteindelijk, een paar dingen in de dagen die komen.
Een al die tijd, wanneer het schrijven van uw eigen programma's,
als Mario, hebzuchtig, krediet.
Je hebt het typen van de naam van het programma en slaan op Enter.
En dan is er invoer van de gebruiker.
>> Met getString, getInt, getLongLong of dergelijke.
Maar het blijkt dat C ondersteunt iets genaamd opdrachtregel
argumenten, dat gaat ons te laten daadwerkelijk te krijgen op woorden die u typt,
het knipperen prompt achter de naam van uw programma.
>> Dus in de komende dagen, je komt misschien iets als Caesar te typen,
of ./caesar nummer 13, daarna.
We zullen zien hoe dat werkt.
Want inderdaad, in probleem set twee, we zijn
ga u te introduceren een beetje iets
doet denken aan Ralphie's eerder van de cartografie uitdagen.
De kunst van het klauteren informatie.
Dit, in feite, is zeer doet denken aan wat Ralphie deed.
>> Dit is een voorbeeld van een codering algoritme rot13, R-O-T 13.
Wat simpelweg betekent draai de letters in het alfabet 13 plaatsen.
En als je dat doet, zul je nu zien wat misschien een bekende uitdrukking.
Maar de manier waarop we gaan gebruiken dit uiteindelijk algemener.
>> In P set twee, in de standaard editie, vindt u een paar cijfers te implementeren,
een genaamd Caesar, een zogenaamde Vigenere.
Beiden zijn rotatie cijfers, omdat een of andere manier je
Draai een letter in een andere letter.
En Caesar is super eenvoudig.
U voegt een, u 13 toevoegen, of een aantal tot 26.
Vigenere doet dat op een per brief basis.
Dus Vigenere, zoals u zult zien in de spec, is veiliger.
>> Maar aan het eind van de dag wat je zult het implementeren en P set twee,
is dat belangrijk dat je zowel gebruiken voor encryptie en decryptie.
Onder verwijzing naar het proces van het omzetten platte tekst, een aantal originele bericht,
in cypher tekst, die iets versleuteld.
En dan weer decoderen.
>> In de hacker editie, ondertussen, dan heb je de
belast met iets dergelijks in de geest, waar wij geven u
Een bestand van een typische Linux of Mac of Unix-computer genaamd Etsy
wachtwoord dat geheel bevat bos van gebruikersnamen en wachtwoorden.
En die wachtwoorden hebben allemaal gecodeerd of hashed,
bij wijze van spreken, meer naar behoren zoals u zult zien in de spec.
>> En de hacker editie zal uitdagen u met het nemen van een ingang als deze,
en kraken van het wachtwoord.
Dat wil zeggen, het uitzoeken wat de wachtwoord mens eigenlijk was.
Want inderdaad wachtwoorden algemeen niet als tekst opgeslagen,
en over het algemeen wachtwoorden moet moeilijk te raden zijn.
Dat is niet vaak het geval.
>> En wat ik dacht dat we zouden doen, is af te sluiten met een paar minuten
blik op een bijzonder slechte keuze wachtwoorden
van een film die je zou kunnen liefdevol herinneren.
En zo niet, dan moet je huren.
>> [VIDEO AFSPELEN]
>> -Helmet, Je Fiend, wat is er aan de hand?
Wat doe je met mijn dochter?
>> -Permit Mij om het te introduceren briljante jonge plastisch chirurg,
Dokter Phillip Schlotkin.
Het grootste neuscorrectie man in de hele universum en Beverly Hills.
>> -Uw Hoogheid.
>> -Nose Baan?
Ik begrijp het niet.
Ze had al een neuscorrectie.
Het was haar lieve 16 aanwezig.
>> Nee, het is niet wat je denkt.
Het is veel, veel erger.
Als je me niet geven de combinatie met de luchtschild,
arts Schlotkin zal geven uw dochter terug haar oude neus.
- [Hapt] Nooooooooooooo.
Waar heb je die vandaan?
>> -Alle Rechts.
Ik zal zeggen, zal ik vertellen.
>> Nee, papa, nee.
Je moet niet.
>> Je hebt gelijk mijn beste.
Ik mis je nieuwe neus.
Maar ik zal ze het niet vertellen combinatie maakt niet uit wat.
>> -Zeer goed.
Dokter Schlotkin, doe je ergste.
>> M'n plezier.
>> -Geen!
Wacht, wacht.
Ik zal vertellen.
>> Ik wist dat het zou werken.
Oke, geef het aan mij.
>> -De Combinatie behoort.
>> -One.
-twee.
-drie.
-Vier.
-Vijf.
Dus de combinatie behoort, twee, drie, vier, vijf.
Dat is het stomste combinatie Ik ooit gehoord in mijn leven.
Dat is het soort ding een idioot zou hebben op zijn bagage.
>> Dank u, uw hoogheid.
>> [REMOTE CLICKS]
>> Wat heb je gedaan?
>> Ik zette de muur.
>> Nee, dat deed je niet, je zette de hele film.
>> Ik was vast drukte op de verkeerde knop.
>> Nou, zet het terug op!
Zet de film weer op!
>> Ja, meneer!
Ja, meneer.
Laten we gaan, Arnold.
Kom, Gretchen.
Natuurlijk weet je dat ik hebben om u te factureren voor dit.
Nou?
Werkte het?
Waar is de koning?
>> -Het werkte, meneer, we hebben de combinatie.
Geweldig.
Nu kunnen we elke laatste adem van frisse lucht van planeet Druidia.
Wat is de combinatie?
>> -Een, Twee, drie, vier, vijf.
>> -Een, Twee, drie, vier, vijf?
Jawel.
Dat is geweldig.
Ik heb het zelfde kreeg combinatie op mijn bagage.
Bereid Spaceball 1 voor onmiddellijke vertrek.
>> Ja, meneer.
>> -En Veranderen de combinatie op mijn bagage.
[DEUR DICHT SOUND]
[CLINK VAN DEUREN RAKEN HELM]
-Ahh.
[END VIDEO AFSPELEN]
DAVID J. MALAN: Dat is het voor CS50, we zien je volgende week.
Verteller: En nu, Deep Gedachten, door Daven Farnham.
>> Daven FARNHAM: Codering in C is zo veel moeilijker dan Scratch.
printf, Scratch was een leugen.
>> [LAUGHTER SOUNDBITE]