1 00:00:00,000 --> 00:00:11,200 2 00:00:11,200 --> 00:00:12,580 >> DAVID MALAN: Bine, bine ai revenit. 3 00:00:12,580 --> 00:00:13,290 Aceasta este CS50. 4 00:00:13,290 --> 00:00:15,130 Acesta este începutul de săptămâna de șapte. 5 00:00:15,130 --> 00:00:18,890 Asa ca a fost o vreme, așa că am crezut că vom ia un tur vârtej de unde am 6 00:00:18,890 --> 00:00:20,760 rămas și unde vom merge acum. 7 00:00:20,760 --> 00:00:23,310 >> Deci, acest lucru aici ar putea avea a provocat unele Angst, la prima. 8 00:00:23,310 --> 00:00:27,680 Dar sperăm că, începi să aclimatizeze la ceea ce aceasta denotă aici - 9 00:00:27,680 --> 00:00:32,670 stele reprezintă un indicator, care este doar ceea ce, în termeni mai simpli? 10 00:00:32,670 --> 00:00:33,400 Deci, este o adresă. 11 00:00:33,400 --> 00:00:35,490 >> Deci, este adresa de ceva în memorie. 12 00:00:35,490 --> 00:00:38,260 Și am început să coaja înapoi straturile în urmă cu câteva săptămâni, lucrurile place 13 00:00:38,260 --> 00:00:41,800 Getstring și alte astfel de funcții în tot acest timp au fost revenirea 14 00:00:41,800 --> 00:00:46,010 adrese de lucruri în memorie, cum ar fi adresa primului caracter din 15 00:00:46,010 --> 00:00:46,990 unele secvență. 16 00:00:46,990 --> 00:00:50,360 >> Deci, am introdus, de asemenea, Valgrind, care veți începe să utilizați pentru această problemă 17 00:00:50,360 --> 00:00:53,380 stabilit, în special pentru următorul Problema stabilit, de asemenea. 18 00:00:53,380 --> 00:00:54,980 Și Valgrind face ceea ce pentru noi? 19 00:00:54,980 --> 00:00:57,520 20 00:00:57,520 --> 00:01:01,020 Se verifică de pierderi de memorie, și-l de asemenea, controale pentru abuz de memorie. 21 00:01:01,020 --> 00:01:05,890 >> Se poate, cu o anumită probabilitate, a detecta dacă codul se va atinge de memorie 22 00:01:05,890 --> 00:01:07,100 că pur și simplu nu ar trebui. 23 00:01:07,100 --> 00:01:10,410 Deci, nu neapărat o scurgere, dar dacă merge dincolo de limitele unor 24 00:01:10,410 --> 00:01:14,730 matrice, și a alerga de fapt Valgrind și induce acest comportament în timp ce 25 00:01:14,730 --> 00:01:17,870 Valgrind se execută în program este de funcționare în interiorul de ea, veți obține 26 00:01:17,870 --> 00:01:21,460 Mesajele de acest gen - "invalid scrie de Dimensiunea 4, "care, amintesc o pereche de 27 00:01:21,460 --> 00:01:25,880 acum câteva săptămâni a însemnat că am avut accidental ca pe una int prea departe 28 00:01:25,880 --> 00:01:27,250 dincolo de limitele unei matrice. 29 00:01:27,250 --> 00:01:30,790 Și astfel dimensiunea 4 înseamnă aici dimensiunea din care Int special. 30 00:01:30,790 --> 00:01:35,260 >> Astfel încât să ia reasigurării în faptul că ieșire Valgrind, format din ea, 31 00:01:35,260 --> 00:01:36,170 este pur și simplu atroce. 32 00:01:36,170 --> 00:01:40,180 Este foarte greu de a vedea, prin mizerie pentru scurte informatii. 33 00:01:40,180 --> 00:01:42,910 Deci, ceea ce am făcut aici este doar fragment o parte din cuplu de mai 34 00:01:42,910 --> 00:01:43,850 linii interesante. 35 00:01:43,850 --> 00:01:46,760 Dar dau seama că 80% din lui Valgrind ieșire va fi un pic de o 36 00:01:46,760 --> 00:01:47,650 distragere a atenției. 37 00:01:47,650 --> 00:01:52,820 >> Uită-te pentru modele, cum ar fi acestea - invalid dreapta, invalid citit, 40 de bytes 38 00:01:52,820 --> 00:01:56,690 și un număr de blocuri sunt cu siguranta a pierdut, cuvinte cheie, cum ar fi asta. 39 00:01:56,690 --> 00:02:01,920 Și ceea ce veți vedea sperăm este un un fel de urme de ceea ce funcționează 40 00:02:01,920 --> 00:02:03,340 greseala este de fapt inch 41 00:02:03,340 --> 00:02:07,195 În acest caz aici, în ceea ce linie de codul meu a fost eroare aparent? 42 00:02:07,195 --> 00:02:09,729 43 00:02:09,729 --> 00:02:14,130 >> 26 într-un fișier denumit memory.c, care a fost exemplu ne jucam cu 44 00:02:14,130 --> 00:02:14,890 la momentul respectiv. 45 00:02:14,890 --> 00:02:16,460 Deci, nu este, probabil, în malloc. 46 00:02:16,460 --> 00:02:18,630 Acesta a fost, probabil, în codul meu loc. 47 00:02:18,630 --> 00:02:20,910 Deci, vom vedea acest lucru din nou și din nou înainte de lung. 48 00:02:20,910 --> 00:02:24,080 >> Deci scanf, aceasta a venit într-un câteva forme de pana acum. 49 00:02:24,080 --> 00:02:26,410 Am văzut scurt sscanf. 50 00:02:26,410 --> 00:02:28,330 A fost ceva un număr de vă scufundat în în ta 51 00:02:28,330 --> 00:02:29,535 pregătirile pentru test. 52 00:02:29,535 --> 00:02:33,130 Și scanf este de fapt ceea ce CS50 Biblioteca a fost cu sub 53 00:02:33,130 --> 00:02:36,560 capota de ceva timp pentru pentru a obține de intrare de la utilizator. 54 00:02:36,560 --> 00:02:40,420 >> De exemplu, dacă am trece pe la CS50 aparat de aici, lasă-mă să deschid un 55 00:02:40,420 --> 00:02:45,315 exemplu, astăzi, că se numește scanf-0.c Și e foarte simplu. 56 00:02:45,315 --> 00:02:46,590 E doar o câteva linii de cod. 57 00:02:46,590 --> 00:02:50,880 Dar se demonstrează într-adevăr cum getint a fost de lucru tot acest timp. 58 00:02:50,880 --> 00:02:54,710 >> În acest program de aici, în linia 16 , Observați că am declara o Int. 59 00:02:54,710 --> 00:02:57,270 Deci, nici indicii nimic magic, acolo, doar un Int. 60 00:02:57,270 --> 00:03:00,330 Apoi, în linia 17, am solicita utilizator pentru un număr, vă rog. 61 00:03:00,330 --> 00:03:02,930 Apoi, la sfârșitul anului 18, am folosi scanf aici. 62 00:03:02,930 --> 00:03:06,910 Și am precizat, un fel de cum ar fi printf, că mă aștept citat 63 00:03:06,910 --> 00:03:08,110 citatul suta eu. 64 00:03:08,110 --> 00:03:10,920 >> Deci sut i, desigur, denotă o Int. 65 00:03:10,920 --> 00:03:14,580 Dar observați ce a doua Argumentul a scanf este. 66 00:03:14,580 --> 00:03:17,350 Cum ați descrie cea de a doua Argumentul de după virgulă? 67 00:03:17,350 --> 00:03:19,450 Ce este asta? 68 00:03:19,450 --> 00:03:20,670 >> Este adresa de x. 69 00:03:20,670 --> 00:03:25,490 Deci, acest lucru este util, deoarece prin furnizarea scanf cu adresa x, ceea ce face 70 00:03:25,490 --> 00:03:29,560 care permite această funcție pentru a face? 71 00:03:29,560 --> 00:03:33,010 Nu doar du-te acolo, dar, de asemenea, face ce? 72 00:03:33,010 --> 00:03:34,060 >> A face o modificare a acestuia. 73 00:03:34,060 --> 00:03:38,080 Pentru ca poti sa te duci acolo, e un fel de ca o hartă la o locație în memorie. 74 00:03:38,080 --> 00:03:41,900 Și, atâta timp cât vă oferi scanf, sau orice funcție cu o astfel de hartă, care 75 00:03:41,900 --> 00:03:45,840 Funcția poate merge acolo, și nu numai uita-te la valoarea, dar poate, de asemenea, 76 00:03:45,840 --> 00:03:49,670 schimba această valoare, ceea ce este util în cazul scop în viață de scanf este de a 77 00:03:49,670 --> 00:03:53,060 scana de intrare de la utilizator, în mod specific de la tastatură. 78 00:03:53,060 --> 00:03:57,830 Și f denotă formatat, la fel ca printf, f denotă o formatat 79 00:03:57,830 --> 00:03:58,930 șir pe care doriți să imprimați. 80 00:03:58,930 --> 00:04:04,430 >> Deci, pe scurt, acest 18 linii pur și simplu spune, încercați să citiți un int de utilizare 81 00:04:04,430 --> 00:04:10,420 tastatură și păstrați-l în interiorul lui x, la indiferent de adresa x se întâmplă să trăiască. 82 00:04:10,420 --> 00:04:14,860 Și apoi în cele din urmă, linia 19 doar spune, mulțumiri pentru Int, în acest caz. 83 00:04:14,860 --> 00:04:15,940 >> Așa că lasă-mă să merg mai departe și să facă acest lucru. 84 00:04:15,940 --> 00:04:18,570 Deci, asigurați-scanf 0. 85 00:04:18,570 --> 00:04:20,130 Lasă-mă să merg mai departe și zoom inch 86 00:04:20,130 --> 00:04:22,960 Voi merge și a alerga acest lucru cu puncte slash scanf 0. 87 00:04:22,960 --> 00:04:24,020 Număr, vă rog? 88 00:04:24,020 --> 00:04:24,720 50. 89 00:04:24,720 --> 00:04:25,730 Multumesc pentru 50. 90 00:04:25,730 --> 00:04:27,270 Deci, este destul de simplu. 91 00:04:27,270 --> 00:04:28,160 >> Acum, ceea ce este ea nu face? 92 00:04:28,160 --> 00:04:29,940 Nu face o grămadă de verificarea erorilor. 93 00:04:29,940 --> 00:04:33,000 De exemplu, dacă nu cooperează, și eu nu tastați într-un număr, dar 94 00:04:33,000 --> 00:04:37,860 în loc să scriu ceva de genul "Bună ziua," că e doar un fel de ciudat. 95 00:04:37,860 --> 00:04:41,130 Și astfel unul din lucrurile pe care CS50 biblioteca a făcut pentru noi, pentru unii 96 00:04:41,130 --> 00:04:43,440 timp este că reprompting și reprompting. 97 00:04:43,440 --> 00:04:49,320 >> Încercați din nou fraza rechemare a fost în cs50.c, și că este motivul pentru care getint în 98 00:04:49,320 --> 00:04:51,670 biblioteca CS50 este de fapt un întreg grămadă de linii lungi, pentru că suntem 99 00:04:51,670 --> 00:04:53,190 verificarea pentru prostii de genul asta. 100 00:04:53,190 --> 00:04:55,730 Nu utilizatorul da ne, de fapt, un int? 101 00:04:55,730 --> 00:04:57,910 Te-el sau ea să ne dea ceva ca o literă din alfabet? 102 00:04:57,910 --> 00:05:01,410 Dacă este așa, vrem să detecteze ca si tipa la ei. 103 00:05:01,410 --> 00:05:03,915 >> Dar lucrurile devin mai interesante în acest exemplu următor. 104 00:05:03,915 --> 00:05:09,840 Dacă mă duc la scanf-1.c, ceea ce este cel lucru care este schimbat fundamental în 105 00:05:09,840 --> 00:05:11,135 acest Următorul exemplu? 106 00:05:11,135 --> 00:05:13,690 107 00:05:13,690 --> 00:05:16,010 Sunt folosind char *, desigur, în loc de Int. 108 00:05:16,010 --> 00:05:19,210 >> Deci, acest lucru este interesant, pentru că char *, amintesc, este de fapt doar 109 00:05:19,210 --> 00:05:20,190 același lucru ca șir. 110 00:05:20,190 --> 00:05:23,840 Deci, se simte ca poate aceasta este o super- punerea în aplicare simplă a getstring. 111 00:05:23,840 --> 00:05:26,010 Dar m-am detasat-o inapoi stratul a CS50 bibliotecii, așa că eu sunt 112 00:05:26,010 --> 00:05:27,550 solicită acest char * acum. 113 00:05:27,550 --> 00:05:30,070 Deci, haideți să vedem unde, dacă oriunde, am greșit. 114 00:05:30,070 --> 00:05:30,840 >> Linia 17 - 115 00:05:30,840 --> 00:05:33,950 Eu spun din nou, te rog da-mi ceva, în acest caz, un șir. 116 00:05:33,950 --> 00:05:37,940 Și apoi, în următoarea linie, eu numesc scanf, din nou, dându-i un cod format, 117 00:05:37,940 --> 00:05:39,310 dar de data aceasta la suta s. 118 00:05:39,310 --> 00:05:41,900 Și atunci acest moment, eu sunt dându-tampon. 119 00:05:41,900 --> 00:05:43,550 >> Acum observați, eu nu folosesc ampersand. 120 00:05:43,550 --> 00:05:47,120 Dar de ce este că, probabil, bine aici? 121 00:05:47,120 --> 00:05:49,760 Pentru că ceea ce este deja tampon? 122 00:05:49,760 --> 00:05:50,770 Este deja un pointer. 123 00:05:50,770 --> 00:05:51,650 Este deja o adresă. 124 00:05:51,650 --> 00:05:54,510 >> Și să-i acest cuvânt "confunda," lasă-mă să doar e apel, de exemplu, pentru 125 00:05:54,510 --> 00:05:55,050 simplitate. 126 00:05:55,050 --> 00:05:58,250 Dar am numit-tampon pentru că în general, în programarea, în cazul în care aveți un 127 00:05:58,250 --> 00:06:02,130 bucată de memorie, care într-adevăr un șir la fel este, s-ar putea numi un tampon. 128 00:06:02,130 --> 00:06:04,460 Este un loc pentru a stoca informații. 129 00:06:04,460 --> 00:06:07,400 >> Similar cu lucruri, cum ar fi YouTube, atunci când ei tampon, ca să spunem așa, că 130 00:06:07,400 --> 00:06:10,270 înseamnă doar se descarcă biți de la internet și stocarea acestora într-un 131 00:06:10,270 --> 00:06:14,160 matrice locale, o bucată locale de memorie, astfel încât pe care îl puteți viziona mai târziu, fără a 132 00:06:14,160 --> 00:06:16,830 ea sărind peste sau agățat pe te în timpul redării. 133 00:06:16,830 --> 00:06:20,930 >> Deci, există o problemă aici, deși, pentru că eu spun scanf, se așteaptă o 134 00:06:20,930 --> 00:06:22,320 șir de la utilizator. 135 00:06:22,320 --> 00:06:24,410 Uite adresa de o bucată de memorie. 136 00:06:24,410 --> 00:06:26,180 Pune șir acolo. 137 00:06:26,180 --> 00:06:31,230 De ce este că legat da noi probleme, deși? 138 00:06:31,230 --> 00:06:33,490 >> Ce-i asta? 139 00:06:33,490 --> 00:06:35,510 Am voie să acceseze acea parte a memoriei? 140 00:06:35,510 --> 00:06:36,250 Știi, eu nu știu. 141 00:06:36,250 --> 00:06:39,210 Pentru că a fost inițializat tampon a ceva? 142 00:06:39,210 --> 00:06:39,820 Nu chiar. 143 00:06:39,820 --> 00:06:43,090 Și așa este ceea ce am fost sunat o valoare gunoi, care 144 00:06:43,090 --> 00:06:44,040 nu este un cuvânt oficial. 145 00:06:44,040 --> 00:06:49,200 Înseamnă doar că nu au nici o idee ce biți sunt în interiorul celor patru octeți care 146 00:06:49,200 --> 00:06:51,240 Am alocat ca tampon. 147 00:06:51,240 --> 00:06:52,450 >> Nu am sunat malloc. 148 00:06:52,450 --> 00:06:53,940 Am siguranta nu numit getstring. 149 00:06:53,940 --> 00:06:56,380 Deci, cine știe ce este de fapt interiorul tampon? 150 00:06:56,380 --> 00:07:00,550 Și totuși, spune scanf orbește, du-te acolo și pune orice utilizator tastat. 151 00:07:00,550 --> 00:07:04,460 >> Deci, ceea ce este de natură să cauzeze în codul nostru, dacă vom rula? 152 00:07:04,460 --> 00:07:05,700 Probabil o segfault. 153 00:07:05,700 --> 00:07:07,970 Poate că nu, dar, probabil, o segfault. 154 00:07:07,970 --> 00:07:10,620 Și eu spun poate nu pentru că, uneori, ai face, câteodată 155 00:07:10,620 --> 00:07:11,380 nu ai o segfault. 156 00:07:11,380 --> 00:07:14,280 Uneori, veți obține doar norocos, dar este, totuși, va fi 157 00:07:14,280 --> 00:07:15,340 un bug în programul nostru. 158 00:07:15,340 --> 00:07:17,060 >> Așa că lasă-mă să merg mai departe și compila acest lucru. 159 00:07:17,060 --> 00:07:18,280 Am de gând să-l calea scoala veche face. 160 00:07:18,280 --> 00:07:23,825 Deci bord zăngănit 0, scanf-1, scanf-1.c, Enter. 161 00:07:23,825 --> 00:07:24,720 Hopa, scoala prea vechi. 162 00:07:24,720 --> 00:07:26,550 Să vedem. 163 00:07:26,550 --> 00:07:28,440 Unde am? 164 00:07:28,440 --> 00:07:29,700 Oh, buffer char *. 165 00:07:29,700 --> 00:07:33,595 166 00:07:33,595 --> 00:07:35,130 Oh, vă mulțumesc - 167 00:07:35,130 --> 00:07:36,930 Salvare, bine - 168 00:07:36,930 --> 00:07:37,690 scoala foarte veche. 169 00:07:37,690 --> 00:07:38,900 Bine, a trecut ceva timp. 170 00:07:38,900 --> 00:07:41,720 >> Deci, tocmai am salvat fișierul, după face ca temporar 171 00:07:41,720 --> 00:07:42,700 schimba acum o clipă. 172 00:07:42,700 --> 00:07:46,090 Și acum l-am compilat manual cu zăngănit. 173 00:07:46,090 --> 00:07:49,500 Și acum am de gând să merg mai departe și a alerga scanf-1, Enter. 174 00:07:49,500 --> 00:07:50,290 Șir te rog. 175 00:07:50,290 --> 00:07:51,600 Voi scrie în "Bună ziua." 176 00:07:51,600 --> 00:07:54,070 >> Și acum, aici, unde, sincer, printf poate este un pic enervant. 177 00:07:54,070 --> 00:07:56,020 Nu se intampla de fapt la segfault în acest caz. 178 00:07:56,020 --> 00:07:59,860 Printf este un pic mai special, deoarece E atât de foarte frecvent utilizate, care 179 00:07:59,860 --> 00:08:03,570 în esență printf face ne o favoare și dea seama, 180 00:08:03,570 --> 00:08:04,830 că nu este un pointer valid. 181 00:08:04,830 --> 00:08:09,080 Lasă-mă să-l iau la mine doar să imprime în paranteze nul, chiar 182 00:08:09,080 --> 00:08:13,340 desi nu este neaparat ceea ce ne-am așteptat. 183 00:08:13,340 --> 00:08:16,940 >> Deci nu putem induce într-adevăr cu ușurință o segfault cu acest lucru, dar în mod clar acest lucru 184 00:08:16,940 --> 00:08:18,600 nu este comportamentul mi-am dorit. 185 00:08:18,600 --> 00:08:19,800 Deci, ce este soluția simplă? 186 00:08:19,800 --> 00:08:25,650 Ei bine, în scanf-2, permiteți-mi să propun ca în loc de fapt, doar o alocare 187 00:08:25,650 --> 00:08:30,100 char *, permiteți-mi să fie un pic mai inteligent despre acest lucru, și lasă-mă să aloce tampon 188 00:08:30,100 --> 00:08:32,940 ca o secvență de 16 de caractere. 189 00:08:32,940 --> 00:08:34,200 >> Deci, eu pot face acest lucru într-o serie de moduri. 190 00:08:34,200 --> 00:08:35,610 Aș putea folosi absolut malloc. 191 00:08:35,610 --> 00:08:38,980 Dar eu pot să mă întorc la doua saptamani când Am nevoie de o grămadă de 192 00:08:38,980 --> 00:08:39,620 caractere. 193 00:08:39,620 --> 00:08:40,860 Asta e doar un tablou. 194 00:08:40,860 --> 00:08:44,870 Deci, lasă-mă în loc redefini tampon să fie o matrice de 16 de caractere. 195 00:08:44,870 --> 00:08:47,340 >> Și acum, când trec tampon din - 196 00:08:47,340 --> 00:08:49,940 și acest lucru este ceva ce nu am vorbesc despre in doua saptamani - 197 00:08:49,940 --> 00:08:53,730 dar se pot trata o gamă cât deși este o adresă. 198 00:08:53,730 --> 00:08:56,390 Punct de vedere tehnic, așa cum am văzut, sunt un pic diferit. 199 00:08:56,390 --> 00:09:01,290 Dar scanf nu se va supăra dacă îl trece numele unui tablou, pentru că ceea ce 200 00:09:01,290 --> 00:09:05,030 Clang va face pentru noi este, în esență trata numele care matrice ca 201 00:09:05,030 --> 00:09:08,280 Adresa de bucată de 16 bytes. 202 00:09:08,280 --> 00:09:09,550 >> Deci, acest lucru este mai bine. 203 00:09:09,550 --> 00:09:12,110 Acest lucru înseamnă că acum pot să sperăm procedați în felul următor. 204 00:09:12,110 --> 00:09:16,800 Lasă-mă să zoom out pentru o clipă și nu face scanf-2, compilate OK. 205 00:09:16,800 --> 00:09:19,390 Acum, lasă-mă să-avem slash scanf-2. 206 00:09:19,390 --> 00:09:22,430 Șir te rog. "Bună ziua." Și-l părea să lucreze acest timp. 207 00:09:22,430 --> 00:09:26,020 >> Dar poate cineva propune un scenariu în care s-ar putea să nu funcționeze în continuare? 208 00:09:26,020 --> 00:09:28,550 Da? 209 00:09:28,550 --> 00:09:30,640 Ceva mai mult de 16 caractere. 210 00:09:30,640 --> 00:09:32,020 Și, de fapt, putem fi un pic mai precis. 211 00:09:32,020 --> 00:09:36,540 Ceva mai apoi 15 de caractere, pentru că într-adevăr avem nevoie pentru a păstra în minte 212 00:09:36,540 --> 00:09:39,920 că avem nevoie de backslash la zero implicit, la sfârșitul șirului, 213 00:09:39,920 --> 00:09:42,950 care este o parte scanf va fi de obicei avea grijă de de noi. 214 00:09:42,950 --> 00:09:46,210 >> Deci, lasă-mă să fac ceva de genul - 215 00:09:46,210 --> 00:09:48,040 Uneori putem doar lăsați-l așa. 216 00:09:48,040 --> 00:09:50,630 OK, deci ne-am indus acum vina noastră segmentare. 217 00:09:50,630 --> 00:09:51,000 De ce? 218 00:09:51,000 --> 00:09:54,940 Pentru că am scris la mai mult de 15 caractere, și așa ne-am de fapt, 219 00:09:54,940 --> 00:09:58,280 memorie mișcată de faptul că de fapt nu ar trebui să aibă. 220 00:09:58,280 --> 00:10:00,180 >> Deci, ceea ce este într-adevăr soluția aici? 221 00:10:00,180 --> 00:10:02,210 Ei bine, dacă am nevoie de un șir mai lung? 222 00:10:02,210 --> 00:10:03,960 Ei bine, ne poate face 32 de biți. 223 00:10:03,960 --> 00:10:05,160 Ei bine, ceea ce în cazul în care nu este suficient de lung? 224 00:10:05,160 --> 00:10:06,040 Cum aproximativ 64 biti? 225 00:10:06,040 --> 00:10:07,080 Ce se întâmplă dacă asta nu e suficient de lung? 226 00:10:07,080 --> 00:10:09,640 Cum de aproximativ 128 sau 200 de biți? 227 00:10:09,640 --> 00:10:12,660 Ceea ce este într-adevăr soluția aici, în cazul general, dacă nu știm în 228 00:10:12,660 --> 00:10:14,460 avansa ceea ce utilizatorul va tip? 229 00:10:14,460 --> 00:10:20,000 230 00:10:20,000 --> 00:10:23,050 >> E doar un fel de o mare durere în fund, să fiu sincer, care este motivul pentru care 231 00:10:23,050 --> 00:10:29,050 CS50 biblioteca are câteva zeci de linii de cod care pun în aplicare colectiv 232 00:10:29,050 --> 00:10:32,390 Getstring șir într-un mod pe care noi nu Trebuie să știe în avans ce 233 00:10:32,390 --> 00:10:33,430 Utilizatorul este de gând să tastați. 234 00:10:33,430 --> 00:10:37,370 În special, dacă te uiți înapoi la cs50.c din urmă cu două săptămâni, veți vedea 235 00:10:37,370 --> 00:10:40,480 care getstring de fapt nu Nu folosi scanf în acest fel. 236 00:10:40,480 --> 00:10:43,720 Mai degrabă, se citește un caracter la un moment dat. 237 00:10:43,720 --> 00:10:46,010 >> Pentru ca un lucru frumos despre citind un caracter este putem 238 00:10:46,010 --> 00:10:48,490 garanta noi înșine pentru totdeauna să aibă cel puțin un char. 239 00:10:48,490 --> 00:10:51,740 Eu pot declara doar un caracter, și apoi să ia acești pași cu adevărat copilul la doar 240 00:10:51,740 --> 00:10:54,380 citit un caracter de la un timp de la tastatură. 241 00:10:54,380 --> 00:10:58,240 Și apoi, ce veți vedea getstring nu este de fiecare dată când rămâne fără, 242 00:10:58,240 --> 00:11:02,280 să zicem, 16 de bytes de memorie, se foloseste malloc, sau de un văr, la 243 00:11:02,280 --> 00:11:06,810 aloca mai multă memorie, copierea vechi de memorie în noi, și apoi crawling 244 00:11:06,810 --> 00:11:09,900 de-a lungul, obtinerea de un caracter la un moment dat, și atunci când se execută din care 245 00:11:09,900 --> 00:11:13,370 bucată de memorie, se aruncă departe, graifere o bucată mai mare de memorie, copii vechi 246 00:11:13,370 --> 00:11:14,750 în noi, și repetă. 247 00:11:14,750 --> 00:11:18,480 Și este cu adevărat o durere de fapt, implementeze ceva la fel de simplu ca 248 00:11:18,480 --> 00:11:19,710 obținerea de intrare de la un utilizator. 249 00:11:19,710 --> 00:11:21,090 >> Astfel, puteți folosi scanf. 250 00:11:21,090 --> 00:11:22,430 Puteți utiliza alte funcții similare. 251 00:11:22,430 --> 00:11:25,420 Și o mulțime de manuale și on-line exemple fac, dar sunt toate 252 00:11:25,420 --> 00:11:27,210 vulnerabile la probleme de acest gen. 253 00:11:27,210 --> 00:11:29,550 Și în cele din urmă, obtinerea unui segfault este un fel de enervant. 254 00:11:29,550 --> 00:11:30,680 Nu e bine pentru utilizator. 255 00:11:30,680 --> 00:11:33,560 >> Dar, în cel mai rău caz, ceea ce face se pune fundamental ta 256 00:11:33,560 --> 00:11:37,160 Codul risc de? 257 00:11:37,160 --> 00:11:39,250 Un fel de atac, potențial. 258 00:11:39,250 --> 00:11:41,680 Am vorbit despre un astfel de atac - debordant stiva. 259 00:11:41,680 --> 00:11:44,660 Dar, în general, dacă ai voie să overflow un tampon, asa cum am facut-o 260 00:11:44,660 --> 00:11:48,070 câteva săptămâni în urmă, cu doar scris mai mult de "salut" pe stiva, vă 261 00:11:48,070 --> 00:11:52,330 poate lua într-adevăr peste, eventual, o calculator, sau cel puțin a ajunge la datele care 262 00:11:52,330 --> 00:11:53,510 nu-ți aparține. 263 00:11:53,510 --> 00:11:55,970 >> Deci, pe scurt, acesta este motivul pentru care ne-am aceste roți de formare. 264 00:11:55,970 --> 00:11:59,090 Dar acum, vom începe să le ia off, ca programele noastre nu mai au nevoie, 265 00:11:59,090 --> 00:12:00,610 în mod necesar, de intrare de la utilizator. 266 00:12:00,610 --> 00:12:03,960 Dar în cazul problemei stabilit șase, intrare dvs. va veni de la un imens 267 00:12:03,960 --> 00:12:07,520 fișierul dicționar cu 150 unele ciudat mie de cuvinte. 268 00:12:07,520 --> 00:12:10,330 >> Deci, nu va trebui să vă faceți griji cu privire la intrare arbitrar utilizatorului. 269 00:12:10,330 --> 00:12:13,720 Noi vă va oferi câteva ipoteze despre acel fișier. 270 00:12:13,720 --> 00:12:20,340 Orice întrebări cu privire la indicii sau scanf sau datele introduse de utilizator, în general? 271 00:12:20,340 --> 00:12:24,450 >> Bine, deci o privire rapidă, apoi la o trailing subiect de acum două săptămâni. 272 00:12:24,450 --> 00:12:28,590 Și că a fost această noțiune a unei structuri. 273 00:12:28,590 --> 00:12:34,180 Nu că - această noțiune de o struct, care a fost ce? 274 00:12:34,180 --> 00:12:35,430 Ce a făcut struct pentru noi? 275 00:12:35,430 --> 00:12:39,280 276 00:12:39,280 --> 00:12:39,860 >> Definirea - 277 00:12:39,860 --> 00:12:41,710 Îmi pare rău? 278 00:12:41,710 --> 00:12:42,820 Defini un tip de variabilă. 279 00:12:42,820 --> 00:12:44,410 Deci, un fel de. 280 00:12:44,410 --> 00:12:46,180 Suntem combinarea de fapt două subiecte. 281 00:12:46,180 --> 00:12:49,510 Deci, cu typedef, amintim că putem declara un tip de propria noastră, ca un 282 00:12:49,510 --> 00:12:51,500 sinonim, ca șir de char *. 283 00:12:51,500 --> 00:12:56,200 Dar folosind typedef struct si, putem crea cu adevărat propriile noastre structuri de date. 284 00:12:56,200 --> 00:12:59,600 >> De exemplu, dacă mă duc înapoi în gedit aici doar pentru o clipă, și am merge mai departe 285 00:12:59,600 --> 00:13:08,230 și de a face ceva de genul, lasă-mă să salveze acest drept, să spunem, structs.c 286 00:13:08,230 --> 00:13:10,840 temporar, Mă duc pentru a merge mai departe și să includă 287 00:13:10,840 --> 00:13:14,360 standardio.h, void main Int. 288 00:13:14,360 --> 00:13:18,960 Și apoi aici, presupunem că vreau pentru a scrie un program care stochează 289 00:13:18,960 --> 00:13:21,840 mai multor studenți de la mai multe case, de exemplu. 290 00:13:21,840 --> 00:13:24,430 Deci, e ca o registrarial Baza de date de un anumit fel. 291 00:13:24,430 --> 00:13:29,550 >> Deci, dacă am nevoie de numele unui student, am s-ar putea face ceva de genul char nume *, 292 00:13:29,550 --> 00:13:31,570 și voi face ceva de genul - 293 00:13:31,570 --> 00:13:34,410 De fapt, hai să folosim CS50 biblioteca pentru doar un moment pentru a face acest lucru o 294 00:13:34,410 --> 00:13:38,380 mai simplu, astfel încât să putem împrumuta acele zeci de linii de cod. 295 00:13:38,380 --> 00:13:39,340 Și hai să păstrați-l simplu. 296 00:13:39,340 --> 00:13:42,610 Vom ține-l string, și acum getstring. 297 00:13:42,610 --> 00:13:47,420 >> Deci, eu pretind că le-am stocat numele a unor student, și casa de 298 00:13:47,420 --> 00:13:50,240 un elev, pur și simplu, folosind variabile așa cum am făcut și în prima săptămână. 299 00:13:50,240 --> 00:13:52,370 Dar să presupunem că acum vreau să sprijin mai multor elevi. 300 00:13:52,370 --> 00:13:58,460 În regulă, deci instinctele mele sunt de a face șir name2, se getstring, string 301 00:13:58,460 --> 00:14:01,370 house2 devine getstring. 302 00:14:01,370 --> 00:14:05,850 Și apoi al treilea elev nostru, hai sa facem NAME3 getstring. 303 00:14:05,850 --> 00:14:09,170 >> Bine, deci acest lucru este, sperăm, frapant tine, ca un fel de stupid, 304 00:14:09,170 --> 00:14:11,580 deoarece acest proces este într-adevăr niciodată va sfârși, și este doar de gând să 305 00:14:11,580 --> 00:14:13,130 face codul meu arata mai rau și mai rău și mai rău. 306 00:14:13,130 --> 00:14:14,810 Dar am rezolvat această prea in doua saptamani. 307 00:14:14,810 --> 00:14:19,450 Care a fost soluția noastră relativ curat când am avut mai multe variabile ale 308 00:14:19,450 --> 00:14:23,580 același tip de date, care sunt toate legate, dar nu am dorit această mizerie atroce 309 00:14:23,580 --> 00:14:26,870 de variabile denumite similar? 310 00:14:26,870 --> 00:14:30,060 Ce am făcut în schimb? 311 00:14:30,060 --> 00:14:31,260 >> Deci, cred că am auzit câteva locuri. 312 00:14:31,260 --> 00:14:32,590 Am avut o matrice. 313 00:14:32,590 --> 00:14:37,110 Dacă doriți mai multe instanțe de ceva, de ce nu ne curata totul 314 00:14:37,110 --> 00:14:39,540 și să spun, da-mi array numit nume? 315 00:14:39,540 --> 00:14:41,640 >> Și de acum, sa greu 3 cod. 316 00:14:41,640 --> 00:14:44,450 Și apoi dă-mi o matrice numite case, și lasă-mă pentru 317 00:14:44,450 --> 00:14:45,800 acum codul greu 3. 318 00:14:45,800 --> 00:14:49,220 Și am masiv curățat mizeria pe care am creat. 319 00:14:49,220 --> 00:14:52,400 Acum, eu am încă greu codificate 3, dar chiar 3 ar putea proveni de la dinamic 320 00:14:52,400 --> 00:14:54,350 utilizator, sau argv, sau cum ar fi. 321 00:14:54,350 --> 00:14:55,720 Deci, acest lucru este deja curat. 322 00:14:55,720 --> 00:15:00,100 >> Dar ceea ce e enervant despre acest lucru este faptul că acum, chiar dacă un nume este oarecum 323 00:15:00,100 --> 00:15:02,280 legat în mod fundamental casa unui student - 324 00:15:02,280 --> 00:15:04,720 este un elev care mi- Vreau să reprezinte - 325 00:15:04,720 --> 00:15:08,080 Am acum două tablouri care sunt paralele în sensul că acestea sunt 326 00:15:08,080 --> 00:15:13,930 aceeași dimensiune, și nume de suport 0 probabil și hărți la case suport 0, 327 00:15:13,930 --> 00:15:16,600 și numele suport 1 hărți la case suport 1. 328 00:15:16,600 --> 00:15:19,280 Cu alte cuvinte, că studenților trăiește în casa, iar celălalt elev 329 00:15:19,280 --> 00:15:20,530 trăiește în care alte casă. 330 00:15:20,530 --> 00:15:23,720 Dar cu siguranță acest lucru ar putea fi făcut chiar mai curat. 331 00:15:23,720 --> 00:15:24,990 >> Ei bine, se poate, de fapt. 332 00:15:24,990 --> 00:15:28,730 Și lasă-mă să merg mai departe și deschide sus structs.h, și veți 333 00:15:28,730 --> 00:15:31,130 vedea această idee aici. 334 00:15:31,130 --> 00:15:34,905 Observați că am folosit typedef, după cum a făcut aluzie la un moment în urmă să declare nostru 335 00:15:34,905 --> 00:15:35,570 tip de date proprie. 336 00:15:35,570 --> 00:15:39,660 Dar eu sunt, de asemenea, folosind acest alt cuvânt cheie numit struct care îmi dă un nou 337 00:15:39,660 --> 00:15:40,790 structură de date. 338 00:15:40,790 --> 00:15:43,980 >> Și această structură de date am pretinde se întâmplă să aibă două lucruri interiorul 339 00:15:43,980 --> 00:15:47,060 ea - un șir numit nume, și un șir numit casă. 340 00:15:47,060 --> 00:15:49,820 Și numele am de gând să dea la această structură de date se va 341 00:15:49,820 --> 00:15:51,005 să fie numit elev. 342 00:15:51,005 --> 00:15:54,030 Am putea spune orice vreau, dar acest lucru face semantic 343 00:15:54,030 --> 00:15:55,810 sens pentru mine în mintea mea. 344 00:15:55,810 --> 00:15:59,160 >> Deci, acum, dacă am deschide o versiune mai bună a programului am început să scriu 345 00:15:59,160 --> 00:16:00,390 acolo, lasă-mă să derulați în partea de sus. 346 00:16:00,390 --> 00:16:03,190 Și există ceva mai multe linii de cod aici, dar permiteți-mi să se concentreze pentru 347 00:16:03,190 --> 00:16:04,160 momentul pe una. 348 00:16:04,160 --> 00:16:07,790 Am declarat-o constanta numita studenți și greu codificate 3 pentru acum. 349 00:16:07,790 --> 00:16:11,110 Dar acum, observa cât de curată codul meu începe să se. 350 00:16:11,110 --> 00:16:15,030 >> În linia 22, declar serie de studenți. 351 00:16:15,030 --> 00:16:18,760 Și observă că elevul este aparent acum un tip de date. 352 00:16:18,760 --> 00:16:23,360 Pentru că în partea de sus a acestui fișier, observa Am inclus acest fișier header 353 00:16:23,360 --> 00:16:24,820 că am tras în urmă doar o clipă. 354 00:16:24,820 --> 00:16:28,820 Și că fișierul header pur și simplu au avut această definiție a unui student. 355 00:16:28,820 --> 00:16:32,470 >> Deci, acum, am creat propriile mele date personalizate Tipul care autorii de ani C 356 00:16:32,470 --> 00:16:33,890 Acum nu cred că a în prealabil. 357 00:16:33,890 --> 00:16:34,570 Dar nici o problema. 358 00:16:34,570 --> 00:16:35,870 Pot face eu. 359 00:16:35,870 --> 00:16:39,050 Deci, acesta este un tablou numit studenți, fiecare dintre membrii căror 360 00:16:39,050 --> 00:16:41,100 este o structură elev. 361 00:16:41,100 --> 00:16:44,270 Și vreau trei din cei în matrice. 362 00:16:44,270 --> 00:16:46,030 >> Și acum, ceea ce face restul din acest program nu? 363 00:16:46,030 --> 00:16:47,550 Am nevoie de ceva un pic arbitrar. 364 00:16:47,550 --> 00:16:51,450 Deci, de la on-line 24 incoace, Am itera la 0 la 3. 365 00:16:51,450 --> 00:16:54,000 Apoi m-am cere utilizatorului pentru Numele elevului. 366 00:16:54,000 --> 00:16:56,110 Și apoi am folosi getstring ca înainte. 367 00:16:56,110 --> 00:16:59,410 Apoi m-am cere pentru casa elevului, și am folosi getstring ca înainte. 368 00:16:59,410 --> 00:17:01,780 >> Dar observați - ușor nou bucata de sintaxă - 369 00:17:01,780 --> 00:17:07,010 Pot încă indicele de student i-lea, dar nu stiu cum sa la date specifice 370 00:17:07,010 --> 00:17:08,354 câmp interiorul struct? 371 00:17:08,354 --> 00:17:11,770 Ei bine, ceea ce este aparent noua piesa de sintaxă? 372 00:17:11,770 --> 00:17:13,339 E doar operatorul punct. 373 00:17:13,339 --> 00:17:14,510 >> Nu ne-am văzut cu adevărat acest lucru înainte. 374 00:17:14,510 --> 00:17:17,819 Ai văzut-o în PSET cinci, dacă ați scufundat în deja cu fișiere bitmap. 375 00:17:17,819 --> 00:17:22,372 Dar dot înseamnă doar în interiorul acestui struct sau mai multe domenii, dau puncte 376 00:17:22,372 --> 00:17:24,510 nume, sau da-mi dot casa. 377 00:17:24,510 --> 00:17:28,690 Asta înseamnă că merge în interiorul a struct și de a lua aceste domenii specifice. 378 00:17:28,690 --> 00:17:30,200 >> Ce face restul acestui program nu? 379 00:17:30,200 --> 00:17:31,190 Nu e tot ce sexy. 380 00:17:31,190 --> 00:17:34,640 Observa că am repeta la 0 la 3, din nou, și pur și simplu am crea un englez 381 00:17:34,640 --> 00:17:40,500 frază ca așa și așa este în astfel de și o astfel de casă, trecând în numele punct de 382 00:17:40,500 --> 00:17:43,320 student i-lea și lor casa, de asemenea. 383 00:17:43,320 --> 00:17:47,560 >> Și apoi în cele din urmă, acum vom începe să se anal despre acest lucru, acum că suntem 384 00:17:47,560 --> 00:17:49,580 familiarizat cu ceea ce malloc și alte funcții au fost 385 00:17:49,580 --> 00:17:50,570 a face tot acest timp. 386 00:17:50,570 --> 00:17:54,220 De ce trebuie să elibereze ambele nume și casă, chiar dacă am 387 00:17:54,220 --> 00:17:56,960 Nu a sunat malloc? 388 00:17:56,960 --> 00:17:58,020 >> Getstring făcut. 389 00:17:58,020 --> 00:18:00,930 Și că a fost secret murdar mic pentru de mai multe săptămâni, dar are getString 390 00:18:00,930 --> 00:18:03,530 a fost scurgeri de memorie de peste tot loc tot semestrul până acum. 391 00:18:03,530 --> 00:18:05,990 Și, în cele din urmă va valgrand dezvăluie acest lucru pentru noi. 392 00:18:05,990 --> 00:18:10,730 >> Dar nu e mare lucru, pentru că știu care pot elibera pur și simplu numele 393 00:18:10,730 --> 00:18:15,750 și casa, deși punct de vedere tehnic, pentru a fie super-super-în condiții de siguranță,, eu ar trebui să fie 394 00:18:15,750 --> 00:18:17,890 face niste verificari de erori aici. 395 00:18:17,890 --> 00:18:19,040 Care sunt instinctele tale îți spun? 396 00:18:19,040 --> 00:18:22,480 Ce ar trebui să fie de verificare pentru înainte de a elibera ceea ce este un 397 00:18:22,480 --> 00:18:25,470 șir, alias care un char *? 398 00:18:25,470 --> 00:18:33,460 >> Eu ar trebui să fie într-adevăr verifica dacă elevii suport eu dot nume nu 399 00:18:33,460 --> 00:18:34,840 egal nul. 400 00:18:34,840 --> 00:18:40,400 Atunci va fi OK pentru a merge mai departe și gratuit că indicatorul, și același sau alt 401 00:18:40,400 --> 00:18:41,160 una la fel de bine. 402 00:18:41,160 --> 00:18:46,860 Dacă elevii suport i dot casa nu este egal cu zero, acest lucru acum va proteja 403 00:18:46,860 --> 00:18:52,520 împotriva caz colț în care Getstring întoarce ceva de genul null. 404 00:18:52,520 --> 00:18:57,310 Și am văzut acum o clipă, printf va ne protejeze aici de doar spunând 405 00:18:57,310 --> 00:18:58,990 null, care este de gând să se uite ciudat. 406 00:18:58,990 --> 00:19:02,340 Dar cel puțin nu va segfault, după cum am văzut. 407 00:19:02,340 --> 00:19:05,990 >> Ei bine, lasă-mă să fac un lucru aici. structs-0 este un fel de program de prost 408 00:19:05,990 --> 00:19:09,700 pentru că introduce toate aceste date, și apoi ea a pierdut o dată programul se termină. 409 00:19:09,700 --> 00:19:10,940 Dar lasă-mă să merg mai departe și de a face acest lucru. 410 00:19:10,940 --> 00:19:12,830 Permiteți-mi să fac terminalul Fereastra un pic mai mare. 411 00:19:12,830 --> 00:19:17,000 Permiteți-mi să fac structs-1, care este o versiune nouă a acestui. 412 00:19:17,000 --> 00:19:18,520 >> Voi mări un pic. 413 00:19:18,520 --> 00:19:21,620 Și acum lasă-mă să ruleze punct slash structs-1. 414 00:19:21,620 --> 00:19:22,590 Numele elevului - 415 00:19:22,590 --> 00:19:31,500 David Mather, hai sa facem Rob Kirkland, Să facem Lauren Leverett. 416 00:19:31,500 --> 00:19:33,650 Ceea ce este interesant este acum preaviz - 417 00:19:33,650 --> 00:19:35,540 și știu că doar acest lucru, deoarece Am scris programul - 418 00:19:35,540 --> 00:19:38,930 există un fișier acum pe actualul meu director numit students.csv. 419 00:19:38,930 --> 00:19:40,420 Unii dintre voi s-ar putea fi văzut acestea, în lumea reală. 420 00:19:40,420 --> 00:19:42,980 >> Ce este un fișier CSV? 421 00:19:42,980 --> 00:19:44,170 Valori separate prin virgulă. 422 00:19:44,170 --> 00:19:46,670 E ca un fel de om sărac versiune a unui fișier Excel. 423 00:19:46,670 --> 00:19:50,580 Este un tabel de rânduri și coloane care puteți deschide într-un program cum ar fi Excel, 424 00:19:50,580 --> 00:19:51,800 sau numere pe un Mac. 425 00:19:51,800 --> 00:19:55,180 >> Și dacă am deschis acest fișier aici pe gedit, notificare - și numerele nu sunt acolo. 426 00:19:55,180 --> 00:19:57,360 Asta e doar gedit spune mi numerele de linie. 427 00:19:57,360 --> 00:19:59,740 Observați pe prima linie a acestei fișier este David și Mather. 428 00:19:59,740 --> 00:20:01,450 Următoarea linie este Rob virgulă Kirkland. 429 00:20:01,450 --> 00:20:04,170 Și a treia linie este Lauren virgulă Leverett. 430 00:20:04,170 --> 00:20:05,480 >> Deci, ceea ce am creat? 431 00:20:05,480 --> 00:20:09,580 Am scris acum un program C care în mod eficient poate genera foi de calcul 432 00:20:09,580 --> 00:20:11,840 care poate fi deschis într-o Programul cum ar fi Excel. 433 00:20:11,840 --> 00:20:15,520 Nu tot ce convingatoare un set de date, dar dacă aveți bucăți mai mari de 434 00:20:15,520 --> 00:20:18,440 Datele pe care le doresc de fapt să manipula și de a face grafice de și 435 00:20:18,440 --> 00:20:21,260 ca, aceasta este, probabil, unul mod de a crea acele date. 436 00:20:21,260 --> 00:20:25,370 Mai mult decât atât, CSVs sunt de fapt foarte frecvente doar pentru stocarea de date simple - 437 00:20:25,370 --> 00:20:28,940 Yahoo Finance, de pildă, dacă te cotații bursiere, prin intermediul lor așa-numitele 438 00:20:28,940 --> 00:20:33,180 API, serviciu gratuit care vă permite să obține curent stoc până-la-data- 439 00:20:33,180 --> 00:20:35,650 oferte pentru companii, ele da datele înapoi la 440 00:20:35,650 --> 00:20:37,800 format CSV simplu super-. 441 00:20:37,800 --> 00:20:39,380 >> Deci, cum facem asta? 442 00:20:39,380 --> 00:20:42,530 Ei bine observa, cele mai multe din acest program aproape aceeași. 443 00:20:42,530 --> 00:20:46,870 Dar observa aici, mai degrabă decât de imprimare studenții tunel, pe linia 35 444 00:20:46,870 --> 00:20:51,040 mai departe, eu pretind că eu sunt de economisire studenți la disc, astfel încât salvarea unui fișier. 445 00:20:51,040 --> 00:20:53,630 >> Deci, observăm am declara un fișier * - 446 00:20:53,630 --> 00:20:57,260 Acum, acest lucru este un fel de o anomalie în C. Indiferent de motiv, fișierul este cu majuscule, 447 00:20:57,260 --> 00:21:00,690 care nu este ca cele mai multe alte tipuri de date în C. Dar aceasta este un built-in 448 00:21:00,690 --> 00:21:02,320 tip de date, FILE *. 449 00:21:02,320 --> 00:21:05,900 Iar eu declara un pointer la un fișier, este modul în care vă puteți gândi la asta. 450 00:21:05,900 --> 00:21:08,070 >> fopen înseamnă dosar deschis. 451 00:21:08,070 --> 00:21:09,470 Ce fisier vrei să deschizi? 452 00:21:09,470 --> 00:21:12,620 Vreau să deschid un fișier pe care voi apela arbitrar students.csv. 453 00:21:12,620 --> 00:21:14,480 Am putea spune că tot ce vreau. 454 00:21:14,480 --> 00:21:15,200 >> Și apoi să ia o presupunere. 455 00:21:15,200 --> 00:21:18,960 Ce face al doilea argument la, probabil, fopen înseamnă? 456 00:21:18,960 --> 00:21:21,480 Dreapta, W pentru a scrie, ar putea fie R pentru citire. 457 00:21:21,480 --> 00:21:24,120 Există o pentru adăugare, dacă Vreau să adăugați rânduri și nu 458 00:21:24,120 --> 00:21:25,200 suprascrie totul. 459 00:21:25,200 --> 00:21:28,005 >> Dar eu vreau doar pentru a crea acest fișier dată, așa că voi folosi citat încheiat citatul w. 460 00:21:28,005 --> 00:21:31,880 Și știu că doar de a fi citit documentația sau pagina de manual. 461 00:21:31,880 --> 00:21:35,100 Dacă fișierul nu este nul - cu alte cuvinte, în cazul în care nimic nu a mers bine acolo - 462 00:21:35,100 --> 00:21:37,820 permiteți-mi repeta peste studenți la 0 la 3. 463 00:21:37,820 --> 00:21:40,410 >> Si acum observa ceva vreodată atât de ușor diferite 464 00:21:40,410 --> 00:21:42,110 despre linia 41 aici. 465 00:21:42,110 --> 00:21:42,960 Nu e printf. 466 00:21:42,960 --> 00:21:46,530 Este fprintf pentru fișier printf. 467 00:21:46,530 --> 00:21:47,790 Deci, se va scrie la dosar. 468 00:21:47,790 --> 00:21:48,860 Care dosar? 469 00:21:48,860 --> 00:21:53,630 Cel al cărui indicator să specificați ca prim argument. 470 00:21:53,630 --> 00:21:55,940 >> Apoi, vom specifica un șir format. 471 00:21:55,940 --> 00:21:59,660 Apoi vom specifica ce string vrem să conectați pentru prima s procente, iar 472 00:21:59,660 --> 00:22:04,320 apoi o altă variabilă sau doilea s procente. 473 00:22:04,320 --> 00:22:06,760 Apoi ne-am închide fișierul cu fclose. 474 00:22:06,760 --> 00:22:09,380 Decât am elibera memorie ca înainte, deși Ar trebui să mă întorc și să adăugați 475 00:22:09,380 --> 00:22:10,540 unele verificări pentru nul. 476 00:22:10,540 --> 00:22:12,090 >> Și asta e tot. 477 00:22:12,090 --> 00:22:16,960 fopen, fprintf, fclose îmi dă abilitatea de a crea fișiere text. 478 00:22:16,960 --> 00:22:19,640 Acum, veți vedea în setul problema cinci, care implică imagini, veți fi utilizați 479 00:22:19,640 --> 00:22:20,990 fișierele binare în schimb. 480 00:22:20,990 --> 00:22:24,200 Dar fundamental, ideea este aceeași, chiar dacă funcțiile Veți 481 00:22:24,200 --> 00:22:28,710 vezi sunt un pic diferit. 482 00:22:28,710 --> 00:22:32,580 >> Deci tur vârtej de vânt, dar va primi mult prea familiarizat cu dosarul I/O-- 483 00:22:32,580 --> 00:22:34,960 de intrare și ieșire - cu PSET cinci. 484 00:22:34,960 --> 00:22:38,607 Și orice întrebări cu privire la Noțiuni de bază inițiale aici? 485 00:22:38,607 --> 00:22:39,857 Da? 486 00:22:39,857 --> 00:22:41,880 487 00:22:41,880 --> 00:22:43,710 >> Ce se întâmplă dacă încercați să elibereze o valoare nulă? 488 00:22:43,710 --> 00:22:48,880 Eu cred că, dacă nu gratuit a devenit o ceva mai user-friendly, puteți 489 00:22:48,880 --> 00:22:49,890 potențial segfault. 490 00:22:49,890 --> 00:22:54,160 Trecându-l null este rău pentru că eu nu fac cred liber deranjeaza pentru a verifica pentru tine, 491 00:22:54,160 --> 00:22:57,330 deoarece ar reprezenta un deșeu de timp pentru ca aceasta să se facă pentru 492 00:22:57,330 --> 00:22:59,022 toată lumea din lume. 493 00:22:59,022 --> 00:23:00,590 Bună întrebare, totuși. 494 00:23:00,590 --> 00:23:04,300 >> Bine, deci acest tip de se ne la un subiect interesant. 495 00:23:04,300 --> 00:23:07,010 Tema de set de probleme a cinci este criminalistica. 496 00:23:07,010 --> 00:23:08,420 Cel puțin asta este o parte setului problemei. 497 00:23:08,420 --> 00:23:12,030 Criminalistica, în general, se referă la recuperarea de informații, care pot sau 498 00:23:12,030 --> 00:23:14,110 să nu fi fost șters în mod deliberat. 499 00:23:14,110 --> 00:23:18,680 Și așa m-am gândit să vă dau un rapid gust de ceea ce se întâmplă cu adevărat pe toate 500 00:23:18,680 --> 00:23:21,230 acest timp sub capota a computerului. 501 00:23:21,230 --> 00:23:23,960 >> De exemplu, dacă aveți în interiorul dvs. laptopul sau computerul desktop o 502 00:23:23,960 --> 00:23:28,040 hard disk, este fie un mecanic dispozitiv care se învârte de fapt - 503 00:23:28,040 --> 00:23:31,650 există lucruri circulare numite platane care arata destul place ce 504 00:23:31,650 --> 00:23:34,540 a avut doar pe ecran aici, deși acesta este din ce în ce școală veche. 505 00:23:34,540 --> 00:23:37,370 Aceasta este o perioadă de trei-si-un-jumatate de inch hard disk. 506 00:23:37,370 --> 00:23:40,070 Și trei ani și jumătate centimetri se referă de cu de lucru atunci când îl instalați 507 00:23:40,070 --> 00:23:40,890 într-un calculator. 508 00:23:40,890 --> 00:23:44,890 >> Multi dintre voi în laptop-uri acum au drive-uri solid-state, sau SSD-uri, 509 00:23:44,890 --> 00:23:46,260 care nu au părți în mișcare. 510 00:23:46,260 --> 00:23:49,170 Sunt mai mult ca RAM și mai puțin ca aceste dispozitive mecanice. 511 00:23:49,170 --> 00:23:51,450 Dar ideile sunt în continuare la fel, cu siguranță, în care se referă 512 00:23:51,450 --> 00:23:52,790 la problema de cinci seturi. 513 00:23:52,790 --> 00:23:57,400 >> Și dacă te gândești acum un hard-disk reprezintă fiind un cerc, care 514 00:23:57,400 --> 00:23:58,930 Voi trage ca asta aici. 515 00:23:58,930 --> 00:24:02,290 Când creați un fișier de pe computer, indiferent dacă este un SSD, sau în 516 00:24:02,290 --> 00:24:06,610 acest caz, un hard disk școală mai vechi, că dosarul cuprinde mai multe biți. 517 00:24:06,610 --> 00:24:10,510 Să spunem că e 0 și 1, o grămadă de 0 si 1. 518 00:24:10,510 --> 00:24:11,660 Deci, asta este tot meu disc tare. 519 00:24:11,660 --> 00:24:13,225 Acest lucru este aparent un fișier destul de mare. 520 00:24:13,225 --> 00:24:18,080 Și se folosește la 0 si 1, la care porțiune de platou fizice. 521 00:24:18,080 --> 00:24:19,750 >> Ei bine, ceea ce este acea parte fizica? 522 00:24:19,750 --> 00:24:25,310 Ei bine, se pare ca pe un hard-disk, Cel de acest tip, la, există 523 00:24:25,310 --> 00:24:27,340 aceste minuscule particule magnetice. 524 00:24:27,340 --> 00:24:32,630 Și ei au, în esență nord și poli de Sud pentru a le, astfel încât, dacă 525 00:24:32,630 --> 00:24:35,710 rândul său, unul dintre aceste particule magnetice în acest fel, s-ar putea spune că e 526 00:24:35,710 --> 00:24:36,720 reprezentând un 1. 527 00:24:36,720 --> 00:24:39,340 Și dacă e cu susul în jos spre sud pentru a nord, s-ar putea spune că e 528 00:24:39,340 --> 00:24:40,390 reprezentând un 0. 529 00:24:40,390 --> 00:24:43,660 >> Deci, în lumea fizică reală, care e cum ar putea reprezenta ceva în 530 00:24:43,660 --> 00:24:45,670 starea binar de 0 și 1. 531 00:24:45,670 --> 00:24:46,720 Deci, asta e tot un fișier este. 532 00:24:46,720 --> 00:24:49,300 Există o grămadă de magnetic Particulele care sunt lor acest fel sau 533 00:24:49,300 --> 00:24:51,920 În acest fel, modele crearea de 0 si 1. 534 00:24:51,920 --> 00:24:56,760 >> Dar se pare că atunci când salvați un fișier, unele informații este salvat separat. 535 00:24:56,760 --> 00:25:00,000 Deci, aceasta este o măsuță, un director, ca să spunem așa. 536 00:25:00,000 --> 00:25:05,810 Și eu numesc acest nume coloană, și Voi suna această locație coloană. 537 00:25:05,810 --> 00:25:08,850 >> Și am de gând să spun, să presupunem aceasta este CV-ul meu. 538 00:25:08,850 --> 00:25:14,050 Resume.doc mea este depozitat la locație, să spunem 123. 539 00:25:14,050 --> 00:25:15,390 Mă duc mereu la acel număr. 540 00:25:15,390 --> 00:25:18,810 Dar este suficient să spunem că la fel ca în RAM, puteți lua un hard disk 541 00:25:18,810 --> 00:25:22,350 că e un gigabyte sau 200 GB sau un terabyte, și puteți 542 00:25:22,350 --> 00:25:23,750 Numărul tuturor bytes. 543 00:25:23,750 --> 00:25:26,480 Aveți posibilitatea să numerotați toate bucati de 8 biți. 544 00:25:26,480 --> 00:25:29,030 >> Deci, vom spune că această este locația 123. 545 00:25:29,030 --> 00:25:32,070 Deci, acest director interiorul operare mele Sistemul amintește că meu 546 00:25:32,070 --> 00:25:34,250 CV-ul este în locația 123. 547 00:25:34,250 --> 00:25:36,850 Dar devine interesant atunci când ștergeți un fișier. 548 00:25:36,850 --> 00:25:37,820 >> Deci, de exemplu - 549 00:25:37,820 --> 00:25:40,790 și din fericire, cea mai mare din lume are prins pe acest lucru - ceea ce se întâmplă atunci când 550 00:25:40,790 --> 00:25:45,040 vă trageți un fișier pentru Mac OS gunoi sau dvs. de Recycle Bin pentru Windows? 551 00:25:45,040 --> 00:25:48,290 552 00:25:48,290 --> 00:25:50,510 Care este scopul de a face asta? 553 00:25:50,510 --> 00:25:53,860 Este evident, pentru a scăpa de dosar, dar ceea ce face actul de glisare și 554 00:25:53,860 --> 00:25:57,550 scăzând în Coșul de gunoi dvs. sau Recycle Bin face pe un calculator? 555 00:25:57,550 --> 00:25:59,230 >> Absolut nimic, într-adevăr. 556 00:25:59,230 --> 00:26:00,320 Este la fel ca un folder. 557 00:26:00,320 --> 00:26:01,800 Este un folder special, pentru a fi sigur. 558 00:26:01,800 --> 00:26:04,460 Dar nu-l șterge de fapt dosarul? 559 00:26:04,460 --> 00:26:06,780 >> Ei bine, nu, pentru că unii dintre voi probabil au fost ca, oh la naiba, nu ai făcut- 560 00:26:06,780 --> 00:26:07,420 vrut să fac asta. 561 00:26:07,420 --> 00:26:09,130 Deci, dublu clic pe Gunoi sau Recycle Bin. 562 00:26:09,130 --> 00:26:11,630 Te-ai băgat nasul și le-ați recuperat fișierul pe care tocmai prin tragere 563 00:26:11,630 --> 00:26:12,110 de acolo. 564 00:26:12,110 --> 00:26:14,420 Deci, în mod clar, nu este neapărat ștergere. 565 00:26:14,420 --> 00:26:15,990 >> OK, tu ești mai deștept decât atât. 566 00:26:15,990 --> 00:26:18,860 Știi că doar trăgând în Gunoi sau Recycle Bin nu înseamnă 567 00:26:18,860 --> 00:26:19,930 te golirea coșul de gunoi. 568 00:26:19,930 --> 00:26:24,110 Deci, te duci până la meniul, iar tu spui Empty Trash sau Empty Recycle Bin. 569 00:26:24,110 --> 00:26:25,360 Atunci ce se întâmplă? 570 00:26:25,360 --> 00:26:29,070 571 00:26:29,070 --> 00:26:32,530 >> Da, așa că este șters mai mult. 572 00:26:32,530 --> 00:26:37,660 Dar tot ce se întâmplă este aceasta. 573 00:26:37,660 --> 00:26:45,350 Calculator uită unde resume.doc a fost. 574 00:26:45,350 --> 00:26:47,400 >> Dar ceea ce nu sa schimbat, aparent, în imagine? 575 00:26:47,400 --> 00:26:51,390 576 00:26:51,390 --> 00:26:55,570 Biți, 0 si 1 pe care le pretind sunt pe site-ul de un aspect fizic de 577 00:26:55,570 --> 00:26:56,280 hardware-ul. 578 00:26:56,280 --> 00:26:57,110 Ei sunt încă acolo. 579 00:26:57,110 --> 00:26:58,930 E doar computerul are uitat ceea ce sunt. 580 00:26:58,930 --> 00:27:03,160 >> Deci, este eliberat, în esență, dosarul de biți, astfel încât acestea pot fi refolosite. 581 00:27:03,160 --> 00:27:06,940 Dar nu până când veți crea mai multe fișiere, și mai multe fișiere, și mai multe fișiere va 582 00:27:06,940 --> 00:27:12,150 probabilistic, cei 0 si 1, aceste particule magnetice, se reutilizate, 583 00:27:12,150 --> 00:27:16,220 partea susul sau dreapta sus, pentru alte fișiere, 0 si 1. 584 00:27:16,220 --> 00:27:17,980 >> Deci, aveți această fereastră de timp. 585 00:27:17,980 --> 00:27:19,860 Și nu e de previzibil lungime, într-adevăr. 586 00:27:19,860 --> 00:27:22,240 Aceasta depinde de dimensiunea hard dvs. unitate și cât de multe fișiere ai și 587 00:27:22,240 --> 00:27:23,490 cât de repede voi face altele noi. 588 00:27:23,490 --> 00:27:27,050 Dar există această fereastră de timp în care acest dosar este încă perfect 589 00:27:27,050 --> 00:27:27,770 recuperabile. 590 00:27:27,770 --> 00:27:31,050 >> Deci, dacă utilizați vreodată de programe, cum ar fi McAfee sau Norton pentru a încerca să recupereze 591 00:27:31,050 --> 00:27:35,680 de date, tot ce faci este încercarea de a recupera această așa-numita director de 592 00:27:35,680 --> 00:27:37,340 dau seama unde fișierul a fost. 593 00:27:37,340 --> 00:27:40,605 Și uneori Norton și va spune, fișier este de 93% recuperabil. 594 00:27:40,605 --> 00:27:42,020 Ei bine, ce înseamnă asta? 595 00:27:42,020 --> 00:27:45,690 Asta înseamnă că un alt fișier coincidență ajuns cu, să zicem, 596 00:27:45,690 --> 00:27:48,920 aceste biți afara de fișier original. 597 00:27:48,920 --> 00:27:51,950 >> Deci, ceea ce este de fapt implicat în recuperarea de date? 598 00:27:51,950 --> 00:27:55,720 Ei bine, dacă nu ai ceva de genul Norton pre-instalat pe computer, 599 00:27:55,720 --> 00:27:59,510 tot ce se poate face, uneori, este să privim la întreaga unitate de disc în căutarea 600 00:27:59,510 --> 00:28:00,510 tipare de biți. 601 00:28:00,510 --> 00:28:05,350 Și una dintre temele de set de probleme cinci este că vă va căuta 602 00:28:05,350 --> 00:28:09,570 echivalentul a un hard disk, un medico-legale Imaginea unui card Compact Flash de la un 603 00:28:09,570 --> 00:28:13,660 aparat de fotografiat digital, căutarea 0s și 1s ca de obicei, cu mare 604 00:28:13,660 --> 00:28:16,720 probabilitate, reprezintă începe cu o imagine JPEG. 605 00:28:16,720 --> 00:28:21,120 >> Și voi puteți recupera acele imagini de presupunând că, dacă am vedea acest model de 606 00:28:21,120 --> 00:28:24,380 biți pe imagine medico-legale, cu probabilitate mare, care marchează 607 00:28:24,380 --> 00:28:25,650 începutul unei JPEG. 608 00:28:25,650 --> 00:28:29,520 Și dacă văd același model nou, care, probabil, marchează începutul 609 00:28:29,520 --> 00:28:32,440 o altă JPEG, și un alt JPEG, și un alt JPEG. 610 00:28:32,440 --> 00:28:34,970 Și acest lucru este de obicei cum de recuperare de date va funcționa. 611 00:28:34,970 --> 00:28:37,870 Ce e frumos despre JPEG este chiar dacă formatul de fișier în sine este oarecum 612 00:28:37,870 --> 00:28:44,400 complexe, la începutul fiecărui astfel de fisier este de fapt destul de identificat 613 00:28:44,400 --> 00:28:47,370 și simplu, după cum veți vedea, Dacă nu ai deja. 614 00:28:47,370 --> 00:28:50,270 >> Deci, haideți să aruncăm o privire mai atentă sub capota cu privire la exact ceea ce a fost 615 00:28:50,270 --> 00:28:53,360 întâmplă, și ceea ce aceștia 0 si 1 sunt, pentru a vă oferi un pic mai mult de un 616 00:28:53,360 --> 00:28:55,330 Contextul pentru această provocare specială. 617 00:28:55,330 --> 00:28:55,510 >> [Redare video] 618 00:28:55,510 --> 00:28:58,700 >> -În cazul în care PC-ul stochează mai a datelor sale permanente. 619 00:28:58,700 --> 00:29:03,390 Pentru a face acest lucru, datele circula de la RAM împreună cu semnale de software care spun 620 00:29:03,390 --> 00:29:06,110 hard disk cum a stoca aceste date. 621 00:29:06,110 --> 00:29:09,410 Circuitele de hard disk traduce aceste semnale în tensiune 622 00:29:09,410 --> 00:29:10,870 fluctuații. 623 00:29:10,870 --> 00:29:14,970 Acestea, la rândul lor, de control al unității greu părți în mișcare, unele din puținele 624 00:29:14,970 --> 00:29:17,910 piesele mobile rămase în computer modern. 625 00:29:17,910 --> 00:29:22,130 >> Unele dintre semnalele controla un motor care se învârte platane de metal-filmate. 626 00:29:22,130 --> 00:29:25,470 Datele sunt stocate de fapt pe aceste platane. 627 00:29:25,470 --> 00:29:28,610 Alte semnale de a muta citire / scriere capete pentru a citi sau 628 00:29:28,610 --> 00:29:30,710 scrie date pe platane. 629 00:29:30,710 --> 00:29:35,450 Acest utilaje atât de precis ca un om parul nu a putut trece chiar între 630 00:29:35,450 --> 00:29:37,280 capete și platane filare. 631 00:29:37,280 --> 00:29:40,316 Cu toate acestea, totul funcționează la viteze teribil. 632 00:29:40,316 --> 00:29:40,660 >> [END redare video] 633 00:29:40,660 --> 00:29:42,190 >> DAVID MALAN: Zoom într-o mică mai acum la ceea ce este 634 00:29:42,190 --> 00:29:44,360 de fapt, pe aceste platane. 635 00:29:44,360 --> 00:29:44,720 >> [Redare video] 636 00:29:44,720 --> 00:29:47,660 >> -Să ne uităm la ceea ce tocmai am văzut în slow motion. 637 00:29:47,660 --> 00:29:51,710 Când un scurt impuls de energie electrică este trimis la citire / scriere cap, în cazul în care răstoarnă 638 00:29:51,710 --> 00:29:54,650 pe o electromagnetice mic pentru o fracțiune de secundă. 639 00:29:54,650 --> 00:29:58,970 Magnet creează un câmp, care schimbă polaritatea un mic, mic 640 00:29:58,970 --> 00:30:02,850 porțiune din particulele de metal care strat fiecare suprafață platou. 641 00:30:02,850 --> 00:30:05,940 >> O serie de tipar aceste mici, acuzat-up zone de pe disc 642 00:30:05,940 --> 00:30:08,470 reprezintă un singur bit de date în numărul binar 643 00:30:08,470 --> 00:30:10,530 Sistemul utilizat de computere. 644 00:30:10,530 --> 00:30:13,775 Acum, dacă curentul este trimis într-un fel prin scriere / citire cap, zona 645 00:30:13,775 --> 00:30:15,970 este polarizată într-o singură direcție. 646 00:30:15,970 --> 00:30:17,950 Dacă curentul este trimis în direcția opusă, 647 00:30:17,950 --> 00:30:19,930 polarizare este inversat. 648 00:30:19,930 --> 00:30:22,370 >> Cum să obțineți date de pe hard disk? 649 00:30:22,370 --> 00:30:24,090 Doar inversa procesul. 650 00:30:24,090 --> 00:30:26,550 Deci e particulele de pe disc care obține curent în 651 00:30:26,550 --> 00:30:27,960 citire / scriere cap de mișcare. 652 00:30:27,960 --> 00:30:30,700 Pune împreună milioane de astfel de segmente magnetizate, și 653 00:30:30,700 --> 00:30:32,160 ai un fișier. 654 00:30:32,160 --> 00:30:36,060 >> Acum, piesele de un singur fișier poate fi împrăștiate pe o unitate de toate 655 00:30:36,060 --> 00:30:39,970 platane, un fel de mizerie de hârtii de pe birou. 656 00:30:39,970 --> 00:30:43,500 Deci, un fișier suplimentar special ține evidența de unde totul este. 657 00:30:43,500 --> 00:30:45,985 Nu ai vrea să ai ceva de genul asta? 658 00:30:45,985 --> 00:30:46,470 >> [END redare video] 659 00:30:46,470 --> 00:30:47,820 >> DAVID MALAN: OK, nu probabil. 660 00:30:47,820 --> 00:30:52,070 Deci, câți dintre voi a crescut cu astea? 661 00:30:52,070 --> 00:30:53,970 OK, deci e mai puțini mâinile în fiecare an. 662 00:30:53,970 --> 00:30:56,550 Dar mă bucur că ești cel puțin familiar cu ei, pentru că aceasta și propria noastră 663 00:30:56,550 --> 00:31:00,520 carte demo, din păcate, sunt pe moarte o foarte încetini moartea aici de familiaritate. 664 00:31:00,520 --> 00:31:04,010 >> Dar asta este ceea ce eu, cel puțin, înapoi în liceu, utilizarea folosit pentru backup-uri. 665 00:31:04,010 --> 00:31:08,110 Și a fost uimitor, pentru că ar putea stoca 1,4 megaocteți pe 666 00:31:08,110 --> 00:31:08,930 Acest disc. 667 00:31:08,930 --> 00:31:12,260 Și aceasta a fost versiunea de înaltă densitate, așa cum este indicat de către HD, care are 668 00:31:12,260 --> 00:31:14,240 adică înainte de clipuri video de astăzi HD. 669 00:31:14,240 --> 00:31:16,400 >> Densitate standard a fost de 800 kilobytes. 670 00:31:16,400 --> 00:31:18,640 Și înainte de asta, au existat Discuri 400-kilobyte. 671 00:31:18,640 --> 00:31:23,120 Și înainte de aceasta, au existat 5 și 1/4 discuri inch, care au fost cu adevărat floppy, 672 00:31:23,120 --> 00:31:25,680 și un pic mai lat si mai inalt de aceste lucruri aici. 673 00:31:25,680 --> 00:31:29,150 Dar puteți vedea de fapt, așa-numitul aspect floppy din aceste discuri. 674 00:31:29,150 --> 00:31:32,630 >> Și funcțional, de fapt ele sunt destul de similar cu hard disk-uri de la 675 00:31:32,630 --> 00:31:33,570 Cel acest tip. 676 00:31:33,570 --> 00:31:37,270 Din nou, SSD-urile în calculatoare noi de lucru un pic diferit. 677 00:31:37,270 --> 00:31:41,530 Dar, dacă vă deplasați că fila de metal mic, puteți vedea de fapt, un pic de cookie, 678 00:31:41,530 --> 00:31:42,560 sau platou. 679 00:31:42,560 --> 00:31:43,830 >> Nu e de metal ca aceasta. 680 00:31:43,830 --> 00:31:46,000 Asta e de fapt ceva mai ieftin material plastic. 681 00:31:46,000 --> 00:31:46,750 Și puteți fel de wiggle ea. 682 00:31:46,750 --> 00:31:50,310 Și ai trully doar șters unele numărul de biți sau particule magnetice 683 00:31:50,310 --> 00:31:51,220 din acest disc. 684 00:31:51,220 --> 00:31:52,710 >> Deci, din fericire, nu e nimic pe ea. 685 00:31:52,710 --> 00:31:55,790 În cazul în care lucru este în mod - și acoperi ochii și cele ale aproapelui tău - 686 00:31:55,790 --> 00:31:58,865 puteți doar un fel de tragere acest tot de pe teaca de genul asta. 687 00:31:58,865 --> 00:32:01,900 Dar există un pic de primăvară, așa să fie conștient de faptul că, cu ochii tăi. 688 00:32:01,900 --> 00:32:03,620 Deci, acum ai cu adevărat o dischetă. 689 00:32:03,620 --> 00:32:07,090 >> Si ceea ce este remarcabil despre acest este că în măsura în care acest lucru este un 690 00:32:07,090 --> 00:32:10,830 reprezentare la scară mică de o mai mare hard disk, aceste lucruri sunt foarte, 691 00:32:10,830 --> 00:32:11,590 super-simplu. 692 00:32:11,590 --> 00:32:15,170 Dacă vă prindeți în partea de jos a acestuia, acum că chestia aia de metal e oprit, și coaja 693 00:32:15,170 --> 00:32:20,990 le deschide, tot ce este este de două bucăți de simțit și așa-numitul dischetă 694 00:32:20,990 --> 00:32:22,930 cu o bucată de metal pe interior. 695 00:32:22,930 --> 00:32:25,990 >> Și acolo se duce jumătate din Conținutul disc meu. 696 00:32:25,990 --> 00:32:27,540 Nu trece o jumătate de ele. 697 00:32:27,540 --> 00:32:31,375 Dar asta e tot ce a fost filare în interiorul a computerului în odinioară. 698 00:32:31,375 --> 00:32:35,220 699 00:32:35,220 --> 00:32:38,310 >> Și din nou, pentru a pune acest lucru în perspectivă, cât de mare este de cele mai multe dvs. 700 00:32:38,310 --> 00:32:39,560 hard disk-uri in aceste zile? 701 00:32:39,560 --> 00:32:41,960 702 00:32:41,960 --> 00:32:46,230 500 GB, un terabyte, poate în un computer desktop, 2 terabytes, 3 703 00:32:46,230 --> 00:32:47,630 terabytes, 4 terabytes, nu? 704 00:32:47,630 --> 00:32:52,480 Acesta este un megabyte, da sau de a lua, care nu pot potrivi chiar un MP3 tipic 705 00:32:52,480 --> 00:32:55,310 anymore aceste zile, sau unele fișier de muzică similară. 706 00:32:55,310 --> 00:32:59,500 >> Deci, un mic suvenir pentru tine azi, și De asemenea, pentru a ajuta contextualiza ceea ce 707 00:32:59,500 --> 00:33:03,570 vom fi luați de la sine acum în problema stabilit cinci. 708 00:33:03,570 --> 00:33:04,820 Deci, acestea sunt a ta de a păstra. 709 00:33:04,820 --> 00:33:07,340 710 00:33:07,340 --> 00:33:13,370 Deci, lasă-mă să tranziția la care va fi cheltuielile PSET următoare, de asemenea. 711 00:33:13,370 --> 00:33:18,470 Deci, ne-am stabilit acum aceasta pagina pentru - Oh, o pereche de anunțuri rapid. 712 00:33:18,470 --> 00:33:21,730 >> Acest vineri, în cazul în care doriți alătura CS50 pentru masa de prânz, du-te la locul obișnuit, 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp. 714 00:33:23,610 --> 00:33:25,100 Și proiectul final - 715 00:33:25,100 --> 00:33:28,520 astfel încât pe programa, am postat caietul de sarcini finală a proiectului deja. 716 00:33:28,520 --> 00:33:31,410 Dau seama că asta nu înseamnă că este din cauza deosebit de curând. 717 00:33:31,410 --> 00:33:33,990 Este scris, într-adevăr, doar pentru a obține voi mă gândesc la asta. 718 00:33:33,990 --> 00:33:37,620 Și într-adevăr, un important super- procentul va fi abordarea 719 00:33:37,620 --> 00:33:40,780 Proiectele finale privind materialele pe care le chiar nu au ajuns la clasă, 720 00:33:40,780 --> 00:33:42,730 dar va cat mai devreme saptamana viitoare. 721 00:33:42,730 --> 00:33:45,530 >> Observati, totusi, ca spec. cere câteva componente diferite ale 722 00:33:45,530 --> 00:33:46,190 proiectul final. 723 00:33:46,190 --> 00:33:49,590 Primul, în câteva săptămâni, este un pre-propunere, un e-mail destul de casual la 724 00:33:49,590 --> 00:33:52,760 TF dumneavoastră să-i spui sau ce esti gândit de proiect, cu 725 00:33:52,760 --> 00:33:53,650 nici un angajament. 726 00:33:53,650 --> 00:33:56,710 Propunerea va fi deosebit dvs. angajament, spunând, aici, aceasta este ceea ce 727 00:33:56,710 --> 00:33:57,770 Aș vrea să fac pentru proiectul meu. 728 00:33:57,770 --> 00:33:58,250 Ce crezi? 729 00:33:58,250 --> 00:33:58,650 Prea mare? 730 00:33:58,650 --> 00:33:59,145 Prea mic? 731 00:33:59,145 --> 00:34:00,330 Este ușor de gestionat? 732 00:34:00,330 --> 00:34:02,230 Și veți vedea spec. pentru mai multe detalii. 733 00:34:02,230 --> 00:34:05,060 >> Câteva săptămâni, după care este statutul Raportul, care este un fel de 734 00:34:05,060 --> 00:34:08,260 e-mail casual la TF pentru a spune cât de în urmă sunteți în finala 735 00:34:08,260 --> 00:34:12,360 implementarea proiectului, urmat de CS50 Hackathon la care toată lumea 736 00:34:12,360 --> 00:34:17,520 Este invitat, care va fi un eveniment de 20:00 pe de o seara pana 07:00 737 00:34:17,520 --> 00:34:19,150 AM în dimineața următoare. 738 00:34:19,150 --> 00:34:22,560 Pizza, așa cum poate am menționat în săptămână la zero, Wil fi servit la 09:00, 739 00:34:22,560 --> 00:34:24,120 Mancarea chinezeasca la 01:00. 740 00:34:24,120 --> 00:34:27,929 Și dacă sunteți încă treaz la 5:00, am să te duc la IHOP pentru micul dejun. 741 00:34:27,929 --> 00:34:31,310 >> Deci Hackathon este unul dintre mai experiențe memorabile din clasa. 742 00:34:31,310 --> 00:34:35,290 Apoi punerea în aplicare este datorată, și atunci culminant CS50 Fair. 743 00:34:35,290 --> 00:34:38,070 Mai multe detalii despre toate acestea în următoarele săptămâni. 744 00:34:38,070 --> 00:34:40,739 >> Dar să ne întoarcem la ceva scoala veche - 745 00:34:40,739 --> 00:34:41,920 din nou, o matrice. 746 00:34:41,920 --> 00:34:45,040 Deci, o matrice a fost frumos, pentru că rezolvă probleme cum ar fi am văzut doar o 747 00:34:45,040 --> 00:34:49,290 Momentul în urmă cu structurile studențești a obține un pic de sub control, dacă ne 748 00:34:49,290 --> 00:34:52,405 doresc să aibă un elev, student doi, elev trei, student dot dot dot, 749 00:34:52,405 --> 00:34:54,400 un numar arbitrar de studenți. 750 00:34:54,400 --> 00:34:58,850 >> Deci, tablouri, în urmă cu câteva săptămâni, năpustit în și rezolvat toate problemele noastre de a nu 751 00:34:58,850 --> 00:35:03,340 cunoașterea în avans cât de multe lucruri de un anumit tip ne-ar putea dori. 752 00:35:03,340 --> 00:35:07,390 Și am văzut că structs ne poate ajuta organiza în continuare codul nostru și să păstreze 753 00:35:07,390 --> 00:35:11,660 variabile conceptual similare, cum ar fi o nume și o casă, împreună, astfel încât să putem 754 00:35:11,660 --> 00:35:15,570 le poate trata ca o singură entitate, în interiorul din care există bucăți mai mici. 755 00:35:15,570 --> 00:35:17,810 >> Dar tablouri au unele dezavantaje. 756 00:35:17,810 --> 00:35:19,780 Care sunt unele dintre dezavantajele ne-am întâlnit 757 00:35:19,780 --> 00:35:22,320 cu matrice până acum? 758 00:35:22,320 --> 00:35:23,450 Ce-i asta? 759 00:35:23,450 --> 00:35:28,130 Dimensiune fixă ​​- Deci, chiar dacă s-ar putea putea aloca memorie pentru o 760 00:35:28,130 --> 00:35:32,310 matrice, odată ce știi câți studenți aveți, câte caractere ai 761 00:35:32,310 --> 00:35:35,460 de utilizator, odată ce ați alocat matrice, ai un fel de pictat 762 00:35:35,460 --> 00:35:36,740 te într-un colț. 763 00:35:36,740 --> 00:35:40,600 >> Pentru că nu puteți introduce elemente noi în mijlocul unei matrice. 764 00:35:40,600 --> 00:35:43,660 Nu puteți introduce mai multe elemente la sfârșitul unei matrice. 765 00:35:43,660 --> 00:35:47,750 Într-adevăr, va trebui să recurgă la crearea unui matrice cu totul nouă, așa cum am discutat, 766 00:35:47,750 --> 00:35:49,320 copierea vechi în noua. 767 00:35:49,320 --> 00:35:52,610 Și din nou, că este durere de cap care Getstring oferte cu pentru tine. 768 00:35:52,610 --> 00:35:56,170 >> Dar, din nou, nu poți nici măcar introduce ceva în mijlocul matrice 769 00:35:56,170 --> 00:35:58,200 dacă rata nu este umplut în întregime. 770 00:35:58,200 --> 00:36:03,010 De exemplu, în cazul în care această matrice aici de mărime șase are doar cinci lucruri în ea, 771 00:36:03,010 --> 00:36:06,080 Ei bine, ai putea doar tac ceva pe final. 772 00:36:06,080 --> 00:36:08,200 Dar ce se întâmplă dacă doriți să inserați ceva în mijlocul 773 00:36:08,200 --> 00:36:11,280 matrice, chiar dacă aceasta ar putea avea cinci din șase lucrurile din ea? 774 00:36:11,280 --> 00:36:14,250 >> Ei bine, ce am făcut atunci când am avut toți de voluntari noastre umane pe scena in 775 00:36:14,250 --> 00:36:15,110 ultimele saptamani? 776 00:36:15,110 --> 00:36:18,710 Dacă am vrut să pun pe cineva aici, fie acești oameni cum să se miște această 777 00:36:18,710 --> 00:36:22,540 fel, sau acești oameni cum să se miște această mod, și care a devenit costisitoare. 778 00:36:22,540 --> 00:36:26,950 Deplasarea de oameni în interiorul unui matrice ajuns însumarea și costurilor 779 00:36:26,950 --> 00:36:31,240 ne timp, prin urmare, mult pătrat noastre n execută ori ca un fel de inserție, pentru 780 00:36:31,240 --> 00:36:32,550 exemplu, în cel mai rău caz. 781 00:36:32,550 --> 00:36:36,520 Deci, tablouri sunt mari, dar trebuie să știe în avans cât de mare le doriți. 782 00:36:36,520 --> 00:36:38,030 >> Deci OK, aici este o soluție. 783 00:36:38,030 --> 00:36:43,860 Dacă nu știe în avans cât de multe elevii ar putea să am, și eu știu o dată 784 00:36:43,860 --> 00:36:47,870 Eu decid, totuși, am ramas cu care mulți studenți, de ce nu am mereu 785 00:36:47,870 --> 00:36:51,740 alocarea de doua ori la fel de mult spațiu cum am putea crede că am nevoie? 786 00:36:51,740 --> 00:36:54,450 Este că nu o soluție rezonabilă? 787 00:36:54,450 --> 00:36:58,240 >> Realist, nu cred că suntem avea nevoie de mai mult de 50 de sloturi 788 00:36:58,240 --> 00:37:02,190 într-o matrice pentru o clasă de dimensiuni medii, asa ca hai sa rotunji doar în sus. 789 00:37:02,190 --> 00:37:07,040 Voi face 100 de sloturi în matrice mea, doar astfel încât să putem ajunge cu siguranta 790 00:37:07,040 --> 00:37:10,330 numărul de studenți mă aștept să fie într-o clasă de dimensiuni medii. 791 00:37:10,330 --> 00:37:14,320 Deci, de ce nu rotunji doar în sus și să aloce mai multă memorie, de obicei, pentru un vector 792 00:37:14,320 --> 00:37:16,290 decât credeți că ați putea chiar nevoie? 793 00:37:16,290 --> 00:37:20,190 Ce-i asta pushback simplu a venit ideea asta? 794 00:37:20,190 --> 00:37:21,440 >> Doar risipiți memorie. 795 00:37:21,440 --> 00:37:25,350 Literalmente fiecare program pe care scrie, atunci este, poate, folosind de două ori la fel de mult de memorie 796 00:37:25,350 --> 00:37:26,680 ai de fapt nevoie. 797 00:37:26,680 --> 00:37:28,990 Și că pur și simplu nu se simte ca o în special soluție elegantă. 798 00:37:28,990 --> 00:37:31,990 Mai mult decât atât, doar scade probabilitatea ca o problemă. 799 00:37:31,990 --> 00:37:35,300 Dacă se întâmplă pentru a avea un curs populare un semestru și aveți 101 800 00:37:35,300 --> 00:37:39,610 elevi, programul este încă cu care se confruntă în mod fundamental aceeași problemă. 801 00:37:39,610 --> 00:37:44,280 >> Deci, din fericire, există o soluție pentru acest anunt toate problemele noastre în formă 802 00:37:44,280 --> 00:37:46,790 de structuri de date, care sunt mai complexe decât cele 803 00:37:46,790 --> 00:37:47,970 am văzut până acum. 804 00:37:47,970 --> 00:37:50,530 Acest lucru, eu susțin, este o listă de legat. 805 00:37:50,530 --> 00:37:51,920 Aceasta este o listă de numere - 806 00:37:51,920 --> 00:37:54,970 9, 17, 22, 26, și 34 - 807 00:37:54,970 --> 00:38:00,120 care au fost legate între ele prin intermediul din ceea ce am desenat ca taste. 808 00:38:00,120 --> 00:38:03,580 >> Cu alte cuvinte, dacă am vrut să reprezinte o matrice, am putea face 809 00:38:03,580 --> 00:38:04,910 ceva de genul asta. 810 00:38:04,910 --> 00:38:07,310 Și îl voi pune pe tavan într-o clipă. 811 00:38:07,310 --> 00:38:09,970 Am putea face - 812 00:38:09,970 --> 00:38:12,520 Bună ziua, bine. 813 00:38:12,520 --> 00:38:14,470 Stand by. 814 00:38:14,470 --> 00:38:17,360 Computer nou aici, clar - 815 00:38:17,360 --> 00:38:18,090 În regulă. 816 00:38:18,090 --> 00:38:21,730 >> Deci, dacă am aceste numere în matrice - 817 00:38:21,730 --> 00:38:28,880 9, 17, 22, 26, 24 - 818 00:38:28,880 --> 00:38:30,530 nu neapărat la scară. 819 00:38:30,530 --> 00:38:33,730 Bine, deci aici este matrice mea - 820 00:38:33,730 --> 00:38:34,980 Oh, Doamne. 821 00:38:34,980 --> 00:38:38,700 822 00:38:38,700 --> 00:38:40,395 Bine, deci aici este matrice mea. 823 00:38:40,395 --> 00:38:44,110 824 00:38:44,110 --> 00:38:45,050 Oh, Doamne. 825 00:38:45,050 --> 00:38:48,820 >> [Râsete] 826 00:38:48,820 --> 00:38:49,440 >> DAVID MALAN: Simularea. 827 00:38:49,440 --> 00:38:52,330 E prea mult efort pentru a merge înapoi și repara că, așa că - 828 00:38:52,330 --> 00:38:54,290 26. 829 00:38:54,290 --> 00:38:57,650 Deci avem această serie de 9, 17, 22, 26, și 34. 830 00:38:57,650 --> 00:39:00,260 Pentru cei dintre voi poate vedea greșeală jenant am făcut, 831 00:39:00,260 --> 00:39:00,830 acolo este. 832 00:39:00,830 --> 00:39:04,490 >> Deci, eu spun că aceasta este o soluție foarte eficientă. 833 00:39:04,490 --> 00:39:07,310 Am alocat cât mai multe int fi Am nevoie - unul, doi, trei, 834 00:39:07,310 --> 00:39:09,100 patru, cinci, sau șase - 835 00:39:09,100 --> 00:39:11,660 și am apoi stocate numerele în interiorul acestui tablou. 836 00:39:11,660 --> 00:39:15,220 Dar să presupunem, atunci, vreau să introduceți o valoare cum ar fi numărul 8? 837 00:39:15,220 --> 00:39:16,100 Ei bine, unde se duc? 838 00:39:16,100 --> 00:39:18,530 Să presupunem că doriți să inserați o serie cum ar fi 20. 839 00:39:18,530 --> 00:39:19,790 Ei bine, unde se duc? 840 00:39:19,790 --> 00:39:23,160 Undeva la mijloc, sau numărul 35 trebuie să meargă 841 00:39:23,160 --> 00:39:24,010 undeva la sfârșitul anului. 842 00:39:24,010 --> 00:39:25,320 Dar sunt toate de spațiu. 843 00:39:25,320 --> 00:39:29,120 >> Și deci aceasta este o provocare fundamentală de matrice care nu sunt soluția. 844 00:39:29,120 --> 00:39:32,280 Am susținut un moment în urmă, getstring rezolvă această problemă. 845 00:39:32,280 --> 00:39:37,380 Dacă doriți să introduceți un număr de al șaselea în această matrice, ceea ce este cel puțin unul 846 00:39:37,380 --> 00:39:40,090 Soluția poate cădea din nou pe de sigur, la fel cum facem cu getstring? 847 00:39:40,090 --> 00:39:44,340 848 00:39:44,340 --> 00:39:46,030 Ce-i asta? 849 00:39:46,030 --> 00:39:48,190 >> Ei bine, să-l mai mare este mai ușor de zis decât de făcut. 850 00:39:48,190 --> 00:39:52,810 Noi nu putem face neapărat matrice mai mare, dar ce putem face? 851 00:39:52,810 --> 00:39:56,570 Face o matrice nou, care e mai mare, de mărimea 6, sau, poate, dimensiune 10, dacă vrem 852 00:39:56,570 --> 00:40:00,490 pentru a merge mai departe de lucruri, și apoi copiați matrice vechi în noua, iar apoi 853 00:40:00,490 --> 00:40:01,680 elibera matrice vechi. 854 00:40:01,680 --> 00:40:05,770 >> Dar ceea ce este timpul de funcționare acum de acest proces? 855 00:40:05,770 --> 00:40:09,870 E mare O, de n, deoarece copierea se va costa unele unități de 856 00:40:09,870 --> 00:40:13,480 timp, deci nu atât de perfect, dacă avem de a aloca o matrice nou, care se va 857 00:40:13,480 --> 00:40:15,610 să consume mai mult de doua ori memorie temporar. 858 00:40:15,610 --> 00:40:16,660 Copiați vechi în noi - 859 00:40:16,660 --> 00:40:18,800 Adică, e doar o durere de cap, care este, din nou, de ce am scris 860 00:40:18,800 --> 00:40:19,920 Getstring pentru tine. 861 00:40:19,920 --> 00:40:21,380 >> Deci, ce am putea face în schimb? 862 00:40:21,380 --> 00:40:25,000 Ei bine, ce dacă structura noastră de date de fapt, are lacune în ea? 863 00:40:25,000 --> 00:40:30,790 Să presupunem că am relaxa scopul meu de a avea bucăți adiacente de memorie, unde 9 864 00:40:30,790 --> 00:40:34,500 este chiar lângă 17, care este în imediata vecinătate a 22, și așa mai departe. 865 00:40:34,500 --> 00:40:39,570 >> Și să presupunem că 9 poate fi aici în RAM, și 17 pot fi aici în RAM, 866 00:40:39,570 --> 00:40:40,990 și 22 pot fi aici în RAM. 867 00:40:40,990 --> 00:40:43,610 Cu alte cuvinte, nu am nevoie de ele Chiar și la mai înapoi. 868 00:40:43,610 --> 00:40:47,850 Trebuie doar să firul cumva un ac prin fiecare din aceste numere, sau fiecare 869 00:40:47,850 --> 00:40:51,010 din aceste noduri, așa cum vom numi dreptunghiuri așa cum le-am trase, la 870 00:40:51,010 --> 00:40:55,670 amintiți-vă cum să ajungi la ultimul astfel nod din prima. 871 00:40:55,670 --> 00:40:59,940 >> Deci, ceea ce este construcția de programare am vazut destul de recent, cu care am 872 00:40:59,940 --> 00:41:03,030 poate pune în aplicare acest fir, sau trase aici, cu care pot 873 00:41:03,030 --> 00:41:05,430 pună în aplicare aceste săgeți? 874 00:41:05,430 --> 00:41:06,500 Deci indicii, nu? 875 00:41:06,500 --> 00:41:09,560 Dacă nu aloca doar o Int, dar un nod - și prin 876 00:41:09,560 --> 00:41:10,810 nod, vreau să spun doar recipient. 877 00:41:10,810 --> 00:41:12,900 Și vizual, vreau să spun un dreptunghi. 878 00:41:12,900 --> 00:41:16,420 Deci, un nod aparent are nevoie de să conțină două valori - 879 00:41:16,420 --> 00:41:21,490 Int în sine, și apoi, după cum implicate de jumătatea de jos a dreptunghiului, 880 00:41:21,490 --> 00:41:23,010 spațiu suficient pentru un întreg. 881 00:41:23,010 --> 00:41:26,130 >> Deci gândesc la viitor aici, cât de mare este acest nod, această 882 00:41:26,130 --> 00:41:27,170 containerul în cauză? 883 00:41:27,170 --> 00:41:29,250 Câte bytes pentru int? 884 00:41:29,250 --> 00:41:31,310 Probabil 4, dacă e aceeași ca de obicei. 885 00:41:31,310 --> 00:41:33,270 Și atunci cum de multe bytes pentru indicatorul? 886 00:41:33,270 --> 00:41:33,650 4. 887 00:41:33,650 --> 00:41:37,940 Deci acest container, sau acest nod, este va fi o structură 8-byte. 888 00:41:37,940 --> 00:41:41,760 Oh, și că este o coincidență fericită că am introdus doar această noțiune de 889 00:41:41,760 --> 00:41:44,400 unei structuri, sau o structură C. 890 00:41:44,400 --> 00:41:48,890 >> Deci, eu pretind că vreau să fac un pas față de această mai sofisticate 891 00:41:48,890 --> 00:41:52,560 punerea în aplicare a unei liste de numere, un Lista legate de numere, am nevoie pentru a face o 892 00:41:52,560 --> 00:41:56,920 puțin mai mult de gândire în față și declare nu doar un int, dar o struct 893 00:41:56,920 --> 00:41:58,620 pe care o voi numi, convențional aici, nodul. 894 00:41:58,620 --> 00:42:01,630 Am putea spune orice vrem, dar nod va fi tematic într-o mulțime 895 00:42:01,630 --> 00:42:03,560 din lucrurile pe care le începe căutarea de la acum. 896 00:42:03,560 --> 00:42:06,480 >> În interiorul acestui nod este un n int. 897 00:42:06,480 --> 00:42:09,350 Și apoi această sintaxă, un pic ciudat la prima vedere - 898 00:42:09,350 --> 00:42:12,960 struct nod * viitor. 899 00:42:12,960 --> 00:42:16,900 Ei bine pictural, ce e asta? 900 00:42:16,900 --> 00:42:21,000 Că este jumătatea de jos a dreptunghiul pe care am văzut- 901 00:42:21,000 --> 00:42:22,730 doar o clipă în urmă. 902 00:42:22,730 --> 00:42:27,600 >> Dar ce spun struct nod * spre deosebire de doar nod *? 903 00:42:27,600 --> 00:42:31,370 Pentru că în cazul în care indicatorul este îndreptat la un alt nod, e doar 904 00:42:31,370 --> 00:42:32,760 adresa unui nod. 905 00:42:32,760 --> 00:42:35,630 Aceasta este în concordanță cu ceea ce am discutat despre indicii până acum. 906 00:42:35,630 --> 00:42:39,690 Dar de ce, dacă mă susțin această structură este numit nod, nu am să spun struct 907 00:42:39,690 --> 00:42:42,660 nod în interiorul aici? 908 00:42:42,660 --> 00:42:43,190 >> Exact. 909 00:42:43,190 --> 00:42:46,490 Este un fel de realitate stupid de C. Typedef, ca să spunem așa, nu are 910 00:42:46,490 --> 00:42:47,220 sa întâmplat încă. 911 00:42:47,220 --> 00:42:48,510 C este foarte literal. 912 00:42:48,510 --> 00:42:51,050 Se citește de sus codul de partea de jos, de la stânga la dreapta. 913 00:42:51,050 --> 00:42:54,930 Și până când se lovește ca punct și virgulă pe linia de jos, ghici ce nu 914 00:42:54,930 --> 00:42:57,590 exista ca un tip de date? 915 00:42:57,590 --> 00:42:59,060 Nod, nodul încheiat citatul citat. 916 00:42:59,060 --> 00:43:03,050 >> Dar, din cauza Mai detaliat Declarația am făcut pe prima linie - 917 00:43:03,050 --> 00:43:05,340 nod typedef struct - 918 00:43:05,340 --> 00:43:08,790 pentru că a venit în primul rând, înainte acolade, care e un fel de 919 00:43:08,790 --> 00:43:11,800 pre-educarea răsune asta, Știi ce, dă-mi un struct 920 00:43:11,800 --> 00:43:13,570 numit nod struct. 921 00:43:13,570 --> 00:43:16,270 Sincer, nu-mi place de asteptare lucruri struct nod, nod struct toate 922 00:43:16,270 --> 00:43:17,090 de-a lungul codul meu. 923 00:43:17,090 --> 00:43:20,660 Dar voi folosi doar o singură dată, doar în interiorul, astfel încât să pot în mod eficient 924 00:43:20,660 --> 00:43:25,010 a crea un fel de referința circulară, nu un pointer la mine în sine, ci un 925 00:43:25,010 --> 00:43:29,400 pointer la o alta un tip identic. 926 00:43:29,400 --> 00:43:32,330 >> Deci, se dovedește că pe o structură de date ca aceasta, există câteva 927 00:43:32,330 --> 00:43:34,470 operațiunile care ar putea fi de interes pentru noi. 928 00:43:34,470 --> 00:43:37,460 S-ar putea dori pentru a insera într-o listă ca aceasta. 929 00:43:37,460 --> 00:43:39,850 S-ar putea doriți să ștergeți dintr-o listă ca aceasta. 930 00:43:39,850 --> 00:43:43,490 S-ar putea dori să caute pe lista pentru o valoare, sau mai general, traverse. 931 00:43:43,490 --> 00:43:46,410 Și de traversare este doar un mod fantezist de a spunând încep de la stânga și muta toate 932 00:43:46,410 --> 00:43:47,650 drumul spre dreapta. 933 00:43:47,650 --> 00:43:52,640 >> Și observați, chiar și cu acest ușor mai structura de date sofisticată, să 934 00:43:52,640 --> 00:43:56,510 mi propun pe care le pot imprumuta o parte din ideile din ultimele două săptămâni și 935 00:43:56,510 --> 00:43:58,410 pună în aplicare o funcție numită căutare cum ar fi aceasta. 936 00:43:58,410 --> 00:44:01,360 Se va întoarce adevărat sau fals, indicând, da sau 937 00:44:01,360 --> 00:44:03,390 Nu, n este in lista. 938 00:44:03,390 --> 00:44:05,960 Al doilea argument este un pointer la lista în sine, astfel încât o 939 00:44:05,960 --> 00:44:07,920 pointer la un nod. 940 00:44:07,920 --> 00:44:10,350 >> Tot ce am de gând să faci, atunci este declară o variabilă temporar. 941 00:44:10,350 --> 00:44:12,730 O vom numi ptr prin convenție, pentru indicatorul. 942 00:44:12,730 --> 00:44:15,220 Și am atribui egal cu începutul listei. 943 00:44:15,220 --> 00:44:16,680 >> Si observa acum bucla în timp ce. 944 00:44:16,680 --> 00:44:20,640 Atât timp cât indicatorul nu este egal la null, am de gând să verifice. 945 00:44:20,640 --> 00:44:24,520 Este săgeată indicatorul n egal cu n care a fost trecut în? 946 00:44:24,520 --> 00:44:26,410 Și așteptați un minut - nou bucată de sintaxă. 947 00:44:26,410 --> 00:44:29,324 Ce este săgeata toate dintr-o dată? 948 00:44:29,324 --> 00:44:30,574 Da? 949 00:44:30,574 --> 00:44:34,200 950 00:44:34,200 --> 00:44:34,810 >> Exact. 951 00:44:34,810 --> 00:44:38,860 Deci, în timp ce câteva minute în urmă, am folosit notația punct de acces ceva 952 00:44:38,860 --> 00:44:43,080 în interiorul unei struct, dacă variabila ați nu este struct 953 00:44:43,080 --> 00:44:47,420 în sine, ci un pointer la o struct, Din fericire, o bucată de sintaxă care 954 00:44:47,420 --> 00:44:48,620 în cele din urmă are sens intuitiv. 955 00:44:48,620 --> 00:44:52,360 Săgeata înseamnă să urmeze indicatorul, ca săgețile noastre înseamnă de obicei 956 00:44:52,360 --> 00:44:56,570 pictural, și du-te la câmp de date în interior. 957 00:44:56,570 --> 00:44:59,700 Deci, săgeata este același lucru ca punct, dar să-l utilizați atunci când aveți un pointer. 958 00:44:59,700 --> 00:45:05,270 >> Deci, doar pentru recapitulare, apoi, în cazul în care câmpul n interiorul struct numit indicatorul 959 00:45:05,270 --> 00:45:07,760 egal este egal cu n, return true. 960 00:45:07,760 --> 00:45:11,970 În caz contrar, aceasta linie de aici - indicatorul este egal cu indicatorul următor. 961 00:45:11,970 --> 00:45:17,540 Deci, despre ce se face, preaviz, este dacă am Sunt în prezent, arătând la struct 962 00:45:17,540 --> 00:45:21,430 conținând 9, iar 9 nu este numărul Caut - Presupun Caut 963 00:45:21,430 --> 00:45:22,830 pentru n este egal cu 50 - 964 00:45:22,830 --> 00:45:25,930 Am de gând să actualizeze indicatorul mea temporar nu la punctul de la acest nod 965 00:45:25,930 --> 00:45:31,190 mai, dar indicatorul săgeata de lângă, care este de gând să mă pun aici sus. 966 00:45:31,190 --> 00:45:34,270 >> Acum, am realizat este un vârtej de vânt introducere. 967 00:45:34,270 --> 00:45:37,380 Miercuri, vom face de fapt acest lucru cu niște oameni și cu ceva mai mult 968 00:45:37,380 --> 00:45:38,900 cod într-un ritm mai lent. 969 00:45:38,900 --> 00:45:42,990 Dar dau seama, facem acum datele noastre structuri mai complexe, astfel încât nostru 970 00:45:42,990 --> 00:45:45,780 algoritmi pot obține mai eficiente, care va fi necesară pentru 971 00:45:45,780 --> 00:45:50,500 PSET șase, când am încărca în, din nou, cei 150.000 de cuvinte, dar trebuie să facă acest lucru 972 00:45:50,500 --> 00:45:55,650 eficient, și în mod ideal, creează un program care ruleaza pentru utilizatorii noștri nu în 973 00:45:55,650 --> 00:46:00,460 liniar, nu în n pătrat, dar în constanta de timp, în idealul. 974 00:46:00,460 --> 00:46:02,300 >> Ne vedem miercuri. 975 00:46:02,300 --> 00:46:07,240 >> Difuzor: La CS50 următoare, David uită cazul lui de bază. 976 00:46:07,240 --> 00:46:12,770 >> DAVID MALAN: Și asta e cum ai trimite mesaje text cu C. Care - 977 00:46:12,770 --> 00:46:14,020 >> [Mesaj text DIVERSE Sunetele de notificare] 978 00:46:14,020 --> 00:46:19,734