[MUZIKO Ludante] DAVID J. Malan: Bone. Jen CS50, kaj ĉi estas la fino de la semajno 2. Do hodiaŭ, ni iras daŭrigi nian rigardon ĉe kio ni reprezentas tion sub la hood-- malproksimigante de nombroj kiel entjeroj kaj glitpunktaj valoroj kaj enfokusigante kordoj kaj finfine pli interesaj programoj. Sed ni ankaux rigardu al Paro de domajna specifaj problems-- la unua el kiuj volas esti engaĝante ĉifriko, La arto de grimpadi informo, kiun vi vidas supre tie estas portreto de Radio Orphan Annie La sekreta deĉifrilo ringon de pasintaj tempoj. Tiu estas vere tre primitiva formo kaj infano-amika formo de cryptopgraphy per tiu ringo havas du disks-- unu interne kaj ekstere. Kaj per turnanta unu el tiuj, vi povas esence laŭliniigi literoj kiel A tra Z kun aliaj leteroj kiel B per A. Alivorte, vi povas laŭvorte turni la alfabeto, sekve veni supren kun surĵeto de leteroj al leterojn tiel ke, se vi volis sendi sekreta mesaĝo al iu kiel Annie, vi povus skribi malsupren vian mesaĝon kaj tiam turni la leteroj, per kiu, se vi volas diri diri "A", vi anstataŭ diri "B" vi volas diri "B" vi anstataŭ diri "C" - aŭ io iom pli ruza ol that-- kaj poste, finfine, tiel longe kiel Annie havas ĉi deĉifrilo ringo, ŝi povas deĉifri la mesaĝon. Nun, eble vi memoras, fakte, ke tiu Estis uzita en tre fama filmo kiu ludas ad nauseum dum la kristnaska sezono. Ni rigardu tien. Ralphie Parker: "Kompaton konata al ĉiuj en resumo ke Ralph Parker maniere enoficigita membro de Little Orphan Annie Sekreto Rondo kaj ĝi rajtas al ĉiuj honorojn kaj profitojn okazanta al tio. " Ralphie Parker (rakonti): Subskribita Little Orphan Annie. Legalizita, Pierre Andre! Inke. Honoroj kaj profitoj, Jam en la aĝo de naŭ. [MUZIKO Ludante] [RADIO babilado] Ralphie Parker: Venu. Ni daŭrigu ĝin. Mi ne bezonas ĉiujn ke ĵazo pri kontrabandistoj kaj piratoj. RADIO proklamanto: Aŭskultu morgaŭ nokte por finante aventuro de La Nigra Pirato Ŝipo. Nun, estas tempo por Annie La Sekreta Mesaĝo por vi anoj de la Sekreta Rondo. Memoru infanoj, nur membroj de Annie Sekreto Rondon povas malkodi Annie sekreta mesaĝo. Memoru, Annie estas dependanta sur vin. Ŝanĝu vian najloj al B-2. Jen la message-- 12, 11, 2-- Ralphie Parker (rakonti): Mi estas en mia unua sekreta kunveno. RADIO proklamanto: --25, 14, 11, 18, 16-- Ralphie Parker (rakonti): Ho, Pierre estis en granda voĉo ĉinokte. Mi povus diri ke ĉinokte La mesaĝo estis vere grava. RADIO proklamanto: --3 25. Tio estas mesaĝo de Annie sin. Memoru, ne diru al iu ajn. [Anhelante] Ralphie Parker (rakonti): Naŭdek sekundoj poste, mi en la sola salono en la domo kie knabo de naŭ povis sidi en la privacidad kaj malkodi. Ha. "B." [Sonoj] Ralphie Parker (rakonti): Mi iris al la sekva. "E." La unua vorto estas "esti". Jes! Ĝi venas pli facile nun. "Aŭ" [Sonoj] Randy Parker: Aw, venu, Ralphie. Mi devas iri! Ralphie Parker: Mi tuj malsupreniris, Ma. Gee Whiz. "T." «O.» "Nepre al. "" Nepre "kio? Kio estis Little Orphan Annie provas diri? "Nepre" kio? PATRINO: Ralphie, Randy jam alvenis al iri. Ĉu vi bonvole eliros? Ralphie Parker: Bone, panjo! Mi tuj ekstere! Ralphie Parker (rakonti): Mi Alproksimigi nun. La streĉiĝo estis teruraj. Kio estis tio? La sorto de la planedo povas pendi en la ekvilibro. PATRINO: Ralphie, Randy havas jam iri! Ralphie Parker: Mi tuj eliris, por laŭte ploris! Ralphie Parker (Rakonti): Preskaŭ tie! Miaj fingroj flugis! Mia menso estis ŝtalo kaptilo. Ĉiun poron vibris. Estis preskaŭ evidenta! Jes! Jes! Jes! Jes! Ralphie Parker: "Nepre trinki via Ovaltine. " Ovaltine? A crummy komerca? [MUZIKO Ludante] Ralphie Parker: Filo de putino. [Ridante] DAVID J. Malan: Do kiu tiam estas ekvido je kio ĉifriko eblas por this-- a trinki el pasintaj tempoj. Do rapidan anonco. Se vi estas libera ĉi Vendredo ĉe 1:15 am kaj volus ŝatus aliĝi nin por CS50 tagmanĝo estras ĉi URL tie. Unua venis, unua servi kiel kutime. Sed super tempo, ni certigu ke plej iu ajn kiu ŝatus partopreni eble plani-saĝa. Do kordoj. Ni havas Zamyla-- kiun vi jam renkontis pli verŝajna en Problemo Ara 1-- kies nomo literumas tiel. Kaj supozas ke vi tajpis sian nomon en komputila programo, kiu estas uzante iun kiel getString. Por rekuperi tiuj klavoj, kiom cxu ni iru sur reprezentante kordo, vorto, alineo, aŭ multnombraj literoj ŝatas tiujn ĉi tien? Ni parolis lastan tempon sur entjeroj kaj problemoj kiuj ŝprucas kun entjeraj overflow kaj glitpunktaj valoroj kaj problemoj levigxu ene precizeco. Kun kordoj, ni almenaŭ havi iom pli fleksebleco ĉar strings-- simple en la reala world-- povas esti bela arbitra longo. Sufiĉe mallonga, bela longa. Sed eĉ tiam ni tuj trovi ke komputiloj povas kelkfoje kuri el memoro kaj eĉ butika suficxe kordo. Sed nuntempe, ni komencu visualizar ĉeno kiel ion en tiuj skatoloj tie. Do ses tiajn skatolojn, ĉiu el kiuj reprezentas karakteron aŭ "char". Do memoru, ke "character" - c-h-a-r-- estas unu el la korpigita datumtipoj en C. Kaj kio estas agrabla estas ke vi povas uzi tiaj kiel konstruaĵo bloko, puzlo peco, se vi volas, formi granda tipo de datumoj kiujn ni devos daŭrigi voki "ŝnuro". Nun, kio estas utila pri pensante pri aĵoj kiel ŝnurojn tiamaniere? Nu, ĝi rezultas ke ni povas reale utiligi ĉi strukturo efektive konsentas individuaj karakteroj en bela simpla maniero. Mi tuj iros antaŭen kaj krei dosiero nomata "stringzero.c" sed vi povas nomi ĝin kion ajn vi volas. Kaj en la paso de afiŝinto estas jam tiu ekzemplo anticipe, tial vi ne bezonas tajpi ĉiun eksteren. Kaj mi tuj iros antaŭen kaj unue fari int ĉefa malplenon. Kaj ene de kelkaj tagoj, ni komencos turmentus aparte kion void estas ĉi tie, kial estas int apud ĉefa ks. Sed nuntempe, ni daŭrigi kopii almeti tion. Mi tuj rakontos ŝnuro nomita s. Kaj mi tuj revenos de GetString ajn la uzanto tajpas en. Ĉi tuj estos simpla programo, neniu instrukcioj, Mi simple tuj blinde atendi ke la uzanto sciu kion fari por teni ĝin simpla. Kaj nun mi iras al havi por buklo. Kaj ene de mia por buklo min tuj havi int i ricevas nulon. Kaj i estas, denove, simple konvencio, indekso variablo por rakonti, sed mi povis nomi ĉi kion mi volas. Mi iras fari i estas malpli than-- puto Zamyla nomo estas ses literoj. Do mi tuj forte kodo kiu tie nun. Kaj tiam mi ++. Kaj nun ene de tiuj buklaj krampoj mi faros printf, kaj mi volas presi unu karaktero samtempe. Do mi tuj uzos% c por eble la unua fojo. Kaj tiam mi volas presi ĉiu karaktero sur lia propra linio. Do mi tuj metos iom backslash n tie. Fermi citaĵo. Kaj nun mi volas fari ion tie. Mi volas presi la specifa litero en la kordo, s, kiel mi ripetanta de nulo je ĝis ses. Alivorte, mi volas presi la i'th karaktero de s. Nun kiel mi povas fari tion? Nu multe ŝatas la skatoloj en tiu reprezento tie, ia, sorĉvenigi la nocio de boksado literojn, vi povas simile fari tion sintakse en C simple specifante, Mi volas presi s la i'th karaktero. Uzante la rektaj krampoj sur via komputilo klavaron ke sur usona klavaro estas ĝenerale super via reveno ŝlosilon. Do tio ne estas tute korekta tamen, kiel vi eble rimarkis. Sed mi tuj speco de blinde forĝi antaŭen tie. Kaj Mi faros fari ĉenon 0. Sed antaŭ ol mi faros tion, ni vidu se ni ne povas anticipi iuj komunaj eraroj. Estas ĉi tuj kompili? Ne, mi mankis tutan faskon da aĵoj. Bibliotekoj mi aŭdis. Do kion header dosierojn eble mi volas aldoni ĉi tie? Yeah. Publiko: Vi bezonas standard I / O [inaudible] DAVID J. Malan: Bonege. Do mi bezonas normo / S. Por kio celo mi volas normo / S? Por printf. Do inkluzivi stdio.h. Kaj vi ankaŭ proponas ke mi inkluzivi la CS50 biblioteko, por kio? Havi kordoj. Do ni vidos kion CS50 biblioteko estas faranta krei ĉi nocio de kordo. Sed nuntempe, oni povas simple pensi de ĝi kiel reala datumtipo. Tiel ke ŝajnas esti iom purigis. Nun mi tuj iros antaŭen kaj ja faras fari ĉenon 0. Kompilita. Do tio estas bona. Do ./string0 lasu min zomi do ni povas vidu pli detale kio okazas. Eniri. Z-A-M-Y-L-A eniri. Kaj ni presas al Zamyla nomo. Do tio estas sufiĉe bona. Do nun ni iru antaŭen kaj kuri ĉi programo denove, kaj tajpu el Daven Kompleta nomo. Surprizo, surprizo. Eniri. Hmm. Ni ne presita Daven La plena antaŭnomo korekte. Nun tio devus esti evidentaj en Retrospektive pro kio, ia, stulta dezajno decido? Jes, mi malfacile kodita la ses interne de mia por buklo. Nun mi faris tion nur ĉar Mi sciis Zamyla nomon tuj estos ses literoj. Sed certe tio ne estas ĝeneralan solvon. Do rezultas ni povas dinamike elkompreni la longeco de kordo nomante funkcio nomita strlen. Denove, intence koncize nomata simple fari ĝin pli oportune tajpi. Sed tio sinonimo akirante la longeco de kordo. Mi tuj reiri en mian fina fenestro kaj re-ruli la tradukilo. Sed gxi kriante al mi. Implice deklarante biblioteko funkcio strlen kun tipo unsigned int const-- Mi perdis. Tute. Do, speciale kiel via okuloj komencas Glaze super kun erarmesaĝojn ŝatas ĉi, fokuso honeste sur la unuaj vortoj. Ni konas la problemo estas en linio 8, kiel indikite tie. Kaj ĝi estas en string-0.c. Implice deklarante biblioteko funkcio strlen. Do kiu estas ĝenerale tuj esti mastro de erarmesaĝoj. Implice deklari ion. Do mallonge, kion mi ŝajnis agis kun respekto al linio 8, tie. Kio povus esti la solvo estos eĉ Se vi neniam uzis strlen mem? Publiko: Parto de malsama biblioteko? DAVID J. Malan: Parto de malsama biblioteko. Do ĝi estas deklarita, por tiel diri. Ĝi estas menciita en iu dosiero escepte stdio.h kaj CS50.h. Sed kie estas difinis? Por esti honesta, vi devas aŭ simple koni ĉi sur la supro de via kapo, aŭ vi Guglas tion kaj eltrovi. Aux cxu tio, mi malfermis la CS50 Appliance la fina programo, kiu estas ĝuste la granda, plena ekrano versio de kio estas en la fundo de gedit fenestron. Kaj ĝi rezultas ke ne estas simile konciza komando, nomata viro por manlibro, kie se vi tajpas la nomo de funkcio kaj batis Enter, vi reiri sufiĉe arcane dokumentado. Estas nur tekston kiu ĝenerale aspektas iom io tiamaniere. Estas iom blindiga unuavide. Sed sincere mi tuj miaj okuloj Glaze super kaj nur enfokusigi fare Mi zorgas pri la momenton. Kiu estas tiu. Kiu aspektas strukture ŝatas io mi estas familiara kun. Efektive la viro paĝo, do paroli, mi diros al vi en kio kaplinion dosieron funkcio kiel strlen estas difinita. Do mi tuj reiri nun al gedit. Kaj mi tuj iros antaŭen kaj aldoni tien #include kaj savu la dosieron. Mi tuj liberigi la ekrano per Kontrolo L Se mi demandis. Kaj mi tuj re-kuri make string.0, kompilas tiu tempo. ./string.0 Zamyla. Tio ŝajnis funkcii Foririgu min antaŭeniris kaj rerun kun Davenport. Eniri. Kaj tion, ŝajnis funkcii. Do ni povas fari iom pli bona ol tio, kvankam, ni povas komenci ordigi aferojn supren malmulta. Kaj mi tuj reale enkonduki unu alia afero nun. Mi tuj iros antaŭen kaj savi tio en malsamaj dosiero. Kaj mi tuj vokos tiun dosieron string1.c simple esti kohera kun la kodo vi povos trovi en Interreto. Kaj ni enfokusigi en la ĝuste la saman kodon. Ĝi rezultas ke mi havas estis speco de preno por koncedis la fakto ke mia portebla komputilo, kaj siavice, la CS50 aparaton havas multan memoron, multaj RAM, multaj bajtoj de spaco en kiu mi povas stoki kordoj. Sed la realaĵo se mi tajpis longa sufiĉis, kaj sufiĉe pulsbatoj, Mi povis en teorio tipo en pli karakteroj ol mia komputilo fizike havas memoron por. Kaj tio estas problema. Multe kiel int povas nur kalkuli tiel alta, en teorio, Vi nur povas Cram tiom da karakteroj en via komputilo RAM aŭ Hazarda Aliro Memoro. Do mi estis pli bone anticipi tiu problemo, eĉ kvankam ĝi povus esti malofta angulo kazo, por tiel diri. Ne okazas ke ofte, povus okazi. Kaj se okazas, kaj mi ne anticipi kaj programo por tio, mia programo povus fari kiu scias kion. Frostigi, pendi, reboot ajn. Io anticipis povus okazi. Do kion mi faros nun, nun vere, estas antaux mi iam blinde uzi variablon kiel s ke estis atribuita la reveno valoro de iu alia funkcio kiel getstring, Mi iras al certigi ke ĝia valoro estas valida. Do mi konas nur el leginte CS50 la dokumentaron por getstring, kiun finfine ni atentigi vin je, ke getstring revenas speciala simbolo nomata NULL, N-U-L-L en ĉiuj Caps, se iu eliras malbone. Do kutime, redonas ĉenon. Sed alie se li revenas N-U-L-L-- ni fine vidos kion tio vere means-- ke nur per io malbona okazis. Nun ĉi signifas, multe kiel en Scratch, Mi povas kontroli kondiĉo tie en C, se s ne egala NULL. Do se vi ne vidis ĉi tion antaŭe, tio simple signifas ne egala. Do ĝi estas la malo de egala egaluloj, kiu, memoru, Estas malsama de sola egalas, kio estas farita. Do se s ne egala NULL, nur tiam fari Mi volas ekzekuti tiujn liniojn de kodo. Do alivorte, antaux Mi plonĝi en blinde kaj komencos ripetanta super s, kaj traktante ĝin kvazaŭ ĝi estas vico de karakteroj, mi tuj unue kontroli, atendi minuton, estas s definitive ne egalan al tiu speciala valoro NULL? Ĉar se ĝi estas, malbonaj aferoj povas okazi. Kaj nun, supozi ke malbonaj aferoj okazas signifas via programo kraŝoj, kaj vi ne povas nepre resaniĝos. Do sincere, ĝi aspektas pli malbelaj. ĝi estas ia konfuzante nun ekrigardi. Sed tio iĝos pli familiara antaŭ longe. Sed mi tuj proponos nun alia plibonigo. Tio estas plibonigo al korekto. Mia programo estas nun pli ĝentila, ĉar en la malofta kazo, ke ne sufiĉas la memoro Ekzistas Mi manipuli ĝin, kaj mi simple faras nenion. Mi almenaŭ ne frakasi. Sed ni faros definitivan version tie. Kaj nomita arkivo string2.c. Mi tuj almeti ke sama kodo por nur momente, kaj mi tuj elstaros ĉi linio 11, tie, por nur momento. Nun la realaĵo estas kiu smart tradukiloj kiel tin povus ripari tion por ni malantaŭ la scenoj sen nia iam scii. Sed pensu pri tiu fundamente kiel probleman dezajno. Ĉi tiu linio de kodo estas, kompreneble, dirante pravalorizi iu variablo i al 0. Tio estas sufiĉe simpla. Kaj kio denove estas ĉi deklaro, tie, i ++, farante? Ni jam vidis ĝin antaŭe, sed ni ne vere parolas pri ĝi. Publiko: pliigante i. DAVID J. Malan: pliigante i. Do sur ĉiu ripeto tra tiu ciklo, ĉiu ciklo, vi pliigante i per unu. Do ĝi ricevas pli kaj pli granda, kaj grandaj ĝis la buklo finas. Kiel ĝi finiĝi? Bone tie estas tio mezo kondiĉo kiun ni uzis antaŭe. Vi vidis kaj walkthroughs en la P aro. Sed kio estas tiu parolo? Ĉu la jenaj buklo tiel longa kiel i estas malpli ol kio? Aŭdienco: La longo de la kordo. DAVID J. Malan: La longo de la kordo. Do ĝi tradukas bela pure angla en tiu senco. Nun la problemo estas ke ĉiu tempo mi persisti tra tiu buklo teorie, Mi demandas ĉi demando. Ĉu mi malpli ol la kordo longo de s? Ĉu mi malpli ol la kordo longo de s? Nun mi ŝanĝas en ĉiu ripeto? Ĝi estas. Pro la ++. Do ĉiu ripeto i fariĝas pli granda. Sed estas s atingi pli granda, aŭ malgranda, aŭ ŝanĝi je ĉiuj? No. Do en terminoj de dezajno, unu el la aksoj laŭ kiuj ni provas taksi kodo en la klaso, tiu sentas specon de stultulo. Kiel vi estas laŭvorte, sur ĉiu ripeto de tiu buklo petante la sama malbenita demando denove, kaj denove, kaj denove, kaj laŭvorte ĝi neniam tuj ŝanĝos. Almenaŭ se mi ne tuŝante ejon kaj klopodi ŝanĝi la enhavon de s. Do mi povos fari iom pli bona ol tiu. Kaj kion mi tuj faros estas ne deklari nur unu variablo i, sed dua variablo Mi timige arbitre, sed konvencie, nomas gxin n. Asigni n egalas al la kordo longo de s. Kaj poste tien, mi tuj fari saĝa iom optimumigo, do paroli, ke ĉe la fino de la tago plu estas korekta aŭ ne malpli korekta ol antaŭe. Sed estas pli bona dezajno. En la fakto ke mi uzas malpli tempo, malpli CPU cikloj, tiel paroli, respondi la samajn demandon, sed nur unufoje. Demandojn sur tiu ĝenerala principo de plibonigante, diri, programo de eficiencia? Yeah? Publiko: Kial vi uzu la [inaudible]? DAVID J. Malan: Bona demando. Do kial ni metis la ++ je la fino de i anstataŭ la komenco de la i? En ĉi tiu kazo, ĝi havas neniu funkcia trafo. Kaj ĝenerale mi emas uzi la postfix operatoro tiel ke ĝi estas iom pli klara kiel por kiam la operacio okazas. Por kiuj ne konas, estas alia deklaroj per vi povus fari ++ i. Tiuj estas funkcie ekvivalenta en tiu kazo ĉar tie estas nenio alia ĉirkaŭ tiu incrementation. Sed vi povas veni supre kun kazoj kaj linioj de kodo en kiu tiu faras diferencon. Do ĝenerale, ni ne eĉ paroli pri ĉi tiu. Ĉar sincere, ĝi faras vian kodo sexier, kaj speco de slicker, kaj malpli gravuloj. Sed la realaĵo estas kiu estas multe pli malfacila, Mi kredas, eĉ por mi envolver mia menso ĉirkaŭ ĝi iam, la ordo de operacioj. Do kiel flanken, se vi vere ne ŝatas tion, kvankam tiu estas speco de sexy rigardante, vi ankaŭ povas fari i + = 1, kiu estas la pli malbelaj versio de la sama ideo por postfix incrementation. Mi diras tion, kaj vi devus moki lin, sed vi venos vidi kodo kiel ion belan antaŭ longe. [Ridado] DAVID J. Malan: Ĝuste? Yeah. Demando en la mezo. Publiko: Ĉu vi bezonas diri int n? DAVID J. Malan: Fasko Ne bezonas diri int n. Do ĉar ni jam diris int, Vi ne bezonas diri ĝin denove. La ruzo estas ke n devas esti la sama datumtipo kiel i. Do tio estas nur oportunajho tie. Yeah. Publiko: Ĉu vi transiros print karaktero s krampo i denove? DAVID J. Malan: Absolute. Do% c, rememoran de lasta tempo, estas nur lokokupilon. Ĝi signifas meti char tie. backslash n, kompreneble, nur per metis linerompo tie. Tiel ke nur lasas nun tiu peco de nova sintakso. Kaj tiu estas laŭvorte dirante grab la ŝnuro nomita s kaj iros trovi ĝian i'th karaktero, por tiel diri. Kaj mi konservos dirante i'th karaktero ĉar sur ĉiu ripeto de tiu buklo ĝi estas kvazaŭ ni presi el, unue s krampo 0, kiel programisto dirus. Tiam s krampo 1, tiam s krampo 2, tiam 3, tiam 4. Sed kompreneble estas ŝanĝiĝema, do mi simple esprimi ĝin per i. Ŝlosilo, kvankam, estas realigi, speciale se vi havas ne estis ambientando al tiu mondo de programado, kie ni ĉiuj ŝajnas al rakonti de nulo, Gotta komenci kalkulon nulo nun. Ĉar kordoj, unua karaktero, la z en Zamyla estas por bone aŭ por malbone tuj vivos al situo nombro nulo. Bone, do mi elirigos ni revenu al Zamyla kaj vidu kio vere tuj sur sub la kapuĉo. Do ekzistas tiu nocio de tipo casting. Vi povus havi reale ludis kun tiu jam, eble por la hacker eldono de P starigis unu. Sed tipo casting nur aludas al la kapablecon en C kaj iuj aliaj lingvoj konverti unu datumtipo al alia. Nun kiel eble vidas ĉi bela straightforwardly? Do tiu, revokon, estas la komenco de la angla alfabeto. Kaj la kunteksto, rememoras, de kiel antaŭ semajno estas ASCII. La American Standard Code Informo Interŝanĝo. Kio estas nur vere longa vojo diri surĵeto de leteroj al nombroj kaj de nombroj al literoj. Do A tra M tie dot dot dot, regiono kun, revokon, la dekuma numero 65 sur supren. Kaj ni ne parolas pri tiu eksplicite, sed certe ekzistas simila nombroj por minusklaj literoj. Kaj efektive, ekzistas. La mondo decidis iuj jaroj antaŭ ke iom pli, minuskla a, tuj estos 97. Kaj iom b tuj esti 98, ks. Kaj por neniu alia klavo via klavaro, ekzistas tuj estos simila ŝablono de bitoj. Aŭ ekvivalente, dekuma nombro. Do la demando en la mano, do, estas kiel oni povas reale vidi ĉi sube la kapuĉo? Do mi tuj transiru al gedit denove. Kaj anstataŭ tipo tiu unu el nenio, Mi tuj iros antaŭen kaj nur malfermi ion el hodiaŭa kodo nomita ASCII nulo. Askio nulo aspektas kiel ĉi. Do ni envolver niaj mensoj ĉirkaŭ ĉi. Do unue mi komentis la kodo, kiu estas bela. Ĉar ĝi estas laŭvorte diri al mi kion atendi, montri surĵeto por majuskloj literoj. Nun mi ne tute scias, kion mi signifas, do ni konkludi. En la angla, eble iom techie angla, kion faras linion 18 aperi esti farante por ni? Nur linio 18. Kio ĝi indukti? Kio fartas piedbati ekstere tie? Publiko: Ciklo. DAVID J. Malan: Ciklo. Kaj kiom da fojoj estas kiuj iras persisti? Publiko: [intermetante voĉoj] ses fojojn. DAVID J. Malan: Not ses fojojn. Publiko: 26 fojojn. DAVID J. Malan: 26 fojojn. Yeah, bedaŭras. 26 fojojn. Kial? Nu, tio estas iom bizara, sed Mi komencis rakontante de 65. Kio estas stranga, sed ne malbone. Ne malbone por diri. Kaj mi faras ke nur ĉar, pro tio ekzemple, Mi speco de anticipante ke ĉefurbo A 65. Nun tio ne estas la plej elegantaj maniero fari tion, al speco de malmola kodo esotera valoroj kiujn neniu estas iam atendis memori. Sed nuntempe, rimarki ke mi estas fari tion tra 65 plus 26. Ĉar ŝajne, mi eĉ ne volas fari la aritmetiko en mia kapo. Do mi lasos al la tradukilo faru. Sed tiam en ĉiu ciklo, ĉiu ripeto de la buklo, mi pliigante i. Do nun tio aspektas iom kamufla. Sed ni havas la baza konstruaĵo blokoj kun kiu komprenos ĉi. % C estas nur lokokupilon por char. % I estas lokokupilon por int. Kaj ĝi rezultas ke per uzado tiun nova sintakso, ĉi parenthetical, do paroli, do datumtipo ene krampoj, Mi povas devigi la tradukilo trakti i ne estas entjero, sed kiel signo. Modo montras min la karaktero ekvivalento de tiu nombro. Nun ĉi tie, ĉi kodo estas sufiĉe multa identaj. Mi nur volis fari super eksplicita la fakto ke mi startanta je 97, kiu estas minuskla a. On tra 26 pli literoj. Kaj mi doing-- denove, kusxiginte i, por tiel diri. Aŭ tipo casting i, por tiel diri. De int al char. Do la fina rezulto estas tuj estos, sincere, informojn ni jam scias. Mi tuj faros ascii-0 dot-- ne dot c. Avizo, vi probable faris ke eraron kiel mi ĵus faris akcidente. Faru ascii-0. Nun mi intencas fari ./ascii-0. Mi zomi, kaj bedaŭrinde ĝi tuj rulumi for la ekrano. Sed ni vidos tutan grafikaĵo kie oni mapoj 97, b mapojn al 98, kaj se ni rulumu supren plua A kompreneble mapas al 65. Do tio estas nur por diri ke kion ni estis predikante, estas tiu ekvivalentrilato, estas fakte la kazo en realo. Tiel rapida modifo de tiu. Lasu min malfermi ascii-1.c. Kaj rimarki ĉi saĝa, varo de, klarigo de tio. Jen ascii-1.c kaj rimarki ĉi freneza afero. Kaj tio vere alvenas al la koron kion komputiloj faras. Eĉ kvankam ni homoj farus ne rakontas koncerne letters-- Mi ne komencas pensi, ĉiuj dekstra tiam b, kaj uzi tiujn por rakonti fizikaj objektoj. Vi certe povas diri, ke mi volas pravalorizi iu variablo nomita c-- sed mi nomis ĉi anything-- tiel c inicializa al ĉefurbo A. Ĉar en fino de la tago, la komputilo Ne gravas kion vi provizo, nur zorgas kiel vi volas prezenti tiun informon. Kiel vi volas la komputilo interpreti ke ŝablono de bitoj? Do tio ne estas iu estus ĝenerale rekomendas fari. Estas vere nur ekzemplo por transdoni ke vi povas absolute pravalorizi entjero al char. Ĉar sub la kapuĉo de char, kompreneble, estas nur nombro de 0 al 255. Do vi povas certe metis gxin interne de int. Kaj kion tio ankaŭ pruvas estas kiu ni povas konverti el unu tajpi alian tie, finfine presi la samon. Kaj fakte, mi korektos online-- celis diri tion, denove, ĉi tie. Lasu min purigi ĉi supre interreto, kaj ni vidi en linio walkthrough drajvo, kion intencis tie. OK. Do lastan ekzemplon nun engaĝante al la b-aj kaj tiam ni preni aĵojn muesca. Do kun la b-aj kaj c estas en la capitalización kaj la ekvivalento gxiajn ni rigardu ĉi ekzemplo, ĉi tie. Alia kodo ekzemplo. Ni malfermu unu tio jam faris, do ni ne devas tajpi ĝin ĉiuj el nulo. Kaj rimarki anticipante ni uzas multnombraj kaplinion dosierojn, inter kiuj trovas nia nova amiko, string.h. Nun tio aspektas, je unua rigardo, iom kamufla. Sed ni vidu, se ni ne povas rezoni tra kio okazas tie. Unue mi ricevi ĉenon de la uzanto, kaj Mi metis tiun ĉenon en ŝanĝiĝema nomita s. Kopiu pasto de antaŭe. En linio 22, mi ŝajne fari precize kion Mi faris antaŭ momento, mi ripetanta super la karakteroj en s. Kaj la nova lertaĵoj tie abonas kordo longo, la plej malgranda optimumigo de stoki la kordo longo en n, anstataŭ voko strlen denove, kaj denove, kaj denove. Kaj ĝuste kontrolanta ke i estas malpli ol n. Nun tie, aĵoj iom interesa. Sed estas ĝuste apliko de tiu sama nova ideo. Kio en la angla faras s krampo i reprezentas? Publiko: Counting ĉiu karaktero [inaudible]. DAVID J. Malan: Counting ĉiu karaktero. Kaj eĉ pli koncize, s krampo i reprezentas kio? Ĉu vi diras. Ne meti vin sur la lokon tie. Publiko: Well-- DAVID J. Malan: Do se la vorto is-- se la kordo estas Zamyla, kiun starts-- Publiko: --you trakti la karakteroj separately-- DAVID J. Malan: Bone. Ĝuste. La kvadrata krampo skribmaniero permesas aliri ĉiu karaktero individue, tial s krampo 0 tuj estos la unua gravulo en la kordo. s krampo 1 tuj estos la dua, kaj tiel plu. Do la demando Mi petas, ĉi tie, en ĉi tiu kondiĉo estas kio? Ĉu la i'th karaktero de s granda ol aŭ egala al minuskla a? Kaj kion tio signifas, ĉi tie, kun la duobla ampersands? Publiko (KUNE): Kaj. DAVID J. Malan: Kaj. Estas nur ekvivalenta al tiu. Kaj ne estas ŝlosilvorto en C, oni devas uzo, annoyingly, signo-simbolo. Kaj tiu, male, estas demandi estas s La i'th karakteron malpli ol aŭ egala al minuskle z? Kaj cetere, jen kie kompreni la suba efektivigo de komputilo faras sencon. Rimarku ke, eĉ se mi la skalara dot dot tie, aspektas kiel tra z en minuskla estas ĉiuj apudaj valorojn el 97 sur supren. Kaj sama por majuskloj komencante ĉe 65. Do la takeaway do estas, ke en la angla, kiel vi priskribus kion linio 24 estas faranta? Yeah? Publiko: On 24 ĝi estas kontrolanta vidi ĉu ĉiu karaktero estas minuskla. DAVID J. Malan: Ĝi estas kontrolanta ĉu ĉiu karaktero estas minuskla litero. Do eĉ pli koncize, estas la i'th karaktero de s minuskle? Tio estas ĉio ni esprimanta tie logike, iom enigme, sed finfine bela straightforwardly. Ĉu s-oj i'th karaktero minuskle? Se tiel, kaj ĉi tie estas kie aferoj preni iom menso fleksante por nur momenton, se tiel, iru antaŭeniris kaj presi karaktero. Do tio estas nur lokokupilon, sed kion karakteron? Kial mi faras s krampo i minus tiun esprimon ĉi tie? Nu rimarkos la mastro tie. La realaj nombroj ne gravas tiom. Sed rimarki ke 97 estas kiom malproksime de la 65? Publiko: 32. DAVID J. Malan: 32. Kiom for estas 98 el 66? Publiko: 32. DAVID J. Malan: Eta c de granda C? 32. Do tie estas 32 lupolon el unu leteron al alia. Do sincere mi povis simpligi ĉi tiu. Sed tiam mi specon de malmolaj kodigo tiu malalta nivelo kompreno ke neniu leganto estas iam tuj komprenos. Do mi tuj ĝeneraligi ĝin kiel mi konas la minusklaj literoj estas pli grandaj. Mi konas la majuskloj estas malgrandaj valoroj, ironie. Sed tio estas efike ekvivalenta al dirante subtrahi 32 de s krampo i. Do en la kunteksto de tiuj literoj, se la letero okazas esti, minuskle a, kaj mi subtrahi 32, kion efekto tio ke havi, matematike, en minuskla a? Publiko: Capitalizes-- DAVID J. Malan: Capitalizes ĝin. Kaj efektive, ĉi tio nia programo nomiĝas capitalizar nulo. Tiu programo aŭ capitalizes leteron, post kontroli se ĝi estas ja minuskla litero. Alie, en linio 30, kion mi faru, se ĝi ne estas minuskla litero kiu mi rigardante je aparta ripeto en la buklo. Nur presi ĝin ekstere. Do ne ŝanĝos stuff tio estas eĉ minuskle. Limigi vin al malabunda tra iom z. Nun tiu estas sufiĉe arcane. Sed ĉe la fino de la tago, tiu estas kiel ni, iam, devis efektivigi tion. Se mi anstataŭe malfermita capitalizar unu, ho dankas dion. Ekzistas funkcio vokis supra kiu povas fari ĉion ni ĵus faris je sufiĉe malalta nivelo. Nun al supra estas interesa ĉar ĝi estas deklarita en dosiero, kaj vi nur scias tion kontrolante la dokumentado, aŭ kalkulitan diru, en klaso, kie ekzistas, en dosiero nomita ctype.h. Do ĉi tio estas alia nova amiko de nia. Kaj supra faras ĝuste kio lia nomo sugestas. Vi povas pasi en, kiel argumento, inter tiuj krampoj, iuj karaktero. Mi tuj pasos en la i'th karaktero de s uzante nia imago novan skribmaniero engaĝante kvadrataj krampoj. Kaj prenu diveno, kia estas la reveno valoro de upper ŝajne tuj esti? Al majusklo. Al majusklo. Do se mi pasas en minuskla a, espereble, per difino de upper, ĝi tuj revenos kun majuskloj A. Alie se ĝi ne estas minuskla litero en Unue, mi simple presas ĝin. Kaj efektive, rimarki la dua amikon tie. Ne nur al supra ekzistas, sed estas malaltaj, kiuj efektive respondas tiun demandon por mi. Nun kiu ajn skribis tion, 10s de jaroj, vi scias kion? Implementado por supra kaj estas malsupreniri uzante kodo kiel ĉi. Sed denove, kohera kun ĉi tiu ideo de abstracting for, ia, malsupra nivelo efektivigo detaloj. Kaj starante sur la ŝultrojn de homoj kiuj venis antaŭ ni, uzante funkcioj kiel al supra kaj malsupra, kio Mirinde estas sufiĉe bele nomata diri kion ili faras, estas mirinda paradigmo adopti. Nun, ĝi rezultas ke se mi legas la viro paĝo por, diru al supra, Mi lernas ion alian. Tiel homo toUpper. Estas iom abrumadora. Sed rimarki, jen tiu mencio la kaplinio dosieron kiun mi devus uzi. Kiel flanken, ĉar tiu estas iluzia, la funkcio Uzas ints anstataŭ signoj por kialoj de eraro kontrolanta. Sed ni eble venu reen al kiuj en la estonteco. Sed rimarki, tie, al supra konvertitoj la literon c al majuskla se eblas. Do tio estas bela simpla. Kaj nun ni estu iom pli specifa. Ni rigardu la parto de la viro paĝo sub reveno valoro. La valoro revenis estas ke de la konvertita leteron. Aŭ c, se la konvertiĝo Ne eblas, kie c estas la origina enigo. Kiun mi konas de ĉi tie, de la argumento al supra. Do kio estas la takeaway de tio? La valoro revenis estas ke de la konvertita letero aŭ c, la originala letero, se la konvertiĝo ne estis ebla. Kio pliboniĝo povas mi do fari al mia kodo dezajno? Yeah? Publiko: Vi povas forigi la alian. DAVID J. Malan: Mi povas forigi la alia aserto, kaj ne nur la alia aserto. Publiko: Vi povas forigi [inaudible]. DAVID J. Malan: Mi povas forigi la tutan forko en la vojo, la se alia tute. Do ja, lasu min malfermi la fina versio de tiu, capitalizar-2 kaj rimarki kiom, se vi, sexy, la kodo estas nun ricevas, en kiun mi reduktis de iuj sep aŭ tiel liniojn al nur kvar, la funcionalidad kiu mi intencis simple vokas supran pasante en s krampo i kaj presi ekstere, kun la lokokupilon% c: ke aparta karaktero. Nun disputeble, tie estas cimo, aŭ almenaŭ la riskon de cimo, en tiu programo. Do simple veni reen al antaŭa takeaway, kion mi probable ankaŭ fari en tiun programon por fari ĝin pli fortika, tiel ke ekzistas neniu maniero povas frakasi, eĉ en maloftaj kazoj? Publiko: Certiĝu ne estas NULL. DAVID J. Malan: Certiĝu ne estas NULL. Do vere, por fari ĉi tiu super taŭga, mi devus fari ion kiel, se s estas ne nula, tiam antaŭeniri kaj ekzekuti tiuj linioj de kodo, kiuj Mi povas do indent tiel, kaj tiam metis en mia proksima krampoj. Do bone ligante proksime de la du ideoj. Yeah? Publiko: Ĉu vi uzas oni faros dum buklo, anstataŭe? DAVID J. Malan: Could Mi faros do dum buklo? Publiko: --you volas certigi ke vi efektive [inaudible]. DAVID J. Malan: Could vi uzu do dum? Mallonga respondo: ne. Ĉar vi estas estonta enkonduki alian angulon kazo. Se la ligilo estas de nulo longa. Se ekzemple, mi ĵus batis Enter, sen iam tajpante Zamyla. Mi tuj transdonos vin reala kordoj, kiel ni fine vidos, kiu havas nulon karakteroj. Ankoraŭ cxeno, estas nur super mallonga. Sed se vi uzas la do momenton, vi tuj blinde provu fari ion kun respekti tiun ĉenon, kaj nenio tuj estos tie. Publiko: Nu, se vi faris fari [inaudible] dum s-- DAVID J. Malan: Ho mi vidas, gardu prenanta kordo de la uzanto. Tiel mallonga respondo, vi povis kaj observos tedante ilin doni al vi ĉenon tio mallonga sufiĉas por havi en la memoro. Absolute. Mi simple elektis ne. Se ili ne donos al mi la ŝnuron mi volas, mi lasi, mi rezignas. Sed tute ne, por tiu celo, Vi povus absolute fari tion. Do la biblioteko kaplinion dosieroj ni nun familiara kun estas, ĉi tie. Norma I / O, CS50.h, string.h, ctype.h, kaj ekzistas ja aliaj. Iuj el vi jam eltrovis la math biblioteko en math.h. Sed lasu min prezenti vin nun al tiu rimedo ke CS50 bastonon Davin, kaj Rob kaj Gabe aparta kunmetis. Tio baldaŭ ligas sur la kurso de afiŝinto. Ĝi nomiĝas CS50 referenco. Kio ĝuste doni al vi rapidan gusto, verkoj jene. Lasu min iri al reference.cs50.net. Vi vidos maldekstre anko abrumadora listo de funkcioj kiuj venas kun c. Sed se mi zorgas, por la momento, pri iu kiel strlen, Mi povas tajpi ĝin tie. Filtras suben la elenco justaj kio interesas min. Mi iras klaki ĝin. Kaj nun en la maldekstra, vi vidos kion ni esperas estas pli simpla, homa amika ekspliko de kiel tiu funkcio laboras. Liveras la longo de kordo. Jen sinopsis, jen kiel vi uzi ĝin en terminoj de la kaplinio dosieron, kaj en terminoj de kio la funkcio aspektas kiel en terminoj de liaj argumentoj. Kaj tiam tie, revenas la longeco de kordo. Sed por tiuj el vi pli komforte, Vi povas fakte klaku pli comfy, kaj la enhavon de ĉi tiu paĝo nun ŝanĝos esti la defaŭlta valoroj de kio vi akiras uzante la viro paĝo. En aliaj vortoj, CS50 referenco estas plisimpligo de homo paĝoj de la bastono, por studentoj. Aparte, tiuj malpli komforta kaj en inter, por ke vi ne devas provi ĉirkaŭfermi via menso ĉirkaŭe, sincere, iuj sufiĉe kamufla sintakso kaj dokumentado iam. Observu do, ke en menso en la tempo estonta. Do jen, denove, estas Zamyla. Ni nun demandas tio iom pli homa atingebla. Danke al Chang, kiu jam pasis presi pli elefantoj Nonstop dum la pasintaj kelkaj tagoj. Ni havas ŝancon doni almenaŭ unu el ili foriris. Se ni povus akiri nur unu volontulon veni supren desegni sur la ekrano. Kiom proksimume tie? Venu supren. Kio estas via nomo? ALEX: Alex. DAVID J. Malan: Alex. Bone. Alex, venu supren. Ni volis vidi vian skribo sur la ekrano tie. Bone, agrable renkonti vin. ALEX: Nice vi renkontos vin. DAVID J. Malan: Bone. Do, súper simpla ekzerco. Trinkejo estas altaj por preni elefanton hodiaŭ. Vi ludas la rolon de getstring. Kaj mi tuj diru al vi la ŝnuro ke vi alvenas. Kaj supozu ke vi, getstring, estis nomata. Kaj la homo, kiel mi, havas tajpita en Zamyla, Z-A-M-Y-L-A. Nur bonvolu skribi Zamyla sur la ekrano kvazaŭ vi metis ŝin kaj stokita gxin ie en la memoro. Lasante spacon por kio estos pluraj aliaj words-- tio OK, observu tuj. [Ridado] Do Zamyla, Bonega. Do nun supozas ke vi, getstring, nomiĝas denove. Kaj do, mi proponas al vi, en la klavaro, kun alia nomo, Belinda. Bone. Kaj nun la sekva fojo getstring estas vokita, mi tajpas ion kiel Gabe, G-A-B-E. Vi vere preni al koro hazarda aliro memoro. Kiun desegnas ĉiun tute hazarde. OK. [Ridado] ALEX: Pardonu mian manskribo estas malbona. DAVID J. Malan: Ne, tio estas okej. Kaj kio pri Rob, R-O-B. OK. Bonan. Do mi ne anticipis vi ia kuŝis aferojn tiamaniere. Sed ni povas fari tiun laboron. Do kiel vi iri pri sidiĝante el tiuj signoj en memoro? Alivorte, se ni pensas ĉi rektangula nigra ekrano kiel reprezentante komputilo RAM, aŭ memoro. Kaj memoru ke RAM estas nur tutan faskon da bajtoj, kaj bajtoj estas tuta fasko da bitoj. Kaj bitoj estas iel implementado, ĝenerale kun iu formo de elektro en aparataro. Do tio estas speco de la layering ni parolis kaj povas nun akceptas. Kiel vi irad decidi kie skribi Rob kontre Gabe kontre Belinda kontre Zamyla? ALEX: Mi nur faris en la ordigi ke vi sciigis min. DAVID J. Malan: Kaj kiu estas vera. Sed kion regita kie vi metis Belinda nomo kaj Gabe nomo? ALEX: Nenio? DAVID J. Malan: [rie] Por ke funkciu, estas bone. Do komputiloj estas iom pli bonorda ol tio. Kaj kiam ni implement-- restu tie cxar nur moment-- kiam ni efektive implementar iu kiel getstring en komputilon, Zamyla povus esti elspezata preskaux kiel vi faris en la ekrano, tie. Kaj kio estas ŝlosila rimarki tie, kio Alex faris, Estas tie estas speco de demarcación inter ĉiu de tiuj vortoj, ĉu ne? Vi ne skribis Z-A-M-Y-L-A-B-E-L-Mi-No-D-A-G-A-B-- en aliaj vortoj, ekzistas ia de demarcación kiu ŝajnas esti, ia, hazarda Interspacigo inter tiuj diversaj vortoj. Sed tio estas bona, ĉar Ni homoj povas nun visualizar ke tiuj estas kvar malsamaj ĉenoj. Ĝi estas ne nur unu vico de multaj gravuloj. Do komputilo, do, dume, povus preni kiel cxeno Zamyla, metis ĉiun de tiuj literoj ene de bajto da memoro. Sed tiu nombro estas multe pli granda, kompreneble, ol ses karakteroj. Ekzistas tuta fasko da RAM. Kaj tiel plu, tiu krado de skatoloj tuj reprezenti kion Alex simple faris tie sur la ekrano. Kaj nun, Alex, ni povas proponi al vi blua aŭ oranĝkolora elefanto de Chang. ALEX: Mi prenos blua elefanto. DAVID J. Malan: blua elefanto. Tiel granda ĉirkaŭvojo de aplaŭdoj, se ni povus, por Alex ĉi tie. [Aplaŭdo] ALEX: Dankon. DAVID J. Malan: Dankon. Do la takeaway estas ke, kvankam la ŝablono ia ŝanĝis super tempo, tie sur la tabulo, estis tiu demarcación inter la diversaj ĉenoj ke Alex havas por ni. Nun komputiloj, sincere, povus fari la samon. Ili povus speco de Plop kordoj ajn en RAM. Ĝis tie, ĉi tie, malsupren tie, ĉi tie. Ili povis fari ĝuste tion. Sed, kompreneble, tiu estas probable ne la plej bona planado. Ĝuste? Se mi observas demandante Alex akiri nomojn, probable li estos plej metis iom pli malsupren tie, eble supren ĉi tie, ĉi tie, ĉi tie, eventuale tien. Sed kun iom pli planado, certe, Ni povus meti aferojn pli pure. Kaj efektive, jen kion komputilo faras. Sed la ruzo estas ke se la sekvanta ŝnuro Mi alvenas post Zamyla estas io kiel Belinda, proponas kie ni povus skribi la letero b kun respekto al tiu krado? Kien vi iris? Dekstre de la a, sub la z, sub la a? Kio estus via unua instinktoj esti? Publiko: Sub la z. DAVID J. Malan: Do sub la z. Kaj tio estas bela simpla, ĉu ne? Estas speco de neat, estas kion ni faras sur klavaro kiam ni batis Enter, aŭ retpoŝton kiam farante bula listo de aĵoj. Sed la realo estas ke komputiloj provu esti pli efikaj, kaj Cram certe tiel datumojn en RAM ebla, por ke vi ne perdas neniun bajtoj. Por ke vi ne malŝpari ajna ekrano nemoveblaĵoj. Kaj la problemo, tamen, estas ke se ni laŭvorte metis la leteron b post, kiel ni tuj scias kie Zamyla nomo finiĝas kaj Belinda nomo komencas? Do vi homoj simple proponis, nu, batis la Eniga klavo, esence. Metu ĝin sube. Aŭ eĉ kiel Alex faris, ĝuste komenci skribon la sekvanta nomo sub la antaŭa, kaj sub tiu, kaj tiam sub tiu. Tio vida cue. Komputiloj havas alian vida cue, sed ĝi estas iom pli konciza. Estas ĉi funky karaktero. Backslash 0, kiu estas eble memoras backslash n, ks, nun. La speciala eskapo sekvencoj. Backslash 0 estas la vojo de reprezentas ok nulo bitoj en vico. 0000 0000. La vojo vi esprimas, ke ne estas batis la nombro nulo sur via klavaro, ĉar fakte tiu estas ASCII character. Ĝi aspektas kiel numero, sed fakte dekuma nombro kiu reprezentas la cirkulero Signo, La cirkla tipografía. Dume, backslash nulo signifas, laŭvorte metis ok nulo bitokoj tie por mi. Do ĉi tiu estas iom arbitra. Ni povis jam uzis neniun mastron de bitoj, sed la mondo decidis iuj jaroj Antaŭ ke reprezenti la finon de ŝnuro en la memoro, nur meti tutan faskon da nuloj. Ĉar ni povas detekti ke. Nun tio signifas ke neniu litero de la alfabeto povas esti reprezentitaj per nuloj. Sed tio OK, ni jam vidis ke ni uzas 65 supren en 97 sur supren. Ni ne ricevis ie fermi ĉiujn nuloj. Do Belinda en komputila memoro Efektive tuj iros tien. Mi desegnis ŝin en flava simple desegni nian atenton al ĝi. Kaj avizo ankaŭ ĉi estas tute arbitra. Mi desegnis ŝin kiel krado. Kiel, RAM estas nur iuj fizika objekto. Ĝi ne nepre havas vicoj kaj kolumnoj, po se. Ĝi nur havas ĉiu aro de bajtoj implementado en aparataro iel. Sed se post Belinda mi tajpita en Gabe nomo, Li tuj finos tie en memoro, kaj se mi tajpas en Daven nomo, Ekzemple, li tuj finos tie. Kaj mi povas daŭre skribi eĉ pli nomojn. Bedaŭrinde, se mi provos skribi super longa nomo Mi povus eventuale kuri el memoro. Tiaokaze, getstring estas tuj revenos NULL, kiel ni diris. Sed dankeme, almenaŭ en ĉi tiu vida tie, ni ne ricevis tute tiel for. Nun kio estas agrabla estas tiu ĉi ĝenerala ideo de trakti aferojn kiel estante en skatoloj estas reprezentanto de esprimilo de C kaj multajn lingvojn, konata kiel tabelo. Tabelo estas alia tipo de datumoj. Estas datumstrukturo, se vi volas. Strukturo en la senco de vero, ia, aspektante kiel skatolo, almenaŭ en via menso. Tabelo estas lindan vico de identaj datumtipoj, malantaŭo al malantaŭo al malantaŭo al malantaŭo. Do ŝnuro, en aliaj vortoj estas tabelo de signoj. Tabelo de signoj. Sed rezultu vi povas havi arrays de aroj da aĵoj. Fakte, ni povas meti eĉ nombroj en tabelo. Do la formo en kiu Ni tuj komencu deklarante ĉi datumoj strukturo konata kiel tabelo ankaŭ tuj uzos kvadrataj krampoj. Sed tiuj rektaj krampoj tuj havas malsamajn signifojn en tiu kunteksto. Kaj ni vidos kiel sekvas. Supozu ke mi malfermis novan dosieron tie. Kaj mi savos tiun kiel ages.c. Kaj mi ŝparos ĉi en mia dosierujo tie. Nun mi tuj iros antaŭen kaj ektajpu ion kiel inkluzivi CS50.h, inkluzivi stdio.h, int ĉefa malplenon. Kaj tiam ene de tie, mi volas unue havi int nomita aĝo. Kaj mi tuj uzos tiun por ricevi int de la uzanto por lia aŭ ŝia aĝo. Sed tiu programo estas intencita esti uzita per multnombraj homoj, por kiaj kuntekston. Mi havas linion de homoj. Ĉiuj ili devas tajpi en sian aĝo por eble iuj, mi ne scias, konkurenco, aŭ okazaĵo ke mi alvenis. Do la sekvanta persono, mi bezonas alian variablo. Ĉar se mi nur faru aĝo ricevas getInt, tio tuj clobber, aŭ anstataŭigi la antaŭa persono aĝo. Do tio ne estas bona. Do mia unua instinkto povus esti, ho, bone, se mi volas ricevi multnombraj homoj ages-- ni nomas tiun age1, int age2 ricevas int, int age3 ricevas getInt. Kaj nun mi tuj uzos iuj _pseudocode_ kodo tie. Ĉu io kun tiuj nombroj. Ni lasos por alia tago kion ni faras tie, ĉar ni nur prizorgi la momento pri age1, age2, age3. Bedaŭrinde, kiam mi kompili tiun programon kaj metis gxin antaux reala uzantoj kio estas la fundamente malriĉa dezajno decido ŝajnas esti farita? Yeah? Publiko: [inaudible] DAVID J. Malan: Jes, Mi eĉ ne provis elkompreni kiel multaj aĝoj mi vere zorgas pri? Se mi havas malpli ol tri homoj ĉi tie, kaj do malpli ol tri aĝoj, Mi ankoraŭ blinde atendante tri. Dio malpermesu kvar personoj aperas. Mia programo simple eĉ ne apogas ilin. Kaj tiu, longa rakonto mallonga, ne estas bona kutimo. Ĝuste? Mi estis esence kopiado kaj alglui kodo kaj nur tweaking la variablo nomoj. Kaj mia dio, se vi havis, ne tri aĝoj, sed 10 aux 100 aux ecx 6500 studentoj, ekz. Ĉi tio ne tuj estos aparte elegantan kodon, aŭ daŭrigebla. Vi tuj devas reverki la programon ĉiufoje Via nombro de homoj ŝanĝoj. Do dankeme, en nia reala ages.c dosiero por hodiaŭ, ni havos pli saĝa solvo. Unue, Mi iras por pruntepreni konstrui ni uzis kelkajn fojojn, tio faros dum buklo, por atingi la nombro de homoj en la ĉambro. Mi simple tuj Pester la uzanto, denove kaj ree, ĝis li aŭ ŝi donas al mi valoro de n, kiu estas pozitiva entjero. Mi povus esti uzita, lasta tempo de akiri pozitivajn int. Sed ni ne havas tiun por vera, do mi iris antaŭen kaj re implementado ĉi ideo. Nun ĉi tie, ĉi tiu estas la nova lertaĵo. En linio 27, kiel la komentojn en linio 26 sugestas, deklari tabelo en kiu stoki ĉies aĝo. Do se vi volas, ne unu int, ne du ints, sed tutan faskon da ints. Specife n entjeroj estis n multobligita tri, eble 100, eble 1000. La sintakso, tutsimple, estas diru, kio datumtipo vi volas? Kion vi volas nomi ke eron de memoro? Kion vi volas nomi la krado kiuj aspektas kiel tiu pictóricamente? Kaj en krampoj tie, vi diras kiom granda vi volas la tabelo esti. Kaj antaŭe, kiam mi diris la sintakso estas iom malsama ĉi tie, ni ankoraŭ uzas kvadrataj krampoj, sed kiam mi deklarante tabelo, la nombro ene de la rektaj krampoj rimedoj kiom granda vi volas la tabelo esti. Kontraŭe, kiam oni uzis s krampo i antaŭ momento, s, ŝnuro, Estas ja tabelo de signoj, sed kiam vi ne deklari variablon, kiel kun ĉi ŝlosilvorto tie, vi simple ricevas specifa indico, specifa ero el tiu tabelo. Iam ni scias, ke la cetera de tio estas simpla. Se novaj Mi unue tuj presi kio estas la aĝo de persono nombro mi. Kie mi nur diros persono numero unu, persono numeron du, persono numero tri. Kaj mi simple faranta aritmetiko, tiel ke kiel normala homo, ni kalkulo por tiu programo, kaj ne de nulo. Tiam mi nomas getint, sed mi stoki la respondo en aĝoj heligas i. Kiu estas la i'th aĝo en la tabelo. Do dum la lasta tempo ni trakti tiuj skatoloj kiel signoj por Zamyla nomo, kaj aliaj. Nun, tiuj skatoloj reprezenti 32 bitoj, aŭ kvar bitokoj en kiu ni povas stoki kiel int, kiel int, kiel int. Ĉiuj kiuj, denove, Estas la sama datumtipo. Nun mi faras ion stultan, kiel tempo pasas, nur pravigi skribi ĉi programo. Kaj poste malsupren tie, mi denove persisti super la tabelo jene jaron ekde nun, persono numero unu volo io jaroj. Kaj elkompreni ke math-- Mi volas diri, tiu ne estas tre komplika arithmetic-- Mi nur aldonas al ilia aĝo. Nur por pruvi, denove, ĉi. Tiel kiel mi, facile indekson en ŝnuro, s, do mi povas indekson en tabelo de aĝoj, kiel kiu ekzistas. Do kie estas tiu tuj estos prenante nin? Do ni vidas, en definitiva, kelkon en la tempo venonta. Unu, ĉiu ĉi tiu tempo, kiam skribi viajn proprajn programojn, kiel Mario, avida, kredito. Vi estis tajpi la nomon de la programo kaj koliziante Entajpu. Kaj poste atingante la uzanto enigo. Kun getString, getInt, getLongLong, aŭ simile. Sed rezultu ke C apogoj iu nomita komandlinio argumentoj, kiuj tuj ni reale preni je vortoj kiujn vi tajpas, ĉe la palpebrumantaj prompto, post via programo nomo. Do, en la tempo estonta vi povus tajpi iun kiel Cezaro, aŭ ./caesar numero 13, poste. Ni vidos kiel tio funkcias. Ĉar efektive, en problemo starigis du, ni prezentos vin al etaĵon rememorado de Ralphie La defii fruaj de cartografía. La arto de grimpadi informo. Tio, fakte, estas tre memoras kion Ralphie faris. Ĉi tio estas ekzemplo de ĉifrado algoritmon vokis ROT13, R-O-T 13. Kiu simple signifas turni la literoj en la alfabeto 13 lokoj. Kaj se vi faros tion, vi vidos nun kio estas, eble, familiara frazo. Sed la vojo ni tuj uzos tiu, finfine, estas pli ĝenerale. En P starigis du, en la eldono normo, vi implementar paro de ĉifroj, nomata cezaro, oni nomas Vigenère. Ambaux estas turna ĉifroj, ke iel vi turni unu litero en malsaman literon. Kaj Cezaro estas súper simpla. Vi aldoni unu, oni aldonas 13 aŭ iun numeron ĝis 26. Vigenère faras ke sur oni po literon bazo. Do Vigenère, kiel vi vidos en la spec, estas pli sekura. Sed ĉe la fino de la tago kion vi estos implementar kaj P starigis du, estas tiu klavo kiu vi uzas ambaŭ por ĉifrado kaj malĉifro. Aludante al la procezo de igi plata teksto, iuj originalan mesaĝon, en Cypher teksto, kiu Estas io ĉifrita. Kaj tiam decrypting denove. En la hacker eldono, dume, vi estos tasked kun io simila spirite, kie ni donos al vi dosiero, de tipa Linukso aŭ Mac, aŭ Unikso komputilo nomita etsy pasvorto, kiu enhavas tutaj faskon da uzantnomojn kaj pasvortojn. Kaj tiuj pasvortoj havi ĉiuj estis ĉifrita aŭ hashed, tiel diri, pli ĝuste kiel vi vidos en la spec. Kaj la hacker eldono defios vi per zorgado enigaĵoj ŝatas ĉi, kaj krakas la pasvorton. Tio estas, elŝeligi kion la homa pasvorton efektive estis. Ĉar ja pasvortoj ĝenerale ne stokas en la klara, kaj ĝenerale pasvortoj devus esti malfacile diveni. Tio ne estas ofte la kazo. Kaj kion mi pensis ke ni faras estas konkludi kun paro minutoj ekrigardi aparte malriĉa elekto de pasvortoj de filmo vi povus memori kovradis. Kaj se ne, vi devus lui. [VIDEO Playback] -Helmet, Vi Fiend, kio okazas? Kion vi faras por mia filino? -Permit Min enkonduki la brila juna mola kirurgo, Doktoro Phillip Schlotkin. La plej granda nazo laboron viro en la tutan universon kaj Beverly Hills. -Your Moŝto. -Nose Laboron? Mi ne komprenas. Ŝi jam havis nazon laboron. Ĝi estis ŝia dolĉa 16 ĉeestis. -No, Tio ne estas kion vi pensas. Ĝi estas multe, multe pli malbone. Se vi ne donas al mi la kombino al la aero ŝildo, kuraciston Schlotkin donos vian filino apogi sian malnovan nazo. - [GASPS] Nooooooooooooo. Kie vi akiris tion? -All Pravas. Mi rakontos, mi diros. -No, Paĉjo, ne. Vi ne devas. -You're Dekstra kara. Vi mankos via nova nazo. Sed mi ne diros al ili la kombinaĵo negrave kio. -Very Bone. Doktoro Schlotkin, fari vian plej malbonan. -My Plezuro. -No! Atendu, atendu. Mi rakontos. Mi rakontos. -Mi Sciis laborus. Bone, donu ĝin al mi. -la Kombino estas unu. -One. -One. -Two. -Two. -Two. -Three. -Three. -Three. -Four. -Four. -Four. -Five. -Five. -Five. -So La kombino estas unu, du, tri, kvar, kvin. Tio estas la stupidest kombinaĵo Mi iam aŭdis en mia vivo. Tio estas la speco de aĵo estas idioto havus sur lian pakaĵon. -Thank Vin, vian majesteco. [Fora klakoj] -Kio Vi faris? -Mi Elŝaltis la muro. -No, Vi ne faris, vi elŝaltis la tuta filmo. -Mi Must've premis malĝustan butonon. -Well, Remetis ĝin sur! Metu la filmon denove sur! Jes, sinjoro! Jes, sinjoro. -Let Iru, Arnold. Venu, Gretchen. Kompreneble vi scias Mi timige devas fakturojn vi pro tio. -Well? Ĉu ĝi funkcias? Kie estas la reĝo? -ĝi Laboris, sinjoro, ni havi la ĉifron. -Great. Nun ni povas preni ĉiun lastan spiron da freŝa aero de planedo Druidia. Kio estas la kombino? -One, Du, tri, kvar, kvin. -One, Du, tri, kvar, kvin? -Jes. -Tio Nekredebla. Mi havas la saman kombinaĵo sur mia pakaĵo. Pretigu Spaceball 1 por tuja foriro. Jes, sinjoro. -Kaj Ŝanĝi kombinaĵo sur mia pakaĵo. [Pordon fermo SOUND] [Clink de pordoj batante kasko] -Ahh. [FINO VIDEO Playback] DAVID J. Malan: Estas tio por CS50, ni vidos vin proksima semajno. Rakontanto: Kaj nun, Deep Pensoj per Daven Farnham. DAVEN Farnham: Kodigo en C estas tiel malfacila ol Scratch. printf, Scratch estis mensogo. [Ridado SOUNDBITE]