[Powered by Google Translate] [Artikel 4] [Minder Gerieflik] [Nate Hardison] [Harvard Universiteit] [Hierdie is CS50.] [CS50.TV] Alle reg, welkom terug na artikel. In hierdie week se artikel gaan ons 'n paar dinge om te doen. Ons gaan eerste herhaling Problem Set 2, wat is die keiser en Vigenère probleem stel. En dan gaan ons om te duik in Quiz 0 review en spandeer 'n bietjie van die tyd recapping wat ons het gepraat oor in elk van die lesings so ver, en ons sal ook 'n paar probleme van die vorige jaar se vasvrae. Dat julle ouens het 'n goeie manier om voor te berei vir daardie. Om mee te begin, ek het geselflaai 'n paar goeie oplossings vir die vorige probleem stel, Problem Set 2, in hierdie ruimte. As julle al hierdie skakel getref, en as jy kliek op my naam en kliek op my eerste hersiening jy sal sien caesar.c, wat is presies wat ek is op soek na. Kom ons praat oor dit regtig vinnig. Dit is net 'n voorbeeld oplossing. Dit is nie noodwendig die ideale oplossing. Daar is baie verskillende maniere om dit te skryf, maar daar is 'n paar dinge wat ek wou na vore te bring wat ek gesien het as ek die formaat, algemene foute wat ek dink hierdie oplossing nie 'n baie goeie werk van hantering. Die eerste is 'n soort van header kommentaar op die top. Op die lyne 1 deur 7 sien jy die besonderhede, presies wat hierdie program doen. 'N goeie standaard praktyk wanneer jy wil skryf C-kode ongeag of jou program is vervat in 'n enkele lêer of of dit nou oor veelvuldige lêers verdeel is 'n soort van te hê oriënteer kommentaar aan die bokant. Dit is ook vir mense wat uitgaan en skryf kode in die werklike wêreld. Dit is waar hulle sal sit inligting oor kopiereg. Hier is die # sluit. On line 16 daar is dit # definieer, wat ons sal terug kom in net 'n bietjie. En dan weer die funksie begin, een keer belangrikste begin, omdat hierdie program is alles vervat in 'n enkele funksie die heel eerste ding wat gebeur en dit is baie idiomatiese en tipies van 'n C-program wat neem in command line argumente is dat dit onmiddellik kontroleer vir die argument tel, argc. Hier sien ons dat hierdie program 2 argumente verwag presies. Onthou daar is dat die eerste argument wat is die spesiale een dit is altyd die naam van die program wat loop, die naam van die uitvoerbare lêer. En so wat dit doen, is dit verhoed dat die gebruiker van die bestuur van die program met meer of minder argumente. Die rede waarom ons wil om te kyk vir hierdie reg te ontneem is omdat ons kan eintlik nie toegang tot hierdie bevat SPASIES skikking reg hier betroubaar totdat ons het nagegaan om te sien hoe groot dit is. Een van die algemene foute wat ek gesien het, was mense sal onmiddellik in te gaan en gryp bevat SPASIES [1]. Hulle het die belangrikste argument gryp uit van die skikking en doen 'n Ek is so op, en dan wil hulle die toets doen vir argc sowel as die volgende toets, of nie die eerste argument was inderdaad 'n heelgetal is op dieselfde tyd, en dit beteken nie omdat werk in die geval dat daar geen argumente verskaf jy gryp 'n argument wat nie daar is nie of probeer een wat nie daar is nie aan te gryp. Die ander groot ding wat jy moet let is dat wil jy altyd uit te druk 'n soort van nuttige fout boodskap aan die gebruiker te oriënteer. Ek is seker jy het alle programme uit te voer waar almal van 'n skielike dit omval, en jy kry hierdie belaglike klein dialoogkassie wat verskyn en sê iets verskriklik kriptiese en miskien gee jy 'n fout kode of iets soos dit Dit maak nie sin nie. Dit is waar jy regtig wil iets nuttig om voorsiening te maak en gerig aan die gebruiker, sodat wanneer hulle loop dit hulle gaan "O," gesig palm. "Ek weet presies wat om te doen nie ek weet hoe om dit op te los." As jy nie 'n boodskap te druk, dan beland jy eintlik die verlaat van die gebruiker om te gaan ondersoek jou bronkode om uit te vind wat verkeerd geloop het. Daar is ook 'n paar keer dat jy sal gebruik om verskillende fout codes. Hier het ons net gebruik om te sê daar was 'n fout, daar was 'n fout, daar was 'n fout. Groter programme, dikwels programme wat deur ander programme genoem word, sal 'n soort van spesiale fout codes in verskillende scenario's terug om programmaties te kommunikeer wat jy andersins sou net gebruik om 'n mooi Engelse boodskap. Cool. As ons werk, kan jy sien ons trek die sleutel uit. Ons toets om te sien as die sleutel pas. Ons kry 'n boodskap van die gebruiker. Die rede waarom ons dit doen in hierdie while lus-en dit is iets wat ons sal dek in 'n bietjie, maar dit blyk dat as jy tik beheer D wanneer jy daardie GetString vinnige op die terminale wat eintlik nie, is dit stuur 'n spesiale karakter tot die program. Dit is bekend as die ELF of die einde van die lêer karakter. En in daardie geval, sal ons boodskap string null, so dit was nie iets wat ons nagegaan in die probleem homself. Maar soos ons aangaan, nou dat ons het begin om te praat oor pointers en dinamiese geheuetoekenning op die hoop, kontrole vir null wanneer jy 'n funksie wat dalk terug null as 'n waarde is iets wat jy wil te kry in die gewoonte om dit te doen. Dit is hier hoofsaaklik vir illustrasie. Maar wanneer jy dit doen sien GetString in die toekoms, van Problem Set 4 op, sal jy wil om dit in gedagte te hou. Weereens, dit is nie 'n kwessie vir die Probleem Stel 3 óf omdat ons het dit nie gedek nog. Ten slotte, ons kry om hierdie deel waar ons aan die hoof enkripsie lus, en daar is 'n paar van die dinge wat hier aangaan nie. Die eerste, ons itereer oor die hele boodskap string self. Hier het ons die strlen oproep in die toestand bewaar, wat 'n aantal van julle het uitgewys is nie 'n goeie manier om te gaan. Dit blyk in hierdie geval is dit ook nie groot, deels omdat ons die wysiging van die inhoud van die boodskap self die binnekant van die lus, so as ons 'n boodskap wat 10 karakters lank is, die eerste keer het ons begin dat lus strlen wat sal terugkeer? 10. Maar as ons dan verander boodskap, sê ons sy 5de karakter te verander, en ons gooi in 'n \ 0 karakter in die 5de posisie, op 'n daaropvolgende iterasie strlen (boodskap) sal nie terugkeer wat dit gedoen het die heel eerste keer dat ons herhaalde, maar in plaas daarvan sal terugkeer 5 omdat ons in daardie null terminator gooi, en die tou se lengte word gedefinieer deur die posisie van daardie \ 0. In hierdie geval, dit is 'n goeie manier om te gaan, want ons pas dit in plek. Maar jy sien dat dit eintlik verbasend maklik om te enkripteer as jy kan kry die wiskunde korrek is. Al wat nodig is, is om seker te maak of die letter wat jy is op soek na hoofletters of klein letters. Die rede waarom ons het net om te kyk vir dit en ons het nie om te kyk vir die alfa geval is omdat as 'n karakter is hoofletters of indien dit is kleinletter dan is dit beslis 'n alfabetiese karakter, want ons het nie hoofletters en kleinletters syfers. Die ander ding wat ons doen en dit is 'n bietjie lastig- is dat ons het verander die standaard Caesar cipher formule wat het ons in die probleem stel spesifikasie. Wat is anders hier is dat ons afgetrek in die hoofletters geval kapitaal A, en dan het ons bygevoeg kapitaal A terug in aan die einde. Ek ken 'n paar van julle dit gedoen het in jou kode. Het enige van julle doen dit in jou voorleggings? Jy dit gedoen het. Kan jy verduidelik wat dit doen, Sahb? Deur trek dit uit, want jy het 'n mod reg nadat dit, jy het dit om uit te neem, sodat jy [hoes] posisie. En dan deur dit later weer verskuif oor die een wat jy wou. Ja, presies. Wat Sahb gesê het, is dat wanneer ons wil om by te voeg ons boodskap en ons sleutel saam en dan mod dat mod dat deur NUM_LETTERS, as ons skaal nie ons boodskap in die toepaslike 0 tot 25 reeks die eerste keer, dan kan ons uiteindelik kry 'n baie weird aantal omdat die waardes wat ons is op soek na wanneer ons kyk na die boodskap [i], wanneer ons kyk na die met karakter van ons plat teks boodskap, is 'n waarde iewers in die 65 tot 122 reeks gebaseer op die ASCII-waardes vir die hoofletters A deur kleinletters z. En so wanneer ons dit deur 26 of deur NUM_LETTERS mod, want dit was ons # define hier bo aan die regterkant, wat gaan om te gee vir ons 'n waarde wat in die 0 tot 25 reeks, en ons moet 'n manier om dan skaal wat back-up en kry dit in die toepaslike ASCII reeks. Die maklikste manier om dit te doen, is om net te skaal alles in die 0 tot 25 reeks om te begin, en dan skuif alles terug aan die einde. Nog 'n algemene fout wat ek gesien het mense loop in is dat As jy dit nie doen nie hierdie skalering dadelik en jy voeg boodskap en sleutel saam en voeg jy hulle, sê, in 'n char veranderlike, die probleem met sedert die boodskap is [i] is 'n relatief groot aantal om te begin met onthou dit is ten minste 65 indien dit is 'n hoofletter karakter- as jy 'n groot sleutel, sê, iets soos 100, en jy voeg die 2 saam in 'n getekende char jy gaan 'n oorloop te kry. Jy gaan om 'n waarde te kry wat groter as 127, wat is die grootste waarde wat 'n char veranderlike kan hou. Weereens, dis hoekom jy graag wil hê dat die soort van ding is om te begin met te doen. Sommige mense het rondom daardie geval deur die doen van 'n as anders en toetsing om te sien of dit sal oorloop voor om dit te doen, maar hierdie manier kry om dat. En dan is ons in hierdie oplossing gedruk die hele string aan die einde. Ander mense 'n karakter op 'n keer gedruk. Beide is awesome. Op hierdie punt, het julle enige vrae het, enige kommentaar oor hierdie? Dinge wat jy wil, dinge wat jy wil nie? Ek het 'n vraag. Miskien het ek dit gemis het tydens jou verduideliking, maar hoe hierdie program slaan die spasies vir die koppeling van die sleutel tot die lengte van die teks? Dit is net die keiser cipher. >> O, jammer, ja. Ja, sal ons sien dat. In die keiser cipher ons het rondom daardie, omdat ons net omgekeer karakters. Ons het net het hulle gedraai as hulle was hoofletters of klein letters. Julle ouens voel redelik goed oor hierdie? Voel vry om hierdie huis te kopieer, neem dit, vergelyk dit met wat julle geskryf het. Beslis voel vry om vrae daaroor te stuur. En weer besef dat die doel hier met jou probleem sit is nie julle ouens te kry om perfekte kode vir jou probleem stelle te skryf. Dit is 'n leerervaring. Ja. Terug na die doen terwyl lus, indien dit gelyk is aan nul, so null net beteken niks, hulle het net Enter? Null is 'n spesiale pointer waarde, en ons gebruik null wanneer ons wil sê ons het 'n wyser veranderlike wat verwys na niks. En so tipies, beteken dit dat hierdie veranderlike, hierdie boodskap veranderlike is leeg, en hier, omdat ons met behulp van die CS50 spesiale string tipe, wat is die CS50 string tipe? Het jy al gesien wat dit is wanneer Dawid trek terug die enjinkap in die lesing? Dit is 'n funky-dit is 'n wyser, reg? Okay, ja >> Dit is 'n char *. En so het regtig ons kan vervang reg hier met char * boodskap, en so die GetString funksie, indien dit nie suksesvol nie 'n string van die gebruiker, dit kan nie 'n string parse en die een geval waarin dit 'n string kan nie word geparseerd is as die gebruiker die einde van die lêer karakter, die beheer D, wat is nie iets wat jy gewoonlik doen, maar as dit gebeur dan is die funksie sal hierdie null waarde terug te kom as 'n manier om te sê "Hey, ek het nie 'n string." Wat sou gebeur as ons nie die boodskap '= null, dit is iets wat ons is nog nie te doen? Waarom sou dit wees 'n probleem hier? Omdat ek weet dat ons gepraat het 'n bietjie in die lesing oor die geheue lekkasies. Ja, laat ons doen dit, en laat ons sien wat gebeur. Basil se vraag was wat gebeur as ons nie eintlik nie hierdie boodskap = null toets? Kom ons blaai na die top. Julle ouens kan nie kommentaar lewer dit uit. Eintlik, ek stoor dit in 'n hersiening. Dit sal Hersiening 3. Wat jy hoef te doen om hierdie program uit te voer, moet jy hierdie rat-ikoon te kliek hier, en jy sal hê om 'n argument te voeg. Jy het om te gee dit die belangrikste argument sedert ons wil om te slaag in 'n command line argument. Hier is ek gaan dit gee die nommer 3. Ek hou van 3. Nou terug inzoomen, die uitvoer van die program. Dit is hardloop, samestelling, bou. Hier gaan ons. Dit is wat wag om te word gevra. As ek tik in iets soos hello-waar het dit gaan? O, my program het te lank om te hardloop. Ek was jawing vir te lank. Hier gaan dit. Nou ek tik in Hello. Sien ons dat dit gepas versleutelt. Nou wat gebeur as ons vinnige GetString doen null om terug te keer? Onthou, ek het gesê dat ons het dit gedoen deur te druk beheer D op dieselfde tyd. Ek sal hier Scroll up. Ons sal dit weer hardloop. Gebou. Daar gaan dit. Nou toe ek beheer D Ek het hierdie lyn wat sê opt/sandbox50/bin/run.sh, segmentering skuld. Het julle gesien dat voor? [Studente] Waarom is daar geen >> Jammer? [Studente] Waarom is daar geen kern dump in hierdie geval? Die kern dump is die vraag hoekom is daar geen kern dump hier? Die vraag is dat daar ook mag wees, maar die kern dump is 'n lêer kry op die hardeskyf gestoor. In hierdie geval het ons het afgeskakel kern dumps op die run-bediener, sodat ons mense nie seg verskuiwings en die opbou van ton van kern dumps. Maar jy kan een kry. Core dumps is die soort van ding wat jy kan dikwels afskakel, en soms wat jy doen. Die segmentering skuld, jou vraag te beantwoord, Basil, sê dat ons probeer om 'n wyser om toegang te verkry tot dit was nie om te verwys na iets. Onthou Binky in die video wanneer Binky probeer gaan toegang tot 'n wyser wat nie verwys na iets? In hierdie geval dink ek tegnies die wyser wys na iets. Dit verwys na null, wat is tegnies 0, maar dit word gedefinieer om te wees in 'n segment wat nie toeganklik deur jou program, sodat jy 'n segmentering skuld omdat jy nie geheue toegang tot wat in 'n geldige segment soos die hoop segment of die stapel segment of die data segment. Cool. Enige meer vrae oor die keiser? Kom ons gaan. Kom ons kyk na Hersiening 2 regtig vinnig. Dis Vigenère. Hier in Vigenère ons sal wandel deur hierdie een redelik vinnig, want, weer, Vigenère en Caesar is baie soortgelyk. Selected kommentaar is voor, # Define is voor om te verhoed dat die gebruik van hierdie magic nommers. Die nice ding is om te sê ons wou om te beweeg 'n ander alfabet of iets soos dit. Eerder as om met die hand te gaan al die 26's in die kode verander ons kan verander om dit te 27 of gooi dit neer as ons die gebruik van verskillende alfabette, verskillende tale. Weereens, ons het hierdie tjek van die argument tel, en jy regtig kan amper neem hierdie as 'n sjabloon. Pretty much elke program wat jy skryf, moet as wat dit neem command line argumente n reeks van lyne wat lees soos dit aan die begin. Dit is een van die eerste gesonde verstand toetse wat jy wil doen. Hier is wat ons gedoen het, was ons seker gemaak dat die sleutelwoord geldig was, en dit was die tweede tjek wat ons gedoen het. Let weer op dat ons geskei van argc en 2. Let daarop dat in hierdie geval een ding wat ons moes doen, in plaas van die gebruik van 'n i ons wou die hele string te valideer, en om te doen wat jy eintlik karakter om te gaan deur die karakter oor die tou. Daar is nie 'n goeie manier om iets op te roep want selfs, byvoorbeeld, 'n ek sal terugkeer 0 as dit 'n heelgetal nie kan pars nie, sodat nie eens werk. Weereens, mooi boodskap van die gebruiker presies wat gebeur het. Dan weer, hier, ons hanteer ook die geval waar die gebruiker tipes in 'n beheer-D random karakter. En dan Charlotte het 'n vraag vroeër oor hoe ons bestuur ruimtes te slaan in ons string hier. Dit was soort van soortgelyk aan wat ons gedoen het met die Myspace program wat ons gedoen het in die artikel, en die manier waarop dit gewerk is dat ons die aantal briewe wat ons gesien het nagespoor. Soos ons gestap oor die boodskap string, soos ons gestap oor die karakter deur karakter, ons nagespoor die indeks as deel van ons loop, en dan moet ons ook opgespoor die aantal letters, so nie spesiale karakters, nie-syfers, nie-wit ruimte wat ons gesien het in die afsonderlike veranderlike. En dan hierdie oplossing verander die sleutel 'n werklike sleutel heelgetal te kry, en dit beteken dat op die vlieg, reg voor gaan dit dan die werklike boodskap karakter te enkripteer. Daar is 'n paar oplossings wat was perfek groot te wat sou die sleutel verander wanneer die toets vir die sleutel se geldigheid. Behalwe om seker te maak dat die karakter en die sleutelwoord is 'n alfabetiese karakter is dit ook draai dit in 'n heelgetal in die 0 tot 25 reeks te slaan om te doen wat later in hierdie lus. Weereens, wat jy hier sien dit regtig is presies dieselfde kode wat ons gebruik in Caesar op hierdie punt. Jy het presies dieselfde ding doen, sodat die werklike truuk uitzoeken hoe die term om te draai in 'n heelgetal. Een ding wat ons hier gedoen het, wat is 'n bietjie dig is dat ons hierdie frase herhaal, ek dink jy dit kan noem, 3 verskillende tye op die lyne 58, 59, en 61. Kan iemand verduidelik wat presies hierdie frase nie? Dit is toegang tot 'n karakter, soos jy gesê het. Ja, dit is [onhoorbaar] 'n karakter in die navraag, en dus is dit die aantal letters gesien omdat jy net beweeg langs die trefwoord wanneer jy die brief gesien het, so wat gaan ruimtes effektief te slaan en dinge soos dat. Ja, presies. En dan wanneer jy gesien het die trefwoord leë jy net mod sodat jy beweeg terug rond. Presies. Dit is 'n perfekte verduideliking. Wat sê Kevin is wat ons wil indeks in die navraag. Ons wil die num_letters_seen karakter te kry, as jy wil, maar as num_letters_seen meer is as die lengte van die term, die manier waarop ons terug te kry in die toepaslike reeks is gebruik ons ​​die mod-operateur om effektief te rond draai. Byvoorbeeld, soos in die kort, ons navraag is spek, en dit is 5 letters lank. Maar ons het 6 letters in ons plain text gesien op hierdie punt en geïnkripteer 6. Sal ons uiteindelik toegang tot die num_letters_seen, wat 6, mod die lengte van die term, 5, en so sal ons kry 1, en so wat ons sal doen is dat ons sal toegang tot die eerste karakter binnekant van ons navraag by daardie punt. Alle reg, enige vrae oor Vigenère voor ons gaan? Julle ouens voel redelik goed oor hierdie? Modern, groot. Ek wil om seker te maak dat jy ouens kry die kans om die kode te sien wat ons dink goed lyk en het die kans om te leer uit dit. Dit gaan om die laaste wat ons sal gebruik word om ruimtes vir die tyd, en ons gaan om die oorgang nou, en ek gaan om te gaan na cs50.net/lectures sodat ons dit kan doen om 'n bietjie van die quiz hersiening. Die beste manier wat ek dink om te begin doen quiz review is om te kom na hierdie Lesings bladsy, cs50.net/lectures, en onder elk van die week opskrifte, so as ek kyk hier by Week 0, Ek sien dat ons 'n lys van die onderwerpe wat ons bedek in Week 0. Indien enige van hierdie onderwerpe vir julle vreemd lyk jy sal beslis wil om terug te gaan en skure die lesingnotas en moontlik selfs vlugtig deur die lesings, kyk hulle weer as jy wil om 'n gevoel te kry vir wat gaan aan met elk van hierdie onderwerp. Ek sal addisioneel sê dat hierdie jaar een van die koel hulpbronne wat ons het is hierdie kortbroek wat ons gemaak het, en as jy kyk na Week 0, Ons het nie al die onderwerpe wat gedek word, maar ons het 'n hele paar van hulle, sommige van die moeiliker, so kyk na hierdie kortbroek weer is 'n goeie manier om jou te kry tot en met spoed. In die besonder, ek gaan om te sit in 'n prop vir die 3 op die bodem, want ek het daardie. Maar as jy sukkel met binêre, stukkies, hex, daardie soort van dinge, program is 'n groot plek om te begin. ASCII is 'n ander een dit is goed om te sien. Jy kan selfs kyk my by 1.5x spoed as ek gaan te stadig vir jou. Sedert dit se resensie, voel vry om dit te doen. Net om te regtig vinnig begin, gaan ons om te gaan deur middel van 'n paar van hierdie quiz probleme net om vinnig te kansellasies deur middel van hierdie. Byvoorbeeld, laat ons kyk na probleem 16 wat ek tot hier gekom het op die bord. Ons het hierdie volgende berekening in binêr, en ons wil om enige werk te wys. Okay, ek gaan om te gee dit 'n skoot. Julle moet saam met papier, en ons doen dit regtig vinnig. Ons wil die volgende berekening in binêr te voer. Ek het 00.110.010. En ek gaan by te voeg om dit 00.110.010. Vir die wiskunde genieë die volgende saam by die huis, dit effektief te vermenigvuldig deur 2. Kom ons begin. Ons gaan dieselfde toevoeging algoritme wat ons doen om te volg wanneer ons desimale getalle bymekaar. Werklik die enigste verskil hier is dat ons loop terug om sodra ons het 1 + 1 in plaas van een keer kry ons 10. As ons begin van die reg, regtig vinnig, wat is die eerste syfer? [Studente] 0 >> [Nate H.]. 0. Groot, en die tweede syfer? [Studente] 1. [Nate H.] Is dit 'n 1? 1 + 1 is? [Studente] 10. [Nate H.] Presies, so wat is die syfer dat ek reg onder die 2 kinders bymekaar getel skryf? [Studente] 1, 0 of 0 en dan dra die 1. [Nate H.] 0 en dra 'n 1, presies. Volgende up, Basil, jy. Wat is die derde? >> [Basil] 1. [Nate H.] 1, volmaak. Kevin? [Kevin] 0 >> [Nate H.] 0, Charlotte? [Charlotte] 0 >> [Nate H.]. Ja, en wat moet ek doen? [Studente] Die 1. [Nate H.] En wat moet ek doen? En dan dra ek die 1. Perfect, Sahb? >> [Sahb] Nou het jy 1. [Nate H.] En doen ek hier iets om? [Sahb] dan vir die volgende een wat jy het 1 omdat jy oorgedra 1. [Nate H.] Groot, so hier het ons kan voltooi dit. Cool. [Studente] Is 0 + 0 = 0? 0 + 0 = 0. 1 + 1, soos jy sê, is 10 of 1, 0, eerder. 10 is 'n wanbenaming, want my 10 beteken die getal 10, en dit is die flater van hoe ons verteenwoordig wanneer ons skryf dit. Ons verteenwoordig die aantal 2 deur 1, 0, en die getal 10 is effens anders. Wat is soort van lekker oor binêre is dat daar werklik is nie so baie gevalle wat jy nodig het om te leer. Daar is 0 + 0 = 0, 0 + 1 = 1, 1 + 1 is 0, en dan dra 'n 1, en dan kan jy hier te sien op die derde kolom van die reg ons het hierdie 1, 1 en 1. En 1 + 1 + 1 is 'n 1, en jy dra 'n ander 1. Wanneer jy binêre Daarbenewens doen, eenvoudig. Ek wil doen 'n paar meer van hierdie gesonde verstand gaan julle Voor jy gaan, want dit is waarskynlik iets wat ons sal sien op die quiz. Nou laat ons doen dit volgende een so goed. Kom ons doen probleem 17. Ons gaan die volgende binêre nommer om te skakel na desimaal. Ek het 10100111001. Onthou in die binêre video wat ek gedoen het Ek stap deur 'n paar voorbeelde, en ek het gewys hoe alles werk wanneer jy dit doen in desimaal. Wanneer jy werk in desimale voorstelling Ek dink ons ​​is op hierdie punt in ons lewens so vlot in dit wat dit is redelik maklik om te glans oor die meganika van hoe dit eintlik werk. Maar 'n vinnige terugblik om te doen, as ek die nommer 137 dit beteken en regtig weer, dit is in desimale voorstelling die getal 137 in desimale beteken dat ek 1 x 100 + 3 x 10 + 7 x 1. Dit is al wat bly op die skerm. En dan as jy kyk na hierdie nommers reg hier, 100, 10 en 1, sien jy dat hulle eintlik is al die magte van 10. Ek het 10 ², 10 ¹, en 10 aan die nul. Ons het 'n soortgelyke soort van ding in die binêre behalwe dat ons basis, soos ons dit noem, is 2 in plaas van 10. Hierdie 10s wat ek geskryf het hier aan die onderkant, hierdie 10 ², 10 ¹, 10 aan die nulpunt, 10 is ons basis, en die eksponent, 0, 1 of 2, geïmpliseer word deur die posisie van die syfer in die getal wat ons skryf. 1, as ons kyk na dit, hierdie 1 is in die 2de posisie. Die 3 is in die 1ste plek, en die 7 is in die 0 posisie. Dit is hoe ons die verskillende eksponente hieronder vir ons basisse. Na aanleiding van hierdie we'll-eintlik, jy weet wat? Ons sal doen waar het my maak ongedaan knoppie gaan? Daar gaan dit. Ek is mal oor hierdie ongedaan ding. Na aanleiding van hierdie, ek dink vir my ten minste die maklikste manier om te begin die omskakeling van 'n binêre getal of 'n heksadesimale nommer waar die basis is 16 en nie 10 of 2 is om voort te gaan en skryf die basisse en eksponente vir al die nommers in my binêre getal aan die bokant. As ons begin van links na regs weer, wat is 'n soort van die counter, Ek kom terug verander na swart hier, ons het die 2 aan die 0 posisie, en dan het ons 2 ¹, 2 ², en dan 2 tot 3, 2 tot 4, 2 tot 5, 6, 7, 8, 9 en 10. Hierdie getalle wat ek geskryf het is al die eksponente. Ek het net die afspoelwaentjies geskryf het hier in die eerste 3 net vir die ruimte. Op hierdie punt het ek gaan om voort te gaan en ek is eintlik gaan om uit te vee die dinge wat ons gedoen het in desimale, as dit is okay. Jy het al het dit. Dié van julle kyk aanlyn Ek is seker dat, sal in staat wees om my te rewind as jy wil. Skakel terug na die pen. Nou, wat ons kan doen as julle nie heeltemal tot vinniger op jou magte van 2, wat is heeltemal cool. Dit gebeur. Ek verstaan. Een keer het ek 'n job interview waar Ek was vertel Ek al die magte van 2 moet weet om deur middel van 2 tot 30. Dit was nie 'n werk wat ek gekry het. In elk geval, julle ouens kan voort te gaan en doen die wiskunde hier, maar met binêre dit nie regtig nie sin maak, en ook nie dit maak sin met desimale of hexadecimale nie, die wiskunde te doen waar jy het nulle. Jy kan sien Ek het 0 hier, hier 'n 0, 0, 0, 0, 0 hier. Hoekom kan dit nie sin maak nie die werklike wiskunde te doen die toepaslike krag van 2 vir daardie posisie te bereken? Presies, soos Charlotte sê, sal dit 0. Kan net so goed spaar jouself die tyd as die berekening van die magte van 2 is nie jou sterk pak. In hierdie geval het ons net nodig het om dit te bereken vir 2 tot die 0 wat-? [Studente] 1. [Nate H.] 1, 2 aan die 3 wat is? [Studente] 8 >> [Nate H.]. 8. 2 van die 4? [Studente] 2. Ek is jammer, 1. [Nate H.] 2 aan die 4 is 16, presies. 2 tot 5, Kevin >> 32. [Nate H.] 32, 2 aan die 8? [Studente] 32 x 8, 256. [Nate H.] Perfect. En 2 aan die 10? [Studente] 1024. [Nate H.] Ja, 1024. Sodra ons het hierdie getalle kan ons vat hulle almal op. En dit is waar dit is werklik belangrik om 'n paar dinge om te doen. Een is om te gaan stadig en maak seker jou werk. Jy kan jou vertel dat daar 'n 1 aan die einde van hierdie nommer, so ek moet beslis 'n onewe getal as my gevolg, omdat al die ander mense gaan selfs getalle gegee dat dit is 'n binêre getal. Die ander ding om te doen is as jy op hierdie punt op die toets en jy geskryf het dit so ver en jy is besig om uit te loop van die tyd kyk na die aantal punte wat die probleem is die moeite werd. Hierdie probleem, soos jy kan sien as ek terug flip na my laptop regtig vinnig- hierdie probleem is 2 punte werd, so dit is nie die soort van optelling jy moet gaan deur as jy regtig vir tyd gedruk. Maar ons sal skakel terug na die iPad, en ons gaan dit regtig vinnig. Ek hou van doen eers die klein getalle want ek vind dit makliker. Ek hou van 32 en 8 want hulle gaan saam redelik maklik, en ons kry 50. 16 en 1 kry 17. Daar kry ons 57, en dan kan ons die res van hierdie te doen nie, so ons kan doen 57, 156. Kom op. Man, goed, laat ons sien. Ons het 57, 256, en 1024. Op hierdie punt, ek wil eerder net gaan deur. Ek het geen idee. Ek duidelik nodig om op hierdie te lees. 7, 6 en 4, kry jy 17. 1, 5, 5, 2, 13. Dan kry ons 3, en dan kry ons 1. 1337. Paaseier, enigiemand? Enigiemand erken dat hierdie getal? Chris erken die getal. Wat beteken dit, Chris? [Chris] Leet. Leet, so as jy kyk na hierdie, dit lyk soos leet. Hacker stuff. Wees op die uitkyk vir daardie soort van dinge op die akademiese trimester of die quiz, eerder. As jy sien dat die soort van dinge en jy wonder "Huh," wat werklik iets beteken. Ek weet nie. David hou daarvan om dit in Dit is 'n goeie manier om te sanity check dit. Soos okay, ek kan sien wat aangaan. Dis Week 0/Week 1 stuff. As ons skakel terug na ons laptop nou, uitzoomen, en 'n paar ander dinge. Daar is 'n ASCII, wat ons het 'n baie te doen met die probleem stelle. Hierdie idee van kapitaal A. Wat is dit regtig? Wetende dat dit is die desimale heelgetal. 65 is wat dit is gekarteer in die ASCII-tabel, en dit is dan hoe die rekenaar skryf dit, en dit is hoe ons gekry het eintlik skryf die karakter kapitaal en die karakter onderkas 'n in sommige van hierdie oplossings en probleem stelle wat jy gedoen het. 'N paar ander dinge. Ons het state, Boolse uitdrukkings, voorwaardes, loops, veranderlikes en drade. Diegene almal lyk sin te maak vir die grootste deel? Sommige van hierdie terminologie is 'n bietjie funky by tye. Ek hou van om te dink van 'n verklaring vir die grootste deel iets wat eindig met 'n kommapunt. Stellings soos x = 7, wat stel 'n veranderlike, vermoedelik genoem x = 7. X is vermoedelik ook 'n tipe wat kan die getal 7 stoor, so dit is 'n int of dalk 'n float of 'n kort of 'n char, iets soos dit. 'N Boole-uitdrukking is met behulp van hierdie dubbele gelyk is aan en die bang gelyk is aan of die nie gelyk is aan, minder as, groter as, minder as of gelyk is aan, al daardie soort van dinge. Voorwaardes is as anders state. Ek sal onthou dat jy nie kan 'n ander sonder 'n ooreenstemmende indien. Net so, kan jy nie 'n anders as sonder 'n ooreenstemmende indien. Loops, onthou die 3 soorte van lusse wat ons het gehamer in jou vir die laaste paar artikels en probleem stelle. Met behulp van doen terwyl wanneer jy om die toevoer van die gebruiker, die gebruik terwyl loops totdat 'n bepaalde toestand is waar, en dan met behulp van dié vir loops as wat jy nodig het om te weet watter iterasie van die lus jy tans is hoe ek daaroor dink. Of as jy besig met 'n vir elke karakter in 'n reeks wat ek wil om iets te doen, vir elke element in 'n skikking wat ek wil om iets te doen om daardie element. Drade en gebeure. Hiervan het ons nie gedek nie so uitdruklik in C, maar onthou dit van nuuts af. Dit is die idee van verskillende skrifte. Dit is ook hierdie idee van die uitsaai van 'n gebeurtenis. Sommige mense het nie gebruik uitsaai in hul projekte aanvanklik, wat is heeltemal cool, maar dit is 2 verskillende maniere van die hantering van die groter probleem genoem concurrency, wat is hoe kry jy programme uit te voer of skynbaar voer op dieselfde tyd? Verskillende take loop terwyl ander take word ook vertoon. Dit is hoe jou bedryfstelsel blyk te werk. Dit is die rede waarom selfs al is, byvoorbeeld, Ek het my browser hardloop, ek kan ook draai op Spotify en speel 'n lied. Dit is meer van 'n konseptuele ding om te verstaan. Ek wil 'n blik op die drade kort As jy wil graag meer leer oor wat. Kom ons kyk, ek glo daar kon gewees het, 'n probleem op hierdie in een van hierdie. Weereens, ek dink drade en gebeure wat nie iets wat ons sal dek in C net omdat dit beduidend meer moeiliker as in Scratch. Jy moet nie bekommerd wees oor dit, maar beslis die konsepte verstaan, verstaan ​​wat aangaan. Voordat ons verder gaan, enige vrae oor Week 0 materiaal? Almal voel redelik goed? Begrip veranderlikes en wat 'n veranderlike is? Beweeg op. Week 1. 'N paar van die dinge wat was veral nie gedek nie in die quiz oorsig noodwendig en is ook meer konseptuele dinge om oor na te dink. Die eerste is die idee van watter bron-kode, vertalers en object code is. Enigiemand? Basil. Is die object code ek bedoel bron-kode is wat jy sit in kletteren, en object code is wat kletteren sit sodat jou rekenaar die program kan lees. Presies. Bron-kode is die C-kode wat jy eintlik tik. Object code is wat jy kry uit kletteren. Dit is die 0'e en 1s in daardie binêre formaat. Dan wat gebeur wanneer jy 'n klomp van die voorwerp lêers, sê jy is die opstel van 'n projek of 'n program wat gebruik maak van verskeie bron-kode lêers, wat deur die konvensie word die c-lêer uitbreiding. Dit is die rede waarom ons het caesar.c, vigenère.c. As jy Java programme te skryf wat jy gee hulle die uitbreiding. Java. Python programme het die uitbreiding py dikwels. Sodra jy het verskeie c lêers, jy stel nie. Kletteren spoeg uit al hierdie binêre junk. Dan, want jy wil net 1 program jy het die koppelingshistoon skakel al van hierdie voorwerp lêers tesame in 1 uitvoerbare lêer. Dit is ook wat gebeur wanneer jy gebruik die CS50 biblioteek, byvoorbeeld. Die CS50 biblioteek is beide. H header-lêer wat jy lees, dat # includecs50.h. En dan is dit ook 'n spesiale binêre biblioteek lêer wat is saamgestel wat 0e en 1e, en dat-l vlag, so as ons gaan terug na ons Ruimtes en ons sien regtig vinnig wat gaan hier aan wanneer ons kyk na ons kletteren opdrag, wat ons het, is dit is ons bronkode lêer hier. Dit is 'n klomp van die vertaler vlae. En dan heel aan die einde,-l vlae skakel in die werklike binêre lêers vir hierdie 2 biblioteke, die CS50 biblioteek en dan die wiskunde biblioteek. Begrip van elke tipe van lêers se doel in die samestelling is iets wat jy sal wil hê om in staat wees om gee ten minste 'n hoë vlak oorsig van. Bron kode kom. Object code kom uit. Object code lêers met mekaar verbind, en jy kry 'n pragtige, uitvoerbare lêer. Cool. Dit is ook waar jy kan kry foute op verskeie punte in die samestelling. Dit is waar, byvoorbeeld, as jy hierdie koppeling vlag, CS50 vlag, en jy weglaat dit in Spasies of wanneer jy jou kode, Dit is waar jy 'n fout in die skakel fase, en die koppelingshistoon sal sê, "Hey, jy het 'n funksie GetString dit is in die CS50 biblioteek. " "Jy het vir my gesê dit was in die CS50 biblioteek, en ek kan nie vind die kode vir dit." Dit is waar jy dit in 'n skakel, en dit is aparte omdat die samesteller van 'n vertaler fout soek by die sintaksis en dat die soort van dinge. Dit is goed om te weet wat gaan aan toe. Ander dinge om te weet oor. Ek sou sê dat jy beslis wil 'n blik op die kort op typecasting gedoen by die Jordaan om te verstaan ​​wat ints is onder die kap, watter karakters is onder die kap. Wanneer ons praat oor ASCII en ons eintlik kyk na die ASCII-tabel, wat dit doen gee ons 'n onder die enjinkap kyk hoe die rekenaar eintlik verteenwoordig kapitaal en die syfer 7 en 'n komma en 'n vraagteken. Die rekenaar het ook 'n spesiale maniere voor te stel die getal 7 as 'n heelgetal. Dit het 'n spesiale manier om die getal 7 te stel as 'n drywende punt, en dit is baie anders. Typecasting is hoe jy vir die rekenaar "Hey, ek wil hê jy te omskep van een verteenwoordiging na 'n ander voorstelling. " Waarom ons nie 'n blik op dit. Ek wil ook 'n blik op die kort op biblioteke en die kort op samestellers. Diegene praat oor die proses van opstel, wat 'n biblioteek is, en gaan oor 'n paar van hierdie vrae wat jy dalk gevra. Vrae oor Week 1-materiaal? Is daar enige onderwerpe hier wat hopeloos lyk wat jy wil om te dek? Ek probeer om op te blaas deur middel van die meeste van hierdie vroeëre onderwerpe sodat ons kan kry om wysers en doen 'n bietjie van rekursie. Gedagtes? Enigiets te dek? Tyd vir 'n paar sjokolade miskien? Julle ouens is besig om deur dit. Ek gaan om te hou die genot op my koffie. Week 2. Goeie oproep, 'n goeie roep. Week 2 het ons gepraat het 'n bietjie meer inligting oor funksies. In die eerste paar probleem stelle ons het nie regtig enige funksies op alle skryf anders as watter funksie? [Studente] Main >> Main, presies. En so het ons gesien hoe die verskillende kostuums wat hoof dra. Daar is die een wat dit neem geen argumente, en ons net sê leemte tussen die hakies, en dan is daar die ander een waar ons wil command line argumente te neem, en soos ons gesien het, dit is waar jy int argc en string bevat SPASIES skikking of nou dat ons het eintlik blootgestel string om die char * dat dit ons gaan begin skryf dit as char * bevat SPASIES en dan tussen hakies. In Problem Set 3, julle ouens het 'n klomp van die funksies, en jy geïmplementeer 'n klomp van die funksies, trek, kyk, scramble. Die prototipes is almal daar vir jou geskryf. Wat ek wou praat hier met funksies regtig vinnig is dat daar 3 dele aan hulle wanneer jy skryf 'n funksie. Jy het die terugkeer van die funksie te spesifiseer. Jy moet 'n naam vir die funksie te spesifiseer, en dan moet jy spesifiseer die argument lys of die parameter lys. Byvoorbeeld, as ek 'n funksie was om te skryf aan die som van 'n klomp van heelgetalle en dan terug te keer na my die som wat sou my terugkeer tipe as ek wou heelgetalle te som en dan die som terugkeer? En die naam van die funksie. As ek gaan voort en skryf in die groen, hierdie deel is die terugkeer tipe. Hierdie deel is die naam. En dan tussen hakies is waar ek die argumente gee, dikwels afgekort as argumente, soms genoem params vir parameters. En as jy een het, jy het net die een spesifiseer. As jy meer jy skei elkeen met 'n komma. En vir elke argument wat jy gee dit 2 dinge wat Kevin? [Kevin] Jy moet die tipe en dan die name te gee. En dan die naam en die naam is die naam wat jy gaan om te gebruik om te verwys na die argument binne die som-funksie, binne die funksie wat jy tans skriftelik. Jy hoef nie byvoorbeeld, as ek gaan op te som, sê, 'n skikking van heelgetalle sal ons doen int skikking, en ek gee myself 'n paar kode tussen krulhakies daar- dan wanneer ek verby 'n skikking aan die som-funksie Ek slaag dit in die eerste posisie van die argument lys. Maar die skikking dat ek slaag nie die naam arr. Arr gaan wees hoe ek verwys na die argument in die liggaam van die funksie. Die ander ding wat ons nodig het om in ag te neem, en dit is effens verskil van funksies, maar ek dink dit is 'n belangrike punt, is dat in C wanneer ek sit en skryf van 'n funksie soos hierdie hoe weet ek hoeveel elemente in die skikking? Dit is 'n bietjie van 'n truuk vraag. Ons het gepraat oor dit 'n bietjie in verlede week se artikel. Hoe weet ek die getal van die elemente binne-in 'n skikking in C? Is daar 'n manier? Dit blyk dat daar is geen manier om te weet. Jy moet dit afsonderlik te slaag. Daar is 'n trick wat jy kan doen as jy in die dieselfde funksie in wat die skikking verklaar is, en jy werk met 'n stapel skikking. Maar dit werk net as jy in dieselfde funksie. Sodra jy verby 'n skikking na 'n ander funksie of as jy 'n skikking verklaar en jy het dat die skikking op die hoop, het jy gebruik malloc  en dat die soort van dinge, dan is al die verbintenis is af. Dan is jy eintlik het om rond te beweeg 'n spesiale argument of 'n ander parameter wat jy vertel hoe groot die skikking is. In hierdie geval, sou ek wil gebruik te maak van 'n komma-Achievement jammer, dit gaan af van die skerm hier en ek wil in 'n ander argument  en noem dit int len ​​vir die lengte. Een ding wat kan kom op die quiz vra jy 'n bepaalde funksie genoem iets te skryf of te implementeer. As ons nie gee jou die prototipe, so hierdie hele ding hier, hierdie hele gemors is die funksie verklaring of die funksie prototipe genoem, dit is een van die eerste dinge wat jy wil om te spyker as dit nie gegee aan jou dadelik op die quiz. Die ander trick wat ek geleer het is dat sê ons doen gee jy 'n prototipe vir 'n funksie, en ons sê, "Hey, jy het om dit te skryf." Binne-in die kode tussen krulhakies wat jy het op die quiz as jy sien dat daar 'n terugkeer tipe en jy sien dat die terugkeer tipe is iets anders as nietig, wat beteken dat die funksie nie terugkeer enigiets, dan is een ding wat jy beslis wil om dit te doen is skryf 'n soort van return statement heel aan die einde van die funksie. Keer terug, en in hierdie geval, sal ons 'n leë, want ons wil om te vul die leë. Maar dit kry jy dink in die regte manier oor hoe ek gaan hierdie probleem te benader? En dit herinner jy gaan te hê om 'n waarde om terug te keer aan die oproeper van die funksie. Ja >> [Studente] Is styl toepas wanneer ons skryf-kode op die quiz? Soos die inkeping en daardie soort van dinge >> [Studente]? Ja. Nee, nie so veel nie. Ek dink baie van hierdie is iets wat ons sal verduidelik op die quiz op die dag van, maar tipies bekommerd te wees oor # sluit en dat die soort van dinge, dit is soort van buite. [Studente] Het jy nodig het om jou handgeskrewe kode om kommentaar te lewer? Het jy nodig om jou handgeskrewe kode om kommentaar te lewer? Kommentaar te lewer is altyd goed as jy bekommerd is oor gedeeltelike krediet of jy wil om jou voorneme om te kommunikeer met die gradeerder. Maar ek, weer, sal verduidelik op die quiz self en op die quiz dag, maar ek glo nie dat jy sal verwag word om kommentaar te skryf, nee. Gewoonlik nie, maar dit is beslis die soort van ding waar jy kan jou voorneme te kommunikeer, soos "Hey, dit is waar ek gaan met dit." En soms wat jou kan help met gedeeltelike krediet. Cool. Basil. [Basil] Wat is die verskil tussen verklaar, sê, int lang in die argumente of parameters teenoor die verklaar van 'n veranderlike in die funksie? Wow, koffie afgegaan die lugpyp. [Basil] Soos wat dinge wat ons wil om te sit in argumente. Ja, dit is 'n groot vraag. Hoe kies jy die dinge wat jy wil om te sit in die argumente teenoor die dinge wat jy aan die binnekant van die funksie? In hierdie geval het ons beide van hierdie argumente want hulle is iets dat elkeen wat die som-funksie te gebruik moet daardie dinge te spesifiseer. Die som funksie, soos ons oor gepraat het, het geen manier om te weet hoe groot die skikking is dit kry van die oproeper of wie is die gebruik van die som-funksie. Dit het geen manier om te weet hoe groot die skikking is. Die rede waarom ons in hierdie lengte reg hier as 'n argument is, want dit is iets wat ons basies is die vertel van die oproeper van die funksie, wie gaan die som-funksie te gebruik, "Hey, nie net jy het om te gee vir ons 'n skikking van ints, het u ook om ons te vertel hoe groot die skikking wat jy aan ons gegee is. " [Basil] Diegene sal beide command line argumente? Nee, dit is werklike argumente wat jy sal slaag om die funksie. Laat my doen hier 'n nuwe bladsy. [Basil] Soos naam sou slaag- [Nate H.] As ek int main (void), en ek gaan sit in my terugkeer 0 af hier aan die onderkant, en sê: Ek wil die som-funksie te roep. Ek wil sê int x = som (); Die som-funksie te gebruik wat ek het om te slaag in beide die skikking wat ek wil op te som en die lengte van die skikking, so dit is waar die veronderstelling Ek het 'n verskeidenheid van ints, sê ek het int numbaz [] = 1, 2, 3, soort gebruik wat gekap up sintaksis reg daar, dan is wat ek sou doen is in die som Ek wil om te slaag in beide numbaz en die nommer 3 die som-funksie om te sê: "Goed, hier is die skikking wat ek wil hê jy moet op te som." "Hier is sy grootte." Maak dit sin? Beteken dit jou vraag beantwoord? Op baie maniere is dit nie parallel wat ons doen met die hoof wanneer ons die command line argumente. 'N program soos Caesar cipher, byvoorbeeld, wat nodig command line argumente sal nie in staat wees om iets te doen nie. Dit sou nie weet hoe om te enkripteer, as jy dit nie vertel watter sleutel om te gebruik of as jy nie sê dit string wat jy wou te enkripteer. Aansporing vir die insette, dit is waar ons het 2 verskillende meganismes vir die toevoer van die gebruiker, vir die neem van inligting van die gebruiker. Vir Problem Set 1 het ons gesien dat hierdie getint, GetString, GetFloat manier te vra vir insette, en wat genoem word met behulp van die standaard inset stroom. Dit is effens anders. Dit is iets wat jy kan doen op 'n tyd, in teenstelling met wanneer jy roep die program, wanneer jy begin die program aan die gang. Die command line argumente gespesifiseer word wanneer jy die program loop begin. Ons het al die vermenging van die twee van daardie. Wanneer ons argumente na 'n funksie, dit is baie soos command line argumente to main. Dit is wanneer jy roep die funksie wat jy nodig het om dit te vertel presies wat dit nodig het om sy take uit te voer. Nog 'n goeie ding om na te kyk en ek sal laat jy kyk na dit in jou vrye tyd, en dit was bedek in die quiz was hierdie idee van die omvang en plaaslike veranderlikes teenoor globale veranderlikes. Doen om aandag te gee aan daardie. Noudat ons om op hierdie ander dinge, in Week 3 het ons begin praat oor die soek-en sorteer. Soek-en sorteer, ten minste in CS50, is baie 'n inleiding tot sommige van die meer teoretiese dele van rekenaarwetenskap. Die probleem van die soek, die probleem van sortering is groot, kanoniese probleme. Hoe kry jy 'n bepaalde getal in 'n verskeidenheid van miljarde van heelgetalle? Hoe kry jy 'n bepaalde naam binne-in 'n telefoon boek wat gestoor word op jou laptop? En so het ons begin om die idee van asimptotiese run tye om werklik te kwantifiseer hoe lank, hoe hard hierdie probleem is, hoe lank hulle neem om op te los. In 2011 se quiz, glo ek, daar is 'n probleem wat ek dink meriete wat baie vinnig, wat is dit een probleem 12. O nee, dit is Omega. Hier is ons praat oor die vinnigste moontlike run tyd vir 'n spesifieke algoritme en dan is die stadigste moontlike duur tyd. Dit Omega en O is eintlik net kortpaaie. Hulle is notasie kortpaaie om te sê hoe vinnig in die beste moontlike geval sal ons algoritme hardloop, en hoe stadig in die ergste moontlike geval ons algoritme sal loop? Kom ons doen 'n paar van hierdie, en dit is ook gedek in die kort op asimptotiese notasie, wat ek raai. Jackson het 'n baie goeie werk. Met 'n binêre soek, ons praat oor binêre soek as 'n algoritme, en ons gewoonlik praat oor dit in terme van sy groot O. Wat is die groot O? Wat is die stadigste moontlike duur van binêre soek? [Studente] N ²? Close, ek dink soortgelyk aan dié. Dit is 'n baie vinniger as dit. [Studente] Binary >> Ja, binêre soek. [Studente] Dit is log n. Meld n, so wat inteken n beteken? Dit halveer dit elke iterasie. Presies, so in die stadigste moontlike geval, sê as jy 'n gesorteerde skikking van 'n miljoen heelgetalle en die getal wat jy soek vir is óf die eerste element in die skikking of die heel laaste element in die skikking. Onthou, die binêre soek algoritme werk deur te kyk na die middelste element, sien as dit is die wedstryd wat jy soek. As dit is, dan is groot, jy het dit gevind. In die beste moontlike geval, hoe vinnig binêre soek run? [Studente] 1. 1, dit is konstante tyd, groot O van 1. Ja. [Studente] Ek het 'n vraag. Wanneer jy sê van n teken, bedoel jy met betrekking tot die basis 2, reg? Ja, so dit is die ander ding. Ons sê log n, en ek dink wanneer ek in die hoërskool was Ek het altyd aanvaar dat log was basis 10. Ja, so ja, teken basis 2 tipies is wat ons gebruik. Weer terug te gaan na binêre soek, as jy op soek is vir óf die element aan die einde of die element aan die begin, omdat jy in die middel begin en dan kan jy weggooi wat ookal 1/2 nie voldoen aan die kriteria wat jy soek, en jy gaan na die volgende helfte en die volgende helfte en die volgende helfte. As ek op soek na die grootste element in die miljoen heelgetal array Ek gaan dit by die meeste log 1 miljoen keer te halveer voordat ek uiteindelik toets en sien dat die element Ek is opsoek na is in die grootste of in die hoogste indeks van die skikking, en dit neem log van n teken van 1 miljoen keer. Bubble soort. Onthou julle nie die borrel soort algoritme? Kevin, kan jy gee my 'n vinnige recap van wat gebeur het in die borrel soort algoritme? [Kevin] Basies gaan dit deur alles in die lys. Dit lyk op die eerste twee. As die eerste een is groter as die tweede een wat dit swaps hulle. Dan is dit vergelyk tweede en derde, dieselfde ding, swaps, derde en vierde, al die pad af. Groter getalle sal volg tot aan die einde. En nadat egter baie loops jy klaar is. Presies, so wat Kevin gesê het, is dat ons groter getalle sal kyk borrel tot die einde van die skikking. Byvoorbeeld, dink jy loop ons deur hierdie voorbeeld as dit is ons array? [Kevin] Jy neem 2 en 3. 3 groter as 2 is, sodat jy ruil hulle. [Nate H.] Right, so ons ruil dit, en so kry ons 2, 3, 6, 4, en 9. [Kevin] Dan moet jy vergelyk die 3 en 6. 3 is kleiner as 6, sodat jy dit laat oorbly. en 6 en 4, wil jy ruil hulle, want 4 is kleiner as 6. [Nate H.] Right, so ek kry 2, 3, 4, 6, 9. [Kevin] en 9 is groter as 6, so jy los dit. En jy wil terug gaan na dit weer. [Nate H.] ek op hierdie punt gedoen? >> [Kevin] No En hoekom ek nie op hierdie punt? Want dit lyk soos my skikking word gesorteer. Ek is op soek na dit. [Kevin] Gaan dit weer deur en maak seker dat daar nie meer swaps voordat jy ten volle kan ophou. Presies, so jy hoef te hou gaan deur en maak seker dat daar geen swaps wat jy kan maak op hierdie punt. Dit was regtig net gelukkig, soos jy sê, dat ons beland net 1 slaag om te maak en ons gesorteer. Maar om dit te doen in die algemene geval sal ons eintlik om dit te doen oor en oor weer. En in die feit, dit was 'n voorbeeld van die beste moontlike geval, soos ons gesien het in die probleem. Ons het gesien dat die beste moontlike geval was N. Ons het deur die skikking 1 keer. Wat is die ergste moontlike geval vir hierdie algoritme? [Kevin] N ². En wat beteken dit lyk? Wat sou 'n skikking lyk soos wat sou neem n ² tyd? [Kevin] [onhoorbaar] gesorteer. Presies, so as ek het die skikking 9, 7, 6, 5, 2, eers die 9 sou borrel al die pad tot. Na 1 iterasie ons wil hê 7, 6, 5, 2, 9. Dan sou die 7 borrel, 6, 5, 2, 7, 9, en so aan en so voort. Ons wil hê om te gaan deur die hele verskeidenheid n keer, en jy kan eintlik effens meer akkuraat is as want sodra ons het verhuis die 9 al die pad tot in sy laaste moontlike posisie ons weet dat ons nooit weer teen daardie element te vergelyk. Sodra ons begin borrel die 7 weet ons dat ons kan ophou sodra die 7 reg is voor die 9 want ons het reeds vergelyk met die 9 om dit te. As jy dit doen op 'n slim manier dit is nie werklik, dink ek, dat daar nog baie tyd. Jy gaan nie al die moontlike [onhoorbaar] kombinasies te vergelyk elke keer as jy gaan deur elke iterasie. Maar nog steeds, wanneer ons praat oor hierdie bogrens ons sê dat jy is op soek na n ² vergelykings al die pad deur. Kom ons gaan terug, en sedert ons begin om te kry 'n bietjie kort op tyd Ek sou sê dat jy beslis moet gaan deur die res van hierdie tabel, vul dit almal uit. Dink aan voorbeelde. Dink van konkrete voorbeelde. Dit is baie handig en nuttig om te doen. Dit tog uitskep. Dit is die soort van tabel dat as jy gaan deur in rekenaarwetenskap jy moet regtig begin hierdie hart te leer ken. Dit is die soort vrae wat jy in die onderhoude. Dit is soort van dinge wat is goed om te weet, en dink oor daardie rand gevalle, regtig uitzoeken hoe om te dink oor die wete dat vir borrel sorteer die ergste moontlike skikking te sorteer met dit is die een wat in die omgekeerde volgorde. Wysers. Kom ons praat 'n bietjie oor wysers. In die laaste paar minute het ons hier Ek weet dit is iets wat saam met die lêer I / O wat is relatief nuut. Wanneer ons praat oor pointers die rede waarom ons wil om te praat oor pointers is omdat, wanneer ons werk in C ons is regtig op 'n redelik lae vlak in vergelyking met die meeste moderne programmeertale. Ons is eintlik in staat om die veranderlikes in die geheue te manipuleer, uit te vind waar hulle is eintlik geleë binne ons geheue. Nadat jy weg is bedryfstelsel klasse te neem sal jy sien dat is, weer, soort van 'n abstraksie. Dit is nie werklik die geval is. Ons het virtuele geheue wat verberg die besonderhede van ons. Maar vir nou kan jy aanneem dat wanneer jy 'n program, byvoorbeeld wanneer jy begin hardloop jou Caesar cipher program- Sal ek skakel terug na my iPad regtig vinnig- wat heel aan die begin van jou program, as jy, sê, 4 GB RAM op jou laptop, kry jy opsy gesit is hierdie stuk, en ons sal hierdie RAM noem. En dit begin in 'n plek wat ons gaan om 0 te roep, en dit eindig op 'n plek wat ons 4 GB bel. Ek het regtig nie kan skryf nie. Man, wat ook erg beseer is. Wanneer jou program voer die bedryfstelsel kerf RAM, en dit spesifiseer verskillende segmente vir verskillende dele van jou program om in te woon Down hier om hierdie gebied is 'n soort van 'n no man's land. Wanneer jy gaan 'n bietjie verder hier jy eintlik het die plek waar die kode vir jou program lewens. Dat die werklike binêre kode, dat die uitvoerbare lêer eintlik kry in die geheue gelaai wanneer jy 'n program, en dit woon in die kode segment. En as jou program voer die verwerker kyk na hierdie kode segment om uit te vind wat is die volgende opdrag? Wat is die volgende lyn van die kode wat ek nodig het om uit te voer? Daar is ook 'n data-segment, en dit is waar daardie string konstantes gestoor dat jy al met behulp. En dan verder daar is hierdie plek genaamd die hoop. Ons toegang tot die geheue daar deur gebruik te maak van malloc, en dan na die top van jou program daar is die stapel, en dit is waar ons het al speel vir die meeste van die begin. Dit is nie te skaal of enigiets. Baie van hierdie is baie masjien afhanklik, bedryfstelsel afhanklik is, maar dit is relatief hoe dinge raak chunked. As jy 'n program en jy verklaar 'n veranderlike genoem x- Ek gaan nog 'n boks te onder teken, en dit gaan wees RAM sowel. En ek gaan om te kyk. Ons sal kronkelende lyne trek om aan te dui dit is net 'n klein gedeelte van die RAM en nie almal van hulle soos ons nader aan die bokant. As ek 'n heelgetal veranderlike genoem x verklaar, dan wat ek eintlik kry is 'n kartering wat gestoor word in die simbooltabel van my program wat verbind die naam x aan hierdie streek van die geheue wat ek geteken het reg hier tussen die vertikale stawe. As ek 'n reël van die kode in my program wat sê x = 7 die verwerker weet "O, okay, ek weet dat x lewens op hierdie plek in die geheue." "Ek gaan om voort te gaan en 'n 7 skryf daar." Hoe werk dit weet watter plek dit is in die geheue? Wel, dis al wat gedoen tydens kompilering gekies nie. Die opsteller sorg vir die toekenning van waar elk van die veranderlikes gaan om te gaan en die skep van 'n spesiale kartering of liewer die koppeling van die kolletjies tussen 'n simbool en waar dit gaan, 'n veranderlike se naam en waar dit gaan om te lewe in die geheue. Maar dit blyk dat ons eintlik kan toegang tot dit in ons programme sowel. Dit raak belangrik wanneer ons begin praat oor 'n paar van die data strukture, wat is 'n konsep wat ons gaan later stel. Maar vir nou, wat jy kan weet, is dat ek 'n wyser skep om hierdie plek, x. Byvoorbeeld, kan ek 'n wyser veranderlike. Wanneer ons 'n wyser veranderlike gebruik ons ​​die ster notasie. In hierdie geval, dit sê ek gaan 'n wyser na 'n int te skep. Dit is 'n tipe net soos enige ander. Ons gee dit 'n veranderlike soos y, en dan het ons dit gelyk is aan die adres, na 'n adres. In hierdie geval, kan ons y te wys aan x deur die neem van die adres van x, wat ons doen met hierdie ampersand, en dan het ons y om dit te wys. Wat beteken dit in wese is as ons kyk na ons RAM dit skep 'n aparte veranderlike. Dit gaan om dit te noem y, en wanneer hierdie lyn van die kode voer dit eintlik gaan 'n bietjie wyser wat ons gewoonlik trek soos 'n pyl te skep, en dit stel aan x y te wys. Ja. [Studente] As x is reeds 'n wyser, jy wil net doen int * y = x in plaas van met die ampersand? Ja. As x is reeds 'n wyser, dan kan jy 2 wysers gelyk aan mekaar te stel, in welke geval y sal nie wys op x, maar dit sal wys op watter x is verwys na. Ongelukkig kan ons uit die tyd. Wat ek wil sê op hierdie punt, kan ons praat oor hierdie die regte pad maar ek sou sê begin werk deur middel van hierdie probleem, # 14. Jy kan sien daar is reeds 'n bietjie vir jou ingevul hier. Kan jy sien dat wanneer ons verklaar 2 pointers, int * x en y, en kennis dat die wys van die * langs die veranderlike was iets wat verlede jaar gedoen is. Dit blyk dat dit is soortgelyk aan wat ons doen hierdie jaar. Dit maak nie saak waar jy die * skryf wanneer jy die wyser te verklaar. Maar ons het die * geskryf langs die tipe want dit maak dit baie duidelik dat jy waarby 'n wyser veranderlike. Jy kan sien dat die verklaar van die 2 pointers gee ons 2 bokse. Hier wanneer ons x gelyk aan malloc wat dit sê nie, is ter syde stel geheue in die hoop. Hierdie klein blokkie reg hier, hierdie sirkel, is geleë op die hoop. X wys. Let daarop dat y nog nie verwys na iets. Te kry geheue tot die getal 42 in x stoor ons sal gebruik wat notasie? [Studente] * x = 42. Presies, * x = 42. Dit beteken volg die pyl en gooi 42 daar. Hier waar ons y en x y wys ons aan x. Weereens, dit is net soos wat Kevin het gesê dat waar ons y gelyk aan x. Y is nie wys aan x. Inteendeel, dit wys tot watter x verwys na sowel. En dan uiteindelik in hierdie laaste blokkie daar is 2 moontlike dinge wat ons kan doen. Een daarvan is ons * x = 13 kan sê. Die ander ding is ons kan sê Alex, dink jy weet wat ons hier kan doen? Jy kan sê * x = 13 of [Studente] Jy kan sê int wat ookal. [Nate H.] As dit is bedoel as 'n int veranderlike wat ons kan doen. Ons kan ook sê * y = 13 omdat hulle albei verwys na dieselfde plek, sodat ons kan óf veranderlike gebruik om daar te kom. Ja >> [Studente]. Hoe sou dit lyk as ons net sê int x is 13? Dit sou verklaar word om 'n nuwe veranderlike naam van x, wat nie wil werk nie. Ons wil 'n botsing omdat ons verklaar x 'n wyser te wees hier. [Studente] As ons net daardie verklaring by hom gehad het wat sou dit lyk in terme van die sirkel? As ons x = 13, dan sou ons 'n boks, en eerder as om 'n pyl uit te kom van die boks wat ons wil teken dit as net 'n 13. [Studente] In die boks. Okay. Dankie vir jou kyk, en geluk op Quiz 0. [CS50.TV]