[Powered by Google Translate] Szakasz Probléma Set 2: Hacker Edition Rob Bowden, a Harvard Egyetem Ez CS50. CS50.TV Szóval, én vagyok Rob. Én vagyok a rangidős a Kirkland. Ez a harmadik év TFing CS50. Ez az első alkalom, hogy mi változik a hagyományos előadás stílusú szakasz, ahol csak egyfajta értékelést mi történt Előadás és akkor srácok kérdéseket feltenni, Most, hogy egy sokkal nagyobb probléma-alapú, ahol az általunk használt Spaces, és - Ó, tehát az ötlet, hogy megy, hogy a linket, amit küldtem, és akkor te leszel az én Space. Van valakinek nincs laptop? Oké. Szóval lesz ezzel, és mi lesz ennek problémák él szakaszban és megvitatása, és kitalálni, hogy mi a baj és én is húzza fel néhány kódot, és talán beszélni ötleteit. Így már valaki nehezen? A chat oldalán, én nem tudom, ha mi lesz oka. Most, mint az előző szuperszakasz, ha voltak az osztályban, tudod, hogy mit szól. Az összes P sorozat ott lesz ezeket a részeket. Tehát P-set 2, leírások, azt hiszem, láttam azt a P-set 1 már. De nézd meg a P-set 2, amit mi lesz megy át ma. És akkor megjelenik egy részét kérdésekre. Szóval ez lesz az összes P-készletek, ott lesz egy szakasza kérdésekre. Eddig is azt mondta: "Érdemes ezt a lehetőséget a gyakorlásra." Önnek nem kell kérni, hogy nyújtson be ezt a programot. Az elképzelés az, hogy ezeket állítólag a fajta segít elindulni a probléma set. Azt hiszem, a Hacker kiadás, sokan feltételezik, hogy csak az új, érdekes dolgokat tanulni. Lehet, hogy nem közvetlenül alkalmazható a probléma halmaz. És most nem vagyunk tekintettel elküldte őket, de elméletben, a későbbi probléma készletek, lehet, hogy be őket, és így akkor sem jön szakasza vagy nézze meg a szakasz, hogy a választ, vagy ha csak kapni őket a saját Ha nincs kedve élvezem én jelenlétemben. Tehát az - azt hiszem, ez az első. Oh. Továbbá, az e szakaszok kérdéseket mi is kérdezed kérdések a rövidnadrág. Szóval azt hiszem, elméletileg kéne nézni ezeket mielőtt szakasz, de ez rendben van, ha nem, akkor menjen át őket. Tehát lehet kezdeni ezekkel: "Hogyan tud egy while különbözik a do-while ciklus? Amikor ez utóbbi különösen hasznos? " Tehát bárki bármilyen -? [Student] A do-while ciklus mindig végrehajtja legalább egyszer. Igen. Annak érdekében, hogy ez a különbség. A while ciklus - I'll just do it itt - while, megvan a feltétel itt, mivel a do-while, nincs feltétel, amíg gyere le ide. És így, amikor a program végrehajtása, és ez lesz a while ciklus, azonnal ellenőrzi, ha ez a feltétel teljesül. Amennyiben ez a feltétel nem igaz, akkor ugorja át a hurok teljesen. Do-while ciklus, a program fut, ez lesz a "nem". Semmi sem történik ezen a ponton, csak folytatja végrehajtó. Akkor, amikor eléri a "míg" ha a feltétel igaz, akkor az loop vissza, és újra meg újra és újra és újra, amíg a feltétel nem igaz, és majd csak esik át. Szóval, a különbség, hogy ez kihagyhatja már a kezdetektől. Ez szükségképpen végrehajtja egyszer majd végezhetnek több alkalommal, ha a feltétel mindig igaz. Tehát a while ciklus csak csinálni egyszer, vagy - a while ciklus -, akkor nem kell csinálni egyáltalán, hiszen amint megkapjuk hozzá, ha a feltétel hamis, akkor ugorja át jobbra rajta. Mivel a do-while ciklus, akkor végre egyszer, feltétlenül. Aztán, amikor eljutunk a feltételt, akkor ellenőrizze, ha ez igaz, vagy hamis. Ha ez igaz, akkor csináld újra, ha ez hamis, akkor csak tovább megy. Tehát, ha ez utóbbi különösen hasznos? Szóval azt lehet mondani, hogy a teljes egészében a 4 év, 3 ​​év, mindegy, hogy én már programozás, már használta ezt, mint például, a 10-szer. És valószínűleg 5 őket itt CS50 mikor vagyunk bevezetése do-while ciklusok. Szóval mikor használják do-while ciklusok? Mikor van a - igen? [Student] Amikor megpróbál felhasználói bevitel, vagy valami az ellenőrizni kívánt - Igen. Tehát nem-while ciklusok, felhasználói a nagy. Ezért az első pár problémát készletek, ha azt szeretné, hogy kérje meg a felhasználót, mint például, "Adj egy string", akkor nem tudja folytatni, amíg nem kap, hogy a string. És így, szükségszerűen meg kell kérni a húr legalább egyszer. De aztán ha választ valami rossz, akkor meg kell loop vissza és kérdezd meg újra. De más, mint felhasználói, nagyon ritka, hogy találkozom egy eset ahol szeretnék hurok "legalább egyszer", de valószínűleg több. Kérdések vagy -? Valaki felhasználhatja a do-while ciklus bárhol máshol? Oké. Így a következő egy az, hogy "Mit jelent a be nem jelentett azonosítója általában azt mutatják, ha a kiadott által csenget? " Szóval milyen kóddal tudnám írni, hogy "a be nem jelentett azonosító? [Student] Ez x = 2? Így tudjuk csak próbáld meg itt, x = 2. Fogjuk futtatni ezt - oh, nem kattintson rá. Tehát itt kapunk - rendben. "A be nem jelentett azonosító x." Szóval ez a be nem jelentett azonosító változó. Ez gyakran hívott egy változót azonosítóval. Szóval lehet, hogy nem tudja, hogy ez valójában egy változót, nem tudom, mi az. Szóval ez egy azonosítót. Akkor miért van az, be nem jelentett? Igen. Tehát egyértelmű a terminológia, a nyilatkozat egy változó az, amikor azt mondod, "int x" vagy "string y", mindegy. Az inicializálás a változót, vagy a feladat a változó, van, amikor azt mondja: "x = 2". Tehát ezek külön lépésben, int x, x = 2, és amíg - mi lehet egy csomó dolgot itt - de amíg ezen a vonalon történik, x még nem inicializált, de már bejelentették. És így nyilvánvalóan csinálni az 1 vonal, és most nyilvánító és inicializálása. Kérdései vannak? És végül: "Miért van az, Caesar Cipher nem túl biztonságos?" Tehát az első, nem akarna bárki is mondani, mi a Caesar Cipher van? [Student] Caesar Cipher csak az, hogy térképet, akkor váltani minden levél, egy bizonyos számú levél megy át, és helyezze vissza, és ez nem túl biztonságos, mert ott csak 26 lehetséges opciókat, és csak ki kell próbálnia minden 1 e, amíg nem kap rá. Oh. Szóval meg kell ismételni? A Caesar Cipher, ez - úgy értem, te leszel foglalkozik vele a problémákat, hogy a te - vagy azt hiszem, a Standard Edition a probléma meg nem ez a hacker kiadás. Így a standard kiadás a probléma halmaz, akkor kap egy üzenetet, mint a "Hello, world" és akkor is számos, mint a 6, és hogy ezt az üzenetet, és minden egyes karakter, akkor forgassuk el 6 pozíciós az ábécé. Így a "h"-ban helló válna h-i-j-k-L-M-n. Tehát az első betű lesz n. Mi ugyanezt e. Ha van, mondjuk, z, vagy valami, akkor tekerje vissza körül "a." De minden karakter kap ciklikusan 6 karakter később az ábécét, és ez nem nagyon biztonságos hiszen csak 26 lehetőség, hogy sokféleképpen lehet tekerje egy levelet. Így csak próbáld mind a 26, és még feltehetően egy elég hosszú üzenetet, csak 1 e lehetséges 26 dolog lesz olvasható, , és olvasható az egyik lesz az eredeti üzenetet. Tehát ez nem egy nagyon jó módja a titkosítható semmit. Független az említett nadrág, "Mi a funkciója?" Tehát mi a funkciója? Igen. [Student] Ez olyan, mint egy különálló darab kódot, akkor hívja, hogy menjen át, és akkor kap a visszatérési értéke bármilyen. Igen. Szóval majd válaszolni által is választ a következő - vagy ismételt által is csak megválaszolásával a következő alkalommal. Használhatja funkciókat ahelyett, hogy csak a másolás és beillesztés kód újra és újra. Csak hogy ezt a kódot helyezze be a fuction, és akkor is csak hívja a függvényt ahol voltál másolás és beillesztés. Így funkciók hasznosak. Tehát most fogunk csinálni a tényleges problémákat. Az első. Tehát az ötlet az első az, hogy adja át egy string, és függetlenül attól, hogy a - vagy nincs benne csupa kisbetűvel? Ez nem mond csupa kisbetűvel. Így az üzenet bármi lehet, és - ó, nem. Ez nem. "Az egyszerűség kedvéért, akkor feltételezi, hogy a felhasználó csak input kisbetűket és terek." Így adja át az üzenetet csak kisbetűket, aztán felváltva a tőke és a kisbetűs - mi változik a húr, hogy a tőke és a kisbetűs, felváltva. Szóval mielőtt kapsz egy második, még belevetik magukat a probléma, mi az első dolog, amit tennünk kell? Ó, mit tettem, csak kattintson a? Ó, csak rákattintott egy e-mailt ide. Tehát az első dolog, amit tennünk kell - nézem a rossz? Ez a része ez? Nem, ezek még mindig ott van, bár. Oké, még mindig itt van. Most már nem lehet feltételezni, -? Igen. Itt nem lehet feltételezni, hogy ez csak kisbetűs és terek. Tehát most meg kell küzdeniük azzal a ténnyel, hogy a betűk is, amit szeretnénk, hogy legyen. És így az első dolog, amit akarok az csak kap az üzenetet. Csak kell, hogy egy string, string s = getString, oké. Most ez a probléma, van egy pár módon csinálja. De mi lesz a használni kívánt bitenkénti operátorok itt. Vannak emberek, akik vagy nem voltak meg a szuperszakasz, vagy valami, és nem tudom, mit bitenkénti operátorok? Vagy hogyan viszonyulnak ASCII bármilyen módon? [Student] nem voltam a szuperszakasz, de tudom, hogy mit bitenkénti operátorok. Oké. Így aztán nem kell, hogy menjen át az alapokat a őket, de elmagyarázom hogy mit fogunk használni kívánt itt. Tehát 'A': bináris reprezentációja tőke A, a szám 65. Én csak fog nézni - 41 lesz 01000001. Szóval, hogy kell 65 decimális, így ez a bináris a karakter tőke A. Most, a bináris a karakter kisbetűs "a" lesz ugyanaz a dolog, majdnem. Ez - 6, igen. Ez helyes. Szóval bináris tőke A, bináris kisbetűs "a." Tehát észre, hogy a különbség az A és "a" ez az egyetlen bit. És ez történik, hogy a 32 bit, a bit a szám 32. És hogy van értelme, hiszen egy a 65, "a" 97. A kettő közti különbség 32. Most már tudjuk, hogy lehet konvertálni tól "a" azáltal, hogy egy és bitenkénti fejekhez meg, és - úgy néz ki, mint a 1. Ez egy bitenkénti OR, a 00100000, és akkor nekünk "a." És mi lehet eljutni az "a"-től a bitenkénti AND művelet a 11, 0 ezen a helyen, 11111. Szóval ez majd ad nekünk pontosan mi az "a" volt, de törli ki ezt az egyedi bit, így lesz 01000001, nem tudom, ha én számított jobbra. De ez a technika bitenkénti fejekhez, hogy a tőke a kisbetűs, és bitenkénti AND művelet eljutni kisbetű a tőke, nem kizárólagos A. Minden betű, K vs k, Z vs z, mindegyik csak úgy térhet el ezen egyetlen bit. És így akkor használja ezt módosíthatja bármely kisbetűs minden nagybetűvel, és fordítva. Oké. Így egy egyszerű módja annak, hogy ebből -, így ahelyett, hogy kiírja bármi 1011111 jelentése - egy egyszerű módja a képviselő ezt a számot, és ez nem egy hogy mentem át a szuperszakasz, de a tilde (~) egy másik bitenkénti operátor. Mi ~ tesz, úgy néz ki, a bit képviselet. Vegyük minden számát. Ez csak néhány bináris szám, és mi ~ jelent ez csak fejtetőre összes bitjét. Tehát ez a 1 volt, most a 0, ez egy 0, most egy 1, 010.100. Szóval ennyi ~ nem. Tehát a 32 lesz a szám - megszabadulni, hogy - így 32 lesz a szám 00100000, és így ~ e lesz ez a szám ide, hogy én ANDed "a"-val. Mindenki látja, hogy? Ez elég gyakori, mint ha azt szeretné, hogy kitaláljuk, későbbi dolgok, amiket lehet látni, ha látni akarjuk, ha - vagy akarunk mindent, minden egyes bit készlet, kivéve az 1 Ön inkább nem ~ a kicsit, hogy nem akarunk beállítani. Tehát mi nem akarjuk, hogy a 32 bit készlet, ezért ne ~ a 32. Oké. Így tudjuk használni az összes e itt. Rendben, rendben van, ha nem történt, akkor az lassan játszott együtt, vagy gyalog át ezt, ezért - ezen keresztül. Séta ezt. Tehát a húr, és azt akarjuk, hogy hurkot egyes karakter az adott karakterláncot, és tegyen valamit hozzá. Szóval hogyan hurkot egy string? Mire kezelhető? Nem fogok csinálni itt. Igen. Szóval én iterator, és azt mondta, hogy, de hogyan tudom, hogy hány karakter van a húr? Strlen (s), akkor i + +. Szóval mit tettem itt nem a legjobb módja a dolgok. Tudja valaki, hogy miért? Mert ellenőrzése nyelvét a string minden egyes alkalommal. Így fogunk mozgatni akarjuk strlen, mondhatnám itt, int length = strlen (s), majd tegye i > 1 bit. Ez lehet több mint 1 bit, egészen addig, amíg a bitek alatt ebben a pozícióban található a ugyanaz. Tehát szükségünk van legalább 26 karakter - vagy, vannak 26 karakter. Tehát szükségünk van legalább 26 számok jelentik a különbséget - A különbség az A és az "a" kell, hogy legyen legalább 26, , különben nem lett volna egészét képviselték a főváros számokat. Ez azt jelenti, hogy az A, ha elkezdünk 1, ez fog használni az összes ezeket a biteket, Mindezek a első 5 bit, hogy képviselje minden keresztül Z Ezért a következő bit, vagy ezt a bitet, a következő bit az, aki döntött, hogy különbséget A és az "a." Ez is oka annak, ASCII táblázat, van 5 jelek elválasztására nagybetűvel honnan kisbetűs. Mivel ezek a szimbólumok, az extra 5, hogy hozza fel a 32 pedig a kettő közti különbség. [Student] Úgyhogy tehetnénk, mert ASCII tervezték így. Igen. Hanem ASCII - a különbség is lehet mindkét ezeket a biteket. Like, ha A 10000001 voltak, és "a" volt 11100001 - elfelejtettem, mindegy. De ha ez az, akkor még mindig használja az "a" - A. Ez most a különbség, és az "a" még ezen 2 bit. Azt hiszem, ez van írva 48. Ez 32 + 64? Azt hiszem, ez? Ez még mindig 2 bit, minden egyes karaktert, mondjuk, Z és Z, k és k, azok még mindig pontosan ugyanolyan értékű bit kivételével 2 bit. Tehát amíg ez mindig igaz, függetlenül attól, hogy ha mi ASCII vagy más rendszer, amíg már csak egy meghatározott számú bitek eltérő minden karaktert, akkor az működik. Csak, hogy 32-ben hozták létre, mert ez az első, amit esetleg használni. >> Cool. Én inkább a, abban az esetben, ha még nem látta, ha a mondat csak egy sor, lehet megszabadulni a kapcsos zárójelek, úgyhogy inkább a ezt. Is, tudod, hogy meg tudjuk csinálni dolgokat, mint s [i] + = 1? Megteheti s [i] bitenkénti AND = 32. És bitenkénti OR = 32. Emellett számolni mod 2 == 0. Úgy emlékszem, hogy - nem fogok írni - bármely nem nulla értéket igaz, és 0 hamis. Szóval, "ha count mod 2 == 0" ugyanaz, mint a mondás: "ha nem számít mod 2". Talán éppen megfordult volna a vonalakat, és azt mondta: "ha a gróf mod 2, akkor az OR 1, mást az AND 1, "úgy, hogy nem kell a" nem ". De ez ugyanúgy működik is. És mi mást tehetnék itt? Lehet kombinálni őket háromkomponensű, ha akart, de aztán, hogy épp most, hogy a dolgok Messier és valószínűleg nehezebb olvasni, ezért nem fogjuk megtenni. Bárki bármilyen más javaslatok? Ez a probléma kérte? Ó, igen. Szóval, megszabadulni az ilyen üres sorokat, most fogunk nyomtatni f,% s, hogy az egyik a húrok, Mi nyomtatni f, s. Most futtatni. Csináltam semmi rosszat? Ez a \ "; akarok n. Oké. Most fogjuk futtatni. Ez valószínűleg kiabálj velem. Strlen van string.h. Szóval ez a szép dolog zengés ez megmondja, mi van, ahelyett, GCC, amely csak azt mondja: "Hé, te elfelejtett valamit, nem tudom, mi volt az." De ezt fogja mondani nekem, "Te azt jelentette fel string.h." Szóval nem kérdez semmit, így ez nem mond semmit. De mi tőlük például "Köszönet 4 the add." Úgy néz ki, van. Hurrá. Szóval visszatérve a fő, én szinte soha nem csinálni. Ez nem kötelező. És a legfontosabb az egyetlen funkció, ami választható. Ha nem vissza semmit a fő, ez feltételezhető, hogy azt jelentette, hogy vissza 0-ra. Kérdései vannak? Oké. Tehát most a második problémát. "Recall hétről 2 második előadás, hogy a csere 2 változó" értékek áthaladó E 2 változók egy függvény (még ha az úgynevezett swap) nem igazán működik, legalábbis nem teljesen "mutató". És figyelmen kívül mutatók amíg megkapjuk őket. Azt akarjuk, hogy cserélni 2 változó, nem vagyunk függvény segítségével csinálni. Még mindig fog csinálni, mint a fő mond. De, hogy az említett 2 változó, mi nem szeretnénk használni egy ideiglenes változót. 2 számos mód van erre. Meg tudod csinálni használja a hagyományos bináris operátorok. Szóval Tudja valaki, hogy egy gyors és piszkos módon csinálja ezt? Lehet, hogy valójában egy perc gondolkodás. Ha van - Én meg a problémát fel, mint kérnek. Szóval, ha van 2 változók, A, ami csak egy egész hogy adnak nekem, és B változó összeg, amely egy másik értéke, hogy én vagyok adni. Tehát, ha van ilyen 2 változó, most akarom cserélni őket. A hagyományos, használja a szokásos bináris operátorok, úgy értem, mint a +, -, ÷. Nem bitenkénti szereplők jár bináris. Tehát használ -, +, ÷, és mindazoknak, akik. Mi lehet cserélni csinál valamit, mint a = a + b és b = a - b, a = a - b. Szóval, józanság ellenőrizze, és aztán majd meglátjuk, hogy miért működik. Tegyük fel, hogy a = 7, b = 3, akkor a + b lesz 10-ig. Szóval most beállításával = 10, majd csinálunk b = a - b. Szóval csinálunk b = a - b, ami lesz 7 és b = a - b újra, vagy = a - b. Melyik lesz a 10-7, amely 3. Tehát most, helyesen, az "a" 7 volt, b 3 volt, és most b 7, és "a" 3. Szóval ez a fajta van értelme, "a" a kombináció a 2 számot. Ezen a ponton, "a" a kombináció, és aztán mi kivonjuk ki az eredeti B, majd mi levonjuk, hogy mi volt az eredeti "a." De ez nem működik az összes számot. Ahhoz, hogy ezt belássuk, nézzük meg a rendszer, ezért általában úgy gondolja, az egész számok, mint 32 bit. Menjünk dolgozni valamit, csak, mint 4 bit. Remélem felér egy jó példa most. Szóval, tudom, hogy ez könnyű lesz. Tegyük fel, hogy a 2 számok 1111-es, és a 1111, így vagyunk bináris most. A tényleges tizedes, ha meg akarja gondolni, hogy így, a = 15 és b = 15. És így azt várjuk, miután cserélni őket - nem is kell, hogy ugyanazokat a számokat, de én ezt így. Csináljunk nekik, hogy ne ugyanazt a számot. Csináljuk 1111 és 0001. Így a = 15 és b = 1. Miután cserélni őket, várunk 'a', hogy 1 és b 15 lesz. Tehát az első lépés a = a + b. A számok csak 4 bit széles, így "egy", amely 1111-es, + b, ami 0001, lesz a végén, hogy 10000, de csak 4 bit. Tehát most a = 0. És most szeretnénk beállítani b = a - b - valójában ez még mindig működik ki tökéletesen. a = a - b - lássuk, ha ez működik ki tökéletesen. Így akkor b = 0 - 1, ami még mindig 15, és akkor a = a - b, ami 1. Lehet, hogy ez működik. Úgy érzem, van egy oka, hogy nem működik, rendszeres. Oké, akkor dolgozik, feltételezve, hogy ez nem működik rendszeres bináris műveletek és én keresni - én a Google, hogy ha ez igaz. Így akarom csinálni a bitenkénti szereplők, valamint a nyom itt XOR. Szóval, bevezetése XOR (^), ha még nem látta még. Ez ismét egy bitenkénti operátor így jár apránként, és ez - Ha a bit 0 és 1, akkor ez 1 lesz. Ha a bit 1 és 0, akkor az 1, akkor a biteket 0 és 0 ez lesz 0, és ha a biteket 1. és 1 ez lesz 0. Szóval, ez olyan, mint OR. Ha akár a bitek igaz, ez 1, de ellentétben OR, nem lehet egyszerre bitek igazak. VAGY volna ez 1, XOR volna ezt kell 0-ra. Így fogunk használni kívánt XOR itt. Gondolj bele egy pillanatra, megyek Google. Nos, nem lehet olvasni, hogy, én vagyok jelenleg a swap-XOR algoritmus oldalon. Remélhetőleg ez miért Nem tudok - Ez pontosan az az algoritmus, amit csináltál. Még mindig nem értem, miért - azt kell csak felkapott egy rossz példa, de ebben az esetben, ha "a" történt válnak 0-után kapok az 5 bit, így most "a" értéke 0, ez az, amit az úgynevezett "integer overflow". Szerint a Wikipedia, "Szemben a XOR swap, ez a változás megköveteli, hogy az általa használt egyes módszerek annak biztosítására, hogy x + y ne okozza egész szám túlcsordulás. " Szóval ez nem sikerül, ez volt integer túlcsordulás, de valami rosszat tettem. Nem vagyok benne biztos. Megpróbálom, hogy dolgozzon ki egy másikkal. [Student] Nos, nem egész túlcsordulás, ha akarsz, hogy egy szám van nagyobb, mint a bitmennyiséget már kiosztott? Igen. Jelenleg 4 bit. Ez - volt 4 bit, mi majd próbálja hozzá 1-et, így a végén 5 bit. De az ötödik bit csak elvágják, igen. Ez talán ténylegesen - [Student] Ez azt dobja meg egy hiba, vagy ez - azt, hogy dobja a hibát? Szóval nincs hiba. Amikor eljut a gyülekezési szintet, egy speciális bit valahol van beállítva, hogy az említett volt egy túlcsordulás, de a C akkor milyen, csak nem foglalkozik vele. Te tényleg nem lehet foglalkozni vele, kivéve, ha speciális összeszerelési utasításokat a C. Gondoljunk XOR swap. És azt hiszem, a Wikipedia volna is azt mondja, hogy - Így is nevelkedett moduláris aritmetika, úgyhogy azt hiszem, volt, elméletben, ezzel moduláris aritmetika mikor azt mondtam, hogy 0 - 1 15 újra. Annak érdekében, hogy esetleg valóban - rendszeres processzor, amely nem 0-1 = 15. Mivel a végén a 0, akkor vonjuk 1, így aztán ez csak titokban vissza körül 1111. Szóval ez az algoritmus is valójában dolgozik, az a + b, az a - b, b - a, hogy lehet jó. De van néhány processzorokra, amelyek nem tehetem, és ez így nem lenne jó ezekben a konkrét is. XOR csere fog működni minden processzor. Oké. Az elképzelés az, hogy ez elvileg ugyanaz, mégis. Ahol mi használ XOR, hogy valahogy az információt mindkét ba 1 a változók, majd húzza ki az információkat az egyes változók újra. Tehát csinál akárki volna ötletek / a válasz? [Student válasz, érthetetlen] Szóval ez kell dolgoznia, és azt is, XOR kommutatív. Függetlenül attól, hogy ezek a 2 szám történetesen itt, ez az eredmény nem lesz ugyanaz. Tehát a ^ b = b ^ a. Lehet is látni ezt, mint egy írásos ^ = b, b ^ = a, a ^ = b újra. Szóval ez van, és hogy miért is működik ez, gondolj a biteket. Segítségével egy kisebb számot, mondjuk 11001, és a 01100. Szóval ez az "a", ez b. Tehát a ^ = b. Mi lesz beállítás 'a' = a XOR e 2 dolog. Tehát 1 ^ 0 jelentése 1, 1 ^ 1 jelentése 0, 0 ^ 1 1, és 0 ^ 0 jelentése 0, 1 ^ 0 1 lehet. Tehát "a", ha megnézi a decimális szám, ez lesz - nem fogod látni sok a kapcsolat az eredeti "a" és az új "A" de ránézünk a bitek, az "a" most, mint egy háló az információ mind az eredeti, "a" és az eredeti b. Tehát, ha veszünk b ^ a, azt látjuk, hogy mi lesz a végén az eredeti "a." És ha vesszük az eredeti "a" ^ az új "a", azt látjuk, hogy a végén az eredeti b. Tehát (a ^ b) ^ b = az eredeti "a." És (a ^ b) ^ a = az eredeti b. Van - egy másik látásmód ez valami XOR maga mindig 0-ra. Így 1101 ^ 1101, az összes bit lesz ugyanaz. Tehát sosem lesz olyan eset, amikor 1 egy 0 és a másik 1 lehet. Szóval ez a 0000. Ugyanez ezzel. (A ^ b) ^ b, mint a ^ (b ^ b). (B ^ b) lesz 0, a ^ 0 csak megy, hogy "a", mivel az összes bit 0. Tehát az egyetlen is, hogy lesznek, ha "a" eredetileg egy 1 - volt is. És ugyanez a gondolat itt, biztos vagyok benne, ez is kommutatív. Igen. Azt mondtam azelőtt, hogy ez kommutatív. A ^ "a", és ez az asszociatív, így most (b ^ a) ^ a. És mi tehetünk b ^ (a ^ a). És megint, megkapjuk az eredeti b. Így "a" a jelenleg kombinációja "a" és b együtt. A mi új kombó "a" mondjuk b = combo 'a' ^ eredeti b, megkapjuk az eredeti "a." És most a = combo 'a' ^ az új b, ami az eredeti - vagy ami most mi volt "a" vagy b. Ez ebben az esetben idelent. Ez jelentése = b, öreg b. Tehát most minden visszatért a cserélték sorrendben. Ha tényleg megnézte a bitek, b = a ^ b, fog XOR e 2, és a válasz lesz erre, és akkor a = a ^ ab össze XOR-olva e 2 és a válasz ez. Kérdései vannak? Oké. Így az utolsó egy valamivel lényegesen nehezebb. [Student] Azt hiszem, van egy kérdés. >> Ó, sajnálom. [Student] Mi valójában gyorsabb? Ha ezt XOR, vagy pedig, ha nyilvánítja egy új változót? Tehát mi valójában gyorsabb, nyilvánító új változó vagy használja XOR cserélni? A válasz az, hogy minden valószínűség szerint egy átmeneti változót. És ez azért van, mert, ha ez fordított le - így a gyülekezési szinten, nincs olyan dolog, mint lokális változók vagy bármilyen ideiglenes változók, vagy ez a cucc. Olyanok, mint - van memória, és vannak nyilvántartások. Regiszterek, ahol a dolgok aktívan történik. Ne adjunk hozzá 2 dolgot a memóriában, akkor adjunk hozzá 2 dolgokat nyilvántartásokban. És hozza a dolgokat memóriába nyilvántartások majd adjunk hozzá őket, és akkor lehet, tegye vissza a memóriába, de az intézkedés történik nyilvántartásokban. Tehát amikor Ön használja az ideiglenes változó szemlélet, általában mi történik, ezek a 2 szám már nyilvántartásokban. És attól kezdve, miután elcserélték őket, ez lesz csak kezdje el a másik nyilvántartásba. Bárhol Ön már használja b, akkor az csak használja a nyilvántartásban már tárolása "a." Tehát nem kell semmit ténylegesen a csere. Igen? [Student] De ez is tovább tart, memória, igaz? Ez csak több memóriát, ha kell tárolni, hogy az ideiglenes változó. Mint ha a későbbiekben használni, hogy átmeneti változó megint valahol, majd - vagy rendelni valamit az átmeneti változó. Tehát, ha bármely pontján az időben "a" b in temp tekintette különböző értékek, vagy valami, akkor megy, hogy a különböző helyszíneken a memóriában, de igaz, hogy számos helyi változók, amelyek csak létezik nyilvántartásokban. Ebben az esetben, ez soha nem a memóriába, és így te soha nem pazarlás memória. Oké. Utolsó kérdés egy kicsit. Tehát itt, ebben a CS50 készülék, van egy szótár. És ennek az az oka, mert [?? B66] egy helyesírás-ellenőrző hol fogsz írni használatával hash táblákat vagy próbálkozás vagy valami adatszerkezet. Fogsz írni a helyesírás-ellenőrző, és fogod használni ezt a szótárt csinálni. De ez a probléma, mi csak fog nézni, hogy ha egy szó szerepel a szótárban. Tehát ahelyett, hogy tárolja a teljes szótár néhány adatszerkezet majd keres egy egész dokumentumot, hogy ha bármi van elgépelt, mi csak szeretnénk találni 1 szó. Így tudjuk csak beolvasni az egész szótár és ha nem talál a szó az egész szótárban, akkor nem volt ott. Ha beolvasni az egész szótárt, és nem látja a szót, akkor jók vagyunk, mi megtaláltuk. Azt mondja, hogy itt akarunk kezdeni a C a file-kezelési funkció, mert azt akarjuk, hogy olvassa el a szótár, de adok a célzást itt, hogy mely funkciókat kell gondolni. Írok őket Spaces. Tehát a legfontosabbak akkor szeretnénk, hogy nézd meg a f nyitott, majd elkerülhetetlenül f zárt, ami megy a végén a program, és f szkennelés f. Akkor is hasznos lehet f olvasni, de akkor valószínűleg nem akar mert - nem a végén, hogy az igénylő. F szkennelés f amit fogsz használni, hogy átvizsgálja az szótárban. És így nem kell kódolni fel a megoldást, csak próbálja meg, és mint pszeudo-kód az utat a megoldást, és aztán megbeszéljük. És valóban, hiszen már adtam neked ezeket, ha bemegy bármelyik terminálon, vagy a készülék a shell, Én - Én általában - ha nem láttam még, nem tudom, ha nem az osztályban, de az ember, így a man oldalakat, elég hasznos nézi most elég sok olyan funkciót. Szóval tudom csinálni, mint, ember f, szkennelés f. Ez most az információk a leolvasó f családnak funkciók. Azt is megtehetik férfi f, nyitott, és ez ad nekem a részleteket e. Tehát, ha tudod, hogy mit funkciót használ, vagy olvasod kódot és látod néhány funkciót és te, mint: "Mit jelent ez csinálni?" Csak ember függvény neve. Van egy pár furcsa példák, amikor lehet, hogy azt mondják tetszik. Man 2 a függvény nevét, vagy man 3 e funkció neve, de csak meg kell csinálni, ha az ember függvény neve nem történik meg a munka az első alkalommal. [Student] Szóval olvasom a man oldalt nyitott, de én még mindig zavaros, hogyan kell használni, és a programot. Oké. Sok a man oldalak kevesebb, mint hasznos. Ők több hasznos, ha már tudják, mit csinálnak és akkor csak meg kell emlékezni a sorrendben az érveket, vagy valami. Vagy adhat egy általános áttekintést, de néhány közülük nagyon nyomasztó. Mint f f vizsgálat is. Ez adja az információt az összes ezeket a funkciókat, és 1 vonal idelent történik mondani, "F szkennelés f olvas a húr pontot vagy patak." De f megnyitni. Szóval, hogyan használjuk f nyitva? Az ötlet, hogy egy programot, amely a tennivalók fájl I / O, hogy akkor először meg kell nyitni a fájlt akarsz csinálni dolgokat, és elkerülhetetlenül olvasott dolgokat, hogy a fájl, és csinálni dolgokat velük. F nyitott az, amit használ, hogy nyissa meg a fájlt. A dolog kapjuk vissza, akkor mi fájlt akarunk megnyitni, ez ad nekünk a - itt azt mondja: "/ user / share / dict / szavak." Ezt a fájlt szeretnénk megnyitni, és szeretnénk megnyitni - van, hogy egyértelműen meg akár akarjuk megnyitni vagy olvasni, ha azt akarjuk, hogy nyissa meg a levelet. Van egy pár kombinációk és a cucc, de mi szeretnénk megnyitni ezt olvasatra. Azt akarjuk, hogy olvassa el a fájlt. Szóval mit jelent ez a visszatérés? Visszaküldi egy fájlt csillag (*), és én csak azt mutatják, mindent a változó f, így a * megint, ez a mutató, de nem akarunk foglalkozni mutatók. Azt hiszem, mint f, f most a változó fogsz használni, hogy képviselje a fájlt. Tehát, ha el szeretnénk olvasni a fájlt, akkor olvassa f. Ha azt szeretnénk, hogy zárja be a fájlt, akkor zárja f. Így a végén a program, amikor elkerülhetetlenül szeretné zárni a fájlt, mit tegyünk? Azt akarjuk zárni f. Tehát most az utolsó fájl függvényt fogunk használni kívánt a vizsgálat f, f szkennelés f. És, hogy mi csinál ez ellenőrzi a fájlszintű keres egy minta egyezik. Keresi a man oldalon van, azt látjuk, int f szkennelés f, figyelmen kívül hagyja a visszatérési érték most. Az első érv az a fájl * patak, így az első érv fogunk kíván haladni a f. Mi szkennelés alatt f. A második érv a format string. Adok neked egy format string most. Azt hiszem, éppen mondani, 127s \ n, egy csomó, ami felesleges. Az az elképzelés, hogy mi formátum string, nem tudsz gondolni vizsgálat f ellentéteként a nyomtatott f. Szóval print f, print f is használják ezt a fajta formátumot paraméter, de a nyomtatott f mit csinálunk jelentése - nézzük egyenértékű. Szóval nyomtatás f, és valójában még f print f, ahol az első érv lesz f. Amikor nyomtat f, mondhatnánk valami ilyesmit, "print 127s \ n", és majd ha átadjuk neki néhány húr, ez fog nyomtatni ezt a fonalat, majd egy új sort. Mi 127 azt jelenti, biztos vagyok benne, de én még soha nem korlátozódik magam hozzá, Ugye nem is kell mondani, '127 'a nyomtatási f, de mit jelent ez nyomtassa ki az első 127 karakter. Szóval biztos vagyok benne, hogy ez a helyzet. A Google erre. De a következő egy vagyok, majdnem azt jelenti, hogy pozitív. Szóval ez nyomtassa az első 127 karakter, majd egy új sort. F f szkennelés most, ahelyett, hogy változó és nyomtatása, ez fog nézni néhány string, és tárolja a mintát a változót. Nézzünk ténylegesen használni szkennelési f egy másik példa. Szóval azt mondom, volt néhány int, x = 4, , és azt akartuk, hogy hozzon létre egy húr készült - akart létrehozni a húr olyan volt, mint ez jön ki jóval később, valami, ami olyan, mint 4.jpg. Tehát ez lehet egy program, ahol lesz összeget számláló, Összefoglalva elleni i, és szeretné menteni egy csomó kép. Szóval azt akarod menteni i.jpg, ahol i néhány iteráció a hurok. Szóval hogyan lehet, hogy ez a szöveg az adott JPEG? Ha akarta nyomtatni 4.jpg tudtuk mondjuk print f,% d.jpg, és akkor lenne kinyomtatni az adott JPEG. De ha meg akarjuk menteni a húr 4.jpg, az általunk használt beolvasási f. Szóval húr s - tulajdonképpen mi Nem látom - karakter, char s, menjünk 100. Szóval én csak bejelentett néhány tömb 100 karakter, és ez az, amit mi elkerülhetetlenül fognak tárolni, hogy a JPEG-be Így fogunk használni szkennelési f, és a formátum, hogy azt mondanánk% d.jpg annak érdekében, hogy nyomtassa 4.jpg, a formátum ennek lesz% d.jpg. Tehát a formátum% d.jpg, mit akarunk cserélni% d-vel az x, és most kell tárolni, hogy a húr valahol. És hol fogunk tárolásához string a tömbben s. Szóval, miután ezt a kódsort, s, ha nyomtatni f,% s a változó s, ez nyomdába 4.jpg. Tehát f szkennelés f ugyanaz, mint a vizsgálat f, kivéve most néz át ezt a fájlt milyen tárolni s. Ez az, amit az utolsó érv lesz. Azt akarjuk, hogy tárolni - "Scan f családnak funkciók vizsgál mindkét szerinti formában próbálta alább. Ha vannak tárolva a helyét pontok adhatja vissza - " Nem, talán jó lesz. Hadd gondolkozzam egy kicsit. Szóval vizsgálat f nem - mi a fene az a funkció, amely nem az? Tehát vizsgálat f nem fog venni egy egész, és nem pont jpg. Ez lesz [motyog]. Mentés int változó karakterlánc int C. Mi ez a változó, vagy mi ez a függvény neve? Igen. Ez - igen. Szóval, amit én, hogy meghatározzák, mielőtt volt, s print f, amely - ami sokkal több értelme, hogy miért mondtam, hogy sokkal több volt, mint a print f. Scan f még mindig olyan, mint nyomtatott f, de s print f fog olvasni rajta és cserélje ki a változók, és most tárolja a string. Ahelyett, nyomtatás, ez tárolja a string. Így figyelmen kívül, hogy az teljesen. Továbbra is úgy gondolja, az a formátum meghatározásakor úgy, mint, hogy a nyomtatott f. Tehát most, ha azt akartuk csinálni a 4.jpg dolgot tennénk s print f, x e. Tehát mi szkennelés f csinál -, hogy mi a kérdés lesz? [Student] Én csak zavaros, amit mi próbálunk csinálni itt azzal a JPEG. Meg tudod magyarázni, hogy az 1 több időt? Szóval ez volt - ez kevésbé Relevent az f f szkennelés most, remélhetőleg, akkor kösse vissza valamilyen módon. De amit eredetileg is szándékozik mutatni volt - ez valójában közvetlenül kapcsolódik ezekhez [?? F5] Fogsz használni s print f, ahol azt mondjuk, hogy 100 képet, és szeretné elolvasni a kép 1.jpg, 2.jpg, 3.jpg. Annak érdekében tehát, hogy ezt megtehessük, meg kell f nyílt, és akkor át kell adni a string kívánt nyitni. Szóval mi lenne megnyitni kívánt 1.jpg, annak érdekében, hogy a húr, ami 1.jpg, mi s nyomtatási f% d.jpg--mi nem megtenni int i = 0. i <40, i + +. Szóval, s print f% d.jpg i. Így aztán ebben a sorban, most a változó vagy a tömb s fog 1.jpg. Vagy 0.jpg, 1.jpg, 2.jpg. És így tudjuk megnyitni, viszont minden egyes kép olvasásra. Szóval ez az, amit s nyomtassa f nem. Látod, mit s nyomtathat f most csinál? [Student] Oké, szóval tart - létrehoz egy string, something.jpg, majd tárolja azt. Igen. Hoz létre - ez egy másik formátum string, mint f szkennelési és nyomtatási f, ha beilleszti az összes változót a második érv lehet, s ellentétben a i. Talán - Úgy értem, hogy ez a helyzet. De bármilyen sorrendben érvek. Ez lesz beszúrni az összes változó a format string majd tárolja a mi puffer; hívjuk, hogy egy puffer, akkor ott vagyunk tárolása string. Tehát tároló belsejében s helyesen formázott string,% d miután helyett 4. [Student] Tehát ha ezt tette, a változó f csak lesz újraosztani? Igen. Tehát kellene zárni az eredeti f mielőtt ezt. De - és akkor is, ha nem volt olyan f megnyitása itt, akkor azt kell mondanunk - Igen. De nyitna száz különböző fájlokat. [Student] De akkor nem tudja elérni, vagy - oké. Oké. Szóval vizsgálat f, f szkennelés f, egyfajta ugyanezt a gondolatot, de ahelyett, ahelyett, tárolás egy string, ez több, mint te most megy át a szúrás és mintaillesztési ellen húr és tárolása az eredményeket változókat. Használhatja szkennelés f elemezhető át ilyesmit 4.jpg, és tárolja az egész a 4. összeget int x. Ez az, amit tudunk használni vizsgálat f a. F f vizsgálat fog tenni, hogy a parancssorban. Én valójában nagyon benne, hogy ez az, amit a CS50 könyvtár nem. Szóval, amikor azt mondod, "get int," ez beolvasás f-nek vége - scan f az út kapsz felhasználói bevitel. F f vizsgálat fogja ugyanezt csinálja, de a fájlt olvasni át. Szóval itt vagyunk, szkennelés át ezt a fájlt. A minta megpróbáljuk meccsek nagyjából karakterlánc, amely 127 karakter hosszú majd egy új sort Szóval biztos vagyok benne, hogy akár csak mondani: "meccsek s", mivel a szótárban mi történik, hogy, mi garantáltan nincs szó, hogy a hosszú, és f f vizsgálat, azt hiszem, meg fog állni az új vonal nem számít, mit. De mi tartalmazza az új sort a mérkőzés, és - [Student] Ha mi nem tartalmazza az új vonal, nem lenne megtalálni részei szóval? Ez - az egyes - nézett a szótárban - Tehát a szótárban, ezek mind a mi szó. Mindegyik új sorban. A vizsgálat f fog felvenni ezt a szót. Ha nem tartalmazza az új sort, akkor lehetséges, hogy a következő vizsgálat f majd csak olvasni az új vonal. De ideértve az új sort, akkor majd csak figyelmen kívül hagyja az új vonal. De mi soha nem része egy szót, hiszen mi mindig olvasott fel egy új sort, nem számít, mit. [Student] De mi van, ha keresni a "Cissa," mint Cissa. Vajon úgy találják, hogy, és azt mondják, hogy ez a mérkőzés? Tehát itt vagyunk - ez olvasható - ez valójában egy jó pont. Mi soha nem az aktuális - a szó keresünk az első parancssori argumentum. Szóval húr, Szó = argv 1. Tehát a húr keresünk az argv 1. Mi nem keres egy szót egyáltalán a mi szkennelési f. Mit csinálunk a vizsgálat f kezd minden szót a szótárban, majd egyszer már ezt a szót fogunk használni strcmp összehasonlítani őket. Fogunk összehasonlítani a szót, és amit csak olvasni be Így elkerülhetetlen, megyünk a végén csinál egy csomó vizsgálat fs amíg ez csak azért történik, hogy a vizsgálat f vissza fog térni - tér majd vissza egy, amennyiben azt kiegyenlített egy új szó, és ez vissza fog térni valami mást, amint azt elmulasztotta, hogy megfeleljen a szót. Mi olvassa az egész szótárt, tárolása sorról sorra minden szót a változó s. Aztán hasonlítják szót s, és ha az összehasonlítás == 0, strcmp történik, hogy 0, ha egy mérkőzés került sor. Tehát, ha ez 0, akkor tudunk nyomtatni f, kiegyenlített, vagy szó a szótárban, vagy amit akarsz nyomtatni f. És aztán - mi nem akarjuk f bezárásához újra és újra. Ez az a fajta dolog, amit akarok, és mi nem csak a keresett szót a szótárban. Így tudnánk csinálni, ha akarnánk keresni a motívum, Cissa, ahogy korábban is mondtam, ha azt akartuk, hogy vizsgálja meg az adott mintát, akkor ez nem abban az esetben, mert ez valójában nem egy szó, hanem a szavak a szótárban történik, van, hogy benne. Szóval ez egyezik a szóval, de ez részhalmaza a szó nem egy szó maga. De ez nem így mi használjuk, mi olvasod minden szó majd összehasonlítjuk a szó van a szó. Szóval mindig összehasonlítva a teljes szót. Tudok küldeni a végleges megoldásokat kínálunk. Ez a fajta szinte a helyes választ, azt hiszem. [Student megjegyzést, érthetetlen] Oh, nem tudok megszabadulni az ilyet? Char s, azt hiszem, azt mondtuk, 127 - Nem emlékszem, mi a legnagyobb is. Majd csak nem 128, így most s elég hosszú. Nem kell nyomtatni semmit. Mi is szeretne majd be kell zárni a fájlt, és hogy kell a helyes választ. CS50.TV