[Powered by Google Translate] Odjeljak Problem Set 2: Hacker Edition Rob Bowden, Sveučilište Harvard Ovo je CS50. CS50.TV Dakle, ja sam Rob. Ja sam viši u Kirkland. Ovo je moja treća godina TFing CS50. To je prvi put da smo se mijenja iz tradicionalnog predavanje stilu odjeljku, gdje smo samo vrsta pregled onoga što se dogodilo u predavanju, a onda vi postavljati pitanja, sada se puno više problema sa sjedištem, gdje ćemo koristiti prostore, a - Oh, pa ideja je da se ide na taj link sam ti poslao i onda ćete biti u mom svemiru. Se bilo tko ne imati laptop? Ok. Tako ćemo biti koristeći ovaj, a mi idemo da se radi probleme živjeti u odjeljku te ih opisala i figuring out ono što je krivo i ja bi podići neke kodu, a ja mogu razgovarati o svojim idejama. Dakle, je li itko imao problema? Možete razgovarati na strani, a ja ne znam da li ćemo imati razloga za to. Sada, kao i prethodne supersection, ako ste bili u toj klasi, vi znate što je to o tome. Na sve P seta tamo će biti ove sekcije. Dakle, P-set 2, specifikacije, mislim da ga je vidio na P-1 set već. Ali možemo pogledati P-set 2 za ono što ćemo da se ide preko danas. I vidjet ćete dio pitanja. Dakle, ovo će biti sve P-seta, tamo ću biti dio pitanja. Do sada smo je rekao, "razmotriti to prilika za vježbanje." Nećete biti zatraženo da podnese ovaj program. Ideja je da se oni trebali vrste pomoći da započnete s problemom setu. Mislim na Hacker izdanju, mnogi od njih su trebali biti samo nove, zanimljive stvari za naučiti. Oni ne smiju biti izravno odnosi se na problem seta. I upravo sada nećemo imati ih poslati, ali u teoriji, za kasnije problema seta, možda ćete ih poslati, i na taj način može doći do dijela ili gledati odjeljak da biste dobili odgovore, ili ih možete dobiti na svoju vlastitu ako se ne osjećate kao uživanje moju prisutnost. Dakle - Mislim da je to prvi. Oh. Također, pod tim dijelovima pitanja također smo vam postaviti pitanja o gaćice. Pa mislim, u teoriji, ti si trebao gledati to prije dolaska u odjeljku, ali to je u redu, ako ne, mi ćemo ići preko njih ionako. Dakle, možemo početi s tim: "Kako ne, a petlja se razlikuju od ne-while petlje? Kada je potonji osobito korisno? " Pa tko imati bilo -? [Studentski] do-while petlja će uvijek izvršiti barem jednom. Da. Tako da je razlika. While petlja - Ja ću upravo to učiniti ovdje - while petlja, imamo stanje ovdje, dok ne-a, nemate stanje dok ne dođemo ovdje dolje. I tako, kad je vaš program je izvršenje, i to dobiva while petlje, odmah provjerava ako je to uvjet istinit. Ako taj uvjet nije istina, to će samo preskočiti petlju cijelosti. Do-while petlja, kao program izvršavanja, to dobiva "učiniti." Ništa se ne događa u ovom trenutku, samo nastavlja izvršenja. Onda kada ga hitove "vrijeme", ako je uvjet istinit, to će povratna petlja i učiniti ga opet i opet i opet sve dok uvjet ne vrijedi i onda samo pada kroz. Dakle, razlika je, da se to može preskočiti od samog početka. To nužno izvršava se jednom, a zatim se može izvršiti više puta, ako stanje je još uvijek istina. Dakle, petlja, a samo će to učiniti jednom, ili - petlju dok - ne možemo ga morati učiniti na sve, jer čim smo doći do njega, ako je uvjet false, samo ćemo preskočiti pravo nad njim. Dok ne-while petlja, mi ćemo ga izvršiti jednom, nužno. Tada, kad dođemo do stanja, mi provjeriti da li je to istina ili laž. Ako je to istina, mi ćemo to učiniti opet, ako je lažna, samo ćemo nastaviti ići. Dakle, kada je potonji posebno korisna? Dakle, ja mogu reći da je u cijelosti od četiri godine, tri godine, što god, da sam programiranju, koristio sam to, kao, pod 10 puta. I vjerojatno pet od njih su u CS50 kada smo uvođenja učiniti-Dok petlje. Dakle, kada ste koristili učiniti-a petlje? Kada je - Da? [Studentski] Kada pokušavate dobiti korisničkog unosa, ili nešto želite provjeriti - Da. Dakle, učiniti-a petlje, sfaust je jedan veliki. To je razlog zašto se na prvih nekoliko problematičnih seta, kada želite pitati korisnika, kao što su, "Daj mi niz", što se ne može nastaviti dok ne dobijete taj niz. I tako, nužno, treba tražiti niza barem jednom. Ali onda ako su odgovorili nešto loše, onda morate petlje natrag i ponovno pitati. No, osim korisničkog unosa, to je vrlo rijetko da sam naići na slučaj gdje želim petlje "barem jednom", ali možda i više. Pitanja ili -? Je li netko koristi ne-while petlja gdje drugdje? Ok. Dakle, sljedeći je, "Što neprijavljeni identifikator obično ukazuju ako outputted po jeka? " Pa kakav koda sam mogao napisati da se 'neprijavljenog identifikator?' [Studentski] To je x = 2? Dakle, mi samo možemo ga probati ovdje, x = 2. Mi ćemo pokrenuti ovo - Oh, nisam ga kliknite. Dakle, ovdje smo dobili - sve u redu. "Korištenje neprijavljenog identifikator x." Tako da je nedeklarirani identifikator, promjenjiva. To često će pozvati varijablu identifikator. Dakle, to možda ne znaju da je zapravo promjenjiva, to ne znam što je to. Dakle, to je identifikator. Pa zašto je to neprijavljeni? Da. Dakle, da bude jasno na terminologiju, deklaracija varijable je kad ste rekli "int x" ili "string y," što god. Inicijalizacije varijabli, ili dodjeljivanje varijable, je kad ste rekli "x = 2". Tako možemo učiniti to u odvojenim koracima, int x, x = 2, a do - možemo imati hrpu stvari ovdje - ali dok se to dogodi linija, x je još uvijek nepokrenute, ali to je bio proglašen. I tako smo očito može to učiniti u jednoj liniji, a sada smo proglašenja i pokreće. Pitanja? I konačno, "Zašto je Cezar Cipher nije jako siguran?" Tako je prvi, ne bilo tko želi reći ono što je Cezar Cipher je? [Studentski] Cezar Cipher samo da ste preslikati, možete prebaciti svako slovo, Određeni broj pisama ići preko, i premjestiti natrag preko, a to nije vrlo siguran, jer tu je samo 26 moguće opcije, a vi samo morate probati svaki jedan od onih dok ste ga dobili. Oh. Dakle, ja bi trebao ponoviti? The Cezar Cipher, it's - Mislim, da ću se baviti s njom o problemima koji vas - ili valjda standardni izdanje problema setu koji nije na hakerske izdanju. Dakle, na standardnom izdanju na problem seta, možete dobiti poruku poput "Hello, svijet," a imate i broj kao šest, a vi se tu poruku, a svaki pojedinac lik, ga rotirati po šest mjesta u abecedi. Dakle 'h' u halo postati h-i-j-k-l-m-n. Dakle, prvo slovo bi n. Mi radimo istu stvar s e. Ako imamo, kao što su, z ili tako nešto, onda ćemo završiti natrag oko '.' Ali svaki lik dobiva cikliran 6 znakova kasnije u abecedi, a to nije vrlo siguran jer postoje samo 26 mogućnosti za koliko načina možete mogla završiti jedno slovo. Dakle, možete samo pokušati sve 26 od njih i, vjerojatno, za dovoljno dugo poruke, samo jedan od tih mogućih 26 stvari će biti čitljiva, i čitak jedan će biti izvorna poruka. Dakle, to nije vrlo dobar način kriptiranje ništa at svi. Nevezano za one gaćice, "Što je funkcija?" Dakle, ono što je funkcija? Da. [Studentski] To je kao zaseban dio koda koji možete nazvati proći i onda dobiti povratnu vrijednost, što god. Da. Dakle, ja ću ga odgovorite i odgovaranja sljedeći - ili ponoviti također samo odgovorite na sljedeći jedan. Možete koristiti funkcije, umjesto samo kopirati i zalijepiti kôd iznova i iznova. Dovoljno je uzeti taj kod, stavi ga u fuction, a onda samo mogao nazvati funkciju gdje god su kopiranje i lijepljenje. Dakle funkcije su korisne. Dakle, sada ćemo napraviti stvarnih problema. Prvi. Tako je ideja prvog jedna je, da prođe to niz, i bez obzira na - ili to reći sve malim slovima? To ne kažu sve su mala slova. Dakle, poruka može biti ništa, i - oh ne. To čini. "Radi jednostavnosti, možete pretpostaviti da će korisnik samo ulaz mala slova i razmake." Dakle, prolazimo ga poruke sa samo malim slovima, a onda ćemo se izmjenjivati između kapitala i mala - mi promijeniti string biti glavni i mala slova, naizmjenično. Dakle, prije nego što smo vam dati drugi čak zaroniti u problem, što je prva stvar koju trebamo učiniti? Oh, što sam samo kliknite na? Oh, upravo sam kliknuo na e-mail ovdje. Dakle, prva stvar koju trebate učiniti - tražim na krivom jedan? Je li to dio ove jedne? Ne, oni su još uvijek tamo, iako. Ok, još uvijek ovdje. Sada ne možemo pretpostaviti -? Da. Ovdje ne možemo pretpostaviti da je to samo mala i prostorima. Dakle, sada se moramo nositi s činjenicom da su slova može biti što god želimo da budu. I tako je prva stvar koju želite učiniti je samo dobili poruku. Mi samo trebamo dobiti niz, niz s = GetString, ok. Sada je taj problem, postoji nekoliko načina na koje to rade. No, mi smo idući u želite koristiti bitovni operatori ovdje. Postoje ljudi koji ni nisu bili na supersection, ili nešto, a ne znam što bitovni operatori su? Ili kako se oni odnose ASCII na bilo koji način? [Studentski] Nisam bio na supersection, ali ja znam što bitovni operatori. Ok. Pa onda ja ne moram ići preko osnove od njih, ali ja ću objasniti što ćemo htjeti koristiti ovdje. Dakle, '': Binarni prikaz kapitala A, broj je 65. Samo ću pogledati - 41 će biti 01.000.001. Tako da bi trebao biti 65 u decimalno, pa to je binarni prikaz A. znakova grada Sada, binarni prikaz karaktera mala slova 'a' će biti ista stvar, gotovo. Je li to - 6, yeah. Ovo je pravo. Dakle, binarni kapital, binarni mala '.' Dakle primijetiti da razlika između te '' je to jedan bitni. I to se događa da se 32-bitni je malo predstavlja broj 32. I to ima smisla budući da je 65; '' je 97. Razlika između njih je 32. Dakle, sada znamo da može pretvoriti od A do A 'uzimanje i bitovni ga ORing, sa - da izgleda kao jedan. Ovo je bitovni OR, s 00100000, te da će nam daju '.' I mi možemo dobiti od 'A' do koje bitovne ANDing s 11, 0 u tom mjestu, 11.111. Dakle, ovo će nam dati točno ono što '' bio, ali poništiti ovaj individualni malo, tako da ćemo morati 01000001, ja ne znam da li sam u pravu broje. No, ova tehnika bitovne ORing dobiti od kapitala u mala slova, i bitovni ANDing dobiti od malih slova na kapital nije ekskluzivno A. Sve od slova K vs K, Z vs z sve od njih se ide samo da se razlikuju po tom jednom malo. I tako da se može koristiti za promjenu od bilo malo slovo na bilo slovom i obrnuto. Ok. Dakle, jednostavan način za dobivanje toga - pa umjesto da pisati što god je 1011111 - jednostavan način predstavlja ovaj broj, i to ne jednom da sam otišao preko u supersection, ali tilda (~) je još jedan bitovni operator. Što ~ ne je to izgleda u bitnom reprezentacije. Uzmimo bilo koji broj. Ovo je samo neki binarni broj, a ono ~ ne to je samo flips sve bita. Dakle, ovo je bila jedna, sad 0, to je 0, sada 1, 010.100. Dakle, to je sve ~ ne. Dakle, 32 će biti broj - dobili osloboditi od toga - pa 32 će biti broj 00100000, pa ~ ovo će biti taj broj se da sam ovdje ANDed 'A' s. Da li su svi vidjeli da? To je prilično uobičajena, kao kada želite shvatiti za kasnije stvari da bismo mogli biti viđenje, kada želimo vidjeti ako - ili želimo sve, svaki zalogaj set osim jednog imaju tendenciju da ne ~ o malo da mi ne želimo postaviti. Dakle, mi ne želimo da 32-bitni skup, pa mi ~ od 32. Ok. Dakle, možemo koristiti sve one ovdje. U redu, tako da je u redu ako ne završite, polako će hodati preko zajedno, ili hodati preko toga, tako - kroz to. Šetnja kroz to. Dakle, imamo niz, a mi želimo da petlja preko svakog lika u tom nizu i učiniti nešto za njega. Pa kako ćemo petlje preko niza? Što bismo trebali koristiti? Neću to učiniti ovdje. Da. Dakle, imam iteratora, a on je to rekao, ali kako da znam koliko su likovi u nizu? Strlen (a), a zatim i + +. Dakle, ono što sam učinio ovdje nije najbolji način obavljanja stvari. Zna li netko zašto? Budući da ste provjeru jezik niza svaki put. Tako ćemo se želite preseliti strlen, mogao bih reći ovdje, int duljina = strlen (a), i onda ne ja > 1 malo. To bi moglo biti više od jednog bita, dok sve bita ispod ovom položaju su isti. Dakle, trebamo barem 26 znakova - ili, postoji 26 znakova. Dakle, trebamo barem 26 brojeva koji predstavljaju razliku - Razlika između A i 'a' mora biti najmanje 26, inače ne bismo zastupa sve kapitalne brojeve. To znači da, ako ćemo početi na jedan, to će koristiti sve ove bita, svih tih prvih 5 bita, da predstavljaju sve do Z. Zato sljedeći malo, ili je ovo malo, sljedeći malo je onaj koji je izabran za razlikovanje i '.' To je također razlog zašto, u ASCII tablici, postoji pet simboli odvajanje velikih slova od malih slova. Od onih koji su simboli, dodatni 5 koji donosi 32 se razlika između njih. [Studentski] Tako smo mogli to učiniti, jer je ASCII je dizajnirana na taj način. Da. Ali ASCII - razlika također može biti i od tih bitova. Kao, ako su bili 10000001, a '' bio 11100001 - Zaboravio sam, što god. Ali, ako je to bilo to, onda smo još uvijek mogli koristiti 'A' - A. To je upravo razlika između te '' još uvijek ti dva bita. Mislim da je napisano 48. Je li to 32 + 64? Mislim da je to? To će i dalje biti dva bita; svaki lik, sviđa, Z i z, K i k oni će i dalje imati iste točne bita postavljena osim za one dvije bita. Dakle, koliko god da je uvijek istina, bez obzira na to jesmo li pomoću ASCII ili neki drugi sustav, dokle god postoji samo skup broj bitova koji se razlikuju za svaki lik, onda to radi u redu. To je samo da 32 je bio postavljen, jer to je prvi mi eventualno mogao koristiti. >> Cool. I imaju tendenciju da vole, u slučaju da niste vidjeli, ako blok je samo jedan redak, možete dobiti osloboditi od vitičastim zagradama, pa sam imaju tendenciju da vole to. Također, znate kako možemo učiniti stvari kao s [i] + = 1? Također možete učiniti s [i] bitovni I = 32. I bitovni OR = 32. Također, računati mod 2 == 0. Pa sjetite se da - neću ga napisati - bilo koji ne-nula vrijednost je istina, i 0 je lažna. Dakle, "ako broj mod 2 == 0" je isti kao i govoreći: "ako ne računaju mod dvije." Vjerojatno bih upravo obrnuto linije i rekao, "ako broj mod 2, Ne ILI 1, drugi ne I 1 ", tako da ne trebam" Ne. " Ali to radi jednako dobro. A što drugo mogu učiniti ovdje? Možete ih kombinirati s ternarni ako ste htjeli, ali onda samo da bih napraviti stvari Messier a vjerojatno i više teško čitati, pa nećemo to učiniti. Svatko ima neke druge prijedloge? Je li to sve problem tražio? Oh yeah. Dakle, dobili osloboditi od tih praznih redaka, sada ćemo ispisati f,% s se jednom za gudače, Mi ćemo ispisati f, S. Sada ćemo ga pokrenuti. Jesam li nešto krivo? To je \ "; Želim n. Ok. Sada ćemo ga pokrenuti. Vjerojatno će vikati na mene. Strlen je string.h. Dakle, ovo je lijepa stvar o zveka je to vam govori ono što je u, umjesto GCC koji samo kaže: "Hej, zaboravio si nešto, ne znam što je to." No, to će mi reći, "Vi značilo da su string.h." Dakle, nisam brz za sve, tako da se ne govori ništa. No, mi ćemo učiniti njihov primjer, "Hvala četiri je dodati". To izgleda dobro. Hura. Dakle povratku u vaš glavni, ja gotovo nikad to učiniti. To je opcija. A glavna je jedina funkcija za koje je obavezno. Ako ne vrati ništa od glavni, to je pretpostaviti da ste mislili da se vrate 0. Pitanja? Ok. Dakle, sada drugi problem. "Sjetite se iz tjedna 2 je drugi predavanju da zamjene dva varijabli u vrijednosti prolazeći te dvije varijable u funkciji (čak i ako se zove zamjenu) ne točno radi, barem ne bez 'pokazivače.' " I ignorirati naputke dok ne dođemo do njih. Želimo da zamijene dvije varijable, a mi ne koristite funkciju to učiniti. Mi još uvijek će to učiniti u glavnom kao što kaže. Ali za korištenje tih dviju varijabli, ne želimo koristiti privremenu varijablu. Postoje dva načina da to učinite. Možete to učiniti pomoću svoje tradicionalne binarne operatore. Dakle, zna li netko brz i prljav način da radi? To bi zapravo uzeti minutu razmišljanja. Ako imam - Ja ću postaviti problem gore kao što pitati. Dakle, ako imam 2 varijable,, što je samo cijeli da mi daju, a zbroj varijabla B, što je još jedan cijeli broj koji sam dao. Dakle, ako imam ove dvije varijable, sada želim da ih zamijene. Tradicionalni, koristeći svoje redovite binarni operatori, mislim, kao što su +, -, ÷. Nisu bitovni operatori koji djeluju na binarni. Dakle, pomoću -, +, ÷, i svi oni. Možemo zamijeniti radeći nešto kao = a + b, i b = a - b, a = a - b. Dakle, razum ček, a onda ćemo vidjeti zašto se to radi. Recimo = 7, b = 3, onda + b će biti 10. Dakle, mi smo sada postavljanjem = 10, a zatim radimo b = - b. Tako smo radili b = - b, koji će biti 7, i b = a - b opet, ili = a - b. Koji će biti 10-7 što je 3. Tako sada, ispravno, '' bio 7, b je 3, a sada je b 7 i '' je tri. Tako da vrsta ima smisla, '' je kombinacija dvaju brojeva. U ovom trenutku, '' je kombinacija, a zatim smo oduzimanjem od izvornog b, i onda smo oduzimanjem što je bio izvorni '.' No, to ne rade za sve brojeve. Da biste vidjeli ovaj, razmotrimo sustav, tako da smo obično misle brojeva kao 32 bita. Idemo raditi na nečemu što je samo kao četiri bita. Nadam se da sam se s dobar primjer upravo sada. Dakle, znam, to će biti lako. Recimo naši dva su brojevi 1111 i 1111, tako da smo u binarnom upravo sada. U stvarnim decimala, ako želite da razmišljaju o tome na taj način, = 15 i b = 15. I tako smo očekivali, nakon što smo ih zamijeniti - oni čak ne moraju biti isti brojevi, ali sam ga na taj način. Ajmo ih napraviti ne iste brojeve. Učinimo 1111 i 0001. Dakle = 15 i b = 1. Nakon što smo ih zamijenili, očekujemo '' da se jednom i b biti 15. Tako naš prvi korak je = a + b. Naši brojevi su samo 4 bita širine, tako da "', koji je 1111, + b, koji je 0001, će završiti kao 10.000, ali imamo samo 4 bita. Tako sada = 0. A sada želimo postaviti b = - b - zapravo, to još uvijek radi van savršeno. = - b - neka je vidjeti ako to radi van savršeno. Pa onda b = 0 - 1, koji će i dalje biti 15, a zatim = - b, koji će biti 1. Možda to ne rade. Osjećam se kao da je razlog to ne radi pomoću regularna. Ok, tako da radi na pretpostavci da to ne rade s redovnim binarnih operacija, i ja ću tražiti - ja ću Googleu da vidi da li je to istina. Dakle, želimo to učiniti pomoću bitovni operatori, a trag ovdje je XOR. Dakle, uvođenjem XOR (^) ako niste ga vidjeli još. To je, opet, bitovni operator tako da djeluje malo po malo, i it's - Ako imate bita 0 i 1, onda će to biti jedna. Ako imate bita 1 i 0, to će biti jedan, imate bita 0 i 0 to će biti 0, i ako imate bita 1 i 1 to će biti 0. Dakle, to je kao ILI. Ako bilo koji od bitova su istinite, to je jedan, ali za razliku od ILI, to ne može biti oba bita koji su istina. Ili bi to biti jedan, XOR bi to biti 0. Dakle, idemo želite koristiti XOR ovdje. Razmislite o tome za minutu, ja ću Googleu. Pa, ne možete pročitati da je, a ja sam trenutno na algoritma XOR zamjenu stranici. Nadam se da će to objasniti zašto sam can't - To je točno algoritam koji smo upravo učinio. Ja još uvijek ne vidim zašto - Moram samo su pokupili loš primjer, ali ovaj slučaj gdje je '' dogodilo da postane 0, nakon dobivanja na 5 bita, tako da sada '' je 0, to je ono što se zove "cijeli preljev." Prema Wikipediji, "za razliku od XOR swapa, ova varijanta zahtijeva da se ona koristi neke metode jamčiti da je x + y ne uzrokuju cijeli preljev. " Dakle, ovo ima problema, to je bio cijeli prelijevati, ali sam učinio nešto loše. Nisam siguran. Pokušat ću doći do još jedan. [Studentski] Pa, nije cijeli broj preljeva kada pokušavate staviti broj tamo veći od iznosa bitova ste dodijeljenog? Da. Imamo četiri bita. That's - imali smo četiri bita, onda ćemo pokušati dodati 1 do njega, tako da smo završili sa 5 bita. No, peti bitni samo dobiva odsječeni, da. Moglo bi se zapravo - [Studentski] Znači li to da vam baciti pogrešku ili ne da - da bi baciti pogrešku? No Dakle, nema pogreške. Kada dođete do montaže razini, posebno bitni negdje je postavljen da je rekao da postoji preljev, ali u C ste vrsta samo ne nositi s tim. Vi zapravo ne mogu nositi s njom, osim ako koristite posebne zbor upute u C. Razmislimo o XOR swapa. I mislim Wikipedia članak možda su također kaže da je - Dakle, to je također doveo do modularna aritmetika, tako da mislim da je, u teoriji, radi modularni aritmetiku kada sam rekao da 0-1 je 15 opet. Tako da možda zapravo - na redovnoj procesorom koji radi 0-1 = 15. Budući da smo završili na 0, oduzmemo jedan, pa onda to samo oblozi vratiti oko 1111. Dakle, ovaj algoritam zapravo moglo raditi, a + b je - b, b -; koje bi mogle biti u redu. No, tu je neki procesori koji ne rade to, pa to ne bi bilo u redu u tim specifičnim one. XOR zamjena će raditi na bilo kojem procesoru. Ok. Ideja je da bi to trebalo biti isto, iako. Gdje smo pomoću XOR nekako dobiti informacije kako se u jednoj varijabli, a zatim izvucite informacije o pojedinim varijablama opet. Tako se bilo tko imati ideje / odgovor? [Studentski odgovor, nerazumljivo] Dakle, to bi trebalo raditi, a također, XOR je zamjenski. Bez obzira na to što bi ti dvije brojke se dogoditi da se u ovdje, ovaj rezultat će biti isti. Tako ^ b b ^. Također možete vidjeti to zapisano kao ^ = b, b ^ =, ^ = b ponovno. Dakle, ovo je pravo, i vidjeti zašto se to radi, mislim bitova. Korištenje omanji broj, recimo 11001 i 01100. Dakle, ovo je '', to je b. Dakle, ^ = b. Mi ćemo biti postavljanje 'A' = na xor tih dviju stvari. Dakle 1 ^ 0 je 1, 1 ^ 1 je 0; 0 ^ 1 1, i 0 ^ 0 je 0, 1 ^ 0 je 1. Dakle ',' ako pogledate decimalnog broja, to će biti - nećeš vidjeti puno od odnosa između originalnog 'A' i novom ',' ali gleda na komadiće, '' Sada je poput mreže podataka od oba izvornom 'A' i izvorne b. Dakle, ako uzmemo b ^, vidimo da ćemo završiti na izvorni '.' A ako uzmemo izvorni '' ^ novom ',' vidimo možemo završiti na izvornom b. Dakle, (^ b) ^ b = izvorni '.' I (a ^ b) ^ = izvornik b. Tu je - još jedan način gledanja na ovo je nešto XOR sama je uvijek 0. Dakle, 1101 ^ 1101, svi bitovi će biti isti. Dakle, tu nikad neće biti slučaj u kojem jedna je 0, a druga je jedna. Dakle, ovo je 0000. Isto je is ovim. (^ B) ^ b je kao ^ (b ^ b). (B ^ b) će biti 0; ^ 0 samo će biti ',' jer su svi bitovi su 0. Dakle, samo one koje su idući u biti gdje '' je izvorno jedan - imala one. A ista ideja ovdje, ja sam prilično siguran da je i zamjenski. Da. Ja nisam rekao prije da je to zamjenski. ^ ',' I to je asocijativna, tako da sada (b ^) ^. I što možemo učiniti b ^ (^). I tako opet, dobili smo izvorni b. Dakle, '' Sada je kombinacija 'A' i B zajedno. Koristeći naš novi kombinirani '' kažemo b = kombinirani '' ^ izvorni b, dobili smo izvorni '.' A sada = kombinirani '' ^ nova b, koji je bio izvorni - ili što je sada ono što je '' ili b. To je to slučaj ovdje dolje. Ovo je = b, b stara. Dakle, sada je sve natrag u zamijenili poretka. Ako mi zapravo pogledao bita, b = ^ b, ide na XOR ove dvije, a odgovor će biti to, a onda = ^ b je XORing ove dvije, a odgovor je ovo. Pitanja? Ok. Dakle, zadnji je nešto znatno teže. [Studentski] Mislim da ima pitanje o tome. >> Oh, žao mi je. [Studentski] Što je zapravo brži? Ako koristite ovu XOR, ili je to ako proglasiti novu varijablu? Dakle, ono što je zapravo brži, izjavljujući novu varijablu ili pomoću XOR zamijeniti? Odgovor je, po svemu sudeći, privremena varijabla. A to je zato što nakon što je sastavio dolje - tako na skupštini razini, ne postoji takva stvar kao lokalne varijable ili bilo privremenih varijabli ili bilo ove stvari. Oni samo vole - nema memorije, a tu su i registri. Registri, gdje su se stvari aktivno se događa. Vi ne dodati dvije stvari u memoriji, možete dodati dvije stvari u registrima. A ti donijeti stvari iz memorije na registara, a zatim ih dodati, i onda bi ih stavio natrag u memoriju, ali sve akcije se događa u registrima. Dakle, kada ste pomoću privremene varijable pristup, obično ono što se događa je ove dvije brojke su već u registrima. I onda od tog trenutka, nakon što ste ih zamijenili, to ću samo početi koristiti drugi registar. Bilo gdje ste bili pomoću b, samo ću koristiti registar koji je već bio čuvanje '.' Tako da ne trebate učiniti ništa kako bi zapravo napraviti swap. Da? [Studentski] Ali to također ima više memorije, zar ne? To će trajati samo više memorije ako ga treba spremiti taj privremeni varijablu. Sviđa mi se ako kasnije koristiti taj privremeni varijablu opet negdje, onda - ili vam dodijeliti nešto tog privremenog varijable. Dakle, ako u bilo kojem trenutku u vremenu ',' b u temperaturi imaju različite vrijednosti ili tako nešto, onda će imati različite lokacije u memoriji, ali je istina da postoje mnoge lokalne varijable koje će samo postoje u registrima. U tom slučaju, to nikada staviti u memoriju, i tako nikad ne gubit pamćenje. Ok. Zadnje pitanje je malo više. Dakle, ovdje, u ovom CS50 aparata, tu je rječnik. A razlog za to je zato [? B66] je alat za provjeru pravopisa, gdje ćete biti pismeno pomoću hash tablice ili pokuša ili neke strukture podataka. Ti ćeš biti pisanje provjeru pravopisa, a vi ćete biti koristeći ovaj rječnik za to. No, za ovaj problem, mi smo samo će gledati da vidi ako je jedna riječ u rječniku. Dakle, umjesto spremanja cijeli rječnika u nekom strukture podataka i onda gleda preko cijelog dokumenta kako bi vidjeli je li išta je pogrešno, mi samo želimo pronaći jedan riječ. Dakle, mi samo možemo skenirati preko cijeli rječnika i ako nikada nismo pronašli riječ u cijelom rječniku, onda to nije bio tamo. Ako smo skenirati preko cijeli rječniku i ne vidim tu riječ, onda smo dobri, mi ga pronašao. Ovdje piše da želimo početi gleda na Kasiopejskim datoteka rukovanje funkciji, jer želimo pročitati rječnika, ali ja ću dati savjet ovdje kako bi funkcija koje bi trebao misliti. Ja ću ih napisati na prostore. Dakle, glavni one koje ćete želite pogledati su ž otvoren, a zatim, neizbježno, f zatvorena, koji će ići na kraju svog programa, i f skeniranje f. Također se može koristiti f pročitati, ali vjerojatno ne želite jer da - ne završiti potrebe da. F skeniranje f je ono što će se koristiti za skeniranje preko rječnika. I tako da ne treba kodirati do rješenja, samo probati i sviđa pseudo-kod svoj put do rješenja, a onda ćemo o tome razgovarati. A zapravo, jer sam već dao vam to, ako idete u bilo kojem terminalu ili vaš aparat je ljuska, Ja bih - ja obično - ako niste vidjeli, ali, ne znam ako ste radili u razredu, ali čovjek, pa su man stranice, su prilično korisno za gleda na prilično mnogo bilo funkciju. Dakle, ja mogu učiniti, kao što su, čovjek f, skeniranje f. Ovo je sada informacija o obitelji skeniranje f funkcija. Također sam mogao učiniti čovjek F, otvorene, i da ćemo mi dati pojedinosti o tome. Dakle, ako znate što funkcija koje koristite, ili ste čitajući kod i vidjet ćete neke funkcije, a ti si kao, "Što to učiniti?" Samo čovjek koji je ime funkcije. Postoji nekoliko čudnih primjera gdje možda imaju za reći sviđa. Čovjek dva da ime funkcije, ili čovjek koji tri funkcije ime, ali imate samo to učiniti ako čovjek ime funkcije ne dogodi da rade prvi put. [Studentski] Tako sam čitao man stranicu za opena, ali ja sam još uvijek zbunjeni o tome kako ga koristiti i program. Ok. Puno se man stranice su manji od pomoći. Oni su više od pomoći, ako već znaju što čine a zatim samo trebate zapamtiti redoslijed argumenata ili nešto. Ili oni mogu vam dati opći pregled, ali neki od njih su vrlo neodoljiv. Kao f f skeniranja, također. To vam daje informacije za sve ove funkcije, i jedan redak prema dolje ovdje događa reći, "F skeniranje ž čita iz niza točke ili potoka." Ali ž otvoriti. Dakle, kako bi mi koristimo ž otvoren? Ideja o programu koji treba napraviti datoteku I / O je da najprije morate otvoriti datoteku koju želite učiniti stvari s, i neizbježno, čitanje stvari iz tog spisa i učiniti stvari s njima. F otvoren je ono što ćemo koristiti za otvaranje datoteke. Stvar koju smo dobili natrag, tako što sliku ne želimo otvoriti, to nam daje - Ovdje se kaže "/ korisnik / share / dict / riječi." To je datoteka koja želimo otvoriti, a mi želimo da ga otvorite - moramo eksplicitno odrediti da li želimo otvoriti ga čitati ili ako želimo otvoriti to napisati. Postoji nekoliko kombinacija i stvari, ali želimo otvoriti ovo za čitanje. Mi želimo čitati iz datoteke. Dakle, ono što čini ovaj povratak? To vraća datoteke zvjezdicu (*), i samo ću pokazati sve što je u varijablu f, tako * opet, to je pokazivač, ali ne želimo da se bave pokazivače. Možete misliti f kao f je sada varijabla ćete koristiti za zastupanje datoteku. Dakle, ako želite čitati iz datoteke, možete pročitati iz f. Ako želite da zatvorite datoteku, možete zatvoriti f. Tako je na kraju programa kada smo neminovno da zatvorite datoteku, što da radimo? Želimo zatvoriti f. Tako sada zadnja datoteka funkcija koje ćemo želite koristiti skeniranje f, f skeniranje f. A što da se je on skenira preko datoteke u potrazi za uzorak kako bi se slagala. Gledajući na čovjeka stranici ovdje, vidimo int f skeniranja f, ignorirati povratnu vrijednost za sada. Prvi argument je potok datoteku *, tako da je prvi argument da ćemo želite proći je f. Mi smo skeniranja preko f. Drugi argument je format string. Ja ću vam dati niz formata upravo sada. Mislim da smo se dogoditi da kažem, 127s \ n, puno toga je nepotrebno. Ideja o tome što taj format string, je možete misliti skeniranje f kao suprotnost ispis f. Dakle, print ž, print ž smo također koristiti ovu vrstu formata parametra, ali u tiskanom f što radimo je - pogledajmo ekvivalent. Dakle ispisati f, i tu je zapravo i ž ispis f, gdje je prvi argument će biti f. Kada ispisujete f, mogli bismo reći nešto poput, "ispisa 127s \ n", a onda, ako prođemo ga neki string, to će ispisati ovaj niz i onda novu liniju. Što znači 127, ja sam prilično siguran, ali nikad nisam sebe ograničiti na njega, Vi čak ne bi trebao reći '127 'u ispis f, ali što to znači ispis prve znakove 127. Dakle, ja sam prilično siguran da je tako. Možete Googleu za to. No, u idućem jednom sam skoro pozitivna to znači da. Dakle, ovo je ispis prve znakove 127, nakon čega slijedi novi redak. F skeniranje ž sada, umjesto da gleda na varijable i ispis, to će izgledati u nekom nizu i pohraniti uzorak u varijablu. Ajmo zapravo koristiti za skeniranje f u drugom primjeru. Pa recimo da smo imali neke int, x = 4, i htjeli smo stvoriti niz napravljen od - želio stvoriti niz da je kao, to će se mnogo kasnije, nešto što je baš kao 4.jpg. Dakle, to može biti program u kojem ćete imati zbroj brojač, Ukratko ja suprotstaviti, a želite uštedjeti hrpu slika. Dakle, želite li spremiti i.jpg, gdje sam je neki iteracija vaše petlje. Pa kako ćemo napraviti ovaj niz za tu JPEG? Ako biste željeli ispisati 4.jpg, samo smo mogli reći za ispis f,% d.jpg, i onda bi to ispisati za tu JPEG. Ali ako želimo spasiti string 4.jpg, mi koristimo skeniranja f. Dakle, niz je - zapravo smo can't - lik, char je, ajmo sto. Tako sam proglasio neki niz 100 znakova, i to je ono što smo neminovno ćemo se pohranu tu JPEG u. Tako ćemo koristiti za skeniranje f, i formatu, kako bismo reći% d.jpg kako bi se ispisati 4.jpg, format će to biti% d.jpg. Tako je format% d.jpg, ono što želimo zamijeniti s% d je x, i sada moramo spremiti taj niz negdje. A gdje ćemo pohraniti ovaj niz je niz e. Dakle, nakon ove linije koda, S, ako ćemo ispisati f,% S promjenljive s, to će ispisati 4.jpg. Dakle, f skeniranje f je isti kao i skeniranje f, osim sada je gleda preko ove datoteke za ono za pohranu u s.. To je ono što posljednji argument će biti. Mi želimo pohraniti - "Scan f obitelj funkcija skeniranja u oba prema formatu kao pokušao u nastavku. Ako je bilo pohranjeno u lokaciji bodova možda vratiti - " Ne, što bi mogao biti dobar. Dopustite mi da mislim na drugi. Dakle, skeniranje ž ne - ono što je ispitati kritički je funkcija koja to radi? Dakle, skeniranje ž neće potrajati cijeli broj i učiniti dot JPG. To se događa na [mrmlja]. Spremi int varijablu u niz int C. Što je ova varijabla, ili ono što je ova funkcija zove? Da. That's - da. Dakle, ono što sam definiranju vama prije nego što je i ispis f, koji - da ima puno više smisla, zato sam rekao da je mnogo više kao ispis f. Skeniranje f je još uvijek vrsta kao ispis f, ali je ispis ž će ga skenirati preko i zamijeniti varijable, a sada ga pohraniti u nizu. Umjesto da ga ispisuje, to ga pohranjuje u nizu. Dakle, zanemariti činjenicu da u potpunosti. Još uvijek možete misliti formatu razvrstač kao kao da je ispis f. Tako sada, ako smo htjeli napraviti 4.jpg stvar, da će učiniti s. f print, x za to. Dakle, ono što skeniranje ž radi - ono što je vaše pitanje će biti? [Studentski] Ja sam samo zbunjeni o tome što mi pokušavamo učiniti ovdje s tom JPEG. Možete li objasniti taj jedan više vremena? Dakle, to je - to je manje relevantna za skeniranje ž ž sada, nadam se, da će se vezati natrag u nekakvoj način. No, ono što sam prvotno namjerava pokazati je - to je zapravo izravno relevantna za ove [? F5] Ti si idući u biti koristeći s. ispisa f, gdje je, kažu imamo 100 slika, i želite pročitati sliku 1.jpg 2.jpg, 3.jpg,. Dakle, kako bi to učinili, morate f opena, a onda morate proći u nizu koji želite otvoriti. Dakle, mi bi htjeli otvoriti 1.jpg; kako bi se stvorili niz koji je 1.jpg, mi je ispis f% d.jpg--nismo učiniti za int i = 0. i <40, i + +. Tako je ispis f% d.jpg od ja. Dakle, nakon ove linije, sada je varijabla ili niz e ide 1.jpg. Ili, 0.jpg, 1.jpg, 2.jpg. I tako možemo otvoriti, pak, svaku sliku za čitanje. Tako da je ono što je ispisati ž ne. Vidite li što je ispisati ž sada radi? [Studentski] Ok, tako da je uzimanje - to stvara niz, something.jpg, a zatim ga pohranjuje. Da. To stvara - to je još jedan format string, baš kao i skeniranje i ispis f f, gdje on umeće sve varijable u drugom argumentu, može biti i za razliku ja. Možda - Mislim da je slučaj. No, bez obzira na redoslijed argumenata. To će se umetnuti sve varijable u obliku niza , a zatim pohraniti u našu tampon; zovemo da tampon, to je gdje smo pohranu niz. Dakle, mi smo pohranu unutar s. ispravno oblikovani niz,% d nakon što je zamijenjen sa četiri. [Studentski] Dakle, ako mi je to učinio, je varijabla f samo će biti raspoređen? Da. Tako smo trebali zatvoriti izvorni f prije to. Ali - i tada je također, ako nije bilo ž otvoriti ovdje, onda bi trebao reći - Da. No, to će otvoriti stotinu različitih datoteka. [Studentski] Ali mi ne bismo bili u mogućnosti pristupiti ili - ok. Ok. Dakle skeniranje f, f skeniranje f, je vrsta iste ideje, ali umjesto, umjesto da ga pohrane u nizu, to je više kao što su sada ide preko uboda i uzorak podudaranja protiv tog niza i spremanje rezultata u varijablama. Možete koristiti skeniranja f analizirati preko nešto poput 4.jpg, i pohraniti cijeli 4 u zbroj int x. To je ono što možemo koristiti za skeniranje f za. F skeniranje ž će učiniti da na naredbenog retka. Ja sam zapravo prilično siguran da je to ono što CS50 knjižnica radi. Dakle, kada kažeš, "dobiti int," to je skeniranje f-ing iznad - skeniranje f je način ćete dobiti korisničkog unosa. F skeniranje ž će učiniti istu stvar, ali pomoću datoteke za skeniranje više. Dakle, ovdje, mi smo skeniranja tijekom ove datoteke. Uzorak nastojimo uskladiti neki niz koji je 127 znakova slijedi novi redak Dakle, prilično sam siguran da smo mogli još samo reći "s. utakmicu", jer u rječniku mi se dogoditi da imaju, mi smo zajamčena niti jedna riječ je da je dugo, i ž ž skeniranje, mislim, prestat će se na novoj liniji bez obzira što. No, mi ćemo uključiti novi redak u utakmici, i - [Studentski] Ako nismo uključuju novu liniju, ne bi li pronašli dijelove riječi? To - svaki - gleda na rječniku - Dakle, u rječniku, to su sve naše riječi. Svaki je na novoj liniji. Skeniranje ž će pokupiti tu riječ. Ako ne uključuju novu liniju, onda je moguće da pored skeniranje ž samo će pročitati novu liniju. No, uključujući i novu liniju onda će samo ignorirati novu liniju. Ali nikad nećemo dobiti dio riječi, jer smo uvijek čitate do nove linije, bez obzira na sve. [Studentski] Ali što ako pretraživanje za riječ "Cisse," kao što je Cisse. Hoće li to uvidjeti da, i kažu da je utakmica? Dakle, ovdje imamo - to će pročitati u - to je zapravo dobra stvar. Mi nikada ne koristimo struje - Riječ tražimo je prvi argument naredbenog retka. Dakle, niz, riječ = argv 1. Dakle, niz tražimo je argv 1. Mi ne tražite riječ uopće u našem instrumentu f. Što smo radili s instrumentom f dobiva svaku riječ u rječniku, i onda kada imamo tu riječ idemo koristiti strcmp ih usporediti. Mi ćemo usporediti našu riječ i ono što smo upravo pročitali u. Dakle, neminovno, idemo završiti radiš hrpa skeniranje datotečni sustav dok se samo tako dogodi da skeniranje ž će se vratiti - da će se vratiti jednom, dok je uskladiti novu riječ, i da će se vratiti nešto drugo čim se nije slagala riječ. Mi smo čitanje preko cijelog rječniku, spremanje redak po redak i svaka riječ u varijablu s.. Onda smo se usporedbom riječ sa s, a ako usporedba == 0, strcmp dogodi da donese 0 ako utakmica je napravio. Dakle, ako je 0, onda možemo ispisati f, uskladiti, ili je riječ u rječniku, ili što god želite ispisati f. A onda - ne želimo da f zatvoriti iznova i iznova. To je vrsta stvar želimo učiniti, a mi se ne samo u potrazi za riječ u rječniku. Tako smo mogli učiniti da, ako smo htjeli tražiti njihovu uzorak, Cisse, kao što ste rekli prije, ako smo htjeli gledati za taj uzorak, onda će uspjeti u slučaju jer to nije zapravo riječ, ali jedna od riječi u rječniku dogodi da se to u njemu. Dakle, to bi slagala ovu riječ, ali to podskup riječi nije sama riječ. Ali to nije kako smo ga koristite, mi smo čitati u svakoj riječi a zatim usporedbom riječ imamo s tom riječju. Tako smo uvijek uspoređujući puna riječi. Ja mogu poslati finalizirani rješenja kasnije. To je vrsta gotovo točan odgovor, mislim. [Studentski komentar, nerazumljivo] Oh, jesam li dobili osloboditi od prije? Char je, valjda mi je rekao 127 - zaboravila sam što je najveći. Samo ćemo učiniti 128, pa sada s je dovoljno dugo. Mi ne trebamo ispisati ništa. Mi smo također htjeti imati zatvoriti našu datoteku, a koja bi trebala biti oko pravom odgovoru. CS50.TV