[Powered by Google Translate] [Hét 3] [David J. Malan - Harvard University] [Ez CS50. - CS50.TV] Hadd irányítani bennünket abba az irányba, ahol abbahagytuk legutóbb, amely kiindulási gondolni egy kicsit több, mint körülbelül szintaxis és megpróbálta hiszem, egy kicsit kevesebb a helyzet az aprólékos hogy vesz egy kis időt, hogy felveszik az eddig szempontjából pontosvessző és zárójelek és kapcsos zárójelek, kezdeni a dolgokat egy kicsit, hogy egy magasabb fogalmi szinten annak érdekében, hogy a problémák most kezdeni megoldása az elkövetkező néhány hét megy bevonása sokkal inkább magasabb szintű fogalmi problémák és egy kicsit kevesebb, mint a szintaktikai kapod meg a lábát nedves és a kezét piszkos néhány, a szintaxis e az elmúlt pár hétben. Így emlékeztetni arra, hogy a múlt héten mutattuk be ezt a fogalmat egy tömb. És egy tömb magyarul lehet leírni, mint mi? >> [Hallhatatlan tanulói válasz] Tessék? A gyűjtemény? >> [Hallhatatlan tanulói válasz] >> Oké, jó. A gyűjtemény a tételek. Így láttuk tömbök a Scratch. Ha történt használni Pset 0 egy Scratch listák húzhatja a dolgokat mint a narancs és a banán, a leltár a fajta, ez olyan, mint amit egy tömb. És akkor műszakilag, összefüggésben a tényleges számítógép, tömb egyszerűen egy folytonos darab memória. Más szóval, van egy byte, akkor egy másik byte, akkor egy másik byte, majd egy másik byte, és ha volt, hogy dolgozzon ezen byte kép, lennének háttal hátra hátra. Ez az, amit értünk szomszédos. Tehát byte szám 1, majd 2, majd 3. Ez nem azt jelenti itt, itt, itt, itt. Egy tömb folytonos darab 0 vagy több bájt. Tehát mi ezek hasznosak? Emlékszem mi volt ez a fajta kitalált példa tárolásának emberek kvíz évfolyamon a program kiszámításához a kvíz átlagos néhány természetesen és emlékeztetnek arra, hogy mi is írjuk, hogy a program által nyilvánító változó quiz1. Akkor lehetett volna egy másik változó nevű quiz2. De aztán, ha nem 3 vetélkedők ebben az osztályban, quiz4. Vagy ha volt egy heti kvíz lenne quiz5, quiz6, quiz7. Szóval volna mindezen változó bejelentett belül a fő vagy valahol máshol a programban, és a probléma ezzel a megközelítéssel, egyszerű bár, hogy csak másolni és beilleszteni, van az, csak nagyon hamar nehézkes. Isten ments, hogy tényleg van 30 vagy 50 kvízek vetélkedők. Ha ez olyan, mint egy középiskolai stílusú pop napi kvíz, akkor csak egy nevetségesen hosszú listát a változók, hogy kijelentette: és ez csak nagyon hamar kikerül az ellenőrzés alól. Ez csúnya, nehéz fenntartani, ez sokkal könnyebb, hogy egy elírás ha kap száma 1 elgépelte valahol a programban. Így vezette be a fogalmat egy tömb helyett. És emlékszem, hogy mi végre ez a program csinál egy kicsit valami ilyesmi. Hadd menjek a mai Forrás 3 hétfő jegyzéke és nyissa meg a tömb, amit láttunk utoljára. És bár volt egy pár új C trükköket itt, köztük fogalmát egy állandó, Emlékeztetek arra, hogy mi nyilvánított több úszók alapvetően szintaxis használatával: úszó, akkor a változó nevét, akkor használt négyzetes zárójeleket valóban az első alkalommal, és mit csináltunk benne e tér nadrágtartó ténylegesen be egy számot. De ahelyett, hogy egy sor, tettem ezt a nagybetűs szót, vetélkedők. És mi volt a motiváció amivel egy nagybetűs szót, mint a vetélkedők majd a 17. sor trükkje van, hogy ténylegesen adni, hogy a szám? Mi volt a motiváció ott? Igen. [Hallhatatlan diák válasza] >> Pontosan. Ha meg akarjuk változtatni a 2 értéket, akkor csak meg kell változtatni, 1 helyen mert úgy - Én nem is emlékszem, mi ez a program pontosan azt tette, de ha csak fusd át látod kvízjátékok, vetélkedők. Látod vetélkedők, ide több vetélkedők. Tehát ha nem volt ez az állandó, ez a használat az éles meghatározni, mi volna gépelt 2, majd 2, majd 2, majd 2, ami rendben van. Lenne ugyanolyan helyes. De tegyük fel, hogy jövőre már 3 vetélkedők a CS50. Szóval el kell menni, és frissítse a kódot, azt kell fordítanod azt, de a probléma az, ha csinálok valami hülyeséget, mint ahogy néznek 1 említés a 2 és felejtsd el, hogy csatlakoztassa a 3, a teljes program is nagyon jól megtörni. Szóval csak bajt. Tehát fogalma állandó szól faktoring meg néhány adatot, hogy ez egy string vagy char vagy úszó vagy bármi, , és kijelenti, hogy 1 hely, így könnyebben változtatni a jövőben. És ez is, őszintén szólva, egy kicsit könnyebb olvasni, mert ha csak gondol erről most ez vetélkedők, vagy mi akár nevezze valami hasonlót NUMBER_OF_QUIZZES vagy valami konkrétabb. A kód csak lesz egy kicsit nyilvánvaló, hogy mit csinál, és akkor csoda, egy kicsit kevesebb, amit 2-es számot megtörténhet jelent. Így az állandó semmi köze nem volt alapvetően a tömbök. A tömb vezette útján e tér fogszabályozó. Tehát észre, hogy a 23 kérünk a felhasználót: "Mi volt a teszt eredmények?" Aztán már csak a hurok, amely látszólag arra kéri a felhasználót, hogy fokozatok. Hogyan? Végig 0-2. És azt mondom, 2, mert Feladványok valamennyi sapkák jelenleg 2. Így megismétli 0-tól akár 2 és akkor kiírja Kvíz # valami valami, és akkor használja getFloat, hogy egy értéket a felhasználó elől. Tehát észre, ez az egyetlen másik új darab szintaxis a múlt szerdán. Ha szeretné tárolni valamit, egy adott helyen, hogy a tömb, újra használja a szögletes zárójelben. Szóval van egy kis kettősség itt. Az első alkalommal használja a szögletes zárójelek használja, hogy meghatározza, hogy mekkora szeretné, hogy a tömb lenni. De ez a következő összefüggésben van, ahol újra alkalmazni ezeket szögletes zárójelek azt jelenti, ha az adott tömb akarsz egy kis érték? És a különbség itt is levezethető összefüggésben. Figyeljük meg itt van egy adattípus, akkor a nevét egy változó, akkor már a szögletes zárójelek számos belül, pontosvessző. Ennyi. Szóval ez egy nyilatkozatot. Csak mintha mi tett ilyesmit float grade1, float grade2; de a lényeg, ez nagyon gyorsan hárul a túlságosan másolás, beillesztés, így ahelyett, hogy mi csak egyszerűsített, mint ilyen, ami azt jelenti, ezentúl van egy fokozat, amely tárolható konzol 0, van még egy fokozat, hogy lehet tárolni konzol 1, de mi van, ha én hülye, és például az én loop odáig megy - például, én ezt kisebb vagy egyenlő, mint a, amely visszahívás volt a forrása egy korábbi hiba - amely gyakorlatilag azt jelenti, hogy néhány harmadik véletlen iterációs e ciklus ÉN használ konzol 2. Valójában, mi történik itt? Tessék? [Hallgató] Ez lesz ki kell cserélni. >> Vajon fogják cserélni? Mit kell cserélni? Ez szó szerint azt mondja, cserélje ki, mi van hely 2 a visszatérési értéke getFloat. De a probléma az, hogy mekkora az a tömb ezen a ponton a történet? [Hallhatatlan diák válasza] >> A tömb még mindig csak a 2-es méret mert a tömb, mint minden változó nyilvánították először, mielőtt használta, és mi meg itt, mert ez az állandó, hogy van 2 fokozat, hogy fogok tenni. De ne feledje, a számítógépes szakemberek indul számítva 0. Tehát az első helyen, hogy a tömb konzol 0-ra. A következő helyszín 1 lehet. Ez a dolog még így kicsit túl messzire át az oldalra. Más szóval, ha tényleg volt ez a tömb - és hadd lássam, milyen jól működik együtt ez itt nekünk - ha van egy tömböt, hogy én már csak elkészíteni a következőképpen és én már kiosztott helyet 2 elem, talán felhívni e, mint ez a memóriában amennyiben ez a nagy fehér vászon. Ez csak a RAM van a gépemen, a koncert a RAM, 2 giga RAM, bármi, de ezek a 2 doboz most egyenként jelentenek úszó, 32 bit. Tehát, ha teszem száma 1 itt, mint 1,0, akkor tettem egy másik számot itt, mint 3,2 de aztán nem tartó 2, azaz olyan, mint üzembe itt valami. És ahogy a kép is mutatja, nincs ott semmi. Ez a fajta, mint a senki földjén, mert nem kérték, az operációs rendszer hogy nekem ez a harmadik kvíz. Ha én akarom, hogy a harmadik kvíz, én kellett volna az előrelátás hogy kérje az operációs rendszer által nyilvánító kvízek, hogy nem 2 de ehelyett egyenlő 3. Más szóval, a kép, amit hatékonyan van kéznél néz ki itt. Ez megint a senki földje. Mi a jobb, ha nem próbálja meg írni értékeket itt. De ismétlem, mert a számítógépes szakemberek számítanak 0, amikor arról beszélünk, ezt a helyet a tömbben, hogy kellene lennie 0 helyen, ez állítólag location 1, és ez nem is létezik mert csak kérték, az operációs rendszer, 2 ilyen helyek. Tehát azoknak, előzetes programozási tapasztalatok más nyelveken talán tudja, hogy ez nem minden esetben a tömbök vagy dolgokat az úgynevezett vektorok. Sőt, ha csak tartani hozzáadásával és hozzá és a hozzá dolgokat tömbök, amelyek, őszintén szólva, volt, hogy a képesség Scratch, és mégis úgy tűnik, hogy az adott fel ide mert C akkor programozás sokkal több kifejezetten. Ez csak te és a számítógép most, és a számítógép csak akkor fog tenni mit mondani, hogy igen. Tehát, ha csak mondd meg, hogy az Ön 2 úszók címén 22 vonal van, Ez minden, amit akarsz, hogy újra az operációs rendszert: space 2 fő részére. Tehát egyre inkább a saját programjai lesz esetenként kerekesszékes tekintetében tömbök. Ez csak egyfajta a természet a fenevad, amellyel mindannyian esendő, és egy bizonyos ponton úgy tetszik nagyon valószínű index határán túl a tömb. És ez csak egy divatos szóval ment be bracket valami és valami volt, csak túl nagy a szám. Te túllépett a tömb. De a fejjel most ez. A többi a program tényleg semmi alapvetően köze tömbök. Ez az egész csak arról szól, néhány egyszerű számtani számítástechnikai átlagok. Tehát itt ez a for ciklus itt először egy változót nevű összeget, amit inicializálása 0-ra. Aztán hajtogat 0-tól akár 2 megint, és mi hozzá, hogy összegzés változó az i-edik osztályba tartozik, tehát 0-ra tartó konzol 1. És akkor, ahogy azt tenni az iskolában kiszámításához az átlagos, egyszerűen vegye ezen összeget ossza el azt az összes vetélkedők, majd a jó intézkedés nevezünk egy függvényt itt nevű kerek. Most, mint egy félre, mi a helyzet ezzel a zárójeles int on line 34? Lehet, hogy jön már a szakaszban nem igazán beszéltünk róla hivatalosan itt, de mi ez int a parens valószínűleg csinál? >> [Hallhatatlan tanulói válasz] Igen, ez vonatkozik a casting vagy typecasting, ami azt jelenti, hogy 1 az adatok típusát, és átkonvertálja a másikba. Ezt nem teheted ezt minden adattípust, mert néha ez egy kicsit furcsa. De ebben az esetben, ha a visszatérési értéke kerek egy float mert végül is én vesz egy úszót és elosztjuk azt több, mint 2, Megyek vissza az úszó. De iskolában az emberek nem igazán szeretném tudni, hogy az átlagos volt, 93,4 mert akkor rájönnek valaha oly közel, hogy a kerekítés 95 pontot. Így szeretnénk inkább használni int, hogy kerek mindenkit a legközelebbi int, amely ebben az esetben lesz 94 pont nélküli utána. Szóval ez csak egy kis matematikai trükk. És mi jön vissza ez a fogalom az öntés, mert hatással lesz, ha még nem fedezte fel már, a probléma set 2. Tehát egy tömb, akkor, akkor lehet gondolni - ez fog nevettetni engem egész nap. Úgy néz ki, mint ez, ha készít egy képet róla, de a legfontosabb az, hogy a méret is az Ön által kiválasztott ha kérik az operációs rendszert. Van még kérdése majd a tömböket? Igen. [Hallhatatlan diák a kérdéshez] Ah, jó kérdés. A kérdés az, hogy mi történik a null 0 a tömbben? Nem létezik ebben az összefüggésben. Ez csak azért létezik, összefüggésben húrok, amit mindjárt jön egy pillanat. De egy tömb, mint a jelen esetben, minden, amit kap, amit kér az operációs rendszer számára. És mint egy félre, különben ez nem lenne egyértelmű, Azt mondogatom kérdezed az operációs rendszer, kérje az operációs rendszert. Egy operációs rendszer, mint bizonyára tudja, a Mac OS, Windows, Linux. Amikor hívás funkciók, mint a getFloat vagy ha nyilvánító változók, mint a minőségek, a végén a nap akkor arra vár választ, hogy valaki mást adni neked, hogy a memória mert mi, mint törekvő programozók Fogalmam sincs, hogyan kell ténylegesen fizikai hozzáférést szerez memória. De valaki nem: az operációs rendszer. Tehát amellett elénk a szép ikonok és menük és mappák és hasonlók hogy látod az asztalon, hogy a Mac vagy PC, operációs rendszerek is ezt az alacsony szintű evilági dolgokat, erősen technikai dolog kezelésének gigabájt vagy 2 GB memória van, kezelése a CPU, hogy van, és így tovább. Tehát, ha írsz kódot, te tényleg Hooking be az operációs rendszer ebben az értelemben. Megyek, hogy meg kell, hogy a minimálisra. Rendben van. Egyéb kérdések tömbök? Nem? Oké. Így az átmenet természetes módon tömbök valójában olyan téma, hogy ez egy kicsit ismerős. És mi tűnt még oly röviden ezen utolsó időben is. Ez egy string példa szerdán. Ez a karakterlánc példa egy nagyon egyszerű program, és én már valóban egyszerűsíteni azt a pár sort a mai célokra. Minden ez sorban a 19. kap egy stringet a felhasználó, tárolja a változó nevű s. Aztán a 22-től kezdődően ez nyilvánvalóan kinyomtatná a karakterlánc 1 karakter soronként. De hogyan csinálja ezt? Mi nyilvánító i változó, amelyben az értéke 0, és ez válik a régi szokás most. Azt nem látta ezt, amíg szerda, de akkor milyen ebből arra következtetnek, a neve strlen éppen visszatérjen mi adva s? A hossza a húr. Szóval, ha elmegyek, hogy egy string, idézet-unquote DAVID, ez remélhetőleg fog vissza nekem a 5-ös szám, mert a DAVID. Szóval ez a célja az életben, hogy egy string, akár kemény kódolt az Ön által vagy ebben az esetben dugva, mint egy változó, mint egy érvet, és kitalálja, mi a hossza a string. Szóval most itt vagyunk kölcsön néhány jelölést az előző kvíz példa. Ennek semmi köze az úszók, semmi köze a vetélkedők, de kiderül, hogy a kis fehér hazugság voltunk mondom óta hét 1 az, hogy a szöveg nem igazán létezik C. Egy karakterlánc végén a nap tényleg csak egy tömb. Ez egy sor bájt, így a byte, byte, byte, byte, amely visszahívás mindössze 8 bit, így darab memória, darab memória, darab memória, darabja a memória. És az eszközöket, amelyek egy string végrehajtása van azáltal, hogy az első karakter van, akkor itt, akkor itt, akkor itt, vissza háttal a számítógép memóriájában. Tehát, ha akarta, hogy pontosan ki a szót, mint HELLO, akkor tegye 1 karakter H, majd E, majd L aztán L, majd a O - 5 karakter összesen - valahol a számítógép RAM. De a legfontosabb adat az, hogy ők lesznek háttal a háttal, közvetlenül egy másik. Amikor amikor azt mondom, s [i], ami magyarul ez ad nekem? Mit jelent s [i] jelentik ebben az esetben? Igen. [Hallgató] Az i-edik karaktere. >> Pontosan. Az i-edik karaktere. Most én fog 0-val kezdődnek, mint egy my for ciklus van, de ez jó, mert minden kezd számolni 0-tól. Tehát s [0] lesz, hogy képviselje a H betű egy szó, mint a HELLO, s [1] fogja képviselni írni, mint az E-ben egy szó, mint a HELLO, és így tovább. És amit úgy tűnik, hogy ennek minden egyes iterációs e ciklus átmenetileg tárolja az i-edik karaktert változó nevű c, ami csak egy char, majd a mi kinyomtatott c úgy, hogy a végén a nap amit ez a program tesz, a következő. Ha bemegy a forrás könyvtárába, és teszek string1, és megyek előre, és fuss sztring1, és aztán írjon be egy szót, mint a HELLO, Enter, mindent meg tesz, nyomtassa ki ezt az 1 karakter egy időben. Szóval van egy lehetőség finomítás itt. Én ilyen csinál több munkát, bár ez inkább világossá talán ez így, mint szükséges. Melyik kódsor itt lehet talán dobja összesen? Igen. Vonal 24. Összhangban 24 Én nyilvánító változó c. Én tárolása edik karaktere s, de akkor én vagyok a c itt. Tehát én vagyok c, ezért úgy érzem, nem lehet csak úgy dobja a 24 vezetéken található. [Hallhatatlan diák megjegyzése] >> Pontosan. Szóval, amikor beszél a design programok észre ezt a kismértékű egyszerűsítését a kódot, ami ugyanolyan olvasható, de rájönnek, hogy s csak egy változó, az adatok típusa egy tömb, így s [i] csak megy, hogy azonnal térjen vissza Önnek az i-edik karaktert, hogy a string. És ha szeretné kinyomtatni azt, hogy rendben van. Csak ki kell használni% c, mert te nem nyomtat egy string, Ön nyomtat egy karaktert egy szövegben, és ez is az a hatása, nyomtatás edik karaktert. És emlékszem az egyetlen különbség valóban a múlt héten a printf az, hogy mivel az elmúlt hetekben tennénk valami szuper egyszerű mint a% s helyőrzőt, akkor a nevét egy húr van, Most vagyunk búvárkodás egy kicsit mélyebbre a motorháztető alatt, és azt mondja, nem nyomtat a húr, nyomtassa ki a karaktert biztosít. Így tehetünk valamit, egy kicsit más itt, mert van 1 másik - nem bug mert ez a program helyes, de én csinálok valami hülyeséget hogy megemlítettem röviden szerdán. De gondoltam vissza, hogyan lehetne ez a program tervezésében javítani még tovább? Igen. [Hallhatatlan diák válasza] >> Oh, jó. Így emlékszem, hogy mi vezetett a második változó nevű n utoljára, amely úgy tűnik, hogy ellentmond magunkat, mert a cél a második napja csak eldobni egy változót szükségtelen, de emlékeztet arra, hogy szerdán mi valójában ezt tette. Megváltoztattam a for ciklus, hogy ténylegesen egy vessző van, akkor n = strlen, majd ide tettem i > [Hallhatatlan tanulói válasz] >> Pontosan. Én nem emlékeztetve strlen újra és újra és újra, mert emlékszem, hogy a for ciklus működik. Még ha kezdenek bonyolultabb megjelenésű, Emlékeztetek arra, hogy a dolog, mielőtt az első pontosvessző az inicializálás, ami történik, egyszer. Az a feltétel, bár van a közepén, és ez lesz ellenőrizni minden alkalommal, hogy menjen át a hurok. Szóval ez a fajta ostoba, hogy azt kéri a számítógép ugyanazt a kérdést újra és újra - Mi a hosszú HELLO? Mi a hosszú HELLO? Mi a hosszú HELLO? - mert mint látni fogjuk ma, és én, szerdán, ez biztosan fog időt vesz igénybe, és ez nem egy nagyon jó hasznát időt, mert, hogy kitaláljuk, a string hossza tulajdonképpen úgy egy kis erőfeszítést. Ez nem azonnali, hiszen bizonyos nyelveken. Tehát megváltoztassák ezt az n, az ár Én fizetem mi? Látjuk a trade-off itt. Tudok időt takaríthat meg azzal, hogy nem kéri az azonos átkozott kérdést újra és újra, de ez fog kerülni nekem valamit, ami mi? [Hallgató] You elveszít egy bizonyos mennyiségű memóriát. >> Pontosan. Ez fog kerülni nekem egy kis memória. Tehát ebben az esetben kerül, mit? További 32 bit, mert n csak egy int szerint közvetlenül a szót int itt. De az, hogy oké? Őszintén szólva, ez valószínűleg rendben van, mert ha belegondolsz, minél hosszabb a szöveg, annál több időt fogok, hogy pazarlás mert strlen megy kap hívott újra és újra és újra minden iteráció a hurok. És ezekben a napokban, a Mac már 2 giga RAM, ezekben a napokban 4 giga RAM néha. Azt hiszem, így 4 e byte ténylegesen gyorsítsák fel a dolgokat. De ez lesz a trade-off és a téma valóban a programozás és a számítógép-tudomány A soha nem kap semmit ingyen. Ha szeretne javítani valamit, meg kell fizetnie azt viszont valahogy. Tér-idő ebben az esetben. Szóval ez volt minden vezető felé valami rejtélyes, mint ez, amely, mint akkor valószínűleg rájöttek már, valójában azt mondja? [Hallhatatlan diák válasza] >> Igen, ez, Ügyeljen arra, hogy igyon a Ovaltine, tulajdonképpen egy algoritmus nevű ROT13, ROT 1-3, ami csak azt jelenti, forgatni az összes levél 13 helyen, ami azt jelenti, hogy A, majd adjunk hozzá 13-tól, és menj pont, pont, pont egészen a 13. levél van, nem ugyanaz a dolog a B és a C és a D és így tovább. És ha tényleg konvertálni ez itt egy műszak 13-helyek, akkor kap vissza, hogy milyen keveset Ralphie volt, ami, győződjön meg róla, hogy idd meg Ovaltine. De most a probléma set 2, a standard kiadás legalább van, hogy a fajta nem e titkosítási magát, és meg kell valahogy venni a bemenet mint ez, és titkosítja vagy visszafejteni. Szóval melyik alapvető fajta vezet ezt a lehetőséget? Vessünk egy pillantást a harmadik példa itt. Először is, ez az úgynevezett ASCII. Mit jelent ASCII utalja vissza? American Standard Code for Information Interchange, ami egy igazán hosszú utat a mondás, mi? Mi az ASCII? [Hallhatatlan diák válasza] >> Mi ez? >> [Hallgató] A karakter megjelenítése. >> A karakter megjelenítése. Csak leképezi számok betűk, mert a világ szabványosított milyen számok fogja képviselni, amit leveleket úgy, hogy mindannyian használ számítógépet és a programok mind csak kompatibilis, amikor a kinyomtatott dolgokat a képernyőn. Így emlékszem, hogy 65 lesz, hogy képviselje az A, 97 lesz, hogy képviselje a kisbetűs. És így ez az egyszerű program itt ASCII kihasználva ezt a tényt - hogy a világ tudja, hogy a tőke A jelentése 65 - és ez csak kinyomtatja a feltérképezése. Szóval mielőtt belevetik magukat a kódot, hadd inkább nyit egy terminál ablakot. Hadd menjek előre, és ASCII, majd menjünk csak fuss ez a dolog csak elrontani a kimenetet. És ez csak működik ez: egy igazán nagy táblázatot, hogy csak azt mondja, minden a különböző kódok minden a különféle betűk. Tehát egy szuper egyszerű program, de nem kellett kemény kódot a 52 sornyi kimenet: 26 nagybetű, 26 kisbetű. Ehelyett Én ezt algoritmikusan egy pár hurkok. Figyeljük meg, mit tettem ide. Úgy vélekedtek, honnan i 65 akár 65 + 26, mert szerettem volna, hogy nyomtassa ki 26 betű az angol ábécé, i + + minden iteráció, és most észre ezt újra. Ez az ismételt barátunk typecasting amelynek konvertálása 1 adattípus másik mert mit akarok csinálni az adott program? Azt akarom, hogy számolni numerikusan, mert ez hogyan nőttem fel számlálás - 65, 66, 67, és így tovább - de nem szeretné kinyomtatni csak a számokat. Azt szeretné kinyomtatni a levelet, majd a számot. Azt akarom, hogy nyomtatni: szám, B: szám, de meg tudom csinálni ezt pontosan ugyanolyan változó. Szóval ki kell nyomtatni% c, mint helyőrző helyett egy karaktert, % D, mint helyőrző helyett egy számjegy vagy szám. Akkor mit tudok csatlakoztatni azokat 2 helyőrzők? Először csatlakoztassa a karakter egyenértékű i, aztán nyomtassa ki én is. Tehát észre, ez is csak működik. Ahogy tudok öntött egy úszó egy int annak érdekében, hogy menjen egy valós szám egy egész szám, Itt tudok menni egy int a char, ami egy kicsit furcsa - nem egészen leképezni rá a világban -, de a számítógépek a char csak egy szám a motorháztető alatt, így vagyunk, hogy valaha is olyan explicit itt a számítógépet, mondván: printf ki kell nyomtatni, nem én, mint 65, nyomtassa ki, mint a numerikus megfelelője. És kiderült, hogy én technikailag nem is kell ezt. Mit csinálok egy perce kifejezetten casting megadásával milyen adattípus akarok menni és a. De észre, hogy én már ezt placeholder% c és ez a másik% c placeholder itt. Annak ellenére, hogy ez nem int, a számítógép felismeri, hogy a char, ez csak egy int a motorháztető alatt. Szóval, ha tényleg újrafordíthatod ezt, és futtassa újra a ASCII program, észre, még mindig csak működik, mert a számítógép felismeri, hogy itt van ez a levelezés. Nos, ez sokkal fontosabb, hogy nem a kifejezett casting a világon, az úszók, hogy ints mert te valójában, hogy egy számított határozatot: eldobni mindent, a tizedespont után. Itt tényleg semmi, hogy dobja el, mert a karakter csak egy szám, és egy sor csak egy sor karakter. Tehát, ha eljön az ideje, a végrehajtó néhány titkosítás vagy dekódolás, hogyan lehet az, hogy mi is valójában lefordítani valami ilyesmit értelmetlen, Ügyeljen arra, hogy igyon a Ovaltine? Mi van, ha tudjuk, hogy most - vessünk a feltételezés -, hogy a legfontosabb, a szám, hogy mi forog mindezeket betűkkel, a 13-as szám? Így mentünk a B betű egészen O elején a mondat, Ügyeljen arra, hogy igyon meg Ovaltine, mert ha én a B és aztán megyek C, D, E, F, G, H, I, J, K, L, M, N, O, ezért a titkosítást a B betű lesz O mert én csak hozzá 13 hozzá. Tehát, ha akarom visszafejteni ezt, alapvetően meg kell tenniük O majd vonjuk 13 belőle. Vagy őszintén, mert van 26 betű az ábécé, ez csodálatosan szimmetrikus, mi is csak adj 13 és akkor visszatérünk a levelet B. De hogyan megy a végrehajtó ilyesmit Caesar vagy tényleg manipulálásával húrok általában? Ha a B betű, ami szám? Mi a B betű? Szóval ez 66, ugye? Tehát, ha a levél A jelentése 65, a levél B 66, így 66, csak annyit kell tennie, hogy adjunk hozzá 13-tól, és ez ad nekem 79. És ha megy a mi kis puskát, 79 sőt térképeket rá O. De van egy kis sarok helyzet. Mi az, mondjuk, a Z betű? Ha így teszünk 66 + 25, hogy egészen a végéig az ábécé, mi vagyunk a 91. 91 + 13 ad nekem 104, és tudod mit? 104 nem egyenlő egy nagybetű beírásához. Menjünk vissza egy kicsit puskát itt. Ha ezt a programot futtassuk újra a készüléket, vegyük észre, hogy 104, ha megyek vissza a terminál ablak, 104 látszólag a kisbetűs h. Tehát szükségünk van néhány fontos trükk itt az, hogy megbizonyosodjon arról, hogy mikor kezdődnek Z és mi adjuk hozzá 13-ez nem akarjuk, hogy csak folyamatosan kitartott a nagyobb és nagyobb számok. Mit igazán akar csinálni? Azt akarod, hogy betakar körül. Így kiderül, ahogy láttam talán pont most vagy a probléma set spec magát rájöttem, hogy van ez a másik szereplő C, amely szintén egy százalék jel, de mivel mi már használják% itt meg egy helyőrző, tudjuk, hogy különösen a probléma set 2, van még valami ilyesmi: int x = y% z. Hadd be ezt egy nagyon általános formája ez. Százalék azt jelenti, amit egy programozási nyelv? >> [Hallgató] Modulo. Modulo, amely divatos szóval a maradék. Annak ellenére, hogy van egy kis különbség a definíció van, ez azt jelenti, ossza y és z, de nem tér vissza az eredménye, hogy a körzet; inkább vissza a többi. Tehát, ha y valóban 3 és Z jelentése tulajdonképpen 2, 3 osztva 2-1-val egy maradék 1, így mit x ténylegesen egyenlő ez a forgatókönyv? 1. Ez ilyen egyszerű, alacsony szintű ötlet. Beletelik egy kis ideje, hogy az elméd köré azt mert ez valószínűleg már egy ideje, mióta is kellett érdekel maradékot és ténylegesen használja őket valami céltudatos, de ebben az esetben az az egyszerű tény, hogy lehet menni egy nagy szám, mint 3 egy viszonylag kis számú, mint a 2 és majd köré hatékonyan segítségével a fennmaradó kisebb értéket, mint 1 lesz felbecsülhetetlen trükk hogy tudjuk használni mind valami ilyesmi Caesar, és ez a másik dolog Vigenère A probléma készlet 2, de ez lesz a visszatérő trükk az egész félévben. Ez az egyszerű, az egyszerű ötlet, csak figyelembe a többi általános fog lehetővé teszi, hogy betakar körül. És ahogy elkezdünk játszani még nagyobb tömbök, ahogy elkezdünk játszani még nagyobb memóriával is, ez lesz egyre inkább egy hatalmas trükk. Tehát bármilyen kérdése majd ASCII vagy ábrázolását karakterláncokat tömbök? És mi lesz, hogy aztán 1 rovátka tovább. Igen. [Hallhatatlan hallgatói kérdésre] >> Jó kérdés. Mit jelent, ha egy változó csillaggal előtte? Hadd elhalasztani válasz, hogy minden részlet, de utal a téma ismert mutató. Mutatók köze memória, és mi tulajdonképpen ma véve az első lépés, hogy a vita, de most, hadd tettetni, hogy a csillag nem létezik és mi továbbra is hívja húrok húrok használata helyett char *, amely akkor már valószínűleg látott, és teszem a képernyőn egy pillanat, mint egy teaser. Szóval mi jön vissza, hogy így részletesebben, mint sokan akkor valószínűleg tetszik. Végül, ma nem. Igen. [Hallhatatlan diák a kérdéshez] Milyen összefüggésben van-e, hogy a megjelölés a karaktert? >> [Hallgató] Igen. Szóval alapértelmezés, ha nem tesz egy +, csak pozitív számok feltételezni. Tehát, ha csak írni az 1-es szám, ez egy pozitív 1. Ha valóban szeretné adni a tagadása érték, szó szerint kell tenned -1 a billentyűzeten. De ez valószínűleg nem a kérdés. >> [Hallhatatlan tanulói válasz] Jó kérdés. Oké. Szóval ez van köze, én gyűjteni, valamilyen hiba akkor ütközött mert te konvertáló értéke egy karakter, de valahogy negativitás van szó, és így a karakter most jött ki munged valahogy. Tehát most hadd leegyszerűsíti egy kicsit, amíg meg nem jön vissza ilyen témában. Most, gondolom, a dolgok ilyen módon - és ez egy leegyszerűsítés. De a világ egy egész, akkor hány bit a rendelkezésére áll? Van 32 bit. És eddig beszéltünk számát egész akkor ezért képviseli nagyjából 4 milliárd teljes, mert van 32 bit, annak érdekében, hogy ez a 2 a 32, tehát ez mintegy 4 milliárd euró. De láttunk egy héttel vagy 2 napja, hogy nem igazán van számtartományt 0-tól akár 4 milliárd. A tartomány helyett megy durván negatív 2 milliárdról pozitív 2 milliárdot. De ez akkor felmerül a kérdés, hogyan képviselik a fogalom negatív 2000000000 nem is beszélve a negatív 1? Mert most már tudjuk leegyszerűsíti, és csak azt mondják, hogy fogunk használni a bal szélső bit E 32 bit, és ha ez a 1 ez egy negatív szám, és ha ez a 0 ez egy pozitív szám. A probléma az, hogy az egyszerűsített ábrázolása negatív számok hogy ha szándékosan, hogy okos, és megpróbálta átalakítani a karakter több vagy fordítva, nincs olyan dolog, mint a negatív karakter. A világ a ASCII, amely felhasználja a csak 8 bites, mind a 8 e bit számít, és a bal szélső bit semmi köze a negativitás. És csak hogy világos legyen, ha azt mondom, legbaloldalibb bit, emlékeztetni arra, hogy amikor megcsináltuk a bit kapcsolatos példák az első héten emlékeztetni arra, hogy felhívta a dolgok, mint 1001101, valami ilyesmi. Amikor azt mondom, a bal szélső bit, csak a szó szoros értelmében: az 1, hogy írsz egészen át a bal oldalon. Így a világ karakterek nincs fogalma a negativitás, hogy a bal szélső bit valójában valami köze ASCII, semmi köze a negativitás. Szóval ez úgy hangzik, mint - és ki az összefüggésben nehéz pontosan válaszolni - de valahogy, a kód zavaró, hogy a bal szélső bit a képviselő negatív értéket amikor valóban része volt a karakter kérdést. És ismét, én oversimplifying mert a számítógépek ténylegesen egy kicsit szakértő mint a változó, hogy bal szélső bit egy 1-es negatív előjellel szemben a 0-ra. Ezek helyett, ha kíváncsi a Google, használja valami tipikusan az úgynevezett 2-es komplemens, amely egy kicsit kifinomultabb egy olyan megközelítés de az ötlet végül is ugyanaz. Tehát röviden kellett azzal a ténnyel, hogy te is masszírozó egy számot egy karakter vagy fordítva, de a kód nem volt tudatában a ténynek hogy 1 e bitek volt jelentősége a numerikus világon. Ez nem az az eset áll fenn a karakter világon. De ez úgy hangzik, mintha rögzített, amely esetben a vitás most. Egyéb kérdések. Oké. Szóval eddig minden program amit írtam volna be talán a felhasználó formájában, funkciókat, mint getInt, getString, vagy ha olvastam előre a különböző könyvekben vagy online referenciák, Önök talán használt funkciók, mint a scanf, amelyek, őszintén szólva, akkor használja a CS50 könyvtárban. De egy hét, vagy 2, akkor tényleg megmutatjuk, hogyan a CS50 könyvtár végrehajtása hogy mi kerülhet a képzés kerekekkel összesen. De kiderült, hogy van egy másik módja, hogy input egy felhasználó. Sőt, mi magunk is használnak parancssori argumentumok egy pár hete. Minden alkalommal, amikor már fut csenget, vagy már fut tenni, már nem csak a beírt csenget, Enter, még nem adta, hogy, az Enter billentyűt. Mit értünk általában írott szó után a csengés nálunk terminál ablak parancsot? [Hallgató] A fájl neve. >> A fájl neve, ugye? Hello.c vagy mario.c vagy bármi a megfelelő fájl neve. És ebben az értelemben amit valójában történt, amit befolyásolja viselkedését csenget mert minden bizonnyal az emberek, akik írtak csenget fogalmuk sem volt, hogy a kis öreg Ön akartam írni egy program neve mario.c évvel később. Szóval kellett valahogy befolyásolja a viselkedését, hogy a program, és hogy a program csenget kellett írni olyan módon, hogy el tudja fogadni bemenet Öntől hozzáadásával szavakat a prompt, mielőtt a felhasználó találat Enter billentyűt. Így kiderül, hogy egy ideje már nem nyilvánításáról szinte az összes program kezdeni, mint ez - int main (void) - és aztán már ment előre és elkezdtem írni a kódot. És talán van néhány éles magában foglalja a tetején a fájl, de szinte az összes program eddig megkezdődött ennek bár lehet, hogy látott szakaszban, a könyvek, internetes hivatkozások , hogy ez valójában nem kell semmis. Egy másik törvényes formában ez hogy van int argc majd karakterlánc argv []. Akkor most mi van ez ami? Kiderül, hogy argc, ami egy emberi konvenció - ha nevezhetjük ezt foo, de ez csak egy sokkal kevésbé világos az olvasóknak - argc csak egy érv a nevezett funkció fő képviselő mit? Mit jelent argc állni azoknak ismerős? [Hallhatatlan diák válasza] >> Igen, számos érv vagy érvek számítanak. Ez ennyire egyszerű. Hány érveket át ezzel a programmal? Mit jelent ez? Ha a parancssorban már fut valami ilyesmi - csenget mario.c-- argc mikor Enter fog tartani egy értéket, kissé zavaróan, 2. Így kiderül, hogy az érv argc száma, de történelmi okok miatt a program neve is benne van, hogy a gróf. Szóval argc 2, ha írtam csenget mario.c. Mit jelent argv tartalmaz? Először is, argv néz ki, mint egy húr, de nem egészen mert a múlt szerdán, és még inkább ma, ezek szögletes zárójelek jelölik mi? Ez egy tömb. Nincs számát a tömb, és kell, hogy értelme ösztönösen azért, mert az emberek, akik írtak csenget évvel ezelőtt biztosan fogalma sem volt hány szót az emberek, mint mi, akkor írja be a parancssorba előtt üti az Enter billentyűt. Tehát ebben az esetben is úgy nyilatkoztak, hogy a funkció fontosabb, mint vesz egy sor érvet, 0 vagy több érveket. Ők nem tudják előre, hogy hány van, így szándékosan nincs szám belsejében ezek szögletes zárójelben. De az a tény, hogy a szögletes zárójelben lévő vannak mondja a számítógép, számíthat egy tömb. Argv csak összevont írásmód érvet vektor. A vektor egy divatos szóval tömb, és a tömb egy divatos szóval a lista vagy gyűjtemény. Tehát ez csak azt jelenti, hogy ha írsz fontosabb, mint ez helyett, mint hogy mi már csinálja az elmúlt hetekben, A program most már megvan az ereje, hogy elfogadja parancssori argumentumok annak érdekében, hogy többé nem kell írnod ​​mario, majd nyomja meg az Enter billentyűt, majd írja be a számot, hogy hány blokk magas szeretné, hogy a piramis lenni, majd nyomja meg az Enter gombot. Azt nem is kell használni a getString többé vagy getInt getFloat vagy ami azt illeti. Mi is csak várjuk, hogy a felhasználó adja meg ezeket a szavakat a parancssorban is csakúgy, mint a szerzők zengés úgy döntött, hogy lenne egy igazán bosszantó programot ha összeállításához a kódot akkor először gépelt csenget, Enter, akkor azt mondta, hogy a felhasználó, kérjük, írja be a nevét a kívánt fájl fordítani, akkor írja mario.c és nyomja meg az Entert. De pontosan ez az, amit csináltam, hogy a felhasználók az elmúlt pár hétben. Az általunk használt getString, és várjon, amíg a program fut kérje őket bemenet. , Hogy már nem kell az eset. Tehát ebben a példában van, most már karakterlánc argv, és ez is egy leegyszerűsítés, képzési kerekek hamarosan jön le. Ez a több helyes írásmódja ezzel az alternatív nyilatkozat főbb mert kiderül, hogy mi folyamatosan hív karakterlánc valójában egy csillag, egy csillag, saját tényleges meghatározása, de ez csak úgy néz bonyolult, ez zavaró az első, ezért egyszerűsíteni mellett csak létrehozásával szinonimája a fajta A CS50 könyvtár térképek char * e inkább felhasználóbarát szó string. Szóval tényleg megpróbál ez akkor. Hadd menjek előre, és nyissa meg a gedit itt. Hadd menjek előre, és nyissa argv az 1. Ez a program nyilvánvalóan kinyomtatja az érveket, de az angol értelemben az nézi most ezt a kódot, mit csinál ez konkrétabban? Ha begépeljük a parancsot a.out foo bar, mi lesz nyomtatva, a fekete és a fehér ablak? A.out foo bar, az Enter billentyűt. Rajta. Igen. >> [Hallhatatlan tanulói válasz] Jó. Szóval a.out, új vonal, foo, új vonal, bár, az új vonal. Miért van ez? Mi természetesen megerősíti egy pillanat. Ez egyfajta bolyhos sor kódot.  Csak kiírja egy új sort csak azért, hogy a dolgok szebb a képernyőn. Ez egy hurok, ami iterációjával 0-tól a maximum argc, és ez növelésének minden közelítésén + +. Szóval ez most mondja nyomtatni egy string, mivel ez által implikált% s. Argv [i] nagyjából ugyanezt a gondolatot az előző példában. Szoktunk hívni a változó s; most hívják, önkényesen, argv. Ez azt jelenti, nyomtassa ki az i-edik miszerint adta meg a parancssorban, majd ezt követően az egész dolog történik, csak a jó intézkedés nyomtatni egy új vonal. Tehát lássuk ezt. Hadd nyissa meg a terminál ablakot. Hadd összeállításához argv 1, és most hadd futni argv 1, az Enter billentyűt. Hmm. Oké. Fussunk foo bar. Érdekes. Baz. És ha valaha is kíváncsi, miért írja ezt, ez csak is egy hülye számítógép-tudomány ilyen egyezmény. A világnak szüksége van, csak gyakran verbális helyőrzők a szavakat. Tehát, ha szeretné beszélni néhány általános string, számítógépes szakemberek most inkább azt foo mikor kell egy véletlen szót, akkor azt mondják, bár, ha szüksége van egy második véletlenszerű szót, akkor azt mondják, baz, ha szükség van egy harmadik szava, akkor azt mondják, qux ha kell 1/4 szót, és akkor ott van egy hatalmas vallási vitát interneten, hogy ami utána jön qux, így, hogy a Google, hogy kitaláljuk, mi a más tetszőleges szót kell. De ezeket nincs értelme egyáltalán, bár foo bar, ha a Google, hogy ez már azt jelenti, amely része a etimológia itt. Szóval mindez csinál, akkor nem nyomtat 1 ezen karakterláncok soronként. Szóval, ha ehelyett, bár szeretett volna egy kicsit szakértő, Tegyük fel, hogy nem akar nyomtatni minden húr soronként; Akartam nyomtatni minden egyes karakter minden karakterlánc soronként. Hogyan is inkább ezt? Mit kell változtatni ezt a programot, ha azt szeretné kinyomtatni nem minden szó de szeretnék nyomtatni minden szó levélre levélben, akkor a következő szó levélre levélben? Hogyan kombináljuk ezeket az ötleteket, eddig? Igen. [Hallgató]% c. >> Rendben. Tehát valahol szüksége van egy% c. Jó, mert nem akarom nyomtatni egész vonósok, szeretnék nyomtatni karakter. Mi van még? [Hallhatatlan diák válasza] >> Érdekes. Tehát szükségünk van egyfajta második dimenzió itt és most azért, mert úgy gondolja, az argv tömbként, de ez egy sor húrok. De az, mondjuk, 15 perc, mi egy string? Ez egy sor karakter. Szóval tényleg, argv tömb egy tömb a karakterek, tömb tömbök karakter. Így derül ki, hogy fel tudjuk használni, csak több szögletes zárójel jelölést. Akkor csináljuk. A tetején loop on line 19, megyek navigálhat az i-ig argc, de aztán fogom ezt csinálni: a - nem tudom használni én most. Szükségem van egy másik változó, mert azt akarom, hogy navigálhat át a szavakat de akkor is át a betűk a szavak így a fajta van egy függőleges tengely és egy vízszintes tengely körül, egyfajta fogalmilag. Így int j lesz 0, akkor akarok j ameddig j kisebb - és én ezt a tiszta fel egy kicsit. Hogyan navigálhat át a betűk egy string? Tettük ezt egy pillanattal ezelőtt. Strlen Az argv [i]. Jó. És ismét, csinálok egy kis hatékonyság itt nem teremt n vagy bármi más, de majd jön vissza erre. Tehát most j + +. Most, hogy francia tovább itt. Mit most szeretne nyomtatni minden iteráció? [Hallhatatlan diák válasza] >> Szóval [i] ad nekem a szót. [I] [j], a fajta, mint a mátrix. Azok, a matematikai-y háttereket, vagyunk a fajta árképzés még mélyebbre ebbe a mátrixba vagy ezt a tömb tömbök, Ennek a 2-dimenziós szerkezet. És most lássuk, mi történik itt. Hadd nyissa fel a nagyobb terminál ablakot. Hadd megismétlése, hogy az argv, 1. És én elszúrtam itt, ami egy jó lecke, mert én is elfelejtettem ezt. Értelemszerűen nyilvánító C könyvtári funkció "strlen 'típusú' unsigned - Én nem is tudom, mi a többi jelent, de láttam már ilyet, hallgatólagosan nyilvánításáról. Amikor azt látjuk, ez a hiba, mit jelent ez általában jelent? [Hallhatatlan diák választ] >> Elfelejtettem a könyvtár up tetején. De várjunk csak egy percet. Általában én elrontottam, mert elfelejtettem a CS50 könyvtár, de ez van. Általában én elrontottam, mert elfelejtettem standard I / O És őszintén szólva, nem is kell ezt. Nem használjuk getString ma. Szóval, mit is hiányzik? Van egy másik könyvtárba, hogy most meg kell használni alkalmanként úgynevezett string.h, és ez csak egy újabb könyvtár több funkciót, amelyek nem a standard I / O Akkor menjünk vissza a nagy terminál ablakot. Oké. Most már, a fenébe is, azt hiszem, tévedtem. Én a CS50 könyvtár. Így tudjuk kijavítani ezt akár 2-módon. Tudjuk venni a képzési kerekekkel, és most éppen ezt, vagy nézzük a fajta tartani, hogy az egyszerűsítés csak most be ezt vissza, megoldani ezt a problémát, és most menj vissza a terminál ablakban. Tehát egyértelmű, hogy a CS50 könyvtár nem csak a funkciók, ez is a kulcsszó húr, ezért e hiba történt. Szóval itt vagyunk. I rögzíteni mind a könyvtár kérdések. Az Enter billentyűt. Jó. Argv 1, foo bar, az Enter billentyűt. Kiváló. Így most már minden egyes betűje minden szó nyomtatott 1 per vonal, amely nem teszi egy nagyon érdekes program, de a nyilatkozat most már képes a nem csak iterációjával át szavak hanem az egyedi betűket szóval hangzik szörnyen ismerős hogy még a legegyszerűbb alkalmazások, mint például kódolási betűk egy string, mint ez. Menjünk előre, és hogy a mi 5-perces szünet van. És mikor jön vissza, akkor elkezd beszélni, ami a hatékonyság amellyel meg tudjuk csinálni ezeket a dolgokat jobban. Rendben van. Mi vissza. Köszönhetően az egyik TFs, aki játszik a sok bananagrams, valójában van egy csomó karakter nálunk ma fizikailag megtestesült e kis műanyag darabok, és hadd javasolni, hogy ez üres fehér lappal itt képviseli a RAM a számítógép - laptop, asztali, bármi -, és ott úgy néz ki, mint egy csomó belőle mert ha elkezdjük aprítás fel ezt a RAM kis byte méretű darabok, mondjuk önkényesen mondom, hogy valami, hogy a méret és a homályos jelentése - ott vagyunk, és menjünk kicsinyítés egy kicsit itt - mondjuk valami Méret képvisel egyetlen byte. Így valóban illik egy csomó bájtok vagy karakterek belsejében memória, amint azt a relatív méret itt. Tehát tegyük fel, most, hogy a cél az, hogy a memóriát egy string. Hogyan működik ez tényleg működik? A programok voltunk írásban, most már általában használ getString, de most egyértelműen, itt van ez a másik csatorna, amelyen keresztül juthatunk felhasználói input argv keresztül parancssori argumentumok. De mi folyik valójában a motorháztető alatt? Kiderült, ha szükséges - hadd lépjünk vissza az getString - a funkció getString A CS50 könyvtár, a felhasználó kéri a string, A felhasználó beír néhány szó - nevezzük HELLO. És mi már azt mondja az elmúlt hetekben, hogy a visszatérési értéke getString valójában egy string, mint a szó HELLO. De mit getString valójában csinál? Mivel a felhasználói típusok HELLO, Enter, getString van kitalálni, oké, hogy hány karakter van ez? Ez H-E-L-L-O. Így kell kiosztani, meg kell kérni az operációs rendszer - Linux ebben az esetben - legalább 5 byte tárolja HELLO. És mi majd bevételt csinálni, ha kap vissza az 5 bájt Az operációs rendszer hogy elrendezéséhez HELLO háttal hátra hátra. És mi is visszatért getString az adatok nagy darabja, amely úgy néz ki, mint ez. De ez egy kicsit pontatlan, mert kiderül, hogy ez nem olyan egyszerű mint csak tárolása HELLO a számítógép memóriájában mert tegyük fel, hogy a program, írok a C, majd felhívja getString újra, és a következő szó, a felhasználó által a Bye, Bye. Nos, azt kell, hogy illeszkedjen a szót BYE valahol a memóriában. Nem tudok cucc HELLO. Például, nem akarom, hogy a számítógép csak elindul felülírja ilyen Az eredeti szót, mert én még mindig használja a szót HELLO egy változó valahol az én program. Szóval B-Y-E-nek, hogy a végén valahol a memóriában. De az egyezmény általában az, hogy a következő karakterlánc kiosztani Valószínűleg, de nem mindig, lesz a végén a következő rendelkezésre álló memóriahelyet. És ha még nem kérték, az operációs rendszer minden memória mivel az utoljára hívott getString, esély a szót BYE lesz végül jobbra a szó után HELLO a memóriában. De ezen a ponton talán látni, ahol egy esetleges probléma merül fel. Mivel a következő darabokat a memória, a következő bájtok éppen szabad - tiszta fehér pala - a számítógép memóriájában voltak közvetlenül HELLO, úgy érzi, mint az első húr kértem meglehet hirtelen megváltoztathatja mert már alapvetően megváltoztatta a HELLOBYE helyett valahogy demarcing kezdetétől BYE és végét HELLO. Így kiderül, hogy mi folyik valójában a motorháztető alatt, ami lehet, hogy megpillantotta az online referenciák, illetve rész-vagy könyvek vagy egyáltalán nem csak még, hogy van valójában egy szándékos demarkációs szavak között a számítógép memóriájában. És valóban, ebben az esetben is, ahelyett, hogy csak helyezze BYE közvetlenül HELLO, ehelyett a számítógépet helyez különleges karakter, a speciális null karakter, hogy úgy mondjam, amely képviseli a marker backslash 0. Szóval hosszú történet rövid, emlékeztetni arra, hogy a karakterek ASCII képviselt. ASCII csak egy leképezés között, betűk és számok, és a legtöbb e levelek kezdeni durván 65 a tőke A, de kiderült, hogy akkor biztosan képviseli a szám 0, mint egy egész szám vagy bináris, , és kiderült, hogy a világ úgy határozott hosszú, régen: "Tudod mit?" "Nézzük tartalék 0 szám nem tükrözi semmilyen karaktert a billentyűzeten - "Nem betű, nem szám, nincs központozás. 0 különleges." "Ez lesz a különleges null karaktert, és fogunk írni, mint a \ 0". A különbség az, hogy ha csak azt írta 0, 0 egy karakter. Emlékeztetünk arra, hogy vannak ASCII kódok a 0, 1, 2, 3 mivel a karakter 0 eltér a szám 0. És láthatjuk, hogy ha megnézi vissza hét 1 amikor először beszéltünk ASCII, 0. és az 1. és 2 és 3 egészen annak 9-ben a saját ASCII kódokat. Ők nem, véletlenül, 0 és 9 között. Ők nagyon különböző. Szóval 0 csak azt jelenti, "Én vagyok különleges," és a \ 0 azt jelenti, szó szerint: "nem én vagyok a 0 karakter." "Én ezt a különleges értéket, a null karakter." Szóval valóban szükség van, még egy ilyen, mivel nem tudom, hogy ugyanazt a hibát kétszer. Tehát szó után a BYE mi is szükségünk lesz még egy ilyen null karakter. Hadd fogd a tollat ​​itt, és hadd gyorsan dolgozzanak egy \ 0 annak érdekében, hogy azt követően kértem az operációs rendszer, 2 húrok via getString majd egy másik hívás getString, ez az, ami valójában a memóriában. Szóval, mire visszajövök egy string, én tényleg kezd vissza, hogy a és amikor megkapom a következő szöveget, én nagyon, hogy újra ezt. Szóval ez felveti a kérdést, strlen először, mi is vissza? Mikor hívja strlen a húr s és s volt, a szó HELLO, hogy a felhasználói beírt, mit is nyilván azt a hossza HELLO volt néhány perccel ezelőtt? Ez volt 5, ugye? H-E-L-L-O. És ez valóban hogyan strlen működik. Visszaküldi amit egy normális emberi lény elvárná, hogy a string hossza legyen. De a valóságban, milyen nagy a tömb karakter, ami tárolja hello? Ez valójában 6. Tehát strlen nem említi ezt a tényt az Ön számára. De a motorháztető alatt a számítógép valóban a 6 byte tárolására egy 5-betűs szó, és ez igaz nem számít, milyen hosszú a szó. Ott mindig lesz egy speciális null lezáró karaktert végén a húr A demarc teljes hossza. Tehát, ha most az a személy, végrehajtási strlen 20, 30 évvel ezelőtt, hogyan megy a végrehajtó strlen magát? Mi magától értetődőnek, hogy létezik, mint amit magától értetődőnek, hogy a printf létezik, de ha HELLO a kérdéses szó és mi van a memóriában van valami, ami úgy néz ki, mint ez, ha kellett oldottuk strlen, mert felkérték, hogy vagy azért, mert őszintén szólva, nem tudtad strlen létezett - meg kellett dobni ezt a saját - hogyan tudnál végre strlen adva valami, ami úgy néz ki, mint ez? Most, hogy tudjuk, hogy egy string egy tömb, akkor iterációkhoz minden egyes karakterek felhasználásával valami hasonló - Próbáljuk ezt a repülésre. Hadd menjek be a készülékbe. Hadd hozzon létre egy új fájlt, strlen.c. Hadd menjek előre, és már nem tartalmaznak stdio.h hogy mi férhetnek hozzá printf. Hadd csináljam int main (void). Oh. Én csak ezt a saját most akkor. [Kuncog] Köszönöm. Ez az, amit csinálok. Rendben van. Szóval mielőtt bekapcsoltam a képernyőn, beírtam az egésznek. És most mit fogok csinálni a következő: printf ("Adj egy string:") Ez csak bolyhos utasításokat. Most hadd tegye húr s = getString. Már kell, hogy a változás most. Én a CS50 könyvtár hirtelen, hadd menjen előre, és írja be cs50.h. És most nézzük ezt: printf ("A hossz:% d, strlen [s] - és én még nem végeztem. Mi mást Hozzá kell tennem, hogy ez a program? [Hallgató] string.h. >> String.h. Szóval most, mi a strlen, úgyhogy győződjön meg róla, hogy a fordító tudja, hol van, így egy kis józanság megtekintéséhez. Kezdek egy string sorban 8 és 9-es vonal vagyok kinyomtatott hossza a% d. Akkor menjünk előre, és nyissa ki. Van, hogy strlen - lefordul rendben - strlen - hadd Nagyításhoz - Adja meg, H-E-L-L-O, az Enter billentyűt. A hossza 5. Oké, strlen tűnik működik, de a világ tudta. Szóval most már végre strlen magunkat az alábbiak szerint. Hadd vegyem ezt a könyvtárat el. Már nem férnek hozzá string.h, mert nem is tudtam, hogy létezik. De ez rendben van, mert én is végre strlen magam és tart egy string nevű input, és most azt kell kitalálni, hogy a hosszát a húr. Szóval, hogyan tudom ezt megtenni? Mi van, ha én - lássuk, hogyan kell ezt csinálni - Mit akarsz tenni? [Hallhatatlan diák válasza] >> Oké. Így meg tudjuk csinálni egy csomó módon. Hadd próbálja meg, hogy ezt a megközelítést. Hadd adjak magamnak egy int változó i, tehát én 0-tól indul. És hadd mondjam el: míg input [i] nem egyenlő azzal, amit? \ 0. Így kiderül, mint az ügy összes karakter írásakor őket szó szerint a program, kell használni aposztrófot, és nem idézőjelek. Tehát, ha én írni a levelet egy, megtenném, hogy a levél b szeretném csinálni. Ez viszont lenne egy string, nem egyéni jellegű. Szóval azt akarom \ 0 szó. Mit akarok csinálni ebben a hurok? Igazából kell egy másik változó, ezért int hossz lesz 0. Akkor is, ha nem biztos benne, miért kezdtük ahogy tettük, most, hogy megyünk ezen az úton, mit akarok on line 9? hossz + +, majd itt lent jarat: 10, visszatérési hosszát. Szóval, hogyan strlen végrehajtani? Ez ténylegesen végrehajtották talán, mint ez. Lehet, hogy az a személy, használt for ciklus, talán egy do while ciklus - ki tudja? Mi lenne tényleg meg kell nézni a motorháztető alatt a tényleges forráskódot Néhány nevű fájlban string.c valószínűleg. De itt gondolkodjunk, hogy mit csinálok. Én nyilvánító nevű változó i, beállítás, 0-val egyenlő. Én majd nyilvánításáról másik változó nevű hosszúságú, amelyben azt egyenlő 0-ra. Akkor azt mondom, míg az i-edik karakter bemenet nem egyenlő a különleges null karakter \ 0, növelni a hosszát. De amint az i-edik karakter ez a különleges képességgel, hogy mi történik a hurok? A rövidzárlat. Megáll, ami azt jelenti, hogy majd azonnal vissza hossza. Szóval, ha nem összezavar, menjünk előre, és menj vissza a terminál ablakot. Hadd újrafordítani. És én nem csavarja fel. Összeférhetetlen újradeklarálása A könyvtári funkció strlen. Így akartam, hogy túl okos a saját jó itt. A fordítóprogram valójában tudja, hogy van egy függvény neve strlen bár már nem szerepel a könyvtárban. Ez rendben van. Mindegy. Mi csak megy, hogy együttműködnek majd. Nézzük átnevezni a hossz. Hadd változtatni a használata, hogy hosszú itt, és ez lehetővé teszi majd csenget boldogabb. Mint félre, mert ezek közül néhány a funkciók olyan rohadt közös - strlen, prinf - ők valójában egyfajta különleges státus. És így csenget, csak tudja, hogy egy kis valami különlegeset róluk. Ez nem minden esetben a legtöbb funkciót, hogy ezért kaptunk üvöltözött. Hadd próbáljam meg újra. Szerencsére működött abban az időben. És most hadd futtatni saját strlen program. Adj egy string: H-E-L-L-O, az Enter billentyűt. És én elcsesztem. Miért? >> [Hallhatatlan tanulói válasz] >> Pontosan. Szóval magam itt egy nagyon szép külsejű végtelen ciklus mert bár én növelésének hosszúság Minden iteráció amit én egyértelműen nem csinálsz? Én nem növelésével i. Oké. Easy fix. Igen? Oké. No. Most állna afoul némely más gyakori hiba, amikor szükségem van zárójelben. És őszintén szólva, ezt a kódot kezd csúnya, így lesz egy stab Tisztítás fel egy pillanatra. De most én megnő mind a hossz és i. Őszintén szólva, már lát lehetőséget a fejlesztésre itt, de akkor jön vissza, hogy a. És most nézzük csak győződjön meg róla vagyunk, legalább haladunk. Ez történt egy pár, és én elhanyagolt megemlíteni ezt előre. Ha megvan a szerencsétlenség egy forgatókönyv, mint ez, hogyan erősít ez elmarad a készülék újraindítása, vagy a számítógép vagy lezárja az ablakot? Ez valójában egyszerű. Ellenőrző C küld ez a kis sárgarépa C szimbólum, és hogy csak megszünteti a legtöbb program. Ha van egy nagyon rossz végtelen ciklus, ami nyomtatás stuff végtelen sok alkalommal, Néha lehet, hogy megüt Ellenőrző C ezerszer, hogy ez valóban hallani. Szóval csak észre most, mert én nem nyomtat semmit, ez nagyon egyszerű. És technikailag, ha elegendő, de kapok türelmetlen, és én általában telibe találta, hogy számos alkalommal. Szóval strlen. Adj egy string: HELLO. Vajon fog működni ebben az időben? Oké. Egy másik gyakori hiba. Már újrafordítani. Ez szándékos volt, hogy az egyik. Rendben van. Szóval strlen, H-E-L-L-O, az Enter billentyűt. Kiváló. Szóval most már van egy strlen 5-ig. Tehát szó szerint reimplemented hogy a kerék. Tehát most hadd tisztítsa ezt fel, mert ez nem tesz engem lenyűgözött a tervezés az én kódot. Mit tudunk egyértelműen megszüntetése ebben a programban, hogy megtisztítsa ezt fel? [Hallhatatlan diák válasza] >> Igen. Szó, mi kezeljük i és hossza azonos. Akkor miért nem csak kap az intelligens, és azt mondják, miközben hossz? Inkább hívjuk csak azt hosszúságú kezdeni, inicializálja, a 0 mert alapesetben a húr nincs hossza, amíg kitaláljuk, mi ez. Most ezt, és most ez egy nagyon elegáns program. Egy változó. Én takarítottam fel, szigorítani fel. Tehát most menjünk vissza a terminál ablakot. Menjünk előre, és fuss ez. Gyártó strlen. Jól néz ki. Fuss strlen újra az Enter billentyűt. Adj egy string: HELLO, az Enter billentyűt. És úgy tűnik, hogy működik az 5. Most, hogy világos legyen, ha nem írt, például az 1-ben HELLO sztring majd BYE egy másik, akkor biztos, hogy több szó. Ha a kifejezés igazából akartam beírni nem volt HELLO, hanem, például, HELLO WORLD, vegyük észre, hogy mi nem lett volna ez a helyzet, igaz? Ez azt sugallja, hogy ez 2 szálakat. Ön bizonyára lehet szóköz karaktert, tehát ha valóban írt egy hosszabb mondatot mint HELLO WORLD, amit mi valóban a memóriában úgy néz ki, egy kicsit valami ilyesmi van. Rendben van. Van még kérdése, akkor az ábrázolás itt a húrok? Nem? Rendben van. Azt mondtam korábban, hogy hívó strlen újra és újra tudatosan így valószínűleg nem a legjobb ötlet, mert fogsz csinál egy csomó munka újra és újra és újra. Valóban, milyen munkára van szükség kitalálni a string hossza, látszólag? Meg kell kezdeni az elején, majd nézd, nézd, nézd, nézd, nézd amíg végre látni, hogy különleges képességgel, mely ponton, ah, most már tudom, hogy a hossza. Szóval, mi volt korábban, amikor strlen hívott újra és újra és újra, az oka, hogy azt javasolta, hogy kedves volt hülye, mert ismét, hogy a húr néz ki, hogy. Ez nem fog változtatni minden alkalommal, amikor halad végig néhány bukfenc, így csinálsz felesleges munkát. Ugyanakkor tudni kell, mint egy félre, hogy a fordító, mint ezekben a napokban csenget fejlesztettek ki sok éven át, és fordító írók, programozók, elég okos. És kiderül, hogy csengés és más fordítók valóban kitalálni, hogy a oké, igen, írtad strlen az Ön állapotát, ami technikailag azt jelenti, hogy nevezne újra és újra és újra. De okos fordító optimalizálni lehet az ilyen jellegű rossz felhasználói határozatok ki a kódot jogorvoslati dolgokat. Tehát nem csak észre, hogy néha a fordító okosabb, mint mi és egyfajta elrejteni a saját hibáit. De természetesen amikor a probléma készletek és hasonlók, nem kell gondolkodni azon alapvetően hibás tervezési döntések esetleg azon egyszerű oknál fogva, hogy mi lenne ennek így több munkát mint amit valójában meg kell csinálni. De hogy sokkal több munka? Abban az esetben, HELLO WORLD, kezdjük általánosítani a mérete ezt a problémát. Mi a hosszát a probléma vagy a méret a probléma amikor a szót a felhasználó beírt a HELLO? Ez látszólag 5, talán 6. Plusz vagy mínusz 1. Mindegy. Annyira közel fogjuk csak hívj it 5. Szóval mi a méret a probléma, amikor megpróbálják kitalálni, hogy a hossza HELLO? Ez 1, 2, 3, 4, 5, és talán 6. az utolsó karakter, de inkább általánossá mint n. Szóval n, csak a változó n, amit számítógépes tudósok jellemzően leírására a méret a probléma, és a probléma a kéz milyen hosszú HELLO? Mennyi időt vesz strlen tartani? Tart a sorrendben az n lépés, ahol minden lépést jelent meg egy karaktert, nézd meg a karakter, nézd meg a karakter. És mi volt ez a vita egy kicsit vissza, a műveletek száma valamit tart. Az első nap az osztály voltunk mindenkit félszegen feláll, és akkor mindenki elkezdett párosítás le egymással annak érdekében, hogy valóban számít ideális, hány ember volt a szobában. És mi is volt egy másik dolog, amely szerint, ha én csináltam, hanem a régi iskola út csupán kezdőár 1, 2, 3, 4, 5, 6 és így tovább, azt is, hogy a mérete, hogy a probléma mérete n. Voltak n ember a szobában. De nem tudtam, hogy gyorsítsák fel, ugye? Grade iskolai stílus tudtam kezdeni számláló 2s. 2, 4, 6, 8, 10, 12. És hogy úgy érzi, hogy sokkal gyorsabb, és valóban az is. Ez szó szerint kétszer olyan gyors, de a lényeg, ha egy másik 400 ember belépett ebbe a szobába egyszerre, e algoritmusok venne egy 400 vagy talán 200 lépést. De ezzel szemben, ha igazán okos, és ahelyett, hogy mindannyian számít magatokat, felidézni, hogy hogyan algoritmus működött. Mindannyian felállt. Hadd előre-e. Mindannyian felálltak, te párosított ki, majd a felét maga leült, fele úgy ült le, a fele akkor leült, és minden iteráció e ciklus hétről 0, akkor felére a probléma kéznél és elment n / 2, akkor n / 4, akkor n / 8. És a következménye, hogy az, hogy ha egy másik 400 ember belép a szobába, nem nagy ügy, ez lesz nekünk még 1 kerek, nem 400 több kör, nem pedig további 200 fordulóban. És így a történet is azt mondta egy kicsit vissza kellett csinálni egy kis valamit ezzel. Ez a piros vonal itt lineáris, ez egyenes, és ez a címkézés n mert a méret a probléma növekszik, ha az algoritmust vagy programot, amellyel te megoldásában vesz n lépéseket, tudjuk ábrázolja, mint egy egyenes vonal, ahol hosszabb időt vesz igénybe a nagyobb a méret a probléma. És a twosies megközelítés, számolás 2, 4, 6, 8, még egy egyenes vonalat, csak egy kicsit jobban. Beletelik egy kicsit kevesebb időt, így a sárga vonal alatt van a piros vonal pontról pontra. De még ennél is jobb volt ez a szent grál, amit az úgynevezett logaritmikus idő ahol még ha megint kétszer annyi ember a szobában, mi kétszeresen e telefonkönyv első napjától az osztály, Nem nagy ügy, hogy úgy még 1 oldal könny, úgy 1 további leült annak érdekében, hogy megoldja a problémát, hogy kétszer olyan nagy. És így a beszélgetés most fog kezdeni, amelyek a hogyan tudjuk valójában problémák megoldásában hatékonyan ha figyelembe vesszük a legegyszerűbb probléma, mint ez? Tegyük fel, hogy 8 ajtó mögött, amelyek bizonyos számok, és minden ezek a számok nem rendezve semmilyen módon, ők csak véletlen egész mögött az ajtókat, és mi feltesszük a kérdést, hogy hogyan megy a megállapítás a szám - ki tudja - 7 ajtók mögött? Mit, egy ember, tennie annak érdekében, hogy megtalálják nekem a 7-es szám ha újra minden ezek közül ajtók és látni egy értéket meg kell nyitni az ajtót? Mi lenne az algoritmust is talán? [Hallhatatlan diák válasza] >> Így kezdődik a bal és nyissa ki az ajtót, nyissa ki az ajtót, nyissa ki az ajtót. És a legrosszabb esetben, meddig fog tartani bennünket, hogy megtalálják a 7-es szám? És megint, ők nem válogatták szét, így ez nem olyan egyszerű, mint, nos, én megyek, hogy nyissa ki a 7. ajtót. Lehet minket, maximálisan, 8 lépéseket. A legrosszabb esetben, 7 véletlenszerűen a legvégén a vonal az ajtók, így lehet, hogy megpróbál minden n ajtót. Tehát megint itt, úgy tűnik, hogy egy lineáris algoritmus. Sőt, mi volt ez csak egy pár évvel ezelőtt. Az egyik elődök vitatták az pontosan ezt ahol nem volt digitális változata, akkor inkább volt egy tábla néhány darab papírt rajta. És amit én gondoltam, hogy tennie, hogy egy gyors pillantást, hogy ez hogyan ment, az egyik legjobb és talán a kínos lehetőségeket a színpadon hogy egy demonstrációs itt a Sanders. Mi volt 2 sor számok. Mi csak fog nézni, hogy mi történik itt, Sean a legtetején ezeket a sorokat. Kivéve, ha senki soha többé önkéntesek CS50, mi volt Sean áldását tartani ezt a kamera, úgy tudja, hogy több száz ember figyelte ezt már évek óta. De Sean volt egy csodálatos munkát - vagy ugye? - A ténylegesen találni nekünk adott számot. Tehát lássuk, hogyan oldotta ezt az algoritmust, hogy fogjuk folytatni ezt a beszélgetést hamarosan hogyan találjuk a dolgokat hatékonyan. [Malan a videó] Én mögött ezek az ajtók száma 7, hanem élj ezek közül néhány ajtók, valamint egyéb nem-negatív számok, és a cél az, hogy úgy gondolja, ennek a felső sorban a számok csak egy tömb vagy csak egy sorozata papírdarabok a számok mögött, és a cél az, csak a legfelső tömb itt találja meg a 7-es szám. És mi lesz azután kritika hogyan megy a csinálja. >> Rendben. [Malan] Keresse meg nekünk a 7-es számú, kérlek. [Nevetés] [Malan] Nem [nevetés] 5, 19, 13, [nevetés]. Ez nem egy trükkös kérdés. 1. [Nevetés] Ezen a ponton a pontszám nem túl jó, így akár meg is tartani fog. [Nevetés] 3. Gyerünk. Őszintén szólva, nem tudok segíteni, de csoda, hogy mit is gondol. [Nevetés] Csak a felső sorban, így megvan 3 balra. Így talál meg 7. [Diákok zúgolódás] [Malan] 17. [Diákok zúgolódás] [Malan] 7! [Taps] Szóval szerdán fogunk merülni ebbe és kifinomultabb algoritmusokat találni dolgokat. Most elmegyünk Önnek Sean és találkozunk szerdán. [CS50.TV]