[TÓNLIST spila] DOUG LLOYD: Allt í lagi. Vinna með einn breytur er nokkuð skemmtilegt. En hvað ef við viljum vinna með fullt af breytum, en við viljum ekki að hafa fullt af mismunandi nöfn fljúga um kóða okkar? Í þessu tilfelli, eru fylki fara að koma í raun vel. Fylki eru mjög grundvallaratriði gögn uppbygging fyrir hvaða forritunarmál sem þú vilt nota. Og þeir eru mjög, mjög gagnlegur, sérstaklega, eins og við munum sjá, í CS 50. Við notum fylki til að halda Gildi sömu gögn gerð á samliggjandi stöðum minni. Það er að segja, það er leiðin sem við getum hópur fullt af heiltölur saman minni eða fullt af stöfum eða flýtur í minni raun þétt saman og vinna með þeim án þess að þurfa að gefa hverjum eigin einstakt eitt nafn þess, sem getur fá fyrirferðarmikill eftir smá stund. Nú, ein leið til að analogize fylki er að hugsa um staðbundna færslu skrifstofu fyrir a second. Svo stíga í burtu frá forritun og bara loka augunum og sjón í huga þínum pósthúsið þitt. Venjulega, í flestum færslu skrifstofur, það er stór banki pósthús kassa á vegg. An array er risastór blokk samlægra minni, á sama hátt og tölvupóstur banki í pósthús er stór pláss á vegg pósthúsið. Fylki hefur verið skipt í litla, samur stór blokkir af plássi, sem hver um sig er kallað stak, í á sama hátt og vegg staða skrifstofa hefur verið skipt í litla, samur stór blokkir af plássi, sem við köllum pósthólf. Hver þáttur í fylkinu getur geyma ákveðið magn af gögnum, bara eins og hver pósthús kassi er hægt að halda ákveðna upphæð af pósti. Hvað er hægt að geyma í hvern hluta fylki er breytur í sama gögnum gerð, svo sem int eða char, bara eins og í kassanum pósthúsið þitt þú getur aðeins passa það af svipaðri gerð er, svo sem bréf eða litlum pakka. Loks getum við aðgang hver þáttur array beint vísitala, bara eins og við getum nálgast pósthús okkar kassi með því að vita pósthólfsins númer. Vonandi að hliðstæðan hjálpað þér að komast höfuðið í kringum þá hugmynd fylki eftir analogizing eitthvað annað að þú ert sennilega þegar kunnuglegur með. Í C, þætti array eru verðtryggð byrja frá 0, ekki frá 1. Og þetta er mjög mikilvægt. Og í raun, þetta er ástæðan að við, í CS 50, Og hvers vegna tölva vísindamenn Algengustu mun telja frá 0, er vegna array C er flokkun, sem alltaf byrjar á 0. Svo ef array samanstendur af n þáttum, fyrsti þáttur af því fylki er staðsett við vísinn 0, og síðasta þáttur í array er staðsett við vísinn n mínus 1. Aftur, ef það er n þætti í okkar array, síðasta vísitalan er n mínus 1. Svo ef array okkar hefur 50 þáttum, Fyrsti þátturinn er staðsett á vísitölu 0, og síðast þáttur er staðsett á vísitölu 49. Því miður, eða sem betur fer, eftir sjónarhorni þínu, C er mjög vægari hér. Það mun ekki koma í veg fyrir þig frá fara út af mörk array þinn. Þú gætir nálgast mínus 3 þáttur array þinn eða 59 þáttur array þinn, ef array þinn hefur aðeins 50 þætti. Það mun ekki stöðva program frá samantekt, en á hlaupa tíma, þú gætir fundur a ótti skiptingu kenna ef þú byrjar að fá aðgang minni sem er utan marka hvað spurt program til að gefa þér. Svo ekki vera varkár. Hvað gerir fylki Yfirlýsing líta út? Hvernig eigum við að kóða fylki í tilveru eins og við kóða önnur breytu? Það eru þrír hlutir til fjölda declaration-- gerð, nafn, og stærð. Þetta er mjög svipað og a breyta yfirlýsingu, sem er bara gerð og nafn, stærð hlutinn látinn sérstakt tilfelli fyrir fylki, vegna þess að við erum að fá fullt af þeim á sama tíma. Svo er gerð hvers konar breytu þú vilt hver þáttur í array að vera. Vilt það til fjölda heiltalna? Þá gögn tegund ætti að vera Int. Ert þú vilt það til að vera array af tvíliðaleik eða fljóta? Gögn tegund ætti að vera tvöfaldur eða fljóta. Nafnið er hvað þú vilt hringja array þinn. Hvað viltu að nefna þessa risa Bankinn heiltalna eða fljóta eða stafir eða tvöfaldar, eða hvað hefur þú? Hvað viltu kalla það? Nokkuð sjálf skýringar. Loksins, stærð, sem fer inni hornklofa, er hversu margir þættir sem þú myndir eins array þinn að innihalda. Hversu margir heiltölur viltu? Hversu margir fljóta viltu? Svo til dæmis, int nemenda bekk 40. Þetta segir fylki kallast Student einkunna, sem samanstendur af 40 heiltölur. Nokkuð sjálf skýringar, vona ég. Hér er annað dæmi. Tvöfaldur matseðill verð 8. Þetta skapar fjölbreytta heitir Valmynd verði, sem samanstendur pláss í minni fyrir átta tvíliðaleik. Ef þér finnst um hvert frumefni af fjölda tegund gagna-gerð, svo til dæmis, einn þáttur í fylki af int, á sama hátt þér myndi hugsa um eitthvað annað af taginu int, allt kunnugleg aðgerðir sem við rætt áður í rekstri vídeó vilja skynsamleg. Svo hér, gætum við lýsa fylki af Booleans kallast Truthtable, sem samanstendur af herbergi fyrir 10 Booleans. Og þá bara eins og við gátum bara úthluta gildi að öðrum breytu af tegund Boolean, gætum við sagt eitthvað eins Truthtable hornklofi 2, sem er hvernig við kynna, sem þáttur í sannleikann borð? Þriðji þáttur í borð sannleikur, vegna muna, við erum að telja frá 0. Svo er það hvernig við tilgreina Þriðji þáttur í sannleikann töflunni. Truthtable 2 er ósatt, bara eins og við mátti declare-- eða við gætum framselja, frekar, allir Boolean tegund breytu að vera falskur. Við getum líka notað það í aðstæður. ef (truthtable 7 == satt), sem er að segja, ef áttunda frumefni af Truthtable er satt, kannski viljum við prenta skilaboð til notanda, printf ("TRUE! n") ;. Sem veldur okkur að segja Truthtable 10 jafngildir satt, ekki satt? Jæja, ég get, en það er ansi hættulegt, vegna muna, við höfum fjölda 10 Booleans. Svo hæsta vísitala sem þýðanda hefur gefið okkur er 9. Þetta forrit mun þýða, en ef eitthvað annað í minni er til þar sem við myndum búast Truthtable 10 til að fara, við gætum þjást skiptingu kenna. Við gæti komist upp með það, en almennt, nokkuð hættulegt. Svo það sem ég er að gera hér er löglegt C, en ekki endilega það besta hreyfa. Nú, þegar þú lýsa og frumstilla fylki samtímis, það er reyndar mjög sérstakt setningafræði sem þér Hægt er að nota til að fylla upp array með byrjun gildi þess. Það er hægt að fá fyrirferðarmikill til lýsa fjölda stærð 100, og þá þarf að segja, þáttur 0 jafngildir þetta; þáttur 1 er þetta; þáttur 2 er að. Hvað er málið, ekki satt? Ef það er lítill array, þú gæti gert eitthvað svona. Bool truthtable 3 er opin hrokkið Brace og þá komma aðgreina lista af þáttum sem þú vilt setja í array. Svo loka hrokkið Brace semíkommu. Þetta skapar fjölbreytta stærð þrír heitir Truthtable, með þætti rangar, satt, og satt. Og í raun, instantiation setningafræði sem ég hef hér er nákvæmlega það sama og að gera slíkt hið einstaklingur þáttur setningafræði neðan. Þessar tvær leiðir erfðaskrá myndi nákvæmlega sama fylki. Á sama hátt gætum við árétta yfir alla þá þætti af fjölda með lykkju, sem í Staðreyndin er mjög sterklega mælt með á-heimili æfa. Hvernig finnst þér að búa til fylki 100 heiltölur, þar hvert þáttur í array er vísitölu þess? Svo til dæmis, við höfum fjölbreytta 100 heiltölur, og í fyrsta frumefni, við viljum að setja 0. Í seinni þáttur, viljum við að setja 1. Í þriðja frumefni, við viljum að setja 2; og svo framvegis og svo framvegis. Það er mjög gott á-heimili æfa til að gera það. Hér er það ekki líta eins og of mikið hefur breyst. En eftir því að í milli hornklofum, í þetta sinn, Ég hef reyndar sleppt í númerið. Ef þú ert að nota þetta mjög sérstakt instantiation setningafræði til að búa til array, þú gerir í raun ekki þarf að tilgreina stærð fylkisins fyrirfram. Þýðandinn er sviði nógur að vita að þú raunverulega vilt fjölda stærð 3, vegna þess að þú setur þrjá þætti til hægri á merkið. Ef þú hefðir sett fjögur, það hefði gefið þér truth table af stærð fjórum; og svo framvegis og svo framvegis. Fylki eru ekki bundin við einn vídd, sem er laglegur kaldur. Þú getur raunverulega hafa eins og margir hlið specifiers eins og þú vilt. Svo til dæmis, ef þú vilt búa til stjórnarmaður fyrir leikinn Battleship, sem ef þú einhvern tíma spilað, er leikur sem er spilað með pegs á 10 með 10 rist, þú gætir búið til fylki svona. Þú gætir sagt Bool Battleship hornklofi 10 lokað ferningur krappi veldi krappi 10 lokað ferningur krappi. Og þá getur þú valið að túlka þetta í huga þínum sem 10 um 10 rist á frumum. Nú, í raun, í minni, það er í raun bara áfram 100 frumefni, einn víddar array. Og þetta, í raun, fer fyrir ef þig hafa þrívídd eða fjögur eða fimm. Það í raun bara skiptir margfalda öll indices-- eða allt stærð specifiers-- saman, og þú færð bara einn-víddar array af þeirri stærð. En hvað varðar skipulag og visualization og skynjun mannsins, það geta vera a einhver fjöldi auðveldlega að vinna með rist ef þú ert að vinna á leik eins Tic-Tac-Toe eða Battleship, eða eitthvað svoleiðis. Það er frábær abstrakt, í stað þess að hafa að hugsa um legri-TAC-tá borð sem lína af níu ferninga eða a Battleship borð sem línu af 100 ferninga. A 10 um 10 rist eða þremur með þremur rist er líklega a einhver fjöldi fleiri auðvelt að skynja. Nú, eitthvað virkilega mikilvægt um fylki. Við getum meðhöndla hver einstaklingur þáttur í array sem breytu. Við sáum það ekki fyrr þegar við vorum framselja gildi True ákveðnum Booleans eða prófa þá í conditionals. En við getum ekki meðhöndla Allt Fylki sig sem breytur. Við getum td ekki framselja einn array til annars array með verkefni rekstraraðila. Það er ekki löglegt C. Ef við viljum að fyrir example-- hvað við myndum vera að gera í því dæmi væri að afrita einn array í annað. Ef við viljum gera það, í raun við þarf að nota lykkju til að afrita yfir hver einstaklingur þáttur einn í einu. Ég veit að það er svolítið tímafrekt. Svo til dæmis, ef við hefðum þessar par lína af kóða, myndi þetta virka? Jæja, nei, myndi það ekki, ekki satt? Vegna þess að við erum að reyna að úthluta mat til bar. Það er ekki að fara að vinna, vegna þess að það er fylki, og við lýst bara að það er ekki löglegt C. Þess í stað, ef við viljum afrita innihald matvæla í bar, sem er hvað við erum að reyna að gera hér, þyrfti setningafræði svona. Við höfum fyrir lykkju sem fer frá J er jafnt og 0 allt að 5, og við hækka J á hverjum endurtekning lykkja og úthluta þættir eins og þessi. Þetta myndi leiða til bar einnig að vera einn, tveir, þrír, fjórir, fimm, en við verðum að gera það þetta mjög hægur þáttur-by-þáttur vegur, í stað þess að bara með því að afrita Fylkið. Í öðrum forritun tungumál, fleiri nútíma sjálfur, þú getur í raun að gera bara svo einfalt jafngildir setningafræði. En C, því miður, við erum ekki leyft að gera það. Nú, það er eitt annað sem ég vil nefna um fylki sem geta vera a lítill svolítið erfiður í fyrsta skipti sem þú vinna með þeim. Við ræddum í myndbandi um Variable Gildissvið, að flestir breytur í C, þegar þú kallar þá í aðgerðir, eru settar gildi. Manstu hvað það þýðir að fara eitthvað með gildi? Það þýðir að við erum að gera afrit af breyta sem er verið samþykkt í. The callee virka, virka sem er að fá á breytu, ekki fá breytu sig. Það fær eigin staðbundna þeirra afrit af því að vinna með. Fylki, auðvitað, að gera ekki fylgja þessari reglu. Frekar, það sem við köllum þetta er komið með tilvísun. The callee raun er fá array. Það skiptir ekki fá sitt eigin sveitarfélaga afrit af henni. Og ef þér finnst um það, þetta er skynsamlegt. Ef fylki eru mjög stór, það tekur svo mikinn tíma og fyrirhöfn að gera afrit af fjölda 100 eða 1.000 eða 10.000 þætti, að það er ekki þess virði fyrir a virka til að fá afrit af því, gera sumir vinna með það, og þá bara að gera með copy; það þarf ekki að hafa það hangið lengur. Vegna fylki eru sumir fyrirferðarmikill og fyrirferðarmikill, við fara bara þá með tilvísun. Við treystum bara að virka að, ekki brjóta ekki neitt. Svo það er í raun að fá array. Það skiptir ekki fá sitt eigið eintak af henni. Svo hvað þýðir þetta, þá, þegar callee vinnur þætti array? Hvað gerist? Fyrir nú, munum við gljái yfir hverju nákvæmlega þetta gerist, hvers vegna fylki eru liðin með tilvísun og allt annað er samþykkt af value. En ég lofa þér, við munum aftur og gefa þér svar á því á síðari vídeó. Hér er einn æfing fyrir þig áður en við sett upp hluti á fylki. The búnt af kóða, það er ekki sérstaklega góður stíll, bara að ég ætla að gera það hellir. Það er engar athugasemdir hér, sem er nokkuð slæmt form. En það er bara vegna þess að ég vildi vera fær um að passa allt á skjánum. Efst, getur þú séð að ég hef tveir virka yfirlýsingar fyrir ákveðinn fjölda og setja int. Set array tekur greinilega fylki af fjórum heiltalna sem inntak þess. Og setja INT tekur greinilega eina heiltölu sem inntak hennar. En þau bæði hafa ekki framleiðsla. The framleiðsla, aftur tegund, hver einn er ógilt. Í Main, höfum við par af línum af kóða. Við lýsum heiltala breytu kallað og framselja það gildi 10. Við lýsum fjölda fjórum heiltölur heitir B og úthluta þeim þáttum 0, 1, 2, og 3, í sömu röð. Þá höfum við símtal til að setja int og kalla til að setja fylki. Skilgreiningar á tilteknum array og setja INT eru niðri, neðst. Og svo aftur, spyr ég þig spurningu. Hvað fær prenta út hér í lok Main? Það er útprentun Col. Ég er prenta út tvær heiltölur. Ég er að prenta út innihald A og innihald B hornklofi 0. Gera hlé á vídeó hér og taka eina mínútu. Getur þú reikna út hvað þetta aðgerð mun prenta á endanum? Vonandi, ef þú manst að greinarmun á brottför eftir verðgildi og liggur með tilvísun, þetta Vandamálið var ekki of erfiður fyrir þig. Og svarið sem þú vildi hef fundið er þetta. Ef þú ert ekki viss um hvers vegna það er málið, taka annað, fara aftur, fara yfir það sem ég var bara að ræða um brottför fylki með tilvísun á móti liggur aðrar breytur af verðmæti, og vonandi verður það gert svolítið meira vit. Ég er Doug Lloyd, og þetta er CS50.