[Powered by Google Translate] [Sekcio 4] [Less Komfortaj] [Nate Hardison] [Universitato Harvard] [Jen CS50.] [CS50.TV] Bone, bonvenigas al sekcio. En ĉi tiu semajno sekcio ni tuj faros kelkajn aferojn. Ni iras al unua recap Problemo Serio 2, kiu estas la cezaro kaj Vigenère problemo aro. Kaj poste ni iras al plonĝi en Quiz 0 review kaj pasigi iom da tempo recapping kion ni jam parolis pri en ĉiu de la prelegoj ĝis nun, kaj ni ankaŭ faros kelkajn problemojn de antaŭa jaro Quizzes. Tiel vi infanoj havas bonan vojon por prepari por tio. Por komenci, mi booted supren paron de bonaj solvoj por la antaŭa problemo aro, Problemo Ŝanĝu 2, en tiun spacon. Se vi infanoj ĉiuj batis tiun ligilon kaj se vi klakas mian nomon kaj klaku al mia unua revizio vi vidos caesar.c, kiu estas ĝuste kion mi rigardis. Ni parolu pri tiu vere rapide. Tiu estas nur specimeno solvo. Tiu ne estas nepre la perfekta solvo. Estas multaj malsamaj manieroj por skribi ĉi, sed estas kelkaj aferoj kiujn mi volis reliefigi kiun mi vidis, kiel estis grading, komunaj eraroj kiujn mi kredas tiu solvo faras tre bonan laboron de uzado. La unua havas ian header komento ĉe la supro. Sur linioj 1 ĝis 7 vi vidas la detalojn, kio precize tiu programo faras. Bona normala praktiko, kiam vi skribas C kodo sendepende se via programo estas enhavita en sola dosiero aŭ ĉu ĝi estas dividita sur multnombraj arkivoj estas havi ian orientante komento ĉe la supro. Tio estas ankaŭ por homoj, kiuj eliru kaj skribi kodon en la reala mondo. Tie estas kie ili metos informo pri kopirajto. Jen la plej # inkluzivas. On line 16 tie estas tio # difini, kion ni revenos al en nur iom. Kaj tiam tuj la funkcio komencas, unufoje ĉefa skuigxas, ĉar tiu programo estis ĉiuj enhavita en sola funkcio la unua afero kiu okazas-kaj ĉi tiu estas tre idiomáticos kaj tipaj de C-programo kiu portas en komanda linio argumentojn-is ke tuj kontrolas por la argumento grafo, argc. Ĝuste tie oni vidas ke tiu programo atendas 2 argumentoj ĝuste. Memoru ke estas tiu unua argumento kiu estas la speciala ke ĉiam la nomo de la programo ke tio esti kuri, la nomo de la plenumebla dosiero. Kaj tiel kion ĉi faras estas tio malhelpas al la uzanto de kurante la programo kun pli aŭ malpli argumentoj. La kialo ni volas kontroli por ĉi tuj estas ĉar ni ne povas vere aliro ĉi argv tabelo dekstre tie fidinde ĝis ni kontrolis por vidi kiel granda ĝi estas. Unu el la komunaj eraroj mi vidis, estis homo tuj iros kaj kapti argv [1]. Ili volas akapari la ŝlosilo argumento el la tabelo kaj do la a al i kontroli sur ĝi, kaj poste ili volas fari la teston por argc tiel kiel la sekvanta provo, ĉu la unua argumento estis ja entjero samtempe, kaj tio ne funkcias ĉar en la kazo, ke ne ekzistas argumentoj provizitaj vi estos kaptante argumento kiu ne estas tie aŭ provi kapti unu kiu ne estas tie. La alia granda afero, kiun vi devas rimarki ke estas vi ĉiam volas presi ia helpema erarmesaĝon al la uzanto por orienti ilin. Mi certas ke vi havas ĉiujn run programoj kie subite ĝi kraŝas, kaj vi ricevos tiun ridindan iom dialogon kiu Popoj supren kaj diras io terure kamufla kaj eble donas eraron kodo aŭ io simila ke ne havas senson. Tie estas kie vi vere volas havigi ion helpema kaj celis al la uzanto por ke kiam ili kuras tio iri "Ho," vizaĝo palmo. "Mi scias precize kion fari. Mi scias kiel ripari tion." Se vi ne presi mesaĝon, tiam vi finos reale lasante al la uzanto por iri ekzameni vian fontokodon elŝeligi kio misfunkciis. Ankaŭ estas iuj fojoj ke vi uzas malsaman eraro kodoj. Ĉi tie ni nur uzis unu diri tie estis eraro, tie estis eraro, estis eraro. Bigger programoj, ofte programojn kiuj estas nomataj per aliaj programoj, revenos ia speciala eraro kodoj en malsamaj scenaroj al programmatically komuniki kion vi farus alie nur uzi belan anglan mesaĝon por. Cool. Kiel ni laboras sube, vi povas vidi, ni treni la ŝlosilo eksteren. Ni testi por vidi se la ŝlosilo persvadas. Ni preni mesaĝon de la uzanto. La kialo ni faras en ĉi tiu fari dum buklo-kaj ĉi tiu estas iu kiu nin kovros en iom-sed ĝi rezultas ke se vi tajpas kontrolo D kiam vi ricevas tio GetString prompto en la fina kion tio vere faras estas ĝi sendas specialan karakteron al la programo. Ĝi estas nomata la ELF aŭ la fino de dosiero karaktero. Kaj en tiu kazo, nia mesaĝo string estos nula, do tio ne estis io kontrolata pri la problemo starigis sin. Sed kiel ni iru, nun ke ni komencis paroli pri punteros kaj dinamika memoro atribuo sur la havaĵon, kontrolanta por nula krom se vi havas funkcion kiu povus revenu nula kiel valoro estas iu kiu vi volas ricevi en la kutimon de faras. Ĉi tie estas unuavice por ilustrado. Sed kiam vi faras vidi GetString en la estonteco, tial de Problemo Ŝanĝu 4 sur, vi volas konservi tion en menso. Denove, ĉi tio ne estas temo por Problemo Ŝanĝu 3 ĉu ĉar ni ne kovris ankoraŭ. Fine, ni atingos ĉi parto kie ni atingos la ĉefa ĉifrado buklo, kaj estas kelkaj aliaj aferoj okazas ĉi tie. Unue, ni persisti super la tuta mesaĝo string mem. Jen ni faris la strlen alvoko en la kondiĉo, kiuj kelkaj vi atentigis ne estas granda vojo por iri. Ĝi rezultas en ĉi tiu kazo ĝi estas ankaŭ ne granda, parte ĉar ni modifi la enhavon de la mesaĝo mem interne de la por ciklo, do se ni havas mesaĝon tio 10 signojn longa, la unua fojo ni starti ke por buklo strlen revenos kio? 10. Sed se ni tiam modifi mesaĝo, ke ni modifi lian 5th karaktero, kaj ni ĵetu en \ 0 karaktero en la 5a pozicio, sur posta ripeto strlen (mesaĝon) ne revenos kio faris la tre unua fojo ni ripetis, sed ĝi anstataŭ reveni 5 ĉar ni jxetis en tiu nula finilo, kaj la kordoj de longo estas difinita por la pozicio de tiu \ 0. En ĉi tiu kazo, ĉi tiu estas granda vojo por iri ĉar ni modifante ĝin en loko. Sed vi rimarkos ke tio estas fakte surprize simple kodi se vi povas ricevi la math ĝentila. Ĉiuj ke tio postulas estas por kontroli ĉu la letero, kiun vi rigardas estas majuskla aŭ minuskla. La kialo ni nur devas kontroli por tio kaj ni ne devas kontroli por la estas alfa kazo estas ĉar se karaktero estas majuskla aŭ se estas minuskla tiam ĝi estas definitive alfabeta karaktero, ĉar ni ne havas majusklajn kaj minusklajn ciferoj. La alia afero ni do-kaj ĉi tiu estas iom malfacila- estas ni modifis la normo Cezaro kodita formulo ke ni donis en la problemo aro specifo. Kio estas malsama tie estas ke ni subtrahita en la majuskla kazo ĉefurbo A, kaj tiam ni aldonis ĉefurbo A apogi en la fino. Mi konas kelkajn el vi faris tion en via kodo. Ĉu iu el vi faras tion en viaj sendoj? Vi tion faris. Ĉu vi povas klarigi kion tio faras, Sahb? Per subtrahanta ĝin, ĉar vi faris mod tuj post ĝi, vi devas preni ĝin, por ke maniero vi ricevas [tusado] pozicio. Kaj poste aldonante ĝin poste vi kopiis super kiu vi volis. Yeah, precize. Kio Sahb diris, ke kiam ni volas aldoni nian mesaĝon kaj niaj ŝlosilaj kune kaj tiam mod ke, mod ke per NUM_LETTERS, se ni ne grimpi nian mesaĝon en la taŭgan 0 al 25 gamo unua, tiam ni povus fini atingi vere bizara nombro ĉar la valoroj kiujn ni rigardas kiam ni rigardas mesaĝon [i], kiam ni rigardas la th,-a karaktero de nia ebenaĵo-teksto mesaĝo, estas valoro en iu parto de ĉi tiu 65 al 122 gamo surbaze de la ASCII valoroj por majuskla A tra minuskla z. Kaj tiel, kiam ni mod ĝin por 26 aŭ per NUM_LETTERS, ĉar tio estis nia # difini supre dekstre supre tie, ke tuj donu al ni valoro kiu estas en la 0 al 25 gamo, kaj ni bezonas manieron tiam grimpi ke back up kaj akiri ĝin en la taŭga ASCII gamo. La plej facila maniero por fari tion estas nur grimpi ĉio malsupren en la 0 al 25 gamo por komenci, kaj poste ŝanĝi ĉio reen ĉe la fino. Alia komuna eraro, kiun mi vidis homojn kolizii estas ke se vi ne vere faras ĉi skalo tuj kaj vi aldoni mesaĝon kaj ŝlosilo kune kaj vi aldoni ilin, diru, enen char variablo, la problemo kun tiu estas ekde mesaĝo [i] estas relative granda nombro por komenci kun- memori estas almenaŭ 65 se temas pri majuskla karaktero- se vi havas grandan ŝlosilon, diru ion kiel 100, kaj vi aldoni tiujn 2 amase en subskribis char vi tuj ricevas superflui. Vi ricevos valoro kiu estas pli granda ol 127, kiu estas la plej granda valoro kiun char variablo povas teni. Denove, tio estas kial vi volas volas fari tiaj aferoj por komenci. Kelkaj homoj havas ĉirkaŭ tiu kazo por farante se pli kaj provi por vidi, ĉu ĝi estus superflui antaŭ fari tion, sed tiamaniere akiras ĉirkaŭ tiu. Kaj poste en ĉi tiu solvo ni presita el la tuta ĉeno ĉe la fino. Aliaj personoj presita ekster karakteron samtempe. Ambaŭ estas timinda. Je ĉi tiu punkto, do you guys havas demandojn, komentojn pri tiu? Aĵoj vi volas, tion vi ne ŝatas? Mi havis demandon. Eble mi maltrafis ĝin dum via klarigo, sed kiel faras ĉi tiu programo salti la spacojn por konekti la ŝlosilo al la longo de la teksto? Tiu estas nur Cezaro kodita. >> Ho, pardonu, jes. Yeah, ni vidos tion. En la cezaro kodita ni akiris ĉirkaŭ ke pro ni nur spegulita gravuloj. Ni nur turnis ilin se ili estus majuskle aŭ minuskle. You guys sentante sufiĉe bona pri tio? Bonvolu kopii ĉi domo, prenu ĝin, kompari ĝin al kio vi infanoj skribis. Definitive bonvolu sendi demandojn pri tio tro. Kaj ankaux rimarkas ke la celo tie kun via problemo aroj ne estas akiri you guys verki perfektan kodo por via problemo aroj. Ĝi estas lerni sperton. Yeah. Reen al la do dum ciklo, se ĝi egalas nula, do nula nur signifas nenion, ili simple batis eniri? Nula estas speciala puntero valoro, kaj ni uzas nula kiam ni volas diri ni havas puntero variablo kiu estas indikante nenion. Kaj tiel tipe signifas ke ĉi tiu variablo, ĉi tiu mesaĝo variablo estas malplena, kaj tie, ĉar ni uzas la CS50 speciala kordo tipo, kio estas la CS50 kordoj tipo? Ĉu vi vidis kio estas kiam David tiris malantaŭen la kapuĉo en prelego? Estas funky-ĝi estas puntero, ĉu ne? Konsentite, yeah. >> Estas char *. Kaj tiel efektive ni povus anstataŭigi tiun ĉi tie kun char * mesaĝo, kaj do la GetString funkcio, se ĝi ne sukcese akiri kordoj de la uzanto, ĝi ne povas analizi ĉeno, kaj la kazo en kiu ne povas analizi ĉeno estas se la uzanto tajpas la fino de dosiero karaktero, la kontrolo D, kio ne estas io, kion vi tipe fari, sed se tio okazas tiam la funkcio estos redoni ĉi nula valoro kiel maniero de diri "Hej, mi ne havis linio." Kio okazus, se ni ne metas mesaĝo = nula, kiu estas iu kiun ni ne faras ankoraŭ? Kial tio estus problemo ĉi tie? Ĉar mi scias, ke ni parolis iomete en prelego pri memoro likas. Yeah, ni faru tion, kaj ni vidu kio okazas. Bazilo demando estis kio okazas se ni ne vere havas tiun mesaĝon = nula testo? Ni rulumu supren al la supro. You guys povas diri ĉi tion. Fakte, mi savos ĝin en revizio. Ĉi tiu estos redaktoj 3. Kion vi devos fari por kuri ĉi programo estas vi devos klaki ĉi gear ikono tien, kaj vi devos aldoni argumento al ĝi. Vi devos doni al ĝi la ŝlosilon argumento ĉar ni volas pasi en komanda linio argumento. Jen mi ĝin donacos la numero 3. Mi ŝatas 3. Nun zoom reen ekster, kurante la programo. Oni kuras, kompili, konstruante. Ĉi tie ni iru. Oni atendas esti instigis. Se mi tajpas en iu kiel saluton-el kie kiuj iras? Ho, mia programo prenis tro longa kuri. Mi estis jawing por tro longa. Tie iras. Nun mi tajpas en saluton. Ni vidas ke encrypts taŭge. Nun kio okazas se ni faru prompto GetString reveni nula? Memoru, mi diris, ke ni faris tion premante kontrolo D samtempe. Mi rulumu supren tie. Ni kuros ĝin denove. Konstruaĵo. Tie iras. Nun kiam mi batis kontrolo D Mi akiris tiun linion kiu diras opt/sandbox50/bin/run.sh, Segmentación kulpo. Ĉu vi infanoj vidis, ke antaŭ? [Studenta] Kial estas neniu >> Pardonu? [Studenta] Kial mankas kerno dump en ĉi tiu kazo? La kerno dump estas-la demando estas kial neniu kerno dump tie? La demando estas, ke povas esti, sed la kerno dump estas dosiero ke gets stokita en la malmola disko. En ĉi tiu kazo ni malebligita kerno vertederos en la sinsekvo servilo por ke ni ne havas popolon seg faulting kaj konstruante tunoj de kerno renversas. Sed vi povas ricevi unu. Kerno vertederos estas la speco de afero, kiun vi povas ofte malebligi, kaj kelkfoje vi faru. La segmentación kulpo, por respondi vian demandon, Bazilo, diras, ke ni provis aliri puntero kiu ne estis metita al punkto al nenio. Memoru Binky en la video kiam Binky provas iri aliri puntero ke ne estas indikante ion? En ĉi tiu kazo mi supozas teknike la puntero estas montras ion. Ĝi estas indikante nula, kiu estas teknike 0, sed kiu estas difinita al esti en segmento kiu ne estas atingebla per via programo, tiel vi ricevas segmentación kulpo ĉar vi ne konsentas memoro jen en valida segmento kiel la amaso segmento aŭ la pilo segmento aŭ la datumojn segmento. Cool. Plu demandoj pri Cezaro? Ni movi plu. Ni rigardu redaktoj 2 vere rapide. Tio Vigenère. Tie en Vigenère ni iros tra ĉi tiu bela rapide ĉar, denove, Vigenère kaj Cezaro estas sufiĉe similaj. Header komento estas antaŭe, # Difini estas antaux eviti uzi tiujn magian nombroj. La belan aĵon diri ni volis movi malsama alfabeto aŭ io kiel tio. Prefere ol devi iri permane ŝanĝi la tuta 26 de la kodo ni povus ŝanĝi ĉi tion al 27 aŭ faligi ĝin se ni uzis malsamajn alfabetojn, malsamaj lingvoj. Denove, ni havas ĉi ĉeko de la argumento grafo, kaj vere oni povas preskaŭ preni tion kiel ŝablono. Preskaux cxiu programo skribas devus havi- se ĝi portas komandlinio argumentojn-iu vico de linioj kiu legas kiel tiu en la komenco. Tio estas unu el la unuaj provoj prudenton vi volas fari. Jen kion ni faris estis ni certigis ke la ŝlosilvorto estis valida, kaj kiu estis la dua ĉeko ke ni faris. Rimarku ke ni denove disigis tiun de argc kaj 2. Notu ke en tiu kazo unu afero kiun ni devis fari estis anstataŭ de uzante al mi ni volis validigi la tutan ĉenon, kaj por fari tion vi vere devas iri karaktero de karaktero super la kordoj. Ne bona maniero nomi ion sur ĝi ĉar eĉ, ekzemple, al mi revenos 0 se ĝi ne povas analizi entjero, por ke eĉ ne funkciis. Denove, agrabla mesaĝo diras la uzanto ĝuste kio okazis. Tiam tie, denove, ni ankaŭ manipuli la kazo kie la uzanto tajpas en kontrolo D hazarda karaktero. Kaj tiam Charlotte havis demandon pli frue pri kiel ni sukcesas salti spacoj en nia ĉeno ĉi tie. Tio estis ia simila al tio, kion ni faris kun la Myspace programo kiun ni faris en la sekcio, kaj la maniero ĉi laboris estas ke ni spuris la nombro de literoj kiujn ni volas vidi. Kiel ni marŝis sur la mesaĝo de ŝnuroj, kiel ni marsxis karaktero de karaktero, ni spuris la indekso kiel parto de nia por ciklo, kaj tiam ni ankaŭ spuris la nombro de literoj, do ne-supersignoj, ne-ciferoj, ne-blanka spaco ke ni volas vidi en la aparta variablo. Kaj tiam tiu solvo modifas la ŝlosilon akiri veran ŝlosilo entjero, kaj faras ke la flugo, ĝuste antaŭ ĝi tiam iras al kodi la reala mesaĝo karaktero. Estas iuj solvoj, kiuj estis perfekte granda tro kiu modifas la ŝlosilon ĝis kiam provi por la ŝlosilo de valideco. Krom certigante ke la karaktero kaj la ŝlosilvorto iris alfabeta karaktero ankaŭ turnis ke en entjero en la 0 al 25 gamo al la tiam salti devi fari tion poste en ĉi por buklo. Denove, vi vidas tie ĉi estas vere la ĝusta sama kodo kiun ni uzas en Cezaro je ĉi tiu punkto. Vi faras la ĝustan samon, do la reala lertaĵo estas elŝeligi kiel por turni la ŝlosilvorto en entjero. Unu afero, kiun ni faris ĉi tie, ke estas iom densa estas ni ripetas ĉi tiu frazo, mi supozas ke vi povus nomi ĝin, 3 apartaj fojoj sur linioj 58, 59, kaj 61. Ĉu iu povas klarigi, kio precize tiu frazo faras? Ĝi estas aliro al gravulo, kiel vi diris. Yeah, estas [inaudible] karaktero en la ŝlosilvorto, kaj tiel ĝi estas nombro de literoj vidis ĉar vi nur movante kune la ŝlosilvorto iam vi vidis la leteron, por ke tuj efektive salti spacoj kaj da tio. Yeah, precize. Kaj tiam kiam vi vidis la ŝlosilvorto malplenan vi ĵus mod tiel vi movas reen ĉirkaŭe. Ekzakte. Tio estas perfekta klarigo. Kio Kevin diris estas ke ni volas indekson en la ŝlosilvorto. Ni volas ricevi la num_letters_seen karaktero, se vi volas, sed se num_letters_seen superas la longon de la ŝlosilvorto, la vojo ni reiros al la adekvata gamo estas ni uzi la mod operatoro efike envolver ĉirkaŭe. Ekzemple, kiel en la mallonga, nia ŝlosilvorto estas lardo, kaj estas 5 literojn longaj. Sed ni jam vidis 6 literoj en nia simpla teksto en ĉi tiu punkto kaj ĉifrita 6. Ni finos alirante la num_letters_seen, kiu estas 6, mod la longo de la ŝlosilvorto, 5, kaj tiel ni ricevos 1, kaj tiom, kion ni faros estas ni aliri al la unua gravulo ene de nia ŝlosilvorto en tiu punkto. Bone, demandojn en Vigenère antaŭ ol ni movos on? You guys sentante sufiĉe bona pri tio? Cool, granda. Mi volas certigi ke vi infanoj ricevas la ŝancon de vidi kodo ke ni pensas aspektas bone kaj havi la eblecon lerni de ĝi. Ĉi tuj estos la lasta ni estos uzi spacoj por la momento, kaj ni iras al transiro nun, kaj mi tuj iros al cs50.net/lectures do ni povas fari iom da kvizo revizio. La plej bona maniero mi pensas komenci fari kvizo recenzo devas veni al ĉi Prelegoj paĝo, cs50.net/lectures, kaj sub ĉiu de la semajno rubrikoj, do se mi rigardas ĉi tie Semajno 0, Mi vidas ke ni havas liston de temoj kiujn ni kovrita Semajno 0. Se iu el tiuj temoj ŝajnas ne koni vin vi certe volas reveni kaj scour la prelego notoj kaj eble eĉ skim tra la prelegoj, rigardi ilin denove se vi volas akiri senton por kio okazas kun ĉiu el tiuj temoj. Mi diros aldone tiu jaro unu el la malvarmaj rimedoj ni havas estas tiuj mallongaj kiu ni kreis, kaj se vi rigardas Semajno 0, ni ne havas ĉiujn el la temoj kovritaj, sed ni havas sufiĉe da ili, kelkaj el la trickier bonaj, do rigardante tiujn mallongaj denove estas bona maniero por akiri vin por akceli. En aparta, mi tuj metos en kuseneto por la 3 sur la fundo, kiel mi faris tiujn. Sed se vi luktas kun duuma, bitoj, deksesumajn, ke ia aĵo, duuma estas bonega loko por komenci. ASCII estas alia tio estas bona por rigardi ankaŭ. Vi povas eĉ spekti min 1.5x rapido se mi iros tro malrapida por vi. Pro tio la recenzo, bonvolu fari tion. Nur por komenci vere rapide, ni tuj iru tra paro el tiuj kvizo problemoj nur por rapide Mazara tra tiuj. Ekzemple, ni rigardu problemo 16 kiu mi havas rajton ĝis tie sur la tabulo. Ni havas ĉi sekvan ŝtonon en duuma, kaj ni volas montri ian laboron. Konsentite, mi tuj donos ĉi ŝoton. You guys devus sekvi kune kun papero, kaj ni faros ĉi vere rapide. Ni volas realigi la sekvan ŝtonon en duuma. Mi havas 00110010. Kaj mi tuj aldoni al ĝi 00110010. Por la math genioj post kune hejme, ĉi tiu estas efektive multiplikante per 2. Ni komencu. Ni tuj sekvas la saman Krome algoritmo kiu ni kiam ni aldonos decimalaj numeroj kune. Vere la sola diferenco estas, ke ni buklo reen ĉirkaŭ iam ni havas 1 +1 anstataŭ iam ni atingos 10. Se ni komencos de la dekstra, vere rapide, kio estas la unua cifero? [Studenta] 0. >> [Nate H.] 0. Granda, la dua cifero? [Studenta] 1. [Nate H.] Ĉu ĝi estas 1? 1 + 1 estas? [Studenta] 10. [Nate H.] Ekzakte, do kio estas la cifero ke mi skribas dekstren sub la 2 karaj aldonis kune? [Studenta] 1, 0, aŭ 0 kaj tiam porti la 1. [Nate H.] 0 kaj porti 1, ĝuste. Sekva unu supre, Bazilo, vi estas supren. Kio estas la tria? >> [Bazilo] 1. [Nate H.] 1, perfekta. Kevin? [Kevin] 0. >> [Nate H.] 0, Charlotte? [Charlotte] 0. >> [Nate H.] Jes, kaj kion mi faras? [Studenta] La 1. [Nate H.] Kaj kion mi faru? Kaj tiam mi portas la 1. Perfekta, Sahb? >> [Sahb] Nun vi havas 1. [Nate H.] Kaj do mi faras ion tie? [Sahb] Tiam por la venonta unu vi havas 1 ĉar vi portis super 1. [Nate H.] Granda, tiel ĉi tie ni povas fini ĝin. Cool. [Studenta] Does 0 + 0 = 0? 0 + 0 = 0. 1 + 1, kiel vi diris, estas 10, aŭ 1, 0, prefere. 10 estas _misnomer_ ĉar al mi 10 signifas la numero 10, kaj estas la Quirk de kiel ni reprezentas ĝin kiam ni skribas ĝin. Ni reprezentas la nombron 2 per 1, 0, kaj la nombro 10 estas iomete malsamaj. Kio estas speco de agrabla pri duuma estas kiu vere ne estas ke multaj kazoj vi bezonas lerni. Estas 0 + 0 = 0, 0 + 1 = 1, 1 + 1 estas 0, kaj poste porti 1, kaj tiam vi povas vidi tie en la tria kolumno de la dekstra ni havis ĉi 1, 1, kaj 1. Kaj 1 + 1 + 1 estas 1, kaj vi portas alian 1. Kiam vi faras duuma krome, belaj simpla. Mi faros kelkajn pli el tiuj al prudento kontrolu vin antaŭ ol vi iros, ĉar ĉi tiu estas Probable iu kiun ni vidos en la kvizo. Nun ni faru ĉi sekva tiu siavice. Ni faru problemo 17. Ni tuj konverti la sekva duuma nombro al decimala. Mi havas 10100111001. Memori en la duuma video kiun mi faris Mi promenis tra kelkaj ekzemploj, kaj mi montris kiel ĉio funkcias kiam vi faras ĝin en dekuma. Kiam vi laboras en dekuma reprezento Mi kredas ke ni estas en ĉi tiu punkto en nia vivo tiel flua en gxi, ke ĝi estas bela facile glosan super la mekaniko de kiel reale funkcias. Sed por fari rapidan recap, se mi havas la numeron 137 ĉi vere signifas-kaj denove, ĉi tiu estas en dekuma reprezento- la nombro 137 en dekuma signifas ke mi havas 1 x 100 + 3 x 10 + 7 x 1. Tio estas ĉio restas en la ekrano. Kaj tiam se vi rigardas tiujn numerojn ĉi tie, 100, 10 kaj 1, vi vidos ke ili estas vere ĉiuj potencoj de 10. Mi havas 10 ², 10 ¹, kaj 10 por la nulo. Ni havas similan tiaj aferoj en duuma, krom ke nia bazo, kiel ni nomas ĝin, estas 2 anstataŭ 10. Tiuj 10s ke mi skribis cxi tie malsupre, ĉi 10 ², 10 ¹, 10 al la nulo, 10 estas nia bazo, kaj la eksponento, 0, 1, aŭ 2, estas enhavita per la pozicio de la cifero en la numero kiun ni skribas. 1, se ni rigardas ĝin, tiu 1 estas en la 2-a pozicio. La 3 estas en la 1-a pozicio, kaj la 7 estas en la 0th pozicio. Tiel estas kiel ni preni la diversajn eksponentoj sube por niaj bazoj. Post ĉio ĉi we'll-efektive, vi scias kion? Ni do-kien mia malfari butono iras? Tie iras. Mi amas ĉi malfari afero. Post tio mi pensas ke mi almenaŭ la plej facila maniero por komenci igi duuma nombro aŭ deksesuma nombro kie la bazo estas 16 kaj ne 10 aŭ 2 estas iri antaŭen kaj skribi eksteren la bazoj kaj eksponentoj por ĉiuj nombroj en mia duuma nombro ĉe la supro. Se ni komencos de maldekstra al dekstra denove, kiu estas speco de _counterintuitive_, Mi ŝanĝos al nigra tie, ni havas la 2 al la 0th pozicio, kaj poste ni havas 2 ¹, 2 ², kaj poste 2 al la 3, 2 al la 4, 2 al la 5, 6, 7, 8, 9, kaj 10. Ĉi tiuj numeroj, kiujn mi skribis el ĉiuj estas la eksponentoj. Mi nur skribis la bazojn tie en la unuaj 3 nur por spaco. Je ĉi tiu punkto mi tuj iros antaŭen kaj mi fakte tuj viŝi la aĵoj kiujn ni faris en dekuma, se tio estas bone. Vi ĉiuj havas tiun. Tiuj el vi rigardi en linio mi certas povos rebobinar min se vi ŝatus. Ŝanĝi reen al la plumo. Nun, kion ni povas fari-se vi infanoj ne estas plene ĝis akceli en via potencoj de 2, jen tute malvarmeta. Ĝi okazas. Mi komprenas. Mi iam havis laboron intervjuo kie mi diris ke mi konas ĉiujn potencoj de 2 supren tra 2 al la 30a. Ĝi ne estis laboro mi ricevis. Ĉiuokaze, vi infanoj povas antaŭeniri kaj faru la math tie, sed kun binara ne vere havas sencon, kaj nek ne havas sencon kun dekuma aŭ deksesuma ankaŭ ne, fari la math el kie vi havas nulojn. Vi povas vidi mi havas 0 tie, 0 tie, 0 tie, 0 tie, 0 tie, 0 tie. Kial povus ĝin ne havas sencon fari la efektiva math por kalkuli la taŭga potenco de 2 por tiu posteno? Ĝuste, kiel Charlotte diris, estos 0. Povus tiel savu vin la tempo se kalkuli potencoj de 2 ne estas via forta kostumo. En ĉi tiu kazo ni nur bezonas kalkuli ĝin por 2 ĝis la 0 kiu estas-? [Studenta] 1. [Nate H.] 1, 2 al la 3 kiu estas-? [Studenta] 8. >> [Nate H.] 8. 2 al la 4? [Studenta] 2. Mi bedauxras, 1. [Nate H.] 2 al la 4 estas 16, precize. 2 al la 5, Kevin? >> 32. [Nate H.] 32, 2 al la 8? [Studenta] 32 x 8, 256. [Nate H.] Perfekta. Kaj 2 al la 10? [Studenta] 1024. [Nate H.] Yeah, 1024. Iam ni devas tiujn numerojn ni povas resumi ilin ĉiujn supren. Kaj tiu estas kie estas vere grava por fari kelkajn aferojn. Unu estas iri malrapida kaj kontrolu vian laboron. Vi povas diri ke tie estas 1 je la fino de ĉi tiu numero, do mi devas definitive ricevas neparan numeron kiel mia rezulto, ĉar ĉiuj aliaj aĵoj tuj estos eĉ nombroj pro tio ke ĝi estas duuma nombro. La alia afero por fari estas se vi atingos tiun punkton sur la provo kaj vi skribis ĝin ĝis ĉi tie kaj ke vi uzas el tempo rigardi la numeron de punktoj, ke tiu problemo meritas. Ĉi tiu problemo, kiel vi povas vidi-se mi klaki al mia tekkomputilo vere rapide- tiu problemo meritas 2 punktoj, do tio ne estas la speco de krome vi devas iri tra se vi vere premis por tempo. Sed ni ŝanĝi reen al la iPad, kaj ni iros tra ĝi vere rapide. Mi ŝatas fari la malgrandaj nombroj unua ĉar mi trovas ke pli facila. Mi ŝatas 32 kaj 8, ĉar ili iras kune belajn facile, kaj ni preni 50. 16 kaj 1 ricevas 17. Tie ni preni 57, kaj poste ni povas fari la reston de tio, do ni povas fari 57, 156. Venu. Viro, nu, ni vidos. Ni havis 57, 256, kaj 1024. Je ĉi tiu punkto, mi preferus simple iri tra. Mi havas neniun postsignon. Mi klare bezonas legi sur ĉi. 7, 6, kaj 4, vi ricevas 17. 1, 5, 5, 2, 13. Tiam ni preni 3, kaj tiam ni preni 1. 1337. Easter egg, neniu? Neniu rekonas tiun numeron? Chris rekonas la nombro. Kion tio signifas, Chris? [Chris] Leet. Leet, do se vi rigardas tion, ĝi aspektas kiel Leet. Hacker stuff. Atentu, ke ia aĵo en la midterm aŭ la kvizo, prefere. Se vi vidas tian materialon kaj vi demandas "Hm," kiuj povus reale signifas ion. Mi ne scias. David ŝatas meti ĝin in Estas bona maniero prudento kontroli ĝin. Kiel bone, mi vidas kio okazas. Tio Semajno 0/Week 1 stuff. Se ni ŝanĝi reen al nia tekkomputilo nun, malzomi, kaj paro de aliaj aĵoj. Ekzistas ASCII, kiu ni estis farante multajn kun la problemo aroj. Ĉi tiu nocio de ĉefurbo A. Kio estas tio vere? Sciante ke estas la dekuma entjero. 65 estas kio ĝi estas mapita al la ASCII tablo, kaj tio estas do, kiel la komputila skribas ĝin, kaj tiel estas kiel ni estas atingi forigu reale skribi la karaktero ĉefurbo A kaj la karaktero minuskla a en iu el tiuj solvoj kaj problemo aroj kiuj vi estis farante. Paro de aliaj aĵoj. Ni havas deklaroj, bulea esprimoj, kondiĉoj, cikloj, variabloj kaj fadenoj. Tiuj ĉiuj ŝajnas sencon plejparte? Iuj el ĉi terminaro estas iom funky foje. Mi ŝatas pensi de formulita kiel plejparte iu kiu finiĝas per punktokomo. Deklaroj kiel x = 7, kiu difinas variablon, supozeble nomata x = 7. Supozeble x estas ankaŭ speco ke povas stoki la numero 7, do ĝi estas int aŭ eble kaleŝego aŭ mallonga aŭ char, io simila. Al bulea esprimo uzante tiujn duobla egalas kaj la bang egalas aŭ ne egalas, malpli ol, pli grandaj ol, malpli ol aŭ egala al, ĉiuj tian materialon. Kondiĉoj do se alie deklaroj. Mi memoras, ke vi ne povas havi alian sen responda se. Tiel same, vi ne povas havi alian se sen responda se. Cikloj, memori la 3 specoj de cikloj ni estis martelante en vin por la lasta paro de sekcioj kaj problemo aroj. Uzanta do dum kiam vi ricevas uzanto enigo, uzante dum maŝojn ĝis aparta kondiĉo estas vera, kaj tiam uzanta tiuj por maŝojn se vi bezonas scias kion ripeto de la ciklo vi estas nuntempe en estas kiel mi pensas pri ĝi. Aŭ se vi faras por ĉiu signo en cxeno mi volas fari ion, por ĉiu ero en tabelo mi volas fari ion por ke elemento. Fadenoj kaj okazaĵoj. Tiuj ni ne kovris tiom eksplicite en C, sed memoru ĉi tion de Scratch. Ĉi tiu estas la nocio de havi malsamajn skriptoj. Ĉi tiu estas ankaŭ tiu nocio de elsendi okazaĵon. Kelkaj homoj ne uzis elsendoj en siaj projektoj komence, kio estas plene cool, sed ĉi tiuj estas 2 malsamaj manieroj manipuli tiun grandan temo nomis konkurenco, kiu estas kiel vi akiri programoj por ekzekuti aŭ ŝajne ekzekuti samtempe? Malsamaj taskoj kurante dum aliaj taskoj estas ankaŭ kuri. Tiel estas kiel via operaciumo ŝajnas funkcii. Jen kial, kvankam, ekzemple, Mi got mia retumilo kurante, mi povas ankaŭ ŝalti Spotify kaj ludi kanto. Tio estas pli ol koncepta afero por kompreni. Mi rigardu la fadenoj mallonga se vi volas lerni pli pri tio. Vidu, mi kredas ke povus esti problemo pri tiu en unu el tiuj. Denove, mi kredas fadenoj kaj eventoj ne estas iu kiu nin kovros en C nur ĉar ĝi estas signife pli malfacila ol en Scratch. Vi devus ne maltrankviliĝu pri tio tie, sed definitive kompreni la konceptojn, kompreni kio okazas. Antaŭ ol ni movos on, demandojn en Semajno 0 materialo? Ĉiuj sentas sufiĉe bonaj? Kompreno variabloj kaj kion variablo estas? Movante plu. Semajno 1. Paro de aferoj tie kiuj ne aparte kovrita en la kvizo revizio nepre kaj ankaŭ estas pli koncepta aferojn por pripensi. La unua estas tiu nocio de kio fontkodo, tradukiloj kaj celo kodo estas. Neniu? Bazilo. Estas objekto kodo-mi volas diri fontkodo estas kion vi metas en clang, kaj objekto kodo estas kion clang metas ekster por ke via komputilo povas legi la programon. Ekzakte. Fontkodo estas la C-kodo, kiun vi vere tajpi supren. Objekto kodo estas kion vi eliri de clang. Ĝi estas la _0s_ kaj _1s_ en tiu duuma formato. Tiam kio okazas estas kiam vi havas faskon da objekto dosieroj, diru vi kompili projekto aŭ programo kiu uzas plurajn fontkodon dosieroj, kiu per konvencio estas donitaj la. c sufikso. Tial ni havas caesar.c, vigenère.c. Se vi skribas Java programojn vi donos al ili la etendo. Java. Pitono programoj havas la etendo. Py ofte. Kiam vi havas multnombraj. C dosierojn, vi kompili ilin. Clang kraĉas el ĉio ĉi duuma rubo. Tiam ĉar vi nur volas 1 programon vi havas la enlazador ligas ĉiujn tiujn objekto Fajlilo kune en 1 ruleblan dosieron. Tiu estas ankaŭ kio okazas kiam vi uzas la CS50 biblioteko, ekzemple. La CS50 biblioteko estas ambaŭ tio. H kapdosiero ke vi legas, ke # includecs50.h. Kaj tiam ĝi estas ankaŭ speciala duuma biblioteko dosieron ke tio estis kompilita tio estas _0s_ kaj _1s_, kaj ke-l flago, do se ni reiru al nia Spacetoj kaj ni rigardas vere rapide ĉe kio okazas ĉi tie kiam ni rigardas nian clang komando, kion ni havas estas tiu estas nia fontkodon dosieron ĉi tie. Tio estas aro da tradukilo flagoj. Kaj poste en la fino, tiuj-l flagoj ligilon en la efektiva duumajn dosierojn por tiuj 2 bibliotekoj, la CS50 biblioteko kaj tiam la math biblioteko. Komprenante unu la tipo de dosieroj 'celo en la kompilaĵo procezo estas io vi volas povi doni almenaŭ altan nivelon superrigardon pri. Fontkodon envenas Objekto kodo eliras. Celkodo dosieroj ligi kune, kaj vi ricevos belan, plenumebla dosiero. Cool. Ĉi tiu estas ankaŭ kie vi povas akiri erarojn en multnombraj punktoj en la kompilaĵo procezo. Tie estas kie, ekzemple, se vi prenas tiun ligas flago, la CS50 flago, kaj vi preterlasas ĝin en Spacetoj aŭ kiam vi uzas vian kodon, ĉi tiu estas kie vi ricevos eraro en la sinsekvo fazo, kaj la enlazador diros, "Hej, vi nomas funkcio GetString jen en la CS50 biblioteko. " "Vi diris al mi estis en la CS50 biblioteko, kaj mi ne povas trovi la kodon por ĝi." Tie estas kie vi devas ligi ĝin, kaj tio estas aparta el tradukilo eraro ĉar la tradukilo rigardas sintakson kaj tiu klaso de aĵoj. Estas bone scii kio okazas kiam. Aliaj aferoj por scii pri. Mi dirus al vi certe volas rigardi la mallongajn sur typecasting farita de Jordan kompreni kion ints estas sub la kapuĉo, kion signoj estas sub la kapuĉo. Kiam ni parolas pri ASCII kaj ni efektive rigardi la ASCII tablo, kio ke tio faras, donas al ni sub la kapuĉo rigardo ĉe kio la komputilo fakte reprezentas ĉefurbo A kaj la cifero 7 kaj komo kaj demandosigno. La komputilo ankaŭ havas specialajn formojn por reprezenti la nombro 7 kiel entjero. Ĝi havas specialan manieron por reprezenti la numeron 7 kiel glitpunktaj numeron, kaj tiuj estas tre malsamaj. Typecasting estas kiel vi diras al la komputilo "Hej, mi volas ke vi konverti de unu prezento al alia prezento. " Kial ni ne rigardu tion. Mi ankaŭ rigardu la mallonga sur bibliotekoj kaj la mallonga sur tradukiloj. Tiuj diskuto pri la procezo de kompilaĵo, kia biblioteko estas, kaj iru sur kelkaj el tiuj demandoj, kiuj vi eble demandas. Demandojn sur Semajno 1 materialo? Ĉu estas temoj en ĉi tie kiuj similas fortimiga vi ŝatus kovri? Mi provas blovi tra la plimulto de tiuj antaŭaj temoj por ke ni povas atingi punteros kaj faru iom de rekursio. Pensoj? Ion por kovri? Tempo por iu ĉokolado eble? You guys laboras tra ĝi. Mi iros por subteni trinketis mian kafon. Semajno 2. Bona alvoko, bonaj alvokon. En Semajno 2 ni parolis iom pli pri funkcioj. En la unuaj kelkaj problemo aroj ni ne vere skribis neniun funkcioj je ĉiu alia ol kion funkcio? [Studenta] Ĉefaj. >> Main, precize. Kaj tial ni vidis la malsamaj kostumoj kiujn ĉefa portas. Estas unu en kiu prenas neniun argumenton, kaj ni simple diri malplena en inter la krampoj, kaj tiam tie estas la alia unu kie ni volis preni komandlinio argumentoj, kaj kiel ni vidis, jen kie vi havas int argc kaj kordoj argv tabelo aŭ nun ke ni reale elmontrita string esti la signo * ke estas nin tuj komenci skribi ĝin kiel char * argv kaj poste krampoj. En Problemo Serio 3, you guys vidis aron da funkcioj, kaj vi implementado faskon da funkcioj, desegni, serĉi, scramble. La prototipoj estis ĉiuj skribita tie por vi. Kion mi volis paroli pri ĉi tie kun funkcioj vere rapide estas ke estas 3 partoj al ili kiam ajn vi skribas funkcio. Vi devas specifi la reveno tipon de la funkcio. Vi devas specifi nomon por la funkcio, kaj tiam vi devas specifi la argumento listo aŭ la parametron listo. Ekzemple, se mi skribus funkcio por sumigi faskon de entjeroj kaj poste reveni al mi la sumo kio estus mia reveno tipo se mi volis resumi entjeroj kaj tiam revenu la sumo? Tiam la nomo de la funkcio. Se mi iras antaŭen kaj skribi en verdo, ĉi tiu parto estas la reveno tipo. Tiu parto estas la nomo. Kaj poste en inter krampoj estas kie mi donas la argumentoj, ofte mallongigita kiel argumentojn, kelkfoje nomita params por parametroj. Kaj se vi havas unu, vi simple specifis la unu. Se vi havas plurajn vi apartigos ĉiu kun komo. Kaj por ĉiu argumento vi donas ĝin 2 aferoj kiuj estas-Kevin? [Kevin] Oni devas doni la tipo kaj tiam la nomo. Kaj tiam la nomo, kaj la nomo estas la nomo kiun vi tuj uzi por raporti al tiu argumento ene de la sumo funkcio, ene de la funkcio kiun vi aktuale skribas. Vi ne devas-ekzemple, se mi iros en adicias, diri, tabelo de entjeroj-we'll fari int tabelo, kaj Mi donos al mi iun frizita krampoj tie- tiam, kiam mi pasas tabelo al la sumo funkcio Mi pasi ĝin en la unua pozicio de la argumento listo. Sed la tabelo, ke mi pasas en ne devas havi la nomon Arr. Arr tuj estos kiel mi rilatas al tiu argumento ene de la korpo de la funkcio. La alia afero ke ni bezonas konsideri, kaj ĉi tiu estas iomete malsamaj de funkcioj, sed mi kredas ke estas grava punkto, estas ke en C kiam mi skribas funkcio kiel tiu kiom mi scias, kiel multaj elementoj estas en ĉi tiu tabelo? Tio estas iom da ruzo demando. Ni parolis pri tiu iomete en la pasinta semajno sekcio. Kiel mi sciu la nombron de elementoj interne tabelo en C? Ĉu estas maniero? Rezultas, ke ne estas maniero scii. Vi devas pasi ĝin en aparta. Estas lertaĵo, ke vi povas fari se vi estas en la sama funkcio en kiu la tabelo estis deklarita, kaj vi laboras kun stako tabelo. Sed tio nur funkcias se vi estas en la sama funkcio. Iam vi pasas tabelo al alia funkcio aŭ se vi jam deklaris tabelo kaj vi metis tiun tabelo sur la havaĵon, vi uzis malloc  kaj ke ia aĵo, tiam ĉiuj vetas estas for. Tiam vi vere havas pasi ĉirkaŭ speciala argumento aŭ alia parametro diras al vi kiel granda la tabelo estas. En ĉi tiu kazo, mi volas uzi komo-I'm sorry, ĝi estas pafante la ekrano tie- kaj mi pasas en alia argumento  kaj nomas ĝin int len ​​por la longa. Unu afero kiu povas veni sur la kvizo petas vin skribi aŭ apliki aparta funkcio nomita ion. Se ni ne donos al vi la prototipo, do ĉi tiu tuta afero ĉi tie, ĉi tiu tuta salaton nomas la funkcion deklaro aŭ la funkcio prototipo, tio estas unu el la unuaj aferoj kiujn vi volas najli malsupren se ĝi estas ne donita vin tuj sur la kvizo. La alia ruzo mi lernis estas ke diras, ke ni faru al vi prototipo por funkcio, kaj ni diru, "He, vi devas skribi ĝin." Interne de la frizita krampoj, ke vi havas sur la kvizo se vi rimarkos ke ekzistas reveno tipo kaj vi rimarkos ke la reveno tipo estas io alia ol malplena, kio signifas ke la funkcio ne redonas nenion, tiam unu afero vi ja volas fari estas skribi ia reveno deklaro ĉe la fino de la funkcio. Revenu, kaj en ĉi tiu kazo, ni metos malplenan ĉar ni volas plenigi la malplenan. Sed ĉi gets vi pensas en la dekstra vojo pri tio, kiel mi povos alproksimigi tiun problemon? Kaj ĝi rememorigas al vi ke vi tuj devas reveni valoro al la telefonanto de la funkcio. Yeah. >> [Studenta] Does stilo apliki kiam ni skribas kodo en la kvizo? Kiel deŝovon kaj tiu klaso de aĵoj? >> [Studenta] Yeah. Ne, ne tiel. Mi kredas multan-ĉi estas io ni klarigi la kvizo en la tago de, sed tipe maltrankviligante # inkludas kaj tian materialon, estas speco de ekstere. [Studenta] Cxu vi bezonas diri vian manskribita kodo? Ĉu vi bezonas diri vian manskribita kodo? Dirante estas ĉiam bona se vi ĝenus pri partaj kredito aŭ vi volas komuniki vian intencon al la grader. Sed mi, denove, klarigos en la kvizo mem kaj en la kvizo tago, sed mi ne kredas ke vi estos necesa por skribi komentojn, ne. Tipe ne, sed estas definitive la tiaj aferoj kie vi povas komuniki vian intencon, kiel "Hej, ĉi tiu estas kie mi iros kun ĝi." Kaj kelkfoje, ke ili povas helpi kun parta kredito. Cool. Bazilo. [Bazilo] Kio estas la diferenco inter deklarante, diru, int lang en la argumentoj aŭ parametroj kontre deklari variablon en la funkcio? Wow, kafo malsupreniris la windpipe. [Bazilo] Kiel kiujn aferojn ni volas meti en argumentoj. Yeah, ke estas granda demando. Kiel vi elektas tion, kion vi volas meti en la argumentoj kontre kion vi devas fari ene de la funkcio? En ĉi tiu kazo ni inkludis ambaŭ de ĉi tiuj kiel argumentoj ĉar ili estas io ke kiu tuj uzos la sumo funkcio bezonas precizigi tion. La sumo funkcio, kiel ni raportis, ne havas manieron de scii kiel granda la tabelo estas alvenas de lia telefonanto aŭ kiu ajn uzas la sumo funkcio. Ĝi ne havas manieron de scii granda ke tabelo estas. La kialo ni pasas en ĉi longo ĉi tie kiel argumento estas ĉar tio estas iu kiu ni esence diri la telefonanto de la funkcio, ajn tuj uzos la sumo funkcio, "He, ne nur vi devas doni al ni tabelo de ints, vi ankaŭ devas diri al ni kiel granda la tabelo kiun vi donis al ni estas. " [Bazilo] Tiuj estos ambaŭ esti komandlinio argumentoj? Ne, ĉi tiuj estas realaj argumentoj kiujn vi pasus al la funkcio. Lasu min fari novan paĝon tie. [Bazilo] Kiel nomo pasus- [Nate H.] Se mi havas int main (void), kaj mi tuj metos en mia reveno 0 cxi tie malsupre, kaj diru mi volas nomi la sumo funkcio. Mi volas diri int x = sumo (); Por uzi la sumo funkcio mi devas pasi en ambaŭ la tabelo, ke mi volas resumi kaj la longo de la tabelo, do ĉi tiu estas kie supozante mi havis aron da ints, diras mi havis int numbaz [] = 1, 2, 3, ia uzo kiu tiras supren sintakso dekstra tie, tiam kion mi faras estas en sumo mi volus pasi en ambaŭ numbaz kaj la numero 3 por diri al la sumo funkcio "Okay, jen la tabelo mi volas ke vi resumi." "Jen lia grandeco." Ĉu tio havas sencon? Ĉu tio respondas vian demandon? En multaj manieroj ĝi faras paralelajn kion ni faras kun ĉefa kiam ni havas la komandlinio argumentoj. Programo kiel Cezaro kodita, ekzemple, kiu bezonis komandlinio argumentoj ne estus kapabla fari ion. Ĝi ne scias kiel kodi se vi ne diros ĝin kio ŝlosilon por uzi aŭ se vi ne diros ĝin kio string vi volis kodi. Instigante por enigo, ĉi tiu estas kie ni havas 2 malsamajn mekanismojn por preni enigo en de la uzanto, por preni informojn en de la uzanto. Por Problemo Ŝanĝu 1 ni vidis ĉi GetInt, GetString, GetFloat vojo de instigante por enigo kaj ke nomas uzanta la normo eniro rivereto. Estas iomete malsamaj. Estas iu kiu povas fari samtempe kiel kontraŭ kiam vi vokas la programo, kiam vi komencas la programo kuras. La komandlinio argumentoj ĉiuj estas precizigita kiam vi komencas la programo kurado. Ni estis miksante la du el tiuj. Kiam ni uzas argumentojn al funkcio, estas multe kiel komanda linio argumentojn al ĉefa. Estas kiam vi alvokas la funkcion vi bezonas sciigi kion ekzakte li bezonas, por plenumi siajn taskojn. Alia bona afero por rigardi, kaj mi ellasos vin rigardi ĝin en via libera tempo, kaj estis kovrita en la kvizo-estis tiu nocio de medio kaj lokajn variablojn kontre tutmonda variabloj. Ĉu atentu tion. Nun kiam ni pretigis al tiu alia materialo, en Semajno 3 ni komencis paroli pri serĉado kaj ordigi. Serĉado kaj ordigi, almenaŭ en CS50, estas tre enkonduko al kelkaj el la pli teoria partoj de komputiko. La problemo de serĉado, la problemo de ordigi estas granda, kanona problemojn. Kiel vi trovos apartan numeron en tabelo de miliardoj de entjeroj? Kiel trovi apartan nomon ene de telefono libro ke tio trovigxas en via portebla? Kaj tial ni enkondukas ĉi nocio de asimptota run fojoj por vere kvantigi kiel longe, kiel malfacile tiuj problemo estas, kiel longe ili prenas solvi. En, mi kredas, 2011 La kvizo tie estas problemo, kiun mi opinias meritoj kovrante tre rapide, kiu estas ĉi tiu, problemo 12. Ho ne, ĝi estas Omega. Ĉi tie ni parolas pri la plej rapida ebla tempo de ekzekuto por aparta algoritmo kaj tiam la plej malrapida ebla tempo de ekzekuto. Ĉi Omega kaj O estas vere ĝuste ŝparvojoj. Ili estas _notational_ ligiloj por diri kiom firme en la plej bona ebla kazo volo nia algoritmo kuri, kaj kiel malrapida en la plej malbona ebla kazo nia algoritmo ruli? Ni faru kelkajn el tiuj, kaj tiuj ankaŭ estis kovrita en la mallonga sur asimptota skribmaniero, kiun mi tre rekomendas. Jackson faris vere bonan laboron. Kun duuma serĉo, ni parolas pri duuma serĉo kiel algoritmo, kaj ni kutime parolas pri tio en terminoj de lia granda O. Kio estas la granda a? Kio estas la plej malrapida ebla tempo de ekzekuto de duuma serĉo? [Studenta] N ²? Apude, mi supozas similan al tio. Estas multe pli rapida ol tio. [Studenta] Duuma? >> Jes, duuma serĉo. [Studenta] Estas logo n. Ensalutu n, tiel kion faras ensaluti n signifas? Ĝi duonoj ĝin ĉiu ripeto. Precize, do en la plej malrapida ebla kazo, diru se vi havas ordo tabelo de miliono entjeroj kaj la nombro vi serĉas estas ĉu la unua elemento en la tabelo aŭ la lastan eron en la tabelo. Memoru, la duuma serĉo algoritmo funkcias rigardante la mezo elemento, vidante se tio estas la partio kiu vi serĉas. Se jes, tiam granda, vi trovis ĝin. En la plej bona ebla kazo, kiel rapide faras duuma serĉo kuri? [Studentoj] 1. 1, ĝi estas konstanta tempo, granda O de 1. Yeah. [Studenta] Mi havas demandon. Kiam vi diras ensaluti de n, vi volas diri kun respekto al bazo 2, ĉu ne? Jes, tiel ke estas la alia afero. Ni diru log n, kaj mi supozas, kiam mi estis en mezlernejo Mi ĉiam supozis ke log estis bazo 10. Yeah, do jes, log bazo 2 tipe estas kion ni uzas. Denove, irante reen al duuma serĉo, se vi serĉas ĉu la elemento en la fino aŭ en la elemento en la komenco, ĉar vi komencas en la mezo kaj tiam vi forĵetos ajn duono ne plenumas la kriteriojn kiujn vi serĉas, kaj vi iru al la sekvanta duono kaj la sekva duono kaj la sekva duono. Se mi serĉas la plej granda ero en la miliono entjero tabelo Mi tuj halve ĝi maksimume log'o da 1 milionoj fojoj antaŭ ol mi fine testi kaj vidi, ke la elemento Mi serĉas Estas en la plej granda aŭ en la plej alta indico de la tabelo, kaj kiu portos log n, ensaluti de 1 miliono foje. Bobelo varon. Ĉu vi infanoj memoras la bobelo speco algoritmo? Kevin, vi povas doni al mi rapidan recap de kio okazis en la veziko speco algoritmo? [Kevin] Esence ĝi iras tra ĉiu en la listo. Ĝi rigardas la du unuaj. Se la unua estas pli granda ol la dua oni interŝanĝas ilin. Tiam komparas dua kaj tria, saman, svopoj, tria kaj kvara, la tutan vojon malsupren. Granda nombro sekvos ĝis la fino. Kaj post tamen multaj maŝojn vi faris. Precize, do kio Kevin diris estas ke ni rigardas pli grandaj nombroj bobelo ĝis la fino de la tabelo. Ekzemple, ĉu vi bonvolus marŝante ni per ĉi tiu ekzemplo, se ĉi tiu estas nia tabelo? [Kevin] Vi prenas 2 kaj 3. 3 estas pli grandaj ol 2, do vi interŝanĝi ilin. [Nate H.] Ĝuste, do ni interŝanĝi tiujn, kaj tiel ni atingos 2, 3, 6, 4, kaj 9. [Kevin] Tiam oni komparas la 3 kaj 6. 3 estas pli malgranda ol 6, do vi lasos ilin, kaj 6 kaj 4, vi volas interŝanĝi ilin ĉar 4 estas pli malgranda ol 6. [Nate H.] Ĝuste, do I get 2, 3, 4, 6, 9. [Kevin] Kaj 9 estas pli granda ol 6, do vi lasos ĝin. Kaj vi volas iri reen tra ĝi denove. [Nate H.] Am mi faris je ĉi tiu punkto? >> [Kevin] No Kaj kial mi ne faris je ĉi tiu punkto? Ĉar ĝi aspektas kiel miaj tabelo estas ordigita. Mi rigardis ĝin. [Kevin] Go tra ĝi denove kaj certigi, ke ne ekzistas pli svopoj antaŭ ol vi povos plene haltos. Ekzakte, tiel vi devas teni tuj tra kaj certigi, ke ne ekzistas svopoj ke vi povas fari en ĉi tiu punkto. Vere estis nur bonŝanca, kiel vi diris, ke ni finis nur devi fari 1 pasas tra kaj ni ordo. Sed por fari tion en la ĝenerala kazo ni vere devas fari tion denove kaj denove. Kaj fakte, tio estis la ekzemplo de la plej bona ebla kazo, kiel ni vidis en la problemo. Ni vidis, ke la plej bona ebla kazo n. Ni trapasis la tabelo 1 fojo. Kio estas la plej malbona ebla kazo por ĉi tiu algoritmo? [Kevin] N ². Kaj kion tio ke rigardo ŝatus? Kion tabelo aspektas kiel kiu portus n ² tempo? [Kevin] [inaudible] ordo. Precize, do se mi havus la tabelo 9, 7, 6, 5, 2, unue la 9 would bobelo tuta vojo supren. Post 1 ripeto ni havus 7, 6, 5, 2, 9. Tiam la 7 would bobelo supren, 6, 5, 2, 7, 9, kaj tiel plu kaj tiel plu. Ni devus iri tra la tuta tabelo n fojoj, kaj vi povas reale preni iom pli precizan ol tio ĉar iam ni movis la 9 tuta vojo supren al lia lasta ebla pozicio Ni scias, ke ni neniam devas kompari kontraŭ tiu elemento denove. Iam ni komencu bobelis la 7 ĝis ni scias, ke ni povas halti tuj la 7 estas rekta antaux la 9 ĉar ni jam komparis la 9 al ĝi. Se vi faros tion en inteligenta maniero ne estas vere, mi supozas, ke multe da tempo. Vi ne tuj kompari ĉiujn eblajn [inaudible] kombinaĵoj ĉiun solan fojon vi iras tra ĉiu ripeto. Sed ankoraŭ, kiam ni parolas pri tiu supera baro ni diras, ke vi serĉas al la n ² komparoj tuta vojo tra. Ni reiru, kaj pro tio ni komencis ricevi iom mallonga ĝustatempe Mi dirus al vi devus definitive iri tra la resto de ĉi tiu tablo, plenigi ĉion eksteren. Pensu pri ekzemploj. Pensu pri konkretaj ekzemploj. Tio estas vere utila kaj helpema por fari. Desegni ĝin. Ĉi tiu estas la speco de tablo, kiu kiel vi iros tra en komputiko vi devas vere komenci scii tiujn parkere. Tio estas la specoj de demandoj vi akiras en intervjuoj. Ĉi tiuj estas specoj de aferoj, kiuj estas bone scii, kaj pensas pri tiuj rando kazoj, vere decidi kiom pensi sciante, ke por bobelo ordigi la plej malbona ebla tabelo ordigi kun tiu estas unu tio estas en inversa ordo. Punteros. Ni parolu iomete pri punteros. En la lastaj kelkaj minutoj ni havas ĉi tie Mi konas ĉi tio estas iu kune kun dosiero / S kiu estas prefere nova. Kiam ni parolas pri punteros la kialo ni volas paroli pri punteros estas ĉar, oni, kiam ni laboras en C ni estas vere en sufiĉe malalta nivelo kompare al pli modernaj programlingvoj. Ni efektive povis manipuli la variabloj en memoro, elŝeligi kie ili estas reale lokita ene de nia memoro RAM. Kiam vi foriris sur preni mastruma sistemo klasoj vi vidos ke tio, denove, ia abstraktaĵo. Tio ne vere estas la kazo. Ni havas virtualan memoron ke tio kaŝiĝas tiuj detaloj de ni. Sed por nun vi povas supozi ke kiam vi havas programon, ekzemple, kiam oni komencas kuri vian Cezaro kodita programo- Mi ŝanĝi reen al mia iPad vere rapide- ke en la tre komencante via programo, se vi havas, ekzemple, 4 gigabajtoj de RAM en via portebla, vi get flankenmetis tiun eron, kaj ni vokos ĉi RAM. Kaj parto en placo ni iras por voki 0, kaj ĝi finiĝas ĉe loko kiu ni vokos 4 gigabajtoj. Mi vere ne povas skribi. Viro, kiu tiras. Kiam via programo ekzekutas la mastruma sistemo skulptas supren RAM, kaj ĝi specifas malsamaj segmentoj por malsamaj partoj de via programo por enloĝi Cxi tie ĉi areo estas speco de tero de neniu. Kiam vi iros iom pli tie vi havas reale la loko, kie la kodo por via programo vivoj. Ke reala duuma kodo, ke ruleblan dosieron reale gets ŝarĝas en memoro kiam vi kuros programon, kaj ĝi vivas en la kodo segmento. Kaj kiel via programo ekzekutas la procesoro rigardas ĉi tiun kodon segmento elŝeligi kio estas la sekvan instrukcion? Kio estas la sekvanta linio de kodo mi bezonas por ekzekuti? Ekzistas ankaŭ datumoj segmento, kaj ĉi tiu estas kie tiuj kordoj konstantoj get stokita ke vi estis uzante. Kaj tiam pli supre estas tio loko nomata la amaso. Ni aliro memoro tien per malloc, kaj tiam al la plejsupro de via programo tie estas la pilo, kaj tie estas kie ni estis ludante por la plejparto de la komenco. Tiu ne estas skalo aŭ nenion. Multaj ĉi estas tre maŝino dependas, mastruma sistemo dependa, sed tio estas relative kiel aferoj get chunked supren. Kiam vi kuros programo kaj vi deklaras variablon nomata x- Mi iros por desegni alia skatolo sube, kaj tion oni tuj estos RAM tiel. Kaj mi tuj serĉos. Ni desegni pintaj linioj por indiki ĉi tiu estas nur malgranda parto de RAM kaj ne ĉiuj de ĝi kiel ni desegni ĉe la supro. Se mi deklarus entjero variablo nomata x, tiam kion mi reale preni estas surĵeto kiu estas stokitaj en la simboltabelon de mia programo kiu konektas la nomon x al ĉi tiu regiono de memoro kiu mi desegnis ĉi tie inter la vertikala stangoj. Se mi havas linion de kodo en mia programo kiu diras x = 7 la procesoro scias "Ho, bone, mi scias ke x vivojn en ĉi loko en memoro." "Mi tuj iros antaŭen kaj skribi 7 tie." Kiel ĝi scias kion situo estas en memoro? Nu, ke tio ĉio farita en kompila tempo. La tradukilo prizorgas atribuo kie ĉiu de la variabloj tuj iros kaj kreante specialan surĵeto aŭ pli ĝuste ligas la punktoj inter simbolo kaj kie okazas, variablo nomo kaj kie okazas vivi en la memoro. Sed ĝi rezultas ke ni povas efektive atingi ĝin en niaj programoj ankaŭ. Ĉi gets grava kiam ni komencis paroli pri iu el la datumstrukturoj, kiu estas koncepto kiu nin tuj enkonduki poste. Sed nuntempe, kion vi povas scii estas ke mi povas krei puntero al ĉi tiu loko, x. Ekzemple, mi povas krei puntero variablo. Kiam ni krei puntero variablo ni uzas la stelon skribmaniero. En ĉi tiu kazo, ĉi diras mi iros por krei puntero al int. Ĝi estas tipo same kiel ĉiu alia. Ni donas ĝin variablo kiel y, kaj poste ni starigis ĝin egala al la adreso, al adreso. En ĉi tiu kazo, ni povas agordi y atentigi al x per prenante la adreso de x, kiun ni faras kun-signo, kaj poste ni starigis y atentigi al tio. Kio ĉi esence tio estas, se ni rigardas nian RAM tio kreas apartan variablo. Ĝi okazas nomi ĝin y, kaj kiam ĉi tiu linio de kodo ekzekutas ĝi estas fakte tuj krei iom puntero kiu ni kutime desegni kiel sago, kaj ĝi proponas y atentigi al x. Jes. [Studenta] Se x estas jam pointer, ĉu vi nur faru int * y = x anstataŭ havi la signo? Jes. Se x estas jam pointer, tiam vi povas agordi 2 punteros egala al ĉiu alia, en kies kazo y ne notas al x, sed ĝi indikas kion ajn x estas indikante. Bedaŭrinde, ni estas el la tempo. Kion mi dirus al ĉi tiu punkto, ni povas paroli pri tiu offline, sed mi dirus komenci labori per tiu problemo, # 14. Vi povas vidi ke estas jam iom plenigis por vi ĉi tie. Vi povas vidi ke kiam ni deklaras 2 punteros, int * x kaj * y, kaj rimarku ke notante la * apud la variablo estis iu kiu faris pasintjare. Ĝi rezultas ke ĉi tiu estas simila al kion ni faras ĉi-jare. Ne gravas, kie vi skribos la * kiam vi deklarante la puntero. Sed ni skribis la * apud la tipo ĉar tio faras tre klare, ke vi deklarante puntero variablo. Vi povas vidi ke deklarante la 2 punteros donas ni 2 skatoloj. Jen, kiam ni starigis x egala al malloc kion ĉi diras subiras flanken memoro en la havaĵo. Ĉi tiu malgranda skatolo ĉi tie, ĉi rondo, estas lokita sur la monteto. X estas montrante al ĝi. Notu ke y estas ankoraŭ ne indikante nenion. Akiri memoron-por stoki la numero 42 en x ni uzus kion skribmaniero? [Studenta] * x = 42. Ekzakte, * x = 42. Tio signifas sekvi la sago kaj jxetu 42 en tie. Jen kie ni starigis y kaj x ni y montrante al x. Denove, tio estas ĝuste kiel kio Kevin diris, kie ni starigis y egala al x. Y estas ne montrante al x. Pli ĝuste, ĝi estas indikante kion x estas indikante ankaŭ. Kaj poste fine en ĉi tiu lasta skatolo estas 2 eblaj aĵoj kiuj ni povus fari. Unu estas ni povus diri * x = 13. La alia afero estas ni povus diri-Alex, ĉu vi scias kion ni povus fari tie? Vi povus diri * x = 13 aŭ- [Studenta] Vi povus diri int ajn. [Nate H.] Se tiu estis raportita kiel int variablo ni povus fari tion. Ni povus ankaŭ diri * y = 13 ĉar ili estas ambaŭ montrante la saman lokon, do ni povus uzi aŭ variablo alveni. Yeah. >> [Studenta] Kion ĝi aspektas kiel se ni nur diros int x estas 13? Kiu estus deklari novan variablon nomata x, kiu ne funkcius. Ni havus kolizio ĉar ni deklaras x al esti puntero ĝis ĉi tie. [Studenta] Se ni nur havis tiun deklaron per sin kio ĝi similas en terminoj de la cirklo? Se ni havis x = 13, tiam ni havus skatolo, kaj prefere ol, havante sago eliro de la skatolo ni volas desegni ĝin kiel nur 13. [Studenta] En la skatolo. Okay. Dankon pro rigardante, kaj bonan sorton en Quiz 0. [CS50.TV]