[Powered by Google Translate] [Nädal 3] [David J. Malan - Harvardi Ülikool] [See on CS50. - CS50.TV] Lubage mul juhtida meid selles suunas, kus me pooleli jäime viimasel ajal mis hakkas mõtlema natuke rohkem kui umbes süntaks ja üritab mõelda veidi vähem umbes kõik Eritunnuseks et võtab natuke aega aklimatiseeruda, et seni nii semikoolonit ja sulud ja looksulg, hakata võtma asju natuke kõrgemale kontseptuaalsel tasandil nii et probleeme, millega me nüüd alustada lahendada üle järgmise mitu nädalat ei kavatse kaasata palju kõrgemat taset põhimõttelisi probleeme ja natuke vähem süntaktiliselt kui su jalad märjad ja su käed määrdunud mõned süntaks neist viimastel nädalatel. Nii et tuletada meelde, et eelmisel nädalal tutvustasime seda mõistet massiivi. Ja massiivi inglise keeles võib kirjeldada mida? >> [Kuuldamatu õpilase vastus] Vabandust? Kogumist? >> [Kuuldamatu õpilase vastus] >> Olgu, hästi. Kogumise teemad. Nii nägime massiivid Scratch. Kui teil juhtus kasutada pset 0 üks Scratch nimekirjadest, et saab tõmmata asju nagu apelsinid ja banaanide, inventari kehvasti, see on selline nagu mida massiiv on. Ja siis veel tehniliselt, seoses tegeliku arvuti, massiiv on lihtsalt külgnevas patakas mälu. Teisisõnu, teil on bait, siis teine ​​bait, siis teine ​​bait, siis teine ​​bait, ja kui sa olid juhtida neid baiti pilt, nad oleks seljad et seljad. See, mida me mõtleme piirnevad. Nii et see on bait number 1, siis 2, siis 3. See ei tähenda siin, siin, siin, siin. Massiiv on külgnevas patakas 0 või rohkem bytes. Millised on need kasulikud? Meenutagem siinkohal oli meil selline kunstlik näide ladustamiseks inimeste viktoriin palgaastmetega programmi arvutada oma viktoriini keskmine mõnda muidugi ja meelde tuletada, et me võiks alustada kirjalikult, et programm, kuulutades muutuja quiz1. Siis oleksime võinud teise muutuja nimega quiz2. Aga siis kui oli 3 viktoriinid selles klassis, quiz4. Või kui seal oli iganädalane viktoriin, oleks quiz5, quiz6, quiz7. Nii et sa oleks kõik need muutujad deklareeritakse sees peamine või kusagil mujal oma programmi, ja probleem, et lähenemine, lihtne, kuigi see on lihtsalt kopeerida ja kleepida, Kas see on lihtsalt väga kiiresti muutub kohmakas. Jumal hoidku kui tegelikult on 30 viktoriinid või 50 viktoriine. Kui see on nagu keskkooli stiili iga päev viktoriini, siis sa lihtsalt naeruväärselt pikk nimekiri muutujad deklareeritakse, ja see lihtsalt väga kiiresti kontrolli alt väljub. See on inetu, see on raske säilitada, see on nii palju lihtsam teha kirjaviga kui te saate 1 number valesti kirjutatud kusagil oma programmi. Nii et me kasutusele mõiste massiivi asemel. Ja meelde tuletada, et me ellu programmi tehes vähe midagi sellist. Lubage mul minna tänapäeva Allikas 3 Esmaspäev kataloog ja avada massiiv, mis me nägime viimast korda. Ja kuigi seal olid paar uut C trikke siin, nende hulgas mõiste püsiv, meelde tuletada, et me kuulutasime mitu ujukite sisuliselt kasutades süntaksit: float, siis muutuja nimi, siis me kasutasime kandiliste sulgudega tõesti esimest korda, ja mida me tegime sees nende kandiliste sulgudega oli tõhusalt kasutusele arv. Aga selle asemel, et number, panin selle kapitaliseeritud sõna, viktoriine. Ja mis oli motivatsioon laskmise kapitaliseeritud sõna nagu viktoriinid ja siis kasutades rida 17 trikk siin tegelikult annab see number? Mis oli motivatsioon olemas? Jah. [Kuuldamatu õpilase vastus] >> Täpselt. Kui me tahame muuta, et väärtus 2, meil on ainult muuta seda 1 koht sest kaaluma - ma isegi ei mäleta, mida see programm tegi täpselt, aga kui sa lihtsalt koorima see näed viktoriinid, küsimustikud. Näed viktoriinid, siia alla veel TESTID. Nii et kui meil ei oleks seda pidevat, seda kasutada teravaid määratleda, oleksime tipitud 2, siis 2, siis 2, siis 2 kohta, mis on hea. Oleks nagu õige. Aga oletame, et järgmisel aastal on meil 3 viktoriinid CS50. Nii et ma pean minema ja ajakohastada kood, mul on kompileeri see, kuid probleem on, kui ma teen midagi rumalat, nagu ma unustada 1 mainitud 2 ja unustage pistikut 3, võiks kogu projekt väga hästi murda. Nii et me lihtsalt paludes hädas. Nii et mõiste püsiv on kõike faktooring välja mõned tükk andmed, kas see on string või char või ujuki või mis iganes, ja kuulutas selle 1 koht, et saaksite kergemini muuta tulevikus. Ja see on ka ausalt öeldes natuke lihtsam lugeda, sest kui sa mõtle selle nüüd, see on viktoriinid, või me võiks isegi nimeta see midagi NUMBER_OF_QUIZZES või midagi selgemaks. Koodi lihtsalt muutub veidi ilmselge, et mida ta teeb, ja sa ei tea, veidi vähem, mida number 2 võib juhtuda, et mõtlen. Nii et pidev polnud midagi teha põhimõtteliselt massiivid. Massiivi võeti kasutusele viis nende kandiliste sulgudega. Nii märkate, et rida 23. palume kasutaja, "Millised olid teie viktoriini skoorid?" Siis me lihtsalt peame selle ahela, mis ilmselt küsib kasutajalt nende klassid. Kuidas? See kordab 0-2. Ja ma ütlen, 2, sest viktoriinid kõik mütsid on praegu 2. Seega kordab 0 kuni 2 ja siis prindib välja Viktoriin # midagi millestki, ja siis ta kasutab GetFloat saada raha kasutaja. Nii märkate see on ainus uus tükk süntaks eelmisel kolmapäeval. Kui soovite salvestada midagi kindlat asupaika selles massiivis, sa uuesti kasutada nurksulgudes. Nii et seal on natuke dihhotoomia siin. Esmakordsel kasutamisel nurksulgudes te kasutate seda täpsustada, kuidas suur soovite massiiv olla. Aga see järgmises kontekstis siin, kus me jälle tööle need nurksulud tähendab, kui selles massiivis sa tahad panna mõned raha? Ja vahet siin saab tuletada konteksti. Teade meil siin andmetüüp, siis on meil nimi muutuja, siis oleme meie kandiliste sulgudega mitmete sees, semikoolon. Nii see on. Nii et deklaratsioon. See on lihtsalt nii, nagu oleksime teinud midagi float Grade1; float Grade2; kuid ka see väga kiiresti devolves liiga palju kopeerida, kleepida, Nii et selle asemel me lihtsalt lihtsustatud teda sellisena, mis tähendab nüüdsest on meil klassis, et võib hoida sulg 0, meil on teise klassi, et võib hoida 1 rühma, Aga kui ma tobu ja näiteks minu loop läheb nii kaugele - Näiteks, ma teen seda väiksem või võrdne, mis meenutavad oli allikas eelmise bug - mis tegelikult tähendab, et mõned kolmandad juhusliku iteratsiooni Selle ahela Ma kasutan Rühma 2. Tõhusalt, mis võib juhtuda siin? Vabandust? [Üliõpilane] See saab välja vahetada. >> Kas see saab asendada? Mis oleks asendada? See sõna otseses mõttes ütleb asendada, mida on koht 2 koos tagastatav väärtus GetFloat. Aga probleem on, kui suur on massiiv siinkohal lugu? [Kuuldamatu õpilase vastus] >> massiiv on ikka ainult suurus 2 sest massiivi, nagu iga muutuja, kuulutati esimene, enne kui me seda kasutanud, ja me siin määratud, sest see konstant, mis mul on 2 klassi, et ma lähen üles. Kuid pidage meeles, arvuti teadlased alustada loendamist 0. Nii et esimene asukoht selles massiivis on sulg 0. Järgmine koht on 1. See asi on kunagi nii veidi liiga kaugele üle poole. Nii et teiste sõnadega, kui ma tegelikult oli see massiiv - ja las ma vaatan, kui hästi see teeb siin meie jaoks - kui mul on array, et ma olen lihtsalt tõmmata järgmiselt ja ma olen eraldatud ruumi 2 elementi, ma võin teha seda niimoodi mälu kus see suur valge lõuend on. See on lihtsalt RAM Mul on minu arvuti, kaarik RAM, 2 kontserti RAM, mis iganes, kuid need 2 teemat nüüd eraldi esindavad float, 32 bitti. Nii et kui ma panen 1 number siin nagu 1.0, siis panin teisele numbrile siin nagu 3,2 aga siis ma sulg 2, mis on nagu hakanud siin midagi. Ja kui oletada, seal pole enam midagi. See on omamoodi nagu eikellegimaal, sest ma pole küsinud operatsioonisüsteemi mulle see kolmas viktoriini. Kui ma tahan, et kolmandad viktoriin, ma oleks pidanud ettevaatust küsida operatsioonisüsteemi jaoks see, kuulutades TESTID olla mitte 2. kuid selle asemel väärtus 3. Nii et teiste sõnadega, pilt, et me tegelikult olema käepärast näeb välja selline siin. Seegi on eikellegimaal. Me parem mitte proovida kirjalikult väärtused siin. Aga jälle, sest arvuti teadlased loota 0, kui me räägime selle asukoha massiivis, mis pidi olema asukoha 0, see peaks olema koht 1, ja seda isegi ei eksisteeri sest me ainult küsis operatsioonisüsteemi 2 sellistes kohtades. Nii neile, kellel eelnev programmeerimise kogemus teiste keelte võiksid teada, et see ei ole alati nii massiivid või asju nimetatakse vektoreid. Pigem saab lihtsalt hoida lisades ja lisades ja lisades asju massiivid mis ausalt öeldes oli meil see võime Scratch ja veel näib, et oleme teinud selle siin üleval sest koos C, mis on programmeeritud palju selgemalt. See on ainult sinu ja arvuti just nüüd, ja arvuti on ainult kavatse teha mida sa öelda tahad. Nii et kui sa ainult ütle seda sulle 2 ujukite teel eelarverida 22 siin, see on kõik sa lähed, et saada tagasi operatsioonisüsteem: ruumi 2. Nii järjest on oma programme saab mõnikord olla lollakas seoses massiivid. See on lihtsalt omamoodi iseloomu metsaline, millega me kõik oleme ekslikud, ja mingil hetkel sa väga tõenäoliselt indeks üle piiri oma massiivi. Ja see on ainult fancy viis öelda teile läks sulg midagi ja midagi oli lihtsalt liiga suur arv. Sa läksid piiridest oma massiivi. Aga tagurpidi nüüd on see. Ülejäänud see programm tõesti on midagi fundamentaalselt pistmist massiivid. See kõik on lihtsalt mõningate lihtsa aritmeetilise andmetöötluse keskmised. Nii et meil on siin jaoks silmus siin esimesena muutuja nimega summa, et me initsialiseerida kuni 0. Siis me kinnitada, 0 kuni 2 uuesti ja me lisame selle liitmise muutuja nda klassi, nii sulg 0, siis bracket 1. Ja siis kui sa teeksid algkool arvutada keskmine, me lihtsalt võtta see summa jagada see koguarvust viktoriinid, ja siis hea meede me nimetame funktsiooni siin nimetatakse ringi. Nüüd, kui kõrvale, mida on tegeleda selle Sulgudes int real 34? See võis tulla juba punktis, ei ole tegelikult rääkis ta ametlikult siin, aga mis see int sisse Sulgudes ilmselt teed? >> [Kuuldamatu õpilase vastus] Jah, see viitab valu või typecasting, mis tähendab, võttes 1 andmetüüp ja muundab selle teise. Sa ei saa seda teha kõik andmetüübid, sest mõnikord oleks natuke imelik. Aga sel juhul, kui tagastatav väärtus ümmargune on float sest lõppude lõpuks, ma viin Ujuk ja jagades selle arvu nagu 2 Ma lähen, et saada tagasi sularahaga. Aga algkool inimesed tõesti ei tahaks teada, et nende keskmine oli 93,4 sest nad taipavad nad olid kunagi nii lähedal, et 95 ümardamise punkti. Nii et me tahame selle asemel kasutada int ümardada kõik lähima int, mis antud juhul saab olema 94 pole mõtet pärast seda. Nii et see on lihtsalt väike matemaatiline trikk. Ja me tuleme tagasi selle mõiste valu, sest see mõjutab, kui te ei ole avastanud juba, sest probleem komplekt 2. Nii massiivi siis sa ei mõtle - see saab teha mind naeratama kogu päeva. See näeb välja selline, kui sa joonista pilt sellest, kuid põhiline on see, et suurus on ka Teie poolt valitud kui sa taotleda seda operatsioonisüsteemi. Kõik küsimused siis massiivid? Jah. [Kuuldamatu õpilane küsimus] Ah, hea küsimus. Küsimus on, mis juhtub null 0 massiivi? See ei ole selles kontekstis. See eksisteerib vaid kontekstis stringe, mis me oleme peaaegu jõudnud vaid hetk. Aga massiiv, nagu käesolevas asjas, kõik mida sa saad, mida sa küsida operatsioonisüsteemi. Ja kui kõrvale, muidu see jääb ebaselgeks, Hoian öeldes küsite operatsioonisüsteemi, küsi operatsioonisüsteemi. Operatsioonisüsteemi, nagu te ilmselt teate, on Mac OS, Windows, Linux. Kui olete helistaja funktsioone nagu GetFloat või olete kuulutatakse muutujaid nagu klassid, lõpus päeval olete tegelikult küsib keegi teile, et mälu sest me ambitsioonikaid programmeerijad pole aimugi, kuidas tegelikult saada füüsilise juurdepääsu mälu. Aga keegi ei: operatsioonisüsteemi. Nii et lisaks esitab meile päris ikoonid ja menüüd ja kataloogid jms et näete töölaual, kas Mac või PC, operatsioonisüsteemide teha ka madal Ilmalik asju, väga tehniline kraam juhtimise GB või 2 GB mälu, et sa pead, haldamise CPU, et teil on, ja nii edasi. Nii et kui olete kirjalikult koodi, sa oled tõesti kinnihakkamine sisse oma operatsioonisüsteemi selles mõttes. Ma lähen, et vähendada seda. Hea küll. Muud küsimused massiivid? Ei? Okei. Nii et üleminek loomulikult massiivid on tegelikult teema, mis on natuke tuttav. Ja me vaatasime kunagi nii lühidalt see viimane aeg ka. See oli string näiteks alates kolmapäevast. See string näide oli üsna lihtne programm, ja ma olen tegelikult lihtsustatud talle paar rida tänapäeva eesmärkidel. Kõik see toimub rida 19 on saada stringi kasutaja, salvestab selle muutuja nimega s. Siis eelarverida 22 aastast see on ilmselt trüki et string 1 märk rea kohta. Aga kuidas seda teed? Me kuulutab muutuja i, millega ta võrdne 0, ja see on muutumas vana harjumus nüüd. Me ei näinud seda kuni kolmapäeva, kuid võite liiki järeldavad oma nimi strlen lihtsalt tagastab mida manustamisel s? Stringi pikkusena. Nii et kui ma mööda seda jada, tsiteerin-Tsitaat lõppeb DAVID, see on loodetavasti läheb tagasi minu number 5, sest David. Nii et tema eesmärk elus on võtta nöör, kas kõva kodeeritud te või antud juhul ühendatud nagu muutuja, argumendina, ja see nuputab mida pikkusega, et string on. Nii et siin nüüd oleme laenates mõned märke eelmisest viktoriin näiteks. See on midagi pistmist ujukite, ei ole midagi pistmist viktoriinid, aga tuleb välja, et väike valge vale oleme teile rääkinud alates 1. nädal on see, et string tegelikult ei eksisteeri C. Stringi lõpus päev on tõesti ainult massiivi. See on baidimassiivi, nii bait, bait, bait, bait, mis meenutavad asub vaid 8 bitti, nii tüki mälu, patakas mälu, patakas mälu, patakas mälu. Ja mille abil string rakendatakse on pannes esimene märk siin, siis siin, siis siin, siis siin, seljad et tagasi arvuti mällu. Nii et kui sa tahad täpsustada sõna tere, te paneks 1 märk H, siis E, siis L siis L, siis O - 5 tähemärki kokku - kusagil oma arvuti RAM. Aga võti detail on see, et nad ei kavatse olla seljad et seljad, õige üksteise kõrval. Kui kui ütlen s [i], mis inglise keeles on see annab mulle? Mis s [i] esindama antud juhul? Jah. [Üliõpilane] nda märgi string. >> Täpselt. Nda märgi string. Nüüd ma ei kavatse hakata 0 nagu ühe minu jaoks silmus siin, aga see on hea, sest kõik hakkab lugedes 0. Nii s [0] läheb esindama kirja H sõna nagu HELLO, s [1] läheb esindama kirja nagu E ühesõnaga nagu Tere ja nii edasi. Ja mis meil tundub, et teeme iga iteratsiooni Selle ahela on ajutise ladustamisega nda märk muutuja nimega c, mis on lihtsalt char, ja siis me väljatrükk c nii et lõpus päeval, mida see programm teeb, on järgmised. Kui ma minema allikas kataloog ja teen string1 ja ma edasi minna ja käivitada string1, ja siis ma kirjutades sõna nagu HELLO, Enter, kõik see on trükkida seda 1 täht korraga. Nii et seal on võimalus täiustamise siin. Ma olen selline tehes rohkem tööd, kuigi see on rohkem selge võibolla sel viisil, kui vaja. Mis rida koodi siin ma saan tõenäoliselt visata kokku? Jah. Rida 24. Kooskõlas 24 Ma olen kuulutab muutuja c. Ma ladustamiseks nda iseloomu s, aga siis ma kasutan c siit. Nii et ma kasutan c, nii et ma tunnen, et ma ei saa lihtsalt visata Rida 24 ära. [Kuuldamatu õpilane kommentaar] >> Täpselt. Nii et kui tegemist on rääkinud disaini programmid, märka seda väikest lihtsustamine kood, mis on sama loetav, aga aru, et s on lihtsalt muutuja, selle andmetüüp on massiiv, nii s [i] lihtsalt läheb koheselt tagasi teie nda märk, et string. Ja kui sa tahad seda trükkida, siis hästi. Sa pead lihtsalt kasutama% c sest sa ei trüki string, te prindite märk string, ja see liiga mõjul trüki-nda iseloomu. Ja meenutada ainus erinevus tõesti eelmisel nädalal koos kasutades printf on see, et samas nädalat varem, siis midagi super lihtne nagu% s kohatäide siis nimi string siin, nüüd oleme sukeldudes natuke sügavam all kapuuts ja ütleb, ei prindi string; printida ühe märgi seal. Nii et me saame teha midagi veidi teistsugune siin, sest seal on veel 1 inimene - ei vea sest see programm on õige, kuid ma teen midagi rumalat et mainisin lühidalt kolmapäeval. Aga mõtlesin tagasi, kuidas saaks seda programmi disain paraneb veelgi? Jah. [Kuuldamatu õpilase vastus] >> Oh, hea. Nii et tuletada meelde, et võtsime kasutusele teise muutuja nimega n viimane kord, mis tundub olevat vastuolus ise, sest minu eesmärk sekund tagasi oli lihtsalt ära visata muutuja tarbetuks, aga meelde tuletada, et kolmapäeval me tegelikult tegime seda. Muutsin jaoks silmus tegelikult on koma siin, siis n = strlen, ja siis siin tegin ma > [Kuuldamatu õpilase vastus] >> Täpselt. Ma ei meenutades strlen uuesti ja uuesti ja uuesti, sest meenutada, kuidas loop töötab. Isegi kui nad hakkavad saada keerulisem ilmega, Tuletan meelde, et asi enne esimest semikoolon on initsialiseerimise, mis juhtub kord. Tingimus on aga keskel, ja seda saab kontrollida iga kord, kui minna läbi silmuse. Nii et see on selline loll, et küsida arvuti sama küsimus ikka ja jälle - Mis on pikkus Halloo? Mis on pikkus Halloo? Mis on pikkus Halloo? - sest nagu me näeme täna ja kolmapäeval, see on kindlasti läheb aega, ja see ei ole väga hea kasutada aega, sest aru saada, pikkus string tegelikult võtab veidi pingutust. See ei ole hetkeline, sest see on mõnes keeles. Nii muutes selle n, hind ma maksan on mis? Me näeme kompromiss siin. Ma saad säästa aega ei palu sama kuradi küsimus ikka ja jälle, kuid see läheb mulle maksma midagi, mis on mis? [Üliõpilane] Sa kaotad teatud mäluhulk. >> Täpselt. See läheb maksma mulle mällu. Nii et antud juhul see maksab mulle mida? Teine 32 bitti, sest n on lihtsalt int, nagu võiks eeldada sõna int siin. Aga kas see sobib? Ausalt, see on ilmselt kõik korras, sest kui sa mõtle selle peale, enam string on, rohkem aega ma lähen raiskad sest strlen ei hakka nimetatakse uuesti ja uuesti ja uuesti iga iteratsiooni silmus. Ja nendel päevadel, minu Mac on 2 kontserti RAM, nendel päevadel 4 kontserti RAM mõnikord. Ma arvan, et võin saada 4 nimetatud baiti tegelikult kiiruse asju üles. Aga see saab olema kompromiss ja teema tõesti programmeerimise ja infotehnoloogia ja kunagi tõesti saada midagi tasuta. Kui te soovite parandada midagi siin, sa pead selle eest maksma ka teisest küljest kuidagi. Space versus aeg sel juhul. Nii et see oli kõik, mis viivad suunas midagi segasena nagu see, mis, nagu te ilmselt aru saanud, nüüdseks on tegelikult ütleb? [Kuuldamatu õpilase vastus] >> Jah, nii see on, kindlasti juua oma Ovaltine, tegelikult kasutatakse algoritmi nimetatakse ROT13, mäda 1-3, mis tähendab lihtsalt pöörlema ​​kõik tähed 13 kohta, mis tähendab võtta ja seejärel lisada 13 kuni see ja minna dot, dot, dot kõik viis 13. kirja ära, tehke sama asja B ja C ja D jne. Ja kui me tegelikult teisendada see siin kasutades nihe 13 kohta, me võtame mida vähe Ralphie oli, mis oli, kindlasti juua oma Ovaltine. Aga nüüd probleem seatud 2, Standard Edition vähemalt sa pead selline ei see enciphering ise, ja me peame kuidagi võtta sisend niimoodi ja krüptimiseks või lahti krüptida. Nii et milline neist põhialuste omamoodi viib meid selle võimaluse? Võtame pilk see kolmas näide siin. Esiteks, seda nimetatakse ASCII. Mis ASCII naasta? American Standard Code infovahetuse, mis on tõesti pikk viis öelda mida? Mis on ASCII? [Kuuldamatu õpilase vastus] >> Mis see on? >> [Üliõpilane] Character Map. >> Iseloomu kaart. See lihtsalt kaardistas numbrid tähed, sest maailm on standardiseeritud Mis numbrid esindavad milliseid tähti, nii et kõik meist ei saa kasutada arvuteid ja meie programmid kõik on lihtsalt ühilduvad, kui tegemist on väljatrükk asjad ekraanil. Nii meenutada, et 65 juhtub esindama, 97 juhtub esindama väiketähtedeks. Ja nii see lihtne programm siin ASCII on ära asjaolu - et maailm teab, et kapitali on 65 - ja see on lihtsalt printida kaardistamine. Nii et enne kui me sukelduda sellesse koodi, las ma selle asemel avada terminali aknas. Lubage mul minna ja teha ASCII, ja siis lähme lihtsalt käivitada see asi lihtsalt ära rikkuda väljund. Ja ta lihtsalt teeb seda: tõesti suur skeem, mis lihtsalt ütleb mulle kõik erinevad koodid kõigi erinevate tähtedega. Nii super lihtne programm, aga ma ei pidanud kõvasti kood need 52 rida väljund: 26 suure algustähega, 26 väiketähti. Selle asemel, ma tegin seda programmiliselt koos paari silmuseid. Pange tähele, mida ma tegin siin. Ma itereerida alates i on 65 kuni 65 + 26 sest ma tahtsin välja printida 26 tähte inglise tähestik, i + + iga iteratsiooni, ja nüüd märgata seda uuesti. See kordub meie sõber typecasting millega teil teisendada 1 andmete liigist teise sest see, mida ma tahan teha selle konkreetse programmi? Tahan loota numbriliselt, sest see on, kuidas ma üles kasvasin loendamine - 65, 66, 67, ja nii edasi - kuid ma ei taha printida lihtsalt numbrid. Kuidas printida täht, millele järgneb number. Kuidas printida: number, B: number, aga ma ei tee seda sama täpne muutuja. Nii et ma välja printida% c kui kohatäide iseloomu, % D nagu kohatäide kohaline või number. Siis mida ma ühendan need 2 kohatäited? Ma esimest pistik iseloomu samaväärne i, ja siis ma välja printida i ise. Nii märkate ka see lihtsalt toimib. Nii nagu ma ei valatud ujuk int et minna reaalne number täisarv, siin võin minna int et char, mis on natuke imelik - ei ole päris map peale reaalses maailmas - kuid arvutid char on lihtsalt number all kapuuts, nii me oleks kunagi nii selgelt siin arvuti, öeldes: printf, välja printida ei I 65, prindi see välja nagu oma numbriline ekvivalent. Ja selgub, ma tehniliselt ei pea isegi seda. Mida ma tegin hetk tagasi selgesõnaliselt casting täpsustades, milliseid andmeid tüüp ma tahan minna ja. Aga teate, et mul on juba see kohatäitja% c ja see teine% c kohatäide siin. Kuigi see ei ole int, arvuti mõistab, et char, see on lihtsalt int all kapuuts. Nii et kui ma tegelikult kompileeri see ja uuesti ASCII programmi märka seda veel lihtsalt toimib, sest arvuti saab aru, et seal on see kirjavahetus. Nüüd, see on tähtsam teha selgesõnaline casting maailmas ujukite et ints sest sa oled tegelikult teeb arvutatud otsus: visata kõik peale koma. Siin on tõesti midagi ära visata, sest iseloom on lihtsalt number, ja string on lihtsalt massiivi tähemärki. Nii et kui on aeg rakendada mõned krüpteerimist või dekodeerimiseks, kuidas on võimalik, et me saame tegelikult tõlkida midagi sellist jama, Kindlasti joo oma Ovaltine? Mis siis, kui me teame praegu - võtame näiteks eeldus - et võti, number, et me pöörlevad kõik need tähed, mida on number 13? Nii et me läksime B täht kõik viis O alguses lause, Kindlasti joo oma Ovaltine, sest kui ma B ja siis ma lähen C, D, E, F, G, H, I, J, K, L, M, N, O, sellepärast krüpteerida B täht muutub O sest ma lihtsalt aeg 13 kuni see. Nii et kui ma tahan lahti, ma sisuliselt võtma O ja lahutage 13 alates ta. Või ausalt öeldes, sest seal on 26 tähte tähestikus on see suurepäraselt sümmeetriline, saame ka lihtsalt lisada 13 ja me jõuame tagasi kirja B. Aga kuidas sa minna rakendamise midagi sellist Caesar või tõesti stringide üldiselt? Kui B täht on millises koguses? Mis on B täht? Nii et see on 66, eks? Nii et kui kirjas on 65 ja B täht on 66, nii 66, kõik mida ma pean tegema, on lisada 13, ja see annab mulle 79. Ja kui me läheme meie väike cheat sheet, 79 tõepoolest kaardid peale O. Aga seal on natuke nurgas asjas. Mis on, ütleme, täht Z? Kui me teeme 66 + 25, et saada kõik viis lõpuks tähestikku, me oleme 91. 91 + 13 annab mulle 104, ja guess what? 104 ei võrdu suure tähega. Lähme tagasi vähe petma lehte siin. Kui ma uuesti, see programm seade, teate, et 104, kui ma lähen tagasi terminali aknas 104 ilmselt väiketähti h. Seega peame mõned olulised trikk siin selleks, et veenduda, et kui me alustada Z ja lisame 13 see me ei taha lihtsalt hoida sepistamine edasi kuni suuremaks numbrid. Mida me tegelikult tahad? Sa tahad ümbritsev. Nii selgub, kui oled näinud ilmselt jaos nüüd või lahendamist spec ise aru, et seal on see teine ​​operaator C, mis samuti on protsendimärk, kuid samas oleme kasutanud% siin täpsustada kohatäide, tean, et eriti probleem komplekt 2, seal on ka midagi sellist: int x = y% z. Lubage mul esitada see nagu väga üldine vorm sellest. Protsent tähendab see, mida programmeerimiskeelt? >> [Üliõpilane] Modulo. Modulo, mis on fancy viis öelda ülejäänud. Kuigi seal on kerge vahet määratlusele seal, See tähendab jagada y z, kuid ei tule tulemus, et jagunemine; selle asemel, tagastab ülejäänud. Nii et kui y on tegelikult 3 ja z on tegelikult 2, 3 jagatud 2 on 1, ülejäänud 1 Mis siis x tegelikult võrdne selle stsenaariumi? 1. See on nii lihtne, madala idee. See võtab natuke aega, et su meelt pakitud ümber sest see on ilmselt olnud mõnda aega, kuna sa pidid isegi hooli jääki ja tegelikult kasutada neid midagi sihikindel, kuid sel juhul faktiga, et võite minna suur hulk nagu 3 suhteliselt väike arv nagu 2 ja seejärel murtakse tõhusalt kasutades ülejäänud väiksema väärtusega nagu 1 saab olema hindamatu trikk et saame kasutada nii midagi Caesari ja see teine ​​asi Vigenere Probleemse seatud 2, kuid see saab olema korduv trikk kogu semestri. See lihtne, lihtne idee lihtsalt võttes ülejäänud üldiselt läheb võimaldavad meil ümbritsev. Ja kui me hakkame mängima rohkem massiivid, nagu me mängima hakata rohkem mäluga ise, see läheb üha enam ja enam võimas trikk. Nii tekib küsimusi siis ASCII või esindatus stringid massiividena? Ja me võtame ta üles 1 pügala edasi. Jah. [Kuuldamatu õpilane küsimus] >> Hea küsimus. Mida see tähendab, kui muutuja on tärn ees on? Lubage mul edasi lükata vastates, et iga detail, aga mis viitab teema tuntud pointer. Näiturid pistmist mälu, ja me tegelikult täna võttes esimene samm, et arutelu, kuid nüüd, las ma teeselda, et täht ei eksisteeri ja me jätkame helistades stringid stringid asemel char *, mis te olete ilmselt näinud ja ma panen ekraanil vaid üks hetk, teaser. Nii et me tuleme selle juurde tagasi viis detailsemalt kui paljud teist ilmselt meeldib. Lõpuks, täna mitte. Jah. [Kuuldamatu õpilane küsimus] Mis kontekstis sa pead andma märk iseloomu? >> [Üliõpilane] Jah. Seega vaikimisi, kui sa ei pane +, lihtsalt positiivsed arvud võetakse. Nii et kui lihtsalt kirjutage number 1, see on positiivne 1. Kui te tegelikult soovite määrata eitus väärtus, sa sõna otseses mõttes pead tegema -1 klaviatuuril. Aga see ilmselt ei ole oma küsimusele. >> [Kuuldamatu õpilase vastus] Hea küsimus. Okei. Nii et see on pistmist, ma kogun, mingi bug sa sattus sest sa olid konverteeriva täisarv iseloomu, aga kuidagi negatiivsuse sai kaasatud, ja nii iseloomu lihtsalt tuli välja munged kuidagi. Nii et nüüd, las ma lihtsustavad natuke kuni me tuleme tagasi selline teema. Praegu mõtleme asjad nii - ja see on järeleandmisi. Aga maailmas on täisarv, siis on mitu bitti teie käsutuses? Sul on 32 bitti. Ja seni oleme rääkinud koguarv täisarvu saab seega moodustavad on umbes 4 miljardit kokku, sest sul on 32 bitti, nii et on 2 kuni 32, nii et on ligikaudu 4 miljardit eurot. Aga me nägime nädal või 2 tagasi, et sa tõesti ei ole numeratsiooniala 0 kuni 4 miljardit eurot. Vahemikus asemel läheb umbes negatiivne 2 miljardi positiivne 2 miljardit eurot. Aga see siis tekib küsimus, kuidas te esindate mõiste negatiivne 2000000000 rääkimata miinus 1? Praegu saame lihtsustavad ja lihtsalt öelda, et me ei kavatse kasutada vasakpoolsema natuke Nende 32 bitti, ja kui see on 1 see on negatiivne arv, ja kui see on 0 See on positiivne arv. Probleem, et lihtsustatud esitus negatiivsed arvud on see, et kui sa olid teadlikult oli tark ja üritab teisendada märgi number või vastupidi, seal ei ole sellist asja nagu negatiivne märk. Tänapäeva maailmas ASCII, mis kasutab ainult 8 bitti, kõik 8 neist bitti küsimuses ja kõige vasakpoolsema natuke on midagi pistmist negatiivsus. Ja et asi selge oleks, kui ma ütlen, kõige vasakpoolsema biti, meelde tuletada, et kui me tegime oma natuke seotud näiteid esimesel nädalal meelde tuletada, et me juhtis asjad 1001101, midagi sellist. Kui ma ütlen, kõige vasakpoolsema biti, ma lihtsalt sõna otseses mõttes tähendab 1, et sa kirjutad kogu tee üle vasakule. Nii maailmas tähemärki puudub mõiste negatiivsus, nii et vasakpoolsed natuke tegelikult on midagi pistmist ASCII, midagi pistmist negatiivsus. Nii et see kõlab - ja kontekstist välja on raske vastata täpselt - aga millegipärast oma kood oli segane, et kõige vasakpoolsema natuke esindab negatiivne väärtus kui see tõesti oli osa karakter küsimus. Ja jälle, ma olen Oversimplifying sest arvutid tegelikult midagi veidi Kasvataja kui lihtsalt muutuvas et vasakpoolsema natuke 1 miinusmärgiga versus 0. Nad asemel, kui sa oled uudishimulik Google, kasutage midagi tavaliselt nimetatakse 2'e täiendus, mis on natuke keerukam ning lähenemine kuid mõte on lõppkokkuvõttes sama. Nii lühike, see oli pistmist seda, et sa olid massaging number iseloomu või vastupidi, kuid oma koodi ei olnud teadlik asjaolust, et 1 neist bitti oli tähendus numbriline maailmas. See ei ole juhtum märk maailmas. Aga see kõlab nagu te kindlaks, millisel juhul Mõõt nüüd. Muud küsimused. Okei. Nii et seni, kõik programmid oleme kirjaliku võtnud sisend võibolla kasutaja kujul funktsioone nagu GetInt, getString, või kui oled olnud lugemist edasi mitmesuguste raamatute või interneti viiteid, te ise olete kasutanud funktsioone nagu scanf mis ausalt öeldes me kasutame CS50 raamatukogu. Aga nädal või 2, siis me tegelikult näitab teile, kuidas CS50 raamatukogu rakendatakse nii et saame need abirattad ära täielikult. Aga selgub seal on teine ​​moodus saada sisend kasutaja. Tegelikult oleme ise kasutanud käsurea argumente jaoks paar nädalat nüüd. Iga kord, kui me jooksime rõkkama või oleme perspektiivis muuta, me ei ole lihtsalt kirjutada rõkkama, Enter, me ei ole trükitud teha, Enter. Mida oleme tavaliselt kirjutatud sõna rõkkama meie terminali aknad kiire? [Üliõpilane] faili nimi. >> Faili nimi, eks? Hello.c või mario.c või mis iganes vastava faili nimi on. Ja selles mõttes, mida olete tegelikult teinud on sul mõjutavad käitumist rõkkama sest kindlasti inimesed, kes kirjutas rõkkama polnud aimugi, et veidi vana sa pidi kirjutama programmi nimega mario.c aastat hiljem. Seega pidi kuidagi mõjutada käitumist, et programmi ja et programmi rõkkama pidi olema kirjutatud nii, et ta seda aktsepteerib kasutajapoolset lisades sõnad küsi enne kasutaja tabamust Enter. Nii tuleb välja, et juba mõnda aega oleme kuulutatakse peaaegu kõik meie programmid alustada niimoodi - int main (void) - ja siis oleme läinud edasi ja hakkas kirjutama oma koodi. Ja meil oleks mõned teravad sisaldab ülaosas faili kuid peaaegu kõik meie programmid seni on hakanud seda kuigi sa võisid näha jaos, raamatutes, internetis viited et see tegelikult ei pea olema tühine. Teine õigustatud kujul seda võtta on int argc ja siis string argv []. Nii et nüüd, mida see tähendab? Selgub, et argc, mis on inimese konventsioon - võid helistada see suva, aga see oleks lihtsalt palju vähem selge lugejale - argc lihtsalt on argument, et funktsioon nimega peamine, mis tähistab mis? Mis argc seista neile tuttav? [Kuuldamatu õpilase vastus] >> Jah, mitmeid argumente või argument loota. See on nii lihtne. Kui palju argumente edasi selle programmiga? Mida see tähendab? Kui anda käsureal Mul on käivitada midagi sellist - rõkkama mario.c-- argc kui ma Enter läheb võtma väärtuse, veidi eksitavalt, 2. Nii selgub, et argc on argument loota, kuid ajaloolistel põhjustel, programmi nimi ise kuulub, et loota. Nii argc on 2, kui ma kirjutasin rõkkama mario.c. Mis argv sisaldab? Esiteks argv välja näeb string kuid mitte päris sest nagu eelmisel kolmapäeval ja veelgi täna, need nurksulud tähistavad mida? See on massiiv. Pole mingit numbrit massiiv, ja et tuleks mõtet intuitiivselt sest inimesed, kes kirjutas rõkkama aastat tagasi kindlasti ei olnud aimugi kui palju sõnu inimesed nagu meie oleks tüüp käsureale enne löömist Enter. Nii et antud juhul siin nad on deklareerinud funktsiooni main nagu võttes hulga argumente, 0 või rohkem argumente. Nad ei tea ette, kui palju seal on, nii ei ole esitatud number sees need nurksulud. Kuid tõsiasi, et nurksulgudes on seal räägivad arvuti, oodata massiivi. Argv on lihtsalt stenografisti märke argument vektor. Vektor on fancy viis öelda massiiv, ja massiiv on fancy viis öelda nimekirja või kogumist. See lihtsalt tähendab, et kui sa kirjutad peamine niimoodi asemel meeldib, kuidas me oleme teinud seda juba viimased paar nädalat, Teie programm on nüüd õigus aktsepteerida käsurea argumente nii et enam sa pead kirjutama Mario ja vajuta Enter, siis kirjuta number, mitu plokki kõrge soovite püramiid olla, vajuta Enter uuesti. Me isegi ei pea kasutama getString enam või GetInt või GetFloat selles küsimuses. Me ei saa lihtsalt oodata, kasutaja tüüp need sõnad käsureale ise nagu autorid rõkkama otsustas, et oleks tõesti tüütu programm kui kompileerida koodi te esimest korda trükitud rõkkama, Enter, siis me ütlesime, et kasutaja, siis tippige faili nimi, mida soovite koostada, siis kirjuta mario.c ja vajuta Enter. Aga see on täpselt see, mida oleme teinud meie kasutajatele viimase paari nädala jooksul. Me kasutame getString ja me ootame, kuni programm töötab ajendab neid sisend. See ei pea enam olema. Nii et selles näites siin, meil on nüüd string argv, ja ka see on järeleandmisi, Apupyörät et peagi maha tulla. See on rohkem õige kirjapilt see alternatiiv deklaratsiooni peamine sest selgub, et see, mida me hoiame helistaja string tegelikult on täht, Tärniga oma tegelikku definitsiooni, kuid see lihtsalt tundub keeruline, see on segane alguses, nii et me lihtsustada poolt lihtsalt luua sünonüüm kehvasti aastal CS50 raamatukogu, mis kaardid char * selle kasutajasõbralikumaks sõna string. Nii et olgem tegelikult proovida seda siis. Lubage mul minna ja avada gedit siin. Lubage mul minna ja avada argv 1. See programm ilmselt prindib argumendid, kuid ingliskeelsetest sõnadest, vaadates seda koodi, mida see teeb täpsemalt? Kui ma kirjuta käsk a.out foo bar, mida saab trükkida minu must ja valge aken? A.out foo bar, Enter. Lase käia. Jah. >> [Kuuldamatu õpilase vastus] Hea. Nii a.out, uus liin, foo, uus liin, baar, uus liin. Miks see nii on? Me ei saa kindlasti kinnitada vaid hetk. See on selline kohev rida koodi.  See lihtsalt trükib uus liin lihtsalt teha asju ilusamaks ekraanil. See on silmus, mis on itereerimise 0 kohta kuni argc, ja see on incrementing iga iteratsiooni + +. Nii et see on nüüd ütleb printida string Nagu võib järeldada seda% s. Argv [i] on päris palju sama mõte eelmisest näitest. Me tavatseme muutuja s, nüüd nimetatakse seda meelevaldselt, argv. See tähendab printida nda argumendi, mis oli kirjutatud käsureal, ja siis pärast kogu see asi on tehtud, lihtsalt hea meede printida üks uus rida. Nii et vaatame seda. Lubage mul avada terminali aknas. Lubage mul koostada argv 1, ja nüüd andke mulle joosta argv 1, Enter. Hmm. Okei. Lähme sõitma foo bar. Huvitav. Baz. Ja kui sa oled kunagi mõelnud, miks writing seda, see on lihtsalt ka loll infotehnoloogia konventsiooni. Maailm vajab sageli lihtsalt verbaalne kohatäited sõnu. Seega, kui soovite rääkida mõned üldised stringi, arvuti teadlased lihtsalt kipuvad ütlema suva kui nad vajavad juhuslik sõna, siis nad ütlevad baar kui nad vajavad teise juhuslik sõna, siis nad ütlevad Baz kui nad vajavad Kolmas sõna, siis nad ütlevad qux kui nad vajavad 1/4 sõna, ja siis seal on suur usuline arutelu internetis, et mida tuleb pärast qux, nii saate Google, et aru saada, mida teine ​​suvaline sõna peaks olema. Aga need mingit tähendust üldse, kuigi foo bar, kui sa Google, et see on tähendus, mis on osa etümoloogia siin. Nii et kõik see teeb siis trükib 1 nimetatud stringid rea kohta. Nii et kui ma selle asemel, aga tahtsin saada vähe Kasvataja, oletame, et ma ei soovi printida iga string rea kohta; Ma tahtsin printida iga märk igalt string rea kohta. Kuidas ma saaksin selle asemel teha? Mida ma pean muutma selle programmi kui ma tahan trükkida ei iga sõna aga ma tahan trükkida iga sõna kirja täht- siis järgmine sõna on täht kirjas? Kuidas me ühendame need ideed seni? Jah. [Üliõpilane]% c. >> Olgu. Nii et me kuskil vaja% c. Hea, sest ma ei taha printida kogu stringid, ma tahan trükkida märke. Mis veel? [Kuuldamatu õpilase vastus] >> Huvitav. Nii et me peame mingi teise mõõtme siin nüüd sest mõtle argv massiivina, aga see on massiivi stringe. Aga kui on, nagu, 15 minutit tagasi, mis see string? See on array tähemärki. Nii et tõesti, argv on array array tähemärki, array massiive tähemärki. Nii selgub, et saame kasutada lihtsalt rohkem nurksulg salakoodi. Nii et teeme seda. Üleval see silmus real 19, ma lähen itereerima alates i kuni argc, aga siis ma teen seda: jaoks - ma ei saa kasutada ma nüüd. Mul on vaja teise muutuja, sest ma tahan kinnitada, üle sõnade aga siis ka üle tähed sõnad nii ma omamoodi on vertikaaltelje ja horisontaalteljel, omamoodi kontseptuaalselt. Nii int j saab 0, siis ma tahan teha j kui j on väiksem kui - ja ma puhastada see üles natuke. Kuidas itereerime tähed string? Me tegime seda hetk tagasi. Strlen kohta argv [i]. Hea. Ja jälle, ma teen natuke ebaefektiivsus siin ei looda n või mis iganes, kuid me tuleme tagasi selle. Nii et nüüd j + +. Nüüd on mul taane edasi siin. Mida ma nüüd tahan printida iga iteratsiooni? [Kuuldamatu õpilase vastus] >> Nii et [i] annab mulle sõna. [I] [j], omamoodi nagu maatriks. Neile, matemaatika-y taustaga, me oleme omamoodi indekseerimine veelgi sügavamale selles maatriksis või seda massiivi massiivid selles 2-mõõtmeline struktuur. Nüüd vaatame, mis juhtub siin. Lubage mul avada minu suurem terminaliakent. Lubage mul uuesti, mark argv 1. Ja ma olen silmamunad siin, mis on hea õppetund, sest ka mina unustasin seda teha. Kaudselt kuulutatakse C raamatukogu funktsiooni "strlen" tüüpi "allkirjastamata - Ma isegi ei tea, mida ülejäänud see tähendab, aga ma olen näinud seda enne, kaudselt kuulutatakse. Kui me näeme seda viga, mida see tavaliselt tähenda? [Kuuldamatu õpilase vastus] >> Ma unustasin raamatukogu up üles. Kuid oodake minut. Tavaliselt olen silmamunad, sest ma unustasin CS50 raamatukogu, kuid see on olemas. Tavaliselt olen silmamunad sest ma olen unustanud standard I / O. Ja ausalt öeldes ma isegi ei vaja seda. Me ei kasuta getString täna. Mida ma kadunud? Seal on veel raamatukogu, et nüüd peame kasutama vahetevahel nimetatakse string, ja see on lihtsalt järjekordne raamatukogu, mis on rohkem funktsioone, mis ei ole standard I / O. Nii et lähme tagasi minu suur terminaliakent. Okei. Nüüd, kurat küll, ma arvan, et ma eksisin. Olin kasutades CS50 raamatukogu. Nii saame määrata seda kummaski 2 võimalust. Me ei saa võtta Apupyörät välja just nüüd ja just seda, Või oletame, millist hoida, et lihtsustada just nüüd, kleebi see tagasi, seda probleemi lahendada, ja nüüd mine tagasi terminali aknas. Nii et oleks selge, et CS50 raamatukogu ei ole ainult funktsioone, see on ka märksõna string, mistõttu see viga juhtus. Nii et siin me läheme. Ma parandasin nii raamatukogu küsimustes. Enter. Hea. Argv 1, foo bar, Enter. Suurepärane. Nii et nüüd on meil iga täht iga sõna trükitud 1 rea mis ei tee väga huvitav programm, aga teate nüüd oleme võimelised mitte ainult itereerimise üle sõnad vaid ka üksikute tähtede sõnu, mis kõlab kohutavalt tuttav et isegi kõige lihtsamaid rakendusi nagu skrambleerimise tähed string niimoodi. Lähme edasi ja võtame 5-minutilise vaheaja siin. Ja kui me tagasi tuleme, me hakkame rääkima tõhususe kellega me saame teha neid asju paremini. Hea küll. Me oleme tagasi. Tänu üks meie TF, kes mängib palju bananagrams, meil tegelikult on terve hunnik tähemärki koos meiega siin täna füüsiliselt kehastunud neid vähe plastist tükid, ja andke mulle ettepaneku, et see tühi valge kiltkivi näitab siin RAM minu arvuti - sülearvuti, lauaarvuti, mis iganes - ja seal näeb palju see sest kui me hakkame tükeldamine kuni see RAM väikesteks baidi suurusega tükid, olgem suvaliselt öelda, et midagi, mis suurus ja mis udune esindab - seal läheme, ja olgem suumimiseks natuke siin - ütleme midagi sellist, suurus moodustab ühe baidi. Nii saame tõepoolest sobib terve hunnik baite või tähtede sees see mälu, nagu soovitas suhtelist suurust siin. Aga oletame nüüd, et eesmärk on mälu eraldada string. Kuidas see tegelikult toimib? Programmides oleme olnud kirjalikult, oleme tavaliselt kasutanud getString, kuid nüüd on selge, et seal on see teine ​​kanal, mille kaudu saame kasutaja sisend argv käsureal argumente. Aga mis tegelikult toimub all kapuuts? Tuleb välja, kui me nimetame - olgem kerige tagasi getString - funktsioon getString aastal CS50 raamatukogu, kasutaja küsitakse stringi, kasutaja liigid mõned sõna - olgem nimetame seda tere. Ja me oleme rääkinud juba viimased paar nädalat, et tagastatav väärtus getString Tegelikult on string, nagu sõna HELLO. Aga mis on getString tegelikult teeme? Nagu kasutaja liigid HELLO, Enter, getString on figuring, okei, kui palju märke on? See on H-E-L-L-O. Seega tuleb eraldada, tuleb küsida operatsioonisüsteemi - Linux antud juhul - vähemalt 5 baiti salvestada tere. Ja mis see siis tulu, mida teha, kui ta saab tagasi need 5 baitide operatsioonisüsteemi on näha läbi HELLO seljad et seljad. Ja nii mis tegelikult naasnud getString on patakas andmeid, mis näeb välja selline. Aga see on natuke ebatäpne, sest selgub, et see ei ole nii lihtne kui lihtsalt ladustamiseks HELLO on arvuti mällu sest arvan, et minu programm, mis ma kirjutan C siis nõuab getString uuesti, ja järgmise sõna kasutaja liigid on BYE, BYE. Noh, ma pean sobima, et sõna BYE kuskil mälus. Ma ei riku tere. Näiteks ma ei taha, et arvuti lihtsalt alustada kirjutades niimoodi Esialgse sõna, sest ma saaks veel kasutada sõna HELLO toimub muutuva kusagil mujal minu programm. Nii et B-Y-E on lõpuks kusagil mujal mälu. Aga konventsiooni tavaliselt on, et järgmine string sa eraldama ilmselt, kuid mitte alati, läheb lõpuks järgmisel mälu asukoht. Ja kui ma pole küsinud operatsioonisüsteem mingit mälu sest viimasel ajal ma helistasin getString, koefitsiendid on sõna BYE läheb lõpuks õige sõna HELLO mällu. Aga sel hetkel saab ehk näha, kus võimalik probleem tekib. Kuna järgmise mäluhulka, järgmine baiti, mis olid lihtsalt vaba - puhastada valge kiltkivi - in arvuti mälu oli õigus kõrval HELLO, tundub, nagu esimene string palusin äkki nüüd muuta sest ma olen sisuliselt muutunud see, et HELLOBYE asemel kuidagi demarcing algust BYE ja lõpuks tere. Nii selgub, et mida tegelikult toimub all kapuuts, mis sa võisid glimpsed online viited sektsiooni või raamatuid või üldse mitte lihtsalt veel, et on tegelikult tahtlik piiritlemine vahel sõnad arvuti mällu. Ja tegelikult selles asjas, mitte lihtsalt panna BYE kõrval HELLO, selle asemel, et arvuti paneb erimärgi, eriline null iseloomu, nii et rääkida, mis on esindatud marker längkriips 0. Nii pikk lugu lühike, meelde tuletada, et märgid on esindatud ASCII. ASCII on lihtsalt kaardistamise vahel numbreid ja tähti, ja enamik neist kirjadest alustada umbes 65 kapital, aga tuleb välja, saate kindlasti esindama arvu 0, täisarv või binaarne, ja selgub maailma otsustati kaua, kaua aega tagasi, "Tead mis?" "Lähme reservi arv 0, ei esinda ühtegi märki klaviatuuril - "Ei tähed, numbrid puuduvad, siis ei ole kirjavahemärke. 0 on eriline." "See saab olema eriline null iseloomu, ja me ei kavatse seda kirjutada kui \ 0". Erinevus on, kui me lihtsalt kirjutas 0, 0 on iseloomu. Tuletame meelde, et seal on ASCII koodid 0, 1, 2, 3 sest iseloomu 0 on erinev arv 0. Ja te näete, et kui te vaatate tagasi alates 1. nädalast, kui me esimest korda rääkisime ASCII, 0 ja 1 ning 2 ja 3 kõik viis kuni 9 oli oma ASCII koodid. Nad ei ole juhuslikult, 0 kuni 9. Nad on väga erinevad. Nii et 0 tähendab lihtsalt "Ma olen eriline" ja \ 0 tähendab, sõna otseses mõttes, "Ma ei ole 0 iseloomu." "Ma olen see eriline väärtus, null iseloomu." Nii et ma tegelikult vajan veel üks neist, sest ma ei tee sama viga kaks korda. Nii et pärast sõna BYE me ka läheb vaja veel üks selline null tähemärki. Las ma haaran oma pliiats siin ja lase mul kiiresti teha teise \ 0 nii et pärast ma palusin operatsioonisüsteemi 2 stringid kaudu getString järgneb teine ​​kõne getString, see on see, mis tegelikult mälestuseks. Nii et kui ma tagasi tulen string, ma tõesti saada tagasi, et ja kui ma saan järgmine string, ma tõesti saada tagasi seda. Nii et see tekitab küsimuse, strlen kõigepealt, milline peaks see tagastada? Kui ma kutsun strlen edasi stringi s ja s oli sõna HELLO, et kasutaja sisestatud, mis me siis ilmselt öelda pikkus HELLO oli paar minutit tagasi? See oli 5, eks? H-E-L-L-O. Ja see on tõesti, kuidas strlen töötab. Ta naaseb mida tavaline inimene ootaks pikkus string olema. Aga tegelikult, kui suur on array märkide inimest ladustamiseks tere? See on tegelikult 6. Nii strlen ei mainita, et tegelikult sind. Aga all kapuuts arvuti on tõepoolest kasutades 6 baiti salvestada 5-täheline sõna, ja see on tõsi, ükskõik kui pikk sõna. Seal on alati saab olema eriline null lõpetatakse märk lõpus stringi kuni demarc kogupikkusest. Siis kui sa oled nüüd elluviijale strlen 20, 30 aastat tagasi, kuidas sa minna rakendamisel strlen ise? Me peame enesestmõistetavaks, et see on olemas, just nagu me enesestmõistetavaks, et printf olemas, aga kui HELLO on kõnealuse sõna ja mida ma pean mälus on midagi, mis näeb välja selline, kui sul oleks implementeerida strlen sest sa paluti või, sest ausalt öeldes, sa ei tea strlen olemas - sa pidid rulli see ise - kuidas sa võisid rakendada strlen kui antud midagi, mis näeb välja selline? Nüüd, kui me teame, on string on massiiv, saame kinnitada, ületab iga üksiku tähemärki kasutades midagi - proovime seda teha lennult. Lubage mul minna seadet. Las ma luua uus fail, strlen.c. Lubage mul minna nüüd ja ei hulka stdio.h nii et meil on juurdepääs printf. Las ma teen int main (void). Oh. Ma lihtsalt tee seda minu oma nüüd siis. [Chuckles] Aitäh. See on see, mida ma teen. Hea küll. Nii et enne kui ma sisse lülitada ekraani, ma kirjutada kõike seda. Ja nüüd ma lähen tegema, on järgmised: printf ("Anna mulle stringi:") See on lihtsalt kohev juhiseid. Nüüd lubage mul teha string s = getString. Ma juba vaja teha muudatus nüüd. Ma kasutan CS50 raamatukogu äkki, seega lubage mul minna ja kirjuta cs50.h. Ja nüüd teeme nii: printf ("pikkus on:% d, strlen [s] - ja ma ei ole teinud veel. Mida ma veel pean lisama selle programmiga? [Üliõpilane] string. >> String. Nii et nüüd me kasutame strlen, niiet veenduge kompilaator teab, kus see on nii vähe meelerahu vaadata. Ma saan stringi rida 8 ja liin 9 Ma väljatrükk oma pikkuse poolest% d. Nii lähme edasi ja avage see üles. Oleme teha strlen - kogub okei - strlen - las ma suumida - Enter, H-E-L-L-O, Enter. Pikkus on 5. Okei, nii et strlen tundub töötavat, kuid maailm teab seda. Nii et olgem nüüd rakendada strlen ennast järgmiselt. Lubage mul kasutada raamatukogu kaugusel. Me ei pea enam juurdepääs string, sest ma ei tea isegi seda olemas. Aga sellest pole midagi, sest ma ei rakendada strlen ise ja on see võtma string nimega sisend, ja nüüd ma pean välja mõtlema, pikkus selle stringi. Niisiis, kuidas ma saan seda teha? Mis siis, kui ma - vaatame, kuidas seda teha - Mida sa teha tahad? [Kuuldamatu õpilase vastus] >> Okei. Nii et me saame seda teha hunnik võimalusi. Las ma proovin seda lähenemisviisi. Annan ennast int muutuja i, nii et ma algab 0-ga. Ja las ma ütlen seda: kui sisend [i] ei ole võrdne? \ 0. Nii selgub, nagu muudki tähemärki kirjutamise ajal neid sõna otseses mõttes programm, sa pead kasutama ülakoma, ei jutumärkidega. Nii et kui ma kirjutan kirja, ma teeksin, et B täht, ma teeksin seda. See seevastu oleks string, mitte individuaalne iseloom. Nii et ma tahan \ 0 sõna otseses mõttes. Mida ma tahan teha selle ahela? Tegelikult, ma pean teise muutuja, nii int pikkus saab 0. Isegi kui te ei ole kindel, miks me hakkasime nii tegime, Nüüd, kui me läheme seda teed, mida ma tahan teha real 9? pikkus + + ja siis siin all on line 10, tagastamise pikkus. Niisiis, kuidas on strlen rakendada? See on tegelikult ellu ilmselt niimoodi. Võib-olla inimene kasutada jaoks silmus, võibolla teha samas loop - kes teab? Olime tõesti alla vaadata kapoti juures lähtekoodi mõnel fail nimega string.c ilmselt. Aga siin mõtleme, mida ma teen. Olen kuulutab muutuja nimega i, millega ta võrdne 0-ga. Ma siis kuulutab teise muutuja nimega pikkus, millega see võrdne 0-ga. Siis ma ütlen, kui nda märgi sisend ei võrdu erilist null iseloomu, \ 0, juurdekasvu pikkus. Aga niipea, kui nda märk on see eriline iseloom, mis juhtub ahela? See lühise. Ta peatub, mis tähendab, et me siis koheselt tagastama pikkus. Nii et kui ma ei segi ajama, lähme edasi ja minna tagasi oma terminali aknas. Lubage mul kompileeri. Ja ma kägardama. Vastuolulised ümberdeklareerimine raamatukogu funktsiooni strlen. Nii et ma üritasin saada liiga tark minu enda hea siin. Koostaja tegelikult teab, et seal on funktsioon nimega strlen kuigi me ei ole lisanud raamatukogu. Ongi hea. Mida iganes. Me lihtsalt teha koostööd siis. Lähme ümber selle pikkuse. Lubage mul muuta kasutamist see pikkus siin, ja see teeb rõkkama õnnelikumaks. Nagu kõrvale, sest mõned neist funktsioonidest on nii darn ühine - strlen, prinf - nad tegelikult on omamoodi eriline staatus. Ja nii rõkkama lihtsalt teab vähe midagi erilist nende kohta. See pole alati nii enamus funktsioone, nii et miks me sai karjus. Las ma proovin uuesti. Õnneks see töötas sel ajal. Nüüd lubage mul saan oma strlen programm. Anna mulle string: H-E-L-L-O, Enter. Ja ma olen silmamunad. Miks? >> [Kuuldamatu õpilase vastus] >> Täpselt. Nii et ma pean ennast siin väga kena välimusega lõputu silmuse sest kuigi ma incrementing pikkus iga iteratsiooni, Mida ma selgelt ei tee? Ma ei incrementing i. Okei. Lihtne lahendus. Jah? Okei. No nüüd me läheks afoul mõne muu levinud viga, kui mul on vaja sulgudes. Ja ausalt öeldes, see kood on hakanud otsima kole, nii me võtke torkehaav at puhastamiseks see üles kohe. Aga nüüd olen incrementing nii pikkus ja i. Ausalt, ma juba näha võimalus teha edusamme, kuid me tuleme tagasi selle. Nii et nüüd lähme lihtsalt veendumaks, et me oleme vähemalt edu. See juhtus paar teile, ja ma unustanud mainida seda ette. Kui sul on ebaõnn stsenaarium meeldib see, kuidas sa seda parandada lühike taasalustamise seadme või arvuti või sule aken? See on tegelikult lihtne. Kontroll C saadab see väike porgand sümbol C, ja et lihtsalt lõpetab enamik programme. Kui teil on tõesti halb lõputu silmuse, et prinditavad asjad lõpmatult palju kordi, Mõnikord võib tekkida tahtmine lüüa kontroll C tuhat korda teha see tegelikult kuulda. Nii lihtsalt aru nüüd, sest ma ei prindi midagi, mis oli üsna lihtne. Ja tehniliselt, kui piisab, kuid ma saan kannatamatu ja ma tavaliselt tabab see, et mitu korda. Nii strlen. Anna mulle string: Tere. Kas see hakkab tööle sel ajal? Okei. Teine levinud viga. Kas kompileeri. See oli tahtlik, et üks. Hea küll. Nii strlen, H-E-L-L-O, Enter. Suurepärane. Nii et meil on nüüd strlen 5. Nii oleme sõna otseses mõttes reimplemented et ratas. Nii et nüüd lähme korista see ära, sest see ei tee mulle muljet projekteerimise mu koodi. Mida me saame selgelt kõrvaldada selle programmi puhastada see üles? [Kuuldamatu õpilase vastus] >> Jah. Sõna otseses mõttes, me ravime i ja pikkus identselt. Miks me lihtsalt ei targuta ja öelda, kui pikk? Pigem Ütleme nii see pikkus alustada, initsialiseerida see 0 sest vaikimisi stringi ei ole pikkus kuni me aru saada, mis see on. Nüüd me seda teeme, ja nüüd see on päris elegantne programm. Üks muutuja. Ma puhastada see üles, pingutatakse selle üles. Nii et nüüd lähme tagasi oma terminali aknas. Lähme edasi ja käivitage see. Tee strlen. Näeb hea välja. Run strlen jälle Enter. Anna mulle string: Tere, Enter. Ja tundub, et see töötab 5. Nüüd, et oleks selge, kui ma poleks kirjutanud, näiteks HELLO 1 string ja siis BYE teises, saame kindlasti mitu sõna. Kui avaldis ma tegelikult tahtsin kirjutada ei olnud HELLO kuid näiteks Tere, maailm, teate, et see, mida me ei oleks see olukord siin, eks? See viitab sellele, et see on 2 stringid. Te kindlasti ei ole tühikut tähtedega, nii et kui me tegelikult kirjutatus enam fraasi nagu tere, mida me tõesti mälu paistab pisut midagi sellist seal. Hea küll. Kõik küsimused siis umbes esindatuse siin stringide? Ei? Hea küll. Nii et ma ütlesin, et helistaja strlen ikka ja jälle teadlikult niimoodi ilmselt ei ole parim idee, sest sa lähed tegema palju tööd uuesti ja uuesti ja uuesti. Tõepoolest, millist tööd on vaja figuring pikkus string, ilmselt? Sa pead alustama alguses ja siis vaata, vaata, vaata, vaata, vaata kuni sa lõpuks näha, et erimärgi, kus punkt, ah, nüüd ma tean pikkus. Nii varem kui olime strlen kutsutakse üha uuesti ja uuesti, Seetõttu teen ettepaneku, et oli selline loll on, sest taas, et string näeb välja selline. Ta ei kavatse muuta iga kord, kui itereerima läbi mõned silmus, nii sa teed asjatut tööd. Samal ajal sa peaksid teadma, kui kõrvale, et tõlkijad nagu rõkkama nendel päevadel Välja on töötatud aastaid, ja tõlkija kirjanikud, programmeerijad, on üsna nutikad. Ja nii selgub, et rõkkama ja muud koostajad saavad tegelikult aru saada, et Okei, jah, sa kirjutasid strlen oma tingimus, mis tehniliselt tähendab, et me nimetame seda uuesti ja uuesti ja uuesti. Aga nutikas koostajad võib tegelikult optimeerida seda tüüpi vaeseid kasutaja otsused välja oma kood hüvitisele asju. Nii et ärge lihtsalt aru, et mõnikord koostaja on targemad kui meie ja siis mingi peita oma vigu. Aga kindlasti, kui tegemist on probleemiga komplekti jms, ei mõelda neid põhimõtteliselt ekslik disaini otsuseid potentsiaalselt sel lihtsal põhjusel, et me tahaks olla teeme nii rohkem tööd kui me tegelikult tegema pean. Aga kui palju tööd? Juhul Tere maailm, alustame üldistada, kui suur see probleem. Mis on pikkus probleem või probleemi ulatust kui sõna kasutaja sisestatud on Halloo? See on ilmselt 5, ehk 6. Pluss või miinus 1. Mida iganes. See on nii lähedal, et me lihtsalt nimetame seda 5. Mis siis suuruse probleem, kui nad püüavad nuputada pikkus Halloo? See on 1, 2, 3, 4, 5, ja võibolla 6 viimane märk, kuid olgem üldistada, et kui n. Nii n, lihtsalt muutuja n, on see, mida arvuti teadlased Reeglina kasutatakse kirjeldada suuruse probleem ja probleem käepärast on, kui kaua on Halloo? Kui palju aega strlen võtta? See võtab tellimusel n sammu, kus iga samm tähendab pilk iseloomu, vaata iseloomu, pilk iseloomu. Ja meil oli see arutelu aega tagasi, tehingute arv midagi leiab. Väga esimesel päeval klassi olime kõik kohmakalt püsti, ja siis hakkasid kõik sidumist ära üksteisega et tegelikult loota ideaalis kuidas paljud inimesed olid toas. Ja tegime veel üks asi, mille kui ma selle asemel tegi seda vana kooli viis on hakanud just 1, 2, 3, 4, 5, 6 ja nii edasi, et liiga, kui suur see probleem oli mõõtmetega n. Seal olid n inimesed ruumis. Aga ma võiksin kiirendada, et üles, eks? Hinne kooli stiilis ma võiks nummerdamiseks 2s. 2, 4, 6, 8, 10, 12. Ja see tundub nii palju kiiremini, ja seda ta tõepoolest on. See on sõna otseses mõttes kaks korda kiiremini, kuid jällegi, kui veel 400 inimest kõndis siin ruumis kõik korraga, need algoritmid võtaks veel 400 või hoopis 200 sammuga. Aga vastupidi, kui me tõesti targad ja me selle asemel on kõik loete ise, mäletate, kuidas see algoritm töötas. Te kõik püsti. Lubage mul kiiresti seda huviga. Te kõik tõusid püsti, siis paaris välja, siis pool istusid maha, pool istusid maha, pool istusid maha, ja iga iteratsiooni see ahel alates 0-nädalal, me poole probleemiga ja läks n / 2, siis n / 4, siis n / 8. Ja tagajärjeks on see, et kui mõni teine ​​400 inimest jalutad tuppa, ei ole suur asi, see viib meid veel 1 ring, mitte 400 rohkem ringi, mitte 200 rohkem ringi. Ja nii lugu me rääkisime mõnda aega tagasi tuli teha natuke midagi sellega. See punane joon siin on lineaarne, see on sirge, ja see on märgistatud kui n sest nagu suurus probleem kasvab, Kui teie algoritm või programm, millega sa lahendada see võtab n samme, saame joonistada seda sirgjooneliselt, kus see võtab rohkem aega suurem suurus probleem. Ja twosies lähenemine, lugedes 2, 4, 6, 8, ikka sirge, natuke parem. See võtab natuke vähem aega, nii et kollane joon on alla punane joon, punkt punkt. Aga veel parem oli see Püha Graal, mida me kutsusime logaritmiline aeg kus isegi kui jälle me kahekordistub inimeste arv toas, meil kahekordistada et telefoniraamatust alates esimesest päevast klass, ei ole suur asi, see võtab veel 1 lehe pisar, võtab veel 1 istudes et lahendada probleem, mis on kaks korda nii suur. Ja nii vestlus me nüüd saan alustada võttes on kuidas me tegelikult lahendada probleeme tõhusalt kui võtame arvesse kõige lihtsamaid probleeme nagu see on? Oletame, et meil on 8 uksed, mille taga on mõned numbrid, ja kõik need numbrid ei ole järjestatud kuidagi nad lihtsalt juhusliku täisarvu taga uksed, ja me küsida, kuidas sa minna leida mitmeid - kes teab - 7 taga nende uste? Mida sa, inimene, teha selleks, et mind leida number 7 kui jälle kõik need on uksed ja näha väärtus pead avama ukse? Milline oleks teie algoritm olema ehk? [Kuuldamatu õpilase vastus] >> Nii et alustada vasakule ja avada uks, ava uks, ava uks. Ja halvimal juhul, kui kaua ta kavatseb meid leida number 7? Ja veel, nad ei järjestatud, nii see ei ole nii lihtne, nagu, noh, ma lähen avama 7. uks. See võib meid, maksimaalselt, 8 astet. Halvimal juhul, 7 on juhuslikult päris lõpus on rida uksi, nii me oleks võinud proovida kõik n uksed. Nii et taas siia, meil tundub, et on lineaarne algoritm. Tegelikult me ​​seda tegime paar aastat tagasi. Üks teie eelkäijad vaidlustati koos just see kus meil ei olnud digitaalne versioon, me asemel oli tahvel mõned tükid paberi peal. Ja mida ma arvasin, tahaksin teha, on võtta Kiire pilk tagasi sellele, kuidas see läks, üks parimaid ja võib-olla kõige ebamugav võimalusi laval on demonstratsioon siinsamas Sanders. Meil oli 2 rida numbreid. Me ainult lähen vaatama, mis juhtub siin Sean jaoks väga peal need read. Kui keegi kunagi vabatahtlike CS50, meil oli Sean õnnistust hoida seda kaamera, nii et ta teab, et sajad inimesed jälginud seda juba aastaid. Aga Sean tegi uskumatu töö - või ei ta on? - Kell tegelikult leida meile kindlat numbrit. Nii et vaatame, kuidas ta lahendada seda algoritmi nii, et me jätkata seda vestlust enne pikk sellest, kuidas me leiame asju tõhusalt. [Malan video] Ma olen taga peidus nende uste arv 7, kuid Säästudes mõned neist ka uste on muud negatiivsed arvud, ja teie eesmärgiks on mõelda selle esirea numbrid lihtsalt massiivi või lihtsalt jada paberitükke numbritega nende taga, ja teie eesmärk on, kasutan ainult üles massiivi siin, leia mind number 7. Ja meil on siis läheb kriitika, kuidas sa minna seda teha. >> Olgu. [Malan] Leia meid number 7, palun. [Naer] [Malan] nr [naer] 5, 19, 13, [naer]. See ei ole trikiga küsimus. 1. [Naer] Sel hetkel oma skoor ei ole väga hea, nii võite samuti edasi. [Naer] 3. Mine edasi. Ausalt, ma ei saa aidata, kuid ei tea, millest sa isegi mõelda. [Naer] Ainult ülemine rida, nii et sul on 3 vasakule. Nii et leia mind 7. [Õpilased vulisev] [Malan] 17. [Õpilased vulisev] [Malan] 7! [Aplaus] Nii et kolmapäeval me sukelduda sellesse ja keerukamaid algoritme leida asju. Sest nüüd me jätan teid Sean ja näeme kolmapäeval. [CS50.TV]