[CHWARAE CERDDORIAETH] DOUG LLOYD: Pob hawl. Gweithio gyda sengl newidynnau yn hwyl 'n bert. Ond beth os ydym am weithio gyda llawer o newidynnau, ond nid ydym am gael criw o enwau gwahanol yn hedfan o gwmpas ein cod? Yn yr achos hwn, araeau yn mynd i ddod i mewn 'n sylweddol' n hylaw. Araeau yn ddata gwirioneddol sylfaenol strwythur ar gyfer unrhyw iaith raglennu y byddwch yn eu defnyddio. Ac maent yn wirioneddol, yn ddefnyddiol iawn, yn enwedig, fel y byddwn yn gweld, yn CS 50. Rydym yn defnyddio araeau i ddal gwerthoedd yr un math data mewn lleoliadau cof cyffiniol. Hynny yw, ei fod yn ffordd y gallwn grŵp criw o gyfanrifau gyda'i gilydd mewn cof neu griw o gymeriadau neu'n arnofio mewn cof n sylweddol agos at ei gilydd ac yn gweithio gyda hwy heb orfod rhoi pob un ei enw unigryw ei hun, a all cael feichus ar ôl ychydig. Yn awr, un ffordd o analogize arrays yw meddwl am eich post lleol swyddfa am eiliad. Felly cam i ffwrdd o raglennu a dim ond caewch eich llygaid a delweddu yn eich meddwl eich swyddfa bost leol. Fel arfer, yn y rhan fwyaf post swyddfeydd, mae 'na fanc mawr blychau swyddfa bost ar y wal. Amrywiaeth yn floc mawr o gof cyffiniol, yr un ffordd ag y mae post banc yn eich swyddfa bost yn lle mawr ar y wal y swyddfa bost. Araeau wedi cael eu rhannu i mewn i bach, yn union blociau o faint o le, Gelwir pob un ohonynt yn elfen, yn yr un ffordd ag y wal y swydd swyddfa wedi ei rhannu i mewn i bach, yn union blociau o faint o le, yr ydym yn galw blwch PO. Mae pob elfen y rhesi yn gallu storio rhywfaint o ddata, yn union fel pob blwch swyddfa'r post yn gallu i ddal rhywfaint o bost. Beth ellir ei storio ym mhob elfen o yr amrywiaeth yn newidynnau o'r un data math, megis int neu torgoch, dim ond fel ym mlwch eich swyddfa bost, gallwch ond cyd-fynd pethau o fath tebyg, megis llythyrau neu becynnau bach. Yn olaf, gallwn gael gafael ar bob elfen o'r yr amrywiaeth yn uniongyrchol gan rif mynegai, yn union fel y gallwn gael mynediad i'n swyddfa bost blwch trwy wybod ei rif blwch post. Gobeithio, bod cyfatebiaeth yn eich helpu i gael eich pen ar y syniad o araeau gan analogizing i rywbeth arall eich bod yn ôl pob tebyg eisoes yn gyfarwydd â. Yn C, yr elfennau o amrywiaeth yn mynegeio gan ddechrau o 0, nid o 1. Ac mae hyn yn wirioneddol bwysig. Ac yn wir, dyma pam yr ydym ni, yn CS 50, a pham y cyfrifiadur gwyddonwyr yn aml fydd yn cyfrif o 0, yw oherwydd amrywiaeth C mynegeio, a oedd bob amser yn dechrau ar 0. Felly os amrywiaeth yn cynnwys elfennau n, elfen gyntaf y array wedi ei lleoli yn mynegai 0, ac yr elfen olaf y rhesi wedi ei leoli yn mynegai n minws 1. Unwaith eto, os oes elfennau n yn ein array, y mynegai ddiwethaf yn n minws 1. Felly, os oes gan ein array 50 elfen, mae'r elfen gyntaf wedi ei lleoli yn mynegai 0, a'r elfen olaf wedi ei leoli yn fynegai 49. Yn anffodus, neu yn ffodus, yn dibynnu ar eich safbwynt, C yn drugarog iawn yma. Ni fydd yn eich atal rhag mynd allan waharddedig o'ch arae. Gallech gael mynediad i'r minws 3 elfen o'ch array neu elfen 59fed eich array, os mai dim ond gan eich array 50 elfen. Ni fydd yn atal eich rhaglen o lunio, ond ar adeg ei redeg, efallai y byddwch yn dod ar draws fai segmentu bondigrybwyll os byddwch yn dechrau cael mynediad cof sydd y tu allan ffiniau'r hyn gwnaethoch ofyn eich rhaglen i roi i chi. Felly byddwch yn ofalus. Beth mae amrywiaeth datganiad yn edrych? Sut ydym ni'n cod amrywiaeth i fodolaeth fel rydym cod unrhyw newidyn arall? Mae tair rhan i'r amrywiaeth declaration-- math, enw, ac o faint. Mae hyn yn debyg iawn i datganiad amrywiol, a oedd yn yn unig yw math a enw, yr elfen maint yn yr achos arbennig dros arae, oherwydd ein bod yn cael criw ohonynt ar yr un amser. Felly y math yw pa fath o newidyn chi am pob elfen y rhesi fod. Peidiwch am iddo amrywiaeth o gyfanrifau? Yna, dylai eich math data fod yn int. Ydych chi am iddo fod yn amrywiaeth o dyblau neu arnofion? Dylai math data fod yn dwbl neu arnofio. Mae'r enw yn yr hyn yr ydych eisiau ffonio eich arae. Beth ydych chi eisiau ei enwi cawr hwn banc o gyfanrifau neu fflotiau neu chars neu yn dyblu, neu beth bynnag sydd gennych? Beth ydych chi am ei alw? Hunanesboniadol Pretty. Yn olaf, maint, sy'n mynd tu mewn cromfachau sgwâr, yw sut llawer o elfennau y byddech fel eich amrywiaeth o gynnwys. Faint o gyfanrifau ydych chi eisiau? Faint o fflotiau ydych chi eisiau? Felly, er enghraifft, int graddau i fyfyrwyr 40. Mae hyn yn datgan amrywiaeth o'r enw Fyfyrwyr graddau, sy'n cynnwys 40 o gyfanrifau. Hunanesboniadol Pretty, yr wyf yn gobeithio. Dyma enghraifft arall. Prisiau dewislen Dwbl 8. Mae hyn yn creu amrywiaeth o'r enw Prisiau Dewislen, sy'n cynnwys o le er cof am wyth dyblau. Os ydych yn meddwl am bob elfen o amrywiaeth o fath data-math, felly er enghraifft, yn elfen unigol o amrywiaeth o'r math int, yr un modd i chi Byddai meddwl am unrhyw un arall amrywiol o fath int, yr holl weithrediadau cyfarwydd ein bod yn a drafodwyd yn flaenorol yn y Gweithrediadau Bydd fideo yn gwneud synnwyr. Felly dyma, gallem ddatgan amrywiaeth o Booleans elwir Truthtable, sy'n cynnwys lle i 10 o Booleans. Ac yna, yn union fel y gallem jyst aseinio gwerth at unrhyw newidyn arall o'r math Boole, gallem ddweud rhywbeth fel Truthtable braced sgwâr 2, a dyna sut yr ydym yn nodi, pa elfen o'r tabl gwir? Y drydedd elfen yn y tabl gwirionedd, gan fod yn cofio, rydym yn cyfrif o 0. Felly dyna sut yr ydym yn dangos yr trydedd elfen o'r tabl gwirionedd. Truthtable 2 yn dychwelyd ffug, yn union fel y gallem declare-- neu gallem neilltuo, yn hytrach, unrhyw Newidyn math Boole bod yn ffug. Gallwn hefyd ddefnyddio mewn amodau. os (truthtable 7 == yn wir), sef ei ddweud, os bydd yr elfen wythfed o Truthtable yn wir, efallai rydym eisiau argraffu neges i'r defnyddiwr, printf ("n WIR!") ;. Mae hynny'n ein peri i ddweud Truthtable 10 yn dychwelyd yn wir, dde? Wel, yr wyf yn gallu, ond mae'n eithaf beryglus, gan fod yn cofio, mae gennym amrywiaeth o 10 o Booleans. Felly mae'r mynegai uchaf y mae'r compiler wedi rhoi i ni yw 9. Bydd y rhaglen hon yn llunio, ond os rhywbeth arall er cof yn bodoli lle byddem yn disgwyl i Truthtable 10 i fynd, gallem ddioddef nam segmentu. Rydym yn Gallai gael i ffwrdd ag ef, ond yn gyffredinol, 'n bert beryglus. Felly, yr hyn yr wyf i'n ei wneud yma yw C cyfreithiol, ond nid o reidrwydd y symud gorau. Nawr, pan fyddwch yn datgan a ymgychwyn amrywiaeth yr un pryd, mae mewn gwirionedd yn 'n bert cystrawen arbennig sy'n eich Gall eu defnyddio i lenwi y rhesi gyda'i werthoedd cychwyn. Gall fynd yn feichus i yn datgan amrywiaeth o faint 100, ac mae'n rhaid wedyn i ddweud, elfen 0 yn dychwelyd hwn; Elfen 1 yn dychwelyd hwn; Elfen 2 yn dychwelyd hynny. Beth yw'r pwynt, dde? Os yw'n amrywiaeth bach, yr ydych Gallai gwneud rhywbeth fel hyn. Bool truthtable 3 yn dychwelyd agored Brace cyrliog ac yna atalnod gwahanu y rhestr o elfennau eich bod am roi yn y rhesi. Yna cau hanner colon Brace cyrliog. Mae hyn yn creu amrywiaeth o Maint y tri enw Truthtable, gydag elfennau ffug, yn wir, ac yn wir. Ac yn wir, y instantiation cystrawen gennyf yma yw yn union yr un fath â gwneud y Elfen cystrawen unigol isod. Mae'r ddwy ffordd o godio fyddai cynhyrchu'r un casgliad union. Yn yr un modd, gallem ailadrodd dros yr holl elfennau o amrywiaeth ddefnyddio dolen, sydd, yn gwirionedd, yn argymhellir yn gryf iawn yn y cartref ymarfer corff. Sut ydych chi'n creu amrywiaeth o 100 o cyfanrifau, lle pob elfen y rhesi yw ei mynegai? Felly, er enghraifft, mae gennym amrywiaeth o 100 cyfanrifau, ac yn yr elfen gyntaf, rydym eisiau rhoi 0. Yn yr ail elfen, rydym eisiau rhoi 1. Yn y drydedd elfen, rydym am i roi 2; ac yn y blaen ac yn y blaen. Mae hynny'n wirioneddol dda yn-y cartref ymarfer corff i wneud hynny. Yma, nid yw'n edrych fel gormod wedi newid. Ond yn sylwi bod mewn rhwng yr cromfachau sgwâr, y tro hwn, Fi 'n weithredol wedi hepgor y rhif. Os ydych yn defnyddio hyn yn iawn instantiation arbennig cystrawen i greu array, rydych nid yn ei wneud Mae angen i ddangos faint y rhesi o flaen llaw. Mae'r compiler yn ddigon craff i wybod bod chi mewn gwirionedd eisiau amrywiaeth o faint 3, oherwydd eich bod yn rhoi tair elfen ar y dde o'r arwydd cyfartal. Os byddwch wedi rhoi pedwar, byddai'n cael Rhoddir tabl gwirionedd o faint pedwar chi; ac yn y blaen ac yn y blaen. Nid yw Araeau yn cael eu cyfyngu i un dimensiwn, sydd yn eithaf oer. Gallwch chi mewn gwirionedd yn cael cymaint o rhagnodwyr ochr fel y dymunwch. Felly er enghraifft, os ydych am greu bwrdd ar gyfer y gêm Llong Ryfel, a oedd, os ydych chi erioed wedi chwarae, yn gêm sy'n chwarae gyda pegiau ar 10 o 10 grid, gallech greu amrywiaeth fel hyn. Fe allech chi ddweud Bool ryfel braced sgwâr 10 ar gau sgwâr braced sgwâr braced 10 gau braced sgwâr. Ac yna, gallwch ddewis dehongli hyn yn eich meddwl fel 10 10 grid o gelloedd. Yn awr, mewn gwirionedd, er cof, mae'n wir yn unig parhau i fod yn elfen 100, amrywiaeth sengl dimensiwn. Ac mae hyn, mewn gwirionedd, yn mynd am os ydych yn wedi tri dimensiwn neu bedwar neu bump. Mae wir yn unig yn lluosi pob un o'r indices-- neu bob un o'r maint specifiers-- gyda'i gilydd, a 'ch jyst cael un-dimensiwn amrywiaeth o'r maint hwnnw. Ond o ran trefniadaeth a delweddu a chanfyddiad dynol, gall fod yn llawer haws i weithio gyda grid os ydych yn gweithio ar gêm fel Tic-tac-blaen neu Llong Ryfel, neu rywbeth fel 'na. Mae'n tynnu mawr, yn lle cael i feddwl am Tic-tac-blaen bwrdd fel llinell o naw sgwariau neu fwrdd Llong Ryfel fel llinell o 100 sgwariau. Mae 10 o 10 grid neu dri gan dri grid yn ôl pob tebyg llawer mwy hawdd i'w gweld. Yn awr, rhywbeth gwirioneddol bwysig am araeau. Gallwn drin pob unigolyn elfen y rhesi fel newidyn. Gwelsom fod cynharach pan oeddem yn aseinio mae'r gwerth Gwir i rai Booleans neu eu profi mewn conditionals. Ond ni allwn drin cyfan Araeau eu hunain fel newidynnau. Ni allwn, er enghraifft, yn aseinio un array i amrywiaeth arall gan ddefnyddio aseiniad gweithredwr. Nid yw'n C. cyfreithiol Os ydym am, er example-- beth byddem yn ei wneud yn yr enghraifft honno fyddai i gopïo un amrywiaeth mewn i un arall. Os ydym am wneud hynny, rydym mewn gwirionedd angen defnyddio dolen i gopïo drosodd bob elfen unigol un ar y tro. Dwi'n gwybod ei fod ychydig cymryd llawer o amser. Felly, er enghraifft, pe bai gennym y cwpl o linellau o god, byddai hyn yn gweithio? Wel, na, na fyddai, dde? Oherwydd ein bod yn ceisio i neilltuo bwyd bar. Dyw hynny ddim yn mynd i weithio, am ei fod yn amrywiaeth, ac yr ydym newydd ei ddisgrifio nad yw hynny'n C. cyfreithiol Yn lle hynny, os ydym am copïo cynnwys y bwyd i mewn i far, sef yr hyn ydym yn ceisio ei wneud yma, byddai angen i cystrawen fel hyn arnom. Mae gennym dros ddolen sy'n mynd o J yn hafal i 0 hyd at 5, ac yr ydym yn cynyddiad J ar bob fersiwn o y ddolen ac elfennau aseinio fel 'na. Byddai hyn yn arwain at bar hefyd bod yn un, dau, tri, pedwar, pump, ond mae'n rhaid i wneud ei hyn iawn ffordd araf elfen-wrth-elfen, yn hytrach na gan ddim ond copïo yr amrywiaeth cyfan. Mewn rhaglenni eraill ieithoedd, rhai mwy modern, gallwch chi, mewn gwirionedd, yn gwneud dim ond mor syml â hynny hafal cystrawen. Ond yn C, yn anffodus, rydym yn Ni chaniateir i wneud hynny. Yn awr, mae un arall beth yr wyf am sôn am am araeau a all fod ychydig ychydig yn anodd y tro cyntaf y byddwch yn gweithio gyda nhw. Buom yn trafod mewn fideo am cwmpas amrywiol, bod y rhan fwyaf newidynnau yn C, pan fyddwch yn ffonio iddynt mewn swyddogaethau, yn cael eu pasio gan werth. Ydych chi'n cofio beth mae'n ei olygu i basio rhywbeth yn ôl gwerth? Mae'n golygu ein bod yn gwneud copi o'r newidyn sy'n cael ei basio i mewn. Mae'r swyddogaeth callee, y swyddogaeth sy'n derbyn y newidyn, nid yw'n cael y newidyn ei hun. Mae'n cael ei lleol eu hunain copi ohono i weithio gyda nhw. Araeau, wrth gwrs, yn gwneud Nid yw dilyn y rheol hon. Yn hytrach, yr hyn yr ydym yn galw hyn yn mynd heibio drwy gyfeirio. Mae'r callee mewn gwirionedd yn derbyn y rhesi. Nid yw'n cael ei copi lleol eu hunain ohono. Ac os ydych yn meddwl am hynny, mae hyn yn gwneud synnwyr. Os araeau yn wirioneddol fawr, mae'n yn cymryd cymaint o amser ac ymdrech i wneud copi o amrywiaeth o 100 neu 1,000 neu 10,000 o elfennau, nad yw'n werth ei gyfer swyddogaeth i dderbyn copi ohono, wneud rhywfaint o waith gydag ef, ac yna dim ond yn cael ei wneud gyda'r copi; Nid oes angen iddo gael mae'n hongian o gwmpas anymore. Oherwydd bod araeau rai swmpus ac yn feichus, rydym yn unig yn eu pasio drwy gyfeirio. Rydym yn unig yn ymddiried yn y swyddogaeth honno i, nid yn torri unrhyw beth. Felly yw'n mewn gwirionedd yn cael y rhesi. Nid yw'n cael ei chopi lleol eu hunain ohono. Felly beth mae hyn yn ei olygu, Yna, pan fydd y callee yn trin elfennau o'r arae? Beth sy'n Digwydd? Am y tro, byddwn yn sglein dros pam yn union mae hyn digwydd, pam araeau yn cael eu trosglwyddo trwy gyfeirio a phopeth arall yn cael ei basio yn ôl gwerth. Ond yr wyf yn addo i chi, byddwn yn dychwelyd a rhoi'r ateb i chi at hyn mewn fideo diweddarach. Dyma un ymarfer mwy i chi cyn i ni lapio fyny pethau ar araeau. Mae criw o cod yma, dyna Nid yw yn arbennig o arddull da, dim ond byddaf yn gwneud hynny cafeat. Does dim sylwadau yn fan hyn, sydd yn ffurf eithaf gwael. Ond dim ond am fy mod i eisiau bod gallu ffitio popeth ar y sgrin. Ar y brig, gallwch weld bod gen i dau ddatganiad swyddogaeth ar gyfer amrywiaeth penodol a gosod int. Array Set ôl pob golwg yn cymryd amrywiaeth o bedwar gyfanrifau fel ei fewnbwn. Ac int set yn ôl pob golwg yn cymryd cyfanrif unigol fel ei fewnbwn. Ond nid oes rhaid i allbwn ddau ohonynt. Mae'r allbwn, y ffurflen teipio, bob un yn ddi-rym. Yn Main, mae gennym cwpl o linellau o god. Rydym yn datgan newidyn cyfanrif Gelwir a benodi ei werth 10. Rydym yn datgan amrywiaeth o bedwar gyfanrifau Gelwir B ac aseinio'r elfennau 0, 1, 2, a 3, yn y drefn honno. Yna, mae gennym galwad i osod int a galwad i osod amrywiaeth. Mae diffiniadau o amrywiaeth set a set int i lawr isod, ar y gwaelod. Ac felly, unwaith eto, yr wyf yn gofyn y cwestiwn i chi. Hyn sy'n cael ei argraffu yma ar ddiwedd Main? Mae 'na col allbrint. Rwy'n argraffu dau rif cyfan. Dw i'n argraffu'r cynnwys A ac cynnwys y B braced sgwâr 0. Oedi y fideo yma ac gymryd munud. Allwch chi chyfrif i maes beth mae hyn Bydd swyddogaeth argraffu ar y diwedd? Gobeithio, os ydych yn cofio y gwahaniaethu rhwng pasio yn ôl gwerth ac yn pasio drwy gyfeirio, mae hyn yn Nid problem yn rhy anodd i chi. A'r ateb y byddech wedi dod o hyd yn hyn. Os nad ydych yn siŵr ynglŷn â pam yw hynny'n wir, gymryd ail, mynd yn ôl, yn adolygu'r hyn yr wyf yn unig oedd trafod am pasio araeau drwy gyfeirio, yn erbyn pasio newidynnau eraill yn ôl gwerth, a gobeithio, bydd yn gwneud ychydig bach mwy o synnwyr. Rwy'n Doug Lloyd, ac mae hyn yn CS50.