1 00:00:00,000 --> 00:00:00,940 2 00:00:00,940 --> 00:00:05,440 >> [MUSIC JOC] 3 00:00:05,440 --> 00:00:11,577 4 00:00:11,577 --> 00:00:12,660 David J. MALAN: Bine. 5 00:00:12,660 --> 00:00:15,590 Acest lucru este CS50, iar această este începutul de săptămână două. 6 00:00:15,590 --> 00:00:19,120 Așa că haideți să ne începem astăzi cu un bug. 7 00:00:19,120 --> 00:00:20,974 Un bug, desigur, este un greșeală într-un program, 8 00:00:20,974 --> 00:00:22,890 și veți obține foarte familiarizat cu acest concept 9 00:00:22,890 --> 00:00:26,050 dacă nu ați programat înainte. pset0 și acum pset1. 10 00:00:26,050 --> 00:00:29,280 Dar să ia în considerare ceva un pic de simplu la început. 11 00:00:29,280 --> 00:00:32,189 Acest program aici că am aruncat împreună în avans, 12 00:00:32,189 --> 00:00:37,280 și eu susțin că acest lucru ar trebui să imprime 10 stele de pe ecran folosind printf, 13 00:00:37,280 --> 00:00:41,020 dar se pare buggy într-un fel. 14 00:00:41,020 --> 00:00:45,370 >> Având în vedere că caietul de sarcini care ar trebui să imprime 10 de stele, 15 00:00:45,370 --> 00:00:50,230 dar ea nu pare ce ai pretinde este bug-ul? 16 00:00:50,230 --> 00:00:52,004 Da? 17 00:00:52,004 --> 00:00:54,420 Deci, este un off de o eroare, și ce vrei să spui cu asta? 18 00:00:54,420 --> 00:01:00,991 19 00:01:00,991 --> 00:01:01,490 OK. 20 00:01:01,490 --> 00:01:09,820 21 00:01:09,820 --> 00:01:10,410 Excelent. 22 00:01:10,410 --> 00:01:13,930 Așa că ne-am specificat un începe o valoare de zero, pentru i, 23 00:01:13,930 --> 00:01:18,399 și am specificat o valoare n de 10, dar ne-am folosit mai mic sau egal cu. 24 00:01:18,399 --> 00:01:21,190 Și motivul pentru care acest lucru este de două caractere și nu doar un simbol, 25 00:01:21,190 --> 00:01:22,630 ca într-o carte de matematică, este că nu aveți 26 00:01:22,630 --> 00:01:24,880 un mod de exprimare a un caracter echivalent. 27 00:01:24,880 --> 00:01:28,450 >> Asta înseamnă că mai puțin de dar dacă începe numărarea de la zero, 28 00:01:28,450 --> 00:01:31,690 dar voi conta tot drumul în sus prin și egal cu 10, 29 00:01:31,690 --> 00:01:34,170 tu ești, desigur, va 11 lucruri conta în total. 30 00:01:34,170 --> 00:01:35,900 Și așa ai de gând să imprimați de 11 stele. 31 00:01:35,900 --> 00:01:37,990 Deci, ceea ce ar putea fi un remediu pentru asta? 32 00:01:37,990 --> 00:01:39,970 Da? 33 00:01:39,970 --> 00:01:43,980 >> Deci, doar ajusta mai puțin decât sau egal să fie doar mai puțin, 34 00:01:43,980 --> 00:01:46,250 și nu există, eu susțin, poate o altă soluție, de asemenea. 35 00:01:46,250 --> 00:01:47,210 Ce s-ar putea mai faci? 36 00:01:47,210 --> 00:01:48,590 Da? 37 00:01:48,590 --> 00:01:53,660 >> Deci, începe egalând-o 1, și lăsa mai mică sau egală cu. 38 00:01:53,660 --> 00:01:56,187 Si sincer mi-ar pretinde ca, pentru un om tipic 39 00:01:56,187 --> 00:01:57,770 aceasta este, probabil, mult mai simplu. 40 00:01:57,770 --> 00:02:00,280 Incepe sa numeri de la 1 și conta în sus prin 10. 41 00:02:00,280 --> 00:02:01,690 În esență, face ce vrei să spui. 42 00:02:01,690 --> 00:02:04,010 >> Dar realitatea este în de programare, așa cum am văzut, 43 00:02:04,010 --> 00:02:07,598 oamenii de stiinta de calculator și programatori în general, se începe numărarea de la zero. 44 00:02:07,598 --> 00:02:09,389 Și așa că e bine odată te obișnuiești cu el. 45 00:02:09,389 --> 00:02:12,640 Starea ta va în general fi ceva de genul mai puțin. 46 00:02:12,640 --> 00:02:14,910 Deci, pur și simplu o logică eroare pe care am putea acum 47 00:02:14,910 --> 00:02:17,990 stabili și în cele din urmă recompilați aceasta și să obțină doar 10. 48 00:02:17,990 --> 00:02:19,610 >> Ei bine, ce zici de asta bug aici? 49 00:02:19,610 --> 00:02:24,200 Aici, din nou, eu pretind că am un obiectiv de imprimare 10 stars-- 50 00:02:24,200 --> 00:02:28,140 unul pe fiecare linie de data asta, dar nu o face. 51 00:02:28,140 --> 00:02:30,940 Înainte de a propune ceea ce fix este, ceea ce face acest lucru 52 00:02:30,940 --> 00:02:34,640 imprima vizual dacă ar fi să compila și rula acest program crezi? 53 00:02:34,640 --> 00:02:35,140 Da? 54 00:02:35,140 --> 00:02:38,360 55 00:02:38,360 --> 00:02:38,860 >> Star. 56 00:02:38,860 --> 00:02:41,690 Deci, toate stelele de pe aceeași linie este ceea ce am auzit, 57 00:02:41,690 --> 00:02:43,391 și apoi noul caracter linie. 58 00:02:43,391 --> 00:02:44,140 Deci, haideți să încercăm asta. 59 00:02:44,140 --> 00:02:48,710 Deci, asigurați-buggy 1, intra, și văd comanda zăngănit 60 00:02:48,710 --> 00:02:50,090 despre care am vorbit data trecută. 61 00:02:50,090 --> 00:02:55,180 ./buggy-1, și într-adevăr, eu văd toate cele 10 stele pe aceeași linie, chiar dacă eu pretind 62 00:02:55,180 --> 00:02:58,690 în caietul de sarcini mea doar un comentariu pe culmea codul pe care mi-am propus să fac o per 63 00:02:58,690 --> 00:02:59,230 linie. 64 00:02:59,230 --> 00:03:00,580 Dar acest lucru pare corect. 65 00:03:00,580 --> 00:03:04,620 >> Acum, linia 15 se pare ca eu sunt imprimarea unei stele, și apoi linia 16 66 00:03:04,620 --> 00:03:06,620 se pare ca eu sunt de imprimare o nouă linie de caractere, 67 00:03:06,620 --> 00:03:09,560 și ei amândoi identică, astfel Eu sunt în interiorul buclei clar. 68 00:03:09,560 --> 00:03:13,610 Deci, nu ar trebui să face stele, nou linie, stele, noua linie, stea, noua linie? 69 00:03:13,610 --> 00:03:14,110 Da? 70 00:03:14,110 --> 00:03:18,430 71 00:03:18,430 --> 00:03:21,240 >> Da, spre deosebire de un limbaj ca Python, daca esti familiar, 72 00:03:21,240 --> 00:03:23,540 indentare nu conteaza la calculator. 73 00:03:23,540 --> 00:03:25,280 Contează doar la om. 74 00:03:25,280 --> 00:03:29,860 Deci, în timp ce liniile de aici l-am inventat 15 și 16-- care arata frumos, 75 00:03:29,860 --> 00:03:31,330 dar calculatorul nu-i pasă. 76 00:03:31,330 --> 00:03:34,640 Calculatorul îi pasă având de fapt acolade 77 00:03:34,640 --> 00:03:36,310 în jurul acestor linii de cod. 78 00:03:36,310 --> 00:03:39,520 >> Deci asta e clear-- la fel ca în Rămășițe că aceste două linii de cod 79 00:03:39,520 --> 00:03:40,450 trebuie executată. 80 00:03:40,450 --> 00:03:44,390 Ca unul dintre cei puzzle Scratch galben piese din nou și din nou și din nou. 81 00:03:44,390 --> 00:03:50,920 >> Deci, acum, dacă am re-rula acest program-- ./buggy-2-- Hm. 82 00:03:50,920 --> 00:03:51,770 Am o eroare acum. 83 00:03:51,770 --> 00:03:54,212 Ce am uitat sa fac? 84 00:03:54,212 --> 00:03:55,420 Da, deci nu l-am compila. 85 00:03:55,420 --> 00:03:56,740 Deci, asigurați-buggy 2. 86 00:03:56,740 --> 00:03:59,840 Nu există un astfel de fișier pentru că nu am făcut- compila de fapt a doua versiune. 87 00:03:59,840 --> 00:04:04,860 Deci, acum, interesant nedeclarate nu variable-- 2. 88 00:04:04,860 --> 00:04:05,510 Facem 1. 89 00:04:05,510 --> 00:04:11,050 Asigurați-buggy-1-- ./buggy-1-- și acum fiecare dintre ele este pe aceeași linie. 90 00:04:11,050 --> 00:04:13,880 >> Acum, există o excepție de la această afirmație ar trebui de-al meu 91 00:04:13,880 --> 00:04:15,520 că ai nevoie de aceste acolade. 92 00:04:15,520 --> 00:04:20,160 Când este de fapt OK-- dacă ai observat în secțiunea sau textbooks-- 93 00:04:20,160 --> 00:04:22,130 a omite acolade? 94 00:04:22,130 --> 00:04:22,630 Da? 95 00:04:22,630 --> 00:04:26,290 96 00:04:26,290 --> 00:04:26,870 >> Exact. 97 00:04:26,870 --> 00:04:28,940 Când există o singură linie de cod pe care le 98 00:04:28,940 --> 00:04:32,830 vrea să fie asociat cu buclă ca în primul nostru exemplu. 99 00:04:32,830 --> 00:04:36,380 Este perfect legitim a omite acolade 100 00:04:36,380 --> 00:04:40,310 doar ca un fel de comoditate de la compilator la tine. 101 00:04:40,310 --> 00:04:40,810 Da? 102 00:04:40,810 --> 00:04:43,347 103 00:04:43,347 --> 00:04:43,930 Bună întrebare. 104 00:04:43,930 --> 00:04:45,500 Ar fi considerată o eroare de stil? 105 00:04:45,500 --> 00:04:49,340 Ne-ar promote-- ca în CS50 Ghid de stil, URL-ul pentru care 106 00:04:49,340 --> 00:04:51,926 este în pset1-- că întotdeauna folosesc acolade. 107 00:04:51,926 --> 00:04:53,550 Cu siguranță dacă sunteți nou la programare. 108 00:04:53,550 --> 00:04:56,800 Realitatea este că nu suntem O să vă interzică 109 00:04:56,800 --> 00:04:58,680 de la a face aceste facilități. 110 00:04:58,680 --> 00:05:00,846 Dar dacă sunteți doar obtinerea în leagăn de lucruri, 111 00:05:00,846 --> 00:05:04,020 absolut doar folosiți întotdeauna cret bretele până când te obișnuiești cu ea. 112 00:05:04,020 --> 00:05:04,640 Bună întrebare. 113 00:05:04,640 --> 00:05:05,320 >> În regulă. 114 00:05:05,320 --> 00:05:07,660 Așa că atunci a fost o eroare. 115 00:05:07,660 --> 00:05:09,190 Cel puțin în ceva destul de simplu la. 116 00:05:09,190 --> 00:05:11,260 Și totuși, s-ar putea crede acest lucru este destul de rudimentar, nu? 117 00:05:11,260 --> 00:05:13,635 Aceasta este un fel de prima săptămână de a privi limba 118 00:05:13,635 --> 00:05:14,890 ca, vezi bug-uri în ea. 119 00:05:14,890 --> 00:05:17,250 Dar realitatea acestea sunt de fapt reprezentant 120 00:05:17,250 --> 00:05:20,310 a unor probleme destul de înfricoșătoare care pot apărea în lumea reală. 121 00:05:20,310 --> 00:05:23,530 >> Deci, unii dintre voi s-ar putea aminti dacă urmați știri tech, 122 00:05:23,530 --> 00:05:25,740 sau poate chiar prins vânt de acest în februarie 123 00:05:25,740 --> 00:05:29,434 de anul trecut că Apple a avut a făcut un pic de o greșeală în ambele iOS, 124 00:05:29,434 --> 00:05:31,350 sistemul de operare pe telefoanele lor, și, de asemenea, 125 00:05:31,350 --> 00:05:34,220 Mac OS, sistemul de operare pe desktop-uri si laptop-urile lor. 126 00:05:34,220 --> 00:05:36,480 Și ai văzut titluri, cum ar fi acest lucru. 127 00:05:36,480 --> 00:05:41,120 Și după aceea, Apple a promis pentru a rezolva această problemă, 128 00:05:41,120 --> 00:05:45,950 și a făcut foarte repede fixați-l în iOS, dar apoi în cele din urmă l fix în Mac OS 129 00:05:45,950 --> 00:05:46,810 de asemenea. 130 00:05:46,810 --> 00:05:50,370 >> Acum, nici unul dintre aceste titluri singur într-adevăr dezvăluie ce problema de baza a fost, 131 00:05:50,370 --> 00:05:55,640 dar bug-ul a fost redus în cele din urmă la un bug în SSL, Secure Sockets Layer. 132 00:05:55,640 --> 00:05:57,390 Și pe scurt, aceasta este software-ul 133 00:05:57,390 --> 00:06:01,030 care browserele noastre și alte program de calculator folosit pentru a face ce? 134 00:06:01,030 --> 00:06:04,090 135 00:06:04,090 --> 00:06:06,860 >> Dacă am spus că SSL este implicat, ori de câte ori 136 00:06:06,860 --> 00:06:13,920 vizitați un URL care începe cu HTTPS, ceea ce s-ar putea apoi SSL fi legate de? 137 00:06:13,920 --> 00:06:14,580 Criptare. 138 00:06:14,580 --> 00:06:16,470 Deci, vom vorbi despre acest lucru în zilele următoare. 139 00:06:16,470 --> 00:06:18,750 Criptare, arta de a urcare informații. 140 00:06:18,750 --> 00:06:22,200 >> Dar pe scurt, Apple ceva timp în urmă a făcut o greșeală 141 00:06:22,200 --> 00:06:25,970 în punerea lor în aplicare de SSL, software-ul care în cele din urmă pune în aplicare 142 00:06:25,970 --> 00:06:30,120 URL-uri, cum ar fi HTTPS sau max Conexiuni acolo. 143 00:06:30,120 --> 00:06:32,850 Rezultatul este că ceea tau conexiuni ar putea potențial 144 00:06:32,850 --> 00:06:33,920 fi interceptate. 145 00:06:33,920 --> 00:06:37,130 Și conexiunile au fost nu neapărat criptate 146 00:06:37,130 --> 00:06:40,350 dacă ați avut un tip rău în între tu și site-ul de destinație care 147 00:06:40,350 --> 00:06:42,170 a știut să profite de acest lucru. 148 00:06:42,170 --> 00:06:45,090 >> Acum, Apple a postat în cele din urmă un fix pentru acest final, 149 00:06:45,090 --> 00:06:46,920 și descrierea de fix lor a fost aceasta. 150 00:06:46,920 --> 00:06:49,878 Transport sigur nu a reușit să valideze autenticitatea conexiunii. 151 00:06:49,878 --> 00:06:52,920 Problema a fost abordată de către restabilirea lipsă pași de validare. 152 00:06:52,920 --> 00:06:57,250 >> Deci, aceasta este o explicație foarte ondulat mână pentru a spune că pur și simplu ne-am dat-o. 153 00:06:57,250 --> 00:07:00,920 Există literalmente o linie de cod care a fost buggy 154 00:07:00,920 --> 00:07:05,130 în punerea lor în aplicare de SSL, și dacă te duci on-line și de căutare pentru acest 155 00:07:05,130 --> 00:07:07,210 puteți găsi de fapt, codul sursă original. 156 00:07:07,210 --> 00:07:11,960 De exemplu, aceasta este o captură de ecran a doar o parte a unui fișier destul de mare, 157 00:07:11,960 --> 00:07:15,965 dar aceasta este o funcție aparent numit SSL verifica Server semn schimb cheie. 158 00:07:15,965 --> 00:07:17,840 Și este nevoie de o grămadă de argumente și intrări. 159 00:07:17,840 --> 00:07:20,298 Și nu ne vom concentra prea mult pe punctele caracteristice acolo, 160 00:07:20,298 --> 00:07:24,390 dar dacă te concentrezi pe codul de interior din care cel mai important function-- să 161 00:07:24,390 --> 00:07:25,590 mări pe care. 162 00:07:25,590 --> 00:07:28,140 S-ar putea suspecta deja ce eroare ar putea 163 00:07:28,140 --> 00:07:31,230 fi chiar dacă nu aveți nici o idee în cele din urmă ceea ce căutați la. 164 00:07:31,230 --> 00:07:35,924 Există un fel de anomalie aici, care este ceea ce? 165 00:07:35,924 --> 00:07:38,940 >> Da, nu-mi place aspectul de două Du-te eșuează. 166 00:07:38,940 --> 00:07:42,060 Sincer, eu nu știu cu adevărat ce Du-te nu înseamnă, însă având două dintre ele 167 00:07:42,060 --> 00:07:42,810 spate în spate. 168 00:07:42,810 --> 00:07:45,290 Că doar un fel de ma freaca intelectual în mod greșit, 169 00:07:45,290 --> 00:07:48,910 și într-adevăr, dacă ne-am apropia pe doar aceste linii, acesta este C. 170 00:07:48,910 --> 00:07:52,220 >> Deci, o mulțime de cod Apple este ea însăși scris în C, 171 00:07:52,220 --> 00:07:55,780 și acest aparent este într-adevăr equivalent-- 172 00:07:55,780 --> 00:07:59,060 nu că indentare destul versiune, dar dacă te recunosc faptul 173 00:07:59,060 --> 00:08:02,560 că nu există nici o acolade, ceea ce Apple a într-adevăr a scris a fost cod care arata 174 00:08:02,560 --> 00:08:03,540 ca aceasta. 175 00:08:03,540 --> 00:08:07,080 Așa că m-am mărită și eu doar fixat adâncitura în sensul 176 00:08:07,080 --> 00:08:10,690 că în cazul în care nu exista nici acolade, care Du-te la a doua nu e în galben 177 00:08:10,690 --> 00:08:12,500 se va executa indiferent de ce. 178 00:08:12,500 --> 00:08:15,540 Nu e asociat cu în cazul în care condiția de mai sus se. 179 00:08:15,540 --> 00:08:19,590 >> Deci, chiar din nou, dacă nu faci destul de înțelege ceea ce ar putea, eventual, acest 180 00:08:19,590 --> 00:08:23,230 să-și facă, știu că fiecare dintre acestea conditions-- fiecare dintre aceste linii 181 00:08:23,230 --> 00:08:26,180 este un pas foarte important în procesul de verificare 182 00:08:26,180 --> 00:08:28,350 în cazul în care datele dumneavoastră este, de fapt, criptat. 183 00:08:28,350 --> 00:08:31,710 Deci sărind peste una dintre acestea pași, nu cea mai buna idee. 184 00:08:31,710 --> 00:08:34,840 >> Dar, pentru că avem această Du-te la al doilea eșec în galben, 185 00:08:34,840 --> 00:08:36,840 și pentru că odată ce ne-am un fel de punct de vedere estetic 186 00:08:36,840 --> 00:08:40,480 mutați-l la stânga în cazul în care logic este în acest moment, ceea ce 187 00:08:40,480 --> 00:08:43,230 înseamnă acest lucru pentru linia de de cod de mai jos care a doua Du-te 188 00:08:43,230 --> 00:08:46,480 nu crezi? 189 00:08:46,480 --> 00:08:48,860 Este întotdeauna o să fie omise. 190 00:08:48,860 --> 00:08:52,100 Deci, gotos sunt, în general, se încruntă la pentru motive nu vom merge într-adevăr în, 191 00:08:52,100 --> 00:08:54,940 și într-adevăr în CS50 noi nu tind pentru a preda această afirmație Du-te, 192 00:08:54,940 --> 00:08:58,130 dar vă puteți gândi Du-te nu în sensul sa sarim 193 00:08:58,130 --> 00:08:59,600 la o altă parte a codului. 194 00:08:59,600 --> 00:09:03,120 >> Cu alte cuvinte sari peste aceasta ultima linie cu totul, 195 00:09:03,120 --> 00:09:07,420 și astfel rezultatul acestei prost greșeală simplu că a fost doar 196 00:09:07,420 --> 00:09:10,330 urmare a probabil cineva copierea și lipirea una prea 197 00:09:10,330 --> 00:09:14,150 de multe ori a fost că întregul securitate de iOS și Mac OS 198 00:09:14,150 --> 00:09:18,240 a fost vulnerabile la interceptarea de baietii rai pentru ceva timp. 199 00:09:18,240 --> 00:09:19,940 Până Apple a stabilit în cele din urmă acest lucru. 200 00:09:19,940 --> 00:09:23,100 >> Acum, dacă unii dintre voi sunt de fapt rulează versiuni vechi de iOS sau Mac OS, 201 00:09:23,100 --> 00:09:27,250 poti sa te duci la gotofail.com care este un site care cineva înființat 202 00:09:27,250 --> 00:09:29,190 pentru a determina în mod esențial programatic 203 00:09:29,190 --> 00:09:30,980 în cazul în care computerul este încă vulnerabil. 204 00:09:30,980 --> 00:09:33,600 Și sincer, dacă este, este, probabil, o idee bună 205 00:09:33,600 --> 00:09:36,870 pentru a actualiza telefonul sau Mac-ul la acest punct. 206 00:09:36,870 --> 00:09:40,120 Dar există, doar o dovadă a cât de o apreciere a acestora nivel inferior 207 00:09:40,120 --> 00:09:42,400 detalii și destul de idei simple poate într-adevăr 208 00:09:42,400 --> 00:09:44,590 traduce în deciziile și probleme care 209 00:09:44,590 --> 00:09:47,320 affected-- în acest case-- milioane de oameni. 210 00:09:47,320 --> 00:09:49,107 >> Acum, un cuvânt pe administrare. 211 00:09:49,107 --> 00:09:50,690 Secțiunea va începe duminica viitoare. 212 00:09:50,690 --> 00:09:53,360 Veți primi un e-mail de week-end de secțiune, moment în care 213 00:09:53,360 --> 00:09:55,290 procesul rezecției va începe dacă ai 214 00:09:55,290 --> 00:09:56,998 dat seama că avea acum unor noi conflicte. 215 00:09:56,998 --> 00:10:00,180 Deci, acest lucru se întâmplă în fiecare an, și ne-am va găzdui în zilele care vin. 216 00:10:00,180 --> 00:10:02,430 >> Oficiul hours-- face păstra o cu ochii pe acest program aici. 217 00:10:02,430 --> 00:10:05,100 Modifică un pic în această săptămână, în special ora de începere 218 00:10:05,100 --> 00:10:08,180 și locația, astfel încât nu se consulte că înainte de a merge la orele de birou 219 00:10:08,180 --> 00:10:09,520 oricare din următoarele patru nopți. 220 00:10:09,520 --> 00:10:12,680 Și acum un cuvânt privind evaluarea, mai ales ca se arunca cu capul în problema 221 00:10:12,680 --> 00:10:14,350 stabilește o și dincolo. 222 00:10:14,350 --> 00:10:17,070 >> Deci, pe caietul de sarcini, acestea sunt în general 223 00:10:17,070 --> 00:10:20,360 de-a lungul axelor care vom evalua munca ta. 224 00:10:20,360 --> 00:10:23,170 Domeniul de aplicare se referă la ceea ce măsură instrumente de cod 225 00:10:23,170 --> 00:10:25,690 caracteristicile necesare prin caietul de sarcini nostru. 226 00:10:25,690 --> 00:10:28,290 Cu alte cuvinte, cât de mult din un set de piese ai mușca. 227 00:10:28,290 --> 00:10:30,440 Ai făcut o treime din ea, o jumătate din ea, 100% din ea. 228 00:10:30,440 --> 00:10:33,000 Chiar daca nu e corect, cât de mult ai încerca? 229 00:10:33,000 --> 00:10:35,290 Deci, care surprinde nivelul de de efort și suma 230 00:10:35,290 --> 00:10:38,260 la care te-a mușcat pe Problemă set de. 231 00:10:38,260 --> 00:10:40,690 >> Correctness-- acesta, la ce măsură, este codul 232 00:10:40,690 --> 00:10:43,150 în concordanță cu nostru caietului de sarcini și lipsite de probleme. 233 00:10:43,150 --> 00:10:44,770 Deci functioneaza corect? 234 00:10:44,770 --> 00:10:48,700 Dacă ne-am da unele de intrare, o face ne da puterea pe care ne așteptăm? 235 00:10:48,700 --> 00:10:52,570 Design-- acum aceasta este prima de cele deosebit de calitative, 236 00:10:52,570 --> 00:10:56,180 sau cele care necesită judecata umană. 237 00:10:56,180 --> 00:10:59,690 Și într-adevăr, acesta este motivul pentru care avem un personal de atât de multe colegii de predare și curs 238 00:10:59,690 --> 00:11:00,350 asistenți. 239 00:11:00,350 --> 00:11:03,480 În ce măsură este ta Codul scris bine? 240 00:11:03,480 --> 00:11:05,810 >> Și din nou, aceasta este o foarte evaluare calitativă 241 00:11:05,810 --> 00:11:09,100 care va lucra cu tine pe bi-direcțional în săptămânile ce vor urma. 242 00:11:09,100 --> 00:11:12,060 Așa că, atunci când nu ajunge numai scoruri numerice, dar, de asemenea, 243 00:11:12,060 --> 00:11:16,682 o scoruri scrise, sau feedback-ul tastat, sau feedback-ul scris în cuvinte în limba engleză. 244 00:11:16,682 --> 00:11:19,640 Asta e ceea ce vom folosi pentru a vă conduce spre scrierea de fapt cod mai bine. 245 00:11:19,640 --> 00:11:23,320 Și în curs și secțiune, vom încerca la punctul out-- ori de câte ori ne-am sa-- 246 00:11:23,320 --> 00:11:26,420 ceea ce face un program nu numai corectă și funcțional bun, 247 00:11:26,420 --> 00:11:28,200 dar, de asemenea, bine conceput. 248 00:11:28,200 --> 00:11:31,850 Mai eficiente ar putea fi, sau chiar cel mai frumos poate fi. 249 00:11:31,850 --> 00:11:33,100 >> Ceea ce ne duce la stil. 250 00:11:33,100 --> 00:11:36,876 Stil în cele din urmă este o judecată estetică. 251 00:11:36,876 --> 00:11:38,750 V-ati ales bine nume pentru variabilele dumneavoastră? 252 00:11:38,750 --> 00:11:40,330 V-ați aliniat codul corect? 253 00:11:40,330 --> 00:11:44,010 Se pare bine, și, prin urmare, este mai ușor pentru o altă ființă umană 254 00:11:44,010 --> 00:11:46,550 pentru a citi respectiv dvs. corectitudinii sale. 255 00:11:46,550 --> 00:11:50,300 >> Acum, în general, pe programa, am scor aceste lucruri pe o scară de cinci puncte. 256 00:11:50,300 --> 00:11:53,640 Și lasă-mă să ciocan acasă punctul de că trei este într-adevăr bine. 257 00:11:53,640 --> 00:11:55,550 Face foarte repede oameni buni începe să faci aritmetică. 258 00:11:55,550 --> 00:11:58,133 Când ajung trei din cinci pe corectitudine pentru unele PSET 259 00:11:58,133 --> 00:12:02,040 și ei cred că la naiba, am de gând să 60% care este în esență un D sau un E. 260 00:12:02,040 --> 00:12:03,980 >> Asta nu e modul în care ne cred că de aceste numere. 261 00:12:03,980 --> 00:12:06,880 Un trei este într-adevăr bun, și ceea ce ne-am în general se așteaptă la început 262 00:12:06,880 --> 00:12:09,820 a termenului este că, dacă sunteți obtinerea o grămadă de three's-- poate un cuplu 263 00:12:09,820 --> 00:12:12,540 de târguri, o pereche de fours-- sau un cuplu câte doi, un cuplu de fours-- 264 00:12:12,540 --> 00:12:13,748 că este un loc bun pentru a începe. 265 00:12:13,748 --> 00:12:16,320 Și, atâta timp cât vom vedea o traiectorie ascendentă în timp, 266 00:12:16,320 --> 00:12:18,540 ești într-un loc deosebit de bun. 267 00:12:18,540 --> 00:12:20,752 >> Formula care le folosim pentru a lucruri de greutate este, în esență, 268 00:12:20,752 --> 00:12:22,710 aceasta pe programa, ceea ce înseamnă doar că ne-am 269 00:12:22,710 --> 00:12:24,750 da mai multă greutate la corectitudine. 270 00:12:24,750 --> 00:12:27,930 Pentru că e foarte des corectitudine care ia cel mai mult timp. 271 00:12:27,930 --> 00:12:28,760 Ai încredere în mine acum. 272 00:12:28,760 --> 00:12:31,190 Veți find-- cel puțin într-un pset-- pe care le 273 00:12:31,190 --> 00:12:36,790 petrec 90% din timpul tau lucrează la 10% a problemei. 274 00:12:36,790 --> 00:12:39,320 >> Și tot un fel de lucrări cu excepția pentru una sau două bug-uri, 275 00:12:39,320 --> 00:12:41,570 și acestea sunt bug-uri care tine pana tarziu in noapte. 276 00:12:41,570 --> 00:12:43,380 Acestea sunt cele care un fel de voi scăpa. 277 00:12:43,380 --> 00:12:45,560 Dar, după dormit pe ea, sau participarea la ore de birou 278 00:12:45,560 --> 00:12:48,844 sau să pună întrebări on-line, este când ajungi la acest obiectiv de 100%, 279 00:12:48,844 --> 00:12:50,760 și de aceea ne-am greutate corectitudine cel mai mult. 280 00:12:50,760 --> 00:12:54,102 Proiectați un pic mai puțin, și stil un pic mai puțin decât atât. 281 00:12:54,102 --> 00:12:56,060 Dar ține în stil mind-- este, probabil, cel mai usor 282 00:12:56,060 --> 00:12:58,890 dintre acestea pentru a mușca conform ghidului de stil. 283 00:12:58,890 --> 00:13:01,580 >> Și acum, o mai serioasă nota pe onestitate academică. 284 00:13:01,580 --> 00:13:05,000 CS50 are distinctia nefericit de fiind cel mai mare producător de Ad Board 285 00:13:05,000 --> 00:13:07,330 cazuri aproape în fiecare an istoric. 286 00:13:07,330 --> 00:13:11,012 Acest lucru nu se datorează faptului că elevii ieftin în CS50 orice astfel mai mult decât orice altă clasă, 287 00:13:11,012 --> 00:13:13,720 ci pentru că prin natura activității, faptul că este electronic, 288 00:13:13,720 --> 00:13:16,636 faptul că ne uităm la ea, și faptul suntem oameni de știință de calculator, 289 00:13:16,636 --> 00:13:20,570 Pot să spun că sunt, din păcate, foarte bun la detectarea el. 290 00:13:20,570 --> 00:13:22,710 >> Deci, ce înseamnă acest lucru în termeni reali? 291 00:13:22,710 --> 00:13:24,820 Deci, pe programa, Filosofia cursului 292 00:13:24,820 --> 00:13:28,090 într-adevăr se fierbe în jos pentru a fi rezonabil. 293 00:13:28,090 --> 00:13:31,684 Există această linie între a face munca sa pe cont propriu 294 00:13:31,684 --> 00:13:34,100 și a obține un pic de ajutor rezonabil de la un prieten, 295 00:13:34,100 --> 00:13:38,020 și de a face pur și simplu că munca pentru dvs. prieten, sau trimite el sau ea codul 296 00:13:38,020 --> 00:13:41,080 astfel încât el sau ea poate pur și simplu ia sau împrumuta-l corect. 297 00:13:41,080 --> 00:13:43,580 Și care traversează linia de că am tras în clasa. 298 00:13:43,580 --> 00:13:45,410 >> A se vedea, programa în cele din urmă pentru liniile 299 00:13:45,410 --> 00:13:48,209 pe care le trage ca fiind rezonabil și comportamentul nerezonabil, 300 00:13:48,209 --> 00:13:50,000 dar o face într-adevăr fierbe până la esența 301 00:13:50,000 --> 00:13:53,980 de munca au nevoie de a fi propriul tau în cele din urmă. 302 00:13:53,980 --> 00:13:56,230 Acum, cu care a spus, există o euristic. 303 00:13:56,230 --> 00:13:58,980 Pentru că așa cum s-ar putea imagine-- de la orele de birou și vizuale 304 00:13:58,980 --> 00:14:01,060 și filmele care le-am arătat astfel far-- CS50 305 00:14:01,060 --> 00:14:04,530 este într-adevăr menit să fie cât de colaborare și de cooperativă și ca sociale 306 00:14:04,530 --> 00:14:06,450 posibil. 307 00:14:06,450 --> 00:14:08,570 Ca de colaborare cum este riguros. 308 00:14:08,570 --> 00:14:11,314 >> Dar, cu aceasta a declarat, euristic, după cum veți vedea în programa, 309 00:14:11,314 --> 00:14:12,980 este că atunci când avea unele probleme. 310 00:14:12,980 --> 00:14:16,470 Ai ceva bug în codul pe care le nu se poate rezolva, este rezonabil pentru tine 311 00:14:16,470 --> 00:14:18,039 pentru a arăta codul de altcineva. 312 00:14:18,039 --> 00:14:21,080 Un prieten chiar în clasa, un prieten care sta langa tine la orele de birou, 313 00:14:21,080 --> 00:14:22,680 sau un membru al personalului. 314 00:14:22,680 --> 00:14:25,810 Dar ei nu pot arăta codul lor pentru tine. 315 00:14:25,810 --> 00:14:27,710 >> Cu alte cuvinte, o răspunde la intrebare dumneavoastră 316 00:14:27,710 --> 00:14:29,940 Am nevoie de help-- nu este oh, aici e codul meu. 317 00:14:29,940 --> 00:14:32,440 Aruncati o privire la acest lucru și deduce din ea ceea ce vrei. 318 00:14:32,440 --> 00:14:34,580 Acum, desigur, nu e un mod clar la joc 319 00:14:34,580 --> 00:14:37,760 acest sistem prin care să-ți arăt codul meu înainte de a avea o întrebare. 320 00:14:37,760 --> 00:14:40,150 Arată-mi-mi codul inainte de a avea o întrebare. 321 00:14:40,150 --> 00:14:45,870 Dar văd din nou programa școlară pentru detalii fine de unde această linie este. 322 00:14:45,870 --> 00:14:50,606 >> Doar pentru a picta acum imaginea și împărtăși cât mai transparent posibil 323 00:14:50,606 --> 00:14:53,480 unde suntem puțin în ultimii ani, acesta este numărul de cazuri Ad Board 324 00:14:53,480 --> 00:14:56,260 că CS50 a avut peste In ultimii sapte ani. 325 00:14:56,260 --> 00:14:58,717 Cu 14 de cazuri in aceasta toamna cel mai recent. 326 00:14:58,717 --> 00:15:01,300 În ceea ce privește elevii implicați, a fost de 20 de unii studenți ciudate 327 00:15:01,300 --> 00:15:02,490 in aceasta toamna trecut. 328 00:15:02,490 --> 00:15:05,670 A existat un vârf de 33 elevii în urmă cu câțiva ani. 329 00:15:05,670 --> 00:15:08,830 Mulți dintre ei sunt, din păcate, nu mai e aici în campus. 330 00:15:08,830 --> 00:15:13,100 >> Elevii implicați ca procent din Clasa a variat istoric de la 0% 331 00:15:13,100 --> 00:15:17,300 la 5,3%, ceea ce este doar de a spune aceasta este anual o provocare. 332 00:15:17,300 --> 00:15:20,390 Și spre acest scop, ceea ce vrem sa facem este transmite un 333 00:15:20,390 --> 00:15:24,310 că am dd-- doar FYI-- compara la o echitate pentru studenții care 334 00:15:24,310 --> 00:15:26,520 sunt pe linia în consecință. 335 00:15:26,520 --> 00:15:29,620 Noi facem compara toți curent observațiile împotriva tuturor misiunilor anterioare 336 00:15:29,620 --> 00:15:30,840 din ultimii ani mulți. 337 00:15:30,840 --> 00:15:33,620 >> Stim prea cum la Google în jurul și pentru a găsi depozite de cod 338 00:15:33,620 --> 00:15:36,360 on-line, forumuri de discuții on-line, site-uri de locuri de muncă on-line. 339 00:15:36,360 --> 00:15:41,580 În cazul în care un student poate găsi, putem cu siguranță se pare la fel de mult ca și noi cu părere de rău. 340 00:15:41,580 --> 00:15:45,330 Deci, ceea ce veți vedea în programa deși este această clauză regret. 341 00:15:45,330 --> 00:15:47,500 Pot cu siguranță aprecia, iar noi are pe toate 342 00:15:47,500 --> 00:15:50,870 Personalul care au facut cursul ca aceasta, sau acesta se în timp, 343 00:15:50,870 --> 00:15:53,997 cu siguranță știe cum e când viața devine în mod, atunci când aveți 344 00:15:53,997 --> 00:15:56,080 unii noapte târziu deadline-- nu numai în această clasă, 345 00:15:56,080 --> 00:15:58,660 dar another-- când ești complet epuizat, stresat, 346 00:15:58,660 --> 00:16:00,659 au un număr exagerat de alte lucruri de făcut. 347 00:16:00,659 --> 00:16:03,660 Vei face la un moment dat în viata cu siguranță un rău, poate târziu 348 00:16:03,660 --> 00:16:04,620 decizie noapte. 349 00:16:04,620 --> 00:16:06,520 >> Deci, pe programa, există această clauză, 350 00:16:06,520 --> 00:16:10,629 astfel încât în ​​cazul în care în termen de 72 de ore de la luarea unele decizii proaste, dețineți până la o 351 00:16:10,629 --> 00:16:12,670 și de a ajunge la mine și unul din capete ale cursului 352 00:16:12,670 --> 00:16:14,300 și vom avea o conversație. 353 00:16:14,300 --> 00:16:16,220 Ne vom ocupa de lucruri pe plan intern, în speranța 354 00:16:16,220 --> 00:16:18,770 de a deveni mai mult de un clipă de predare sau lectie de viata, 355 00:16:18,770 --> 00:16:22,120 și nu ceva cu ramificații în special drastice 356 00:16:22,120 --> 00:16:24,570 cum s-ar putea vedea pe aceste diagrame aici. 357 00:16:24,570 --> 00:16:26,540 >> Deci, asta e un ton foarte serios. 358 00:16:26,540 --> 00:16:29,960 Să ne oprim pentru doar câteva secunde pentru a rupe tensiunea. 359 00:16:29,960 --> 00:16:34,442 >> [MUSIC JOC] 360 00:16:34,442 --> 00:17:17,768 361 00:17:17,768 --> 00:17:20,250 >> David J. MALAN: Bine, astfel cum a fost ca pentru un segue? 362 00:17:20,250 --> 00:17:22,059 Pentru subiecte de astăzi primare. 363 00:17:22,059 --> 00:17:23,859 Prima dintre care este abstractizare. 364 00:17:23,859 --> 00:17:26,900 Un alt care urmează să fie reprezentare a datelor, care sincer 365 00:17:26,900 --> 00:17:31,640 este un mod foarte uscat de a spune cum putem du-te cu privire la rezolvarea problemelor și gândire 366 00:17:31,640 --> 00:17:33,250 despre rezolvarea problemelor? 367 00:17:33,250 --> 00:17:37,285 Deci, l-ați văzut în Scratch, și ai văzut, probabil, deja în pset1 cu C 368 00:17:37,285 --> 00:17:39,930 că nu numai se poate folosi funcții, cum ar fi printf, 369 00:17:39,930 --> 00:17:42,770 ca alte persoane din ultimii ani a scris pentru tine. 370 00:17:42,770 --> 00:17:45,340 Puteți scrie, de asemenea, propriile funcții. 371 00:17:45,340 --> 00:17:48,440 >> Și chiar dacă s-ar putea să nu aibă face acest lucru în C, și sincer în pset1 372 00:17:48,440 --> 00:17:51,866 tu nu într-adevăr nevoie pentru a scrie funcție proprie deoarece problem-- 373 00:17:51,866 --> 00:17:53,990 în timp ce, probabil, descurajatoare la primul glance-- veți vedea 374 00:17:53,990 --> 00:17:57,910 poate fi în cele din urmă rezolvată cu nu toate că multe linii de cod. 375 00:17:57,910 --> 00:18:01,140 Dar, cu care a spus, în termeni a scris propria funcție, 376 00:18:01,140 --> 00:18:03,570 dau seama că C nu da ai această capacitate. 377 00:18:03,570 --> 00:18:06,940 >> Am de gând să meargă în codul sursă de astăzi, care este disponibil deja on-line, 378 00:18:06,940 --> 00:18:10,900 și am de gând să merg mai departe și deschis un program numit funcție 0.C, 379 00:18:10,900 --> 00:18:14,620 și în funcție de zero vom vedea câteva lucruri. 380 00:18:14,620 --> 00:18:19,160 In primele linii 18, prin 23 este funcția mea principală. 381 00:18:19,160 --> 00:18:22,414 Și acum că începem să citească cod pe care noi nu scriem pe acoperi, 382 00:18:22,414 --> 00:18:25,080 dar în schimb le-am scris în avans sau pe care le într-o problemă set 383 00:18:25,080 --> 00:18:27,910 s-ar putea primi cu a fost scris în prealabil. 384 00:18:27,910 --> 00:18:30,040 O modalitate buna de a începe citirea codului altcuiva 385 00:18:30,040 --> 00:18:31,400 este uita-te pentru funcția principală. 386 00:18:31,400 --> 00:18:34,420 Seama de unde intrarea punct este de a rula programul, 387 00:18:34,420 --> 00:18:36,580 și apoi urmează în mod logic de acolo. 388 00:18:36,580 --> 00:18:40,190 >> Deci, acest program de aparent printuri numele, urmat de două puncte. 389 00:18:40,190 --> 00:18:42,490 Apoi vom folosi getString de la biblioteca CS50 390 00:18:42,490 --> 00:18:46,050 pentru a obține un șir, sau un cuvânt sau o expresie de utilizator de la tastatura. 391 00:18:46,050 --> 00:18:48,390 Și mai e și asta lucru PrintName aici--. 392 00:18:48,390 --> 00:18:51,420 >> Acum PrintName nu este un funcție care vine cu C. 393 00:18:51,420 --> 00:18:52,970 Nu este în io.h. standard, 394 00:18:52,970 --> 00:18:55,570 Nu este în CS50.h. 395 00:18:55,570 --> 00:18:57,880 Este mai degrabă în același fișier. 396 00:18:57,880 --> 00:19:01,000 Observați dacă derulați în jos o linii bit-- 25 de 27-- 397 00:19:01,000 --> 00:19:05,330 e doar un mod destul de de a comenta codul utilizând stele și slash-uri. 398 00:19:05,330 --> 00:19:07,320 Acesta este un multi-linie comentariu, iar acest lucru este doar 399 00:19:07,320 --> 00:19:10,570 descrierea mea în albastru de ceea ce face această funcție. 400 00:19:10,570 --> 00:19:14,530 >> Pentru că în linii 28, prin 31, Am scris o funcție super-simplu 401 00:19:14,530 --> 00:19:16,280 al cărui nume este PrintName. 402 00:19:16,280 --> 00:19:19,560 Este nevoie de câte argumente ai spune? 403 00:19:19,560 --> 00:19:25,120 Deci, un argument-- deoarece există un argument enumerate în paranteze. 404 00:19:25,120 --> 00:19:27,000 Tipul de care este String. 405 00:19:27,000 --> 00:19:30,240 Care este de a spune PrintName este ca aceasta cutie neagră 406 00:19:30,240 --> 00:19:32,910 sau funcție care ia ca intrare un șir. 407 00:19:32,910 --> 00:19:35,730 >> Iar numele acelui String convenabil va fi numele. 408 00:19:35,730 --> 00:19:37,840 Nu e, nu N, dar numele. 409 00:19:37,840 --> 00:19:41,090 Deci, ce face PrintName? 410 00:19:41,090 --> 00:19:42,210 E simplu frumos. 411 00:19:42,210 --> 00:19:45,390 La fel ca o linie de cod pentru printf, dar se pare că 412 00:19:45,390 --> 00:19:47,950 printuri din "Hello", așa și așa. 413 00:19:47,950 --> 00:19:50,070 În cazul în care așa și așa vine de la argumentul. 414 00:19:50,070 --> 00:19:52,300 >> Acum, acest lucru nu este o inovație foarte mare aici. 415 00:19:52,300 --> 00:19:56,710 Într-adevăr, am avut un program care ar putea S-au scris cu o linie de cod 416 00:19:56,710 --> 00:20:00,190 prin punerea asta aici, și-a schimbat de ceva 417 00:20:00,190 --> 00:20:04,920 care implică unele șase sau șapte sau cam asa ceva de linii de cod tot drumul până aici. 418 00:20:04,920 --> 00:20:08,190 >> Dar este practicarea unui principiu cunoscut sub numele de abstractizare. 419 00:20:08,190 --> 00:20:12,550 Un fel de încapsulare în interiorul unei noi funcție care are un nume, și mai bine 420 00:20:12,550 --> 00:20:14,590 dar acest nume literalmente spune ceea ce face. 421 00:20:14,590 --> 00:20:16,880 Adică printf-- că nu-i deosebit de descriptiv. 422 00:20:16,880 --> 00:20:18,932 Dacă vreau să creeze o piesă de puzzle, sau dacă am 423 00:20:18,932 --> 00:20:21,140 doriți să creați o funcție care imprimă numele cuiva, 424 00:20:21,140 --> 00:20:23,230 frumusetea de a face acest lucru este că eu pot de fapt 425 00:20:23,230 --> 00:20:27,170 da ca functia un nume care descrie ceea ce face. 426 00:20:27,170 --> 00:20:29,844 >> Acum este nevoie de la o intrare care Am sunat arbitrar nume, 427 00:20:29,844 --> 00:20:32,760 dar asta este minunat descriptiv în loc să fie puțin mai 428 00:20:32,760 --> 00:20:36,140 generic ca S. și gol, pentru acum, înseamnă doar 429 00:20:36,140 --> 00:20:38,330 că această funcție nu dă-mi înapoi nimic. 430 00:20:38,330 --> 00:20:41,127 Nu e ca getString că literalmente îmi întinde înapoi un șir 431 00:20:41,127 --> 00:20:43,960 cum am făcut cu bucățile de hârtie cu colegii dumneavoastră săptămâna trecută, 432 00:20:43,960 --> 00:20:45,990 ci are doar un efect secundar. 433 00:20:45,990 --> 00:20:48,080 Se imprimă ceva pe ecran. 434 00:20:48,080 --> 00:20:53,880 >> Deci, la sfârșitul zilei, dacă fac funcția de-0,-./function 0, 435 00:20:53,880 --> 00:20:55,450 vom vedea că se cere numele meu. 436 00:20:55,450 --> 00:20:58,150 I tip David, și l tipuri de numele meu. 437 00:20:58,150 --> 00:21:01,080 Dacă o fac din nou cu Rob, se va spune "Bună ziua, Rob." 438 00:21:01,080 --> 00:21:04,280 Deci, o idee simplă, dar poate extrapola de la acest mintal 439 00:21:04,280 --> 00:21:06,750 care ca programele obține un pic mai complicat, 440 00:21:06,750 --> 00:21:10,290 și doriți să scrieți o bucată de cod și apel că code-- invoca 441 00:21:10,290 --> 00:21:13,270 că code-- de unii descriptiv nume ca PrintName, 442 00:21:13,270 --> 00:21:15,600 C nu permite noi această capacitate. 443 00:21:15,600 --> 00:21:17,660 >> Iată un alt exemplu simplu. 444 00:21:17,660 --> 00:21:22,940 De exemplu, dacă am deschide un fișier de la sunat azi return.c, 445 00:21:22,940 --> 00:21:24,270 observa ce am făcut aici. 446 00:21:24,270 --> 00:21:26,330 Cele mai multe dintre această funcție principală este printf. 447 00:21:26,330 --> 00:21:30,360 Prima am inițializa arbitrar o variabilă numită x la numărul 2. 448 00:21:30,360 --> 00:21:34,110 Apoi m-am imprima "x este acum % I "trece în valoare de x. 449 00:21:34,110 --> 00:21:35,500 Deci, eu spun doar ceea ce este. 450 00:21:35,500 --> 00:21:37,208 >> Acum sunt doar cu îndrăzneală susținând cu printf. 451 00:21:37,208 --> 00:21:42,050 Sunt cubaj că valoarea x, si eu sunt face acest lucru prin apelarea unei funcții 452 00:21:42,050 --> 00:21:45,590 denumit trecere cub în x ca argument, 453 00:21:45,590 --> 00:21:49,300 și apoi salvarea de ieșire în variabila sine, x. 454 00:21:49,300 --> 00:21:51,340 Deci, eu sunt clobbering valoarea lui x. 455 00:21:51,340 --> 00:21:53,380 Sunt imperative valoare de x cu orice 456 00:21:53,380 --> 00:21:56,510 rezultatul de asteptare această funcție cub este. 457 00:21:56,510 --> 00:21:59,530 Și apoi am imprima unele chestii pufos aici a spune ceea ce am făcut. 458 00:21:59,530 --> 00:22:01,600 >> Deci, ce este atunci cub? 459 00:22:01,600 --> 00:22:03,510 Observați ce este fundamental diferit aici. 460 00:22:03,510 --> 00:22:05,540 I-am dat funcția un nume ca înainte. 461 00:22:05,540 --> 00:22:08,270 Am specificat un nume pentru un argument. 462 00:22:08,270 --> 00:22:11,650 De data aceasta se numește n loc de nume, dar am putea-o numi tot ce vreau. 463 00:22:11,650 --> 00:22:12,650 Dar acest lucru este diferit. 464 00:22:12,650 --> 00:22:14,080 Acest lucru la stânga. 465 00:22:14,080 --> 00:22:16,290 Anterior, a fost ceea ce cuvinte cheie? 466 00:22:16,290 --> 00:22:16,870 Băieți. 467 00:22:16,870 --> 00:22:18,580 Acum e evident int. 468 00:22:18,580 --> 00:22:20,630 >> Deci, ce se poate lua de aici? 469 00:22:20,630 --> 00:22:24,090 Întrucât semnifică void fel de nimic, și că a fost cazul. 470 00:22:24,090 --> 00:22:25,970 PrintName întors nimic. 471 00:22:25,970 --> 00:22:27,942 A făcut ceva, dar ea nu-mi dai înapoi 472 00:22:27,942 --> 00:22:30,650 ceva ce am putea pune pe partea stângă a unui semn egal 473 00:22:30,650 --> 00:22:32,460 ca și cum am facut aici pe linia 22. 474 00:22:32,460 --> 00:22:36,780 >> Deci, dacă am spune în pe linia 30, ce-i asta, probabil, ceea ce presupune 475 00:22:36,780 --> 00:22:38,610 despre ceea ce cub face pentru mine? 476 00:22:38,610 --> 00:22:41,110 Da? 477 00:22:41,110 --> 00:22:42,310 Se întoarce un număr întreg. 478 00:22:42,310 --> 00:22:44,590 Așa că mi-a dat înapoi, pentru exemplu, o bucată de hârtie 479 00:22:44,590 --> 00:22:46,580 pe care le-a scris răspunsul. 480 00:22:46,580 --> 00:22:50,130 2 tocata, sau 3 tocata, sau 4 cubed-- orice am trecut în, 481 00:22:50,130 --> 00:22:51,540 si cum am pune în aplicare acest lucru? 482 00:22:51,540 --> 00:22:54,810 Ei bine, doar n ori n ori n este modul în care s-ar putea cub valoare. 483 00:22:54,810 --> 00:22:57,110 Deci, din nou, foarte simplu idee, dar demonstrativ 484 00:22:57,110 --> 00:23:00,100 acum cum se poate scrie funcții care de fapt ne-a avut din nou 485 00:23:00,100 --> 00:23:02,380 valori care ar putea fi de interes. 486 00:23:02,380 --> 00:23:05,740 >> Să ne uităm la un ultim exemplu aici numita funcție unul. 487 00:23:05,740 --> 00:23:08,530 În acest exemplu, se începe pentru a obține mai convingătoare. 488 00:23:08,530 --> 00:23:12,400 Deci, în funcție, acest lucru Anunț program-- în cele din urmă 489 00:23:12,400 --> 00:23:14,920 solicită o funcție numită GetPositiveInt. 490 00:23:14,920 --> 00:23:17,800 GetPositiveInt nu este un funcție în biblioteca CS50, 491 00:23:17,800 --> 00:23:20,400 dar ne-am decis noi ar dori să existe. 492 00:23:20,400 --> 00:23:24,550 >> Deci, dacă ne-am defila în jos mai târziu în dosar, observa cum m-am dus cu privire la punerea în aplicare a 493 00:23:24,550 --> 00:23:26,560 obține Int pozitiv, și eu spun că e mai convingatoare 494 00:23:26,560 --> 00:23:28,992 pentru că aceasta este o decent Numărul de linii de cod. 495 00:23:28,992 --> 00:23:30,700 Nu e doar o prostie mic program de jucărie. 496 00:23:30,700 --> 00:23:33,870 Este de fapt niște verificarea erorilor și de a face ceva mai util. 497 00:23:33,870 --> 00:23:38,470 >> Deci, dacă nu ați văzut walkthrough videoclipurile pe care le-am încorporate în pset1, 498 00:23:38,470 --> 00:23:42,350 știu că acesta este un tip de buclă în C, similară în spirit 499 00:23:42,350 --> 00:23:44,270 la felul de lucruri Scratch pot face. 500 00:23:44,270 --> 00:23:46,320 Și nu spune acest lucru. 501 00:23:46,320 --> 00:23:47,500 Printeaza asta. 502 00:23:47,500 --> 00:23:51,860 Apoi, mergeți mai departe și a obține N- obține un int și păstrați-l în n, 503 00:23:51,860 --> 00:23:55,760 și face asta din nou și din nou și din nou, atât timp cât n este cel puțin unul. 504 00:23:55,760 --> 00:23:58,720 >> Deci, n va fi mai mică de un numai în cazul în care omul nu este cooperant. 505 00:23:58,720 --> 00:24:01,980 În cazul în care el sau ea este tastarea în 0 sau -1 sau -50, 506 00:24:01,980 --> 00:24:04,790 această buclă se va păstra executarea din nou și din nou. 507 00:24:04,790 --> 00:24:07,549 Și în cele din urmă observa, am pur și simplu returna valoarea. 508 00:24:07,549 --> 00:24:09,590 Deci, acum avem o funcție că ar fi fost frumos 509 00:24:09,590 --> 00:24:14,040 dacă CS50-ar pune în aplicare în CS50.h și CS50.c pentru tine, 510 00:24:14,040 --> 00:24:16,520 dar aici putem acum punerea în aplicare a acestei noi. 511 00:24:16,520 --> 00:24:19,230 >> Dar două comentarii cu privire la unele detalii importante. 512 00:24:19,230 --> 00:24:24,390 Unu de ce am declara int n, crezi că, pe linia 29 513 00:24:24,390 --> 00:24:27,139 în loc de a face doar acest aici, care este 514 00:24:27,139 --> 00:24:28,930 mai consistent cu ceea ce am făcut săptămâna trecută? 515 00:24:28,930 --> 00:24:29,430 Da? 516 00:24:29,430 --> 00:24:34,485 517 00:24:34,485 --> 00:24:35,110 Un gând bun. 518 00:24:35,110 --> 00:24:37,080 Deci, dacă ar fi să-l pună aici, e ca și cum ne-am 519 00:24:37,080 --> 00:24:39,110 păstrați declarând-o din nou și din nou. 520 00:24:39,110 --> 00:24:42,000 Asta în sine este nu este problematică, în sine, 521 00:24:42,000 --> 00:24:43,940 pentru că avem nevoie de doar valoarea dată și apoi 522 00:24:43,940 --> 00:24:45,330 vom lua unul nou, oricum. 523 00:24:45,330 --> 00:24:45,940 Dar un gand bun. 524 00:24:45,940 --> 00:24:46,440 Da? 525 00:24:46,440 --> 00:24:52,770 526 00:24:52,770 --> 00:24:53,330 >> Close. 527 00:24:53,330 --> 00:24:59,030 Așa că m-am declarat n pe linia 29 în afara buclei, 528 00:24:59,030 --> 00:25:01,390 este accesibil pe tot parcursul toată această funcție. 529 00:25:01,390 --> 00:25:05,400 Nu alte funcții, deoarece n este încă în interiorul dintre acestea ondulat 530 00:25:05,400 --> 00:25:06,470 bretele aici. 531 00:25:06,470 --> 00:25:07,940 Deci-- sigur. 532 00:25:07,940 --> 00:25:12,430 533 00:25:12,430 --> 00:25:12,940 >> Exact. 534 00:25:12,940 --> 00:25:14,356 Deci, acest lucru este chiar mai mult, până la punctul. 535 00:25:14,356 --> 00:25:18,600 Dacă ne-am declarat în schimb n chiar aici pe linia 32, 536 00:25:18,600 --> 00:25:22,340 este problematică, deoarece cred unde altundeva am nevoie pentru a accesa? 537 00:25:22,340 --> 00:25:25,620 Pe linia 34, și regulă simplă este 538 00:25:25,620 --> 00:25:30,060 pe care le puteți folosi doar o variabilă în interiorul celor mai recente acolade 539 00:25:30,060 --> 00:25:31,420 în care l-ai declarat. 540 00:25:31,420 --> 00:25:35,230 >> Din păcate, linia 34 este o linie prea târziu, 541 00:25:35,230 --> 00:25:38,560 pentru că l-am închis deja acoladă pe linia 33 542 00:25:38,560 --> 00:25:41,220 care corespunde acoladă pe linia 30. 543 00:25:41,220 --> 00:25:44,180 Și astfel încât acesta este un fel de a spune că această variabilă int este luneta, 544 00:25:44,180 --> 00:25:46,970 ca să spunem așa, la numai interior din aceste acolade. 545 00:25:46,970 --> 00:25:48,910 Pur și simplu nu există în afara ei. 546 00:25:48,910 --> 00:25:51,580 >> Deci, într-adevăr, dacă am face acest lucru greșit, permiteți-mi salva codul 547 00:25:51,580 --> 00:25:53,530 cum se este-- scris incorect. 548 00:25:53,530 --> 00:25:57,990 Lasă-mă să mergeți mai departe și fac Funcția-1, și de eroare notice--. 549 00:25:57,990 --> 00:26:03,502 Utilizarea nedeclarate identificator n pe linia 35, care este chiar aici. 550 00:26:03,502 --> 00:26:05,210 Și dacă ne-am derula în sus în continuare, un altul. 551 00:26:05,210 --> 00:26:08,750 Utilizarea nedeclarate identificator n pe linia 34. 552 00:26:08,750 --> 00:26:11,200 >> Deci compilator, răsune, se observe că doar 553 00:26:11,200 --> 00:26:13,720 nu există chiar dacă clar că e acolo vizual. 554 00:26:13,720 --> 00:26:16,090 Deci, un remediu simplu este o declarare acolo. 555 00:26:16,090 --> 00:26:18,790 >> Acum, lasă-mă să derulați până la în partea de sus a fișierului. 556 00:26:18,790 --> 00:26:21,080 Ce sare la tine ca fiind un pic diferit 557 00:26:21,080 --> 00:26:23,070 de la lucrurile ne-am uitat săptămâna trecută? 558 00:26:23,070 --> 00:26:26,990 Nu numai că nu am nume, nu numai Am ceva ascuțit include până sus, 559 00:26:26,990 --> 00:26:29,340 Am ceva de care sunt de asteptare un prototip. 560 00:26:29,340 --> 00:26:36,100 Acum, că pare extrem de similar cu ceea ce tocmai am văzut în urmă cu o clipă pe linia 27. 561 00:26:36,100 --> 00:26:39,230 >> Deci, haideți să deducă dintr-un alt mesaj de eroare ce am făcut acest lucru. 562 00:26:39,230 --> 00:26:42,050 Lasă-mă să mergeți mai departe și șterge aceste linii acolo. 563 00:26:42,050 --> 00:26:44,240 Și așa nu știm nimic despre prototip. 564 00:26:44,240 --> 00:26:45,430 Remake acest fișier. 565 00:26:45,430 --> 00:26:46,890 Fă o funcție. 566 00:26:46,890 --> 00:26:48,090 Și acum, la naiba, patru erori. 567 00:26:48,090 --> 00:26:50,220 Să derulați până la prima. 568 00:26:50,220 --> 00:26:55,070 >> Declarație implicită a funcției te int pozitiv este invalid în C99. 569 00:26:55,070 --> 00:26:57,780 C99 înseamnă doar 1999 versiune a limbajului 570 00:26:57,780 --> 00:26:59,710 C, care este ceea ce suntem, într-adevăr, folosind. 571 00:26:59,710 --> 00:27:01,050 Deci, ce înseamnă asta? 572 00:27:01,050 --> 00:27:05,250 Bine C- și, mai precis, C compilers-- sunt programe destul de prost. 573 00:27:05,250 --> 00:27:07,420 Ei știu doar ceea ce ai le-a spus, și asta e 574 00:27:07,420 --> 00:27:08,960 de fapt tematic de săptămâna trecută. 575 00:27:08,960 --> 00:27:12,910 >> Problema este că, dacă mă duc despre implementarea nume aici, 576 00:27:12,910 --> 00:27:17,640 și eu numesc o funcție numită GetPositiveInt aici pe linia 20, 577 00:27:17,640 --> 00:27:22,520 că funcția de punct de vedere tehnic nu exista până compilatorul vede linia 27. 578 00:27:22,520 --> 00:27:25,450 Din păcate, compilatorul este a face lucrurile de sus, jos, stânga, dreapta, 579 00:27:25,450 --> 00:27:29,580 astfel, pentru că nu a văzut punerea în aplicare a GetPositiveInt, 580 00:27:29,580 --> 00:27:32,400 dar se vede încerci să-l folosească până aici, 581 00:27:32,400 --> 00:27:35,810 este doar de gând să țipe la bail-- te cu o eroare mesajul-- poate 582 00:27:35,810 --> 00:27:38,440 criptic, și nu de fapt compila fișierul. 583 00:27:38,440 --> 00:27:41,940 >> Deci, un așa-numit prototip up aici este, desigur, redundant. 584 00:27:41,940 --> 00:27:47,870 Literalmente, m-am dus aici și am copiat și lipit aceasta, și l-am pus aici. 585 00:27:47,870 --> 00:27:51,020 Void ar fi mai buna, asa ca vom literalmente copiați și lipiți-l de data asta. 586 00:27:51,020 --> 00:27:52,854 Eu pur și simplu copiat și inserat-o. 587 00:27:52,854 --> 00:27:54,270 Într-adevăr la fel ca ca o firimitură de pâine. 588 00:27:54,270 --> 00:27:56,260 >> Un pic indiciu de compilator. 589 00:27:56,260 --> 00:27:58,860 Nu știu ce face acest lucru totuși, dar eu promit să vă 590 00:27:58,860 --> 00:28:00,260 că va exista în cele din urmă. 591 00:28:00,260 --> 00:28:04,010 Și de aceea această line-- în linie 16-- se termină cu punct și virgulă. 592 00:28:04,010 --> 00:28:05,486 Este redundant de proiectare. 593 00:28:05,486 --> 00:28:05,986 Da? 594 00:28:05,986 --> 00:28:11,340 595 00:28:11,340 --> 00:28:14,360 >> Dacă nu ați link bibliotecă la-- oh, buna intrebare. 596 00:28:14,360 --> 00:28:17,350 Sharp include incluziuni de fișiere antet. 597 00:28:17,350 --> 00:28:20,040 Necesitatea de a fi-- ar trebui aproape să fie întotdeauna la foarte de sus 598 00:28:20,040 --> 00:28:23,270 a dosarului pentru o similar-- pentru exact același motiv, da. 599 00:28:23,270 --> 00:28:26,430 Pentru că în standardul io.h este literalmente o linie 600 00:28:26,430 --> 00:28:30,560 în acest fel, dar cu printf cuvânt, și cu argumentele sale și tipul său de retur. 601 00:28:30,560 --> 00:28:33,310 Și astfel de a face clare includ în sus aici, de ce ești literalmente faci 602 00:28:33,310 --> 00:28:36,380 este copierea și lipirea conținutului de altcineva a scris sus. 603 00:28:36,380 --> 00:28:39,660 Cluing Astfel codul din la fapt care nu exista aceste funcții. 604 00:28:39,660 --> 00:28:40,160 Da? 605 00:28:40,160 --> 00:28:47,520 606 00:28:47,520 --> 00:28:48,260 >> Absolut. 607 00:28:48,260 --> 00:28:51,690 Deci, un foarte inteligent și corect soluție ar fi, tu stii ce? 608 00:28:51,690 --> 00:28:53,760 Nu știu ce o prototip este, dar eu știu 609 00:28:53,760 --> 00:28:56,390 dacă am înțeles că C este doar mut și regândește sus în jos. 610 00:28:56,390 --> 00:28:57,820 Ei bine, să-l dea ce vrea. 611 00:28:57,820 --> 00:29:01,650 Să tai cod, lipiți-l în sus top, iar acum împingeți principal în jos de mai jos. 612 00:29:01,650 --> 00:29:03,470 Acest lucru prea ar rezolva problema. 613 00:29:03,470 --> 00:29:07,409 >> Dar ai putea veni foarte ușor cu un scenariu în care o nevoie de a apela B, 614 00:29:07,409 --> 00:29:10,075 și, poate, B cheamă înapoi la A. Acest este ceva numit recursivitate, 615 00:29:10,075 --> 00:29:11,370 și vom reveni la asta. 616 00:29:11,370 --> 00:29:13,911 Și aceasta poate sau nu poate fi un bun lucru, dar poți cu siguranță 617 00:29:13,911 --> 00:29:15,110 rupe această soluție. 618 00:29:15,110 --> 00:29:17,690 >> Și mai mult, mi-ar susțin stilistic, 619 00:29:17,690 --> 00:29:20,760 mai ales atunci când programele deveni atât de mult și atât de mult, 620 00:29:20,760 --> 00:29:23,064 e doar foarte convenabil pentru a pune principal la partea de sus 621 00:29:23,064 --> 00:29:25,730 pentru că e lucrul cel mai programatori sunt de gând să-i pese. 622 00:29:25,730 --> 00:29:28,150 Și așa că este un pic mai curat, fără îndoială, să facă pe calea 623 00:29:28,150 --> 00:29:30,380 Am făcut-o inițial cu un prototip chiar 624 00:29:30,380 --> 00:29:33,396 deși se pare un pic redundant la prima vedere. 625 00:29:33,396 --> 00:29:33,895 Da? 626 00:29:33,895 --> 00:29:36,472 627 00:29:36,472 --> 00:29:37,680 Ne pare rău, poți să-l spui mai tare? 628 00:29:37,680 --> 00:29:45,650 629 00:29:45,650 --> 00:29:49,580 >> Dacă schimbați locurile de punerea în aplicare și prototipul? 630 00:29:49,580 --> 00:29:51,270 Deci, asta este o întrebare bună. 631 00:29:51,270 --> 00:29:53,780 Dacă vă re-declare acest lucru în jos aici, să vedem ce se întâmplă. 632 00:29:53,780 --> 00:29:55,530 Deci, dacă am pus aceasta jos aici, vrei să spui. 633 00:29:55,530 --> 00:29:57,860 634 00:29:57,860 --> 00:29:58,360 Oh, îmi pare rău. 635 00:29:58,360 --> 00:29:58,859 Mai tare? 636 00:29:58,859 --> 00:30:02,000 637 00:30:02,000 --> 00:30:04,011 Chiar și mai tare. 638 00:30:04,011 --> 00:30:04,760 Oh, buna intrebare. 639 00:30:04,760 --> 00:30:05,860 Ar anula funcția? 640 00:30:05,860 --> 00:30:08,901 Știi, după toți acești ani, am nu au mai pus un prototip după aceea. 641 00:30:08,901 --> 00:30:13,810 Deci, hai sa facem face funcție-1 după ce face asta. 642 00:30:13,810 --> 00:30:15,279 >> [Mormăind] 643 00:30:15,279 --> 00:30:16,320 David J. MALAN: Oh, așteptați. 644 00:30:16,320 --> 00:30:17,944 Noi încă mai trebuie să pună totul de sus. 645 00:30:17,944 --> 00:30:21,400 Deci, hai sa facem asta aici, în cazul în care sunt înțelegerea corect întrebarea dumneavoastră. 646 00:30:21,400 --> 00:30:24,700 Pun totul, inclusiv prototipul sus principală, 647 00:30:24,700 --> 00:30:28,180 dar eu pun prototipul de mai jos punerii în aplicare. 648 00:30:28,180 --> 00:30:33,190 >> Deci, dacă am face o, eu primesc înapoi un nefolosit n variabile error--. 649 00:30:33,190 --> 00:30:37,280 650 00:30:37,280 --> 00:30:37,860 Oh, nu. 651 00:30:37,860 --> 00:30:38,360 Mulțumesc. 652 00:30:38,360 --> 00:30:39,430 Să vedem, am scăpa de acest lucru. 653 00:30:39,430 --> 00:30:41,304 Asta e un bug diferit, Să ignora asta. 654 00:30:41,304 --> 00:30:43,910 Să adevărat reface repede acest lucru. 655 00:30:43,910 --> 00:30:48,100 >> OK, deci nu argument date folosit de format String 656 00:30:48,100 --> 00:30:52,310 N- oh, asta pentru ca Mi-am schimbat la acestea aici. 657 00:30:52,310 --> 00:30:55,885 Bine, știm ce răspunsul va sa-- bine, aici vom merge. 658 00:30:55,885 --> 00:31:00,560 Ah, multumesc pentru pozitiv. 659 00:31:00,560 --> 00:31:03,430 Bine, voi rezolva acest cod dupa-- ignora această eroare special 660 00:31:03,430 --> 00:31:08,300 deoarece acest fost-- în care funcționează este răspunsul. 661 00:31:08,300 --> 00:31:11,560 >> Deci nu suprascrie ceea ce tocmai ai făcut. 662 00:31:11,560 --> 00:31:14,800 Bănuiesc compilatorul este scris în așa fel 663 00:31:14,800 --> 00:31:18,420 că este ignorarea prototip dumneavoastră deoarece organismul, ca să spunem așa, 664 00:31:18,420 --> 00:31:20,922 a funcției are deja fost implementate mai sus. 665 00:31:20,922 --> 00:31:23,380 Mi-ar trebui să consulte, de fapt manualul de compilator 666 00:31:23,380 --> 00:31:26,171 pentru a înțelege dacă există orice altă implicare, dar la prima vedere 667 00:31:26,171 --> 00:31:29,290 doar prin încercarea și experimentarea, nu pare să existe nici un impact. 668 00:31:29,290 --> 00:31:30,730 Bună întrebare. 669 00:31:30,730 --> 00:31:33,660 >> Deci, hai sa merge înainte acum, în mișcare departe de efecte secundare care 670 00:31:33,660 --> 00:31:36,660 sunt funcții care fac ceva de genul vizual pe ecran cu printf, 671 00:31:36,660 --> 00:31:38,090 dar nu se mai întorc o valoare. 672 00:31:38,090 --> 00:31:41,550 Și funcții care au retur valori ca ne-am văzut câteva. 673 00:31:41,550 --> 00:31:45,350 Am văzut deja această noțiune de domeniul de aplicare, și vom vedea acest lucru din nou și din nou. 674 00:31:45,350 --> 00:31:47,210 Dar pentru acum, din nou, folosi regula de degetul mare 675 00:31:47,210 --> 00:31:51,410 că o variabilă poate fi utilizat numai în interiorul cel mai recent deschis 676 00:31:51,410 --> 00:31:54,350 și acolade inchise ca noi a văzut în acest exemplu particular. 677 00:31:54,350 --> 00:31:56,910 >> Și, după cum ați subliniat, există o ability-- 678 00:31:56,910 --> 00:32:00,040 ai putea rezolva unele dintre aceste probleme de a pune o variabilă la nivel global 679 00:32:00,040 --> 00:32:01,290 la foarte de sus a unui fișier. 680 00:32:01,290 --> 00:32:03,630 Dar, în aproape toate cazurile ne-ar încrunta pe care, 681 00:32:03,630 --> 00:32:06,170 și într-adevăr nu mai merge în care soluția de acum. 682 00:32:06,170 --> 00:32:09,890 Deci, pentru moment, Takeaway este că variabile au această noțiune de domeniul de aplicare. 683 00:32:09,890 --> 00:32:13,430 >> Dar acum să ne uităm la un alt mod uscat de fapt, în căutarea 684 00:32:13,430 --> 00:32:15,810 la un moment destul de interesant detalii de implementare. 685 00:32:15,810 --> 00:32:17,810 Cum am putea reprezenta informații. 686 00:32:17,810 --> 00:32:20,370 Și ne-am uitat deja la acest în prima săptămână de clasa. 687 00:32:20,370 --> 00:32:23,320 Privind la binare, și amintindu-ne de zecimale. 688 00:32:23,320 --> 00:32:28,310 >> Dar amintesc de săptămâna trecută că C are diferite tipuri de date și ciorchini mai mult, 689 00:32:28,310 --> 00:32:30,600 dar cele mai utile pentru acum ar putea fi acestea. 690 00:32:30,600 --> 00:32:36,030 Un char, sau caracter, care se întâmplă să fie un octet, sau opt biți totală. 691 00:32:36,030 --> 00:32:40,060 Și asta pentru a spune că dimensiunea unui char este doar un octet. 692 00:32:40,060 --> 00:32:45,370 Un byte este de opt biți, astfel încât acest lucru înseamnă că putem reprezenta cât de multe personaje. 693 00:32:45,370 --> 00:32:47,320 Câte litere sau simboluri de pe tastatura 694 00:32:47,320 --> 00:32:49,210 dacă avem un octet sau opt biți. 695 00:32:49,210 --> 00:32:51,546 Gandeste-te la săptămână la zero. 696 00:32:51,546 --> 00:32:53,420 Dacă aveți de opt biți, cât de multe valori totale 697 00:32:53,420 --> 00:32:55,503 puteți reprezenta cu modele de zero si unu? 698 00:32:55,503 --> 00:32:58,170 699 00:32:58,170 --> 00:33:00,260 Unu mai mult decât atât. 700 00:33:00,260 --> 00:33:03,490 Deci totalul de 256, dacă începe numărarea de la zero. 701 00:33:03,490 --> 00:33:07,120 Deci, dacă aveți opt bits-- așa, dacă ne-am a avut becuri noastre binare aici din nou, 702 00:33:07,120 --> 00:33:12,180 am putea transforma aceste becuri pe și off în orice de 256 de modele unice. 703 00:33:12,180 --> 00:33:13,640 >> Acum, acest lucru este un pic problematic. 704 00:33:13,640 --> 00:33:16,857 Nu atât de mult pentru limba engleză și limbi romanice, dar cu siguranță 705 00:33:16,857 --> 00:33:19,190 atunci când introduce, pentru exemplu, limbi asiatice, care 706 00:33:19,190 --> 00:33:22,580 au mult mai multe simboluri decât ca 26 de litere ale alfabetului. 707 00:33:22,580 --> 00:33:24,390 Avem de fapt ar putea avea nevoie mai mult de un octet. 708 00:33:24,390 --> 00:33:28,240 Și din fericire, în ultimii ani a societății 709 00:33:28,240 --> 00:33:31,040 alte standarde adoptate care folosesc mai mult de un octet pentru fiecare încărcare. 710 00:33:31,040 --> 00:33:34,210 >> Dar pentru acum în C, implicit este doar un octet sau opt biți. 711 00:33:34,210 --> 00:33:38,195 Un întreg, între timp, este de patru bytes, altfel cunoscut sub numele de 32 de biți. 712 00:33:38,195 --> 00:33:41,320 Ceea ce înseamnă ceea ce este cel mai mare posibil Numărul putem reprezenta cu un int 713 00:33:41,320 --> 00:33:41,820 se pare? 714 00:33:41,820 --> 00:33:44,426 715 00:33:44,426 --> 00:33:45,050 Cu un miliard. 716 00:33:45,050 --> 00:33:46,760 Deci, este patru miliarde de da sau de a lua. 717 00:33:46,760 --> 00:33:49,840 2 la puterea 32th, dacă ne-am asuma nici numere negative 718 00:33:49,840 --> 00:33:52,530 și doar folosesc tot pozitiv numere, e patru miliarde de 719 00:33:52,530 --> 00:33:53,730 da sau de a lua posibilități. 720 00:33:53,730 --> 00:33:57,890 Un float, între timp, este un tip diferit de tip de date în C. Este încă un număr, 721 00:33:57,890 --> 00:33:58,990 dar este un număr real. 722 00:33:58,990 --> 00:34:00,660 Ceva cu un punct zecimal. 723 00:34:00,660 --> 00:34:03,000 Și se pare că C folosește, de asemenea, patru bytes 724 00:34:03,000 --> 00:34:05,340 pentru a reprezenta valorile în virgulă mobilă. 725 00:34:05,340 --> 00:34:09,420 >> Din păcate, cât de multe plutitoare Valorile punctuale există în lume? 726 00:34:09,420 --> 00:34:11,582 Câte numere reale sunt acolo? 727 00:34:11,582 --> 00:34:13,540 Există un infinit număr, și pentru care contează 728 00:34:13,540 --> 00:34:15,164 există un număr infinit de numere întregi. 729 00:34:15,164 --> 00:34:18,070 Deci suntem deja un fel de săpat ne o gaură aici. 730 00:34:18,070 --> 00:34:21,780 Care aparent în computers-- la mai puțin programe scrise în C pe them-- 731 00:34:21,780 --> 00:34:24,110 poate conta doar la fel de mare ca patru miliarde de da sau de a lua, 732 00:34:24,110 --> 00:34:26,260 și plutitoare Valorile în puncte poate doar aparent 733 00:34:26,260 --> 00:34:28,330 au o anumită cantitate finită de precizie. 734 00:34:28,330 --> 00:34:30,810 Doar atât de multe cifre după punctul lor zecimal. 735 00:34:30,810 --> 00:34:32,822 >> Pentru că, desigur, în cazul în care ai doar 32 de biți, 736 00:34:32,822 --> 00:34:36,030 Nu știu cum vom merge cu privire la reprezentând numere, reală, probabil, 737 00:34:36,030 --> 00:34:37,409 cu diferite tipuri de modele. 738 00:34:37,409 --> 00:34:40,030 Dar există cu siguranță un finit număr de astfel de modele, 739 00:34:40,030 --> 00:34:41,830 deci aici, de asemenea, acest lucru este problematic. 740 00:34:41,830 --> 00:34:43,710 >> Acum putem evita ușor problema. 741 00:34:43,710 --> 00:34:45,710 Dacă nu folosiți un flotor, ai putea folosi un dublu 742 00:34:45,710 --> 00:34:50,230 în C, care vă oferă opt bytes, care este cale mai multe modele posibile de zerouri 743 00:34:50,230 --> 00:34:50,730 și cele. 744 00:34:50,730 --> 00:34:55,199 Dar e finit, care se va a fi problematic dacă scrii software 745 00:34:55,199 --> 00:34:57,670 pentru grafică sau de fantezie formule matematice. 746 00:34:57,670 --> 00:35:00,410 Deci, s-ar putea dori de fapt, pentru a conta în sus mai mult decât atât. 747 00:35:00,410 --> 00:35:05,640 O named-- lung long-- stupid Este, de asemenea, opt octeți sau 64 de biți, 748 00:35:05,640 --> 00:35:10,260 și aceasta este de două ori mai mult timp ca un întreg, și este de o valoare întreg lung. 749 00:35:10,260 --> 00:35:15,655 >> Fact-- Fun dacă un int este de patru bytes, cât timp este un timp în C de obicei? 750 00:35:15,655 --> 00:35:18,290 751 00:35:18,290 --> 00:35:21,560 De asemenea patru bytes, dar o mult timp este de opt bytes, 752 00:35:21,560 --> 00:35:23,050 iar acest lucru este din motive istorice. 753 00:35:23,050 --> 00:35:26,450 >> Dar Takeaway acum este doar faptul că datele trebuie 754 00:35:26,450 --> 00:35:29,625 să fie reprezentate într-un computer-- care este un dispozitiv fizic cu energie electrică, 755 00:35:29,625 --> 00:35:32,190 este în general de conducere acele zerouri și ones-- 756 00:35:32,190 --> 00:35:34,320 cu cantități finite de precizie. 757 00:35:34,320 --> 00:35:35,620 Deci, care-i problema atunci? 758 00:35:35,620 --> 00:35:37,480 >> Ei bine, există o problemă de preaplin întreg. 759 00:35:37,480 --> 00:35:39,780 Nu doar în C, dar în calculatoare în general. 760 00:35:39,780 --> 00:35:42,590 De exemplu, în cazul în care acest lucru este un octet în valoare de un bit-- 761 00:35:42,590 --> 00:35:45,120 așa că, dacă acest lucru este de opt bit-- toate dintre care sunt numărul unu. 762 00:35:45,120 --> 00:35:47,300 Ce număr este aceasta reprezentând dacă presupunem 763 00:35:47,300 --> 00:35:50,730 e toate valorile pozitive în binar? 764 00:35:50,730 --> 00:35:54,410 >> 255, și nu e de 256, deoarece zero este cel mai mic număr. 765 00:35:54,410 --> 00:35:56,760 Deci, 255 este cea mai mare unul, dar problema 766 00:35:56,760 --> 00:36:00,330 se presupune că am vrut să incrementa această variabilă care 767 00:36:00,330 --> 00:36:04,030 se utilizează opt biți în total dacă vreau să-l incrementa. 768 00:36:04,030 --> 00:36:07,160 >> Ei bine, de îndată ce am adăuga un una la toate acestea, 769 00:36:07,160 --> 00:36:10,500 vă puteți imagina, probabil, doar visually-- cum ar fi realizarea cea folosind decimals-- 770 00:36:10,500 --> 00:36:12,300 ceva va curge spre stânga. 771 00:36:12,300 --> 00:36:15,590 Și, într-adevăr, dacă am adăuga numărul una cu aceasta, ceea ce se întâmplă în binar 772 00:36:15,590 --> 00:36:17,670 este că se revarsă înapoi la zero. 773 00:36:17,670 --> 00:36:21,730 >> Deci, dacă nu use-- doar un int, dar un singur octet pentru a conta întregi 774 00:36:21,730 --> 00:36:27,170 într-un program, de îndată ce default-- ajungi la 250, 251, 252, 253, 254, 775 00:36:27,170 --> 00:36:32,710 255-- 0 vine după 255, care nu ceea ce este, probabil, 776 00:36:32,710 --> 00:36:34,790 un utilizator este de gând să se aștepte. 777 00:36:34,790 --> 00:36:39,620 >> Acum, în timp ce în punctul lume plutitoare, aveți, de asemenea, o problemă similară. 778 00:36:39,620 --> 00:36:42,670 Nu atât de mult cu cea mai mare number-- deși e încă o problemă. 779 00:36:42,670 --> 00:36:45,360 Dar, cu suma de precizie pe care le poate reprezenta. 780 00:36:45,360 --> 00:36:49,490 Deci, haideți să aruncăm o privire la acest exemplu aici, de asemenea, de la code-- sursă de astăzi 781 00:36:49,490 --> 00:36:52,070 float-0.c. 782 00:36:52,070 --> 00:36:54,280 >> Și observați că acesta este un super- program simplu care 783 00:36:54,280 --> 00:36:56,580 aparent ar trebui să imprime ce valoare? 784 00:36:56,580 --> 00:37:00,777 785 00:37:00,777 --> 00:37:04,110 Ce vrei să pariezi acest lucru se întâmplă pentru a imprima chiar dacă există un pic de nou sintaxă 786 00:37:04,110 --> 00:37:05,540 aici? 787 00:37:05,540 --> 00:37:06,700 Deci, sperăm 0,1. 788 00:37:06,700 --> 00:37:10,000 Deci echivalentul unei zecimi de pentru că fac eu 1 împărțit la 10. 789 00:37:10,000 --> 00:37:12,430 Am stocarea răspunsul într-o variabilă numită f. 790 00:37:12,430 --> 00:37:15,850 Această variabilă este de tip float, care este un cuvânt cheie am propus existat. 791 00:37:15,850 --> 00:37:18,910 >> Noi nu am văzut acest lucru înainte, dar aceasta este un fel de un mod elegant în printf 792 00:37:18,910 --> 00:37:22,110 pentru a specifica cât de multe cifre tine Vreau să văd după un punct zecimal. 793 00:37:22,110 --> 00:37:25,020 Deci, această notație înseamnă doar că aici e un înlocuitor. 794 00:37:25,020 --> 00:37:27,900 E pentru un punct de flotant valoare, și oh, apropo, 795 00:37:27,900 --> 00:37:31,389 arată o cu virgulă cu un număr de după virgulă. 796 00:37:31,389 --> 00:37:33,180 Deci, asta e numărul de cifre semnificative, 797 00:37:33,180 --> 00:37:34,650 ca să spunem așa, că s-ar putea dori. 798 00:37:34,650 --> 00:37:40,450 >> Așa că lasă-mă să mergeți mai departe și face face-float 0, ./float-0, 799 00:37:40,450 --> 00:37:46,660 și se pare că 1 împărțit la 10 este 0.0. 800 00:37:46,660 --> 00:37:47,760 Acum, de ce este aceasta? 801 00:37:47,760 --> 00:37:51,380 >> Ei bine, din nou, calculatorul este de a lua mă literalmente, și am scris o 802 00:37:51,380 --> 00:37:56,680 și am scris 10, și să ia o ghici ce este tipul de date asumat de cei doi 803 00:37:56,680 --> 00:37:58,440 valori? 804 00:37:58,440 --> 00:38:00,970 Un întreg, este punct de vedere tehnic ceva un pic diferit. 805 00:38:00,970 --> 00:38:04,150 Este de obicei o lungă, dar e în cele din urmă o valoare integrală. 806 00:38:04,150 --> 00:38:06,030 Nu este o valoare în virgulă mobilă. 807 00:38:06,030 --> 00:38:09,456 >> Care este de a spune că în cazul în care acest lucru este un întreg și acest lucru este un int, 808 00:38:09,456 --> 00:38:11,830 Problema este că computerul nu are capacitatea 809 00:38:11,830 --> 00:38:13,680 pentru a stoca chiar acel punct zecimal. 810 00:38:13,680 --> 00:38:16,430 Deci, atunci când faci o divizat de 10 folosind întregi 811 00:38:16,430 --> 00:38:20,950 atât pentru numărător și numitor, răspunsul ar trebui să fie de 0,1. 812 00:38:20,950 --> 00:38:24,930 Dar computer-- deoarece acestea sunt integers-- 813 00:38:24,930 --> 00:38:27,430 nu știe ce să facă cu 0.1. 814 00:38:27,430 --> 00:38:30,010 >> Deci, ceea ce o face în mod clar? 815 00:38:30,010 --> 00:38:33,120 E doar o aruncați, și ceea ce văd în cele din urmă 816 00:38:33,120 --> 00:38:38,830 este 0.0 doar pentru că am insistat asupra faptului că printf arată-mi un punct zecimal. 817 00:38:38,830 --> 00:38:41,740 Dar problema este că, dacă împărți un număr întreg de un număr întreg, 818 00:38:41,740 --> 00:38:44,347 va sa--, prin definiție, de C- un număr întreg. 819 00:38:44,347 --> 00:38:46,680 Și nu va face ceva frumos și convenabil 820 00:38:46,680 --> 00:38:49,040 ca în jurul lui până la cel mai apropiat una în sus sau în jos. 821 00:38:49,040 --> 00:38:51,860 Se va trunchia tot după zecimal. 822 00:38:51,860 --> 00:38:54,030 >> Deci, doar intuitiv, ceea ce este, probabil, un fix? 823 00:38:54,030 --> 00:38:55,351 Care este cea mai simplă fix aici? 824 00:38:55,351 --> 00:38:55,850 Da? 825 00:38:55,850 --> 00:39:00,570 826 00:39:00,570 --> 00:39:01,100 Exact. 827 00:39:01,100 --> 00:39:04,200 De ce nu ne-am trata aceste ca valori în virgulă mobilă în mod eficient 828 00:39:04,200 --> 00:39:05,860 transformându-le în flotoare sau duble. 829 00:39:05,860 --> 00:39:10,500 Și acum, dacă eu fac fac flotoare-0, sau dacă am compila pluteste-o, 830 00:39:10,500 --> 00:39:12,570 care este identic cu ceea ce a fost deja propus. 831 00:39:12,570 --> 00:39:16,400 Și acum eu fac flotoare-0, acum primesc mea 0.1. 832 00:39:16,400 --> 00:39:17,234 >> Acum, acest lucru este uimitor. 833 00:39:17,234 --> 00:39:19,441 Dar acum am de gând să fac ceva un pic diferit. 834 00:39:19,441 --> 00:39:22,280 Sunt curios să văd ce e cu adevărat întâmplă sub capotă, 835 00:39:22,280 --> 00:39:26,050 și am de gând să imprimați această la 28 de zecimale. 836 00:39:26,050 --> 00:39:29,730 Vreau să văd într-adevăr 0.1000-- un infinite-- 837 00:39:29,730 --> 00:39:32,710 [Inaudibil] 27 zerouri, după care 0,1. 838 00:39:32,710 --> 00:39:34,740 >> Ei bine, să vedem dacă asta ceea ce într-adevăr mă. 839 00:39:34,740 --> 00:39:39,430 Asigurați-pluteste-0 același fișier. 840 00:39:39,430 --> 00:39:41,150 ./floats-0. 841 00:39:41,150 --> 00:39:44,380 Să mări răspunsul dramatic. 842 00:39:44,380 --> 00:39:49,980 În tot acest timp, ai fost de gândire 1 împărțit la 10 este de 10%, sau 0,1. 843 00:39:49,980 --> 00:39:50,810 Nu este. 844 00:39:50,810 --> 00:39:53,210 Cel puțin în măsura în computerului în cauză. 845 00:39:53,210 --> 00:39:57,060 >> Acum ce-- OK, asta e complet minciună 1 împărțit la 10 este de 0,1. 846 00:39:57,060 --> 00:39:59,710 Dar ce-- că nu este Takeaway astăzi. 847 00:39:59,710 --> 00:40:04,010 Deci, de ce nu cred calculator, spre deosebire de noi toți în cameră, 848 00:40:04,010 --> 00:40:06,870 ca 1 împărțit la 10 este de fapt, că valoarea nebun? 849 00:40:06,870 --> 00:40:10,620 Care este computerul face aparent? 850 00:40:10,620 --> 00:40:12,490 Ce-i asta? 851 00:40:12,490 --> 00:40:13,785 >> Nu se reverse, în sine. 852 00:40:13,785 --> 00:40:15,910 Overflow este, de obicei, atunci când când înfășurați în jurul unei valori. 853 00:40:15,910 --> 00:40:18,970 Este această chestiune de imprecizie la o valoare în virgulă mobilă 854 00:40:18,970 --> 00:40:22,220 în cazul în care aveți doar 32 sau poate chiar 64 de biți. 855 00:40:22,220 --> 00:40:25,230 Dar dacă există un infinit Numărul de numere, reale 856 00:40:25,230 --> 00:40:27,940 Numere cu zecimale și numerele de thereafter-- cu siguranță 857 00:40:27,940 --> 00:40:29,380 nu se poate reprezenta pe toate. 858 00:40:29,380 --> 00:40:32,870 Deci, computerul a dat ne cea mai apropiată 859 00:40:32,870 --> 00:40:37,090 la valoarea pe care o poate reprezenta utilizarea acestei mulți biți la valoarea vreau de fapt, 860 00:40:37,090 --> 00:40:38,690 care este de 0,1. 861 00:40:38,690 --> 00:40:40,685 >> Din păcate, dacă începe să faci matematica, sau te 862 00:40:40,685 --> 00:40:44,360 începe implică aceste tipuri de plutire Valorile în puncte în programs-- importante 863 00:40:44,360 --> 00:40:46,770 software-ul financiar, nimic software-- militar 864 00:40:46,770 --> 00:40:49,090 în cazul în care percepția este probabil destul de importantă. 865 00:40:49,090 --> 00:40:51,520 Și începe să adăugați numere, cum ar fi acest lucru, și să înceapă 866 00:40:51,520 --> 00:40:54,050 rulare că software-ul cu intrări foarte mari 867 00:40:54,050 --> 00:40:56,890 sau de o mulțime de ore sau loturi de zile sau o mulțime de ani, 868 00:40:56,890 --> 00:41:01,060 aceste greșeli mici mici cu siguranță se pot adăuga de-a lungul timpului. 869 00:41:01,060 --> 00:41:04,252 >> Acum, ca o paranteza, dacă ai vreodată văzut Superman 3 sau Office Space 870 00:41:04,252 --> 00:41:05,960 și s-ar putea aminti cum tipii ăia au furat 871 00:41:05,960 --> 00:41:08,668 o mulțime de bani de pe computerul lor prin utilizarea valorilor în virgulă mobilă 872 00:41:08,668 --> 00:41:11,290 și adunarea putinul resturi, sperăm că filmul 873 00:41:11,290 --> 00:41:12,390 are acum mai mult sens. 874 00:41:12,390 --> 00:41:14,930 Aceasta este ceea ce au fost făcând aluzie la faptul că în film. 875 00:41:14,930 --> 00:41:16,710 Faptul că majoritatea companiile nu s-ar uita 876 00:41:16,710 --> 00:41:18,600 după un anumit număr de zecimale, 877 00:41:18,600 --> 00:41:20,009 dar cei care sunt fracțiuni de cenți. 878 00:41:20,009 --> 00:41:22,550 Așa că începeți să adăugați-le în sus, de a începe să facă o mulțime de bani 879 00:41:22,550 --> 00:41:23,424 în contul tău bancar. 880 00:41:23,424 --> 00:41:25,160 Deci, asta e Birouri explicat. 881 00:41:25,160 --> 00:41:28,220 >> Acum, din păcate, dincolo de Birouri, acolo 882 00:41:28,220 --> 00:41:31,794 sunt unele legitim ingrijoratoare și un impact semnificativ 883 00:41:31,794 --> 00:41:33,710 de aceste tipuri de deciziile de design de bază, 884 00:41:33,710 --> 00:41:35,990 și într-adevăr, unul dintre motivele folosim C în cursul 885 00:41:35,990 --> 00:41:39,640 este, asa vei avea într-adevăr acest motiv până înțelegere a modului în care funcționează calculatoare, 886 00:41:39,640 --> 00:41:42,440 cum software-ul lucrează, și nu ia nimic de la sine. 887 00:41:42,440 --> 00:41:45,820 >> Și într-adevăr, din păcate, chiar și cu că înțelegerea fundamentală, 888 00:41:45,820 --> 00:41:47,370 Noi, oamenii, facem greșeli. 889 00:41:47,370 --> 00:41:51,310 Și ce m-am gândit împărtășesc este acest videoclip opt minute luată aici 890 00:41:51,310 --> 00:41:56,980 de la un episod Minuni moderne, care este un spectacol de învățământ la cum merg lucrurile 891 00:41:56,980 --> 00:42:00,370 care pictează două imagini de când o utilizare improprie 892 00:42:00,370 --> 00:42:02,540 și de înțelegere a valori în virgulă mobilă 893 00:42:02,540 --> 00:42:05,610 condus la unele semnificative rezultate nefericite. 894 00:42:05,610 --> 00:42:06,363 Să aruncăm o privire. 895 00:42:06,363 --> 00:42:07,029 [VIDEO PLAYBACK] 896 00:42:07,029 --> 00:42:11,290 -Noi Acum a reveni la "Inginerie Dezastre "pe Minuni moderne. 897 00:42:11,290 --> 00:42:12,940 Calculatoare. 898 00:42:12,940 --> 00:42:15,580 Am venit pentru a accepta probleme de multe ori frustrant că 899 00:42:15,580 --> 00:42:20,960 Trebuie cu them-- bug-uri, viruși, și glitches-- software pentru preturi mici 900 00:42:20,960 --> 00:42:23,100 să plătească pentru confortul. 901 00:42:23,100 --> 00:42:27,770 Dar, în high tech și de mare viteză aplicatii programul spatial militare și, 902 00:42:27,770 --> 00:42:32,780 cea mai mică problemă poate fi amplificat în caz de dezastru. 903 00:42:32,780 --> 00:42:38,880 >> Pe 4 iunie 1996, oamenii de stiinta pregătit pentru a lansa o fără pilot racheta Ariane 5. 904 00:42:38,880 --> 00:42:41,190 Acesta a fost transportă științific sateliți proiectat 905 00:42:41,190 --> 00:42:44,570 pentru a stabili exact cum Interactioneaza campul magnetic al Pamantului 906 00:42:44,570 --> 00:42:47,380 cu vânturile solare. 907 00:42:47,380 --> 00:42:50,580 Racheta a fost construit pentru Agenția Spațială Europeană, 908 00:42:50,580 --> 00:42:54,400 și a decolat de la facilitatea de pe coasta Guyanei Franceze. 909 00:42:54,400 --> 00:42:57,520 >> -La Aproximativ 37 secunde în zborul, ei primul 910 00:42:57,520 --> 00:42:59,070 a observat că se întâmplă ceva în neregulă. 911 00:42:59,070 --> 00:43:02,240 Că duzele s-au pivotante într-un mod în care într-adevăr nu ar trebui. 912 00:43:02,240 --> 00:43:06,550 În jurul valorii de 40 secunde în zbor, clar vehiculul a fost în necaz, 913 00:43:06,550 --> 00:43:08,820 și atunci au făcut decizia de a-l distruge. 914 00:43:08,820 --> 00:43:12,370 Responsabilul cu siguranța gamă, cu curaj extraordinar, apăsat butonul 915 00:43:12,370 --> 00:43:18,030 și a explodat racheta înainte de a putea deveni un pericol pentru siguranța publică. 916 00:43:18,030 --> 00:43:21,010 >> Asta a fost fecioara călătorie de Ariane 5, 917 00:43:21,010 --> 00:43:23,920 și distrugere a loc din cauza defectului 918 00:43:23,920 --> 00:43:25,932 încorporat în software-ul rachetei. 919 00:43:25,932 --> 00:43:27,640 -Contravaloarea Problemă pe Ariane a fost că acolo 920 00:43:27,640 --> 00:43:30,500 a fost un număr care este necesar 64 de biți pentru a exprima, 921 00:43:30,500 --> 00:43:33,560 și au vrut să transforme l la un număr de 16 biți. 922 00:43:33,560 --> 00:43:36,820 Ei au presupus că numărul nu a fost niciodată de gând să fie foarte mare. 923 00:43:36,820 --> 00:43:40,940 Că cele mai multe dintre aceste cifre în numărul 64 de biți sunt zerouri. 924 00:43:40,940 --> 00:43:42,450 Ei au fost greșit. 925 00:43:42,450 --> 00:43:45,000 >> -Contravaloarea Incapacitatea de unul program software pentru a accepta 926 00:43:45,000 --> 00:43:49,460 tipul de număr generat de un alt fost la originea eșecului. 927 00:43:49,460 --> 00:43:54,260 Dezvoltarea de software a devenit o parte foarte costisitor de noi tehnologii. 928 00:43:54,260 --> 00:43:57,060 Ariane 4 racheta a avut fost foarte de succes. 929 00:43:57,060 --> 00:44:01,600 Atât de mult a software-ului creat de a fost, de asemenea, utilizat în Ariane 5. 930 00:44:01,600 --> 00:44:04,790 >> -Contravaloarea Problemă de bază a fost ca Ariane 5. 931 00:44:04,790 --> 00:44:11,200 A fost faster-- accelerat mai rapid, și software-ul nu a reprezentat pentru asta. 932 00:44:11,200 --> 00:44:14,910 >> -Contravaloarea Distrugere a rachetei a fost un dezastru financiar imens. 933 00:44:14,910 --> 00:44:18,630 Tot din cauza unei erori de software minut. 934 00:44:18,630 --> 00:44:21,160 Dar acest lucru nu a fost primul probleme de conversie a datelor în timp 935 00:44:21,160 --> 00:44:24,770 au afectat tehnologiei moderne de rachete. 936 00:44:24,770 --> 00:44:28,020 >> -În 1991 cu începerea din primul război din Golf, 937 00:44:28,020 --> 00:44:30,540 de rachete Patriot experimentat un fel asemănător 938 00:44:30,540 --> 00:44:32,465 a unei probleme de conversie număr. 939 00:44:32,465 --> 00:44:36,760 Și, ca urmare 28 de oameni pana 28 Soldiers-- americani au fost uciși, 940 00:44:36,760 --> 00:44:39,010 și aproximativ o sută de alții răniți. 941 00:44:39,010 --> 00:44:42,830 Când Patriot, care ar fi trebuit pentru a proteja împotriva Scuds de intrare, 942 00:44:42,830 --> 00:44:45,780 nu a reușit să tragă o rachetă. 943 00:44:45,780 --> 00:44:51,610 >> -Când Irakul a invadat Kuweitul, și America de a lansat Desert Storm, la începutul anului 1991, 944 00:44:51,610 --> 00:44:55,720 Baterii de rachete Patriot au fost desfășurate pentru a proteja Arabia Saudită și Israel 945 00:44:55,720 --> 00:44:59,180 de la atacurile cu rachete Scud irakiene. 946 00:44:59,180 --> 00:45:03,080 Patriot este un mediu-gama SUA sol-aer sistem 947 00:45:03,080 --> 00:45:06,530 fabricat de compania Raytheon. 948 00:45:06,530 --> 00:45:09,500 >> -Contravaloarea Dimensiunea Patriot interceptor itself-- 949 00:45:09,500 --> 00:45:14,705 este vorba despre aproximativ 20 de metri lungime, si cantareste aproximativ 2.000 de lire sterline. 950 00:45:14,705 --> 00:45:19,090 Și poartă un focos de aproximativ, Cred că e de aproximativ 150 de lire sterline. 951 00:45:19,090 --> 00:45:23,880 Și focosul în sine este un exploziv ridicat, care 952 00:45:23,880 --> 00:45:26,700 are fragmente din jurul lui. 953 00:45:26,700 --> 00:45:31,630 Deci, carcasa de focosul este conceput pentru a acționa ca o alice mari. 954 00:45:31,630 --> 00:45:34,040 >> -Contravaloarea Rachete sunt efectuate patru per container, 955 00:45:34,040 --> 00:45:37,170 și sunt transportate de către o semiremorcă. 956 00:45:37,170 --> 00:45:44,880 >> -Sistemul Patriot anti-rachetă merge înapoi cu cel puțin 20 de ani. 957 00:45:44,880 --> 00:45:48,380 Acesta a fost conceput inițial ca o rachetă de apărare aeriană 958 00:45:48,380 --> 00:45:50,810 pentru a trage în jos avioane inamice. 959 00:45:50,810 --> 00:45:54,410 În primul război din Golf în momentul în care războiul a venit pe, 960 00:45:54,410 --> 00:45:59,650 Armata a vrut să-l folosească pentru a trage în jos Scuds, nu avioane. 961 00:45:59,650 --> 00:46:03,580 Irakian Air Force a fost nu atât de mult de o problemă, 962 00:46:03,580 --> 00:46:06,590 dar armata a fost îngrijorat Scuds. 963 00:46:06,590 --> 00:46:10,120 Și așa au încercat să upgrade la Patriot. 964 00:46:10,120 --> 00:46:12,740 >> -Intercepting Un inamic rachetă care călătoresc la Mach 5 965 00:46:12,740 --> 00:46:15,670 a fost de gând să fie suficient de provocatoare. 966 00:46:15,670 --> 00:46:18,440 Dar când Patriot a fost dus de urgenta la serviciu, 967 00:46:18,440 --> 00:46:22,580 Armata nu a fost conștient de o modificare irakian care 968 00:46:22,580 --> 00:46:25,880 făcut scuds lor aproape imposibil să-l. 969 00:46:25,880 --> 00:46:30,690 >> Ce sa întâmplat este că Scuds veneau în era instabil. 970 00:46:30,690 --> 00:46:32,000 Ei au fost wobbly. 971 00:46:32,000 --> 00:46:37,210 Motivul pentru acest lucru a fost de Iraqis-- în scopul de a obține 600 km afară 972 00:46:37,210 --> 00:46:41,680 de o gamă missile-- de 300 de kilometri a luat in greutate din focos din față, 973 00:46:41,680 --> 00:46:43,340 și a făcut focosul brichetă. 974 00:46:43,340 --> 00:46:48,490 Deci, acum Patriot încearcă să vină la Scud, și de cele mai multe timp-- 975 00:46:48,490 --> 00:46:52,880 Majoritatea covârșitoare a timp-- ar zbura doar prin Scud. 976 00:46:52,880 --> 00:46:57,120 >> -După Operatorii de sisteme Patriot realizat Patriot ratat ținta, 977 00:46:57,120 --> 00:47:01,630 au detonat focos Patrioților pentru a evita posibilele victime dacă ea 978 00:47:01,630 --> 00:47:04,440 a fost lăsat să cadă la pământ. 979 00:47:04,440 --> 00:47:08,700 >> Asta a fost ceea ce a văzut mai mulți oameni ca mingi de foc mari în cer, 980 00:47:08,700 --> 00:47:14,180 și înțeleasă greșit ca intercepteaza de focoase Scud. 981 00:47:14,180 --> 00:47:18,020 >> -Deși În cerul de noapte, Patriots părea să fie distrus cu succes 982 00:47:18,020 --> 00:47:23,280 Scuds, la Dhahran ar putea exista nici o greseala despre performanțele sale. 983 00:47:23,280 --> 00:47:27,930 Acolo sistem radar Patrioților cale pierdut de un Scud de intrare 984 00:47:27,930 --> 00:47:30,260 și niciodată nu a lansat din cauza la un defect de software. 985 00:47:30,260 --> 00:47:34,060 986 00:47:34,060 --> 00:47:38,880 >> Acesta a fost israelienii care au descoperit primul care mai este sistemul a fost pe, 987 00:47:38,880 --> 00:47:41,130 cu atât mai mare diferența de timp au devenit. 988 00:47:41,130 --> 00:47:44,770 Datorită un ceas încorporat în calculator a sistemului. 989 00:47:44,770 --> 00:47:48,190 >> -Despre Două săptămâni înainte tragedia în Dhahran, 990 00:47:48,190 --> 00:47:50,720 israelienii au raportat la Departamentul Apararii 991 00:47:50,720 --> 00:47:52,410 că sistemul pierdea timp. 992 00:47:52,410 --> 00:47:54,410 După aproximativ opt ore de funcționare, au observat 993 00:47:54,410 --> 00:47:57,690 că sistemul de anii din ce în ce considerabil mai puțin precise. 994 00:47:57,690 --> 00:48:01,850 Departamentul Apărării a răspuns prin spune toate bateriile Patriot 995 00:48:01,850 --> 00:48:04,800 să nu părăsească sistemul pe o perioadă îndelungată. 996 00:48:04,800 --> 00:48:06,980 Ei nu au spus ceea ce a fost o lungă perioadă de timp. 997 00:48:06,980 --> 00:48:09,140 8 ore, 10 ore, o mie de ore. 998 00:48:09,140 --> 00:48:11,300 Nimeni nu știa. 999 00:48:11,300 --> 00:48:13,320 >> -Contravaloarea Baterie Patriot staționate la cazarma 1000 00:48:13,320 --> 00:48:18,310 la Dhahran și viciate intern sale ceas au fost pe de peste 100 de ore 1001 00:48:18,310 --> 00:48:21,520 în noaptea din 25 februarie. 1002 00:48:21,520 --> 00:48:25,792 >> -Este Timp urmarite cu o acuratețe de aproximativ o zecime de secundă. 1003 00:48:25,792 --> 00:48:27,950 Acum, o zecime de secundă este un număr interesant 1004 00:48:27,950 --> 00:48:31,850 deoarece nu poate fi exprimat în binar exact, care 1005 00:48:31,850 --> 00:48:36,500 înseamnă că nu poate fi exprimat exact în orice calculator digital modern. 1006 00:48:36,500 --> 00:48:41,070 Este greu de crezut, dar folosi acest lucru ca un exemplu. 1007 00:48:41,070 --> 00:48:43,420 >> Să luăm numărul treime. 1008 00:48:43,420 --> 00:48:47,330 O treime nu poate fi exprimată în zecimal exact. 1009 00:48:47,330 --> 00:48:52,060 O treime este 0,333 întâmplă pentru infinit. 1010 00:48:52,060 --> 00:48:56,420 Nu există nici o modalitate de a face asta cu precizie absolută într-o zecimală. 1011 00:48:56,420 --> 00:48:59,530 Acesta este exact genul de problemă care sa întâmplat în Patriot. 1012 00:48:59,530 --> 00:49:04,040 Mai mult sistemul de alergat, mai rău eroarea de timp a devenit. 1013 00:49:04,040 --> 00:49:08,840 >> -Dupa 100 de ore de funcționare, eroare în timp a fost doar aproximativ o treime 1014 00:49:08,840 --> 00:49:10,440 dintr-o secundă. 1015 00:49:10,440 --> 00:49:14,150 Dar, în ceea ce privește orientarea o rachetă care călătoresc la Mach 5, 1016 00:49:14,150 --> 00:49:18,560 a rezultat într-o urmărire eroare de peste 600 de metri. 1017 00:49:18,560 --> 00:49:21,870 Ar fi o eroare fatală pentru soldații de la Dhahran. 1018 00:49:21,870 --> 00:49:28,455 >> Ce sa întâmplat este o lansare Scud a fost detectate de sateliți de avertizare timpurie, 1019 00:49:28,455 --> 00:49:32,710 și au cunoscut o Scud vine în direcția lor generală. 1020 00:49:32,710 --> 00:49:35,150 Ei nu știu de unde a venit. 1021 00:49:35,150 --> 00:49:38,210 A fost acum până la radar componentă a sistemului Patriot 1022 00:49:38,210 --> 00:49:43,150 apărarea Dhahran pentru a localiza și să păstreze cale de racheta inamic de intrare. 1023 00:49:43,150 --> 00:49:44,561 >> -Contravaloarea Radar a fost foarte inteligent. 1024 00:49:44,561 --> 00:49:46,560 S-ar urmări de fapt poziția Scud 1025 00:49:46,560 --> 00:49:48,930 și apoi prezice unde probabil că ar fi 1026 00:49:48,930 --> 00:49:51,380 data viitoare radar a trimis un puls afară. 1027 00:49:51,380 --> 00:49:53,040 Care a fost numit poarta gamă. 1028 00:49:53,040 --> 00:49:57,620 >> Atunci dată Patriot decide suficient timp are 1029 00:49:57,620 --> 00:50:02,400 a trecut pentru a merge înapoi și verifică următoarea locație pentru acest obiect detectat 1030 00:50:02,400 --> 00:50:03,550 merge înapoi. 1031 00:50:03,550 --> 00:50:07,820 Deci, atunci când s-au întors la greșit loc, se vede atunci nici un obiect. 1032 00:50:07,820 --> 00:50:10,360 Și se decide că nu a existat nici un obiect. 1033 00:50:10,360 --> 00:50:13,630 Aceasta a fost o detecție fals și scade pista. 1034 00:50:13,630 --> 00:50:16,970 >> -Contravaloarea Intrare Scud dispărut din ecranul de radar, 1035 00:50:16,970 --> 00:50:20,200 și secunde mai târziu, ea trântit în barăci. 1036 00:50:20,200 --> 00:50:22,570 Scud ucis 28. 1037 00:50:22,570 --> 00:50:26,110 Acesta a fost concediat ultima în timpul primului război din Golf. 1038 00:50:26,110 --> 00:50:31,920 În mod tragic, software-ul actualizat a sosit în zori în ziua următoare. 1039 00:50:31,920 --> 00:50:34,870 Defect de software a avut fost fixate, de închidere 1040 00:50:34,870 --> 00:50:39,150 un capitol în tulbure istorie de rachete Patriot. 1041 00:50:39,150 --> 00:50:40,030 >> [END VIDEO PLAYBACK] 1042 00:50:40,030 --> 00:50:41,488 >> David J. MALAN: Asta e pentru CS50. 1043 00:50:41,488 --> 00:50:42,820 Ne vedem miercuri. 1044 00:50:42,820 --> 00:50:46,420 1045 00:50:46,420 --> 00:50:50,370 >> [MUSIC JOC] 1046 00:50:50,370 --> 00:54:23,446