>> [Musik spiller]
David J. MALAN: Okay.
Dette er CS50, og dette er slutningen af ​​uge 2.
Så i dag, vi vil at fortsætte vores udseende
på, hvordan vi repræsenterer tingene under hood-- bevæger sig væk
fra numre som heltal og kommeværdier
og fokus på strygere og i sidste ende mere interessante programmer.
Men vi vil også tage et kig på en par domæne-specifikke problems--
hvoraf den første vil være involverer kryptografi,
kunsten scrambling oplysninger hvor du ser ovenfor her
er et billede af Radio Orphan Annie hemmelig dekoder ring fra gårsdagens.
>> Det er faktisk meget primitiv form og børnevenlig form for cryptopgraphy
hvorved denne ring har to disks-- en indvendig og en uden.
Og ved at dreje en af ​​dem, du kan væsentlige line up breve Like A
gennem Z med andre bogstaver ligesom B gennem A. Med andre ord,
du kan bogstaveligt talt rotere alfabetet, derved kommer op med en kortlægning fra
breve til breve, således at hvis du ønskede at sende en hemmelig besked
til en som Annie, kan du skrive ned din besked og drej
bogstaverne, hvorved hvis du mener at sige "A", du i stedet sige "B"
du mener at sige "B" du i stedet sige "C" -
eller noget lidt mere smart end at-- og så i sidste ende,
så længe Annie har denne dekoder ring, kan hun afkode meddelelsen.
Nu kan du huske, i virkeligheden, at dette blev anvendt i en meget berømt film,
spiller ad nauseum under juletiden.
Lad os tage et kig her.
Ralphie Parker: "Lad det kendt af alle i sammendrag
at Ralph Parker herved udpeges et medlem af Little Orphan Annie Secret
Circle og er berettiget til alle de æresbevisninger og fordele forekommende dertil. "
>> Ralphie Parker (indtaling): Signeret Little Orphan Annie.
Medunderskrives, Pierre André!
I blæk.
Honors og fordele, allerede i en alder af ni.
>> [Musik spiller]
>> [RADIO CHATTER]
Ralphie Parker: Kom nu.
Lad os komme videre med det.
Jeg har ikke brug for alt det jazz om smuglere og pirater.
Radiovært: Lyt i morgen nat for den afsluttende eventyr
af The Black Pirate Ship.
Nu er det tid til Annies Hemmelig besked til dig medlemmer
af Secret Circle.
Husk børn, kun medlemmer af Annies Secret Circle
kan afkode Annies hemmelig besked.
>> Husk, at Annie afhængig af dig.
Sæt dine ben til B-2.
Her er message-- 12, 11, 2--
Ralphie Parker (indtaling): Jeg er i mit første hemmeligt møde.
RADIO SPEAKER: --25, 14, 11, 18, 16--
Ralphie Parker (indtaling): Åh, Pierre var i stor stemme i aften.
Jeg kunne fortælle, at aftenens budskab var virkelig vigtigt.
>> RADIO SPEAKER: --3 25.
Det er en besked fra Annie selv.
Husk, at ikke fortælle nogen.
>> [Pustende]
Ralphie Parker (indtaling): Halvfems sekunder senere, er jeg
i det eneste rum i hus, hvor en dreng på ni
kunne sidde i fred og afkode.
Ah.
"B"
>> [Griner]
>> Ralphie Parker (indtaling): Jeg gik til den næste.
"E"
Det første ord er "være".
Ja!
Det kom nemmere nu.
"U."
>> [Griner]
>> RANDY PARKER: Øv, kom nu, Ralphie.
Jeg må gå!
>> Ralphie Parker: Jeg kommer lige ned, Ma.
Gee Whiz.
"T." "O." "Vær sikker til. "" Vær sikker på at "hvad?
Hvad var Little Orphan Annie prøver at sige? "Vær sikker på at" hvad?
MOR: Ralphie, Randy har fået til at gå.
Vil du venligst komme ud?
>> Ralphie Parker: Okay, mor!
Jeg kommer lige ud!
Ralphie Parker (indtaling): Jeg var ved at blive tættere på nu.
Spændingen var forfærdeligt.
Hvad var det?
Den skæbne af planeten kan hænge i balance.
>> MOR: Ralphie, Randys kom til at gå!
>> Ralphie Parker: Jeg kommer lige ud, for skriger højt!
Ralphie PARKER (Fortælle): Almost there!
Mine fingre fløj!
Mit sind var en stål fælde.
Hver pore vibrerede.
Det var næsten klar!
Ja!
>> Ralphie Parker: "Vær sikker at drikke din Ovaltine. "
Ovaltine?
En mærkværdige kommerciel?
>> [Musik spiller]
>> Ralphie Parker: Søn af en tæve.
>> [LAUGHING]
>> David J. MALAN: Så da er et indblik i, hvad kryptografi
kan være for denne-- en drikke fra gårsdagens.
Så en hurtig meddelelse.
Hvis du er fri dette Fredag ​​kl 13:15 og ville
gerne slutte sig til os CS50 frokost, hoved til denne webadresse her.
Komme først, først tjene som sædvanlig.
Men over tid, vil vi sørge for, at de fleste nogen, der gerne vil deltage
kan planlægge-wise.
>> Så strenge.
Vi har Zamyla-- hvem du nu har mødt mest sandsynligt
i Problem Set 1-- hvis navn er stavet således.
Og formoder du har skrevet sit navn ind i et edb-program, der er
bruge noget lignende getString.
For at hente disse tastetryk, hvordan
vi går om repræsenterer en streng, et ord, et stykke,
eller flere bogstaver som disse her?
>> Vi talte sidste gang om heltal og problemer
der opstår med heltalsoverløb og kommeværdier
og problemer, opstå inden præcision.
Med strygere, vi i det mindste har en smule mere fleksibilitet
fordi strings-- bare i den virkelige verden-
kan være en temmelig vilkårlig længde.
Temmelig kort, temmelig længe.
Men selv da, vil vi finde, at computere kan undertiden
løbe tør for hukommelse og ikke engang gemme en stor nok streng.
>> Men for nu, lad os begynde at visualisere en streng som noget i disse kasser
her.
Så seks sådanne kasser, som hver repræsenterer et tegn eller "char".
Så huske på, at "char" - c-h-a-r-- er en af ​​de indbyggede datatyper i C.
Og hvad er rart er, at du kan bruge den slags som en byggesten,
en brik, hvis du vil, for at danne en større type data, vi vil fortsætte
at kalde en "streng".
>> Nu, hvad er nyttigt om at tænke om ting som strenge i denne måde?
Tja, det viser sig, at vi kan faktisk udnytte denne struktur
til rent faktisk at få adgang til enkelte tegn i en temmelig ligetil måde.
Jeg har tænkt mig at gå videre og skabe en fil kaldet "stringzero.c"
men du kan kalde det hvad du vil.
Og på kursets hjemmeside er allerede dette eksempel i forvejen,
så du behøver ikke at skriv alting ud.
>> Og jeg har tænkt mig at gå videre og først gøre int main tomrum.
Og inden for et par dage, vi vil begynde at drille hinanden
hvad tomrum er her, hvorfor det er int ud for vigtigste, og så videre.
Men for nu, lad os fortsætte at kopiere indsætte det.
>> Jeg har tænkt mig at erklære en streng kaldet sek.
Og jeg har tænkt mig at vende tilbage fra GetString hvad brugeren typer i.
Dette vil være en simpel programmet ingen instruktioner,
Jeg skal bare blindt forventer, at brugeren ved
hvad man skal gøre for at holde det simpelt.
>> Og nu jeg har tænkt mig at have en for-løkke.
Og inde i mit for-løkke er jeg nødt til int i får nul.
Og jeg er, igen, bare en konvention, et indeks variabel til optælling,
men jeg kunne kalde dette hvad jeg vil.
Jeg har tænkt mig at gøre, jeg er mindre than-- godt Zamyla navn er seks bogstaver.
Så jeg har tænkt mig at hårdt kode, der nu.
>> Og derefter jeg ++.
Og nu inde i disse krøllede seler jeg tænkt mig at gøre printf,
og jeg ønsker at udskrive et tegn ad gangen.
Så jeg har tænkt mig at bruge% c til måske for første gang.
Og så jeg ønsker at udskrive hver tegn på sin egen linje.
Så jeg har tænkt mig at sætte en lille backslash n der.
Luk citat.
>> Og nu jeg ønsker at gøre noget her.
Jeg ønsker at udskrive bestemt bogstav i strengen,
s, da jeg iteration fra nul på op til seks.
Med andre ord, jeg ønsker at udskrive i'te karakter filtre.
Nu hvordan kan jeg gøre dette?
>> Nå ligesom kasserne i denne repræsentation her,
slags, fremmane begrebet boksning bogstaver i, kan du ligeledes gøre det
syntaktisk i C ved blot at angive, Jeg vil udskrive s'er i'te karakter.
Brug de firkantede parenteser på computerens tastatur
at der på et amerikansk tastatur er generelt over dit afkast nøgle.
>> Så det er ikke helt rigtigt endnu, som du måske har bemærket.
Men jeg har tænkt mig at slags blindt mase her.
Og jeg har tænkt mig at gøre gøre streng 0.
Men før jeg gør det, lad os se om vi kan ikke forudse nogle almindelige fejl.
Er det kommer til at kompilere?
Nej, jeg mangler en hel masse ting.
Biblioteker jeg hørt.
>> Så som header-filer jeg måske ønsker at tilføje her?
Ja.
>> PUBLIKUM: Du skal standard I / O [uhørligt]
>> David J. MALAN: Excellent.
Så jeg har brug for standard I / O. For hvad formål ønsker jeg standard I / O?
For printf.
Så omfatte stdio.h.
Og du også foreslå, at jeg inkluderer Den CS50 biblioteket hvorfor?
At have strenge.
Så vi vil se, hvad CS50 bibliotek gør
at skabe denne forestilling om en streng.
Men for nu, kan du bare tænke på det som en egentlige datatype.
>> Så der synes at være en smule renset.
Og nu jeg har tænkt mig at gå videre og faktisk gør streng 0.
Opgjort.
Så det er godt.
Så ./string0 lad mig zoome ind, så vi kan se nærmere hvad der sker.
Enter.
Z-A-M-Y-L-A ind.
Og vi har printet ud til Zamyla navn.
>> Så det er temmelig godt.
Så lad os nu gå videre og køre dette program igen
og skriv ud Daven fulde navn.
Surprise, surprise.
Enter.
Hmm.
Vi har ikke udskrevet Daven s fulde fornavn korrekt.
Nu er dette burde være indlysende i tilbageblik på grund af hvad,
slags, dumme design beslutning?
>> Ja, jeg hårdt kodet seks inde i min til løkke.
Nu har jeg, at kun fordi Jeg vidste Zamyla navn
skulle være seks bogstaver.
Men sikkert er det ikke en generel løsning.
Så det viser sig, vi kan dynamisk finde ud af længden af ​​en streng
ved at kalde en funktion kaldet strlen.
>> Igen, bevidst kortfattet navngivet bare
at gøre det mere bekvemt at skrive.
Men det er synonymt med at få længden af ​​en streng.
Jeg har tænkt mig at gå tilbage til min terminal vindue og re-run compileren.
Men det er råben på mig.
Implicit erklære biblioteksfunktionen strlen med type unsigned int const--
Jeg er faret vild.
Helt.
>> Så, især da din øjne begynder at glasur over
med fejlmeddelelser som denne, fokus ærligt på de første par ord.
Vi ved, at problemet er i linje 8, som anført her.
Og det er i streng-0.c.
Implicit erklære biblioteksfunktionen strlen.
Så der generelt vil være et mønster af fejlmeddelelser.
Implicit erklære noget.
>> Så kort sagt, hvad har jeg syntes at har gjort med hensyn til linje 8, her.
Hvad kunne være løsningen være endnu hvis du aldrig har brugt strlen dig selv?
>> PUBLIKUM: En del af et andet bibliotek?
David J. MALAN: Part af et andet bibliotek.
Så det er erklæret, så at sige.
Det er nævnt i nogle fil bortset stdio.h og CS50.h.
Nu hvor det defineres?
For at være ærlig, du enten nødt til bare vide dette fra toppen af ​​dit hoved,
eller du Google det og finde ud af.
Eller vide dette, har jeg åbnet i CS50 Appliance terminal-programmet, som
er kun de store, fuld skærm version af hvad der er i bunden af ​​gedit vindue.
>> Og det viser sig, at der er en ligeledes kortfattet kommando, kaldet
mand til manuel, hvor, hvis du skriver i navnet på en funktion og tryk Enter,
du får tilbage forholdsvis mystiske dokumentation.
Det er bare tekst, som generelt ser lidt noget som dette.
Det er lidt overvældende ved første øjekast.
Men helt ærligt jeg har tænkt mig at lad mine øjne glasur over
og kun fokusere på den del Jeg bryder mig om for øjeblikket.
>> Hvilket er dette.
Som ser strukturelt lignende noget, jeg er bekendt med.
Faktisk man-siden, så til at tale, vil fortælle dig
i hvilken header indgive en funktion ligesom strlen er defineret.
Så jeg har tænkt mig at gå tilbage nu til gedit.
Og jeg har tænkt mig at gå videre og tilføje her include
og gem filen.
>> Jeg har tænkt mig at rydde skærmen med Kontrol L Hvis du har undret.
Og jeg har tænkt mig at re-run make string.0, kompilerer denne gang.
./string.0 Zamyla.
Det syntes at arbejde Lad mig gå fremad, og gentag det med Davenport.
Enter.
Og det, syntes også, at arbejde.
>> Så vi kan gøre det lidt bedre end dette, selv, kan vi begynde at rydde ting
op bare en lille smule.
Og jeg har tænkt mig at der faktisk introducere en anden ting nu.
Jeg har tænkt mig at gå videre og gemme denne i en anden fil.
Og jeg har tænkt mig at ringe til denne fil string1.c bare
at være i overensstemmelse med koden vil du være i stand til at finde online.
>> Og lad os fokusere på nøjagtig den samme kode.
Det viser sig, at jeg har været slags tage
for givet, at min bærbare computer, og til gengæld, det CS50 apparatet
har en masse hukommelse, en masse RAM, en masse af bytes af rummet
hvor jeg kan gemme strenge.
>> Men virkeligheden, hvis jeg har skrevet lange nok, og nok tastetryk,
Jeg kunne i teorien typen i flere tegn
end min computer har fysisk hukommelse.
Og det er problematisk.
Meget gerne en int kan kun tælle så højt, i teorien,
du kan kun proppe så mange tegn i computerens RAM eller Random
Access Memory.
>> Så jeg havde bedre til at foregribe dette problem, selv
selvom det kan være en sjælden hjørne tilfælde, så at sige.
Sker ikke så tit, kunne ske.
Og hvis det sker, og det gør jeg ikke foregribe og program for det,
mit program kunne gøre hvem ved hvad.
Frys, hænge, ​​genstarte, uanset hvad.
Noget forventet kunne ske.
>> Så hvad jeg har tænkt mig at gøre nu, fremover virkelig,
er før jeg nogensinde blindt bruge som en variabel s, der
er blevet tildelt returværdien af en anden funktion som getString,
Jeg har tænkt mig at sørge at dens værdi er gyldig.
Så jeg ved kun fra at have læst CS50 dokumentation for getString,
hvilket i sidste ende vil vi pege dig på, at getString returnerer et særligt symbol
kaldet NULL, N-U-L-L i alt kasketter, hvis noget går galt.
>> Så normalt, det returnerer en streng.
Men ellers hvis det vender tilbage N-U-L-jeg-- vi vil til sidst se, hvad der virkelig
means-- det betyder bare noget slemt er sket.
Nu betyder det, meget gerne i Scratch, Jeg kan kontrollere en tilstand her i C,
hvis S ikke lige NUL.
Så hvis du ikke har set det før, dette betyder bare ikke gør lige.
>> Så det er det modsatte af lige ligemænd, som husker,
er forskellig fra en enkelt lig, der er opgaven.
Så hvis r ikke er lig NULL, først da gøre
Jeg vil udføre disse linjer kode.
Så med andre ord, før jeg dykke i blindt
og start iteration i løbet af s, og behandle det
som om det er en sekvens af tegn, vil jeg først kontrollere,
vent et øjeblik, er S bestemt ikke svarende til denne særlige værdi, NULL?
>> Fordi hvis det er, kan dårlige ting ske.
Og for nu antage, at dårlige ting sker betyder, at dine program går ned,
og du kan ikke nødvendigvis komme sig.
Så ærligt, det ser grimmere.
Det er lidt forvirrende nu at kigge på.
Men det vil blive mere velkendt inden længe.
>> Men jeg har tænkt mig at foreslå nu en anden forbedring.
Det er en forbedring korrekthed.
Mit program er nu mere korrekt, fordi i de sjældne tilfælde, at ikke nok hukommelse
eksisterer, vil jeg håndtere det, og jeg vil bare ikke gøre noget.
Jeg i det mindste ikke vil gå ned.
>> Men lad os gøre en endelig version her.
Og en fil kaldet string2.c.
Jeg har tænkt mig at indsætte det samme kode for bare et øjeblik,
og jeg har tænkt mig at fremhæve dette linje, 11, her, for bare et øjeblik.
Nu er virkeligheden, at intelligente compilere ligesom Dunk kunne løse dette for os
bag kulisserne uden vores nogensinde at vide.
Men lad os tænke over det fundamentalt en problematisk design.
>> Denne linje kode er naturligvis, sagde initialisere nogle variablen i til 0.
Det er temmelig ligetil.
Og hvad er igen dette erklæring, her, jeg ++, laver?
Vi har set det før, men vi ikke rigtig tale om det.
>> Publikum: Forøgelsen i.
>> David J. MALAN: Forøgelsen i.
Så på hver iteration gennem denne løkke i hver cyklus,
du forøgelse i efter én.
Så det bliver større, og større, og større indtil løkken afsluttes.
Hvordan det ophører?
Nå der er denne midten tilstand, som vi har brugt før.
Du har set og i walkthroughs i P sæt.
>> Men hvad er dette Ord?
Gør følgende loop så længe jeg er mindre end hvad?
AUDIENCE: Længden af ​​strengen.
David J. MALAN: Den længden af ​​strengen.
Så det oversætter temmelig rent til engelsk i den forstand.
Nu er problemet, at hver gang jeg gentage gennem denne løkke i teorien,
Jeg stiller dette spørgsmål.
Er I mindre end strengen længden af ​​s?
>> Nu er jeg ændrer på hver iteration?
Det er.
På grund af den ++.
Så hver iteration jeg bliver større.
Men er s bliver større, eller mindre, eller slet forandring?
Nej
Så med hensyn til design, en af ​​akserne langs hvilken vi forsøger at vurdere kode
i klassen, dette føles lidt dumt.
>> Ligesom du er bogstaveligt talt, på hver iteration
af denne løkke beder samme pokkers spørgsmål igen,
og igen, og igen, og bogstaveligt talt det kommer aldrig til at ændre sig.
I hvert fald hvis jeg ikke rører s og forsøger at ændre indholdet af filtre.
Så jeg kan gøre det lidt bedre end dette.
>> Og hvad jeg har tænkt mig at gøre, er ikke erklærer kun én variabel i,
men en anden variabel jeg vil vilkårligt, men konventionelt, kalder det n.
Tildel n er lig med den streng længde filtre.
Og så herovre, vil jeg gøre en smart lille optimering, så
at sige, at der ved udgangen af ​​dagen er ikke mere rigtig eller ikke mindre korrekt
end før.
Men det er et bedre design.
I det faktum, at jeg bruger mindre tid, færre CPU-cyklusser, så
til at tale, for at besvare det samme spørgsmål, men kun én gang.
>> Eventuelle spørgsmål vedrørende denne generelle princippet om at forbedre,
siger, et programmets effektivitet?
Ja?
PUBLIKUM: Hvorfor skal du bruge [uhørligt]?
David J. MALAN: Godt spørgsmål.
Så hvorfor skal vi sætte ++ på enden af i stedet for begyndelsen af ​​i?
I dette tilfælde har det ingen funktionel effekt.
Og generelt, jeg har tendens til at bruge postfiksoperatoren
så det er lidt mere klar som til, når operationen sker.
>> For dem bekendt, er der en anden udsagn, hvor du kan gøre ++ jeg.
Disse er funktionelt tilsvarende i dette tilfælde
fordi der er intet andet omkring denne optælling.
Men du kan komme op med sager og linjer kode
hvori det gør en forskel.
Så generelt, gør vi ikke endda tale om denne ene.
Fordi ærligt, det gør din kode mere sexet, og sortering af glattere,
og færre tegn.
Men virkeligheden er, det er en meget sværere, Jeg tror, ​​selv for mig at ombryde mit sind
omkring det undertiden, rækkefølgen af ​​operationer.
Så som en sidebemærkning, hvis du virkelig ikke kan lide dette,
selv om det er lidt sexet søger, kan du også gøre i + = 1,
som er grimmere version af samme idé for postfix optælling.
>> Jeg siger dette, og du bør gøre grin med det,
men du vil komme til at se koden som noget smukt inden længe.
>> [Latter]
>> David J. MALAN: Right?
Ja.
Spørgsmål i midten.
>> PUBLIKUM: Har du brug for at sige int n?
David J. MALAN: Du gør ikke behøver at sige int n.
Så fordi vi allerede har sagt int, du behøver ikke at sige det igen.
Fangsten er, at n har til være den samme datatype som jeg.
Så det er bare en bekvemmelighed her.
Ja.
>> PUBLIKUM: Kan du gå over udskriv karakter s beslag jeg igen?
David J. MALAN: Helt sikkert.
Så% c, husker fra sidste tid, er blot en pladsholder.
Det betyder sætte en char her.
omvendt skråstreg n naturligvis blot midler sætte et linjeskift her.
Så bare blade, nu, dette stykke nye syntaks.
Og det er bogstaveligt talt sige, grab strengen kaldes s og gå få sin
i'te karakter, så at sige.
>> Og jeg ved med at sige i'te karakter fordi på hver gentagelse af denne løkke
det er som om vi udskriver ud, første s konsol 0,
som programmør måske sige.
Så s beslag 1, så r beslag 2, så 3 og derefter 4.
Men det er jo en variabel, så jeg bare udtrykke det med jeg.
>> Key, er imidlertid at indse, især hvis du ikke har
været acclimating til denne verden af programmering, hvor vi alle
synes at tælle fra nul, gotta begynde at tælle fra nul nu.
Fordi strygere, første karakter, zi Zamyla er for bedre eller værre
kommer til at leve på placering nummer nul.
>> Okay, så lad mig bringe os tilbage her til Zamyla
og se, hvad der virkelig foregår på under hætten.
Så der er denne forestilling af typen støbning.
Du har måske faktisk afspilles med dette allerede,
måske for hackeren udgave af P angive én.
Men typen støbning blot refererer til den evne i C og nogle andre sprog
at konvertere en datatype til en anden.
>> Nu hvordan kan vi se denne temmelig ligefrem?
Så dette, husker, er begyndelsen af det engelske alfabet.
Og den sammenhæng, husker, fra som en uge siden, er ASCII.
American Standard Code til udveksling af oplysninger.
Hvilket er bare en rigtig lang vej sige en kortlægning fra breve
til tal, og fra tal til bogstaver.
>> Så A til M her, prik prik prik, linjer op med, husker,
decimaltallet 65 om op.
Og vi ikke taler om dette udtrykkeligt,
men mon der ligner numre til små bogstaver.
Og ja, der er.
Verdens besluttede nogle år siden, at lille en, små bogstaver a,
kommer til at være 97.
Og lille b går til at være 98, og så videre.
>> Og for en anden tast på dit tastatur, er der
vil være et lignende mønster af bits.
Eller ækvivalent, et decimaltal.
Så spørgsmålet ved hånden, er så, hvordan kan vi
faktisk se dette under kølerhjelmen?
Så jeg har tænkt mig at gå over til gedit igen.
Og snarere end typen denne ene fra bunden,
Jeg har tænkt mig at gå videre og bare åbne op for noget
fra dagens kode kaldet ASCII nul.
>> Og ASCII nul ligner dette.
Så lad os slutte vores sind omkring dette.
Så det første, jeg har kommenteret koden, hvilket er rart.
Fordi det er bogstaveligt talt fortæller mig, hvad de skal forvente,
vise en kortlægning for store bogstaver.
Nu ved jeg ikke helt, hvad jeg mener med det, så lad os slutte.
>> På engelsk, måske lidt techie engelsk,
hvad betyder linie 18 vises at gøre for os?
Bare linie 18.
Hvad er det overtalelse?
Hvad det kommer til at kick off her?
>> PUBLIKUM: En løkke.
>> David J. MALAN: En løkke.
Og hvor mange gange er at gå for at skifte?
Publikum: [indskyde VOICES] seks gange.
David J. MALAN: ikke seks gange.
Publikum: 26 gange.
David J. MALAN: 26 gange.
Ja, undskyld.
26 gange.
Hvorfor?
Tja, det er lidt underligt, men Jeg er begyndt at tælle fra 65.
Hvilket er underligt, men ikke forkert.
Det er ikke dårligt pr sige.
Og jeg gør det kun fordi, i dette eksempel,
Jeg slags foregribelse at kapital A var 65 år.
Nu er det ikke den mest elegante måde at gøre dette, at slags hårdt kode
esoteriske værdier, at ingen er stadigt forventes at huske.
>> Men for nu, bemærke, at jeg er at gøre dette op gennem 65 plus 26.
Fordi tilsyneladende jeg ikke selv ønsker at gøre det aritmetiske i mit hoved.
Så jeg vil lade compileren gøre det.
Men så på hver sløjfe, hver iteration af løkken, jeg forøgelsen i.
>> Så nu det ser lidt kryptisk.
Men vi bør have grundlæggende bygning blokke med til at forstå dette.
% C er blot en pladsholder for en char.
% I er en pladsholder for en int.
Og det viser sig, at ved hjælp af denne ny syntaks denne parentetiske, så
til at tale, så en datatype inde i en parentes
Jeg kan tvinge compiler til at behandle jeg ikke er et helt tal, men som en char.
>> Derved viser mig karakter svarende til dette nummer.
Nu hernede, denne kode er temmelig meget identisk.
Jeg ville bare gøre Super det udtrykkeligt fremgår,
at jeg starter ved 97, som små bogstaver en.
På op gennem 26 flere bogstaver.
Og jeg doing-- igen, støbning i, så at sige.
Eller type støbning i, så at sige.
>> Fra en int til en char.
Så slutresultatet vil være, helt ærligt, oplysninger, vi allerede kender.
Jeg har tænkt mig at gøre ascii-0 dot-- ikke dot C.
Bemærk, du sandsynligvis gjort, at fejl som jeg netop gjorde et uheld.
Gør ascii-0.
Nu vil jeg gøre ./ascii-0.
Jeg vil zoome ind, og desværre det kommer til at rulle ud af skærmbilledet.
Men vi ser en hel diagrammet, hvor et kort til 97, B-kort til 98,
og hvis vi rulle yderligere op En selvfølgelig kort til 65.
Så er det kun at sige, at hvad vi har prædiket,
der er denne ækvivalens, er faktisk er tilfældet i virkeligheden.
Så en hurtig ændring af dette.
Lad mig åbne op ascii-1.c.
Og bemærk denne smarte, sortere af, afklaring af dette.
Dette er ASCII-1.c, og bemærke dette vanvittige ting.
>> Og dette virkelig får til hjertet af, hvad computere gør.
Selvom vi mennesker ville tæller ikke med i form af letters--
Jeg kan ikke begynde at tænke, okay en dengang B,
og anvende dem til at tælle fysiske objekter.
Du kan helt sikkert sige, at jeg ønsker at initialisere nogle variabel kaldet C--
men jeg kunne have kaldt dette noget, vi kan så C er initialiseret til kapital A.
>> Fordi i slutningen af ​​dagen, er computeren er ligeglad, hvad du opbevaring,
det kun bekymrer sig, hvordan du vil til at forelægge disse oplysninger.
Hvordan du ønsker at computeren fortolke dette mønster af bits?
Så det er ikke noget, jeg generelt vil anbefale gør.
Det er virkelig bare et eksempel for formidle, at du kan absolut
initialisere et heltal til en char.
Fordi under hætte af en char, selvfølgelig,
er bare et tal fra 0 til 255.
>> Så du kan sikkert sætte det inde i en int.
Og hvad dette også viser, er, at vi
kan konverteres fra en type til en anden, her
i sidste ende at udskrive det samme.
Og i virkeligheden er denne jeg vil fastsætte online-- skulle sige det igen, her.
Lad mig rydde op online, og vi vil se i en online gennemgang efter behov,
hvad der var hensigten der.
>> OK.
Så sidste eksempel nu involverer A'er og BS og så vil vi
tage tingene op et hak.
Så med en A'er og B'er og K'er i kapitalisering
og ligestilling, og lad os tage et kig på dette eksempel her.
Endnu kode eksempel.
Vi åbner en, der er allerede er foretaget, så vi
behøver ikke at skrive det alle ud fra bunden.
>> Og bemærk i forventning vi bruger flere header
filer, blandt hvilke er vores nye ven, string.h.
Nu ser ved første øjekast lidt kryptisk.
Men lad os se om vi ikke kan ræsonnere gennem, hvad der foregår her.
Først får jeg en streng fra brugeren, og jeg satte denne streng i en variabel
kaldet filtre.
Copy paste fra før.
På linje 22, jeg er åbenbart gør præcis, hvad
Jeg gjorde for et øjeblik siden, jeg iteration i løbet af de tegn i sek.
>> Og de nye tricks her bruger streng længde, mindre optimering
lagre strengen længde i n, snarere end at ringe strlen igen,
og igen og igen.
Og bare at kontrollere, at jeg er mindre end n.
Nu her, tingene bliver lidt interessant.
Men det er bare en ansøgning af denne samme ny idé.
Hvad i engelsk gør s beslag jeg repræsenterer?
>> Publikum: Tælle hver karakter [uhørligt].
>> David J. MALAN: Tælle hver karakter.
Og endnu mere kortfattet, s beslag jeg repræsenterer hvad?
Ville du sige.
Ikke at sætte dig på stedet her.
>> Publikum: Well--
David J. MALAN: Så hvis ordet er-- hvis strengen er Zamyla, som starts--
Publikum: --you håndtere tegnene separately--
David J. MALAN: Godt.
Præcis.
Den firkantede beslag notation giver dig at få adgang til hver karakter individuelt,
så s beslag 0 vil være den første tegn i strengen.
s beslag 1 vil være den anden og så videre.
Så spørgsmålet jeg spørger, her, i denne tilstand er hvad?
Er i'te karakter s større end eller lig med små bogstaver en?
Og hvad betyder det her, med de dobbelte ampersands?
PUBLIKUM (sammen): Og.
David J. MALAN: Og.
Det er bare svarer til dette.
Og er det ikke et nøgleord i C, er du nødt til brug, irriterende, tegnet tegnet.
Og det omvendt, beder er s'er i'te karakter mindre end eller lig
til små bogstaver z?
Og igen, det er her forstå den underliggende
gennemførelse af en computer giver mening.
Bemærk, at selvom jeg har dot dot dot derovre,
ligner en gennem z små bogstaver er alle sammenhængende værdier op fra 97 på op.
>> Og samme for store bogstaver, der starter ved 65.
Så takeaway, så er det på engelsk,
hvordan vil du beskrive hvilken linje 24 gør?
Ja?
>> Publikum: Den 24. er det at kontrollere at se , om hver karakter er en små bogstaver.
David J. MALAN: Det er at kontrollere, om Hver karakter er et lille bogstav.
Så endnu mere kortfattet, er den i'te karakter småbogstavs?
Det er alt, vi er udtrykker her logisk,
lidt kryptisk, men i sidste ende temmelig ligefremt.
Er s'er i'te karakter små bogstaver?
>> Hvis ja, og her er, hvor tingene få en lille sind bøjning
for bare et øjeblik, hvis det er tilfældet, gå videre og udskrive et tegn.
Så dette er blot en pladsholder, men hvad karakter?
Hvorfor gør jeg s beslag jeg minus dette udtryk her?
>> Godt mærke til mønsteret her.
De faktiske tal ikke betyder så meget.
Men bemærk, at 97 er hvor langt væk fra 65?
>> Publikum: 32.
>> David J. MALAN: 32.
Hvor langt væk er 98 fra 66?
>> Publikum: 32.
>> David J. MALAN: Lille C fra Big C?
32.
Så der er 32 humle fra et brev til en anden.
Så ærligt jeg, kunne forenkle denne til det.
Men så er jeg lidt svært kodning dette lave niveau forståelse
at ingen læser nogensinde vil forstå.
Så jeg har tænkt mig at generalisere det som, jeg kender de små bogstaver er større.
Jeg kender de store bogstaver er mindre værdier, ironisk nok.
>> Men det er faktisk svarer til sige trække 32 fra filtre beslag i.
Så i forbindelse med disse breve, hvis brevet
sker for at være en, små bogstaver en, og jeg trække 32,
Hvilken effekt har det har, matematisk på små bogstaver en?
Publikum: Capitalizes--
David J. MALAN: udnytter det.
Og ja, det er derfor vores program kaldes kapitalisere nul.
Dette program enten kapitaliserer et brev,
efter kontrol, hvis det er faktisk et lille bogstav.
Ellers i linje 30, hvad skal jeg gøre, hvis det er ikke et lille bogstav, som jeg er
ser på ved en bestemt iteration i sløjfen.
Bare printe det ud.
>> Så du skal ikke ændre ting det er ikke engang små bogstaver.
Begræns dig selv til lille en gennem lidt z.
Nu er dette er temmelig mystisk.
Men i slutningen af ​​dagen, dette er, hvordan vi, engang,
skulle gennemføre ting.
Hvis jeg i stedet åbne udnytte en, åh gudskelov.
Der er en funktion kaldet til den øvre, der kan
gøre alt, hvad vi lige gjorde på et forholdsvis lavt niveau.
>> Nu til øverste er interessant fordi den er erklæret i en fil,
og du ville kun kender dette ved at kontrollere den dokumentation,
eller at vide, sige, i klassen, hvor det findes i en fil kaldet ctype.h.
Så dette er en anden ny ven af ​​vores.
Og til øverste gør nøjagtigt hvad navnet antyder.
>> Du kan passere i, som et argument, mellem disse parenteser, nogle tegn.
Jeg har tænkt mig at passere i den i'te karakter S bruger vores smarte nye notation
involverer firkantede parenteser.
Og tage et gæt, hvad er afkastet værdi til øverste tilsyneladende vil
at være?
Et stort bogstav.
>> Så hvis jeg går med små bogstaver a, forhåbentlig ved definition af til øverste,
det kommer til at returnere en store bogstaver A. Ellers
hvis det ikke er et lille bogstav det første sted, jeg bare printe den ud.
Og ja, bemærk anden ven her.
Ikke bare til øverste findes, men er lavere, hvilket
faktisk besvarer dette spørgsmål for mig.
>> Nu hvem skrev disse ting, 10s år siden, ved du hvad?
Gennemført til øvre og er lavere hjælp af kode som denne.
Men igen, i overensstemmelse med denne idé om at abstrahere væk,
slags, lavere niveau gennemførelse detaljer.
Og stå på skuldrene af mennesker der kom før os, ved hjælp af funktioner
gerne øvre og er lavere, hvilket vidunderligt nok er pænt
opkaldt at sige, hvad de gør, er en vidunderlig paradigme at vedtage.
>> Nu viser det sig, at hvis jeg læser manden siden for, siger, at øvre,
Jeg lærer noget andet.
Så mand toupper.
Det er lidt overvældende.
Men varsel, her er der omtale af header fil, som jeg skal bruge.
Som en sidebemærkning, fordi dette er misvisende, den funktion
bruger int'er stedet for tegn af hensyn til fejlkontrol.
Men vi vil måske komme tilbage til det i fremtiden.
>> Men bemærk, her, til øverste konvertitter bogstavet C til store bogstaver, hvis muligt.
Så det er temmelig ligetil.
Og lad os nu være lidt mere specifik.
Lad os se på den del af man-side under returværdi.
Den returnerede værdi er, at Den konverterede brev.
Eller C, hvis omregningen var ikke muligt,
hvor c er den oprindelige indgang.
Hvilket jeg kender herfra, fra Argumentet om til øverste.
>> Så hvad er takeaway dette?
Den returnerede værdi er, at af den konverterede brev,
eller C, det oprindelige brev, hvis omdannelsen var ikke muligt.
Hvad forbedring kan jeg derfor gøre til min kode design?
Ja?
>> Publikum: Du kan fjerne steder.
David J. MALAN: Jeg kan fjerne andet udsagn,
og ikke bare andet udsagn.
>> Publikum: Du kan fjerne [uhørligt].
>> David J. MALAN: Jeg kan fjerne hele gaffel
i vejen, hvis ellers helt.
Så ja, lad mig åbne den endelige version af dette,
kapitalisere-2 og lægge mærke til, hvor, hvis du vil, sexet, koden får nu,
i, at jeg har reduceret fra nogle syv eller deromkring linjer til kun fire,
den funktionalitet, som jeg bestemt ved blot at kalde til øverste,
passerer s beslag i, og udskrivning ud, med pladsholder% c,
at særlig karakter.
>> Nu velsagtens, der er en fejl, eller i det mindste risiko for en bug,
i dette program.
Så bare for at komme tilbage til en tidligere takeaway,
hvad skal jeg nok også gøre i dette program til at gøre det mere robust,
så der er ingen måde, det kan ned, selv i sjældne tilfælde?
Publikum: Sørg for at det ikke er NULL.
David J. MALAN: Sørg for at det ikke er NULL.
Så virkelig, at gøre denne super korrekt, jeg bør gøre noget lignende,
hvis s er ikke NULL, så gå videre og udføre
disse linjer kode, som Jeg kan så led som det,
og derefter sat i min nære tandbøjle.
Så god tying sammen af ​​de to ideer.
Ja?
PUBLIKUM: Kan du bruge a gøre, mens løkke, i stedet?
David J. MALAN: Kunne Jeg gør en gør while-løkke?
Publikum: --you ønsker at sikre at du rent faktisk [uhørligt].
David J. MALAN: Kunne du bruger en gøre, mens?
Korte svar, nej.
Fordi du er ved at introducere et andet hjørne sag.
Hvis strengen er nul længde.
Hvis eksempelvis jeg bare ramt Enter, uden nogensinde at skrive Zamyla.
Jeg har tænkt mig at overgive dig tilbage en egentlig streng, som vi til sidst vil se,
der har nul tegn.
Det er stadig en streng, det er bare super kort.
Men hvis du bruger et gøre, mens, du kommer til at blindt
forsøge at gøre noget med hensyn til denne streng,
og intet kommer til at være der.
>> PUBLIKUM: Jamen, hvis du gjorde gøre [uhørligt], mens S--
David J. MALAN: Åh jeg se, holde få en streng fra brugeren.
Så korte svar, du kunne, og holde plage
dem til at give dig en streng, der er kort nok til at passe i hukommelsen.
Absolut.
Jeg valgte bare at lade være.
Hvis de ikke give mig strengen jeg ønsker, jeg holde op, jeg giver op.
Men absolut, til dette formål, du kunne absolut gøre det.
>> Så bibliotekets header-filer, der vi nu kender, er disse, her.
Standard I / O, CS50.h, string.h, ctype.h, og der er faktisk andre.
Nogle af jer har opdaget math-biblioteket i math.h.
Men lad mig introducere dig, nu, at denne ressource, CS50 personale, Davin,
og Rob, og Gabe særlig har sat sammen.
Det vil snart link på kursets hjemmeside.
Det hedder CS50 reference.
>> Hvilket bare for at give dig en hurtig forsmag på det, virker som følger.
Lad mig gå til reference.cs50.net.
Du kan se på venstre side en overvældende liste
funktioner, der kommer med ca.
Men hvis jeg ligeglad, for øjeblikket, om noget lignende strlen,
Jeg kan skrive det der.
Det filtrerer ned på listen til lige hvad jeg ligeglad.
Jeg har tænkt mig at klikke på det.
Og nu til venstre, du vil se, hvad vi håber
er en mere enkel, menneske venlige forklaring på, hvordan
denne funktion virker.
>> Returnerer længden af ​​en streng.
Her er en synopsis, her er hvordan du bruge det i form af header fil,
og med hensyn til hvad funktionen ligner i form af sine argumenter.
Og så her, vender tilbage længden af ​​en streng.
Men for dem af jer, mere komfortabel, du kan faktisk klikker mere komfortabel,
og indholdet af denne side, nu vil ændre sig
at være standardværdier hvad du få ved at bruge man-siden.
>> Med andre ord, CS50 reference er en forenkling
af mand sider ved det personale, for studerende.
Især de mindre behagelig og i mellem, så du
behøver ikke at forsøge at vikle dit sind rundt, helt ærligt,
nogle temmelig kryptiske syntaks og dokumentation engang.
>> Så holder det i tankerne i de kommende dage.
Så her, igen, er en Zamyla.
Lad os nu stille et spørgsmål, der er lidt mere menneskelig tilgængelige.
Tak til Chang, der har været udskrivning flere elefanter
uafbrudt i de sidste par dage.
Vi har en mulighed for at give mindst én af dem væk.
Hvis vi kunne få bare en volontør at komme videre op til at tegne på skærmen.
Hvad med her?
>> Kom op.
Hvad er dit navn?
ALEX: Alex.
David J. MALAN: Alex.
Okay.
Alex, kom op.
Vi er ved at se din skriften på skærmen her.
Okay, rart at møde dig.
>> ALEX: Nice du møde dig.
>> David J. MALAN: Okay.
Så super enkel øvelse.
Bar er ikke høj for få en elefant i dag.
Du spiller rollen som getString.
Og jeg har tænkt mig at bare fortælle dig den streng, du har fået.
Og antage, at du, getString, er blevet kaldt.
Og mennesket, ligesom mig, har skrevet i Zamyla, Z-A-M-Y-L-A.
Bare gå videre og skrive Zamyla på skærm, som om du har fået det
og gemt det et eller andet sted i hukommelsen.
>> Giver plads til, hvad der vil være flere andre words-- det er OK, holde i gang.
>> [Latter]
>> Så Zamyla, fremragende.
Så nu antage, at du, getString, kaldes igen.
Og derfor, jeg giver dig, ved tastatur, med et andet navn, Belinda.
Okay.
Og nu, næste gang getString er kaldes, jeg skriver i noget lignende Gabe,
G-A-B-E. Du er virkelig tager til hjerte random access memory.
Hvilket trækker alt helt tilfældigt.
OK.
>> [Latter]
ALEX: Beklager min håndskrift er dårlig.
David J. MALAN: Nej, det er OK.
Og hvad med Rob, R-O-B. OK.
Godt.
Så jeg ikke forventer, at du ville slags lægge ting ud på denne måde.
Men vi kan gøre dette arbejde.
Så hvordan har du gå om om disse tegn i hukommelsen?
Med andre ord, hvis vi tænker på denne rektangulære sort skærm
som repræsenterer en computerens RAM, eller hukommelse.
>> Og minde om, at RAM er bare en hel bunke af bytes,
og bytes er en hel masse af bits.
Og bits er en eller anden måde gennemføres generelt
med en form for elektricitet i hardware.
Så det er en slags den lagdeling vi har talt om
og kan nu tage for givet.
Hvordan har du gå om afgør, hvor at skrive
Rob versus Gabe versus Belinda versus Zamyla?
>> ALEX: Jeg gjorde det bare i påbyde, at du fortalte mig.
>> David J. MALAN: Og det er sandt.
Men hvad er reguleret, hvor du lægger Belinda navn og Gabe navn?
>> ALEX: Ingenting?
David J. MALAN: [griner] Så det virker, det er fint.
Så computere er lidt mere velordnet end.
Og så når vi implement-- bo der for bare en moment-- når vi faktisk
gennemføre noget lignende getString i en computer,
Zamyla kunne lægges ud temmelig meget ligesom du gjorde på skærmen, der.
>> Og hvad er nøglen til at lægge mærke til her, hvad Alex gjorde,
er der er lidt af en afgrænsning blandt hver af disse ord, ikke?
Du har ikke skrive Z-A-M-Y-L-A-B-E-L-I-N-D-A-G-A-B--
med andre ord, der er en slags grænselinie som synes at være,
slags, tilfældig afstand mellem disse forskellige ord.
Men det er godt, fordi vi mennesker kan nu
visualisere, at der er fire forskellige strenge.
Det er ikke bare en sekvens af masser af tegn.
Så en computer, så, i mellemtiden, kan tage en streng som Zamyla,
sætte hver af disse breve indersiden af ​​en byte hukommelse.
Men dette tal er meget større, selvfølgelig end seks tegn.
>> Der er en hel bunke af RAM.
Og så fremover, dette gitter af bokse går
at repræsentere hvad Alex bare gjorde her på skærmen.
Og nu, Alex, vi kan tilbyde dig en blå eller en orange elefant fra Chang.
ALEX: Jeg tager en blå elefant.
David J. MALAN: En blå elefant.
Så en stor runde af bifald, hvis vi kunne, for Alex her.
>> [Applaus]
>> ALEX: Tak.
David J. MALAN: Tak.
Så takeaway er, at selv om mønster slags ændret sig over tid, her
på tavlen, var der denne afgrænsning mellem de forskellige strenge
at Alex fik for os.
Nu computere, helt ærligt, kunne gøre det samme.
De kunne slags plask strygere overalt i RAM.
Heroppe, herovre, hernede, hernede.
>> De kunne gøre netop dette.
Men selvfølgelig, det er sandsynligvis ikke den bedste planlægning.
Right?
Hvis jeg holdt beder Alex til få navne, formentlig ville han
sætte nogle mere hernede, måske op her, herovre, herovre, til sidst
herovre.
Men med en smule mere planlægning, i hvert fald, vi kunne lægge tingene ud mere rent.
Og ja, det er hvad en computer gør.
>> Men fangsten er, at hvis den næste streng jeg får
efter Zamyla er noget ligesom Belinda,
foreslå, hvor vi kan skrive brev b med hensyn til dette net?
Hvor ville du gå?
Til højre for en, under z, under en?
Hvad ville dit første instinkter være?
Publikum: Under z.
David J. MALAN: Så under z.
Og det er temmelig ligetil, ikke?
Det er slags nydelige, det er hvad vi gør på et tastatur, når vi trykker på Enter,
eller en e-mail, når du foretager et punktopstilling af tingene.
Men virkeligheden er, at computere prøve at være mere effektive,
og proppe sikkert så meget data i RAM, som muligt,
så du ikke spilder nogen byte.
Så du ikke spilder enhver skærmplads.
Og problemet er imidlertid, at hvis vi bogstaveligt talt satte brev
B efter en, hvordan skal vi ved, hvor Zamyla navn ender
og Belinda navn begynder?
Så du mennesker, ligesom foreslået, ja, ramte på Enter-tasten, hovedsagelig.
Sæt det ned nedenfor.
Eller endda som Alex gjorde, bare begynde at skrive det næste navn under den foregående,
og under det ene, og derefter under denne ene.
Det er en visuel cue.
>> Computere har en anden visuel cue, men det er lidt mere kortfattet.
Det er denne funky karakter.
Backslash 0, som måske er minder om omvendt skråstreg n
og så videre, nu.
De særlige escape-sekvenser.
Backslash 0 er vejen for repræsenterer otte nul bits i en række.
0000 0000.
>> Den måde du udtrykker det er ikke at ramte tallet nul på dit tastatur,
fordi det faktisk, der er en ASCII-tegn.
Det ligner et tal, men er faktisk et decimaltal
der repræsenterer den cirkulære glyf, den cirkulære skrifttype.
I mellemtiden backslash nul betyder, bogstaveligt
sætte otte nul byte her for mig.
>> Så dette er noget arbitrær.
Vi kunne have brugt et mønster af bits, men verden
besluttede nogle år siden, til at repræsentere
enden af ​​en streng i hukommelsen, bare sætte en hel masse nuller.
Fordi vi kan opdage det.
Nu, betyder, at ingen skrivelse fra alfabet kan være repræsenteret med nuller.
>> Men det er OK, så har vi allerede set at vi bruger 65 om op i 97 på op.
Vi fik ikke nogen steder Tæt på alle nuller.
Så Belinda i en computers hukommelse er faktisk kommer til at gå her.
Jeg har tegnet det i gul bare at henlede vores opmærksomhed på det.
Og varsel, også dette er fuldstændig vilkårlig.
Jeg har tegnet det som et gitter.
Ligesom, RAM er blot nogle fysiske objekt.
Det behøver ikke nødvendigvis have rækker og kolonner, per se.
Det har lige fået en hel bunke af bytes implementeres i hardware eller anden måde.
Men hvis det efter Belinda jeg skrevet i Gabe navn,
han kommer til at ende op her i hukommelsen, og hvis jeg har skrevet i Daven navn,
for eksempel, han kommer til at ende her.
Og jeg kan fortsætte med at skrive endnu flere navne.
>> Desværre, hvis jeg forsøger at skrive en super lang navn,
Jeg kunne til sidst løbe tør for hukommelse.
I så fald, getString er vil vende tilbage NULL, som vi sagde.
Men heldigvis, i det mindste i denne visuelle her fik vi ikke helt så langt.
>> Nu, hvad der er rart er, at dette generelle idé om at behandle tingene
som værende i kasser er repræsenterer en funktion af C
og en masse sprog, kendt som et array.
Et array er en anden type af data.
Det er en datastruktur, hvis du vil.
Struktur i den forstand, det virkelig, slags, ser gerne en kasse, i det mindste
i dit indre øje.
Et array er en sammenhængende sekvens af identiske datatyper,
tilbage til tilbage til tilbage til tilbage.
>> Så en snor, i andre ord, er en vifte af tegn.
En vifte af tegn.
Men det viser sig, du kan have arrays af klaser af ting.
I virkeligheden, kan vi sætte endnu numre i et array.
Så den form, hvori vi kommer til at starte
erklære disse data struktur er kendt som et array
også kommer til at bruge firkantede parenteser.
Men disse firkantede parenteser vil har forskellig betydning i denne sammenhæng.
>> Og lad os se det som følger.
Antag, at jeg åbnede en ny fil her.
Og jeg gemme denne som ages.c.
Og jeg vil gemme dette i min mappe her.
Og nu jeg har tænkt mig at gå videre og begynde at skrive noget
som omfatter CS50.h omfatter stdio.h, int main tomrum.
Og så inde i her, jeg vil først have en int kaldes alder.
>> Og jeg har tænkt mig at bruge det til at få et int fra brugeren for hans eller hendes alder.
Men dette program er beregnet til at blive brugt af flere personer, uanset sammenhæng.
Jeg har en linje af mennesker.
Alle af dem er nødt til at skrive i deres alder for måske nogle, jeg ikke kender,
konkurrence, eller begivenhed at de er ankommet til.
Så den næste person, jeg brug for en anden variabel.
>> Fordi hvis jeg bare gøre alder får getInt, det er
vil tæske eller overskrive den foregående person alder.
Så det er ikke godt.
Så min første indskydelse måtte være, oh, okay,
hvis jeg ønsker at få flere folks ages-- lad os kalde denne alder1,
int Alder2 får int, int alder3 får getInt.
Og nu jeg har tænkt mig at bruge nogle pseudokode kode her.
>> Gør noget med disse numre.
Vi vil overlade til en anden dag, hvad vi laver der, fordi vi kun
omsorg for øjeblikket om alder1, Alder2, alder3.
Desværre, når jeg kompilere dette program
og sætte det foran faktiske brugere, hvad er det fundamentalt dårligt design
beslutning, jeg synes at have gjort?
Ja?
Publikum: [uhørligt]
David J. MALAN: Ja, Jeg har ikke selv prøvet
at regne ud hvor mange aldre har jeg faktisk ligeglad?
Hvis jeg har færre end tre mennesker her, og derfor færre end tre aldersgrupper,
Jeg er stadig blindt venter tre.
Gud forbyde fire mennesker dukke op.
Mit program vil bare ikke engang støtte dem.
>> Og så dette, lang historie Kort sagt, er ikke en god vane.
Right?
Jeg var hovedsagelig at kopiere og indsætter kode og bare tweaking
de variable navne.
Og, min Gud, hvis du havde, ikke tre aldre, men 10 eller 100, eller endda 6.500
bachelorer, for eksempel.
Dette kommer ikke til at være særlig elegante kode, eller bæredygtigt.
Du kommer til at have til omskrive programmet hver gang
Deres antal mennesker ændringer.
>> Så heldigvis, i vores faktiske ages.c fil til i dag,
vi har en mere smart løsning.
Først vil jeg låne konstruere vi har brugt et par gange,
dette gøre, mens løkke, for at få antallet af personer i rummet.
Jeg skal bare til at forpeste brugeren, igen og igen, indtil han eller hun giver mig
en værdi af n, der er et positivt heltal.
>> Jeg kunne have brugt, sidste tid komme positiv int.
Men vi har ikke den for alvor, så jeg gik videre
og re gennemført denne idé.
Nu hernede, det er den nye trick.
I linie 27, som kommentarerne i ledningen 26 antyder,
erklære et array, hvor at lagre alle alder.
>> Så hvis du ønsker at få, ikke en int, ikke to int'er, men en hel bunke af int'er.
Konkret n heltal, var n måske være tre, kan være 100, kan være 1.000.
Syntaksen, ganske enkelt er at sige, hvilken datatype vil du have?
Hvad vil du kalde at bid af hukommelse?
Hvad ønsker du at ringe til nettet der ser sådan billedligt?
>> Og i parentes her, siger du hvor stor du ønsker array til at være.
Og så tidligere, da jeg sagde det syntaks er lidt anderledes her,
Vi bruger stadig firkantede parenteser, men når jeg erklære et array,
antallet indersiden af firkantede parenteser midler
hvor stor vil du array til at være.
>> Derimod når vi bruger s beslag jeg for et øjeblik siden, s, en snor,
er faktisk en vifte af tegn, men når du ikke erklære en variabel,
som med denne nøgleordet her, du blot at få
et specifikt indeks, en specifik Fra dette array.
Når vi ved, at resten af denne er ligetil.
Hvis der kommer nye jeg først kommer til at printe ud hvad er en alder af personnummeret jeg.
Hvor jeg bare sige person, nummer et, person, nummer to, person, nummer tre.
>> Og jeg er bare aritmetik så at ligesom normale mennesker,
vi tæller fra en til dette program, og ikke fra nul.
Så kalder jeg getint, men jeg gemme svaret i aldre beslag jeg.
Hvilken er den i'te alder i array.
Så mens sidste gang vi var at behandle disse kasser som tegn for Zamyla navn,
og andre.
Nu repræsenterer disse kasser 32 bit eller fire bytes
hvor vi kan gemme en int, en int, en int.
Alt, som igen er den samme datatype.
>> Nu gør jeg noget dumt, ligesom tiden går, bare
for at skrive dette program.
Og derefter ned her, jeg igen gentage løbet array sige et år fra nu,
personnummer man vil være noget år.
Og for at regne ud, at math-- Jeg mener, dette
ikke meget kompliceret arithmetic-- Jeg blot tilføje én til deres alder.
Bare for at bevise igen, dette.
>> Ligesom jeg kan indeksere ind i en streng, s, så kan jeg indekset i en bred vifte af aldre,
ligesom den der.
Så hvor er dette kommer til at tage os?
Så vil vi se, i sidste ende, en få ting i de kommende dage.
En, al denne tid, hvor skrive dine egne programmer,
Ligesom Mario, grådige, kredit.
Du har været at skrive navnet på programmet og trykke Enter.
Og derefter få brugerens input.
>> Med getString, getInt, getLongLong eller lignende.
Men det viser sig, at C understøtninger noget, der hedder kommandolinje
argumenter, der kommer til at lade os faktisk får på ord, som du skriver,
på den blinkende prompt, efter dit program navn.
>> Så i de kommende dage, du kan skrive noget som Cæsar,
eller ./caesar nummer 13, derefter.
Vi vil se, hvordan det virker.
Fordi ja, i Problemet indstille to, er vi
kommer til at introducere dig til lidt noget
minder om Ralphie s udfordre tidligere kartografi.
Kunsten scrambling oplysninger.
Dette, i virkeligheden er meget minder om hvad Ralphie gjorde.
>> Dette er et eksempel på en kryptering algoritme kaldet rot13, R-O-T-13.
Hvilket betyder blot dreje bogstaver i alfabetet 13 steder.
Og hvis du gør det, vil du se nu hvad er måske en velkendt sætning.
Men den måde, vi kommer til at bruge dette i sidste ende er mere generelt.
>> Med P indstille to, i standard udgave, vil du gennemføre et par kryptering,
ét kaldet Cæsar, en kaldet Vigenere.
Begge af dem er roterende kryptering, idet en eller anden måde du
vende et bogstav til et andet bogstav.
Og Cæsar er super enkel.
Du tilføjer en, du tilføjer 13, eller en række op til 26.
Vigenere gør det på en per brev basis.
Så Vigenere, som du kan se i spec, er mere sikker.
>> Men i slutningen af ​​dagen, hvad du vil være at gennemføre og P indstille to,
er, at nøglen, som du bruger både til kryptering og dekryptering.
Under henvisning til processen med at gøre almindelig tekst, nogle oprindelige meddelelse,
i batch tekst, som er noget krypteret.
Og så dekryptere den igen.
>> I hacker udgave, i mellemtiden, vil du blive
opgave med noget lignende i ånden, hvor vi vil give dig
en fil fra en typisk Linux eller Mac eller Unix computer kaldet Etsy
password, som indeholder et helt bundt af brugernavne og passwords.
Og de adgangskoder har alle blevet krypteret eller hashet,
så at sige, mere korrekt som du kan se i spec.
>> Og hacker udgave vil udfordre dig med at tage en indgang som denne,
og revner adgangskoden.
Det vil sige, at finde ud af, hvad menneskets kodeord faktisk var.
Fordi, ja, adgangskoder er generelt ikke er lagret i den klare,
og generelt adgangskoder bør være svært at gætte.
Det er ikke ofte er tilfældet.
>> Og hvad jeg troede, vi ville gøre, er slutte med et par minutter
blik på et særligt dårligt valg af adgangskoder
fra en film, du måske husker lyserødt.
Og hvis ikke, bør du leje.
>> [VIDEOAFSPILNING]
>> -Helmet, Du djævel, hvad sker der?
Hvad laver du med min datter?
>> -Permit Mig at introducere strålende ung plastikkirurg,
Læge Phillip Schlotkin.
Den største næse job mand i hele universet og Beverly Hills.
>> -Din Højhed.
>> -Nose Job?
Jeg forstår det ikke.
Hun har allerede haft en næse job.
Det var hendes søde 16 til stede.
>> Nej, det er ikke hvad du tror.
Det er meget, meget værre.
Hvis du ikke giver mig den kombinationen til luft skjold,
læge Schlotkin vil give din datter tilbage hendes gamle næse.
- [Gisp] Nooooooooooooo.
Hvor fik du den?
>> -Okay.
Jeg vil fortælle, jeg vil fortælle.
>> Nej, far, nej.
Du må ikke.
>> -Du Højre min kære.
Jeg vil savne din nye næse.
Men jeg vil ikke fortælle dem kombination uanset hvad.
>> -meget Godt.
Læge Schlotkin, gør dit værste.
>> -Min Fornøjelse.
>> Nej!
Vent, vent.
Jeg vil fortælle.
>> Jeg vidste, at det ville fungere.
Okay, giv mig det.
>> -Den Kombination er en.
>> -One.
-To.
-Tre.
-Fire.
-Fem.
-Så Kombinationen er én, to, tre, fire, fem.
Det er den dummeste kombination Jeg nogensinde hører i mit liv.
Det er den slags ting en idiot ville have på sin bagage.
>> Mange tak, Deres Højhed.
>> [REMOTE CLICKS]
>> Hvad sagde du?
>> Jeg slukkede for væggen.
>> Nej, det gjorde du ikke, du slukket hele filmen.
>> Jeg må have trykket på den forkerte knap.
>> Tja, sætte det på igen!
Sæt filmen tilbage på!
>> Ja, sir!
Ja, sir.
Lad os gå, Arnold.
Kom, Gretchen.
Selvfølgelig du ved, jeg vil nødt til at fakturere dig for dette.
Tja?
Virkede det?
Hvor er Kongen?
>> -Det Arbejdede, sir, vi har kombinationen.
-Great.
Nu kan vi tage hver sidste åndedrag af frisk luft fra planet Druidia.
Hvad er kombinationen?
>> -En, To, tre, fire, fem.
>> -En, To, tre, fire, fem?
Ja.
-Det Er forbløffende.
Jeg har fået den samme kombination på min bagage.
Forbered Spaceball 1 for øjeblikkelig afgang.
>> Ja, sir.
>> -Og Ændre kombination på min bagage.
[Dørlukning SOUND]
[CLINK DØRE SLÅET HELMET]
-Ahh.
[END VIDEO PLAYBACK]
David J. MALAN: Det er det for CS50, vil vi se dig i næste uge.
Fortæller: Og nu, Deep Tanker, ved Daven Farnham.
>> Daven FARNHAM: kodning i C er så meget sværere end Scratch.
printf, Scratch var en løgn.
>> [Latter soundbite]