1 00:00:00,000 --> 00:00:02,200 [Powered by Google Translate] [Săptămâna 3] 2 00:00:02,200 --> 00:00:03,950 [David J. Malan - Universitatea Harvard] 3 00:00:03,950 --> 00:00:07,140 [Acest lucru este CS50. - CS50.TV] 4 00:00:07,140 --> 00:00:10,720 Lasă-mă să ne orienteze în direcția de unde am rămas data trecută, 5 00:00:10,720 --> 00:00:13,890 care a fost începe să se gândească un pic mai mult decât despre sintaxa 6 00:00:13,890 --> 00:00:17,150 și încercând să se gândească un pic mai puțin despre toate amanuntele 7 00:00:17,150 --> 00:00:20,630 care ia un pic de timp să se aclimatizeze la astfel până în prezent în ceea ce privește punct și virgulă 8 00:00:20,630 --> 00:00:22,360 și paranteze și acolade, 9 00:00:22,360 --> 00:00:25,630 pentru a începe să luați lucrurile un pic la un nivel conceptual superior 10 00:00:25,630 --> 00:00:28,800 astfel încât problemele pe care le începem acum rezolvarea in urmatoarele cateva saptamani 11 00:00:28,800 --> 00:00:32,340 sunt de gând să se implice mult mai mult o problemă de nivel superior conceptuale 12 00:00:32,340 --> 00:00:36,310 și un pic mai puțin în sintactic ca te uda picioarele tale 13 00:00:36,310 --> 00:00:40,090 și mâinile murdare cu unele dintre sintaxa din aceste ultimele saptamani. 14 00:00:40,090 --> 00:00:43,690 >> Deci, reamintim că săptămâna trecută am introdus aceasta notiune a unei matrice. 15 00:00:43,690 --> 00:00:49,320 Și o serie în limba engleză poate fi descrisă ca ce? >> [Elevului răspunsul neauzit] 16 00:00:49,320 --> 00:00:51,710 Ne pare rău? 17 00:00:51,710 --> 00:00:54,810 O colectie de? >> [Elevului răspunsul neauzit] >> Bine, bine. 18 00:00:54,810 --> 00:00:57,820 O colecție de obiecte. Deci, am văzut tablouri din Scratch. 19 00:00:57,820 --> 00:01:01,880 Dacă sa întâmplat să utilizați pentru PSET 0 una din listele răzuibile că puteți trage lucruri 20 00:01:01,880 --> 00:01:05,410 cum ar fi portocale și banane în, un inventar de soiuri, 21 00:01:05,410 --> 00:01:07,100 asta e un fel de ceea ce este o matrice. 22 00:01:07,100 --> 00:01:10,980 Și apoi mai tehnic, în contextul unui calculator real, 23 00:01:10,980 --> 00:01:14,730 o matrice este pur și simplu o bucată de memorie contiguă. 24 00:01:14,730 --> 00:01:18,590 Cu alte cuvinte, aveți un octet, apoi un alt octet, octet apoi altul, apoi altul octet, 25 00:01:18,590 --> 00:01:21,330 și dacă ar fi să atragă acele octeți într-o imagine, 26 00:01:21,330 --> 00:01:24,510 acestea ar trebui să revină la spate în spate în spate. Asta e ceea ce înțelegem prin contiguu. 27 00:01:24,510 --> 00:01:26,690 >> Deci e numărul 1 octet, apoi 2, apoi 3. 28 00:01:26,690 --> 00:01:29,680 Aceasta nu înseamnă aici, aici, aici, aici. 29 00:01:29,680 --> 00:01:33,800 O matrice este o bucată contiguă de 0 sau mai multe octeți. 30 00:01:33,800 --> 00:01:36,160 Deci, ce sunt ele utile pentru? 31 00:01:36,160 --> 00:01:40,090 Amintesc am avut acest fel de exemplu artificială de clase de test Oameni de depozitare într-un program de 32 00:01:40,090 --> 00:01:42,580 pentru a calcula media tau Quiz pentru un curs, 33 00:01:42,580 --> 00:01:46,780 și amintesc că am putea începe să scrie că programul de declarare a unei variabile quiz1. 34 00:01:46,780 --> 00:01:49,550 Apoi ne-am putea avea un alt variabilă numită quiz2. 35 00:01:49,550 --> 00:01:52,030 Dar, apoi, dacă ar exista 3 teste în această clasă, quiz4. 36 00:01:52,030 --> 00:01:55,710 Sau în cazul în care a existat un test săptămânal, ar fi quiz5, quiz6, quiz7. 37 00:01:55,710 --> 00:01:58,520 Deci, v-ați putea avea toate aceste variabile declarate în interiorul principal 38 00:01:58,520 --> 00:02:00,470 sau în altă parte în program, 39 00:02:00,470 --> 00:02:03,870 și problema cu această abordare, ușor, deși este de a copia și lipi doar, 40 00:02:03,870 --> 00:02:06,120 este pur si simplu foarte repede devine greoaie. 41 00:02:06,120 --> 00:02:09,360 Doamne ferește de fapt are 30 sau 50 de chestionare chestionare. 42 00:02:09,360 --> 00:02:12,080 Dacă e ca un test de liceu pop stil de zi cu zi, 43 00:02:12,080 --> 00:02:15,910 atunci ai avea doar o listă lungă de ridicol variabilelor declarate, 44 00:02:15,910 --> 00:02:17,780 și aceasta doar foarte repede scapă de sub control. 45 00:02:17,780 --> 00:02:20,820 E urât, e greu să se mențină, e mult mai ușor să facă o greșeală de scriere 46 00:02:20,820 --> 00:02:23,910 daca ai tastat greșit 1 numar undeva în programul tău. 47 00:02:23,910 --> 00:02:26,800 >> Deci, am introdus noțiunea de matrice în loc. 48 00:02:26,800 --> 00:02:30,760 Și amintesc că am implementat acest program de a face ceva de genul asta. 49 00:02:30,760 --> 00:02:33,950 Lasă-mă să intru în de astăzi Sursa 3 luni directorul 50 00:02:33,950 --> 00:02:37,160 și să se deschidă matrice, pe care am văzut ultima oară. 51 00:02:37,160 --> 00:02:39,940 Și chiar dacă au existat o serie de noi trucuri C aici, 52 00:02:39,940 --> 00:02:41,920 printre ei noțiunea de o constantă, 53 00:02:41,920 --> 00:02:47,140 amintesc că am declarat pluteste multiple în esență, prin folosirea acestui sintaxă: 54 00:02:47,140 --> 00:02:51,750 float, apoi numele variabilei, apoi am folosit paranteze patrate cu adevărat pentru prima dată, 55 00:02:51,750 --> 00:02:55,450 și ceea ce am făcut în interiorul acestor paranteze patrate a fost pus efectiv un număr. 56 00:02:55,450 --> 00:02:59,780 Dar, în loc de a pune un număr, am pus acest cuvânt capitalizat, Teste. 57 00:02:59,780 --> 00:03:03,220 Și ce a fost motivația pentru a pune un cuvânt capitalizată ca Teste 58 00:03:03,220 --> 00:03:08,170 și apoi cu ajutorul liniei 17 truc aici pentru a da de fapt, că un număr? 59 00:03:08,170 --> 00:03:11,240 Care a fost motivația acolo? Da. 60 00:03:11,240 --> 00:03:13,360 >> [Răspuns studentul nu pot fi auzite] >> Exact. 61 00:03:13,360 --> 00:03:16,630 Dacă vrem să schimbăm această valoare 2, trebuie doar să-l schimbați în locul 1 62 00:03:16,630 --> 00:03:19,680 pentru că ia în considerare - Nu-mi amintesc nici măcar ce acest program a făcut exact, 63 00:03:19,680 --> 00:03:22,040 dar dacă degresat doar te văd Teste, Teste. 64 00:03:22,040 --> 00:03:24,720 Tu vezi teste, aici jos mai multe chestionare. 65 00:03:24,720 --> 00:03:28,180 Deci, dacă nu am avea această constantă, această utilizare a defini ascuțite, 66 00:03:28,180 --> 00:03:33,320 ne-am fi tastat 2, apoi 2, apoi 2, apoi 2, ceea ce este bine. Ar fi la fel de corect. 67 00:03:33,320 --> 00:03:36,220 Dar să presupunem că anul viitor avem 3 teste în CS50. 68 00:03:36,220 --> 00:03:39,190 Așa că trebuie să mă duc și să actualizeze codul, am să-l recompilați, 69 00:03:39,190 --> 00:03:43,820 dar problema este dacă fac vreo prostie, ca și cum aș trece cu vederea o mențiune din 2 70 00:03:43,820 --> 00:03:46,750 și uitați să conectați 3, întregul program ar putea foarte bine rupe. 71 00:03:46,750 --> 00:03:48,720 Deci, suntem doar cere pentru probleme. 72 00:03:48,720 --> 00:03:53,170 >> Deci, noțiunea de constantă este vorba de factoring din unele bucată de date, 73 00:03:53,170 --> 00:03:56,070 indiferent dacă este un șir de caractere sau un caracter sau un flotor sau orice altceva, 74 00:03:56,070 --> 00:04:00,070 și declarând că locul 1, astfel încât să puteți mai ușor schimba în viitor. 75 00:04:00,070 --> 00:04:03,660 Și este, de asemenea,, sincer, un pic mai ușor de citit pentru că dacă tocmai ați gândi la asta acum, 76 00:04:03,660 --> 00:04:07,840 E teste, sau am putea redenumi chiar ceva de genul NUMBER_OF_QUIZZES 77 00:04:07,840 --> 00:04:09,430 sau mai mult explicită ceva. 78 00:04:09,430 --> 00:04:11,830 Codul de doar devine un pic mai evident ca la ceea ce face, 79 00:04:11,830 --> 00:04:15,780 și vă întreb un pic mai puțin ceea ce s-ar putea întâmpla numărul 2 să însemne. 80 00:04:15,780 --> 00:04:18,920 Deci, constanta nu a avut nimic de a face cu matrice fundamental. 81 00:04:18,920 --> 00:04:22,990 Matrice a fost introdusă prin aceste paranteze patrate. 82 00:04:22,990 --> 00:04:26,610 >> Deci, observăm că, în linia 23 ne întrebăm de utilizator, "Care au fost rezultatele tale test?" 83 00:04:26,610 --> 00:04:31,120 Apoi vom avea doar această buclă, care solicită aparent ghidul pentru clasele lor. Cum? 84 00:04:31,120 --> 00:04:37,460 Se iterează 0 - 2. Și eu spun 2, deoarece Teste în toate capacele este în prezent 2. 85 00:04:37,460 --> 00:04:42,310 Deci, iterează de la 0 până la 2 și apoi se imprimă Quiz din # ceva de ceva, 86 00:04:42,310 --> 00:04:45,830 si apoi foloseste GetFloat pentru a obține o valoare de utilizare. 87 00:04:45,830 --> 00:04:49,050 Deci observați acest lucru este singura piesă nouă de altă sintaxă de miercurea trecută. 88 00:04:49,050 --> 00:04:53,120 Dacă doriți să stocați ceva într-o locație special în această matrice, 89 00:04:53,120 --> 00:04:55,460 să utilizați din nou paranteze pătrate. 90 00:04:55,460 --> 00:04:57,030 >> Deci, există un pic de dihotomie aici. 91 00:04:57,030 --> 00:04:59,040 Prima dată când utilizați parantezele pătrate 92 00:04:59,040 --> 00:05:02,250 ai să-l utilizați pentru a specifica cât de mare vrei să fie matrice. 93 00:05:02,250 --> 00:05:06,580 Dar acest context, următoarea aici, unde vom angaja din nou aceste paranteze pătrate 94 00:05:06,580 --> 00:05:10,540 înseamnă că în cazul în care, în matrice în care vrei să pui o anumita valoare? 95 00:05:10,540 --> 00:05:13,650 Și distincția aici se poate deduce din context. 96 00:05:13,650 --> 00:05:17,130 Observați aici avem un tip de date, atunci avem numele unei variabile, 97 00:05:17,130 --> 00:05:20,770 apoi ne-am aparat dentar noastre pătrați, cu un număr de interior, punct și virgulă. Asta e tot. 98 00:05:20,770 --> 00:05:22,290 Așa că e o declarație. 99 00:05:22,290 --> 00:05:28,390 E doar ca și cum am fi făcut ceva ca float grade1; float grade2; 100 00:05:28,390 --> 00:05:31,730 dar, din nou, acest lucru foarte repede revine în copie prea mult, pastă, 101 00:05:31,730 --> 00:05:34,260 astfel încât în ​​loc ne-am simplificat-l ca atare, 102 00:05:34,260 --> 00:05:38,800 ceea ce înseamnă de acum înainte avem un grad care poate fi stocat la consola 0, 103 00:05:38,800 --> 00:05:41,760 avem un alt grad care pot fi depozitate la suportul 1, 104 00:05:41,760 --> 00:05:46,890 dar ce se întâmplă dacă am nating și, de exemplu, bucla mea merge atât de departe - 105 00:05:46,890 --> 00:05:48,740 de exemplu, am face asta mai mică sau egală cu, 106 00:05:48,740 --> 00:05:50,620 care amintesc a fost sursa de bug-uri anterioare - 107 00:05:50,620 --> 00:05:55,590 ceea ce înseamnă efectiv că pe unele repetare accidentale treime din această buclă 108 00:05:55,590 --> 00:06:00,380 Eu folosesc suportul 2. Efectiv, ceea ce s-ar putea întâmpla aici? Ne pare rău? 109 00:06:00,380 --> 00:06:02,860 [Elev] O să fie înlocuit. Este >> va fi înlocuit? 110 00:06:02,860 --> 00:06:04,520 Ce-ar fi înlocuit? 111 00:06:04,520 --> 00:06:10,890 Acest literal spune înlocui ceea ce este în locația 2 cu valoarea de returnare a GetFloat. 112 00:06:10,890 --> 00:06:13,690 Dar problema este cât de mare este matrice în acest moment în povestea? 113 00:06:13,690 --> 00:06:17,730 [Imperceptibil elev de răspuns] >> matrice este în continuare doar de marimea 2 114 00:06:17,730 --> 00:06:22,730 deoarece matrice, ca orice variabilă, a fost declarată în primul rând, înainte de a l-am folosit, 115 00:06:22,730 --> 00:06:27,220 si am specificat aici, din cauza acestei constante pe care am 2 clase pe care am de gând să afișezi. 116 00:06:27,220 --> 00:06:29,930 >> Dar tine minte, oamenii de stiinta de calculator începe numărarea de la 0. 117 00:06:29,930 --> 00:06:33,620 Deci, prima locatie din care categorie de matrice este 0. 118 00:06:33,620 --> 00:06:40,210 Următoarea locație este 1. Acest lucru este vreodată atât de ușor prea departe de partea. 119 00:06:40,210 --> 00:06:42,870 Deci, cu alte cuvinte, în cazul în care am avut de fapt acest vector - 120 00:06:42,870 --> 00:06:46,790 și lasă-mă să văd cât de bine cooperează asta aici, pentru noi - 121 00:06:46,790 --> 00:06:52,360 dacă am o matrice care pur și simplu l-am întocmit, după cum urmează 122 00:06:52,360 --> 00:06:56,750 și am alocat spatiu pentru 2 elemente, s-ar putea trage aceasta ca aceasta în amintirea 123 00:06:56,750 --> 00:06:58,020 în cazul în care aceasta panza alba este de mare. 124 00:06:58,020 --> 00:07:00,920 E doar RAM am în calculatorul meu, un concert de RAM, 2 gig-uri de memorie RAM, indiferent de, 125 00:07:00,920 --> 00:07:05,400 dar aceste 2 cutii acum reprezintă în mod individual un flotor, 32 de biți. 126 00:07:05,400 --> 00:07:10,860 Deci, dacă am pus 1 numar aici ca 1.0, atunci am pus un alt număr de aici ca 3.2 127 00:07:10,860 --> 00:07:15,280 dar apoi m-am fac suportul 2, asta e ca pune ceva aici. 128 00:07:15,280 --> 00:07:17,820 Și, după cum sugerează imaginea, nu este nimic acolo. 129 00:07:17,820 --> 00:07:20,450 E un fel de țară a nimănui, pentru că nu am cerut sistemul de operare 130 00:07:20,450 --> 00:07:23,550 să-mi dea acest test al treilea. 131 00:07:23,550 --> 00:07:26,940 Dacă am vrut ca test al treilea rând, aș fi avut chibzuire 132 00:07:26,940 --> 00:07:31,700 să solicite sistemul de operare pentru aceasta prin a declara QUIZ-a nu fi 2 133 00:07:31,700 --> 00:07:34,210 dar pentru a egala în schimb 3. 134 00:07:34,210 --> 00:07:39,000 >> Deci, cu alte cuvinte, imaginea pe care ne eficient aibă la îndemână pare ca asta aici. 135 00:07:39,000 --> 00:07:42,260 Acest lucru din nou, este țara nimănui. Noi nu încercăm mai bine scris valorile aici. 136 00:07:42,260 --> 00:07:45,300 Dar, din nou, deoarece oamenii de stiinta de calculator numerotate de la 0, 137 00:07:45,300 --> 00:07:49,520 atunci când vorbim despre această locație în matrice, care ar trebui sa fie locatia 0, 138 00:07:49,520 --> 00:07:53,890 aceasta se presupune a fi locația 1, iar acest lucru nu există nici 139 00:07:53,890 --> 00:07:57,380 pentru că am cerut doar un sistem de operare pentru 2 astfel de locuri. 140 00:07:57,380 --> 00:08:00,130 Deci, cei dintre voi cu experienta in programare prealabilă din alte limbi 141 00:08:00,130 --> 00:08:04,150 ar putea să știu că acest lucru nu este întotdeauna cazul cu tablouri sau alte lucruri numite vectori. 142 00:08:04,150 --> 00:08:06,930 Mai degrabă, puteți să vă păstrați doar să adăugăm și adăugarea și adăugarea de lucruri de matrice, 143 00:08:06,930 --> 00:08:10,720 care, sincer, am avut că abilitatea în Scratch și totuși se pare că am dat-o aici 144 00:08:10,720 --> 00:08:15,160 deoarece cu C sunteți de programare mult mai explicit. 145 00:08:15,160 --> 00:08:17,980 E doar tu și calculatorul chiar acum, iar calculatorul este doar de gând să facă 146 00:08:17,980 --> 00:08:19,530 ceea ce se spune să facă. 147 00:08:19,530 --> 00:08:24,270 Deci, dacă vă spun doar să vă dau 2 flotoare cu titlu de linia 22 aici, 148 00:08:24,270 --> 00:08:27,640 asta e tot ce ai de gând să mă întorc de la sistemul de operare: spațiu pentru 2. 149 00:08:27,640 --> 00:08:34,049 >> Deci, din ce în ce sunt programele vor fi ocazional cărucior cu privire la matrice. 150 00:08:34,049 --> 00:08:37,520 Acesta este doar un fel de natura fiarei care toți dintre noi sunt supus greșelii, 151 00:08:37,520 --> 00:08:42,490 și la un moment dat va indexa, foarte probabil, dincolo de limita de matrice dumneavoastră. 152 00:08:42,490 --> 00:08:45,980 Si asta e doar un mod fantezist de a spune te-ai dus în ceva suport 153 00:08:45,980 --> 00:08:49,970 și ceva a fost prea mare a unui număr. Te-ai dus dincolo de limitele matrice dumneavoastră. 154 00:08:49,970 --> 00:08:51,530 Dar acum este cu susul în acest sens. 155 00:08:51,530 --> 00:08:54,990 Restul acestui program nu are nimic de a face cu fundamental matrice. 156 00:08:54,990 --> 00:08:58,180 E totul doar despre unele aritmetică simplă pentru medii de calcul. 157 00:08:58,180 --> 00:09:03,200 Deci avem aici, în această buclă pentru prima aici o sumă variabilă numită pe care le inițializează la 0. 158 00:09:03,200 --> 00:09:09,020 Apoi ne-am repeta de la 0 până la 2 din nou și vom adăuga la această variabilă însumarea 159 00:09:09,020 --> 00:09:12,620 clasa-lea, atât de reglaj 0, apoi suport 1. 160 00:09:12,620 --> 00:09:15,130 Și atunci, ca v-ar face în școala primară a calcula media, 161 00:09:15,130 --> 00:09:19,420 vom lua pur și simplu că suma intre, împărțiți-l la numărul total de chestionare, 162 00:09:19,420 --> 00:09:22,520 și apoi pentru o bună măsură numim o functie numita aici rundă. 163 00:09:22,520 --> 00:09:28,580 >> Acum, ca o paranteză, ceea ce este treaba cu acest int paranteză pe linia 34? 164 00:09:28,580 --> 00:09:31,730 S-ar putea au venit deja în secțiune, nu au vorbit deloc despre asta în mod oficial aici, 165 00:09:31,730 --> 00:09:35,210 dar ceea ce este acest int în Parens probabil faci? >> [Elevului răspunsul neauzit] 166 00:09:35,210 --> 00:09:38,500 Da, aceasta se referă la turnare sau typecasting, 167 00:09:38,500 --> 00:09:41,690 ceea ce înseamnă a lua un tip de date și conversia la altul. 168 00:09:41,690 --> 00:09:45,400 Nu puteți face acest lucru cu toate tipurile de date, deoarece, uneori, că ar fi un pic ciudat. 169 00:09:45,400 --> 00:09:49,640 Dar în acest caz, în cazul în care valoarea întoarcerea rundă este un flotor 170 00:09:49,640 --> 00:09:53,880 deoarece, la urma urmei, eu iau un flotor și împărțirea de către un număr de ca 2, 171 00:09:53,880 --> 00:09:55,840 Mă duc să mă întorc un flotor. 172 00:09:55,840 --> 00:10:00,760 Dar oamenii clasa de școală nu prea place să știe că media lor a fost de 93.4 173 00:10:00,760 --> 00:10:04,420 pentru că ei vor da seama că au fost vreodată atât de aproape de acel punct rotunjire 95. 174 00:10:04,420 --> 00:10:09,540 >> Așa că vrem să utilizați în loc int a rotunji toată lumea la cel mai apropiat int, 175 00:10:09,540 --> 00:10:12,730 care în acest caz va fi 94 cu nici un punct după el. 176 00:10:12,730 --> 00:10:14,530 Deci, asta e doar un mic truc matematic. 177 00:10:14,530 --> 00:10:17,570 Și vom reveni la această noțiune de turnare, deoarece aceasta va avea implicații, 178 00:10:17,570 --> 00:10:21,640 în cazul în care nu ați descoperit deja, pentru problema set 2. 179 00:10:21,640 --> 00:10:25,210 Deci, o matrice, atunci, vă puteți gândi la - se va ma face sa zambesc toata ziua. 180 00:10:25,210 --> 00:10:27,830 Se pare ca acest lucru dacă desena o imagine a acesteia, 181 00:10:27,830 --> 00:10:31,460 dar cheia este faptul că dimensiunea este, de asemenea, selectate de tine 182 00:10:31,460 --> 00:10:34,050 atunci când îl cere de la sistemul de operare. 183 00:10:34,050 --> 00:10:39,460 Orice întrebări, apoi pe tablouri? Da. 184 00:10:39,460 --> 00:10:47,080 [Întrebare elev neauzit] 185 00:10:47,080 --> 00:10:49,310 Ah, bună întrebare. 186 00:10:49,310 --> 00:10:53,150 Întrebarea este ce se întâmplă cu 0 nul în matrice? Ea nu există în acest context. 187 00:10:53,150 --> 00:10:57,430 Care există numai în contextul siruri de caractere, pe care suntem pe cale să vină la doar o clipă. 188 00:10:57,430 --> 00:11:02,300 Dar pentru o matrice, ca în acest caz, tot ceea ce primiti este ceea ce cere sistemul de operare pentru. 189 00:11:02,300 --> 00:11:04,050 >> Și, ca o paranteză, ca nu cumva aceasta să fie neclară, 190 00:11:04,050 --> 00:11:07,030 Eu tot spun să vă întreb sistemul de operare, adresați-vă sistemul de operare. 191 00:11:07,030 --> 00:11:10,090 Un sistem de operare, după cum probabil știți, este Mac OS, Windows, Linux. 192 00:11:10,090 --> 00:11:13,560 Când sunteți de asteptare funcții, cum ar fi GetFloat 193 00:11:13,560 --> 00:11:19,280 sau se declară variabile, cum ar fi note, 194 00:11:19,280 --> 00:11:23,200 la sfârșitul zilei vă sunt în mod eficient cere pe altcineva pentru a vă oferi că memoria 195 00:11:23,200 --> 00:11:25,940 pentru că aspiră ca programatori 196 00:11:25,940 --> 00:11:28,800 nu au nici o idee cum să obțineți de fapt, accesul fizic la memorie. 197 00:11:28,800 --> 00:11:31,100 Dar cineva face: sistem de operare. 198 00:11:31,100 --> 00:11:36,630 Deci, în afară de noi se prezintă cu icoane frumoase și meniuri și foldere și cum ar fi 199 00:11:36,630 --> 00:11:39,050 pe care le vedeți pe desktop, dacă un Mac sau PC-ul, 200 00:11:39,050 --> 00:11:42,240 sisteme de operare, de asemenea, face chestii nivelul scăzut lumesc, 201 00:11:42,240 --> 00:11:44,680 chestii foarte tehnică de gestionare GIGABYTE 202 00:11:44,680 --> 00:11:48,780 sau 2 GB de memorie pe care le au, gestionarea procesor care o ai, și așa mai departe. 203 00:11:48,780 --> 00:11:50,170 Așa că atunci când scrii cod, 204 00:11:50,170 --> 00:11:53,900 sunteți cu adevărat prindere in pentru a sistemului de operare în acest sens. 205 00:11:53,900 --> 00:11:55,720 Am de gând să aibă de a minimiza asta. Bine. 206 00:11:55,720 --> 00:11:59,980 >> Alte intrebari legate de tablouri? 207 00:12:00,330 --> 00:12:02,520 Nu? Bine. 208 00:12:02,520 --> 00:12:06,680 Deci, trecerea de la natural matrice este de fapt un subiect care e un pic familiar. 209 00:12:06,680 --> 00:12:09,570 Și ne-am uitat vreodată atât de scurt în acest moment ultima prea. 210 00:12:09,570 --> 00:12:12,500 Acesta a fost un exemplu șir de miercuri. 211 00:12:12,500 --> 00:12:15,060 Acest exemplu șir a fost un program destul de simplu, 212 00:12:15,060 --> 00:12:18,120 și am simplificat de fapt de un cuplu de linii în scopuri de astăzi. 213 00:12:18,120 --> 00:12:22,680 Tot ceea ce face, în linia 19 este de a lua un șir de utilizator, o stochează într-o variabilă numită uri. 214 00:12:22,680 --> 00:12:28,670 Apoi, în linia 22 este mai departe de imprimare se pare că șirul de 1 caracter pe fiecare rând. 215 00:12:28,670 --> 00:12:30,730 Dar cum se face acest lucru? 216 00:12:30,730 --> 00:12:33,350 Suntem de declarare a unei variabile i, setarea este egal cu 0, 217 00:12:33,350 --> 00:12:35,770 și acest lucru este din ce în ce vechi obicei acum. 218 00:12:35,770 --> 00:12:39,270 Nu am văzut acest lucru până miercuri, dar poți fel de deduc din numele său 219 00:12:39,270 --> 00:12:44,610 strlen returnează doar ceea ce atunci când e dat? Lungimea șirului. 220 00:12:44,610 --> 00:12:47,940 Deci, dacă am să-l dați un șir, citat-unquote DAVID, 221 00:12:47,940 --> 00:12:51,810 se va sperăm să se întoarcă la mine numărul 5, din cauza DAVID. 222 00:12:51,810 --> 00:12:55,600 Deci, asta e scopul său în viață este de a lua un șir de caractere, indiferent dacă greu codificate de tine 223 00:12:55,600 --> 00:12:58,840 sau, în acest caz, conectat într-o variabilă ca, ca argument, 224 00:12:58,840 --> 00:13:01,980 si da seama ce lungimea șir care este. 225 00:13:01,980 --> 00:13:06,470 >> Deci, aici, acum suntem împrumuta ceva de la notația exemplul testul anterior. 226 00:13:06,470 --> 00:13:09,390 Acest lucru nu are nimic de-a face cu flotoare, nu are nimic de-a face cu chestionare, 227 00:13:09,390 --> 00:13:13,100 dar se pare că minciună nevinovată ne-am spus de la săptămâna 1 228 00:13:13,100 --> 00:13:16,330 este faptul că un șir nu există cu adevărat în C. 229 00:13:16,330 --> 00:13:20,230 Un șir la sfârșitul zilei este de fapt doar o matrice. 230 00:13:20,230 --> 00:13:25,140 Este o matrice de octeți, octet astfel, octet, octet, octet, care amintesc este la doar 8 biți, 231 00:13:25,140 --> 00:13:28,130 astfel bucată de memorie, segment de memorie, segment de memorie, segment de memorie. 232 00:13:28,130 --> 00:13:31,210 Și mijloacele prin care un șir este pus în aplicare 233 00:13:31,210 --> 00:13:33,070 este de a pune primul caracter aici, 234 00:13:33,070 --> 00:13:37,470 apoi aici, apoi aici, apoi aici, spate în spate în spate în memoria calculatorului. 235 00:13:37,470 --> 00:13:42,160 Deci, dacă ai vrut să scrie un cuvânt ca HELLO, v-ar pune 1 caracter H, 236 00:13:42,160 --> 00:13:48,240 apoi E, apoi L atunci L, atunci O - 5 caractere în total - undeva în memoria RAM a computerului. 237 00:13:48,240 --> 00:13:52,080 Dar detaliile cheie aici este că au de gând să se întoarcă la spate în spate în spate, 238 00:13:52,080 --> 00:13:54,200 chiar lângă unul cu altul. 239 00:13:54,200 --> 00:13:58,820 Cand când spun e [i], ceea ce în limba engleză este asta mi-a dat? 240 00:14:01,240 --> 00:14:04,550 Ce nu s [i] reprezintă, în acest caz? Da. 241 00:14:04,550 --> 00:14:07,800 >> [Elev] i-lea caracter din șirul. Exact >>. Caracterul i-lea în șir. 242 00:14:07,800 --> 00:14:12,260 Acum, i este de gând să înceapă de la 0 ca pe meu pentru bucla aici, 243 00:14:12,260 --> 00:14:14,850 dar asta e bine pentru că totul începe numărătoarea de la 0. 244 00:14:14,850 --> 00:14:19,160 Deci, s [0] este de gând să reprezinte litera H într-un cuvânt cum ar fi HELLO, 245 00:14:19,160 --> 00:14:24,530 s [1] este de gând să reprezinte o scrisoare ca e intr-un cuvant ca HELLO, și așa mai departe. 246 00:14:24,530 --> 00:14:27,130 Și ceea ce am par să se descurce pe fiecare iterație a buclei acest 247 00:14:27,130 --> 00:14:32,780 este stocarea temporar personajul-lea intr-o variabila numita C, care este doar un char, 248 00:14:32,780 --> 00:14:35,010 și apoi vom imprimarea c 249 00:14:35,010 --> 00:14:37,620 astfel încât, la sfârșitul zilei, ceea ce face acest program este următoarea. 250 00:14:37,620 --> 00:14:42,900 Dacă mă duc în directorul sursă și fac șir1 și am merge mai departe și a alerga șir1, 251 00:14:42,900 --> 00:14:51,920 si apoi am tastați un cuvânt ca HELLO, Enter, tot ce face este tipărarea acest personaj 1 la un moment dat. 252 00:14:51,920 --> 00:14:54,010 >> Deci, există o oportunitate pentru rafinament aici. 253 00:14:54,010 --> 00:14:58,150 Sunt un fel de a face mai mult de lucru, chiar dacă e mai clar, poate în acest fel, decât este necesar. 254 00:14:58,150 --> 00:15:03,270 Care linie de cod aici pot arunca departe, probabil, cu totul? Da. 255 00:15:03,270 --> 00:15:08,290 Linia 24. În linia 24 am de declarare a unei variabile c. 256 00:15:08,290 --> 00:15:14,320 Mă stocarea caracterul lea de s în ea, dar atunci eu sunt, folosind c aici. 257 00:15:14,320 --> 00:15:20,160 Deci, eu sunt, folosind C, deci mă simt ca și cum eu nu pot arunca doar linia 24 distanță. 258 00:15:20,160 --> 00:15:23,850 [Comentariu elev nu pot fi auzite] >> Exact. 259 00:15:23,850 --> 00:15:26,240 Deci, atunci când vine vorba de a vorbi despre proiectarea de programe, 260 00:15:26,240 --> 00:15:30,740 observați această simplificare ușoară a codului, care este la fel de ușor de citit, 261 00:15:30,740 --> 00:15:34,680 dar seama că e este doar o variabilă, tipul de date este o matrice, 262 00:15:34,680 --> 00:15:38,610 astfel încât s [i] este doar de gând să se întoarcă imediat la tine personajul-lea în șir. 263 00:15:38,610 --> 00:15:40,620 Și dacă doriți să-l imprimați, e în regulă. 264 00:15:40,620 --> 00:15:43,680 Trebuie doar să utilizați c%, deoarece nu ești imprimarea unui șir, 265 00:15:43,680 --> 00:15:48,520 te imprimarea unui caracter într-un șir, iar acest lucru are un efect prea de imprimare caracter lea. 266 00:15:48,520 --> 00:15:51,390 Si amintesc într-adevăr singura diferență de săptămâna trecută, cu ajutorul printf 267 00:15:51,390 --> 00:15:54,220 este faptul că în timp ce în ultimele săptămâni ne-ar face ceva super-simplu 268 00:15:54,220 --> 00:15:58,510 ca substituent% s, apoi numele unui șir aici, 269 00:15:58,510 --> 00:16:01,190 acum suntem într-un pic de scufundări adânc sub capota și spune, 270 00:16:01,190 --> 00:16:06,090 nu se imprimă șirul; imprima un singur caracter acestea. 271 00:16:06,090 --> 00:16:10,570 >> Astfel încât să putem face ceva un pic diferit aici, pentru că nu există un alt - nu bug 272 00:16:10,570 --> 00:16:14,090 pentru că acest program este drept, dar eu fac ceva stupid 273 00:16:14,090 --> 00:16:16,810 pe care am menționat pe scurt miercuri. 274 00:16:16,810 --> 00:16:22,680 Dar gândire înapoi, cum ar putea acest design program fi îmbunătățită și mai mult? Da. 275 00:16:22,680 --> 00:16:28,280 [Răspuns studentul nu pot fi auzite] >> Oh, bine. 276 00:16:28,280 --> 00:16:32,120 Deci, reamintim că am introdus o a doua variabilă numită n ultima dată, 277 00:16:32,120 --> 00:16:34,850 care pare a fi noi înșine în contradicție, deoarece obiectivul meu o secundă în urmă 278 00:16:34,850 --> 00:16:37,380 a fost doar pentru a arunca o variabilă ca inutilă, 279 00:16:37,380 --> 00:16:40,700 dar reamintim că miercuri am făcut de fapt acest lucru. 280 00:16:40,700 --> 00:16:46,170 Am schimbat pentru buclă de a avea de fapt o virgulă aici, atunci n = strlen, 281 00:16:46,170 --> 00:16:52,120 si apoi aici am facut i 00:16:57,660 Care este câștigul fundamentală pe care am obținerea, prin schimbarea de initializare mea la această 283 00:16:57,660 --> 00:17:01,590 și starea mea la acest acum? >> [Elevului răspunsul neauzit] >> Exact. 284 00:17:01,590 --> 00:17:06,170 Nu mă amintind strlen din nou și din nou și din nou, deoarece amintesc cum pentru lucrări bucla. 285 00:17:06,170 --> 00:17:08,790 Chiar dacă ei încep să devin mai complicate cu aspect, 286 00:17:08,790 --> 00:17:12,480 Reamintim că lucrul înainte de virgulă prima de inițializare, care se întâmplă o singură dată. 287 00:17:12,480 --> 00:17:14,359 Condiție, însă, este în mijloc, 288 00:17:14,359 --> 00:17:17,710 iar acest lucru se verifică de fiecare dată când trec prin bucla. 289 00:17:17,710 --> 00:17:22,420 >> Deci e un fel de stupid să se cere calculatorul aceeași întrebare din nou și din nou - 290 00:17:22,420 --> 00:17:25,920 Care este durata de salut? Care este durata de salut? Care este lungimea Alo? - 291 00:17:25,920 --> 00:17:29,740 pentru că așa cum vom vedea astăzi și miercuri, aceasta este cu siguranta va avea nevoie de timp, 292 00:17:29,740 --> 00:17:34,320 și nu e o utilizare foarte bună de timp, deoarece pentru a descoperi lungimea unui șir 293 00:17:34,320 --> 00:17:37,030 de fapt, nevoie de un pic de efort. 294 00:17:37,030 --> 00:17:39,760 Nu e instantanee, așa cum este în unele limbi. 295 00:17:39,760 --> 00:17:43,920 Deci, prin schimbarea asta n, prețul Plătesc este ceea ce? 296 00:17:43,920 --> 00:17:45,640 Vedem un compromis aici. 297 00:17:45,640 --> 00:17:49,460 Eu pot economisi timp prin faptul că nu cere aceeași întrebare naibii din nou și din nou, 298 00:17:49,460 --> 00:17:51,740 dar o să mă coste ceva, care este ceea ce? 299 00:17:51,740 --> 00:17:55,050 >> [Elev] Ai pierdut o anumită cantitate de memorie. Exact >>. O să mă coste ceva de memorie. 300 00:17:55,050 --> 00:17:56,670 Deci, în acest caz, ar costa-mi ce? 301 00:17:56,670 --> 00:18:01,530 Alte 32 de biți, deoarece n este doar o int, dupa cum implica int cuvântul aici. 302 00:18:01,530 --> 00:18:03,300 Dar este în regulă? 303 00:18:03,300 --> 00:18:05,800 Sincer, asta e, probabil în regulă pentru că, dacă te gândești la asta, 304 00:18:05,800 --> 00:18:09,030 mai șirul este, mai mult timp am de gând să-și piardă 305 00:18:09,030 --> 00:18:11,920 deoarece strlen urmeaza sa se sunat din nou și din nou și din nou 306 00:18:11,920 --> 00:18:13,520 pentru fiecare iterație a buclei. 307 00:18:13,520 --> 00:18:18,070 Și în aceste zile, Mac-ul meu are 2 giga de RAM, aceste zile 4 gig-uri de memorie RAM, uneori. 308 00:18:18,070 --> 00:18:22,420 Cred că-mi pot permite 4 din aceste octeți pentru a accelera de fapt lucrurile. 309 00:18:22,420 --> 00:18:26,590 Dar acest lucru va fi un compromis și o temă cu adevărat în programare și în informatică 310 00:18:26,590 --> 00:18:28,320 de a nu obține nimic pe gratis. 311 00:18:28,320 --> 00:18:32,880 Dacă doriți pentru a îmbunătăți ceva aici, va trebui să plătească pentru el în altă parte într-un fel. 312 00:18:32,880 --> 00:18:35,880 Spațiu în funcție de timp, în acest caz. 313 00:18:35,880 --> 00:18:40,700 >> Deci, acest lucru a fost tot dus spre ceva criptic de acest fel, 314 00:18:40,700 --> 00:18:44,070 care, după cum probabil ați dat seama până acum, de fapt spune? 315 00:18:44,070 --> 00:18:47,420 [Imperceptibil elev de răspuns] >> Da, așa e, Asigurați-vă că pentru a bea Ovaltine dvs., 316 00:18:47,420 --> 00:18:52,490 de fapt, folosind un algoritm numit ROT13, ROT 1-3, 317 00:18:52,490 --> 00:18:55,500 ceea ce înseamnă doar rotesc toate literele 13 locuri, 318 00:18:55,500 --> 00:18:58,720 ceea ce înseamnă să ia o și apoi adăugați-l la 13 și du-te dot, dot, dot 319 00:18:58,720 --> 00:19:04,640 tot drumul la scrisoarea al 13-lea la distanță, face același lucru pentru B și C și pentru pentru D și așa mai departe. 320 00:19:04,640 --> 00:19:10,850 Și așa, dacă vom converti de fapt asta aici folosind un transfer de 13 de locuri, 321 00:19:10,850 --> 00:19:14,580 ne vom întoarce la ceea ce a avut putin Ralphie, care a fost, Asigurați-vă că pentru a bea Ovaltine dumneavoastră. 322 00:19:14,580 --> 00:19:18,160 Dar acum pentru problema set 2, în ediția de iarnă, cel puțin, 323 00:19:18,160 --> 00:19:21,680 trebuie să fel de face acest lucru singuri enciphering, 324 00:19:21,680 --> 00:19:25,990 și trebuie să ia cumva în această intrare ca și cripta sau decripta. 325 00:19:25,990 --> 00:19:29,850 >> Deci, care dintre aceste fel de fundamentale ne conduce la această oportunitate? 326 00:19:29,850 --> 00:19:32,650 Să aruncăm o privire la acest exemplu treia aici. 327 00:19:32,650 --> 00:19:38,430 În primul rând, se numește ASCII. Ce se referă ASCII înapoi la? 328 00:19:38,430 --> 00:19:40,460 Codul american standard pentru schimbul de informații, 329 00:19:40,460 --> 00:19:43,850 care este o modalitate foarte lung de a spune ce? Ce este ASCII? 330 00:19:43,850 --> 00:19:47,890 [Răspuns studentul nu pot fi auzite] >> Ce e asta? >> [Elev] O hartă caracter. Un personaj >> hartă. 331 00:19:47,890 --> 00:19:51,390 Se mapează doar numere la litere, deoarece lumea are standardizat 332 00:19:51,390 --> 00:19:55,380 ce numere vor reprezenta ceea ce scrisori, astfel încât fiecare dintre noi poate utiliza calculatoare 333 00:19:55,380 --> 00:19:59,340 și toate programele noastre sunt compatibile doar atunci când vine vorba de imprimarea lucruri pe ecran. 334 00:19:59,340 --> 00:20:04,680 Deci, amintim că 65 se întâmplă să reprezinte A, 97 se întâmplă pentru a reprezenta litere mici o. 335 00:20:04,680 --> 00:20:08,510 Și astfel, acest program simplu aici ASCII este să profite de acest fapt - 336 00:20:08,510 --> 00:20:12,770 că lumea știe că capitalul A este de 65 - și este doar tipărirea de cartografiere. 337 00:20:12,770 --> 00:20:16,320 >> Deci, înainte de a ne scufunda in acest cod, lasă-mă să deschid în schimb o fereastră terminal. 338 00:20:16,320 --> 00:20:21,550 Lasă-mă să mergeți mai departe și să facă ASCII, iar apoi să rulați acest lucru doar pentru a strica ieșire. 339 00:20:21,550 --> 00:20:25,960 Și o face doar acest lucru: o diagramă într-adevăr mare, care tocmai mi-a spus toate codurile diferitelor 340 00:20:25,960 --> 00:20:27,950 pentru toate literele diferite. 341 00:20:27,950 --> 00:20:32,100 Deci, un program de super-simplu, dar nu am avut la codul greu acele 52 de linii de producție: 342 00:20:32,100 --> 00:20:34,860 26 litere mari, 26 mici. 343 00:20:34,860 --> 00:20:37,790 În schimb, am făcut acest lucru în mod programatic, cu o pereche de bucle. 344 00:20:37,790 --> 00:20:39,720 Observați ceea ce am făcut aici. 345 00:20:39,720 --> 00:20:44,790 Am reiterat din i este de 65 până la 65 la + 26, deoarece am vrut să imprime 26 de litere 346 00:20:44,790 --> 00:20:49,860 în alfabetul englez, i + + pe fiecare iterație, iar acum observați acest lucru din nou. 347 00:20:49,860 --> 00:20:52,540 E reapariția typecasting prietenul nostru 348 00:20:52,540 --> 00:20:54,620 prin conversia 1 tip de date la altul 349 00:20:54,620 --> 00:20:57,480 pentru că ceea ce vreau să fac în acest program special? 350 00:20:57,480 --> 00:21:02,650 Vreau să conta numeric pentru că modul în care am crescut numărare - 65, 66, 67, și așa mai departe - 351 00:21:02,650 --> 00:21:04,420 dar nu vreau să imprimați doar numere. 352 00:21:04,420 --> 00:21:08,030 Vreau să imprimați urmată de numărul. 353 00:21:08,030 --> 00:21:18,640 Vreau să imprimați A: număr, B: numărul, dar pot face acest lucru cu exact aceeași variabilă. 354 00:21:18,640 --> 00:21:21,630 Asa ca am imprima c% ca un substituent pentru un caracter, 355 00:21:21,630 --> 00:21:25,080 D% ca un substituent pentru o cifră sau un număr. 356 00:21:25,080 --> 00:21:27,750 Atunci ce am conectați în substituenți pentru cele 2? 357 00:21:27,750 --> 00:21:33,960 Am conectați mai întâi în echivalent caracterul I, iar apoi am imprima i în sine. 358 00:21:33,960 --> 00:21:36,400 >> Deci observați acest prea pur și simplu funcționează. 359 00:21:36,400 --> 00:21:39,320 Așa cum pot arunca dintr-un float la un int 360 00:21:39,320 --> 00:21:41,750 în scopul de a trece de la un număr real la un întreg, 361 00:21:41,750 --> 00:21:46,100 aici pot merge de la o int la un char, care este un pic ciudat - 362 00:21:46,100 --> 00:21:48,680 nu destul pe harta lumii reale -, dar în computere 363 00:21:48,680 --> 00:21:51,140 un char este doar un număr de sub capota, 364 00:21:51,140 --> 00:21:53,590 așa că ești vreodată atât de explicită aici pentru a calculatorului, spunând, 365 00:21:53,590 --> 00:21:58,920 printf, imprimați să nu i afară la fel de 65 de ani, imprimați-l ca echivalentul său numeric. 366 00:21:58,920 --> 00:22:02,110 Și se pare că am punct de vedere tehnic, nu au nevoie de nici asta. 367 00:22:02,110 --> 00:22:05,020 Ceea ce am făcut a fost un moment în urmă este în mod explicit de turnare 368 00:22:05,020 --> 00:22:08,760 prin specificarea ce tip de date vreau să merg la și la. 369 00:22:08,760 --> 00:22:11,840 Dar observați că am deja c% substituent 370 00:22:11,840 --> 00:22:14,930 și acest alt substituent% c aici. 371 00:22:14,930 --> 00:22:18,880 Chiar dacă acest lucru nu este int, calculatorul își dă seama că un char, 372 00:22:18,880 --> 00:22:21,080 e doar o int sub capota. 373 00:22:21,080 --> 00:22:25,100 >> Deci, dacă am recompilați de fapt acest lucru și rulați din nou programul de ASCII, 374 00:22:25,100 --> 00:22:31,210 observați încă funcționează doar pentru că își dă seama că computerul nu există această corespondență. 375 00:22:31,210 --> 00:22:34,870 Acum, e mai important să faci turnare explicită în lumea de flotoare la Ints 376 00:22:34,870 --> 00:22:37,460 pentru că nu faci de fapt, o decizie calculată: 377 00:22:37,460 --> 00:22:40,140 arunca totul după punctul zecimal. 378 00:22:40,140 --> 00:22:44,990 Aici nu e nimic pentru a arunca departe, deoarece un personaj este doar un număr, 379 00:22:44,990 --> 00:22:48,220 și un șir este doar o matrice de caractere. 380 00:22:48,220 --> 00:22:52,530 Deci, atunci când vine vorba de timp pentru punerea în aplicare unele criptare sau decriptare, 381 00:22:52,530 --> 00:22:56,770 cum se face că putem traduce de fapt, ceva de genul asta nonsens sa, 382 00:22:56,770 --> 00:22:58,670 Asigurați-vă că pentru a bea Ovaltine dvs.? 383 00:22:58,670 --> 00:23:02,700 Ce se întâmplă dacă știm acum - să ia ca ipoteza - care cheia, 384 00:23:02,700 --> 00:23:08,010 numărul care suntem rotație toate aceste scrisori către, este numarul 13? 385 00:23:08,010 --> 00:23:11,800 Așa că am trecut de la litera B tot drumul la O la începutul teză, 386 00:23:11,800 --> 00:23:14,710 Asigurați-vă că pentru a bea Ovaltine dumneavoastră, pentru că dacă fac B 387 00:23:14,710 --> 00:23:19,600 și apoi mă duc C, D, E, F, G, H, I, J, K, L, M, N, O, 388 00:23:19,600 --> 00:23:23,760 de aceea criptarea litera B devine O 389 00:23:23,760 --> 00:23:26,570 pentru ca am adaugat doar 13 la acesta. 390 00:23:26,570 --> 00:23:33,460 >> Deci, dacă vreau să decripta acest lucru, am în esență, trebuie să ia O, apoi scade 13 din el. 391 00:23:33,460 --> 00:23:36,880 Sau, sincer, pentru că nu e 26 de litere din alfabet, acest lucru este minunat simetrică, 392 00:23:36,880 --> 00:23:41,260 putem, de asemenea, adăuga doar 13, iar noi vom reveni la scrisoarea B. 393 00:23:41,260 --> 00:23:44,290 Dar cum te duci despre punerea în aplicare a așa ceva în Caesar 394 00:23:44,290 --> 00:23:46,600 sau manipularea într-adevăr siruri de caractere, în general? 395 00:23:46,600 --> 00:23:51,380 Dacă litera B este ceea ce număr? 396 00:23:51,380 --> 00:23:55,290 Care este litera B? Deci e 66, nu? 397 00:23:55,290 --> 00:23:59,220 Deci, dacă litera A este de 65 și litera B este 66, 398 00:23:59,220 --> 00:24:03,940 deci 66, tot ce trebuie să faceți este să adăugați 13 la ea, iar acest lucru îmi dă 79. 399 00:24:03,940 --> 00:24:09,150 Și dacă mergem la foaia noastră ieftin mica, într-adevăr, 79 hărțile pe O. 400 00:24:09,150 --> 00:24:11,290 >> Dar există un pic de un caz colț aici. 401 00:24:11,290 --> 00:24:15,170 Ce este, să spunem, litera Z? 402 00:24:15,170 --> 00:24:20,180 Dacă facem 66 + 25 pentru a obține toate mod de a sfârșitul alfabetului, suntem la 91. 403 00:24:20,180 --> 00:24:24,520 91 + 13 îmi dă 104, și ghici ce? 404 00:24:24,520 --> 00:24:29,200 104 nu este egal cu o majusculă. 405 00:24:29,200 --> 00:24:31,610 Să ne întoarcem la o foaie de ieftin pic aici. 406 00:24:31,610 --> 00:24:38,070 Dacă aș rulați din nou acest program în aparat, observați că 104, în cazul în care mă întorc la fereastră terminal, 407 00:24:38,070 --> 00:24:41,800 104 este, aparent h. litere mici. 408 00:24:41,800 --> 00:24:46,400 Deci, avem nevoie de un truc cheia aici, în scopul de a se asigura că, atunci când vom începe de la Z 409 00:24:46,400 --> 00:24:50,260 și vom adăuga la 13 la acesta nu dorim să păstrați doar forjare înainte la numere mai mari și mai mare. 410 00:24:50,260 --> 00:24:52,600 Ce vrem cu adevărat să fac? 411 00:24:52,600 --> 00:24:54,570 Vrei să-și încheie în jurul valorii de. 412 00:24:54,570 --> 00:25:00,250 >> Deci, se dovedește, după cum ați văzut, probabil, în secțiunea acum sau în problema spec. set de sine 413 00:25:00,250 --> 00:25:05,730 a dat seama că nu există acest alt operator din C care, de asemenea este un semn la sută, 414 00:25:05,730 --> 00:25:11,020 dar întrucât am folosit aici pentru a specifica% un substituent, 415 00:25:11,020 --> 00:25:15,420 știu că, în special pentru set de probleme 2, există, de asemenea, ceva de genul asta: 416 00:25:15,420 --> 00:25:18,990 int x = y% z. 417 00:25:18,990 --> 00:25:22,770 Permiteți-mi să prezint doar acest lucru ca pe o formă foarte generic de acest lucru. 418 00:25:22,770 --> 00:25:25,580 La sută înseamnă ceea ce într-un limbaj de programare? >> [Elev] Modulo. 419 00:25:25,580 --> 00:25:28,790 Modulo, care este un mod fantezist de a spune restul. 420 00:25:28,790 --> 00:25:31,620 Chiar dacă există o distincție ușoară cu definiția acolo, 421 00:25:31,620 --> 00:25:37,210 aceasta înseamnă diviza y cu z, dar nu se mai întorc rezultatul acestei diviziuni; 422 00:25:37,210 --> 00:25:39,650 în schimb, întoarce restul. 423 00:25:39,650 --> 00:25:47,390 >> Deci, în cazul în care y este, de fapt 3 și z este de fapt 2, 3 împărțit la 2 este 1, cu un rest de 1, 424 00:25:47,390 --> 00:25:51,550 Deci, ce face de fapt, x egal în acest scenariu? 1. 425 00:25:51,550 --> 00:25:54,540 Aceasta este o astfel de simplu, low-level idee. 426 00:25:54,540 --> 00:25:56,480 Este nevoie de un pic de timp pentru a obține mintea ta înfășurat în jurul valorii de ea 427 00:25:56,480 --> 00:25:58,740 pentru că a fost, probabil, un timp de când a trebuit chiar sa-i pese resturilor 428 00:25:58,740 --> 00:26:01,160 și de a folosi de fapt le pentru ceva scop, 429 00:26:01,160 --> 00:26:05,290 dar, în acest caz, simplul fapt că puteți trece de la un număr mare ca 3 430 00:26:05,290 --> 00:26:08,920 la un număr relativ mic ca 2 și apoi înfășurați în jurul valorii de eficient 431 00:26:08,920 --> 00:26:14,160 prin utilizarea restul la o valoare mai mică ca 1 se întâmplă să fie un truc de neprețuit 432 00:26:14,160 --> 00:26:17,690 pe care le poate folosi atat pentru ceva de genul asta si Cezar Vigenere alt lucru 433 00:26:17,690 --> 00:26:22,240 în problema set 2, dar acest lucru va fi un truc recurente de-a lungul semestrului. 434 00:26:22,240 --> 00:26:24,880 Această idee simplă, simplă de a lua doar restul, în general, 435 00:26:24,880 --> 00:26:26,530 este de gând să ne permită să-și încheie în jurul valorii de. 436 00:26:26,530 --> 00:26:31,140 Și, după cum vom începe să joci mai mult, cu tablouri, așa cum am începe să joci mai mult cu memoria singura, 437 00:26:31,140 --> 00:26:35,800 acest lucru se întâmplă pentru a deveni mai mult și mai mult de un truc puternic. 438 00:26:35,800 --> 00:26:43,420 >> Deci orice întrebări apoi pe ASCII sau reprezentarea de siruri de caractere ca matrice? 439 00:26:43,420 --> 00:26:47,430 Și ne vom ocupa în continuare un notch. Da. 440 00:26:47,430 --> 00:26:52,350 [Întrebare elev nu pot fi auzite] >> Bună întrebare. 441 00:26:52,350 --> 00:26:55,370 Ce înseamnă atunci când o variabilă are un asterisc în fața lui? 442 00:26:55,370 --> 00:26:57,720 Permiteți-mi să amâne răspunde că, în orice detaliu, 443 00:26:57,720 --> 00:27:00,100 dar care se referă la un subiect cunoscut ca un pointer. 444 00:27:00,100 --> 00:27:03,440 Indicii au de a face cu memorie, iar noi suntem de fapt, astăzi 445 00:27:03,440 --> 00:27:06,330 luând primul pas spre această discuție, 446 00:27:06,330 --> 00:27:08,600 dar pentru acum, permiteți-mi să pretind că steaua nu există 447 00:27:08,600 --> 00:27:15,380 și vom continua asteptare șiruri siruri de caractere în loc de a folosi char *, 448 00:27:15,380 --> 00:27:19,530 care le-ați văzut, probabil, înainte și voi pune pe ecran în doar o clipă ca un teaser. 449 00:27:19,530 --> 00:27:23,010 Deci, ne vom întoarce la faptul că, în mod detaliat mai mult decat multi dintre voi va dori, probabil,. 450 00:27:23,010 --> 00:27:25,760 În cele din urmă, nu azi. Da. 451 00:27:25,760 --> 00:27:42,810 >> [Întrebare elev neauzit] 452 00:27:42,810 --> 00:27:47,080 În ce context ai să furnizeze semnul pentru un caracter? >> [Elev] Da. 453 00:27:47,080 --> 00:27:52,130 Deci în mod implicit, atunci când nu pune un +, la doar numerele pozitive se presupune. 454 00:27:52,130 --> 00:27:55,390 Deci, dacă scrieți doar numărul 1, e un pozitiv 1. 455 00:27:55,390 --> 00:27:57,710 Dacă chiar vrei să specificați o valoare de negare, 456 00:27:57,710 --> 00:28:01,060 ai literalmente trebuie să faci -1 pe tastatură. 457 00:28:01,060 --> 00:28:20,440 Dar acest lucru probabil că nu este întrebarea dvs.. >> [Elevului răspunsul neauzit] 458 00:28:20,440 --> 00:28:22,200 >> Bună întrebare. Bine. 459 00:28:22,200 --> 00:28:24,970 Deci, acest lucru are de a face, am aduna, cu un fel de bug-ai fugit în 460 00:28:24,970 --> 00:28:27,640 pentru că ai fost un întreg conversia la un caracter, 461 00:28:27,640 --> 00:28:29,780 dar cumva negativitate-au implicat, 462 00:28:29,780 --> 00:28:32,380 și astfel caracterul tocmai a ieșit munged cumva. 463 00:28:32,380 --> 00:28:36,710 Deci, pentru moment, permiteți-mi să simplifica un pic până când ne vom întoarce la acest tip de subiect. 464 00:28:36,710 --> 00:28:39,570 Pentru moment, cred că de lucruri în acest fel - și aceasta este o simplificare. 465 00:28:39,570 --> 00:28:43,500 Dar în lumea de un număr întreg, aveți câți biți la dispozitia dumneavoastra? 466 00:28:43,500 --> 00:28:45,190 Ai 32 de biți. 467 00:28:45,190 --> 00:28:49,030 Și până în prezent, am vorbit despre numărul total de numere intregi puteți reprezenta, prin urmare, 468 00:28:49,030 --> 00:28:52,430 este de aproximativ 4 miliarde de euro în total, deoarece aveți 32 de biți, 469 00:28:52,430 --> 00:28:55,100 asa ca asta e 2 la 32, așa că e de aproximativ 4 miliarde de euro. 470 00:28:55,100 --> 00:28:58,810 Dar am vazut o săptămână sau 2 în urmă că nu aveți cu adevărat o serie de numere 471 00:28:58,810 --> 00:29:01,240 de la 0 la până la 4 miliarde de euro. 472 00:29:01,240 --> 00:29:06,340 Gama de schimb trece de la aproximativ 2 miliarde negativ pozitivă 2 miliarde de euro. 473 00:29:06,340 --> 00:29:10,990 Dar acest lucru ridică întrebarea, atunci, cum Reprezentati noțiunea de negativ 2 miliarde 474 00:29:10,990 --> 00:29:13,260 să nu mai vorbim negativ 1? 475 00:29:13,260 --> 00:29:17,960 Pentru moment, putem simplifica și spun doar că am de gând să utilizeze bit din stânga 476 00:29:17,960 --> 00:29:22,380 din cele 32 de biți, și, dacă este un 1 este un număr negativ, 477 00:29:22,380 --> 00:29:25,090 și dacă e un 0 este un număr pozitiv. 478 00:29:25,090 --> 00:29:28,570 Problema cu această reprezentare simplificată a numere negative 479 00:29:28,570 --> 00:29:33,700 este că, dacă ați fost în mod deliberat a fi inteligent și de încercarea de a converti de la un personaj la un număr 480 00:29:33,700 --> 00:29:37,190 sau invers, nu există nici un astfel de lucru ca un personaj negativ. 481 00:29:37,190 --> 00:29:42,550 În lumea de ASCII, care folosește numai 8 biți, toate cele 8 din cele materiei biți, 482 00:29:42,550 --> 00:29:46,810 și biți stânga nu are nimic de-a face cu negativitate. 483 00:29:46,810 --> 00:29:49,670 Și doar pentru a fi clar, când spun biți stînga, 484 00:29:49,670 --> 00:29:54,610 amintesc că, atunci când am făcut noastre de biți legate de exemple în prima săptămână 485 00:29:54,610 --> 00:30:02,570 amintesc că am atras lucruri de genul 1001101, ceva de genul asta. 486 00:30:02,570 --> 00:30:07,210 Când spun biți stânga, eu doar spun literalmente 1 pe care le scrie tot drumul pe la stânga. 487 00:30:07,210 --> 00:30:11,910 Deci, în lumea de caractere nu exista notiunea de negativitate, 488 00:30:11,910 --> 00:30:16,360 astfel încât bit din stânga are de fapt ceva de-a face cu ASCII, nimic de-a face cu negativitate. 489 00:30:16,360 --> 00:30:19,390 >> Deci, se pare ca - si din context, este greu să răspundă exact - 490 00:30:19,390 --> 00:30:25,840 dar într-un fel, codul a fost confuz că pic din stânga ca reprezentând o valoare negativă 491 00:30:25,840 --> 00:30:29,160 atunci când într-adevăr a fost o parte a caracterului în cauză. 492 00:30:29,160 --> 00:30:32,250 Și din nou, eu sunt a simplifica deoarece computerele face de fapt, ceva un pic crescator 493 00:30:32,250 --> 00:30:37,080 decât schimbând doar faptul că pic stânga la un 1 pentru un semn negativ față de un 0. 494 00:30:37,080 --> 00:30:41,270 Ei în schimb, dacă ești curios în Google, de obicei folosesc ceva numit complement lui 2, 495 00:30:41,270 --> 00:30:43,830 care este un pic mai sofisticat de o abordare 496 00:30:43,830 --> 00:30:45,490 dar ideea este în cele din urmă aceeași. 497 00:30:45,490 --> 00:30:50,530 >> Deci, pe scurt, a avut de a face cu faptul că ai fost un număr de masaj la un caracter 498 00:30:50,530 --> 00:30:53,750 sau invers, dar codul dvs. nu a fost conștientă de faptul 499 00:30:53,750 --> 00:30:56,510 că 1 din aceste biți a avut o semnificație în lume numerică. 500 00:30:56,510 --> 00:30:59,940 Asta nu e cazul, în lume caracter. 501 00:30:59,940 --> 00:31:04,270 Dar se pare ca ai reparat, caz în care Moot acum. Alte întrebări. 502 00:31:06,030 --> 00:31:07,110 Bine. 503 00:31:07,110 --> 00:31:11,560 Deci pana acum, toate programele pe care le-am scris au luat de intrare poate de utilizator 504 00:31:11,560 --> 00:31:14,330 sub formă de funcții cum ar fi GetInt, getString, 505 00:31:14,330 --> 00:31:16,990 sau dacă ați fost citit înainte, în diferite cărți sau referințe on-line, 506 00:31:16,990 --> 00:31:21,390 voi înșivă ar fi putut folosi functii cum ar fi scanf care, sincer, pe care le folosim în bibliotecă CS50. 507 00:31:21,390 --> 00:31:25,370 Dar, într-o săptămână sau 2, vă vom arăta cum de fapt, vă biblioteca CS50 este pus în aplicare 508 00:31:25,370 --> 00:31:27,890 astfel încât să putem lua aceste roți de formare oprit cu totul. 509 00:31:27,890 --> 00:31:31,340 >> Dar se pare că există o altă modalitate de a obține informații de la un utilizator. 510 00:31:31,340 --> 00:31:34,670 De fapt, ne-am fost folosind argumente în linia de comandă 511 00:31:34,670 --> 00:31:36,500 pentru câteva săptămâni acum. 512 00:31:36,500 --> 00:31:41,150 De fiecare dată când ne-am alerga zăngănit sau am să rulați make, 513 00:31:41,150 --> 00:31:45,050 nu am tastat doar zăngănit, Enter, nu am tastat face, Enter. 514 00:31:45,050 --> 00:31:49,340 Ce am de obicei, scrise după cuvântul zăngănit de la noi ferestre de terminal prompte? 515 00:31:51,110 --> 00:31:52,900 [Elev] nume de fișier. >> Nume de fișier, nu? 516 00:31:52,900 --> 00:31:57,560 Hello.c sau mario.c sau orice nume de fișier relevant este. 517 00:31:57,560 --> 00:32:01,910 Și în acest sens, ceea ce ai făcut cu adevărat este ce ați influențat comportamentul zăngănit 518 00:32:01,910 --> 00:32:05,750 deoarece cu siguranță, oamenii care au scris zăngănit nu a avut nici o idee pe care ai cam vechi 519 00:32:05,750 --> 00:32:08,890 a fost de gând să scrie un program numit ani mai târziu mario.c. 520 00:32:08,890 --> 00:32:13,150 Deci, ai avut de a influența într-un fel comportamentul acestui program, 521 00:32:13,150 --> 00:32:18,140 și că programul a avut zăngănit să fie scrise în așa fel încât să poată accepta introducerea de la tine 522 00:32:18,140 --> 00:32:23,480 prin adăugarea de cuvinte pe Anunță înainte de a hit-uri de utilizator Enter. 523 00:32:23,480 --> 00:32:27,860 >> Deci, se dovedește că de ceva timp am fost declararea aproape toate programele noastre 524 00:32:27,860 --> 00:32:32,840 pentru a începe așa - int main (void) - si apoi ne-am dus mai departe 525 00:32:32,840 --> 00:32:35,110 și a început să scrie codul nostru. 526 00:32:35,110 --> 00:32:37,910 Și am putea avea unele ascuțite include în partea de sus a fișierului, 527 00:32:37,910 --> 00:32:40,660 dar aproape toate programele noastre de pana acum au început cu această 528 00:32:40,660 --> 00:32:44,200 chiar dacă este posibil să fi văzut în secțiune, în cărți, referințe on-line 529 00:32:44,200 --> 00:32:46,570 că acest lucru nu are, de fapt, trebuie să fie anulate. 530 00:32:46,570 --> 00:32:55,820 O altă formă legitimă pentru ca aceasta să ia este int argc și argv apoi șirul []. 531 00:32:55,820 --> 00:32:57,500 Deci, acum ce este aceasta implică? 532 00:32:57,500 --> 00:33:01,320 Se pare că argc, ceea ce este o convenție umană - ai putea numi asta foo, 533 00:33:01,320 --> 00:33:03,710 dar ar fi doar o mult mai puțin clar pentru cititori - 534 00:33:03,710 --> 00:33:09,330 argc doar este un argument pentru funcția numit principal care reprezintă ceea ce? 535 00:33:09,330 --> 00:33:12,450 Ce înseamnă argc stea pentru cei familiarizați? 536 00:33:12,450 --> 00:33:14,980 >> [Răspuns studentul nu pot fi auzite] >> Da, numărul de argumente sau de numărul de argument. 537 00:33:14,980 --> 00:33:16,510 Este la fel de simplu ca asta. 538 00:33:16,510 --> 00:33:19,160 Câte argumente au fost transmise la acest program? 539 00:33:19,160 --> 00:33:20,630 Ce înseamnă asta? 540 00:33:20,630 --> 00:33:27,090 În cazul în care linia de comanda am alerga ceva de genul asta - zăngănit mario.c-- 541 00:33:27,090 --> 00:33:35,440 argc când am lovit Enter este de gând să ia pe o valoare a, oarecum confuz, 2. 542 00:33:35,440 --> 00:33:40,150 Deci, se dovedește că argc este numărul de argument, 543 00:33:40,150 --> 00:33:46,280 dar, din motive istorice, numele programului în sine este inclus în numărul. 544 00:33:46,280 --> 00:33:51,950 Deci, argc este 2, atunci când am scris zăngănit mario.c. 545 00:33:51,950 --> 00:33:54,290 Ce înseamnă argv conține? 546 00:33:54,290 --> 00:33:57,020 Mai întâi de toate, argv arata ca un șir, dar nu destul de 547 00:33:57,020 --> 00:33:59,310 deoarece, de miercurea trecută și toate mai mult astăzi, 548 00:33:59,310 --> 00:34:02,890 aceste paranteze pătrate denotă ce? Asta e un tablou. 549 00:34:02,890 --> 00:34:07,110 Nu e nici un număr în matrice, și că ar trebui să facă sens intuitiv 550 00:34:07,110 --> 00:34:10,790 pentru că oamenii care au scris ani în urmă zăngănit avut, cu siguranță nici o idee 551 00:34:10,790 --> 00:34:16,300 cât de mulți oameni cuvinte ca noi să tastați la prompt înainte de a lovi Enter. 552 00:34:16,300 --> 00:34:22,280 >> Deci, în acest caz, aici, ei au declarat ca funcția principală a lua o serie de argumente, 553 00:34:22,280 --> 00:34:24,590 0 sau mai multe argumente. 554 00:34:24,590 --> 00:34:26,460 Ei nu știu în avans cât de multe sunt, 555 00:34:26,460 --> 00:34:29,690 deci nu este în mod deliberat nici în interiorul unora dintre aceste paranteze pătrate. 556 00:34:29,690 --> 00:34:32,750 Dar faptul că parantezele pătrate sunt acolo se spune calculatorul, 557 00:34:32,750 --> 00:34:34,639 aștepta la o matrice. 558 00:34:34,639 --> 00:34:37,489 Argv este doar notația prescurtată pentru vectorul argument. 559 00:34:37,489 --> 00:34:39,889 Un vector este un mod fantezist de a spune matrice, 560 00:34:39,889 --> 00:34:42,980 și matrice este un mod fantezist de a spune o listă sau colecție. 561 00:34:42,980 --> 00:34:47,360 Deci, aceasta înseamnă doar că, dacă scrii principal ca această 562 00:34:47,360 --> 00:34:51,100 în loc de ca modul în care ne-am făcut-o pentru ultimele două săptămâni, 563 00:34:51,100 --> 00:34:54,699 programul are acum puterea de a accepta argumentele liniei de comandă 564 00:34:54,699 --> 00:34:58,520 astfel încât să nu mai aveți pentru a scrie Mario și a lovit apoi Enter, 565 00:34:58,520 --> 00:35:01,610 apoi tastați într-un număr de cât de multe blocuri de mare vrei să fie piramida, 566 00:35:01,610 --> 00:35:03,100 apoi a lovit din nou Enter. 567 00:35:03,100 --> 00:35:07,720 Nu avem nevoie chiar de a utiliza mai getString sau GetInt sau GetFloat pentru care contează. 568 00:35:07,720 --> 00:35:12,370 Ne putem aștepta doar utilizatorul să tastați aceste cuvinte de la promptul de sine 569 00:35:12,370 --> 00:35:16,850 la fel ca autorii zăngănit decis că ar fi un program de foarte enervant 570 00:35:16,850 --> 00:35:20,550 în cazul în care pentru a compila codul tastat tu primul zăngănit, apăsați Enter, 571 00:35:20,550 --> 00:35:24,090 apoi ne-am spus de utilizator, vă rugăm să tastați numele fișierului pe care doriți să compilați, 572 00:35:24,090 --> 00:35:26,920 apoi am tastați în mario.c și apăsați Enter. 573 00:35:26,920 --> 00:35:29,850 Dar asta este exact ceea ce am făcut pentru utilizatorii noștri ultimele două săptămâni. 574 00:35:29,850 --> 00:35:33,550 Noi folosim getString și așteptăm până când programul se execută pentru a le solicita pentru intrare. 575 00:35:33,550 --> 00:35:36,710 Că nu mai are nevoie să fie cazul. 576 00:35:36,710 --> 00:35:41,160 >> Deci, în acest exemplu aici, acum avem șir argv, 577 00:35:41,160 --> 00:35:43,390 și acest lucru este de asemenea o simplificare, 578 00:35:43,390 --> 00:35:45,610 roți de formare, care va veni foarte curând off. 579 00:35:45,610 --> 00:35:50,860 Acest lucru este mult mai buna de a scrie această declarație alternativ de principal 580 00:35:50,860 --> 00:35:54,740 deoarece se pare că ceea ce ține de asteptare string are de fapt o stea, 581 00:35:54,740 --> 00:35:58,440 un asterisc, în definiția sa reală, dar aceasta doar pare complicat, 582 00:35:58,440 --> 00:36:02,600 e confuz la început, așa că am simplifica prin crearea doar un sinonim de felul 583 00:36:02,600 --> 00:36:09,340 în biblioteca CS50 că hărțile char * la acest șir de cuvânt mult mai user-friendly. 584 00:36:09,340 --> 00:36:13,180 >> Așa că hai să încercăm de fapt acest lucru, atunci. Lasă-mă să mergeți mai departe și să se deschidă gedit aici. 585 00:36:13,180 --> 00:36:17,010 Lasă-mă să mergeți mai departe și să deschidă argv de 1. 586 00:36:17,010 --> 00:36:21,620 Acest program afiseaza aparent argumentele, dar în termeni de engleză, 587 00:36:21,620 --> 00:36:26,290 de se uită la acest cod, ceea ce înseamnă acest fac mai precis? 588 00:36:26,290 --> 00:36:35,910 Dacă aș tip în a.out comanda foo bar, ceea ce se tipărit în fereastra mea alb-negru? 589 00:36:35,910 --> 00:36:41,260 A.out foo bar, Enter. 590 00:36:43,120 --> 00:36:48,300 Dă-i drumul. Da. >> [Elevului răspunsul neauzit] 591 00:36:48,300 --> 00:36:52,730 Bine. Deci a.out, noua linie, foo, noua linie, bar, noua linie. 592 00:36:52,730 --> 00:36:54,980 De ce este acest lucru? Putem confirma cu siguranță, în doar o clipă. 593 00:36:54,980 --> 00:36:56,940 Aceasta este un fel de linie de cod pufos. 594 00:36:56,940 --> 00:36:59,560  Se imprimă doar o nouă linie doar pentru a face lucrurile mai frumos pe ecran. 595 00:36:59,560 --> 00:37:03,730 Aceasta este o buclă care este iterarea de la 0 la pana la argc, 596 00:37:03,730 --> 00:37:07,210 și acest lucru este incrementarea pe fiecare iterație + +. 597 00:37:07,210 --> 00:37:12,270 Deci, acest lucru este acum spune imprima un șir, așa cum se sugerează prin această% s. 598 00:37:12,270 --> 00:37:16,460 Argv [i] este destul de mult aceeași idee de la exemplul anterior. 599 00:37:16,460 --> 00:37:19,580 Am folosit pentru a apela variabila, acum se numește, în mod arbitrar, argv. 600 00:37:19,580 --> 00:37:24,270 Acest lucru înseamnă imprima argumentul-lea, care a fost introdus la linia de comandă, 601 00:37:24,270 --> 00:37:28,690 și apoi, după toată chestia asta se face, doar pentru o bună măsură tipări o altă linie nouă. 602 00:37:28,690 --> 00:37:31,600 >> Deci, haideți să vedem asta. Lasă-mă să deschid fereastra terminalului. 603 00:37:31,600 --> 00:37:37,470 Lasă-mă să compileze argv de 1, iar acum lasă-mă să ruleze argv de 1, Enter. Hmm. Bine. 604 00:37:37,470 --> 00:37:40,850 Să fugi foo bar. Interesant. Baz. 605 00:37:40,850 --> 00:37:42,640 Și dacă v-ați întrebat vreodată de ce tip I acest lucru, 606 00:37:42,640 --> 00:37:45,010 aceasta este doar o prostie, de asemenea, stiinta convenție calculator. 607 00:37:45,010 --> 00:37:48,050 Lumea are nevoie de multe ori doar substituenți verbale de cuvinte. 608 00:37:48,050 --> 00:37:50,090 Deci, dacă vrei să vorbim despre unele șir generic, 609 00:37:50,090 --> 00:37:53,250 oamenii de stiinta de calculator doar tind să spun foo atunci când au nevoie de un cuvânt aleator, 610 00:37:53,250 --> 00:37:55,530 atunci ei spun bar dacă au nevoie de un al doilea cuvânt aleator, 611 00:37:55,530 --> 00:37:59,100 atunci ei spun Baz, dacă au nevoie de un al treilea cuvânt, atunci ei spun qux dacă au nevoie de un cuvânt al patrulea, 612 00:37:59,100 --> 00:38:01,520 și apoi există o mare dezbatere on-line religioase cu privire la ceea ce vine după qux, 613 00:38:01,520 --> 00:38:04,940 astfel încât să puteți Google, care să dau seama ce alt cuvânt arbitrar ar trebui să fie. 614 00:38:04,940 --> 00:38:07,480 Dar acestea nu au nici un fel de sens, 615 00:38:07,480 --> 00:38:10,100 deși foo bar, dacă Google, care, ca nu s-au înțeles, 616 00:38:10,100 --> 00:38:12,780 care face parte din etimologia aici. 617 00:38:12,780 --> 00:38:17,550 >> Deci, tot acest este de a face, atunci se imprimă 1 din aceste siruri de caractere pe linie. 618 00:38:17,550 --> 00:38:19,900 Deci, dacă am loc, deși, a vrut pentru a obține un pic crescator, 619 00:38:19,900 --> 00:38:22,550 Presupun că nu am vrut să imprimați fiecare sir pe linie; 620 00:38:22,550 --> 00:38:26,220 Am vrut să imprimați fiecare personaj din fiecare sir pe linie. 621 00:38:26,220 --> 00:38:28,550 Cum aș putea să fac asta în loc? 622 00:38:28,550 --> 00:38:33,720 Ce am nevoie pentru a schimba despre acest program, dacă vreau să imprimați nu fiecare cuvânt 623 00:38:33,720 --> 00:38:37,290 dar vreau să imprimați fiecare literă cuvânt printr-o scrisoare prin scrisoarea, 624 00:38:37,290 --> 00:38:40,590 apoi scrisoarea următorul cuvânt printr-o scrisoare prin scrisoarea? 625 00:38:40,590 --> 00:38:43,650 Cum putem combina aceste idei până acum? Da. 626 00:38:43,650 --> 00:38:47,390 [Elev]% c. >> Regulă. Deci, avem nevoie de un loc de c%. 627 00:38:47,390 --> 00:38:50,680 Bine, pentru că nu vreau să imprimați siruri intregi, vreau să imprimați caractere. Ce altceva? 628 00:38:50,680 --> 00:38:54,290 >> [Răspuns studentul nu pot fi auzite] >> interesante. 629 00:38:54,290 --> 00:38:56,860 Deci, avem nevoie de un fel de a doua dimensiune aici, acum 630 00:38:56,860 --> 00:39:02,300 deoarece cred că din argv ca o matrice, dar este o matrice de siruri de caractere. 631 00:39:02,300 --> 00:39:07,170 Dar, ca de, ca, 15 minute în urmă, ceea ce e un șir? E un tablou de caractere. 632 00:39:07,170 --> 00:39:12,320 Deci într-adevăr, argv este un tablou de o serie de personaje, 633 00:39:12,320 --> 00:39:14,870 o serie de tablouri de caractere. 634 00:39:14,870 --> 00:39:19,170 Deci, se dovedește că putem folosi notatiile doar mai placuta pătrați. Deci, hai sa facem asta. 635 00:39:19,170 --> 00:39:23,650 În partea de sus a acestui bucla pe linia 19, am de gând să itera de la I până la argc, 636 00:39:23,650 --> 00:39:25,760 dar apoi am de gând să fac asta: 637 00:39:25,760 --> 00:39:27,580 pentru - Eu nu pot folosi acum. 638 00:39:27,580 --> 00:39:30,300 Am nevoie de o altă variabilă pentru că vreau să itera peste cuvintele 639 00:39:30,300 --> 00:39:32,640 dar apoi, de asemenea, de-a lungul litere din cuvintele 640 00:39:32,640 --> 00:39:37,280 așa că am avea un fel de o axă verticală și o axă orizontală, un fel de punct de vedere conceptual. 641 00:39:37,280 --> 00:39:43,930 Deci, j int devine 0, atunci vreau să fac j, atâta timp cât j este mai mică de - și voi curăța asta într-un pic. 642 00:39:43,930 --> 00:39:48,410 Cum pot itera peste literele dintr-un șir? Am făcut acest lucru acum un moment. 643 00:39:48,410 --> 00:39:54,670 Strlen de argv [i]. Bine. 644 00:39:54,670 --> 00:39:57,860 Și din nou, eu fac un pic de aici, ineficiența prin a nu crea n sau orice altceva, 645 00:39:57,860 --> 00:39:59,610 dar ne vom reveni la asta. 646 00:39:59,610 --> 00:40:03,270 >> Deci, acum, j + +. Acum trebuie să liniuță în continuare aici. 647 00:40:03,270 --> 00:40:06,950 Ce-mi doresc acum să imprimați pe fiecare iterație? 648 00:40:06,950 --> 00:40:09,720 [Răspuns studentul nu pot fi auzite] >> Deci [i] va da-mi cuvântul. 649 00:40:09,720 --> 00:40:12,910 [I] [j], ca un fel de matrice. 650 00:40:12,910 --> 00:40:14,810 Aceia dintre voi cu matematica-y medii, 651 00:40:14,810 --> 00:40:19,340 suntem un fel de indexare, chiar mai adanc in aceasta matrice sau această matrice de matrice, 652 00:40:19,340 --> 00:40:21,380 această structură 2-dimensionale. 653 00:40:21,380 --> 00:40:25,070 Deci, acum să vedem ce se întâmplă aici. Lasă-mă să deschid fereastra mea borna mai mare. 654 00:40:25,070 --> 00:40:28,170 Lasă-mă să rulați din nou face din argv de 1. 655 00:40:28,170 --> 00:40:33,090 Și am dat-on bară aici, care este o lecție bună pentru că am prea uitat să fac asta. 656 00:40:33,090 --> 00:40:37,150 Declarând implicit "strlen" C funcția de bibliotecă cu nesemnat de tip "- 657 00:40:37,150 --> 00:40:40,360 Nu știu nici măcar ce înseamnă asta restul, dar am văzut acest lucru înainte, 658 00:40:40,360 --> 00:40:42,000 implicit de declarare. 659 00:40:42,000 --> 00:40:45,540 Ori de câte ori vom vedea această eroare, ceea ce înseamnă acest lucru, de obicei,? 660 00:40:45,540 --> 00:40:48,520 >> [Răspuns studentul nu pot fi auzite] >> Am uitat-o ​​bibliotecă până sus. Dar stai un minut. 661 00:40:48,520 --> 00:40:51,690 De obicei, am dat-on bară pentru că am uitat biblioteca CS50, dar asta e acolo. 662 00:40:51,690 --> 00:40:54,480 De obicei, am dat-on bară pentru că am uitat de iarnă I / O. 663 00:40:54,480 --> 00:40:57,960 Și sincer, nu am nevoie de nici asta. Noi nu utilizați getString astăzi. 664 00:40:57,960 --> 00:40:59,900 Deci, ce sunt eu lipsesc? 665 00:40:59,900 --> 00:41:04,860 Există o altă bibliotecă că acum avem nevoie pentru a utiliza string.h ocazional numit, 666 00:41:04,860 --> 00:41:08,980 și acesta este doar încă o altă bibliotecă care are mai multe funcții care nu sunt în standard I / O. 667 00:41:08,980 --> 00:41:11,640 >> Așa că hai să ne întoarcem la fereastra mea terminalul mare. 668 00:41:11,640 --> 00:41:16,670 Bine. Acum, la naiba, cred că m-am înșelat. Am fost folosind biblioteca CS50. 669 00:41:16,670 --> 00:41:18,460 Astfel încât să putem rezolva această problemă în oricare dintre cele 2 moduri. 670 00:41:18,460 --> 00:41:21,510 Ne putem lua de pe roțile de formare acum și face doar asta, 671 00:41:21,510 --> 00:41:26,600 sau un fel de hai sa ține de faptul că simplificarea doar pentru acum, inserați acest înapoi în, 672 00:41:26,600 --> 00:41:30,180 rezolva această problemă, și acum du-te înapoi la fereastra terminal. 673 00:41:30,180 --> 00:41:33,080 Deci, să fie clar, în biblioteca CS50 nu este doar funcții, 674 00:41:33,080 --> 00:41:36,920 este, de asemenea, șirul de cuvinte cheie, care este motivul pentru care eroarea sa întâmplat. 675 00:41:36,920 --> 00:41:43,010 >> Deci, aici vom merge. Am fixat atât a problemelor de bibliotecă. Enter. Bine. 676 00:41:43,010 --> 00:41:49,250 Argv de 1, foo bar, Enter. Excelent. 677 00:41:49,250 --> 00:41:52,830 Deci, acum avem fiecare literă a fiecărui cuvânt imprimate 1 pe linie, 678 00:41:52,830 --> 00:41:55,290 care nu face pentru un program foarte interesant, 679 00:41:55,290 --> 00:41:59,350 Notă dar acum avem capacitatea de a nu numai iterarea peste cuvinte 680 00:41:59,350 --> 00:42:04,090 dar, de asemenea, mai mult de scrisori individuale în cuvinte, care sună teribil de familiare 681 00:42:04,090 --> 00:42:10,330 chiar și cea mai simplă de aplicații cum ar fi scrisori se inghesuie intr-un sir de genul asta. 682 00:42:10,330 --> 00:42:12,410 Să mergem mai departe și să ia nostru de 5 minute de pauză aici. 683 00:42:12,410 --> 00:42:14,410 Și când ne vom întoarce, vom începe să vorbim despre eficiența 684 00:42:14,410 --> 00:42:17,670 cu care putem face aceste lucruri mai bine. 685 00:42:19,370 --> 00:42:21,900 >> Bine. Ne-am întors. 686 00:42:21,900 --> 00:42:26,970 Datorită unul din TFS noștri, care joacă o mulțime de bananagrams, 687 00:42:26,970 --> 00:42:30,000 avem de fapt o gramada de caractere cu noi aici, astăzi 688 00:42:30,000 --> 00:42:32,520 fizic incarnat cu aceste piese mici de plastic, 689 00:42:32,520 --> 00:42:36,910 și lasă-mă să propun ca această tabula rasa albă reprezintă aici, în memoria RAM computerul meu - 690 00:42:36,910 --> 00:42:39,790 laptop, desktop, indiferent de - și există arata ca o mulțime de ea 691 00:42:39,790 --> 00:42:44,090 pentru că, dacă vom începe tăierea up această memorie RAM in mici bucati de marimea octet, 692 00:42:44,090 --> 00:42:48,970 sa zicem ca ceva arbitrar că dimensiunea și că reprezintă neclare - 693 00:42:48,970 --> 00:42:52,430 acolo mergem, și hai să micșora un pic aici - 694 00:42:52,430 --> 00:42:56,120 să spunem ceva care dimensiunea reprezintă un singur octet. 695 00:42:56,120 --> 00:43:00,400 Deci, putem potrivi într-adevăr, o grămadă de octeți sau caractere din interiorul acestei memorii, 696 00:43:00,400 --> 00:43:02,860 astfel cum a sugerat de mărimea relativă aici. 697 00:43:02,860 --> 00:43:06,780 >> Deci, să presupunem acum că obiectivul este de a aloca memorie pentru un sir. 698 00:43:06,780 --> 00:43:08,680 Cum functioneaza acest fapt? 699 00:43:08,680 --> 00:43:11,380 În programele care le-am fost scris, am fost de obicei folosind getString, 700 00:43:11,380 --> 00:43:16,300 dar acum, în mod clar, e un alt canal prin care putem ajunge introduse de utilizator în argv 701 00:43:16,300 --> 00:43:18,190 prin argumente de linie de comandă. 702 00:43:18,190 --> 00:43:20,580 Dar ce se întâmplă cu adevărat pe sub capota? 703 00:43:20,580 --> 00:43:24,920 Se pare că, dacă noi numim - să derulați înapoi la getString - getString funcția de 704 00:43:24,920 --> 00:43:28,190 în bibliotecă CS50, utilizatorului i se solicită pentru un șir, 705 00:43:28,190 --> 00:43:30,780 tipurile de utilizatori, în unele cuvântul - să-l numim HELLO. 706 00:43:30,780 --> 00:43:35,410 Și noi am spus pentru ultimele două săptămâni că valoarea de returnare a getString 707 00:43:35,410 --> 00:43:37,750 este de fapt un șir, cum ar fi cuvântul HELLO. 708 00:43:37,750 --> 00:43:39,660 >> Dar ceea ce este cu adevărat getString face? 709 00:43:39,660 --> 00:43:45,230 Pe măsură ce utilizatorul tastează în HELLO, Enter, getString este imaginind, 710 00:43:45,230 --> 00:43:47,930 ok, cate caractere este asta? Aceasta este H-E-L-L-O. 711 00:43:47,930 --> 00:43:52,500 Așa că trebuie să aloce, acesta trebuie să solicite sistemul de operare - Linux, în acest caz - 712 00:43:52,500 --> 00:43:55,410 pentru cel puțin 5 octeți pentru a stoca HELLO. 713 00:43:55,410 --> 00:43:59,570 Și ce se continuă apoi să facă după ce se întoarce de la cele 5 octeți sistemul de operare 714 00:43:59,570 --> 00:44:04,120 este de a stabili în HELLO spate în spate la spate în spate. 715 00:44:04,120 --> 00:44:11,070 Și deci ce este într-adevăr sa întors de la getString este o bucată de date care arata ca acest lucru. 716 00:44:11,070 --> 00:44:16,850 Dar acest lucru este un pic inexacte, deoarece se pare că nu e la fel de simplu 717 00:44:16,850 --> 00:44:20,310 doar ca stocarea HELLO în memoria calculatorului 718 00:44:20,310 --> 00:44:24,140 deoarece presupunem că programul meu pe care am scris în C, apoi solicită getString din nou, 719 00:44:24,140 --> 00:44:28,210 și cuvântul următor utilizatorul este tipurile din Bye, bye. 720 00:44:28,210 --> 00:44:31,300 Ei bine, am nevoie de asta pentru a se potrivi BYE cuvânt undeva în memorie. 721 00:44:31,300 --> 00:44:33,790 Eu nu pot rescrie HELLO. 722 00:44:33,790 --> 00:44:37,320 De exemplu, nu vreau calculator pentru a începe doar suprascrierea ca acest 723 00:44:37,320 --> 00:44:41,400 Cuvântul original, pentru că s-ar putea fi utilizați în continuare cuvântul HELLO într-o variabilă 724 00:44:41,400 --> 00:44:43,070 în altă parte în programul meu. 725 00:44:43,070 --> 00:44:45,900 >> Deci, B-Y-E are pentru a ajunge undeva în memorie. 726 00:44:45,900 --> 00:44:50,460 Dar convenția de obicei, este faptul că șirul viitoare când vă aloce 727 00:44:50,460 --> 00:44:54,940 Probabil, dar nu întotdeauna, se va ajunge la următoarea locație de memorie disponibilă. 728 00:44:54,940 --> 00:44:57,370 Și dacă nu am cerut sistemul de operare pentru orice memorie 729 00:44:57,370 --> 00:45:01,380 deoarece ultima dată când am sunat getString, șansele sunt BYE cuvântul 730 00:45:01,380 --> 00:45:05,790 se va termina imediat după cuvântul HELLO în memorie. 731 00:45:05,790 --> 00:45:10,550 Dar, în acest moment, puteți vedea, probabil, în cazul în care apare o problemă potențială. 732 00:45:10,550 --> 00:45:13,310 Deoarece bucăți de memorie, pentru următoarele octeți următoarele care au fost doar liber - 733 00:45:13,310 --> 00:45:18,230 curățați ardezie alb - în memoria calculatorului au fost chiar lângă HELLO, 734 00:45:18,230 --> 00:45:23,670 se simte ca primul șir am cerut brusc s-ar putea schimba acum 735 00:45:23,670 --> 00:45:26,410 în esență, pentru că am schimbat-o HELLOBYE 736 00:45:26,410 --> 00:45:31,310 în loc de demarcing cumva începutul Q și sfârșitul HELLO. 737 00:45:31,310 --> 00:45:33,920 >> Deci, se dovedește că ceea ce se întâmplă cu adevărat sub capota, 738 00:45:33,920 --> 00:45:37,570 care s-ar putea fi întrezărită în referințele on-line sau secțiune sau cărți 739 00:45:37,570 --> 00:45:41,780 sau nu la toate încă este că nu există de fapt, o demarcare deliberată 740 00:45:41,780 --> 00:45:45,890 între cuvintele din memoria unui computer. 741 00:45:45,890 --> 00:45:52,480 Și, de fapt, în acest caz aici, mai degrabă decât a pus doar BYE chiar lângă HELLO, 742 00:45:52,480 --> 00:45:58,610 în schimb, calculatorul pune un caracter special, caracterul special nul, ca să spunem așa, 743 00:45:58,610 --> 00:46:03,050 care este reprezentată cu un marker cu backslash 0. 744 00:46:03,050 --> 00:46:06,700 Deci, pe scurt, se amintească faptul că personajele sunt reprezentate în ASCII. 745 00:46:06,700 --> 00:46:09,680 ASCII este doar o mapare între numere și litere, 746 00:46:09,680 --> 00:46:13,870 și cele mai multe dintre aceste scrisori începe aproximativ 65 pentru capitalul A, 747 00:46:13,870 --> 00:46:19,780 dar se pare că puteți reprezenta cu siguranță 0 număr ca un întreg sau în binar, 748 00:46:19,780 --> 00:46:22,690 și se pare că lumea a decis de mult, mult timp în urmă, "Știi ce?" 749 00:46:22,690 --> 00:46:27,550 "Să rezervelor de 0 număr ca nu reprezinta niciun caracter pe tastatură - 750 00:46:27,550 --> 00:46:30,810 "Nici litere, nici cifre, semne de punctuație nu. 0 este specială." 751 00:46:30,810 --> 00:46:35,830 "Va fi caracterul special nul, și noi o să-l scriu ca \ 0." 752 00:46:35,830 --> 00:46:41,170 Diferența fiind daca am scris doar 0, 0 este un personaj. 753 00:46:41,170 --> 00:46:45,700 Amintiți-vă că există coduri ASCII pentru 0, pentru 1, pentru 2, pentru 3 754 00:46:45,700 --> 00:46:50,570 deoarece 0 caractere este diferită de 0 număr. 755 00:46:50,570 --> 00:46:54,270 Și puteți vedea că, dacă te uiți înapoi de la saptamana 1 atunci când am vorbit prima data despre ASCII, 756 00:46:54,270 --> 00:46:59,130 0 și 1 și 2 și 3 tot drumul până la 9 au avut propriile coduri ASCII. 757 00:46:59,130 --> 00:47:02,300 Ele nu sunt, coincidență, 0 la 9. Sunt foarte diferite. 758 00:47:02,300 --> 00:47:08,770 Astfel încât cifra 0 înseamnă doar "Eu sunt speciale", iar \ 0 înseamnă, literal, "Eu nu sunt un caracter 0." 759 00:47:08,770 --> 00:47:11,360 "Sunt această valoare deosebită, caracterul nul." 760 00:47:11,360 --> 00:47:16,930 Așa că am nevoie de un alt fapt, una dintre acestea, deoarece eu nu pot face aceeași greșeală de două ori. 761 00:47:16,930 --> 00:47:21,550 >> Deci, după cuvântul BYE ne, de asemenea, de gând să nevoie de un alt unul dintre aceste personaje nule. 762 00:47:21,550 --> 00:47:27,090 Lasă-mă să iau stiloul meu de aici și lasă-mă să elaboreze rapid un alt \ 0 763 00:47:27,090 --> 00:47:30,480 astfel că după ce am cerut sistemul de operare pentru 2 siruri de caractere 764 00:47:30,480 --> 00:47:33,270 prin getString urmat de un alt apel la getString, 765 00:47:33,270 --> 00:47:35,640 acest lucru este ceea ce este, de fapt în memorie. 766 00:47:35,640 --> 00:47:39,900 Așa că atunci când mă întorc un șir de caractere, eu sunt foarte obtinerea înapoi că, 767 00:47:39,900 --> 00:47:43,450 si cand ma șirul următor, eu sunt foarte obtinerea înapoi asta. 768 00:47:43,450 --> 00:47:47,910 Deci, această întrebare ridică, strlen, în primul rând, ceea ce ar trebui să se întoarcă? 769 00:47:47,910 --> 00:47:54,650 Când m-am apel strlen pe e coarde și S a fost cuvântul HELLO că utilizatorul tastat, 770 00:47:54,650 --> 00:47:57,800 ceea ce am spus în mod evident durata HELLO a fost acum câteva minute? 771 00:47:57,800 --> 00:48:01,290 Acesta a fost de 5, nu? H-E-L-L-O. Și asta e într-adevăr, cum strlen lucrări. 772 00:48:01,290 --> 00:48:05,670 Returnează ceea ce o ființă umană normală s-ar aștepta lungimea unui sir de a fi. 773 00:48:05,670 --> 00:48:11,030 Dar, în realitate, cât de mare este matrice de caractere pe care se stochează salut? 774 00:48:11,030 --> 00:48:12,770 Este de fapt 6. 775 00:48:12,770 --> 00:48:15,740 Deci, strlen nu menționează acest fapt pentru tine. 776 00:48:15,740 --> 00:48:20,300 Dar sub capota computerul este într-adevăr, folosind 6 bytes pentru a stoca un cuvânt 5-scrisoare, 777 00:48:20,300 --> 00:48:22,380 și acest lucru este adevărat, indiferent de cât de mult timp este cuvântul. 778 00:48:22,380 --> 00:48:26,470 Există întotdeauna o să fie un caracter nul specială care se termină la sfârșitul șirului 779 00:48:26,470 --> 00:48:28,800 la demarc lungimea sa totala. 780 00:48:28,800 --> 00:48:33,430 >> Deci, dacă sunteți în prezent persoana de punere în aplicare strlen 20, acum 30 de ani, 781 00:48:33,430 --> 00:48:35,520 cum te duci despre punerea în aplicare a strlen în sine? 782 00:48:35,520 --> 00:48:39,980 Ne ia acordat pentru că există, la fel cum am lua de bun faptul că există printf, 783 00:48:39,980 --> 00:48:42,850 dar dacă HELLO este cuvântul în discuție 784 00:48:42,850 --> 00:48:45,220 și ceea ce am în memorie este ceva care arata ca acest lucru, 785 00:48:45,220 --> 00:48:48,130 în cazul în care a trebuit să reimplement strlen pentru că li sa cerut să 786 00:48:48,130 --> 00:48:50,260 sau pentru că, sincer, nu știai strlen exista - 787 00:48:50,260 --> 00:48:54,280 a trebuit să se rostogolească aceasta pe cont propriu - cum ai putut să pună în aplicare strlen 788 00:48:54,280 --> 00:48:57,760 atunci când se administrează ceva care arata ca acest lucru? 789 00:48:57,760 --> 00:49:02,750 Acum, că știm un șir este o matrice, putem itera peste fiecare dintre caracterele individuale 790 00:49:02,750 --> 00:49:06,320 folosind ceva de genul - Să încercăm să facă acest lucru din mers. 791 00:49:06,320 --> 00:49:12,060 >> Lasă-mă să intru în aparat. Lasă-mă să creați un fișier nou, strlen.c. 792 00:49:12,060 --> 00:49:19,260 Lasă-mă să merg mai departe acum și nu includ stdio.h, astfel încât să avem acces la printf. 793 00:49:19,260 --> 00:49:25,820 Lasă-mă să fac int main (void). Oh. Voi face asta pe cont propriu de acum, atunci. [Chicotește] 794 00:49:25,820 --> 00:49:28,300 Mulțumesc. 795 00:49:28,300 --> 00:49:31,000 Aceasta este ceea ce fac. Bine. 796 00:49:31,000 --> 00:49:34,820 Deci, înainte de m-am întors pe ecran, am scris toate astea. 797 00:49:34,820 --> 00:49:37,550 Și acum ce am de gând să faceți este următoarea: 798 00:49:37,550 --> 00:49:40,360 printf ("Dă-mi un șir:") 799 00:49:40,360 --> 00:49:42,700 Asta e doar instrucțiunile pufoase. 800 00:49:42,700 --> 00:49:45,700 Acum, permiteți-mi să fac getString sirul s =. 801 00:49:45,700 --> 00:49:47,260 Am deja nevoie pentru a face o schimbare acum. 802 00:49:47,260 --> 00:49:52,740 Sunt folosind biblioteca CS50 brusc, asa ca lasa-ma sa plec mai departe și tastați în cs50.h. 803 00:49:52,740 --> 00:50:00,720 Și acum să facem acest lucru: printf ("Lungimea este:% d, strlen [s] - 804 00:50:00,720 --> 00:50:03,540 si eu nu am terminat încă. Ce altceva mai trebuie să adaug la acest program? 805 00:50:03,540 --> 00:50:05,740 >> [Elev] string.h. String.h >>. 806 00:50:05,740 --> 00:50:10,800 Deci, pentru moment, suntem folosind strlen, asa ca hai sa asigurați-vă că compilatorul stie unde este, 807 00:50:10,800 --> 00:50:12,390 deci un bun-simț puțin verifica. 808 00:50:12,390 --> 00:50:16,400 Primesc un șir de caractere în linia 8, iar în linia 9 am imprimarea lungimea sa cu d%. 809 00:50:16,400 --> 00:50:19,400 Așa că hai să mergem mai departe și să deschideți asta. 810 00:50:19,400 --> 00:50:23,380 Ne-am face strlen - compilează bine - 811 00:50:23,380 --> 00:50:30,120 strlen - permiteți-mi mări - Intră, H-E-L-L-O, Enter. Lungimea este de 5. 812 00:50:30,120 --> 00:50:32,730 >> Ok, deci strlen pare să funcționeze, dar lumea știa asta. 813 00:50:32,730 --> 00:50:37,310 Deci, haideți să pună în aplicare acum strlen noi înșine, după cum urmează. 814 00:50:37,310 --> 00:50:39,490 Lasă-mă să iau această bibliotecă departe. 815 00:50:39,490 --> 00:50:42,590 Nu mai avem acces la string.h pentru că nu am știut că există. 816 00:50:42,590 --> 00:50:45,970 Dar asta e bine pentru că eu mă pot pune în aplicare strlen 817 00:50:45,970 --> 00:50:50,200 și să-l ia un șir de intrare numit, 818 00:50:50,200 --> 00:50:53,830 și acum am nevoie să dau seama lungimea acest șir. 819 00:50:53,830 --> 00:50:55,880 Deci, cum pot face acest lucru? 820 00:50:55,880 --> 00:51:00,190 Ce se întâmplă dacă fac - să vedem cum se face acest lucru - Ce vrei să faci? 821 00:51:00,190 --> 00:51:04,130 >> [Răspuns studentul nu pot fi auzite] >> Ok. 822 00:51:04,130 --> 00:51:05,970 Astfel încât să putem face acest lucru într-o grămadă de feluri. Lasă-mă să încerc să iau această abordare. 823 00:51:05,970 --> 00:51:10,220 Permiteți-mi să dau eu o variabila int i, asa ca am începe de la 0. 824 00:51:10,220 --> 00:51:19,380 Și permiteți-mi să spun acest lucru: în timp ce de intrare [i] nu este egal cu ce? \ 0. 825 00:51:19,380 --> 00:51:23,480 Deci, se dovedește, ca și în cazul cu toate caractere atunci când le scriu pur și simplu într-un program, 826 00:51:23,480 --> 00:51:25,940 va trebui să utilizați ghilimele simple, ghilimele duble, nu. 827 00:51:25,940 --> 00:51:29,250 Așa că, dacă aș fi scris litera a, mi-ar face asta, litera b, mi-ar face asta. 828 00:51:29,250 --> 00:51:33,440 Acest lucru, în schimb, ar fi un șir de caractere, nu un caracter individual. 829 00:51:33,440 --> 00:51:38,470 >> Deci vreau \ 0 literalmente. Ce vreau să fac în această buclă? 830 00:51:38,470 --> 00:51:42,650 De fapt, am nevoie de o altă variabilă, astfel încât lungimea int devine 0. 831 00:51:42,650 --> 00:51:46,190 Chiar dacă nu a fost sigur de ce am început să am facut felul, 832 00:51:46,190 --> 00:51:50,110 Acum că suntem merge în jos acest drum, ceea ce vreau să fac pe linia 9? 833 00:51:50,110 --> 00:51:55,820 lungime + + și apoi în jos, aici, pe linia 10, lungime retur. 834 00:51:55,820 --> 00:51:58,370 Deci, cum este pusă în aplicare strlen? 835 00:51:58,370 --> 00:52:00,550 Este de fapt pusă în aplicare, probabil ca asta. 836 00:52:00,550 --> 00:52:03,470 Poate că persoana a folosit un pentru buclă, poate o face în timp ce bucla - cine știe? 837 00:52:03,470 --> 00:52:05,940 Ne-ar trebui într-adevăr să se uite sub capota de la codul sursă reală 838 00:52:05,940 --> 00:52:08,520 în unele fișier numit string.c probabil. 839 00:52:08,520 --> 00:52:10,480 >> Dar sa aici ne gândim la ceea ce fac eu. 840 00:52:10,480 --> 00:52:13,640 Sunt de declarare a unei variabile numita i, setarea este egal cu 0. 841 00:52:13,640 --> 00:52:17,520 Sunt declarând apoi un alt lungime variabilă numită, setarea este egal cu 0. 842 00:52:17,520 --> 00:52:25,440 Apoi am să spun în timp ce personajul-lea, în intrare nu este egal cu caracterul nul special, \ 0, 843 00:52:25,440 --> 00:52:27,070 incrementa lungimea. 844 00:52:27,070 --> 00:52:32,550 Dar, de îndată ce personajul-lea este acest caracter special, ce se întâmplă cu bucla? 845 00:52:32,550 --> 00:52:36,540 Acesta scurtcircuitelor. Se oprește, ceea ce înseamnă că apoi va reveni instantaneu lungime. 846 00:52:36,540 --> 00:52:40,740 >> Așa că, dacă nu am în bară, să mergem mai departe și du-te înapoi la fereastra terminalul meu. 847 00:52:40,740 --> 00:52:43,550 Lasă-mă să recompilați. Și eu am în bară. 848 00:52:43,550 --> 00:52:46,320 Redeclararea incompatibile funcției strlen bibliotecă. 849 00:52:46,320 --> 00:52:48,650 Așa că am fost încercarea de a obține prea deștept pentru binele meu aici. 850 00:52:48,650 --> 00:52:51,610 Compilatorul de fapt, știe că există o funcție numită strlen 851 00:52:51,610 --> 00:52:55,290 chiar daca nu am inclus biblioteca. Asta e bine. Oricare ar fi. 852 00:52:55,290 --> 00:52:58,230 Suntem doar de gând să coopereze atunci. Să redenumi această lungime. 853 00:52:58,230 --> 00:53:04,110 Lasă-mă să schimbe utilizarea acestuia la lungime aici, iar acest lucru va face mai fericit zăngănit. 854 00:53:04,110 --> 00:53:08,900 Ca o paranteza, deoarece unele dintre aceste funcții sunt atât de al naibii de comune - 855 00:53:08,900 --> 00:53:12,390 strlen, prinf - au de fapt un fel de statut special. 856 00:53:12,390 --> 00:53:15,310 Și așa zăngănit știe doar ceva special despre ei. 857 00:53:15,310 --> 00:53:18,760 Asta nu e mereu cazul cu cele mai multe funcții, astfel că de aceea ne-am țipat la. 858 00:53:18,760 --> 00:53:21,350 >> Lasă-mă să încerc din nou. Din fericire, aceasta a lucrat acel moment. 859 00:53:21,350 --> 00:53:23,560 Asa ca lasa-ma acum a alerga propria mea strlen programului. 860 00:53:23,560 --> 00:53:29,740 Dă-mi un șir: H-E-L-L-O, Enter. Și am dat-on bară. 861 00:53:29,740 --> 00:53:34,750 De ce? >> [Elevului răspunsul neauzit] >> Exact. 862 00:53:34,750 --> 00:53:39,180 Deci, am eu aici o buclă foarte drăguț infinit 863 00:53:39,180 --> 00:53:42,270 deoarece, chiar dacă eu sunt incrementarea lungime pe fiecare iterație, 864 00:53:42,270 --> 00:53:47,860 ceea ce eu nu fac în mod clar? Eu nu am de incrementare. Bine. Ușor fix. Da? 865 00:53:47,860 --> 00:53:52,430 Bine. Nu Acum ne-ar alerga afoul de o greșeală comună în cazul în care am nevoie de alte paranteze. 866 00:53:52,430 --> 00:53:54,430 Și sincer, acest cod este începe să arate urât, 867 00:53:54,430 --> 00:53:56,460 asa ca vom lua o lovitură de cuțit la curățarea asta într-un moment. 868 00:53:56,460 --> 00:53:58,810 Dar acum eu sunt incrementarea atât lungimea și i. 869 00:53:58,810 --> 00:54:02,630 Sincer, eu văd deja o oportunitate de imbunatatire aici, dar vom reveni la asta. 870 00:54:02,630 --> 00:54:05,270 >> Deci, acum să asigurați-vă doar că suntem cel puțin realizarea de progrese. 871 00:54:05,270 --> 00:54:08,320 Acest lucru sa întâmplat la câteva dintre voi, si am neglijat să menționeze acest lucru în avans. 872 00:54:08,320 --> 00:54:12,420 Când aveți ghinionul de un scenariu ca acesta, cum să remediați această 873 00:54:12,420 --> 00:54:15,130 scurt repornirea aparatului sau calculatorului sau închiderea ferestrei? 874 00:54:15,130 --> 00:54:16,860 Este de fapt usor. 875 00:54:16,860 --> 00:54:21,680 De control C se va trimite acest mic morcov simbolul C, și că se termină doar cele mai multe programe. 876 00:54:21,680 --> 00:54:25,990 Dacă aveți o buclă infinită foarte rău că se imprimă ori chestii infinit de multe, 877 00:54:25,990 --> 00:54:29,960 uneori, este posibil să aveți pentru a lovi de control C o mie de ori pentru a face o aud de fapt. 878 00:54:29,960 --> 00:54:33,910 Deci dau seama doar acum, pentru că nu am nimic de imprimare, care a fost destul de ușor. 879 00:54:33,910 --> 00:54:37,970 Și punct de vedere tehnic, o dată este suficientă, dar nu primesc nerăbdător și l-am lovit, de obicei, este faptul că de multe ori. 880 00:54:37,970 --> 00:54:43,400 >> Deci, strlen. Dă-mi un șir: HELLO. Este de gând să lucreze de data asta? 881 00:54:44,580 --> 00:54:47,490 Bine. O altă greșeală comună. Trebuie să recompilați. 882 00:54:47,490 --> 00:54:50,430 Asta a fost în mod deliberat, ca unul. Bine. 883 00:54:50,430 --> 00:54:54,260 Deci strlen, H-E-L-L-O, Enter. Excelent. 884 00:54:54,260 --> 00:54:55,910 Deci, acum avem o strlen la 5. 885 00:54:55,910 --> 00:54:58,100 Deci, ne-am Reimplementat literalmente că roata. 886 00:54:58,100 --> 00:55:02,080 Deci, acum sa curat asta, deoarece acest lucru nu face m-au impresionat 887 00:55:02,080 --> 00:55:04,080 cu design de codul meu. 888 00:55:04,080 --> 00:55:07,200 Ce putem elimina în mod clar în acest program pentru a curăța asta? 889 00:55:07,200 --> 00:55:11,840 [Răspuns studentul nu pot fi auzite] >> Da. Literalmente, ne trata i și lungimea identic. 890 00:55:11,840 --> 00:55:16,440 Deci, de ce să nu avem doar inteligent și să spună în timp ce lungimea? 891 00:55:16,440 --> 00:55:20,450 Mai degrabă, hai să numim doar lungime pentru a începe cu, inițializați-l la 0 892 00:55:20,450 --> 00:55:23,340 deoarece în mod implicit șirul nu are lungime până când ne dăm seama ce este. 893 00:55:23,340 --> 00:55:26,160 >> Acum, facem acest lucru, iar acum acesta este un program de destul de elegant. 894 00:55:26,160 --> 00:55:28,660 O variabilă. L-am curatat, l înăsprit. 895 00:55:28,660 --> 00:55:31,980 Deci, acum să ne întoarcem la fereastra terminalul meu. Să mergem mai departe și să rulați acest lucru. 896 00:55:31,980 --> 00:55:35,670 Make strlen. Arata bine. Rulați din nou strlen, Enter. 897 00:55:35,670 --> 00:55:40,680 Dă-mi un șir: HELLO, Enter. Și se pare a fi de lucru ca 5. 898 00:55:40,680 --> 00:55:45,580 Acum, să fie clar, dacă n-aș fi scris, de exemplu, Buna, ziua în 1 sir 899 00:55:45,580 --> 00:55:48,840 și apoi într-un alt BYE, putem avea cu siguranță mai multe cuvinte. 900 00:55:48,840 --> 00:55:53,150 Dacă expresia fapt, am vrut sa tip nu a fost HELLO, ci, de exemplu, 901 00:55:53,150 --> 00:55:58,920 Bună ziua lume, observați că ceea ce noi nu ar avea această situație este aici, nu? 902 00:55:58,920 --> 00:56:00,580 Aceasta ar sugera că e 2 siruri de caractere. 903 00:56:00,580 --> 00:56:06,060 Aveți cu siguranță poate avea caractere bara de spațiu, așa că, dacă am tastat de fapt, într-o frază mai lungă 904 00:56:06,060 --> 00:56:08,390 ca lumea HELLO, ceea ce ne-ar fi cu adevărat în memorie 905 00:56:08,390 --> 00:56:12,730 arata ceva de genul asta acolo. 906 00:56:12,730 --> 00:56:18,910 >> Bine. Orice întrebări, apoi despre reprezentarea aici de siruri de caractere? 907 00:56:18,910 --> 00:56:20,450 Nu? Bine. 908 00:56:20,450 --> 00:56:25,130 Așa că am spus mai devreme ca de asteptare strlen nou și din nou în mod deliberat de genul asta 909 00:56:25,130 --> 00:56:28,070 probabil, nu este cea mai bună idee pentru că ai de gând să faci o mulțime de muncă 910 00:56:28,070 --> 00:56:30,280 din nou și din nou și din nou. 911 00:56:30,280 --> 00:56:36,150 Într-adevăr, ce fel de muncă este necesară pentru imaginind lungimea unui șir, aparent? 912 00:56:36,150 --> 00:56:40,720 Va trebui să înceapă de la început și apoi uite, uite, uite, uite, uite 913 00:56:40,720 --> 00:56:44,930 până când veți vedea în cele din urmă acest caracter special, moment în care, ah, acum știu lungime. 914 00:56:44,930 --> 00:56:48,040 Deci, mai devreme, când ne-am strlen fiind chemat din nou și din nou și din nou, 915 00:56:48,040 --> 00:56:52,080 motivul pentru care am propus ca a fost un fel de prostie este că, din nou, acel șir arată așa. 916 00:56:52,080 --> 00:56:54,880 Aceasta nu se va schimba de fiecare dată când itera prin intermediul unor bucle, 917 00:56:54,880 --> 00:56:56,890 asa faci de lucru inutil. 918 00:56:56,890 --> 00:57:00,620 În același timp, ar trebui să știi, ca o paranteza, ca compilatoare cum ar fi zăngănit în aceste zile 919 00:57:00,620 --> 00:57:02,530 au fost dezvoltate pe parcursul multor ani, 920 00:57:02,530 --> 00:57:05,690 și scriitori de compilare, programatori, sunt destul de inteligente. 921 00:57:05,690 --> 00:57:10,170 Și așa se dovedește că compilatoare zăngănit și alte pot da seama de fapt că, 922 00:57:10,170 --> 00:57:13,650 bine, da, ai scris strlen în starea ta, 923 00:57:13,650 --> 00:57:17,520 ceea ce punct de vedere tehnic înseamnă că ne-ar suna din nou și din nou și din nou. 924 00:57:17,520 --> 00:57:21,880 Dar compilatoare inteligente pot optimiza de fapt, aceste tipuri de decizii proaste de utilizare 925 00:57:21,880 --> 00:57:23,870 din codul pentru a redresa lucrurile. 926 00:57:23,870 --> 00:57:27,360 >> Deci, nu doar dau seama că uneori compilatorul este mai inteligent decât noi 927 00:57:27,360 --> 00:57:29,210 și va ascunde un fel de propriile noastre greșeli. 928 00:57:29,210 --> 00:57:31,620 Dar cu siguranță atunci când vine vorba de seturi de probleme și cum ar fi, 929 00:57:31,620 --> 00:57:35,340 nu se gândesc la aceste decizii de design fundamental eronate 930 00:57:35,340 --> 00:57:38,110 potențial pentru simplul motiv că am face de lucru mult mai 931 00:57:38,110 --> 00:57:41,330 decât avem de fapt de a face. Dar cât de mult mai mult de lucru? 932 00:57:41,330 --> 00:57:44,960 În cazul în Salut lume, să începem să generalizeze dimensiunea acestei probleme. 933 00:57:44,960 --> 00:57:48,100 Care este lungimea problema sau dimensiunea problemei 934 00:57:48,100 --> 00:57:50,770 atunci când utilizatorul cuvântul tastat este HELLO? 935 00:57:50,770 --> 00:57:53,790 E aparent 5, poate 6. Plus sau minus 1. Oricare ar fi. 936 00:57:53,790 --> 00:57:55,680 E atât de aproape vom numi doar 5. 937 00:57:55,680 --> 00:58:00,480 >> Deci, ce e de dimensiunea problemei aici atunci când încearcă să dau seama de lungimea Alo? 938 00:58:00,480 --> 00:58:06,790 E 1, 2, 3, 4, 5, 6 și poate pentru ultimul caracter, dar hai sa generalizeze că, în calitate nr. 939 00:58:06,790 --> 00:58:10,300 Deci n, doar n variabila, este ceea ce oamenii de stiinta de calculator ar folosi de obicei 940 00:58:10,300 --> 00:58:13,890 pentru a descrie dimensiunea unei probleme, iar problema la îndemână este cât timp este HELLO? 941 00:58:13,890 --> 00:58:17,050 Cât timp se strlen ia? 942 00:58:17,050 --> 00:58:21,010 Este nevoie de pe ordinea de pași n, în cazul în care fiecare pas înseamnă gasiti un caracter, 943 00:58:21,010 --> 00:58:23,350 uita-te la un personaj, uita-te la un caracter. 944 00:58:23,350 --> 00:58:26,850 Și am avut această discuție o înapoi în timp, numărul de operațiuni de ceva ia. 945 00:58:26,850 --> 00:58:29,910 Prima zi de clasă ne-am toata lumea sta penibil în sus, 946 00:58:29,910 --> 00:58:32,060 și apoi toată lumea a început asocierea off cu altul 947 00:58:32,060 --> 00:58:35,990 , în scopul de a conta de fapt, în mod ideal, cât de mulți oameni erau în cameră. 948 00:58:35,990 --> 00:58:39,860 Și am făcut, de asemenea, un alt lucru pe care, dacă am făcut-o în locul în drumul spre școală veche 949 00:58:39,860 --> 00:58:44,800 de a începe doar 1, 2, 3, 4, 5, 6 și așa mai departe, 950 00:58:44,800 --> 00:58:49,360 că prea, dimensiunea acestei probleme a fost de dimensiune n. Erau oameni n în cameră. 951 00:58:49,360 --> 00:58:52,010 Dar am putea accelera asta, nu? Stilul de scoala am putea începe numărarea în 2s. 952 00:58:52,010 --> 00:58:55,560 2, 4, 6, 8, 10, 12. Și că se simte atât de mult mai repede, și într-adevăr este. 953 00:58:55,560 --> 00:59:01,720 Este literalmente de două ori la fel de rapid, dar, din nou, în cazul în care alte 400 de persoane a intrat în această cameră 954 00:59:01,720 --> 00:59:08,250 dintr-o dată, aceste algoritmi ar lua inca 400 sau poate 200 de trepte. 955 00:59:08,250 --> 00:59:13,310 >> Dar, prin contrast, în cazul în care vom ajunge cu adevărat inteligent și avem loc toți avem de voi înșivă conta, 956 00:59:13,310 --> 00:59:15,280 amintim modul în care a lucrat algoritm. 957 00:59:15,280 --> 00:59:17,110 Voi toți se ridică. Lasă-mă să fast-forward la acest lucru. 958 00:59:17,110 --> 00:59:20,430 Voi toți s-au ridicat, vă asociat off, apoi jumătate din voi așezat, 959 00:59:20,430 --> 00:59:22,510 jumătate dintre voi se așeză, jumatate din voi se așeză, 960 00:59:22,510 --> 00:59:27,350 și pe fiecare iterație a buclei din aceasta saptamana 0, am redus la jumătate problema de la mână 961 00:59:27,350 --> 00:59:30,040 și a mers la n / 2, atunci n / 4, atunci n / 8. 962 00:59:30,040 --> 00:59:35,350 Și implicarea de care este că, dacă un alt 400 de persoane meargă în camera, nu e mare lucru, 963 00:59:35,350 --> 00:59:40,120 va fi nevoie de noi mai mult runda 1, nu 400 mai multe runde, nu 200 mai multe runde. 964 00:59:40,120 --> 00:59:43,640 Și așa le-am spus povestea-o înapoi în timp ce trebuia să fac ceva cu asta. 965 00:59:43,640 --> 00:59:47,750 Această linie rosie aici este liniar, e drept, și este etichetat ca n 966 00:59:47,750 --> 00:59:50,250 deoarece, dimensiunea unei probleme crește, 967 00:59:50,250 --> 00:59:54,690 dacă algoritmul sau program cu care te rezolvarea este nevoie de măsuri n, 968 00:59:54,690 --> 00:59:58,620 putem trasa o linie dreaptă în cazul în care este nevoie de mai mult timp mai mare dimensiunea problemei. 969 00:59:58,620 --> 01:00:03,280 Și abordarea twosies, numărare 2, 4, 6, 8, încă o linie dreaptă, doar un pic mai bine. 970 01:00:03,280 --> 01:00:08,440 Este nevoie de un pic de timp mai puțin, astfel încât linia galbenă este sub punctul de linia roșie de punct. 971 01:00:08,440 --> 01:00:12,580 >> Dar a fost chiar mai bine acest Graal sfânt de ceea ce am numit timp logaritmică 972 01:00:12,580 --> 01:00:14,830 în cazul în care, chiar dacă din nou vom dubla numarul de persoane in camera, 973 01:00:14,830 --> 01:00:18,240 am dubla dimensiunea pe care cartea de telefon din prima zi de clasă, 974 01:00:18,240 --> 01:00:22,310 nu e mare lucru, este nevoie de o lacrimă pagina mai mult, ia o ședință mai jos 975 01:00:22,310 --> 01:00:25,550 , în scopul de a rezolva o problemă care este de două ori mai mare. 976 01:00:25,550 --> 01:00:27,460 Și astfel ajungem conversație acum pentru a începe având în se 977 01:00:27,460 --> 01:00:30,380 cum putem rezolva problemele de fapt eficient 978 01:00:30,380 --> 01:00:32,510 dacă avem în vedere mai simplă de probleme de acest gen? 979 01:00:32,510 --> 01:00:36,210 Să presupunem că avem 8 în spatele ușilor care sunt unele numere, 980 01:00:36,210 --> 01:00:39,720 și fiecare dintre aceste numere nu sunt sortate în nici un fel, 981 01:00:39,720 --> 01:00:42,830 sunt numere întregi doar aleatorii în spatele acestor uși, 982 01:00:42,830 --> 01:00:47,290 și ne punem întrebarea cum te duci despre găsirea număr - cine știe - 983 01:00:47,290 --> 01:00:50,250 7 spatele acestor uși? 984 01:00:50,250 --> 01:00:53,400 Ce-ai, un om, nu în scopul de a găsi-mi numărul 7 985 01:00:53,400 --> 01:00:56,810 în cazul în care din nou fiecare dintre acestea sunt uși și pentru a vedea o valoare trebuie să vă deschideți o ușă? 986 01:00:56,810 --> 01:00:59,650 Ce-ar fi, probabil, algoritm ta? 987 01:00:59,650 --> 01:01:05,310 >> [Răspuns studentul nu pot fi auzite] >> Deci, începe cu stânga și deschide o ușă, deschide o ușă, deschide o ușă. 988 01:01:05,310 --> 01:01:08,570 Și în cel mai rău caz, cât timp este el de gând să ne ia pentru a găsi numărul 7? 989 01:01:08,570 --> 01:01:12,800 Și din nou, ei nu sunt sortate, deci nu e la fel de ușor ca, ei bine, am de gând să deschidă ușa saptea. 990 01:01:12,800 --> 01:01:15,240 Aceasta ne-ar putea lua, la maximum, 8 trepte. 991 01:01:15,240 --> 01:01:19,940 În cel mai rău caz, 7 este aleator la sfârșitul liniei de uși, 992 01:01:19,940 --> 01:01:22,090 așa că s-ar putea să încerce toate ușile n. 993 01:01:22,090 --> 01:01:24,440 Deci, din nou aici, se pare că avem un algoritm liniar. 994 01:01:24,440 --> 01:01:27,030 De fapt, am făcut acest lucru doar o pereche de ani în urmă. 995 01:01:27,030 --> 01:01:29,910 Unul dintre predecesorii dvs. a fost contestată cu exact acest 996 01:01:29,910 --> 01:01:32,050 în cazul în care nu am avut-o versiune digitală, am avut în schimb o tablă 997 01:01:32,050 --> 01:01:33,780 cu unele bucăți de hârtie pe ea. 998 01:01:33,780 --> 01:01:36,940 Și ce m-am gândit mi-ar face este să ia o privire rapidă înapoi la modul în care acest a fost, 999 01:01:36,940 --> 01:01:40,760 una dintre cele mai bune oportunitati si, probabil, cel mai incomode pe scenă 1000 01:01:40,760 --> 01:01:42,530 pentru a avea o demonstrație chiar aici, pe Sanders. 1001 01:01:42,530 --> 01:01:44,000 Am avut 2 rânduri de numere. 1002 01:01:44,000 --> 01:01:47,280 Suntem doar de gând să se uite la ceea ce se intampla aici cu Sean pentru foarte de sus a acestor rânduri. 1003 01:01:47,280 --> 01:01:49,660 Cu excepția cazului în nimeni vreodată voluntari din CS50, 1004 01:01:49,660 --> 01:01:52,010 am avut binecuvântarea lui Sean a menține acest aparat foto pe, 1005 01:01:52,010 --> 01:01:54,670 așa că știe că sute de oameni au fost uitam asta acum de ani de zile. 1006 01:01:54,670 --> 01:01:59,500 Dar Sean făcut o treabă minunată - sau a făcut el - la găsirea de fapt, ne-un anumit număr?. 1007 01:01:59,500 --> 01:02:04,570 >> Deci, hai sa vedem cum a rezolvat acest algoritm, astfel că vom relua această conversație înainte de mult timp 1008 01:02:04,570 --> 01:02:08,300 de modul în care vom găsi lucruri eficient. 1009 01:02:08,300 --> 01:02:12,300 [Malan pe video] am ascuns în spatele acestor uși numărul 7, 1010 01:02:12,300 --> 01:02:16,710 dar ascuns în unele din aceste uși, precum și alte sunt ne-negative numere, 1011 01:02:16,710 --> 01:02:19,980 și de obiectivul dvs. este de a gândi al acestui rândul de sus de numere ca doar o matrice 1012 01:02:19,980 --> 01:02:22,920 sau doar o secvență de bucăți de hârtie cu numere spatele lor, 1013 01:02:22,920 --> 01:02:26,960 și obiectivul dvs. este, folosind doar matrice de sus aici, găsește-mi numărul 7. 1014 01:02:26,960 --> 01:02:30,800 Și noi sunt apoi de gând să critice modul în care te duci despre a face aceasta. >> Regulă. 1015 01:02:30,800 --> 01:02:33,880 [Malan] Cauta-ne numărul 7, te rog. 1016 01:02:36,210 --> 01:02:38,350 [Râsete] 1017 01:02:41,610 --> 01:02:44,460 [Malan] nr [râsete] 1018 01:02:45,760 --> 01:02:58,080 5, 19, 13, [râsete]. Nu este o întrebare capcană. 1019 01:03:00,560 --> 01:03:02,390 1. 1020 01:03:04,560 --> 01:03:06,910 [Râsete] 1021 01:03:06,910 --> 01:03:10,760 În acest moment scorul dvs. nu este foarte bun, asa ca s-ar putea la fel de bine continui. [Râsete] 1022 01:03:12,490 --> 01:03:14,070 3. 1023 01:03:17,340 --> 01:03:23,480 Du-te. Sincer, eu nu pot ajuta, dar întreb la ce te gândești chiar. [Râsete] 1024 01:03:25,010 --> 01:03:28,870 Doar rândul de sus, așa că am luat 3 stânga. Deci, mă găsești 7. 1025 01:03:28,870 --> 01:03:45,360 [Elevi murmurând] 1026 01:03:46,270 --> 01:03:49,870 [Malan] 17. 1027 01:03:49,870 --> 01:03:55,460 [Elevi murmurând] 1028 01:03:56,920 --> 01:04:01,550 [Malan] 7! [Aplauze] 1029 01:04:01,550 --> 01:04:06,080 >> Deci, miercuri, vom arunca cu capul în acest lucru și algoritmi mai sofisticate pentru a găsi lucruri. 1030 01:04:06,080 --> 01:04:10,200 De acum vom pleca cu Sean și ne vedem miercuri. 1031 01:04:11,280 --> 01:04:13,000 [CS50.TV]