[Powered by Google Translate] [Teden 3] [David J. Malan - Harvard University] [To je CS50. - CS50.TV] Naj nas usmerja v smer, kjer smo končali zadnji čas, ki je začel razmišljati malo več kot o sintaksi in poskušam razmišljati nekoliko manj pa vse minucije da traja nekaj časa, da se prilagodi na doslej v smislu podpičji in oklepaje in zavite oklepaje, začeti jemati stvari malo na višjo konceptualni ravni tako, da so težave sedaj začenjajo problemov v naslednjih nekaj tednih se bodo nanašale na precej višji ravni v več konceptualnih problemov in nekoliko manj v skladenjski, ko se vaše noge mokre in umazane roke z nekaj sintakse od teh zadnjih nekaj tednih. Tako opozarjajo, da je prejšnji teden smo uvedli ta pojem matrike. In lahko matrika v angleščini opisujejo kot kaj? >> [Neslišno študentski odziv] Prosim? Zbirka? >> [Neslišno študentski odziv] >> Dobro, dobro. Zbirka predmetov. Tako smo videli nize v Scratch. Če se je zgodilo uporabiti za pset 0 1 seznamov na praske, da lahko povlečete stvari kot so pomaranče in banan, popis vrst, To je nekako tako kot tisto, kar je matrika. In potem bolj tehnično, v okviru dejanskega računalnika, matrika je preprosto sosednje kos pomnilnika. Z drugimi besedami, imate bajt, nato pa še bajt, nato pa še bajt, nato pa še bajt, in če ste bili, da pripravi te bajte v sliki da bi se vrnil v back to back to back. To je tisto, kar mislimo s stikata. Tako je bajt številka 1, nato 2, nato 3. To ne pomeni, da se tukaj, tukaj, tukaj, tukaj. Matrika je stikata kos 0 ali več bajtov. Torej, kaj so sploh uporabna? Recall smo imeli to vrsto izmišljene primer shranjevanje ljudi kviz razredih v programu , za izračun povprečja kviz za nekatere seveda, in opozarjajo, da bi lahko začeli pisati, da je program, ki ga razglasi spremenljivo quiz1. Potem bi lahko še eno spremenljivko, imenovano quiz2. Ampak potem, če bi bilo 3 kvizi v tem razredu, quiz4. Ali pa, če je bil tedenski kviz, bi bilo quiz5, quiz6, quiz7. Zato bi morali vse te spremenljivke prijavljeni znotraj glavnega ali kje drugje v programu, in težave s tem pristopom, čeprav je preprosta, da samo kopiraj in prilepi, je to le zelo hitro postane počasna. Bog ne daj, da dejansko imajo 30 ali 50 kvizi kvizov. Če je kot visoki šoli slogu pop kviz dan, potem samo še smešno dolg seznam spremenljivk, ki so prijavljene, in to samo zelo hitro uide iz nadzora. Grdo je, da je težko trditi, da je tako veliko lažje, da bi slovnične napake če dobiš 1 število napačen nekje v programu. Tako smo uvedli pojem matriko namesto tega. In spomnim, da smo uvedli ta program s tem malo kaj takega. Naj gredo v izvorno današnjem 3 imenik ponedeljek in odpira niz, ki smo ga videli zadnjič. In čeprav je bilo nekaj novih trikov C tukaj Med njimi pojem konstanta, spomnimo, da smo objavili več lebdi v bistvu s to sintakso: float, potem ime spremenljivke, nato pa smo uporabili kvadratnih naramnic res prvič, in kaj smo naredili znotraj teh oglatih oklepajih je dejansko dal številko. Toda namesto da bi več, sem dal to začetnico besedo, kvizi. In kakšen je bil motiv za dajanje začetnico besede, kot so kvizi in nato z uporabo vrstice 17 je trik tukaj, da dejansko daš številko? Kaj je bil razlog tam? Ja. [Neslišno študentski odziv] >> Točno tako. Če želimo spremeniti to vrednost 2, imamo le, da ga spremeni v 1 mesto ker meni - jaz se ne spomnim, kaj je ta program naredil točno to, ampak, če ste jo pravkar posneto vidite kvize, kvize. Vidiš kvizi, tukaj več kvizov. Torej, če ne bi imeli ta konstanta, ta uporaba ostre opredeliti, mi pa bi vnesli 2, potem 2, potem 2, potem pa 2, kar je v redu. To bi bilo prav tako pravilna. Recimo, da se naslednje leto imamo 3 kvizov v CS50. Tako da moram iti in posodobite kodo, jo moram prevesti, ampak problem je, če sem naredil kakšno neumnost, kot sem omenila spregledati 1 2 in pozabi, da vklopite 3, lahko celoten program zelo dobro prekinil. Torej smo samo prosi za trud. Tako pojem konstanta je vse o faktoringu od približno kos podatkov, ali je niz ali lastnost ali plovec ali karkoli, in jo razglasi za 1 mesto, tako da lahko lažje spremeniti v prihodnosti. In to je tudi odkrito povedano, malo lažje brati, ker če samo pomislimo na to zdaj, je kvizi, ali pa bi celo preimenovati to nekaj podobnega NUMBER_OF_QUIZZES ali kaj bolj jasno. Koda le postane malo bolj jasno, kaj to počne, in se sprašujem, kaj bi lahko malo manj, številka 2 se zgodi, da pomeni. Torej konstantno nima nič opraviti z bistveno nizi. Matrika je bil uveden na podlagi teh oglatih oklepajih. Torej opazili, da v vrstici 23 se od uporabnika zahteva, "Kakšne so bile vaše ocene kviz?" Potem imamo samo to zanko, ki je očitno sprašuje, si za svoje razrede. Kako? To ponovi 0-2. In rečem 2, ker kvizov v vseh kape je trenutno 2. Torej ponovi od 0 do 2, nato pa se natisne Kviz # nekaj nečesa, in potem se uporablja GetFloat, da bi dobili vrednost od uporabnika. Tako obvestilo je to le še nov del sintakse od zadnjega sredo. Če želite shraniti nekaj v nekem mestu v tej matriki, lahko ponovno uporabite oglate oklepaje. Torej je malo dihotomije tukaj. Ko prvič uporabite oglate oklepaje ga uporabljate, da določite, kako velik želite array biti. Ampak to naslednji kontekst tu, kjer smo ponovno zaposliti te oglate oklepaje pomeni, če v tem polju ne želite, da bi neko vrednost? In mogoče razlikovati tukaj razbrati iz konteksta. Obvestilo tu imamo vrsto podatkov, potem imamo ime spremenljivke, potem imamo oglatimi oklepaji s številko v notranjosti, podpičjem. To je to. Tako, da je deklaracija. To je tako, kot če bi to storili nekaj podobnega float float Grade1; grade2; ampak spet, to je naloga zelo hitro na poti preveč kopiraj, prilepi, Tako namesto da bi kar poenostavi kot take, kar pomeni, da imamo odslej razred, ki jih je mogoče shraniti v razredu 0, imamo še eno oceno, ki jih je mogoče shraniti na nosilcu 1, kaj pa če jaz Pepe in, na primer, moja zanka gre tako daleč - na primer, jaz bi to manjša ali enaka Odpoklic, ki je bil vir prejšnje napake - kar dejansko pomeni, da na nekaterih tretjih nenamernega ponovitvi te zanke Uporabljam nosilec 2. Dejansko se lahko kaj zgodilo tukaj? Prosim? [Študent] To bo treba zamenjati. >> Ali bo treba zamenjati? Kaj bi se zamenja? To dobesedno pravi nadomestiti tisto, kar je na voljo 2 s povratno vrednost GetFloat. Ampak problem je, kako velik je matrika na tej točki v zgodbi? [Neslišno študentski odziv] >> Matrika je še vedno le velikosti 2 ker matrike, kot vse spremenljivke, je bila razglašena za prvo, preden smo ga uporabili, in smo opredelili tu, ker ta konstanta, da imam 2 ocene, da bom dal. Ampak zapomni si, računalniški znanstveniki začetek štetja od 0. Torej, prvi kraj v tej matriki je nosilec 0. Naslednja lokacija je 1. Ta stvar je vedno tako malo preveč na rob. Torej, z drugimi besedami, če bi dejansko imeli to vrsto - in da vidim, kako dobro je to sodeluje tukaj za nas - če imam niz, ki sem vzhičen, kot sledi in sem dodeljen prostor za 2 elementov, ki bi lahko črpam to, kot je ta v spomin če je to velika bela platno. To je samo RAM imam v računalniku, gig RAM, 2 nastopov RAM-a, karkoli, ampak ti 2 škatle zdaj posamično predstavljajo likvidna, 32 bitov. Torej, če sem dal 1 številko tukaj kot 1,0, potem pa sem dal še eno številko tukaj kot 3,2 potem pa sem naredil nosilec 2, to je kot bi dal nekaj tukaj. In kot kaže slika, ni ničesar. To je nekako kot nikogaršnji zemlji, ker nisem vprašal operacijski sistem da mi ta tretji kviz. Če sem hotel, da 3. kviz, bi sem imel predvidevanjem prositi operacijski sistem za to razglasitvijo kvizov ne sme biti 2 ampak namesto tega enaka 3. Torej, z drugimi besedami, je slika, ki smo dejansko imeli pri roki izgleda takole tukaj. To je spet nikogaršnji zemljišč. Bolje, da ne poskusite pisanje vrednosti tukaj. Ampak še enkrat, ker računalniški znanstveniki računajo od 0, Ko govorimo o tej lokaciji v polju, ki je moral biti položaj 0, To naj bi bilo mesto 1, in to sploh ne obstaja saj smo samo vprašal operacijski sistem za 2 takih krajih. Torej tiste, ki ste predhodnih izkušenj programskega drugih jezikih Morda veš, da to ni vedno tako z nizi ali stvari imenujemo vektorji. Namesto tega lahko samo vztrajati dodajanje in dodajanjem in dodal stvari nizi, ki, odkrito povedano, smo imeli možnost, da se v nič, in še zdi, da smo ga dal gor ker s C ste programsko veliko bolj jasno. To je samo ti in računalnik, prav zdaj, in se računalnik le, da bo to kaj vam je rekel, da ne. Torej, če ste le povedati, da vam 2 boje preko linije 22 tukaj, To je vse, kar boš dobil nazaj od operacijskega sistema: prostor za 2. Torej, vse so vaši programi bodo občasno lahko vozičkom v zvezi z nizi. To je nekako narave zveri, s katerim smo vsi zmotljivi, in na neki točki boste zelo verjetno indeks od meje svojega polja. In to je samo uglajen način si šel v nekaj konzole in kaj je le prevelika številka. Šel si preko meje svojega polja. Ampak zdaj je to narobe. Preostali del tega programa res nima nič opraviti z bistveno nizi. To je vse samo o neki navadno aritmetično povprečje za računalništvo. Torej imamo tu v ta zanka here 1. spremenljivka imenovan znesek, ki ga inicializirati na 0. Potem smo Ponovil od 0 do 2 in spet smo dodali v tem seštevanja spremenljivko i-razred, tako da nosilec 0, potem nosilec 1. In potem, kot bi ti naredil v osnovni šoli za izračun povprečja, preprosto se ta znesek, ga delimo s skupnim številom kvizi, nato pa za dobro mero pravimo funkcijo imenovano okroglo tukaj. Zdaj, kot stran, kaj je s tem ukvarjajo parenthetical notr na spletu 34? Morda bi prišel že v oddelku, niso zares govorili o tem uradno tu ampak kaj je to int v parens Verjetno delaš? >> [Neslišno študentski odziv] Ja, to se nanaša na litjem ali typecasting, kar pomeni, da ob 1 vrsto podatkov in jo pretvori v drugo. Če tega ne more storiti z vsemi vrstami podatkov, saj včasih bi bilo malo čudno. Ampak v tem primeru, če se donos vrednost krog je plovec ker je, po vsem, sem ob plovec in ga delimo s številko kot 2, Jaz bom dobil nazaj plovec. Ampak ljudje razred šole v resnici ne zanima, da je njihova povprečna je bila 93,4 ker bodo spoznali, da so bili kdaj tako blizu tega 95 točke zaokroževanja. Zato želimo, da namesto tega uporabite int zaokrožiti vse do najbližje int, ki v tem primeru se bo 94 brez točke po njej. Tako, da je le malo matematično trik. In bomo prišli nazaj na ta pojem litja, saj bo imelo posledice, Če še niste odkrili že za problem iz 2. Torej matrika potem si lahko misliš - to se dogaja, da me nasmeh cel dan. Izgleda, da je to, če narisati sliko od tega, ampak ključno je, da je velikost izberemo tudi z vami ko ga zahteva od operacijskega sistema. Vsa vprašanja potem na poljih? Ja. [Neslišno študentski vprašanje] Ah, dobro vprašanje. Vprašanje je, kaj se zgodi z ničelno 0 v matriki? To ne obstaja v tem kontekstu. To obstaja samo v okviru nizov, ki smo na tem, da pride v trenutku. Ampak za matriko, kot v tem primeru pa boste dobili tisto, kar boste prosili za operacijski sistem. In kot stran, da ne bi bilo to jasno, Držim rekel prosite operacijski sistem, se obrnite na operacijski sistem. Operacijski sistem, kot verjetno veste, Mac OS, Windows, Linux. Ko kličeš funkcije, kot so GetFloat ali ste razglasitvi spremenljivk, kot so razredi, ob koncu dneva si v bistvu sprašuje, kdo drug, da bi vam ta pomnilnik ker smo v upanju, programerji Nimam pojma, kako dejansko dobil fizični dostop do spomina. Ampak nekdo počne: operacijski sistem. Torej, poleg tega nam predstavlja s precej ikon in menijev in mape in podobno , ki jih vidite na namizju ali Mac ali PC, operacijski sistemi storite tudi nizko raven vsakdanji stvari, zelo tehnične stvari obvladovati GB ali 2 gigabajta pomnilnika, ki ga imajo, upravljanje CPU, ki jih imate, in tako naprej. Torej, ko pišete kodo, ste res spotikanje v svoj operacijski sistem v tem smislu. Jaz bom moral zmanjšati to. V redu. Druga vprašanja o matrikah? Ne? Ok. Torej prehod seveda iz polja je dejansko na temo, ki je malo pozna. In smo si ogledali še tako kratek čas na tem zadnjem času preveč. To je bil primer iz niza sredo. Ta niz primerov je zelo preprost program, in sem dejansko poenostavljena z nekaj vrstic za namene današnjih. Vse to počne v vrstici 19, je dobil niz s strani uporabnika, ga shrani v spremenljivko imenovano s. Nato v vrstici 22 dalje pa je očitno, da je tiskanje niza 1 znak na vrstico. Toda kako se to počne? Mi smo o razglasitvi spremenljivke i, saj jo postavi enak 0, in to je vse stara navada zdaj. Nismo videli to do srede, lahko pa nekako sklepati iz njenega imena strlen vrne ravno kaj, ko, dana? Dolžina niza. Torej, če sem dajati niz, quote-konec citata David, to je upajmo, da bo vrnil k meni številko 5, ker Davida. Tako da je njen cilj v življenju je, da se niz, ali je težko kodirane z vami ali v tem primeru priklopljen kot spremenljivke, kot argument, in zneske, kakšna je dolžina tega niza je. Torej, tukaj smo zadolževanje nekaj zapisa iz prejšnjega primera kviz. To nima nič opraviti s plovci, nima nič opraviti s kvizi, vendar se izkaže, da je malo belo laž smo bili ti, saj tedna 1 je to niz v resnici ne obstaja v C. Niz ob koncu dneva je res samo polje. To je niz bajtov, tako bajt, bajt, bajt, bajt, ki odpoklic je le 8 bitov, Tako kos pomnilnika, kos pomnilnika, kos pomnilnika, kos pomnilnika. In sredstva, s katerimi se izvaja niz s tem da je prvi znak tukaj, potem je tukaj, potem je tukaj, potem je tukaj, back to back to back v spomin računalnika. Torej, če boste želeli zapisati besedo, kot je HALO, bi si dal 1 znak H, potem E, nato pa L L, potem O - 5 znakov skupaj - nekje v RAM v računalniku. Toda ključna podrobnost v tem, da oni bo back to back to back za hrbet, v neposredni bližini drug drugega. Ko sem rekel, ko je [i], kar v angleščini, je to mi daje? Kaj s [i] predstavlja v tem primeru? Ja. [Študent] i-ti znak v nizu. >> Točno tako. I-znak v nizu. No, jaz se bo začela na 0, kot na moji za zanko tukaj, ampak to je dobro, saj se vse začne štetje od 0. Torej, S [0] bo predstavljajo črko H v besedi kot HALO, s [1], se dogaja, da predstavlja tako pismo E v besedi kot HALO, in tako naprej. In tisto, kar se zdi, da gre na vsaki ponovitvi te zanke začasno shranjevanje i-znak v spremenljivko, imenovano c, ki je le znak, in potem bomo tiskanje c tako da je na koncu dneva, kaj ta program počne, je naslednji. Če grem v izvorni imenik in jaz niz1 in sem šel naprej in zagon niz1, in potem sem vnesete besedo, kot Pozdravljeni, Enter, vse to pa je natisniti 1 znak naenkrat. Torej je priložnost za izpopolnitev tukaj. Nekako sem dodatno delo, čeprav je bolj jasno, morda je to način, kot je potrebno. Katera vrstica kode tu lahko verjetno vrgel proč skupaj? Ja. Linija 24. V skladu sem 24 razglasitvi spremenljivo c. Jaz shranjevanje i-značaj je v njej, potem pa sem z uporabo C tukaj. Torej, jaz sem z uporabo c, tako da imam občutek, da ne moreš kar metati linijo 24 stran. [Neslišno študentski komentiraj] >> Točno tako. Torej, ko gre za govorimo o načrtovanju programov, Opazili to rahlo poenostavitev kodeksa, ki je prav tako berljivo, toda zavedati, da je le spremenljivka, njegov podatkovni tip polja, tako s [i] je le, da bo, da takoj vrne na vaš i-znakov v tem nizu. In če želite natisniti, da je v redu. Moraš uporabiti% c, ker nisi tiskanje niz, tiskate znak v nizu, in tudi to ima za posledico tiskanje wi znak. In spomnim edina razlika res od prejšnjega tedna s pomočjo printf je, da medtem ko je v preteklih tednih bi naredili nekaj zelo preprostega kot ogrado% s takrat je ime niza tukaj, zdaj smo potapljanje globlje pod pokrovom motorja in rekel: Ne natisniti niz, natisniti en znak v njej. Tako lahko naredimo nekaj malo drugačnega tukaj zato, ker je 1 druga - ni napaka ker je ta program pravi, ampak delam nekaj neumnega ki sem ga omenil na kratko v sredo. Toda razmišljanje nazaj, kako bi se ta program je oblikovan tako še izboljšali? Ja. [Neslišno študentski odziv] >> O, dobro. Tako opozarjajo, da smo uvedli drugo spremenljivko, imenovano n zadnji čas, za katero se zdi, da se bomo v nasprotju, ker je moj cilj sekundo je bil le, da mečejo spremenljivko kot nepotrebno, vendar pa opozarjajo, da v sredo, smo dejansko to storil. Spremenil sem v zanko, da dejansko imajo vejice, potem pa se n = strlen, in potem sem jaz i > [Neslišno študentski odziv] >> Točno tako. Jaz ne spominja strlen znova in znova in znova, saj spomniti, kako je za zanke del. Tudi če bi začeli, da bi dobili bolj zapleten prihodnost, opozoriti, da je stvar pred prvim podpičjem je inicializacija, ki se zgodi enkrat. Pogoj pa je, v sredini, in dobi to preveriti vsakič, ko gredo skozi zanko. Tako da je malo butast, da se sprašuje, v računalnik na isto vprašanje znova in znova - Kakšna je dolžina Halo? Kakšna je dolžina Halo? Kakšna je dolžina Halo? - saj, kot bomo videli, danes in v sredo, to pa bo zagotovo trajalo nekaj časa, in to ni zelo dobro izkoristiti čas, saj razbrati dolžino niza dejansko traja malo truda. To ni takojšnja, saj je v nekaterih jezikih. Torej, s spremembo, da je to n, cena Plačujem je kaj? Mi smo videli na kompromis tukaj. Jaz vam lahko prihrani čas, ki ga ne sprašuje isto vprašanje, prekleto znova in znova, ampak to bo stalo nekaj, kar je kaj? [Študent] Ste izgubili določeno količino pomnilnika. >> Točno tako. To bo stalo nekaj pomnilnika. Torej v tem primeru stane kaj? Še 32 bitov, ker n je le int, kot je predvideno z besedo int tukaj. Toda, ali je to v redu? Odkrito povedano, da je verjetno v redu, ker, če menite o tem, več niz je, več časa bom zapravljal ker strlen se dogaja, da pokličejo znova in znova in znova za vsako ponovitev zanke. In v teh dneh, moj Mac ima 2 nastopov RAM-a, v teh dneh 4 nastopov RAM-a včasih. Mislim, da lahko privoščijo 4 teh bajtov dejansko pospešitev stvari. Toda to se bo kompromis in tema res načrtovanja in računalništvu od nikoli dobili ničesar zastonj. Če želite izboljšati nekaj tukaj, boste morali plačati za to na drugi strani pa nekako. Prostor v odvisnosti od časa v tej zadevi. Torej, to je bilo vse, kar se proti nekaj Grobni, kot je ta, ki je, kot ste verjetno ugotovili, do sedaj, dejansko pravi? [Neslišno študentski odziv] >> Ja, tako je to, ne pozabite piti svoj Ovaltine, dejansko uporablja algoritem, imenovano ROT13, ROT 1-3, kar samo pomeni, da zavrtite vse črk 13 mest, kar pomeni, da bo, in nato dodamo 13 do njega in pika, pika, pika vse do 13. pismu stran, narediš isto stvar za B in C in za D in tako naprej. In tako, če bi dejansko pretvorite to sem z uporabo prehoda 13 mest, bomo dobili nazaj tisto malo, kar je Ralphie, ki je, ne pozabite piti svoj Ovaltine. Vendar sedaj problem iz 2 v standardni različici vsaj, morate vrste pa sami enciphering, in moramo nekako sprejeti na vhodu, kot je ta, in šifriranje ali dešifriranje ga. Torej, kateri od teh vrste temeljev nas pripelje do te možnosti? Oglejmo si na ta tretji primer tukaj. Najprej se imenuje ASCII. Kaj ASCII vrne? Ameriški standardni nabor za izmenjavo informacij, kar je res daleč bi rekel kaj? Kaj je ASCII? [Neslišno študentski odziv] >> Kaj je to? >> [Študent] znak zemljevid. >> Znak zemljevid. Samo preslika številke pisem, saj ima svet standardizirani kaj številke bo predstavljal kakšne črke, tako da se lahko vsi uporabljajo računalnike in vsi naši programi so združljivi le, ko gre za tiskanje stvari na zaslonu. Tako opozarjajo, da se zgodi, da predstavljajo 65, 97 zgodi, da zastopa male črke. In tako ta preprost program tukaj ASCII je izkoristila to dejstvo - da svet ve, da je kapital, je 65 - in to je samo tiskanje preslikavo. Torej, preden se potopite v to oznako, naj namesto tega odprl terminalsko okno. Naj gredo naprej in da ASCII, nato pa naj samo teči to stvar samo pokvariti rezultata. In to samo naredi to: res velik grafikon, da samo mi pove vse različne oznake za vse različne črke. Torej, super preprost program, vendar nisem imel na trdi oznako teh 52 vrstic izhoda: 26 velikimi, 26 male črke. Namesto tega sem to naredil načrtno z nekaj zank. Obvestilo, kaj sem naredil tukaj. Jaz sem iz poudarili, je 65 od 65 do 26 +, ker sem želel, da natisnete 26 črk V angleške abecede, i + + na vsaki ponovitvi in ​​zdaj opazil to še enkrat. To je ponovitev našega prijatelja typecasting , s katerim pretvorite 1 vrsto podatkov v drugo ker kaj želim narediti v tem programu? Želim številčno šteje, ker to je, kako sem odraščal štetju - 65, 66, 67 in tako naprej - vendar ne želite natisniti samo številke. Želim natisniti pismo, ki ji sledi številka. Želim natisniti A: B: številka, številka, ampak lahko to stori z istim točno spremenljivke. Zato sem se izpisal% C kot ogrado za znak, % D kot mesto za številko ali številko. Kaj potem priključim za tiste 2 ograde? Najprej sem plug v znak protivrednosti i, potem pa natisnete i sama. Torej, opazil to preveč preprosto deluje. Tako kot sem lahko odda s plovcem za notr , da bi šel z realno število na celo število, Tukaj lahko grem od notr na char, kar je malo čudno - ne čisto preslikati na resničnem svetu - vendar v računalnike char je samo številka pod pokrovom motorja, tako da sva še tako izrecno tukaj za računalnikom, rekoč: printf izpiše, ne jaz kot 65 let, ga natisnete kot svojo številčno enakovredni. In izkazalo se je, da sem tehnično sploh ne potrebujemo. Kaj sem počel pred nekaj trenutki je izrecno litje z navedbo, kaj tip podatkov želim iti v in iz. Ampak sem opazil, da že imajo to c ograde% in ta drugi% c ogrado tukaj. Čeprav to ni int, računalnik se zaveda, da znak, to je samo int pod pokrovom. Torej, če sem dejansko prevedem to in ponovitev ASCII program, opazite, da še vedno deluje, ker samo računalnik se zaveda, da je ta korespondenca. Zdaj je bolj pomembno, da to izrecno vlivanje v svetu splavov na ints saj ste dejansko tako izračunanega odločitev: mečejo vse, kar je za decimalno vejico. Tukaj pa je res nič ne vrže stran, ker je samo znak številko, in niz je le nabor znakov. Torej, ko pride čas, da se izvajanje nekaterih šifriranje ali dešifriranje, kako to, da bomo lahko dejansko prevede kaj takega nesmisel, Bodite prepričani, da pijete vaš Ovaltine? Kaj pa, če vemo zdaj - vzemimo kot predpostavko - to je ključ, Številka, ki smo vrtijo vseh teh pisem, ki jih je številka 13? Torej smo šli od črke B vse do Ø na začetku stavka, Bodite prepričani, da popij Ovaltine, ker če naredim B in potem sem šel C, D, E, F, G, H, I, J, K, L, M, N, O, zato šifriranje črko B postane O ker sem dodal 13 za to. Torej, če želim, da dešifrirati to, sem v bistvu morali O in nato odštevanje 13 iz nje. Ali pa, odkrito povedano, saj je 26 črk v abecedi, to je čudovito simetrična, bomo lahko tudi preprosto dodate 13 in bomo dobili nazaj na črko B. Ampak kako si šel o izvajanju kaj takega v Caesar ali res manipulirajo nizov na splošno? Če črka B je tisto številko? Kaj je črka B? Torej, to je 66, kajne? Torej, če pismo je 65 in črka B 66, Tako 66, vse kar morate storiti, je dodati 13 do njega, in to mi daje 79. In če gremo v naši mali stanja goljufija, 79 celo zemljevidi na O. Vendar pa je malo kotno primeru tukaj. Kaj je, recimo, črka Z? Če tega ne storimo 66 + 25, da bi dobili vse tja do konca abecede, smo na 91. 91 + 13 mi daje 104, in veš kaj? 104 ne enako veliko tiskano črko. Vrnimo se na malo stanja goljufija tukaj. Če sem znova zagnati ta program v aparatu, obvestila, da je 104, če grem nazaj v terminalskem oknu, 104 je očitno male črke h. Zato moramo nekaj ključnih trik tukaj, da bi se prepričajte, da ko začnemo ob Ž in dodamo 13 mu ne želimo, da samo ohraniti dinamično razvijal naprej v večje in večje številke. Kaj zares želite narediti? Hočeš okoli zaviti. Tako se je izkazalo, kot ste videli verjetno v oddelku zdaj in v spec problem zastavila Ugotovil je, da je to drug operater v C, ki je tudi znak za odstotek, ker pa smo tukaj, da uporabljajo% natančno ogrado, vem, da je zlasti za sklop 2 Problem pa je tudi nekako takole: int x = y% z. Naj jo predstavi kot zelo splošno obliko tega. Odstotek pomeni kaj v programskem jeziku? >> [Študent] modula. Modul, ki je uglajen način preostanek. Kljub temu, da je rahlo razlikuje z opredelitvijo tam, to pomeni, delimo z y vz, vendar ne vrne rezultat tega oddelka; Namesto, vrne preostanek. Torej, če je y dejansko 3 in z dejansko, 2, 3 deljeno z 2 je 1 s preostalo 1, Torej, kaj pravzaprav enaka x v tem primeru? 1. To je tako enostavno, nizko stopnjo ideja. Traja nekaj časa, da se vaš um ovit okoli njega ker je to verjetno že kar nekaj časa, odkar ste sploh imeli, da skrbi za ostanke in dejansko jih uporabiti za kaj namensko, vendar v tem primeru samo dejstvo, da lahko greš z velikim številom kot 3 na razmeroma majhnem številu kot 2 in nato ovijte okoli učinkovito s pomočjo preostanek na manjšo vrednost, kot 1 se bo neprecenljiv trik da lahko uporabimo tako za nekaj podobnega Cezarja in to druga stvar Vigenere Problem nastavite na 2, ampak to se bo ponavljajoče trik skozi semester. Ta preprosta, enostavna ideja le ob preostanek na splošno se dogaja, da nam omogočajo, da po zaviti. In kot smo začeli igrati bolj z nizi, kot smo začeli igrati bolj s pomnilnikom sam, to se dogaja, da postane bolj in bolj zmogljivo trik. Torej vsa vprašanja, nato pa na ASCII ali zastopanje strun kot nizi? In bomo to traja 1 zareza več. Ja. [Neslišno študentski vprašanje] >> Dobro vprašanje. Kaj pomeni, če ima spremenljivka zvezdico pred njim? Naj odloži odgovarja, da v vsakem podrobno a, ki se nanaša na temo, znan kot kazalec. Kazalci narediti s spominom, in smo pravzaprav še danes ob prvi korak k tej razpravi, vendar za zdaj, naj se pretvarjajo, da zvezda ne obstaja in bomo še naprej vztrajala nize nize namesto char *, kar ste verjetno že videl in bom dal na zaslonu čez nekaj trenutkov kot teaser. Torej bomo vrnili na pot, da podrobneje, kot mnogi izmed vas bodo verjetno všeč. Sčasoma, ne danes. Ja. [Neslišno študentski vprašanje] V kakšnem kontekstu imaš zagotoviti znak za znakom? >> [Študent] Ja. Torej privzeto, če ne dajo +, se domneva le pozitivne številke. Torej, če samo napisati številko 1, je pozitivna 1. Če želite določiti dejansko negacijo vrednosti, dobesedno narediti -1 na tipkovnici. Ampak to verjetno ni vaše vprašanje. >> [Neslišno študentski odziv] Dobro vprašanje. Ok. Torej, to je to, sem se zbrati, z nekakšno napako si zašel v ker ste pretvorbo celo število, da znak, ampak nekako negativnost zapletel, in tako znak pravkar prišel ven munged nekako. Torej za zdaj, naj ti malo poenostavljam, dokler ne pridemo nazaj na tovrstne teme. Za zdaj razmišljati o stvareh, na ta način - in to je poenostavljanje. Toda v svetu celo število imate, koliko bitov na razpolago? Imate 32 bitov. In sedaj, smo se pogovarjali o skupnem številu celih lahko torej predstavljajo je približno 4 milijarde skupaj, ker imaš 32 bitov, tako da je 2 na 32, tako da je približno 4 milijarde EUR. Vendar pa smo videli teden ali 2 nazaj, da ne boste res imeli vrsto številk od 0 na do 4 milijarde. Razpon sega od približno namesto negativnega v pozitivno 2000000000 2000000000. Ampak to potem se zastavlja vprašanje, kako si predstavlja pojem negativne 2000000000 kaj šele negativna 1? Za zdaj, bomo lahko poenostavljam in samo rečem, da bomo uporabljali skrajno levi bit od teh 32 bitov, in če je 1 je negativno število in če je 0 je pozitivno število. Problem s tem poenostavljeno zastopanje negativne številke je, da če je bilo namerno biti pameten in poskuša pretvoriti iz narave s številnimi ali obratno, da ni take stvari kot negativnega učinka. V svetu ASCII, ki uporablja samo 8 bitov, vse 8 od teh snovi bitov, in skrajno levo malo nima nič opraviti z negativnosti. In tako mora biti jasno, ko rečem skrajni levi bitov, opozoriti, da je, ko smo našo malo povezane primere v prvem tednu spomnimo, da smo narisal stvari, kot so 1001101, nekaj takega. Ko rečem skrajno levi bit, sem dobesedno pomeni 1, da napišete vso pot v levo. Tako v svetu znakov ni pojem negativnosti, tako da skrajno levo malo dejansko ima nekaj opraviti z ASCII, nič opraviti s negativnosti. Torej, to zveni kot - in izven konteksta, da je težko natančno odgovoriti - ampak nekako, vaša koda je begalo, da je skrajno levi bit, saj so negativno vrednost če je res bil del narave v vprašanju. In spet sem oversimplifying ker so računalniki dejansko nekaj malo Ljubitelj kot samo spremenili, da skrajno levi bit na 1 za negativni predznak v primerjavi z 0. Namesto tega, če ste radovedni, da Google, uporabite nekaj običajno imenovano dopolnilo 2 je, , ki je nekoliko bolj sofisticirana od pristopa ampak ideja je na koncu enak. Torej na kratko, je to morala storiti z dejstvom, da si masažo število v znak ali obratno, ampak vaša koda ni bila zaveda dejstva, da 1 teh bitov je pomen v številčni svetu. To ne velja v znak svetu. Ampak to se sliši, kot da določi, v tem primeru nepotreben zdaj. Druga vprašanja. Ok. Do sedaj so vsi programi, ki smo jih napišejo sprejeti prispevek morda od uporabnika v obliki funkcij, kot so GetInt, GetString, ali če ste bili pred branjem v raznih knjigah ali na spletu referenc, Sami se lahko uporablja funkcije, kot scanf, ki odkrito, ki jih uporabljamo v CS50 knjižnici. Ampak v tednu ali 2, bomo dejansko pokazali, kako se izvaja knjižnica CS50 tako da bomo lahko ta usposabljanje kolesa off celoti. Vendar se je izkazalo, da je še en način, da se prispevek od uporabnika. V bistvu smo bili sami z argumenti v ukazni vrstici za nekaj tednov. Vsakič, ko smo teči Jek ali pa smo jih prikazali, da, nismo samo vnesli Jek, Enter, nismo vnesli narediti, Enter. Kaj smo ponavadi napisal besedo Jek v našem terminal pozivu operacijskega sistema Windows? [Študent] ime datoteke. >> Ime datoteke, kajne? Hello.c ali mario.c ali karkoli ustrezno ime datoteke. In v tem smislu, kaj ste res opravili ste vplivalo na vedenje Jek ker gotovo ljudje, ki so pisali Zvoka ni niti sanjalo, da je malo stara vas da bom napisal program, imenovan mario.c let kasneje. Torej si moral nekako vplivajo na obnašanje tega programa, in ta program Jek morala biti napisana tako, da lahko sprejme prispevke od tebe z dodajanjem besed na poziv, preden se uporabnik zadetki Enter. Tako se izkaže, da je za nekaj časa smo se o razglasitvi skoraj vseh naših programov začeti, kot je ta - int main (void) - in potem smo šli naprej in začel pisati svojo kodo. In morda imamo nekaj ostrih tudi na vrhu datoteke, ampak skoraj vse naše programe, ki so doslej začela s tem čeprav ste morda opazili v delu, v knjigah, spletne reference da to ne bo v resnici morala biti nična. Druga legitimna oblika za to, da se je int argc in nato niz argv []. Torej, kaj zdaj to namiguješ? Izkazalo se je, da je argc, ki je človek konvencija - lahko imenujemo foo, vendar bi to šele bilo veliko manj jasno, da bralci - argc preprosto ni argument za funkcijo imenuje glavni, ki predstavlja kaj? Kaj argc stati za tiste, ki poznajo? [Neslišno študentski odziv] >> Ja, število argumentov ali argument štetju. To je tako enostavno, kot to. Koliko argumenti so bili sprejeti v ta program? Kaj to pomeni? Če v ukazni vrstici sem teči nekaj takega - Jek mario.c, - argc, ko sem udaril Vpišite se dogaja, da se na vrednost, nekoliko zmedeno, 2. Tako se izkaže, da je argument število argc, vendar zaradi zgodovinskih razlogov, je ime programa samega vključen v to število. Torej je 2 argc, ko sem pisal Jek mario.c. Kaj vsebuje argv? Najprej, argv izgleda kot niz, vendar ne povsem ker je od zadnjega sredo in danes še toliko bolj, Ti oglati oklepaji označujejo kaj? To polje. Ni več v polju, in da bi bilo smiselno, intuitivno ker so ljudje, ki so napisali Jek leti zagotovo ni imel pojma Koliko besed ljudi, kot smo mi, bi vnesite v poziv, preden pritisnemo Enter. Torej v tem primeru tu niso prijavili glavna funkcija je ob paleto argumentov, 0 ali več razlogov. Oni ne vedo vnaprej, koliko jih je, tako da namerno ni več znotraj teh oglatih oklepajih. Toda dejstvo, da so oglati oklepaji so tam govorijo računalnik, pričakujejo niz. Argv je samo okrajšava za zapis msgstr. Vektor je uglajen način niz, in matrika je uglajen način seznam ali zbirko. Torej, to samo pomeni, da če ste napisali glavni takole Namesto všeč, kako smo to počeli v zadnjih nekaj tednih, vaš program ima zdaj moč, da sprejme argumente v ukazni vrstici tako da ne moraš pisati Mario in nato pritisnite tipko Enter, vnesite v številnih, za koliko blokov visoka želite piramida biti, nato pritisnite tipko ENTER. Mi sploh ni treba uporabljati GetString več ali GetInt ali GetFloat za to zadevo. Mi lahko samo pričakujemo, da bo uporabnik vnesti te besede na poziv se tako kot avtorji Jek odločil, da bi bilo zelo nadležno Program Če zbrati kodo morate najprej vnesli Jek, pritisnite tipko Enter, potem pa je rekel, da uporabnik, vnesite ime datoteke, ki jo želite pripraviti, potem vnesite mario.c in pritisnite tipko Enter. Ampak to je točno to, kar smo počeli za naše uporabnike zadnjih nekaj tednih. Mi uporabljamo GetString in čakamo, da program deluje, da jih pozove na vnos. To ni več potrebno, da je tako. Tako v tem primeru tukaj, zdaj imamo niz argv, in tudi to je poenostavljanje, usposabljanje kolesa, ki bo kmalu prišel dol. To je bolj pravilen način pisanja tega alternativnega izjavo glavnega ker se je izkazalo, da tisto, kar kličejo niz dejansko ima zvezdo, zvezdica v svoji dejanski opredelitvi, vendar je to samo izgleda zapletena, to je zmedeno na prvi, tako da smo poenostavili le za ustvarjanje sinonim razpoloženje V knjižnici, ki CS50 zemljevidi char * s tem bolj uporabniku prijazen niz besed. Torej, kaj je dejansko poskusite to takrat. Naj gredo naprej in odpreti gedit tukaj. Naj gredo naprej in odprite argv od 1. Ta program natisne očitno argumentov, temveč v angleških izrazov, jih gledamo na to oznako, kaj to storiti natančneje? Če bi tip v ukazni vrstici a.out foo, postane kaj natisnjeno v mojo črno-belo okno? A.out foo bar, Enter. Pojdi. Ja. >> [Neslišno študentski odziv] Dobro. Torej a.out, nova, foo, nova, bar, nova vrstica. Zakaj je tako? Vsekakor lahko potrdi vsak trenutek. To je nekako mehko vrstico kode.  Prav tako natisne novo linijo samo, da bi se stvari lepše na zaslonu. To je zanka, ki je ponavljanjem od 0 naprej do argc, in to je povečevanje na vsaki ponovitvi + +. Torej, to je zdaj pravi natisniti niz, kot je predvideno s to% s. Argv [i] je precej isto idejo iz prejšnjega primera. Uporabili smo, da pokličete spremenljivo s, zdaj je pozval, samovoljno, argv. To pomeni, da natisnete i-trditev, da je bil natipkan v ukazni vrstici, in potem ko je to storil stvar, samo za dober ukrep natisniti še novo vrstico. Torej, kaj je videl. Naj odpreti terminalsko okno. Naj pripravijo argv od 1, in zdaj mi teče argv po 1, Enter. Hmm. Ok. Naj teče foo bar. Zanimivo. Baz. In če ste se kdaj spraševali, zakaj to pišem, to je samo tako neumen računalništvo konvencije. Svet se mora le verbalne ograde za besedami. Torej, če želite govoriti o neki splošno nizu računalniški znanstveniki samo ponavadi pravijo, foo, ko potrebujejo naključno besedo, potem pravijo, bar, če potrebujete drugo naključno besedo, potem pravijo BAZ če potrebujete tretja beseda, potem pa pravijo, da če potrebujejo razvrstitev za 1/4 besedo, in potem je tukaj še ogromno verske razprave na spletu, kaj pride za razvrstitev za, tako da lahko Google, da ugotovimo, kaj bi bilo drugo poljubno beseda. Ampak to nimajo pomena, Čeprav foo bar, če Google, da to ne pomeni, so se, , ki je del etimologije tukaj. Torej, vse to pa počne tiska 1 od teh nizov na linijo. Torej, če sem namesto tega, čeprav je želel, da bi dobili malo Ljubitelj, Domnevam, da nisem želite natisniti vsak niz na vrstico; Želel sem natisniti vsak znak iz vsakega niza na linijo. Kako bi lahko namesto tega naredil? Kaj moram spremeniti o tem programu, če želim natisniti ne vsako besedo ampak želim, da natisnite vsako besedo pismo z dopisom z dopisom, potem Naslednja beseda pismo z dopisom z dopisom? Kako združiti te ideje doslej? Ja. [Študent]% c. >> Redu. Tako smo nekje potrebujemo% c. Dobro, ker ne želim natisniti celotne nize, želim natisniti znake. Kaj še? [Neslišno študentski odziv] >> Zanimivo. Zato moramo nekakšno drugo dimenzijo tukaj ker mislim argv kot matriko, vendar je množica nizov. Ampak kot, recimo, 15 minutami, kaj je niz? To je niz znakov. Torej res, argv je array paleto likov, Množica nizi znakov. Tako se izkaže, da ga lahko uporabljamo le bolj kvadratne notacije nosilec. Torej, kaj je to. Na vrhu te zanke na liniji 19, bom ponoviti od i do argc, potem pa bom za to: za - jaz ne morem uporabljati zdaj. Rabim še spremenljivke, ker želim ponoviti več kot besede potem pa tudi nad črk v besede Tako sem nekako imajo navpične osi in horizontalni osi, nekako konceptualno. Torej, int j postane 0, potem pa sem hotel narediti j dokler je j manj kot - in to bom čisto v bit. Kako izbirate več črk v nizu? To smo storili pred nekaj trenutki. Strlen od argv [i]. Dobro. In spet, sem kar malo neučinkovitost tukaj ne ustvarjajo n ali karkoli, vendar bomo vrnili k temu. Torej, zdaj j + +. Zdaj moram še alinee tukaj. Kaj naj zdaj želite natisniti na vsaki ponovitvi? [Neslišno študentski odziv] >> Tako [i] mi bo dal besedo. [I] [j], nekako kot matriko. Tisti, ki ste z ozadjem math-y, smo nekako indeksiranje še globlje v tej matriki ali ta množica polj, Ta 2-dimenzionalno strukturo. Torej, zdaj pa poglejmo, kaj se dogaja tukaj. Naj odpre svojo večjo terminalsko okno. Naj ponovitev naredili iz argv od 1. In sem zajebal tukaj, kar je dobra lekcija, ker sem preveč pozabil, da to storijo. Kaže razglasitvi C knjižnico "strlen" z nepodpisano tip "- Sploh ne vem, kaj ostali ta način, vendar sem videl že prej, implicitno razglasi. Vsakič, ko smo videli to napako, kaj to ponavadi pomeni? [Neslišno študentski odziv] >> Pozabil sem knjižnico do vrha. Toda počakaj malo. Ponavadi sem zamočil, ker sem pozabil CS50 knjižnico, ampak to je tam. Ponavadi sem zamočil, ker sem pozabil standardnega I / O. In odkrito povedano, sploh ne potrebujemo. Mi ne uporabljate GetString danes. Torej, kaj mi manjka? Obstaja še ena knjižnica, zdaj moramo uporabiti občasno imenuje string.h, in to je samo še ena knjižnica, ki ima več funkcij, ki niso v standardni I / O. Torej greva nazaj v mojo velika okna terminala. Ok. Zdaj, prekleto, mislim, da sem se motil. Bil sem z CS50 knjižnico. Tako bomo lahko to popravimo na enega od 2 načinov. Mi lahko sprejme za usposabljanje kolesa off prav zdaj, in prav to, ali vrsta dajva o hrani, da poenostavitev samo za zdaj, prilepiti nazaj, rešili ta problem, in zdaj nazaj na terminalskem oknu. Zato mora biti jasno, v knjižnici CS50 ni samo funkcije, to je tudi ključna niz, ki je razlog, zakaj je ta napaka se je pravkar zgodilo. Torej, gremo. Popravil sem obe knjižnice vprašanj. Enter. Dobro. Argv po 1, foo bar, Enter. Odlično. Torej, zdaj imamo vsako črko vsake besede natisnjene na linijo 1, kar ne pomeni, da za zelo zanimiv program, ampak obvestilo sedaj imamo sposobnost ne samo nad ponavljanjem besed ampak tudi v posameznih črk v besede, ki zveni grozno pozna da celo najpreprostejši aplikacije, kot so premešavo črk v nizu, kot je ta. Gremo naprej in vzamemo 5-minutni odmor tukaj. In ko se vrnemo, bomo začeli govoriti o učinkovitosti , s katerim lahko te stvari bolje. V redu. Mi smo nazaj. Zahvaljujoč našemu TF, ki igra veliko bananagrams, smo dejansko imeli cel kup znakov z nami danes fizično utelešenih v teh majhnih plastičnih delov, in mi predlagala, da ta prazen bel skrilavca tukaj predstavlja RAM v mojem računalniku - laptop, desktop, karkoli - in izgleda veliko njim ker če začnemo sekanje to RAM na majhne bajt v velikosti zrna, dajmo reči, da samovoljno nekaj, velikost in zamegljen predstavlja - tam bomo šli, in kaj je pomanjšati malo tu - Recimo nekaj, kar predstavlja eno velikost bajt. Tako smo lahko zares ustreza cel kup bajte ali znakov znotraj tega spomina, kot je predlagal relativnega tukaj. Torej, predvidevam, da je zdaj cilj je, da rezervirati pomnilnika za niz. Kako to dejansko deluje? V programih, ki smo jih pisali, smo ponavadi uporabljali GetString, zdaj pa je jasno, da je to drug kanal, preko katerega bomo lahko dobili navodilo za vnos v argv z argumenti v ukazni vrstici. Toda kaj se v resnici dogaja pod pokrovom? Izkazalo se je, če rečemo - gremo nazaj poiščite GetString - funkcijo GetString V knjižnici CS50, je uporabnik pozvan za niz, uporabnik vrste v neki besedi - dajmo ga pokličete Pozdravljeni. In smo bili pravi v zadnjih nekaj tednih, da se je donosnost vrednost GetString je v bistvu niz, kot je beseda Pozdravljeni. Toda kaj je GetString res delaš? Kot uporabnik vpiše v HELLO, Enter GetString je poskušal ugotoviti, ok, koliko znakov je to? To je H-E-L-L-O. Zato je treba dodeliti, je potrebno vprašati, operacijski sistem Linux - v tem primeru - vsaj 5 bajtov za shranjevanje Pozdravljeni. In kaj se potem nadaljuje storiti, ko je dobil nazaj tiste 5 bajtov iz operacijskega sistema je za postavitev HELLO back to back to back to back. In kaj se v resnici vrnil iz GetString je kos podatkov, ki izgleda takole. Ampak to je malo netočno, saj se je izkazalo, da to ni tako enostavno, kot le shranjevanje Pozdravljeni v spominu računalnika Domnevam, da zato, ker moj program, da pišem v C pokliče GetString spet, in naslednjo besedo uporabnik vnese v je Adijo. No, moram namestiti, da se beseda BYE nekje v spominu. Ne morem clobber Pozdravljeni. Na primer, jaz ne želim, da računalnik šele začetek prepisovanje takole prvotna beseda, saj lahko še vedno uporabljate besedo Pozdravljeni v spremenljivko nekje drugje v mojem programu. Torej, B-Y-E je končal nekje drugje v pomnilniku. Toda konvencija je običajno, da je naslednji niz lahko dodeli Verjetno, vendar ne vedno, se bo končala ob prvi mesto v pomnilniku. In če nisem vprašal operacijski sistem za vsak spomin od zadnjega, ko sem klical GetString, odds so besede BYE se bo končal takoj za besedo Pozdravljeni v pomnilniku. Toda na tej točki lahko morda videli, če potencialni problem pojavi. Ker naslednji kose spomina, naslednjih bajtov, ki so bili samo prosto - čisto belo skrilavec - v spomin na računalniku so bili zraven HALO, se počuti kot v prvem nizu sem prosil za lahko nenadoma spremeniti sedaj ker sem bistveno spremenila, da HELLOBYE namesto da bi nekako demarcing začetek adijo in konec Pozdravljeni. Tako se izkaže, da to, kar se v resnici dogaja pod pokrovom motorja, , ki ste jih morda zagledali na spletnih referenc ali razdelku ali knjige ali pa sploh ne še zdaj, je, da je pravzaprav namerno razmejitev med besedami v spomin računalnika. In v resnici, v tem primeru v tej zadevi, ne samo da BYE tik HALO, Namesto, računalnik daje poseben značaj, posebna null značaj, če se tako izrazim, ki je zastopana z označevalcem s poševnico 0. Tako dolgo zgodbo, opozarjajo, da so znaki predstavljeni v ASCII. ASCII je samo preslikava med številkami in črkami, in večina teh pisem začne približno 65 za kapitalske A, vendar se izkaže, lahko zagotovo predstavlja število 0 kot celo število ali binarno, in izkazalo se je svet odločil, dolgo, dolgo nazaj, "Veš kaj?" "Gremo rezerve številka 0 ne predstavlja nobenih znakov na tipkovnici - "Ni črke, številke, ne brez ločila. 0 je nekaj posebnega." "To se dogaja, da je treba posebno null značaj, in gremo pisati kot \ 0". Razlika je, če smo le napisal 0, 0, je znak. Spomnimo se, da so kode ASCII za 0, za 1, za 2 osebi, za 3 ker je znak 0, se razlikuje od številke 0. In lahko vidite, da če pogledaš nazaj od 1. tednu, ko smo govorili o ASCII, 0 in 1, 2 in 3 pa vse do 9 imeli svoje ASCII kode. Niso po naključju, od 0 do 9. Oni so zelo različni. Torej, 0 pomeni le: "Jaz sem poseben" in \ 0 pomeni, dobesedno, "Nisem 0 lik." "Jaz sem to posebno vrednost null lik." Zato sem dejansko potrebujejo še enega, ker ne morem narediti isto napako dvakrat. Torej, po besedi Bye smo tudi dogaja, da potrebujejo še enega od teh null znakov. Naj vzamem moje pero tukaj in mi hitro sestaviti novo \ 0 tako da je po tem, ko sem vprašal, operacijski sistem za godala 2 preko GetString sledil nov razpis za GetString, To je tisto, kar je dejansko v spominu. Torej, ko se vrnem niz, sem res dobili nazaj, da in ko sem dobil naslednji niz, sem res dobili nazaj, da. Zato se postavlja vprašanje, strlen, najprej, kaj naj bi se vrnil? Ko sem poklical strlen na niz s in je bila beseda HELLO, da si ga vnesli v, kaj smo rekli seveda dolžina Pozdravljeni bil pred nekaj minutami? To je bila 5, kajne? H-E-L-L-O. In to je res, kako strlen dela. Vrne tisto, kar bi normalen človek pričakuje dolžino niza biti. Toda v resnici, kako velik je niz znakov, ki se zdravo shranjevanje? Pravzaprav je 6. Torej strlen ne omenja to dejstvo za vas. Ampak pod pokrovom računalnik dejansko uporabo 6 bajtov za shranjevanje 5-črkovno besedo in to je res, ne glede na to, kako dolgo je beseda. Tam je vedno bo posebna zaključku null lik na koncu niza da demarc svojo skupno dolžino. Torej, če ste sedaj oseba za izvajanje strlen 20, 30 let nazaj, kako si šel o izvajanju strlen sam? Mi samo po sebi umevno, da obstaja, tako kot se nam zdi samoumevno, da obstaja printf, če pa Hello je beseda v vprašanju in kaj imam v spominu, je nekaj, kar je videti tako, če bi moral reimplement strlen, ker smo vas prosili, da ali zato, ker, odkrito povedano, niste vedeli obstajala strlen - boste morali roll tole na lastno odgovornost - kako bi lahko izvajala strlen kadar se dajejo nekaj, kar izgleda takole? Zdaj, ko vemo niz je niz, lahko izbirate v vsakem od posameznih likov z nekaj podobnega - poskusimo to storiti na letenje. Naj gredo v napravo. Naj ustvariti novo datoteko, strlen.c. Naj gredo naprej in zdaj ne vključujejo stdio.h, tako da imamo dostop do printf. Naj jaz int main (void). Oh. Jaz bom to sam za zdaj takrat. [Smeh] Hvala. To je tisto, kar delam. V redu. Torej, preden sem se obrnil na zaslonu, sem tipkal vse to. In zdaj, kaj bom storiti, je naslednje: printf ("Daj mi niz:") To je samo puhasto navodila. Zdaj pa jaz = GetString String s. Sem že morali nekaj spremeniti zdaj. Jaz sem z uporabo CS50 knjižnice naenkrat, zato naj gredo naprej in vnesite cs50.h. In zdaj naredimo to: printf ("dolžina:% d, strlen [i] - in nisem še končal. Kaj še moram dodati, da ta program? [Študent] string.h. >> String.h. Torej za zdaj, bomo z strlen, tako da je poskrbite, da prevajalnik ve, kje je to, Tako malo duševno zdravje preveriti. Grem niz v skladu 8, 9 in v skladu bom tiskanje po dolžini z% d. Torej, gremo naprej in odprite tole. Smo, da strlen - pripravlja redu - strlen - Naj povečavo - Enter, H-E-L-L-O, Enter. Dolžina je 5. Ok, strlen zdi, da dela, ampak svet vedel. Torej, kaj je zdaj izvajajo strlen sebe, kot sledi. Naj bo to knjižnico stran. Nimamo več dostopa do string.h, ker sploh nisem vedel, da obstaja. Ampak to je v redu, ker sem lahko izvaja sam strlen in jih sprejeti niz imenovano vhod, in zdaj moram ugotoviti, koliko tega niza. Torej, kako lahko to storim? Kaj pa če jaz - da vidimo, kako to storiti - Kaj hočeš narediti? [Neslišno študentski odziv] >> Ok. Torej, lahko to storimo v kup načinov. Naj poskusim, naj ta pristop. Naj dam notr spremenljivko i, zato sem se začne pri 0. In naj vam povem to: medtem ko je vnos [i] ni enak primer? \ 0. Tako se je izkazalo, tako kot v primeru vseh znakov, ko jih pišejo dobesedno v programu, boste morali uporabiti apostrof, ne narekovajev. Torej, če sem jo napisali pismo a, bi to storil, črko B, bi to storil. To je v nasprotju, bi bil niz, ne individualne narave. Zato želim \ 0 dobesedno. Kaj hočem storiti v to zanko? Pravzaprav moram še spremenljivko, zato int dolžina dobi 0. Tudi če ne bi bili prepričani, zakaj smo začeli tako zavzeto delati, zdaj, ko gremo po tej poti, kaj hočem narediti na liniji 9? dolžina + + in nato dol na liniji 10, donos dolžine. Torej, kako je strlen izvaja? To je dejansko izvajal verjetno takole. Mogoče oseba uporabila za zanke, morda, medtem ko je zanka - kdo ve? Mi bi res morali pogledati pod pokrov motorja pri dejanski kodi V nekaterih datoteki z imenom string.c verjetno. Ampak tukaj kaj je razmišljati o tem, kaj počnem. Jaz razglasitvi spremenljivko sem klicala, ki določa, da je enak 0. Jaz sem nato razglasila drugo spremenljivko z imenom dolžino, ki določa, da je enak 0. Potem sem rekel, medtem ko je i-znak na vhodu ni enak posebni značaj null, \ 0, prirastek dolžine. Toda takoj, ko je i-ta lik je poseben znak, kaj se dogaja z zanko? To kratkih stikov. To ustavi, kar pomeni, da smo nato takoj vrne dolžino. Torej, če nisem nered, gremo naprej in iti nazaj v svojo terminalsko okno. Naj prevedem. In sem zajebal. Nezdružljiva ponovna deklaracija funkcije strlen knjižnice. Tako sem se trudil, da bi dobili preveč pameten za moje dobro tukaj. Prevajalnik dejansko ve, da je funkcija imenuje strlen Čeprav nismo vključeni v knjižnico. To je v redu. Karkoli. Mi smo le, da bo potem sodelovati. Naj preimenovati dolžino. Naj spremenijo njegovo uporabo na dolžino tukaj, in to bo Jek srečnejši. Naj omenim, da zato, ker so nekateri od teh funkcij, tako prekleto pogosti - strlen, prinf - morajo dejansko neke vrste posebnim statusom. In tako Jek le malo ve, kaj posebnega o njih. To ni vedno velja za večino funkcij, tako da je, zakaj sva kričala. Naj poskusim še enkrat. K sreči je delal ta čas. Torej, zdaj mi teče svojo strlen program. Daj mi niz: H-E-L-L-O, Enter. In sem zamočil. Zakaj? >> [Neslišno študentski odziv] >> Točno tako. Torej imam jaz tukaj zelo lepo je videti neskončno zanko ker, čeprav sem povečevanje dolžine na vsaki ponovitvi Kaj me očitno ne gre? Jaz nisem povečevanje. Ok. Enostavna rešitev. Ja? Ok. No zdaj bomo Zamjeriti nekatere druge skupne napake, če rabim varovala. In odkrito povedano, ta oznaka se začenjajo videti grda, Tako bomo lahko zabodel čiščenje to v trenutku. Ampak zdaj sem povečevanje tako dolžino in jaz. Odkrito povedano, sem že videl priložnost za izboljšanje tukaj, vendar bomo vrnili k temu. Torej, zdaj pa le poskrbite, da smo vsaj napreduje. To se je zgodilo nekaj od tebe, in sem zanemaril omenjam vnaprej. Ko pa imajo to nesrečo, da scenarij, kot je ta, kako to popravimo kratko ponovni zagon naprave ali računalnika ali zaprli okno? To je pravzaprav preprost. Nadzor C bo poslal tale simbol korenček C, in da samo konča večino programov. Če imate res slab neskončno zanko, ki se tiska stuff neskončno mnogokrat, Včasih boste morda morali zadeti Nadzorna C tisočkrat, da bi dejansko slišali. Torej, samo zavedaš se zdaj, ker ne bom ničesar tiskanje, ki je bilo precej enostavno. In tehnično, enkrat zadostuje, vendar sem dobil neučakan in sem ponavadi zadel to, da veliko krat. Torej strlen. Daj mi niz: Pozdravljeni. Ali bo šlo tokrat? Ok. Druga pogosta napaka. Morali ponovno prevesti. To je bilo namerno, da je eden. V redu. Torej strlen, H-E-L-L-O, Enter. Odlično. Tako imamo zdaj strlen do 5. Tako smo dobesedno znova napisan, da je kolo. Torej, zdaj pa je čisto tole, ker to ne pomeni, da sem navdušena zasnovi mojo kodo. Kaj lahko jasno odpravili v ta program, da počisti to izmislil? [Neslišno študentski odziv] >> Ja. Dobesedno smo zdravljenje i in dolžino enako. Torej, zakaj ne bi raje dobil pameten in reči, pa dolžina? Namesto tega naj samo call it dolžina za začetek, da inicializirati na 0 saj privzeto niz nima dolžine, dokler ne ugotovimo, kaj je to. Zdaj bomo to storili, zdaj je to zelo elegantno program. Ena spremenljivka. Sem ga očistiti, ga poostrili. Torej, zdaj gremo nazaj v svojo terminalsko okno. Gremo naprej in zagon tega. Naredite strlen. Izgleda dobro. Run strlen spet Enter. Daj mi niz: Pozdravljeni, Enter. In zdi se, da bodo delali kot 5. Zdaj pa mora biti jasno, če ne bi napisal, na primer, v HELLO 1 niz in potem BYE v drugi državi, lahko prav gotovo imeli več besede. Če izraz sem pravzaprav želel, da tip ni bil HELLO pa, na primer, Pozdravljen, svet, obvestilo, da tisto, kar nam ne bi bilo, je ta situacija tukaj, kajne? To bi lahko sklepali, da je to 2 strune. Lahko zagotovo znake, bar, prostor, tako da če bi dejansko vnesli v daljšem stavku kot Hello world, kaj bi res imamo v spominu izgleda malo kaj takega obstaja. V redu. Vsa vprašanja, nato pa predstavitev nizov tukaj? Ne? V redu. Zato sem prej povedal, da kliče strlen znova in znova, kot da namenoma verjetno ni najboljša ideja, saj boste, da se delaš cel kup dela spet in spet in spet. Res, kakšno delo je potrebno za ugotoviti dolžino niza, očitno? Boste morali začeti na začetku, nato pa poglej, poglej, poglej, poglej, poglej dokler ne boste končno videli, da posebni značaj, na kateri točki, ah, zdaj vem, koliko. Torej, prej, ko smo imeli strlen se je spet klicala in znova in znova, razlog, zakaj sem predlagal, da je malo butast, ker je spet, da izgleda, da je niz. To se ne bo spremenilo vsakič, ko Ponovil skozi neko zanko, tako da delaš nepotrebno delo. Hkrati pa bi morali vedeti, kot prahi, da prevajalniki, kot Jek v teh dneh so razvili v mnogih letih, prevajalnika in pisatelji, programerji, so zelo pametni. In tako se je izkazalo, da lahko Jek in drugi prevajalniki dejansko ugotovimo, da je ok, da si ti napisala strlen v vašem stanju, kar tehnično pomeni, da bi mu pravimo znova in znova in znova. Vendar pa lahko pametni prevajalniki dejansko optimizira tiste vrste slabih odločitev uporabnikov od kode za odpravo stvari. Torej ne le zavedati, da včasih prevajalnik je pametnejši od nas in bo nekakšen skriti svoje lastne napake. Ampak seveda, ko gre za problem sklopov in podobno, ne bi razmišljal o tem bistveno napačnih konstrukcijskih odločitev lahko iz preprostega razloga, da bomo opravljali tako več dela kot smo dejansko narediti. Ampak koliko več dela? V primeru Hello world, začnimo posplošiti na velikost tega problema. Kakšna je dolžina problem, ali je velikost problema ko je beseda si ga vnesli v HELLO je? To je očitno 5, 6 mogoče. Plus ali minus 1. Karkoli. To je tako blizu, da bomo samo pokliči jo 5. Torej, kaj je velikost problema tukaj, ko poskuša ugotoviti, koliko Halo? To je 1, 2, 3, 4, 5, 6 in morda za zadnji znak, vendar naj posploševati, da so n. Torej n, samo spremenljivka n, je tisto, kar bi običajno uporabljajo računalniški znanstveniki opisati obseg problema, problem pri roki, je, kako dolgo je halo? Koliko časa traja strlen? To traja o vrstnem redu korakov n, kjer je vsak korak pomeni pogled na naravo, pogled na naravo, pogled na naravo. In smo imeli to razpravo, medtem ko nazaj, število operacij, kar traja. Že prvi dan v razredu smo imeli vsi nerodno stand up, in potem vsi začeli off seznanjanje s seboj da bi se dejansko šteje idealno, koliko ljudi je bilo v sobi. In tako smo naredili še eno stvar, s katerim, če sem to storil namesto stara šola način o šele začenjajo 1, 2, 3, 4, 5, 6 in tako naprej, da je preveč, je velikost tega problema je bil velikosti n. Bilo je n ljudi v sobi. Ampak sem lahko pospeši, da se, v redu? Osnovna šola ime, da bi lahko začnemo v 2s. 2, 4, 6, 8, 10, 12. In da se počuti tako veliko hitreje, in dejansko je. To je dobesedno dvakrat hitreje, vendar še enkrat, če je še 400 ljudi, ki je vstopil v ta prostor vse naenkrat, bi ti algoritmi sprejeti še 400 ali pa 200 korakov. Ampak po drugi strani, če bi res dobil pameten in smo namesto tega vsi vi sami računajo, spomnimo, kako, da algoritem deluje. Vsi ste vstal. Dovolite mi, da hitro naprej s tem. Vsi ste vstal, si seznanjena off, potem polovica vas sedel, polovica vas sedel, pol ti sedel, in na vsaki ponovitvi te zanke iz tednu 0, smo prepolovili problem pri roki in odšel na n / 2, potem je n / 4, potem je n / 8. In posledice tega je, da če je še 400 ljudi, ki hodijo v sobo, ni nič takega, da bo nam 1 rundo, ne pa 400 več krogov, ne pa 200 več krogih. In tako se zgodba nam povedali nekaj časa nazaj je bilo narediti nekaj, kar s tem. Ta rdeča črta tukaj je linearna, to je naravnost, in je označen kot n ker je velikost problema raste, če je vaš algoritem ali program, s katerim ste reševanje traja n ukrepe, bomo lahko narišete kot ravne črte, kjer je potrebno več časa, večja je velikost problema. In twosies pristop, štetje 2, 4, 6, 8, še vedno ravna črta, samo malo bolje. To traja malo manj časa, tako da je rumena črta je pod rdečo črto točko za točko. Toda še bolje je ta sveti gral, kar smo poimenovali logaritemski čas kjer čeprav smo spet podvojilo število ljudi v prostoru, smo dvojno velikost te imenika iz prvega razreda, Nič takega, da traja še 1 stran solzo, traja 1 več sedel da bi rešili problem, ki je dvakrat večji. In tako smo zdaj dobili pogovor, da začnete ob je Kako bomo dejansko učinkovito reševanje problemov Če menimo, najpreprostejši problemi, kot je ta? Recimo, da imamo 8 vrata, za katerimi so nekatere številke, in vsak izmed teh številk ni razvrščen na kakršen koli način, oni so samo naključna cela Za temi vrati, in smo vprašati, kako si šel o iskanju številke - kdo ve - 7 Za temi vrati? Kaj bi ti, človek, ne da bi našli mi številko 7 če še enkrat vsaka od teh so vrata in videti vrednost moraš odpreti vrata? Kakšen bi bil vaš algoritem bo morda? [Neslišno študentski odziv] >> Torej, začnite z levo in odpre vrata, odpri vrata, odpri vrata. In v najslabšem primeru, kako dolgo bo trajalo, da se nam najti številko 7? In spet, oni niso razporejene, tako da to ni tako enostavno, kot dobro, bom odpreti 7. vrata. Lahko nas bo, maksimalno, 8 korakov. V najslabšem primeru, 7 je naključno na samem koncu linije vrat, zato bomo morda morali poskusiti vse n vrata. Torej, še enkrat tukaj, se zdi, da imajo linearno algoritem. V bistvu smo to naredili le nekaj let nazaj. Eden od vaših prednikov je bilo postavljeno s točno to kjer nismo imeli digitalne različice, smo namesto tega imeli tablo z nekaterimi kos papirja na njem. In tisto, kar sem mislil, da bom naredil, je na hitro pogledamo nazaj, kako je to šlo, eden najboljših in morda najbolj nenavadnih priložnosti na odru da imajo dokaz tukaj na Sanders. Imeli smo 2 niza številk. Mi smo samo še pogledati, kaj se dogaja tukaj s Seanom za sam vrh teh vrstic. Če ni nihče nikoli več prostovoljcev CS50, smo imeli blagoslov Sean je, da se to ohrani na kamero, tako, da ve, da je na stotine ljudi, so gledal to zdaj že več let. Toda Sean naredil neverjetno delo - ali kajne? - Na dejansko ugotovitev nam posebno številko. Torej, da vidimo, kako se je rešiti ta algoritem, tako da bomo spet ta pogovor kmalu kako bomo našli stvari učinkovito. [Malan na videu] sem se skriva za temi vrati številko 7, vendar spravljen v nekaterih od teh vrat in še druge, ki niso negativne številke, in vaš cilj je, da razmišljajo o tem zgornji vrstici številk samo matriko ali pa samo zaporedje kos papirja s številkami stojijo za njimi, in vaš cilj je, da uporabljate samo zgornji niz tu našli mi številko 7. In mi smo potem bo kritiko, kako iti na to početje. >> Redu. [Malan] Najdi nam številko 7, prosim. [Smeh] [Malan] No [smeh] 5, 19, 13, [smeh]. To ni trik. 1. [Smeh] Na tej točki je vaša ocena ni zelo dobra, tako da boste lahko tudi naprej. [Smeh] 3. Pojdi. Odkrito povedano, ne morem pomagati, ampak se sprašujem, kaj bi sploh razmišljal o tem. [Smeh] Le zgornji vrstici, tako da imaš 3 levo. Zato mi najdi 7. [Učenci godrnjajo] [Malan] 17. [Učenci godrnjajo] [Malan] 7! [Aplavz] Torej, v sredo bomo potopite v to in bolj sofisticirane algoritme za iskanje stvari. Za zdaj bomo pustil s Seanom in se vidimo v sredo. [CS50.TV]