1 00:00:02,982 --> 00:00:06,461 [MŪZIKA ATSKAŅOTĀS] 2 00:01:12,600 --> 00:01:13,590 DEIVIDS MALANS: Labi. 3 00:01:13,590 --> 00:01:16,800 Šī ir CS50, un šī ir 2. nedēļa, kurā mēs aplūkosim zemāku līmeni, kā 4 00:01:16,800 --> 00:01:20,010 lietas darbojas, un patiešām, starp kursa mērķiem ir šī augšupēja 5 00:01:20,010 --> 00:01:23,220 izpratne, lai pēc pāris nedēļām pēc laika, pat pēc dažiem gadiem, kad 6 00:01:23,220 --> 00:01:26,430 jūs saskaraties ar jaunām tehnoloģijām, jūs varēsiet cerīgi 7 00:01:26,430 --> 00:01:29,640 atskatīties uz kādu no šīs nedēļas, un tie ir pamata elementi un 8 00:01:29,640 --> 00:01:32,850 primitīvi, un tiešām tikai secināt, kā darbojas rītdienas 9 00:01:32,850 --> 00:01:36,060 tehnoloģijas. 10 00:01:36,060 --> 00:01:38,720 Bet pa ceļam šķitīs, ka, tā sakot, būs nedaudz grūti saskatīt mežu 11 00:01:38,720 --> 00:01:41,380 kokiem. 12 00:01:41,380 --> 00:01:44,783 Un tāpēc mērķis dienas beigās joprojām būs problēmu risināšana. 13 00:01:44,783 --> 00:01:47,615 Un tāpēc mēs domājām, ka šodien sāksim ar dažām problēmām, par kurām 14 00:01:47,615 --> 00:01:50,447 runāsim vai atrisināsim nākamajā nedēļā, un tāpēc mums ir daži 15 00:01:50,447 --> 00:01:53,280 drosmīgi brīvprātīgie, kuri jau ir nākuši klajā. 16 00:01:53,280 --> 00:01:55,800 Ja mēs varētu ieslēgt kādu dramatisku apgaismojumu un satikt mūsdienu 17 00:01:55,800 --> 00:01:58,320 brīvprātīgos. 18 00:01:58,320 --> 00:02:00,930 Tātad man pa kreisi šeit ir... ALEKSS: Sveiki. 19 00:02:00,930 --> 00:02:01,960 Mani sauc Alekss. 20 00:02:01,960 --> 00:02:05,340 Es mācos pirmajā kursā koledžā un esmu no Chapel Hill, Ziemeļkarolīnā. 21 00:02:05,340 --> 00:02:07,080 DEIVIDS MALANS: Laipni lūdzam Aleksā. 22 00:02:07,080 --> 00:02:09,180 Un Aleksam pa labi. 23 00:02:09,180 --> 00:02:10,050 SĀRA: Es esmu Sāra. 24 00:02:10,050 --> 00:02:13,230 Es esmu no Toronto, Kanādā, un esmu arī pirmā kursa students koledžā. 25 00:02:13,230 --> 00:02:14,188 DEIVIDS MALANS: Brīnišķīgi. 26 00:02:14,188 --> 00:02:15,869 Labi, laipni lūdzam Aleksam un Sārai. 27 00:02:15,869 --> 00:02:19,044 Tāpēc viena no problēmām, ko, iespējams, atrisināsiet šonedēļ 28 00:02:19,044 --> 00:02:22,219 saistībā ar 2. uzdevumu kopu, ir analizēt teksta kopas lasīšanas 29 00:02:22,219 --> 00:02:25,394 līmeni, neatkarīgi no tā, vai kāds lasa pirmās klases, otrās klases, 30 00:02:25,394 --> 00:02:28,570 trešās klases līmenī, līdz pat 12 vai 13 vai vairāk. 31 00:02:28,570 --> 00:02:31,296 Par ko jūs, iespējams, nekad nedomājāt, protams, attiecībā uz kodu, 32 00:02:31,296 --> 00:02:34,023 piemēram, kā jūs analizētu kādu tekstu, kādu grāmatu un noskaidrotu, 33 00:02:34,023 --> 00:02:36,750 kādā lasīšanas līmenī tas ir. 34 00:02:36,750 --> 00:02:40,330 Un tomēr mūsu skolotāji, augot, to zināja vai intuitīvi nojauta. 35 00:02:40,330 --> 00:02:42,450 Tātad, aplūkosim teksta paraugu. 36 00:02:42,450 --> 00:02:45,960 Piemēram, Aleks, ko tu pēdējā laikā esi lasījis? 37 00:02:45,960 --> 00:02:52,502 ALEKSS: Viena zivs, divas zivis, sarkanas zivis, zilas zivis. 38 00:02:52,502 --> 00:02:53,460 DEIVIDS MALANS: Brīnišķīgi. 39 00:02:53,460 --> 00:02:58,890 Ņemot to vērā, kādā klasē, jūsuprāt, Alekss pašlaik lasa? 40 00:02:58,890 --> 00:03:01,500 Jūtieties brīvi vienkārši izkliegt to. 41 00:03:01,500 --> 00:03:02,730 Pirmais, pirmais? 42 00:03:02,730 --> 00:03:05,290 Tātad patiešām šonedēļ jūs redzēsit, ka, ja palaižat kodu Aleksa 43 00:03:05,290 --> 00:03:07,850 tekstam, izrādīsies, ka viņš lasa zemāk par pirmās klases lasīšanas 44 00:03:07,850 --> 00:03:10,410 līmeni. 45 00:03:10,410 --> 00:03:12,400 Bet kāpēc tas varētu būt? 46 00:03:12,400 --> 00:03:15,710 Kāda varētu būt jūsu intuīcija, kāpēc mēs esam apsūdzējuši Aleksu par 47 00:03:15,710 --> 00:03:19,020 lasīšanu šādā līmenī? 48 00:03:19,020 --> 00:03:20,990 Jūtieties brīvi izkliegties. 49 00:03:20,990 --> 00:03:21,490 Jā. 50 00:03:21,490 --> 00:03:24,520 Tik ļoti maz zilbju, īsu vārdu, īsu teikumu. 51 00:03:24,520 --> 00:03:26,470 Un tāpēc, iespējams, no šī īsā teksta mēs varam secināt, ka ir zināma 52 00:03:26,470 --> 00:03:28,420 heiristika, ka tas, iespējams, nozīmē, ka tas ir vislabākais 53 00:03:28,420 --> 00:03:30,370 jaunākiem bērniem. 54 00:03:30,370 --> 00:03:33,370 Turpretim Sāra, ko tu esi lasījusi? 55 00:03:33,370 --> 00:03:35,470 SĀRA: Dērsliju kungs un kundze. 56 00:03:35,470 --> 00:03:38,260 Four Privet Drive ar lepnumu teica, ka viņi ir pilnīgi normāli, liels 57 00:03:38,260 --> 00:03:41,050 paldies. 58 00:03:41,050 --> 00:03:43,350 Viņi bija pēdējie cilvēki, kurus jūs varētu sagaidīt, iesaistot kaut 59 00:03:43,350 --> 00:03:45,651 ko dīvainu vai noslēpumainu, jo viņi vienkārši neizturēja daudz 60 00:03:45,651 --> 00:03:47,952 muļķību. 61 00:03:47,952 --> 00:03:48,910 DEIVIDS MALANS: Labi. 62 00:03:48,910 --> 00:03:52,070 Neatkarīgi no tā, kurā klasē jūs mācāties, kad, iespējams, lasījāt šo 63 00:03:52,070 --> 00:03:55,230 tekstu, kādā klasē Sāra šķita lasījusi? 64 00:03:55,230 --> 00:03:57,570 Tātad astotā klase, otrā klase. 65 00:03:57,570 --> 00:03:58,080 Labi. 66 00:03:58,080 --> 00:04:00,660 Tātad, dzirdot mazliet no visa, tātad ar to, vismaz pēc koda, 67 00:04:00,660 --> 00:04:03,240 faktiski būtu septītā klase. 68 00:04:03,240 --> 00:04:05,130 Un kāda varētu būt intuīcija? 69 00:04:05,130 --> 00:04:07,523 Kāpēc tas ir augstāks atzīmes līmenis, lai gan mēs varētu nepiekrist 70 00:04:07,523 --> 00:04:09,917 tieši tā atzīmei? 71 00:04:09,917 --> 00:04:11,250 Mērķauditorija: Sarežģīti teikumi. 72 00:04:11,250 --> 00:04:12,000 DEIVIDS MALANS: Jā. 73 00:04:12,000 --> 00:04:14,218 Tik sarežģīti teikumi, garāki teikumi. 74 00:04:14,218 --> 00:04:18,519 Tāpēc Sāra runāja daudz vairāk vārdu, jo lapā bija daudz vairāk. 75 00:04:18,519 --> 00:04:21,316 Tāpēc mēs šīs idejas tulkosim nākamajā nedēļā 2. problēmu kopā, ja 76 00:04:21,316 --> 00:04:24,113 risināsiet šo problēmu, izmantojot kodu, lai galu galā varētu 77 00:04:24,113 --> 00:04:26,910 kvantitatīvi secināt šīs idejas. 78 00:04:26,910 --> 00:04:29,190 Bet, lai to izdarītu, mums būs jāsaprot teksts. 79 00:04:29,190 --> 00:04:30,900 Tāpēc vispirms pateiksim paldies mūsu brīvprātīgajiem, un tad mēs 80 00:04:30,900 --> 00:04:32,610 iedziļināsimies šajā zemākajā līmenī. 81 00:04:32,610 --> 00:04:35,337 [APLAUSI] 82 00:04:39,910 --> 00:04:40,600 Atvainojiet. 83 00:04:40,600 --> 00:04:41,490 Jūs varat tos paturēt. 84 00:04:41,490 --> 00:04:42,222 SĀRA: Ak, labi. 85 00:04:42,222 --> 00:04:43,180 DEIVIDS MALANS: Labi. 86 00:04:43,180 --> 00:04:46,695 Tātad, bez tam, aplūkosim vēl vienu teksta kopumu, ko jūs, iespējams, 87 00:04:46,695 --> 00:04:50,210 redzēsiet šonedēļ, proti, kaut kas līdzīgs šim. 88 00:04:50,210 --> 00:04:52,035 Tas, kas man ir redzams ekrānā, ir tas, ko mēs šodien sāksim saukt 89 00:04:52,035 --> 00:04:53,860 par šifrētu tekstu. 90 00:04:53,860 --> 00:04:56,530 Tas ir kādas informācijas šifrēšanas rezultāts. 91 00:04:56,530 --> 00:04:58,719 Un šifrēšana vai vispārīgāk, kriptogrāfijas māksla un zinātne ir mums 92 00:04:58,719 --> 00:05:00,908 visapkārt. 93 00:05:00,908 --> 00:05:03,700 Tas ir tas, ko jūs izmantojat tīmeklī, savos tālruņos un bankās. 94 00:05:03,700 --> 00:05:07,000 Un viss, kas cenšas nodrošināt datu drošību, izmanto šifrēšanu. 95 00:05:07,000 --> 00:05:11,140 Taču būs dažādi šifrēšanas līmeņi — spēcīga šifrēšana, vāja šifrēšana. 96 00:05:11,140 --> 00:05:14,770 Un tas, ko jūs redzat šeit uz ekrāna, nav tik spēcīgs, taču mēs 97 00:05:14,770 --> 00:05:18,400 šodien redzēsim, kā mēs varētu to atšifrēt un faktiski atklāt, kas ir 98 00:05:18,400 --> 00:05:22,030 vienkāršais teksts, kas atbilst šim šifrētajam tekstam. 99 00:05:22,030 --> 00:05:24,113 Bet, lai to izdarītu, mums ir jāsāk, tā teikt, noņemt dažus 100 00:05:24,113 --> 00:05:26,197 treniņriteņus. 101 00:05:26,197 --> 00:05:29,213 Un ticiet vai nē, lai gan jūsu laiks šo pagājušo nedēļu redzētu pirmo 102 00:05:29,213 --> 00:05:32,230 reizi, iespējams, drīzāk būtu bijis nezālē. 103 00:05:32,230 --> 00:05:35,995 Un šķietami daudz sarežģītāks par C, izrādās, ka pa ceļam esam 104 00:05:35,995 --> 00:05:39,760 nodrošinājuši un arī turpmāk nodrošināsim noteiktus treniņriteņus. 105 00:05:39,760 --> 00:05:43,083 Piemēram, CS50 bibliotēka ir viena no tām, un pat daži skaidrojumi, 106 00:05:43,083 --> 00:05:46,406 ko mēs sniedzam par tēmām šajās pirmajās nedēļās, būs nedaudz 107 00:05:46,406 --> 00:05:49,730 vienkāršoti — ja vēlaties, tie tiks abstrahēti. 108 00:05:49,730 --> 00:05:53,500 Bet galu galā mērķis ir jums izprast katru no šīm detaļām, lai pēc 109 00:05:53,500 --> 00:05:57,270 CS50 jūs patiešām varētu stāvēt viens un saprast un apdomāt arī visas 110 00:05:57,270 --> 00:06:01,040 nākotnes tehnoloģijas. 111 00:06:01,040 --> 00:06:03,575 Tāpēc vispirms apskatīsim pašu pirmo programmu, ar kuru sākām 112 00:06:03,575 --> 00:06:06,110 pagājušajā nedēļā, kas bija šī. 113 00:06:06,110 --> 00:06:09,215 Tātad "sveika, pasaule" valodā C. 114 00:06:06,110 --> 00:06:10,500 Dienas beigās tā patiešām bija funkcija printf, kas veica interesanto 115 00:06:10,500 --> 00:06:14,890 darba daļu, taču virs un zem tās bija daudz tehnisku lietu. 116 00:06:14,890 --> 00:06:18,310 Cirtainās iekavas, iekavas, vārdi, piemēram, tukšums un ietver, un, 117 00:06:18,310 --> 00:06:21,730 protams, leņķiskās iekavas un citi. 118 00:06:21,730 --> 00:06:25,960 Bet dienas beigās mums vajadzēja konvertēt šo avota kodu C valodā par 119 00:06:25,960 --> 00:06:30,190 mašīnkodu, 0 un 1 bināros, ko dators saprata. 120 00:06:30,190 --> 00:06:33,700 Un, lai to izdarītu, mēs, protams, paskrējām — mēs apkopojām kodu. 121 00:06:33,700 --> 00:06:37,400 Mēs palaidām make, un tad mēs varējām faktiski palaist šo kodu tur. 122 00:06:37,400 --> 00:06:40,955 Tāpēc ļaujiet man pāriet uz VS Code un ātri izveidot šo hello.c, 123 00:06:40,955 --> 00:06:44,510 pārrakstot to pašu. 124 00:06:44,510 --> 00:06:51,970 Tāpēc es varētu šeit iekļaut stdio.h, int main void. 125 00:06:51,970 --> 00:06:54,700 Un tad šeit man bija pavisam vienkārši, sveiki, komats, pasaule ar 126 00:06:54,700 --> 00:06:57,430 manu atpakaļvērsto slīpsvītru, beigu pēdiņām un daudz ko citu. 127 00:06:57,430 --> 00:06:59,561 Tagad pēdējo reizi, lai to apkopotu, es patiešām palaidu make hello, 128 00:06:59,561 --> 00:07:01,693 kam sekoja Enter. 129 00:07:01,693 --> 00:07:03,860 Cerams, ka jūs neredzat kļūdas, un tas ir labi. 130 00:07:03,860 --> 00:07:05,850 Un, ja jūs atzīmējat punktu, slīpsvītru, sveiki, jūs redzēsit šīs 131 00:07:05,850 --> 00:07:07,840 programmas rezultātus. 132 00:07:07,840 --> 00:07:10,395 Bet izrādās, ka make patiesībā nav kompilators, kā es minēju 133 00:07:10,395 --> 00:07:12,950 pagājušajā nedēļā. 134 00:07:12,950 --> 00:07:15,990 Tā ir programma, kas nepārprotami veido jūsu programmu, bet pati 135 00:07:15,990 --> 00:07:19,030 tikai automatizē faktiskā kompilatora izmantošanas procesu. 136 00:07:19,030 --> 00:07:23,335 Un tur ir daudz dažādu kompilatoru, un tas, ko tas faktiski izmanto 137 00:07:23,335 --> 00:07:27,640 zem pārsega, ir kaut kas tāds, ko sauc par Clang for C Language. 138 00:07:27,640 --> 00:07:30,190 Un Clang mūsdienās ir diezgan populārs kompilators. 139 00:07:30,190 --> 00:07:33,563 Ir vēl viens, kas pastāv jau ilgu laiku, ko sauc par GCC, taču tie ir 140 00:07:33,563 --> 00:07:36,936 tikai konkrēti nosaukumi kompilatoru veidiem, kurus faktiski ir 141 00:07:36,936 --> 00:07:40,310 izveidojuši dažādi cilvēki, dažādi uzņēmumi, dažādas grupas. 142 00:07:40,310 --> 00:07:43,774 Bet, ja 1. nedēļā pats izmantojat kompilatoru manuāli, jums ir 143 00:07:43,774 --> 00:07:47,238 jāsaprot nedaudz vairāk par notiekošo, jo tas ir vēl noslēpumaināks 144 00:07:47,238 --> 00:07:50,703 par to, ko vienkārši veidojat atsevišķi. 145 00:07:50,703 --> 00:07:53,588 Tātad patiesībā ļaujiet man atgriezties pie sava termināļa loga, 146 00:07:53,588 --> 00:07:56,474 ļaujiet man nedaudz notīrīt ekrānu un vienkārši palaist neapstrādāto 147 00:07:56,474 --> 00:07:59,360 kompilatora komandu. 148 00:07:59,360 --> 00:08:01,490 Tātad tas, kas man ir automatizācija, ļaujiet man to izdarīt manuāli 149 00:08:01,490 --> 00:08:03,620 tikai uz brīdi. 150 00:08:03,620 --> 00:08:07,920 Tātad, ja es vēlos kompilēt hello.c izpildāmā programmā, kuru varu 151 00:08:07,920 --> 00:08:12,220 palaist, es varu darīt to. 152 00:08:12,220 --> 00:08:17,110 clang, atstarpe, hello.c un pēc tam Enter. 153 00:08:17,110 --> 00:08:19,560 Un tagad nav izvades, kas šajā gadījumā ir laba lieta, nav kļūdu, 154 00:08:19,560 --> 00:08:22,010 taču ievērojiet to. 155 00:08:22,010 --> 00:08:27,075 Ja es ievadu ls, manā pašreizējā mapē pēkšņi ir izveidots fails, ko 156 00:08:27,075 --> 00:08:32,140 dīvaini sauc par a.out. 157 00:08:32,140 --> 00:08:33,580 Tas nozīmē Assembler Output. 158 00:08:33,580 --> 00:08:36,510 Īsi sakot, tas faktiski ir noklusējuma nosaukums programmai, kas tiek 159 00:08:36,510 --> 00:08:39,440 izveidota, kad jūs vienkārši palaižat Clang. 160 00:08:39,440 --> 00:08:41,720 Tagad tas ir diezgan slikts programmas nosaukums, jo tajā nav 161 00:08:41,720 --> 00:08:44,000 aprakstīts, ko tā dara. 162 00:08:44,000 --> 00:08:47,806 Tāpēc labāk būtu, ja a.out vietā, kas, jā, joprojām drukā 163 00:08:47,806 --> 00:08:51,613 hello.world, bet nav īsti skaidri nosaukta programma, būtu jauki 164 00:08:51,613 --> 00:08:55,420 nosaukt šo hello. 165 00:08:55,420 --> 00:08:56,240 Tātad, ko es varētu darīt? 166 00:08:56,240 --> 00:08:59,030 Es varētu darīt tā, kā mēs mācījāmies pagājušajā nedēļā, es varētu 167 00:08:59,030 --> 00:09:01,820 pārdēvēt a.out par hello, izmantojot Linux komandu mv. 168 00:09:01,820 --> 00:09:04,480 Tāpēc es pārvācos, lai kļūtu sveiks. 169 00:09:04,480 --> 00:09:06,370 Bet arī tas šķiet garlaicīgi. 170 00:09:06,370 --> 00:09:07,720 Tagad man ir trīs soļi. 171 00:09:07,720 --> 00:09:09,955 Piemēram, uzrakstiet savu kodu, apkopojiet manu kodu un pēc tam 172 00:09:09,955 --> 00:09:12,190 pārdēvējiet to, pirms varu to palaist. 173 00:09:12,190 --> 00:09:13,580 Mēs varam darīt labāk par to. 174 00:09:13,580 --> 00:09:16,980 Un tā izrādās, ka noteiktas komandas, piemēram, clang, atbalsta to, 175 00:09:16,980 --> 00:09:20,380 ko mēs šodien sāksim, izsaucot komandrindas argumentus. 176 00:09:20,380 --> 00:09:24,733 Komandrindas arguments, atšķirībā no funkcijas argumenta, ir tikai 177 00:09:24,733 --> 00:09:29,086 papildu vārds vai atslēgas frāze, ko ievadāt pēc komandas uzvednē 178 00:09:29,086 --> 00:09:33,440 termināļa logā, kas tikai maina šīs komandas darbību. 179 00:09:33,440 --> 00:09:35,600 Tas to konfigurē nedaudz precīzāk. 180 00:09:35,600 --> 00:09:38,806 Tātad tas, ko jūs redzat šeit uz ekrāna, ir dažas no labākām 181 00:09:38,806 --> 00:09:42,013 komandām, ar kurām palaist clang, lai tagad es varētu norādīt šīs 182 00:09:42,013 --> 00:09:45,220 komandas izvadi atbilstoši šim o. 183 00:09:45,220 --> 00:09:46,610 Tātad darīt to, ko es ar to domāju? 184 00:09:46,610 --> 00:09:50,782 Ļaujiet man vēlreiz notīrīt termināļa logu un precīzāk ierakstīt 185 00:09:50,782 --> 00:09:54,955 clang -o hello hello.c un pēc tam Enter. 186 00:09:54,955 --> 00:09:58,907 Šķiet, ka atkal nekas nenotiek, taču tas ir labi, ja neredzat nekādas 187 00:09:58,907 --> 00:10:02,860 kļūdas un tagad tikko izveidotā programma tiek saukta par Hello. 188 00:10:02,860 --> 00:10:07,280 Tātad tas patiešām sasniedz tādu pašu precīzu efektu kā make, bet ko. 189 00:10:07,280 --> 00:10:09,177 Man nav sakara ar make ir ierakstiet un atcerieties kaut ko tik ilgi, 190 00:10:09,177 --> 00:10:11,075 kamēr šī komanda. 191 00:10:11,075 --> 00:10:12,700 Un arī tas ir mazliet balti meli. 192 00:10:12,700 --> 00:10:16,080 Izrādās, mēs esam iepriekš konfigurējuši VS Code mākonī, lai jūs 193 00:10:16,080 --> 00:10:19,460 varētu izmantot arī dažas citas Clang funkcijas, kuru rakstīšana jums 194 00:10:19,460 --> 00:10:22,840 būtu vēl apnicīgāka. 195 00:10:22,840 --> 00:10:28,130 Un tāpēc mēs to destilējam kā tikai darbojošos ražojumu. 196 00:10:28,130 --> 00:10:31,404 Tāpēc ļaujiet man pauzēt šeit, lai vispirms noskaidrotu, vai ir kādi 197 00:10:31,404 --> 00:10:34,678 jautājumi par to, ko esmu paveicis, izmantojot savu pirmo programmu C 198 00:10:34,678 --> 00:10:37,952 valodā un tikai tagad kompilējot to vispirms ar make, bet pēc tam 199 00:10:37,952 --> 00:10:41,226 sāku no jauna un tagad manuāli kompilējot to ar clang ar to, ko mēs 200 00:10:41,226 --> 00:10:44,500 izsauks komandrindas argumentus. 201 00:10:40,780 --> 00:10:46,820 -o, atstarpe, sveiki un pēc tam faila nosaukums. 202 00:10:46,820 --> 00:10:47,320 Jā? 203 00:10:47,320 --> 00:10:48,780 AUDITORIJA: Kas ir a.out? 204 00:10:48,780 --> 00:10:49,530 DEIVIDS MALANS: Jā. 205 00:10:49,530 --> 00:10:51,870 Tātad a.out ir vēsturisks nosaukums. 206 00:10:51,870 --> 00:10:55,240 Tas attiecas uz montētāja izvadi — vairāk par to drīzumā. 207 00:10:55,240 --> 00:10:57,816 Un tas ir tikai noklusējuma faila nosaukums, ko iegūstat automātiski, 208 00:10:57,816 --> 00:11:00,393 ja vienkārši palaižat kompilatoru jebkuram failam, lai tam būtu tikai 209 00:11:00,393 --> 00:11:02,970 standarta nosaukums. 210 00:11:02,970 --> 00:11:05,213 Bet tā nav īpaši labi nosaukta programma. 211 00:11:05,213 --> 00:11:07,546 Tā vietā, lai Mac vai personālajā datorā palaistu Microsoft Word, tas 212 00:11:07,546 --> 00:11:09,880 būtu kā dubultklikšķis uz a.out. 213 00:11:09,880 --> 00:11:13,625 Tā vietā, izmantojot šos komandrindas argumentus, varat pielāgot 214 00:11:13,625 --> 00:11:17,370 Clang izvadi un nosaukt to sveiki vai jebko, ko vēlaties. 215 00:11:17,370 --> 00:11:20,195 Citi jautājumi par to, ko es šeit esmu darījis ar pašu Clang, 216 00:11:20,195 --> 00:11:23,020 kompilatoru? 217 00:11:23,020 --> 00:11:23,520 Jā? 218 00:11:23,520 --> 00:11:25,510 Mērķauditorija: Kas ir -o? 219 00:11:25,510 --> 00:11:28,005 DEIVIDS MALANS: Tātad -o-- un jūs to zinātu tikai pēc rokasgrāmatas 220 00:11:28,005 --> 00:11:30,500 izlasīšanas un klases, kas nozīmē rezultātu. 221 00:11:30,500 --> 00:11:34,590 Tātad -o nozīmē mainīt Clang izvadi uz failu ar nosaukumu hello, 222 00:11:34,590 --> 00:11:38,680 nevis noklusējuma failu, kas ir a.out. 223 00:11:38,680 --> 00:11:40,723 Un arī šī atkal ir detaļa, kas jums būtu jāatlasa tīmekļa lapā, 224 00:11:40,723 --> 00:11:42,766 jāizlasa rokasgrāmata un jādzird kāds, piemēram, man, pastāstot par 225 00:11:42,766 --> 00:11:44,810 to. 226 00:11:44,810 --> 00:11:46,850 Un patiesībā ir pat vairāk nekā šīs iespējas, taču mēs šeit tikai 227 00:11:46,850 --> 00:11:48,890 noskrāpēsim virsmu. 228 00:11:48,890 --> 00:11:49,390 Labi. 229 00:11:49,390 --> 00:11:53,530 Tātad, ja mēs tagad to zinām, kas vēl patiesībā notiek zem pārsega? 230 00:11:53,530 --> 00:11:57,186 Apskatīsim tuvāk ne tikai šo mana koda versiju, bet arī manu nedaudz 231 00:11:57,186 --> 00:12:00,842 sarežģītāko pagājušās nedēļas versiju, kas izskatījās apmēram šādi, 232 00:12:00,842 --> 00:12:04,498 kur es pievienoju kādu dinamisku lietotāja ievadi, lai varētu 233 00:12:04,498 --> 00:12:08,154 nesasveicināties. pasaule visiem, bet sveiks, Deivid vai sveiks 234 00:12:08,154 --> 00:12:11,810 ikvienam, kurš patiešām vada šo programmu. 235 00:12:11,810 --> 00:12:14,790 Tāpēc patiesībā ļaujiet man iet uz priekšu un mainīt savu kodu šeit 236 00:12:14,790 --> 00:12:17,770 VS Code, lai tas atbilstu tam pašam kodam no pagājušās nedēļas. 237 00:12:17,770 --> 00:12:19,190 Tātad jauna koda vēl nav. 238 00:12:19,190 --> 00:12:22,820 Pēc brīža es to vienkārši apkopošu nedaudz citādākā veidā. 239 00:12:22,820 --> 00:12:25,726 Tāpēc es izdarīju pagājušās nedēļas virkni, manuprāt, atbilde ir 240 00:12:25,726 --> 00:12:28,633 vienāda ar virkni, citāts un citāts: "Kā tevi sauc?" Tāpat 241 00:12:28,633 --> 00:12:31,540 kā Scratch. 242 00:12:31,540 --> 00:12:34,495 Un tad šeit, tā vietā, lai darītu pasauli, es sākotnēji uzrakstīju 243 00:12:34,495 --> 00:12:37,450 atbildi, bet tas neizdevās. 244 00:12:37,450 --> 00:12:40,195 Ko es galu galā izdarīju, lai izdrukātu sveiki, Deivid vai sveiks, tā 245 00:12:40,195 --> 00:12:42,940 un tā? 246 00:12:42,940 --> 00:12:44,722 Jā? 247 00:12:44,722 --> 00:12:45,680 Atvainojiet, mazliet skaļāk? 248 00:12:45,680 --> 00:12:46,430 AUDITORIJA: %s? 249 00:12:46,430 --> 00:12:48,725 DEIVIDS MALANS: Jā, tātad %s, tā sauktais formāta kods, ar kuru 250 00:12:48,725 --> 00:12:51,020 printf vienkārši zina, kā rīkoties. 251 00:12:51,020 --> 00:12:52,470 Un man bija jāpievieno vēl viena lieta. 252 00:12:52,470 --> 00:12:54,850 Kāds cits, izņemot %s — jā? 253 00:12:54,850 --> 00:12:56,050 AUDITORIJA: mainīgā nosaukums. 254 00:12:56,050 --> 00:13:00,190 DAVID MALAN: Mainīgā nosaukums, kuru vēlos pievienot vietturim %s. 255 00:13:00,190 --> 00:13:01,630 Un šajā gadījumā tā ir atbilde. 256 00:13:01,630 --> 00:13:04,940 Tagad ļaujiet man veikt vienu precizējumu tikai tāpēc, ka tagad ir 257 00:13:04,940 --> 00:13:08,250 2. nedēļa, un mēs sāksim rakstīt vairāk koda rindiņu, lai gan Scratch 258 00:13:08,250 --> 00:13:11,560 sauca atgriešanās vērtību jautāt puzles gabalam, atbildiet vienmēr. 259 00:13:11,560 --> 00:13:13,020 Un redziet, mums ir pilnīga kontrole pār to, kā tiek saukti mūsu 260 00:13:13,020 --> 00:13:14,480 mainīgie. 261 00:13:14,480 --> 00:13:17,175 Un tagad, ja izmantoju get_string, droši vien ir labi ne vienmēr 262 00:13:17,175 --> 00:13:19,870 izsaukt savu mainīgo atbildi. 263 00:13:19,870 --> 00:13:21,050 Sauksim to kā tas ir. 264 00:13:21,050 --> 00:13:23,680 Tātad tas tagad ir tikai stila jautājums, ja vēlaties. 265 00:13:23,680 --> 00:13:27,120 Ļaujiet man mainīt mainīgo uz nosaukumu, lai man, jums, uz TF vai TA 266 00:13:27,120 --> 00:13:30,560 būtu mazliet skaidrāk, ko šis mainīgais attēlo, nevis vispārīgāku 267 00:13:30,560 --> 00:13:34,000 atbildi. 268 00:13:34,000 --> 00:13:37,525 Labi, ļaujiet man doties uz savu termināļa logu, un pagājušajā nedēļā 269 00:13:37,525 --> 00:13:41,050 es atkal paskrēju make, lai kompilētu tieši šo pašu programmu. 270 00:13:41,050 --> 00:13:42,160 Tomēr tagad ļaujiet man iet uz priekšu un vienkārši izmantot 271 00:13:42,160 --> 00:13:43,270 zvanīšanu. 272 00:13:43,270 --> 00:13:49,330 Tātad klan -o-- Es joprojām saukšu šo versiju hello-- space, hello.c. 273 00:13:49,330 --> 00:13:51,080 Tātad tieši tāda pati komanda kā iepriekš. 274 00:13:51,080 --> 00:13:53,705 Vienīgais, kas atšķiras, ir pievienojis vēl pāris koda rindiņas, lai 275 00:13:53,705 --> 00:13:56,330 iegūtu lietotāja ievadi. 276 00:13:56,330 --> 00:13:59,960 Ļaujiet man nospiest taustiņu Enter, un tagad, bļin, mūsu pirmā kļūda. 277 00:13:59,960 --> 00:14:02,690 Tātad, izvadīt no clang and make nav laba lieta, un šeit mēs redzam 278 00:14:02,690 --> 00:14:05,420 kaut ko īpaši noslēpumainu. 279 00:14:05,420 --> 00:14:09,450 Tātad kaut kas funkcijā “main--” nenoteiktā atsaucē uz “get_string”, 280 00:14:09,450 --> 00:14:13,480 virkni un pēc tam saistīšanas komandu neizdevās ar izejas kodu 1. 281 00:14:13,480 --> 00:14:16,363 Tātad patiesībā ir daudz žargona, kas šodien kaitinās, taču mans 282 00:14:16,363 --> 00:14:19,246 mājiens ir tāds, ka acīmredzami mana problēma ir galvenā, lai gan tas 283 00:14:19,246 --> 00:14:22,130 nav pārsteidzoši, jo nekas cits šeit nenotiek. 284 00:14:22,130 --> 00:14:24,480 get_string ir problēma, un problēma ir tā, ka tā ir nedefinēta 285 00:14:24,480 --> 00:14:26,830 atsauce. 286 00:14:26,830 --> 00:14:28,990 Un tomēr, ievērojiet, man bija diezgan labi. 287 00:14:28,990 --> 00:14:32,801 Es pievienoju CS50 galvenes failu un pagājušajā nedēļā teicu, ka ar 288 00:14:32,801 --> 00:14:36,613 to pietiek, lai iemācītu kompilatoram, ka funkcijas pastāv, taču 289 00:14:36,613 --> 00:14:40,425 problēma ir tāda, ka, lai gan patiesībā tas māca Clang, ka get_string 290 00:14:40,425 --> 00:14:44,236 eksistē, tā nav pietiekama informācija, lai Clang varētu darboties. 291 00:14:44,236 --> 00:14:48,048 atrodiet datora cietajā diskā 0 un 1, kas faktiski ievieš pašu 292 00:14:48,048 --> 00:14:51,860 get_string. 293 00:14:51,860 --> 00:14:53,596 Citiem vārdiem sakot, šī iekļautā rinda pagājušajā nedēļā ir neliels 294 00:14:53,596 --> 00:14:55,333 mājiens. 295 00:14:55,333 --> 00:14:57,446 Tas ir īss Clang, ka jūs gatavojaties redzēt un izmantot šo funkciju 296 00:14:57,446 --> 00:14:59,560 kaut kur. 297 00:14:59,560 --> 00:15:03,530 Bet, ja jūs patiešām vēlaties izmantot 0 un 1, ko CS50 rakstīja pirms 298 00:15:03,530 --> 00:15:07,500 kāda laika, un iekļaut tos savā programmā, lai jūsu programma tiešām 299 00:15:07,500 --> 00:15:11,470 zinātu, kā iegūt ievadi no lietotāja, tad man būs jāsāk. nedaudz 300 00:15:11,470 --> 00:15:15,440 atšķirīga komanda. 301 00:15:15,440 --> 00:15:16,250 Tāpēc ļaujiet man to izdarīt. 302 00:15:16,250 --> 00:15:19,635 Ļaujiet man notīrīt savu termināļa logu, lai atbrīvotos no šī 303 00:15:19,635 --> 00:15:23,020 traucējuma, un ļaujiet man tagad ieteikt palaist šo komandu. 304 00:15:23,020 --> 00:15:27,030 Gandrīz tāpat kā iepriekš, clang -o, space, hello, tad hello.c, bet 305 00:15:27,030 --> 00:15:31,040 ar vienu papildu komandrindas argumentu beigās, un tas ir -l--, nevis 306 00:15:31,040 --> 00:15:35,050 skaitlis 1. 307 00:15:35,050 --> 00:15:39,370 Tātad -lcs bez atstarpes starp šiem diviem. 308 00:15:39,370 --> 00:15:44,110 Tagad l rezultātā visas tās 0 un 1, kuras faktiski bija CS50, tiks 309 00:15:44,110 --> 00:15:48,850 saistītas ar jūsu kodu, jūsu dažām koda rindiņām vai manējā šeit. 310 00:15:48,850 --> 00:15:53,693 Bet tas ir otrais solis, kas kompilatoram ir nepieciešams, lai 311 00:15:53,693 --> 00:15:58,537 zinātu, kā faktiski izpildīt un drīzāk apkopot savu kodu un CS50. 312 00:15:58,537 --> 00:16:00,370 Un CS50 nav vienīgais, kas to dara. 313 00:16:00,370 --> 00:16:03,580 Ja izmantojat kādu trešās puses bibliotēku programmā C, kas nav 314 00:16:03,580 --> 00:16:06,790 iekļauta valodai, jūs to darītu - tā un tā, kur nu kurš -, tomēr viņi 315 00:16:06,790 --> 00:16:10,000 ir nosaukuši savu bibliotēku. 316 00:16:10,000 --> 00:16:12,149 Bet jums tas nav jādara iebūvētu lietu dēļ, kuras mēs līdz šim esam 317 00:16:12,149 --> 00:16:14,298 izmantojuši. 318 00:16:14,298 --> 00:16:16,090 Labi, ļaujiet man iet uz priekšu un izmēģināt šo. 319 00:16:16,090 --> 00:16:19,855 Es atgriezīšos pie VS Code šeit un ļaujiet man turpināt un palaist 320 00:16:19,855 --> 00:16:23,620 clang -o hello, then hello.c. 321 00:16:23,620 --> 00:16:26,605 Un tagad tā vietā, lai vienkārši nospiestu taustiņu Enter, -lcs50 bez 322 00:16:26,605 --> 00:16:29,590 atstarpes starp l un cs50, ievadiet taustiņu Enter. 323 00:16:29,590 --> 00:16:33,310 Tagad nekas slikts nenotiek, un tagad es varu darīt ./sveiki. 324 00:16:33,310 --> 00:16:34,180 kā tevi sauc? 325 00:16:34,180 --> 00:16:37,633 Es ierakstīšu David, Enter, un tagad mēs redzēsim, sveiks, Deivid. 326 00:16:37,633 --> 00:16:40,575 Godīgi sakot, šeit mēs patiešām iekļūstam nezālēs, un tagad tas 327 00:16:40,575 --> 00:16:43,517 notiek — tas patiesībā tikai rada papildu traucējumus jūsu koda 328 00:16:43,517 --> 00:16:46,460 kompilēšanas un palaišanas procesam. 329 00:16:46,460 --> 00:16:50,016 Un tā realitāte ir tāda, ka, lai gan tas patiešām notiek, mēs 330 00:16:50,016 --> 00:16:53,573 izmantojām pagājušajā nedēļā un turpināsim izmantot šo nedēļu, jo tas 331 00:16:53,573 --> 00:16:57,130 tikai automatizē visu procesu jūsu vietā. 332 00:16:57,130 --> 00:17:00,542 Taču ir ideāli, lai saprastu, kas notiek nepareizi, jo visi kļūdu 333 00:17:00,542 --> 00:17:03,955 ziņojumi, ko redzējāt 1. problēmu kopai, kāds no kļūdu ziņojumiem, ko 334 00:17:03,955 --> 00:17:07,367 redzat dažu nākamo nedēļu laikā, iespējams, nenāk no ražotāja, tie 335 00:17:07,367 --> 00:17:10,780 nāk no Clang zem pārsega. jo make ir tikai procesa automatizācija. 336 00:17:10,780 --> 00:17:13,040 Bet ar make, jūs burtiski vienkārši ierakstāt make un pēc tam 337 00:17:13,040 --> 00:17:15,300 programmas nosaukumu, jums nav jāuztraucas par šiem komandrindas 338 00:17:15,300 --> 00:17:17,560 argumentiem. 339 00:17:17,560 --> 00:17:22,240 Vai tad ir jautājumi par kompilēšanu ar dash -lcs50 vai ko citu? 340 00:17:22,240 --> 00:17:23,043 Jā? 341 00:17:23,043 --> 00:17:24,960 ieguvums no [NEdzirdams]? 342 00:17:24,960 --> 00:17:26,236 DEIVIDS MALANS: Atvainojiet, kāds ir labums no-- AUDITORIJA: Clang 343 00:17:26,236 --> 00:17:27,512 manuāla izmantošana. 344 00:17:27,512 --> 00:17:30,000 DEIVIDS MALANS: Kāds ir Clang manuālas lietošanas ieguvums? 345 00:17:30,000 --> 00:17:30,870 Neviens, tiešām. 346 00:17:30,870 --> 00:17:32,962 Faktiski viss galvenais, ko dara, ir tikai teikt — tas nozīmē, ka mēs 347 00:17:32,962 --> 00:17:35,055 ietaupām dažus taustiņu nospiešanas. 348 00:17:35,055 --> 00:17:38,572 Tomēr, ja vēlaties un vēlaties vairāk kontrolēt, varat pilnībā 349 00:17:38,572 --> 00:17:42,090 palaist Clang manuāli, ja atceraties dažādus komandrindas argumentus. 350 00:17:42,090 --> 00:17:42,660 Jā? 351 00:17:42,660 --> 00:17:47,335 jāpaskaidro [NEdzirdams] 352 00:17:47,335 --> 00:17:48,210 DEIVIDS MALANS: Tieši tā. 353 00:17:48,210 --> 00:17:51,840 Kāpēc man bija jāpaskaidro, tas ir, jāsniedz mājiens uz CS50 ar 354 00:17:51,840 --> 00:17:55,470 galvenes failu cs50.h, bet man tas nebija jādara ar standarto.h? 355 00:17:55,470 --> 00:17:56,400 Tikai tāpēc. 356 00:17:56,400 --> 00:17:59,730 Standardo.h nāk ar C, tāpat kā dažas citas bibliotēkas ir komplektā 357 00:17:59,730 --> 00:18:03,060 ar C, ko mēs sāksim redzēt šodien. 358 00:18:03,060 --> 00:18:05,475 Tomēr CS50 nav visur iebūvēts C, un tāpēc jums tas ir skaidri 359 00:18:05,475 --> 00:18:07,890 jāpievieno. 360 00:18:07,890 --> 00:18:08,767 Jā? 361 00:18:08,767 --> 00:18:11,970 komandrindas arguments [NEdzirdams]? 362 00:18:11,970 --> 00:18:15,380 DAVID MALAN: Komandrindas arguments ir vārds vai frāze, ko ievadāt 363 00:18:15,380 --> 00:18:18,790 komandrindā — AKA — jūsu terminālis, lai ietekmētu programmas 364 00:18:18,790 --> 00:18:22,200 darbību. 365 00:18:22,200 --> 00:18:22,742 AUDITORIJA: Labi. 366 00:18:22,742 --> 00:18:24,430 Tātad tas ir termins tam, ko jūs tam piešķirat. 367 00:18:24,430 --> 00:18:24,565 DEIVIDS MALANS: Jā. 368 00:18:24,565 --> 00:18:25,660 Tas maina noklusējuma iestatījumus. 369 00:18:25,660 --> 00:18:28,260 Mūsu GUI pasaulē, grafiskajā lietotāja interfeisā, jūs un es, 370 00:18:28,260 --> 00:18:30,860 iespējams, noklikšķināsim uz dažiem lodziņiem, mēs atlasītu dažas 371 00:18:30,860 --> 00:18:33,460 izvēlnes opcijas, lai konfigurētu programmu, lai tā darbotos vienādi. 372 00:18:33,460 --> 00:18:36,530 Komandrindas interfeisā jums ir vienkārši jāsaka viss uzreiz, un 373 00:18:36,530 --> 00:18:39,600 tāpēc mums ir komandrindas argumenti. 374 00:18:39,600 --> 00:18:40,605 Jā? 375 00:18:40,605 --> 00:18:43,243 Mērķauditorija: ir [dzirdams] 376 00:18:43,243 --> 00:18:43,910 DEIVIDS MALANS: Nē. 377 00:18:43,910 --> 00:18:45,470 Marka ir paredzēta ne tikai CS50. 378 00:18:45,470 --> 00:18:48,745 Mūsdienās tas tiek izmantots visā pasaulē jebkurā projektā, 379 00:18:48,745 --> 00:18:52,020 izmantojot C, C++ un pat citas valodas. 380 00:18:52,020 --> 00:18:54,775 Faktiski gandrīz visas komandas, kuras redzat šajā klasē, ja vien tās 381 00:18:54,775 --> 00:18:57,530 beigās nav 5-0, tiek izmantotas globāli. 382 00:18:57,530 --> 00:19:00,758 Tikai tie — sufikss ar 50 patiešām ir specifiski kursam. 383 00:19:00,758 --> 00:19:03,824 Un pat tie, kuriem mēs pakāpeniski noņemsim treniņriteņus, lai arī 384 00:19:03,824 --> 00:19:06,890 šīs komandas veiktu tieši to, ko dara. 385 00:19:06,890 --> 00:19:09,053 Labi, ko mēs tikko izdarījām? 386 00:19:09,053 --> 00:19:12,084 Viss, ko tikko esam izdarījuši, protams, es turpinu saukt par 387 00:19:12,084 --> 00:19:15,115 kompilēšanu, bet nolaidīsimies uz vienu truša caurumu, lai jūs 388 00:19:15,115 --> 00:19:18,146 saprastu, ka, kompilējot kodu, patiesībā notiek vesela virkne 389 00:19:18,146 --> 00:19:21,177 darbību, un tas ļaus daudz ko darīt. funkcijas, piemēram, uzņēmumi 390 00:19:21,177 --> 00:19:24,208 var rakstīt kodu un pēc tam pārveidot to, lai tas darbotos gan Mac 391 00:19:24,208 --> 00:19:27,240 datoros, gan personālajos datoros, tālruņos vai tamlīdzīgi. 392 00:19:27,240 --> 00:19:30,106 Tātad runa nav tikai par avota koda konvertēšanu mašīnkodā, patiesībā 393 00:19:30,106 --> 00:19:32,973 ir četras darbības, kas saistītas ar to, ko jūs un es no pagājušās 394 00:19:32,973 --> 00:19:35,840 nedēļas zinām kā kompilēšanu. 395 00:19:35,840 --> 00:19:38,645 Un tie nav termini, kas jums būs pastāvīgi jāpatur prātā, jo atkal 396 00:19:38,645 --> 00:19:41,450 mēs daudz ko no tā abstrahēsim. 397 00:19:41,450 --> 00:19:44,660 Bet, lai mēs vienreiz būtu nokļuvuši truša bedrē, apsveriet katru no 398 00:19:44,660 --> 00:19:47,870 šiem četriem soļiem, kas jums ir notikuši nedēļu automātiski, no 399 00:19:47,870 --> 00:19:51,080 kuriem pirmais tiek saukts par priekšapstrādi. 400 00:19:51,080 --> 00:19:52,260 Tātad, ko tas nozīmē? 401 00:19:52,260 --> 00:19:54,450 Apskatīsim to pašu programmu kā iepriekš. 402 00:19:54,450 --> 00:19:57,830 Tāpēc ievērojiet, ka divas no koda rindām sākas ar jaucējzīmi. 403 00:19:57,830 --> 00:20:00,084 Tas ir īpašs simbols valodā C, un tā ir tā sauktā priekšprocesora 404 00:20:00,084 --> 00:20:02,338 direktīva. 405 00:20:02,338 --> 00:20:04,671 Jums nav jāiegaumē šādi termini, bet tas tikai nozīmē, ka tas nedaudz 406 00:20:04,671 --> 00:20:07,005 atšķiras no visām pārējām rindām. 407 00:20:07,005 --> 00:20:10,160 Un viss, kam šeit ir jaukšanas simbols, ir iepriekš jāapstrādā — tas 408 00:20:10,160 --> 00:20:13,315 ir, vispirms jāanalizē, pirms notiek kaut kas cits. 409 00:20:13,315 --> 00:20:17,100 Tātad, aplūkosim šīs divas līnijas augšpusē, kas tieši notiek. 410 00:20:17,100 --> 00:20:20,245 Nu, izrādās, ka ar šīm divām rindām jums ir divi galvenes faili, 411 00:20:20,245 --> 00:20:23,390 protams, cs50.h un stdio.h. 412 00:20:23,390 --> 00:20:25,970 Kur ir tie faili, jo šķiet, ka tie nekad nav bijuši jūsu vietā VS 413 00:20:25,970 --> 00:20:28,550 Code. 414 00:20:28,550 --> 00:20:32,225 Ja ierakstāt LS — ja GUI atverat File Explorer, jūs, iespējams, nekad 415 00:20:32,225 --> 00:20:35,900 neesat redzējis cs50.h vai stdio.h. 416 00:20:35,900 --> 00:20:39,163 Tie vienkārši darbojas, bet tas ir tāpēc, ka kaut kur cietajā diskā 417 00:20:39,163 --> 00:20:42,426 ir mape, kuru izmantojat savā Mac vai personālajā datorā, vai kaut 418 00:20:42,426 --> 00:20:45,690 kur mākonī, kā tas ir mūsu gadījumā. 419 00:20:45,690 --> 00:20:50,210 Un šīs mapes iekšpusē, ko tradicionāli sauc par /usr/include. 420 00:20:50,210 --> 00:20:51,857 Un lietotājs ir apzināti nepareizi uzrakstīts. 421 00:20:51,857 --> 00:20:53,808 Tas ir tikai nedaudz kodolīgāks, lai gan ir nedaudz dīvaini, kāpēc 422 00:20:53,808 --> 00:20:55,760 mēs atmetam šo vienu burtu. 423 00:20:55,760 --> 00:20:59,875 Bet usr/include ir tikai mape serverī, kurā ir cs50.h, stdio.h un vēl 424 00:20:59,875 --> 00:21:03,990 daudzas citas lietas. 425 00:21:03,990 --> 00:21:07,816 Tātad, ja termināļa logā ierakstāt VS kodu, kad izmantojat koda 426 00:21:07,816 --> 00:21:11,643 vietas mākonī un ierakstāt LS space /usr/include, jūs varat redzēt 427 00:21:11,643 --> 00:21:15,470 visus šajā mapē esošos failus. 428 00:21:15,470 --> 00:21:17,580 Bet mēs esam iepriekš instalējuši visu šo saturu jūsu vietā. 429 00:21:17,580 --> 00:21:20,390 Apskatīsim, kas patiesībā ir šajos failos. 430 00:21:20,390 --> 00:21:24,480 Ja es izceļu šīs divas rindas, kas sākas ar jaucējvārdu, tad 431 00:21:24,480 --> 00:21:28,570 pagājušajā nedēļā es devu mājienu, ka tas, kas atrodas šajā pirmajā 432 00:21:28,570 --> 00:21:32,660 failā, ir mājiens par to, kādas funkcijas jums ir uzrakstījis CS50. 433 00:21:32,660 --> 00:21:36,830 Tātad jūs varat uzskatīt, ka šīs rindas ir pagaidu vietturi, kas var 434 00:21:36,830 --> 00:21:41,000 kļūt par globālu atradumu un aizstāšanu. 435 00:21:41,000 --> 00:21:44,270 Pirmā lieta, ko clang darīs, ir šī faila priekšapstrāde. 436 00:21:44,270 --> 00:21:47,300 Tas meklēs jebkuru rindiņu, kas sākas ar hash include. 437 00:21:47,300 --> 00:21:51,871 Un, ja tas to pamana, tas būtībā nonāks šajā failā, piemēram, cs50.h, 438 00:21:51,871 --> 00:21:56,443 un pēc tam vienkārši kopēs un maģiski ielīmēs šī faila saturu. 439 00:21:56,443 --> 00:21:58,110 Jūs to vizuāli neredzat ekrānā. 440 00:21:58,110 --> 00:22:00,060 Bet tas notiek aizkulisēs. 441 00:22:00,060 --> 00:22:04,445 Un patiesībā ar šo pirmo rindiņu notiek tas, ka kaut kur failā cs50.h 442 00:22:04,445 --> 00:22:08,830 ir getString deklarācija, kā mēs runājām pagājušajā nedēļā, un, 443 00:22:08,830 --> 00:22:13,215 iespējams, tas izskatās nedaudz līdzīgs šim. 444 00:22:13,215 --> 00:22:15,122 Un pagājušajā nedēļā mēs tam vēl netērējām daudz laika, bet ar laiku 445 00:22:15,122 --> 00:22:17,030 mēs to darīsim. 446 00:22:17,030 --> 00:22:21,470 Ņemiet vērā, ka funkcija tiek deklarēta šādi. 447 00:22:21,470 --> 00:22:23,677 Tas ir, tas ir nolemts pastāvēt. 448 00:22:23,677 --> 00:22:25,760 Funkcijas nosaukums, protams, ir getString. 449 00:22:25,760 --> 00:22:28,310 Iekavās ir tā argumenti. 450 00:22:28,310 --> 00:22:30,695 Šajā gadījumā ir viens arguments getString, es apgalvoju šodien, taču 451 00:22:30,695 --> 00:22:33,080 jūs to zinājāt netieši. 452 00:22:33,080 --> 00:22:34,160 Un tas ir pamudinājums. 453 00:22:34,160 --> 00:22:36,860 Tas ir uzvedne, ko cilvēks redz, kad izmantojat getString. 454 00:22:36,860 --> 00:22:37,790 Kas tas par uzvedni? 455 00:22:37,790 --> 00:22:40,435 Nu, tā ir teksta virkne, piemēram, citāts bez pēdiņām, "kā tevi 456 00:22:40,435 --> 00:22:43,080 sauc?" vai kaut kas cits, ko es jautāju pagājušajā nedēļā. 457 00:22:43,080 --> 00:22:44,845 Tikmēr getString, kā mēs zinām no pagājušās nedēļas, ir atgriešanās 458 00:22:44,845 --> 00:22:46,610 vērtība. 459 00:22:46,610 --> 00:22:48,140 Tas jums kaut ko atgriež. 460 00:22:48,140 --> 00:22:49,610 Un arī tā ir virkne. 461 00:22:49,610 --> 00:22:52,120 Tātad atkal to sauc arī par funkciju prototipu. 462 00:22:52,120 --> 00:22:55,423 Tā ir lieta, ko pagājušās nedēļas beigās es tikko nokopēju un 463 00:22:55,423 --> 00:22:58,726 ielīmēju no sava faila apakšas uz augšdaļu, lai tas būtu kā šis 464 00:22:58,726 --> 00:23:02,030 tīzeris, lai aprunātos par to, kas pastāvēs vēlāk. 465 00:23:02,030 --> 00:23:06,140 Tātad jūs varat domāt, ka tajās ir iekļautas rindas kā visu šo 466 00:23:06,140 --> 00:23:10,250 funkciju deklarāciju apvienošana atsevišķā failā cs50.h, lai jums 467 00:23:10,250 --> 00:23:14,360 pašam tās nebūtu jāievada katru reizi, kad izmantojat bibliotēku vai 468 00:23:14,360 --> 00:23:18,470 sliktāk, lai tev pašam šīs rindas nav jākopē un jāielīmē. 469 00:23:18,470 --> 00:23:22,520 Tas ir tas, ko clang dara jūsu labā pirmajā priekšapstrādes posmā. 470 00:23:22,520 --> 00:23:25,847 Otrkārt un pēdējais šajā piemērā, kas notiek, ja clang iepriekš 471 00:23:25,847 --> 00:23:29,175 apstrādā šo otro iekļaušanas rindiņu? 472 00:23:29,175 --> 00:23:31,412 Vienīgā cita funkcija, kas mums rūp šajā stāstā, protams, ir printf, 473 00:23:31,412 --> 00:23:33,650 kas nāk kopā ar C. 474 00:23:33,650 --> 00:23:37,235 Tātad būtībā jūs varat iedomāties printf prototipu vai deklarāciju kā 475 00:23:37,235 --> 00:23:40,820 tādu. 476 00:23:40,820 --> 00:23:42,870 Printf ir funkcijas nosaukums. 477 00:23:42,870 --> 00:23:45,990 Tam nepieciešama virkne, kuru vēlaties formatēt, piemēram, Hello 478 00:23:45,990 --> 00:23:49,110 Comma world vai Hello Comma %s. 479 00:23:49,110 --> 00:23:52,120 Un tad ar punktu, punktu, punktu tam faktiski ir tehniska nozīme. 480 00:23:52,120 --> 00:23:55,325 Tas, protams, nozīmē, ka varat pievienot 0 mainīgo, 1 mainīgo, 2 481 00:23:55,325 --> 00:23:58,530 Tātad punkts, punkts, punkts nozīmē noteiktu mainīgo skaitu. 482 00:23:58,530 --> 00:24:00,072 Tagad mēs par to vēl neesam runājuši. 483 00:24:00,072 --> 00:24:01,410 Un kopumā mēs to nedarīsim. 484 00:24:01,410 --> 00:24:05,490 printf faktiski atgriež vērtību, skaitli, kas ir vesels skaitlis. 485 00:24:05,490 --> 00:24:07,420 Bet par to vairāk varbūt citreiz. 486 00:24:07,420 --> 00:24:10,920 Parasti programmētājs to neskatās. 487 00:24:10,920 --> 00:24:14,948 Bet tas ir viss, ko mēs domājam ar priekšapstrādi, lai šī procesa 488 00:24:14,948 --> 00:24:18,976 beigās, lai gan failos cs50.h un stdio.h ir vairāk koda rindiņu, 489 00:24:18,976 --> 00:24:23,004 patiesībā notiek tikai tas, ka faila pirmapstrādes laikā tiek 490 00:24:23,004 --> 00:24:27,032 nokopēts un ielīmēts šo failu saturu savā kodā, lai tagad jūsu kods 491 00:24:27,032 --> 00:24:31,060 zinātu par visu — getString, printf un jebko citu. 492 00:24:31,060 --> 00:24:35,230 Vai ir kādi jautājumi par šo pirmo soli, priekšapstrādi? 493 00:24:35,230 --> 00:24:35,920 Jā? 494 00:24:35,920 --> 00:24:49,195 Mērķauditorija: [NEdzirdams] 495 00:24:49,195 --> 00:24:50,320 DEIVIDS MALANS: Labs jautājums. 496 00:24:50,320 --> 00:24:52,600 Ja iekļaujat failu, vai tajā ir iekļauts tikai tas, kas jums 497 00:24:52,600 --> 00:24:54,880 nepieciešams, vai arī viss? 498 00:24:54,880 --> 00:24:56,420 Padomājiet par to, ka tas ietver visu. 499 00:24:56,420 --> 00:24:59,020 Tātad, ja tas ir liels fails, tas ir daudz koda pašā augšpusē. 500 00:24:59,020 --> 00:25:01,488 Un tieši tāpēc, ja padomājat uz visām nullēm un vieniniekiem, ko 501 00:25:01,488 --> 00:25:03,956 rādīju pirms neilga laika, kā arī pagājušajā nedēļā, ekrānā ir daudz 502 00:25:03,956 --> 00:25:06,424 nulles un vieninieku, kas tiek parādīti, vienkārši ierakstot: Sveiki! 503 00:25:06,424 --> 00:25:08,892 pasaule. 504 00:25:08,892 --> 00:25:11,141 Daudzas no šīm nullēm un vieniniekiem, iespējams, nāk no koda, kas 505 00:25:11,141 --> 00:25:13,390 patiesībā jums nebija vajadzīgs. 506 00:25:13,390 --> 00:25:17,740 Bet daži no tiem, iespējams, ir, taču ir veidi, kā arī to optimizēt. 507 00:25:17,740 --> 00:25:22,395 Labi, tāpēc otro kompilēšanas soli mulsinoši sauc par kompilēšanu. 508 00:25:22,395 --> 00:25:25,167 Vienkārši šo terminu visi izmanto, lai aprakstītu visu procesu, nevis 509 00:25:25,167 --> 00:25:27,940 tikai šo vienu posmu. 510 00:25:27,940 --> 00:25:31,902 Bet, kad kompilators aizkulisēs ir iepriekš apstrādājis programmu, 511 00:25:31,902 --> 00:25:35,865 tagad tā izskatās apmēram šādi. 512 00:25:35,865 --> 00:25:37,842 Un es ievietoju punktu, punktu, punktu, lai norādītu, ka, jā, uz jūsu 513 00:25:37,842 --> 00:25:39,820 jautājumu, virs tā ir vairāk lietu. 514 00:25:39,820 --> 00:25:40,987 Zem tā ir vairāk lietu. 515 00:25:40,987 --> 00:25:43,070 Mums tas vienkārši šobrīd nav interesanti. 516 00:25:43,070 --> 00:25:44,860 Tātad tagad mums ir tikai C kods. 517 00:25:44,860 --> 00:25:46,960 Nav vairs nekādu priekšapstrādātāja direktīvu. 518 00:25:46,960 --> 00:25:49,815 Šobrīd visi jaucējsimboli un šīs koda rindas ir iepriekš apstrādāti 519 00:25:49,815 --> 00:25:52,670 un pārveidoti par kaut ko citu. 520 00:25:52,670 --> 00:25:56,380 Un tā tagad — un šeit lietas izskatās nedaudz spokainas. 521 00:25:56,380 --> 00:25:59,845 Lūk, kas notiek, kad clang vai jebkurš kompilators burtiski apkopo 522 00:25:59,845 --> 00:26:03,310 šādu kodu. 523 00:26:03,310 --> 00:26:08,720 Tas pārvērš to no šī C uz šo montāžas kodā. 524 00:26:08,720 --> 00:26:10,720 Tātad šī ir viena no baisākajām valodām. 525 00:26:10,720 --> 00:26:12,580 Man pašam īsti nav patīkamu atmiņu. 526 00:26:12,580 --> 00:26:14,805 Šī nav valoda, kurā daudzi cilvēki programmējas. 527 00:26:14,805 --> 00:26:18,117 Ja jūs mācāties nākamajā datorzinātnē, sistēmās, augstāka līmeņa 528 00:26:18,117 --> 00:26:21,430 klasē, jūs patiešām varētu apgūt šo vai kādu no tā variantiem. 529 00:26:21,430 --> 00:26:25,375 Taču ir vismaz daži cilvēki, kuriem šīs lietas ir jāzina, jo tas ir 530 00:26:25,375 --> 00:26:29,320 tuvāk tam, ko mūsdienās saprot paši datori. 531 00:26:29,320 --> 00:26:33,640 Intel CPU vai AMD CPU, mūsdienu datoru un tālruņu smadzenes saprot 532 00:26:33,640 --> 00:26:37,960 lietas, kas vairāk izskatās šādi un mazāk līdzinās C. 533 00:26:37,960 --> 00:26:40,195 Tagad tas ir pilnīgi ezotērisks, bet ļaujiet man tikai izcelt dažas 534 00:26:40,195 --> 00:26:42,430 frāzes. 535 00:26:42,430 --> 00:26:44,630 Ir dažas lietas, kas ir mazliet pazīstamas. 536 00:26:44,630 --> 00:26:47,620 Tur augšpusē dzeltenā krāsā ir minēts galvenais. 537 00:26:47,620 --> 00:26:49,750 Apakšā ir minēts getString. 538 00:26:49,750 --> 00:26:52,070 Zemāk ir minēts printf. 539 00:26:52,070 --> 00:26:54,756 Tātad šī ir tikai vēl viena programmēšanas valoda, ko sauc par 540 00:26:54,756 --> 00:26:57,443 montāžas valodu un kurā pirms gadu desmitiem cilvēki — arī es skaitot 541 00:26:57,443 --> 00:27:00,130 viņu skolā — rakstīja kodu. 542 00:27:00,130 --> 00:27:03,100 Un noteikti, daži cilvēki joprojām raksta šo kodu, jo īpaši tāpēc, ka 543 00:27:03,100 --> 00:27:06,070 jūs varat uzrakstīt ļoti, ļoti efektīvu kodu. 544 00:27:06,070 --> 00:27:08,590 Bet tas ir daudz noslēpumaināks. 545 00:27:08,590 --> 00:27:11,380 Tas ir daudz mazāk lietotājam draudzīgs. 546 00:27:11,380 --> 00:27:14,567 Tātad jūs tagad redzēsiet dzeltenā krāsā, tās ir tā saucamās 547 00:27:14,567 --> 00:27:17,755 instrukcijas, ko saprot datora smadzenes vai centrālais procesors, 548 00:27:17,755 --> 00:27:20,942 bīdot vērtības, pārvietojot tās, atņemot vērtības, izsaucot funkcijas 549 00:27:20,942 --> 00:27:24,130 un pārvietojot, pārvietojot, pārvietojot. 550 00:27:24,130 --> 00:27:27,460 Tātad patiesībā zemā līmeņa darbības, ko saprot datori, parasti ir 551 00:27:27,460 --> 00:27:30,790 aritmētiskas darbības — atņemšana, saskaitīšana un tamlīdzīgi — lietu 552 00:27:30,790 --> 00:27:34,120 pārvietošana atmiņā un no tās. 553 00:27:34,120 --> 00:27:37,510 Tādiem cilvēkiem kā mēs ir daudz apnicīgāk rakstīt šādu kodu. 554 00:27:37,510 --> 00:27:40,450 Tāpēc mēs ar jums mēdzam rakstīt šādas lietas. 555 00:27:40,450 --> 00:27:43,485 Un ideālā gadījumā tādiem cilvēkiem kā jūs un es mēdzam vilkt un 556 00:27:43,485 --> 00:27:46,520 nomest puzles gabalus, kas to visu veido abstrakti tālāk. 557 00:27:46,520 --> 00:27:49,420 Bet pagaidām to atkal sauc par montāžas valodu. 558 00:27:49,420 --> 00:27:54,310 Tas notiek, kad kompilators burtiski apkopo jūsu kodu. 559 00:27:54,310 --> 00:27:57,010 Bet, protams, šis, joprojām nav nulles un vieninieki. 560 00:27:57,010 --> 00:27:58,580 Tātad mums ir jāveic divi soļi. 561 00:27:58,580 --> 00:28:02,055 Tātad, kad kompilators pāriet uz trešo darbību, šeit lietas tiek 562 00:28:02,055 --> 00:28:05,530 pārveidotas mašīnkodā. 563 00:28:05,530 --> 00:28:09,870 Un, kad kompilators apkopo jūsu kodu, tas pārvērš to, ko mēs tikko 564 00:28:09,870 --> 00:28:14,210 redzējām šeit ekrānā, par faktiskajām nullēm un vieniniekiem — tā 565 00:28:14,210 --> 00:28:18,550 sauktajā mašīnkodā, ko saprot jūsu tālrunis vai dators. 566 00:28:18,550 --> 00:28:21,415 Taču ir vērts atzīmēt, ka šīs ne vienmēr ir visas jūsu programmas 567 00:28:21,415 --> 00:28:24,280 nulles un vieninieki. 568 00:28:24,280 --> 00:28:28,500 Jā, tās ir nulles un vieninieki, kas atbilst programmai Hello vai 569 00:28:28,500 --> 00:28:32,720 printf un getString un tamlīdzīgi, taču ņemiet vērā, ka šeit ir 570 00:28:32,720 --> 00:28:36,940 nepieciešams pēdējais solis. 571 00:28:36,940 --> 00:28:40,100 Tajās nulles un vieninieki ir tikai jūsu koda rindas. 572 00:28:40,100 --> 00:28:41,820 Bet kā ir ar CS50 koda rindām, kuras mēs rakstījām, lai ieviestu 573 00:28:41,820 --> 00:28:43,540 getString? 574 00:28:43,540 --> 00:28:45,265 Kā ir ar koda rindām, kuras cilvēki rakstīja pirms gadu desmitiem, 575 00:28:45,265 --> 00:28:46,990 lai ieviestu printf? 576 00:28:46,990 --> 00:28:50,847 Tie atrodas kaut kur šajā cietajā diskā, piemēram, manā Mac datorā, 577 00:28:50,847 --> 00:28:54,705 datorā vai kaut kur mākonī, taču mums ir jāapvieno visas šīs nulles 578 00:28:54,705 --> 00:28:58,562 un vieninieki un jāsaista mans kods ar CS50 kodu ar standarta I/O 579 00:28:58,562 --> 00:29:02,420 kodu. . 580 00:29:02,420 --> 00:29:06,718 Un tas, kas notiek pēdējā solī, galu galā ir tāds, ka, ja mums šeit 581 00:29:06,718 --> 00:29:11,016 ir mans kods dzeltenā krāsā un pēc tam kods, ko uzrakstīja CS50, un 582 00:29:11,016 --> 00:29:15,314 kods, ko uzrakstīja paši C autori, patiesībā notiek tas, ka kaut kur 583 00:29:15,314 --> 00:29:19,613 mēs ir ne tikai hello.c, ko, protams, es rakstīju un rakstīju kopā ar 584 00:29:19,613 --> 00:29:23,911 mums šeit, bet arī, pieņemsim, kaut kur datorā ir fails cs50.c, kuru 585 00:29:23,911 --> 00:29:28,210 nejauši es un CS50 darbinieki rakstījām pirms gadiem. 586 00:29:28,210 --> 00:29:30,790 Un arī kaut kur datorā ir vēl viens fails. 587 00:29:30,790 --> 00:29:34,120 Ļaujiet man pārāk vienkāršot, vienkārši nosaucot to par stdio.c. 588 00:29:34,120 --> 00:29:36,850 Praksē to droši vien īpaši sauc par printf.c. 589 00:29:36,850 --> 00:29:39,460 Bet tie ir kaut kur, šie divi citi faili. 590 00:29:39,460 --> 00:29:43,780 Un tāpēc šis pēdējais solis, ko sauc par saistīšanu, paņem manas 591 00:29:43,780 --> 00:29:48,100 nulles un vienus no tikko ierakstītā koda, proti, šī koda ekrānā. 592 00:29:48,100 --> 00:29:50,810 Pēc tam tas satver nulles un vieniniekus, ko ierakstīja CS50. 593 00:29:50,810 --> 00:29:53,525 Un tas satver nulles un vieniniekus, ko rakstīja C autori, lai 594 00:29:53,525 --> 00:29:56,240 ieviestu standarta I/O bibliotēku. 595 00:29:56,240 --> 00:30:00,750 Un visbeidzot, voila, saista tos visus kopā. 596 00:30:00,750 --> 00:30:02,365 Un tas ir tas pats nulles un vieninieku lāse, ko mēs redzējām 597 00:30:02,365 --> 00:30:03,980 iepriekš. 598 00:30:03,980 --> 00:30:07,108 Tas tikai tagad ir jūsu koda priekšapstrādes, koda kompilēšanas, koda 599 00:30:07,108 --> 00:30:10,236 salikšanas, koda saistīšanas rezultāts, un, mans Dievs, šobrīd, 600 00:30:10,236 --> 00:30:13,364 piemēram, ja programmēšana jums vēl būtu bijusi jautra, mēs to visu 601 00:30:13,364 --> 00:30:16,492 esam atņēmuši. , mēs vienkārši saucam visu šo procesu par 602 00:30:16,492 --> 00:30:19,620 kompilēšanu. 603 00:30:19,620 --> 00:30:20,120 Kāpēc? 604 00:30:20,120 --> 00:30:23,195 Tā kā tagad, kad mēs zinām, ka šie soļi pastāv — un gudri cilvēki šo 605 00:30:23,195 --> 00:30:26,270 problēmu atrisina mūsu vietā, jūs un es varam darboties šādā 606 00:30:26,270 --> 00:30:29,345 abstrakcijas līmenī un pieņemt, ka kompilēšana pārvērš pirmkodu 607 00:30:29,345 --> 00:30:32,420 mašīnkodā. 608 00:30:32,420 --> 00:30:36,350 Vai jums ir jautājumi par kādu no šiem starpposmiem? 609 00:30:36,350 --> 00:30:37,360 Jā? 610 00:30:37,360 --> 00:30:41,958 dažādas daļas, piemēram, [dzirdams]? 611 00:30:50,072 --> 00:30:51,280 DEIVIDS MALANS: Labs jautājums. 612 00:30:51,280 --> 00:30:53,238 Tātad, kur tiek glabātas visas šīs nulles un viens? 613 00:30:53,238 --> 00:30:56,400 Tā kā jūs un es, mēs esam izmantojuši pārlūkprogrammu, vai ne? 614 00:30:53,238 --> 00:30:58,330 code.cs50.io, protams, ir šī tīmekļa lietotāja saskarne. 615 00:30:58,330 --> 00:31:01,886 Bet atkal atcerieties no pagājušās nedēļas, lai gan jūs izmantojat 616 00:31:01,886 --> 00:31:05,443 tīmekļa pārlūkprogrammu, lai piekļūtu VS kodam, šī VS koda tīmekļa 617 00:31:05,443 --> 00:31:09,000 versija ir savienota ar faktisku serveri kaut kur mākonī. 618 00:31:09,000 --> 00:31:12,180 Un šajā serverī jums ir savs konts un savi faili, un patiešām savs 619 00:31:12,180 --> 00:31:15,360 cietais disks, praktiski mākonī. 620 00:31:15,360 --> 00:31:17,595 Padomājiet par to mazliet kā Dropbox vai Box, vai Google disku, 621 00:31:17,595 --> 00:31:19,830 OneDrive vai kaut ko tamlīdzīgu. 622 00:31:19,830 --> 00:31:23,310 Tātad jums kaut kur ir cietais disks, ko esam jums nodrošinājuši. 623 00:31:23,310 --> 00:31:27,862 Un tieši šajā cietajā diskā ir jūsu kods, ko tikko ierakstījāt vai es 624 00:31:27,862 --> 00:31:32,414 tikko uzrakstīju, cs50.c, stdio.c un viss pārējais kods, kas ievieš 625 00:31:32,414 --> 00:31:36,967 matemātikas funkcijas un visu pārējo, ko atbalsta C. 626 00:31:36,967 --> 00:31:37,550 Labs jautājums. 627 00:31:37,550 --> 00:31:38,964 Jā? 628 00:31:38,964 --> 00:31:45,425 bibliotēka, rinda [dzirdams] 629 00:31:45,425 --> 00:31:49,401 precīza lieta [NEdzirdams] 630 00:31:49,401 --> 00:31:51,935 kopēt un ielīmēt tos līdz galam? 631 00:31:51,935 --> 00:31:53,060 DEIVIDS MALANS: Labs jautājums. 632 00:31:53,060 --> 00:31:57,110 Šajā hash ietver cs50.h rindiņu mana koda augšpusē. 633 00:31:57,110 --> 00:32:01,310 Ja es to vienkārši aizstātu ar cs50.c saturu, vai tas darbotos? 634 00:32:01,310 --> 00:32:03,590 Īsa atbilde, jā, tas derētu. 635 00:32:03,590 --> 00:32:05,400 Tur varētu nokopēt visu kodu. 636 00:32:05,400 --> 00:32:08,577 Tomēr var būt zināma darbību secība. 637 00:32:08,577 --> 00:32:10,910 Un tāpēc tas, iespējams, nav tik vienkārši, kā kopēt, ielīmēt. 638 00:32:10,910 --> 00:32:13,190 Bet konceptuāli, jā, tā tas notiek. 639 00:32:13,190 --> 00:32:17,350 Tagad, ņemot vērā to, cs50.h ir tikai funkciju prototipi, padomi par 640 00:32:17,350 --> 00:32:21,510 to, kā funkcijas izskatās, kāds ir to atgriešanas veids, kāds ir to 641 00:32:21,510 --> 00:32:25,670 nosaukums un kādi ir to argumenti. 642 00:32:25,670 --> 00:32:29,867 Faktiskais kods parasti tiek rakstīts dot c failā. 643 00:32:29,867 --> 00:32:31,893 Un tas tagad ir nedaudz mulsinoši, jo jūs un es esam ierakstījuši 644 00:32:31,893 --> 00:32:33,920 kodu tikai c punkta failos. 645 00:32:33,920 --> 00:32:37,190 Taču dažu nākamo nedēļu laikā jūs faktiski sāksit rakstīt arī dažus 646 00:32:37,190 --> 00:32:40,460 savus dot h failus, tāpat kā CS50, tāpat kā standarta I/O. 647 00:32:40,460 --> 00:32:43,240 Bet būtībā šī koda rindiņa tikai atvieglo jau uzrakstītā koda 648 00:32:43,240 --> 00:32:46,020 lietošanu un atkārtotu izmantošanu. 649 00:32:46,020 --> 00:32:47,750 Un tā ir visa bibliotēkas būtība. 650 00:32:47,750 --> 00:32:50,327 AUDITORIJA: vai to saistīšana ir [NEdzirdama]? 651 00:32:50,327 --> 00:32:51,910 DEIVIDS MALANS: Sakiet to nedaudz skaļāk. 652 00:32:51,910 --> 00:32:54,472 AUDITORIJA: Vai saistīšana notiek, kad izmantojat kompilatoru? 653 00:32:54,472 --> 00:32:55,180 DEIVIDS MALANS: Jā. 654 00:32:55,180 --> 00:32:56,980 Vai saistīšana notiek, kad apkopojat kodu? 655 00:32:56,980 --> 00:32:57,480 Jā. 656 00:32:57,480 --> 00:33:01,025 Palaižot make, kā mēs to darām pagājušajā nedēļā, notiek visas četras 657 00:33:01,025 --> 00:33:04,570 šīs darbības. 658 00:33:04,570 --> 00:33:06,175 Iepriekšēja apstrāde pārvērš iekļaušanas jaucējrindas par kaut ko 659 00:33:06,175 --> 00:33:07,780 citu. 660 00:33:07,780 --> 00:33:11,035 Kompilēšana tehniski pārvērš to montāžas kodā, ko Mac, PC, serveris 661 00:33:11,035 --> 00:33:14,290 saprot tuvāk. 662 00:33:14,290 --> 00:33:17,185 Assembly pārvērš šo valodu binārā mašīnkodā, ko šis dators faktiski 663 00:33:17,185 --> 00:33:20,080 saprot. 664 00:33:20,080 --> 00:33:22,540 Un tad saistīšana apvieno visu kopā. 665 00:33:22,540 --> 00:33:26,567 Un patiesībā, ja padomājat pirms dažām minūtēm, kad es to izdarīju 666 00:33:26,567 --> 00:33:30,595 -lcs50, iemesls, kāpēc man tas bija jāpievieno, un iemesls, kāpēc 667 00:33:30,595 --> 00:33:34,622 mans kods sākumā netika kompilēts, bija tāpēc, ka es aizmirsu pateikt 668 00:33:34,622 --> 00:33:38,650 clang to link CS50. nulles un vieninieki šajā pēdējā solī. 669 00:33:38,650 --> 00:33:41,565 Man nav jādara -lstdio, jo tas nāk kopā ar C, tāpēc tas būtu 670 00:33:41,565 --> 00:33:44,480 vienkārši nogurdinoši ikvienam pasaulē. 671 00:33:44,480 --> 00:33:47,140 Bet CS50 nav komplektā ar C, tāpēc mēs to saistām. 672 00:33:47,140 --> 00:33:49,780 Un, lai būtu skaidrs, mēs ne vienmēr izmantosim CS50 bibliotēku. 673 00:33:49,780 --> 00:33:51,426 Tas būs vēl viens treniņriteņu pāris, ko mēs noņemsim tuvāko nedēļu 674 00:33:51,426 --> 00:33:53,072 laikā. 675 00:33:53,072 --> 00:33:55,000 Bet pagaidām tas padara dažas lietas vienkāršākas. 676 00:33:55,000 --> 00:33:57,284 Jā? 677 00:33:57,284 --> 00:33:59,750 AUDITORIJA: Kas ir [dzirdams]? 678 00:34:08,878 --> 00:34:10,170 DEIVIDS MALANS: Īsa atbilde, jā. 679 00:34:10,170 --> 00:34:12,870 Tātad, ko nozīmē nulles un vieninieki, mašīnas kods? 680 00:34:12,870 --> 00:34:17,340 Jā, pastāv savstarpēja saistība starp mašīnas kodu un montāžas kodu. 681 00:34:17,340 --> 00:34:19,425 Montāžas kods, tas nav īsti angļu valodā, bet vismaz es atpazīstu tos 682 00:34:19,425 --> 00:34:21,510 simbolus. 683 00:34:21,510 --> 00:34:22,800 Tās nav nulles un vieninieki. 684 00:34:22,800 --> 00:34:24,810 Mašīnkods, protams, ir tikai nulles un vieninieki. 685 00:34:24,810 --> 00:34:27,720 Tātad tajā laikā, pirms C pastāvēja, cilvēki programmēja tikai 686 00:34:27,720 --> 00:34:30,630 montāžas kodā. 687 00:34:30,630 --> 00:34:32,549 Pirms montāžas koda pastāvēšanas cilvēki kodēja ar nullēm un 688 00:34:32,549 --> 00:34:34,469 vieniniekiem. 689 00:34:34,469 --> 00:34:37,289 Un jūs varat iedomāties, cik tas bija sāpīgi, un tāpēc katra no šīm 690 00:34:37,289 --> 00:34:40,110 valodām padara mūsu dzīvi vieglāku un vieglāku. 691 00:34:40,110 --> 00:34:44,100 Pēc dažām nedēļām mēs pāriesim uz Python, kas savukārt padarīs C vēl 692 00:34:44,100 --> 00:34:48,090 vienkāršāku — vai arī kodēšanu kopumā būs vienkāršāku. 693 00:34:48,090 --> 00:34:51,575 Labi, tātad, ko mēs tagad varam darīt – kas šajā gadījumā varētu 694 00:34:51,575 --> 00:34:55,060 noiet greizi? 695 00:34:55,060 --> 00:34:57,146 Nu, izrādās, ka bez kompilēšanas, tehniski runājot, ir arī 696 00:34:57,146 --> 00:34:59,233 dekompilēšana. 697 00:34:59,233 --> 00:35:01,150 Un mēs to neesam darījuši, un mēs to nedarīsim. 698 00:35:01,150 --> 00:35:04,080 Bet ir vērts to padomāt tikai uz brīdi. 699 00:35:04,080 --> 00:35:08,027 Ja jūs nevis kompilējat savu kodu, bet gan dekompilējat — kā norāda 700 00:35:08,027 --> 00:35:11,975 vārds, tas nozīmē tikai procesa apvēršanu, ideālā gadījumā to 701 00:35:11,975 --> 00:35:15,922 pārveidojot no mašīnas koda — nullēm un vieniniekiem — varbūt atpakaļ 702 00:35:15,922 --> 00:35:19,870 uz C. 703 00:35:14,580 --> 00:35:18,330 Tagad tas būtu forši, iespējams, ja viss, kas jums ir, ir programma, 704 00:35:18,330 --> 00:35:22,080 varat to konvertēt un redzēt faktisko pirmkodu. 705 00:35:22,080 --> 00:35:25,365 Kāds varētu būt mīnuss, ja kāds internetā var dekompilēt kodu savā 706 00:35:25,365 --> 00:35:28,650 datorā? 707 00:35:28,650 --> 00:35:29,160 Jā? 708 00:35:29,160 --> 00:35:30,270 Mērķauditorija: [NEdzirdams] 709 00:35:30,270 --> 00:35:32,850 DEIVIDS MALANS: Labi, tāpēc kodā ir vieglāk atrast kļūdas, kuras var 710 00:35:32,850 --> 00:35:35,430 izmantot. 711 00:35:35,430 --> 00:35:38,646 Tāpēc varētu būt vieglāk uzlauzt programmatūru, atrodot kļūdas, kuras 712 00:35:38,646 --> 00:35:41,863 jūs un es pieļāvām, jo burtiski viņi skatās uz jums kodā, savukārt 713 00:35:41,863 --> 00:35:45,080 nulles un vieninieki padara to mazāk acīmredzamu. 714 00:35:45,080 --> 00:35:48,140 Citi negatīvie aspekti, ko es saucu par dekompilēšanu? 715 00:35:48,140 --> 00:35:49,970 Jā? 716 00:35:49,970 --> 00:35:52,205 Mērķauditorija: ja lietas ir aizsargātas ar autortiesībām vai jūs pat 717 00:35:52,205 --> 00:35:54,440 nezināt, kā to iegūt - DEIVIDS MALANS: Jā. 718 00:35:54,440 --> 00:35:55,948 Mērķauditorija: [NEdzirdams] 719 00:35:55,948 --> 00:35:58,355 DEIVIDS MALANS: Jā, ja jūsu kods, jūsu darbs ir jūsu intelektuālais 720 00:35:58,355 --> 00:36:00,762 īpašums, ar autortiesībām vai citādi, tas ir nepatīkami, ka kāds var 721 00:36:00,762 --> 00:36:03,169 vienkārši palaist komandu, un viņš var redzēt oriģinālo kodu, ko jūs 722 00:36:03,169 --> 00:36:05,577 uzrakstījāt. 723 00:36:05,577 --> 00:36:08,490 Tagad izrādās, ka tas nav tik vienkārši. 724 00:36:08,490 --> 00:36:11,952 Un tāpēc, lai gan, jā, jūs varētu paņemt tādu programmu kā Hello vai 725 00:36:11,952 --> 00:36:15,414 pat Microsoft Word un pārvērst to no nullēm un vieniniekiem atpakaļ 726 00:36:15,414 --> 00:36:18,876 uz kāda veida avota kodu — vai tas būtu C vai Java, Python vai kaut 727 00:36:18,876 --> 00:36:22,338 kas cits, neatkarīgi no tā. sākotnēji tika uzrakstīts — iespējams, ka 728 00:36:22,338 --> 00:36:25,800 tas būs pilnīgs haoss. 729 00:36:25,800 --> 00:36:26,300 Kāpēc? 730 00:36:26,300 --> 00:36:28,595 Tā kā lietu mainīgo nosaukumi parasti netiek saglabāti nullēs un 731 00:36:28,595 --> 00:36:30,890 vieniniekos. 732 00:36:30,890 --> 00:36:33,980 Funkciju nosaukumi var netikt saglabāti nullēs un vieniniekos. 733 00:36:33,980 --> 00:36:36,950 Kods ir, loģika ir, bet datoram ir vienalga, kādus skaistos mainīgos 734 00:36:36,950 --> 00:36:39,920 jūs izvēlējāties un cik skaisti nosauktas jūsu funkcijas, tam tikai 735 00:36:39,920 --> 00:36:42,890 jāzina tās kā nulles un vieninieki. 736 00:36:42,890 --> 00:36:44,630 Turklāt, ja domājat par pagājušo nedēļu, mēs ieviesām tādas lietas kā 737 00:36:44,630 --> 00:36:46,370 cilpas C. 738 00:36:46,370 --> 00:36:49,745 Un bez cilpām ir, piemēram, kāda cita veida cilpa? 739 00:36:49,745 --> 00:36:50,620 Mērķauditorija: [NEdzirdams] 740 00:36:50,620 --> 00:36:53,980 DEIVIDS MALANS: Tātad, kamēr cilpa — un, lai gan tie izskatās 741 00:36:53,980 --> 00:36:57,340 atšķirīgi un jums ir jāraksta cits kods, tie sasniedz tieši tādu pašu 742 00:36:57,340 --> 00:37:00,700 funkcionalitāti, proti, kad jūs kompilējat for cilpu vai kompilējat 743 00:37:00,700 --> 00:37:04,060 while cilpu, ja loģiski, ka viņi dara to pašu, viņi var izskatīties 744 00:37:04,060 --> 00:37:07,420 identiski kā nulles un vieninieki. 745 00:37:07,420 --> 00:37:11,820 Tāpēc nav iespējams paredzēt, ka atgūsit sākotnējo kodu, kāpēc? 746 00:37:11,820 --> 00:37:15,585 Jo nulles un vieninieki var nezināt, tā teikt, vai tā bija for cilpa 747 00:37:15,585 --> 00:37:19,350 vai while cilpa, tāpēc varbūt kompilēšana parādīs vienu vai otru. 748 00:37:19,350 --> 00:37:21,960 Un, godīgi sakot, dekompilēšana, ja vien iespējams, un tas ir viens 749 00:37:21,960 --> 00:37:24,570 no veidiem, kā apgrieztā veidā pārveidot lietotāja produktu. 750 00:37:24,570 --> 00:37:27,930 Izredzes ir tādas, ka, ja esat pietiekami labs, lai sāktu lasīt kodu, 751 00:37:27,930 --> 00:37:31,290 kas ir dekompilēts, un izlasot tā nekārtības, iespējams, jums ir 752 00:37:31,290 --> 00:37:34,650 talants, lai pats vienkārši uzrakstītu to pašu programmu no nulles. 753 00:37:34,650 --> 00:37:37,530 Tas, iespējams, ir pārspīlēts, taču tas nav tik viegli vai draudīgi, 754 00:37:37,530 --> 00:37:40,410 kā varētu šķist. 755 00:37:40,410 --> 00:37:43,620 Tātad kopumā, tiklīdz kods ir apkopots, tā reversā inženierija ir 756 00:37:43,620 --> 00:37:46,830 diezgan sarežģīti, laikietilpīgi un dārgi, līdzīgi kā tas būtu 757 00:37:46,830 --> 00:37:50,040 reālajā pasaulē, vai ne? 758 00:37:50,040 --> 00:37:52,860 Kā jau mums visiem, iespējams, mūsdienās kabatā ir kāds telefons. 759 00:37:52,860 --> 00:37:54,960 Nekas neliedz jums to kaut kā atvērt, pabāzt apkārt, atjaunot to, kas 760 00:37:54,960 --> 00:37:57,060 tur ir. 761 00:37:57,060 --> 00:37:59,130 Tas, visticamāk, ir milzīgs piepūles apjoms. 762 00:37:59,130 --> 00:38:01,220 Un tajā brīdī, iespējams, jums vajadzētu vienkārši izgudrot tālruni, 763 00:38:01,220 --> 00:38:03,310 nevis mēģināt to mainīt. 764 00:38:03,310 --> 00:38:06,330 Tātad tāda pati ideja fiziskajā pasaulē. 765 00:38:06,330 --> 00:38:09,690 Vai ir kādi jautājumi par apkopošanu vai pat dekompilēšanu šajās 766 00:38:09,690 --> 00:38:13,050 veidlapās? 767 00:38:13,050 --> 00:38:15,105 Labi, iespējams, ka šobrīd ne tikai es, bet arī jūs esat pieļāvuši 768 00:38:15,105 --> 00:38:17,160 kļūdas. 769 00:38:17,160 --> 00:38:20,270 Un jūs esat uzrakstījis kļūdainu kodu — kļūda kodā ir tikai kļūda, 770 00:38:20,270 --> 00:38:23,380 loģiska kļūda vai citādi, ja kods vienkārši nedarbojas pareizi, kā 771 00:38:23,380 --> 00:38:26,490 jūs plānojat. 772 00:38:26,490 --> 00:38:29,433 Un līdz šim, iespējams, jūsu atkļūdošanas paņēmieni ir bijuši tādi, 773 00:38:29,433 --> 00:38:32,376 lai varētu atskatīties uz to, ko es darīju stundā, varbūt uzdot 774 00:38:32,376 --> 00:38:35,320 jautājumu tiešsaistē vai klātienē. 775 00:38:35,320 --> 00:38:37,445 Bet galu galā būtu jauki, ja jums būtu daži savi rīki, ar kuriem 776 00:38:37,445 --> 00:38:39,570 atkļūdot kodu. 777 00:38:39,570 --> 00:38:41,587 Un šī, godīgi sakot, ir mūža prasme. 778 00:38:41,587 --> 00:38:44,748 Jūs neizkļūsit no CS50 — un pat pēc 20 gadiem jūs nerakstīsit, ja 779 00:38:44,748 --> 00:38:47,910 vispār rakstīsit kodu, visu laiku labojiet kodu. 780 00:38:47,910 --> 00:38:50,820 Tāpat kā mēs visi darbinieki turpinām rakstīt kļūdas. 781 00:38:50,820 --> 00:38:53,180 Cerams, ka tie kļūs nedaudz izsmalcinātāki, nevis līdzīgi, ak, es 782 00:38:53,180 --> 00:38:55,540 palaidu garām semikolu. 783 00:38:55,540 --> 00:38:57,660 Bet pat šādas kļūdas pieļaujam arī mēs. 784 00:38:57,660 --> 00:39:00,605 Taču ir pieejami rīki un paņēmieni, kas var atvieglot jūsu dzīvi, kad 785 00:39:00,605 --> 00:39:03,550 runa ir par šo problēmu risināšanu. 786 00:39:03,550 --> 00:39:06,360 Tagad termins bug faktiski ir pastāvējis gadu desmitiem. 787 00:39:06,360 --> 00:39:10,005 Taču interesants stāsts ir tāds, ka pirmā dokumentētā faktiskā kļūda 788 00:39:10,005 --> 00:39:13,650 patiesībā bija kaut kādā veidā saistīta ar Hārvardu. 789 00:39:13,650 --> 00:39:17,527 Faktiski šis ir žurnāls, kas attiecas uz Harvard Mark II datoru no 790 00:39:17,527 --> 00:39:21,405 1947. gada, un, ja jūs izlasiet piezīmes šeit — un es pietuvināšu — 791 00:39:21,405 --> 00:39:25,282 šī bija īsts kode, kas tika atklāta šī lielā lieldatora iekšpusē, kas 792 00:39:25,282 --> 00:39:29,160 izraisīja veida problēmas. 793 00:39:29,160 --> 00:39:31,385 Un toreizējiem inženieriem šķita smieklīgi, ka, oh, fiziska kļūda 794 00:39:31,385 --> 00:39:33,610 patiesībā izskaidro šo problēmu. 795 00:39:33,610 --> 00:39:36,350 Un tas ir uz visiem laikiem pielīmēts uz šīs papīra lapas, kas, 796 00:39:36,350 --> 00:39:39,090 manuprāt, tagad ir izstādīta Smitsona izdevumā. 797 00:39:39,090 --> 00:39:43,260 Ņemot to vērā, arī šī ir tikai loģiska kļūda. 798 00:39:43,260 --> 00:39:48,450 Un šis stāsts patiesībā ir - šo stāstu bieži pārstāstīja slavens 799 00:39:48,450 --> 00:39:53,640 matemātiķis, toreizējais datorzinātnieks, Dr. 800 00:39:49,170 --> 00:39:53,190 Greisa Hopere, kura faktiski strādāja ne tikai ar Harvard Mark II 801 00:39:53,190 --> 00:39:57,210 datoru, bet arī tā priekšteci Harvard Mark I. 802 00:39:57,210 --> 00:40:00,650 Un, ja jūs kādreiz esat pavadījis laiku, tomēr inženiertehniskajā ēkā 803 00:40:00,650 --> 00:40:04,090 pāri upei jūs varat redzēt lielu daļu no šī datora, kas atrodas pie 804 00:40:04,090 --> 00:40:07,530 sienas, kad pirmo reizi ieejat Zinātnes un inženierzinātņu kompleksā. 805 00:40:07,530 --> 00:40:09,300 Un patiešām, kā jūs droši vien esat dzirdējuši, pieaugot, šis ir 806 00:40:09,300 --> 00:40:11,070 lieldators. 807 00:40:11,070 --> 00:40:13,905 Šādi izskatījās Mac un personālie datori, tā sakot, ar ļoti fiziskiem 808 00:40:13,905 --> 00:40:16,740 elementiem, kas būtībā ieviesa nulles un vieniniekus, kurus mēs ar 809 00:40:16,740 --> 00:40:19,575 jums uzskatām par pašsaprotamu, tagad mūsu klēpjdatoros un tālruņos 810 00:40:19,575 --> 00:40:22,410 ir miniaturizēti. 811 00:40:22,410 --> 00:40:23,910 Tātad tur ir gabals vēstures. 812 00:40:23,910 --> 00:40:27,390 Ja kādreiz apmeklējat šo pilsētiņas pusi, ieskatieties. 813 00:40:27,390 --> 00:40:29,370 Bet tad padomāsim, kā mēs, protams, risinām nevis fiziskās, bet 814 00:40:29,370 --> 00:40:31,350 loģiskās kļūdas. 815 00:40:31,350 --> 00:40:34,340 Un ņemsim vērā kaut ko līdzīgu no pagājušās nedēļas, kad mēs ļoti 816 00:40:34,340 --> 00:40:37,330 vienkārši mēģinājām izdrukāt kā šo trīs ķieģeļu kolonnu, izmantojot 817 00:40:37,330 --> 00:40:40,320 sava veida tēmturus. 818 00:40:40,320 --> 00:40:44,400 Tāpēc ļaujiet man pēc brīža pāriet uz VS Code. 819 00:40:44,400 --> 00:40:45,740 Un es iešu uz priekšu un atvēršu programmu, kuru es uzrakstīju 820 00:40:45,740 --> 00:40:47,080 iepriekš. 821 00:40:47,080 --> 00:40:49,295 Un es to atnesu uz nodarbību, jo tajā ir kļūda, un es vēlētos 822 00:40:49,295 --> 00:40:51,510 izdomāt, kā šo kļūdu novērst. 823 00:40:51,510 --> 00:40:56,160 Tāpēc ļaujiet man atvērt buggy0.c, kas ir mana koda 0. versija. 824 00:40:56,160 --> 00:40:58,200 Un īsi ieskatīsimies, kas šeit ir. 825 00:40:58,200 --> 00:40:58,950 Tas ir diezgan īss. 826 00:40:58,950 --> 00:41:03,373 Tas ietver tikai stdio.h, tas izmanto printf, izmanto for cilpu, un 827 00:41:03,373 --> 00:41:07,797 mērķis, gluži vienkārši, ir izdrukāt šo trīs ķieģeļu kolonnu. 828 00:41:07,797 --> 00:41:10,578 Tagad tas ir pietiekami īss, lai daži no jums, ja jūs jau jūtaties 829 00:41:10,578 --> 00:41:13,360 ērti, izmantojot C, jūs jau varētu redzēt loģisko kļūdu. 830 00:41:13,360 --> 00:41:16,200 Tā nav sintakses kļūda, piemēram, tā tiks apkopota un palaistu. 831 00:41:16,200 --> 00:41:17,280 Bet tur ir kāda kļūda. 832 00:41:17,280 --> 00:41:20,768 Un pieņemsim, ka es esmu ļoti iesācējs C, es jūtos ļoti neērti ar C, 833 00:41:20,768 --> 00:41:24,256 pulkstenis ir 2:00 un es vienkārši neredzu kļūdu. Kādi šeit ir mani 834 00:41:24,256 --> 00:41:27,745 līdzekļi, lai atrastu šādu kļūdu? 835 00:41:27,745 --> 00:41:29,370 Pirmkārt, apskatīsim simptomu. 836 00:41:29,370 --> 00:41:31,740 Ļaujiet man doties uz termināļa logu. 837 00:41:31,740 --> 00:41:36,120 Es izmantošu make buggy0, jo atkal faila nosaukums ir buggyo.c. 838 00:41:36,120 --> 00:41:37,260 Es netaisos lietot klangu. 839 00:41:37,260 --> 00:41:39,880 Patiesībā es nekad īsti neizmantošu zvanīšanu manuāli. 840 00:41:39,880 --> 00:41:42,430 Es tikai izmantošu make, jo tas atvieglo mūsu dzīvi. 841 00:41:42,430 --> 00:41:43,560 Tas apkopo. 842 00:41:43,560 --> 00:41:45,390 Nav kļūdu, tāpēc tā nav sintakse. 843 00:41:45,390 --> 00:41:47,670 Tas nav kaut kas muļķīgs, piemēram, trūkstošs semikolu. 844 00:41:47,670 --> 00:41:51,650 Bet, kad es palaižu ./buggy0, es, protams, redzu vienu, divus, trīs, 845 00:41:51,650 --> 00:41:55,630 četrus, un tas, protams, neatbilst vienam, diviem, trīs ķieģeļiem, ko 846 00:41:55,630 --> 00:41:59,610 es patiesībā paredzēju šai kolonnai. 847 00:41:59,610 --> 00:42:02,970 Un tomēr es sāku skaitīt no 0, kā es to parasti daru. 848 00:42:02,970 --> 00:42:03,930 Man ir trīs. 849 00:42:03,930 --> 00:42:05,280 Es eju līdz trijiem. 850 00:42:05,280 --> 00:42:06,780 Tātad, kur ir mana loģiskā kļūda? 851 00:42:06,780 --> 00:42:08,465 Ja tas jums acīmredzami jau nav ienācis prātā, kā es varu to 852 00:42:08,465 --> 00:42:10,150 atrisināt? 853 00:42:10,150 --> 00:42:13,115 Pirmkārt un galvenokārt, iespējams, labākais paņēmiens kļūdu 854 00:42:13,115 --> 00:42:16,080 risināšanai, vismaz agrīnā stadijā, ir izmantot printf. 855 00:42:16,080 --> 00:42:18,050 Tāpat kā līdz šim, mēs esam izmantojuši sprintu, sakot, Sveiki, un 856 00:42:18,050 --> 00:42:20,020 citas ekrānā redzamās lietas. 857 00:42:20,020 --> 00:42:22,530 Bet printf ir tikai funkcija jebko drukāt. 858 00:42:22,530 --> 00:42:25,470 Un nav nekāda iemesla, lai īslaicīgi nevarētu izmantot printf, lai 859 00:42:25,470 --> 00:42:28,410 izdrukātu mainīgo saturu, kas notiek jūsu programmā, lai tikai 860 00:42:28,410 --> 00:42:31,350 noskaidrotu, kur ir jūsu kļūda. 861 00:42:31,350 --> 00:42:32,940 Un pēc tam vēlāk varat izdzēst šo koda rindiņu. 862 00:42:32,940 --> 00:42:34,600 Tam nav jāpaliek tur mūžīgi. 863 00:42:34,600 --> 00:42:35,740 Tāpēc ļaujiet man to izdarīt. 864 00:42:35,740 --> 00:42:40,715 Tā vietā, lai VS kodā vienkārši izdrukātu jaukšanas simbolu, ļaujiet 865 00:42:40,715 --> 00:42:45,690 man veikt nelielu drošības pārbaudi un izdrukāt i vērtību. 866 00:42:45,690 --> 00:42:48,650 Ļaujiet man iet uz priekšu un pateikt kaut ko līdzīgu: es esmu... 867 00:42:48,650 --> 00:42:51,610 tagad es gribu teikt, ka es esmu tas. 868 00:42:51,610 --> 00:42:54,540 Bet, protams, šādi es neizdruku i vērtību. 869 00:42:54,540 --> 00:42:58,930 Ja es vēlos izdrukāt i vērtību, ko man šeit ievietot? 870 00:42:58,930 --> 00:43:02,160 Tātad %i veselam skaitlim, nevis %s virknei. 871 00:43:02,160 --> 00:43:03,410 Tātad tie joprojām ir vietturi. 872 00:43:03,410 --> 00:43:04,930 Bet mēs izmantojam %s veseliem skaitļiem. 873 00:43:04,930 --> 00:43:07,090 Un tagad, ja es gribu izdrukāt i, man vienkārši vajag komatu kā otro 874 00:43:07,090 --> 00:43:09,250 argumentu, un tad i. 875 00:43:09,250 --> 00:43:11,125 Labi, ļaujiet man doties uz priekšu un atgriezties pie sava termināļa 876 00:43:11,125 --> 00:43:13,000 loga. 877 00:43:13,000 --> 00:43:15,760 Ļaujiet man pārkompilēt programmu, jo esmu to mainījis. 878 00:43:15,760 --> 00:43:18,880 Tas joprojām darbojas labi, ./buggy0. 879 00:43:18,880 --> 00:43:22,540 Un tagad ļaujiet man šeit palielināt sava termināļa loga izmēru. 880 00:43:22,540 --> 00:43:25,510 Ja vēlaties, jūs vienkārši redzat kādu diagnostikas informāciju. 881 00:43:25,510 --> 00:43:26,560 Tas nav mērķis. 882 00:43:26,560 --> 00:43:30,070 Tas nav tas, kas jums būtu jāiesniedz mājasdarbam, ja tāds būtu. 883 00:43:30,070 --> 00:43:32,260 Bet tas palīdz mums diagnostiski zināt, ka, ja es ir nulle, šeit ir 884 00:43:32,260 --> 00:43:34,450 jaukts. 885 00:43:34,450 --> 00:43:36,182 Kad man ir 1, šeit ir hash. 886 00:43:36,182 --> 00:43:37,390 Kad man ir divi, šeit ir hash. 887 00:43:37,390 --> 00:43:39,017 Kad man ir 3, šeit ir hash. 888 00:43:39,017 --> 00:43:39,850 Nu, pagaidiet minūti. 889 00:43:39,850 --> 00:43:41,530 Tas ir viens, divi, trīs, četri. 890 00:43:41,530 --> 00:43:44,360 Skaidrs, ka es to drukāju pārāk daudz reižu. 891 00:43:44,360 --> 00:43:48,130 Tāpēc ļaujiet man atskatīties uz kodu, samazinot termināļa logu. 892 00:43:48,130 --> 00:43:53,080 Un ļaujiet man vienkārši pajautāt grupai, kur patiesībā ir kļūda? 893 00:43:53,080 --> 00:43:56,080 Vai arī kāds būtu risinājums? 894 00:43:56,080 --> 00:43:57,561 Jā, pa vidu. 895 00:43:57,561 --> 00:44:00,020 Mērķauditorija: [NEdzirdams] 896 00:44:00,020 --> 00:44:01,785 DEIVIDS MALANS: Jā, tā vietā, lai mazāk par vai vienāds ar, 897 00:44:01,785 --> 00:44:03,550 izmantojiet tikai mazāk nekā. 898 00:44:03,550 --> 00:44:05,300 Tātad jums šeit ir jāizvēlas josla. 899 00:44:05,300 --> 00:44:08,090 Ja plānojat sākt skaitīt no 0, parasti izmantojat mazāk nekā un 900 00:44:08,090 --> 00:44:10,880 palielināsiet līdz, bet ne caur vērtību. 901 00:44:10,880 --> 00:44:13,020 Vai arī, ja vēlaties, piemēram, cilvēku pasaulē, skaitot no 1 uz 902 00:44:13,020 --> 00:44:15,160 augšu, varat izmantot mazāku vai vienādu ar, bet jums ir jābūt 903 00:44:15,160 --> 00:44:17,300 konsekventam. 904 00:44:17,300 --> 00:44:19,955 Un vispār, kā programmētājs, vienkārši vienmēr sāciet skaitīt no 0, 905 00:44:19,955 --> 00:44:22,610 ja darāt kaut ko tādu, kas ir līdzīgs šim. 906 00:44:22,610 --> 00:44:25,235 Bet risinājums patiešām ir tikai to mainīt, mainot lielāko mazāku vai 907 00:44:25,235 --> 00:44:27,860 vienādu ar mazāku. 908 00:44:27,860 --> 00:44:32,180 Ja es pārkompilēju šo programmu ar make buggy0 un pēc tam vēlreiz 909 00:44:32,180 --> 00:44:36,500 veicu .buggy0 un ļaujiet man palielināt sava termināļa loga izmēru. 910 00:44:36,500 --> 00:44:39,050 Tagad, redzi, labi, gandrīz tāda pati izvade. 911 00:44:39,050 --> 00:44:44,330 Bet patiešām, es sāku ar 0 un eju līdz trim, bet ne līdz. 912 00:44:44,330 --> 00:44:48,920 Labi, tāpēc printf, īsi sakot, var būt jūsu pirmais diagnostikas rīks. 913 00:44:48,920 --> 00:44:51,709 Tā vietā, lai vienkārši skatītos uz ekrānu vai paceltu roku — es 914 00:44:51,709 --> 00:44:54,498 domāju, izmantojiet printf, lai burtiski redzētu, kas notiek jūsu 915 00:44:54,498 --> 00:44:57,287 programmā, vienkārši izdrukājot interesējošās lietas. 916 00:44:57,287 --> 00:45:00,063 Kad esat atrisinājis problēmu, varat atgriezties savā kodā, kā es to 917 00:45:00,063 --> 00:45:02,840 darīšu šeit, samazinot savu termināļa logu. 918 00:45:02,840 --> 00:45:04,610 Es izdzēsīšu printf rindiņu. 919 00:45:04,610 --> 00:45:06,740 Un tagad esmu gatavs dalīties ar šo programmu ar pasauli vai iesniegt 920 00:45:06,740 --> 00:45:08,870 to kā mājasdarbu vai tamlīdzīgi. 921 00:45:08,870 --> 00:45:11,390 Tas ir tikai domāts, lai tas būtu īslaicīgs. 922 00:45:11,390 --> 00:45:15,440 Vai jums ir jautājumi par printf kā atkļūdošanas rīku? 923 00:45:18,010 --> 00:45:18,510 Nē? 924 00:45:18,510 --> 00:45:20,970 Labi, tas mūs noved tikai tik tālu. 925 00:45:20,970 --> 00:45:24,600 Un, godīgi sakot, jūsu programmām augot, augot un augot, būs ļoti 926 00:45:24,600 --> 00:45:28,230 kaitinoši sākt ieiet un pievienot printf, pēc tam tos noņemt un 927 00:45:28,230 --> 00:45:31,860 noskaidrot, ja jums ir vairāki printf, tad kurš no tiem ko izdrukā? 928 00:45:31,860 --> 00:45:34,560 Galu galā paļauties tikai uz printf kļūst sarežģīti. 929 00:45:34,560 --> 00:45:37,800 Tā kā datorzinātnieki ir datorzinātnieki, viņi ir uzrakstījuši 930 00:45:37,800 --> 00:45:41,040 programmatūru, lai atvieglotu koda atkļūdošanu. 931 00:45:41,040 --> 00:45:43,563 Šo programmatūru mēs parasti saucam par atkļūdotāju, kas būtu otrais 932 00:45:43,563 --> 00:45:46,086 tirdzniecības rīks, ko varat izmantot, lai faktiski atrisinātu 933 00:45:46,086 --> 00:45:48,610 problēmas savā kodā. 934 00:45:48,610 --> 00:45:52,690 Tagad VS koda pasaulē faktiski ir iebūvēts atkļūdotājs. 935 00:45:52,690 --> 00:45:55,475 Tātad grafiskais lietotāja interfeiss, ko redzēsit programmā VS Code, 936 00:45:55,475 --> 00:45:58,260 nav raksturīgs CS50, tas faktiski tiek piegādāts kopā ar VS kodu. 937 00:45:58,260 --> 00:46:03,030 Un tas atbalsta C, C++, Java un Python, kā arī daudzas citas valodas. 938 00:46:03,030 --> 00:46:07,650 Taču, protams, ir nedaudz sarežģīti vienkārši sākt lietot atkļūdotāju. 939 00:46:07,650 --> 00:46:10,565 Jums ir jāizveido konfigurācijas fails un jāveic dažas kaitinošas 940 00:46:10,565 --> 00:46:13,480 darbības, kas tikai traucē atrisināt reālas problēmas. 941 00:46:13,480 --> 00:46:17,070 Tāpēc mēs esam automatizējuši atkļūdotāja palaišanas procesu. 942 00:46:17,070 --> 00:46:19,680 Un pēc tam tas ir sava veida nozares standarts, kā jūs to izmantojat. 943 00:46:19,680 --> 00:46:21,530 Taču mēs ietaupīsim jums galvassāpes, kas saistītas ar šo 944 00:46:21,530 --> 00:46:23,380 konfigurācijas failu izveidi. 945 00:46:23,380 --> 00:46:25,330 Tātad, pieņemsim, ka es gribu to darīt. 946 00:46:25,330 --> 00:46:27,830 Pieņemsim, ka es vēlos mēģināt soli pa solim atkļūdot šo programmu, 947 00:46:27,830 --> 00:46:30,330 izmantojot īpašu programmatūru. 948 00:46:30,330 --> 00:46:31,810 Nu kā es to varu izdarīt? 949 00:46:31,810 --> 00:46:35,136 Ļaujiet man ierosināt, ka, ja es to atgriezīšu atpakaļ uz sākotnējo 950 00:46:35,136 --> 00:46:38,463 versiju, kurā es biju mazāks vai vienāds ar 3, esmu diezgan 951 00:46:38,463 --> 00:46:41,790 pārliecināts, ka es drukāju pārāk daudz jaucējzīmju. 952 00:46:41,790 --> 00:46:43,475 Tāpēc es darīšu to — un jūs, iespējams, to izdarījāt nejauši vai arī 953 00:46:43,475 --> 00:46:45,160 nekad. 954 00:46:45,160 --> 00:46:48,236 Bet ņemiet vērā, ja virzāt kursoru virs, tā sakot, VS Code, tās 955 00:46:48,236 --> 00:46:51,313 daļas, kas atrodas pa kreisi no redaktora, jūs redzat šādu pelēku 956 00:46:51,313 --> 00:46:54,390 sarkanu punktu. 957 00:46:54,390 --> 00:46:57,240 Noklikšķinot tur, tas kļūst par spilgtāku sarkanu punktu. 958 00:46:57,240 --> 00:46:59,670 Un tas atspoguļo to, ko mēs sauksim par pārtraukuma punktu. 959 00:46:59,670 --> 00:47:02,230 Un tas ir tikai vizuāls rādītājs, ka esat tur ievietojis kā 960 00:47:02,230 --> 00:47:04,790 apstāšanās zīmi ekvivalentu un pēc brīža sakāt atkļūdotājam, 961 00:47:04,790 --> 00:47:07,350 pārtrauciet tur palaist manu kodu. 962 00:47:07,350 --> 00:47:07,920 Kāpēc? 963 00:47:07,920 --> 00:47:11,150 Tāpēc, ka man labāk patīk iziet cauri savam kodam cilvēka ātrumā, 964 00:47:11,150 --> 00:47:14,380 nevis datora ātrumā, kur tas darbojas uzreiz. 965 00:47:14,380 --> 00:47:16,750 Tāpēc esmu iestatījis savu pārtraukuma punktu, kas ir pirmais solis. 966 00:47:16,750 --> 00:47:18,580 Un tad otrais solis ir pavisam vienkāršs. 967 00:47:18,580 --> 00:47:22,295 Tā vietā, lai palaistu pašu programmu, palaidiet komandu debug50 un 968 00:47:22,295 --> 00:47:26,010 pēc tam ./buggy0. 969 00:47:26,010 --> 00:47:29,250 Un tagad tas sāks jūsu programmu, bet atkļūdotāja iekšpusē, kas ir 970 00:47:29,250 --> 00:47:32,490 īpaša programma, ko ir uzrakstījuši gudri cilvēki un kas dos jums 971 00:47:32,490 --> 00:47:35,730 iespēju tagad rindiņu pa rindiņai un vēlreiz savā ērtā tempā iziet 972 00:47:35,730 --> 00:47:38,970 cauri savam kodam. 973 00:47:38,970 --> 00:47:43,080 Es nospiedīšu taustiņu Enter, ekrānā parādīsies dažas lietas — ak. 974 00:47:43,080 --> 00:47:45,767 Ņemiet vērā, ka šī ir izplatīta kļūda, ko es šeit pieļāvu nejauši. 975 00:47:45,767 --> 00:47:47,100 Šķiet, ka esmu mainījis savu kodu. 976 00:47:47,100 --> 00:47:49,892 Es to izdarīju, jo es iegāju un nomainīju mazāku vai vienādu zīmi. 977 00:47:49,892 --> 00:47:53,520 Ļaujiet man turpināt un atkārtoti palaist make buggy0-- Enter. 978 00:47:53,520 --> 00:47:57,810 Labi, tagad ļaujiet man atkārtoti palaist debug50 — Enter. 979 00:47:57,810 --> 00:48:00,543 Tagad dažas lietas tikko notika ekrānā, un ir nepieciešams brīdis, 980 00:48:00,543 --> 00:48:03,276 lai sāktu darbu, taču, tiklīdz tas būs sākts, jūs to redzēsit, jūs 981 00:48:03,276 --> 00:48:06,010 joprojām redzēsit savu kodu. 982 00:48:06,010 --> 00:48:07,710 Bet jūs redzēsit šo dzelteno izcēlumu, ko, iespējams, vēl neesat 983 00:48:07,710 --> 00:48:09,410 redzējis. 984 00:48:09,410 --> 00:48:11,425 Un ievērojiet, ka tas īpaši izceļ to pašu līniju, kurā es iestatīju 985 00:48:11,425 --> 00:48:13,440 pārtraukuma punktu. 986 00:48:13,440 --> 00:48:13,950 Kāpēc? 987 00:48:13,950 --> 00:48:17,310 Tas tikai nozīmē, ka atkļūdotājs ir izpildījis visas šīs rindas, 988 00:48:17,310 --> 00:48:20,670 izņemot 7. rindu. 989 00:48:20,670 --> 00:48:23,340 Tas ir salūzis — ne sliktā nozīmē. 990 00:48:23,340 --> 00:48:25,460 Bet tas ir apturējis izpildi 7. rindā, tāpēc tas vēl nav izdrukājis 991 00:48:25,460 --> 00:48:27,580 nevienu jaucēju. 992 00:48:27,580 --> 00:48:30,450 Un jūs to redzat — termināļa logā vēl nav jauktu. 993 00:48:30,450 --> 00:48:31,980 Tā izpilde ir apturēta. 994 00:48:31,980 --> 00:48:37,410 Bet kas ir interesanti ar atkļūdotāju, ir sīkumi šeit, kreisajā pusē. 995 00:48:37,410 --> 00:48:39,660 Šeit esošajā atkļūdotāja sadaļā mainīgie redzēsit visus tā sauktos 996 00:48:39,660 --> 00:48:41,910 vietējos mainīgos. 997 00:48:41,910 --> 00:48:45,327 Un mēs neesam īsti nošķīruši lokālo un kaut ko, ko sauc par globālo. 998 00:48:45,327 --> 00:48:47,358 Bet pagaidām vietējie mainīgie nozīmē tikai visus mainīgos, kas 999 00:48:47,358 --> 00:48:49,390 pastāv jūsu funkcijā. 1000 00:48:49,390 --> 00:48:52,110 Tātad man pašlaik ir vērtība 0. 1001 00:48:52,110 --> 00:48:53,410 Labi, un tam ir jēga. 1002 00:48:53,410 --> 00:48:57,360 Tātad, kā es varu iziet cauri savam kodam un redzēt, ko tas dara? 1003 00:48:57,360 --> 00:49:00,495 Šeit ekrāna augšdaļā redzēsit dažas atskaņošanas ikonas, kas ir 1004 00:49:00,495 --> 00:49:03,630 līdzīgas video atskaņotājam, taču tām ir īpaša nozīme. 1005 00:49:03,630 --> 00:49:07,892 Šī pirmā atskaņos visu pārējo programmu līdz beigām. 1006 00:49:07,892 --> 00:49:10,501 Tātad jūs noklikšķiniet uz tā tikai tad, ja esat atrisinājis problēmu 1007 00:49:10,501 --> 00:49:13,110 un vienkārši vēlaties to palaist līdz beigām tāpat kā iepriekš. 1008 00:49:13,110 --> 00:49:16,920 Bet nākamie trīs vai nākamie divi tiešām ir sulīgākie. 1009 00:49:16,920 --> 00:49:19,425 Otrais šeit, ja novietosit kursoru virs tā, galu galā redzēsit, ka to 1010 00:49:19,425 --> 00:49:21,930 sauc par Step Over. 1011 00:49:21,930 --> 00:49:25,280 Step Over nozīmē, ka atkļūdotājs izpildīs šo pašlaik izcelto koda 1012 00:49:25,280 --> 00:49:28,630 rindiņu, taču tas tajā neiedziļinās. 1013 00:49:28,630 --> 00:49:30,728 Tātad, ja tā ir funkcija, piemēram, printf, tā nesāks iet cauri 1014 00:49:30,728 --> 00:49:32,827 printf rindiņai pa rindiņai. 1015 00:49:32,827 --> 00:49:33,327 Kāpēc? 1016 00:49:33,327 --> 00:49:34,873 Tā kā es diezgan lielā mērā varu pieņemt, ka printf, kas rakstīts 1017 00:49:34,873 --> 00:49:36,420 pirms gadu desmitiem, ir pareizs. 1018 00:49:36,420 --> 00:49:38,050 Problēma droši vien ir manī. 1019 00:49:38,050 --> 00:49:41,290 Bet šajā nākamajā rindiņā, ja es patiešām vēlos iedziļināties printf 1020 00:49:41,290 --> 00:49:44,530 kodā, lai noskaidrotu, kā tas darbojas, vai visus šos gadus vēlāk 1021 00:49:44,530 --> 00:49:47,770 atrastu tajā kādu problēmu, varat ieiet printf, un tad ekrāns 1022 00:49:47,770 --> 00:49:51,010 mainītos, un jūs skatiet katru no printf rindiņām pa rindiņai — 1023 00:49:51,010 --> 00:49:54,250 vismaz tad, ja ir instalēts printf avota kods. 1024 00:49:54,250 --> 00:49:56,490 Labi, es izmantošu pirmo, Step Over. 1025 00:49:56,490 --> 00:49:59,130 Un skatieties, kā pārvietojas dzeltenais izgaismojums. 1026 00:49:59,130 --> 00:50:03,060 Un skatieties, kā termināļa logā ir hash simbols. 1027 00:50:03,060 --> 00:50:03,780 Lūk. 1028 00:50:03,780 --> 00:50:05,130 Ir viens hash. 1029 00:50:05,130 --> 00:50:07,230 Tagad paziņojuma 5. rindiņa ir iezīmēta. 1030 00:50:07,230 --> 00:50:09,480 Tas nozīmē, ka tas ir apturēts 5. rindā. 1031 00:50:09,480 --> 00:50:11,350 5. rinda vēl nav izpildīta. 1032 00:50:11,350 --> 00:50:12,600 Tātad, ko tas nozīmē? 1033 00:50:12,600 --> 00:50:16,320 i vērtība augšējā kreisajā stūrī joprojām ir 0. 1034 00:50:16,320 --> 00:50:20,395 Bet, tiklīdz es vēlreiz noklikšķinu uz Step Over, skatieties, kas 1035 00:50:20,395 --> 00:50:24,470 notiek augšējā kreisajā stūrī, kur i ir ekrāna mainīgais. 1036 00:50:24,470 --> 00:50:27,920 Tagad i — un tas īsi mirgoja — ir vērtība 1. 1037 00:50:27,920 --> 00:50:30,650 Un tagad, ja es atkal piekāpšos, skatieties termināļa logu. 1038 00:50:30,650 --> 00:50:32,120 Šeit ir mans otrais hash. 1039 00:50:32,120 --> 00:50:34,250 Tagad ļaujiet man noklikšķināt uz Step Over, lai atvērtu cilpu, 1040 00:50:34,250 --> 00:50:36,380 skatīties mainīgo augšējā kreisajā stūrī. 1041 00:50:36,380 --> 00:50:38,567 Tagad 1 pāriet uz 2. 1042 00:50:38,567 --> 00:50:39,650 Tagad ļaujiet man vēlreiz noklikšķināt uz tā. 1043 00:50:39,650 --> 00:50:43,220 Trešais sajaukums — un šeit, iespējams, atklājas loģiskā kļūda. 1044 00:50:43,220 --> 00:50:45,210 Ļaujiet man iet uz priekšu un pārkāpt cilpu. 1045 00:50:45,210 --> 00:50:46,520 Tagad man ir 3. 1046 00:50:46,520 --> 00:50:49,280 Pagaidiet, es joprojām izdrukāšu hash. 1047 00:50:49,280 --> 00:50:49,810 Tur tas ir. 1048 00:50:49,810 --> 00:50:50,810 Tur ir ceturtais hash. 1049 00:50:50,810 --> 00:50:53,852 Un šajā brīdī, cerams, spuldze, sakāmvārdā, ir nodzisusi. 1050 00:50:53,852 --> 00:50:55,020 Es saprotu, ak, es sapucējos. 1051 00:50:55,020 --> 00:50:57,511 Es varu vai nu pilnībā apturēt programmu, izmantojot sarkano 1052 00:50:57,511 --> 00:51:00,002 kvadrātu, vai arī varu vienkārši ļaut tai darboties līdz beigām, kas 1053 00:51:00,002 --> 00:51:02,493 vienkārši pārtrauc visu. 1054 00:51:02,493 --> 00:51:05,660 Šobrīd es tikai vēlos atgriezties savā kodā un sākt labot lietas. 1055 00:51:05,660 --> 00:51:08,165 Un jūs varat aizvērt, piemēram, kā es šeit darīšu, failu pārlūku, lai 1056 00:51:08,165 --> 00:51:10,670 tikai paslēptu atvērto paneli. 1057 00:51:10,670 --> 00:51:12,320 Tātad tas ir debug50. 1058 00:51:12,320 --> 00:51:15,920 Taču tā nav CS50 lieta, kas tikai palaiž jūsu vietā atkļūdotāju, ko 1059 00:51:15,920 --> 00:51:19,520 mūsdienās var atrast gandrīz jebkurā programmēšanas vidē. 1060 00:51:19,520 --> 00:51:23,670 Vai jums ir jautājumi par atkļūdošanu? 1061 00:51:23,670 --> 00:51:24,170 Jautājumi? 1062 00:51:24,170 --> 00:51:24,670 Jā? 1063 00:51:24,670 --> 00:51:27,295 AUDITORIJA: Kur ir norādīts, kur nogāja greizi? 1064 00:51:27,295 --> 00:51:28,420 DEIVIDS MALANS: Labs jautājums. 1065 00:51:28,420 --> 00:51:30,310 Kur ir teikts, kur tas nogāja greizi? 1066 00:51:30,310 --> 00:51:33,190 Tāpēc diemžēl tas jums par to neko nepasaka. 1067 00:51:33,190 --> 00:51:36,385 Jums, cilvēkam, joprojām ir pienākums produktīvi izmantot šo rīku, 1068 00:51:36,385 --> 00:51:39,580 lai saprātīgākā tempā ievadītu kodu. 1069 00:51:39,580 --> 00:51:42,070 Bet jūsu smadzenes ir tās, kurām tas joprojām ir jāatrisina. 1070 00:51:42,070 --> 00:51:44,433 Un es nešaubos, ka, izmantojot mākslīgo intelektu un daudz ko citu, 1071 00:51:44,433 --> 00:51:46,796 šādas programmas kļūs vēl noderīgākas un sāks mums atbildēt uz šādiem 1072 00:51:46,796 --> 00:51:49,160 jautājumiem. 1073 00:51:49,160 --> 00:51:51,075 Un ir arī citi rīki, kurus mēs jūs iepazīstināsim šajā semestrī un 1074 00:51:51,075 --> 00:51:52,990 kuri ir vēl jaudīgāki par šo. 1075 00:51:52,990 --> 00:51:55,405 Bet pagaidām tas ir tikai rīks, lai palēninātu darbību un nav jāmaina 1076 00:51:55,405 --> 00:51:57,820 kods. 1077 00:51:57,820 --> 00:52:00,820 Tas, ka man bija panelis kreisajā pusē, kas tikko rādīja man mainīgo 1078 00:52:00,820 --> 00:52:03,820 vērtību, ir tikai alternatīva printf, un es varu to pārvietot nedaudz 1079 00:52:03,820 --> 00:52:06,820 lēnāk. 1080 00:52:06,820 --> 00:52:10,580 Citi jautājumi par atkļūdošanu? 1081 00:52:10,580 --> 00:52:11,080 Nē? 1082 00:52:11,080 --> 00:52:14,950 Ļaujiet man parādīt vienu pēdējo piemēru ar šo atkļūdotāju šeit. 1083 00:52:14,950 --> 00:52:16,750 Un arī šo es uzrakstīju iepriekš. 1084 00:52:16,750 --> 00:52:18,730 Ļaujiet man aizvērt buggy0.c. 1085 00:52:18,730 --> 00:52:22,327 Un ļaujiet man atvērt buggy1.c, manu otro versiju. 1086 00:52:22,327 --> 00:52:25,178 Ļaujiet man uz sekundi aizvērt termināļa logu un sniegt jums īsu šīs 1087 00:52:25,178 --> 00:52:28,030 programmas apskatu, kurā tāpat ir kļūda. 1088 00:52:28,030 --> 00:52:32,830 Tagad šīs programmas augšdaļā daži pazīstami ietver cs50.h un stdio.h. 1089 00:52:32,830 --> 00:52:34,730 Mēs to neesam redzējuši iepriekš. 1090 00:52:34,730 --> 00:52:38,830 Tas ir raksturīgs šim piemēram — funkcijai getNegativeInt. 1091 00:52:38,830 --> 00:52:41,043 Neņem vērā argumentus, un tas atgriež veselu skaitli. 1092 00:52:41,043 --> 00:52:41,710 Ko tas dara? 1093 00:52:41,710 --> 00:52:43,375 Ideālā gadījumā tas burtiski saņem no lietotāja negatīvu veselu 1094 00:52:43,375 --> 00:52:45,040 skaitli. 1095 00:52:45,040 --> 00:52:47,200 Interesants fakts, tomēr tas nav pareizi. 1096 00:52:47,200 --> 00:52:50,090 Tā ir kļūda. 1097 00:52:47,200 --> 00:52:50,090 getNegativeIntis šobrīd ir bojāts. 1098 00:52:50,090 --> 00:52:51,470 Tātad, ko dara galvenais? 1099 00:52:51,470 --> 00:52:53,580 Nu, galvenais vienkārši izsauc šo funkciju, neko neieliekot iekavās, 1100 00:52:53,580 --> 00:52:55,690 bez ievades. 1101 00:52:55,690 --> 00:52:58,240 Un tas saglabā atgriešanās vērtību i. 1102 00:52:58,240 --> 00:53:00,260 Un tad tas vienkārši izdrukā i uz ekrāna. 1103 00:53:00,260 --> 00:53:03,312 Godīgi sakot, tikai paskatoties uz šo, es jūtos pietiekami ērti, 1104 00:53:03,312 --> 00:53:06,365 programmējot C valodā, un es domāju, ka galvenais ir pareizi. 1105 00:53:06,365 --> 00:53:07,990 Ļaujiet man tikai noteikt, galvenais ir pareizi. 1106 00:53:07,990 --> 00:53:09,698 Bet šeit būs kāda kļūda. 1107 00:53:09,698 --> 00:53:11,210 Kas te ir par kļūdu? 1108 00:53:11,210 --> 00:53:14,830 Ļaujiet man apskatīt getNegativeInt ieviešanu. 1109 00:53:14,830 --> 00:53:18,970 Ievērojiet, šī pirmā rinda, 12, ir identiska šeit esošajam prototipam. 1110 00:53:18,970 --> 00:53:22,830 Prototips šeit ir muļķīgi vajadzīgs, jo C lasa lietas no augšas uz 1111 00:53:22,830 --> 00:53:26,690 leju, no kreisās uz labo pusi — kompilators tehniski to dara. 1112 00:53:26,690 --> 00:53:30,066 Tātad, ja šeit atsaucaties uz getNegativeInt, bet neieviešat to līdz 1113 00:53:30,066 --> 00:53:33,443 šeit un neesat iepriekš teicis C, ka tas pastāvēs, atkal tiek 1114 00:53:33,443 --> 00:53:36,820 parādīta kļūda, ko redzējām pagājušajā nedēļā. 1115 00:53:36,820 --> 00:53:39,010 Labi, kā darbojas getNegativeInt? 1116 00:53:39,010 --> 00:53:40,960 Mēs deklarējam mainīgo, ko sauc par n. 1117 00:53:40,960 --> 00:53:43,540 Mums ir jādara kamēr cilpa, kas dara ko? 1118 00:53:43,540 --> 00:53:45,325 Pagājušajā nedēļā tas izmanto getInt, kas tiek piegādāts kopā ar cs50 1119 00:53:45,325 --> 00:53:47,110 bibliotēku. 1120 00:53:47,110 --> 00:53:49,390 Tas pieprasa lietotājam ievadīt negatīvu veselu skaitli, pēdiņās un 1121 00:53:49,390 --> 00:53:51,670 saglabā vērtību n. 1122 00:53:51,670 --> 00:53:56,800 Pēc tam es to visu daru, kamēr n ir mazāks par 0, vai ne? 1123 00:53:56,800 --> 00:53:59,523 Atcerieties, ka pagājušajā nedēļā mēs izmantojām while loop, lai 1124 00:53:59,523 --> 00:54:02,246 pārliecinātos, ka cilvēks sadarbojas un nepiešķir mums nepareizu 1125 00:54:02,246 --> 00:54:04,970 vērtību, vai tā būtu pozitīva vai negatīva, vai kaut kas cits. 1126 00:54:04,970 --> 00:54:06,400 Un tad mēs atgriežamies n. 1127 00:54:06,400 --> 00:54:07,570 Un tur ir daži smalkumi. 1128 00:54:07,570 --> 00:54:11,680 Ikviens atceras — vai viņam ir intuīcija, kāpēc es esmu norādījis n 1129 00:54:11,680 --> 00:54:15,790 14. rindā, nevis 17. rindā? 1130 00:54:15,790 --> 00:54:17,620 Šī ir C specifiska lieta. 1131 00:54:17,620 --> 00:54:23,465 Mērķauditorija: [NEdzirdams] 1132 00:54:23,465 --> 00:54:24,340 DEIVIDS MALANS: Tieši tā. 1133 00:54:24,340 --> 00:54:27,610 Šis darbības jomas jēdziens ir C. 1134 00:54:24,340 --> 00:54:28,950 Un mēs turpināsim to redzēt laika gaitā, līdz ar to mainīgais pastāv 1135 00:54:28,950 --> 00:54:33,560 tikai jaunākajās cirtainajās iekavās, kuras esat atvēris. 1136 00:54:33,560 --> 00:54:37,230 Tātad, ja esmu norādījis n šeit 14. rindiņā, es varu to izmantot 1137 00:54:37,230 --> 00:54:40,900 jebkur starp 13. un 21. rindu, jo tās ir tuvākās krokainās lencēs. 1138 00:54:40,900 --> 00:54:45,713 Ja turpretī, kā jūs atzīmējat, ja es tā vietā teiktu, int n ir getInt 1139 00:54:45,713 --> 00:54:50,526 un tā tālāk, un tai nebūtu pašreizējās 14. rindiņas, tad n būtu šo 1140 00:54:50,526 --> 00:54:55,340 cirtaini iekavās, bet ne šeit, kas arī ir. vēlu, un noteikti ne šeit. 1141 00:54:55,340 --> 00:54:57,410 Tātad jums tas vispirms ir jādeklarē un pēc tam jāizmanto un 1142 00:54:57,410 --> 00:54:59,480 atkārtoti jāizmanto kā tāds. 1143 00:54:59,480 --> 00:55:01,545 Tagad ļaujiet man tikai parādīt, kā es varu to atkļūdot. 1144 00:55:01,545 --> 00:55:03,170 Bet ļaujiet man vispirms parādīt simptomus. 1145 00:55:03,170 --> 00:55:04,930 Ļaujiet man atvērt savu termināļa logu. 1146 00:55:04,930 --> 00:55:06,970 Ļaujiet man palaist make buggy1. 1147 00:55:06,970 --> 00:55:11,710 Sastāda OK, tāpēc tas nav kaut kas muļķīgs kā semikolu. 1148 00:55:06,970 --> 00:55:13,660 ./buggy1, un man tiek prasīts negatīvs vesels skaitlis. 1149 00:55:13,660 --> 00:55:16,710 Labi, ļaujiet man dot negatīvu 1 — Ievadiet. 1150 00:55:16,710 --> 00:55:18,795 Nu, galvenajai funkcijai ir paredzēts izdrukāt to, ko es ierakstīju, 1151 00:55:18,795 --> 00:55:20,880 bet tas acīmredzami neizdarīja. 1152 00:55:20,880 --> 00:55:21,880 Tas mani atkal mudina. 1153 00:55:21,880 --> 00:55:23,830 Labi, tāpēc, iespējams, patiks 2. negatīvais. 1154 00:55:23,830 --> 00:55:24,330 Nē? 1155 00:55:24,330 --> 00:55:26,380 Varbūt negatīvs 3. 1156 00:55:26,380 --> 00:55:29,160 Labi, tātad tas noteikti ir bojāts, vai ne? 1157 00:55:29,160 --> 00:55:31,528 Šķiet loģiski, ka rīkojas pretēji. 1158 00:55:31,528 --> 00:55:33,820 Tagad jūs, iespējams, redzat, kāpēc tas jau notiek. 1159 00:55:33,820 --> 00:55:37,170 Tās ir apzināti vienkāršas programmas demonstrāciju nolūkos. 1160 00:55:37,170 --> 00:55:38,470 Bet darīsim tā. 1161 00:55:38,470 --> 00:55:40,670 Ļaujiet man iet uz priekšu un iestatīt pārtraukuma punktu galvenajā, 1162 00:55:40,670 --> 00:55:42,870 lai gan esmu diezgan pārliecināts, ka galvenais ir pareizs. 1163 00:55:42,870 --> 00:55:44,940 Bet tas tikai palīdz man sākt manu domāšanas procesu — sāciet ar 1164 00:55:44,940 --> 00:55:47,010 galveno un pēc tam pārņemiet to no turienes. 1165 00:55:47,010 --> 00:55:52,920 Ļaujiet man palaist tūlīt, debug50 ./buggy1-- Enter. 1166 00:55:52,920 --> 00:55:53,700 Un paskatīsimies. 1167 00:55:53,700 --> 00:55:56,880 Ar šo pārtraukuma punktu tagad GUI pārkonfigurēs sevi. 1168 00:55:56,880 --> 00:55:59,070 Tas tiks apturēts 8. rindā, jo tā ir pirmā interesantā līnija 1169 00:55:59,070 --> 00:56:01,260 galvenajā rindā. 1170 00:56:01,260 --> 00:56:03,780 Tāpēc es varētu vienkārši ievietot pārtraukuma punktu arī 8. rindā. 1171 00:56:03,780 --> 00:56:06,675 Tas ir pietiekami gudrs, lai zinātu, ka, iestatot to uz 6, jūs 1172 00:56:06,675 --> 00:56:09,570 patiešām domājat 8. rindiņu, jo tā ir pirmā faktiskā koda rinda. 1173 00:56:09,570 --> 00:56:11,280 Un tagad skatieties, kas notiek. 1174 00:56:11,280 --> 00:56:15,375 Ja es kāpju pāri šai līnijai, ievērojiet, ka i, kurai šobrīd šķiet 1175 00:56:15,375 --> 00:56:19,470 noklusējuma vērtība 0 — vairāk par to citreiz. 1176 00:56:19,470 --> 00:56:22,110 Bet, ja es tāpat kā iepriekš noklikšķinu uz Step Over, man tiek 1177 00:56:22,110 --> 00:56:24,750 prasīts ievadīt negatīvu veselu skaitli. 1178 00:56:24,750 --> 00:56:27,300 Ļaujiet man ierakstīt negatīvu 1 — Enter. 1179 00:56:27,300 --> 00:56:32,470 Un tagad, ievērojiet, nav papildu dzeltenā izcēluma. 1180 00:56:32,470 --> 00:56:32,970 Kāpēc? 1181 00:56:32,970 --> 00:56:35,160 Kur es šobrīd esmu iestrēdzis, loģiski? 1182 00:56:35,160 --> 00:56:37,937 Mērķauditorija: [NEdzirdams] 1183 00:56:37,937 --> 00:56:39,353 DEIVIDS Malans: Jā, tikai loģiski, ka man ir jābūt tajā do, while 1184 00:56:39,353 --> 00:56:40,770 cilpā. 1185 00:56:40,770 --> 00:56:43,560 Un pat ja jūs to nesaprotat, tas ir vienīgais izskaidrojums. 1186 00:56:43,560 --> 00:56:46,143 Ja jūs pastāvīgi saņemat uzvedni, noteikti notiek cilpa. 1187 00:56:46,143 --> 00:56:49,270 Manā kodā ir tikai viena cilpa, tāpēc, iespējams, tur ir problēma. 1188 00:56:49,270 --> 00:56:51,085 Tāpēc es nevaru vienkārši iestatīt pārtraukuma punktu galvenajā un 1189 00:56:51,085 --> 00:56:52,900 pēc tam gaidīt, kamēr tas darbosies. 1190 00:56:52,900 --> 00:56:56,280 Tāpēc ļaujiet man vienkārši pārtraukt to ar sarkano kvadrātu. 1191 00:56:56,280 --> 00:56:58,443 Un ļaujiet man padomāt, labi, tā vietā, lai es joprojām varu iestatīt 1192 00:56:58,443 --> 00:57:00,606 pārtraukuma punktu galvenajā, bet tā vietā ļaujiet man atkārtoti 1193 00:57:00,606 --> 00:57:02,770 palaist atkļūdotāju. 1194 00:57:02,770 --> 00:57:05,350 Un šoreiz, nepārkāpjiet šo koda rindiņu, ļaujiet man ieiet šajā koda 1195 00:57:05,350 --> 00:57:07,930 rindā. 1196 00:57:07,930 --> 00:57:09,270 Tāpēc skatieties, kas notiek tagad. 1197 00:57:09,270 --> 00:57:11,940 Tā vietā, lai šeit noklikšķinātu uz otrās ikonas, ļaujiet man 1198 00:57:11,940 --> 00:57:14,610 noklikšķināt uz trešās, kuras nosaukums patiešām ir Step Into. 1199 00:57:14,610 --> 00:57:17,880 Un skatieties, kā dzeltenais izgaismojums nepāriet uz 9. rindiņu. 1200 00:57:17,880 --> 00:57:21,525 Tas iekļaujas 8. rindā — funkcija 8. rindā, tādējādi nolaižot mani 1201 00:57:21,525 --> 00:57:25,170 līdz 17. rindiņai. 1202 00:57:25,170 --> 00:57:28,270 Tas kaut kā iet uz nākamo funkciju. 1203 00:57:28,270 --> 00:57:31,325 Tagad tas netraucēja apstāties 12. vai 13. vai 14. līnijā, jo tur vēl 1204 00:57:31,325 --> 00:57:34,380 nekas intelektuāli interesants nenotiek. 1205 00:57:34,380 --> 00:57:37,080 Sūdīgā daļa tiešām sākas, šķiet, 17. rindā. 1206 00:57:37,080 --> 00:57:40,980 Tātad, tagad ievērojiet, n ir mans mainīgais augšējā kreisajā stūrī. 1207 00:57:40,980 --> 00:57:45,420 Ja es noklikšķinu, es nevēlos noklikšķināt uz Step Into tagad. 1208 00:57:45,420 --> 00:57:48,950 Kas notiktu nepareizi, ja es noklikšķinātu uz Step Into — vai ko tas 1209 00:57:48,950 --> 00:57:52,480 darītu, ko es nedomāju, ka vēlos darīt? 1210 00:57:52,480 --> 00:57:52,990 Jā? 1211 00:57:52,990 --> 00:57:54,755 Mērķauditorija: [NEdzirdams] 1212 00:57:54,755 --> 00:57:56,630 DEIVIDS MALANS: Jā, tas iekļausies getInt. 1213 00:57:56,630 --> 00:57:59,375 Bet es gribētu domāt, ka personāla getInt versija ir pareiza, un tā 1214 00:57:59,375 --> 00:58:02,120 nav mūsu šodienas problēma, tāpēc es vēlos tai pārvarēt. 1215 00:58:02,120 --> 00:58:04,970 Un skatieties augšā pa kreisi, ka nekas vēl nenotiek ar n vērtību, 1216 00:58:04,970 --> 00:58:07,820 līdz es tagad pāreju uz termināļa logu un ierakstu kaut ko līdzīgu 1217 00:58:07,820 --> 00:58:10,670 negatīvam 1. 1218 00:58:10,670 --> 00:58:12,635 Tagad ievērojiet, tas pāriet uz 19. rindu, kas ir nākamā interesantā 1219 00:58:12,635 --> 00:58:14,600 rinda. 1220 00:58:14,600 --> 00:58:17,240 Augšējā kreisajā pusē n patiešām ir negatīvs 1. 1221 00:58:17,240 --> 00:58:20,000 Un šeit es tagad varu apstāties kā cilvēks un padomāt, labi, kamēr n 1222 00:58:20,000 --> 00:58:22,760 ir mazāks par 0. 1223 00:58:22,760 --> 00:58:25,280 Labi, n augšējā kreisajā stūrī ir negatīvs 1. 1224 00:58:25,280 --> 00:58:27,530 Tātad, labi, lai gan negatīvais 1 ir mazāks par 0, protams, 1225 00:58:27,530 --> 00:58:29,780 matemātiski tā ir taisnība. 1226 00:58:29,780 --> 00:58:30,930 Kas tad notiks? 1227 00:58:30,930 --> 00:58:32,130 Tas ir do while cilpa. 1228 00:58:32,130 --> 00:58:35,770 Tātad, kad es vēlreiz noklikšķināšu uz Step Over, tā pāries uz šo 1229 00:58:35,770 --> 00:58:39,410 rindiņu, jo tā atrodas šīs cilpas iekšpuses galā. 1230 00:58:39,410 --> 00:58:42,710 Un tagad šeit, tas atkal un atkal tiek cauri. 1231 00:58:42,710 --> 00:58:44,240 Labi, ļaujiet man to izdarīt vēlreiz. 1232 00:58:44,240 --> 00:58:45,980 Es iešu pāri, labi? 1233 00:58:45,980 --> 00:58:48,777 Es ierakstīšu negatīvo 2, un tas ir tieši tas pats. 1234 00:58:48,777 --> 00:58:51,260 Tagad ir mana iespēja uz dzeltenās līnijas... Labi, pagaidi. 1235 00:58:51,260 --> 00:58:53,450 Negatīvs 2 acīmredzami ir mazāks par 0. 1236 00:58:53,450 --> 00:58:56,080 Ļaujiet man izmēģināt šo vēl vienu reizi. 1237 00:58:56,080 --> 00:58:57,570 Noklikšķiniet uz tā vienu reizi šeit. 1238 00:58:57,570 --> 00:58:59,040 Labi, ļaujiet man dot 50. 1239 00:58:59,040 --> 00:59:04,005 Un tagad, labi, lai gan 50 ir mazāks par 0, tā nav taisnība, tāpēc 1240 00:59:04,005 --> 00:59:08,970 cilpa ir beigusies, jo tas netiks darīts, kamēr 50 ir mazāks par 0. 1241 00:59:08,970 --> 00:59:09,730 Tā nav taisnība. 1242 00:59:09,730 --> 00:59:12,770 Tagad skatieties, kad es vēlreiz noklikšķinu uz Step Over, tas 1243 00:59:12,770 --> 00:59:15,810 pabeidz cilpu, lai gan nekas vairāk nav jādara. 1244 00:59:15,810 --> 00:59:17,610 Tas tagad gatavojas atgriezties n. 1245 00:59:17,610 --> 00:59:21,360 Tas pāriet atpakaļ uz galveno, kur es pārtraucu 9. līniju. 1246 00:59:21,360 --> 00:59:23,778 Tagad manā termināļa logā tiek drukāts skaitlis 50. 1247 00:59:23,778 --> 00:59:27,239 Un, cerams, šajā brīdī, uz jūsu jautājumu, manas cilvēka smadzenes ir 1248 00:59:27,239 --> 00:59:30,700 sapratušas: ak, es esmu idiots, it kā es būtu pagriezusi savu zīmi. 1249 00:59:30,700 --> 00:59:32,460 Tāpēc es droši vien ļaujiet man to pārtraukt. 1250 00:59:32,460 --> 00:59:34,780 Es droši vien vēlos kaut ko tādu izdarīt. 1251 00:59:34,780 --> 00:59:39,925 Ja mērķis ir iegūt negatīvu veselu skaitli, es droši vien vēlos 1252 00:59:39,925 --> 00:59:45,070 teikt, ka n, piemēram, ir lielāks par vai vienāds ar 0, darbotos. 1253 00:59:45,070 --> 00:59:48,630 Tātad, kamēr n ir lielāks vai vienāds ar 0, turpiniet to darīt. 1254 00:59:48,630 --> 00:59:50,430 Un tā ir loģika, ko es gribēju izteikt. 1255 00:59:50,430 --> 00:59:52,665 Tāpēc atkļūdotājs vienkārši pasargā mani no skatīšanās uz ekrānu, 1256 00:59:52,665 --> 00:59:54,900 rokas pacelšanas, kā arī jautāšanas kādam citam. 1257 00:59:54,900 --> 00:59:58,650 Vismaz šajā gadījumā tas man ļauj iet cauri veselīgākā tempā. 1258 00:59:58,650 --> 01:00:01,795 Jautājumi tagad par debug50, kuram vajadzētu būt jūsu jaunajam 1259 01:00:01,795 --> 01:00:04,940 draugam, pat ja tas nav jūsu pirmais instinkts pēc printf? 1260 01:00:07,690 --> 01:00:09,190 Vai ir kādi jautājumi par debug50? 1261 01:00:09,190 --> 01:00:09,730 Nē? 1262 01:00:09,730 --> 01:00:13,960 Labi, ir vēl viens pēdējais paņēmiens, ar kuru mēs varam jūs aprīkot. 1263 01:00:13,960 --> 01:00:18,340 Un tas ir, papildus printf un atkļūdotājs, bez jokiem, gumijas pīle 1264 01:00:18,340 --> 01:00:22,720 patiesībā ir saprātīgi ieteicams risinājums kļūdu atrašanai kodā. 1265 01:00:22,720 --> 01:00:24,555 Uz jūsu iepriekš uzdoto jautājumu, pīle divi neatrisinās problēmu 1266 01:00:24,555 --> 01:00:26,390 jūsu vietā. 1267 01:00:26,390 --> 01:00:28,846 Bet, ja esat prātojies, kāpēc šis mazais puisis šeit ir tik ilgi, tur 1268 01:00:28,846 --> 01:00:31,303 ir šī tehnika, kurai ir savs Wikipedia raksts par gumijas pīļu 1269 01:00:31,303 --> 01:00:33,760 atkļūdošanu. 1270 01:00:33,760 --> 01:00:37,060 Tās ideja ir tāda, ka, ja atrodaties mājās savā kopmītņu istabā un 1271 01:00:37,060 --> 01:00:40,360 cīnāties ar kļūdu savā kodā, printf jums īsti neatklāja avotu, 1272 01:00:40,360 --> 01:00:43,660 atkļūdotājs īsti nepalīdz, godīgi sakot, varbūt tas palīdzētu 1273 01:00:43,660 --> 01:00:46,960 noskaidro, kāda problēma tev ir. 1274 01:00:46,960 --> 01:00:50,515 Līdzīgi kā došanās uz darba laiku, runājot ar TA vai profesoru, 1275 01:00:50,515 --> 01:00:54,070 vienkārši izstaigājot savas problēmas, jo tādā veidā runājot ar pīli 1276 01:00:54,070 --> 01:00:57,625 par to, ka jūs to darāt, kamēr n ir mazāks par 0, un tad, ja tā ir... 1277 01:00:57,625 --> 01:01:01,180 - pagaidi minūti. 1278 01:01:01,180 --> 01:01:03,820 Es esmu idiots, ne tikai runājot ar gumijas pīli. 1279 01:01:03,820 --> 01:01:06,500 Jūs saprotat, cerams, ka, izsakoties burtiski verbāli, jūs, 1280 01:01:06,500 --> 01:01:09,180 iespējams, dzirdēsit ar varbūtību, kas nav nulle, kā kādu neloģiku 1281 01:01:09,180 --> 01:01:11,860 savā paziņojumā. 1282 01:01:11,860 --> 01:01:14,145 Un, vienkārši izklausot lietas, jūs sapratīsit, ka tā ir mana 1283 01:01:14,145 --> 01:01:16,430 problēma. 1284 01:01:16,430 --> 01:01:18,075 Un tā, atklāti sakot, ja jums ir istabas biedri, varat izmantot arī 1285 01:01:18,075 --> 01:01:19,720 istabas biedru. 1286 01:01:19,720 --> 01:01:23,935 Bet gumijas pīle ir tikai sava veida piemērs, kad jūsu istabas biedri 1287 01:01:23,935 --> 01:01:28,150 neinteresējas par jūsu C problēmu kopumu, runājot par to kā tādu. 1288 01:01:28,150 --> 01:01:29,933 Un šī ir nenovērtējama tehnika. 1289 01:01:29,933 --> 01:01:32,221 Jāatzīst, ka sliecos to nedarīt tik daudz ar gumijas pīli, bet ideālā 1290 01:01:32,221 --> 01:01:34,510 gadījumā ar kolēģiem, cilvēku kolēģiem. 1291 01:01:34,510 --> 01:01:37,435 Bet tikai bieža pārrunāšana palīdzēs jums saprast, ak, es teicu kaut 1292 01:01:37,435 --> 01:01:40,360 ko neloģisku. 1293 01:01:40,360 --> 01:01:41,860 Tagad es varu atgriezties pie koda. 1294 01:01:41,860 --> 01:01:44,050 Tāpēc neatrisiniet problēmas, bezgalīgi skatoties ekrānā minūtes, 1295 01:01:44,050 --> 01:01:46,240 stundas. 1296 01:01:46,240 --> 01:01:49,570 Tajā brīdī ir pienācis laiks pārtraukumam, laiks doties prom, laiks 1297 01:01:49,570 --> 01:01:52,900 parunāt ar pīli, ja jau esat izsmēlis dažus citus rīkus. 1298 01:01:52,900 --> 01:01:55,960 Starp citu, šodien, nodarbību beigās, izejot ārā, mums ir skaidrs, ka 1299 01:01:55,960 --> 01:01:59,020 jums ir daudz gumijas pīļu. 1300 01:01:59,020 --> 01:02:02,395 Un gadu gaitā, vismaz dažu vidū, ir kļuvis ierasts ņemt līdzi pīli, 1301 01:02:02,395 --> 01:02:05,770 kad viņi ceļo un sūta mums fotogrāfijas. 1302 01:02:05,770 --> 01:02:10,480 Šeit, piemēram, ir CS50 gumijas pīļu atkļūdotājs, AKA 1303 01:02:05,770 --> 01:02:10,093 DDB, par Duck Debugger, kas ir vārdu spēle par gudrāku programmu, ko 1304 01:02:10,093 --> 01:02:14,416 sauc par GDB, GNU atkļūdotāju, kas ir īsta programmatūra 1305 01:02:14,416 --> 01:02:18,740 atkļūdošanai. 1306 01:02:18,740 --> 01:02:25,270 Šis ir CS50 atkļūdotājs Puertoriko kalnos, arī pie jūras. 1307 01:02:25,270 --> 01:02:28,310 Šeit viņš devās uz Sanfrancisko. 1308 01:02:28,310 --> 01:02:30,640 Arī lejā pie Fisherman's Wharf pie jūras lauvām. 1309 01:02:30,640 --> 01:02:31,660 Pazīstams? 1310 01:02:31,660 --> 01:02:35,305 Šeit, Stenfordā, kur atrodas Viljama Geitsa datorzinātņu ēka 1311 01:02:35,305 --> 01:02:38,950 datorzinātnēm, Google SF. 1312 01:02:38,950 --> 01:02:41,650 Un šī ir Trevi strūklaka Romā. 1313 01:02:41,650 --> 01:02:43,810 Un visbeidzot, Kolizejs. 1314 01:02:43,810 --> 01:02:45,400 Tāpēc mēs būsim ziņkārīgi, lai tuvāko gadu laikā redzētu, kur jūsu 1315 01:02:45,400 --> 01:02:46,990 pīle ceļo. 1316 01:02:46,990 --> 01:02:49,120 Tātad tas bija diezgan maz. 1317 01:02:49,120 --> 01:02:51,850 Kāpēc gan nepaņemt īsu 5 minūšu pārtraukumu? 1318 01:02:51,850 --> 01:02:52,760 Uzkodas vēl nav. 1319 01:02:52,760 --> 01:02:54,400 Jūs esat laipni aicināti piecelties vai apsēsties. 1320 01:02:54,400 --> 01:02:56,620 Mēs atgriezīsimies apmēram pēc pieciem. 1321 01:02:56,620 --> 01:03:00,020 Labi, mēs esam atpakaļ. 1322 01:03:00,020 --> 01:03:02,905 Un, ja galu galā šodienas mērķis ir labāk izprast tādas lietas kā 1323 01:03:02,905 --> 01:03:05,790 virknes, lai mēs varētu atrisināt problēmas ar tekstu, vispirms 1324 01:03:05,790 --> 01:03:08,675 apsvērsim dažus vienkāršākus datu veidus, kā mēs tos varētu attēlot, 1325 01:03:08,675 --> 01:03:11,560 un tad pārbaudīsim, vai tas tā nav. noved mūs pie atklājuma par to, 1326 01:03:11,560 --> 01:03:14,445 kā virknes, un tieši mūsdienu modernā programmatūra izmanto tādas 1327 01:03:14,445 --> 01:03:17,330 lietas. 1328 01:03:17,330 --> 01:03:22,485 Tātad, kad mēs nulles nedēļā runājām par datu attēlošanu, mums bija 1329 01:03:22,485 --> 01:03:27,640 dažādi veidi, kā to izdarīt — bināro un decimāldaļu, un pat unāros. 1330 01:03:27,640 --> 01:03:30,810 Kad mēs sākām runāt par to pašu pagājušajā nedēļā kodā, mēs sākām 1331 01:03:30,810 --> 01:03:33,980 runāt par datu veidiem. 1332 01:03:33,980 --> 01:03:36,752 Un šie datu veidi bija veids, kā pateikt datoram, piemēram, vai 1333 01:03:36,752 --> 01:03:39,525 vēlaties veselu skaitli, vai vēlaties rakstzīmi, vai vēlaties peldošā 1334 01:03:39,525 --> 01:03:42,297 komata vērtību, piemēram, reālu skaitli, vai pat virkni, kā mēs esam 1335 01:03:42,297 --> 01:03:45,070 redzējuši? 1336 01:03:45,070 --> 01:03:47,500 Bet izrādās, ka datoriem, protams, ir tikai ierobežots resursu 1337 01:03:47,500 --> 01:03:49,930 daudzums. 1338 01:03:49,930 --> 01:03:53,740 Jūsu datoram ir tikai noteikts atmiņas vai RAM apjoms. 1339 01:03:53,740 --> 01:03:55,910 Un tam patiesībā ir ļoti reālas sekas pasaulē. 1340 01:03:55,910 --> 01:03:59,630 Piemēram, šeit ir daži no datu veidiem, ko esam redzējuši līdz šim. 1341 01:03:59,630 --> 01:04:05,650 Un izrādās, ka katram no tiem C ir piešķirts noteikts bitu skaits. 1342 01:04:05,650 --> 01:04:08,350 Tagad, protams, tas var atšķirties atkarībā no sistēmas. 1343 01:04:08,350 --> 01:04:10,725 Mūsdienās tas tā nav tik daudz, bet daudzus gadus, gadu desmitiem 1344 01:04:10,725 --> 01:04:13,100 datori kļuva arvien labāki un labāki. 1345 01:04:13,100 --> 01:04:16,600 Agrākie datori dažiem no šiem datu veidiem varēja izmantot mazāk bitu. 1346 01:04:16,600 --> 01:04:18,663 Mūsdienīgāki datori varētu izmantot vairāk bitu. 1347 01:04:18,663 --> 01:04:20,246 Tātad skaitļi, kurus jūs drīz redzēsit, ir gandrīz tādi paši, kā mēs 1348 01:04:20,246 --> 01:04:21,830 šobrīd atrodamies. 1349 01:04:21,830 --> 01:04:24,857 Tātad, runājot par šiem datu tipiem, īsts vai nepatiess īsts baits, 1350 01:04:24,857 --> 01:04:27,885 kaut arī dīvainā kārtā, izmanto veselu baitu, lai gan tas ir 1351 01:04:27,885 --> 01:04:30,912 pārspīlēti, jo, lai iegūtu patiesu vai nepatiesu būtību, jums, 1352 01:04:30,912 --> 01:04:33,940 protams, ir nepieciešams tikai viens bits. 1353 01:04:33,940 --> 01:04:36,370 Bet izrādās, lai gan ir izšķērdīgi izmantot astoņus bitus vai vienu 1354 01:04:36,370 --> 01:04:38,800 baitu, lai tikai attēlotu patiesumu vai nepatiesu, datoriem tas ir 1355 01:04:38,800 --> 01:04:41,230 vienkārši vieglāk. 1356 01:04:41,230 --> 01:04:42,820 Tātad bools parasti ir viens baits. 1357 01:04:42,820 --> 01:04:45,205 Int, ko mēs esam daudz izmantojuši, parasti izmanto 4 baitus vai 1358 01:04:45,205 --> 01:04:47,590 32 bitus. 1359 01:04:47,590 --> 01:04:50,815 Un, ja es veicu ātru matemātiku no nulles nedēļas ar 32 bitiem, jums 1360 01:04:50,815 --> 01:04:54,040 ir aptuveni 4 miljardi iespējamo vērtību. 1361 01:04:54,040 --> 01:04:56,366 Bet, ja vēlaties attēlot pozitīvo un negatīvo, tas nozīmē, ka varat 1362 01:04:56,366 --> 01:04:58,693 attēlot aptuveni negatīvus 2 miljardus, līdz pat pozitīvajiem 2 1363 01:04:58,693 --> 01:05:01,020 miljardiem. 1364 01:05:01,020 --> 01:05:02,770 Tātad tas ir diapazons, parasti ar ints. 1365 01:05:02,770 --> 01:05:04,795 Ja jums tas ir pārāk maz skaitļu, izrādās, ka ir lietas, ko sauc par 1366 01:05:04,795 --> 01:05:06,820 garajiem skaitļiem. 1367 01:05:06,820 --> 01:05:11,275 Un gari izmanto 64 bitus, kas ļauj jums iegūt kā kvintiljonu skaitu 1368 01:05:11,275 --> 01:05:15,730 iespēju, kas, protams, ir daudz vairāk nekā 4 miljardi. 1369 01:05:15,730 --> 01:05:17,410 Tāpēc dažreiz jūs varētu izmantot garu. 1370 01:05:17,410 --> 01:05:18,670 Bet pat tas ir galīgs. 1371 01:05:18,670 --> 01:05:21,085 Un, kā mēs apspriedām pagājušās nedēļas beigās, var notikt sliktas 1372 01:05:21,085 --> 01:05:23,500 lietas, ja veicat noteiktus pieņēmumus par datiem, piemēram, veselu 1373 01:05:23,500 --> 01:05:25,915 skaitļu pārpildes vai tamlīdzīgu iemeslu dēļ, kur lietas notiek 1374 01:05:25,915 --> 01:05:28,330 apkārt. 1375 01:05:28,330 --> 01:05:31,538 Tad ir pludiņš, kas ir reāls skaitlis, kaut kas ar komatu. 1376 01:05:31,538 --> 01:05:34,674 Pēc vienošanās tas ir 4 baiti vai 32 biti, kas, īsi sakot, nodrošina 1377 01:05:34,674 --> 01:05:37,810 tikai noteiktu precizitāti. 1378 01:05:37,810 --> 01:05:41,620 Tas ne vienmēr nosaka, cik skaitļu ir pa kreisi vai pa labi. 1379 01:05:41,620 --> 01:05:47,650 Tomēr kopumā jums joprojām ir 4 miljardi iespējamo permutāciju. 1380 01:05:47,650 --> 01:05:51,220 Ja jums nepieciešama lielāka precizitāte zinātniskiem, medicīniskiem 1381 01:05:51,220 --> 01:05:54,790 vai finanšu lietojumiem, varat izmantot 8 baitus, AKA 1382 01:05:50,110 --> 01:05:57,700 dubultā, kas tikai nodrošina lielāku precizitāti. 1383 01:05:57,700 --> 01:06:00,655 Tie galu galā kļūst neprecīzi saskaņā ar piemēru, ko apskatījām 1384 01:06:00,655 --> 01:06:03,610 pagājušajā nedēļā, taču tas vismaz noved pie jums tālāk. 1385 01:06:03,610 --> 01:06:06,751 Starp citu, patiešām, ļoti svarīgās lietojumprogrammās, finansēs, 1386 01:06:06,751 --> 01:06:09,892 medicīnā, militārās operācijās un tamlīdzīgās jomās, kur patiešām 1387 01:06:09,892 --> 01:06:13,034 nevar būt noapaļošanas kļūdas — īsi sakot, cilvēki ir izstrādājuši 1388 01:06:13,034 --> 01:06:16,175 bibliotēkas C un citās valodās, kurās tiek izmantotas vairāk, pat, 1389 01:06:16,175 --> 01:06:19,317 nekā 8 baiti. 1390 01:06:19,317 --> 01:06:22,150 Tāpēc šīm problēmām ir risinājumi, taču tie vienmēr ir ierobežoti. 1391 01:06:22,150 --> 01:06:24,070 Jums ir jāizvēlas augšējā robeža. 1392 01:06:24,070 --> 01:06:26,770 Pēc tam ir char, ko mēs īsi redzējām pagājušajā nedēļā, kad es 1393 01:06:26,770 --> 01:06:29,470 jautāju lietotājam y vai n, jā vai nē. 1394 01:06:29,470 --> 01:06:31,915 Un tad ir virkne, kuru es piedāvāšu kā jautājuma zīmi, jo virkne ir 1395 01:06:31,915 --> 01:06:34,360 pilnībā atkarīga. 1396 01:06:34,360 --> 01:06:35,380 Patīk, Sveiki! 1397 01:06:35,380 --> 01:06:38,890 HI, izsaukuma zīme, šķiet, ir trīs baiti. 1398 01:06:38,890 --> 01:06:41,140 DĀVIDS, šķiet, ir pieci. 1399 01:06:41,140 --> 01:06:43,270 Tātad virknes, protams, ir mainīgas atkarībā no tā, ko jūs vai 1400 01:06:43,270 --> 01:06:45,400 cilvēks ievadāt. 1401 01:06:45,400 --> 01:06:48,140 Tātad mēs redzēsim, ko tas nozīmē, tikai pēc brīža. 1402 01:06:48,140 --> 01:06:51,580 Tomēr tas ir jūsu Mac datorā, datorā un tālrunī. 1403 01:06:51,580 --> 01:06:53,883 Tas varētu neizskatīties tieši šādi, bet tas ir mūsdienu datora 1404 01:06:53,883 --> 01:06:56,187 atmiņas modulis. 1405 01:06:56,187 --> 01:06:57,520 Un ejam uz priekšu un izmantosim šo. 1406 01:06:57,520 --> 01:06:59,440 Patiešām, tas tikai parāda ierobežoto atmiņas apjomu, kas patiešām ir 1407 01:06:59,440 --> 01:07:01,360 jebkuram datoram. 1408 01:07:01,360 --> 01:07:03,760 Pietuvināsim vienu no šīm mazajām melnajām mikroshēmām uz shēmas 1409 01:07:03,760 --> 01:07:06,160 plates šeit. 1410 01:07:06,160 --> 01:07:09,445 Tuviniet un ļaujiet man ierosināt, lai šis taisnstūris patiešām 1411 01:07:09,445 --> 01:07:12,730 attēlo noteiktu baitu skaitu, piemēram, šīs mazās melnās ķēdes 1412 01:07:12,730 --> 01:07:16,015 iekšpusē uz tāfeles ir varbūt, es nezinu, gigabaits, miljards baitu, 1413 01:07:16,015 --> 01:07:19,300 varbūt tas ir 100 baiti... kādu baitu skaitu. 1414 01:07:19,300 --> 01:07:21,000 Tas ir pilnībā atkarīgs no datora un tā, cik maksājāt par atmiņas 1415 01:07:21,000 --> 01:07:22,700 karti. 1416 01:07:22,700 --> 01:07:25,936 Bet, ja šajā aparatūrā ir ierobežots skaits baitu, kas ir kaut kādā 1417 01:07:25,936 --> 01:07:29,173 veidā digitāli ieviesti, tad ir pašsaprotami, ka mēs varētu numurēt 1418 01:07:29,173 --> 01:07:32,410 šos baitus. 1419 01:07:32,410 --> 01:07:35,605 Mēs varam vienkārši patvaļīgi izlemt, ka augšējais kreisais stūris ir 1420 01:07:35,605 --> 01:07:38,800 baits numur viens vai tiešām nulle baits. 1421 01:07:38,800 --> 01:07:41,230 Blakus ir numur viens, tad numur divi, cipars 3, punkts, punkts, 1422 01:07:41,230 --> 01:07:43,660 punkts, cipars 2 miljardi vai kas tas ir, lai cik liela šī atmiņa 1423 01:07:43,660 --> 01:07:46,090 būtu. 1424 01:07:46,090 --> 01:07:50,530 Tātad, ja izmantojat mainīgo C programmā, tas ir tikai viens baits. 1425 01:07:50,530 --> 01:07:52,825 Tāpat kā rakstzīme, tā burtiski var tikt saglabāta atmiņas augšējā 1426 01:07:52,825 --> 01:07:55,120 kreisajā stūrī. 1427 01:07:55,120 --> 01:07:57,760 Praksē jums ir vienalga, kur tas ir fiziski. 1428 01:07:57,760 --> 01:08:01,045 Bet patiesībā mākslinieka atveidojums būtu šāds — rakstzīme varētu 1429 01:08:01,045 --> 01:08:04,330 izmantot vienu no šiem atsevišķiem baitiem kaut kur datora atmiņā. 1430 01:08:04,330 --> 01:08:07,585 Ja izmantojat int, kas ir 4 baiti, tas dotu 4 baitus, kas ir blakus — 1431 01:08:07,585 --> 01:08:10,840 tas ir no kreisās puses uz labo, no augšas uz leju. 1432 01:08:10,840 --> 01:08:13,494 Bet visi 32 biti būtu blakus viens otram, lai dators zinātu, ka tie 1433 01:08:13,494 --> 01:08:16,149 patiešām pieder vienai un tai pašai int. 1434 01:08:16,149 --> 01:08:18,644 Ja jums ir nepieciešams garš vai dubults, šajā gadījumā varat 1435 01:08:18,644 --> 01:08:21,140 izmantot pilnus 8 baitus. 1436 01:08:21,140 --> 01:08:24,252 Un jūs vienkārši turpiniet izmantot un izmantot šo atmiņu, piemēram, 1437 01:08:24,252 --> 01:08:27,364 audekls, gandrīz programmā Photoshop vai izklājlapu, kurā varat 1438 01:08:27,364 --> 01:08:30,477 vienkārši pārvietot pikseļus vai pārvietot datus, tā patiešām ir jūsu 1439 01:08:30,477 --> 01:08:33,589 datora atmiņa, audekls informācijas glabāšanai vienībās. baiti vai 8 1440 01:08:33,589 --> 01:08:36,702 biti. 1441 01:08:36,702 --> 01:08:39,160 Tagad mums nav jāturpina aplūkot šīs shēmas plates. 1442 01:08:39,160 --> 01:08:41,287 Mēs varam to abstrahēt, kā mēs to bieži darām. 1443 01:08:41,287 --> 01:08:43,513 Un ejam uz priekšu un tuvināsim šo režģi, lai apsvērtu dažus ļoti 1444 01:08:43,513 --> 01:08:45,740 specifiskus mainīgos. 1445 01:08:45,740 --> 01:08:48,660 Tāpēc ļaujiet man tuvināt, un tagad ekrānā redzu mazāk, bet lielākus 1446 01:08:48,660 --> 01:08:51,580 lodziņus, no kuriem katrs atkal ir baits. 1447 01:08:51,580 --> 01:08:55,130 Un tagad ļaujiet man ierosināt spēlēt ar kādu reālu kodu. 1448 01:08:55,130 --> 01:08:58,095 Tātad šeit C, lai gan bez pilnas programmas, ir trīs ints — score1, 1449 01:08:58,095 --> 01:09:01,060 score2, score3. 1450 01:09:01,060 --> 01:09:05,050 Nejauši esmu sev piešķīris divus punktus ap 72 un 73, un pēc tam 1451 01:09:05,050 --> 01:09:09,040 diezgan zemu punktu skaitu — 33. 1452 01:09:09,040 --> 01:09:10,544 Protams, pagājušajā nedēļā vai pirms divām nedēļām tas būtu bijis 1453 01:09:10,544 --> 01:09:12,048 augsts. 1454 01:09:12,048 --> 01:09:13,840 Bet tagad mums ir darīšana ar faktiskiem veseliem skaitļiem. 1455 01:09:13,840 --> 01:09:17,750 Tātad šie ir trīs manas viktorīnas, testu vai tamlīdzīgi rezultāti. 1456 01:09:17,750 --> 01:09:19,250 Tāpēc ļaujiet man doties uz VS Code šeit. 1457 01:09:19,250 --> 01:09:22,210 Un izveidosim programmu scores.c. 1458 01:09:22,210 --> 01:09:24,399 Tāpēc es rakstīšu, kods scores.c. 1459 01:09:24,399 --> 01:09:26,149 Tas man iedos manu jauno failu. 1460 01:09:26,149 --> 01:09:28,420 Un ļaujiet man iet uz priekšu un īstenot kaut ko līdzīgu šim. 1461 01:09:28,420 --> 01:09:33,054 Iekļaujiet stdio.h, int main(void), un tad šeit, ļaujiet man darīt, 1462 01:09:33,054 --> 01:09:37,689 int score1 būs 72. 1463 01:09:37,689 --> 01:09:40,029 Int score2 būs 73. 1464 01:09:40,029 --> 01:09:43,149 Un int score3 būs 33. 1465 01:09:43,149 --> 01:09:44,780 Un tad ļaujiet man vienkārši izdarīt kaut ko tādu, piemēram, 1466 01:09:44,780 --> 01:09:46,411 uzrakstīt programmu, lai kopā izveidotu trīs pārbaudes rezultātus, 1467 01:09:46,411 --> 01:09:48,043 kaut kas līdzīgs tam. 1468 01:09:48,043 --> 01:09:52,256 Tāpēc ļaujiet man izdarīt printf, citējot bezcitātā, mans vidējais 1469 01:09:52,256 --> 01:09:56,470 rādītājs ir-- un es turpināšu darīt, teiksim, %i, /n. 1470 01:09:56,470 --> 01:09:58,290 Un tagad ļaujiet man pievienot rezultātus. 1471 01:09:58,290 --> 01:10:00,040 Un šī tagad ir sava veida pamatskolas matemātika. 1472 01:10:00,040 --> 01:10:02,210 Kā aprēķināt vidējo no trim vērtībām? 1473 01:10:02,210 --> 01:10:06,292 Nu, tāpat kā uz papīra, es varu izdarīt punktu 1 plus punktu 2 plus 1474 01:10:06,292 --> 01:10:10,374 punktu 3 iekavās, ņemot vērā darbību secību, dalītu ar 3, jo ir trīs 1475 01:10:10,374 --> 01:10:14,457 kopējie punkti. 1476 01:10:14,457 --> 01:10:16,040 Labi, tāpēc es domāju, ka tas tiek pārbaudīts. 1477 01:10:16,040 --> 01:10:19,610 Un patiešām, jūs varat izmantot iekavas un operatorus, piemēram, plus 1478 01:10:19,610 --> 01:10:23,180 savā kodā, piemēram, C valodā. 1479 01:10:19,040 --> 01:10:23,180 Ļaujiet man tagad doties uz priekšu un gūt punktus. 1480 01:10:23,180 --> 01:10:24,327 Nav sintakses kļūdu. 1481 01:10:24,327 --> 01:10:25,910 Tas ir labi, tur nekā netrūkst. 1482 01:10:25,910 --> 01:10:27,380 Un tagad ļaujiet man izdarīt ./scores un redzēt, kāds ir mans testa 1483 01:10:27,380 --> 01:10:28,850 vidējais rādītājs. 1484 01:10:28,850 --> 01:10:32,270 Labi, tas nav lieliski, bet es domāju, ka es tomēr izturēju. 1485 01:10:32,270 --> 01:10:36,050 Un tiešām, mans vidējais rādītājs šeit ir 59. 1486 01:10:36,050 --> 01:10:38,360 Vai tas ir tieši 59? 1487 01:10:38,360 --> 01:10:39,140 Nu paskatīsimies. 1488 01:10:39,140 --> 01:10:42,005 Patiesībā, tā vietā, lai izmantotu int, kā būtu, ja mēs tur izmantotu 1489 01:10:42,005 --> 01:10:44,870 kaut ko līdzīgu peldošā komata vērtībai? 1490 01:10:44,870 --> 01:10:46,250 Un ļaujiet man iet uz priekšu un darīt to. 1491 01:10:46,250 --> 01:10:48,710 Tāpēc ļaujiet man pārkompilēt savu kodu un iegūt punktus. 1492 01:10:48,710 --> 01:10:50,600 Nu labi, man ir problēma. 1493 01:10:50,600 --> 01:10:52,340 Ļaujiet man tuvināt savu termināļa logu. 1494 01:10:52,340 --> 01:10:54,710 Mēs noteikti šo neesam redzējuši iepriekš. 1495 01:10:54,710 --> 01:10:56,510 Bet kļūda 9. rindā. 1496 01:10:56,510 --> 01:10:59,345 Formāts norāda tipu double, kas ir ļoti precīzs, bet argumentam ir 1497 01:10:59,345 --> 01:11:02,180 tips int. 1498 01:11:02,180 --> 01:11:03,300 Tātad, ko tas nozīmē? 1499 01:11:03,300 --> 01:11:09,060 Nu, tas man parāda, ka starp %f un šo lietu šeit kaut kas nav kārtībā. 1500 01:11:09,060 --> 01:11:13,020 Kreisajā pusē es domāju pludiņu vai dubultu. 1501 01:11:13,020 --> 01:11:14,927 Tomēr labajā pusē ir norādīts, kāds datu tips ir score1, score2, 1502 01:11:14,927 --> 01:11:16,835 score3? 1503 01:11:16,835 --> 01:11:17,960 Labi, tāpēc tie ir ints. 1504 01:11:17,960 --> 01:11:19,583 Tātad klanam šis nepatīk. 1505 01:11:19,583 --> 01:11:21,876 Kompilatoram vienkārši nepatīk, ka es izmantoju ints labajā pusē, bet 1506 01:11:21,876 --> 01:11:24,170 es gribu pludiņus pa kreisi. 1507 01:11:24,170 --> 01:11:26,670 Tāpēc būs dažādi veidi, kā to atrisināt. 1508 01:11:26,670 --> 01:11:29,560 Viens veids būtu vienkārši ignorēt problēmu, kā es to darīju 1509 01:11:29,560 --> 01:11:32,450 sākotnēji, un vienkārši atgriezties pie %i. 1510 01:11:32,450 --> 01:11:38,330 Vai arī, piemēram, %d bieži ir alternatīva %i decimālskaitļam. 1511 01:11:38,330 --> 01:11:40,344 Bet mēs izmantojam %i, jo tas izklausās pēc int, tāpēc arī %i šeit ir 1512 01:11:40,344 --> 01:11:42,358 labi. 1513 01:11:42,358 --> 01:11:44,150 Bet es nevēlos vienkārši izvairīties no problēmas. 1514 01:11:44,150 --> 01:11:46,500 Es vēlos faktiski parādīt peldošā komata vērtību. 1515 01:11:46,500 --> 01:11:47,730 Tātad, kā es varu to labot? 1516 01:11:47,730 --> 01:11:50,272 Izrādās, ka es to varu atrisināt dažādos veidos. 1517 01:11:50,272 --> 01:11:54,801 Vienkāršākais ir tikai pārliecināties, ka vismaz viens skaitlis 1518 01:11:54,801 --> 01:11:59,330 labajā pusē ir peldošā komata vērtība, piemēram, 3,0, nevis tikai 3. 1519 01:11:59,330 --> 01:12:01,700 Tagad domāju, ka klangāšana būs priecīgāka. 1520 01:12:01,700 --> 01:12:04,400 Ļaujiet man gūt punktus — Ienāc. 1521 01:12:04,400 --> 01:12:05,330 Un tiešām, viss ir kārtībā. 1522 01:12:05,330 --> 01:12:05,930 Kāpēc? 1523 01:12:05,930 --> 01:12:08,730 Tiklīdz labajā pusē ir vēl vismaz viens precīzāks datu veids, tajā 1524 01:12:08,730 --> 01:12:11,530 brīdī viss tiek apstrādāts kā peldošā komata vērtība, lai matemātika 1525 01:12:11,530 --> 01:12:14,330 izdotos. 1526 01:12:14,330 --> 01:12:17,720 Tātad ./scores, ievadiet — un tagad mēs ejam, vai ne? 1527 01:12:17,720 --> 01:12:20,390 Daži no mums patiešām varētu vēlēties šo 1/3 punkta. 1528 01:12:20,390 --> 01:12:21,980 Mūsu vidējais rādītājs nebija 59. 1529 01:12:21,980 --> 01:12:25,010 Tas ir 59 1/3, kā šajā gadījumā. 1530 01:12:25,010 --> 01:12:26,750 Labi, tāpēc mēs to esam atrisinājuši. 1531 01:12:26,750 --> 01:12:30,890 Tomēr šeit ir jāparāda vēl viena tehnika. 1532 01:12:30,890 --> 01:12:34,725 Ja jūs nevēlaties to mainīt uz 3.0, jo tas ir nedaudz dīvaini, jo 1533 01:12:34,725 --> 01:12:38,560 bija burtiski trīs punkti, nav tā, ka tam ir jābūt komatam, jūs 1534 01:12:38,560 --> 01:12:42,395 varētu arī nepārprotami pārvērst 3 par peldošu, iekavās pasakot , 1535 01:12:42,395 --> 01:12:46,230 peldēt. 1536 01:12:46,230 --> 01:12:48,050 To sauc par tipa apraidi. 1537 01:12:48,050 --> 01:12:50,305 Un tas vienkārši pārveidos lietu uzreiz pēc tās uz šo datu tipu, ja 1538 01:12:50,305 --> 01:12:52,560 tas būs iespējams. 1539 01:12:52,560 --> 01:12:56,970 Tātad, ja es to daru vēlreiz, iegūstiet punktus, tagad bez kļūdām. 1540 01:12:52,560 --> 01:12:59,960 ./rezultātus, un es iegūstu tādu pašu rezultātu. 1541 01:12:56,970 --> 01:13:00,310 Šeit ir neliela noapaļošanas problēma, taču mēs zinām, ka noapaļošana 1542 01:13:00,310 --> 01:13:03,650 ir saistīta ar pagājušās nedēļas neprecizitāti. 1543 01:13:03,650 --> 01:13:06,980 Pagaidām ļaujiet man būt apmierinātam ar savu 59,3 kaut ko. 1544 01:13:06,980 --> 01:13:08,360 Pagaidām to ņemšu. 1545 01:13:08,360 --> 01:13:14,660 Bet šī man tagad ir tikpat tuvu pietiekami labai pareizai atbildei. 1546 01:13:14,660 --> 01:13:18,650 Bet kā es tagad domāju par to, kas notiek datora atmiņā? 1547 01:13:18,650 --> 01:13:19,310 Nu, padomāsim. 1548 01:13:19,310 --> 01:13:20,643 Šeit ir tas pats atmiņu režģis. 1549 01:13:20,643 --> 01:13:22,490 Katrs lodziņš apzīmē baitu. 1550 01:13:22,490 --> 01:13:25,790 Kur manā atmiņā ir score1, score2 un score3? 1551 01:13:25,790 --> 01:13:28,790 Labi, score1, ļaujiet man tikai ierosināt, ir augšējā kreisajā stūrī. 1552 01:13:28,790 --> 01:13:32,060 Bet tas aizņem četras kastes 4 baitiem. 1553 01:13:32,060 --> 01:13:35,120 Iespējams, ka Score2 atmiņā paliek tieši blakus, lai gan tas ne 1554 01:13:35,120 --> 01:13:38,180 vienmēr tā būs, bet es izvēlējos vienkāršus piemērus. 1555 01:13:38,180 --> 01:13:40,910 73 ir blakus, kas arī aizņem 4 baitus. 1556 01:13:40,910 --> 01:13:45,320 Un, visbeidzot, 33 ir 3. punktā, apakšā. 1557 01:13:45,320 --> 01:13:48,817 Tagad, ja mēs patiešām skatāmies uz datora atmiņu, paskatāmies uz to 1558 01:13:48,817 --> 01:13:52,314 ar kaut kādu mikroskopu vai tamlīdzīgi, patiesībā katrā no šīm četrām 1559 01:13:52,314 --> 01:13:55,811 četru baitu grupām ir 32 biti, 32 biti, 32 biti, kas atspoguļo šīs 1560 01:13:55,811 --> 01:13:59,308 vērtības. 1561 01:13:59,308 --> 01:14:01,308 Bet atkal, šodienas nolūkos mums nav īsti jādomā atkal un atkal 1562 01:14:01,308 --> 01:14:03,308 bināri. 1563 01:14:03,308 --> 01:14:05,940 Tiešām, šie decimālskaitļi tur tiek glabāti. 1564 01:14:05,940 --> 01:14:08,240 Bet tagad es apgalvoju, ka šis nav labākais dizains. 1565 01:14:08,240 --> 01:14:12,146 Pat ja jūs nekad neesat programmējis pirms CS50, ko jūs skatāties 1566 01:14:12,146 --> 01:14:16,053 šeit uz ekrāna, kā fragmentu, kādā ziņā šis varbūt ir slikts dizains, 1567 01:14:16,053 --> 01:14:19,960 lai gan tas ir pareizs veids, kā saglabāt trīs pārbaudes rezultātus? 1568 01:14:19,960 --> 01:14:20,960 Kas te slikts? 1569 01:14:20,960 --> 01:14:21,882 Jā? 1570 01:14:21,882 --> 01:14:26,220 ir, jo vairāk jūs [dzirdams].. 1571 01:14:26,220 --> 01:14:28,980 DEIVIDS MALANS: Jā, vienmēr dariet tieši to, ko darījāt — 1572 01:14:28,980 --> 01:14:31,740 ekstrapolējiet uz 4 ballēm, 5 ballēm 50 ballēm. 1573 01:14:31,740 --> 01:14:34,412 Tas nevar būt tik labi izstrādāts, jo tagad jums būs 4 koda rindiņas, 1574 01:14:34,412 --> 01:14:37,085 5 koda rindiņas, 50 koda rindiņas, kas ir gandrīz identiskas, izņemot 1575 01:14:37,085 --> 01:14:39,757 šo, piemēram, patvaļīgo numuru, ko mēs atjauninām beigās. no mainīgā 1576 01:14:39,757 --> 01:14:42,430 lieluma. 1577 01:14:42,430 --> 01:14:45,560 Tātad patiešām, iespējams, būs labāks veids, lai gan vismaz C mēs vēl 1578 01:14:45,560 --> 01:14:48,690 neesam redzējuši šo tehniku. 1579 01:14:48,690 --> 01:14:52,440 Bet šodien risinājums būs kaut kas, ko sauc par masīvu. 1580 01:14:52,440 --> 01:14:58,200 Masīvs ir veids, kā saglabāt datus datora atmiņā, lai jūs varētu 1581 01:14:58,200 --> 01:15:03,960 viegli piekļūt katram atsevišķam dalībniekam. 1582 01:15:03,960 --> 01:15:08,530 Citiem vārdiem sakot, ar masīvu jūs varat darīt kaut ko līdzīgu šim. 1583 01:15:08,530 --> 01:15:11,642 Tā vietā, lai teiktu int score1, int score2, int score3, piešķirot 1584 01:15:11,642 --> 01:15:14,754 katram vērtību, vispirms varat pateikt datoram, lūdzu, iedodiet man 1585 01:15:14,754 --> 01:15:17,866 mainīgo, ko sauc par scores — daudzskaitlī, lai gan jūs varat to 1586 01:15:17,866 --> 01:15:20,978 saukt jebko, ko vēlaties — katra izmēra trīs. no kuriem būs vesels 1587 01:15:20,978 --> 01:15:24,090 skaitlis. 1588 01:15:24,090 --> 01:15:27,510 Tas ir, šādi jūs deklarējat masīvu C, kurā būs pietiekami daudz 1589 01:15:27,510 --> 01:15:30,930 vietas, lai saglabātu trīs veselus skaitļus. 1590 01:15:30,930 --> 01:15:34,840 Citiem vārdiem sakot, šis ir tehniskais veids, kā pateikt datoram, 1591 01:15:34,840 --> 01:15:38,750 lūdzu, dodiet man kopā 12 baitus — 3 reizes 4 katrs par int, tāpēc 1592 01:15:38,750 --> 01:15:42,660 dodiet man kopā 12 baitus. 1593 01:15:42,660 --> 01:15:47,350 Un tas, ko darīs dators, garantēs, ka tie atrodas datora atmiņā. 1594 01:15:47,350 --> 01:15:49,360 Un tas noderēs pēc brīža. 1595 01:15:49,360 --> 01:15:51,820 Tāpēc ļaujiet man darīt ar to kaut ko noderīgu. 1596 01:15:51,820 --> 01:15:53,640 Ļaujiet man saglabāt trīs faktiskos punktus. 1597 01:15:53,640 --> 01:15:56,070 Lūk, kā es tagad varētu saglabāt tos pašus skaitliskos rādītājus šajā 1598 01:15:56,070 --> 01:15:58,500 masīvā. 1599 01:15:58,500 --> 01:16:00,770 Sintakse ir nedaudz atšķirīga, taču ir viens mainīgais, ko sauc par 1600 01:16:00,770 --> 01:16:03,040 rādītājiem. 1601 01:16:03,040 --> 01:16:05,850 Bet, ja vēlaties doties uz tās pirmo atrašanās vietu, sākot no 1602 01:16:05,850 --> 01:16:08,660 šodienas, jūs izmantojat kvadrātiekavas un vispirms dodieties uz 1603 01:16:08,660 --> 01:16:11,470 vietu 0, kas, tā kā lietas C ir indeksētas ar 0, tā teikt, jūs sākat 1604 01:16:11,470 --> 01:16:14,280 skaitīt no 0. 1605 01:16:14,280 --> 01:16:16,410 Pirmais int ir [0]. 1606 01:16:16,410 --> 01:16:18,030 Otrais int ir [1]. 1607 01:16:18,030 --> 01:16:19,530 Trešais int ir [2]. 1608 01:16:19,530 --> 01:16:20,730 Tātad tas nav viens, divi, trīs. 1609 01:16:20,730 --> 01:16:22,090 Tas ir burtiski 0, 1, 2. 1610 01:16:22,090 --> 01:16:24,090 Un tas nav kaut kas, ko jūs kontrolējat. 1611 01:16:24,090 --> 01:16:26,250 Jums jāsāk ar 0. 1612 01:16:26,250 --> 01:16:29,880 Tātad šīs rindas tagad izveido masīvu ar trīs lielumu un pēc tam 1613 01:16:29,880 --> 01:16:33,510 ievieto vienu, divas, trīs vērtības šajā masīvā. 1614 01:16:33,510 --> 01:16:37,770 Bet tagad ir tas, ka jums ir jāatceras tikai viens mainīgā nosaukums. 1615 01:16:37,770 --> 01:16:39,240 To sauc tikai par rādītājiem. 1616 01:16:39,240 --> 01:16:43,380 Jā, jums jāiedziļinās masīvā, lai iegūtu atsevišķas vērtības. 1617 01:16:43,380 --> 01:16:46,618 Jums ir jāindeksē tajā, izmantojot šīs kvadrātiekavas. 1618 01:16:46,618 --> 01:16:49,834 Bet vismaz jums nav šīs dīvainās pieejas deklarēt atsevišķu mainīgo 1619 01:16:49,834 --> 01:16:53,050 katrai no šīm vērtībām. 1620 01:16:53,050 --> 01:16:56,070 Ļaujiet man atgriezties pie scores.c šeit. 1621 01:16:56,070 --> 01:16:57,580 Un ļaujiet man ierosināt to darīt. 1622 01:16:57,580 --> 01:16:59,080 Ļaujiet man izmantot to pašu ideju, lai veiktu tālāk norādītās 1623 01:16:59,080 --> 01:17:00,580 darbības. 1624 01:17:00,580 --> 01:17:02,580 Ļaujiet man atbrīvoties no šiem trim atsevišķiem veseliem skaitļiem. 1625 01:17:02,580 --> 01:17:06,210 Ļaujiet man sniegt sev 3. izmēra int punktu masīvu. 1626 01:17:06,210 --> 01:17:10,470 Un tad rezultāti[0] 1627 01:17:06,210 --> 01:17:10,470 tāpat kā iepriekš būs 72. 1628 01:17:10,470 --> 01:17:14,070 Rezultāti[1] būs 73. 1629 01:17:14,070 --> 01:17:16,830 Un rezultāti[2] būs 33. 1630 01:17:16,830 --> 01:17:18,780 Un ļaujiet man atbrīvoties no mazā punkta. 1631 01:17:18,780 --> 01:17:21,711 Labi, tāpēc tagad, ja es turpināšu un palaižu šo vēlreiz ar iegūto 1632 01:17:21,711 --> 01:17:24,642 punktu skaitu - ievadiet. 1633 01:17:24,642 --> 01:17:29,060 Ah, ko es šeit izdarīju nepareizi? 1634 01:17:29,060 --> 01:17:31,680 Man šķiet, ka esmu mazliet pārāk apsteidzis sevi. 1635 01:17:31,680 --> 01:17:36,100 Ļaujiet man palielināt savu termināļa logu. 1636 01:17:36,100 --> 01:17:38,830 Vispirms pievērsīsimies 10. rindiņai. 1637 01:17:38,830 --> 01:17:42,310 Kļūda, nedeklarēta identifikatora izmantošana, rezultāts1. 1638 01:17:42,310 --> 01:17:44,170 Ko es te stulbu izdarīju? 1639 01:17:44,170 --> 01:17:45,430 Jā? 1640 01:17:45,430 --> 01:17:47,440 Mērķauditorija: Jūs to nenorādījāt kā mainīgo. 1641 01:17:47,440 --> 01:17:49,420 DEIVIDS MALANS: Pareizi, tāpēc es nepaziņoju rezultātu 1. 1642 01:17:49,420 --> 01:17:50,530 Man ir vecs kods. 1643 01:17:50,530 --> 01:17:53,798 Tātad, godīgi sakot, es šeit apsteidzu sevi, pat ne apzināti. 1644 01:17:53,798 --> 01:17:56,090 Tāpēc ļaujiet man turpināt un atkal samazināt termināļa logu. 1645 01:17:56,090 --> 01:17:57,740 Šeit man jāpabeidz sava doma. 1646 01:17:57,740 --> 01:17:58,960 Tāpēc ļaujiet man notīrīt savu termināli. 1647 01:17:58,960 --> 01:18:04,960 būt scores[0] plus scores[1] plus 1648 01:18:04,960 --> 01:18:05,610 punktu skaits[2]. 1649 01:18:05,610 --> 01:18:10,040 Tāpēc tas ir nedaudz runīgāks, jo man ir šīs kvadrātiekavas, tā sakot. 1650 01:18:10,040 --> 01:18:12,220 Bet es domāju, ka tagad mans kods ir konsekvents. 1651 01:18:12,220 --> 01:18:13,870 Tāpēc ļaujiet man tagad gūt punktus. 1652 01:18:13,870 --> 01:18:14,950 Tagad tas tiek apkopots. 1653 01:18:14,950 --> 01:18:17,410 ./scores man patiešām parāda to pašu aptuveno vidējo rādītāju ar tām 1654 01:18:17,410 --> 01:18:19,870 pašām vērtībām. 1655 01:18:19,870 --> 01:18:24,280 Labi, tāpēc ļaujiet man turpināt un, iespējams, to nedaudz uzlabot. 1656 01:18:24,280 --> 01:18:27,945 Ir nedaudz muļķīgi rakstīt īpašu programmu, lai pārbaudītu vidējos 1657 01:18:27,945 --> 01:18:31,610 trīs pārbaudes rezultātus, piemēram, 72, 73, 33. 1658 01:18:31,610 --> 01:18:37,250 Kāpēc es nepadara programmu dinamisku un neprasu cilvēkam šos punktus? 1659 01:18:37,250 --> 01:18:39,140 Tā vietā ļaujiet man to izdarīt. 1660 01:18:39,140 --> 01:18:43,480 Kā būtu, ja mēs atbrīvotos no 72 un mainītu šo uz getInt. 1661 01:18:43,480 --> 01:18:46,300 Un es vienkārši pamudināšu lietotāju novērtēt rezultātu. 1662 01:18:46,300 --> 01:18:49,405 Ļaujiet man atbrīvoties no 73 un panākt, lai tas būtu getInt 1663 01:18:49,405 --> 01:18:52,510 rezultāts, citāts bez pēdiņām. 1664 01:18:52,510 --> 01:18:55,090 Un, visbeidzot, atbrīvojieties no 33 un aizstājiet to ar getInt, 1665 01:18:55,090 --> 01:18:57,670 citējiet un citējiet, novērtējiet. 1666 01:18:57,670 --> 01:19:00,675 getInt pagaidām ir CS50 lieta, tāpēc man, kā vienmēr, jāiekļauj 1667 01:19:00,675 --> 01:19:03,680 cs50.h. 1668 01:19:03,680 --> 01:19:06,180 Bet es domāju, ka tagad tā ir sava veida labāka programma, jo tagad 1669 01:19:06,180 --> 01:19:08,680 es varu to vienreiz sastādīt un pat dalīties ar draugiem. 1670 01:19:08,680 --> 01:19:10,585 Un tagad ikviens no mums dažu nodarbību pārbaudē var iegūt vidēji 1671 01:19:10,585 --> 01:19:12,490 trīs punktus. 1672 01:19:12,490 --> 01:19:14,700 Viņiem nav jāzina kods vai jāpārraksta kods, lai tikai ierakstītu 1673 01:19:14,700 --> 01:19:16,910 savus rezultātus. 1674 01:19:16,910 --> 01:19:19,150 Lai rezultāti būtu nostrādāti. 1675 01:19:19,150 --> 01:19:22,735 ./scores, tagad varu rakstīt visu, ko vēlos — varbūt tas ir 72, 73, 1676 01:19:22,735 --> 01:19:26,320 33, joprojām saņemu to pašu atbildi. 1677 01:19:26,320 --> 01:19:29,920 Vai varbūt man ir labāks semestris, 100, 100, varbūt 99, un tagad mēs 1678 01:19:29,920 --> 01:19:33,520 tur joprojām iegūstam diezgan augstu rezultātu. 1679 01:19:33,520 --> 01:19:34,600 Bet tagad tas ir dinamisks. 1680 01:19:34,600 --> 01:19:36,080 Tagad jums nav nepieciešams avota kods. 1681 01:19:36,080 --> 01:19:37,747 Programma nav jāpārkompilē. 1682 01:19:37,747 --> 01:19:39,670 Tas tikai strādās atkal un atkal. 1683 01:19:39,670 --> 01:19:41,090 Bet arī šis. 1684 01:19:41,090 --> 01:19:43,500 Ļaujiet man ieteikt, ka šis kods ir pareizs, ja es vēlos saņemt trīs 1685 01:19:43,500 --> 01:19:45,910 punktus no lietotāja. 1686 01:19:45,910 --> 01:19:49,540 Bet vai šīs tagad izceltās līnijas, no 6 līdz 9, ir labi izstrādātas, 1687 01:19:49,540 --> 01:19:53,170 vai jūs teiktu? 1688 01:19:53,170 --> 01:19:53,680 Jā? 1689 01:19:53,680 --> 01:19:54,898 Mērķauditorija: Vai jūs varat cilpu? 1690 01:19:54,898 --> 01:19:55,940 DEIVIDS MALANS: Jā, vai ne? 1691 01:19:55,940 --> 01:19:58,220 Tas ir-- mēs varam izmantot cilpu, šeit ir spoileris. 1692 01:19:58,220 --> 01:19:58,820 Kāpēc? 1693 01:19:58,820 --> 01:20:00,205 Es domāju, mans Dievs, tas ir kā viens un tas pats kods atkal un 1694 01:20:00,205 --> 01:20:01,590 atkal un atkal. 1695 01:20:01,590 --> 01:20:03,465 Vienīgais, kas mainās, ir numurs. 1696 01:20:03,465 --> 01:20:06,246 Un tam atkal vajadzēja būt koda smaržai, jo, ja es turpinu rakstīt 1697 01:20:06,246 --> 01:20:09,028 vienu un to pašu atkal un atkal, tā noteikti ir iespēja kaut ko labāk 1698 01:20:09,028 --> 01:20:11,810 noformēt. 1699 01:20:11,810 --> 01:20:13,650 Tāpēc ļaujiet man to izdarīt. 1700 01:20:13,650 --> 01:20:18,590 Ļaujiet man turpināt un joprojām izveidot savu trešā izmēra masīvu. 1701 01:20:18,590 --> 01:20:22,600 Bet ļaujiet man izmantot mūsu veco draugu for cilpu, jo int i ir 1702 01:20:22,600 --> 01:20:26,610 vienāds ar 0, i ir mazāks par 3, i++. 1703 01:20:26,610 --> 01:20:29,765 Un tad šeit, ļaujiet man veikt punktu skaitu — mēs to vēl neesam 1704 01:20:29,765 --> 01:20:32,920 redzējuši, bet kāda intuīcija? 1705 01:20:32,920 --> 01:20:34,720 Rezultātu grupa — AUDITORIJA: i. 1706 01:20:34,720 --> 01:20:37,720 DEIVIDS MALANS: i, jo tas iterācijā izmantos visu, kas ir i, 1707 01:20:37,720 --> 01:20:40,720 neatkarīgi no tā, vai tas ir 0 vai 1, vai 2. 1708 01:20:40,720 --> 01:20:43,860 Un tad es varu saņemt int, prasot lietotājam punktu skaitu, 1709 01:20:43,860 --> 01:20:47,000 neatkārtojoties atkal un atkal. 1710 01:20:47,000 --> 01:20:48,780 Cerams, ka, ja es nepieļāvu nekādas drukas kļūdas, sasniegšu punktus, 1711 01:20:48,780 --> 01:20:50,560 viss ir labi. 1712 01:20:50,560 --> 01:20:54,665 ./scores, 72, 73, 33, un mēs atkal esam biznesā. 1713 01:20:54,665 --> 01:20:58,090 Bet kods, iespējams, tagad ir labāk izstrādāts, jo tagad es faktiski 1714 01:20:58,090 --> 01:21:01,515 neesmu iekodējis punktu skaitu un faktiski neesmu kopējis un 1715 01:21:01,515 --> 01:21:04,940 ielīmējis nevienu no šī koda. 1716 01:21:04,940 --> 01:21:07,725 Ja tagad ņemam vērā, kas notiek datora atmiņā, vērtību ziņā tas ir 1717 01:21:07,725 --> 01:21:10,510 gandrīz vienāds. 1718 01:21:10,510 --> 01:21:13,860 Bet tā vietā, lai mainīgie burtiski būtu score1, score2, score3, ir 1719 01:21:13,860 --> 01:21:17,210 tikai viens mainīgais. 1720 01:21:17,210 --> 01:21:19,030 Tas ir masīvs, ko sauc par rādītājiem. 1721 01:21:19,030 --> 01:21:24,550 atrašanās vietas, izmantojot punktu skaitu[0], lai iegūtu 1722 01:21:24,550 --> 01:21:28,810 pirmais, rezultāti[1], lai iegūtu 1723 01:21:28,810 --> 01:21:29,990 Bet tas ir galvenais. 1724 01:21:29,990 --> 01:21:33,040 Atmiņa ir blakus. 1725 01:21:33,040 --> 01:21:35,380 Ekrāns ir tikai tik liels, tāpēc tas tiek apvilkts. 1726 01:21:35,380 --> 01:21:37,825 Bet fiziski, digitāli atmiņa ir blakus - no augšas uz leju, no 1727 01:21:37,825 --> 01:21:40,270 kreisās uz labo pusi. 1728 01:21:40,270 --> 01:21:41,530 Un tas ir svarīgi, kāpēc? 1729 01:21:41,530 --> 01:21:45,160 Tā kā iekavas norāda 0, 1, 2, ka katrs no šiem veselajiem skaitļiem 1730 01:21:45,160 --> 01:21:48,790 ir tikai viena vesela skaitļa attālumā no nākamā. 1731 01:21:48,790 --> 01:21:51,220 Tas nevar būt nejauši šeit, pēkšņi. 1732 01:21:51,220 --> 01:21:54,070 Tam ir jāatrodas mugurā. 1733 01:21:54,070 --> 01:22:00,710 Labi, tagad ir aprīkots ar šo paradigmu, ko mēs vēl varētu šeit darīt? 1734 01:22:00,710 --> 01:22:03,780 Nu, izrādās, ir vērts zināt, ka kodā ir iespējams pat nodot masīvus 1735 01:22:03,780 --> 01:22:06,850 kā argumentus. 1736 01:22:06,850 --> 01:22:09,085 Ļaujiet man šo programmu nedaudz ātri papildināt, lai jūs to redzētu 1737 01:22:09,085 --> 01:22:11,320 jau sen. 1738 01:22:11,320 --> 01:22:13,190 Bet ļaujiet man iet uz priekšu un darīt to. 1739 01:22:13,190 --> 01:22:15,660 Ļaujiet man ierosināt izveidot funkciju, kas veic šo vidējo rādītāju 1740 01:22:15,660 --> 01:22:18,130 manā vietā. 1741 01:22:18,130 --> 01:22:22,510 Tāpēc es izveidošu funkciju, ko sauc par vidējo, kas atgriež pludiņu. 1742 01:22:22,510 --> 01:22:28,640 Un argumenti, ko šī lieta pieņems - redzēsim, tas būs masīvs. 1743 01:22:28,640 --> 01:22:30,845 Tātad izrādās, ja vēlaties iekļaut skaitļu masīvu, varat to saukt par 1744 01:22:30,845 --> 01:22:33,050 visu, ko vēlaties. 1745 01:22:33,050 --> 01:22:36,420 Tādā veidā jūs sakāt C, ka funkcijai ir nepieciešams nevis vesels 1746 01:22:36,420 --> 01:22:39,790 skaitlis, bet gan veselu skaitļu masīvs. 1747 01:22:39,790 --> 01:22:41,290 Un jums tas nav jāsauc par masīvu. 1748 01:22:41,290 --> 01:22:42,790 Es to daru tikai diskusijas dēļ. 1749 01:22:42,790 --> 01:22:43,660 To var saukt par x. 1750 01:22:43,660 --> 01:22:44,490 Tie var būt cipari. 1751 01:22:44,490 --> 01:22:45,490 Tas var būt jebkas cits. 1752 01:22:45,490 --> 01:22:49,060 Es vienkārši izsaucu masīvu, lai būtu ļoti skaidrs, kas tas tur ir. 1753 01:22:49,060 --> 01:22:51,730 Tagad, kā es varu mainīt savu kodu šeit? 1754 01:22:51,730 --> 01:22:55,130 Tas, ko es domāju, ka šobrīd darīšu, ir tikai šis. 1755 01:22:55,130 --> 01:22:59,110 Es atbrīvošos no šī koda šeit, kur es manuāli aprēķināju vidējo. 1756 01:22:59,110 --> 01:23:02,055 Un ļaujiet man šeit nosaukt vidējo funkciju, nododot visu punktu 1757 01:23:02,055 --> 01:23:05,000 skaitu. 1758 01:23:05,000 --> 01:23:06,945 Tātad šis ir tikai abstrakcijas piemērs, piemēram, tagad man ir 1759 01:23:06,945 --> 01:23:08,890 funkcija, ko sauc par vidējo. 1760 01:23:08,890 --> 01:23:09,670 Man vienalga. 1761 01:23:09,670 --> 01:23:12,490 Man nav jāatceras, kā tas darbojas, kad esmu to ieviesis. 1762 01:23:12,490 --> 01:23:15,010 Tas tikai nedaudz pastiprina manu galveno kodu. 1763 01:23:15,010 --> 01:23:17,030 Bet man tas joprojām ir jāīsteno. 1764 01:23:17,030 --> 01:23:19,917 Tāpēc vēlāk manā failā — ļaujiet man atkārtot sevi iepriekš, vienīgo 1765 01:23:19,917 --> 01:23:22,805 reizi, kad C valodā ir pareizi atkārtot sevi atkal un atkal, vēlreiz 1766 01:23:22,805 --> 01:23:25,692 ierakstot vidējo vērtību un pēc tam iekšējā masīva atvērto iekavu — 1767 01:23:25,692 --> 01:23:28,580 bet tagad ne semikolu. 1768 01:23:28,580 --> 01:23:30,250 Tagad man šī lieta ir jāīsteno. 1769 01:23:30,250 --> 01:23:34,645 Un es varu to īstenot daudzos dažādos veidos, bet es nezinu 1770 01:23:34,645 --> 01:23:39,040 iepriekš — es nevaru to vienkārši izdarīt. 1771 01:23:39,040 --> 01:23:48,400 Es nevaru vienkārši veikt masīvu[0] 1772 01:23:48,400 --> 01:23:52,130 ja vien šī programma nedarbosies tikai ar trim cipariem. 1773 01:23:52,130 --> 01:23:55,460 Tāpēc ļaujiet man iet uz priekšu un darīt to. 1774 01:23:55,460 --> 01:23:58,570 Vispirms ļaujiet man ierosināt, ka šeit ir slikts dizains. 1775 01:23:58,570 --> 01:24:01,930 Kādu vērtību savā galvenajā funkcijā esmu atkārtojis divas reizes? 1776 01:24:05,050 --> 01:24:07,550 Kas starp izceltajām līnijām tev uzkrīt divreiz? 1777 01:24:07,550 --> 01:24:09,020 Mērķauditorija: masīva garums? 1778 01:24:09,020 --> 01:24:11,520 DEIVIDS MALANS: Jā, masīva garums ir tikai trīs. 1779 01:24:11,520 --> 01:24:13,826 Tagad tas nav nekas liels, ka es ierakstīju ciparu trīs 8. un 9. 1780 01:24:13,826 --> 01:24:16,133 rindiņā, taču tas ir tieši tāds īsinājumtaustiņš, kas galu galā 1781 01:24:16,133 --> 01:24:18,440 sagādās jums nepatikšanas. 1782 01:24:18,440 --> 01:24:18,860 Kāpēc? 1783 01:24:18,860 --> 01:24:21,330 Jo galu galā jūs vai kāds cits ieiesiet un padarīsiet masīvu lielāku 1784 01:24:21,330 --> 01:24:23,800 vai mazāku, un jūs nesapratīsit, ka tas pats skaitlis ir divās 1785 01:24:23,800 --> 01:24:26,270 vietās. 1786 01:24:26,270 --> 01:24:29,270 Un patiešām, programmētājs to bieži sauc par burvju numuru. 1787 01:24:29,270 --> 01:24:31,940 Maģisks skaitlis ir tāds, kas tikai kā maģiski parādās. 1788 01:24:31,940 --> 01:24:34,314 Un jūs esat goda sistēmā, lai to mainītu šeit, ja jūs to maināt šeit, 1789 01:24:34,314 --> 01:24:36,688 un tad jūs to maināt šeit. 1790 01:24:36,688 --> 01:24:39,939 Tas labi nebeigsies, ja programmētājam ir pienākums atcerēties, kur 1791 01:24:39,939 --> 01:24:43,190 viņi ir iekodējuši, tas ir, skaidri uzrakstīja trīs. 1792 01:24:43,190 --> 01:24:46,250 Tātad, kad jūs atkārtoti izmantojat šādu vērtību, jūs zināt ko? 1793 01:24:46,250 --> 01:24:48,935 Mums, iespējams, vajadzētu darīt to, ko darījām pagājušajā nedēļā, 1794 01:24:48,935 --> 01:24:51,620 proti, deklarēt mainīgo, iespējams, manas programmas pašā augšdaļā, 1795 01:24:51,620 --> 01:24:54,305 tāpēc ir ļoti skaidrs, kas tas ir, ko sauc, varbūt n, un iestatiet to 1796 01:24:54,305 --> 01:24:56,990 vienādu ar 3. 1797 01:24:56,990 --> 01:24:59,690 Vēl labāk, ko es darīju pagājušajā nedēļā, lai pārliecinātos, ka 1798 01:24:59,690 --> 01:25:02,390 nevaru sabojāt un nejauši mainīt šo vērtību? 1799 01:25:02,390 --> 01:25:03,440 Jā, pastāvīgi. 1800 01:25:03,440 --> 01:25:05,810 Un atslēgvārds tur bija tikai saīsināts const. 1801 01:25:05,810 --> 01:25:08,840 Un tagad man ir globāls mainīgais — globāls tādā nozīmē, ka varu tam 1802 01:25:08,840 --> 01:25:11,870 piekļūt jebkur — to sauc par n. 1803 01:25:11,870 --> 01:25:12,680 Tas ir int. 1804 01:25:12,680 --> 01:25:14,450 Un tas vienmēr būs 3. 1805 01:25:14,450 --> 01:25:17,590 Un tagad es varu nedaudz uzlabot savu galveno funkciju, vienkārši 1806 01:25:17,590 --> 01:25:20,730 mainot 3 uz n, tāpēc tagad, ja es, ja kolēģis sapratu, ak, pagaidiet, 1807 01:25:20,730 --> 01:25:23,870 šogad ir četri testi. 1808 01:25:23,870 --> 01:25:27,530 Jūs nomaināt n uz četriem, pārkompilē kodu, un tas vienkārši darbojas 1809 01:25:27,530 --> 01:25:31,190 visur citur, izņemot manu vidējo funkciju. 1810 01:25:31,190 --> 01:25:33,830 Ļaujiet man mainīt to atpakaļ uz 3, lai nodrošinātu konsekvenci. 1811 01:25:33,830 --> 01:25:38,720 Tas tagad nedarbosies, lai vienkārši summētu, piemēram, šādas lietas, 1812 01:25:38,720 --> 01:25:43,610 un pēc tam atgrieztu to dalītu ar 3. 1813 01:25:43,610 --> 01:25:51,130 Kāpēc tas nedarbosies tagad, kā es to definēju? 1814 01:25:51,130 --> 01:25:52,159 Jā? 1815 01:25:52,159 --> 01:25:58,030 Mērķauditorija: [NEdzirdams] 1816 01:25:58,030 --> 01:26:00,450 DEIVIDS MALANS: Labi, iespējams, es atgriežu veselu skaitļa vērtību, 1817 01:26:00,450 --> 01:26:02,870 kad plānoju atgriezt peldošo vērtību. 1818 01:26:02,870 --> 01:26:05,583 Bet es domāju, ka ar mani viss ir kārtībā, jo es izmantoju šo mazo 1819 01:26:05,583 --> 01:26:08,296 triku, lai pārliecinātos, ka vismaz viens no skaitļiem manā 1820 01:26:08,296 --> 01:26:11,010 aritmētiskajā izteiksmē faktiski ir peldošā komata vērtība. 1821 01:26:11,010 --> 01:26:13,330 Un, vienkārši pievienojot punktu 0, pārliecinieties, ka viss tiek 1822 01:26:13,330 --> 01:26:15,650 uzskatīts par pludiņu. 1823 01:26:15,650 --> 01:26:17,864 Tāpēc es domāju, ka tas ir labi. 1824 01:26:17,864 --> 01:26:19,034 Mērķauditorija: [NEdzirdams] 1825 01:26:19,034 --> 01:26:20,701 DEIVIDS MALANS: Es atvainojos, mazliet skaļāk. 1826 01:26:20,701 --> 01:26:24,385 it kā tu būtu [NEdzirdams].. 1827 01:26:24,385 --> 01:26:25,260 DEIVIDS MALANS: Tieši tā. 1828 01:26:25,260 --> 01:26:28,010 Tātad kreisā roka šeit nerunā ar labo roku, jo mana pašreizējā vidējā 1829 01:26:28,010 --> 01:26:30,760 ieviešanā joprojām tiek pieņemts, ka būs tikai trīs testi vai kas 1830 01:26:30,760 --> 01:26:33,510 cits. 1831 01:26:33,510 --> 01:26:36,495 Bet pagaidiet, es tikko piedzīvoju problēmas, pārveidojot to par n, 1832 01:26:36,495 --> 01:26:39,480 vispārīgi. 1833 01:26:39,480 --> 01:26:43,085 Un, ja es mainīšu šo uz 4, es, iespējams, nebūšu apmierināts ar savu 1834 01:26:43,085 --> 01:26:46,690 vidējo, jo tagad es ignorēšu vienu no saviem pārbaudes rezultātiem. 1835 01:26:46,690 --> 01:26:48,450 Tāpēc ļaujiet man to mainīt atpakaļ uz 3. 1836 01:26:48,450 --> 01:26:52,606 Un diemžēl, ja tas ir mainīgais tagad, n, un tāpēc man burtiski ir 1837 01:26:52,606 --> 01:26:56,763 mainīgs punktu skaits, kā es varu ņemt vidējo no mainīga skaita 1838 01:26:56,763 --> 01:27:00,920 lietu? 1839 01:27:00,920 --> 01:27:02,630 Es domāju, kāds tur ir mans celtniecības bloks? 1840 01:27:02,630 --> 01:27:03,170 Jā? 1841 01:27:03,170 --> 01:27:10,100 Mērķauditorija: [NEdzirdams] 1842 01:27:10,100 --> 01:27:10,850 DEIVIDS MALANS: Jā. 1843 01:27:10,850 --> 01:27:12,865 Kāpēc es neizmantoju cilpu, kas iet cauri masīvam un saskaita lietas, 1844 01:27:12,865 --> 01:27:14,880 ejot? 1845 01:27:14,880 --> 01:27:17,380 Es domāju, līdzīgi kā pamatskolā, kad jūs ņemat vidējo rādītāju uz 1846 01:27:17,380 --> 01:27:19,880 kalkulatora vai papīra un zīmuļa, jūs vienkārši turpinat saskaitīt 1847 01:27:19,880 --> 01:27:22,380 skaitļus un beigās dalāt ar kopējo lietu skaitu. 1848 01:27:22,380 --> 01:27:23,520 Tātad, kā es varu to izdarīt? 1849 01:27:23,520 --> 01:27:27,017 Ļaujiet man mainīt vidējo vērtību, lai vispirms deklarētu mainīgo, ko 1850 01:27:27,017 --> 01:27:30,515 sauc par summu vai citu, iestatītu to vienādu ar 0. 1851 01:27:30,515 --> 01:27:32,540 Tātad tas ir tāpat kā es uz papīra lapas, kas gatavojas skaitīt, vai, 1852 01:27:32,540 --> 01:27:34,565 protams, mans kalkulators, kad to ieslēdzat, parasti pēc noklusējuma 1853 01:27:34,565 --> 01:27:36,590 ir nulle. 1854 01:27:36,590 --> 01:27:41,570 Un tagad, ļaujiet man darīt, int i ir vienāds ar 0. 1855 01:27:36,590 --> 01:27:43,700 es esmu mazāks par — nu, nē, es to nedarīju. 1856 01:27:43,700 --> 01:27:46,730 i ir mazāks par n, i++. 1857 01:27:46,730 --> 01:27:51,320 Un tagad šeit, ļaujiet man iet uz priekšu un pievienot pašreizējai 1858 01:27:51,320 --> 01:27:55,910 summai neatkarīgi no tā, kas atrodas masīva atrašanās vietā, t. 1859 01:27:55,910 --> 01:28:00,235 Un tad šeit, es domāju, ka varu atgriezt dažus dalītus ar 3,0, nevis 1860 01:28:00,235 --> 01:28:04,560 3,0, n, iespējams, šeit. 1861 01:28:04,560 --> 01:28:06,526 Un patiesībā es domāju, ka es saņemšu... pārliecināsimies, ka tas ir 1862 01:28:06,526 --> 01:28:08,492 pludiņš. 1863 01:28:08,492 --> 01:28:12,016 Izmantosim veidu liešanas triku, lai pārliecinātos, ka es kādu 1864 01:28:12,016 --> 01:28:15,540 nejauši nesaīsinu un neizmetu visu pēc komata. 1865 01:28:15,540 --> 01:28:17,300 Tātad tas vienkārši saasinājās ātri, vai ne? 1866 01:28:17,300 --> 01:28:18,990 Vidējais tikko iesaistījās daudz vairāk. 1867 01:28:18,990 --> 01:28:22,130 Tā nav tikai viena koda rindiņa, bet tagad tā ir dinamiska. 1868 01:28:22,130 --> 01:28:25,070 Es inicializēju mainīgo, ko sauc par summu, uz 0. 1869 01:28:25,070 --> 01:28:33,200 viss, kas ir masīvā [i]-- 1870 01:28:33,200 --> 01:28:36,740 vai īpaši masīvs[0], 1871 01:28:36,740 --> 01:28:40,970 Tas man dod kopējo summu, ko es atdodu, dalītu ar kopējo lietu skaitu. 1872 01:28:40,970 --> 01:28:42,560 Tagad es varu nedaudz pievilkt. 1873 01:28:42,560 --> 01:28:44,105 Atcerieties, ka tas ir sintaktiskais cukurs, kas paredzēts tikai 1874 01:28:44,105 --> 01:28:45,650 lietu pievienošanai. 1875 01:28:45,650 --> 01:28:48,620 Es nevaru izmantot plus plus, jo tas tikai burtiski pievieno vienu. 1876 01:28:48,620 --> 01:28:52,630 Bet es varu izmantot šeit plus vienāds. 1877 01:28:52,630 --> 01:28:54,880 Vai jums ir jautājumi par šo ieviešanu? 1878 01:28:54,880 --> 01:28:58,736 Patiešām, vienīgais izņēmums — vai vissvarīgākais ir tas, ka šī ir 1879 01:28:58,736 --> 01:29:02,593 sintakse funkcijai pateikt, ka tā sagaida veselu masīvu, nevis vienu 1880 01:29:02,593 --> 01:29:06,450 mainīgo, piemēram, int vai tamlīdzīgi. 1881 01:29:06,450 --> 01:29:11,530 Jūs burtiski izmantojat kvadrātiekavas, bet tur nenorādiet garumu. 1882 01:29:11,530 --> 01:29:12,748 Jā? 1883 01:29:12,748 --> 01:29:16,410 [NEdzirdams] augšpusē? 1884 01:29:16,410 --> 01:29:18,410 DEIVIDS MALANS: Kā ar mainīgo augšpusē? 1885 01:29:18,410 --> 01:29:22,205 Mērķauditorija: [NEdzirdams] 1886 01:29:22,205 --> 01:29:23,330 DEIVIDS MALANS: Labs jautājums. 1887 01:29:23,330 --> 01:29:25,220 Kā man tas ir definēts kā augšpusē? 1888 01:29:25,220 --> 01:29:29,530 Šim mainīgajam N ir jābūt veselam skaitlim, ja jūs to izmantosit 1889 01:29:29,530 --> 01:29:33,840 masīvu iekšpusē kvadrātiekavās. 1890 01:29:33,840 --> 01:29:38,360 Tātad šajā 10. rindiņā, ievērojiet, vairs nav rakstīts 3, bet gan N. 1891 01:29:38,360 --> 01:29:41,165 Un tā, lai kāds N būtu 3 vai 4 vai kaut kas cits, tik daudz veselu 1892 01:29:41,165 --> 01:29:43,970 skaitļu es iegūšu šajā masīvā. 1893 01:29:43,970 --> 01:29:46,145 Un pēc masīva definīcijas tam ir jābūt veselam skaitlim, kas atrodas 1894 01:29:46,145 --> 01:29:48,320 šajās kvadrātiekavās. 1895 01:29:48,320 --> 01:29:50,000 Un šeit ir izplatīts neskaidrību avots. 1896 01:29:50,000 --> 01:29:52,070 Kad veidojat masīvu, tas ir, deklarējat to, jūs izmantojat 1897 01:29:52,070 --> 01:29:54,140 kvadrātiekavas, piemēram, šo, kur ievietojat kopējo vajadzīgo 1898 01:29:54,140 --> 01:29:56,210 elementu skaitu. 1899 01:29:56,210 --> 01:29:59,010 Kad jūs pēc tam izmantojat masīvu, kā es to daru šeit, jūs vairs 1900 01:29:59,010 --> 01:30:01,810 nepieminat int — tāpat kā jūs nepieminat int atkal un atkal, kad 1901 01:30:01,810 --> 01:30:04,610 pastāv mainīgais. 1902 01:30:04,610 --> 01:30:10,220 Jūs joprojām izmantojat kvadrātiekavas, bet neizmantojat N. 1903 01:30:04,610 --> 01:30:11,990 Jūs izmantojat 0 vai 1 vai 2 vai vispārīgi šeit, t.i. 1904 01:30:11,990 --> 01:30:14,525 Tātad, kad C tika izstrādāts, viņi dažreiz izmantoja vienu un to pašu 1905 01:30:14,525 --> 01:30:17,060 sintaksi divām dažādām idejām vai kontekstiem. 1906 01:30:17,060 --> 01:30:17,984 Jā? 1907 01:30:17,984 --> 01:30:22,645 Iekļaut 6. rindiņu [NEdzirdams]? 1908 01:30:22,645 --> 01:30:23,770 DEIVIDS MALANS: Labs jautājums. 1909 01:30:23,770 --> 01:30:25,900 Vai man ir jāiekļauj 6. rinda? 1910 01:30:25,900 --> 01:30:27,595 Īsa atbilde, jā, iemesla dēļ, ar kuru mēs saskārāmies pagājušajā 1911 01:30:27,595 --> 01:30:29,290 nedēļā. 1912 01:30:29,290 --> 01:30:31,020 C jeb tiešām zvana, nolasa jūsu kodu no augšas uz leju, no kreisās uz 1913 01:30:31,020 --> 01:30:32,750 labo pusi. 1914 01:30:32,750 --> 01:30:36,370 Tātad, ja kompilators 16. rindiņā redz šīs funkcijas vidējo 1915 01:30:36,370 --> 01:30:39,990 pieminējumu, bet jūs neesat teicis kompilatoram, ka pastāv vidējais 1916 01:30:39,990 --> 01:30:43,610 rādītājs, ekrānā tiks parādīta kļūda. 1917 01:30:43,610 --> 01:30:46,160 Tātad parastais veids, kā to izdarīt, ir vienkārši nokopēt un ielīmēt 1918 01:30:46,160 --> 01:30:48,710 pirmās koda rindiņas no funkcijas, tas ir tā sauktais prototips vai 1919 01:30:48,710 --> 01:30:51,260 deklarācija. 1920 01:30:51,260 --> 01:30:51,760 Jā? 1921 01:30:51,760 --> 01:30:55,662 Mērķauditorija: Vai ir kāda bibliotēka, ja nezināt masīva lielumu? 1922 01:30:55,662 --> 01:30:58,120 DEIVIDS MALANS: Tiešām labs jautājums un ideāls pārejas veids. 1923 01:30:58,120 --> 01:30:59,599 Vai ir kāda bibliotēka, kuru varat izmantot, ja nezināt masīva 1924 01:30:59,599 --> 01:31:01,078 lielumu? 1925 01:31:01,078 --> 01:31:01,720 Nē. 1926 01:31:01,720 --> 01:31:04,820 Tātad, ja kāds no jums ir ieprogrammējis Java vai Python vai citās 1927 01:31:04,820 --> 01:31:07,920 valodās, jūs faktiski varat vienkārši pajautāt masīvam, cik tas ir 1928 01:31:07,920 --> 01:31:11,020 liels? 1929 01:31:11,020 --> 01:31:13,778 C valodā jums un man, programmētājiem, tas ir jāatceras. 1930 01:31:13,778 --> 01:31:15,611 Un tik īsa atbilde, nē, nav nevienas funkcijas, kas to automātiski 1931 01:31:15,611 --> 01:31:17,445 paveiktu mūsu vietā. 1932 01:31:17,445 --> 01:31:20,016 Un patiesībā ļaujiet man izteikt smalkāku apgalvojumu, ka ir pareizi 1933 01:31:20,016 --> 01:31:22,588 izmantot šādus globālos mainīgos, ja tie patiešām ir paredzēti 1934 01:31:22,588 --> 01:31:25,160 konfigurācijas opcijām. 1935 01:31:25,160 --> 01:31:25,660 Kāpēc? 1936 01:31:25,660 --> 01:31:29,050 Vienkārši ir ērti tos ievietot faila pašā augšdaļā, jo visi, jūs, 1937 01:31:29,050 --> 01:31:32,440 jūsu kolēģi, jūsu TA redzēs tos koda augšdaļā. 1938 01:31:32,440 --> 01:31:36,130 Bet jums tiešām nevajadzētu tos izmantot visur visā kodā. 1939 01:31:36,130 --> 01:31:38,370 Būtu labāk, ja pati vidējā funkcija būtu neatkarīga no šī īpašā 1940 01:31:38,370 --> 01:31:40,610 mainīgā. 1941 01:31:40,610 --> 01:31:42,025 Tātad ar to es domāju šo. 1942 01:31:42,025 --> 01:31:44,132 Vai jūs zināt, kas man būtu jādara, ja es patiešām vēlos būt labi 1943 01:31:44,132 --> 01:31:46,240 izstrādāts? 1944 01:31:46,240 --> 01:31:51,400 Masīva garums jānodod vidējai funkcijai. 1945 01:31:51,400 --> 01:31:54,600 Man vajadzētu dot vidējai funkcijai otru argumentu — es to nosaukšu, 1946 01:31:54,600 --> 01:31:57,800 piemēram, par garumu, bet es to varētu saukt par visu, ko vien vēlos. 1947 01:31:57,800 --> 01:32:01,772 Tāpēc tā vietā, lai noliktu N līdz galam šeit, mana faila apakšā, 1948 01:32:01,772 --> 01:32:05,745 ļaujiet man dinamiski nosaukt garumu. 1949 01:32:05,745 --> 01:32:08,620 Un tas ir smalkums — un par to nav nepieciešams pārāk paklupt. 1950 01:32:08,620 --> 01:32:11,155 Bet šis tagad ir tikai piemērs tam, kā viena un tā pati funkcija var 1951 01:32:11,155 --> 01:32:13,690 izmantot nevis vienu, bet divus argumentus. 1952 01:32:13,690 --> 01:32:19,900 Bet patiešām C valodā jums pašam jāatceras, kāds ir masīva garums. 1953 01:32:19,900 --> 01:32:23,230 Jūs nevarat vienkārši jautāt masīvam, izmantojot kādu sintaksi, 1954 01:32:23,230 --> 01:32:26,560 piemēram, tie no jums, kas iepriekš ir programmējuši Java vai Python. 1955 01:32:26,560 --> 01:32:27,070 Jā? 1956 01:32:27,070 --> 01:32:35,115 Mērķauditorija: [NEdzirdams] 1957 01:32:35,115 --> 01:32:36,240 DEIVIDS MALANS: Labs jautājums. 1958 01:32:36,240 --> 01:32:39,198 Vai būtu labāk izveidot funkciju, kas aprēķina izmēru? 1959 01:32:39,198 --> 01:32:42,570 Īsa atbilde, to nevar izdarīt C. 1960 01:32:39,198 --> 01:32:43,689 Tiklīdz jūs nododat masīvu funkcijai C, jūs nevarat noteikt tā 1961 01:32:43,689 --> 01:32:48,180 lielumu, ja tas ir vispārējs masīvs, piemēram, veselu skaitļu masīvs. 1962 01:32:48,180 --> 01:32:51,040 Ir īpaši gadījumi, kad to var izdarīt. 1963 01:32:51,040 --> 01:32:53,283 Bet kopumā nē, tas vienkārši nav iespējams C. 1964 01:32:53,283 --> 01:32:55,231 Un, ja tas rada zināmu vilšanos, godīgi sakot, tāpēc modernākās 1965 01:32:55,231 --> 01:32:57,180 valodas pievieno šo funkciju. 1966 01:32:57,180 --> 01:32:57,680 Kāpēc? 1967 01:32:57,680 --> 01:32:59,620 Jo tas bija patiešām kaitinoši, jo es šeit atsaucos uz to, ka man nav 1968 01:32:59,620 --> 01:33:01,560 šīs informācijas. 1969 01:33:01,560 --> 01:33:04,550 Tagad, lai pārliecinātos, ka es nekur neesmu saplēsis, ļaujiet man 1970 01:33:04,550 --> 01:33:07,540 apkopot šo partitūras galīgo versiju. 1971 01:33:07,540 --> 01:33:08,620 Spriedze. 1972 01:33:08,620 --> 01:33:14,030 Viss labi. 1973 01:33:08,620 --> 01:33:14,030 ./scores, 72, 73, 33, un mēs joprojām esam atpakaļ biznesā. 1974 01:33:14,030 --> 01:33:15,530 Tātad šī versija ir sarežģītāka. 1975 01:33:15,530 --> 01:33:18,738 Un kā vienmēr, šī versija būs pieejama kursa tīmekļa vietnē uzziņai. 1976 01:33:18,738 --> 01:33:22,638 Bet patiesībā būtība ir tāda, ka masīvus var izmantot ne tikai kā 1977 01:33:22,638 --> 01:33:26,539 konteinerus vairāku vērtību glabāšanai — šajā gadījumā trīs vai 1978 01:33:26,539 --> 01:33:30,440 vairāk — jūs varat arī nodot tos kā argumentus kā tādus. 1979 01:33:30,440 --> 01:33:33,270 Labi, tagad, bez tam, uz mirkli vienkāršosim un tagad apskatīsim 1980 01:33:33,270 --> 01:33:36,100 rakstzīmju pasauli. 1981 01:33:36,100 --> 01:33:39,200 Ja mums ir tikai atsevišķi baiti, kur tas mūs ved? 1982 01:33:39,200 --> 01:33:41,685 Un kā tas galu galā mūs noved pie virknēm, lai atrisinātu tādas 1983 01:33:41,685 --> 01:33:44,170 problēmas kā lasāmība, kriptogrāfija un tamlīdzīgi? 1984 01:33:44,170 --> 01:33:46,568 Piemēram, šeit ir trīs koda rindiņas, kas ir ārpus konteksta un kurās 1985 01:33:46,568 --> 01:33:48,967 vienkārši ir saglabātas trīs rakstzīmes. 1986 01:33:48,967 --> 01:33:50,800 Un jūs jau varat redzēt, kur tas virzās. 1987 01:33:50,800 --> 01:33:54,135 Trīs mainīgie, ko sauc par c1, c2, c3, noteikti beigsies ar sliktu 1988 01:33:54,135 --> 01:33:57,470 dizainu visas muļķīgās atlaišanas dēļ. 1989 01:33:57,470 --> 01:33:59,400 Bet ievērojiet, es izmantoju vienas pēdiņas, piemēram, pagājušajā 1990 01:33:59,400 --> 01:34:01,330 nedēļā, jo tās ir vienas rakstzīmes. 1991 01:34:01,330 --> 01:34:03,647 Kā tas izskatās datora atmiņā? 1992 01:34:03,647 --> 01:34:05,480 Nu, tas izskatās kaut kas līdzīgs šim. 1993 01:34:05,480 --> 01:34:09,021 Ja mēs dzēšam veco atmiņu, c1, c2, c3, iespējams, nonāks šeit, varbūt 1994 01:34:09,021 --> 01:34:12,562 ne burtiski augšējā kreisajā stūrī. 1995 01:34:12,562 --> 01:34:14,020 Tas ir tikai mākslinieka atveidojums. 1996 01:34:14,020 --> 01:34:18,440 Bet c1, c2, c3 laikam tā arī beigsies. 1997 01:34:18,440 --> 01:34:20,020 Tagad, kas tur īsti ir? 1998 01:34:20,020 --> 01:34:23,350 Tie tiešām ir tie paši trīs skaitļi — 72, 73, 33. 1999 01:34:23,350 --> 01:34:27,920 Bet cik bitu ir baitam? 2000 01:34:27,920 --> 01:34:28,880 Tikai astoņi. 2001 01:34:28,880 --> 01:34:32,105 Tātad, ja mēs aplūkotu šo rakstzīmju bināro attēlojumu, katrs tas 2002 01:34:32,105 --> 01:34:35,330 būtu tikai astoņi biti. 2003 01:34:35,330 --> 01:34:39,140 Tas ir pietiekami, lai saglabātu mazus skaitļus, piemēram, 72, 73, 33. 2004 01:34:39,140 --> 01:34:41,580 Mēs nenodarbojamies ar Unicode un emocijzīmēm un tamlīdzīgi. 2005 01:34:41,580 --> 01:34:42,837 Bet būtība ir tā pati. 2006 01:34:42,837 --> 01:34:45,170 Lai saglabātu šos skaitļus, jums nav jāizmanto četri baiti. 2007 01:34:45,170 --> 01:34:48,295 Varat izmantot citu datu tipu, piemēram, rakstzīmes, un zem pārsega 2008 01:34:48,295 --> 01:34:51,420 katram tiks izmantoti tikai atsevišķi baiti. 2009 01:34:51,420 --> 01:34:53,635 Bet tas ir kaut kas līdzīgs — tas nav īsti veids, kā mēs ieviešam 2010 01:34:53,635 --> 01:34:55,850 virknes, vai ne? 2011 01:34:55,850 --> 01:34:57,560 Kad jūs gribējāt teikt, sveiki, pagājušajā nedēļā vai šajā, mēs 2012 01:34:57,560 --> 01:34:59,270 izmantojām dubultpēdas. 2013 01:34:59,270 --> 01:35:01,085 Un mēs rakstījām visas lietas kopā un izmantojām vienu mainīgo, nevis 2014 01:35:01,085 --> 01:35:02,900 trīs, vai ne? 2015 01:35:02,900 --> 01:35:06,260 Kad es ierakstīju Deividu, man nebija Dāvida mainīgā. 2016 01:35:06,260 --> 01:35:09,750 Man bija viens mainīgais ar nosaukumu nosaukums, kas saglabāja visu. 2017 01:35:09,750 --> 01:35:13,310 Tātad C valodā mēs turpinām runāt par šīm lietām, ko sauc par virknēm. 2018 01:35:13,310 --> 01:35:15,368 Galu galā mēs redzēsim, ka stīgas ne vienmēr ir tādas, kādas tās 2019 01:35:15,368 --> 01:35:17,427 šķiet. 2020 01:35:17,427 --> 01:35:19,748 Bet pagaidām galvenais virknēs ir tas, ka tās ir mainīga garuma, tā 2021 01:35:19,748 --> 01:35:22,070 sakot, vai ne? 2022 01:35:22,070 --> 01:35:25,160 Tās var būt trīs rakstzīmes, Hi, vai piecas rakstzīmes, Deivids vai 2023 01:35:25,160 --> 01:35:28,250 kaut kas mazāks vai lielāks. 2024 01:35:28,250 --> 01:35:33,110 Tātad, kā īstenot virknes, ja dienas beigās mums ir tikai mana atmiņa? 2025 01:35:33,110 --> 01:35:36,380 Šeit ir piemērs, kā vienkārši izveidot, deklarēt un definēt virkni ar 2026 01:35:36,380 --> 01:35:39,650 nosaukumu s. 2027 01:35:36,290 --> 01:35:39,095 jo tā ir tikai vienkārša virkne un citējiet bezpēdiņās, HI!, 2028 01:35:39,095 --> 01:35:41,900 dubultpēdiņās. 2029 01:35:41,900 --> 01:35:44,090 Kā tas izskatās datora atmiņā? 2030 01:35:44,090 --> 01:35:45,230 Nu, noskaidrosim vēlreiz. 2031 01:35:45,230 --> 01:35:48,095 Un šeit, tagad, jo tas ir tehniski saglabāts vienā mainīgajā, s, lūk, 2032 01:35:48,095 --> 01:35:50,960 kā es varētu to uzzīmēt kā mākslinieks. 2033 01:35:50,960 --> 01:35:53,990 Kopā tas ir trīs baiti — HI izsaukuma zīme. 2034 01:35:53,990 --> 01:35:59,630 Bet nav c1, c2, c3, vienkārši viss ir s. 2035 01:35:59,630 --> 01:36:03,310 Bet izrādās, ka tas ir jautrs fakts, kas patiesībā slēpjas zem 2036 01:36:03,310 --> 01:36:06,990 pārsega? 2037 01:36:06,990 --> 01:36:12,090 Savā veidā noved pie tā — kas ir virkne, ja tā ir izkārtota atmiņā? 2038 01:36:12,090 --> 01:36:13,190 Mērķauditorija: masīvs. 2039 01:36:13,190 --> 01:36:15,830 DEIVIDS MALANS: Burtiski tas ir tikai rakstzīmju klāsts. 2040 01:36:15,830 --> 01:36:17,210 Un pagājušajā nedēļā mums nebija jāzina par masīviem, lai izmantotu 2041 01:36:17,210 --> 01:36:18,590 virknes. 2042 01:36:18,590 --> 01:36:21,382 Šeit atkal sāk atdalīties treniņriteņi. 2043 01:36:21,382 --> 01:36:23,730 Bet virkne ir tikai rakstzīmju masīvs. 2044 01:36:23,730 --> 01:36:26,040 Piemēram, HI izsaukuma zīme. 2045 01:36:26,040 --> 01:36:38,150 s[0], ja vēlaties - s[1], s[2]. 2046 01:36:38,150 --> 01:36:41,100 Jūs varat burtiski iegūt atsevišķas rakstzīmes, vienkārši apstrādājot 2047 01:36:41,100 --> 01:36:44,050 s tā, it kā tas būtu masīvs, kas šajā gadījumā patiesībā atrodas zem 2048 01:36:44,050 --> 01:36:47,000 pārsega. 2049 01:36:47,000 --> 01:36:48,560 Bet tur ir āķis. 2050 01:36:48,560 --> 01:36:51,500 Kā jūs zināt, kur stīgas beidzas? 2051 01:36:51,500 --> 01:36:54,290 Agrāk, kad es zīmēju dažus veselus skaitļus uz ekrāna, es zinu, es 2052 01:36:54,290 --> 01:36:57,080 apgalvoju, ka tie vienmēr aizņem 4 baitus. 2053 01:36:57,080 --> 01:37:00,200 Ja es būtu zīmējis garu, tas vienmēr aizņem 8 baitus. 2054 01:37:00,200 --> 01:37:03,530 Ja es būtu uzzīmējis rakstzīmi, tas vienmēr aizņem 1 baitu. 2055 01:37:03,530 --> 01:37:06,533 Bet cik baitus aizņem virkne? 2056 01:37:06,533 --> 01:37:08,450 Jā, es domāju, tā ir sava veida pareizā atbilde. 2057 01:37:08,450 --> 01:37:10,490 Šajā gadījumā, šķiet, trīs. 2058 01:37:10,490 --> 01:37:13,490 Bet, ja tas ir Deivids, tie ir labi pieci varoņi. 2059 01:37:13,490 --> 01:37:16,173 Bet kur mēs liekam skaitli trīs? 2060 01:37:16,173 --> 01:37:17,840 Kur tu liec ciparu pieci, vai ne? 2061 01:37:17,840 --> 01:37:20,190 Tas ir burtiski viss, kas atrodas jūsu datorā. 2062 01:37:20,190 --> 01:37:23,430 Tie ir visi mūsu celtniecības bloki mūsu priekšā. 2063 01:37:23,430 --> 01:37:25,490 Tātad, kā mēs varam... kur tie trīs iet? 2064 01:37:25,490 --> 01:37:26,540 Kur paliek piecinieks? 2065 01:37:26,540 --> 01:37:29,420 Izrādās, ka to var atrisināt vairākos dažādos veidos. 2066 01:37:29,420 --> 01:37:33,185 Bet veids, kā cilvēki pirms gadiem nolēma ieviest virknes, patiešām 2067 01:37:33,185 --> 01:37:36,950 ir masīvs, taču viņi katra šāda virkņu masīva beigās pievienoja vienu 2068 01:37:36,950 --> 01:37:40,715 papildu baitu, lai ar tā saukto kontrolvērtību būtu skaidrs, ka 2069 01:37:40,715 --> 01:37:44,480 virkne beidzas šeit. . 2070 01:37:44,480 --> 01:37:45,050 Kāpēc? 2071 01:37:45,050 --> 01:37:47,930 Ja datora atmiņā ir divas virknes, piemēram, HI! 2072 01:37:47,930 --> 01:37:51,260 un čau, jūs zināt, kur ir barjera starp viena izsaukuma zīmi un burtu 2073 01:37:51,260 --> 01:37:54,590 B nākamajā, vai ne? 2074 01:37:54,590 --> 01:37:56,000 Jums ir nepieciešams sava veida norobežotājs. 2075 01:37:56,000 --> 01:38:00,110 Un tas, kas patiesībā atrodas zem pārsega, ir šis. 2076 01:38:00,110 --> 01:38:05,195 Saglabājot virkni atmiņā, ievadot virkni — ja ievadāt 3 rakstzīmes kā 2077 01:38:05,195 --> 01:38:10,280 lietotājs, tas izmantos 3 plus 1, kopā ar 4 baitiem. 2078 01:38:10,280 --> 01:38:12,205 Ja ierakstāt David, tas izmantos 5 plus 1, kas kopā ir vienāds ar 6 2079 01:38:12,205 --> 01:38:14,130 baitiem. 2080 01:38:14,130 --> 01:38:14,630 Kāpēc? 2081 01:38:14,630 --> 01:38:20,210 Jo C automātiski pievieno šo īpašo 0 virknes beigās. 2082 01:38:20,210 --> 01:38:22,960 Es to uzzīmēju ar slīpsvītru 0, jo šādi jūs attēlojat 0 kā rakstzīmi, 2083 01:38:22,960 --> 01:38:25,710 kā rakstzīmi. 2084 01:38:25,710 --> 01:38:28,230 Bet tas burtiski ir tikai 0, kā mēs drīz redzēsim. 2085 01:38:28,230 --> 01:38:32,213 Tāpēc ikreiz, kad atmiņā ir virkne, tā vienmēr aizņem par vienu baitu 2086 01:38:32,213 --> 01:38:36,197 vairāk, nekā jūs pats, programmētājs vai cilvēks ierakstījis. 2087 01:38:36,197 --> 01:38:39,188 Faktiski, ja mēs to vēlreiz pārveidosim, tikai diskusijas labad, uz 2088 01:38:39,188 --> 01:38:42,179 šiem veseliem skaitļiem, datora atmiņā burtiski saglabātais būs 72, 2089 01:38:42,179 --> 01:38:45,170 73, 33 un tagad 0. 2090 01:38:45,170 --> 01:38:48,830 Un dators, pateicoties C un tam, kā tas tika izgudrots, ir pietiekami 2091 01:38:48,830 --> 01:38:52,490 gudrs, lai zinātu, ka, izdrukājot virkni, tas izdrukā katru 2092 01:38:52,490 --> 01:38:56,150 rakstzīmi, līdz redz 0, un tad tas vienkārši pārtrauc drukāšanu. 2093 01:38:56,150 --> 01:38:58,470 It īpaši printf zina, kā tas darbojas. 2094 01:38:58,470 --> 01:39:02,050 Un tāpēc printf zina, kad pārtraukt drukāšanu. 2095 01:39:02,050 --> 01:39:03,800 Decimālskaitļi nav tik izglītojoši. 2096 01:39:03,800 --> 01:39:05,940 Parasti rakstzīmes rakstīsim šādi. 2097 01:39:05,940 --> 01:39:09,350 Un atkal slīpsvītra 0 ir tikai īpaša simbolika. 2098 01:39:09,350 --> 01:39:11,270 Tas ir tas, ko programmētājs ieraksta, lai skaidri norādītu, ka jūs 2099 01:39:11,270 --> 01:39:13,190 nesakot, HI!, 0. 2100 01:39:13,190 --> 01:39:15,980 Jūs sakāt HI!, un tad tas ir īpašs 0. 2101 01:39:15,980 --> 01:39:22,220 Konkrēti, astoņi 0 biti norāda, ka tas ir virknes beigas. 2102 01:39:22,220 --> 01:39:24,770 Tehniski šo slīpsvītru nulle, ja vēlaties būt iedomātā, to sauc par 2103 01:39:24,770 --> 01:39:27,320 nulli, NULL. 2104 01:39:27,320 --> 01:39:30,320 Un izrādās, ka jūs to jau esat redzējis, lai gan mēs to nesaucām. 2105 01:39:30,320 --> 01:39:33,230 Šeit ir tā pati ASCII diagramma no pēdējām pāris nedēļām. 2106 01:39:33,230 --> 01:39:39,080 Ja es to izceļu, kāda ir decimālskaitļa 0 kartēšana? 2107 01:39:39,080 --> 01:39:42,830 NUL, kas ir tikai programmētājs, runā par īpašo nulles rakstzīmi. 2108 01:39:42,830 --> 01:39:46,550 Visi 0 biti, kas nozīmē, ka virkne beidzas šeit. 2109 01:39:46,550 --> 01:39:48,510 Tas viss notiek automātiski. 2110 01:39:48,510 --> 01:39:53,420 Jums nav jāizveido šīs nulles rakstzīmes vai šīs nulles. 2111 01:39:53,420 --> 01:40:00,030 Vai ir kādi jautājumi par šo ieviešanu līdz šim? 2112 01:40:00,030 --> 01:40:01,820 Vai šeit ir kādi jautājumi? 2113 01:40:01,820 --> 01:40:02,320 Nē? 2114 01:40:02,320 --> 01:40:03,195 Nu, ļaujiet man to izdarīt. 2115 01:40:03,195 --> 01:40:05,310 Ļaujiet man pēc sekundes atgriezties pie VS Code. 2116 01:40:05,310 --> 01:40:07,770 Un patiesībā apstiprināsim to ar kādu kodu. 2117 01:40:07,770 --> 01:40:10,830 Ļaujiet man izveidot nelielu programmu ar nosaukumu hi.c. 2118 01:40:10,830 --> 01:40:12,070 Un kā būtu, ja mēs to darītu? 2119 01:40:12,070 --> 01:40:14,550 Ļaujiet man iekļaut stdio.h. 2120 01:40:14,550 --> 01:40:16,610 Ļaujiet man iekļaut — ļaujiet man ierakstīt galveno tukšumu, kā 2121 01:40:16,610 --> 01:40:18,670 vienmēr. 2122 01:40:18,670 --> 01:40:21,815 Un tagad ļaujiet man izdarīt kaut ko vienkāršu un kaut ko sliktu, bet 2123 01:40:21,815 --> 01:40:24,960 char c1 vienāds ar citātu unquote, h, atsevišķās pēdiņās. 2124 01:40:24,960 --> 01:40:28,590 Char c2 ir vienāds ar pēdiņām un pēdiņām, I, atsevišķās pēdiņās. 2125 01:40:28,590 --> 01:40:32,830 Un visbeidzot, char c3 vienāds ar izsaukuma zīmi atsevišķās pēdiņās. 2126 01:40:32,830 --> 01:40:34,500 Un tagad ļaujiet man to izdrukāt. 2127 01:40:34,500 --> 01:40:36,960 Es nevaru izmantot %s, jo tā nav virkne. 2128 01:40:36,960 --> 01:40:40,290 Tas ir burtiski trīs rakstzīmes, jo tādu dizaina lēmumu es pieņēmu. 2129 01:40:40,290 --> 01:40:45,675 Bet es varētu darīt tā — %c, %c, %c, ko mēs vēl neesam redzējuši, bet 2130 01:40:45,675 --> 01:40:51,060 %s ir virkne, %i ir int, %c patiešām ir char. 2131 01:40:51,060 --> 01:40:53,670 Tāpēc ļaujiet man tīrības labad beigās ievietot slīpsvītru n, un 2132 01:40:53,670 --> 01:40:56,280 tagad dariet: c1, c2, c3. 2133 01:40:56,280 --> 01:41:00,430 Tātad šī ir kā uz char balstīta drukas virknes versija. 2134 01:41:00,430 --> 01:41:01,650 Tāpēc ļaujiet man pasveicināties! 2135 01:41:01,650 --> 01:41:03,765 Un tad ļaujiet man izdarīt ./hi, un izskatās, ka es izmantoju printf 2136 01:41:03,765 --> 01:41:05,880 ar %s. 2137 01:41:05,880 --> 01:41:07,815 Bet es darīju lietas ļoti manuāli, izdrukājot katru atsevišķu 2138 01:41:07,815 --> 01:41:09,750 rakstzīmi. 2139 01:41:09,750 --> 01:41:12,020 Tomēr tagad forši ir tas, ka, tiklīdz jūs zināt, ka rakstzīmes ir 2140 01:41:12,020 --> 01:41:14,290 tikai skaitļi un virknes ir tikai rakstzīmes, varat kaut kā pabāzt 2141 01:41:14,290 --> 01:41:16,560 apkārt. 2142 01:41:16,560 --> 01:41:21,970 Ļaujiet man mainīt visus trīs vietturus uz %i. 2143 01:41:21,970 --> 01:41:23,860 Un arī tas ir pilnīgi labi. 2144 01:41:23,860 --> 01:41:26,310 Ļaujiet man to atkārtot, sveiki. 2145 01:41:26,310 --> 01:41:31,570 Patiesībā ļaujiet man veikt vienu izmaiņu, lai mēs to redzētu. 2146 01:41:31,570 --> 01:41:34,698 Ļaujiet man pievienot atstarpes, tikai estētikas dēļ, ļaujiet man 2147 01:41:34,698 --> 01:41:37,827 izdarīt hi, ./hi, Enter, un, piemēram, tagad jūs faktiski varat 2148 01:41:37,827 --> 01:41:40,956 redzēt skaitļus, par kuriem es apgalvoju nulles nedēļā, patiesībā 2149 01:41:40,956 --> 01:41:44,085 notika zem pārsega. . 2150 01:41:44,085 --> 01:41:45,960 Nu, tas nav veids, kā jūs veidotu stīgas. 2151 01:41:45,960 --> 01:41:48,375 Būtu neticami garlaicīgi, ja trīs burtu vārdiem būtu trīs mainīgie, 2152 01:41:48,375 --> 01:41:50,790 bet piecu burtu vārdiem - pieci mainīgie. 2153 01:41:50,790 --> 01:41:52,620 Mēs, protams, esam izmantojuši virknes kopš pagājušās nedēļas, tāpēc 2154 01:41:52,620 --> 01:41:54,450 tā vietā darīsim to. 2155 01:41:54,450 --> 01:41:57,820 Virkne s ir vienāda ar pēdiņām un pēdiņām, dubultpēdiņām 2156 01:41:57,820 --> 01:42:01,190 "HI!" Šim nolūkam nē, šo treniņriteņu dēļ man ir jāiekļauj 2157 01:42:01,190 --> 01:42:04,560 CS50 bibliotēka. 2158 01:42:04,560 --> 01:42:06,580 Bet mēs pie tā atgriezīsimies tuvāko nedēļu laikā. 2159 01:42:06,580 --> 01:42:10,256 Bet pagaidām es iešu uz priekšu un izveidošu virkni, ko sauc par 2160 01:42:10,256 --> 01:42:13,933 citātu uncitētu: "HI!" Un tagad es mainīšu šo, lai tas būtu 2161 01:42:13,933 --> 01:42:17,610 mans pazīstamais %s, un tagad vienkārši izdrukāšu pašu s. 2162 01:42:17,610 --> 01:42:21,180 Tas, protams, ir tas pats, kas pagājušajā nedēļā, ./hi, man sniedz 2163 01:42:21,180 --> 01:42:24,750 tieši to pašu, bet tagad mēs, protams, nodarbojamies ar stīgām. 2164 01:42:24,750 --> 01:42:27,610 Bet kā mēs varam redzēt mazliet tālāk? 2165 01:42:27,610 --> 01:42:28,810 Nu, kā ar šo? 2166 01:42:28,810 --> 01:42:31,530 Pabāzīsimies tālāk ar mūsdienu primitīviem. 2167 01:42:31,530 --> 01:42:39,000 rakstzīmi ar %c, veicot s[0]. 2168 01:42:39,000 --> 01:42:43,110 otrā rakstzīme ar %c, izpildot s[1]. 2169 01:42:43,110 --> 01:42:47,820 ar %c un izdrukājot s[2]. 2170 01:42:47,820 --> 01:42:50,295 Tātad atkal tas tikai loģiski izriet no manas izpratnes, ka virknes 2171 01:42:50,295 --> 01:42:52,770 ir masīvi, kā jūs atzīmējat. 2172 01:42:52,770 --> 01:42:57,300 Ļaujiet man uztaisīt — ļaujiet man uztaisīt sveiki, ./čau. 2173 01:42:57,300 --> 01:43:00,760 Un nekādu vizuālu izmaiņu, bet es vienkārši tagad čaloju. 2174 01:43:00,760 --> 01:43:03,400 Un patiesībā, ja jūs patiešām interesē, ļaujiet man to izdarīt. 2175 01:43:03,400 --> 01:43:08,250 Ļaujiet man tos mainīt atpakaļ uz i, atpakaļ uz i---o, atpakaļ uz i. 2176 01:43:08,250 --> 01:43:14,490 paskatīsimies, kas ir s[3]. 2177 01:43:14,490 --> 01:43:16,020 Šis ir ceturtais baits. 2178 01:43:16,020 --> 01:43:18,930 Un, lai gan pati virkne ir HI, es domāju, ka mēs varam apstiprināt 2179 01:43:18,930 --> 01:43:21,840 visu šo nulles lietu. 2180 01:43:21,840 --> 01:43:26,248 Nospiediet hi, ./hi, Enter, un tas ir. 2181 01:43:26,248 --> 01:43:27,914 Jūs to varējāt izdarīt pagājušajā nedēļā, ja patiešām vēlējāties 2182 01:43:27,914 --> 01:43:29,580 izklaidēties. 2183 01:43:29,580 --> 01:43:33,060 Bet pagaidām tas tikai atklāj, kas notiek zem pārsega. 2184 01:43:33,060 --> 01:43:36,480 Jautājumi, kas ir šīs stīgas? 2185 01:43:36,480 --> 01:43:37,498 Jā? 2186 01:43:37,498 --> 01:43:41,293 Mērķauditorija: [NEdzirdams] 2187 01:43:41,293 --> 01:43:42,960 DEIVIDS MALANS: Kāpēc mums ir vajadzīgs kronšteins? 2188 01:43:42,960 --> 01:43:45,430 Mērķauditorija: [NEdzirdams] 2189 01:43:45,430 --> 01:43:47,180 DEIVIDS MALANS: Kāpēc jums nav vajadzīgas iekavas? 2190 01:43:47,180 --> 01:43:47,780 Labs jautājums. 2191 01:43:47,780 --> 01:43:51,620 Kāpēc man nav vajadzīgas iekavas 6. rindā? 2192 01:43:51,620 --> 01:43:53,300 Jo s ir virkne. 2193 01:43:53,300 --> 01:43:57,770 Mēs redzēsim pēc pāris nedēļām, ka s būtībā ir ieviests zem pārsega, 2194 01:43:57,770 --> 01:44:02,240 patiešām kā masīvs, taču tas notiek automātiski. 2195 01:44:02,240 --> 01:44:06,800 Varat uzskatīt s tikai kā mainīgā nosaukumu bez kvadrātiekavām. 2196 01:44:06,800 --> 01:44:09,110 Kvadrātiekavas izmantosit, ja jums ir int masīvi vai manuāli 2197 01:44:09,110 --> 01:44:11,420 izveidojat rakstzīmju vai dubulto zīmju masīvus, pludiņus vai jebko 2198 01:44:11,420 --> 01:44:13,730 citu. 2199 01:44:13,730 --> 01:44:14,900 Bet stīgas ir īpašas. 2200 01:44:14,900 --> 01:44:15,440 Kāpēc? 2201 01:44:15,440 --> 01:44:17,315 Es domāju, ka katra jūsu rakstītā programma kaut kādā veidā izmanto 2202 01:44:17,315 --> 01:44:19,190 virknes, tekstu. 2203 01:44:19,190 --> 01:44:21,930 Mēs esam cilvēki, mums patīk teksts, ne tikai cipari un tamlīdzīgi. 2204 01:44:21,930 --> 01:44:28,580 Tāpēc tas ir nedaudz īpaši apstrādāts C un daudzās citās valodās. 2205 01:44:28,580 --> 01:44:31,170 Citi jautājumi par šo šeit? 2206 01:44:31,170 --> 01:44:31,670 Nē? 2207 01:44:31,670 --> 01:44:33,530 Pēc tam pievienosim maisījumam vēl vienu virkni. 2208 01:44:33,530 --> 01:44:36,095 Tā vietā, lai vienkārši pateiktu: HI!, kāpēc gan mēs neapsveram 2209 01:44:36,095 --> 01:44:38,660 programmas versiju, kurā ir teikts abi: HI! 2210 01:44:36,290 --> 01:44:38,660 un AČU!! 2211 01:44:38,660 --> 01:44:41,963 Un tagad es apgalvoju, ka šī slīpsvītra nulle, šī nulles rakstzīme 2212 01:44:41,963 --> 01:44:45,266 tagad būs arvien svarīgāka, ja mums ir divas virknes atmiņā, lai C 2213 01:44:45,266 --> 01:44:48,570 zinātu, kā atšķirt vienu no otra. 2214 01:44:48,570 --> 01:44:50,028 Tāpēc ļaujiet man iet uz priekšu un pagaidām vienkārši atbrīvoties no 2215 01:44:50,028 --> 01:44:51,487 šīm divām līnijām. 2216 01:44:51,487 --> 01:44:54,133 Ļaujiet man atkārtoti izveidot virkni s vienāds, citēt dubultpēdiņas 2217 01:44:54,133 --> 01:44:56,780 bez pēdiņām: "HI!" Ļaujiet man dot sev vēl vienu. 2218 01:44:56,780 --> 01:44:58,342 Un, tā kā es vienkārši spēlējos, es izvēlēšos ļoti īsus mainīgo 2219 01:44:58,342 --> 01:44:59,905 nosaukumus. 2220 01:44:59,905 --> 01:45:03,187 Virkne t ir vienāda ar citātu un citātu, "BYE!" Un tad 2221 01:45:03,187 --> 01:45:06,470 ļaujiet man tos abus izdrukāt. 2222 01:45:06,470 --> 01:45:11,690 Ļaujiet man izdrukāt %s, slīpsvītru n, komatu s un pēc tam izdrukāt f 2223 01:45:11,690 --> 01:45:16,910 %s slīpsvītru n un pēc tam t. 2224 01:45:16,910 --> 01:45:19,970 Tik ļoti vienkārša šo divu mainīgo demonstrācija. 2225 01:45:19,970 --> 01:45:23,030 Izveidojiet hi, ./hi, un, protams, tas izdrukā divas rindas vienu pēc 2226 01:45:23,030 --> 01:45:26,090 otras. 2227 01:45:26,090 --> 01:45:27,980 Kas patiesībā notiek zem pārsega? 2228 01:45:27,980 --> 01:45:29,510 Nu, atgriezīsimies pie datora atmiņas. 2229 01:45:29,510 --> 01:45:32,160 Sveiki! Es domāju, ka tas būs gandrīz tāds pats. 2230 01:45:32,160 --> 01:45:34,165 Tātad s, es apgalvošu, atrodas augšējā kreisajā stūrī, kam seko 2231 01:45:34,165 --> 01:45:36,170 slīpsvītra nulle. 2232 01:45:36,170 --> 01:45:40,035 Un tas ir svarīgi tagad, jo BYE! 2233 01:45:36,170 --> 01:45:40,035 droši vien tur beigsies. 2234 01:45:40,035 --> 01:45:42,182 Un vizuāli tas aptver tikai pēc būtības, kā esmu uzzīmējis šo baitu 2235 01:45:42,182 --> 01:45:44,330 režģi, taču tas ir blakus. 2236 01:45:44,330 --> 01:45:46,340 AČU-! 2237 01:45:46,340 --> 01:45:51,470 null, AKA 2238 01:45:46,340 --> 01:45:50,420 atpakaļvērstā slīpsvītra nulle, tagad tas ir noderīgi printf, jo 2239 01:45:50,420 --> 01:45:54,500 tagad printf zina, kur sākas un kur beidzas, izmantojot šo īpašo 2240 01:45:54,500 --> 01:45:58,580 nulles rakstzīmi. 2241 01:45:58,580 --> 01:46:00,230 Bet mēs varam arī tagad pabāzt apkārt. 2242 01:46:00,230 --> 01:46:01,620 Ko vēl es varu šeit darīt? 2243 01:46:01,620 --> 01:46:02,840 Kā ar šo? 2244 01:46:02,840 --> 01:46:07,030 Kā būtu, ja es iedziļināšos savā kodā šeit, atpakaļ uz VS kodu un 2245 01:46:07,030 --> 01:46:11,220 ļautu man iet uz priekšu un pateikt kaut ko līdzīgu: labi, ja man ir 2246 01:46:11,220 --> 01:46:15,410 divas no šīm virknēm, ziniet, ievietosim tās masīvā. 2247 01:46:15,410 --> 01:46:20,520 Veidosim šāda veida masīvus masīvos, šeit sava veida sākuma stilā. 2248 01:46:20,520 --> 01:46:23,060 Tātad virknē vārdus[2]. 2249 01:46:23,060 --> 01:46:25,580 Tātad, dodiet man divu virkņu masīvu, ko es saku šeit kodā, lai gan 2250 01:46:25,580 --> 01:46:28,100 mēs to vēl neesam izdarījuši ar virknēm. 2251 01:46:28,100 --> 01:46:29,270 Mēs to darījām tikai ar ints. 2252 01:46:29,270 --> 01:46:30,770 Un tagad ļaujiet man to izdarīt. 2253 01:46:30,770 --> 01:46:35,480 Pirmais vārds AKA vārdi[0] 2254 01:46:30,770 --> 01:46:35,480 tāpat kā iepriekš, HI! 2255 01:46:35,480 --> 01:46:40,940 Un tagad vārdi[1] būs 2256 01:46:40,940 --> 01:46:43,510 vienāds citāts un citāts, "BYE!" Un tagad es esmu darījis 2257 01:46:43,510 --> 01:46:46,080 tieši to pašu, bet atkal es vienkārši izvairos no s, t, q, r un 2258 01:46:46,080 --> 01:46:48,650 visiem šiem dažādajiem mainīgajiem savā kodā. 2259 01:46:48,650 --> 01:46:52,790 Es tikai tagad tos uztveru kā vienu virkņu masīvu. 2260 01:46:52,790 --> 01:46:54,750 Kā šeit nomainīt savu kodu? 2261 01:46:54,750 --> 01:46:57,380 pirmais vārds, es daru vārdus[0]. 2262 01:46:57,380 --> 01:46:59,900 otrais vārds, es daru vārdus[1]. 2263 01:46:59,900 --> 01:47:04,130 Šobrīd tas nav noderīgs uzdevums, jo es tikai sarežģīju savu kodu. 2264 01:47:04,130 --> 01:47:06,410 Bet atkal, tas ļauj mums pabāzt apkārt un redzēt, kas notiek, jo ir 2265 01:47:06,410 --> 01:47:08,690 tas HI! 2266 01:47:08,690 --> 01:47:09,530 un AČU!. 2267 01:47:09,530 --> 01:47:10,700 Bet skaties šo. 2268 01:47:10,700 --> 01:47:14,670 Ja es patiešām vēlos būt foršs, es varu to izdarīt. 2269 01:47:14,670 --> 01:47:20,185 Izdrukāsim %c, %c, %c, slīpsvītru n un tad šeit, %c, %c, %c, %c, 2270 01:47:20,185 --> 01:47:25,700 tātad četras no tām. 2271 01:47:25,700 --> 01:47:28,430 Un tagad šeit lietas kļūst interesantas. 2272 01:47:28,430 --> 01:47:30,620 Vārdi ir virkņu masīvs. 2273 01:47:30,620 --> 01:47:33,400 Atkal, ja drīkst, kas ir virkne? 2274 01:47:33,400 --> 01:47:35,060 Rakstzīmju masīvs. 2275 01:47:35,060 --> 01:47:36,790 Tāpēc izmantojiet to pašu loģiku. 2276 01:47:36,790 --> 01:47:41,110 nokļūt pie pirmās virknes ar vārdiem[0]. 2277 01:47:41,110 --> 01:47:44,530 Kā tikt pie pirmās rakstzīmes pirmajā virknē? 2278 01:47:44,530 --> 01:47:52,150 0. iekava, vārdi[0][1], 2279 01:47:52,150 --> 01:47:57,460 Un tagad šeit lejā, vārdi[1], bet 2280 01:47:52,150 --> 01:47:57,460 pirmais varonis ir tur. 2281 01:47:57,460 --> 01:48:00,400 Vārds[1], otrā rakstzīme ir šeit. 2282 01:48:00,400 --> 01:48:03,190 Vārdi[1], trešā rakstzīme ir šeit-- 2283 01:48:03,190 --> 01:48:04,720 ak, trešais varonis ir klāt. 2284 01:48:04,720 --> 01:48:07,898 Un vārdi[1], ceturtais 2285 01:48:04,720 --> 01:48:07,898 raksturs ir šeit. 2286 01:48:07,898 --> 01:48:09,190 Cilvēki neprogrammē šādi. 2287 01:48:09,190 --> 01:48:10,840 Tas ir tikai demonstrāciju dēļ. 2288 01:48:10,840 --> 01:48:13,060 Dievs, tas jau ir tik garlaicīgi un daudzvārdīgi. 2289 01:48:13,060 --> 01:48:18,025 Bet, ja es sveicu tagad, ./čau, tagad, es manuāli izgudroju %s no 2290 01:48:18,025 --> 01:48:22,990 jauna, ja esmu aizmirsis, ka tas pastāv, izmantojot tikai %c. 2291 01:48:22,990 --> 01:48:25,900 Bet jūs patiešām varat manipulēt ar masīviem šādā veidā. 2292 01:48:25,900 --> 01:48:29,050 Taču, tā kā virknes ir rakstzīmju masīvi, ar virknēm var manipulēt 2293 01:48:29,050 --> 01:48:32,200 arī šādā veidā. 2294 01:48:32,200 --> 01:48:34,675 Vai jums ir jautājumi par šo sintaksi? 2295 01:48:37,210 --> 01:48:38,800 Vai šeit ir kādi jautājumi? 2296 01:48:38,800 --> 01:48:39,970 Nē? 2297 01:48:39,970 --> 01:48:42,900 Labi, iesim uz priekšu un ierosināsim atrisināt pāris citas 2298 01:48:42,900 --> 01:48:45,830 problēmas, kuras, iespējams, nav bijušas kā agrāk. 2299 01:48:45,830 --> 01:48:47,490 Bet vispirms īss vizuālais ieskats par to, kas šeit notiek zem 2300 01:48:47,490 --> 01:48:49,150 pārsega. 2301 01:48:49,150 --> 01:48:52,420 Ja šeit atkal ir vieta, kur mēs atstājām ekrānu, HI! 2302 01:48:49,150 --> 01:48:56,470 un BYE atpakaļ, lūk, kā es tikko izturējos pret šīm lietām. 2303 01:48:56,470 --> 01:49:00,880 s iekava 0, 1, 2, 3 un pēc tam t 0, 1, 2, 3, 4. 2304 01:49:00,880 --> 01:49:04,840 Bet tiešām, kad es tos ievietoju masīvā, attēls kļūst par šādu. 2305 01:49:04,840 --> 01:49:07,030 Words[0] ir viss HI!. 2306 01:49:07,030 --> 01:49:08,680 Words[1] ir viss BYE!. 2307 01:49:08,680 --> 01:49:12,690 Bet, ja es patiešām nonāku nezālēs un sāku indeksēt atsevišķas 2308 01:49:12,690 --> 01:49:16,700 rakstzīmes šajās virknēs, es izmantoju tikai jaunu sintaksi, lai šeit 2309 01:49:16,700 --> 01:49:20,710 attēlotu šīs pašas vērtības. 2310 01:49:20,710 --> 01:49:24,710 Vai tad ir jautājumi par šiem attēlojumiem, pirms mēs virzāmies uz 2311 01:49:24,710 --> 01:49:28,710 priekšu? 2312 01:49:28,710 --> 01:49:29,430 Nē? 2313 01:49:29,430 --> 01:49:30,030 Jā? 2314 01:49:30,030 --> 01:49:33,390 personāžs nav [NEdzirdams]? 2315 01:49:33,390 --> 01:49:36,030 DEIVIDS MALANS: Vai jaunās līnijas varonis — to saka vēlreiz? 2316 01:49:36,030 --> 01:49:38,597 Mērķauditorija: vai jaunais rindas varonis aizņem vietu? 2317 01:49:38,597 --> 01:49:40,180 DEIVIDS MALANS: Ak, tiešām labs jautājums. 2318 01:49:40,180 --> 01:49:42,730 Vai jaunais rindas raksturs aizņem vietu? 2319 01:49:42,730 --> 01:49:45,340 Tā ir, ciktāl tas attiecas uz printf. 2320 01:49:45,340 --> 01:49:49,400 Bet es savās virknēs neglabāju slīpsvītru n, tā vietā šī lieta tiek 2321 01:49:49,400 --> 01:49:53,460 manuāli nodota printf. 2322 01:49:53,460 --> 01:49:57,070 Labi, tad ejam uz priekšu un apsvērsim, kā mēs varētu atrisināt dažas 2323 01:49:57,070 --> 01:50:00,680 problēmas, kas tagad ir radušās ar šīm virknēm, kā norādīts šeit. 2324 01:50:00,680 --> 01:50:02,760 Pieņemsim, ka es... darīsim to. 2325 01:50:02,760 --> 01:50:04,400 Ļaujiet man atgriezties pie VS Code šeit. 2326 01:50:04,400 --> 01:50:09,980 Un ļaujiet man atvērt jaunu failu, ko sauc par, garums.c. 2327 01:50:09,980 --> 01:50:13,055 Un uz brīdi padomāsim, kā es varētu izdomāt, kāds ir virknes garums, 2328 01:50:13,055 --> 01:50:16,130 kas atšķiras no masīva garuma. 2329 01:50:16,130 --> 01:50:18,155 Es apgalvoju iepriekš, jūs nevarat dinamiski noskaidrot, kāds ir 2330 01:50:18,155 --> 01:50:20,180 masīva garums. 2331 01:50:20,180 --> 01:50:23,570 Bet es varu noskaidrot virknes garumu, jo īpaši šīs nulles rakstzīmes 2332 01:50:23,570 --> 01:50:26,960 ieviešanas detaļās. 2333 01:50:26,960 --> 01:50:28,500 Tāpēc ļaujiet man iet uz priekšu un darīt to. 2334 01:50:28,500 --> 01:50:31,940 Ļaujiet man iekļaut cs50.h šajā otrajā programmā. 2335 01:50:31,940 --> 01:50:35,090 Ļaujiet man iekļaut stdio.h, tāpat kā iepriekš. 2336 01:50:35,090 --> 01:50:38,030 Un ļaujiet man to izdarīt, un pirmā lieta, ko es darīšu, ir vienkārši 2337 01:50:38,030 --> 01:50:40,970 iegūt virkni no lietotāja. 2338 01:50:40,970 --> 01:50:43,250 Es prasīšu lietotājam, kā vienmēr, viņu vārdu. 2339 01:50:43,250 --> 01:50:45,710 Tāpēc es piezvanīšu getString un pateikšu, kā jūs sauc, jautājuma 2340 01:50:45,710 --> 01:50:48,170 zīme, kā vienmēr. 2341 01:50:48,170 --> 01:50:52,060 Un tad šeit, lejā, ja es gribu izdomāt šīs virknes garumu un izdrukāt 2342 01:50:52,060 --> 01:50:55,950 garumu uz ekrāna, es varu darīt to pēc būtības līdzīgi kā vidēji, kur 2343 01:50:55,950 --> 01:50:59,840 es kaut ko uzkrāju. 2344 01:50:59,840 --> 01:51:02,600 Ļaujiet man iet uz priekšu un inicializēt N uz 0. 2345 01:51:02,600 --> 01:51:05,630 Ļaujiet man atdot sevi — tā nav for cilpa, jo man nav — es jau 2346 01:51:05,630 --> 01:51:08,660 iepriekš nezinu, cik tas ir. 2347 01:51:08,660 --> 01:51:09,980 Bet ja es to daru? 2348 01:51:09,980 --> 01:51:20,600 Kamēr vērtība pie name[n] 2349 01:51:20,600 --> 01:51:23,095 pašlaik nav vienāds ar '/0'-- traka sintakse, bet tā ir tikai 2350 01:51:23,095 --> 01:51:25,590 šo dažādo elementu kulminācija. 2351 01:51:25,590 --> 01:51:28,970 Ļaujiet man tikai pabeigt domu šeit, n++. 2352 01:51:28,970 --> 01:51:38,930 Un tad šeit, izdrukāsim ar printf un %i šo N vērtību. 2353 01:51:33,656 --> 01:51:36,844 Tāpēc es apgalvoju, ka tas man parādīs jebkuras ievadītās virknes 2354 01:51:36,844 --> 01:51:40,032 garumu neatkarīgi no tā, vai tā ir sveiks vai čau, Deivids vai jebkas 2355 01:51:40,032 --> 01:51:43,220 cits. 2356 01:51:43,220 --> 01:51:45,377 Es inicializēju mainīgo uz nulli, un tas ir labi, jo tieši tur jūs 2357 01:51:45,377 --> 01:51:47,535 sākat skaitīt kopumā. 2358 01:51:47,535 --> 01:51:50,990 Lai gan nosaukums[0] nav 2359 01:51:47,535 --> 01:51:50,990 vienāda slīpsvītra nulle. 2360 01:51:50,990 --> 01:51:51,930 Kas tas par teicienu? 2361 01:51:51,930 --> 01:51:59,390 vārds[0] gatavojas 2362 01:51:56,460 --> 01:51:59,390 esi pirmais varonis. 2363 01:51:59,390 --> 01:52:01,535 Un es uzdodu jautājumu, vai pirmā rakstzīme nav vienāda ar slīpsvītru 2364 01:52:01,535 --> 01:52:03,680 nulli? 2365 01:52:03,680 --> 01:52:06,215 Un, ja es ierakstu Deivids, D, tas tā nav, tāpēc es turpinu un N 2366 01:52:06,215 --> 01:52:08,750 pievienoju 1. 2367 01:52:08,750 --> 01:52:10,750 Tad es pārbaudīšu vārdu[1]. 2368 01:52:10,750 --> 01:52:13,895 vārds[1] būs A. 2369 01:52:13,895 --> 01:52:16,317 A nav vienāds ar slīpsvītru nulli, un tāpēc tas atkārtosies atkal un 2370 01:52:16,317 --> 01:52:18,740 atkal un atkal. 2371 01:52:18,740 --> 01:52:22,610 Bet kopā piecus soļus vēlāk, tas nonāks līdz baitam pēc DAVID, 2372 01:52:22,610 --> 01:52:26,480 saprotiet, pagaidiet, tā ir slīpsvītra n. 2373 01:52:26,480 --> 01:52:29,750 Cilpa beidzas, un es izdruku kopējo garumu. 2374 01:52:29,750 --> 01:52:33,050 Masīviem kopumā nav šīs nulles rakstzīmes. 2375 01:52:33,050 --> 01:52:34,910 Tomēr stīgas dara. 2376 01:52:34,910 --> 01:52:37,250 Atkal, virknes ir īpašas salīdzinājumā ar visiem citiem datu veidiem, 2377 01:52:37,250 --> 01:52:39,590 par kuriem esam runājuši līdz šim. 2378 01:52:39,590 --> 01:52:43,220 Bet kā es, piemēram, to varētu darīt savādāk? 2379 01:52:43,220 --> 01:52:47,220 Nu, pieņemsim to faktiski kā funkciju, kā es to parasti daru. 2380 01:52:47,220 --> 01:52:50,540 Bet tā vietā, lai to īstenotu pats, jūs zināt ko? 2381 01:52:50,540 --> 01:52:53,900 Izrādās, kas ir jauks tajā, ka stīgas ir tik izplatītas, ir daudzi 2382 01:52:53,900 --> 01:52:57,260 citi cilvēki, kas šīs problēmas ir atrisinājuši jau iepriekš. 2383 01:52:57,260 --> 01:53:00,290 Un patiesībā C valodā ir vesela stīgu bibliotēka. 2384 01:53:00,290 --> 01:53:04,190 To izmanto kā galvenes failu ar nosaukumu string.h. 2385 01:53:04,190 --> 01:53:08,400 Un kas ir string.h, ir ar virknēm saistītu funkciju bibliotēka. 2386 01:53:08,400 --> 01:53:12,363 Faktiski CS50 rokasgrāmatās varat redzēt C funkcijas string.h, vismaz 2387 01:53:12,363 --> 01:53:16,326 tās, kuras mēs iesakām kā visnoderīgākās, un jo īpaši, ja pamēģināsit 2388 01:53:16,326 --> 01:53:20,290 tur, jūs redzēsit, ka ir funkcija, ko sauc par strlen. 2389 01:53:20,290 --> 01:53:22,055 Tas nozīmē virknes garumu. 2390 01:53:22,055 --> 01:53:23,952 Tas tika nosaukts ļoti īsi, tikai tāpēc, ka to ir nedaudz vieglāk 2391 01:53:23,952 --> 01:53:25,850 rakstīt nekā virknes garumu. 2392 01:53:25,850 --> 01:53:28,800 Bet strlen stāsta virknes garumu. 2393 01:53:28,800 --> 01:53:30,990 Tātad, kā es varu to izmantot savā kodā šeit? 2394 01:53:30,990 --> 01:53:34,020 Nu, izrādās, es varu to diezgan vienkāršot. 2395 01:53:34,020 --> 01:53:37,890 Ļaujiet man atbrīvoties no savas cilpas, atbrīvoties no manas 2396 01:53:37,890 --> 01:53:41,760 grāmatvedības manuāli un darīt kaut ko līdzīgu šim — int n ir vienāds 2397 01:53:41,760 --> 01:53:45,630 ar cilvēka vārda, vārda strlen. 2398 01:53:45,630 --> 01:53:48,460 Un tagad es vienkārši izmantošu printf, tāpat kā iepriekš, ar %i 2399 01:53:48,460 --> 01:53:51,290 slīpsvītru n un izvadīšu n vērtību. 2400 01:53:51,290 --> 01:53:54,380 Bet šobrīd ir kāda kļūda. 2401 01:53:54,380 --> 01:53:58,480 Ko es esmu aizmirsis izdarīt? 2402 01:53:58,480 --> 01:54:00,870 Jā, man ir jāiekļauj galvenes fails ekrāna augšdaļā, tāpēc ļaujiet 2403 01:54:00,870 --> 01:54:03,260 man — koda augšdaļā. 2404 01:54:03,260 --> 01:54:07,115 Tāpēc ļaujiet man faila augšdaļā iekļaut arī string.h, lai C zinātu, 2405 01:54:07,115 --> 01:54:10,970 ka strlen patiešām pastāv. 2406 01:54:10,970 --> 01:54:14,170 Ļaujiet man iet uz priekšu un padarīt garumu, tāpat kā iepriekš. 2407 01:54:14,170 --> 01:54:18,670 ./length — vai tiešām pirmo reizi, kā tevi sauc? 2408 01:54:18,670 --> 01:54:22,360 DĀVIDS. 2409 01:54:18,670 --> 01:54:22,360 Un, cerams, es redzēsim, patiesībā, 5. 2410 01:54:22,360 --> 01:54:24,655 Turpretim, ja es to palaistu vēlreiz un ierakstu HI!, tagad es redzu 2411 01:54:24,655 --> 01:54:26,950 trīs. 2412 01:54:26,950 --> 01:54:29,785 Tātad strlen ir tikai viena no šīs bibliotēkas funkcijām. 2413 01:54:29,785 --> 01:54:30,910 Un ir vēl tik daudz. 2414 01:54:30,910 --> 01:54:34,133 Faktiski vēl viena bibliotēka, kas varētu būt noderīga, ir šī 2415 01:54:34,133 --> 01:54:37,356 bibliotēka ctype, kas attiecas uz C datu tipiem un daudzām tajā 2416 01:54:37,356 --> 01:54:40,580 esošajām funkcijām, kas var būt noderīgas. 2417 01:54:40,580 --> 01:54:43,540 Piemēram, pārskatot tās dokumentāciju rokasgrāmatu lapās tiešsaistē, 2418 01:54:43,540 --> 01:54:46,500 jūs redzēsit, ka ir funkcijas, ar kurām mēs varam atrisināt līdzīgas 2419 01:54:46,500 --> 01:54:49,460 problēmas. 2420 01:54:49,460 --> 01:54:53,680 Ļaujiet man iet uz priekšu un piedāvāt šeit — ļaujiet man redzēt. 2421 01:54:53,680 --> 01:54:58,020 Pieņemsim piemēru, kas ietver — kā pārbaudīt, vai kaut kas ir ar 2422 01:54:58,020 --> 01:55:02,360 lielajiem vai mazajiem burtiem, un pārvērst to tikai par lielajiem 2423 01:55:02,360 --> 01:55:06,700 burtiem. 2424 01:55:06,700 --> 01:55:08,755 Ļaujiet man atgriezties pie VS Code un iekodēt programmu ar nosaukumu 2425 01:55:08,755 --> 01:55:10,810 largecase.c. 2426 01:55:10,810 --> 01:55:15,220 Šajā failā es sākšu, kā vienmēr, iekļaujot cs50.h. 2427 01:55:15,220 --> 01:55:17,710 Es iekļaušu stdio.h. 2428 01:55:17,710 --> 01:55:21,970 Un es pievienošu vēl vienu maisījumam, kas tagad ir arī string.h, lai 2429 01:55:21,970 --> 01:55:26,230 pēc vajadzības varētu piekļūt lietu garumam. 2430 01:55:26,230 --> 01:55:28,570 Nākamais ir galvenais tukšums. 2431 01:55:28,570 --> 01:55:30,400 Un tad savas galvenās funkcijas ietvaros es iešu uz priekšu un 2432 01:55:30,400 --> 01:55:32,230 paziņošu virkni ar nosaukumu s. 2433 01:55:32,230 --> 01:55:34,240 Es tāpat kā iepriekš izsaukšu getString. 2434 01:55:34,240 --> 01:55:36,205 Un es iešu uz priekšu un vienkārši palūgšu lietotājam iepriekš 2435 01:55:36,205 --> 01:55:38,170 izsaukto virkni. 2436 01:55:38,170 --> 01:55:39,670 Es gribu darīt pirms un pēc. 2437 01:55:39,670 --> 01:55:41,350 Neatkarīgi no tā, ko lietotājs ieraksta, tas ir iepriekš. 2438 01:55:41,350 --> 01:55:44,770 Bet es vēlos pēc tam visu likt lielajiem burtiem. 2439 01:55:44,770 --> 01:55:48,740 Ļaujiet man tagad šajā cilpā izdarīt to. 2440 01:55:48,740 --> 01:55:51,270 Ļaujiet man citēt bez citātu "Pēc", lai mēs to redzētu 2441 01:55:51,270 --> 01:55:53,800 ekrānā. 2442 01:55:53,800 --> 01:55:58,120 Un ļaujiet man darīt četras int i saņem 0, i ir mazāks par strlen no 2443 01:55:58,120 --> 01:56:02,440 s, i++. 2444 01:56:02,440 --> 01:56:03,610 Ko es grasos darīt? 2445 01:56:03,610 --> 01:56:07,420 Es gatavojos atkārtot katru rakstzīmi virknē no kreisās puses uz 2446 01:56:07,420 --> 01:56:11,230 labo, no 0 līdz s garumam, bet ne cauri. 2447 01:56:11,230 --> 01:56:14,110 Un kā pārbaudīt, vai kaut kas ir rakstīts ar mazajiem burtiem, lai es 2448 01:56:14,110 --> 01:56:16,990 varētu to piespiest uz lielajiem burtiem? 2449 01:56:16,990 --> 01:56:19,630 Nu, izrādās, es to varētu izdarīt burtiski. 2450 01:56:19,630 --> 01:56:37,930 agrāk s[i] ir mazāks par 2451 01:56:37,930 --> 01:56:39,865 vai vienāds ar mazo z, tas angļu valodā loģiski nozīmē, ka tas 2452 01:56:39,865 --> 01:56:41,800 patiešām ir mazais burts. 2453 01:56:41,800 --> 01:56:44,830 Kā tagad pārvērst to par lielajiem burtiem, šo rakstzīmi? 2454 01:56:44,830 --> 01:56:48,160 Es varētu burtiski izdrukāt to pašu varoni. 2455 01:56:48,160 --> 01:56:52,280 Bet tā šeit nebūtu atbilde, jo tas nemaina vērtību. 2456 01:56:52,280 --> 01:56:54,470 Bet ko es varētu darīt tā vietā? 2457 01:56:54,470 --> 01:56:58,845 Ļaujiet man patiešām ātri pacelt ASCII diagrammu tāpat kā iepriekš, 2458 01:56:58,845 --> 01:57:03,220 un paskatīsimies, vai mēs nevaram gūt ieskatu. 2459 01:57:03,220 --> 01:57:06,505 Ja es izvelku to pašu ASCII diagrammu un pieņemu, ka cilvēks ir 2460 01:57:06,505 --> 01:57:09,790 ierakstījis mazo burtu a, tas ir 97. 2461 01:57:09,790 --> 01:57:14,225 Kāds burts — es vēlos to pārvērst par lielajiem burtiem A, tad kādu 2462 01:57:14,225 --> 01:57:18,660 skaitli es vēlos konvertēt 97 uz nulli nedēļā? 2463 01:57:18,660 --> 01:57:21,000 Tātad 65, mēs turpinām atgriezties pie tā. 2464 01:57:21,000 --> 01:57:23,010 Ko darīt, ja lietotājs raksta ar mazajiem burtiem b? 2465 01:57:23,010 --> 01:57:27,550 Es vēlos mainīt 98 vērtību uz 66 utt. 2466 01:57:27,550 --> 01:57:30,130 Un kāda ātra matemātika, cik tālu tās ir viena no otras? 2467 01:57:30,130 --> 01:57:34,060 Tātad tas vienmēr ir 32, piemēram, lielie burti uz mazajiem burtiem 2468 01:57:34,060 --> 01:57:37,990 vienmēr ir, brīnišķīgi, labs dizains, 32 attālumā viens no otra. 2469 01:57:37,990 --> 01:57:39,100 Tātad, ko tas nozīmē? 2470 01:57:39,100 --> 01:57:40,850 Es domāju, ka mēs jau iepriekš redzējām, ka zem pārsega ogle ir tikai 2471 01:57:40,850 --> 01:57:42,600 skaitlis. 2472 01:57:42,600 --> 01:57:44,340 Jūs noteikti varat veikt aritmētiku par to. 2473 01:57:44,340 --> 01:57:46,260 Un atkal, ja jūs saprotat šos zemākā līmeņa primitīvus, ko darīt, ja 2474 01:57:46,260 --> 01:57:48,180 es to darīšu? 2475 01:57:48,180 --> 01:57:53,940 Neatkarīgi no tā, kas ir s[i], ja es to zinu 2476 01:57:53,940 --> 01:57:55,494 13. rindiņa, ka tas ir mazais burts, vai es vēlos pievienot vai 2477 01:57:55,494 --> 01:57:57,048 atņemt 32? 2478 01:57:57,048 --> 01:57:57,840 Mērķauditorija: Atņemiet. 2479 01:57:57,840 --> 01:58:00,746 DEIVIDS MALANS: Tāpēc es vēlos atņemt, jo es vēlos pāriet no 97 uz 65 2480 01:58:00,746 --> 01:58:03,653 vai 98 uz 66, tāpēc patiešām, ja jūs veicat ātru matemātiku, jūs 2481 01:58:03,653 --> 01:58:06,560 saņemsit 32. 2482 01:58:06,560 --> 01:58:09,830 Tāpēc pietiek tikai uztvert rakstzīmes kā skaitļus, atņemt 32, un, 2483 01:58:09,830 --> 01:58:13,100 manuprāt, drukājot to ar %c, mazie burti tiks pārvērsti par lielajiem 2484 01:58:13,100 --> 01:58:16,370 burtiem. 2485 01:58:16,370 --> 01:58:18,897 Ja tagad ātri pārejat uz reālo pasauli, Microsoft Word vai Google 2486 01:58:18,897 --> 01:58:21,425 dokumentiem, ja kādreiz esat izvēlējies izvēlnes opciju, kas laiku pa 2487 01:58:21,425 --> 01:58:23,952 laikam liek lietā lielos vai mazos burtus, tas ir tas, ko Microsoft 2488 01:58:23,952 --> 01:58:26,480 un Google ir izdarījuši. 2489 01:58:26,480 --> 01:58:30,145 Viņi atkārto katru dokumenta rakstzīmi, pārbauda, vai tie ir mazie 2490 01:58:30,145 --> 01:58:33,810 burti, un, ja tā, viņi no tā atņem 32 un parāda jauno vērtību. 2491 01:58:33,810 --> 01:58:36,650 Ko darīt, ja tas tomēr nav mazais burts? 2492 01:58:36,650 --> 01:58:46,490 tad būtu s[i]. 2493 01:58:46,490 --> 01:58:48,620 Tāpēc ļaujiet man tagad iet uz priekšu un ievadīt lielos burtus, 2494 01:58:48,620 --> 01:58:50,750 cerams, bez kļūdām. 2495 01:58:50,750 --> 01:58:53,935 ./lielie burti, un tagad es ierakstīšu David ar lielo D, bet visu 2496 01:58:53,935 --> 01:58:57,120 pārējo ar mazajiem burtiem. 2497 01:58:57,120 --> 01:59:01,190 Bet tagad pēc versija ir DAVID — estētiska kļūda. 2498 01:59:01,190 --> 01:59:03,560 Ievērojiet šeit, es aizmirsu, lai skaistuma labad, beigās iekļautu 2499 01:59:03,560 --> 01:59:05,930 slīpsvītru n. 2500 01:59:05,930 --> 01:59:07,640 Nav problēmu, es piebildīšu. 2501 01:59:07,640 --> 01:59:08,870 Ļaujiet man izlabot savu kļūdu. 2502 01:59:08,870 --> 01:59:12,050 Ierakstiet lielos burtus, ./lielos burtus, Enter. 2503 01:59:12,050 --> 01:59:14,240 DEIVIDS, Enter un voila. 2504 01:59:14,240 --> 01:59:18,155 Un es apzināti pēc tam pievienoju vēl vienu atstarpi, lai tie būtu 2505 01:59:18,155 --> 01:59:22,070 skaisti, lai gan pirms un pēc ir atšķirīgs burtu skaits. 2506 01:59:22,070 --> 01:59:26,043 Pēc tam jautājumi par šo ieviešanu, kad kaut ko piespiežot lietot 2507 01:59:26,043 --> 01:59:30,016 lielos burtus, kas pats par sevi nav tik izglītojošs, bet tagad ir 2508 01:59:30,016 --> 01:59:33,990 reprezentatīvs tam, kā jūs varat izmantot šos zemā līmeņa primitīvus. 2509 01:59:33,990 --> 01:59:35,880 Jautājums? 2510 01:59:35,880 --> 01:59:36,380 Nē? 2511 01:59:36,380 --> 01:59:38,633 Labi, godīgi sakot, tas ir nogurdinoši. 2512 01:59:38,633 --> 01:59:41,091 Dievs, tāpat kā Microsoft, Google, visiem, jums ir burtiski 2513 01:59:41,091 --> 01:59:43,550 jāizraksta šis kods, lai izdarītu kaut ko vienkāršu? 2514 01:59:43,550 --> 01:59:46,310 Nu, nē, tāpēc mums ir tādas lietas kā bibliotēkas. 2515 01:59:46,310 --> 01:59:49,520 Un arvien biežāk problēmu kopām, projektiem un ne tikai jūs vienkārši 2516 01:59:49,520 --> 01:59:52,730 izmantojat bibliotēkas biežāk, lai atrisinātu problēmas, kas noteikti 2517 01:59:52,730 --> 01:59:55,940 ir bijušas citiem cilvēkiem pirms jums. 2518 01:59:55,940 --> 01:59:59,570 Tātad, kā es varu izmantot šo bibliotēku ctype.h? 2519 01:59:59,570 --> 02:00:01,320 Nu, ļaujiet man atgriezties pie sava koda. 2520 02:00:01,320 --> 02:00:05,090 Ļaujiet man to iekļaut starp maniem galvenes failiem. 2521 02:00:05,090 --> 02:00:06,560 Lai es varētu viegli pārmeklēt lietas, es mēdzu sakārtot savas 2522 02:00:06,560 --> 02:00:08,030 galvenes alfabēta secībā. 2523 02:00:08,030 --> 02:00:10,715 Bet tas nav absolūti nepieciešams, bet tas ļauj man, īsumā, saprast, 2524 02:00:10,715 --> 02:00:13,400 vai es iekļāvu kaut ko, kas man vajadzīgs? 2525 02:00:13,400 --> 02:00:15,570 Tagad ļaujiet man iet uz priekšu un darīt to. 2526 02:00:15,570 --> 02:00:28,910 arguments, būtībā, tāpēc s[i]. 2527 02:00:28,910 --> 02:00:31,400 Un, ja tas atgriež patiesību, Būla vērtību, ja vēlaties, es 2528 02:00:31,400 --> 02:00:33,890 piespiedīšu to rakstīt ar mazajiem burtiem. 2529 02:00:33,890 --> 02:00:36,560 Bet man šī matemātika vairs nav jādara. 2530 02:00:36,560 --> 02:00:43,130 kā ievade, piemēram, s[i], 2531 02:00:43,130 --> 02:00:45,060 un tas vienkārši izdara matemātiku jūsu vietā. 2532 02:00:45,060 --> 02:00:47,730 Lai jūs varētu abstrahēt 32 lietu un zināt, ka kāds cits ir 2533 02:00:47,730 --> 02:00:50,400 atrisinājis šo problēmu jūsu vietā. 2534 02:00:50,400 --> 02:00:52,800 Pretējā gadījumā es varu atstāt savu kodu nemainītu zemāk, jo es 2535 02:00:52,800 --> 02:00:55,200 nemainu neko citu. 2536 02:00:55,200 --> 02:00:59,455 Tātad, ja es tagad izveidoju lielos burtus un pēc tam ./lielo burtu, 2537 02:00:59,455 --> 02:01:03,710 David, tikai ar lielo D, un tagad tas joprojām darbojas. 2538 02:01:03,710 --> 02:01:07,520 Bet, ja palasa dokumentāciju tālāk, izrādās, ka augšā ir gudri. 2539 02:01:07,520 --> 02:01:10,280 Ja ievadāt rakstzīmi uz lielo burtu, tas ir mazais burts, tas 2540 02:01:10,280 --> 02:01:13,040 acīmredzami pārvērš to par lielajiem burtiem, veicot šo matemātiku. 2541 02:01:13,040 --> 02:01:15,873 Bet, ja ievadāt rakstzīmi uz lielajiem burtiem, kas jau ir lielie 2542 02:01:15,873 --> 02:01:18,706 burti, dokumentācijā, ko jūs redzēsit, tiek norādīts, ka tas paliek 2543 02:01:18,706 --> 02:01:21,540 nemainīgs. 2544 02:01:21,540 --> 02:01:23,910 Tāpēc es varu to visu nostiprināt. 2545 02:01:23,910 --> 02:01:25,880 Es varu atbrīvoties no visa pārējā. 2546 02:01:25,880 --> 02:01:29,750 Es varu atbrīvoties no visa, ja un, iespējams, tagad, ieviesīšu 2547 02:01:29,750 --> 02:01:33,620 programmu, kas ir tikpat pareiza, bet labāk izstrādāta. 2548 02:01:33,620 --> 02:01:34,250 Kāpēc? 2549 02:01:34,250 --> 02:01:36,995 Mazāks koda rindiņu skaits ir vieglāk lasāms, mazāka kļūdu 2550 02:01:36,995 --> 02:01:39,740 iespējamība, pieņemot, ka bibliotēka ir pareiza. 2551 02:01:39,740 --> 02:01:43,160 Tas tikai atvieglo un ātrāk man tagad rakstīt kodu. 2552 02:01:43,160 --> 02:01:45,503 Tātad, ja es tagad daru, pēdējo reizi ierakstiet lielos burtus, 2553 02:01:45,503 --> 02:01:47,846 ievadiet Enter, ./lielo burtu un ierakstiet savu vārdu, joprojām 2554 02:01:47,846 --> 02:01:50,190 strādājot. 2555 02:01:50,190 --> 02:01:53,965 Bet tagad ievērojiet, ka mēs esam to samazinājuši līdz daudz mazākam 2556 02:01:53,965 --> 02:01:57,740 koda rindiņu skaitam, lai gan tagad izmantojot šo papildu bibliotēku. 2557 02:01:57,740 --> 02:02:00,140 Vai tad ir jautājumi par to, kā mēs to izdarījām? 2558 02:02:03,930 --> 02:02:06,525 Lai gan šis kods, es uzdrošinos teikt, ir pareizs, tas vēl ne vienmēr 2559 02:02:06,525 --> 02:02:09,120 ir labi izstrādāts. 2560 02:02:09,120 --> 02:02:13,510 Patiesībā šajā pašreizējā implementācijā ir viena koda rindiņa, viens 2561 02:02:13,510 --> 02:02:17,900 funkcijas izsaukums, kas ir neefektīvāks, nekā nepieciešams. 2562 02:02:17,900 --> 02:02:21,110 Un ļaujiet man pievērst jūsu uzmanību šim 10. rindiņai, kurā mēs 2563 02:02:21,110 --> 02:02:24,320 saucam strlen. 2564 02:02:24,320 --> 02:02:29,000 Bet mēs to saucam šīs for cilpas iekšpusē, īpaši nosacījuma iekšpusē. 2565 02:02:29,000 --> 02:02:33,720 Un kāpēc tā var nebūt labākā ideja? 2566 02:02:33,720 --> 02:02:36,810 Nu, vai virknes garums vienmēr mainās? 2567 02:02:36,810 --> 02:02:38,950 Es domāju, noteikti ne šīs cilpas ietvaros. 2568 02:02:38,950 --> 02:02:42,096 Un tāpēc mēs atrodamies mūsu for cilpas ietvaros 10., 11., 12. un 13. 2569 02:02:42,096 --> 02:02:45,242 rindā, katrā iterācijā uzdodot to pašu jautājumu. 2570 02:02:45,242 --> 02:02:48,330 Kāds ir s garums? 2571 02:02:48,330 --> 02:02:50,495 Un, savukārt, mēs katru reizi zvanām strlenam, lai gan saņemam to 2572 02:02:50,495 --> 02:02:52,660 pašu atbildi. 2573 02:02:52,660 --> 02:02:56,075 Tāpēc es uzdrošinos pieņemt, ka labāks risinājums šeit būtu varbūt 2574 02:02:56,075 --> 02:02:59,490 izdomāt s garumu agrāk savā kodā un varbūt deklarēt mainīgo. 2575 02:02:59,490 --> 02:03:02,898 Vai varbūt dariet kaut ko, kas sintaktiski ir nedaudz elegantāks, un 2576 02:03:02,898 --> 02:03:06,306 patiesībā ļoti izplatīts dizains šādā ciklā būtu deklarēt ne tikai 2577 02:03:06,306 --> 02:03:09,714 vienu mainīgo, piemēram, i, bet faktiski deklarēt otru mainīgo, ko 2578 02:03:09,714 --> 02:03:13,122 sauc, piemēram, kur n ir tikai kāds skaitlis, kas n ir vienāds ar s 2579 02:03:13,122 --> 02:03:16,530 garumu. 2580 02:03:16,530 --> 02:03:20,535 Bet pēc tam šajā stāvoklī, tā vietā, lai atkal un atkal un atkal 2581 02:03:20,535 --> 02:03:24,540 sauktu strlen no s, ko es tagad varētu darīt? 2582 02:03:24,540 --> 02:03:27,270 Tā vietā es varētu vienkārši salīdzināt i ar pašu n, jo tagad n tiks 2583 02:03:27,270 --> 02:03:30,000 aprēķināts tikai vienreiz, kad tas ir inicializēts, tāpat kā i 2584 02:03:30,000 --> 02:03:32,730 inicializē līdz nullei. 2585 02:03:32,730 --> 02:03:37,350 Un pēc tam mēs salīdzināsim i, kas mainās, ar n, kas nemainās. 2586 02:03:37,350 --> 02:03:40,330 Tātad pēc konstrukcijas tas būs nedaudz efektīvāks. 2587 02:03:40,330 --> 02:03:43,715 Tagad, ņemot vērā to, labs kompilators varētu arī atpazīt, ka ir šāda 2588 02:03:43,715 --> 02:03:47,100 optimizācijas iespēja, un varbūt to izdarīt mūsu vietā. 2589 02:03:47,100 --> 02:03:50,555 Bet pagaidām vislabāk ir apgūt ieradumu, vislabāk attīstīt muskuļu 2590 02:03:50,555 --> 02:03:54,010 atmiņu, lai paši pieņemtu labākus dizaina lēmumus. 2591 02:03:54,010 --> 02:03:56,380 Vai tad ir jautājumi par to, kā mēs to izdarījām? 2592 02:03:58,900 --> 02:03:59,650 Nē? 2593 02:03:59,650 --> 02:04:03,050 Labi, daži pēdējie šīs dienas celtniecības bloki. 2594 02:04:03,050 --> 02:04:06,710 Mēs sākām, runājot par tiem komandrindas argumentiem, kurus izmanto 2595 02:04:06,710 --> 02:04:10,370 clang, tādējādi jebkas pēc komandas, ko ierakstāt uzvednē, neatkarīgi 2596 02:04:10,370 --> 02:04:14,030 no tā, vai tas ir make vai clang, vai pat CD operētājsistēmā Linux, 2597 02:04:14,030 --> 02:04:17,690 jebkurš vārds pēc tam vai kaut kas noslēpumains, piemēram, -o 2598 02:04:17,690 --> 02:04:21,350 komandrindas arguments. 2599 02:04:21,350 --> 02:04:22,840 Tā ir komandas ievade. 2600 02:04:22,840 --> 02:04:25,060 Tas atšķiras no funkcijas argumenta, jo funkcijas arguments, protams, 2601 02:04:25,060 --> 02:04:27,280 ir funkcijas ievade. 2602 02:04:27,280 --> 02:04:28,345 Bet tā ir tā pati ideja. 2603 02:04:28,345 --> 02:04:30,970 Tā ir tikai cita sintakse pēc dolāra zīmes uzvednē. 2604 02:04:30,970 --> 02:04:36,385 Izrādās, ka komandrindas argumentus tagad varat izmantot savās 2605 02:04:36,385 --> 02:04:41,800 programmās, piekļūstot vārdiem pēc uzvednes. 2606 02:04:41,800 --> 02:04:45,410 Un ļaujiet man ierosināt to izdomāt šādi. 2607 02:04:45,410 --> 02:04:49,485 Ļaujiet man ierosināt šeit pārslēgties atpakaļ uz VS Code, un es šeit 2608 02:04:49,485 --> 02:04:53,560 atvēršu jaunu failu ar nosaukumu greet.c. 2609 02:04:53,560 --> 02:04:57,070 Tātad greet.c tā būs programma, kas ļoti vienkārši sveic lietotāju. 2610 02:04:57,070 --> 02:04:59,440 Ja mēs to būtu rakstījuši pagājušajā nedēļā, mēs to būtu izdarījuši. 2611 02:04:59,440 --> 02:05:03,850 Iekļaujiet cs50.h, pēc tam iekļaujiet stdio.h un pēc tam int main 2612 02:05:03,850 --> 02:05:08,260 void, un tad mēs varētu darīt kaut ko vienkāršu, piemēram, virknes 2613 02:05:08,260 --> 02:05:12,670 nosaukums ir vienāds ar getString, citējot un citējot: "Kāds ir 2614 02:05:12,670 --> 02:05:17,080 jūsu vārds?" Un tad mēs, kā vienmēr, būtu izdrukājuši sveiki, %s 2615 02:05:17,080 --> 02:05:21,490 un pēc tam pievienojuši šo vārdu. 2616 02:05:21,490 --> 02:05:24,040 Tātad šī ir tā pati programma, ko esam ieviesuši daudzas reizes, lai 2617 02:05:24,040 --> 02:05:26,590 pārliecinātos, ka tā darbojas, lai gan, nē, tā nav gluži tā pati 2618 02:05:26,590 --> 02:05:29,140 programma. 2619 02:05:29,140 --> 02:05:30,940 Semikols ir nepareizā vietā. 2620 02:05:30,940 --> 02:05:32,960 Tagad šī ir tā pati programma. 2621 02:05:32,960 --> 02:05:37,610 Tāpēc izveidojiet sveicināt, dot ./greet, un es ierakstīšu savu vārdu. 2622 02:05:32,960 --> 02:05:38,770 sveiks, Deivid, mēs esam atpakaļ tur. 2623 02:05:38,770 --> 02:05:41,305 Tagad, kas, iespējams, ir nedaudz kaitinošas šajā programmā, ja es 2624 02:05:41,305 --> 02:05:43,840 ierakstu kaut ko citu, piemēram, Carter, Enter, man ir jāpalaiž 2625 02:05:43,840 --> 02:05:46,375 programma, jāgaida uzvedne, ierakstiet savu vārdu un nospiediet 2626 02:05:46,375 --> 02:05:48,910 taustiņu Enter. 2627 02:05:48,910 --> 02:05:52,360 Un tas ir labi, bet iedomājieties, ja katra programma darbotos šādi. 2628 02:05:52,360 --> 02:05:54,420 Piemēram, pieņemsim, ka varat ierakstīt tikai make, tad gaidāt 2629 02:05:54,420 --> 02:05:56,480 uzvedni, pēc tam ierakstāt tās programmas nosaukumu, kuru vēlaties 2630 02:05:56,480 --> 02:05:58,540 izveidot, un pēc tam nospiediet taustiņu Enter. 2631 02:05:58,540 --> 02:06:00,774 Vai vēl ļaunāk, operētājsistēmā Linux, kad jums ir jāmaina 2632 02:06:00,774 --> 02:06:03,008 direktoriji, kā tas varētu būt problēmas iestatīšanas gadījumā, kā 2633 02:06:03,008 --> 02:06:05,242 būtu, ja jums būtu jāievada CD, Enter, tagad ierakstiet mapes 2634 02:06:05,242 --> 02:06:07,476 nosaukumu, kuru vēlaties mainīt, Enter - es domāju, tas tikai 2635 02:06:07,476 --> 02:06:09,710 palēnina dzīvi. 2636 02:06:09,710 --> 02:06:11,470 Un tāpēc tas ātri kļūst kaitinoši. 2637 02:06:11,470 --> 02:06:16,070 Tātad komandrindas argumenti ļauj jums izteikt visu domu uzreiz. 2638 02:06:16,070 --> 02:06:18,200 Tātad, kā es varu to izdarīt? 2639 02:06:18,200 --> 02:06:21,920 Nu, ja es vēlos savā kodā izteikt komandrindas argumentu jēdzienu, es 2640 02:06:21,920 --> 02:06:25,640 varētu darīt kaut ko līdzīgu šim. 2641 02:06:25,640 --> 02:06:30,210 Es pirmo reizi varēju pacelties un atbrīvoties no šī tukšuma, kas 2642 02:06:30,210 --> 02:06:34,780 šodien nozīmē, ka šī programma neizmanto komandrindas argumentus. 2643 02:06:34,780 --> 02:06:37,540 Un es varu to mainīt tieši uz šo. 2644 02:06:37,540 --> 02:06:43,490 Int argc, string argv, ar iekavām. 2645 02:06:43,490 --> 02:06:44,950 Tagad tas ir noslēpumaini, jāatzīst. 2646 02:06:44,950 --> 02:06:46,150 Un ļaujiet man pietuvināt. 2647 02:06:46,150 --> 02:06:49,300 Bet es domāju, ka mēs varbūt tagad varam secināt, kas notiek. 2648 02:06:49,300 --> 02:06:52,610 Ja main tagad nav void kā ievade, kas nozīmē, ka tam nav nepieciešami 2649 02:06:52,610 --> 02:06:55,920 argumenti, protams, spoileris šeit ir tāds, ka tagad main kaut kā 2650 02:06:55,920 --> 02:06:59,230 ņems komandrindas argumentus. 2651 02:06:59,230 --> 02:07:05,180 Vai ir minējumi par to, kas argv ir vai būs? 2652 02:07:05,180 --> 02:07:08,330 Ko tas varētu attēlot? 2653 02:07:08,330 --> 02:07:11,390 Tas ir virkņu masīvs, pareizi, pēc sintakses. 2654 02:07:11,390 --> 02:07:13,223 Jā? 2655 02:07:13,223 --> 02:07:15,480 Mērķauditorija: Visas rakstzīmes tiks izdrukātas. 2656 02:07:15,480 --> 02:07:16,050 DEIVIDS MALANS: Tieši tā. 2657 02:07:16,050 --> 02:07:19,830 Tas būs visas rakstzīmes vai tiešām visi vārdi, ko ierakstāt uzvednē. 2658 02:07:19,830 --> 02:07:21,765 Argc, kā int, kāds minējums? 2659 02:07:24,360 --> 02:07:27,325 Argumentu skaits ir tas, ko tas parasti apzīmē, lai gan tehniski šīs 2660 02:07:27,325 --> 02:07:30,290 lietas varētu saukt jebko. 2661 02:07:30,290 --> 02:07:31,520 Bet tāda ir konvencija. 2662 02:07:31,520 --> 02:07:35,052 Tā kā es iepriekš apgalvoju, ka masīvi neseko savam garumam, ja 2663 02:07:35,052 --> 02:07:38,585 vēlaties uzzināt, cik vārdus cilvēks ierakstīja uzvednē aiz jūsu 2664 02:07:38,585 --> 02:07:42,117 programmas nosaukuma, jums ir jāpasaka ne tikai vārdu masīvs, bet arī 2665 02:07:42,117 --> 02:07:45,650 šī masīva garums. 2666 02:07:45,650 --> 02:07:50,335 Virknes, jūs varat izdomāt strlen izmantošanas garumu, bet nevarat 2667 02:07:50,335 --> 02:07:55,020 noskaidrot virkņu masīva garumu, vārdu kopumu, ko cilvēks ierakstīja. 2668 02:07:55,020 --> 02:07:56,760 Tātad, kā es tagad varu to izmantot? 2669 02:07:56,760 --> 02:07:59,190 Nu, ļaujiet man iet uz priekšu un darīt to. 2670 02:07:59,190 --> 02:08:11,630 "sveiki, %2 /n", pēc tam argv[1]. 2671 02:08:11,630 --> 02:08:14,780 Tātad šī vēl nav mana koda labākā versija, taču tā ir mana pirmā. 2672 02:08:14,780 --> 02:08:21,020 Sveicini, un tagad ļaujiet man darīt ./greet, Deivid visu uzreiz. 2673 02:08:21,020 --> 02:08:23,210 Ienāc, sveiks, Deivid. 2674 02:08:23,210 --> 02:08:25,820 Tagad ļaujiet man to palaist vēlreiz, ./sveicināt, Kārter. 2675 02:08:25,820 --> 02:08:27,620 Ienāc, sveiks, Kārter. 2676 02:08:27,620 --> 02:08:29,975 Tas ir neliels uzlabojums, taču man nav jāgaida, līdz getString liks 2677 02:08:29,975 --> 02:08:32,330 man nospiest taustiņu Enter. 2678 02:08:32,330 --> 02:08:34,370 Tas tikai paātrina lietas, divreiz ātrāk. 2679 02:08:34,370 --> 02:08:36,890 Par vienu komandu mazāk jāievada. 2680 02:08:36,890 --> 02:08:41,390 Bet es apzināti darīju [1], bet 2681 02:08:36,890 --> 02:08:41,390 kāds ir argv sākums? 2682 02:08:41,390 --> 02:08:42,170 Tas būtu [0]. 2683 02:08:42,170 --> 02:08:44,730 Nu, kas tas ir? 2684 02:08:45,780 --> 02:08:48,840 Dažreiz tas ir noderīgi, lai gan pagaidām tā nav. 2685 02:08:48,840 --> 02:08:51,475 Pieņemsim, ka es pārkompilēju savu kodu un palaižu šo programmu 2686 02:08:51,475 --> 02:08:54,110 tagad, sveiciniet Deividu. 2687 02:08:54,110 --> 02:08:58,598 Kāds vēlas uzminēt, kas ir argv[0]? 2688 02:08:58,598 --> 02:08:59,530 Mērķauditorija: [NEdzirdams] 2689 02:08:59,530 --> 02:09:00,220 DEIVIDS MALANS: Saki vēlreiz? 2690 02:09:00,220 --> 02:09:01,230 Mērķauditorija: Sveicināti, sveiki. 2691 02:09:01,230 --> 02:09:04,530 DEIVIDS MALANS: Sveicināties, ieiet, sveiks, ./sveicināt. 2692 02:09:04,530 --> 02:09:14,460 var apskatīt argv[0]. 2693 02:09:14,460 --> 02:09:21,900 lai sāktu aplūkot [1], kas bija 2694 02:09:17,160 --> 02:09:21,900 pirmais vārds pēc programmas nosaukuma. 2695 02:09:21,900 --> 02:09:25,320 dariet to argv[2], 2696 02:09:25,320 --> 02:09:27,690 ļaujiet man pievienot otro %s. 2697 02:09:27,690 --> 02:09:29,550 Ļaujiet man pārkompilēt sveicienu. 2698 02:09:29,550 --> 02:09:33,331 Ļaujiet man darīt ./sveicināt Deividu Malanu, Enter, un arī tas tagad 2699 02:09:33,331 --> 02:09:37,112 darbojas, izmantojot divus vārdus pēc uzvednes. 2700 02:09:37,112 --> 02:09:38,778 Ja es tiešām tagad gribu būt gudrs, es varētu darīt kaut ko līdzīgu 2701 02:09:38,778 --> 02:09:40,445 šim. 2702 02:09:40,445 --> 02:09:44,700 Kā būtu, ja argumentu skaits, AKA 2703 02:09:40,445 --> 02:09:58,440 %s /n un pēc tam argv[1]. 2704 02:09:58,440 --> 02:10:01,327 Citādi, ja cilvēks nenorādīja tieši divus argumentus, programmas 2705 02:10:01,327 --> 02:10:04,215 nosaukumu un savu nosaukumu, vienkārši izdrukāsim noklusējuma 2706 02:10:04,215 --> 02:10:07,102 vērtību, lai netiktu aizmirsts vārds vai nav ierakstīti divi vai trīs 2707 02:10:07,102 --> 02:10:09,990 vārdi. 2708 02:10:09,990 --> 02:10:13,110 Let's just do, sveiki komats pasaule kā noklusējuma. 2709 02:10:13,110 --> 02:10:15,270 Un mēs vienkārši ignorēsim to, ko cilvēks ierakstījis. 2710 02:10:15,270 --> 02:10:18,060 Ja es to pārkompilēšu, izveidoju sveicienu, es varu darīt ./greet un 2711 02:10:18,060 --> 02:10:20,850 vēlreiz Deivids, Enter. 2712 02:10:20,850 --> 02:10:24,840 Atvainojiet, ko es palaidu garām? 2713 02:10:24,840 --> 02:10:26,640 Jā, tik iesācēju kļūda. 2714 02:10:26,640 --> 02:10:30,090 Citādi, labi, sveicini vēlreiz. 2715 02:10:30,090 --> 02:10:34,050 ./sveicināti, Deivid, ienāc, sveiks, Deivid. 2716 02:10:34,050 --> 02:10:35,960 Bet, ja es izlaižu savu vārdu, es vienkārši iegūstu vispārīgo vārdu, 2717 02:10:35,960 --> 02:10:37,870 piemēram, noklusējuma vērtību. 2718 02:10:37,870 --> 02:10:39,730 Un, ja man kļūst mazliet ziņkārīgs un es ierakstu abus vārdus, tad 2719 02:10:39,730 --> 02:10:41,590 arī mani ignorē. 2720 02:10:41,590 --> 02:10:42,090 Kāpēc? 2721 02:10:42,090 --> 02:10:44,880 Jo es vienkārši neesmu izveidojis atbalstu argc of three. 2722 02:10:44,880 --> 02:10:47,805 Es varētu darīt visu, ko vēlos, bet tagad mums ir pieejami šāda veida 2723 02:10:47,805 --> 02:10:50,730 celtniecības bloki. 2724 02:10:50,730 --> 02:10:52,780 Labi, ko es vēl varu šeit darīt? 2725 02:10:52,780 --> 02:10:55,220 Izrādās, ka mums varētu būt dažas pēdējās funkcijas, kas tagad 2726 02:10:55,220 --> 02:10:57,660 jāizpilda. 2727 02:10:57,660 --> 02:11:01,704 Tomēr ņemiet vērā, ka C valodā, neskatoties uz to, ko jūs varētu 2728 02:11:01,704 --> 02:11:05,748 redzēt grāmatās vai tiešsaistes pamācībās, mūsdienās divi oficiālie 2729 02:11:05,748 --> 02:11:09,792 galvenās funkcijas definēšanas formāti ir vai nu šis, ko mēs 2730 02:11:09,792 --> 02:11:13,836 izmantojam jau divas nedēļas vai tagad šis. , jūs maināt tukšumu uz 2731 02:11:13,836 --> 02:11:17,880 int argc un pēc tam pagaidām virkni argv un pēc tam tukšas iekavas. 2732 02:11:17,880 --> 02:11:19,640 Un mēs redzēsim, ka arī tas ir vienkāršojums, daži treniņriteņi, ja 2733 02:11:19,640 --> 02:11:21,400 vēlaties. 2734 02:11:21,400 --> 02:11:24,620 Bet pagaidām šīs ir divas formas, lai gan tiešsaistes pamācībās un 2735 02:11:24,620 --> 02:11:27,840 pat grāmatās redzēsit, daži cilvēki izmanto galveno dažādos veidos. 2736 02:11:27,840 --> 02:11:30,142 Tie ir divi, kas tagad jāpatur prātā. 2737 02:11:30,142 --> 02:11:33,360 Un es atzīmēšu, ka šie komandrindas argumenti ir visur. 2738 02:11:33,360 --> 02:11:35,590 Droši vien negaidīju, ka ieraudzīsim šo vārdu šeit ekrānā. 2739 02:11:35,590 --> 02:11:36,490 Un ko tas nozīmē? 2740 02:11:36,490 --> 02:11:39,185 Nu, izrādās, ka gadu desmitiem ir šī programma, kas ir īpaši aprīkota 2741 02:11:39,185 --> 02:11:41,880 ar Linux sistēmām, ko sauc par cowsay. 2742 02:11:41,880 --> 02:11:42,510 Kāpēc? 2743 02:11:42,510 --> 02:11:45,513 Iespējams, tāpēc, ka kādam kādreiz bija pārāk daudz brīva laika un 2744 02:11:45,513 --> 02:11:48,516 viņš nolēma uzrakstīt programmu, kas no govs, kas tekstuāli pasaka uz 2745 02:11:48,516 --> 02:11:51,520 ekrāna, izveido ASCII mākslu. 2746 02:11:51,520 --> 02:11:53,650 Bet jūs izmantojat cowsay, tikai prieka pēc, komandrindas argumentu 2747 02:11:53,650 --> 02:11:55,780 veidā. 2748 02:11:55,780 --> 02:11:58,776 Tā, piemēram, ļaujiet man ieteikt atgriezties pie VS Code šeit, nevis 2749 02:11:58,776 --> 02:12:01,773 tāpēc, ka vēlos rakstīt kādu kodu, bet es vienkārši vēlos izmantot 2750 02:12:01,773 --> 02:12:04,770 savu termināļa logu. 2751 02:12:04,770 --> 02:12:07,320 Un ļaujiet man palielināt savu termināļa logu šeit. 2752 02:12:07,320 --> 02:12:10,245 Un ļaujiet man ierakstīt kaut ko līdzīgu, kā būtu ar cowsay, space 2753 02:12:10,245 --> 02:12:13,170 moo? 2754 02:12:13,170 --> 02:12:14,822 Tātad cowsa nav programma, kuru es rakstīju. 2755 02:12:14,822 --> 02:12:16,030 Tas pastāv jau vairākus gadu desmitus. 2756 02:12:16,030 --> 02:12:18,870 Bet mēs to instalējām VS Code jums mākonī. 2757 02:12:18,870 --> 02:12:21,330 Tam nepieciešams vismaz viens komandrindas arguments. 2758 02:12:21,330 --> 02:12:23,070 Ko jūs vēlaties, lai govs saka? 2759 02:12:23,070 --> 02:12:26,280 Es varu teikt: “Cowsay moo” un nospiediet taustiņu Enter, un var, ir 2760 02:12:26,280 --> 02:12:29,490 mana ASCII māksla ar govs, kas saka uz ekrāna “moo”. 2761 02:12:29,490 --> 02:12:31,090 Tas var pateikt vairākus vārdus. 2762 02:12:31,090 --> 02:12:33,960 Tāpēc es varu teikt: Sveika, pasaule, ienāc. 2763 02:12:33,960 --> 02:12:35,800 Un tagad tas saka: Sveika, pasaule. 2764 02:12:35,800 --> 02:12:38,135 Tātad šis ir tikai piemērs muļķīgai programmai, kas izmanto 2765 02:12:38,135 --> 02:12:40,470 komandrindas argumentus, taču tai ir nepieciešami arī citi. 2766 02:12:40,470 --> 02:12:45,750 Tāpat kā zvana, izmantojiet šo defises, lai mainītu programmas izvadi. 2767 02:12:45,750 --> 02:12:48,340 Dash kaut ko ir tikai ļoti izplatīta vienošanās ar komandrindas 2768 02:12:48,340 --> 02:12:50,930 argumentiem, ja vēlaties ļoti īsu apzīmējumu kādai opcijai, piemēram, 2769 02:12:50,930 --> 02:12:53,520 izvadei. 2770 02:12:53,520 --> 02:12:56,833 Cowsay valodā es izlasīju dokumentāciju, un izrādās, ka tur ir 2771 02:12:56,833 --> 02:13:00,146 domuzīme f komandrindas arguments, kas ļauj mainīt govs izskatu, ja 2772 02:13:00,146 --> 02:13:03,460 vēlaties. 2773 02:13:03,460 --> 02:13:07,550 Tātad, ja es lietoju cowsay dash f, pīle un pēc tam kādu citu vārdu, 2774 02:13:07,550 --> 02:13:11,640 piemēram, čukst, tā vairs nav govs. 2775 02:13:11,640 --> 02:13:15,850 Šis komandrindas arguments pārvērš to par niecīgu, burvīgu pīli. 2776 02:13:15,850 --> 02:13:18,320 Un visbeidzot, tikai prieka pēc, jo pārāk daudz laika pavadīju 2777 02:13:18,320 --> 02:13:20,790 spēlējoties ar komandrindas argumentiem. 2778 02:13:20,790 --> 02:13:24,350 Cowsay dash f, pūķis, un kā būtu, rawr, Enter, jūs pat varat to iegūt 2779 02:13:24,350 --> 02:13:27,910 ekrānā šeit. 2780 02:13:27,910 --> 02:13:31,070 Tātad arī šis ir tikai piemērs tam, ko varat darīt ar šiem 2781 02:13:31,070 --> 02:13:34,230 komandrindas argumentiem tagad, kad mums ir šis veidošanas bloks. 2782 02:13:34,230 --> 02:13:36,960 Un tagad ir vēl viena lieta, ko mēs varam darīt ar kodu. 2783 02:13:36,960 --> 02:13:40,790 Šodien ir vēl viena funkcija, ko mēs iepazīstināsim, pirms mēs tagad 2784 02:13:40,790 --> 02:13:44,620 savienosim visus šos punktus ar lasāmību un šifrēšanu, runājot par 2785 02:13:44,620 --> 02:13:48,450 to, ko sauc par izejas statusu. 2786 02:13:48,450 --> 02:13:51,720 Izrādās, ka ikreiz, kad jūsu galvenā funkcija iziet, tā atgriež 2787 02:13:51,720 --> 02:13:54,990 slepenu veselu skaitli, ko jūs kā programmētājs vai pieredzējis 2788 02:13:54,990 --> 02:13:58,260 lietotājs varat noskaidrot, kas tas bija. 2789 02:13:58,260 --> 02:14:00,329 Un šie izejas kodi, izejas statusi, parasti tiek izmantoti, lai 2790 02:14:00,329 --> 02:14:02,398 norādītu uz kļūdām. 2791 02:14:02,398 --> 02:14:04,452 Piemēram, ja pēdējo pāris gadu laikā esat izmantojis tālummaiņu un 2792 02:14:04,452 --> 02:14:06,506 kādreiz esat saskāries ar kļūdu, iespējams, esat redzējis šādu 2793 02:14:06,506 --> 02:14:08,560 ekrānu. 2794 02:14:08,560 --> 02:14:10,805 Parasti tas nav tik noderīgi, iespējams, liek noklikšķināt uz Ziņot 2795 02:14:10,805 --> 02:14:13,050 par problēmu vai Sazināties ar atbalsta dienestu. 2796 02:14:13,050 --> 02:14:15,450 Taču ļoti bieži mūsu cilvēku pasaulē Mac datoros, personālajos 2797 02:14:15,450 --> 02:14:17,850 datoros un tālruņos jūs redzat noslēpumainus kļūdu kodus, piemēram, 2798 02:14:17,850 --> 02:14:20,250 burtiski skaitļus, kurus, iespējams, zina tikai Zoom, vai Microsoft 2799 02:14:20,250 --> 02:14:22,650 vai Google, vai kāds cits uzņēmums ir uzrakstījis jūsu izmantoto 2800 02:14:22,650 --> 02:14:25,050 programmatūru. 2801 02:14:25,050 --> 02:14:28,560 Bet šis skaitlis atbilst konkrētai kļūdai, par kuru kāds cilvēks kaut 2802 02:14:28,560 --> 02:14:32,070 kur zina, ka tā var notikt. 2803 02:14:32,070 --> 02:14:35,165 Tie tiek izmantoti līdzīgi, lai gan ar citu nosaukumu, par kuru mēs 2804 02:14:35,165 --> 02:14:38,260 runāsim vēlāk, arī tīmeklī. 2805 02:14:38,260 --> 02:14:41,350 Vai esat kādreiz redzējis šo — varbūt nevis raksturu, bet gan skaitli? 2806 02:14:41,350 --> 02:14:43,485 Tātad, ko nozīmē 404? 2807 02:14:43,485 --> 02:14:44,880 AUDITORIJA: Kļūda. 2808 02:14:44,880 --> 02:14:47,790 DEIVIDS MALANS: Tātad kļūda, jā, bet patiesībā tā nav atrasta. 2809 02:14:47,790 --> 02:14:48,410 Tātad, kāpēc? 2810 02:14:48,410 --> 02:14:49,993 Es domāju, šī ir visslēptākā lieta. 2811 02:14:49,993 --> 02:14:52,562 Un mēs runāsim pēc dažām nedēļām par to, ko nozīmē šis un citi 2812 02:14:52,562 --> 02:14:55,131 skaitļi, taču skaitļi ir mums visapkārt tehnoloģijās, un tie ļoti 2813 02:14:55,131 --> 02:14:57,700 bieži kaut ko nozīmē tehniskajiem cilvēkiem, kuri uzrakstīja 2814 02:14:57,700 --> 02:15:00,270 programmatūru, mazāk tādiem cilvēkiem kā jūs un es. 2815 02:15:00,270 --> 02:15:03,085 Tas, kāpēc tik daudzi no mums atpazīst 404, ir dīvaini, jo tas ir 2816 02:15:03,085 --> 02:15:05,900 pastāvējis pietiekami ilgi, lai mēs visi to zinām. 2817 02:15:05,900 --> 02:15:10,250 Bet tas tiešām ir tikai īpašs skaitlis, kas apzīmē sava veida kļūdu. 2818 02:15:10,250 --> 02:15:12,900 Tātad izrādās, pēdējā lieta, ko mēs šodien atklāsim par to, ko mēs 2819 02:15:12,900 --> 02:15:15,550 divas nedēļas esam uzskatījuši par pašsaprotamu, ir tas, kas ir 2820 02:15:15,550 --> 02:15:18,200 galvenais. 2821 02:15:18,200 --> 02:15:21,440 Mēs redzējām tikai pirms brīža, ka iekavās esošā lieta, kas līdz šim 2822 02:15:21,440 --> 02:15:24,680 ir bijusi nederīga, kas nozīmē, ka nav komandrindas argumentu. 2823 02:15:24,680 --> 02:15:27,185 tagad int argc string argv iekavas nozīmē tikai, jā, komandrindas 2824 02:15:27,185 --> 02:15:29,690 argumentus. 2825 02:15:29,690 --> 02:15:31,290 Un mēs esam redzējuši, kā tiem piekļūt. 2826 02:15:31,290 --> 02:15:34,375 Tātad pēdējais mīklas gabals, godīgi sakot, no visas slepenās 2827 02:15:34,375 --> 02:15:37,460 sintakses pēdējo divu nedēļu laikā, ir tieši tas, ko nozīmē int. 2828 02:15:37,460 --> 02:15:40,310 Int vienmēr ir norādīts galvenajam, un tas norāda, ka galvenais 2829 02:15:40,310 --> 02:15:43,160 vienmēr atgriezīs veselu skaitli, lai gan jūs un es nekad to 2830 02:15:43,160 --> 02:15:46,010 nepārprotami darījām. 2831 02:15:46,010 --> 02:15:50,450 Parasti galvenais pēc noklusējuma atgriež 0. 2832 02:15:46,010 --> 02:15:49,969 Bet būtu dīvaini, ja redzētu kļūdas ziņojumu ar 0, tāpēc 0 ir 2833 02:15:49,969 --> 02:15:53,928 vienkārši paslēpts. 2834 02:15:53,928 --> 02:15:55,470 Jūs to nekad neredzētu ekrānā. 2835 02:15:55,470 --> 02:15:58,670 Bet tas notiek automātiski atkarībā no tā, kā C ir izstrādāts. 2836 02:15:58,670 --> 02:16:01,550 Tāpēc ļaujiet man šeit uzrakstīt vienu pēdējo programmu. 2837 02:16:01,550 --> 02:16:05,750 Es to nosaukšu, piemēram, status.c, lai parādītu šos izejas statusus. 2838 02:16:05,750 --> 02:16:21,350 arguments. int argc, virkne argv[], 2839 02:16:21,350 --> 02:16:23,180 tātad kopēt, ielīmēt. 2840 02:16:23,180 --> 02:16:26,000 Bet tagad darīsim to. 2841 02:16:26,000 --> 02:16:30,780 Ja argc nav vienāds ar -- kāpēc mēs nedarām kaut ko līdzīgu šim? 2842 02:16:30,780 --> 02:16:33,740 Neizmantosim tikai noklusējumu sveiks, pasaule kā pagājušajā reizē. 2843 02:16:33,740 --> 02:16:34,770 Kliedzam uz lietotāju. 2844 02:16:34,770 --> 02:16:37,566 Pieņemsim, ka trūkst komandrindas argumenta, piemēram, printf, lai 2845 02:16:37,566 --> 02:16:40,363 viņi zinātu, ka ir sabojājušies un programma ir jāpalaiž vēlreiz 2846 02:16:40,363 --> 02:16:43,160 pareizi. 2847 02:16:43,160 --> 02:16:56,730 un pēc tam pievienojiet argv[1], tāpēc 2848 02:16:51,320 --> 02:16:56,730 cilvēka vārds no uzvednes. 2849 02:16:56,730 --> 02:17:00,160 Tagad šajā brīdī ļaujiet man iet uz priekšu un palaist statusu 2850 02:17:00,160 --> 02:17:03,590 ./status, un es vispirms neko neievadīšu. 2851 02:17:03,590 --> 02:17:04,700 Uz mani kliedz. 2852 02:17:04,700 --> 02:17:10,170 Šoreiz es to ierakstīšu vēlreiz. 2853 02:17:04,700 --> 02:17:10,170 ./status David, un tas darbojas pareizi. 2854 02:17:10,170 --> 02:17:12,130 Bet tagad ļaujiet man jums parādīt nedaudz slepenu, noslēpumainu 2855 02:17:12,130 --> 02:17:14,090 komandu. 2856 02:17:14,090 --> 02:17:16,415 Varat to ierakstīt pēc uzvednes, un tā ir tikai sakritība, ka ir vēl 2857 02:17:16,415 --> 02:17:18,740 viena dolāra zīme. 2858 02:17:18,740 --> 02:17:22,115 Echo $?, pilnīgi noslēpumains, taču tas ļauj jums redzēt, ar kādu 2859 02:17:22,115 --> 02:17:25,490 izejas statusu jūsu programma ir beigusies. 2860 02:17:25,490 --> 02:17:27,559 Tāpēc ļaujiet man palaist to vēlreiz nepareizā veidā. 2861 02:17:27,559 --> 02:17:31,040 ./status, tiek parādīts kļūdas ziņojums. 2862 02:17:31,040 --> 02:17:32,780 Kas tika slepeni atgriezts? 2863 02:17:32,780 --> 02:17:33,440 Es to neredzu. 2864 02:17:33,440 --> 02:17:37,805 Acīmredzot nav kļūdu ekrāna, taču, ierakstot echo $?, es redzu, ka 2865 02:17:37,805 --> 02:17:42,170 mana programma automātiski pēc noklusējuma atgriež nulli. 2866 02:17:42,170 --> 02:17:45,430 Tomēr, ja es to palaistu vēlreiz pareizi, ./status David, Enter, šī 2867 02:17:45,430 --> 02:17:48,690 ir pareizā versija. 2868 02:17:48,690 --> 02:17:50,629 Bet ja es palaistu echo $? 2869 02:17:50,629 --> 02:17:52,879 statuss, tas joprojām ir ievadīts ar 0. 2870 02:17:52,879 --> 02:17:55,879 Īsāk sakot, šī ir tikai palaist garām iespēja. 2871 02:17:55,879 --> 02:17:59,570 Ja kaut kas noiet greizi, kāpēc es neatgriežu vērtību, kas nav 0? 2872 02:17:59,570 --> 02:18:01,070 0 pēc noklusējuma nozīmē panākumus. 2873 02:18:01,070 --> 02:18:02,690 Un tas vienmēr ir automātiski. 2874 02:18:02,690 --> 02:18:04,940 Bet jūs varat to kontrolēt. 2875 02:18:04,940 --> 02:18:09,905 Šeit es varu ievadīt savu kodu un atgriezt 1, pretējā gadījumā, ja 2876 02:18:09,905 --> 02:18:14,870 kaut kas darbojas labi, pēc noklusējuma varu atgriezt 0. 2877 02:18:11,160 --> 02:18:14,144 Godīgi sakot, ja es izlaižu atgriešanās nulli, atkal automātiski tiek 2878 02:18:14,144 --> 02:18:17,129 atgriezta nulle. 2879 02:18:17,129 --> 02:18:20,719 Tāpēc ļaujiet man būt skaidram, lai es zinātu, kas notiek. 2880 02:18:20,719 --> 02:18:26,360 Atkal izveidojiet statusu, ./status, un darīsim to pareizi ar Deividu. 2881 02:18:26,360 --> 02:18:28,520 Ienāc, sveiks, Deivid. 2882 02:18:28,520 --> 02:18:32,059 Atbalss $?, nulle. 2883 02:18:32,059 --> 02:18:33,270 Tātad viss ir labi. 2884 02:18:33,270 --> 02:18:36,900 Bet tagad, ja es daru ./status un neko, vai vairākas lietas, bet ne 2885 02:18:36,900 --> 02:18:40,530 tikai Deivids, Enter, tiek parādīts kļūdas ziņojums. 2886 02:18:40,530 --> 02:18:45,230 Bet tagad, ja es atbalsoju $?, var, tagad ir viens. 2887 02:18:45,230 --> 02:18:47,330 Tātad, ko tas tagad nozīmē? 2888 02:18:47,330 --> 02:18:49,894 Tas ir, grafiskajā pasaulē mēs vienkārši parādītu kaut ko līdzīgu 2889 02:18:49,894 --> 02:18:52,459 ekrānā, kas ir nedaudz informatīvāks lietotājam. 2890 02:18:52,459 --> 02:18:55,504 Bet pat Linux pasaulē, kur jums nav GUI, noteikti, pat mūsu 2891 02:18:55,504 --> 02:18:58,549 rakstītajām programmām, varat pārbaudīt šos izejas statusus. 2892 02:18:58,549 --> 02:19:01,473 Un patiesībā ērtāki, progresīvāki programmētāji, rakstot kodu, kas 2893 02:19:01,473 --> 02:19:04,397 izsauc programmas, neatkarīgi no tā, vai tas ir cowsay vai jebkas 2894 02:19:04,397 --> 02:19:07,321 cits, jūs varat iekodēt, pārbaudīt, kāds ir programmas izejas 2895 02:19:07,321 --> 02:19:10,245 statuss, un pēc tam izlemt, vai mana programma darbojās vai darīja. 2896 02:19:10,245 --> 02:19:13,170 vai ne? 2897 02:19:13,170 --> 02:19:19,070 Un tagad savienosim pēdējos punktus, pirms pārtraucam augļu uzkodas. 2898 02:19:19,070 --> 02:19:21,930 Kriptogrāfija, proti, viena no šīs nedēļas lietojumprogrammām, ar 2899 02:19:21,930 --> 02:19:24,790 kuru jūs varēsiet nosūtīt slepenus ziņojumus, ja vēlaties, un, vēl 2900 02:19:24,790 --> 02:19:27,650 labāk, atšifrēt slepenās ziņas. 2901 02:19:27,650 --> 02:19:30,845 Tas būs papildus, iespējams, teksta lasāmības analīzei, izmantojot 2902 02:19:30,845 --> 02:19:34,040 heiristiku, kā mēs identificējām otrās klases sākumā. 2903 02:19:34,040 --> 02:19:37,214 Tātad kriptogrāfija ir tikai māksla, zinātne par informācijas 2904 02:19:37,214 --> 02:19:40,388 šifrēšanu, informācijas šifrēšanu, lai, ja jums ir slepens ziņojums, 2905 02:19:40,388 --> 02:19:43,562 kas jānosūta tā sauktajā vienkāršajā tekstā, jūs varat to palaist ar 2906 02:19:43,562 --> 02:19:46,736 kādu algoritmu un pārvērst to par tā saukto šifrētu tekstu, tādējādi 2907 02:19:46,736 --> 02:19:49,910 to šifrējot. . 2908 02:19:49,910 --> 02:19:53,233 Un tikai tas, kurš zina, kādu algoritmu esat izmantojis un kādu 2909 02:19:53,233 --> 02:19:56,556 ievadi esat izmantojis algoritmam, teorētiski var atšifrēt šo procesu 2910 02:19:56,556 --> 02:19:59,880 un pārvērst to atpakaļ sākotnējā ziņojumā. 2911 02:19:59,880 --> 02:20:01,455 Tātad, ja mēs izmantojam mūsu pagājušās nedēļas garīgo modeli, šeit 2912 02:20:01,455 --> 02:20:03,030 ir problēma. 2913 02:20:03,030 --> 02:20:04,910 Šeit ir ievade un izvade. 2914 02:20:04,910 --> 02:20:07,910 Mērķis, ko es šeit apgalvoju, ir paņemt vienkāršu tekstu, piemēram, 2915 02:20:07,910 --> 02:20:10,910 ziņu, kuru vēlaties nosūtīt, un padomāt par skolas gaitu, ja kādreiz 2916 02:20:10,910 --> 02:20:13,910 esat nodevis draugam vai savai simpātijai piezīmi, sakot: Es tevi 2917 02:20:13,910 --> 02:20:16,910 mīlu, ir nedaudz neērti, ja skolotājs vai kāds cits pārtver papīru. 2918 02:20:16,910 --> 02:20:19,490 Un angļu valodā tas vienkārši saka: I love you, vai kas tas ir. 2919 02:20:19,490 --> 02:20:22,350 Būtu jauki, ja jūs to vismaz kaut kādā veidā šifrētu. 2920 02:20:22,350 --> 02:20:25,580 Bet otrai personai ir jāzina, kādu algoritmu jūs izmantojāt un kādus 2921 02:20:25,580 --> 02:20:28,810 ievades datus izmantojat šim algoritmam, lai galu galā viņi varētu 2922 02:20:28,810 --> 02:20:32,040 atšifrēt tā saukto šifrēto tekstu, kas ir izvade. 2923 02:20:32,040 --> 02:20:34,190 Tātad, kas šodien atrodas kastē? 2924 02:20:34,190 --> 02:20:37,970 Algoritmu, kas attiecas uz kriptogrāfiju, sauc par šifru. 2925 02:20:37,970 --> 02:20:40,610 Un šifrs ir izdomāts nosaukums algoritmam, kas šifrē tekstu no 2926 02:20:40,610 --> 02:20:43,250 vienkārša teksta uz šifrētu tekstu. 2927 02:20:43,250 --> 02:20:46,000 Galvenais ir tas, ka ir jābūt ne tikai algoritmam, bet arī tam ir 2928 02:20:46,000 --> 02:20:48,750 jābūt ievadei. 2929 02:20:48,750 --> 02:20:53,090 Un tā, piemēram, jūs varētu šodien pirmo reizi uzzīmēt šādu attēlu. 2930 02:20:53,090 --> 02:20:54,257 Un mēs to esam redzējuši kodā. 2931 02:20:54,257 --> 02:20:57,180 Funkcijām varat dot vairākus ievades datus vai argumentus. 2932 02:20:57,180 --> 02:20:59,845 Tātad, vai varat iedomāties šajā melnajā kastē nosūtīt ziņojumu, kuru 2933 02:20:59,845 --> 02:21:02,510 vēlaties nosūtīt, un pēc tam kādu noslēpumu. 2934 02:21:02,510 --> 02:21:05,110 Piemēram, pieņemsim, ka visvienkāršākā lieta, ko es varētu iedomāties 2935 02:21:05,110 --> 02:21:07,710 bērnībā, bija tā vietā, lai nosūtītu burtu A. Kāpēc es nerakstu burtu 2936 02:21:07,710 --> 02:21:10,310 B? 2937 02:21:10,310 --> 02:21:13,070 Kāpēc es nerakstu C burta vietā? 2938 02:21:13,070 --> 02:21:16,280 Tāpēc es varu pārbīdīt angļu alfabētu par vienu atstarpi. 2939 02:21:16,280 --> 02:21:18,985 Tātad A kļūst par B, B kļūst par C, punkts, punkts, punkts, Z kļūst 2940 02:21:18,985 --> 02:21:21,690 par A. 2941 02:21:18,740 --> 02:21:21,690 Beigās varat aptīties. 2942 02:21:21,690 --> 02:21:24,120 Un pieņemsim, ka šajā stāsta daļā nav pieturzīmju. 2943 02:21:24,120 --> 02:21:28,105 Tātad tas ir ļoti vienkāršs algoritms — pievienojiet vērtību katram 2944 02:21:28,105 --> 02:21:32,090 burtam un nosūtiet vērtību kā šifrētu tekstu. 2945 02:21:32,090 --> 02:21:35,160 Un tagad skolotājam, klasesbiedram, viņiem ir jāzina, ka jūs 2946 02:21:35,160 --> 02:21:38,230 izmantojat, ne tikai šis rotācijas algoritms, kas pazīstams arī kā 2947 02:21:38,230 --> 02:21:41,300 Cēzara šifrs, bet arī jāzina, kādu numuru jūs izmantojat. 2948 02:21:41,300 --> 02:21:45,200 Vai katram burtam pievienojāt 1, katram burtam 2, katram burtam 25? 2949 02:21:45,200 --> 02:21:48,182 Tagad, ja viņi ir ļoti gudri un, iespējams, nav jauni šajā stāstā, 2950 02:21:48,182 --> 02:21:51,165 viņi varētu arī vienkārši izmēģināt visas iespējas. 2951 02:21:51,165 --> 02:21:53,040 Un tas būtu uzbrukums algoritmam. 2952 02:21:53,040 --> 02:21:55,005 Tas nav sarežģīts algoritms, taču ar to pietiek, lai stundā nosūtītu 2953 02:21:55,005 --> 02:21:56,970 ziņojumu. 2954 02:21:56,970 --> 02:21:58,940 Tātad, ja abas ievades tagad ir HI! 2955 02:21:58,940 --> 02:22:02,973 kā vienkāršu īsziņu un 1 kā tā saukto atslēgu — slepeno numuru, ko 2956 02:22:02,973 --> 02:22:07,006 zināt tikai jūs un otra persona, iespējams, varēsit šifrēt ziņojumu 2957 02:22:07,006 --> 02:22:11,040 no viena veida uz otru. 2958 02:22:11,040 --> 02:22:13,400 Un tā šajā gadījumā, piemēram, HI! 2959 02:22:13,400 --> 02:22:16,198 kļūtu par IJ-!. 2960 02:22:16,198 --> 02:22:19,823 Šajā algoritma versijā mēs neuztraucamies ar cipariem vai pieturzīmēm. 2961 02:22:19,823 --> 02:22:21,456 Mēs darbosimies tikai ar burtiem A līdz Z neatkarīgi no tā, vai tie 2962 02:22:21,456 --> 02:22:23,090 ir lielie vai mazie burti. 2963 02:22:23,090 --> 02:22:27,560 Tātad tagad, ja jūs stundā saņemtu lapiņu ar IJ, jūs, saņēmējs, 2964 02:22:27,560 --> 02:22:32,030 zinātu, kas tas ir, ja vien zinātu, ka sūtītājs to izmantoja, jo jūs 2965 02:22:32,030 --> 02:22:36,500 vienkārši apgriežat algoritmu un atņemat vienu. . 2966 02:22:36,500 --> 02:22:38,658 Skolotāj, viņi, iespējams, nezina, ko tas nozīmē, un viņi netērēs 2967 02:22:38,658 --> 02:22:40,816 laiku, lai uzlautu ziņojumu, tāpēc viņiem tas vienkārši šķiet 2968 02:22:40,816 --> 02:22:42,975 apmulsis. 2969 02:22:42,975 --> 02:22:44,600 Un tas ir tas, ko mēs iegūstam no šifrēšanas. 2970 02:22:44,600 --> 02:22:48,650 Kāds, kurš to pārtver klasē vai reālajā pasaulē, internetā vai jebkur 2971 02:22:48,650 --> 02:22:52,700 citur, ideālā gadījumā nevar saprast, ko jūs esat nosūtījis. 2972 02:22:52,700 --> 02:22:54,500 Pretējo, protams, patiešām sauc par atšifrēšanu, taču process ir tāds 2973 02:22:54,500 --> 02:22:56,300 pats. 2974 02:22:56,300 --> 02:22:58,370 Tagad mēs nododam negatīvā 1. 2975 02:22:58,370 --> 02:23:00,300 Un kā ar šo? 2976 02:23:00,300 --> 02:23:02,840 Kāpēc mēs šeit nepabeigsim ar demonstrāciju? 2977 02:23:02,840 --> 02:23:08,360 UIJT XBT DT50 — tur ir mazliet pastāstīts. 2978 02:23:08,360 --> 02:23:11,270 Ja mēs to nododam tālāk un izdarām negatīvu 1, tad kā mēs sākotnēji 2979 02:23:11,270 --> 02:23:14,180 izņemam vienkāršu tekstu? 2980 02:23:14,180 --> 02:23:20,030 Nu, ja tas ir šifrētais teksts un mēs no katra burta atņemam 1, es 2981 02:23:20,030 --> 02:23:25,880 domāju, ka U kļūst par T, es kļūst par H, J kļūst par I, T kļūst par 2982 02:23:25,880 --> 02:23:31,730 S, X kļūst par W, B kļūst par A, T kļūst par S, D kļūst par C, T 2983 02:23:31,730 --> 02:23:37,580 kļūst par S, un tas patiešām bija CS50. 2984 02:23:37,580 --> 02:23:40,250 Paņemiet pīli, dodoties ārā, un uzkodas vestibilā. 2985 02:23:40,250 --> 02:23:42,350 [APLAUSI] 2986 02:23:42,350 --> 02:23:43,850 [FILMAS RITOŠANA] 2987 02:23:43,850 --> 02:23:47,500 [MŪZIKA ATSKAŅOTĀS]