>> [Musikk spilles]
DAVID J. MALAN: All right.
Dette er CS50, og denne er slutten av uke 2.
Så i dag skal vi å fortsette vår look
på hvordan vi representerer ting under hood-- beveger seg bort
fra tall som heltall og flytende punkt verdier
og fokusere på strenger og instans mer interessante programmer.
Men vi vil også ta en titt på en par domenespesifikke problems--
den første av disse vil være involverer kryptografi,
kunsten scrambling informasjon, der du ser ovenfor her
er et bilde av Radio Orphan Annie hemmelig dekoder ring fra en svunnen tid.
>> Dette er faktisk veldig primitiv form og barnevennlig form for cryptopgraphy
idet denne ringen har to disks-- en inne og en ute.
Og ved å rotere en av disse, kan du hovedsak stille opp bokstaver som A
gjennom Z med andre bokstaver som B gjennom A. Med andre ord,
du kan bokstavelig talt rotere alfabetet, dermed kommer opp med en kartlegging fra
brev til bokstaver slik at hvis du ønsket å sende en hemmelig melding
til noen som Annie, kan du skrive ned meldingen din og roter
bokstavene, der, hvis du mener å si "A," deg i stedet si "B"
du mener å si "B" du i stedet si "C" -
eller noe litt mer smart enn at-- og deretter, til slutt,
så lenge Annie har denne dekoderen ring, kan hun dekode meldingen.
Nå kan du husker, faktisk, at dette ble anvendt i en veldig kjent film som
spiller ad nauseum under jula.
La oss ta en titt her.
Ralphie PARKER: "Det være seg kjent for alle i sammendraget
at Ralph Parker er herved utnevnt medlem av Little Orphan Annie Secret
Sirkel og har krav på alle de æresbevisninger og fordeler som skjer i dette. "
>> Ralphie PARKER (lydkommentar): Signert Little Orphan Annie.
Kontra, Pierre Andre!
I blekk.
Honors og fordeler, allerede i en alder av ni.
>> [Musikk spilles]
>> [RADIO SKRAVLE]
Ralphie PARKER: Kom igjen.
La oss fortsette med det.
Jeg trenger ikke all that jazz om smuglere og pirater.
Radiostemme: Lytt i morgen natt for den avsluttende eventyr
av The Black Pirate Ship.
Nå er det tid for Annies Secret beskjed til deg medlemmer
av Secret Circle.
Husk barn, bare medlemmer av Annie Secret Circle
kan dekode Annie hemmelige budskap.
>> Husk, er Annie avhengig av deg.
Still dine pins til B-2.
Her er Message-- 12, 11, 2--
Ralphie PARKER (lydkommentar): Jeg er i min første hemmelig møte.
Radiostemme: --25, 14, 11, 18, 16--
Ralphie PARKER (lydkommentar): Å, Pierre var i stor stemme i kveld.
Jeg kunne fortelle at kveldens Budskapet var veldig viktig.
>> Radiostemme: --3, 25.
Det er en melding fra Annie selv.
Husk, ikke si det til noen.
>> [Pesende]
Ralphie PARKER (lydkommentar): Nitti sekunder senere, er jeg
i det eneste rommet i hus hvor en gutt på ni
kunne sitte i ro og dekode.
Ah.
"B."
>> [Humrer]
>> Ralphie PARKER (lydkommentar): Jeg gikk til den neste.
"E."
Det første ordet er "være."
Ja!
Det kom lettere nå.
"U."
>> [Humrer]
>> RANDY PARKER: Aw, kom igjen, Ralphie.
Jeg må gå!
>> Ralphie PARKER: Jeg kommer rett ned, Ma.
Jøss.
"T." "O." "Pass til. "" Pass på å "hva?
Hva var Little Orphan Annie prøver å si? "Sørg for å" hva?
MOR: Ralphie, Randy har fått til å gå.
Kan du komme ut?
>> Ralphie PARKER: All right, mamma!
Jeg kommer straks!
Ralphie PARKER (lydkommentar): Jeg begynte å bli nærmere nå.
Spenningen var forferdelig.
Hva var det?
Skjebnen til planeten kan henge i balanse.
>> MOR: Ralphie, Randy må jo gå!
>> Ralphie PARKER: Jeg kommer straks ut, for roper høyt!
Ralphie PARKER (Lydkommentar): Nesten der!
Fingrene mine fløy!
Mitt sinn var en stål felle.
Hver pore vibrerte.
Det var nesten klar!
Ja!
>> Ralphie PARKER: "Pass å drikke din Ovaltine. "
Ovaltine?
En crummy kommersielle?
>> [Musikk spilles]
>> Ralphie PARKER: Drittsekk.
>> [Ler]
>> DAVID J. MALAN: Så det er da et glimt på hva kryptografi
kan være for dette-- en drikke fra en svunnen tid.
Så en rask kunngjøring.
Hvis du er fri denne Fredag ​​kl 13:15 og ville
liker å bli med oss ​​for CS50 lunsj, hodet til denne nettadressen her.
Først til mølla som vanlig.
Men over tid, vil vi sørge for at mest alle som ønsker å delta
kan planlegge-messig.
>> Så strenger.
Vi har Zamyla-- hvem du nå har møtt mest sannsynlig
i oppgavesettet 1-- som navnet er stavet slik.
Og antar at du skrev navnet hennes inn i et datamaskinprogram som er
bruke noe sånt som getString.
For å hente disse tastetrykk, hvordan
kan vi gå om representerer en streng, et ord, et avsnitt,
eller flere bokstaver som disse her?
>> Vi snakket sist gang om heltall og problemer
som oppstår med heltallsoverflyt og flytende punkt verdier
og problemer som oppstår i presisjon.
Med strenger, vi minst har litt mer fleksibilitet
fordi strings-- bare i den virkelige verden--
kan være en ganske vilkårlig lengde.
Ganske kort, ganske lenge.
Men selv da, skal vi finne at datamaskiner kan noen ganger
går tom for minne og ikke engang lagre et stort nok streng.
>> Men for nå, la oss begynne å visualisere en streng som noe i disse boksene
her.
Så seks slike bokser, som hver representerer et tegn eller "røye."
Så husker at "char" - c-h-en-r-- er en av de innebygde datatyper i C.
Og hva som er fint er at du kan bruke den slags som en byggesten,
et puslespill brikke, om du vil, for å danne en større type data som vi vil fortsette
å kalle en "streng".
>> Nå, hva er nyttig om å tenke om ting som strenger på denne måten?
Vel, det viser seg at vi kan faktisk utnytte denne strukturen
å faktisk få tilgang til enkelttegn i en ganske grei måte.
Jeg kommer til å gå videre og skape en fil som heter "stringzero.c,"
men du kan kalle det hva du vil.
Og på kurset hjemmeside er allerede dette eksempelet på forhånd
slik at du ikke trenger å skriver alt ut.
>> Og jeg kommer til å gå videre og først gjøre int main annullert.
Og i løpet av få dager, vi begynner å erte hverandre
hva tomrommet er her, hvorfor det er int ved siden av hoved, og så videre.
Men for nå, la oss fortsette å kopiere lime det.
>> Jeg kommer til å erklære en streng kalt s.
Og jeg kommer til å returnere fra GetString hva brukeren taster inn.
Dette kommer til å være en enkel program, ingen instruksjoner,
Jeg skal bare blindt forvente at brukeren vet
hva du skal gjøre for å holde det enkelt.
>> Og nå kommer jeg til å ha en for loop.
Og innsiden av min for loop jeg er kommer til å ha int jeg får null.
Og jeg er, igjen, bare en konvensjon, en indeks variabel for telling,
men jeg kunne kalle dette hva jeg vil.
Jeg kommer til å gjøre jeg er mindre than-- godt Zamyla navn er seks bokstaver.
Så jeg kommer til hardt kode som det for nå.
>> Og så i ++.
Og nå inne i disse krøllete bukseseler jeg kommer til å gjøre printf,
og jeg ønsker å skrive ut én tegn om gangen.
Så jeg kommer til å bruke% c for kanskje den første gangen.
Og så vil jeg skrive ut hver tegnet på sin egen linje.
Så jeg kommer til å sette en lite backslash n der.
Lukk sitat.
>> Og nå ønsker jeg å gjøre noe her.
Jeg ønsker å skrive ut bestemt bokstav i strengen,
s, som jeg gjentar fra null på opp til seks.
Med andre ord, jeg vil skrive ut i'th karakter s.
Nå hvordan kan jeg gjøre dette?
>> Vel mye som boksene i denne representasjonen her,
slags, trylle frem tanken om boksing bokstaver i, kan du på samme måte gjøre det
syntaktisk i C ved ganske enkelt å spesifisere, Jeg ønsker å skrive ut s'er i'th karakter.
Bruke hakeparenteser på datamaskinens tastatur
som på et norsk tastatur er generelt over din retur-tasten.
>> Så dette er ikke helt riktig ennå, som du kanskje har lagt merke til.
Men jeg kommer til å slags blindt videre her.
Og jeg kommer til å gjør streng 0.
Men før jeg gjør dette, la oss se om vi kan ikke forutse noen vanlige feil.
Dette kommer til å kompilere?
Nei, jeg mangler en hel haug med ting.
Bibliotekene jeg hørt.
>> Så hvilken header filer kanskje jeg vil legge til her?
Yeah.
>> PUBLIKUM: Du trenger standard I / O [uhørbart]
>> DAVID J. MALAN: Excellent.
Så jeg trenger standard I / O. For hva Hensikten ønsker jeg standard I / O?
For printf.
Så inkluderer stdio.h.
Og du også foreslå at jeg inkludere den CS50 biblioteket for hvilken grunn?
Å ha strenger.
Så vi får se hva CS50 bibliotek gjør
å lage denne forestillingen om en streng.
Men for nå, kan du bare tenke på det som en faktisk datatype.
>> Så det ser ut til å bli litt ryddet opp.
Og nå kommer jeg til å gå videre og faktisk gjør strengen 0.
Kompilert.
Så det er bra.
Så ./string0 la meg zoome inn slik at vi kan se nærmere på hva som skjer.
Enter.
Z-A-M-Y-L-A inn.
Og vi har skrevet ut til Zamyla navn.
>> Så det er ganske bra.
Så nå la oss gå videre og kjøre dette programmet på nytt,
og skriv ut Daven fullt navn.
Surprise, surprise.
Enter.
Hmm.
Vi har ikke skrevet Daven sin fulle første navnet riktig.
Nå skal dette være tydelig i ettertid på grunn av det,
liksom, dumme valg med tanke?
>> Ja, jeg hardkodet den seks innsiden av min for loop.
Nå gjorde jeg det bare fordi Jeg visste Zamyla navn
skulle være seks bokstaver.
Men sikkert dette er ikke en generell løsning.
Så det viser seg at vi kan dynamisk regne ut lengden av en streng
ved å kalle en funksjon som heter strlen.
>> Igjen, bevisst konsist heter bare
å gjøre det mer praktisk å skrive.
Men det er synonymt med blir lengden av en streng.
Jeg kommer til å gå tilbake til min terminal vindu og re-run kompilatoren.
Men det er roping på meg.
Implisitt erklære bibliotekfunksjon strlen med type unsigned int const--
Jeg er tapt.
Helt.
>> Så, særlig ettersom din øynene begynner å glasur over
med feilmeldinger som dette, fokus ærlig på de første ordene.
Vi vet at problemet er i linje 8, som vist her.
Og det er i streng-0.c.
Implisitt erklære bibliotekfunksjon strlen.
Slik som generelt skal være et mønster av feilmeldinger.
Implisitt erklære noe.
>> Så kort sagt, hva har jeg syntes å ha gjort med hensyn til linje 8, her.
Hva kan være løsningen være enda hvis du aldri har brukt strlen deg selv?
>> PUBLIKUM: En del av et annet bibliotek?
DAVID J. MALAN: Part av et annet bibliotek.
Så det er erklært, så å si.
Det er nevnt i noen fil annet enn stdio.h og CS50.h.
Nå hvor er det definert?
For å være ærlig, du enten nødt til å bare vet dette på toppen av hodet,
eller du Google dette og finne ut.
Eller vet dette, har jeg åpnet opp i CS50 apparat terminalprogrammet, som
er bare den store, versjonen av full skjerm hva som er i bunnen av gedit vindu.
>> Og det viser seg at det er en Tilsvar fyndig kommando, kalt
mann for manuell, der hvis du skriver inn navnet på en funksjon og trykk Enter,
du får tilbake ganske uforståelige dokumentasjon.
Det er bare teksten som generelt ser litt noe sånt som dette.
Det er litt overveldende ved første øyekast.
Men ærlig jeg kommer til å la mine øyne glasur over
og bare fokusere på den delen Jeg bryr meg om for øyeblikket.
>> Som er denne.
Som ser strukturelt like noe jeg er kjent med.
Faktisk mannen siden, så å snakke, vil fortelle deg
i hvilken header sende inn en funksjon som strlen er definert.
Så jeg kommer til å gå tilbake nå til gedit.
Og jeg kommer til å gå videre og legge inn her #include
og lagre filen.
>> Jeg kommer til å tømme skjermen med Kontroll L Hvis du har vært lurer på.
Og jeg kommer til å kjøre make string.0, kompilerer denne gangen.
./string.0 Zamyla.
Som syntes å fungere La meg gå foran og kjør den med Davenport.
Enter.
Og det også, syntes å fungere.
>> Så vi kan gjøre det litt bedre enn dette, skjønt, kan vi begynne å rydde ting
opp bare en liten bit.
Og jeg skal faktisk introdusere en annen ting nå.
Jeg kommer til å gå videre og lagre dette i en annen fil.
Og jeg kommer til å ringe denne filen string1.c bare
til å være i samsvar med koden vil du være i stand til å finne på nettet.
>> Og la oss fokusere på nøyaktig den samme koden.
Det viser seg at jeg har vært litt taking
for gitt det faktum at min laptop, og i sin tur, CS50 apparatet
har mye minne, mye RAM, mange byte av plass
der jeg kan lagre strenger.
>> Men realiteten hvis jeg skrev lang nok, og nok tastetrykk,
Jeg kunne i teorien typen i flere tegn
enn min datamaskin fysisk har minne for.
Og dette er problematisk.
Mye som en int kan bare telle så høyt, i teorien,
du kan bare stappe så mange tegn inn i datamaskinens RAM eller Random
Access Memory.
>> Så jeg hadde bedre forutse dette problemet, selv
om det kan være en sjelden hjørne tilfelle, så å si.
Skjer ikke så ofte, kunne skje.
Og hvis det skjer, og jeg gjør ikke forutse og program for det,
mitt program kan gjøre hvem vet hva.
Fryse, henge, reboot, uansett.
Noe forventet kan skje.
>> Så hva jeg skal gjøre nå, heretter egentlig,
er før jeg noensinne blindt bruke en variabel som s som
er blitt tildelt returverdi noen annen funksjon som getstring,
Jeg kommer til å sørge for at at verdien er gyldig.
Så jeg vet bare fra å ha lest CS50 dokumentasjon for getstring,
som til slutt vil vi peke deg i, at getstring returnerer et spesielt symbol
kalt NULL, N-U-L-L i alt caps, hvis noe går galt.
>> Så normalt, returnerer den en streng.
Men ellers dersom det returnerer N-U-L-L-- Vi vil til slutt se hva som virkelig
means-- som bare betyr noe dårlig skjedde.
Nå betyr dette, mye som i Scratch, Jeg kan sjekke en tilstand her i C,
Hvis s ikke lik NULL.
Så hvis du ikke har sett dette før, Dette betyr bare ikke lik.
>> Så det er det motsatte av like likemenn, som, husker,
er forskjellig fra enkelt likemenn, som er oppdraget.
Så hvis s er ikke lik NULL, bare da gjøre
Jeg ønsker å utføre disse linjene med kode.
Så med andre ord, før jeg dykke i blindt
og starte itera i løpet av s, og behandle det
som om det er en sekvens av tegn, kommer jeg til å først sjekke,
vent litt, er s definitivt ikke lik denne spesielle verdi, NULL?
>> Fordi hvis det er, kan dårlige ting skje.
Og for nå, antar at dårlige ting skjer betyr at programmet krasjer,
og du kan ikke nødvendigvis gjenopprette.
Så ærlig, det ser styggere.
det er slags forvirrende nå å se på.
Men dette vil bli mer kjent før lenge.
>> Men jeg kommer til å foreslå nå en annen forbedring.
Det er en forbedring av korrekthet.
Mitt program er nå mer korrekt, fordi i sjeldne tilfelle at ikke nok minne
eksisterer, vil jeg klare det, og jeg vil bare gjøre ingenting.
Jeg i hvert fall ikke vil krasje.
>> Men la oss gjøre en endelig versjon her.
Og en fil som heter string2.c.
Jeg kommer til å lime det samme koden for bare et øyeblikk,
og jeg kommer til å markere dette linje, 11, her, for bare et øyeblikk.
Nå realiteten er at smarte kompilatorer som Clang kunne fikse dette for oss
bak kulissene uten vår noensinne vite.
Men la oss tenke på dette fundamentalt som en problematisk design.
>> Denne kodelinje er naturligvis sa initial litt variabel jeg til 0.
Det er ganske grei.
Og hva er igjen dette uttalelse, her, i ++, gjør?
Vi har sett det før, men vi gjorde egentlig ikke snakke om det.
>> PUBLIKUM: økes i.
>> DAVID J. MALAN rykkes jeg.
Så på hver iterasjon gjennom denne sløyfen, hver syklus,
du økes jeg etter en.
Så det blir større og større, og større til løkken avsluttes.
Hvordan avslutte det?
Vel det er denne middel tilstand som vi har brukt før.
Du har sett og i walkthroughs i P sett.
>> Men hva er dette ord?
Gjør følgende loop slik lenge i er mindre enn hva?
PUBLIKUM: Lengden av strengen.
DAVID J. MALAN: The lengden av strengen.
Så det betyr ganske renslig til engelsk i den forstand.
Nå er problemet er at hver gang jeg iterere gjennom denne sløyfen i teorien,
Jeg stiller dette spørsmålet.
Er jeg mindre enn strengen lengden av s?
>> Nå er jeg endrer på hver iterasjon?
Det er det.
På grunn av den ++.
Så hver iterasjon jeg blir større.
Men er s blir større, eller mindre, eller endring i det hele tatt?
Nei
Så i form av design, en av aksene langs som vi prøver å evaluere kode
i klassen, føles dette litt dumt.
>> Som du er bokstavelig talt, på hver iterasjon
av denne sløyfen spørre samme jævla spørsmålet igjen,
og igjen, og igjen, og bokstavelig talt det aldri kommer til å forandre seg.
I hvert fall hvis jeg ikke berøre s og forsøker å endre innholdet i s.
Så jeg kan gjøre det litt bedre enn dette.
>> Og hva jeg skal gjøre er ikke erklære bare én variabel i,
men en annen variabel jeg skal vilkårlig, men konvensjonelt, kall det n.
Tildel n lik strenglengden s.
Og så over her, kommer jeg til å gjøre en smart liten optimalisering, så
tale, som på slutten av dagen ikke er mer korrekt eller ikke mindre korrekt
enn før.
Men det er et bedre design.
I det faktum at jeg bruker kortere tid, færre CPU-sykluser, så
å snakke, for å svare på det samme spørsmål, men bare en gang.
>> Eventuelle spørsmål om at generell prinsippet om bedring,
si, et program effektivitet?
Yeah?
PUBLIKUM: Hvorfor gjør du bruke [uhørbart]?
DAVID J. MALAN: Godt spørsmål.
Så hvorfor setter vi ++ på enden av Jeg i stedet for i begynnelsen av jeg?
I dette tilfellet, har det ingen funksjonell betydning.
Og generelt, kan jeg ofte bruke postfix operatør
slik at det er litt mer tydelig som å når operasjonen skjer.
>> For de som ikke kjenner, det er en annen uttalelser der du kan gjøre ++ jeg.
Dette er funksjonelt tilsvarende i dette tilfellet
fordi det er ingenting annet rundt som incrementation.
Men du kan komme opp med saker og linjer med kode
i hvilken det er en forskjell.
Så generelt, gjør vi ikke engang snakke om denne.
Fordi ærlig, gjør det kode mer sexy, og liksom stiligere,
og færre tegn.
Men realiteten er at det er mye vanskeligere, Jeg tror, ​​selv for meg å vikle meg
rundt det noen ganger, rekkefølgen av operasjoner.
Så som en side, hvis du egentlig ikke liker dette,
selv om dette er slags sexy ser, kan du også gjøre i + = 1,
som er den uglier versjon av samme ideen for postfix incrementation.
>> Jeg sier dette, og du bør gjøre narr av det,
men du vil komme til å se kode som noe vakkert før lenge.
>> [Latter]
>> DAVID J. MALAN: Høyre?
Yeah.
Spørsmål i midten.
>> PUBLIKUM: du trenger gjøre for å si int n?
DAVID J. MALAN: Du gjør ikke trenger å si int n.
Så fordi vi allerede har sagt int, trenger du ikke å si det igjen.
Fangsten er at n har til være den samme som datatypen i.
Så det er bare et hjelpemiddel her.
Yeah.
>> PUBLIKUM: Kan du gå over print karakter s brakett jeg igjen?
DAVID J. MALAN: Absolutt.
Så% c, husker fra sist tid, er bare en plassholder.
Det betyr sette en røye her.
skråstrek n, selvfølgelig bare del sette et linjeskift her.
Slik at bare blader, nå, dette stykke ny syntaks.
Og dette er bokstavelig talt si, grip strengen som kalles s og gå får sin
i'th karakter, så å si.
>> Og jeg fortsetter å si i'th karakter fordi på hver iterasjon av denne sløyfen
det er som om vi skriver ut ut, først s brakett 0,
som programmerer kanskje si.
Deretter s brakett 1, deretter s brakett 2, deretter 3, deretter 4.
Men selvfølgelig er det en variabel, så jeg bare uttrykke det med jeg.
>> Key, skjønt, er å realisere, spesielt hvis du har ikke
blitt acclimating til denne verden programmering, der vi alle
synes å telle fra null, gotta begynne å telle fra null nå.
Siden strenger, første tegnet, den z i Zamyla er for bedre eller verre
kommer til å leve på stedet tallet null.
>> Ok, så la meg få oss tilbake hit til Zamyla
og se hva som egentlig skjer på under panseret.
Så det er denne oppfatningen av type casting.
Du har kanskje faktisk spilt med dette allerede,
kanskje for hacker utgave av P satt en.
Men typen støping bare refererer til evne i C og noen andre språk
å konvertere en datatype til en annen.
>> Nå hvordan kan vi se dette ganske oversiktlig?
Så dette, husker, er begynnelsen av det engelske alfabetet.
Og konteksten, husker, fra som for en uke siden er ASCII.
The American Standard Kode for Information Interchange.
Som er bare en veldig lang vei si en kartlegging fra brev
til tall, og fra tall til bokstaver.
>> Så A til M her, dot dot prikk, på linje med, husker,
desimaltallet 65 på opp.
Og vi fikk ikke snakke om dette eksplisitt,
men sikkert det er lik numre for små bokstaver.
Og ja, det finnes.
Verdens besluttet noen år siden det lille en, små bokstaver a,
kommer til å være 97.
Og lille b kommer å være 98, og så videre.
>> Og for en annen tast på tastaturet, det er
kommer til å være et lignende mønster av biter.
Eller ekvivalent, et desimaltall.
Så spørsmålet på hånden, kan da, er hvordan vi
faktisk se dette under panseret?
Så jeg kommer til å gå over til gedit igjen.
Og snarere enn type denne fra bunnen av,
Jeg kommer til å gå videre og bare åpne opp noe
fra dagens kode som kalles ASCII null.
>> Og ASCII null ser slik ut.
Så la oss bryte våre sinn rundt dette.
Så først, har jeg kommen koden, som er fint.
Fordi det er bokstavelig talt forteller meg hva du kan forvente,
vise en kartlegging for store bokstaver.
Nå vet jeg ikke helt vet hva jeg mener med det, så la oss slutte.
>> På engelsk, kanskje noe techie engelsk,
hva betyr linje 18 vises til å gjøre for oss?
Bare linje 18.
Hva er det å fremkalle?
Hva kommer det til å sparke i gang her?
>> PUBLIKUM: En løkke.
>> DAVID J. MALAN: En løkke.
Og hvor mange ganger er som kommer til å reagere?
PUBLIKUM: [interposing VOICES] seks ganger.
DAVID J. MALAN: Ikke seks ganger.
PUBLIKUM: 26 ganger.
DAVID J. MALAN: 26 ganger.
Ja, beklager.
26 ganger.
Hvorfor?
Vel, det er litt rart, men Jeg har begynt å telle fra 65.
Som er rart, men ikke galt.
Det er ikke dårlig per si.
Og jeg gjør det bare fordi, for dette eksemplet,
Jeg er litt i påvente at kapitalen A var 65.
Nå er dette ikke den mest elegante måte å gjøre dette, til slags vanskelig kode
esoteriske verdier som ingen er stadig forventes å huske.
>> Men for nå, merker at jeg er gjør dette opp gjennom 65 pluss 26.
Fordi tilsynelatende jeg ikke selv ønsker å gjøre det aritmetiske i hodet mitt.
Så jeg skal la kompilatoren gjøre det.
Men deretter på hver sløyfe, hver iterasjon av loopen, jeg økes jeg.
>> Så nå dette ser litt kryptisk.
Men vi bør ha grunnleggende bygge blokker med å forstå dette.
% C er bare en plassholder for en røye.
% I er en plassholder for en int.
Og det viser seg at ved å bruke denne ny syntaks, dette parentes, så
å snakke, så en datatype inne i en parentes,
Jeg kan tvinge kompilatoren til å behandle jeg ikke er et heltall, men som en røye.
>> Dermed viser meg karakter ekvivalent av det nummeret.
Nå her nede, denne koden er stort sett identisk.
Jeg ville bare gjøre super eksplisitt det faktum
at jeg begynner på 97, som er små bokstaver en.
På opp gjennom 26 flere bokstaver.
Og jeg doing-- igjen, avstøpning i, så å si.
Eller type casting i, så å si.
>> Fra en int til en røye.
Så sluttresultatet kommer til å bli, ærlig, informasjonen vi allerede vet.
Jeg kommer til å gjøre ascii-0 dot-- ikke dot c.
Varsel, har du sannsynligvis gjort at feil som jeg gjorde bare et uhell.
Gjør ascii-0.
Nå kommer jeg til å gjøre ./ascii-0.
Jeg skal zoome inn, og dessverre det kommer til å rulle ut av skjermen.
Men vi ser en hel kartet hvor et kart til 97, b kart til 98,
og hvis vi bla opp ytterligere A, selvfølgelig, kart til 65.
Så dette er bare for å si at det vi har forkynt,
det er denne ekvivalens, blir faktisk tilfelle i virkeligheten.
Slik at en rask modifikasjon av denne.
La meg åpne opp ascii-1.c.
Og legg merke til denne smarte, sortere av, avklaring av dette.
Dette er ascii-1.c, og merke dette sprø ting.
>> Og dette virkelig får hjertet av hva datamaskiner gjør.
Selv om vi mennesker ville teller ikke i form av letters--
Jeg vet ikke begynne å tenke, all right en da b,
og bruke disse til å telle fysiske objekter.
Du kan sikkert si at jeg ønsker å initial noen variabel kalt C--
men jeg kunne ha kalt dette noe-- så c er initialisert til kapital A.
>> Fordi på slutten av dagen, datamaskinen bryr seg ikke hva du lagrer,
det bare bryr seg hvordan du vil å presentere denne informasjonen.
Hvordan vil du at datamaskinen skal tolke dette mønsteret av biter?
Så dette er ikke noe jeg vil generelt anbefale å gjøre.
Det er egentlig bare et eksempel til formidle at du kan absolutt
initial et heltall til en røye.
Fordi undersiden hetten av en char naturligvis
er bare et tall fra 0 til 255.
>> Så du kan sikkert sette det inne i en int.
Og hva dette også viser er at vi
kan konvertere fra ett type til en annen, her,
slutt å skrive det samme.
Og faktisk, dette vil jeg fikse online-- var ment å si dette, igjen, her.
La meg rydde opp dette på nettet, og vi vil se i en online walkthrough etter behov,
det som var ment der.
>> OK.
Så siste eksempelet nå involverer A'er og B, og så får vi
ta ting opp et hakk.
Så med en sin og BS og CS i kapitalisering
og likeverdigheten av disse, la oss ta en titt på dette eksempelet her.
Et annet eksempel kode.
Vi skal åpne en som er allerede gjort, så vi
trenger ikke å skrive det alle ut fra bunnen av.
>> Og legg merke til i påvente vi bruker flere header
filer, blant disse er vår nye venn, string.h.
Nå ser, ved første øyekast, litt kryptisk.
Men la oss se om vi ikke kan resonnere gjennom hva som skjer her.
Først får jeg en streng fra brukeren, og jeg satt som streng i en variabel
kalt s.
Kopiere lime fra før.
I tråd 22, jeg er tydeligvis gjør akkurat det
Jeg gjorde et øyeblikk siden, jeg gjentar i løpet av de tegnene i s.
>> Og de nye triks her bruker strenglengde, den mindreårige optimalisering
for lagring av den strenglengde på n, stedet for å ringe strlen igjen,
og igjen og igjen.
Og bare sjekke at jeg er mindre enn n.
Nå her, ting blir litt interessant.
Men det er bare en søknad av denne samme ny idé.
Hva i engelsk gjør s brakett jeg representerer?
>> PUBLIKUM: Telle hver karakter [uhørbart].
>> DAVID J. MALAN: Telle hvert tegn.
Og enda mer konsist, s brakett jeg representerer hva?
Vil du si.
Ikke for å sette deg på plass her.
>> PUBLIKUM: samt--
DAVID J. MALAN: Så hvis ordet er-- hvis strengen er Zamyla, som starts--
PUBLIKUM: --du håndtere tegnene separately--
DAVID J. MALAN: Good.
Nettopp.
Den hakeparentes notasjon lar deg å få tilgang til hver karakter individuelt,
så s brakett 0 kommer til å være den første tegnet i strengen.
s brakett en kommer til å være den andre, og så videre.
Så spørsmålet jeg spør, her, i denne tilstanden er hva?
Er i'th karakter s større enn eller lik små bokstaver en?
Og hva betyr dette, her, med den doble-tegn?
Målgruppe (SAMMEN): Og.
DAVID J. MALAN: Og.
Det er bare tilsvarer dette.
Og er ikke et nøkkelord i C, må du bruk, grammatikken, tegnet ampersand.
Og dette omvendt, spør er s'er i'th karakter mindre enn eller lik
til små bokstaver z?
Og igjen, her er der å forstå de underliggende
gjennomføring av en datamaskin er fornuftig.
Legg merke til at selv om jeg har dot dot dot der borte,
ser ut som en gjennom z med små bokstaver er alle sammenhengende verdier opp fra 97 på opp.
>> Og samme for store bokstaver som starter på 65 år.
Så takeaway, da, er at på engelsk,
hvordan vil du beskrive hvilken linje 24 gjør?
Yeah?
>> PUBLIKUM: Den 24. er det å sjekke for å se om hver karakter er en små bokstaver.
DAVID J. MALAN: Det er å sjekke om hvert tegn er en liten bokstav.
Så selv mer konsist er i'th karakter s små bokstaver?
Det er alt vi er uttrykker her logisk,
litt kryptisk, men slutt ganske oversiktlig.
Er s'er i'th karakter små bokstaver?
>> Hvis ja, og her er hvor ting få litt tankene bøyd
for bare et øyeblikk, i så fall, gå videre og skrive ut et tegn.
Så dette er bare en plassholder, men hva karakter?
Hvorfor gjør jeg s brakett jeg minus dette uttrykket her?
>> Vel merke til mønsteret her.
De faktiske tallene ikke saken så mye.
Men legg merke til at 97 er hvor langt unna 65?
>> PUBLIKUM: 32.
>> DAVID J. MALAN: 32.
Hvor langt unna er 98 fra 66?
>> PUBLIKUM: 32.
>> DAVID J. MALAN: Little c fra store C?
32.
Så det er 32 hopp fra en bokstav til en annen.
Så ærlig jeg kunne forenkle dette til det.
Men da er jeg like hardt koding dette lave nivået forståelse
at ingen leser er noensinne kommer til å forstå.
Så jeg kommer til å general det som, jeg vet de små bokstavene er større.
Jeg vet de store bokstavene er mindre verdier, ironisk nok.
>> Men dette er effektivt tilsvarer sier subtrahere 32 fra s brakett jeg.
Så i sammenheng med disse bokstaver, om bokstaven
skjer for å være en, små bokstaver en, og jeg trekke fra 32,
Hvilken effekt har det har, matematisk, på små bokstaver en?
PUBLIKUM: Capitalizes--
DAVID J. MALAN: Kapitaliserer det.
Og ja, dette er grunnen til at vår Programmet kalles kapitalisere null.
Dette programmet enten kapitaliserer et brev,
etter å ha sjekket om det er faktisk en liten bokstav.
Ellers i linje 30, hva gjør jeg hvis det er ikke en liten bokstav som jeg er
ser på ved en spesiell iterasjon i loop.
Bare skrive det ut.
>> Så ikke endre ting det er ikke engang små bokstaver.
Begrense deg til lite et gjennomspill litt z.
Nå er dette ganske uforståelige.
Men ved slutten av dagen, denne er hvordan vi, en gang i tiden,
måtte gjennomføre ting.
Hvis jeg i stedet åpne kapital en, oh Takk Gud.
Det er en funksjon kalt til øvre som kan
gjøre alt vi nettopp gjorde på et relativt lavt nivå.
>> Nå til videregående er interessant fordi den er deklarert i en fil,
og du ville bare vite dette ved å sjekke dokumentasjon,
eller blir fortalt, sier i klassen, der den finnes, i en fil kalt ctype.h.
Så dette er en annen ny venn av oss.
Og til øvre gjør akkurat hva navnet antyder.
>> Du kan sende inn, som et argument, mellom disse parentes, noen tegn.
Jeg kommer til å passere i i'th karakter S ved hjelp av vårt fancy ny notasjon
involverer hakeparenteser.
Og ta en gjetning, hva er avkastningen Verdien av å over tilsynelatende kommer
å være?
En stor bokstav.
>> Så hvis jeg passerer små bokstaver a, forhåpentligvis, per definisjon av til videregående,
det kommer til å returnere en store bokstaver A. Ellers
hvis det ikke er en liten bokstav i For det første, jeg bare skrive det ut.
Og ja, legg merke til andre venn her.
Ikke bare for å over eksisterer, men er lavere, noe
faktisk svar på det spørsmålet for meg.
>> Nå hvem skrev disse tingene, 10s år siden, vet du hva?
Implementert for å øvre og er senke bruker kode som dette.
Men igjen, i samsvar med denne ideen om å abstrahere bort,
liksom, lavere nivå gjennomføring detaljer.
Og stå på skuldrene til folk som kom før oss, ved hjelp av funksjoner
som til øvre og lavere, hvilke fantastisk nok er pent
heter til å si hva de gjør, er en fantastisk paradigme å adoptere.
>> Nå viser det seg at hvis jeg leser mannen siden for, sier, til øvre,
Jeg lærer noe annet.
Så mannen toUpper.
Det er litt overveldende.
Men legg merke til, her er det omtale av topptekstfilen som jeg skal bruke.
Som en side, fordi dette er misvisende, funksjonen
bruker ints i stedet for tegn på grunn av feilkontroll.
Men vi vil kanskje komme tilbake til det i fremtiden.
>> Men legg merke til, her, til øvre konvertitter bokstaven c til store bokstaver hvis mulig.
Så det er ganske grei.
Og nå la oss være litt mer spesifikk.
La oss se på den delen av Mannen siden under returverdi.
Verdien som returneres er at av den konverterte brev.
Eller C, hvis omdannelsen var ikke mulig,
hvor c er den opprinnelige inngang.
Som jeg vet herfra, fra argumentet til å øvre.
>> Så hva er det takeaway av dette?
Verdien som returneres er at av den konverterte brevet,
eller c, originalbrev, hvis omdannelsen var ikke mulig.
Hva forbedring kan jeg derfor gjøre til min kode design?
Yeah?
>> PUBLIKUM: Du kan fjerne annet.
DAVID J. MALAN: Jeg kan fjerne annet uttalelse,
og ikke bare den andre setningen.
>> PUBLIKUM: Du kan fjerne [uhørbart].
>> DAVID J. MALAN: Jeg kan fjerne hele gaffel
i veien, hvis helt annet.
Så ja, la meg åpne den endelige versjon av denne,
kapital-2 og legge merke til hvor, hvis du vil, sexy, koden er nå å få,
i at jeg har redusert fra noen syv eller så linjene til bare fire,
funksjonaliteten som jeg ment ved å ringe til øvre,
passerer s brakett i, og utskrift ut, med eksempel% c,
det bestemt karakter.
>> Nå uten tvil, det er en bug, eller i det minste risikoen for en bug,
i dette programmet.
Så bare for å komme tilbake til en tidligere takeaway,
hva skal jeg nok også gjøre i dette programmet for å gjøre det mer robust,
slik at det er ingen måte det kan krasje, selv i sjeldne tilfeller?
PUBLIKUM: Pass på at det ikke er NULL.
DAVID J. MALAN: Pass på at det ikke er NULL.
Så egentlig, for å gjøre denne super riktig, skal jeg gjøre noe sånt,
hvis s er ikke null, så gå videre og utføre
disse linjene med kode, som Da kan jeg innrykk sånn,
og deretter sette i min nære spenne.
Så godt å knytte sammen de to ideer.
Yeah?
PUBLIKUM: Kan du bruke en gjøre mens loop, i stedet?
DAVID J. MALAN: Kunne Jeg gjør en gjør mens loop?
PUBLIKUM: --du vil være sikker at du faktisk [uhørbart].
DAVID J. MALAN: Kunne du bruker en gjør mens?
Korte svaret, nei.
Fordi du er i ferd med å introdusere et annet hjørne tilfelle.
Hvis strengen er av null lengde.
Hvis for eksempel, jeg bare slo Enter, uten noen gang å skrive Zamyla.
Jeg kommer til å levere deg tilbake en faktisk string, som vi vil til slutt se,
som har null tegn.
Det er fortsatt en streng, det er bare super kort.
Men hvis du bruker en gjør stund, du kommer til å blindt
prøver å gjøre noe med respekt til denne strengen,
og ingenting kommer til å være der.
>> PUBLIKUM: Vel, hvis du gjorde gjøre [uhørbart] mens s--
DAVID J. MALAN: Å jeg ser, holde å få en streng fra brukeren.
Så korte svaret, du kan, og holde plaging
dem til å gi deg en streng som er kort nok til å passe i minnet.
Absolutt.
Jeg valgte bare ikke til.
Hvis de ikke gi meg strengen jeg ønsker, jeg slutte, jeg gir opp.
Men helt, og for det formål du kan absolutt gjøre det.
>> Så bibliotekets header filer som vi er nå kjent med er disse, her.
Standard I / O, CS50.h, string.h, ctype.h, og det er faktisk andre.
Noen av dere har oppdaget regnestykket biblioteket i math.h.
Men la meg introdusere deg, nå, denne ressursen som CS50 ansatte, Davin,
og Rob, og Gabe bestemt har satt sammen.
Det vil snart koblingen på kursets hjemmeside.
Det kalles CS50 referanse.
>> Som bare for å gi deg en rask Smaken av den, virker som følger.
La meg gå til reference.cs50.net.
Du vil se på venstre hånd side en overveldende liste
av funksjoner som kommer med c.
Men hvis jeg bryr meg, for øyeblikket, om noe sånt strlen,
Jeg kan skrive det der.
Det filtrerer ned på listen til akkurat det jeg bryr meg om.
Jeg kommer til å klikke den.
Og nå til venstre, du får se hva vi håper
er en mer enkel, human vennlig forklaring på hvordan
Denne funksjonen fungerer.
>> Returnerer lengden på en streng.
Her er et sammendrag, her er hvordan du bruke det i form av topptekstfilen,
og i form av hva funksjonen ser ut i form av sine argumenter.
Og så her, avkastning lengden på en streng.
Men for de av dere mer komfortabel, kan du faktisk klikke mer skjegg,
, og innholdet i denne siden, nå vil endre
å være standardverdiene av hva du få ved å bruke mannen siden.
>> Med andre ord, CS50 referanse er en forenkling
av man-sidene av de ansatte, for studenter.
Spesielt de som er mindre komfortable og i mellom, slik at du
trenger ikke å prøve å vikle tankene dine rundt, ærlig,
noen ganske kryptisk syntaks og dokumentasjon gang.
>> Så hold det i tankene i dagene som kommer.
Så her, igjen, er en Zamyla.
La oss nå stille et spørsmål som er litt mer menneskelig tilgjengelig.
Takk til Chang, som har vært skriver flere elefanter
nonstop for de siste dagene.
Vi har en mulighet til å gi minst en av dem bort.
Hvis vi kunne få bare ett frivillig å komme på opp til tegne på skjermen.
Hva med her?
>> Kom opp.
Hva er ditt navn?
ALEX: Alex.
DAVID J. MALAN: Alex.
Greit.
Alex, kom opp.
Vi er i ferd med å se din håndskrift på skjermen her.
Greit, hyggelig å møte deg.
>> ALEX: Nice du møter deg.
>> DAVID J. MALAN: All right.
Så, super enkel øvelse.
Bar er ikke høy til få en elefant i dag.
Du spiller rollen som getstring.
Og jeg skal bare fortelle deg strengen som du har fått.
Og anta at du, getstring, har blitt kalt.
Og den menneskelige, som meg, har skrevet i Zamyla, Z-A-M-Y-L-A.
Bare gå videre og skrive Zamyla på skjermen som om du har fått det
og lagres et eller annet sted i minnet.
>> Forlate rommet for hva som vil være flere andre words-- det er OK, fortsett.
>> [Latter]
>> Så Zamyla, Excellent.
Så nå anta at du, getstring, kalles igjen.
Og derfor gir jeg deg, på tastatur, med et annet navn, Belinda.
Greit.
Og nå neste gang getstring er heter, jeg skriver i noe sånt som Gabe,
G-A-B-E. Du er virkelig å ta til hjerte random access memory.
Som trekker alt helt tilfeldig.
OK.
>> [Latter]
ALEX: Beklager min håndskrift er dårlig.
DAVID J. MALAN: Nei, det er OK.
Og hva med Rob, R-O-B. OK.
Good.
Slik at jeg ikke forventer at du ville slags lå ting ut på denne måten.
Men vi kan gjøre dette arbeidet.
Så hvordan gikk dere frem for legging ut disse tegn i minnet?
Med andre ord, hvis vi tenker på dette rektangulær svart skjerm
som representerer en datamaskinens RAM, eller minne.
>> Og husker at RAM er bare en hel haug av bytes,
og bytes er en hel haug med biter.
Og biter er liksom implementert, generelt
med noen form for elektrisitet i maskinvare.
Så det er liksom den lagdeling vi har snakket om
og kan nå ta for gitt.
Hvordan gikk du frem bestemmer hvor du skal skrive
Rob versus Gabe versus Belinda versus Zamyla?
>> ALEX: Jeg bare gjorde det i pålegg om at du fortalte meg.
>> DAVID J. MALAN: Og det er sant.
Men hva styrt hvor du setter Belinda navn og Gabe navn?
>> ALEX: Ingenting?
DAVID J. MALAN: [ler] Så det fungerer, er det helt greit.
Så datamaskiner er lite mer ryddig enn det.
Og så når vi implement-- bli der for bare en moment-- når vi faktisk
gjennomføre noe sånt getstring i en datamaskin,
Zamyla kan bli lagt ut ganske mye som du gjorde på skjermen, der.
>> Og hva er nøkkelen til å legge merke til her, hva Alex gjorde,
er det er slags en avgrensning blant hvert av disse ordene, ikke sant?
Du skrev ikke Z-A-M-Y-L-A-B-E-L-I-N-D-A-G-A-B--
med andre ord, det er en slags skillelinje som synes å være,
liksom, tilfeldig avstand mellom disse forskjellige ordene.
Men det er bra, fordi vi mennesker kan nå
visualisere at disse er fire forskjellige strenger.
Det er ikke bare én sekvens av mange tegn.
Så en datamaskin, da, i mellomtiden, kan ta en streng som Zamyla,
sette hver av disse brevene innsiden av en byte minne.
Men det tallet er mye større, selvfølgelig enn seks tegn.
>> Det er en hel haug med RAM.
Og så heretter, dette rutenett av boksene kommer
å representere hva Alex bare gjorde her på skjermen.
Og nå, Alex, kan vi tilby deg en blå eller en appelsin elefant fra Chang.
ALEX: Jeg tar en blå elefant.
DAVID J. MALAN: En blå elefant.
Så en stor applaus, hvis vi kunne, for Alex her.
>> [APPLAUSE]
>> ALEX: Takk.
DAVID J. MALAN: Takk.
Så takeaway er at, selv om mønster slags endret seg over tid, her
på bordet, var det denne avgrensning mellom de ulike strenger
at Alex fikk for oss.
Nå datamaskiner, ærlig, kunne gjøre det samme.
De kunne slags plop strenger hvor som helst i RAM.
Her oppe, over her, her nede, her nede.
>> De kunne gjøre akkurat det.
Men, selvfølgelig, det er trolig ikke den beste planlegging.
Høyre?
Hvis jeg fortsatte å be Alex til få navn, trolig han hadde
sette noen mer her nede, kanskje opp her, her, her, til slutt
over her.
Men med litt mer planlegging, absolutt, vi kunne legge ting ut mer renslig.
Og ja, det er hva en datamaskin gjør.
>> Men fangsten er at Hvis den neste strengen jeg får
etter Zamyla er noe som Belinda,
foreslå hvor vi kan skrive bokstav b med hensyn til dette rutenettet?
Hvor vil du reise?
Til høyre for den a, under z, under en?
Hva ville din første instinkter være?
PUBLIKUM: Under z.
DAVID J. MALAN: Så under z.
Og det er ganske grei, ikke sant?
Det er litt artig, det er hva vi gjør på et tastatur når vi trykker Enter,
eller en e-post når du gjør en punktliste over ting.
Men realiteten er at datamaskiner prøve å være mer effektiv,
og stappe sikkert like mye data til RAM som mulig,
slik at du ikke kaster bort noen bytes.
Slik at du ikke kaster bort noen skjermen eiendomsmegling.
Og problemet, skjønt, er at hvis vi bokstavelig talt la brevet
b etter en, hvordan skal vi vet hvor Zamyla navn slutter
og Belinda navn begynner?
Så du mennesker bare foreslått, vel, trykke Enter, egentlig.
Sett det ned nedenfor.
Eller som Alex gjorde, bare begynne å skrive neste navn under den foregående,
og under den ene, og deretter under den.
Det er et blikkfang.
>> Datamaskiner har en annen blikkfang, men det er litt mer konsis.
Det er denne funky karakter.
Skråstrek, 0, som er kanskje minner om backslash n,
og så videre, nå.
De spesielle escape-sekvenser.
Backslash 0 er veien for som representerer åtte null biter på rad.
0000 0000.
>> Måten du uttrykker det er ikke å treffer tallet null på tastaturet,
fordi faktisk det er en ASCII røye.
Det ser ut som et tall, men er faktisk et desimaltall
som representerer den sirkulære glyph, den sirkulære skriftsnitt.
I mellomtiden, backslash null betyr, bokstavelig talt
sette åtte null bytes her for meg.
>> Så dette er noe vilkårlig.
Vi kunne har brukt noe mønster av biter, men verden
besluttet noen år siden, at for å representere
i enden av en streng i minnet, bare sette en hel haug med nuller.
Fordi vi kan oppdage det.
Nå som betyr at ingen bokstav i alfabet kan representeres med nuller.
>> Men det er OK, har vi allerede sett at vi bruker 65 på opp i 97 på opp.
Vi kom ingen vei Nær alle nuller.
Så Belinda i datamaskinens minne faktisk kommer til å gå her.
Jeg har trukket den i gult bare å trekke vår oppmerksomhet til det.
Og legg merke til, også, dette er helt vilkårlig.
Jeg har tegnet det som et rutenett.
Som, er RAM bare noen fysisk objekt.
Det trenger ikke nødvendigvis ha rader og kolonner, per se.
Det har nettopp fått en hel haug med bytes implementert i maskinvare eller annen måte.
Men hvis etter Belinda jeg skrevet i Gabe navn,
han kommer til å ende opp her i minnet, og hvis jeg skrev i Daven navn,
for eksempel, han kommer til å ende opp her.
Og jeg kan fortsette å skrive enda flere navn.
>> Dessverre, hvis jeg prøver å skrive et super langt navn,
Jeg kan til slutt gå tom for minne.
I så fall, er getstring kommer til å returnere NULL, som vi sa.
Men heldigvis, i hvert fall i denne visuelle her, vi fikk ikke fullt så langt.
>> Nå hva som er hyggelig er at dette generelle ideen om å behandle ting
som å være i esker er representant for en funksjon i C
og en rekke språk, kjent som en matrise.
En matrise er en annen type av data.
Det er en datastruktur, hvis du vil.
Struktur i den forstand av det egentlig, slags, ser ut som en boks, i hvert fall
i ditt indre øye.
En matrise er en sammenhengende sekvens av identiske datatyper,
rygg mot rygg mot rygg mot rygg.
>> Så en streng, i andre ord, er en rekke tegn.
En rekke tegn.
Men det viser seg at du kan ha matriser med bunter av ting.
Faktisk kan vi sette enda tall i en matrise.
Så i hvilken form vi kommer til å starte
erklære disse dataene struktur som er kjent som en matrise
er også tenkt å bruke hakeparenteser.
Men disse hakeparenteser skal har annen betydning i denne sammenheng.
>> Og la oss se det som følger.
Anta at jeg åpnet opp en ny fil her.
Og jeg lagre dette som ages.c.
Og jeg skal lagre dette i mappen min her.
Og nå kommer jeg til å gå videre og begynner å skrive noe
som inkluderer CS50.h, inkluderer stdio.h, int main annullert.
Og så innsiden av her, vil jeg å først ha en int kalt alder.
>> Og jeg kommer til å bruke det for å få en int fra brukeren for hans eller hennes alder.
Men dette programmet er ment å bli brukt av flere mennesker, uansett kontekst.
Jeg har en linje av mennesker.
Alle av dem må skrive inn deres alder for kanskje noen, vet jeg ikke,
konkurranse, eller hendelse at de har kommet for.
Så neste person, jeg trenger en annen variabel.
>> Fordi hvis jeg bare gjøre alder får getInt, det er
kommer til å clobber, eller overskrive den forrige personens alder.
Så det er ikke bra.
Så mitt første instinkt kan være, oh, ok,
hvis jeg ønsker å få flere folks ages-- la oss kalle dette alder1,
int Age2 får int, blir int Alder3 getInt.
Og nå kommer jeg til å bruke noen pseudokode her.
>> Gjør noe med disse tallene.
Vi vil forlate for en annen dag hva vi gjør det, fordi vi bare
omsorg for øyeblikket om alder1, Age2, Alder3.
Dessverre, når jeg kompilere dette programmet
og sette den foran faktiske brukere, hva er fundamentalt dårlig design
avgjørelsen jeg synes å ha gjort?
Yeah?
PUBLIKUM: [uhørbart]
DAVID J. MALAN: Yeah, Jeg har ikke engang forsøkt
å finne ut hvor mange aldre kan jeg faktisk bryr seg om?
Hvis jeg har færre enn tre personer her, og derfor færre enn tre aldre,
Jeg er fortsatt blindt forventer tre.
Gud forby fire personer møter opp.
Mitt program bare vil ikke engang støtte dem.
>> Og så dette, lang historie Kort sagt, er ikke en god vane.
Høyre?
Jeg ble egentlig kopiering og lime kode og bare tweaking
variabelnavnet.
Og, herregud, hvis du hadde, ikke tre aldre, men 10 eller 100, eller til og med 6500
studenter, for eksempel.
Dette er ikke til å være spesielt elegant kode, eller bærekraftig.
Du er nødt til å omskrive programmet hver gang
ditt antall personer endringer.
>> Så heldigvis, i vår faktiske ages.c fil for i dag,
vi har en mer smart løsning.
Først kommer jeg til å låne konstruere vi har brukt et par ganger,
dette gjøre mens loop, for å få antall personer i rommet.
Jeg skal bare plage brukeren, igjen og igjen, helt til han eller hun gir meg
en verdi for n som er et positivt heltall.
>> Jeg kunne ha brukt, sist tid komme positive int.
Men vi har ikke det på ordentlig, så jeg gikk videre
og re implementert denne ideen.
Nå her nede, er dette den nye triks.
I linje 27, som kommentarene i linje 26 antyder,
erklære en matrise der til å lagre alle alder.
>> Så hvis du ønsker å få, ikke en int, ikke to ints, men en hel haug med ints.
Spesielt n heltall, var n kanskje være tre, kanskje 100, kanskje 1000.
Syntaksen, ganske enkelt, er å si, hva datatype vil du ha?
Hva ønsker du å ringe som del av minne?
Hva vil du kalle rutenettet som ser ut som dette billedlig?
>> Og i parentes her, sier du hvor stor du vil matrisen til å være.
Og så tidligere, da jeg sa Syntaksen er litt annerledes her,
vi fortsatt bruker hakeparenteser, men når jeg erklære en matrise,
antall innsiden av hakeparenteser midler
hvor stor vil du at array å være.
>> Derimot, når vi bruker s brakett jeg et øyeblikk siden, s, en streng,
er faktisk en rekke tegn, men når du ikke erklære en variabel,
som med dette søkeordet her, du bare komme
en bestemt indeks, en spesifikk element fra denne matrisen.
Når vi vet det, resten av dette er enkel.
Hvis nye jeg først kommer til å skrive ut hva er en alder av person nummer jeg.
Der jeg bare si person nummer én, person nummer to, person nummer tre.
>> Og jeg bare gjør aritmetikk, slik at som normale mennesker,
vi teller fra en for dette program, og ikke fra null.
Så jeg kaller getint, men jeg lagrer svaret i aldre brakett jeg.
Hvilken er den i'th alder i matrisen.
Så mens sist gang vi var behandlende disse boksene som tegn for Zamyla navn,
og andre.
Nå, disse boksene representerer 32 biter, eller fire byte
der vi kan lagre en int, en int, en int.
Alt som igjen, er de samme datatype.
>> Nå gjør jeg noe dumt, som tiden går, bare
å rettferdiggjøre å skrive dette programmet.
Og deretter ned her, jeg igjen iterere over matrisen si et år fra nå,
person nummer én vilje være noe år gammel.
Og for å finne ut at math-- Jeg mener, dette
er ikke veldig komplisert arithmetic-- Jeg bare legge en til deres alder.
Bare for å demonstrere, igjen, denne.
>> Akkurat som jeg kan indeksere inn i en streng, s, så kan jeg indeksen inn en rekke aldre,
sånn der.
Så hvor dette kommer til å være å ta oss?
Så vi får se, til slutt, en få ting i dagene som kommer.
En, hele denne tiden, når skrive dine egne programmer,
som Mario, grådige, kreditt.
Du har vært å skrive navnet på programmet og trykker Enter.
Og så får brukerens input.
>> Med getString, getInt, getLongLong, eller lignende.
Men det viser seg at C støtter noe som kalles kommandolinje
argumenter, som kommer til å gi oss faktisk få på ordene som du skriver,
på den blinkende teksten, etter programmets navn.
>> Så i dagene som kommer, du kan skrive noe sånt som Caesar,
eller ./caesar nummer 13, etterpå.
Vi får se hvordan det fungerer.
Fordi ja, i Problemet satt to, vi er
kommer til å introdusere deg til litt noe
minner om Ralphie utfordre tidligere av kartografi.
Kunsten scrambling informasjon.
Dette, i virkeligheten er meget minner om hva Ralphie gjorde.
>> Dette er et eksempel på en krypterings algoritme som heter ROT13, R-O-T 13.
Hvilket betyr ganske enkelt rotere bokstaver i alfabetet 13 plasser.
Og hvis du gjør det, vil du se nå hva er, kanskje, en kjent frase.
Men måten vi kommer til å bruke dette til syvende og sist er mer generelt.
>> I P satt to, i standardutgaven, du vil implementere et par koder,
en som heter Cæsar, en som heter Vigenère.
Begge er rotasjons chiffer, ved at en eller annen måte du
slå ett brev til en annen bokstav.
Og Caesar er super enkel.
Du legger en, legg 13, eller noen tall opp til 26.
Vigenère gjør det på en per brev basis.
Så Vigenère, som du ser i spec, er sikrere.
>> Men på slutten av dagen hva du vil være å implementere og P satt to,
er at nøkkelen som du bruker både for kryptering og dekryptering.
Henvisende til fremgangsmåten for å dreie ren tekst, noen opprinnelige meldingen,
inn cypher tekst, som er noe kryptert.
Og deretter dekryptere det igjen.
>> I hacker utgave, i mellomtiden, vil du være
oppgave med noe lignende i ånden, hvor vi vil gi deg
en fil, fra en typisk Linux, eller Mac eller Unix datamaskin kalt etsy
passord, som inneholder en hel haug av brukernavn og passord.
Og disse passordene har alt blitt kryptert, eller hashet,
så å si, mer riktig som du ser på spec.
>> Og hacker utgaven vil utfordre du med å ta en inngang som dette,
og knekke passord.
Det er, finne ut hva menneskets passord faktisk var.
Fordi, ja, passord er generelt ikke er lagret i den klare,
og generelt passord bør være vanskelig å gjette.
Det er ofte ikke tilfelle.
>> Og det jeg trodde vi ville gjøre er konkludere med et par minutter
blikk på en spesielt dårlig valg av passord
fra en film du kanskje husker fondly.
Og hvis ikke, bør du leie.
>> [VIDEOAVSPILLING]
>> -Helmet, Du djevel, hva skjer?
Hva gjør du til min datter?
>> -Permit Meg å introdusere strålende ung plastisk kirurg,
Doctor Phillip Schlotkin.
Den største nese jobb mann i hele universet og Beverly Hills.
>> -Din Høyhet.
>> -Nose Jobb?
Jeg forstår ikke.
Hun har allerede hatt en nese jobb.
Det var hennes søte 16 til stede.
>> Nei, det er ikke hva du tror.
Det er mye, mye verre.
Hvis du ikke gi meg Kombinasjonen av luftskjold,
Legen Schlotkin vil gi datter tilbake sin gamle nesen.
- [Gisp] Nooooooooooooo.
Hvor fikk du den?
>> -Greit.
Jeg skal fortelle, jeg skal fortelle.
>> Nei, pappa, nei.
Du må ikke.
>> -Du Har rett min kjære.
Jeg vil savne den nye nesen.
Men jeg vil ikke fortelle dem kombinasjon uansett hva.
>> -Veldig Godt.
Doctor Schlotkin, gjør din verste.
>> -Min Nytelse.
>> -Ingen!
Vent, vent.
Jeg skal fortelle.
>> -Jeg visste at det ville fungere.
Greit, gi den til meg.
>> -The Kombinasjonen er en.
>> -Ett.
-To.
-Tre.
-Fire.
-Fem.
-Så den kombinasjonen er en, to, tre, fire, fem.
Det er det dummeste kombinasjonen Jeg hørt i mitt liv.
Det er den type ting en idiot ville ha på sin bagasje.
>> Takk, din høyhet.
>> [Ekstern CLICKS]
>> Hva gjorde du?
>> -Jeg Slått av veggen.
>> Nei, det gjorde du ikke, du slått av hele filmen.
>> -Jeg må har trykket på feil knapp.
>> -Vel, Sette den på igjen!
Sett filmen tilbake på!
>> Ja, sir!
Ja, sir.
-La Igjen, Arnold.
Kom, Gretchen.
Selvfølgelig vet du jeg vil nødt til å fakturere deg for dette.
-Vel?
Fungerte det?
Hvor er kongen?
>> -Det arbeidet, sir, vi har kombinasjonen.
-Flott.
Nå kan vi ta hver siste åndedrag av frisk luft fra planeten Druidia.
Hva er kombinasjonen?
>> -Ett, To, tre, fire, fem.
>> -Ett, To, tre, fire, fem?
Ja.
-Det er utrolig.
Jeg har den samme kombinasjonen på bagasjen min.
Forbered Spaceball 1 for umiddelbare avgang.
>> Ja, sir.
>> -Og Endre kombinasjonen på bagasjen min.
[Dørlukkingssystem SOUND]
[CLINK DØRER TREFFE HJELM]
-Ahh.
[END VIDEOAVSPILLING]
DAVID J. MALAN: Det er det for CS50, vi får se deg neste uke.
FORTELLER: Og nå, Deep Tanker, etter Daven Farnham.
>> Daven FARNHAM: Coding i C er så mye vanskeligere enn Scratch.
printf, Skrape var en løgn.
>> [LAUGHTER soundbite]