>> [MUSIK SPELA]
DAVID J. MALAN: Okej.
Detta är CS50, och detta är slutet av vecka 2.
Så idag, vi ska att fortsätta vår look
hur vi representerar saker nedanför hood-- rör sig bort
från nummer som heltal och flyttalsvärden
och fokusera på strängar och i slutändan mer intressanta program.
Men vi ska också ta en titt på en par av domänspecifika problems--
av vilka den första kommer att engagera kryptografi,
konsten att förvränga informationen, där du ser ovan här
är en bild av Radio Orphan Annies hemliga dekoder ringen från förr.
>> Det är faktiskt mycket primitiv form och barnvänlig form av cryptopgraphy
varvid denna ring har två disks-- en insida och en utsida.
Och genom att rotera en av dem, du kan huvudsak rada upp brev som A
till Z med andra bokstäver som B genom A. Med andra ord,
Du kan bokstavligen rotera alfabetet, därmed komma med en kartläggning av
brev till brev, så att, om du ville skicka ett hemligt meddelande
till någon som Annie, kan du skriva ner ditt meddelande och vrid sedan
bokstäverna, som innebär att om du menar att säga "A," du istället säga "B",
du menar att säga "B", man istället säger "C" -
eller något lite mer smart än att-- och sedan, slutligen,
så länge som Annie har denna avkodare ring, hon kan avkoda meddelandet.
Nu kanske ni minns, faktiskt, att det användes i en mycket berömd film som
spelar ad nauseum under julen.
Låt oss ta en titt här.
Ralphie PARKER: "Var det känd för alla i sammandrag
att Ralph Parker utnämns medlem av Little Orphan Annie Secret
Circle och har rätt till alla de heder och förmåner inträffar dessa. "
>> Ralphie PARKER (narrating): Signerad Little Orphan Annie.
Kontra, Pierre Andre!
I bläck.
Heder och förmåner, redan vid nio års ålder.
>> [MUSIK SPELA]
>> [RADIO prat]
Ralphie PARKER: Kom igen.
Låt oss gå vidare med det.
Jag behöver inte all that jazz om smugglare och pirater.
RADIO ANNOUNCER: Lyssna morgon natt för den avslutande äventyret
The Black Pirate Ship.
Nu är det dags för Annies Secret Message för dig medlemmar
av Secret Circle.
Minns ungar, endast medlemmar av Annies Secret Circle
kan avkoda Annies hemligt meddelande.
>> Kom ihåg, är Annie beroende av dig.
Ställ dina pins till B-2.
Här är Message-- 12, 11, 2--
Ralphie PARKER (berätta): I är i mitt första hemliga mötet.
RADIO ANNOUNCER: --25, 14, 11, 18, 16--
Ralphie PARKER (narrating): Åh, Pierre var i stor röst ikväll.
Jag kan tala om att kvällens budskap var verkligen viktigt.
>> RADIO ANNOUNCER: --3, 25.
Det är ett budskap från Annie själv.
Kom ihåg att inte berätta för någon.
>> [Flämtande]
Ralphie PARKER (narrating): Nittio sekunder senare, jag är
i det enda rummet i hus där en pojke på nio
kunde sitta i avskildhet och avkoda.
Ah.
"B"
>> [Småskrattar]
>> Ralphie PARKER (narrating): Jag gick till nästa.
"E."
Det första ordet är "att vara."
Ja!
Det skulle komma lättare nu.
"U."
>> [Småskrattar]
>> RANDY PARKER: Kom igen, Ralphie.
Jag måste gå!
>> Ralphie PARKER: Jag kommer ner, Ma.
Gee whiz.
"T." "O." "Glöm till. "" Se till att "vad?
Vad var Little Orphan Annie försöker säga? "Se till att" vad?
MODREN Ralphie, Randy har fått gå.
Kan du komma ut?
>> Ralphie PARKER: Okej, mamma!
Jag kommer strax!
Ralphie PARKER (narrating): Jag började bli närmare nu.
Spänningen var hemskt.
Vad var det?
Ödet av planeten kan hänga i balans.
>> MODREN Ralphie, Randy fick gå!
>> Ralphie PARKER: Jag kommer strax ut, för guds skull!
Ralphie PARKER (Berätta): Nästan där!
Mina fingrar flög!
Mitt sinne var en stålfälla.
Varje por vibrerade.
Det var nästan klart!
Ja!
>> Ralphie PARKER: "Se att dricka ditt Ovaltine. "
Ovaltine?
En crummy kommersiellt?
>> [MUSIK SPELA]
>> Ralphie PARKER: Den jäveln.
>> [Skrattar]
>> DAVID J. MALAN: Så det är då en inblick i hur kryptografi
kan vara för detta-- en dricka från förr.
Så en snabb tillkännagivande.
Om du är fri här Fredag ​​kl 13:15 och skulle
vilja ansluta sig till oss för CS50 lunch, gå till denna URL här.
Först till kvarn får först tjäna som vanligt.
Men med tiden kommer vi se till att mest alla som vill delta
kan schemamässigt.
>> Så strängar.
Vi har Zamyla-- vem du har nu träffat troligen
i Problem Set 1-- vars namn stavas så.
Och antar att du skrev hennes namn in i ett datorprogram som är
med något sånt getString.
För att hämta dessa tangenttryckningar, hur
ska vi göra som representerar en sträng, ett ord, ett stycke,
eller flera bokstäver som dessa här?
>> Vi pratade förra gången om heltal och problem
som uppstår med heltalsspill och flyttalsvärden
och problem som uppstå inom precision.
Med stråkar, vi åtminstone har lite mer flexibilitet
eftersom strings-- bara i den verkliga world--
kan vara en ganska godtycklig längd.
Ganska kort, ganska länge.
Men även då ska vi tycker att datorer kan ibland
slut på minne och inte ens lagra en tillräckligt stor sträng.
>> Men för nu, låt oss börja att visualisera en sträng som något i dessa rutor
här.
Så sex sådana lådor, som var och en representerar ett tecken eller "char".
Så minns att "char" - c-h-a-r-- är en av de inbyggda datatyper i C.
Och vad är trevligt är att du kan använda den sortens som en byggsten,
en pusselbit, om ni så vill, för att bilda en större typ av data som vi kommer att fortsätta
att kalla en "sträng".
>> Nu, vad är nyttigt om att tänka om saker som strängar på det här sättet?
Tja, det visar sig att vi kan faktiskt utnyttja denna struktur
att faktiskt komma åt enskilda tecken på ett ganska enkelt sätt.
Jag kommer att gå vidare och skapa en fil som heter "stringzero.c,"
men du kan kalla det vad du vill.
Och på kursens hemsida är redan detta exempel i förväg,
så du behöver inte Skriv ut allt.
>> Och jag ska gå vidare och först gör int main ogiltiga.
Och inom några dagar, vi börjar att retas isär
vad void är här, varför det är int bredvid huvud osv.
Men för nu, låt oss fortsätta kopiera klistra in det.
>> Jag ska förklara en sträng som heter s.
Och jag kommer att återvända från GetString oavsett användaren skriver i.
Detta kommer att bli en enkel program, inga instruktioner,
Jag ska bara blint förvänta att användaren vet
vad man ska göra för att hålla det enkelt.
>> Och nu ska jag ha en for-loop.
Och insidan av min för loop är jag kommer att ha int i blir noll.
Och jag är, igen, bara en konvention, en indexvariabel för räkning,
men jag kunde kalla detta vad jag vill.
Jag kommer att göra i är mindre than-- väl Zamyla namn är sex bokstäver långa.
Så jag ska hårt kod som finns för tillfället.
>> Och sedan i ++.
Och nu inne i dessa lockigt tandställning jag ska göra printf,
och jag vill skriva ut en tecken i taget.
Så jag kommer att använda% c för kanske första gången.
Och sedan vill jag att skriva ut varje tecken på en egen rad.
Så jag kommer att sätta en litet snedstreck n där.
Stäng citat.
>> Och nu vill jag göra något här.
Jag vill skriva ut specifik bokstav i strängen,
s, som jag iteration från noll på upp till sex.
Med andra ord vill jag skriva ut det i: te karaktär s.
Nu hur kan jag göra detta?
>> Tja ungefär som rutorna i denna representation här,
slags, trolla fram begreppet boxning brev i, kan du på liknande sätt göra det
syntaktiskt i C genom att helt enkelt ange, Jag vill skriva ut S: te karaktär.
Genom att använda hakparenteserna på datorns tangentbord
att på ett amerikanskt tangentbord är allmänhet över din returtangenten.
>> Så det här är inte riktigt rätt men, som ni kanske har märkt.
Men jag ska typ av blint gå framåt här.
Och jag kommer att göra att strängen 0.
Men innan jag gör det, låt oss se om vi kan inte förutse några vanliga misstag.
Kommer detta att sammanställa?
Nej, jag saknar en hel massa saker.
Bibliotek jag hörde.
>> Så vilken header filer kanske jag vill lägga till här?
Yeah.
>> PUBLIK: Du behöver standard I / O [ohörbart]
>> DAVID J. MALAN: Excellent.
Så jag behöver standard I / O. För vad syfte vill jag standard I / O?
För printf.
Så inkluderar stdio.h.
Och du också föreslå att jag inkluderar den CS50 biblioteket av vilken anledning?
Att ha strängar.
Så vi får se vad CS50 bibliotek gör
att skapa denna föreställning om en sträng.
Men för tillfället kan du bara tänka det som en verklig datatyp.
>> Så det verkar vara lite saneras.
Och nu ska jag gå vidare och faktiskt gör att strängen 0.
Kompileras.
Så det är bra.
Så ./string0 låt mig zooma in så att vi kan se närmare vad som händer.
Enter.
Z-A-M-Y-L-A tryck.
Och vi har tryckt ut till Zamyla namn.
>> Så det är ganska bra.
Så nu ska vi gå vidare och köra programmet igen,
och skriv ut Daven fullständiga namn.
Surprise, surprise.
Enter.
Hmm.
Vi har inte tryckt Daven s utskrivet förnamn korrekt.
Nu är detta borde vara självklart i RetroSpect grund av vad,
slags, dumma beslut design?
>> Ja, jag hårdkodad i sex insidan av min för slinga.
Nu gjorde jag det bara för att Jag visste Zamyla namn
skulle bli sex bokstäver.
Men det är väl ändå inte en generell lösning.
Så visar det sig att vi kan dynamiskt räkna ut längden av en sträng
genom att anropa en funktion som heter strlen.
>> Återigen, medvetet koncist namnges bara
att göra det mer bekvämt att skriva.
Men det är synonymt med få längden på en sträng.
Jag kommer att gå tillbaka in i min terminal fönster och åter köra kompilatorn.
Men det skriker på mig.
Underförstått att förklara biblioteksfunktion strlen med typ unsigned int const--
Jag är vilse.
Helt.
>> Så, särskilt som din ögon börjar glasyr över
med felmeddelanden som detta, fokus ärligt på de första orden.
Vi vet att problemet är i linje 8, som anges här.
Och det är i sträng-0.c.
Underförstått att förklara biblioteksfunktionen strlen.
Så det är i allmänhet går till vara ett mönster av felmeddelanden.
Underförstått att förklara något.
>> Så kort sagt, vad har jag verkade har gjort i förhållande till linje 8, här.
Vad kan vara lösningen vara ännu Om du aldrig har använt strlen själv?
>> PUBLIK: En del av ett annat bibliotek?
DAVID J. MALAN: Part av ett annat bibliotek.
Så det deklareras, så att säga.
Det nämns i någon fil andra än stdio.h och CS50.h.
Nu var det definieras?
För att vara ärlig, du antingen måste bara vet detta från toppen av huvudet,
eller du Google här och ta reda på.
Eller vet detta, jag har öppnat i CS50 APPARAT terminalprogrammet, som
är bara den stora, helskärm version vad som finns i botten av gedit fönster.
>> Och det visar sig att det finns en på liknande kortfattad kommando, som kallas
mannen för manuell, där om du skriver in namnet på en funktion och tryck Enter,
du får tillbaka ganska svårbegripliga dokumentation.
Det är bara text som i allmänhet ser lite ut så här.
Det är lite överväldigande vid första anblicken.
Men ärligt talat jag ska låta mina ögon stelnar
och bara fokusera på den del Jag bryr mig om för tillfället.
>> Vilket är det.
Som ser ut som strukturellt något jag är bekant med.
Faktum är att man-sidan, så att tala, kommer att berätta
i vilken header in en funktion liknande strlen definieras.
Så jag kommer att gå tillbaka nu till gedit.
Och jag ska gå vidare och lägga in här # include
och spara filen.
>> Jag kommer att rensa skärmen med Kontroll L Om du har undrat.
Och jag ska åter kör make string.0, sammanställer denna tid.
./string.0 Zamyla.
Det verkade fungera Låt mig gå framåt och kör den med Davenport.
Enter.
Och det också, verkade fungera.
>> Så vi kan göra lite bättre än så här, Men kan vi börja städa saker
upp bara lite.
Och jag ska faktiskt införa en annan sak nu.
Jag kommer att gå vidare och spara detta i en annan fil.
Och jag ska ringa den här filen string1.c bara
att överensstämma med koden du kommer att kunna hitta på nätet.
>> Och låt oss fokusera på exakt samma kod.
Det visar sig att jag har varit sorts tagande
för givet att min bärbara dator, och i sin tur, på CS50 apparaten
har en hel del minne, en hel del RAM, en massa byte av utrymmet
där kan jag lagra strängar.
>> Men verkligheten om jag skrivit långa nog, och tillräckligt med tangenttryckningar,
Jag kunde i teorin typ in fler tecken
än min dator fysiskt minne rymmer.
Och det är problematiskt.
Ungefär som en int kan bara räkna så högt, i teorin,
du kan bara klämma så många tecken i datorns RAM eller Random
Access Memory.
>> Så jag hade bättre förutse detta problem, till och med
om det kan vara en sällsynt hörn fall, så att säga.
Händer inte så ofta, kan hända.
Och om det händer och det gör jag inte förutse och program för det,
mitt program kan göra vem vet vad.
Frys, hänga, omstart, oavsett.
Något väntat kan hända.
>> Så vad jag ska göra nu, hädanefter egentligen,
är innan jag någonsin blint använda en variabel som s som
har tilldelats returvärde någon annan funktion som getString,
Jag ska se till att att dess värde är giltigt.
Så jag vet bara från att ha läst CS50 dokumentation för getString,
vilket i slutändan kommer vi att peka dig på, att getString returnerar en speciell symbol
kallade NULL, N-U-L-L i alla mössor, om något går fel.
>> Så normalt returneras en sträng.
Men annars, om det återvänder N-U-L-L-- vi så småningom får se vad som verkligen
means-- att bara medel hände något dåligt.
Nu betyder det, ungefär som i Scratch, Jag kan kontrollera ett tillstånd här i C,
om s inte är lika NULL.
Så om du inte har sett det här förut, Detta betyder bara inte är lika.
>> Så det är motsatsen till lika jämlikar, som minns,
skiljer sig från enkel lika, vilket är uppdrag.
Så om s inte är lika NULL, först då gör
Jag vill köra dessa rader kod.
Så med andra ord, innan jag dyker i blindo
och börja iteration över s, och behandla det
som om det är en sekvens av tecken, jag ska först kolla,
vänta lite, är s definitivt inte lika med detta särskilt värde, NULL?
>> För om det är, kan dåliga saker hända.
Och nu, antar att dåliga saker händer betyder dina program kraschar,
och du kan inte nödvändigtvis återhämta sig.
Så ärligt talat, det ser fulare.
det är typ av förvirrande nu att titta på.
Men det kommer att bli mer bekant kort.
>> Men jag kommer att föreslå nu en annan förbättring.
Det är en förbättring riktighet.
Mitt program är nu mer korrekt, eftersom i de sällsynta fall som inte tillräckligt med minne
finns, kommer jag hantera det, och jag ska bara göra ingenting.
Jag åtminstone inte kommer att krascha.
>> Men låt oss göra en slutlig version här.
Och en fil som heter string2.c.
Jag kommer att klistra in samma kod för bara ett ögonblick,
och jag kommer att belysa detta linje, 11, här, för bara ett ögonblick.
Nu är verkligheten den att smarta kompilatorer som Clang kunde fixa detta för oss
bakom kulisserna utan vårt någonsin veta.
Men låt oss tänka på detta i grunden som en problematisk konstruktion.
>> Denna kodrad är, naturligtvis, sade initiera viss variabel i till 0.
Det är ganska enkelt.
Och vad återigen är det här uttalande, här, i ++, gör?
Vi har sett det förut, men vi inte riktigt prata om det.
>> PUBLIK: Uppräkningen i.
>> David J. MALAN: Uppräkningen i.
Så på varje iteration genom denna slinga, varje cykel,
du uppräkning i taget.
Så det blir större och större, och större tills öglan upphör.
Hur fungerar det avslutas?
Jo det är det här mitt tillstånd som vi har använt tidigare.
Du har sett och i walkthroughs i P set.
>> Men vad är detta ordstäv?
Gör följande slinga så länge jag är mindre än vad?
AUDIENCE: Längden av strängen.
David J. MALAN: Den strängens längd.
Så det översätter ganska rent till engelska i den bemärkelsen.
Nu är problemet är att varje gång jag iterera genom denna slinga i teorin,
Jag ställer denna fråga.
Är jag mindre än strängen längden s?
>> Nu är jag förändras för varje iteration?
Det är det.
På grund av den ++.
Så varje iteration jag blir större.
Men är s blir större, eller mindre, eller förändras alls?
Nej
Så när det gäller design, en av axlarna längs vilken vi försöka utvärdera kod
i klassen, känns denna typ av dum.
>> Som du är bokstavligen, på varje iteration
av denna slinga be samma jävla fråga igen,
och igen, och igen, och bokstavligen Det kommer aldrig att förändras.
Åtminstone om jag inte röra s och försöker ändra innehållet i er.
Så jag kan göra lite bättre än så här.
>> Och vad jag ska göra är att inte förklarar bara en variabel i,
men en andra variabel jag ska godtyckligt, men konventionellt, kalla det n.
Tilldela n lika med stränglängd s.
Och sedan här borta, kommer jag att gör en smart liten optimering, så
att tala, att vid slutet av dagen är inte mer rätt eller mindre rätt
än tidigare.
Men det är en bättre design.
I det faktum att jag använder mindre tid, mindre CPU-cykler, så
att tala, för att svara på samma fråga, men bara en gång.
>> Har du frågor om den allmänna principen förbättras,
säger, ett programs effektivitet?
Yeah?
PUBLIK: Varför tror du använd [ohörbart]?
DAVID J. MALAN: Bra fråga.
Så varför vi sätter ++ på slutet av jag i stället för i början av i?
I detta fall har det ingen funktionell påverkan.
Och i allmänhet, jag brukar använda postfix operatören
så att det är lite mer klart som att när operationen sker.
>> För de som känner, det finns en annan uttalanden som innebär att du kan göra ++ jag.
Dessa är funktionellt likvärdig i detta fall
för det finns inget annat runt det inkrementering.
Men du kan komma med fall och kodrader
där som gör en skillnad.
Så generellt, det gör vi inte ens prata om det här.
Eftersom ärligt talat, det gör ditt kod sexigare, och liksom slicker,
och färre tecken.
Men verkligheten är att det är mycket svårare, Jag tror, ​​även för mig att slå mig
runt det ibland, ordningen på verksamheten.
Så som en sidoreplik, om du verkligen inte gillar detta,
även om det är typ av sexig ser, kan du också göra i + = 1,
som är den fulare version av samma idé för postfix uppräkning.
>> Jag säger detta och du bör göra narr av det,
men du kommer att se koden som något vackert kort.
>> [LAUGHTER]
>> DAVID J. MALAN: Rätt?
Yeah.
Fråga i mitten.
>> PUBLIK: Behöver du säga int n?
DAVID J. MALAN: Du gör inte behöver säga int n.
Så eftersom vi redan har sagt int, du behöver inte säga det igen.
Fångsten är att n måste vara samma datatyp som jag.
Så det är bara en bekvämlighet här.
Yeah.
>> PUBLIK: Kan du går över print tecken s fäste jag igen?
DAVID J. MALAN: Absolut.
Så% c, minns från förra tid, är bara en platshållare.
Det betyder sätta en röding här.
omvänt snedstreck n, naturligtvis, bara sätt sätta en radbrytning här.
Så att bara lämnar, nu, denna bit av ny syntax.
Och det är bokstavligen säger grab strängen kallas s och gå och hämta sin
: te karaktär, så att säga.
>> Och jag fortsätter att säga: te tecken eftersom på varje iteration av denna slinga
det är som om vi skriver ut inledningsvis s konsol 0,
som programmerare kan säga.
Då är fäste 1, sedan s fäste 2, sedan 3, sedan 4.
Men naturligtvis är det en variabel, så jag uttrycker bara det med jag.
>> Key är dock att inse, speciellt om du har inte
varit acclimating till den här världen programmering, där vi alla
tyckas att räkna från noll, fånget börja räkna från noll nu.
Because strängar, första tecknet, den z i Zamyla är på gott och ont
kommer att leva på plats nummer noll.
>> Okej, så låt mig få oss tillbaka hit till Zamyla
och se vad som verkligen pågår på under huven.
Så det är det här begreppet typ gjutning.
Du kanske har faktiskt redan spelat med det här,
kanske för hackare upplagan av P set ett.
Men typ gjutning hänvisar bara till förmåga i C och en del andra språk
konvertera en datatyp till en annan.
>> Nu hur kan vi se här ganska rättframt?
Så det här, minns, är början i det engelska alfabetet.
Och sammanhanget, minns, från som för en vecka sedan är ASCII.
Den American Standard Code for Information Interchange.
Vilket är bara en riktigt lång väg att säga en kartläggning från brev
till tal och från tal till bokstäver.
>> Så A till M här, dot dot dot, ställer upp med, återkallande,
det decimala talet 65 på upp.
Och vi pratade inte om detta uttryckligen,
men säkert finns det liknande nummer för små bokstäver.
Och faktiskt, det finns.
Världens beslutade några år sedan det lilla a, små bokstäver a,
kommer att bli 97.
Och lite b går att vara 98, och så vidare.
>> Och för någon annan knapp på tangentbordet, det finns
kommer att bli ett liknande mönster av bitar.
Eller ekvivalent, ett decimaltal.
Så frågan till hands, kan då, är hur vi
faktiskt se detta under huven?
Så jag kommer att gå över till gedit igen.
Och i stället för typ detta från början,
Jag kommer att gå vidare och bara öppna upp något
från dagens kod som kallas ASCII noll.
>> Och ASCII noll ser ut så här.
Så låt oss slå in våra sinnen runt detta.
Så först, har jag kommenterat koden, vilket är trevligt.
Eftersom det är bokstavligt talat säger vad som väntar,
visa en mappning för stora bokstäver.
Nu vet inte riktigt jag vad jag menar med det, så låt oss sluta.
>> På engelska, kanske något techie engelska,
vad gör linje 18 visas att göra för oss?
Bara linje 18.
Hur är det att framkalla?
Vad det kommer att sparka igång här?
>> Publik: En ögla.
>> David J. MALAN: En ögla.
Och hur många gånger är som går att iterera?
PUBLIK: [inplacering VOICES] sex gånger.
DAVID J. MALAN: Inte sex gånger.
PUBLIK: 26 gånger.
DAVID J. MALAN: 26 gånger.
Ja, förlåt.
26 gånger.
Varför?
Tja, det är lite konstigt, men Jag har börjat räkna från 65.
Vilket är konstigt, men inte fel.
Det är inte dåligt per säga.
Och jag gör det bara därför att, för detta exempel,
Jag slags förutse att kapital A var 65.
Nu är detta inte den mest eleganta sätt att göra detta, för att typ av hårt kod
esoteriska värden som ingen någonsin förväntas att komma ihåg.
>> Men för nu, märker att jag är göra detta upp genom 65 plus 26.
Eftersom tydligen jag vill inte ens att göra det aritmetiska i mitt huvud.
Så jag ska låta kompilatorn göra det.
Men sedan på varje slinga, varje iteration av slingan, jag uppräkning i.
>> Så nu det ser lite kryptiskt.
Men vi ska ha den grundläggande bygg block med för att förstå detta.
% C är bara en platshållare för en röding.
% I är en platshållare för en int.
Och det visar sig att genom användning av denna ny syntax, det parentetiska, så
att tala, så en datatyp inne i en parentes,
Jag kan tvinga kompilatorn att behandla jag inte är ett heltal, utan som en röding.
>> Därmed visar mig tecknet motsvarighet till det numret.
Nu här nere, den här koden är ganska identiska.
Jag ville bara göra super explicit faktum
att jag börjar kl 97, vilken är gemener en.
På upp genom ytterligare 26 bokstäver.
Och jag doing-- igen, gjutning i, så att säga.
Eller typ gjutning i, så att säga.
>> Från en int till en röding.
Så slutresultatet kommer att bli, ärligt talat, information som vi redan vet.
Jag kommer att göra ascii-0 dot-- inte dot c.
Kallelse, gjorde du antagligen att misstag som jag gjorde bara av misstag.
Gör ascii-0.
Nu ska jag göra ./ascii-0.
Jag ska zooma in, och tyvärr det kommer att rulla ut från fönstret.
Men vi ser en hel diagram där a kartor till 97, b-kartor till 98,
och om vi rulla upp ytterligare En naturligtvis kartor till 65.
Så det här är bara för att säga att vad vi har predikat,
det är denna likvärdighet, är i själva verket är fallet i verkligheten.
Så en snabb ändring av detta.
Låt mig öppna ascii-1.c.
Och märka detta smart, sortera av, klargörande av detta.
Detta är ascii-1.c, och märker denna galna sak.
>> Och detta verkligen blir till hjärtat om vad datorer gör.
Även om vi människor skulle inte räkna i termer av letters--
Jag vill inte börja tänka, okej en då b,
och använda dem för att räkna fysiska objekt.
Du kan verkligen säga att jag vill initiera en variabel som heter C--
men jag kunde ha kallat detta anything-- så c initieras till kapital A.
>> Eftersom i slutet av dagen, datorn bryr sig inte vad du lagrar,
den bara bryr sig hur du vill att presentera denna information.
Hur vill du att datorn ska tolka detta mönster bitar?
Så det här är inte något jag skulle generellt rekommendera att göra.
Det är egentligen bara ett exempel för förmedla att du kan absolut
initiera ett heltal till en röding.
Eftersom undersidan av huven på en röding, naturligtvis,
är bara ett nummer från 0 till 255.
>> Så kan du säkert lägga den inne i en int.
Och vad detta även visar är att vi
kan konvertera från en typ till en annan, här,
slutligen skriva ut samma sak.
Och faktiskt, det här kommer jag att fixa online-- var tänkt att säga det, återigen, här.
Låt mig städa upp det på nätet, och vi kommer se i en online-genomgång som behövs,
vad som var tänkt där.
>> OK.
Så sista exemplet nu involverar a: n och b: s och då kommer vi
ta saker upp ett hack.
Så med ett s och B: s och c: si kapitaliseringen
och likvärdighet i detta, låt oss ta en titt på detta exempel här.
Ett annat kodexempel.
Vi ska öppna en som är redan gjort, så vi
behöver inte skriva det alla ut från grunden.
>> Och varsel förväntan Vi använder flera header
filer, bland vilka är vår nya vän, string.h.
Nu ser vid första blick, lite kryptiskt.
Men låt oss se om vi inte kan resonera igenom vad som händer här.
Först får jag en sträng från användaren, och jag sätter den strängen i en variabel
kallas s.
Kopiera klistra från tidigare.
I linje 22, jag är tydligen gör precis vad
Jag gjorde för en stund sedan, jag iteration över tecken i talet.
>> Och de nya tricks här använder stränglängd, den mindre optimering
lagra stränglängden i n, snarare än att kräva strlen igen,
och igen, och igen.
Och bara kontrollera att jag är mindre än n.
Nu här, det blir lite intressant.
Men det är bara en tillämpning av denna samma ny idé.
Vad på engelska gör s fäste jag representerar?
>> PUBLIK: Räkna varje karaktär [ohörbart].
>> DAVID J. MALAN: Räknar varje tecken.
Och ännu mer kortfattat, s fäste jag representerar vad?
Skulle du säger.
Inte för att sätta dig på plats här.
>> PUBLIK: Well--
DAVID J. MALAN: Så om ordet är-- om strängen är Zamyla vilket starts--
PUBLIK: --you behandlar karaktärerna separately--
DAVID J. MALAN: Bra.
Exakt.
Torget hakparenteser kan du att komma åt varje tecken för sig,
så ar fäste 0 kommer att bli den första tecknet i strängen.
s fäste 1 kommer att bli den andra, och så vidare.
Så frågan jag frågar, Här, i detta tillstånd är vad?
Är det i: te karaktär s större än eller lika till gemener en?
Och vad betyder det, här, med de dubbla et-tecken?
PUBLIK (TILLSAMMANS): Och.
DAVID J. MALAN: Och.
Det är bara motsvarar detta.
Och är inte ett nyckelord i C, måste man användning, irriterande, och-tecken-tecken.
Och det omvänt, frågar är S: te tecknet mindre än eller lika
till gemener z?
Och återigen, det är här där förstå den underliggande
genomförande av ett Datorn är vettigt.
Lägg märke till att även om jag har dot dot dot borta,
ser ut som en till z gemener är alla angränsande värden upp från 97 till upp.
>> Och samma för versaler börjar vid 65.
Så den takeaway, då, är att på engelska,
Hur skulle du beskriva vilken linje 24 gör?
Yeah?
>> PUBLIK: Den 24 det kontroll för att se huruvida varje karaktär är ett gement.
DAVID J. MALAN: Det kontrollera om varje tecken är en liten bokstav.
Så även mer koncist, är den : te karaktär s små bokstäver?
Det är allt vi är uttrycker här logiskt,
lite kryptiskt, men slutligen ganska rättframt.
Är S: te tecken gemener?
>> Om så är fallet, och här är där saker få lite sinne bock
för bara ett ögonblick, i så fall går vidare och skriva ut ett tecken.
Så det här är bara en platshållare, men vad karaktär?
Varför gör jag s fäste i minus detta uttryck här?
>> Väl att märka mönster här.
De faktiska siffrorna spelar ingen roll så mycket.
Men märker att 97 är hur långt bort från 65?
>> Publik: 32.
>> David J. MALAN: 32.
Hur långt bort är 98 från 66?
>> Publik: 32.
>> DAVID J. MALAN: Little c från stora C?
32.
Så det finns 32 humle från ett brev till en annan.
Så ärligt talat jag, kunde förenkla denna till det.
Men då jag typ av hårt kodning denna låga nivå förståelse
att ingen läsare är någonsin kommer att förstå.
Så jag ska generalisera det som jag vet gemener är större.
Jag vet att stora bokstäver är mindre värden, ironiskt nog.
>> Men detta är ett effektivt sätt motsvarar säger subtrahera 32 från s fäste i.
Så i samband med dessa bokstäver, om brevet
råkar vara en, gemener a, och jag subtrahera 32,
vilken effekt har det har, matematiskt, på gemener en?
PUBLIK: Capitalizes--
David J. MALAN: aktiverar den.
Och faktiskt, det är därför vår Programmet heter kapitalisera noll.
Detta program antingen kapitaliserar ett brev,
efter kontroll om det är verkligen en liten bokstav.
Annars i linje 30, vad gör jag om det är inte en liten bokstav som jag är
tittar på vid en viss iterationen i slingan.
Bara skriva ut den.
>> Så inte byta grejer det är inte ens små bokstäver.
Begränsa dig till lilla a till lite z.
Nu är det här ganska svårbegripliga.
Men i slutet av dagen, det här är hur vi, en gång i tiden,
tvungen att genomföra saker.
Om jag i stället öppna kapitalisera en, åh tack och lov.
Det finns en funktion kallad till övre som kan
göra allt vi gjorde bara på en relativt låg nivå.
>> Nu till den övre är intressant eftersom den är deklarerad i en fil,
och du skulle bara veta detta genom att kontrollera dokumentationen,
eller får höra, säg, i klassen, där den finns i en fil som heter ctype.h.
Så det här är en annan ny vän till oss.
Och för att över gör exakt vad namnet antyder.
>> Du kan skicka in, som ett argument, mellan dessa parenteser, vissa tecken.
Jag kommer att passera i det i: te tecknet av s med hjälp av vår tjusiga nya notation
involverar hakparenteser.
Och ta en gissning, vad är avkastningen värde för övre tydligen gå
att vara?
En stor bokstav.
>> Så om jag passerar med små bokstäver a, förhoppningsvis, per definition av att övre,
det kommer att returnera en versaler A. Annars
om det inte är en liten bokstav i det första jag bara skriva ut den.
Och faktiskt, märker andra vän här.
Inte bara för att över finns, men är lägre, vilket
faktiskt besvarar den frågan för mig.
>> Nu den som skrev dessa saker, 10s år sedan, vet du vad?
Genomfört till övre och sänka med hjälp av koden så här.
Men återigen, i överensstämmelse med denna idé om abstrahera bort,
slags, lägre nivå genomförandet detaljer.
Och står på axlarna av folket som kom före oss, med hjälp av funktioner
liknande för att övre och är lägre, vilket härligt nog är fint
namnges för att säga vad de gör, är en underbar paradigm att anta.
>> Nu visar det sig att om jag läser manualsidan för, säger, till övre,
Jag lär mig något annat.
Så man TOUPPER.
Det är lite överväldigande.
Men varsel, här är det omnämnande av rubrik fil som jag ska använda.
Som en sidoreplik, eftersom detta är vilseledande, den funktion
använder ints stället för chars på grund av felkontroll.
Men vi kanske kommer tillbaka till det i framtiden.
>> Men märker, här, till övre konvertiter bokstaven c till versaler om möjligt.
Så det är ganska enkelt.
Och nu ska vi vara lite mer specifik.
Låt oss titta på den del av Mannen sida under returvärde.
Värdet som returneras är att av den konverterade brev.
Eller c, om omvandlingen inte var möjligt,
där c är den ursprungliga ingången.
Vilket jag vet härifrån, från argumentet till att övre.
>> Så vad är takeaway för detta?
Värdet som returneras är att av den konverterade brev,
eller c, den ursprungliga brev, om omvandlingen var inte möjligt.
Vilka förbättringar kan jag därför göra till min kod design?
Yeah?
>> PUBLIK: Du kan ta bort annat.
DAVID J. MALAN: Jag kan ta bort annat uttalande,
och inte bara annat uttalande.
>> PUBLIK: Du kan ta bort [ohörbart].
>> DAVID J. MALAN: Jag kan avlägsna hela gaffeln
i vägen, om det helt annat.
Så ja, låt mig öppna den slutliga versionen av det här,
kapitalisera-2 och märker hur, om ni, sexigt, koden är nu får,
i att jag har minskat från vissa sju eller så rader till bara fyra,
den funktionalitet som jag tänkt genom att helt enkelt ringa till övre,
passerar s fäste i, och utskrift ut, med platshållaren% c,
att särskild karaktär.
>> Nu vågar jag påstå, det finns en bugg, eller åtminstone risk för en bugg,
i detta program.
Så bara för att komma tillbaka till ett tidigare takeaway,
vad ska jag nog också göra i detta program för att göra det mer robust,
så att det finns inget sätt den kan krascha, även i sällsynta fall?
PUBLIK: Se till att det inte är NULL.
DAVID J. MALAN: Se till att det inte är NULL.
Så egentligen, för att göra denna super korrekt, jag borde göra något liknande,
Om s är inte NULL, då gå vidare och köra
Dessa rader kod, vilket Jag kan då strecksatsen så där,
och sedan lägga i min nära stag.
Så bra att koppla ihop de båda idéerna.
Yeah?
PUBLIK: Kan du använda a göra medan loop, i stället?
DAVID J. MALAN: Kunde Jag gör en gör while-slinga?
PUBLIK: --you vill vara säker att du faktiskt [ohörbart].
DAVID J. MALAN: Kunde du använder en gör samtidigt?
Kort svar, nej.
Eftersom du är på väg att införa ett annat hörn fall.
Om strängen är noll längd.
Om till exempel, jag slog bara Enter, utan att någonsin skriva Zamyla.
Jag kommer att lämna tillbaka en faktisk sträng, som vi så småningom får se,
som har noll tecken.
Det är fortfarande en sträng, det är bara super kort.
Men om du använder en gör samtidigt, du kommer att blint
försöka göra något med respekt för den strängen,
och ingenting kommer att vara där.
>> PUBLIK: Tja, om du gjorde göra [ohörbart] samtidigt s--
DAVID J. MALAN: Åh jag ser, hålla få en sträng från användaren.
Så korta svaret, du kunde, och hålla tjat
dem att ge dig en sträng som är kort nog att passa i minnet.
Absolut.
Jag valde bara att inte.
Om de inte ger mig strängen I vill, jag sluta, jag ger upp.
Men absolut, för detta ändamål, du kan absolut göra det.
>> Så bibliotekets huvudfiler som vi nu känner till är dessa här.
Standard I / O, CS50.h, string.h, ctype.h, och det finns faktiskt andra.
Några av er har upptäckt mattebiblioteket i math.h.
Men låt mig presentera dig, nu, till denna resurs som CS50 personal, Davin,
och Rob och Gabe särskilt har sammanställt.
Det kommer snart att länka på kursens hemsida.
Det kallas CS50 referens.
>> Vilket bara ge dig en snabb smaken av det, fungerar på följande sätt.
Låt mig gå till reference.cs50.net.
Du ser på vänster sida en överväldigande lista
funktioner som kommer med c.
Men om jag bryr mig, för tillfället, om något liknande strlen,
Jag kan skriva det där.
Det filtrerar ner på listan till precis vad jag bryr mig om.
Jag kommer att klicka på den.
Och nu till vänster, ser du vad vi hoppas
är en enklare, mänskliga vänlig förklaring av hur
denna funktion fungerar.
>> Returnerar längden av en sträng.
Här är en sammanfattning, här är hur du använda det i termer av filhuvudet,
och i fråga om vad funktionen ser ut i termer av dess argument.
Och här, returer längden av en sträng.
Men för de av er bekvämare, du faktiskt kan klicka mer bekväma,
och innehållet i detta sida, nu, kommer att ändra
vara standardvärden för vad du får med hjälp av manualsidan.
>> Med andra ord, CS50 referens är en förenkling
av man-sidor av personal, för studenter.
Särskilt de mindre bekväm och däremellan, så att man
behöver inte försöka att linda ditt sinne runt, ärligt talat,
några ganska kryptiska syntax och dokumentation gång.
>> Så ha det i åtanke i dagarna framöver.
Så här, återigen, är en Zamyla.
Låt oss nu ställa en fråga som är lite mer mänsklig åtkomliga.
Tack vare Chang, som varit utskrift fler elefanter
nonstop under de senaste dagarna.
Vi har en möjlighet att ge åtminstone en av dem bort.
Om vi ​​kunde få bara en volontär att komma fram för att dra på skärmen.
Hur här?
>> Kom upp.
Vad heter du?
ALEX: Alex.
DAVID J. MALAN: Alex.
Okej.
Alex, kom upp.
Vi håller på att se ditt handskrift på skärmen här.
Okej, trevligt att träffas.
>> ALEX: Trevligt att du träffas.
>> DAVID J. MALAN: Okej.
Så, super enkel övning.
Bar är inte hög för få en elefant idag.
Du spelar rollen av getString.
Och jag ska bara tala om för dig strängen som du har fått.
Och anta att du, getString, har kallats.
Och människan, som jag, har skrivit i Zamyla, Z-A-M-Y-L-A.
Bara gå vidare och skriva Zamyla på skärmen som om du har fått det
och lagras den någonstans i minnet.
>> Lämnar utrymme för vad som kommer att vara flera andra words-- det är OK, fortsätt.
>> [LAUGHTER]
>> Så Zamyla, Excellent.
Så nu antar att du, getString, kallas på nytt.
Och därför, jag ger dig, vid tangentbord, med ett annat namn, Belinda.
Okej.
Och nu nästa gång getString är heter, jag skriver in något i stil med Gabe,
G-A-B-E. Du är verkligen tar till hjärtat direktminne.
Där man drar allt helt slumpmässigt.
OK.
>> [LAUGHTER]
ALEX: Förlåt min handstil är dålig.
DAVID J. MALAN: Nej, det är OK.
Och vad sägs om Rob, R-O-B. OK.
Bra.
Så jag ville inte föregripa ni skulle slags lägger ut saker på det här sättet.
Men vi kan göra detta arbete.
Så hur gick ni om dessa tecken i minnet?
Med andra ord, om vi tänker på Detta rektangulära svart skärm
som ett utslag datorns RAM eller minne.
>> Och minns att RAM är bara en hel massa byte,
och bytes är en hel massa bitar.
Och bitarna är på något sätt genomföras, generellt
med någon form av el i hårdvara.
Så det är typ av skiktning som vi har pratat om
och kan nu ta för givet.
Hur gick ni tillväga besluta om att skriva
Rob kontra Gabe kontra Belinda kontra Zamyla?
>> ALEX: Jag gjorde just det i förordna att du berättade för mig.
>> DAVID J. MALAN: Och det är sant.
Men vad som regleras där du sätter Belindas namn och Gabe namn?
>> ALEX: Ingenting?
DAVID J. MALAN: [skratt] Så det fungerar, det är bra.
Så datorer är lite mer ordnad än så.
Och så när vi implement-- stanna kvar för bara en moment-- när vi faktiskt
genomföra något liknande GetString i en dator,
Zamyla skulle läggas ut ganska mycket som du gjorde på skärmen, där.
>> Och vad är nyckeln till att märka här, vad Alex gjorde,
är det är lite av en avgränsning bland alla dessa ord, eller hur?
Du skrev inte Z-A-M-Y-L-A-B-E-L-I-N-D-A-G-A-B--
med andra ord, det finns något slags av avgränsning som verkar vara,
slags, slump avstånd mellan dessa olika ord.
Men det är bra, eftersom vi människor kan nu
visualisera att dessa är fyra olika strängar.
Det är inte bara en sekvens av massor av tecken.
Så en dator, då, under tiden, kan ta en sträng som Zamyla,
lägger var och en av dessa skrivelser insidan av en byte i minnet.
Men den siffran är mycket större, naturligtvis än sex tecken.
>> Det finns en hel massa RAM.
Och så hädanefter, detta rutnät av lådor går
att representera vad Alex precis gjorde här på skärmen.
Och nu, Alex, vi kan erbjuda dig en blå eller en orange elefant från Chang.
ALEX: Jag tar en blå elefant.
DAVID J. MALAN: En blå elefant.
Så en stor applåd, om vi kunde, för Alex här.
>> [Applåder]
>> ALEX: Tack.
DAVID J. MALAN: Tack.
Så takeaway är att, även om den mönster slags förändrats över tid, här
på bordet, det var denna avgränsning mellan de olika strängarna
att Alex fick för oss.
Nu datorer, ärligt talat, skulle kunna göra samma sak.
De kunde slags plopen strängar någonstans i RAM.
Här uppe, här borta, här nere, här nere.
>> De kunde göra just detta.
Men naturligtvis, det är förmodligen inte den bästa planeringen.
Rätt?
Om jag frågade Alex till få namn, förmodligen han hade
lägga lite mer här nere, kanske upp Här, här, här borta, så småningom
här borta.
Men med lite mer planering, förvisso, vi kunde lägga ut saker renare.
Och faktiskt, det är vad en dator gör.
>> Men kruxet är att Om nästa sträng jag får
efter Zamyla är något som Belinda,
förslag där vi kan skriva brev b med avseende på det här nätet?
Vart vill du åka?
Till höger om den a, nedanför z, nedanför a?
Vad skulle dina första instinkter vara?
PUBLIK: Nedanför z.
DAVID J. MALAN: Så nedanför z.
Och det är ganska enkelt, eller hur?
Det är typ av snyggt, det är vad vi gör på ett tangentbord när vi träffar Enter,
eller ett e-post när du gör en punktlista över saker.
Men verkligheten är att datorer försök att vara mer effektiv,
och klämma verkligen så mycket data i RAM som möjligt,
så att du inte slösar några bytes.
Så att du inte slösar någon skärmyta.
Och problemet är dock att om vi sätter bokstav brevet
b efter en, hur ska vi vet var Zamyla namn slutar
och Belinda namn börjar?
Så du människor just föreslagit, ja, tryck på Enter, i huvudsak.
Lägg ner nedan.
Eller till och med som Alex gjorde, bara börja skriva Nästa namn nedan den tidigare,
och nedan som en, och då under den.
Det är en visuell.
>> Datorer har en annan visuell, men det är lite mer kortfattad.
Det är det här funky karaktär.
Omvänt snedstreck 0, som kanske är påminner om bakåtstreck n,
och så vidare, nu.
De särskilda escape-sekvenser.
Omvänt snedstreck 0 är vägen för representerande åtta noll-bitar i rad.
0000 0000.
>> Det sätt du uttrycker som inte är att slår siffran noll på tangentbordet,
eftersom det i själva verket som en ASCII röding.
Det ser ut som ett nummer, men är faktiskt ett decimaltal
som representerar den cirkulära skåra, den runda typsnitt.
Samtidigt bakstreck noll betyder bokstavligen
satte åtta noll byte här för mig.
>> Så det här är något godtycklig.
Vi kunde ha använt något mönster bitar, men världen
beslutade för några år sedan, för ett företräda
i slutet av en sträng i minnet, bara sätta en massa nollor.
Eftersom vi kan upptäcka det.
Nu betyder det att ingen bokstav alfabetet kan representeras med nollor.
>> Men det är OK, vi har redan sett att vi använder 65 på uppe i 97 på upp.
Vi fick inte komma någonstans nära till alla nollor.
Så Belinda i en dators minne faktiskt kommer att gå här.
Jag har ritat den i gult precis fästa vår uppmärksamhet på den.
Och varsel, även detta är helt godtycklig.
Jag har ritat det som ett rutnät.
Liksom, är RAM bara några fysiskt objekt.
Det behöver inte nödvändigtvis rader och kolumner, per se.
Det har precis fått en massa byte implementeras i hårdvara på något sätt.
Men om det efter Belinda I skrev i Gabe namn,
han kommer att hamna här i minnet, och om jag skrev i Daven namn,
till exempel, han kommer att hamna här.
Och jag kan fortsätta att skriva ännu fler namn.
>> Tyvärr, om jag försöker skriva ett super långt namn,
Jag skulle så småningom slut på minne.
I vilket fall är getString kommer att återvända NULL, som vi sa.
Men tack och lov, åtminstone i denna visuella Här fick vi inte riktigt så långt.
>> Nu vad är trevligt är att detta allmän uppfattning om att behandla saker
som i lådor är företrädare för en funktion i C
och en hel del språk, känd som en array.
En matris är en annan typ av data.
Det är en datastruktur, om man så vill.
Struktur i betydelsen det verkligen, typ av, ser ut som en låda, åtminstone
i ditt inre öga.
En matris är ett sammanhängande sekvens av identiska datatyper,
rygg mot rygg mot rygg mot rygg.
>> Så en sträng, i andra ord är en samling av tecken.
En mängd tecken.
Men det visar sig att du kan få arrayer av klasar av saker.
I själva verket kan vi lägga ännu siffror i en array.
Så i vilken form vi ska börja
att förklara dessa data struktur känd som en matris
kommer också att använda hakparenteser.
Men dessa hakparenteser kommer att har olika betydelse i sammanhanget.
>> Och låt oss se det så här.
Antag att jag öppnade upp en ny fil här.
Och jag spara detta som ages.c.
Och jag ska spara detta i min mapp här.
Och nu ska jag gå vidare och börja skriva något
som inkluderar CS50.h, inkluderar stdio.h, int main ogiltiga.
Och sedan inne i här, jag vill ha att först ha en int kallas ålder.
>> Och jag kommer att använda det för att få en int från användaren för hans eller hennes ålder.
Men detta program är tänkt att användas av flera personer, för oavsett sammanhang.
Jag har en rad av människor.
Alla har att skriva in sina åldern för kanske några, jag vet inte,
konkurrens, eller händelse att de har kommit för.
Så nästa person, jag behöver en annan variabel.
>> För om jag bara ålder blir getInt, det är
kommer att clobber, eller skriva över föregående personens ålder.
Så det är inte bra.
Så min första instinkt skulle kunna vara, oh, okej,
om jag vill få flera människors ages-- låt oss kalla detta ålder1,
int age2 får int, int ålder 3 blir getInt.
Och nu ska jag använda vissa pseudokoden här.
>> Gör något med dessa siffror.
Vi lämnar för en annan dag vad vi gör det, eftersom vi bara
vård för tillfället om ålder1, age2, ålder 3.
Tyvärr, när jag kompilera programmet
och satte den framför faktiska användare, vad är det i grunden dålig design
beslut jag verkar ha gjort?
Yeah?
PUBLIK: [ohörbart]
DAVID J. MALAN: Ja, Jag har inte ens försökt
att räkna ut hur många åldrar gör jag faktiskt bryr sig om?
Om jag har färre än tre personer här, och därmed färre än tre åldrar,
Jag är fortfarande blint väntar tre.
Gud förbjude fyra människor dyker upp.
Mitt program bara inte ens stödja dem.
>> Och så detta, lång historia Kort sagt, är inte en bra vana.
Rätt?
Jag var i grunden att kopiera och klistra in koden och bara tweaking
variabelnamn.
Och, min Gud, om du hade, inte tre åldrar, men 10, eller 100, eller till och med 6500
studenter, till exempel.
Detta kommer inte att vara särskilt elegant kod eller hållbart.
Du kommer att behöva skriva om programmet varje gång
ditt antal människor ändringar.
>> Så tack och lov, i våra faktiska ages.c fil för i dag,
vi har en smartare lösning.
Först kommer jag att låna konstruerar vi har använt ett par gånger,
detta göra medan loop, för att få antalet personer i rummet.
Jag ska bara tjata användaren, igen och igen, tills han eller hon ger mig
ett värde på n som är ett positivt heltal.
>> Jag kunde ha använt, senaste tid oss ​​få positiva int.
Men vi har inte den på riktigt, så jag gick framåt
och åter genomfört denna idé.
Nu här nere, detta är den nya trick.
I linje 27, som kommentarerna i linje 26 antyder,
deklarera en array där att lagra alla ålder.
>> Så om du vill komma, inte en int, inte två Ints, men en hel massa Ints.
Specifikt n heltal, var n kanske vara tre, kanske 100, kanske 1000.
Syntaxen, helt enkelt, är att säg, vilken datatyp vill du ha?
Vad vill du att ringa den del av minnet?
Vad vill du kalla nätet som ser ut så här bildmässigt?
>> Och inom parentes här, säger du hur stor du vill att matrisen ska vara.
Och så tidigare, när jag sade syntaxen är lite annorlunda här,
vi fortfarande använder hakparenteser, men när jag förklara en matris,
Antalet insidan av hakparentes medel
hur stor vill du matrisen ska vara.
>> Däremot när vi använde s fäste jag för en stund sedan, s, en sträng,
är verkligen en samling av tecken, men när du inte deklarera en variabel,
som med detta sökord här, du bara få
ett specifikt index, en specifik elementet från att arrayen.
När vi vet det, resten av detta är enkel.
Om ny jag först kommer att skriva ut vad är en ålder av personnummer i.
Där jag säger bara personen nummer ett, person nummer två, person nummer tre.
>> Och jag gör bara aritmetik, så att som vanliga människor,
Vi räknar från en för detta program, och inte från noll.
Då jag kallar getInt, men jag lagra svaret i åldrarna bracket jag.
Vilket är det i: te ålder i arrayen.
Så medan förra gången vi behandlar dessa lådor som tecken för Zamyla namn,
och andra.
Nu, dessa rutor representerar 32 bitar, eller fyra byte
där vi kan lagra en int, int, en int.
Allt som, återigen, är samma datatyp.
>> Nu gör jag något dumt, som tiden går, precis
att motivera att skriva det här programmet.
Och sedan ner här, jag återigen iterera över gruppen säger om ett år,
personen nummer ett kommer vara något år gammal.
Och att räkna ut att math-- Jag menar, det här
är inte mycket komplicerat arithmetic-- Jag lägger bara en till deras ålder.
Bara för att visa att, återigen, det här.
>> Precis som jag kan indexera till en sträng, s, så kan jag index i en array av åldrar,
sånt där.
Så vart kommer detta att vara med oss?
Så vi får se, i slutändan, en få saker i de kommande dagarna.
En, hela tiden, då skriva dina egna program,
som Mario, giriga, kredit.
Du har skriva namnet på programmet och slå Enter.
Och sedan få användarens input.
>> Med getString, getInt, getLongLong, eller liknande.
Men det visar sig att C-stöd något som kallas kommandoraden
argument, som kommer att låta oss faktiskt få på ord som du skriver,
på blinkande prompten, efter programmets namn.
>> Så i de kommande dagarna, du kanske skriver något i stil med Caesar,
eller ./caesar nummer 13, därefter.
Vi får se hur det fungerar.
Eftersom faktiskt, i Problemet set två, vi är
kommer att presentera dig till en liten sak
påminner om Ralphie utmana tidigare i kartografi.
Konsten att förvränga informationen.
Detta är i själva verket är mycket påminner om vad Ralphie gjorde.
>> Detta är ett exempel på en krypterings algoritm kallas rot13, R-O-T 13.
Vilket betyder helt enkelt rotera bokstäver i alfabetet 13 platser.
Och om du gör det, ser du nu vad som är, kanske, en bekant fras.
Men hur vi kommer att använda detta i slutändan är mer generellt.
>> I P set två, i standardversionen, du kommer att genomföra ett par chiffer,
en som heter Caesar, en som heter Vigenère.
Båda är roterande chiffer, i det något du
vända en bokstav till en annan bokstav.
Och Caesar är super enkelt.
Du lägger en, du lägger till 13, eller något nummer upp till 26.
Vigenère gör det på en per bokstav basis.
Så Vigenère, som du ser i spec, är säkrare.
>> Men i slutet av dagen vad du ska genomföra och P set två,
är att nyckeln som du använder både för kryptering och dekryptering.
Med hänvisning till processen för att vrida vanlig text, vissa ursprungliga meddelandet,
i cypher text, som är något krypterad.
Och sedan dekryptera det igen.
>> I hackaren upplagan, Samtidigt kommer du att
uppgift att något liknande i anden, där vi ger dig
en fil från en typisk Linux, eller Mac eller Unix-dator som heter etsy
lösenord, som innehåller en hel gäng användarnamn och lösenord.
Och dessa lösenord har alla krypterats eller hashas,
så att säga, mer korrekt som du ser i spec.
>> Och hacker utgåvan kommer att utmana dig att ta en ingång så här,
och sprickbildning lösenordet.
Det vill säga, att räkna ut vad det människans lösenord faktiskt var.
Jo, faktiskt, lösenorden är allmänhet inte lagras i klartext,
och generellt words borde vara svårt att gissa.
Det är inte ofta fallet.
>> Och vad jag trodde att vi skulle göra är avsluta med ett par minuter
blick på en särskilt dåligt val av lösenord
från en film som du kanske kommer ihåg ömt.
Och om inte, bör du hyra.
>> [VIDEOAVSPELNING]
>> -Helmet, Du ovän, vad som händer?
Vad gör du med min dotter?
>> -Permit Mig presentera den lysande unga plastikkirurg,
Doktor Phillip Schlotkin.
Den största näsoperation man i hela universum och Beverly Hills.
>> -Din höghet.
>> -Nose Jobb?
Jag förstår inte.
Hon har redan haft en näsoperation.
Det var hennes söta 16 närvarande.
>> Nej, det är inte som du tror.
Det är mycket, mycket värre.
Om du inte ger mig kombination med luftskärm,
Läkaren Schlotkin ger din dotter tillbaka sin gamla näsa.
- [Flämtar] Nooooooooooooo.
Var har du fått det?
>> -Okej.
Jag säger, jag ska säga.
>> Nej, pappa, nej.
Du får inte.
>> Du har rätt min kära.
Jag kommer att sakna din nya näsa.
Men jag kommer inte att berätta för dem att kombination oavsett vad.
>> -Väldigt Väl.
Doktor Schlotkin, gör din värsta.
>> -Min Nöje.
>> -Nej!
Vänta, vänta.
Jag ska berätta.
>> Jag visste att det skulle fungera.
Okej, ge det till mig.
>> -The Kombination är en.
>> -En.
-Två.
-Tre.
-Fyra.
-Fem.
-Sĺ Kombinationen är ett, två, tre, fyra, fem.
Det är det dummaste kombinationen Jag någonsin hör i mitt liv.
Det är sånt en idiot skulle ha på sitt bagage.
>> Tack, ers höghet.
>> [REMOTE CLICKS]
>> Vad gjorde du?
>> Jag stängde av muren.
>> Nej, det gjorde du inte, du avstängd hela filmen.
>> Jag måste har tryckte på fel knapp.
>> -Tja, Lägger tillbaka den!
Sätt upp videon på!
>> Ja, sir!
Ja, sir.
-Vi Går, Arnold.
Kom, Gretchen.
Naturligtvis vet du jag ska måste fakturera dig för det här.
-Tja?
Fungerade det?
Var är kungen?
>> -Det Arbetade, sir, vi har kombinationen.
Bra.
Nu kan vi ta varje sista andetag av frisk luft från planeten Druidia.
Vad är kombinationen?
>> Ett, två, tre, fyra, fem.
>> Ett, två, tre, fyra, fem?
-Ja.
-Det Är fantastiskt.
Jag har samma kombination på mitt bagage.
Förbered Spaceball 1 för omedelbara avgång.
>> Ja, sir.
>> -Och Ändra kombination på mitt bagage.
[Dörrstängnings SOUND]
[CLINK AV DÖRRAR SLÅ HJÄLM]
-Ahh.
[END VIDEOAVSPELNING]
DAVID J. MALAN: Det är den för CS50, vi ses nästa vecka.
BERÄTTARE: Och nu, Djup Tankar, av Daven Farnham.
>> Daven FARNHAM: Kodning i C är så mycket hårdare än Scratch.
printf, Scratch var en lögn.
>> [LAUGHTER Soundbite]