1 00:00:07,360 --> 00:00:09,360 [Powered by Google Translate] Gadewch i ni siarad am araeau. 2 00:00:09,360 --> 00:00:12,780 Felly byddai pam ein bod erioed wedi eisiau defnyddio araeau? 3 00:00:12,780 --> 00:00:17,210 Wel gadewch i ni ddweud eich bod yn cael rhaglen sydd angen i storio 5 IDs myfyrwyr. 4 00:00:17,210 --> 00:00:21,270 Gallai ymddangos yn rhesymol i gael 5 newidyn ar wahân. 5 00:00:21,270 --> 00:00:24,240 Am resymau byddwn yn gweld mewn ychydig, byddwn yn dechrau cyfrif o 0. 6 00:00:24,240 --> 00:00:30,700 Bydd y newidynnau bydd gennym fod id0 int, ID1 int, ac yn y blaen. 7 00:00:30,700 --> 00:00:34,870 Bydd unrhyw rhesymeg rydym am i berfformio ar ID bydd angen i'r myfyriwr eu copïo a gludo 8 00:00:34,870 --> 00:00:36,870 gyfer pob un o'r IDs myfyrwyr. 9 00:00:36,870 --> 00:00:39,710 Os ydym am wirio pa fyfyrwyr fydd yn digwydd i fod yn CS50, 10 00:00:39,710 --> 00:00:43,910 bydd angen inni yn gyntaf i wirio os id0 yn cynrychioli y myfyriwr yn y cwrs. 11 00:00:43,910 --> 00:00:48,070 Yna i wneud yr un peth ar gyfer y myfyriwr nesaf, bydd angen i gopïo a gludo y cod ar gyfer id0 12 00:00:48,070 --> 00:00:54,430 ac amnewid pob digwyddiad o id0 gyda ID1 ac ati ar gyfer ID2, 3, a 4. 13 00:00:54,430 --> 00:00:57,560 >> Cyn gynted ag y byddwch yn clywed bod angen i gopïo a gludo, 14 00:00:57,560 --> 00:01:00,440 dylech ddechrau meddwl bod ateb gwell. 15 00:01:00,440 --> 00:01:05,360 Nawr beth os ydych yn sylweddoli nad oes angen 5 IDs myfyrwyr ond yn hytrach 7? 16 00:01:05,360 --> 00:01:09,570 Mae angen i chi fynd yn ôl i mewn i'ch cod ffynhonnell ac ychwanegu mewn id5, yn id6, 17 00:01:09,570 --> 00:01:14,260 a adysgrifia a bastio y rhesymeg i wirio a yw'r IDs yn perthyn i'r dosbarth ar gyfer y 2 IDs newydd. 18 00:01:14,260 --> 00:01:19,600 Nid oes dim sy'n cysylltu pob un o'r IDs gyda'i gilydd, ac felly nid oes unrhyw ffordd o ofyn 19 00:01:19,600 --> 00:01:22,040 y rhaglen i wneud hyn ar gyfer IDs 0 drwy 6. 20 00:01:22,040 --> 00:01:26,120 Wel nawr eich bod yn sylweddoli eich bod wedi 100 IDs myfyrwyr. 21 00:01:26,120 --> 00:01:30,770 Mae'n dechrau ymddangos yn llai na delfrydol i angen ar wahân ddatgan pob un o'r IDs, 22 00:01:30,770 --> 00:01:33,760 a chopïo a gludo unrhyw resymeg ar gyfer y rhai IDs newydd. 23 00:01:33,760 --> 00:01:38,380 Ond efallai rydym yn benderfynol, ac rydym yn ei wneud ar gyfer pob 100 o fyfyrwyr. 24 00:01:38,380 --> 00:01:42,240 Ond beth os nad ydych yn gwybod faint o fyfyrwyr yno mewn gwirionedd? 25 00:01:42,240 --> 00:01:47,320 Mae yna dim ond rhai myfyrwyr n a'ch rhaglen ofyn i'r defnyddiwr beth yw'r n yn. 26 00:01:47,320 --> 00:01:50,250 Uh oh. Nid yw hyn yn mynd i weithio'n dda iawn. 27 00:01:50,250 --> 00:01:53,820 Eich rhaglen ond yn gweithio am ryw nifer cyson o fyfyrwyr. 28 00:01:53,820 --> 00:01:57,520 >> Datrys yr holl broblemau hyn yw harddwch arrays. 29 00:01:57,520 --> 00:01:59,930 Felly beth yw amrywiaeth? 30 00:01:59,930 --> 00:02:04,480 Mewn rhai ieithoedd rhaglennu gallai fath amrywiaeth yn gallu gwneud ychydig yn fwy, 31 00:02:04,480 --> 00:02:09,960 ond yma byddwn yn canolbwyntio ar y strwythur amrywiaeth data sylfaenol yn union fel y byddwch yn ei weld yn C. 32 00:02:09,960 --> 00:02:14,030 Mae amrywiaeth yn unig yw bloc mawr o gof. Dyna ni. 33 00:02:14,030 --> 00:02:17,770 Pan rydym yn dweud, mae gennym gasgliad o 10 cyfanrifau, yn golygu mai dim ond mae gennym rai bloc 34 00:02:17,770 --> 00:02:20,740 o gof sydd yn ddigon mawr i ddal 10 gyfanrifau ar wahân. 35 00:02:29,930 --> 00:02:33,410 Gan dybio bod cyfanrif yw 4 bytes, mae hyn yn golygu bod amrywiaeth o 10 o gyfanrifau 36 00:02:33,410 --> 00:02:37,180 yn floc di-dor o 40 bytes mewn cof. 37 00:02:42,660 --> 00:02:46,280 Hyd yn oed pan fyddwch yn defnyddio araeau aml-ddimensiwn, ac ni fyddwn yn mynd i mewn i fan hyn, 38 00:02:46,280 --> 00:02:49,200 mae'n dal i fod dim ond bloc mawr o gof. 39 00:02:49,200 --> 00:02:51,840 Mae'r nodiant aml-ddimensiwn yn unig yw hwylustod. 40 00:02:51,840 --> 00:02:55,640 Os oes gennych 3 o 3 amrywiaeth aml-ddimensiwn o gyfanrifau, 41 00:02:55,640 --> 00:03:00,650 yna bydd eich rhaglen mewn gwirionedd dim ond yn trin hyn fel bloc mawr o 36 bytes. 42 00:03:00,650 --> 00:03:05,460 Mae cyfanswm o gyfanrifau yw 3 gwaith 3, ac mae pob cyfanrif yn cymryd fyny 4 bytes. 43 00:03:05,460 --> 00:03:07,750 >> Gadewch i ni edrych ar enghraifft sylfaenol. 44 00:03:07,750 --> 00:03:10,660 Gallwn weld yma 2 ffyrdd gwahanol o araeau datgan. 45 00:03:15,660 --> 00:03:18,580 Bydd rhaid i roi sylwadau 1 ohonynt allan ar gyfer y rhaglen i lunio 46 00:03:18,580 --> 00:03:20,900 ers i ni ddatgan x ddwywaith. 47 00:03:20,900 --> 00:03:25,140 Byddwn yn edrych ar rai o'r gwahaniaethau rhwng y 2 fath o ddatganiadau mewn ychydig. 48 00:03:25,140 --> 00:03:28,560 Mae'r ddau o'r llinellau hyn yn datgan amrywiaeth o N maint, 49 00:03:28,560 --> 00:03:30,740 lle rydym wedi diffinio # N yn 10. 50 00:03:30,740 --> 00:03:34,460 Gallem yr un mor hawdd fod wedi gofyn i'r defnyddiwr am gyfanrif positif 51 00:03:34,460 --> 00:03:37,250 a defnyddio y cyfanrif fel nifer o elfennau yn ein casgliad. 52 00:03:37,250 --> 00:03:41,960 Fel ein myfyrwyr enghraifft ID o'r blaen, mae hyn yn fath o fel datgan 10 yn gyfan gwbl ar wahân 53 00:03:41,960 --> 00:03:49,000 newidynnau dychmygol; x0, x1, x2, ac yn y blaen hyd at XN-1. 54 00:03:57,270 --> 00:04:00,840 Anwybyddu'r llinellau lle rydym yn datgan y casgliad, sylwch ar y cromfachau sgwâr yn gyfan 55 00:04:00,840 --> 00:04:02,090 gyfer y tu mewn i'r dolenni. 56 00:04:02,090 --> 00:04:09,660 Pan fyddwn yn ysgrifennu rhywbeth fel x [3], a 'n annhymerus' jyst darllen fel x braced 3, 57 00:04:09,660 --> 00:04:13,090 y gallwch chi feddwl am y peth hoffi gofyn am x3 dychmygol y. 58 00:04:13,090 --> 00:04:17,519 Hysbysiad nag gydag amrywiaeth o faint, N mae hyn yn golygu mai nifer y tu mewn cromfachau, 59 00:04:17,519 --> 00:04:22,630 y byddwn yn galw y mynegai, gall fod yn unrhyw beth o 0 i N-1, 60 00:04:22,630 --> 00:04:25,660 sef cyfanswm o fynegeion N. 61 00:04:25,660 --> 00:04:28,260 >> I feddwl am sut mae hyn yn gweithio mewn gwirionedd 62 00:04:28,260 --> 00:04:31,260 cofio bod y casgliad yn floc mawr o gof. 63 00:04:31,260 --> 00:04:37,460 Gan dybio bod cyfanrif yw 4 bytes, mae'r x casgliad cyfan yn floc 40 beit o gof. 64 00:04:37,460 --> 00:04:41,360 Felly x0 yn cyfeirio at y 4 cyntaf bytes y bloc. 65 00:04:45,810 --> 00:04:49,230 X [1] yn cyfeirio at y 4 bytes ac yn y blaen. 66 00:04:49,230 --> 00:04:53,760 Mae hyn yn golygu bod y dechrau x yw'r holl raglen erioed mae angen i gadw golwg ar. 67 00:04:55,660 --> 00:04:59,840 Os ydych am ddefnyddio x [400], yna mae'r rhaglen yn gwybod bod hyn yn cyfateb 68 00:04:59,840 --> 00:05:03,460 i ddim ond 1,600 bytes ar ôl dechrau'r x. 69 00:05:03,460 --> 00:05:08,780 Where'd rydym yn cael 1600 bytes o? Dim ond 400 o weithiau 4 bytes y cyfanrif. 70 00:05:08,780 --> 00:05:13,170 >> Cyn symud ymlaen, mae'n bwysig iawn i sylweddoli bod yn C 71 00:05:13,170 --> 00:05:17,080 nad oes gorfodaeth o'r mynegai yr ydym yn eu defnyddio yn y rhesi. 72 00:05:17,080 --> 00:05:23,180 Mae ein bloc mawr yw dim ond 10 cyfanrif hir, ond fydd dim yn gweiddi arnon ni os byddwn yn ysgrifennu x [20] 73 00:05:23,180 --> 00:05:26,060 neu hyd yn oed x [-5]. 74 00:05:26,060 --> 00:05:28,240 Nid yw'r mynegai yw hyd yn oed yn rhaid i fod yn rhif. 75 00:05:28,240 --> 00:05:30,630 Gall fod yn unrhyw fynegiant mympwyol. 76 00:05:30,630 --> 00:05:34,800 Yn y rhaglen rydym yn defnyddio'r i amrywiol o'r er dolen i mynegai i'r casgliad. 77 00:05:34,800 --> 00:05:40,340 Mae hwn yn batrwm cyffredin iawn, dolennu o i = 0 i hyd y rhesi, 78 00:05:40,340 --> 00:05:43,350 ac yna defnyddio'r i fel y mynegai ar gyfer y rhesi. 79 00:05:43,350 --> 00:05:46,160 Yn y ffordd yr ydych yn effeithiol ddolen dros y cyfan amrywiaeth, 80 00:05:46,160 --> 00:05:50,600 a gallwch naill ai aseinio i bob man yn yr amrywiaeth neu ei ddefnyddio ar gyfer rhai cyfrifiad. 81 00:05:50,600 --> 00:05:53,920 >> Yn y cyntaf ar gyfer ddolen, i ddechrau ar 0, 82 00:05:53,920 --> 00:05:58,680 ac felly bydd yn rhoi i'r fan a'r lle 0 yn y array, y gwerth 0 gwaith 2. 83 00:05:58,680 --> 00:06:04,370 Yna i cynyddrannau, ac rydym yn aseinio y fan a'r lle cyntaf yn y casgliad y gwerth 1 waith 2. 84 00:06:04,370 --> 00:06:10,170 Yna, unwaith eto i ychwanegiadau ac yn y blaen hyd nes i ni neilltuo i osod N-1 yn yr amrywiaeth 85 00:06:10,170 --> 00:06:13,370 y gwerth N-1 amser 2. 86 00:06:13,370 --> 00:06:17,810 Felly, rydym wedi creu amrywiaeth gyda'r 10 rhif cyntaf hyd yn oed. 87 00:06:17,810 --> 00:06:21,970 Efallai y byddai eilrifau wedi bod yn enw ychydig yn well ar gyfer y newidyn na x, 88 00:06:21,970 --> 00:06:24,760 ond a fyddai wedi rhoi pethau i ffwrdd. 89 00:06:24,760 --> 00:06:30,210 Yr ail ar gyfer ddolen yna dim ond argraffu'r gwerthoedd yr ydym wedi ei storio eisoes tu mewn y rhesi. 90 00:06:30,210 --> 00:06:33,600 >> Gadewch i ni geisio rhedeg y rhaglen gyda'r ddau fath o ddatganiadau amrywiaeth 91 00:06:33,600 --> 00:06:36,330 ac yn cymryd golwg ar allbwn y rhaglen. 92 00:06:51,450 --> 00:06:57,020 Cyn belled ag y gallwn weld, mae'r rhaglen yn ymddwyn yr un ffordd ar gyfer y ddau fath o ddatganiadau. 93 00:06:57,020 --> 00:07:02,230 Gadewch i ni hefyd edrych ar yr hyn fydd yn digwydd os byddwn yn newid y ddolen gyntaf i beidio aros yn N 94 00:07:02,230 --> 00:07:05,040 ond yn hytrach yn dweud 10,000. 95 00:07:05,040 --> 00:07:07,430 Ffordd y tu hwnt i ddiwedd y rhesi. 96 00:07:14,700 --> 00:07:17,210 Wps. Efallai eich bod wedi gweld hyn o'r blaen. 97 00:07:17,210 --> 00:07:20,440 Mae wall yn golygu bod eich rhaglen wedi chwalu. 98 00:07:20,440 --> 00:07:24,430 Byddwch yn dechrau gweld y rhain pan fyddwch yn cyffwrdd ardaloedd o gof na ddylech fod yn cyffwrdd. 99 00:07:24,430 --> 00:07:27,870 Yma rydym yn cyffwrdd 10,000 o leoedd y tu hwnt i ddechrau x, 100 00:07:27,870 --> 00:07:31,920 sy'n amlwg yn lle mewn cof na ddylem fod yn cyffwrdd. 101 00:07:31,920 --> 00:07:37,690 Felly, mae'r rhan fwyaf ohonom ni fyddai yn ôl pob tebyg yn ddamweiniol yn rhoi 10,000 yn hytrach na N, 102 00:07:37,690 --> 00:07:42,930 ond beth os ydym yn gwneud rhywbeth mwy cynnil fel dweud ysgrifennu yn llai na neu'n hafal i N 103 00:07:42,930 --> 00:07:46,830 yn y cyflwr ddolen ar gyfer yn hytrach na llai na N. 104 00:07:46,830 --> 00:07:50,100 Cofiwch bod amrywiaeth yn unig y mae mynegeion o 0 i N-1, 105 00:07:50,100 --> 00:07:54,510 sy'n golygu bod N mynegai y tu hwnt i ddiwedd y rhesi. 106 00:07:54,510 --> 00:07:58,050 Efallai na fydd y rhaglen damwain yn yr achos hwn, ond mae'n dal i fod yn gamgymeriad. 107 00:07:58,050 --> 00:08:01,950 Mewn gwirionedd, mae hyn gwall mor gyffredin ei fod wedi ei enw ei hun, 108 00:08:01,950 --> 00:08:03,970 oddi ar o 1 gwall. 109 00:08:03,970 --> 00:08:05,970 >> Dyna ni am y pethau sylfaenol. 110 00:08:05,970 --> 00:08:09,960 Felly, beth yw'r prif wahaniaethau rhwng y 2 fath o ddatganiadau amrywiaeth? 111 00:08:09,960 --> 00:08:13,960 Un gwahaniaeth yw lle y mae'r bloc mawr o gof yn mynd. 112 00:08:13,960 --> 00:08:17,660 Yn y datganiad cyntaf, a byddaf yn galw'r math braced-array, 113 00:08:17,660 --> 00:08:20,300 er bod hyn nid yw enw confensiynol, 114 00:08:20,300 --> 00:08:22,480 bydd yn mynd ar y pentwr. 115 00:08:22,480 --> 00:08:27,450 Tra yn yr ail, y byddaf yn galw'r math pwyntydd-array, bydd yn mynd ar y domen. 116 00:08:27,450 --> 00:08:32,480 Mae hyn yn golygu pan fydd y ffurflenni swyddogaeth, bydd yr amrywiaeth braced yn awtomatig yn cael ei deallocated, 117 00:08:32,480 --> 00:08:36,419 tra fel y mae'n rhaid i chi explicitily ffoniwch am ddim ar y casgliad pwyntydd 118 00:08:36,419 --> 00:08:38,010 neu fel arall gennych ollyngiad cof. 119 00:08:38,010 --> 00:08:42,750 Yn ogystal, nid yw'r amrywiaeth braced mewn gwirionedd yn newidyn. 120 00:08:42,750 --> 00:08:45,490 Mae hyn yn bwysig. Mae'n dim ond symbol. 121 00:08:45,490 --> 00:08:49,160 Gallwch chi feddwl am y peth fel gyson bod y casglwr yn dewis ar eich cyfer chi. 122 00:08:49,160 --> 00:08:52,970 Mae hyn yn golygu na allwn wneud rhywbeth fel x + + yn ôl y math braced, 123 00:08:52,970 --> 00:08:56,240 er bod hyn yn hollol ddilys â'r math pwyntydd. 124 00:08:56,240 --> 00:08:58,270 >> Mae'r math pwyntydd yn newidyn. 125 00:08:58,270 --> 00:09:01,510 Ar gyfer y math pwyntydd, mae gennym 2 bloc ar wahân o gof. 126 00:09:01,510 --> 00:09:06,060 Mae'r newidyn x ei hun yn cael ei storio yn y pentwr, ac yn unig yw pwyntydd sengl, 127 00:09:06,060 --> 00:09:08,620 ond mae'r bloc mawr o gof yn cael ei storio ar y domen. 128 00:09:08,620 --> 00:09:11,010 Mae'r x amrywiol ar y simnai yn unig yn storio'r cyfeiriad 129 00:09:11,010 --> 00:09:14,010 y bloc mawr o gof ar y domen. 130 00:09:14,010 --> 00:09:17,370 Un o oblygiadau'r hyn yw gyda maint y gweithredwr. 131 00:09:17,370 --> 00:09:22,480 Os byddwch yn gofyn am y maint y rhesi braced, bydd yn rhoi maint y bloc mawr y cof, 132 00:09:22,480 --> 00:09:24,620 rhywbeth fel 40 bytes, 133 00:09:24,620 --> 00:09:26,920 ond os byddwch yn gofyn am faint y math pwyntydd o amrywiaeth, 134 00:09:26,920 --> 00:09:32,740 bydd yn rhoi maint y newidyn x ei hun, sydd ar yr offer yn debygol o dim ond 4 bytes. 135 00:09:32,740 --> 00:09:36,530 Gan ddefnyddio'r math pwyntydd-array, mae'n amhosibl uniongyrchol ofyn am 136 00:09:36,530 --> 00:09:38,530 maint y bloc mawr o gof. 137 00:09:38,530 --> 00:09:42,530 Nid yw hyn fel arfer yn llawer o gyfyngiad ers i ni anaml iawn am gael y maint 138 00:09:42,530 --> 00:09:46,980 y bloc mawr y cof, a gallwn fel arfer yn cyfrifo os ydym ei angen. 139 00:09:46,980 --> 00:09:51,490 >> Yn olaf, yr amrywiaeth braced yn digwydd i roi i ni gyda shortcut i ymgychwyn arae. 140 00:09:51,490 --> 00:09:56,130 Gadewch i ni weld sut y gallem ysgrifennu'r 10 cyntaf cyfanrifau hyd yn oed ddefnyddio y initilization shortcut. 141 00:10:11,220 --> 00:10:14,470 Gyda'r amrywiaeth pwyntydd, nid oes ffordd o wneud llwybr byr fel hyn. 142 00:10:14,470 --> 00:10:18,120 Mae hyn yn unig cyflwyniad i'r hyn y gallwch ei wneud gyda arrays. 143 00:10:18,120 --> 00:10:20,990 Maent yn arddangos i fyny yn bron pob rhaglen a ysgrifennwch. 144 00:10:20,990 --> 00:10:24,390 Gobeithio y gallwch yn awr weld ffordd well o wneud y myfyriwr IDs enghraifft 145 00:10:24,390 --> 00:10:26,710 o ddechrau'r y fideo. 146 00:10:26,710 --> 00:10:29,960 >> Fy enw i yw Rob Bowden, ac mae hyn yn CS50.