1 00:00:00,000 --> 00:00:02,670 [Powered by Google Translate] Problema Secțiunea Set 2: Hacker Edition 2 00:00:02,670 --> 00:00:04,910 Rob Bowden, Universitatea Harvard 3 00:00:04,910 --> 00:00:07,410 Acest lucru este CS50. CS50.TV 4 00:00:07,410 --> 00:00:15,770 Deci, eu sunt Rob. Sunt un senior în Kirkland. Acesta este al treilea an TFing CS50. 5 00:00:15,770 --> 00:00:22,220 Este pentru prima dată când suntem schimba din secțiunea tradițional prelegere în stil, 6 00:00:22,220 --> 00:00:25,610 în cazul în care am doar un fel de comentariu este ceea ce sa întâmplat în curs și apoi voi pune întrebări, 7 00:00:25,610 --> 00:00:32,250 acum a fi o problemă mult mai-based, în cazul în care vom folosi spațiile, și - 8 00:00:32,250 --> 00:00:37,410 Oh, deci ideea este de a merge la link-ul de pe care v-am trimis si apoi vei fi în locul meu. 9 00:00:37,410 --> 00:00:42,410 Nu are nimeni un laptop? Bine. 10 00:00:42,410 --> 00:00:47,050 Deci, vom folosi acest lucru și vom face probleme trăiesc în secțiunea 11 00:00:47,050 --> 00:00:50,740 și discutarea lor și imaginind ceea ce e în neregulă 12 00:00:50,740 --> 00:00:56,390 și eu s-ar putea trage în sus o parte din codul, si eu s-ar putea discuta despre ideile tale. 13 00:00:56,390 --> 00:01:02,140 Deci, a avut cineva probleme? 14 00:01:02,140 --> 00:01:07,000 Puteți vorbi pe partea, eu nu știu dacă vom avea un motiv pentru asta. 15 00:01:07,000 --> 00:01:12,270 Acum, la fel ca supersection anterior, în cazul în care ai fost la această clasă, știi despre ce e vorba. 16 00:01:12,270 --> 00:01:19,200 La toate seturile P acolo va fi aceste secțiuni. 17 00:01:19,200 --> 00:01:22,550 Deci, P-set 2, caietul de sarcini, cred că ai văzut pe P-Set 1 deja. 18 00:01:22,550 --> 00:01:27,400 Dar ne putem uita la P-Set 2 pentru ceea ce am de gând să fie merge peste ziua de azi. 19 00:01:27,400 --> 00:01:29,460 Și veți vedea o secțiune de întrebări. 20 00:01:29,460 --> 00:01:37,530 Deci, acest lucru va fi în toate P-grupuri electrogene; acolo va fi o secțiune de întrebări. 21 00:01:37,530 --> 00:01:41,340 Până acum ne-am spus, "Luați în considerare aceasta o oportunitate de a practica." 22 00:01:41,340 --> 00:01:44,940 Tu nu vor fi rugați să prezinte acest program. 23 00:01:44,940 --> 00:01:48,480 Ideea este că acestea ar trebui să fel de a vă ajuta să începeți cu set de probleme. 24 00:01:48,480 --> 00:01:53,220 Cred că pe editie Hacker, multe dintre ele ar trebui să fie doar lucruri noi, interesante de a învăța. 25 00:01:53,220 --> 00:01:58,590 Acestea nu pot fi direct aplicabile set de probleme. 26 00:01:58,590 --> 00:02:01,810 Si acum ca nu avem ce le prezinte, dar în teorie, 27 00:02:01,810 --> 00:02:07,480 pentru seturi de probleme mai târziu, s-ar putea să le prezinte, și, astfel, vă pot veni fie de la pct. 28 00:02:07,480 --> 00:02:10,380 sau viziona secțiune pentru a obține răspunsuri, sau puteți obține doar le pe cont propriu 29 00:02:10,380 --> 00:02:16,350 dacă nu vă simțiți ca și cum se bucură de prezența mea. 30 00:02:16,350 --> 00:02:21,010 Deci - Cred că acesta este primul. 31 00:02:21,010 --> 00:02:29,280 Oh. De asemenea, în cadrul acestor secțiuni de întrebări și noi vă pune întrebări legate de pantaloni scurți. 32 00:02:29,280 --> 00:02:33,440 Deci, cred că, în teorie, tu ar trebui sa ma uit la aceste înainte de a veni la secțiunea, 33 00:02:33,440 --> 00:02:38,550 dar e bine daca nu, vom trece peste ele oricum. 34 00:02:38,550 --> 00:02:42,590 Astfel încât să putem începe cu acestea: "Cum o buclă în timp ce diferă de la o buclă do-timp? 35 00:02:42,590 --> 00:02:46,210 Când este deosebit de utilă din urmă? " 36 00:02:46,210 --> 00:02:49,390 Deci, cineva orice -? 37 00:02:49,390 --> 00:02:52,730 [Student] do-while va executa întotdeauna cel puțin o dată. 38 00:02:52,730 --> 00:03:02,950 Da. Deci, care este diferența. O buclă în timp ce - Voi doar să-l fac pe aici - în timp ce bucla, avem condiție 39 00:03:02,950 --> 00:03:19,760 chiar aici, în timp ce un do-timp, nu aveți o condiție până când vom ajunge aici. 40 00:03:19,760 --> 00:03:24,130 Și astfel, atunci când programul este de executare, precum și de a ajunge la bucla în timp ce, 41 00:03:24,130 --> 00:03:26,380 imediat verifică dacă această condiție este adevărată. 42 00:03:26,380 --> 00:03:30,710 Dacă această condiție nu este adevărată, se va trece doar peste bucla în întregime. 43 00:03:30,710 --> 00:03:34,390 Do-buclă în timp ce, așa cum este programul de executare, se ajunge la "a face". 44 00:03:34,390 --> 00:03:37,920 Nimic nu se întâmplă în acest moment, doar continuă de executare. 45 00:03:37,920 --> 00:03:42,690 Apoi, când va atinge "în timp ce," în cazul în care condiția este adevărată, se va bucla înapoi și fă-o din nou 46 00:03:42,690 --> 00:03:46,730 și din nou și din nou până când condiția nu este adevărată și apoi doar cade prin intermediul. 47 00:03:46,730 --> 00:03:50,600 Deci, diferența fiind, că acest lucru poate sări chiar de la început. 48 00:03:50,600 --> 00:03:56,770 Acest mod necesar execută o singură dată și apoi se pot executa mai multe ori în cazul în care condiția este încă adevărat. 49 00:03:56,770 --> 00:04:03,720 Deci, în timp ce bucla va face doar o singură dată, sau - în timp ce bucla - nu avem nevoie de a face acest lucru la toate, 50 00:04:03,720 --> 00:04:07,900 deoarece, imediat ce ajungem la ea, în cazul în care condiția este falsă, vom sări doar dreptul de peste el. 51 00:04:07,900 --> 00:04:11,770 Întrucât do-while, va fi execute o dată, în mod necesar. 52 00:04:11,770 --> 00:04:14,560 Apoi, când ajungem la starea, vom verifica dacă e adevărat sau fals. 53 00:04:14,560 --> 00:04:19,790 Dacă e adevărat, vom face din nou, dacă e falsă, vom continua doar de gând. 54 00:04:19,790 --> 00:04:24,680 Deci, atunci când acesta din urmă este deosebit de utilă? 55 00:04:24,680 --> 00:04:31,190 Deci, eu pot spune că, în totalitatea 4 ani, 3 ani, indiferent, 56 00:04:31,190 --> 00:04:38,780 că am fost de programare, am folosit acest lucru, cum ar fi, de 10 de ori. 57 00:04:38,780 --> 00:04:43,140 Și, probabil, 5 dintre ele sunt în CS50 atunci când vom introduce do-în timp ce buclele. 58 00:04:43,140 --> 00:04:47,510 Așa că atunci când te faci utilizat în timp ce-bucle? 59 00:04:47,510 --> 00:04:49,510 Când este - da? 60 00:04:49,510 --> 00:04:53,180 [Student] Când sunteți încercarea de a obține date introduse de utilizator, sau ceva pe care doriți să verificați - 61 00:04:53,180 --> 00:04:59,700 Da. Deci, în timp ce do-bucle, ghidul de intrare este unul mare. 62 00:04:59,700 --> 00:05:03,160 De aceea, pe seturi prima problemă de cuplu, atunci când doriți să întreb de utilizator, cum ar fi, 63 00:05:03,160 --> 00:05:08,520 "Dă-mi un șir," nu poate continua până când veți obține acel șir. 64 00:05:08,520 --> 00:05:12,980 Și așa, în mod obligatoriu, trebuie să solicite șir de cel puțin o dată. 65 00:05:12,980 --> 00:05:16,950 Dar, apoi, în cazul în care răspunde la ceva rău, atunci ai nevoie pentru a bucla înapoi și să ceară din nou. 66 00:05:16,950 --> 00:05:20,810 Dar, altele decât introduse de utilizator, este foarte rar ca am întâlni un caz 67 00:05:20,810 --> 00:05:27,170 în cazul în care vreau să bucla "cel puțin o dată", ci, eventual, mai mult. 68 00:05:27,170 --> 00:05:33,370 Întrebări sau -? Are cineva a folosit un do-while oriunde altundeva? 69 00:05:33,370 --> 00:05:36,780 Bine. Deci, următoarea este: "Ce vrea de identificare nedeclarate 70 00:05:36,780 --> 00:05:43,310 de obicei, indică dacă scoase de zăngănit? " 71 00:05:43,310 --> 00:05:47,380 Deci, ce fel de cod ar putea scriu pentru a obține "identificator nedeclarate?" 72 00:05:47,380 --> 00:05:49,550 [Student] că x = 2? 73 00:05:49,550 --> 00:05:52,650 Astfel încât să putem încerca doar să-l aici, x = 2. 74 00:05:52,650 --> 00:06:04,830 Vom rula acest lucru - oh, nu l-am faceți clic pe. Deci, aici avem - în regulă. 75 00:06:04,830 --> 00:06:07,100 "Utilizarea de identificare x nedeclarate." 76 00:06:07,100 --> 00:06:11,610 Așa că e identificatorul nedeclarate, o variabilă. 77 00:06:11,610 --> 00:06:13,910 Acesta va apela frecvent o variabilă un identificator. 78 00:06:13,910 --> 00:06:17,300 Deci, este posibil să nu știe că e de fapt o variabila, ea nu știe ce este. 79 00:06:17,300 --> 00:06:19,380 Deci, este un identificator. 80 00:06:19,380 --> 00:06:26,060 Deci, de ce este nedeclarate? Da. 81 00:06:26,060 --> 00:06:32,190 Deci, să fie clar în terminologia, declararea unei variabile 82 00:06:32,190 --> 00:06:37,360 este atunci când spui "x int" sau "șir y", indiferent de. 83 00:06:37,360 --> 00:06:41,910 Inițializare a variabilei, sau atribuirea variabilei, 84 00:06:41,910 --> 00:06:44,510 ori de câte ori este spui "x = 2." 85 00:06:44,510 --> 00:06:52,950 Astfel încât să putem face aceste în etape separate, int x, x = 2, și până la - putem avea o grămadă de lucruri aici - 86 00:06:52,950 --> 00:07:00,350 dar până la această linie se întâmplă, x este încă neinitializata, dar a fost declarat. 87 00:07:00,350 --> 00:07:06,760 Și astfel putem face, evident, în 1 linie, iar acum suntem declararea si initializarea. 88 00:07:06,760 --> 00:07:10,730 Întrebări? 89 00:07:10,730 --> 00:07:18,390 Și, în sfârșit, "De ce nu este cifrul lui Cezar foarte sigur?" 90 00:07:18,390 --> 00:07:23,830 Deci în primul rând, nimeni nu vrea să spună ce Cifrul Caesar este? 91 00:07:23,830 --> 00:07:28,100 [Student] Cezar Cifrul este faptul că doar harta, te schimbă în fiecare scrisoare, 92 00:07:28,100 --> 00:07:34,420 un anumit număr de scrisori trece peste, și pentru a muta înapoi peste, și nu e foarte sigur, deoarece 93 00:07:34,420 --> 00:07:42,260 există doar 26 de opțiuni posibile și trebuie doar să încercați fiecare 1 din cei până când îl obține. 94 00:07:42,260 --> 00:07:45,470 Oh. Deci, ar trebui să repet? 95 00:07:45,470 --> 00:07:51,600 Cifrul Caesar, e. - Adică, vei fi de-a face cu ea pe problemele pe care le - 96 00:07:51,600 --> 00:07:56,110 sau Cred că ediția standard a setului problemă care nu e pe ediția hacker. 97 00:07:56,110 --> 00:08:01,550 Deci, pe ediția standard a set de probleme, primiți un mesaj de genul, "Bună ziua, lume," 98 00:08:01,550 --> 00:08:08,410 și aveți, de asemenea, un număr de 6 cum ar fi, și să luați acest mesaj, și fiecare caracter individual, 99 00:08:08,410 --> 00:08:11,310 îl rotiți cu 6 poziții în alfabetul. 100 00:08:11,310 --> 00:08:16,560 Deci, "h" în salut ar deveni h-i-j-k-L-m-n. 101 00:08:16,560 --> 00:08:19,600 Deci, prima scrisoare ar fi n. Noi facem acelasi lucru cu e. 102 00:08:19,600 --> 00:08:23,530 Dacă avem o, ca, Z sau ceva, apoi ne înfășurați în jurul valorii de înapoi la "o". 103 00:08:23,530 --> 00:08:29,280 Dar fiecare personaj devine succed 6 caractere mai târziu, în alfabet, și nu e foarte sigur 104 00:08:29,280 --> 00:08:35,440 din moment ce există doar 26 de posibilități de câte feluri ai ar putea încheia o singură literă. 105 00:08:35,440 --> 00:08:42,919 Astfel încât să puteți încerca pur și simplu toți cei 26 de ei și, probabil, pentru un mesaj destul de lung, 106 00:08:42,919 --> 00:08:46,860 numai 1 din aceste posibile 26 lucruri va fi lizibilă, 107 00:08:46,860 --> 00:08:50,300 iar cel lizibile va fi mesajul original. 108 00:08:50,300 --> 00:08:56,240 Deci nu e un mod foarte bun de criptare nimic, la toate. 109 00:08:56,240 --> 00:08:59,070 Nu au legătură cu aceste pantaloni scurti, "Ce este o funcție?" 110 00:08:59,070 --> 00:09:03,370 Deci, ce este o funcție? Da. 111 00:09:03,370 --> 00:09:11,640 [Student] E ca o bucată separată de cod pe care le puteți apela pentru a merge prin și apoi obține valoarea de returnare a orice. 112 00:09:11,640 --> 00:09:18,160 Da. Așa că voi răspunde prin a răspunde, de asemenea, următoarea - sau se repetă, de asemenea, răspunzând doar următoarea. 113 00:09:18,160 --> 00:09:22,410 Aveți posibilitatea să utilizați funcțiile în loc de doar copierea și lipirea codul de peste si peste din nou. 114 00:09:22,410 --> 00:09:27,200 Doar că cod, puneți-l într-o Functie, apoi ai putea apela doar funcția 115 00:09:27,200 --> 00:09:29,870 ori de câte ori ați fost copierea și lipirea. 116 00:09:29,870 --> 00:09:33,350 Deci, funcțiile sunt utile. 117 00:09:33,350 --> 00:09:35,860 Deci, acum, vom face probleme reale. 118 00:09:35,860 --> 00:09:46,490 Primul. Deci, ideea de prima este, tu treci un șir, și indiferent de - 119 00:09:46,490 --> 00:09:52,060 sau nu-l spune totul cu litere mici? Ea nu spune tot cu litere mici. 120 00:09:52,060 --> 00:09:57,730 Deci, mesajul poate fi orice, și - oh, nu. Ea face. 121 00:09:57,730 --> 00:10:01,610 "Pentru simplitate, se poate presupune că utilizatorul va numai de intrare cu litere mici si spatii." 122 00:10:01,610 --> 00:10:08,180 Așa că am să-l dați un mesaj cu doar litere mici și apoi vom alterna 123 00:10:08,180 --> 00:10:15,450 între capital și minuscule - vom schimba șir de capital să fie și mici, alternativ. 124 00:10:15,450 --> 00:10:22,920 Deci, înainte de a ne oferi o secundă să se scufunde chiar și în problema, 125 00:10:22,920 --> 00:10:32,420 ceea ce este primul lucru pe care trebuie să facem? 126 00:10:32,420 --> 00:10:36,900 Oh, ce am doar să faceți clic pe? Oh, am dat click pe un e-mail aici. 127 00:10:36,900 --> 00:10:42,870 Deci, primul lucru ce trebuie să facem - să mă uit la una greșită? 128 00:10:42,870 --> 00:10:49,320 Este aceasta o parte din asta? 129 00:10:49,320 --> 00:10:51,320 Nu, cei care sunt încă acolo, totuși. 130 00:10:51,320 --> 00:10:55,160 Bine, încă aici. 131 00:10:55,160 --> 00:11:03,160 Acum nu putem presupune -? Da. Aici nu putem presupune că e doar litere mici si spatii. 132 00:11:03,160 --> 00:11:07,770 Deci, acum avem de a face cu faptul că scrisorile pot fi orice dorim să fie. 133 00:11:07,770 --> 00:11:11,910 Și astfel primul lucru pe care vrem să facem este obține doar mesajul. 134 00:11:11,910 --> 00:11:19,790 Avem nevoie doar de a obține un șir, sirul s = getString, bine. 135 00:11:19,790 --> 00:11:24,890 Acum această problemă, există o serie de moduri de a face asta. 136 00:11:24,890 --> 00:11:29,840 Dar suntem de gând să doriți să utilizați operatori la nivel de bit aici. 137 00:11:29,840 --> 00:11:35,280 Există persoane care fie nu au fost la supersection, 138 00:11:35,280 --> 00:11:37,480 sau ceva, și nu știu ce operatorii pe biți sunt? 139 00:11:37,480 --> 00:11:41,710 Sau modul în care acestea se referă la ASCII în vreun fel? 140 00:11:41,710 --> 00:11:45,650 [Student] nu am fost la supersection, dar eu știu ce operatorii pe biți sunt. 141 00:11:45,650 --> 00:11:49,560 Bine. Deci nu am pentru a trece peste elementele de bază ale acestora, dar voi explica 142 00:11:49,560 --> 00:11:51,830 ceea ce am de gând să doriți să utilizați aici. 143 00:11:51,830 --> 00:11:59,680 Deci, "A": reprezentare binară a capitalului A, numărul este de 65. 144 00:11:59,680 --> 00:12:07,560 Sunt doar de gând să se uite la - 41 va fi 01000001. 145 00:12:07,560 --> 00:12:14,170 Așa că ar trebui să fie 65 de ani în zecimal; astfel încât acesta este reprezentarea binară a capitalului A. caracterul 146 00:12:14,170 --> 00:12:19,440 Acum, reprezentarea binară a caracterului litere mici "a" 147 00:12:19,440 --> 00:12:33,350 va fi același lucru, aproape. Este că - 6, da. Acest lucru este drept. 148 00:12:33,350 --> 00:12:37,670 Deci, capitalul binar Un litere mici, binar "o". 149 00:12:37,670 --> 00:12:43,940 Deci, observăm că diferența dintre A și "a" este acest singur bit. 150 00:12:43,940 --> 00:12:49,440 Și aceasta se întâmplă să fie de 32 biți, biți reprezentând numărul 32. 151 00:12:49,440 --> 00:12:53,910 Și asta face sens, deoarece A este 65; "a" este 97. 152 00:12:53,910 --> 00:12:56,610 Diferența dintre ele este 32. 153 00:12:56,610 --> 00:13:03,770 Deci, acum stim ca putem converti de la A la "A" de a lua o 154 00:13:03,770 --> 00:13:09,710 și la nivel de bit-l ring, cu - care arată ca un 1. 155 00:13:09,710 --> 00:13:20,900 Acesta este un nivel de bit SAU, cu 00100000, și că ne va da "un." 156 00:13:20,900 --> 00:13:26,850 Și putem obține de la "a" la A la nivel de bit de ANDing 157 00:13:26,850 --> 00:13:33,700 cu 11, 0 în acel loc, 11111. 158 00:13:33,700 --> 00:13:43,840 Deci, acest lucru va da apoi ne exact ceea ce "a" a fost, dar se anulează acest bit individuală, 159 00:13:43,840 --> 00:13:50,070 deci vom avea 01000001, eu nu știu dacă am numărat bine. 160 00:13:50,070 --> 00:13:56,750 Dar aceasta tehnica de la nivel de bit ring pentru a obține din capital la litere mici, 161 00:13:56,750 --> 00:14:02,080 și la nivel de bit ANDing pentru a obține de la litere mici la capital nu este exclusiv la A. 162 00:14:02,080 --> 00:14:06,510 Toate scrisorile, K vs K, Z vs Z, 163 00:14:06,510 --> 00:14:10,080 toate acestea sunt doar de gând să difere de această singur bit. 164 00:14:10,080 --> 00:14:16,290 Și astfel încât să puteți folosi aceasta pentru a comuta de pe orice literă mică la orice scrisoare de capital și vice-versa. 165 00:14:16,290 --> 00:14:26,670 Bine. Deci, o modalitate ușoară de a obține de la aceasta - așa că în loc de a trebui să 166 00:14:26,670 --> 00:14:32,170 scrie tot ce este 1011111 - o modalitate ușoară de a reprezenta acest număr, iar acest lucru nu este unul 167 00:14:32,170 --> 00:14:39,710 că m-am dus peste in supersection, dar tilda (~) este un alt operator de la nivel de bit. 168 00:14:39,710 --> 00:14:42,520 Ce face ~ este se pare la reprezentarea biți. 169 00:14:42,520 --> 00:14:45,630 Să luăm orice număr. 170 00:14:45,630 --> 00:14:53,130 Acesta este doar un numar binar, și ceea ce nu este ~ flips doar toate biți. 171 00:14:53,130 --> 00:15:00,630 Deci, asta a fost un 1, acum un 0, acest lucru este un 0, acum un 1, 010100. 172 00:15:00,630 --> 00:15:08,320 Deci, asta e tot ~ face. Deci, 32 se va fi numărul de - a scăpa de faptul că - 173 00:15:08,320 --> 00:15:23,320 deci 32 va fi numărul 00100000, și așa mai departe ~ a acestei va fi 174 00:15:23,320 --> 00:15:29,980 acest număr până aici că am ANDed "a", cu. 175 00:15:29,980 --> 00:15:35,600 Are toată lumea vezi asta? Acest lucru este destul de comună, la fel ca atunci când doriți să dau seama 176 00:15:35,600 --> 00:15:40,740 pentru lucruri mai târziu pe care am putea fi văzut, atunci când vrem să vedem dacă - 177 00:15:40,740 --> 00:15:44,710 sau ne dorim totul, fiecare set singur bit, cu excepția pentru 1 178 00:15:44,710 --> 00:15:47,910 aveți tendința de a face ~ de biți pe care nu vrem setat. 179 00:15:47,910 --> 00:15:53,090 Deci, nu vrem set de 32 de biți, deci avem ~ de 32. 180 00:15:53,090 --> 00:15:57,790 Bine. Astfel încât să putem folosi pe toți cei aici. 181 00:15:57,790 --> 00:16:03,000 În regulă, așa că e bine, dacă nu ai terminat, vom merge încet peste împreună, 182 00:16:03,000 --> 00:16:11,870 sau mers pe jos peste asta, așa - prin asta. Plimbare prin asta. 183 00:16:11,870 --> 00:16:20,790 Deci avem șirul nostru, și vrem să bucla peste fiecare caracter în șir și să facem ceva pentru ea. 184 00:16:20,790 --> 00:16:26,710 Deci, cum putem bucla peste un șir? Ce ar trebui să folosim? 185 00:16:26,710 --> 00:16:30,980 Eu nu am de gând să-l fac pe aici. Da. 186 00:16:30,980 --> 00:16:42,940 Deci, am iterator meu, iar el a spus, dar cum nu știu cât de multe caractere sunt în șir? 187 00:16:42,940 --> 00:16:47,030 Strlen (s), apoi i + +. 188 00:16:47,030 --> 00:16:49,860 Deci, ceea ce am făcut aici, nu este cel mai bun mod de a face lucrurile. 189 00:16:49,860 --> 00:16:51,860 Stie cineva de ce? 190 00:16:51,860 --> 00:16:55,290 Pentru ca esti verificarea limba șir de fiecare dată singur. 191 00:16:55,290 --> 00:17:06,859 Așa că am de gând să doriți să se mute strlen, am putea spune aici, int lungime = strlen (s), 192 00:17:06,859 --> 00:17:11,900 și apoi face i 00:17:20,410 Aș putea face, de asemenea, int i = 0, lungime = strlen (s). 194 00:17:20,410 --> 00:17:25,010 Și așa este oarecum de preferat, deoarece acum am limitat domeniul de aplicare 195 00:17:25,010 --> 00:17:29,150 de lungime variabilă la doar această "pentru" buclă, în loc să-l înainte de a declara 196 00:17:29,150 --> 00:17:34,990 și că există întotdeauna, și în cazul în care nu ați prins de ce e rău, 197 00:17:34,990 --> 00:17:39,410 sau de ce inițial a fost rău, e. - începe de la bucla for. 198 00:17:39,410 --> 00:17:43,380 Am verificat starea. I 00:17:46,790 Deci, lungimea lui, să lucreze cu "hello" tot timpul. 200 00:17:46,790 --> 00:17:49,670 Deci, lungimea s, h-e-L-L-o. Durata este de 5. 201 00:17:49,670 --> 00:17:57,580 Deci, i = 0, lungimea este de 5, asa ca nu este de <5, astfel încât bucla continua. 202 00:17:57,580 --> 00:18:02,750 Apoi, vom merge din nou. Noi verificam starea. I 00:18:08,390 Deci, haideți să verificați durata de salut. H-e-L-L-o. Asta e 5; i nu este <5, astfel încât vom continua din nou. 204 00:18:08,390 --> 00:18:13,330 Deci, suntem în calcul, ne bazăm Buna ziua, pentru fiecare iterație a buclei, 205 00:18:13,330 --> 00:18:17,380 chiar crezut că niciodată nu se va schimba, este întotdeauna o să fie de 5. 206 00:18:17,380 --> 00:18:22,530 Deci, să ne amintim doar 5 în față, și acum totul e bine. 207 00:18:22,530 --> 00:18:24,990 Deci, iterarea peste întregul șir. 208 00:18:24,990 --> 00:18:31,470 Ce vrem să facem pentru fiecare caracter din șir? 209 00:18:31,470 --> 00:18:38,510 [Vorbind Student, neinteligibil] 210 00:18:38,510 --> 00:18:47,000 Da. Deci, în cazul în care personajul este non-alfabetic, apoi ne-am dori să-l ocoliți. 211 00:18:47,000 --> 00:18:52,300 Pentru ca ne pasa doar despre scrisorile de litere, nu putem valorifica un număr. 212 00:18:52,300 --> 00:19:10,850 Deci, cum putem face acest lucru? Deci starea noastră, așa că dacă vrem ceva - verificați dacă e alfabetică. 213 00:19:10,850 --> 00:19:14,060 Deci, cum putem verifica acest lucru? 214 00:19:14,060 --> 00:19:18,720 [Student] Puteți folosi doar funcția este alfa. 215 00:19:18,720 --> 00:19:23,160 Este că a inclus în oricare dintre acestea, sau orice includ cum ar fi, char.h sau ceva de genul? 216 00:19:23,160 --> 00:19:32,710 Să nu folosiți funcția este alfa, și de a folosi în mod explicit - deci avem s [i], 217 00:19:32,710 --> 00:19:40,460 care este caracterul opta de s, amintiți-vă că un șir este un tablou de caractere, 218 00:19:40,460 --> 00:19:43,180 astfel caracterul opta uri. 219 00:19:43,180 --> 00:19:49,280 Acum, în cazul în care este vorba de o scrisoare de capital, știm că trebuie să fie într-un anumit interval. 220 00:19:49,280 --> 00:19:54,370 Și ce este că gama? 221 00:19:54,370 --> 00:20:07,860 Da. Deci, dacă s [i] este ≥ 65 de ani, și s [i] este ≤ 90, ceea ce ar trebui să fac în schimb? 222 00:20:07,860 --> 00:20:18,470 Da. Deci, ar trebui să nu absolut nevoie chiar să cunoască valorile ASCII ale vreodată ceva. 223 00:20:18,470 --> 00:20:25,640 Niciodată nu cred că din cele 65 de numere, 90, 97 și 102, sau orice ar fi. 224 00:20:25,640 --> 00:20:32,470 Nu ai nevoie - 112 - nu aveți nevoie să știți cele de la toate?. Asta e bine prea. 225 00:20:32,470 --> 00:20:41,940 Utilizați numai caractere cu un singur citat, constante singur oferta. Deci, "A" și mai puțin de 90 este "Z." 226 00:20:41,940 --> 00:20:47,930 Și acest lucru este în mod semnificativ mai bine - Nu stiu pe partea de sus a capul meu, care Z este de 90. 227 00:20:47,930 --> 00:20:52,690 Eu știu de pe partea de sus a capul meu, că "Z" este capitala Z. 228 00:20:52,690 --> 00:21:02,100 Deci, atâta timp cât acest lucru este în intervalul de capital de la A la Z de capital, sau putem verifica cu litere mici, 229 00:21:02,100 --> 00:21:17,010 Sau dacă e în intervalul ≥ 'a' și ≤ z. 230 00:21:17,010 --> 00:21:19,010 Deci, asta e condiția noastră. 231 00:21:19,010 --> 00:21:22,520 Stilul de unde să afișezi aceste lucruri variază. 232 00:21:22,520 --> 00:21:29,520 Eu voi face așa. 233 00:21:29,520 --> 00:21:31,520 Acum, ce vrem sa facem? 234 00:21:31,520 --> 00:21:39,530 Noi știm aceasta scrisoare este un personaj, un caracter alfabetic. 235 00:21:39,530 --> 00:21:46,270 Deci, avem nevoie pentru a alterna între dacă aceasta ar trebui să fie acum o scrisoare de capital sau o literă mică. 236 00:21:46,270 --> 00:21:48,820 Cum putem urmări, dintre care unul ne-o dorim să fie? 237 00:21:48,820 --> 00:21:55,520 [Voci Student, neinteligibile] 238 00:21:55,520 --> 00:21:59,150 Deci da, dar lasă-mă să verific. 239 00:21:59,150 --> 00:22:04,910 Modulul 0-2 a fost spus, a fost o sugestie aruncat afară, și eu sunt de acord cu asta. 240 00:22:04,910 --> 00:22:11,780 Notă cu excepția că, la fel ca - asta caz? Da. 241 00:22:11,780 --> 00:22:18,270 E orice alt unul, dar nu putem modulul 2 din i, sau i mod 2, deoarece 242 00:22:18,270 --> 00:22:22,950 observăm că E este de capital și "a" este cu litere mici? Dar există un spațiu care le separă? 243 00:22:22,950 --> 00:22:27,150 Deci, ei vor să fie același mod 2, dar sunt cazuri diferite. 244 00:22:27,150 --> 00:22:29,150 [Întrebare Student, neinteligibil] 245 00:22:29,150 --> 00:22:34,690 Da. Deci, suntem doar de gând să păstreze un număr. 246 00:22:34,690 --> 00:22:38,730 Am putea face, de asemenea, că, în cazul în care ne-am dorit aici, pentru ca s-ar putea obține un pic greoaie 247 00:22:38,730 --> 00:22:41,300 în buclă pentru declarațiile, am să-l pun aici. 248 00:22:41,300 --> 00:22:48,840 Deci, numărul de int = începe de la 0. 249 00:22:48,840 --> 00:22:54,070 Și acum, am de gând să conta cât de multe caractere alfabetice care le-am avut. 250 00:22:54,070 --> 00:22:59,550 Deci, în mod inevitabil, ne va conta + +, deoarece am găsit un alt caracter alfabetic. 251 00:22:59,550 --> 00:23:09,130 Dar, așa că acum vrei să spui că dacă numărul de mod 2. 252 00:23:09,130 --> 00:23:12,590 Deci, ce se întâmplă dacă numărul de mod 2? Oh. Voi face == 0 pentru acum. 253 00:23:12,590 --> 00:23:21,740 Vom merge, de asemenea, peste asta. Deci, în cazul în care numărul de mod 2 == 0, atunci ce? 254 00:23:21,740 --> 00:23:27,830 [Elevii răspuns, neinteligibile] 255 00:23:27,830 --> 00:23:32,750 Deci, vrem să se termine la majuscule. 256 00:23:32,750 --> 00:23:37,520 Exista 2 cazuri; majuscule și litere mici sunt cele 2 cazuri. 257 00:23:37,520 --> 00:23:40,990 Deci, dacă suntem în litere mici, avem nevoie pentru a face majuscule. 258 00:23:40,990 --> 00:23:43,710 Dacă e scris cu majuscule nu avem nevoie să faceți nimic. 259 00:23:43,710 --> 00:23:50,760 Dar, există o cale - nu ar trebui sa au răsturnat - 260 00:23:50,760 --> 00:23:54,800 că nu avem nevoie chiar de a verifica dacă acesta e mari sau mici? 261 00:23:54,800 --> 00:24:02,240 Ce putem face pentru a vă întotdeauna că vom ajunge mereu la majuscule? 262 00:24:02,240 --> 00:24:07,830 Deci, observați ceea ce am făcut pentru litere mici "a", ce dacă am făcut acest lucru exact aceeasi să majuscule A? 263 00:24:07,830 --> 00:24:11,900 Are majuscule O schimbare, sau nu modificarea valorii? 264 00:24:11,900 --> 00:24:23,100 Da. Deci, orice scrisoare de capital la nivel de bit ANDed cu ~ 32 va fi faptul că aceeași literă mare 265 00:24:23,100 --> 00:24:29,220 deoarece pentru orice caracter majusculă biți 32 nu este setat. 266 00:24:29,220 --> 00:24:40,920 Deci, dacă vrem să aducem caracterul s [i], vrem ca aceasta să devină litere mici sau majuscule. 267 00:24:40,920 --> 00:24:46,890 Deci, dacă ar fi fost mici, acum este majusculă, în cazul în care a fost scris cu majuscule, este încă majuscule, si asta e tot. 268 00:24:46,890 --> 00:24:54,290 I-am spus acest lucru în supersection: Puteți folosi 32, dacă vrei, dar eu tind să prefere face "o" - A, 269 00:24:54,290 --> 00:25:01,150 în loc de pur și simplu 32, deoarece acesta poate fi orice alt biți. 270 00:25:01,150 --> 00:25:03,610 După 32 de biți, acesta poate fi oricare dintre acestea, sau nu am avea suficientă 271 00:25:03,610 --> 00:25:05,840 numere pentru a reprezenta toate caracterele. 272 00:25:05,840 --> 00:25:09,110 Deci, dacă aveți 32 de biți, ar putea fi pe 64 biți, ar putea fi 128 bit. 273 00:25:09,110 --> 00:25:13,990 Oricare dintre aceste biți ar putea fi biți care face distincția între majuscule și minuscule. 274 00:25:13,990 --> 00:25:18,350 N-ar trebui să știu că e pe 32 de biți. 275 00:25:18,350 --> 00:25:27,130 Eu pot folosi acest 'a' - Un pic pentru a obține că diferă între cele două 276 00:25:27,130 --> 00:25:33,000 fără a fi nevoie să se bazeze pe numarul magic, care este 32. 277 00:25:33,000 --> 00:25:38,770 Și acum, conta altceva a fost ciudat, și așa mai departe ceea ce vreau să fac? 278 00:25:38,770 --> 00:25:43,920 [Răspunde Student, neinteligibil] 279 00:25:43,920 --> 00:25:45,920 [Student] Ce e asta? 280 00:25:45,920 --> 00:25:49,850 Eu voi face în 1 secundă. 281 00:25:49,850 --> 00:25:55,690 Deci, acum, dacă vreau să - Vreau să vă asigurați că personajul este acum cu litere mici, 282 00:25:55,690 --> 00:26:04,140 si asa am pot sau cu 32, și 32 semnificația "a" - A. 283 00:26:04,140 --> 00:26:06,510 Dar notificare, de către același raționament ca și cel anterior, că, dacă 284 00:26:06,510 --> 00:26:11,670 scrisoare a fost deja mici, apoi ring cu 32 doar o menține litere mici. 285 00:26:11,670 --> 00:26:16,220 Ea nu și-a schimbat caracterul original. 286 00:26:16,220 --> 00:26:19,910 Dar acum nu am, pentru a evita spunând: "Dacă este cu litere mici, uita doar despre asta, 287 00:26:19,910 --> 00:26:23,650 daca e scris cu majuscule, apoi schimbați-l. " 288 00:26:23,650 --> 00:26:26,900 E mult mai convenabil pentru a face acest lucru. 289 00:26:26,900 --> 00:26:33,190 [Student] ar faptul că strategia de scăderea cu majuscule de la locul de muncă cu litere mici în cazul în care nu au fost 32? 290 00:26:33,190 --> 00:26:35,330 Dacă ar fi fost, ca, 34 sau ceva de genul? 291 00:26:35,330 --> 00:26:41,840 Deci, trebuie să știți că diferența dintre 2 este -? >> 1 bit. 292 00:26:41,840 --> 00:26:49,840 Acesta ar putea fi mai mult de 1 bit, atâta timp cât toate de mai jos biți această poziție sunt aceleași. 293 00:26:49,840 --> 00:26:58,500 Deci, avem nevoie de cel puțin 26 de caractere - sau, există 26 de caractere. 294 00:26:58,500 --> 00:27:04,590 Deci, avem nevoie de cel puțin 26 de numere pentru a reprezenta diferența - 295 00:27:04,590 --> 00:27:07,650 Diferența dintre A și "a" trebuie să fie de cel puțin 26, 296 00:27:07,650 --> 00:27:10,760 sau altfel nu ne-ar fi reprezentat toate numerele de capital. 297 00:27:10,760 --> 00:27:18,630 Asta înseamnă că A, în cazul în care vom începe de la 1, se va folosi toate aceste biți, 298 00:27:18,630 --> 00:27:23,900 toate aceste primii 5 biți, pentru a reprezenta totul prin Z. 299 00:27:23,900 --> 00:27:32,170 De aceea biți următoare, sau acest bit, următorul bit este cel care a ales să se facă distincția între A și "o". 300 00:27:32,170 --> 00:27:40,930 Asta e, de asemenea, motivul pentru care, în tabelul ASCII, există 5 simboluri de separare litere din capital de la litere mici. 301 00:27:40,930 --> 00:27:49,050 Deoarece acestea sunt simbolurile, plus 5, care aduce 32 fiind diferența dintre ele. 302 00:27:49,050 --> 00:27:51,840 [Student] Deci, am putea face acest lucru, pentru că ASCII este proiectat în acest fel. 303 00:27:51,840 --> 00:27:57,280 Da. Dar ASCII - diferența ar putea fi, de asemenea, ambele biți. 304 00:27:57,280 --> 00:28:12,040 Ca, dacă A fost 10000001, și "a" a fost 11100001 - Am uitat, indiferent. 305 00:28:12,040 --> 00:28:18,100 Dar dacă ar fi fost acest lucru, atunci am putea folosi în continuare "a" - A. 306 00:28:18,100 --> 00:28:22,650 E doar acum diferența dintre A și "a" este în continuare aceste 2 biți. 307 00:28:22,650 --> 00:28:32,240 Cred că e scris 48. Este 32 + 64? Cred că este? 308 00:28:32,240 --> 00:28:40,160 Ar fi inca 2 biți; fiecare caracter unic, cum ar fi, Z și Z, K și K, 309 00:28:40,160 --> 00:28:45,160 ei ar avea în continuare aceleași biți exacte stabilite, cu excepția acelor 2 biți. 310 00:28:45,160 --> 00:28:48,870 Deci, atâta timp cât e întotdeauna adevărat, indiferent dacă suntem folosind ASCII sau un alt sistem, 311 00:28:48,870 --> 00:28:53,050 atât timp cât nu există decât un anumit număr de biți, care sunt diferite pentru fiecare personaj, 312 00:28:53,050 --> 00:28:55,050 apoi că funcționează bine. 313 00:28:55,050 --> 00:29:06,110 E doar faptul că 32 a fost înființat pentru că e primul ne-ar putea folosi, eventual. Mișto >>. 314 00:29:06,110 --> 00:29:14,520 Eu tind să prefere, în cazul în care nu ați văzut, în cazul în care blocul este doar o singură linie, 315 00:29:14,520 --> 00:29:24,280 poti scapa de acolade; așa că am tendința de a prefera face acest lucru. 316 00:29:24,280 --> 00:29:34,010 De asemenea, știți cum putem face lucruri cum ar fi s [i] + = 1? 317 00:29:34,010 --> 00:29:41,090 Puteți face, de asemenea, s [i] la nivel de bit SI = 32. 318 00:29:41,090 --> 00:29:46,400 Și la nivel de bit SAU = 32. 319 00:29:46,400 --> 00:29:51,490 De asemenea, luate în considerare mod 2 == 0. 320 00:29:51,490 --> 00:30:00,900 Așa că ne amintim - nu voi scrie - orice valoare non-zero, este adevărat, și 0 este falsă. 321 00:30:00,900 --> 00:30:07,880 Deci, "în cazul în care numărul de mod 2 == 0" este aceeași cu a spune "daca nu conta mod 2." 322 00:30:07,880 --> 00:30:11,580 Eu, probabil, ar fi inversat doar liniile și a spus, "dacă numărul Mod 2, 323 00:30:11,580 --> 00:30:15,350 nu sau 1, altceva ȘI 1 ", așa că nu am nevoie de" nu ". 324 00:30:15,350 --> 00:30:18,650 Dar acest lucru funcționează la fel de bine. 325 00:30:18,650 --> 00:30:25,660 Și ce altceva pot face aici? 326 00:30:25,660 --> 00:30:29,060 Ai putea să le combine cu ternar, dacă ai vrut, dar apoi asta ar face doar lucrurile Messier 327 00:30:29,060 --> 00:30:33,770 și, probabil, mult mai greu de citit, așa că nu va face asta. 328 00:30:33,770 --> 00:30:37,330 Oricine are orice alte sugestii? 329 00:30:37,330 --> 00:30:41,580 Este că toate problema cerut? Oh, da. 330 00:30:41,580 --> 00:30:51,070 Deci, scapa de aceste linii goale, acum vom imprima f,% s fiind unul pentru siruri de caractere, 331 00:30:51,070 --> 00:30:56,620 Vom imprima F, S. 332 00:30:56,620 --> 00:30:59,330 Acum, hai să-l rulați. Am făcut ceva greșit? 333 00:30:59,330 --> 00:31:03,200 Asta e un \ "; Vreau un nr. 334 00:31:03,200 --> 00:31:07,840 Bine. Acum vom rula. Va țipa la mine, probabil. 335 00:31:07,840 --> 00:31:11,250 Strlen este în string.h. 336 00:31:11,250 --> 00:31:14,290 Deci, asta este un lucru frumos despre zăngănit este vă spune ce e în, 337 00:31:14,290 --> 00:31:19,140 în loc de GCC care doar spune, "Hei, ai uitat ceva, nu știu ce a fost." 338 00:31:19,140 --> 00:31:29,220 Dar acest lucru va spune-mi, "Ai vrut să includă string.h." 339 00:31:29,220 --> 00:31:32,130 Așa că nu am cere nimic, așa că nu se spune nimic. 340 00:31:32,130 --> 00:31:42,540 Dar vom face exemplul lor, "thanks 4 add". 341 00:31:42,540 --> 00:31:47,880 Asta arata bine. Ura. 342 00:31:47,880 --> 00:31:52,370 Deci, revenind la principala ta, eu nu fac asta aproape. 343 00:31:52,370 --> 00:31:57,110 E opțional. Și principal este singura funcție pentru care este opțională. 344 00:31:57,110 --> 00:32:07,140 Dacă nu întoarce nimic din principal, se presupune că ai vrut să returnați valoarea 0. 345 00:32:07,140 --> 00:32:13,070 Întrebări? 346 00:32:13,070 --> 00:32:20,980 Bine. Deci, acum doua problemă. 347 00:32:20,980 --> 00:32:24,810 "Recall la prelegerea 2 săptămâni de-al doilea, care pompare valori 2 variabilelor prin trecerea 348 00:32:24,810 --> 00:32:30,780 cele 2 variabile la o funcție (chiar dacă sunt chemați de swap) nu funcționează exact, cel puțin nu fără "indicii". 349 00:32:30,780 --> 00:32:37,020 Și să ignore indicii până când vom ajunge la ele. 350 00:32:37,020 --> 00:32:40,070 Dorim să schimbe 2 variabile, noi nu utilizați o funcție pentru a face acest lucru. 351 00:32:40,070 --> 00:32:43,410 Suntem încă de gând să-l facă în principal ca se spune. 352 00:32:43,410 --> 00:32:48,360 Dar pentru a folosi cele 2 variabile, noi nu doriți să utilizați o variabilă temporară. 353 00:32:48,360 --> 00:32:50,770 Există 2 moduri de a face acest lucru. 354 00:32:50,770 --> 00:32:56,310 Poti sa o faci folosind dvs. de operatorii tradiționali binare. 355 00:32:56,310 --> 00:33:00,180 Deci, nimeni nu știe un mod rapid și murdar de a face asta? 356 00:33:00,180 --> 00:33:07,650 S-ar putea avea de fapt un minut de gândire. Dacă am - 357 00:33:07,650 --> 00:33:12,130 Voi seta problema sus ca ei cer. Deci, dacă am 2 variabile, A, care este doar un număr întreg 358 00:33:12,130 --> 00:33:17,800 că m-au dau, și suma variabila B, care este un alt întreg care am dat. 359 00:33:17,800 --> 00:33:22,700 Deci, dacă am aceste 2 variabile, acum vreau sa le schimba. 360 00:33:22,700 --> 00:33:31,550 Tradițional, folosindu-vă operatorii regulate binare, vreau sa spun, ca +, -, ÷. 361 00:33:31,550 --> 00:33:36,630 Nu operatori la nivel de bit, care acționează pe binar. 362 00:33:36,630 --> 00:33:39,600 Prin utilizarea așa -, +, ÷, și toți cei. 363 00:33:39,600 --> 00:33:52,980 Am putea schimba de a face ceva de genul a = a + b, și b = a - b, a = a - b. 364 00:33:52,980 --> 00:34:04,260 Deci, bun-simț verifica, iar apoi vom vedea de ce lucrări. 365 00:34:04,260 --> 00:34:13,320 Să spunem că un = 7, b = 3, atunci A + B va fi 10. 366 00:34:13,320 --> 00:34:18,820 Deci suntem de stabilire acum un 10 =, iar apoi facem b = a - b. 367 00:34:18,820 --> 00:34:30,250 Deci, facem b = a - b, care va fi de 7, și b = a - b, din nou, 368 00:34:30,250 --> 00:34:38,650 sau o = a - b. Care este de gând să fie cu 10 - 7, care este de 3. 369 00:34:38,650 --> 00:34:44,850 Deci, acum, în mod corect, "A" a fost de 7, b a fost de 3, iar acum b este 7 și "a" este 3. 370 00:34:44,850 --> 00:34:48,679 Deci, acest tip de sens; "a" este combinația dintre cele 2 numere. 371 00:34:48,679 --> 00:34:53,000 În acest moment, "a" este combinația, iar apoi vom scăzând din b originală, 372 00:34:53,000 --> 00:34:56,860 și apoi vom scăderea ce a fost original "o". 373 00:34:56,860 --> 00:35:01,150 Dar acest lucru nu funcționează pentru toate numerele. 374 00:35:01,150 --> 00:35:08,880 Pentru a vedea acest lucru, să ia în considerare un sistem; așa ne gândim de obicei de numere întregi, ca 32 de biți. 375 00:35:08,880 --> 00:35:13,050 Hai să lucreze la ceva care e doar ca 4 biți. 376 00:35:13,050 --> 00:35:15,450 Sperăm că am venit cu un exemplu bun acum. 377 00:35:15,450 --> 00:35:18,680 Deci, eu știu, acest lucru va fi ușor. 378 00:35:18,680 --> 00:35:26,720 Să spunem noastre 2 numere sunt 1111, 1111 și, deci suntem în binar acum. 379 00:35:26,720 --> 00:35:34,630 În zecimale reale, în cazul în care doriți să se gândească în felul ăsta, o. = 15 și b = 15 380 00:35:34,630 --> 00:35:37,630 Și astfel ne așteptăm, după ce le-am schimba - ele nu trebuie nici măcar să fie aceleași numere, 381 00:35:37,630 --> 00:35:41,140 dar am făcut-o în acest fel. 382 00:35:41,140 --> 00:35:47,100 Să nu-i face aceleași numere. Să facem 1111 și 0001. 383 00:35:47,100 --> 00:35:51,860 Deci, un = 15 și b = 1. 384 00:35:51,860 --> 00:35:57,670 După ce le-am schimba, ne așteptăm la "A" pentru a fi 1 și b să fie 15. 385 00:35:57,670 --> 00:36:01,780 Deci, primul nostru pas este un = a + b. 386 00:36:01,780 --> 00:36:08,770 Numerele noastre sunt numai 4 biți, astfel încât "o", care este 1111, + b, care este 0001, 387 00:36:08,770 --> 00:36:16,780 se va termina prin a fi 10000, dar avem doar 4 biți. 388 00:36:16,780 --> 00:36:22,540 Deci, acum un = 0. 389 00:36:22,540 --> 00:36:34,080 Și acum vrem să setați b = a - b - de fapt, acest lucru încă funcționează perfect. 390 00:36:34,080 --> 00:36:39,630 a = a - să vedem dacă asta funcționează perfect - b. 391 00:36:39,630 --> 00:36:53,720 Deci, atunci b = 0 - 1, care ar fi încă 15, și apoi a = a - b, ceea ce ar fi 1. 392 00:36:53,720 --> 00:36:56,210 Poate că acest lucru nu. 393 00:36:56,210 --> 00:36:59,020 Mă simt ca nu e un motiv pentru care nu funcționează cu ajutorul regulat. 394 00:36:59,020 --> 00:37:06,400 Ok, deci lucrează la ipoteza că acesta nu funcționează cu operațiunile regulate binare, 395 00:37:06,400 --> 00:37:15,040 și voi căuta - Voi Google pentru a vedea dacă acest lucru este adevărat. 396 00:37:15,040 --> 00:37:23,490 Așa că vrem să o facem folosind operatori la nivel de bit, iar indiciu aici este XOR. 397 00:37:23,490 --> 00:37:28,780 Deci, introducerea XOR (^) în cazul în care nu ați văzut-o încă. 398 00:37:28,780 --> 00:37:34,610 E, din nou, un operator de bit așa că acționează bit cu bit, si este - 399 00:37:34,610 --> 00:37:39,910 Dacă aveți biți 0 și 1, atunci aceasta va fi 1. 400 00:37:39,910 --> 00:37:45,230 Dacă aveți de 1 și 0 biți, acesta va fi 1, aveți la 0 și 0 biți va fi 0, 401 00:37:45,230 --> 00:37:47,640 și, dacă aveți un biți și 1 va fi 0. 402 00:37:47,640 --> 00:37:56,180 Deci e ca și cum SAU. Dacă oricare dintre biți sunt adevărate, e 1, dar spre deosebire de SAU, ea nu poate fi atât de biți care sunt adevărate. 403 00:37:56,180 --> 00:37:59,320 Sau ar fi aceasta să fie de 1, XOR ar avea acest fi 0. 404 00:37:59,320 --> 00:38:02,250 Așa că de gând să doriți să utilizați XOR aici. 405 00:38:02,250 --> 00:38:09,960 Gândește-te pentru un minut, am de gând să Google. 406 00:38:09,960 --> 00:38:16,230 Ei bine, nu puteți citi că, eu sunt în prezent pe pagina de algoritmul XOR de swap. 407 00:38:16,230 --> 00:38:21,340 Sperăm că acest lucru va explica de ce Nu pot - 408 00:38:21,340 --> 00:38:34,190 Acest lucru este exact algoritmul pe care tocmai l-am făcut-o. 409 00:38:34,190 --> 00:38:37,330 Eu tot nu văd de ce - am ales trebuie să fi doar un exemplu rău, 410 00:38:37,330 --> 00:38:44,940 dar acest caz, în cazul în care "o" sa întâmplat de a deveni 0, după ce la 5 biti, asa ca acum "a" este 0, 411 00:38:44,940 --> 00:38:48,730 asta este ceea ce se numește "de tip integer overflow." 412 00:38:48,730 --> 00:38:54,370 Conform Wikipedia, "Spre deosebire de swap XOR, această variație presupune că acesta utilizează unele metode 413 00:38:54,370 --> 00:38:59,780 pentru a garanta că x + y nu determina o integer overflow. " 414 00:38:59,780 --> 00:39:08,350 Deci, acest lucru nu avea probleme, acest lucru a fost de tip integer overflow, dar am făcut ceva greșit. 415 00:39:08,350 --> 00:39:10,520 Nu sunt sigur. Voi încerca să vină cu un altul. 416 00:39:10,520 --> 00:39:13,640 [Student] Ei bine, nu este de tip integer overflow atunci când sunteți încercarea de a pune un număr de acolo 417 00:39:13,640 --> 00:39:16,640 mai mare decât suma de biti care le-ați alocat? 418 00:39:16,640 --> 00:39:23,730 Da. Avem 4 biți. Asta e. - am avut 4 biți, ne apoi încercați să adăugați la 1 la acesta, așa că am termina cu 5 biți. 419 00:39:23,730 --> 00:39:26,690 Dar bit cincea doar se taie, da. 420 00:39:26,690 --> 00:39:28,970 S-ar putea, de fapt - 421 00:39:28,970 --> 00:39:33,010 [Student] Asta te arunc o eroare, sau nu, care - ar arunca asta vreo eroare? 422 00:39:33,010 --> 00:39:40,720 Nu Deci nu e nici o eroare. Când ajungi la nivelul de asamblare, un pic de construcții 423 00:39:40,720 --> 00:39:47,020 undeva este stabilit faptul că a spus că a fost un preaplin, dar în C ai un fel de pur si simplu nu a face cu asta. 424 00:39:47,020 --> 00:39:55,160 Tu de fapt, nu se poate face cu ea, decât dacă folosiți instrucțiuni speciale de asamblare în C. 425 00:39:55,160 --> 00:39:58,110 Să ne gândim de swap XOR. 426 00:39:58,110 --> 00:40:02,220 Și cred că articolul din Wikipedia ar fi fost, de asemenea spunând că - 427 00:40:02,220 --> 00:40:07,310 Deci, de asemenea, adus aritmetica modulara, deci cred că am fost, în teorie, face aritmetica modulara 428 00:40:07,310 --> 00:40:11,160 când am spus că 0 - 1 este din nou 15. 429 00:40:11,160 --> 00:40:15,410 Deci, care ar putea, de fapt - pe un procesor obișnuit care face 0 - 1 = 15. 430 00:40:15,410 --> 00:40:20,430 Din moment ce am ajuns la 0, scădem 1, astfel încât atunci doar se încadrează în jurul valorii de înapoi la 1111. 431 00:40:20,430 --> 00:40:28,930 Deci, acest algoritm ar putea lucra, de fapt, a + b, a - b, b - o, pentru ca s-ar putea să fie bine. 432 00:40:28,930 --> 00:40:34,030 Dar există unele procesoare care nu face acest lucru, și astfel nu ar fi bine în aceste cele specifice. 433 00:40:34,030 --> 00:40:39,880 Swap-XOR va funcționa pe orice procesor. Bine. 434 00:40:39,880 --> 00:40:42,280 Ideea este ca ar trebui sa fie la fel, totuși. 435 00:40:42,280 --> 00:40:50,120 În cazul în care ne folosim XOR pentru a obține într-un fel de informații atât în ​​1 a variabilelor, 436 00:40:50,120 --> 00:40:54,120 și apoi trageți afară de informații a variabilelor individuale din nou. 437 00:40:54,120 --> 00:41:04,330 Deci, nimeni nu are idei / răspuns? 438 00:41:04,330 --> 00:41:14,540 [Răspuns Student, neinteligibil] 439 00:41:14,540 --> 00:41:22,220 Deci, acest lucru ar trebui funcționeze, și, de asemenea, XOR este comutativ. 440 00:41:22,220 --> 00:41:27,620 Indiferent de scopul pe care aceste 2 numere se întâmplă să fie în sus aici, 441 00:41:27,620 --> 00:41:30,100 acest rezultat va fi la fel. 442 00:41:30,100 --> 00:41:35,800 Deci, un ^ b este b ^ o. 443 00:41:35,800 --> 00:41:51,860 S-ar putea vedea, de asemenea este scris ca o ^ = b, b = ^ o, o ^ = b din nou. 444 00:41:51,860 --> 00:42:00,200 Deci, acest lucru este drept, și pentru a vedea de ce functioneaza, cred că de biți. 445 00:42:00,200 --> 00:42:10,400 Folosind un număr de smallish, să zicem 11001, 01100 și. 446 00:42:10,400 --> 00:42:12,790 Deci, aceasta este "o"; aceasta este b. 447 00:42:12,790 --> 00:42:15,540 Deci, un ^ = b. 448 00:42:15,540 --> 00:42:22,380 Vom fi stabilirea = 'A' la XOR din aceste 2 lucruri. 449 00:42:22,380 --> 00:42:32,920 Și-așa 1 ^ 0 este 1; 1 ^ 1 este 0, 0 ^ 1 este 1, și 0 ^ 0 este 0, 1 ^ 0 este 1. 450 00:42:32,920 --> 00:42:37,380 Deci "o," dacă te uiți la numărul zecimal, aceasta va fi - 451 00:42:37,380 --> 00:42:41,160 nu vei vedea mai mult de o relație între versiunea originală "a" și noul "o", 452 00:42:41,160 --> 00:42:45,600 dar uită la biți, "a" este acum ca o plasă de informații 453 00:42:45,600 --> 00:42:49,970 atât original, 'a' și b originale. 454 00:42:49,970 --> 00:42:57,930 Deci, dacă luăm b ^ o, vom vedea că vom ajunge la originalul "o". 455 00:42:57,930 --> 00:43:08,910 Și dacă luăm în original "a" ^ nou "o", vom vedea vom ajunge la b original. 456 00:43:08,910 --> 00:43:18,380 Deci (a ^ b) ^ b = original "o". 457 00:43:18,380 --> 00:43:27,910 Și (a ^ b) ^ a = b original. 458 00:43:27,910 --> 00:43:37,010 Nu există - un alt mod de a vedea acest lucru este XOR nimic în sine este întotdeauna 0. 459 00:43:37,010 --> 00:43:45,020 Deci, 1101 ^ 1101, toți biții vor fi aceleași. 460 00:43:45,020 --> 00:43:47,920 Deci, nu a existat niciodată o să fie un caz în care 1 este un 0 și cealaltă este 1. 461 00:43:47,920 --> 00:43:51,080 Deci, asta este 0000. 462 00:43:51,080 --> 00:43:57,240 Același lucru cu acest lucru. (A ^ b) ^ b este ca un ^ (b ^ b). 463 00:43:57,240 --> 00:44:03,680 (B ^ b) va fi 0; un ^ 0 este doar de gând să fie "o", deoarece toți biții sunt 0. 464 00:44:03,680 --> 00:44:08,050 Deci, singurii care vor fi în cazul în care "o", a fost inițial o 1 - a avut cele. 465 00:44:08,050 --> 00:44:12,070 Și aici, aceeași idee, eu sunt destul de sigur că e, de asemenea, comutativ. 466 00:44:12,070 --> 00:44:17,590 Da. Eu am spus înainte că a fost comutative. 467 00:44:17,590 --> 00:44:24,680 ^ "O", și este asociativ, asa ca acum (b ^ a) ^ o. 468 00:44:24,680 --> 00:44:28,970 Și putem face b ^ (a ^ a). 469 00:44:28,970 --> 00:44:31,540 Și astfel, din nou, avem b original. 470 00:44:31,540 --> 00:44:37,120 Deci, "a" este acum combinație de "a" și b împreună. 471 00:44:37,120 --> 00:44:49,660 Folosind noul nostru combo-'a' b = spunem Combo "a" ^ b originală, avem originalul "o". 472 00:44:49,660 --> 00:45:05,170 Și acum un combo = "a" ^ b noua, care a fost inițial - sau care este acum ceea ce a fost "o", sau b. 473 00:45:05,170 --> 00:45:13,620 Asta e acest caz aici. Acest lucru este = b, b vechi. 474 00:45:13,620 --> 00:45:16,550 Deci, acum totul este din nou în ordinea schimbate. 475 00:45:16,550 --> 00:45:22,960 Dacă avem de fapt uitat la biți, b = o ^ b, este de gând să XOR aceste 2, 476 00:45:22,960 --> 00:45:33,920 și răspunsul va fi acest lucru, și apoi o = o ^ b este XORing aceste 2 și răspunsul este aceasta. 477 00:45:33,920 --> 00:45:41,090 Întrebări? Bine. Deci, ultima este ceva mult mai dificil. 478 00:45:41,090 --> 00:45:43,180 [Student] Cred că are o întrebare cu privire la aceasta. >> Oh, îmi pare rău. 479 00:45:43,180 --> 00:45:49,380 [Student] Ce e de fapt mai repede? Dacă utilizați această XOR, sau este daca declara o variabilă nouă? 480 00:45:49,380 --> 00:45:55,190 Deci, ce este de fapt mai rapid, declarând o variabilă nouă sau folosind XOR pentru a schimba? 481 00:45:55,190 --> 00:45:59,600 Răspunsul este, după toate probabilitățile, o variabilă temporară. 482 00:45:59,600 --> 00:46:05,780 Și asta pentru că după ce a fost compilat în jos - deci la nivel de ansamblu, 483 00:46:05,780 --> 00:46:12,320 nu e nici un lucru, cum ar fi variabile locale sau orice variabile temporare sau la oricare dintre aceste lucruri. 484 00:46:12,320 --> 00:46:16,060 Sunt la fel ca - nu e de memorie, și există registre. 485 00:46:16,060 --> 00:46:20,920 Registre sunt în cazul în care lucrurile se întâmplă în mod activ. 486 00:46:20,920 --> 00:46:24,750 Tu nu adăugați 2 lucruri în memorie; se adaugă 2 lucruri în registre. 487 00:46:24,750 --> 00:46:28,160 Și aduceți lucrurile din memorie în registrele pentru a adăuga apoi le, 488 00:46:28,160 --> 00:46:33,180 și apoi s-ar putea le-a pus înapoi în memorie, dar toate acțiunile se întâmplă în registre. 489 00:46:33,180 --> 00:46:38,750 Deci, atunci când utilizați abordarea temporar variabila, de obicei, ceea ce se întâmplă este 490 00:46:38,750 --> 00:46:42,810 aceste 2 numere sunt deja în registre. 491 00:46:42,810 --> 00:46:46,570 Și apoi de la acel moment, după ce le-am schimbat, 492 00:46:46,570 --> 00:46:51,540 acesta va începe doar cu ajutorul alt registru. 493 00:46:51,540 --> 00:46:56,510 Oriunde ai fi fost utilizați b, se va folosi doar registrul care a fost deja stocarea "o". 494 00:46:56,510 --> 00:47:02,180 Așa că nu trebuie să facă nimic pentru a face de fapt swap. Da? 495 00:47:02,180 --> 00:47:05,690 [Student] Dar este nevoie de mai multă memorie, de asemenea, nu? 496 00:47:05,690 --> 00:47:10,280 Acesta va lua doar mai multă memorie în cazul în care are nevoie pentru a stoca că variabila temporară. 497 00:47:10,280 --> 00:47:14,830 Ca și în cazul în care utilizați mai târziu că variabila temporară din nou undeva, 498 00:47:14,830 --> 00:47:18,920 atunci - sau pe care o atribuiți ceva în acest variabilă temporară. 499 00:47:18,920 --> 00:47:24,630 Deci, dacă în orice punct în timp "a," b în temperatură au valori distincte sau ceva, 500 00:47:24,630 --> 00:47:30,680 atunci va trebui locații distincte în memorie, dar este adevărat că 501 00:47:30,680 --> 00:47:34,800 există multe variabile locale care vor exista numai în registre. 502 00:47:34,800 --> 00:47:44,370 În care caz, niciodată nu a pus în memorie, și astfel încât să nu pierzi memoria. 503 00:47:44,370 --> 00:47:58,620 Bine. Ultima întrebare este un pic mai mult. 504 00:47:58,620 --> 00:48:04,850 Deci, aici, în acest aparat CS50, există un dicționar. 505 00:48:04,850 --> 00:48:12,390 Și motivul pentru aceasta este că [? B66?] Este un corector ortografic în cazul în care veți fi scris 506 00:48:12,390 --> 00:48:15,780 folosind tabele de dispersie sau încearcă sau unele structuri de date. 507 00:48:15,780 --> 00:48:22,660 Ai de gând să fi scris un corector ortografic, și ai de gând să fie folosind acest dictionar pentru a face acest lucru. 508 00:48:22,660 --> 00:48:28,280 Dar pentru aceasta problema, ne sunt doar de gând să se uite în sus pentru a vedea dacă este un singur cuvânt în dicționar. 509 00:48:28,280 --> 00:48:31,250 Deci, în loc de a stoca întregul dicționarul în unele structuri de date 510 00:48:31,250 --> 00:48:35,180 și apoi caută peste un întreg document pentru a vedea dacă ceva e greșit, 511 00:48:35,180 --> 00:48:38,490 vrem doar să găsească un cuvânt. Deci, putem scana doar peste dicționarul întregul 512 00:48:38,490 --> 00:48:44,300 și dacă nu găsim cuvântul în dicționar intreaga, atunci nu era acolo. 513 00:48:44,300 --> 00:48:52,150 Dacă vom scana întregul dicționarul și vedeți cuvântul, atunci suntem bine, l-am găsit. 514 00:48:52,150 --> 00:48:56,580 Se spune aici că vrem să începi să cauți la C de fișier de manipulare a funcției, 515 00:48:56,580 --> 00:48:59,930 din moment ce doriți să citiți dicționarul, 516 00:48:59,930 --> 00:49:07,680 dar eu va dau indiciu aici ca la care funcțiile ar trebui să gândi. 517 00:49:07,680 --> 00:49:11,510 Le voi scrie pe spațiile. 518 00:49:11,510 --> 00:49:20,490 Deci, cele principale pe care veți dori să se uite la f sunt deschise și apoi, în mod inevitabil, f închis, 519 00:49:20,490 --> 00:49:26,540 care va merge la sfârșitul programului dumneavoastră, și scanare f f. 520 00:49:26,540 --> 00:49:31,060 Ai putea folosi, de asemenea, f citit, dar probabil că nu doriți să 521 00:49:31,060 --> 00:49:34,200 pentru că - nu se termină nevoie de asta. 522 00:49:34,200 --> 00:49:41,880 F scanare f este ceea ce ai de gând să fie utilizați pentru a scana peste dicționarul. 523 00:49:41,880 --> 00:49:46,370 Și așa nu aveți nevoie pentru a coda sus soluția, la fel ca și încercați pseudo-cod-ți de drum 524 00:49:46,370 --> 00:50:05,200 la o soluție, iar apoi vom discuta. 525 00:50:05,200 --> 00:50:14,110 Și, de fapt, de când am dat deja astea, daca te duci in orice terminal sau shell aparatul dumneavoastră, 526 00:50:14,110 --> 00:50:18,250 Aș - Eu de obicei - în cazul în care nu ați văzut-o încă, nu știu dacă ai făcut-o în clasă, 527 00:50:18,250 --> 00:50:23,490 dar omul, astfel încât paginile man, sunt destul de utile pentru uită la destul de mult orice funcție. 528 00:50:23,490 --> 00:50:27,330 Deci, eu pot face, ca, f omule, scanare f. 529 00:50:27,330 --> 00:50:32,300 Aceasta este acum informatii despre familia f scanare de funcții. 530 00:50:32,300 --> 00:50:37,070 Aș putea face, de asemenea, deschise f om, și că va da-mi detalii cu privire la acest lucru. 531 00:50:37,070 --> 00:50:40,750 Deci, daca stii ce funcția pe care o utilizați, sau ai citit codul 532 00:50:40,750 --> 00:50:43,000 și veți vedea unele funcții și tu ești la fel ca, "Ce face asta?" 533 00:50:43,000 --> 00:50:45,280 Doar omul care funcția de nume. 534 00:50:45,280 --> 00:50:47,340 Există o serie de exemple de ciudat în cazul în care ar putea să aibă de spus 535 00:50:47,340 --> 00:50:51,620 place. Man 2, care numele funcției, sau omul 3 că numele funcției, 536 00:50:51,620 --> 00:50:58,230 dar trebuie doar să faci asta în cazul în care numele funcției omul nu se întâmplă să lucreze prima dată. 537 00:50:58,230 --> 00:51:03,010 [Student] Deci, eu citesc pagina de manual pentru deschis, dar eu sunt încă confuz cu privire la modul de a folosi și programul. 538 00:51:03,010 --> 00:51:06,170 Bine. O mulțime de pagini man sunt la mai puțin de ajutor. 539 00:51:06,170 --> 00:51:08,470 Sunt mult mai util dacă știți deja ce fac ei 540 00:51:08,470 --> 00:51:12,670 si apoi trebuie doar să ne amintim ordinea argumentelor sau ceva de genul. 541 00:51:12,670 --> 00:51:17,640 Sau pot oferi o imagine de ansamblu, dar unele dintre ele sunt foarte copleșitoare. 542 00:51:17,640 --> 00:51:22,220 Ca f scanare f, de asemenea. Acesta vă oferă informații pentru toate aceste funcții, 543 00:51:22,220 --> 00:51:28,120 și 1 linie de aici se întâmplă să spună, "F scanare f citește din punct de șir sau curs de apa." 544 00:51:28,120 --> 00:51:32,360 Dar f deschide. Deci, cum ne-ar folosi f deschis? 545 00:51:32,360 --> 00:51:38,470 Ideea unui program de care are nevoie pentru a face fișierul I / O este faptul că 546 00:51:38,470 --> 00:51:45,070 trebuie mai întâi să deschideți fișierul pe care doriți să faceți lucrurile cu, și în mod inevitabil, 547 00:51:45,070 --> 00:51:51,220 citește lucrurile din acel fișier și de a face lucruri cu ele. 548 00:51:51,220 --> 00:51:55,350 F deschisă este ceea ce am folosi pentru a deschide fișierul. 549 00:51:55,350 --> 00:52:04,190 Lucru ne întoarcem, deci ce fișierul vrem să deschideți, dă-ne - 550 00:52:04,190 --> 00:52:11,970 aici se spune "/ user / share / dict / cuvinte." 551 00:52:11,970 --> 00:52:16,740 Acesta este fișierul pe care ne-o dorim pentru a deschide, și vrem să-l deschideți - 552 00:52:16,740 --> 00:52:21,440 trebuie să ne precizeze în mod explicit dacă vrem să-l deschidă pentru a citi sau dacă vrem să deschideți-l să scrie. 553 00:52:21,440 --> 00:52:26,490 Există o serie de combinatii si alte chestii, dar vrem să deschidă asta pentru lectură. 554 00:52:26,490 --> 00:52:29,380 Dorim să citească din fișierul. 555 00:52:29,380 --> 00:52:34,290 Deci, ce are acest retur? Returnează un fișier stea (*), 556 00:52:34,290 --> 00:52:37,260 și voi arăta totul în variabila f, așa *, 557 00:52:37,260 --> 00:52:40,840 din nou, este un pointer, dar nu vrem să se ocupe de pointeri. 558 00:52:40,840 --> 00:52:46,470 Vă puteți gândi la f ca, f este acum variabila ai de gând să utilizați pentru a reprezenta fișierul. 559 00:52:46,470 --> 00:52:49,850 Deci, dacă doriți să citiți din dosar, ai citit din f. 560 00:52:49,850 --> 00:52:54,820 Dacă doriți să închideți fișierul, închideți f. 561 00:52:54,820 --> 00:53:00,350 Deci, la sfârșitul programului atunci când, inevitabil, să închideți fișierul, ceea ce ar trebui să facem? 562 00:53:00,350 --> 00:53:06,750 Vrem să închideți f. 563 00:53:06,750 --> 00:53:12,600 Asa ca acum funcția de ultimul fișier pe care am de gând să doriți să utilizați scanarea este f, f f scanare. 564 00:53:12,600 --> 00:53:20,930 Și ce face este scanează peste fișierul în căutarea unui model pentru a se potrivi. 565 00:53:20,930 --> 00:53:39,100 Privind la pagina de om de aici, vom vedea int f f scanare, ignora valoarea returnata de acum. 566 00:53:39,100 --> 00:53:45,230 Primul argument este * flux de fișier, astfel încât primul argument am de gând să doriți să treacă este f. 567 00:53:45,230 --> 00:53:47,900 Suntem de scanare peste f. 568 00:53:47,900 --> 00:53:53,680 Al doilea argument este un șir format. 569 00:53:53,680 --> 00:53:58,310 Eu va voi da un șir format acum. 570 00:53:58,310 --> 00:54:05,180 Cred că se întâmplă să spunem, 127s \ n, o mulțime de care e inutil. 571 00:54:05,180 --> 00:54:12,490 Ideea a ceea ce șir format este, vă puteți gândi este de f scanare ca opusul lui f de imprimare. 572 00:54:12,490 --> 00:54:17,160 Deci f imprimare, imprimare f vom folosi, de asemenea, acest tip de parametru format, 573 00:54:17,160 --> 00:54:25,000 dar în f imprimare ceea ce facem noi este - să ne uităm la un echivalent. 574 00:54:25,000 --> 00:54:32,550 Imprima atât de f, și există, de asemenea, de fapt f imprimare f, în cazul în care primul argument va fi f. 575 00:54:32,550 --> 00:54:40,980 Când imprimați f, am putea spune ceva de genul, "Print 127s \ n" și apoi, dacă am să-l dați niște șir, 576 00:54:40,980 --> 00:54:44,050 se va imprima acest șir și apoi o linie nouă. 577 00:54:44,050 --> 00:54:49,690 Ce înseamnă 127, sunt destul de sigur, dar eu nu am am limitat la aceasta, 578 00:54:49,690 --> 00:54:52,470 Tu nu ar trebui chiar să spun '127 'în f imprimare, 579 00:54:52,470 --> 00:54:57,090 dar ce inseamna este imprimați primele 127 de caractere. 580 00:54:57,090 --> 00:54:59,350 Așa că eu sunt destul de sigur că e cazul. Puteți Google pentru asta. 581 00:54:59,350 --> 00:55:03,000 Dar, în următorul Sunt aproape sigur, înseamnă că. 582 00:55:03,000 --> 00:55:08,880 Deci, aceasta este a imprima prima 127 de caractere, urmate de o linie nouă. 583 00:55:08,880 --> 00:55:14,680 F f scanare acum, în loc de a privi la o variabilă și imprimarea acesteia, 584 00:55:14,680 --> 00:55:22,620 o să se uite la unele șir, și păstrează tiparul în variabila. 585 00:55:22,620 --> 00:55:26,360 Să folosim efectiv f scanare într-un alt exemplu. 586 00:55:26,360 --> 00:55:31,670 Deci, haideți să spune că am avut unele int, x = 4, 587 00:55:31,670 --> 00:55:41,110 și am vrut să creăm un șir format din - a vrut să creeze string 588 00:55:41,110 --> 00:55:44,250 că a fost ca, aceasta va veni mult mai târziu, 589 00:55:44,250 --> 00:55:49,020 ceva care e la fel ca 4.jpg. 590 00:55:49,020 --> 00:55:51,870 Deci, acest lucru ar putea fi un program in care vei avea contra sumei, 591 00:55:51,870 --> 00:55:56,420 concluzie a contracara I, și doriți să salvați o grămadă de imagini. 592 00:55:56,420 --> 00:56:02,430 Deci, doriți să salvați i.jpg, unde i este un iterație a buclei dumneavoastră. 593 00:56:02,430 --> 00:56:05,500 Deci, cum putem face acest șir pentru că JPEG? 594 00:56:05,500 --> 00:56:11,720 Dacă ați fi dorit să imprimați 4.jpg, am putea spune doar f imprimare, d.jpg%, 595 00:56:11,720 --> 00:56:14,410 și apoi l-ar imprima pentru JPEG. 596 00:56:14,410 --> 00:56:20,050 Dar dacă vrem să salvați 4.jpg șir, vom folosi f scanare. 597 00:56:20,050 --> 00:56:30,860 Deci sirul s - de fapt, am Cant - personaj, char s, hai să mergem 100. 598 00:56:30,860 --> 00:56:35,400 Așa că am declarat doar câteva matrice de 100 de caractere, 599 00:56:35,400 --> 00:56:39,830 și asta e ceea ce ne va fi, inevitabil, stocarea că JPEG inch 600 00:56:39,830 --> 00:56:47,920 Deci, vom folosi de scanare f, și formatul, cum ne-ar spune d.jpg% 601 00:56:47,920 --> 00:56:54,980 , în scopul de a imprima 4.jpg, formatul de acest lucru se întâmplă pentru a fi d.jpg%. 602 00:56:54,980 --> 00:57:04,020 Deci, formatul este d.jpg%, ceea ce vrem să înlocuiască d%, cu este x, 603 00:57:04,020 --> 00:57:06,590 și acum avem nevoie pentru a stoca acel șir undeva. 604 00:57:06,590 --> 00:57:12,500 Și în cazul în care vom păstra acest șir este în s. matrice. 605 00:57:12,500 --> 00:57:21,640 Deci, după această linie de cod, e, dacă vom imprima f, s% din variabila, 606 00:57:21,640 --> 00:57:26,280 se va imprima 4.jpg. 607 00:57:26,280 --> 00:57:38,930 Deci f scanare f este aceeași ca și scanare f, cu exceptia acum se uită peste acest fișier 608 00:57:38,930 --> 00:57:43,600 pentru ceea ce a stoca în s.. 609 00:57:43,600 --> 00:57:46,160 Asta e ceea ce ultimul argument va fi. 610 00:57:46,160 --> 00:57:54,170 Dorim să stocați - "familia de scanare f de scanări funcții atât în ​​funcție de formatul încercat de mai jos. 611 00:57:54,170 --> 00:58:02,450 Dacă sunt stocate în punctele de localizare s-ar putea întoarce - " 612 00:58:02,450 --> 00:58:12,910 Nu, am putea fi bine. Lasă-mă să mă gândesc o secundă. 613 00:58:12,910 --> 00:58:26,350 Deci, scanare f nu - ce naiba este funcția care face asta? 614 00:58:26,350 --> 00:58:31,650 Deci, scanare f nu este de gând să ia un întreg și de a face punct jpg. 615 00:58:31,650 --> 00:58:43,490 O să [Mumbles]. 616 00:58:43,490 --> 00:58:49,360 Salvați variabila int în șir int C. 617 00:58:49,360 --> 00:58:55,940 Ce este această variabilă, sau ceea ce este numit această funcție? 618 00:58:55,940 --> 00:59:04,950 Da. Asta e. - da. Deci, ceea ce am fost înainte de definirea să te lui a fost f imprimare, 619 00:59:04,950 --> 00:59:09,820 care - care face sens mult mai mult, de ce i-am spus că a fost mult mai mult ca f imprimare. 620 00:59:09,820 --> 00:59:14,700 Scanare f este încă un fel de f imprimare, dar f e de imprimare este de gând să-l scanați peste 621 00:59:14,700 --> 00:59:17,510 și înlocuiți variabilele, iar acum se păstrează într-un șir. 622 00:59:17,510 --> 00:59:19,620 În loc de imprimare-l, îl stochează într-un șir. 623 00:59:19,620 --> 00:59:25,070 Deci, ignora faptul că în întregime. Poți să te gândești încă de specificatorul de format ca genul asta de f imprimare. 624 00:59:25,070 --> 00:59:34,510 Deci, acum, dacă am vrut să facem lucrul 4.jpg, ne-ar face e f imprimare, x de acest lucru. 625 00:59:34,510 --> 00:59:38,520 Deci, ceea ce face scanarea f - ceea ce a fost vînzătorului va fi? 626 00:59:38,520 --> 00:59:40,820 [Student] Sunt doar confuz asupra a ceea ce încercăm să facem aici 627 00:59:40,820 --> 00:59:43,450 cu JPEG. Poți să explici asta timp 1 mai mult? 628 00:59:43,450 --> 00:59:52,710 Deci asta a fost - e relevent mai puțin de scanare f f acum, sperăm, se va lega la spate într-un fel de drum. 629 00:59:52,710 --> 01:00:02,240 Dar ceea ce am fost inițial intenția de a demonstra a fost - asta este de fapt direct relevante pentru aceste [?? F5] 630 01:00:02,240 --> 01:00:08,520 Ai de gând să fie utilizând e f imprimare, în cazul în care, spunem că avem 100 de imagini, 631 01:00:08,520 --> 01:00:13,630 și doriți să citiți imagini 1.jpg, 2.jpg, 3.jpg. 632 01:00:13,630 --> 01:00:21,520 Deci, în scopul de a face acest lucru, aveți nevoie pentru a f deschis, iar apoi va trebui să treci în șirul pe care doriți să îl deschideți. 633 01:00:21,520 --> 01:00:30,020 Deci, ne-am dori să deschidă 1.jpg, în scopul de a crea șir care este 1.jpg, 634 01:00:30,020 --> 01:00:37,660 f facem e de imprimare de% d.jpg--nu ne-am făcut pentru int i = 0. 635 01:00:37,660 --> 01:00:46,580 i <40, i + +. 636 01:00:46,580 --> 01:00:51,130 Deci, s% f imprimare d.jpg lui i. 637 01:00:51,130 --> 01:00:56,320 Deci, după această linie, acum e variabilă sau matrice se va 1.jpg. 638 01:00:56,320 --> 01:01:10,610 Sau, 0.jpg, 1.jpg, 2.jpg. Și astfel putem deschide, la rândul său, fiecare imagine pentru citire. 639 01:01:10,610 --> 01:01:19,550 Deci, asta este ceea ce e tipărarea f face. Nu vezi ce e tipărarea f face acum? 640 01:01:19,550 --> 01:01:25,720 [Student] Ok, deci durează - creează un șir, something.jpg, iar apoi îl stochează. 641 01:01:25,720 --> 01:01:30,360 Da. Se creează - aceasta este un alt șir format, la fel ca f scanare și f imprimare, 642 01:01:30,360 --> 01:01:37,530 în cazul în care acesta introduce toate variabilele în al doilea argument, ar putea fi s, spre deosebire de i.. 643 01:01:37,530 --> 01:01:42,280 Poate - Adică, asta e cazul. Dar oricare ar fi ordinea de argumente este. 644 01:01:42,280 --> 01:01:45,440 Se va introduce toate variabilele în șir format 645 01:01:45,440 --> 01:01:52,250 și depozitați apoi în tampon noastră, noi numim asta un tampon, e în cazul în care suntem stocarea șir. 646 01:01:52,250 --> 01:02:00,750 Deci, suntem în interiorul stocarea e-șir corect formatat, d% au fost înlocuite cu 4. 647 01:02:00,750 --> 01:02:08,080 [Student] Deci, dacă am făcut acest lucru, este f variabila doar de gând să fie dați afară? 648 01:02:08,080 --> 01:02:18,110 Da. Așa că ar trebui să închidă f inițială înainte de a face acest lucru. 649 01:02:18,110 --> 01:02:22,810 Dar - și apoi, de asemenea, în cazul în care nu ar exista un f deschide aici, atunci ne-ar trebui să spunem - 650 01:02:22,810 --> 01:02:29,280 Da. Dar ar deschide o sută de fișiere diferite. 651 01:02:29,280 --> 01:02:37,360 [Student] Dar noi nu ar fi capabil de a accesa sau - în regulă. 652 01:02:37,360 --> 01:02:44,230 Bine. Deci scanare f, f f scanare, este un fel de aceeași idee, 653 01:02:44,230 --> 01:02:53,610 dar în loc de, în loc de a stoca o într-un șir, e mai mult ca tine sunt acum 654 01:02:53,610 --> 01:03:02,420 trecând peste o intepatura și de model de potrivire împotriva acestei șir și stocarea rezultatelor în variabile. 655 01:03:02,420 --> 01:03:11,290 Puteți utiliza f scanare pentru a analiza peste ceva de genul 4.jpg, și păstrează întreg în 4 x int suma. 656 01:03:11,290 --> 01:03:13,430 Asta e ceea ce putem folosi f scanare pentru. 657 01:03:13,430 --> 01:03:16,300 F f scanare este de gând să faci asta la linia de comandă. 658 01:03:16,300 --> 01:03:19,200 Sunt de fapt destul de sigur că asta este ceea ce face biblioteca CS50. 659 01:03:19,200 --> 01:03:29,050 Deci, atunci când spui, "get int", e de scanare f-ing peste - f scanare este modul în care obține date introduse de utilizator. 660 01:03:29,050 --> 01:03:34,670 F f scanare este de gând să facă același lucru, dar folosind un fișier pentru a scana peste. 661 01:03:34,670 --> 01:03:41,090 Deci, aici, suntem scanați peste acest fișier. 662 01:03:41,090 --> 01:03:45,460 Model incercam pentru a se potrivi este un șir de caractere care este de 127 de caractere 663 01:03:45,460 --> 01:03:48,100 urmată de o linie nouă 664 01:03:48,100 --> 01:03:54,770 Așa că eu sunt destul de sigur că am putea chiar spune pur și simplu "meci e", deoarece în dicționarul 665 01:03:54,770 --> 01:03:57,770 se întâmplă să avem, suntem garantat nici un cuvânt este atât de mult timp, 666 01:03:57,770 --> 01:04:03,310 și, de asemenea, f f scanare, cred, se va opri la noua linie, indiferent de ce. 667 01:04:03,310 --> 01:04:06,970 Dar vom include noua linie în meci, și - 668 01:04:06,970 --> 01:04:13,960 [Student] Dacă nu am include noua linie, nu l-ar găsi părți ale unui cuvânt? 669 01:04:13,960 --> 01:04:22,900 Ea - fiecare - se uită la dicționar - 670 01:04:22,900 --> 01:04:26,200 Deci, în dicționar, acestea sunt toate cuvintele noastre. 671 01:04:26,200 --> 01:04:30,500 Fiecare unul este pe o linie nouă. 672 01:04:30,500 --> 01:04:32,510 F scanare este de gând să ia acest cuvânt. 673 01:04:32,510 --> 01:04:38,750 Dacă noi nu includ noua linie, atunci este posibil ca f următoarea scanare va citi doar noua linie. 674 01:04:38,750 --> 01:04:44,180 Dar incluzând noua linie, atunci va ignora pur și simplu noua linie. 675 01:04:44,180 --> 01:04:49,440 Dar niciodata nu vom ajunge o parte a unui cuvânt, deoarece suntem mereu citesc până la o nouă linie, indiferent de ce. 676 01:04:49,440 --> 01:04:54,530 [Student] Dar ce se întâmplă dacă veți căuta pentru cuvântul "cissa," ca cissa. 677 01:04:54,530 --> 01:04:57,380 Va găsi că, și spun că este un meci? 678 01:04:57,380 --> 01:05:05,110 Deci, aici vom - acesta va citi - aceasta este de fapt un punct bun. 679 01:05:05,110 --> 01:05:10,660 Noi nu îl utilizați curent - cuvântul căutăm este prima linie de comandă argumentul. 680 01:05:10,660 --> 01:05:16,460 Deci șir, cuvânt = argv 1. 681 01:05:16,460 --> 01:05:20,020 Deci, șirul căutăm este argv 1. 682 01:05:20,020 --> 01:05:23,290 Noi nu suntem în căutarea pentru un cuvânt, la toate în f scanare noastră. 683 01:05:23,290 --> 01:05:28,030 Ce facem cu scanare f este obtinerea fiecare cuvânt în dicționar, 684 01:05:28,030 --> 01:05:34,320 și apoi o dată avem acest cuvânt vom folosi strcmp pentru a le compara. 685 01:05:34,320 --> 01:05:39,210 Vom compara cuvântul nostru și ceea ce tocmai am citit inch 686 01:05:39,210 --> 01:05:45,110 Deci în mod inevitabil, vom ajunge să faci o grămadă de scanare fs 687 01:05:45,110 --> 01:05:52,130 până când doar așa se întâmplă că f scanare va reveni - 688 01:05:52,130 --> 01:05:54,800 acesta va reveni cu o, atâta timp cât acesta a egalat un cuvânt nou, 689 01:05:54,800 --> 01:06:01,360 și se va întoarce altceva, de îndată ce nu a reușit să se potrivească cuvântul. 690 01:06:01,360 --> 01:06:08,440 Citim peste tot dicționarul, stocarea linie cu linie fiecare cuvânt în variabila. 691 01:06:08,440 --> 01:06:17,240 Apoi, suntem comparativ cu cuvântul lui, și dacă compararea == 0, 692 01:06:17,240 --> 01:06:21,650 strcmp se întâmplă pentru a aduce 0 daca un meci a fost facut. 693 01:06:21,650 --> 01:06:31,510 Deci, în cazul în care a fost de 0, atunci putem imprima f, potrivit, 694 01:06:31,510 --> 01:06:35,370 sau cuvântul este în dicționar, sau orice altceva doriți să imprimați f. 695 01:06:35,370 --> 01:06:41,450 Și apoi - nu vrem să închidă f peste si peste din nou. 696 01:06:41,450 --> 01:06:50,410 Acesta este genul de lucruri ce vrem să facem, iar noi nu sunt doar în căutarea pentru un cuvânt în dicționar. 697 01:06:50,410 --> 01:06:56,660 Deci, am putea face asta, dacă am vrut să se uite pentru modelul lor, cissa, cum ai spus mai înainte, 698 01:06:56,660 --> 01:07:00,260 în cazul în care am vrut să se uite pentru acel model, atunci acesta ar eșua în cazul 699 01:07:00,260 --> 01:07:08,010 pentru că nu e de fapt un cuvânt, dar unul dintre cuvintele din dicționarul se întâmplă să aibă că în ea. 700 01:07:08,010 --> 01:07:13,560 Deci, s-ar potrivi la acest cuvânt, dar acest subgrup de cuvânt nu este un cuvânt în sine. 701 01:07:13,560 --> 01:07:17,250 Dar asta nu e modul în care ne-l utilizați, suntem lectură în fiecare cuvânt 702 01:07:17,250 --> 01:07:19,740 și compararea apoi cuvântul avem cu acel cuvânt. 703 01:07:19,740 --> 01:07:25,780 Deci, suntem mereu comparat cuvinte pline. 704 01:07:25,780 --> 01:07:29,620 Eu pot trimite soluții finalizate mai târziu. 705 01:07:29,620 --> 01:07:32,050 Aceasta este un fel de aproape răspunsul corect, cred. 706 01:07:32,050 --> 01:07:34,720 [Comentariu Student, neinteligibil] 707 01:07:34,720 --> 01:07:40,870 Oh, am scăpa de asta înainte? Char s, cred ca am spus 127 - Am uitat ce cea mai mare este. 708 01:07:40,870 --> 01:07:44,100 Vom face doar 128, așa că acum e este suficient de lung. 709 01:07:44,100 --> 01:07:46,570 Nu avem nevoie de nimic pentru a imprima. 710 01:07:46,570 --> 01:07:56,440 Suntem, de asemenea, de gând să doriți să aveți pentru a închide dosarul nostru, și că ar trebui să fie despre raspunsul corect. 711 01:07:56,440 --> 01:07:59,440 CS50.TV