>> [Muziek]
>> SPEAKER 1: Dit is CS50 en Dit is het begin van week twee.
Dus, laten we duiken in iets dat is buggy, om zo te zeggen.
Dus, hier is CS50 IDE en ik heb trok op voorhand dit Screen-- verdomde
het.
Spoiler alert.
Prima.
Ik heb dit scherm trok hier, die een zeer eenvoudig programma.
Als we scroll naar beneden, de meeste dit is gewoon commentaar,
maar hier in lijnen 13 tot 17 hebben we een programma.
>> Het syntactisch geldig is, wat betekent dat als Ik compileren, zal het compileren en uitvoeren,
maar het is buggy.
Dit programma beweert dat in de commentaren up top dat het moet afdrukken 10 sterren,
maar het niet.
En op basis van uw ervaring, of binnenkort ervaring met C,
kunt u logisch onderscheiden waarom dit is, in feite, buggy?
Ja?
Publiek: Het gaat van nul tot 10.
Dat is 11 iteraties.
SPEAKER 1: Ja.
Dus, het gaat van nul omhoog door en gelijk aan 10,
wat natuurlijk 11 iteraties.
Dus, het gaat om print, inderdaad, 11 sterren.
Dus, de informatica conventie In de meeste programmeertalen
is inderdaad gewoon om beginnen te tellen bij nul,
maar tellen tot, maar niet door de waarde die u eigenlijk schelen.
>> Nu, dit is een ding dat neemt een beetje wennen
en zelfs Kras, uitgevoerd als het voor niet-programmeurs of niet computer
wetenschappers en voor kinderen grotendeels is ontworpen om
je begint over het algemeen tellen op één.
En dat is prima.
Je kan absoluut beginnen te tellen op een als dat comfortabeler.
En tel tot en met 10, maar zult u in het bijzonder deze week te realiseren
en buiten dat net zo veel dingen in de programmering
0 aannemen dat de eerste digit waarmee u rekenen,
dat je gaat om het gemakkelijker te vinden gewoon om in deze gewoonte van start
van nul en tellen de waarde u de zorg over nu uit de
krijgen te gaan.
>> Zo, dat is bevestigd dat.
We veranderde de kleiner of gelijk aan iets minder dan.
Laten we eens een kijkje nemen op een tweede voorbeeld hier.
>> Dus, dit programma stelt ook in zijn merkt up top dat het moet worden afgedrukt
tien sterren, maar het niet.
Wat is de bug hier?
>> Dus, what-- en sorry, laten we duidelijk zijn.
10 sterren.
Één per regel, maar het niet.
Dus, in feite, laat me gaan en compileren dit omdat het een beetje minder
duidelijk gebaseerd op deze beschrijving.
Laat me gaan naar onze bron directory.
Maak buggy één punt slash, een buggy.
Oké, ik zie 11 sterren, die is nog steeds problematisch,
maar ze zijn ook allemaal in één lijn.
Wat is het probleem hier?
Ja.
PUBLIEK: [onverstaanbaar].
SPEAKER 1: Ja.
Dus dit is een subtiliteit die u mag herinner me het maken van korte vermelding van.
Hoewel alles ziet mooi, en het is goed ingesprongen,
en het soort ziet Scratch-like in die lijn 16 en 17 zijn,
inderdaad, ingesprongen onder die lus.
Dat is niet van belang.
De computer niet weten of zie witte ruimte.
Witte ruimte is alleen voor ons mensen, stilistisch.
De computer weet wanneer u accolades, dat zou inderdaad
Dit probleem oplossen.
>> Dus, als we daadwerkelijk gingen en expliciet zet in deze accolades
dat zou dit probleem op te lossen door duidelijk te maken aan de compiler
dat ik eigenlijk wilt uitvoeren twee regels code weer
en opnieuw, en opnieuw.
Maar wat is de fundamentele verklaring?
Rechts?
We niet strikt nodig accolades de hele tijd,
ook al is het waarschijnlijk het beste de praktijk toch te krijgen in die gewoonte
ook al voegt twee tekens om uw code. waarom?
>> PUBLIEK: [onverstaanbaar]?
SPEAKER 1: Ja, dus dat is andere oplossing geheel.
Rechts?
Vooral als op het eerste gezicht je niet echt waarderen wat er gaande is.
Goed, zeker we konden gewoon doen twee dingen tegelijk
en net voorkomen dat het probleem helemaal.
En dat is prima, maar nu, voor de huidige doeleinden, wat
is de verklaring voor de bug?
Waarom waren al die sterren op één lijn?
Ja?
>> Publiek: Het lijkt erop dat als je hebt een regel code,
je kunt het doen zonder die.
SPEAKER 1: Precies.
Dit is gewoon een menselijke conventie.
Mensen beseffen dat het een beetje vervelend of saai
moeten accolades alle zetten van de tijd als alles wat je wilt doen
is uit te voeren een regel code.
Dus besloot de mens een aantal tijd geleden dat dat is prima.
Als u al uw loop te zetten op net die ene regel als deze,
dat is prima met de single puntkomma aan het einde.
Maar je kunt alleen een dergelijk lijn zonder de accolades.
>> Dus, als CS50 stijlgids als u wijzen op,
je zult zien dat het algemeen Het is een goede gewoonte
om in deze tot je heel comfortabel dwaling
van dit soort overeenkomsten en het doen van uw eigen ding.
Zolang je zelf consistent.
En we zullen meer over praten stijl een beetje later vandaag.
>> Dus, laat me open te stellen een ander programma.
Natuurlijk moeten we vast te stellen dat 10 ook.
Laat me ga je gang en schrijf een echte snel programma dat ik bel,
laten we zeggen, loop punt C. Dus, loop punt C. En in de loop dot C Ik ga hebben,
zijn standaard I / O dot H int belangrijkste leegte.
En laten we nu gewoon doen, inderdaad, een lus.
Dus, 4 int ik krijgt nul.
I is minder dan, zeg, 50.
Ik plus, plus.
En dan hier laten ga je gang en doen afdrukken F.
En dan wil ik ik printen en een nieuwe lijn, puntkomma.
>> En dit moet al het printen getallen van nul tot 50?
Een paar hoofd knikt.
Enkele nos.
Wat is de bug al?
Wat is het gemakkelijk fout die ik maakte?
Ja.
>> PUBLIEK: [onverstaanbaar].
SPEAKER 1: Ja.
Dus zelfs al ziet het er als dit is wat ik van plan,
herinneren dat ik ook gewoon een ASCII karakter.
>> Dus, als ik zeg, print "I."
Het is letterlijk gaan I. Dus af te drukken, als ik
willen plug-in een placeholder waarde ik echt nodig om dit te doen
en vervolgens plug-in waarde van I dynamisch.
Anders Ik ga gewoon Ik krijg 50's op het scherm.
>> Dus, laat me gaan en maakt deze lus, voer het uit,
en, inderdaad, we hebben alle de weg omhoog door 49.
En als ik blader terug in de tijd zie ik het getal nul aan het begin.
>> Nou, wat als ik soort verpesten?
Wat als ik dit doe?
Gewoon omdat ik niet denken.
Wat is dit programma.
Eens opnieuw gecompileerd en draaien, ga logisch doen?
>> Publiek: Niets.
>> SPEAKER 1: Niets.
Waarom is dat?
>> Publiek: I is ontworpen voor nul.
Dus de voorwaarde onwaar is.
SPEAKER 1: Ja, precies.
Alle code correct is, syntactisch.
Dit zal compileren, dit code zal draaien, maar het is niet
van plan om iets nuttigs te doen omdat ik initialiseren ik op nul.
Vervolgens hebben we controleren, is dat ik meer dan 50?
Natuurlijk, nee, het is niet.
Zodat de lus voert nooit helemaal.
>> Wat als we iets doen een beetje meer roekeloos?
Dus, wat als we doen, zoals int ik krijgt nul.
En nu laat ik gebruik maken van de tijdens het lus, die nog een voorwaarde was.
En terwijl ik zeg, terwijl ik groter dan of gelijk aan nul en vervolgens in hier
ga je gang en sla het bestand op, maken lus.
En ik ben op het punt om het uit te voeren.
Wat ga ik om dit te zien tijd met een while loop?
Ja.
>> Publiek: Een oneindige lus?
>> SPEAKER 1: Een oneindige lus?
Ja, en waarom?
Publiek: Omdat het altijd nul.
SPEAKER 1: Ja.
Zo wordt ik geïnitialiseerd als nul.
Natuurlijk heb ik altijd groter dan of gelijk aan 0 als gevolg.
Dus, ik ben gewoon gaan zie deze oneindig.
En nu, dit is een keer komen of twee keer aan de hoofden van de cursus.
Wat gebeurt er als je hebben een oneindige lus?
>> PUBLIEK: Controle C.
SPEAKER 1: Ja.
Dus Controle C zal uiteindelijk reageren.
Helaas, we hebben uitgeprint miljoenen en miljoenen nullen al
en zo de computer soort kreeg voor me.
Dus, het gaat om te negeren me voor een klein beetje.
Maar als je gewoon op Controle C een paar tijden op je Mac of pc-toetsenbord,
uiteindelijk moet, inderdaad, te beëindigen.
En zo niet, laten we u zien wat technieken voordat lang waar u
kan eigenlijk geweld programma's te doden, net als in Windows en Mac OS,
indien nodig.
Maar laten we iets anders proberen.
Laten we eigenlijk verhogen I. Is dit nog steeds oneindig te zijn?
Laat me dit uit te voeren.
En nu kunt u soort zien wat er gebeurt.
Ook dit is een oneindige lus.
Maar dit is een beetje een strikvraag.
Gaat dit om nummers voor altijd af te drukken?
>> PUBLIEK: No.
SPEAKER 1: No.
Waarom?
Ik hoorde dat sommige nos hier.
Someone-- Yeah.
PUBLIEK: U hoeft niet genoeg beetjes om echt door te gaan.
SPEAKER 1: Oké.
Dus ik heb niet genoeg beetjes om door te gaan.
Dus, wat er gaat gebeuren?
Het gaat gewoon om te stoppen?
>> Doelgroep: Op een gegeven moment het zal sluiten the--
SPEAKER 1: Het zal sluiten de lus naar beneden, maar waarom?
Wat er gaat gebeuren op de einde van zijn grenzen?
Ja?
Publiek: Het fietst terug naar negatieve getallen.
SPEAKER 1: negatieve getallen, of als we waren net behandelen positief,
nul minimaal.
Dus ja, absoluut.
Bedenk dat we de laatste keer dat zag, als je verhogen uw stukjes een te veel tijd,
en je bent er voorgrond overflow de capaciteit van uw int
of wat dan ook het type data is, je bent gaan om rond, waarschijnlijk,
twee negatieve getallen.
Of als je hebt aangeven dat range mag alleen positief zijn,
die je kunt doen, maar we hebben nog niet gezien dat,
je zou kunnen eindigen ten minste terug op nul.
Hoewel, eigenlijk wel.
In dit geval negatief getallen, waarbij
de lus gaat beëindigen omdat ik niet, in feite,
groter dan of gelijk aan nul als het negatief is.
>> Dus, helaas, hoe lang zouden we wachten?
Op dit moment zijn we aan wat, 2.000.000-ish?
We zijn net 2 miljard, we zullen moeten wachten
totdat we eigenlijk zien dit symptoom.
Maar we kunnen het zien van een beetje sneller, maybe-- laten we eens kijken of we kunnen onderbreken.
Kom op.
Zelfs de menu's langzaam verschijnen.
Prima.
Dus, zullen we terug naar die vóór lang.
Het is een goed tijd-- te verdoemen, puppies.
>> Het is een goed moment voor een aantal aankondigingen.
Dus, als je misschien leuk om deel te nemen in YHack,
die een evenement wordt gesponsord door onze vrienden aan de Yale.
En, inderdaad, een deel van de cursus TFs aan de Yale zijn betrokken bij dit.
YHack is een internationale hack-a-thon georganiseerd door en hield
aan de Yale, het samenbrengen van 1500 gelijkgestemde hackers en creatieven alle
over de hele wereld.
Als dit van belang is, neem hier een kijkje.
Als dit te kort op de scherm, een kijkje nemen op dia's van vandaag
voor de URL voor yhack.org.
Dus, ook een paar aankondigingen.
Dus, officieel secties start volgende week hier en New Haven.
Houd in gedachten dat je zult krijgen een e-mail later dit weekend waarschijnlijk.
Het duurt lang voor CS50 sectie,
gezien alle mensen in de klasse en iedereen bewegen.
En alle Teaching Fellows ' schema's worden ook nog stollen,
maar stay tuned voor een e-mail en indien nodig worden, kunt u re-sectie daar na.
>> Study.cs50.net.
Dus zelfs als je een constante deelnemer in secties, te beseffen dat bijna alle
van de middelen die we gebruiken in secties publiek beschikbaar op CS50
Studeren aan deze URL hier.
Dus, als je ooit zou willen bekijken opnieuw materiaal uit sectie, of gelezen vooruit,
of u kunt het niet maken sommige week, beseffen dat monster dia's,
en problemen, en definities, en nog veel meer zijn daar ook.
>> Kantooruren te hervatten vandaag de dag, en morgen en woensdag,
en donderdag controleer de cursus website voor het schema.
>> En ook nu lanceren vandaag CS50 bespreken.
Dus, als en wanneer u vragen hebt elkaar of voor het personeel van de cursus,
en zijn over het algemeen werken op sommige probleem set,
beseffen dat je per se niet moeten wenden tot de mens naast jou.
Als er niemand daar, kunt u reiken aan ons en klasgenoten
online via CS50 bespreken.
Dit is dus een gesprek board voor de cursus,
en beseffen dat dit is misschien wel de beste
plaats om te beginnen als je vragen wanneer buiten kantooruren
in het bijzonder.
>> Lunches zal het te starten deze week.
Bij Fire and Ice [Onhoorbaar] in New Haven.
Neem een ​​kijkje op de cursus website om RSVP.
Wie het eerst komt, het eerst maalt voor.
Als je niet in deze week krijg we zullen deze de meeste elke vrijdag te doen
gedurende de looptijd.
>> OK, en nu een woord over het sorteren.
Vooral omdat we probleem in te voeren set één, dat is deze week,
en probleem set twee en daarna.
Hoe kunnen we gaan over het evalueren van P sets en het evalueren van de kwaliteit daarvan?
Dus, het is vier assen die we gebruiken in CS50, en ze zijn deze vier hier.
>> Reikwijdte, die vastlegt op een numerieke basis van hoeveel van de P set
heb je te pakken.
Het is ruwweg overeen met inspanning, en het is onze manier van vastleggen
heb je proberen de helft van de P set, alle van de P-serie.
Dit is een gemakkelijke te perfect te krijgen scores op als je dat doet, inderdaad,
probeer elk aspect van de P-reeks.
Dus, hou dat in gedachten.
>> Correctheid is precies dat.
Is uw code werk als de specificatie en als het personeel 'monsteroplossing
suggereren dat de code moet in feite werken.
Controleer 50, als je het niet hebben voldaan Toch is in P set een specificatie
en zal in het algemeen geef je ja / nee antwoorden
over de vraag of de code juist is.
Althans voor zover we gaan te evalueren op basis van de tests
wij gelegenheid binnen dat programma.
>> Ontwerp is veel meer subjectief.
Dit is hoe goed geschreven is uw code.
En dit is iets dat je beter in de tijd te krijgen,
en het is iets dat we bieden meer kwalitatieve feedback op.
En door het ontwerp ik misschien bedoel voordat lang je
misschien geneigd in sommige P ingesteld op loopingly iets te doen,
maar misschien drie of vier, of vijf geneste voren lussen of geneste terwijl
loops.
Die in het algemeen moeten beginnen om je ineenkrimpen
en zou algemeen beschouwd slecht ontwerp.
En je zult beginnen te zien in de klas en uit de klas goede manieren om dingen te doen,
slechte manieren om dingen te doen die allemaal correct zou zijn, maar niet
se goed ontworpen.
Zoals het schrijven van een essay.
Je zou in staat zijn om woorden op te zetten pagina die grammaticaal correct zijn,
maar het essay of de thesis ze in net
volledig onsamenhangend of overtuigend.
En dus dat zou de analoge in zijn geschreven wereld van slecht of goed ontwerp.
>> En stijl, ook, is vrij subjectief.
Maar in ieder geval verwachten we consistentie.
Dit is hoe mooi is uw code.
Zijn dingen mooi ingesprongen?
Zijn uw variabelen en de naam / Zijn alle je haakjes en accolades
uitgelijnd zoals ze moeten zijn?
We hebben een CS50 stijlgids als het probleem set zal u wijzen op.
Die comfortabeler zijn van harte welkom om afwijken van die
zolang je bent zelf consistent.
En ook dit is een les we zullen versterken in paragraaf.
Dus, als dit alles was een beetje snel, realiseren van de P set en secties
zal in meer diepte gaan voor lang.
>> Maar over het algemeen hebben we zeer weinig emmers voor CS50.
Scores zijn over het algemeen op een schaal van 2:59 of 4:59.
We zijn literally-- en ik kan niet zeggen Dit genoeg in de eerste week.
Drie is goed.
Dus, ook al, ja, drie vijf normaal, wiskundig,
kan een 60 procent of als een D minpunt.
Drie is in feite goed.
En, in feite, we verwachten de meeste studenten in de klas
om rond te beginnen met de term tweeën en drieën, en fours.
Waarschijnlijk niet zo veel vijven.
Niet te veel degenen.
Maar algemeen beginnen dat sweet spot in de bocht
zodat naarmate de tijd vordert, er eigenlijk ruimte voor,
en de mogelijkheden voor de bovenste progressie.
Dus, neem dan drie niet gelijk met 60%.
Het is veel abstracter dan dat.
De formule waarmee we berekenen cijfers als volgt gewogen.
Correctheid is de moeite waard het meest.
Design is een beetje minder waard.
Stijl is een beetje minder waard.
En dit meestal vangt de tijd
dat gaat in het krijgen van elk van deze assen precies goed.
Stijl is super eenvoudig, moet super snel zijn,
maar het is een gemakkelijke gewoonte te lui over.
Juistheid zou kunnen nemen u het meest van de tijd.
Jagen enkele bug macht neem dat extra uur of meer,
en zo de scoring uiteindelijk vangt dat.
En dus, nu een ernstiger woord.
Omdat CS50 heeft onderscheid betere
of nog erger, dat ze misschien beter kennen
met de problemen van de academische eerlijkheid dan de meeste een andere koers.
En inderdaad, het is naar mijn weten dat sturen we meer studenten, helaas,
voor disciplinaire doeleinden elk jaar als gevolg. Dus,
in het belang van volledige openbaarmaking, laten we praten in het kort
over wat er in CS50, en wat je kan doen, en wat u kunt zich bewust van zijn.
>> Dus, hier sinds 2007, toen Ik erfde de cursus,
is het aantal Ad Board gevallen.
Ad van Commissarissen is Harvard disciplinaire lichaam, of het nu Honor Counsel,
om welke gevallen worden aangeduid als studenten iets doen dat de cursus
syllabus beschouwt onredelijk.
Er is geen echte patroon hier, zou ik zeggen.
Het schommelt over de jaar, maar over het algemeen
Dit is het aantal de gevallen die worden genoemd.
Het aantal studenten die betrokken zijn?
Het varieert ook.
Typisch, vorig jaar Bijvoorbeeld, 29 studenten aan Harvard
waren Ad Boarded, om zo te zeggen.
29 van hen de huidige studenten, twee van hen voor studenten,
die waren samenwerken in sommige ongewenste manier.
En vervolgens in termen van de percentage is het meestal ongeveer 3%
van de klasse die helaas maakt dit soort beslissingen.
>> Dus, vorig jaar was 3,5% van CS50's studentenpopulatie
dat was Ad Boarded, om zo te zeggen.
>> Dus, wat betekent dit alles betekenen?
En wat doen we eigenlijk doen?
>> Dus, voor volledige openheid, we absoluut, zoals computer wetenschappers,
hebben software tools tot onze beschikking en het is erg makkelijk voor ons, in alle eerlijkheid,
klasgenoten dat andere die niet kruisen deze lijnen te steken vergelijken
elke inzending dit jaar tegen elke inzending voor de afgelopen acht jaar.
Software doet dit.
En uiteindelijk is het menselijke ogen die besluiten
al dan niet om wat te verwijzen zaak voor verdere berechting,
maar software helpt zeker.
En, eerlijk gezegd, is de reden waarom dat ik denk we zulke grote aantallen in CS50.
Het is niet omdat CS50 studenten of CS studenten meer
over het algemeen zijn minder eerlijk dan andere studenten,
het is gewoon dat we de hulpmiddelen en technieken
waarmee deze eerste doorgang nemen.
>> Maar we houden in de gaten Op al deze zaken
ook, opnieuw, in het belang van de erkenning van het werk dat wordt gezet
in door een super meerderheid van de klas.
En het beleid van de cursus op academische eerlijkheid,
ook al is het een bos van de leden lang met een bos van kogels
die hopelijk zijn goed leesbaar, is het echt neer redelijk.
En de beste vuistregel dat wij bieden binnen de syllabus
Dit is de essentie van al het werk dat u
voorleggen aan deze cursus moet je eigen.
Inderdaad, in bijna alle van die bedoelde gevallen voor disciplinaire maatregelen
het was vanwege een student laat één nacht draaide meestal zijn of haar code
dan regelrechte een klasgenoot, die vervolgens aangenomen,
in zijn geheel of aanzienlijk daarvan.
>> Maar echt, dit is OK.
En inderdaad, op het kantoor van uur, de stukjes papier
je hebt gegeven wanneer je kwam door het kantoor uur vorige week stimuleert zoveel.
Je hebt helemaal verwelkomd en aangemoedigd
om probleem sets te bespreken met klasgenoten.
Om elkaar te helpen bij het struikelen.
Maar over het algemeen de vuistregel moet zijn deze, "wanneer u om hulp vraagt,
u mag uw code te laten zien aan anderen, maar u kunt hen niet zien. "
Dus, in andere woorden, als ik worstelen met een aantal P set
en ik zit daar in de eetzaal, of in de bibliotheek,
of in de klas proberen om een ​​aantal fouten te vinden,
Ik kan zeker zien mijn code op mijn scherm
aan de persoon die naast voor mij, zeker het personeel,
maar ook een klasgenoot.
Maar als de oplossing mijn klasgenoot biedt is, oh,
hier gewoon een kijkje nemen op wat Ik deed, dat de lijn kruist.
>> En ik zou durven zeggen dat is over het algemeen een redelijke ding voor de meeste mensen
zeer gemakkelijk ter plaatse de lijn van.
En dus zie de syllabus voor meer detail.
En nu een van de meer controversiële aspecten
van CS50 syllabus, dat ik dacht dat ik zou tot slot spreken hier
is de zogenaamde betreuren clausule.
Dus, hier is al de kleine lettertjes.
Maar over het algemeen hebben we gezien de afgelopen 8 jaar plus
dat inderdaad bijna alle CS50's gevallen van academische oneerlijkheid
het resultaat van alleen slecht geweest besluitvorming laat in de nacht.
Het gevolg van stress, het resultaat gebrek aan eten, gebrek aan slaap,
teveel P sets, te veel deadlines, te veel verplichtingen.
Stress opbouwen in een 2:00, 3:00 AM, 04:00, met een deadline opdoemen.
De meeste studenten in deze gevallen hebt net slechte beslissingen
dat ze heel goed misschien spijt van de volgende ochtend zoniet minuten later,
maar tot vorig jaar was er geen ventiel dat deze studenten kunnen
eigenlijk open om daadwerkelijk het adres van de probleem hoofd op, zonder angst om
geboot college helemaal.
>> En inderdaad, introduceerden we Dit spijt clausule vorig jaar,
die zegt dat als binnen 72 uur, drie dagen,
overschrijding van enkele lijn in de syllabus voorgeschreven
kom je uit naar een van de cursus hoofden en we zullen een praatje over.
Er zijn nog steeds enkele uitkomst, anders dan wat
gemeld het tegendeel.
Er is nog enige uitkomst die is actiegericht door de cursus,
meestal zeroing een P set of het nemen van een andere actie,
maar we zullen inderdaad omgaan onszelf en niet
verwijzen deze hoger waren het resultaat zouden veel ernstiger zijn.
En, inderdaad, om te delen wat er gebeurd vorig jaar, in de acht jaar, en nu
negen jaar, van het onderwijzen van deze cursus en na het knutselen met verschillende knoppen,
draaien verschillende wijzerplaten van de afgelopen een aantal jaren op de academische eerlijkheid,
en het zien van de gegevens per zonder aanwijsbare invloed, zelfs toespraken als deze,
Dit was zonder twijfel de beste we hebben pedagogisch geïntroduceerd
in acht jaar samen deze lijnen in CS50.
>> 19 studenten kwamen naar voren onder deze clausule vorig jaar.
We namen geen actie voor zeven van die studenten,
het bepalen dat zij onnodig ongerust.
Ze hadden in feite niet, kruiste een lijn, maar het
was een goed gesprek om toch te hebben.
We nulpunt 11 van de scores die werden ingediend.
En in één geval vroegen we een student een probleem stellen doen.
Maar meer dwingende, eerlijk, met deze 19 chats,
dat was veel meer dan ik verwacht hebben, elk van hen
10 minuten tot misschien een uur lang, bracht ook
een aantal kwesties met betrekking tot licht familiale problemen, vriend kwesties,
geestelijke gezondheid dat we dan bezig,
met de student zegen, resident decaan of vrienden, of een ander nummer
ondersteunende middelen.
Dus dat dit was veruit een van de beste gebruik van onze tijd
en een van de beste interventies.
>> Met dat gezegd, nee het was ingang op de snelheid van de detectie
academische oneerlijkheid meer in het algemeen.
En ik durf te zeggen, deze subgroep studenten vorig jaar
een demografische dat we voorheen nooit eerder geïdentificeerd
en had nog nooit verbonden met vroeger.
En ja, deze waren prachtige succesverhalen
hoewel ze aan het licht werden gebracht in minder dan optimale omstandigheden.
Dus, hou dit in het achterhoofd als u, misschien,
sommige arme beslissing je 's avonds laat,
dat er een beroep zo lang als de student in die situatie
bezitten en naar voren komen, zodat we kunnen dat soort chatten en omgaan met het
op een manier die educatieve en vervolgens kunnen we het te zetten achter ons de volgende dag.
>> Dus zonder verder oponthoud, neem de edge off van dit gesprek,
de reden waarom de pups zijn up is alleen het ijs even break.
En helaas, ze zijn allemaal slapen, maar wat moest gebeuren hier
was iedereen werd verondersteld om ontzag en soort van ontspanning
na die erg zwaar gesprek.
Maar blijkbaar heb ik de pups om te slapen.
Maar als je naar CS50's website slash puppies,
je kunt ze de hele dag te kijken.
Vooral misschien 02:00, of 03:00 of 04:00 's nachts
een beetje stress is er te zien.
Dus dat is slash puppies.
Prima.
Was dat niet leuk?
OK.
Dus, terug naar enkele computer wetenschap, als ik mag.
>> Dus, herinneren dat de laatste keer dat we begonnen kijken niet alleen op de belangrijkste, die
was de standaard functie, de bij groene vlag klikte gelijk,
maar we ook begonnen met het kort het schrijven van een aantal van onze eigen functies.
En tot nu toe geen van deze functies zijn bijzonder groot of vlezige geweest.
Je krijgt in die grotere functies waarschijnlijk P set 2, P set 3,
zeker P set 4 en verder.
Op dit moment is het grootste deel van uw programma's, zoniet allemaal, zeker voor P
set 1 kan volledig worden gedaan in de belangrijkste.
Als je programma is slechts vijf lijnen, 10 lijnen,
zelfs 20 regels lang, perfect redelijk te schrijven
allemaal in de belangrijkste en niet te compliceren OVER uw code, maar wat we nu aan het doen zijn
en verder probeert ook introduceren een aantal goede ontwerptechnieken
zodat als uw code krijgt meer gecompliceerd en de problemen
u wilt oplossen krijgen harder en interessanter je hebt, soort van,
de gereedschappen in je gereedschapskist waarmee goede oplossingen voor deze ontwerpen.
>> Dus, laten we eens een snelle blik terug op dit programma van mijn laatste week, die
was functies nul punt C. En opmerken dat, heel eenvoudig,
het lijkt erop dat deze met twee functies, de belangrijkste en de naam afdrukken.
En denken terug of misschien reverse engineering van vandaag,
wat was de motivatie voor de invoering een functie in de lijn 28 genoemd,
print naam?
Of wat dit een voorbeeld van was termen van een beginsel of, eten
als je wilt.
Sommige mompelt.
Wat?
>> Ja zo functionele decompositie is een soort van het chique manier om te zeggen,
ontleden programma in zijn samenstellende delen
en dan die delen een geheel monteren.
Ja, dat is ook gewoon een soort van een mondvol al,
maar dit is misschien zelfs een beter voorbeeld van iets
belde net abstractie.
Rechts?
Abstractie gaat om één te zijn van de terugkerende thema's in CS50
en ook informatica meer algemeen omdat het
een techniek waarmee je kunt oplossen problemen effectiever, omdat je
kan oplossingen meer schrijven intuïtief en op een manier die schalen
en het is begrijpelijk door andere mensen.
Wat moet ik daarmee?
>> Dus, misschien wel het is veel leesbaarder om te kijken naar een programma als dit,
super korte al is.
Als je ziet op lijn 22 dat er een functie genaamd, de naam te drukken.
Die naam alleen zegt wat het doet.
Die functie neemt blijkbaar ingang tussen de haakjes,
en blijkbaar doet iets, vermoedelijk drukt de naam.
En dus, hoewel we absoluut konden
gedaan wat we deden een week geleden, dat was neem deze werkelijke regel code,
zich te ontdoen van deze, en krijg ontdoen van dit alles samen,
We soort van geabstraheerd weg het begrip afdrukken van een naam.
Kan me niet schelen als je met druk def.
Kan me niet schelen als je een procent S en een backslash N. Deze
zijn ongelooflijk mysterieuze details.
Wat ik wel schelen als een programmeur is het afdrukken van een naam.
En dus, wat een betere manier om dat te doen dan door een functie, naam druk belt?
En zo, dat was een van de motivaties voor iets als dit te doen.
Het maken van de code beter leesbaar, meer herbruikbaar, en ook zelf beschrijvend.
Laten we nu eens een kijkje nemen een ander voorbeeld,
die functies een, die we hadden hier.
>> Dus, dit is misschien nog meer dwingende omdat in dit geval,
Ik wil niet gewoon een int.
Ik wil een positieve int te krijgen.
En het blijkt een positieve te krijgen int moet je een bos van informatieverzameling.
Rechts?
Het is niet een eenvoudige één regel roepen zoals naam druk was,
die weliswaar minder overtuigend.
>> Om een ​​positieve int krijgen, logically-- laat me terug naar beneden scrollen om dit te verbergen.
Wat moet je doen?
Net als alle tools die we hebben op het moment worden
dingen zoals print def van Standard Bibliotheek en ook van CS50 bibliotheek
hebben we Get Int en Get Float, Get Long Long, krijgen String,
maar de enige, Germane, nu is Get Int.
Dus, als het enige instrument je hebt in uw gereedschapskist is Get Int,
hoe kunnen we gaan over het implementeren Het positieve int te krijgen?
>> PUBLIEK: Maak een log en te controleren Op de vraag of de input die zij gaven
positief of niet.
>> SPEAKER 1: Perfect.
Precies.
Een ander instrument hebben we in onze gereedschapskist van een week of twee geleden
is gewoon de looping constructie.
En zo ja, als we een tijdje lus, of een do while loop, of een voorgrond
lus we kan waarschijnlijk wegkomen bij een van de in een bepaalde vorm.
We kunnen het begrip get implementeren positieve int door gewoon met behulp van Get Int,
en dan gewoon blijven noemde het opnieuw en houdt pesten de gebruiker
totdat hij of zij eigenlijk geeft ons wat we willen.
>> En nu, dit abstractie van de werkwijze
het krijgen van een positieve int in een functie genaamd
Get Positieve Int is een beetje meer dwingende omdat kijken.
Deze zijn net als 10 plus regels code die
zijn betrokken bij het verkrijgen van een positieve int, en ik heb niet echt schelen hoe je het doet.
Alles wat ik zorg is dat je kan het doen, en dus ik heb
verborgen al deze gegevens achter een functie genaamd Get Positive int dat,
inderdaad, heeft dit te doen terwijl lus.
>> En zie de laatste week voor de syntax daar, maar het is gewoon verklaart N,
en het drukt de instructie aan de gebruiker.
Het roept Krijg Int en vervolgens controleert deze toestand opnieuw, en opnieuw,
en weer totdat de gebruiker werkt.
>> Dus nu, een paar gezond verstand controles.
Voor degenen die misschien wel bekend met enkele programmering,
waarom is N verklaard, waarom maak ik N buiten de do while loop?
Waarom is het op lijn 29 en niet on zoals 33 bijvoorbeeld.
>> Publiek: Want als je verklaren buiten, het soort
meer de grotere scope--
>> SPEAKER 1: Good.
>> Publiek: --en als je verklaren het binnen de lus, [onverstaanbaar]
omdat het niet weten.
SPEAKER 1: Precies.
Als ik kan simplify-- het is een kwestie van de scope.
En omvang verwijst naar de context met een wisselend bestaat of bruikbaar.
En het mooie vuistregel hierbij is dat algemeen wanneer u verklaren of te creëren
een variabele kunt u alleen gebruik maken van het binnen van de dichtstbijzijnde omarmen accolades.
Dus wat betekent dat?
Als ik, in plaats daarvan, ongedaan te maken en deze te gaan met iets dat een beetje eenvoudiger voelt.
Rechts?
>> Lijn 32 ziet er gewoon schoner me nu.
Ik doe beide dingen een keer en dan toewijzen
de rechterhand naar de linkerhand.
Het probleem nu gebaseerd op dat de definitie van de reikwijdte
is dat N kan worden gebruikt in lijnen 31 en 32 binnenkant van deze lijn,
maar waar door die definitie kan het niet worden gebruikt?
In de lijn wat?
Ja.
>> Publiek: 35.
>> SPEAKER 1: 35.
Zeker niet 35.
En ook waar anders?
Publiek: 34.
SPEAKER 1: Zelfs 34 is problematisch omdat het
buiten de accolades.
En zo in feite, laten we zien wat er gebeurt.
Rechts?
Dit is misschien een beetje lijken intuïtieve of misschien niet,
maar laten we zien wat de compiler te zeggen wanneer
We gaan in de huidige bron directory.
Maak een functie.
O mijn God.
Nou, ik eindelijk klaar die, door de manier waarop.
Prima.
En wat is het probleem hier?
Zeer geheimzinnige om naar te kijken.
Maar hier is wat ik typed-- maken functie één.
Hier is wat te maken veroorzaakte, die eigenlijk
met behulp van de compiler clang enkele van deze vlaggen
dat we weer zullen zien het duurde niet lang.
En nogmaals, altijd op zoek in de eerste fout,
omdat het misschien gewoon een trapsgewijze betekenisloze effect op andere lijnen.
>> Dus wat dit betekent is dat de probleem is in functie 1.c.
Het is op lijn 32.
En het is in kolom of karakter 13.
Dus als je tekst editor die kan u helpen bepalen waar het probleem is.
Dus als ik u omhoog, wat is lijn 32?
Dat is inderdaad deze dat is al gemarkeerd
rechts hier-- ongebruikte variabele n.
Maar het is niet ongebruikt.
Ik gebruik het.
Maar de compiler verwarde, omdat het bestaat alleen binnen van deze omvang.
En zo kan ik hier niet gebruiken.
Ik kan hier niet gebruiken.
De compiler derhalve zelfs niet schelen dat ik probeer.
Het schijnt ongebruikt te zijn binnen haar werkelijke omvang.
>> Dus we kunnen de mogelijkheden verruimen door te doen precies wat we begonnen met-- int n.
En hoewel het niet kijk zo elegant, misschien,
en we nemen een extra regel hier, nu is het in omvang overal.
Dus laten we het opnieuw proberen.
Dus zorg functie één.
Nice.
En nu, als ik als ik zonder functie een, laten we het negatieve 10,
negatieve 1, 0, 1, en inderdaad werkt.
>> Dus er is een andere oplossing.
Weet je wat?
Wat als ik ben echt worstelen met dit?
Ik weet niet waar de n hoort te gaan.
Weet je wat?
Ik ga gewoon om het te zetten alle manier aan de top van mijn dossier hier.
Wat zou dit doen, denk je?
Ja?
>> PUBLIEK: [onverstaanbaar].
SPEAKER 1: Ja.
Dus ik heb het wereldwijde gemaakt, om zo te zeggen.
Als u een variabele die is buiten al uw functies die is toegestaan,
en de code moet compileren, en n zal nu toegankelijk zijn, niet alleen in get
positieve int, maar ook in main-- waarin is een beetje zorgwekkend omdat er
al een n in de belangrijkste, zodat meer op dat in slechts een moment--
maar dit zou worden beschouwd als slecht ontwerp.
Prima.
Als je toevlucht nemen tot iets als, oh, zal ik
zet ze gewoon hier omdat de code lijkt te compileren
is over het algemeen niet de best practice.
Liever dat je wilt kiezen de kleinst mogelijke scope
voor uw variabelen, wat zou betekenen gaan met onze eerste ontwerp, dat
is hier.
>> Nu als een terzijde, als je had een identieke naam variabele hier
de manier waarop c zou behandelen dit-- hoewel dit niet zal gebeuren te often--
is dat nog prima hier.
Maar deze definitie van n in lijn 22 zal de wereldwijde een schaduw.
Dus dit zal binnen werken main, en de Global One
daadwerkelijk toe te passen wanneer je in krijgen positieve int Maar meer daarover
een andere tijd, maar gewoon voor degenen die nieuwsgierig.
>> Dus in het kort, we dit op te lossen hier.
Laten we nu plagen elkaar twee andere stukken voordat we kijken naar een laatste regel code
in dit programma.
Krijg positieve int.
Aan de linkerkant van het woord is het woord int.
Wat heeft dat te betekenen denk je?
Tot nu toe hebben we meestal gezien leegte.
Ja?
>> Publiek: Het is de aard van de variabele die je vraagt ​​over.
>> SPEAKER 1: Ja, het is het type, laat me niet zeggen variabel, maar de aard van de waarde
dat vraag ik terug voor.
En inderdaad, dat is intuïtieve hier, hopelijk.
Rechts?
Als u wilt een te krijgen positieve int, wat is het u
wil de function-- zoals onze vrijwilligers van de afgelopen week
om je hand terug een stuk papier met een int op het?
En dus hebben we aangegeven dat de zogenaamde return type van deze functie
is krijgen positieve int.
Als we niet willen dat het terug iets, je leegte zeggen.
Als je wilt dat het terugkeren een string, zeg je string.
Als je wilt dat het terugkeren een vlotter, zeg je zweven.
Maar de enige die hier geldt logisch, want ik ben met behulp get int,
hoewel ik beperken tot positieve waarden, is een int retourneren.
>> Dus omgekeerd, wat betekent het dat er een leegte tussen haakjes?
Wat betekenen de haakjes over het algemeen te definiëren?
Ja?
>> Publiek: Het betekent dat de functie eigenlijk niet krijgen van het.
>> SPEAKER 1: Het betekent dat de functie eigenlijk niet krijgen wat?
>> Publiek: Een input.
>> SPEAKER 1: Een input, dan ook.
Dus inderdaad, als haakjes hier kunt leegte opgeeft,
dat betekent gewoon Ik wil geen ingang.
Ik zal omgaan met het probleem zelf.
En inderdaad, je hoeft niet te vertel krijgen positieve int iets.
Je zegt gewoon, krijgt positieve int, en dat functie gaat uit en doet zijn ding.
>> Maar er is een kleine truc ik heb speelt hier de hele tijd
om ervoor te zorgen dat deze code compileert.
Merk op dat int-- positieve krijgen int void-- is op lijn 27.
Maar voor sommige schijnbaar vreemde reden het is ook hier op lijn 16.
En net voor een goede maatregel zal ik herhaal dit dus het is volkomen identiek.
En ik heb gezegd prototype met een kleintje-lijn commentaar.
Wat gebeurt er als ik dat te verwijderen, en nu opnieuw uit te maken functie 1, in te voeren.
Whoops.
Even wachten.
Waar is mijn tab?
Huh?
Standby.
Maak de functie 1.
Daar gaan we.
OK.
Had het niet goed opgeslagen.
Dus, ik denk dat er een beetje bug hier waar ik ben niet
het zien van het tabblad naam op dit moment.
Dus wat is hier aan de hand?
Impliciete verklaring van de functie krijgen positieve int ongeldig is C99.
Dus nogmaals verwarrend.
Dus wat is dit een indicatie van?
Nou, het blijkt dat C is vrij dom.
Nou, het is de programmering taal, of liever de compiler.
Het weet alleen wat je hebt geleerd, en het is slechts
gaat om iets te weten als je het al eerder geleerd.
Met andere woorden, in belangrijkste op dit moment, ik ben
proberen om een ​​functie aan te roepen genaamd krijgt positieve int.
Maar de compiler is niet van plan op te merken dat krijgen positieve int
Er bestaat tot lijn 26.
En dus wat de compiler doet is gewoon fouten zodra het wordt op lijn 17,
zeggen impliciete verklaring van krijgen positieve int, die
is gewoon een mooie manier om te zeggen, ik niet weten wat krijgt positieve int nog.
>> Andere talen zoals Java en Python en Ruby zou vooruit te kijken.
C niet.
En dus is de manier waarop we op te lossen Dit is een van twee manieren.
Ofwel, als het probleem is dat te krijgen positieve int is nog niet eerder gezien,
Nou, laat me verplaatsen alleen maar om de top.
Dat zou dit probleem op te lossen.
Maar in het algemeen, is het beschouwd betere techniek
uw belangrijkste functie gezet bij de zeer top, zodat een mens het lezen van uw code
weet wat het programma doet, omdat de belangrijkste is niet allemaal begraven
de manier waarop aan de onderkant of in het midden.
Het is aan de top.
Dus dat voelt niet ideaal.
En je kunt eigenlijk krijgen in situaties waarin
Als één functie oproepen andere, die een ander noemt,
je kunt krijgen in een probleem waar noch kan gaan boven de ander logisch.
Het is gewoon niet mogelijk.
>> En zo de weg naar het werk rond dit is om gewoon te nemen
handtekening van de functie, om zo te speak-- de eerste lijn waar het declared--
en gewoon kopiëren, plakken op de top, maar niet met krullend braces--
alleen met een puntkomma.
Het is als een kleine hint van wat komen gaat.
En inderdaad, al die tijd toen we hebben dingen als standaard io.h gezien
en cs50.h evenzo in die dot h-bestanden zijn er andere prototypes.
En we zullen zien dat duurde niet lang.
>> Dus in het kort, als je een programma in een bestand met meerdere functies
Naast de belangrijkste, je bijna altijd wil ze verklaren
alleen door middel van de eerste lijn, gevolgd door een puntkomma,
aan de top van het bestand.
Dat was een veel in een keer.
Nog vragen?
Prima.
>> Dus laten we verder gaan dan om zoiets hoest.
Oh.
Hoe passend.
Prima.
Hoesten.
Dus hier is een c uitvoering van een programma
we hebben de andere dag in Kras dat heel gewoon
zegt hoesten, hoest, hoest.
Prima.
En iemand zei een paar dagen geleden dat er
een manier van schoonmaken van deze code up reeds.
Prima?
Zodra je het kopiëren en plakken waarschijnlijk slecht ontwerp.
Minstens één keer krijgen we vier of vijf of 20 hoesten, voelt het slechte praktijken.
We gewoon blijven kopiëren, plakken.
Wat is de voor de hand liggende oplossing het schoonmaken dit programma op?
>> Publiek: Loop.
>> SPEAKER 1: Ja.
Dus gebruik een lus.
En we kunnen een for-lus, een tijdje lus, een aantal benaderingen.
En inderdaad, dat is wat we doen in versie hier.
Ik heb in plaats daarvan is herschreven in één versie van cough.c
gewoon hoesten binnen een for-lus.
Oké, maar er is een kans nu soort van start
om dit een beetje meer als ontwerpen de les die we geleerd een moment geleden,
dat is dit-- veronderstellen dat ik wilde een functie genaamd hoest maken,
laten we eens kijken voor slechts een moment wat het gaat te lijken.
Dus als ik iets wil te hoesten, ik moet gewoon
om af te drukken f gebruiken binnen de functie.
En inderdaad, ik ben.
En inderdaad, dit alles tijd, elke keer dat je bent
afdrukken iets te het scherm, een programmeur
zou noemen dat een neveneffect.
Het is me niet overhandigen weer iemand een waarde.
Het is me het nemen van enkele maatregelen die kunnen visueel duidelijk.
Maar deze functie hoesten, doet terugkeren alles gebaseerd op de eerste lijn?
Nee, want de return type vervalt, wat betekent gewoon
het is niet het uitdelen me iets terug.
Het zou iets moeten doen visueel, maar het is me niet overhandigen
achter een stuk papier als vorige week.
>> Is het een input nodig?
Nee.
En zo is het hier leegte ook.
Dus ook dit is een soort van over-engineering van dit probleem.
Rechts?
Ik heb het programma gemaakt complex, meer regels code,
Ik heb het niet gedaan functioneler, maar dit
zou een opstap zijn, misschien voor een bredere
context met meer ingewikkelde code.
Maar hoe zit dit?
Wat heb ik done-- net blik op Dit zonder te kijken naar de reactie
op de top van de file-- wat heb Ik hier fundamenteel gedaan met mijn hoest
implementatie is dat anders?
Ja, in de rug?
>> Publiek: Maak het dus je kunt een karakter uit te schakelen.
SPEAKER 1: Ja.
Dus dit voelt wel leuk.
Rechts?
Het is als het toevoegen van een functie om uw programma of de functie, in dit geval.
Het geeft nog steeds niets.
Het kan een visueel bijwerking hebben, want het roept afdruk f.
Maar nu heb ik geparametriseerd de functie die
betekent dat ik heb opgegeven genomen ingang van het type int en noemen het n,
maar ik kon het wat ik wil bellen.
In feite zou het gewoon keer nog meer expliciet zijn.
En toen kon ik dit veranderen hier.
Maar het punt is dat dit is hoe ik maak een functie die input neemt.
En als je herinneren flipping door middel misschien online in een
van de walk-throughs, de vierde en laatste hoest bijvoorbeeld,
je zult hier opmerken ik gegeneraliseerd mijn code further-- soort geabstraheerde
verder.
Zoals hoesten en niezen, beide zijn ongeveer net iets te zeggen of het maken van
een soort van geluid.
Save zou de overeenkomstige Scratch blok.
En dus wat ik deed in deze versie, die we kunnen alleen maar een blik werpen op,
is hoest is net als zeggen, [HOEST] hoesten, en ondertussen, niezen is
als zeggen, [ACHOO].
En dus heb ik gegeneraliseerd de uitvoering van die
nu implementeren deze generieke functie,
zeggen, wat interessant voor doeleinden van vandaag
alleen omdat het nog heeft geen return type.
Maar hoeveel ingangen heeft het?
Publiek: Two.
SPEAKER 1: Two.
En dus als je wilt in twee argumenten,
gewoon ze te scheiden met een komma.
En als je wilt dan noemen die functie,
merken dat je gewoon roepen we zeggen, citaat, unquote,
voor het eerste argument, gemeenschappelijke n, voor het tweede argument.
Dus nogmaals, we hebben nu net de bouwstenen, zodat we kunnen eigenlijk
uitvoering van een aantal van onze eigen functies.
Prima.
Heeft u vragen over deze?
>> Dus laten we nu schil terug een laag zo.
En het doel, uiteindelijk, is het probleem set volgende week
gaat worden op cryptogrophy-- de kunst van het klauteren informatie.
En in het bijzonder de informatie zal u coderen of decoderen
gaat tekst.
En zo dat soort uitnodigt de vraag van vandaag, zoals goed,
wat er gaande is onder de motorkap met tekst verder ASCII van week nul,
En hoe kunnen we eigenlijk beginnen te manipuleren?
Dus hier is de naam Zamyla's.
En in tekst, kan dat worden ingevoerd in als de get snaar functie.
En het starten van nu, wanneer u een string als dit-- Z-A-M-Y-L-A--
beginnen te denken aan het als hoewel elk van de tekens in een doos zijn
eigen.
En inderdaad, in een week of zo is tijd, elk van deze dozen
gaat heel specifiek te vertegenwoordigen een blok van memory-- een beet van het geheugen.
Dus elk van deze brieven, Uiteindelijk zal 8 bits representeren.
En we zullen echt zien wat er gaande op onder de motorkap in mijn computer.
>> Maar niet volstaat gewoon om te kijken naar Zamyla
door deze lens, waarbij elk van deze brieven is in zijn eigen doos.
En mooi genoeg in C kunnen we toegang tot elk van deze dozen direct.
Dus als je wilt het eerst letter van haar naam, super makkelijk in C.
Wilt u de laatste krijgen brief, super eenvoudig en
met een stuk van de nieuwe syntaxis.
>> Dus ik ga om verder te gaan in CS50 IDE en het openstellen van de snaar nul punt C.
En in dit voorbeeld hier zijn er een paar nieuwe dingen aan de hand.
Dus eerst in de lijn 19, we hebben gezien deze before-- get string.
Dus gewoon als een snelle sanity check, als iemand verbaal kon bieden tot
uitleg van een leek wat er gaande is in de lijn 19.
Als dit gewoon vertalen in Engels dat een huisgenoot niet in CS50
misschien begrijpen.
Ja.
>> Publiek: Laat de input van de gebruiker een string en op te slaan in een variabele s.
SPEAKER 1: Good.
Laat de input van de gebruiker een string en op te slaan in een variabele s.
Dat is geweldig.
Dus aan de rechter kant, noemen we get string.
Dat geeft een waarde dat werd niet toegewezen
van rechts naar links kant in een variabele genaamd s dat is
ontworpen om een ​​string te slaan.
Precies.
>> Dus nu lijn 22, per het commentaar in de lijn 21,
uiteraard drukt die string één teken per regel.
Maar hoe?
Dus allereerst initialiseren we I 0.
En hoe komen we aan het einde van de naam Zamyla's?
Nou, aan het einde van Naam Zamyla's, ik kon
handmatig in het laatste teken van haar naam of andere manier, of het aantal ervan.
Rechts?
Als we terug gaan hier-- Z-A-M-L-- Y-L-A-- dus ik kon typen in.
Wat is de index van Laatste brief Zamyla's?
Als dit 0-- spreken als een programmer-- 0, 1, 2, 3, 4, 5,
Ik heard-- zo inderdaad, de laatste letter in naam Zamyla is de zesde,
maar als we tellen van 0, het gaat om nummer 5 te zijn.
Dus hou dat in gedachten hier.
>> Het blijkt dat er een functie in C genaamd strlen, en terug in de dag
en tot op de dag nog steeds, veel programmeurs
kiezen om namen te synchroniseren van hun functies die klinken als de woorden
ze proberen te zeggen.
Dus strlen is tekenreekslengte.
En wat zou tekenreekslengte van S terugkeren wanneer Zamyla is de input?
>> Publiek: Five.
>> SPEAKER 1: Z-A-M-Y-L. Zes.
Rechts?
Wat is de lengte van de naam Zamyla's?
Rechts?
En net in werkelijkheid zes letters.
Rechts?
En wat betekent dat voor onze loop?
We gaan om te gaan van 0 tot zes, waarbij
gaat ons vijf iteraties geven.
Wat doen we op elke iteratie?
Nou, procent C, iemand geraden de andere dag,
betekent een tijdelijke aanduiding voor wat?
>> Publiek: Char.
SPEAKER 1: Gewoon een char.
Dus een enkele character-- niet meerdere personages als een string.
En dan is hier de nieuwe lijn dat we hebben uit te printen.
En dan is hier de nieuwe syntaxis.
Als u wilt afdrukken uit de i-de teken in de reeks S, zogezegd,
kun je gewoon zeggen dat de Naam van de string S,
en open vervolgens vierkante haken, en dan gesloten vierkante haken, met een i
het midden.
En het is wel leuk in die Het soort ziet eruit als een plein
net als de pleinen waar Zamyla's tekens bestaan ​​op die foto daar.
>> Dus als ik dit eigenlijk run Nu, laten we eens kijken wat er gebeurt.
Maak touwtje 0 dot slash touwtje 0, en dan ben ik
gaan type in naam van Zamyla's.
Er is geen prompt, omdat ik niet Gebruik afdruk f, maar dat is prima.
Ik weet precies wat te doen.
En inderdaad, het afgedrukt Zamyla naam, één per regel.
>> Laten we nu eens een beetje roekeloos.
Stel dat ik niet wist over strlen en ik dacht,
oke, niemand gaat om een ​​hebben noem groter dan als 50 tekens.
Laten we verder gaan en opnieuw te compileren dit en opnieuw uitvoeren, en typ in Zamyla
weer.
Logisch, wat is de programma gaat proberen af ​​te drukken?
Z-A-M-Y-L-A dan als 45 onbekend bytes van het geheugen.
En inderdaad, we zullen terugkomen dit idee geheugen.
Maar gewoon logisch, als Naam Zamyla is deze lange,
zoals in de foto hier, wat we zeggen
is blijven drukken, blijven drukken, houden printen, houd printen, houd printen,
tot aan de 50 karakter, die wie weet wat er gaat gebeuren.
Dus laten we eigenlijk een kijkje nemen.
Laten we type in Zamyla.
Interessant.
We hadden geluk.
Gewoon een hele hoop van witte ruimte.
Oh.
Er is een funky karakter.
Het ziet eruit als een soort van rare vraag markeren daar, maar er is de naam Zamyla's.
Laten we heel roekeloos.
Zullen we uitprinten 500 blokken in het onbekende?
Laten we verder gaan en maken deze zo goed en vervolgens opnieuw run.
En het volledige scherm, want laten we we nodig hebben om meer ruimte te zien.
Zamyla.
Kreeg weer geluk.
>> Durven we meer roekeloos?
Laten we meer roekeloos.
50.000 karakters.
Dit is zeer zeker geen goed idee.
Prima.
Maak touwtje 0.
Dit zal onze laatste demo.
Zamyla.
Ugh.
OK.
Dus mijn geheugen is echt leeg is nu, dat is eigenlijk wel handig.
Wat ik probeer te to-- krijgt alle recht.
En nu ben ik gewoon gaan om roekeloos te krijgen.
500.000.
Make-- full-screen laten we het.
Enter.
Zamyla.
Daar gaan we.
Ik heb geen idee wat dat is, maar het klinkt slecht.
Prima.
En in feite, snel, als je onder de gelukkige paar in de kantooruren
en in probleem te stellen één, u heel goed zou kunnen tegenkomen dit.
Segmentatie fout eigenlijk doet een goed gedefinieerde betekenis.
Het betekent een vergissing betreffende een segment van het geheugen.
En in termen van de leek, het betekent dat we aangeraakt
memory-- gebruikten we RAM in mijn computer dat ik geen toegang tot zou hebben gehad.
En dat is wat zowel krachtig en gevaarlijk
over C is dat je eigenlijk hebben vrije toegang
om het geheel van het geheugen van uw programma of bytes of RAM, specifieker.
>> Dus hoewel de naam Zamyla's is slechts zes tekens lang,
Ik kan nog steeds overal in het geheugen ik wil.
En als een terzijde, als je hebt ooit enige artikel te lezen
via over enkele jaren server of een programma
krijgen gekraakt of gehackt dat is gebruik gemaakt van iets
heet een buffer overflow exploiteren dat we eigenlijk
praten over een paar weken, dat is over het algemeen te verwijzen naar een of andere manier tricking
een computer in goed gaat voorbij de grenzen van het geheugen
die het zou moeten hebben, en het vinden van iets sappige
doordat een memory-- wachtwoord, misschien, een manier
omzeilen enkele serienummer controleren, of gewoon in het algemeen in staat
truc de computer uitvoert code die niet bedoeld was.
Maar laten we terugkomen op realiteit voor een moment
wanneer dit programma was geïmplementeerd strlen,
en de invoering van één ding hier.
Wat is nieuw bij deze top drie lijnen?
>> Dus reeks dot h.
Het blijkt dat er deze bibliotheek genoemd String Dot H, of de String Library,
waarvan de header-bestand, om zo te zeggen, is touwtje dot h, dat geeft me
de toegang tot deze strlen functie.
Als ik dat achterwege te laten, de compiler is gaat schreeuwen tegen me in een bepaalde vorm.
Maar weet je wat?
Laten we nu echt genuanceerd.
In lijn 22, er is iets soort van inefficient-- slecht ontworpen,
arguably-- over deze lijn van code.
Denk terug aan hoe for-lus worden uitgevoerd
en welke stappen weer gebeuren en opnieuw en again-- de initialisatie,
de conditie, de code die wordt uitgevoerd, dan is de toename
of de verandering, zou de conditie, dan is de code, dan is de verandering, dan
de aandoening, dan is de code, wordt deze verandering, enzovoort.
Dus wat is misschien een beetje zorgwekkend of slecht hier gedaan?
Ja, in het blauw.
Publiek: strlen is genoemd vele malen.
SPEAKER 1: Ja.
Dus strlen heet vele malen, maar wat is
de lengte van de naam van de Zamyla eerste keer dat de lus wordt uitgevoerd?
>> Publiek: Zes.
>> SPEAKER 1: Zes.
Nou, wat is de lengte van haar naam de tweede keer dat de code wordt uitgevoerd?
>> Publiek: Zes.
>> SPEAKER 1: Oké.
Het is nog steeds zes.
Rechts?
Naam Zarla's heeft niet veranderd, zelfs als ik ben op zoek
op slechts een deel van de brieven in haar naam.
En dus het feit dat ik effectief deze vraag, wat is
de lengte van Zamyla, wat is de lengte van Zamyla, wat is de lengte van Zamyla,
zes verschillende tijden, of zeven ook, is gewoon dom,
want dat is onveranderlijk dat antwoord.
En dus wat ik kon eigenlijk doen is dit-- in string één
Ik heb een iets betere versie hier.
Er-- whoops-- touwtje twee Ik heb een marginaal betere versie, waarin
Ik doe dit-- in plaats van enkel initialiseren i op 0, heb ik ook met een komma
verklaren een tweede variabele genaamd N-- Ik hoef niet te int nogmaals zeggen.
Ik mag niet, in feite.
Maar ik zeg n.
En dan initialiseren I n om de strlen van n, zodat nu
hoe vaak komt strlen word uitgevoerd in totaal?
Maar een keer.
En dus dit is wat we bedoelen eerder over een beter ontwerp.
Eigenlijk een keer uw code correct is, terug te gaan en doordenken,
ben ik met zo weinig memory of enkele seconden
of milliseconden van de computer van de tijd als mogelijk om een ​​probleem uit te voeren?
En ik ga om te scrollen en noem
dat er deze melding van null in deze versie,
maar we zullen terug te komen dat duurde niet lang.
Want voor nu, laten we een kijkje nemen naar waar dit gaat om ons te leiden.
Dus een, blijkt dat nu dat we de mogelijkheid hebben
om te kijken naar de individuele personages, kunnen we iets benutten
van week 0, dat zeer mysterieuze was en soort oninteressant op het moment.
Maar nu, en vooral wanneer we krijgen om cryptografie in een week,
het gaat behoorlijk krachtig.
Het blijkt dat met een aantal data types-- ints en praalwagens
en tekens en strijkers en andere things-- een aantal van hen
kan heel eenvoudig worden omgezet naar een andere.
>> Bijvoorbeeld, wanneer we praatten over ASCII enige tijd ago-- hier
de hoofdletters A door middel van M, puntje, puntje,
dot-- wij zeiden dat er een mapping tussen deze letters en cijfers.
En in feite, het waar houdt voor kleine letters als goed.
Kleine een is 97, de hoofdstad van een 65.
En er is een aantal in ASCII, dat is gewoon dit in kaart brengen
voor al die andere letters.
Dus wat betekent dat?
Nou, ik ga verder open gaan up echt snel iets geroepen
ASCII 0, waarvan de meeste reacties.
En weer online kunt u altijd blik door de commentaren.
>> En neem een ​​kijkje wat dit gaat doen.
Dus het heeft een belangrijke functie.
Ik heb hard-coded de nummers alleen voor nu, omdat ik weet wat ik doe.
Ik weet wat ik wil hier te zien.
En ik heb ik geïnitialiseerd op 65.
En ik ben tellen door middel van 26 letters in totaal.
En wat ga ik afdrukken van een regel in een tijd
als je kunt interpreteren Dit benadrukt lijn?
Wat wordt er afgedrukt?
Ja.
>> Publiek: Gaat u de brief af te drukken dat
komt overeen met de kaart van de letter waarde en integer waarde?
SPEAKER 1: Precies.
Ik ga de brief af te drukken overeenkomend met de gehele waarde,
en vice versa, als volgt.
Nou, dit, iemand al eerder zei, is slechts een tijdelijke aanduiding voor een char.
Het blijft.
Dit, natuurlijk, is een placeholder voor een int-- niet een nieuwe regel.
En nu ziet, mijn eerste waarde Ik ben het aansluiten van voor die placeholder
is niet alleen I. ben ik zeggen, haakjes, char I,
waarbij de haakjes char is vertelt de compiler, behandel ik
niet wat het is dat een getal.
Behandelen als een echte karakter.
Terwijl de tweede waarde Ik inpluggen in-- Ik-- moet gewoon een getal zijn.
>> Dus als ik dit program-- compileren dus dit is het maken van ASCII 0,
dot slash ASCII 0-- ik krijg net Deze handige kleine grafiek die
laat me alle mogelijke mappings zonder erover na te denken
via of het uit op mijn eigen.
En ik ben ook uit te printen, let op de kleine letters,
omdat een paar regels later, I ook uitprinten dit mapping
als goed, dat is gewoon te zeggen dat als je eenmaal begrijpt
wat er onder de kap, kunt u
automatisch om te zetten heen en weer.
En in feite, als iemand van u dit ooit op de lagere school deed
of gehoord over iemand mythisch nemen van een nota
en deze aan zijn of haar vriend in de klas,
maar u roerei het letters door zoals A wordt B,
B en C wordt, of iets ingewikkelder dan dat, nou ja,
hoe zou je gaan over het uitvoering van dat als een kind?
Nou, je gewoon een soort van weten A wordt B, B wordt C,
maar mathematisch, wat was dat kind aan het doen?
Wat was je toe te voegen aan elke letter?
Effectief, 1.
>> Dus als u een wijziging naar B, dat is net zoiets als het veranderen van 65-66,
die mathematisch betekent gewoon voeg 1.
En dus als je uit te voeren dat beetje misleidend techniek
voor je leraar in de code, u misschien dat precies doen
door het toevoegen van een enkele letter samen.
Dus voordat lang, we zijn gaan hoe we zien
kunnen profiteren van die daadwerkelijk oprecht scramble en decoderen
informatie.
In de tussentijd, weten dat we zijn begonnen om een ​​paar andere bibliotheken te introduceren
hier-- de string een vandaag.
En een zeer behulpzame website Hopelijk vindt u
heet reference.cs50.net, die het onderwijzend personeel hebben in elkaar gezet,
zodat als je wilt opzoeken hoe strlen werken,
u kunt beginnen met typen naam van de functie,
klik er strlen, en vervolgens een minder comfortabel uitleg
zal verschijnen.
Of als u wilt dat de officiële Linux-gebaseerde verklaring,
kunt u meer comfortabele klik rechtsboven, en het
Dezelfde informatie presenteren maar in meer complexe voorwaarden.
Dat is een nuttig middel om eigenlijk weten wat alles doet.
>> Volgende keer gaan we een kijkje nemen op Ovaltine
en meer, en onszelf te introduceren in de wereld van cryptografie.
Voor die tijd, we zullen zien je later deze week.
En nu, Colton Ogden.
Zie je op woensdag.
>> [Muziek]
>> SPEAKER 1: Wat de [BLEEP] doe je?
>> SPEAKER 1: Ik eet mijn toetje?
Hoe doe je dat eten?
Met je handen?
>> [Muziek]