>> [MUSIC SPILLE]
>> SPEAKER 1: Dette er CS50 og Dette er begynnelsen av uke to.
Så, la oss hoppe rett inn i noe som er buggy, så å si.
Så, over her er CS50 IDE og jeg har trukket opp på forhånd denne screen-- jævla
det.
Spoiler alert.
Greit.
Jeg har trukket opp denne skjermen her, som har et meget enkelt program.
Hvis vi bla nedover, mest dette er bare kommentarer,
men her i ledningene 13 via 17 har vi et program.
>> Det er syntaktisk gyldig, noe som betyr at hvis Jeg kompilere den, det vil kompilere og kjøre,
men det er buggy.
Dette programmet hevder i kommentarfeltet opp toppen at det skal skrives ut 10 stjerner,
men det gjør det ikke.
Og basert på erfaring, eller snart å være erfaring med C,
kan du logisk skjelne hvorfor dette er, faktisk, buggy?
Yeah?
PUBLIKUM: Det går fra null til ti.
Det er 11 gjentakelser.
SPEAKER 1: Yeah.
Så, det kommer fra null opp gjennom og lik 10,
som selvfølgelig er 11 gjentakelser.
Så det kommer til å print, ja, 11 stjerner.
Så, informatikk konvensjonen i de fleste programmeringsspråk
er faktisk bare å begynne å telle på null,
men telle opp til, men ikke gjennom verdi at du faktisk bryr deg om.
>> Nå er dette en ting som tar litt tid å venne seg til
og selv Scratch, utformet som det er for ikke-programmerere eller ikke datamaskin
forskere og for barn i stor grad, er utformet for å ha
du begynner å telle vanligvis på en.
Og det er greit.
Du kan absolutt begynne å telle på en hvis det er mer behagelig.
Og telle opp til og gjennom 10, men vil du innse spesielt denne uken
og utover det så mange ting i programmering
antar at 0 er den første sifret som du telle,
at du kommer til å synes det er lettere bare for å komme inn i denne vanen med start
fra null og teller opp til verdien du bryr deg om akkurat nå fra
får gå.
>> Så, har som fikset dette.
Vi endret mindre enn eller tilsvarer i underkant.
La oss ta en titt på et andre eksempel her.
>> Så også hevder dette programmet i sin sier opp toppen at det skal skrives ut
ti stjerner, men det gjør det ikke.
Hva er feil her?
>> Så, what-- og sorry, la det være klart.
10 stjerner.
Én per linje, men det gjør det ikke.
Så, faktisk, la meg gå videre og kompilere dette fordi det er litt mindre
tømme basert på den beskrivelsen.
La meg gå inn i vår kilde katalogen.
Gjør buggy én prikk slash, buggy en.
OK, jeg ser 11 stjerner, som er fortsatt problematisk,
men de er også alle på én linje.
Hva er problemet her?
Yeah.
PUBLIKUM: [uhørlig].
SPEAKER 1: Yeah.
Så dette er en finesse som du kan husker meg å lage kort omtale av.
Selv om alt ser pen, og det er pent rykket inn,
og den slags ser Scratch-lignende ved at ledningen 16 og 17 er,
ja, rykket inn under dette for loop.
Det er uvesentlig.
Datamaskinen ikke vet eller se tomrom.
Tomrom er bare for oss mennesker, stilistisk.
Datamaskinen vet når du har klammeparentes, som ville, faktisk,
løse dette problemet.
>> Så, hvis vi faktisk gikk inn og eksplisitt satt i disse klammeparentes
som vil løse dette problemet ved å gjøre klart til kompilatoren
at jeg faktisk ønsker å utføre to linjer med kode igjen,
og igjen, og igjen.
Men hva er den fundamentale forklaringen?
Høyre?
Vi trenger ikke strengt tatt trenger klammeparentes hele tiden,
selv om det er nok best praksis å komme inn som vane uansett
selv om det legger to- tegnene i koden din. hvorfor?
>> PUBLIKUM: [uhørbart]?
SPEAKER 1: Ja, så det er en annen løsning helt.
Høyre?
Spesielt hvis ved første øyekast har du ikke virkelig setter pris på hva som skjer.
Vel, sikkert vi kunne bare gjøre to ting på en gang
og bare unngå problemet helt.
Og det er greit, men nå, for dagens formål, hva
er forklaringen på bug?
Hvorfor var alle disse stjernene på én linje?
Yeah?
>> PUBLIKUM: Det virker som om du har en linje med kode,
du kan gjøre det uten dem.
SPEAKER 1: Nettopp.
Dette er bare et menneske konvensjonen.
Folk skjønner at det er en litt irriterende eller kjedelig
til å sette klammeparentes alle av tiden hvis alt du ønsker å gjøre
er utføre en linje med kode.
Så bestemte mennesker noen tid siden at det er fint.
Hvis du ønsker å sette alle dine sløyfe på nettopp det en linje som dette,
det er fint med singelen semikolon på slutten.
Men du kan bare gjøre en slik linje uten klammeparentes.
>> Så, når CS50 stilguide som vil henvise deg til,
vil du se at generelt Det er god vane
å komme inn i dette før du er ganske komfortabel villfarelse
fra slike konvensjoner og gjør dine egne ting.
Så lenge du er selvstendig konsekvent.
Og vi skal snakke mer om style litt senere i dag.
>> Så, la meg åpne opp ett annet program.
Selvfølgelig bør vi fikse det 10 også.
La meg gå videre og skrive et ekte rask program som jeg skal ringe,
la oss si, loop dot C. Så, loop dot C. Og i sløyfe dot C kommer jeg til å ha,
inkluderer standard I / O dot H int main annullert.
Og nå kan vi bare gjøre, ja, en sløyfe.
Så får 4 int jeg null.
Jeg er mindre enn for eksempel 50.
Jeg pluss, pluss.
Og så her la oss gå videre og skrives ut F.
Og så vil jeg skrive jeg og en ny linje, semikolon.
>> Og dette bør skrive ut alle tall fra null til 50?
Noen hodet nikker.
Noen nos.
Hva er feilen allerede?
Hva er den enkle feilen jeg gjorde?
Yeah.
>> PUBLIKUM: [uhørlig].
SPEAKER 1: Yeah.
Så selv om det ser ut som dette er hva jeg har tenkt,
husker at jeg er også bare en ASCII karakter.
>> Så, hvis jeg sier, print "I."
Det er bokstavelig talt kommer å skrive ut I. Så hvis jeg
vil plug-in plassholder verdien jeg faktisk trenger å gjøre dette
og plugg-i Verdien av I dynamisk.
Ellers er jeg bare kommer til å får 50 I sin på skjermen.
>> Så, la meg gå videre og gjøre denne loop, kjøre den,
og, ja, vi har alle veien opp gjennom 49.
Og hvis jeg blar tilbake i tid jeg ser tallet null ved begynnelsen.
>> Vel, hva om jeg slags skru opp?
Hva gjør jeg dette?
Bare fordi jeg ikke tenke.
Hva er dette programmet.
Når re utarbeidet og løpe, kommer til å gjøre logisk?
>> PUBLIKUM: Ingenting.
>> SPEAKER 1: Ingenting.
Hvorfor det?
>> PUBLIKUM: Jeg er konstruert for null.
Så, er tilstanden falsk.
SPEAKER 1: Ja, akkurat.
All koden er korrekt, syntaktisk.
Dette vil kompilere, dette koden vil kjøre, men det er ikke
kommer til å gjøre noe nyttig fordi jeg initial jeg til null.
Vi så sjekk, er jeg større enn 50?
Selvfølgelig, nei, det er ikke det.
Slik at sløyfen ikke utfører i det hele tatt.
>> Hva hvis vi gjør noe litt mer uvøren?
Så, hva om vi liker int jeg får null.
Og nå la meg bruke mens løkke, som var en annen tilstand.
Og mens jeg si, mens jeg er større enn eller lik null, og deretter i her jeg
gå videre og lagre filen, gjør loop.
Og jeg er i ferd med å kjøre den.
Hva jeg kommer til å se dette tid med en stund loop?
Yeah.
>> PUBLIKUM: En uendelig loop?
>> SPEAKER 1: En uendelig loop?
Ja, og hvorfor?
PUBLIKUM: Fordi det er alltid null.
SPEAKER 1: Yeah.
Så, jeg initialisert som null.
Klart jeg er alltid større enn eller lik 0 som et resultat.
Så, jeg skal bare se denne uendelig.
Og nå, dette har kommet opp en gang eller to ganger til kursets hoder.
Hva skjer når du har en uendelig loop?
>> PUBLIKUM: Kontroll C.
SPEAKER 1: Yeah.
Så kontroll C vil til slutt svare.
Dessverre har vi skrevet ut millioner og millioner av nuller allerede
og slik at maskinen har slags fikk foran meg.
Så det kommer til å ignorere meg for en liten bit.
Men hvis du bare trykke Kontroll C noen ganger på din Mac eller PC-tastaturet
slutt bør det faktisk avslutte.
Og hvis ikke, vil vi vise deg noen teknikker før lenge der du
kan faktisk tvangs drepe programmer, mye som i Windows og Mac OS,
hvis behovet være.
Men la oss prøve noe annet.
La oss faktisk øke I. Er dette fortsatt kommer til å være uendelig?
La meg kjøre denne.
Og nå kan du på en måte se hva som skjer.
Også dette er en uendelig loop.
Men dette er litt av en lurespørsmål.
Dette kommer til å skrive ut tall for alltid?
>> PUBLIKUM: No.
SPEAKER 1: Nei.
Hvorfor?
Jeg hørte noen nos over her.
Someone-- Yeah.
PUBLIKUM: Du har ikke nok biter å virkelig holde det gående.
SPEAKER 1: All right.
Så jeg har ikke nok biter å holde det gående.
Så, hva kommer til å skje?
Det er bare kommer til å slutte?
>> PUBLIKUM: På et tidspunkt det vil stenge the--
SPEAKER 1: Det vil stenge løkken ned, men hvorfor?
Hva kommer til å skje på helt på slutten av dens grenser?
Yeah?
PUBLIKUM: Det vil sykle tilbake til negative tall.
SPEAKER 1: Å negative tall, eller hvis vi bare behandle positive,
null minst.
Så ja, absolutt.
Husker at vi så forrige gang at hvis du øke din biter en for mange ganger,
og du der forgrunnen overløp kapasiteten på int
eller hva datatypen er, du er kommer til å vikle rundt, sannsynligvis,
to negative tall.
Eller hvis du har spesifisere at din utvalg bør bare være positive,
som du kan gjøre, men vi har ikke sett det ennå,
du kan ende opp med minst tilbake på null.
Selv om, faktisk ja.
I dette tilfelle negativ tall, i hvilket tilfelle
løkken kommer til å terminere fordi jeg ikke er, faktisk,
større enn eller lik null hvis det er negativt.
>> Så, dessverre, hvordan lenge ville vi må vente?
Akkurat nå er vi opp til hva, 2 millioner-ish?
Vi er som 2 milliarder, vi er nødt til å vente
før vi faktisk kan se dette symptomet.
Men vi kan se det litt raskere, maybe-- la oss se om vi kan avbryte.
Kom igjen.
Selv menyene dukker opp sakte.
Greit.
Så vil vi komme tilbake til det før lenge.
Det er en god tid-- faen, valper.
>> Det er en god tid for noen kunngjøringer.
Så, hvis du kanskje har lyst å engasjere seg i YHack,
som er en hendelse som sponset av våre venner på Yale.
Og, ja, noen av kursets TFS ved Yale er involvert i dette.
YHack er en internasjonal hack-a-thon vert og holdt
ved Yale, og bringer sammen 1500 likesinnede hackere og reklamer alle
over hele verden.
Hvis dette er av interesse, ta en titt her.
Hvis dette er for en kort stund på skjermen, ta en titt på dagens lysbilder
URL for yhack.org.
Så også et par korte beskjeder.
Så offisielt seksjoner vil starte neste uke både her og New Haven.
Husk at du skal få en e-post senere denne helgen mest sannsynlig.
Det tar lang tid for CS50 til del,
gitt alle mennesker i klasse og alle flytte rundt.
Og alle Undervisning Fellows ' tidsplaner er også fortsatt størkne,
men følg med for en e-post, og hvis behov bli, kan du re-seksjonen der etter.
>> Study.cs50.net.
Så, selv om du er en konstant deltaker på seksjoner, innser at nesten alle
av ressursene vi bruker i seksjoner er offentlig tilgjengelig på CS50
Studere på denne nettadressen her.
Så, hvis du noen gang lyst til å re gjennomgang materiale fra seksjon, eller les videre,
eller du kan ikke gjøre det noen uke, innse at vareprøve lysbilder,
og problemer, og definisjoner, og flere er der også.
>> Kontortid gjenoppta dag, og i morgen, og onsdag
og torsdag sjekke kursets nettsiden for tidsplanen.
>> Og også, lanserer nå i dag er CS50 Diskuter.
Så, hvis og når du har spørsmål til hverandre eller for kurset er ansatte,
og er generelt arbeider på noen problem sett,
skjønner at du ikke nødvendigvis må slå til menneskets neste du.
Hvis det er ingen der, kan du nå ut til oss og klassekamerater
online via CS50 Diskuter.
Så dette er en diskusjon Styret for kurset,
og innse at dette er kanskje den beste
sted å begynne når du har spørsmål når utenom kontortid
spesielt.
>> Lunsjer starter opp denne uken også.
På Fire and Ice [Uhørbart] i New Haven.
Ta en titt på kursets nettside for å RSVP.
Først til mølla for det.
Hvis du ikke får i denne uken vi vil gjøre disse mest hver fredag
under begrepet.
>> OK, og nå et ord om gradering.
Spesielt nå som vi går inn problem satt en, som er ute denne uken,
og problemet satt to og etterpå.
Hvordan kan vi gå om evaluering P sett og vurdere kvaliteten av disse?
Så, det er fire akser som vi bruker i CS50, og de er disse fire her.
>> Omfang, som fanger på en numerisk basis hvor mye av P settet
fikk du takle.
Det tilsvarer omtrent med innsats, og det er vår måte å fange
fikk du prøve halve P angitt, alle av P-apparatet.
Dette er et enkelt å få perfekt score på hvis du gjør det, faktisk,
prøve alle sider av P-apparatet.
Så, ha det i bakhodet.
>> Korrekthet er akkurat det.
Har din kode arbeid som spesifikasjonen og som staber prøveløsningen
foreslår at koden bør faktisk fungerer.
Sjekk 50, hvis du ikke har møtt det ennå, er i P satt én spesifikasjon
og vil generelt gi deg ja / nei svar
med hensyn til om koden er riktig.
Minst så langt som vi kommer å vurdere den basert på tester
at vi kjører i dette programmet.
>> Design er mye mer subjektive.
Dette er hvor godt skrevet er koden din.
Og dette er noe som vil du bli bedre på over tid,
og det er noe som vi vil gi mer kvalitative tilbakemeldinger på.
Og ved utforming kanskje jeg mener før lenge du
kan bli fristet i noen P satt til å gjøre noe loopingly,
men for å ha kanskje tre eller fire, eller fem kjedede forgrunnen sløyfer eller nestet mens
sløyfer.
Som generelt bør begynne å gjøre deg flau
og vil generelt være anses som dårlig design.
Og du vil begynne å se i klassen og ut av klasse gode måter å gjøre ting på,
dårlige måter å gjøre ting som kan alle være riktig, men ikke
nødvendigvis godt utformet.
Som å skrive et essay.
Du kan være i stand til å sette ord på en side som er grammatisk korrekt,
men essay eller Oppgaven de er i er bare
helt usammenhengende eller unpersuasive.
Og slik som kan være analog i skrevet verden av dårlig eller god design.
>> Og stil, også er ganske subjektiv.
Men minst forventer vi konsistens.
Dette er hvor pen er koden din.
Er ting pent innrykket?
Er dine variabler vel hete / Er alle av parenteser og klammeparentes
justert som de burde være?
Vi har en CS50 stilguide som problemet settet vil henvise deg på.
De mer komfortabel er velkommen til å fjerne seg fra det
så lenge du er selv konsekvent.
Og også dette er en lærepenge vi vil forsterke i pkt.
Så, hvis alt dette var en liten rask, realisere P sett og seksjoner
vil gå mer i dybden før lenge.
>> Men generelt har vi svært få bøtter for CS50.
Poeng er generelt på en skala fra en til tre, eller en til fem.
Vi er literally-- og jeg kan ikke si dette nok i den første uken.
Tre er bra.
Så, selv om, ja, tre av fem normalt, matematisk,
kan være en 60 prosent eller som en D minus.
Tre er faktisk godt.
Og, faktisk, vi forventer de fleste elevene i klassen
å starte begrepet rundt toere og treere og firere.
Sannsynligvis ikke så mange femmere.
Ikke altfor mange seg.
Men generelt å starte i at sweet spot i kurven
slik at etter hvert som tiden går det er faktisk plass til,
og muligheter for øvre progresjon.
Så, vennligst ikke sette likhetstegn mellom tre med 60%.
Det er mye mer abstrakt enn det.
Formelen som vi beregner karakterer er vektet som følger.
Korrekthet er mest verdt.
Design er verdt litt mindre.
Stil er verdt litt mindre.
Og dette vanligvis registrerer hvor lenge
som går inn får hver av disse aksene akkurat.
Stil er superenkelt, bør være super rask,
men det er en enkel vane å bli lat om.
Korrekthet kan ta dere mesteparten av tiden.
Jakte ned noen bug makt ta det ekstra time eller mer,
og så, poeng slutt fanger det.
Og så, nå en mer alvorlig ord.
Siden CS50 har utmerkelse, for bedre
eller verre, av å være kanskje bedre kjent
med spørsmål om akademisk ærlighet enn de fleste andre kurs.
Og ja, det er så vidt jeg vet at vi sende flere studenter, dessverre,
for disiplinære formål hvert år som et resultat. Så,
i interessen til full avsløring, la oss snakke kort
om hva som foregår i CS50, og hva du kan gjøre, og hva du kan være oppmerksom på.
>> Så, her siden 2007, da Jeg arvet kurset,
er antall Ad styresaker.
Ad Styret er Harvards disiplinære kroppen, eller nå Honor Counsel,
til hvilke saker er referert når elevene gjøre noe som kursets
pensum anser som urimelige.
Det er ingen reell mønster her, vil jeg si.
Det svinger over år, men generelt
Dette er antallet saker som oversendes.
Antallet studenter som er involvert?
Det varierer også.
Vanligvis, i fjor for eksempel 29 studenter ved Harvard
var Ad Boarded, så å si.
29 av dem nåværende studenter, To av dem tidligere studenter,
som ble samarbeidet i noen uheldige måte.
Og da i form av prosenten, er det vanligvis om lag 3%
av klassen som, dessverre, gjør slike beslutninger.
>> Så, i fjor var det 3,5% av CS50 student body
som var Ad Boarded, så å si.
>> Så, hva betyr alt dette bety?
Og hva gjør vi egentlig gjøre?
>> Så, for full offentliggjøring, vi absolutt, som dataforskere,
har verktøy til rådighet og det er veldig lett for oss i rettferdighet,
at andre klassekamerater som ikke er krysse disse linjene krysse sammenligne
hver innlevering i år mot alle innlevering for de siste åtte årene.
Programvaren gjør dette.
Og til syvende og sist er det menneskelige øyne som bestemmer
om ikke å referere noen rolle for videre pådømmelse,
men programvaren hjelper sikkert.
Og dette, ærlig, er grunnen til at jeg tror vi har slike store tall i CS50.
Det er ikke fordi CS50 studenter eller CS studentene mer
generelt er noe mindre ærlige enn andre studenter,
det er bare vi har verktøy og teknikker
med å ta dette første passering.
>> Men vi kan holde et øye på alle disse tingene
så vel, igjen, av hensyn til erkjenner det arbeidet som blir satt
i av en super flertall av klassen.
Og kurset politikk på akademisk redelighet,
selv om det er en haug med paragrafer lang med en haug med kuler
som er forhåpentligvis ganske lesbar, det virkelig koker ned til å være rimelig.
Og det beste tommelfingerregel som vi tilby opp i pensum
Dette, essensen av alt arbeidet som du
sender til dette kurset må være din egen.
Og ja, i nesten alle av dem saker til disiplinærtiltak
det var på grunn av noen student sent en natt vanligvis slått sin kode
løpet outright til en klassekamerat, som deretter vedtatt det
i sin helhet eller betydelig av disse.
>> Men egentlig er dette OK.
Og ja, på kontoret timer, de papirlapper
du har blitt overlevert hvis du kom med kontor timer forrige uke oppfordrer så mye.
Du er helt velkommen og oppmuntret
å diskutere oppgavesett med klassekamerater.
Å hjelpe hverandre når snubler.
Men generelt tommelfingerregel bør være dette ", når du ber om hjelp,
du kan vise koden din til andre, men du kan ikke se deres ".
Så, med andre ord, hvis jeg sliter med noen P sett
og jeg sitter der i spisesal, eller i biblioteket,
eller i klasserommet prøver å finne noen feil,
Jeg kan sikkert vise min kode på skjermen min
til den personen som sitter ved siden for meg, i hvert fall de ansatte,
men også en klassekamerat.
Men hvis oppløsningen som min klassekamerat tilbyr er, oh,
her bare ta en titt på hva Jeg gjorde, som krysser linjen.
>> Og jeg tør si det er generelt en fornuftig ting for folk flest
å veldig lett få øye på linjen.
Og så, se pensum for flere detaljer.
Og nå en av de mer kontroversielle aspekter
av CS50 pensum som jeg trodde jeg ville snakke med i konklusjonen her
er den såkalte beklagelse klausulen.
Så, her er alle de fine print.
Men generelt har vi sett i løpet av de siste 8 år pluss
at, ja, nesten alle av CS50 s tilfeller av fusk
har vært et resultat av nettopp dårlig beslutnings sent på kvelden.
Et resultat av stress, resultatet av mangel på spising, mangel på søvn,
for mange P-apparater, for mange tidsfrister, for mange forpliktelser.
Stress bygge opp i en 02:00, 03:00 AM, 04:00, med frist truende.
De fleste studenter i disse tilfellene har nettopp gjort dårlige beslutninger
at de kan godt angre Neste morgen om ikke minutter senere,
men inntil i fjor var det ingen utløsningsventilen at disse studentene kunne
åpen faktisk opp til å faktisk ta opp problemet på hodet uten frykt for å bli
oppstartet fra college helt.
>> Og, ja, vi introdusert Dette angrer klausulen i fjor,
som sier at hvis innen 72 timer, tre dager,
krysse noen linje foreskrevet i pensum
du kommer frem til en av kursets hoder, og vi vil ta en prat om det.
Det er fortsatt noen utfallet, i motsetning til hva som er
Det er rapportert om det motsatte.
Det er fortsatt noen utfall som er handlekraftige av kurset,
generelt nullstilling en P sett eller ta en annen handling,
men vi vil, ja, håndtere det selv og ikke
henvise den høyere var utfallet kan være mye mer alvorlig.
Og, ja, til å fortelle hva som skjedde i fjor, i åtte år, og nå
ni år, med undervisning dette kurset og etter fiksing og triksing med ulike knotter,
snu ulike ringer det siste flere år på akademisk redelighet,
og ser per dataene godtas åpen innvirkning, selv av taler som dette,
Dette var uten tvil den beste tingen vi har introdusert pedagogisk
i åtte år sammen disse linjene i CS50.
>> 19 studenter kom frem under denne klausulen i fjor.
Vi tok ingen handling for sju av disse studentene,
å bestemme at de var unødig bekymret.
De hadde ikke i virkeligheten krysset en linje, men
var en god samtale å ha likevel.
Vi nullet 11 av resultatet som ble sendt inn.
Og i ett tilfelle vi spurte en student til å gjøre et problem satt.
Men mer overbevisende, ærlig, med disse 19 samtaler,
som var mye mer enn jeg forventes å ha, og hver av dem
10 minutter til kanskje en time lang, også brakt
å tenne en rekke spørsmål angående familiære problemer, venneproblemer,
psykiske problemer at vi da engasjert,
med studentens velsignelse, bosatt dekan, eller venner, eller et annet nummer
støtteressurser.
Så at dette var uten tvil en av de beste bruker av vår tid
og en av de beste intervensjoner.
>> Med det sagt, det hadde ingen innspill på frekvensen av gjenkjenning
av fusk mer generelt.
Og jeg tør si, dette undergruppe av studenter i fjor
var en demografisk at vi tidligere aldri identifisert før
og hadde aldri koblet med før.
Og så var disse fantastiske suksesshistorier
selv om de ble brakt til lys i løpet av mindre enn optimale forhold.
Så, ha dette i tankene som du gjør, kanskje,
noen dårlig avgjørelse selv sent på kvelden,
at det er regress så lenge som student i den situasjonen
eier opp og komme frem, slik at vi kan har den slags prat og håndtere det
på en måte som er pedagogisk, og deretter vi kan legge det bak oss neste dag.
>> Så uten videre, ta kant av av denne samtalen,
grunnen til valpene er opp er bare for å bryte isen for et øyeblikk.
Og dessverre, de er alle søvn, men det som skulle skje her
var alle skulle til ærefrykt og slags slappe
etter at svært tung samtale.
Men tydeligvis satte jeg valpene til å sove.
Men hvis du går til CS50 s nettside slash valper,
du kan se dem hele dagen lang.
Spesielt kanskje 2:00, eller 03:00 eller 04:00 om natten
å se litt stress lettelse der.
Så det er slash valper.
Greit.
Var ikke det morsomt?
OK.
Så, tilbake til noen datamaskin vitenskap, hvis jeg kan.
>> Så husker at sist gang vi startet ser ikke bare på main, som
var standard funksjon, når grønne flagget klikket tilsvarende,
men vi har også startet kort skriver noen av våre egne funksjoner.
Og hittil har ingen av disse funksjonene har vært spesielt stor eller kjøttfulle.
Du vil komme inn i de større funksjoner sannsynligvis, P satt to, P satt tre,
definitivt P satt fire og framover.
Akkurat nå de fleste av programmene dine, om ikke alle av dem, i hvert fall for P
sett 1 kan gjøres helt i main.
Hvis programmet er bare fem linjer, 10 linjer,
selv 20 linjer lange, perfekt rimelig å skrive det
alt i hoved og ikke over komplisere koden din, men hva vi gjør i dag
og videre prøver å også introdusere noen gode design teknikker
slik at så koden blir mer komplisert og som problemene
du ønsker å løse får hardere og mer interessant du har, liksom,
verktøyene i verktøykassen som å designe gode løsninger på disse.
>> Så, la oss ta en rask titt tilbake på dette programmet fra min forrige uke, noe som
var funksjoner null dot C. Og Legg merke til at, ganske enkelt,
det ser ut som dette med to- funksjoner, viktigste og print navn.
Og tenker tilbake eller kanskje reverse engineering i dag,
hva var motivasjonen for å innføre en funksjon i linje 28 kalt,
print navn?
Eller hva var dette et eksempel på i det gjelder et prinsipp eller takeaway,
hvis du ville.
Noen bilyd.
Hva?
>> Ja så Funksjonell Nedbrytnings er litt fancy måte å si:
brytes ned programmet i sine enkelte bestanddeler
og deretter bruke disse delene å sette sammen en helhet.
Så, for det er bare snill av en munnfull allerede,
men dette er kanskje en bedre eksempel på noe
bare kalt abstraksjon.
Høyre?
Abstraksjon kommer til å være en av de tilbakevendende tema i CS50
og også informatikk mer generelt, siden det er
en teknikk du kan løse med hvilke problemer mer effektivt fordi du
kan skrive løsninger mer intuitivt og på en måte som skalerer
og er forståelig for andre mennesker.
Hva jeg mener med det?
>> Så kanskje det er mye mer lesbar å se på et program som dette,
super kort om det er.
Når du ser på linje 22 som det er en funksjon som heter, print navn.
Det navnet alene sier hva den gjør.
At funksjonen tar tilsynelatende inngang mellom sine parentes,
og tilsynelatende gjør noe, formodentlig skriver navnet.
Og så, selv om vi absolutt kunne ha
gjort det vi gjorde for en uke siden, som var bare ta denne faktiske linje med kode,
bli kvitt dette, og få kvitt denne alle sammen,
vi slags abstrahert bort tanken om å skrive et navn.
Jeg bryr meg ikke om du bruker print def.
Jeg bryr meg ikke om du har en prosent S og en backslash N. Disse
er utrolig uforståelige detaljer.
Det jeg bryr meg om som en programmerer skriver et navn.
Og så, hva bedre måte å gjøre det enn ved å kalle en funksjon, print navn?
Og så, som var en av motivasjonene for å gjøre noe som dette.
Å gjøre koden mer lesbar, mer gjenbrukbare, og også selv beskrivende.
Nå, la oss ta en titt på et annet eksempel,
som var funksjoner ett, som vi hadde over her.
>> Så, dette er en kanskje enda mer bevisende fordi, i dette tilfellet
Jeg ønsker ikke å bare få en int.
Jeg ønsker å få en positiv int.
Og det viser seg å få en positiv int du trenger å gjøre en haug med legwork.
Høyre?
Det er ikke en enkel en linje ringe ut print navn var,
som er riktignok mindre overbevisende.
>> For å få en positiv int, logically-- la meg bla ned igjen for å skjule dette.
Hva må du gjøre?
Som alle de verktøyene vi har i øyeblikket
ting som print def fra Standard Bibliotek og også fra CS50 bibliotek
vi har Get Int, og Get Float, Få Long Long, får String,
men den eneste, Germane, akkurat nå er Get Int.
Så, hvis det eneste verktøyet du har i din verktøykasse er Get Int,
hvordan går vi om å implementere det å få positive int?
>> PUBLIKUM: Lag en logg og kontroller av om innspill som de ga
var positiv eller ikke.
>> SPEAKER 1: Perfekt.
Nøyaktig.
Et annet verktøy vi har i vår verktøykasse fra en uke eller to siden
er bare looping konstruere.
Og så, ja, hvis vi bruker en stund sløyfe, eller en gjør mens loop, eller en forgrunnen
sløyfe vi kunne sannsynligvis komme unna med en hvilken som helst av de som er i en eller annen form.
Vi kan implementere begrepet get positiv int ved bare å bruke Get Int,
og så bare fortsette å kalle det igjen og holde plaging brukeren
før han eller hun faktisk gir oss det vi vil ha.
>> Og så nå, dette abstraksjon av prosessen
for å få en positiv int inn i en funksjon som kalles
Få Positive Int er litt mer overbevisende fordi se på dette.
Disse er som 10 pluss linjer med kode som
er involvert i å få en positiv int, og jeg egentlig ikke bryr seg hvordan du gjør det.
Alt jeg bryr meg er at du kan gjøre det, og så har jeg
skjulte alle disse detaljene bak en funksjon kalt Få Positive int det,
ja, har dette gjøre mens loop.
>> Og se forrige uke for syntaksen der, men det bare erklærer N,
og det skrives ut instruksjon for brukeren.
Det kaller Få Int og deretter det sjekker denne tilstanden igjen og igjen,
og igjen inntil brukeren samarbeider.
>> Så nå, noen få feilsjekkene.
For de som kanskje kjenner med litt programmering,
hvorfor er N erklært, hvorfor må jeg lage N utenfor do mens loop?
Hvorfor er det på linje 29 og ikke på lignende 33, for eksempel.
>> PUBLIKUM: Fordi når du erklære den utenfor, det slag
mer, jo større scope--
>> SPEAKER 1: Good.
>> PUBLIKUM: --og hvis du deklarerer den inne i loop, [uhørbart]
fordi den ikke vet om det.
SPEAKER 1: Nettopp.
Hvis jeg kan simplify-- det er en sak av omfang.
Og omfang refererer til den konteksten som en variabel eksisterer eller er brukbare.
Og det fine tommelfingerregel her er at vanligvis når du deklarerer eller opprette
en variabel du kan bare bruke det inne av de nærmeste omfavner klammeparentes.
Så hva betyr det?
Hvis jeg i stedet angre denne og gå med noe som føles litt enklere.
Høyre?
>> Linje 32 bare ser renere for meg nå.
Jeg gjør begge ting på en gang og deretter tildele
høyre hånd til venstre hånd.
Problemet nå basert på at definisjonen av omfanget
er at N kan brukes i linjer 31 og 32 på innsiden av denne løkke,
men der etter at definisjonen kan den ikke brukes?
I tråd hva?
Yeah.
>> PUBLIKUM: 35.
>> SPEAKER 1: 35.
Definitivt ikke 35.
Og også hvor ellers?
PUBLIKUM: 34.
SPEAKER 1: Selv 34 er problematisk fordi det er
utsiden av klammeparentes.
Og så faktisk, la oss se hva som skjer.
Høyre?
Dette kan virke litt intuitive eller kanskje ikke,
men la oss se hva kompilatoren har å si når
vi går inn i dagens kilde katalogen.
Gjør funksjon en.
Herregud.
Vel, jeg endelig ferdig som, forresten.
Greit.
Og hva er problemet her?
Veldig uforståelige å se på.
Men her er hva jeg typed-- lage funksjon en.
Her er det som gjør indusert, som er faktisk
hjelp av kompilatoren klang med noen av disse flaggene
at vi vil se igjen før lenge.
Og igjen, alltid se ved den første feilen,
fordi det kan bare ha en gjennomgripende meningsløs effekt på andre linjer.
>> Så hva dette betyr er at Problemet er i funksjon 1.c.
Det er på linje 32.
Og det er på kolonnen, eller tegn, 13.
Så når din tekst editor som kan hjelpe deg med å identifisere hvor problemet er.
Så hvis jeg blar opp, hva er linje 32?
Det er faktisk dette en som allerede er fremhevet
rett her-- ubrukt variabelen n.
Men det er ikke ubrukt.
Jeg bruker det.
Men kompilatoren er forvirret, fordi det bare finnes inne i dette omfanget.
Og så jeg kan ikke bruke den her.
Jeg kan ikke bruke det her.
Og kompilatoren dermed ikke engang bryr seg at jeg prøver.
Det synes å være ubrukt innenfor sin faktiske omfang.
>> Så vi kan utvide omfanget ved å gjøre akkurat det vi startet with-- int n.
Og selv om det ikke skjer se så elegant, kanskje,
og vi tar en ekstra linje her, nå er det i omfang overalt.
Så la oss prøve igjen.
Så gjør funksjonen en.
Fin.
Og nå hvis jeg hvis jeg kjører funksjon en, la oss gi den negative 10,
negative 1, 0, 1, og det faktisk fungerer.
>> Så det er en annen løsning her.
Vet du hva?
Hva om jeg virkelig er bryting med dette?
Jeg vet ikke hvor n er ment å gå.
Vet du hva?
Jeg bare kommer til å sette det hele helt på toppen av min fil her.
Hva ville dette gjør, tror du?
Yeah?
>> PUBLIKUM: [uhørlig].
SPEAKER 1: Yeah.
Så jeg har gjort det globale, så å si.
Hvis du har en variabel som er utenfor alle dine funksjoner som er tillatt,
og koden skal kompilere, og n vil nå være tilgjengelig ikke bare i få
positiv int, men også i main-- som er litt bekymringsfullt fordi det er
allerede en n i main, så mer på at i bare en moment--
men dette vil bli vurdert dårlig design.
Greit.
Hvis du må ty til noe sånt, oh, vil jeg
bare sette den opp her fordi koden ser ut til å kompilere
er vanligvis ikke den beste praksis.
Heller du ønsker å velge den smal mulig omfang
for variablene, noe som ville bety kommer med vår første design, som
er rett her.
>> Nå som en side, hvis du har et identisk heter variabel her,
måten c ville håndtere dette-- selv om dette ikke vil skje for often--
er at dette er fortsatt helt greit her.
Men denne definisjonen av n i kø 22 vil skygge det globale.
Så dette vil arbeide innenfor Hoved, og den globale én
faktisk vil gjelde når du er i få positive int Men mer om det
annen gang, men bare for de nysgjerrige.
>> Så kort sagt, vi fikse dette her.
Nå la oss erte hverandre to andre stykker før vi ser på en siste linje med kode
i dette programmet.
Få positive int.
På venstre side av dens ord er ordet int.
Hva betyr det bety tror du?
Så langt har vi mest sett ugyldig.
Yeah?
>> PUBLIKUM: Det er den type variabel som du spør om.
>> SPEAKER 1: Ja det er den typen, la meg si ikke variable, men den type verdien
at jeg spør tilbake for.
Og ja, det er intuitive her, forhåpentligvis.
Høyre?
Hvis du ønsker å få en positiv int, hva er det du
ønsker function-- som vår frivillige fra forrige uke
å levere deg tilbake et stykke papir med en int på den?
Og så har vi presisert at såkalt returtype av denne funksjonen
er å få positiv int.
Hvis vi ikke vil ha det til tilbake noe, du sier annullert.
Hvis du vil at den skal komme tilbake en streng, sier du streng.
Hvis du vil at den skal komme tilbake en flåte, sier du flyte.
Men det eneste som gjelder her logisk, fordi jeg bruker get int,
selv om jeg begrenser det til positive verdier, er å returnere en int.
>> Så omvendt, hva betyr det at det er et tomrom i parentes?
Hva gjør parentes generelt definerer?
Yeah?
>> PUBLIKUM: Det betyr funksjonens faktisk ikke får det.
>> SPEAKER 1: Det betyr funksjonens faktisk ikke får det?
>> PUBLIKUM: En inngang.
>> SPEAKER 1: En input, overhodet.
Så ja, hvis parentes her du angir ugyldig,
det betyr bare at jeg vil ikke ha noen innspill.
Jeg skal håndtere problemet selv.
Og ja, du trenger ikke å fortell få positive int noe.
Du bare si, få positive int, og at funksjonen vil gå av og gjøre sine ting.
>> Men det har vært et lite triks jeg har spilt her hele tiden
å sørge for at denne koden kompilerer.
Legg merke til at int-- få positive int void-- er på linje 27.
Men for noen tilsynelatende merkelig grunn det er også opp her på linje 16.
Og bare for godt mål vil jeg gjenta dette så det er helt identiske.
Og jeg har sagt prototype med en liten en-linje kommentar.
Hva skjer hvis jeg sletter det, og Nå kjør gjøre funksjon 1, taster.
Uff da.
Vent et minutt.
Hvor er min kategorien?
Huh?
Vent litt.
Gjør funksjon 1.
Det vi går.
OK.
Hadde ikke lagret den på riktig måte.
Så jeg tror det er en liten bug her hvor jeg ikke
se kategorinavnet i øyeblikket.
Så hva er det som skjer her?
Implisitt erklæring funksjon få positive int er ugyldig i C99.
Så forvirrende igjen.
Så hva er dette et tegn på?
Vel, det viser seg at C er ganske dum.
Vel, det er programmerings språk, eller snarere kompilatoren er.
Det bare vet hva du har lært det, og det er bare
kommer til å vite noe hvis du lært det før.
Med andre ord, i Hoved i øyeblikket, er jeg
prøver å kalle en funksjon kalte få positive int.
Men kompilatoren ikke kommer å legge merke til at få positive int
Det finnes til linje 26.
Og så hva kompilatoren gjør er bare feil så snart det blir til linje 17,
sier implisitt erklæring av få positive int, som
er bare en fancy måte å si, vet jeg ikke vet hva får positive int er ennå.
>> Andre språk som Java og Python og Ruby kan se fremover.
C ikke.
Og så måten vi fikse Dette er en av to måter.
Enten en, hvis problemet er at få positive int har ikke vært sett før,
vel, la meg bare flytte den til toppen.
Det ville løse dette problemet.
Men generelt er det anses bedre teknikk
å sette din viktigste funksjon i det toppen slik at et menneske leser koden din
vet hva programmet gjør, fordi hoved er ikke begravet alle
helt på bunnen eller i midten.
Det er helt på toppen.
Så det føles ikke ideelt.
Og du kan faktisk få inn i situasjoner der
hvis en funksjonskall en annen, som krever en annen,
du kan få inn i en sak der verken kan gå over den andre, logisk.
Det er bare ikke mulig.
>> Og så vei til jobb rundt dette er å bare ta
funksjonen underskrift, så å speak-- den første linjen hvor det er declared--
og bare kopiere, lime den på toppen, men ikke med krøllete braces--
bare med et semikolon.
Det er som et lite hint av det som skal komme.
Og faktisk hele denne tiden når vi har sett ting som standard io.h
og cs50.h, på samme måte, i disse dot h-filer er det andre prototyper.
Og vi vil se at før lenge.
>> Så kort sagt, når du har et program i en fil med flere funksjoner
foruten hoved, du nesten alltid ønsker å erklære dem
bare ved hjelp av sin første linje, etterfulgt av et semikolon,
på toppen av filen.
Det var mange på en gang.
Noen spørsmål?
Greit.
>> Så la oss gå videre da til noe som hoste.
Oh.
Hvordan passer.
Greit.
Hoste.
Så her er en c gjennomføringen av et program
vi gjorde den andre dagen i Skrap at veldig rett og slett bare
sier hoste, hoste, hoste.
Greit.
Og noen sa noen dager siden at det er
en måte å rense denne koden opp allerede.
Greit?
Så snart du kopierer og limer sannsynligvis dårlig design.
Minst en gang vi får fire eller fem eller 20 hoste, føles det dårlig praksis.
Vi bare holde kopiere, lime.
Hva er den åpenbare løsningen til rengjøring dette programmet opp?
>> PUBLIKUM: Loop.
>> SPEAKER 1: Yeah.
Så bruk en loop.
Og vi kan bruke en for-loop, en stund loop, en rekke tilnærminger.
Og ja, det er det vi gjør i versjon en her.
Jeg har i stedet skrevet om det i versjon en av cough.c
å være bare hoste innen et for-løkke.
Greit, men det er en sjansen nå til slags start
å utforme denne litt mer lik leksjonen vi lært et øyeblikk siden,
som er dette-- antar at jeg ønsket for å lage en funksjon kalt hoste,
la oss vurdere for bare et øyeblikk hva det kommer til å se ut.
Så hvis jeg vil ha noe å hoste, jeg trenger bare
å bruke print f inne funksjonen.
Og ja jeg er.
Og faktisk all denne tid, helst du er
utskrift noe å skjermen, en programmerer
vil kalle det en bivirkning.
Det er ikke meg å overlate tilbake noen en verdi.
Det er meg å ta noen handling som kan være visuelt tydelig.
Men denne funksjonen hoste, betyr det tilbake noe basert på sin første linje?
Nei, fordi returtype er ugyldig, noe som betyr bare
det er ikke levere meg noe tilbake.
Det kan være å gjøre noe visuelt, men det er ikke levere meg
tilbake et stykke papir som forrige uke.
>> Betyr det trenger noen innspill?
Nei.
Og så det er tomrom her også.
Så også dette er slags over-ingeniør dette problemet.
Høyre?
Jeg har gjort programmet mer komplekse, flere linjer med kode,
Jeg har ikke gjort det noe mer funksjonell, men denne
ville være et springbrett, kanskje, for en bredere
sammenheng med mer komplisert kode.
Men hva om dette?
Hva har jeg done-- bare skotter på dette uten å se på den kommentaren
på toppen av file-- hva har Jeg fundamentalt gjort her med min hoste
implementering som er annerledes?
Ja, i ryggen?
>> PUBLIKUM: Gjør det slik at du kan har en karakter slå av.
SPEAKER 1: Yeah.
Så dette føles litt fint.
Høyre?
Det er som å legge til en funksjon i program eller funksjon, i dette tilfellet.
Det fortsatt returnerer ingenting.
Det kan ha en visuell bivirkning, fordi den som ringer print f.
Men nå har jeg parametrized funksjon, som
betyr at jeg har angitt tatt input av typen int og kaller det n,
men jeg kan kalle det noe jeg ønsker.
Faktisk kunne det bare være ganger for å bli enda mer eksplisitt.
Og så kunne jeg bare endre dette her.
Men poenget er at dette er hvordan jeg lage en funksjon som tar innspill.
Og hvis du husker bla gjennom kanskje online i ett
av walk-throughs, den fjerde og siste hoste f.eks
du vil legge merke til her jeg har generalisert koden min further-- slags abstrahert
det videre.
Som hoste og nyse, begge er omtrent som å si noe eller gjøre
en slags lyd.
Lagre ville være tilsvar Scratch blokk.
Og så hva jeg gjorde i denne versjonen, som vi kan bare blikk på,
er hoste er akkurat som å si: [hoste] hoste, og i mellomtiden, er nysing
som å si, [Achoo].
Og så jeg har generalisert gjennomføringen av disse
nå implementere dette generisk funksjon,
si, som er interessant for dagens formål
bare fordi det fremdeles ikke har en returtype.
Men hvor mange innganger har den?
PUBLIKUM: Two.
SPEAKER 1: Two.
Og så hvis du ønsker å ta i to argumenter,
bare skille dem med komma.
Og hvis du vil deretter kalle den funksjonen,
Legg merke til at du bare kalle sier, sitat, unquote,
for det første argumentet, felles n, for det andre argumentet.
Så igjen, vi må bare nå byggeklosser, slik at vi faktisk kan
gjennomføre noen av våre egne funksjoner.
Greit.
Eventuelle spørsmål om disse?
>> Så nå la oss skrelle tilbake et lag hvis så.
Og målet, til slutt, er neste ukes problem sett
kommer til å være på cryptogrophy-- kunsten scrambling informasjon.
Og spesielt informasjonen vil ha deg kryptere eller dekryptere
kommer til å være tekst.
Og så den slags invitasjoner spørsmålet i dag som godt,
hva som skjer under panseret med tekst utover ASCII fra uke null,
og hvordan kan vi faktisk begynner å manipulere det?
Så her er Zamyla navn.
Og i teksten, som kan bli matet inn som get streng funksjonen.
Og starter nå, når du ser en streng som dette-- Z-A-M-Y-L-A--
begynne å tenke på det som om hver av disse figurer er i en boks av dens
egne.
Og ja, i en uke eller så er tid, hver av disse bokser
kommer til å representere svært spesifikt en blokk med memory-- en bit av minne.
Slik at hver av disse bokstavene, til slutt, vil representere 8 bits.
Og vi vil faktisk se hva som skjer på under panseret på min datamaskin.
>> Men for ikke det tilstrekkelig bare å se på Zamyla
gjennom denne linse, hvorved hver av Disse bokstaver er i en egen boks.
Og pent nok i C vi kan tilgang til hver av disse boksene direkte.
Så hvis du ønsker å få den første brev av navnet hennes, super lett C.
Hvis du ønsker å få den siste brev, super lett også
med et stykke av nye syntaksen.
>> Så jeg kommer til å gå videre inn i CS50 IDE og åpne opp strengen null dot C.
Og i dette eksempel her, er det et par nye ting skjer.
Så først i linje 19, vi har sett denne before-- get streng.
Så akkurat som en rask tilregnelighet sjekk, hvis noen kunne tilby opp verbalt
en lekmann forklaring hva som skjer i linje 19.
Som bare oversette dette til Engelsk at en samboer ikke i CS50
kan forstå.
Yeah.
>> PUBLIKUM: Ha brukerundersøkelser en streng og lagre den i en variabel s.
SPEAKER 1: Good.
Har brukerundersøkelser en streng og lagre den i en variabel s.
Det er flott.
Så på høyre hånd side, kaller vi får streng.
Som returnerer en verdi som ikke får tildelt
fra høyre til venstre side inn i en variabel kalt s som er
utviklet for å lagre en streng.
Nøyaktig.
>> Så nå linje 22, per kommentaren i linje 21,
åpenbart skriver at strengen ett tegn per linje.
Men hvordan?
Så først av alt, vi initial jeg til 0.
Og deretter hvordan kommer vi oss til slutten av Zamyla navn?
Vel, på slutten av Zamyla navn, jeg kunne
manuelt skrive i det siste tegnet av hennes navn eller annen måte, eller antall det.
Høyre?
Hvis vi går tilbake her-- Z-A-M-L-- Y-L-A-- så jeg kunne skrive på.
Hva er indeksen for Zamyla siste brevet?
Hvis dette er 0-- snakker som en programmer-- 0, 1, 2, 3, 4, 5,
Jeg heard-- så ja, den siste bokstaven i Zamyla navn er den sjette,
men hvis vi telle fra 0, det kommer til å bli nummer fem.
Så hold det i tankene her.
>> Det viser seg at det er en funksjon i C kalles strlen, og tilbake i dag
og til denne dag fortsatt, mange programmerere
velge å synkronisere navn for deres funksjoner som høres ut som ordene
de prøver å si.
Så strlen er streng lengde.
Og så hva ville streng lengde S tilbake når Zamyla er inngang?
>> PUBLIKUM: Five.
>> SPEAKER 1: Z-A-M-Y-L. Seks.
Høyre?
Hva er lengden på Zamyla navn?
Høyre?
Og bare i virkeligheten, seks bokstaver.
Høyre?
Og så hva betyr det for vår loop?
Vi kommer til å gå fra 0 opp til seks, som
kommer til å gi oss fem gjentakelser.
Hva gjør vi på hver iterasjon?
Vel, prosent C, noen gjettet den andre dagen,
betyr en plassholder for hva?
>> PUBLIKUM: Char.
SPEAKER 1: Bare en char.
Så en enkelt character-- ikke flere tegn som en streng.
Og så her er den nye linjen at vi har fått skrive ut.
Og så her er den nye syntaksen.
Hvis du ønsker å skrive ut i-te tegnet i strengen S, så å si,
kan du bare si det navn på strengen S,
og deretter åpne hakeparentes, og deretter lukket hakeparentes, med en jeg
midten.
Og det er litt hyggelig at den slags ser ut som en firkantet
akkurat som de rutene hvor Zamyla s tegn finnes på det bildet der.
>> Så hvis jeg faktisk kjøre denne nå, la oss se hva som skjer.
Gjør string 0 dot slash string 0, og da er jeg
kommer til å skrive i Zamyla navn.
Det er ingen spørsmål, fordi jeg ikke bruke print f, men det er fint.
Jeg bare vet hva de skal gjøre.
Og faktisk, skriver den ut Zamyla navn, ett per linje.
>> Nå la oss være litt uvøren.
Anta at jeg ikke visste om strlen og jeg skjønte,
all right, ingen kommer til å ha en nevne større enn som 50 tegn.
La oss gå videre og rekompilere dette og kjør den, og deretter inn i Zamyla
igjen.
Logisk, hva er Programmet skal prøve å skrive ut?
Z-A-M-Y-L-A så som 45 ukjente byte minne.
Og ja, vi kommer tilbake til denne ideen minne.
Men bare logisk, hvis Zamyla navn er dette lenge,
i henhold til bildet her, hva vi sier
er å fortsette å skrive ut, fortsette å skrive ut, holde utskrift, hold utskrift, hold utskrift,
helt til den 50. karakter, som hvem vet hva som kommer til å skje.
Så la oss faktisk ta en titt.
La oss skrive inn Zamyla.
Interessant.
Vi hadde flaks.
Bare en hel haug med hvite området.
Oh.
Det er en funky karakter.
Det ser litt ut som en merkelig spørsmål markere det, men det er Zamyla navn.
La oss få virkelig hensynsløs.
Hva om vi skrive ut 500 blokker i det ukjente?
La oss gå videre og gjøre dette i tillegg, og deretter re-run.
Og la oss fullskjerm det, fordi vi trenger å se mer plass.
Zamyla.
Hadde flaks igjen.
>> Tør vi få mer uvøren?
La oss få mer uvøren.
50.000 tegn.
Dette er mest sikkert ikke en god idé.
Greit.
Gjør string 0.
Dette vil være vår siste demo.
Zamyla.
Ugh.
OK.
Så min hukommelse er virkelig tom akkurat nå, som er faktisk slags praktisk.
Det jeg prøver å få to-- all right.
Og nå er jeg bare kommer til å få hensynsløs.
500000.
Make-- la oss fullskjerms det.
Enter.
Zamyla.
Det vi går.
Jeg har ingen anelse om hva som er, men det høres ille.
Greit.
Og faktisk, snart, hvis du er blant de heldige få i kontortiden
og i oppgavesettet en, du kan godt møte dette.
Segmentering feil faktisk gjør har en veldefinert mening.
Det betyr en slags feil knyttet til et segment av hukommelse.
Og i lekmann vilkår, betyr det at vi rørte
memory-- vi brukte RAM i datamaskinen min at jeg ikke skulle ha hatt tilgang til.
Og det er det som er både kraftig og også farlig
om C er at du faktisk har uhemmet tilgang
til helheten av programmet minne eller byte eller RAM, mer spesifikt.
>> Så selv om Zamyla navn er bare seks tegn,
Jeg kan fortsatt gå noe minne jeg vil.
Og som en side, hvis du har inne har lest noen artikkel
gjennom årene om noen server eller noen program
får sprukket eller hacket som er tatt nytte av noe
kalles en buffer overflow utnytte at vi faktisk
snakke om i et par uker, det er generelt henviser til en eller annen måte å lure
en datamaskin til å gå bra utover grensene for minne
at den skal ha, og finne noe saftig
i at memory-- en passord, kanskje, en vei
omgå noen serienummer sjekk, eller bare generelt stand
å lure datamaskinen utfører kode som ikke var ment.
Men la oss komme tilbake til virkeligheten for bare et øyeblikk
hvor dette programmet var implementert med strlen,
og introdusere en ting her oppe.
Hva er nytt blant disse tre øverste linjene?
>> Så streng dot h.
Det viser seg at det er dette biblioteket heter String Dot H, eller String Library,
som header fil, så å si, er streng dot h som gir meg
tilgang til denne strlen funksjonen.
Hvis jeg utelater det, er kompilatoren kommer til å kjefte på meg i en eller annen form.
Men vet du hva?
La oss nå få virkelig nyansert.
I tråd 22, det er noe slag av inefficient-- dårlig utformet,
arguably-- om denne linjen med kode.
Tenk tilbake til hvordan for-loop er implementert
og hvilke skritt skje igjen og igjen og igjen-- initialisering,
tilstanden, koden blir henrettet, da tilveksten
eller endringen, og tilstanden, deretter koden, da endringen, deretter
tilstanden, da koden Da endringen, og så videre.
Så hva kan være litt bekymringsfullt eller dårlig gjort her?
Ja, i blått.
PUBLIKUM: strlen er kalt mange, mange ganger.
SPEAKER 1: Yeah.
Så strlen kalles mange ganger, men det er
lengden av Zamyla navn på første gang sløyfen utfører?
>> PUBLIKUM: Six.
>> SPEAKER 1: Seks.
Vel, hva er lengden på hennes navn andre gang koden utfører?
>> PUBLIKUM: Six.
>> SPEAKER 1: All right.
Det er fortsatt seks.
Høyre?
Zarla navn har ikke endret, selv om jeg ser
bare en del av bokstavene i navnet hennes.
Og så det faktum at jeg er effektivt spør dette spørsmålet, hva er
lengden på Zamyla, hva er lengden av Zamyla, hva er lengden på Zamyla,
seks separate ganger, eller sju selv, er bare dumt,
fordi det er uforanderlige det svaret.
Og så det jeg kunne faktisk gjøre er dette-- i streng én
Jeg har en marginalt bedre versjon her.
Det-- whoops-- string to jeg har en marginalt bedre versjon, hvor
Jeg gjør dette-- stedet for bare initialisering jeg til 0, jeg også med komma
erklære en ny variabel kalt N- Jeg trenger ikke å si int igjen.
Jeg burde ikke, faktisk.
Men jeg sier n.
Og da jeg initial n til den strlen av n, slik at nå
hvor mange ganger har strlen bli henrettet i total?
Bare en gang.
Og så dette er hva vi mener tidligere om bedre design.
Faktisk når koden er riktig, kommer tilbake og tenke gjennom,
jeg bruker så lite hukommelse eller så få sekunder
eller millisekunder av datamaskinen tid som mulig å gjennomføre noen problem?
Og jeg kommer til å rulle opp og bare nevne
at det er denne omtale fra null i denne versjon,
men vi vil komme tilbake til det før lenge.
Fordi for nå, la oss ta en titt på hvor dette kommer til å føre oss.
Så en, viser det seg at nå som vi har muligheten
å se på individuelle tegn, kan vi utnytte noe
fra uke 0 som var veldig uforståelige og liksom uinteressant på den tiden.
Men nå, og spesielt når vi komme til kryptografi i en uke,
det kommer til å bli ganske kraftig.
Det viser seg at med noen data types-- ints og flyter
og tegn og strenger og andre things-- noen av dem
kan veldig enkelt konverteres til en annen.
>> For eksempel, når vi snakket om ASCII litt tid ago-- her er
den store bokstaver A gjennom M, prikk, prikk,
dot-- vi sa at det er en kartlegging mellom disse bokstaver og tall.
Og faktisk, det gjelder for små bokstaver også.
Små bokstaver en er 97, kapital en er 65.
Og det er et tall i ASCII, som er bare denne kartleggingen
system for alle de andre bokstaver.
Så hva betyr det?
Vel, jeg kommer til å gå videre og åpne opp real raskt noe som kalles
ASCII 0, de fleste som er kommentarer.
Og igjen på nettet du kan alltid blikk gjennom kommentarene.
>> Og ta en titt på hva dette kommer til å gjøre.
Så det har en hovedfunksjon.
Jeg har hardkodet tallene bare for nå, fordi jeg vet hva jeg gjør.
Jeg vet hva jeg ønsker å se her.
Og jeg har initialisert jeg til 65.
Og jeg telle opp gjennom 26 bokstaver totalt.
Og hva skal jeg skrive ut én linje av gangen
hvis du kan tolke Dette markerte linjen?
Hva blir skrevet ut?
Yeah.
>> PUBLIKUM: Skal du for å skrive brevet som
korresponderer med kartet over brev verdi og heltall?
SPEAKER 1: Nettopp.
Jeg kommer til å skrive ut brev svarende til heltallsverdi,
og vice versa, som følger.
Vel dette, noen sa tidligere, er bare en plassholder for en char.
Det er det fortsatt.
Dette, selvfølgelig, er en plassholder for en int-- ikke en ny linje.
Og nå legger merke til, min første verdien som Jeg plugge inn for at plassholder
er ikke bare I. jeg sier, i parentes, røye jeg,
som parentes røye er forteller kompilatoren, behandler jeg
ikke som det som det er, som er et nummer.
Behandle det som en faktisk karakter.
Mens den andre verdien jeg plugging in-- I-- bør bare være et tall.
>> Så hvis jeg kompilere dette program-- så dette er å få ASCII 0,
dot slash ASCII 0-- jeg bare få denne hendige lille diagrammet som
viser meg alle mulige kartlegginger uten å måtte tenke det
gjennom eller finne ut av det på min egen.
Og jeg også skrive ut, legge merke til de små bokstaver,
fordi noen få linjer senere, jeg også skrive ut denne kartleggingen
også, som er bare å si at når du forstår
hva som skjer under panseret, kan du
automatisk konvertere frem og tilbake.
Og faktisk, hvis noen av dere noensinne gjorde dette i grunnskolen
eller hørt om noen mythically ta et notat
og passerer det til sin eller hennes venn i klassen,
men du egge den brev av som A blir B,
og B blir C, eller noe mer komplisert enn som så, vel,
hvordan ville du gå om implementere det som en gutt?
Vel, du bare vet slags A blir B, blir C B,
men matematisk, hva var den ungen gjør?
Hva var det du legger til hver bokstav?
Effektivt, 1.
>> Så når du endrer A til B, er at typen som endrer 65-66,
som matematisk betyr bare legge en.
Og så hvis du skulle implementere at litt villedende teknikk
for læreren i koden, du kan gjøre akkurat som bare
ved tilsetning av en enkelt bokstav sammen.
Så før lenge, vi er kommer til å se hvordan vi
kan dra nytte av det å faktisk genuint krafse og unscramble
informasjon.
I mellomtiden, vet at vi har startet å innføre et par andre bibliotek
her-- strengen én dag.
Og en veldig nyttig side forhåpentligvis vil du finne
kalles reference.cs50.net, som lærerstaben har satt sammen,
slik at hvis du vil se opp hvor strlen fungerer,
du kan begynne å skrive funksjonens navn,
klikk strlen der, og deretter en mindre behagelig forklaring
kommer til å vises.
Eller hvis du vil ha den offisielle Linux-baserte forklaring,
du kan klikke mer skjegg øverst til høyre, og det
vil presentere den samme informasjonen, men i mer komplekse termer.
Det er en nyttig ressurs for å faktisk vet hva alt gjør.
>> Neste gang vi kommer til å ta en titt på Ovaltine
og mer, og presentere oss til en verden av kryptografi.
Før da, vi får se du senere denne uken.
Og nå, Colton Ogden.
Ser deg på onsdag.
>> [MUSIC SPILLE]
>> SPEAKER 1: Hva [Bleep] er det du gjør?
>> SPEAKER 1: Jeg spiser min dessert?
Hvordan spiser du det?
Med hendene?
>> [MUSIC SPILLE]