[Muzika] DOUG Lloyd: Në rregull. Duke punuar me të vetëm variablave është shumë e bukur. Por, çfarë nëse ne duam të punojmë me një shumë të variablave, por ne nuk duam të kemi një bandë e emra të ndryshëm fluturon rreth kodit tonë? Në këtë rast, vargjeve janë do të vijnë në të vërtetë i dobishëm. Vargjeve janë të dhëna me të vërtetë themelore Struktura për çdo gjuhë programimi që ju do të përdorni. Dhe ata janë me të vërtetë, të vërtetë të dobishme, veçanërisht, si ne do të shohim, në CS 50. Ne përdorim vargjeve për të mbajtur vlerat e të njëjtit lloj e të dhënave në vende fqinje e kujtesës. Kjo do të thotë, kjo është një mënyrë që ne mund të grup një bandë e numrave të plotë së bashku në kujtesës ose një bandë e karaktereve apo gjithandej në kujtesën e vërtetë ngushtë së bashku dhe të punojnë me ta, pa pasur nevojë për të dhënë çdo një emër e veta unike, e cila mund të të rëndë pas një kohë të shkurtër. Tani, një mënyrë për analogji vargjeve është që të mendoj për shkrimin tuaj lokale Zyra për një të dytë. Pra, hap larg nga programimi dhe vetëm të mbyllë sytë tuaj dhe kujtoj në mendjen tuaj zyrën tuaj lokale postare. Zakonisht, në shumicën postin zyrat, ka një bankë të madhe një kuti zyrë postare në mur. Një grup është një bllok gjigand e kujtesës afërt, në të njëjtën mënyrë që një postë bankë në zyrën tuaj postare është një hapësirë ​​të madhe mbi mur i postës. Vargjeve janë ndarë në të vogla, njëlloj blloqe mesme të hapësirës, secila prej të cilave është quajtur një element në në të njëjtën mënyrë që muret e postit Zyra ka qenë i ndarë në të vogla, njëlloj blloqe mesme të hapësirës, që ne e quajmë një kuti PO. Çdo element i vektorit mund ruajtur një sasi të caktuar të të dhënave, ashtu si çdo kuti e postës është në gjendje për të mbajtur një sasi të caktuar të postës. Çfarë mund të ruhen në çdo element të array është variabla e njëjtë të dhënave lloji, të tilla si int ose char, vetëm si në kutinë tuaj postare, ju mund të përshtatet vetëm gjëra i një lloji të ngjashëm, të tilla si letra apo pako të vogla. Së fundi, ne mund të hyni në çdo element të array direkt nga numri indeks, ashtu si ne mund të hyni zyrën tonë postare kuti duke ditur numrin e saj kuti postare. Shpresojmë, kjo analogji ju ndihmon të merrni kokën tuaj rreth idesë së vargjeve sipas analogizing për diçka tjetër se ju jeni me siguri tashmë të njohur me të. Në C, elementet e një grup të futura duke filluar nga 0, jo nga 1. Dhe kjo është me të vërtetë e rëndësishme. Dhe në fakt, kjo është arsyeja pse ne, në CS 50, Dhe pse shkencëtarët kompjuterike shpesh do të numërojnë nga 0, është për shkak të array C indeksimit, që fillon gjithmonë në 0. Pra, nëse një grup përbëhet nga elemente n, elementi i parë i asaj grup është vendosur në faqen 0, dhe Elementi i fundit i vektorit është vendosur në indeksi n minus 1. Përsëri, në qoftë se ka elemente n në tonë array, indeksi fundit është n minus 1. Pra, nëse array jonë ka 50 elemente, të elementi i parë është vendosur në faqen 0, dhe elementi i fundit është vendosur në faqen 49. Për fat të keq, ose për fat të mirë, në varësi perspektivën tuaj, C është shumë i butë këtu. Kjo nuk do të ju ndalojë nga shkon jashtë caqeve të vektorit tuaj. Ju mund të hyni në minus 3 element i vektorit tuaj ose elementi 59 e grup tuaj, nëse array juaj ka vetëm 50 elemente. Kjo nuk do të ndalet programin tuaj nga hartimin, por në kohën e duhur, ju mund të hasni një faji dreaded Segmentimi në qoftë se ju filloni për të hyrë në kujtesën që është jashtë kufijve të asaj keni pyetur programin tuaj për të ju jap. Pra, do të jenë të kujdesshëm. Çfarë e bën një grup Deklarata duken si? Si nuk kemi të kodojnë një grup në ekzistencë si ne kod ndonjë variabël tjetër? Ka tri pjesë për një grup declaration-- një lloj, një emër, dhe një madhësi. Kjo është shumë e ngjashme me një Deklarata e ndryshueshme, e cila është vetëm një lloj dhe një emër, elementi madhësi të qënit rasti i veçantë për një grup, sepse ne jemi duke marrë një bandë e tyre në të njëjtën kohë. Pra, lloji është se çfarë lloj variable ju dua çdo element i vektorit të jetë. A duan atë në një rrjet të integers? Pastaj, lloj të dhënat tuaja duhet të jenë të int. A doni që ajo të jetë një sërë dyshe apo gjithandej? Llojin e të dhënave duhet të jetë të dyfishtë apo noton. Emri është ajo që ju doni të telefononi rrjet tuaj. Çfarë doni të emrit këtij gjiganti banka e integers apo gjithandej apo karaktere ose dyshe, apo çfarëdo keni? Çfarë bëni ju doni të telefononi atë? Shpjegues Pretty vetë. Së fundi, madhësia, e cila shkon brenda kllapave katrore, është se sa shumë elemente që do të si grup tuaj të përmbajnë. Sa integers nuk ju duan? Sa gjithandej doni? Kështu për shembull, int notat e studentëve 40. Kjo deklaron një grup të quajtur Student notat, e cila përbëhet prej 40 numrave të plotë. Shpjegues shumë vetë, unë shpresoj. Ja një shembull tjetër. Çmimet dyfishtë menu 8. Kjo krijon një grup të quajtur Çmimet menu, e cila përbëhet hapësirë ​​në kujtesë për tetë dyshe. Nëse ju mendoni se për çdo element e një grup të tipit të të dhënave tipit, kështu për shembull, një element të vetme një grup i tipit int, në të njëjtën mënyrë ju do të mendojnë për ndonjë tjetër variabël të tipit int, të gjitha operacionet e njohur se ne diskutuar më parë në operacionet video do të kishte kuptim. Kështu që këtu, ne mund të deklarojë një grup i Booleans quajtur Truthtable, e cila përbëhet nga dhomë për 10 Booleans. Dhe pastaj, ashtu si ne mund vetëm të caktojë një vlerë cdonjerit variable tjetër të tipit Boolean, ne mund të themi diçka si Truthtable kllapa katrore 2, e cila është se si ne të tregojnë, cili element i tabelës së vërtetës? Elementi i tretë i Tabela e vërteta, sepse mos harroni, ne jemi duke numëruar nga 0. Pra, kjo është se si ne tregojnë Elementi i tretë i tabelës vërtetës. Truthtable 2 është e barabartë me të rreme, ashtu si ne mund të declare-- ose ne mund të caktojë, në vend, ndonjë Ndryshore boolean tipit të jetë e rreme. Ne gjithashtu mund të përdorin atë në kushte. në qoftë se (== truthtable 7 vërtetë), e cila do të thotë, nëse elementin e tetë i Truthtable është e vërtetë, ndoshta ne duam të shkruar një mesazh për përdoruesit, printf ("TRUE! n") ;. Që na bën të themi Truthtable 10 është e barabartë e vërtetë, e drejtë? E pra, unë mund të, por kjo është goxha i rrezikshëm, sepse mos harroni, ne kemi një rrjet të 10 Booleans. Pra, indeksi më i lartë se përpilues na ka dhënë është 9. Ky program do të përpilojë, por në qoftë se diçka tjetër në kujtesën ekziston ku ne do presin Truthtable 10 për të shkuar, ne mund të vuajnë një defekt segmentimit. Ne mund të merrni larg me atë, por në përgjithësi, mjaft e rrezikshme. Pra, ajo që unë jam duke bërë këtu është C ligjore, por jo domosdoshmërisht veprim të mirë. Tani, kur ju të deklarojë dhe nisja një koleksion të njëjtën kohë, ka në fakt një goxha sintaksë të veçantë që ju mund të përdorin për të mbushur deri array me vlerat e saj fillestare. Ajo mund të merrni rëndë për të deklarojë një grup të madhësisë 100, dhe pastaj duhet të them, element 0 është e barabartë kjo; Elementi 1 është e barabartë kjo; Elementi 2 është e barabartë me atë. Çfarë është pika, e drejtë? Në qoftë se kjo është një grup i vogël, ju mund të bëjë diçka si kjo. Bool truthtable 3 barabartë hapur mbajtëse kaçurrel dhe pastaj presje ndarë listën e elementeve që ju doni të vendosni në rrjet. Pastaj të mbyllë pikëpresje kaçurrel Braçe. Kjo krijon një grup të Madhësia tre quajtur Truthtable, me elemente të rreme, të vërteta, dhe i vërtetë. Dhe në fakt, instantiation Sintaksa kam këtu është të njëjtë si duke bërë të Elementi Sintaksa individuale më poshtë. Këto dy mënyrat e kodim do prodhojnë të njëjtën array saktë. Në mënyrë të ngjashme, ne mund iterate gjatë gjithë elementet e një sërë duke përdorur një lak, të cilat, në fakt, është një rekomandohet fuqimisht në shtëpi stërvitje. Si do ta keni krijuar një rrjet i 100 integers, ku çdo element i vektorit është indeksi i saj? Kështu për shembull, ne kemi një rrjet prej 100 numra te plote, dhe me elementin e parë, ne duam të vënë 0. Në elementin e dytë, ne duam të vënë 1. Në elementin e tretë, ne duam për të vënë 2; dhe kështu me radhë e kështu me radhë. Kjo është një të vërtetë të mirë në shtëpi stërvitje për të bërë këtë. Këtu, kjo nuk duket si shumë ka ndryshuar. Por vini re se në mes të kllapa katrore, këtë herë, Unë e kam lënë pas dore në fakt numrin. Nëse jeni duke përdorur këtë shumë instantiation veçantë Sintaksa për të krijuar një array, ju në fakt nuk e bëni nevojë për të treguar madhësinë e array paraprakisht. Përpiluesi është mjaft i zgjuar që të dini se ju në fakt duan një grup të madhësisë 3, sepse ju vendosni tre elemente në të djathtë e shenjës së barabartë. Në qoftë se ju kishte vënë katër, ai do të ketë ju dhënë një tabelë vërteta e madhësisë katër; dhe kështu me radhë e kështu me radhë. Vargjeve nuk janë të kufizuar në një të vetme dimension, e cila është pretty cool. Ju në fakt mund të ketë sa më shumë specifiers anësore si ju dëshironi. Kështu për shembull, në qoftë se ju doni të krijoni një bord për lojë Battleship, e cila, në qoftë se keni luajtur ndonjëherë, është një lojë që është luajtur me shtylla në 10 nga 10 rrjetit, ju mund të krijojë një grup të tillë. Ju mund të thonë se bool Battleship katror kllapa 10 katror mbyllur kllapa katrore kllapa 10 mbyllur kllapa katrore. Dhe pastaj, ju mund të zgjidhni për të interpretojnë këtë në mendjen tuaj si një 10 nga 10 rrjetë prej qelizave. Tani, në fakt, në kujtesë, ajo me të vërtetë e bën vetëm mbetet një element 100, array vetme dimensionale. Dhe kjo, në fakt, vlen edhe për në qoftë se ju kanë tre dimensione ose katër ose pesë. Ajo me të vërtetë vetëm do të shumohen të gjithë të indices-- ose të gjitha e madhësisë specifiers-- së bashku, dhe ju vetëm merrni një e-dimensionale grup i kësaj madhësie. Por në aspektin e organizimit dhe vizualizimi dhe perceptimi njerëzor, ajo mund të jetë shumë më e lehtë për të punuar me një rrjet në qoftë se ju jeni duke punuar në një lojë si Tic-Tac-shputë apo Battleship, ose diçka të tillë. Kjo është një abstraksion i madh, në vend që të mendojnë për një Tic-TAC-shputë bord si një linjë e nëntë shesheve ose një bord Battleship si një linjë e 100 shesheve. Një 10 nga 10 rrjetit ose tre nga tre rrjetit është ndoshta shumë më të lehtë për të kuptuar. Tani, diçka me të vërtetë e rëndësishme në lidhje vargjeve. Ne mund të trajtojë çdo individ element i vektorit si një variabël. Ne pamë se më herët kur ne ishim caktimin vlera e vërtetë për disa Booleans ose testimin e tyre në conditionals. Por ne nuk mund të trajtojë të tërë vargjeve veten si variabla. Ne nuk mund, për shembull, të caktojë një array në një tjetër grup duke përdorur detyrën operatori. Kjo nuk është C. ligjore Në qoftë se ne duam të, për example-- çfarë ne do të bëjmë në atë shembull do të jenë të kopjoni një grup në një tjetër. Në qoftë se ne duam të bëjmë atë, ne fakt duhet të përdorni një lak të kopjoni mbi çdo element individual në një kohë. Unë e di se është një konsumon pak kohë. Kështu për shembull, nëse do të kishim këto çift i linjave të kodit, do të këtë punë? E pra, jo, ajo nuk do, apo jo? Sepse ne jemi duke u përpjekur të caktojë ushqim për bar. Kjo nuk do të punojë, sepse kjo është një grup, dhe ne vetëm e përshkruar se kjo nuk është C. ligjore Në vend të kësaj, në qoftë se ne duam të kopje përmbajtjen e ushqimit në bar, e cila është ajo që ne jemi duke u përpjekur për të bërë këtu, ne do të duhet një sintaksë si kjo. Ne kemi një për lak që shkon nga J është i barabartë me 0 deri në 5, dhe ne ardhura J në çdo përsëritje e lak dhe elementet Cakto si kjo. Kjo do të rezultojë në bar edhe duke qenë një, dy, tre, kater, pese, por ne duhet të bëjmë atë këtë shumë element-nga-element mënyrë e ngadaltë, në vend të vetëm me kopjimi gjithë array. Në programimin e tjera gjuhë, ato më moderne, ju mund, në fakt, të bëjë vetëm kaq e thjeshtë është e barabartë me sintaksë. Por C, për fat të keq, ne jemi nuk lejohet për të bërë këtë. Tani, ka një tjetër gjë që unë dua të përmend rreth vargjeve që mund të jetë pak pak e ndërlikuar për herë të parë ju punojnë me ta. Ne diskutuam në një video për qëllimin e ndryshueshme, se shumica e variablave në C, kur ju telefononi ata në funksione, janë kaluar nga vlera. A ju kujtohet se çfarë do të thotë për të kaluar diçka me vlerë? Kjo do të thotë që ne jemi duke bërë një kopje të variabël që është duke kaluar në. Funksioni callee, funksioni që është marrja e ndryshueshme, nuk ka marrë ndryshueshme vetë. Ajo merr lokal vet kopje e tij për të punuar me të. Vargjeve, natyrisht, të bëjë nuk e ndjekin këtë rregull. Përkundrazi, ajo që ne e quajmë këtë kalon duke iu referuar. Callee fakt merr array. Ajo nuk merr saj kopje vet lokal të tij. Dhe në qoftë se ju mendoni rreth kjo, kjo ka kuptim. Nëse vargjeve janë me të vërtetë të mëdha, atë merr aq shumë kohë dhe përpjekje për të bërë një kopje të një sërë 100 apo 1000 apo 10.000 elemente, se kjo nuk është e vlefshme për një funksionojë për të marrë një kopje të saj, të bëjë disa punë me të, dhe pastaj vetëm të bëhet me kopje; ajo nuk ka nevojë të ketë ajo lartësi rreth më. Për shkak se vargjeve janë disa rëndë dhe të rëndë, ne vetëm kalojnë duke iu referuar. Ne vetëm besim këtë funksion për të, nuk e thyejnë asgjë. Pra, kjo ka të vërtetë të marrë array. Ajo nuk ka marrë kopjen e vet lokale të saj. Pra, çfarë do të thotë kjo, pastaj, kur callee manipulon elementet e grup? Cfare ndodh? Tani për tani, ne do të komentoj mbi pse pikërisht kjo ndodh, pse vargjeve janë miratuar duke iu referuar dhe çdo gjë tjetër është miratuar nga vlera. Por unë ju premtoj, ne do të kthehen dhe do t'ju japë përgjigje për këtë në një video të mëvonshëm. Këtu është një ushtrim shumë për ju para se të përfundojë gjërat në vargjeve. Bandë e kodit këtu, kjo është nuk është veçanërisht stil të mirë, vetëm Unë do të bëjë atë paralajmërim. Nuk ka komente në këtu, e cila është formë shumë e keqe. Por kjo është vetëm për shkak se kam kërkuar që të jetë në gjendje të përshtaten çdo gjë në ekran. Në krye, ju mund të shihni se unë kam dy deklaratat funksion për të vendosur rrjet dhe të vendosur int. Array set me sa duket merr një koleksion e katër integers si input saj. Dhe grup int me sa duket merr një numër i plotë vetëm si input saj. Por dy prej tyre nuk kanë një dalje. Prodhimi, kthimi lloji, e secili prej tyre është i pavlefshëm. Në Main, ne kemi një disa rreshta të kodit. Ne deklarojmë një variabël integer quajtur një dhe të caktojë atë vlerën 10. Ne shpallim një grup prej katër integers quajtur B dhe cakton elementet 0, 1, 2 dhe 3, respektivisht. Pastaj, ne kemi një telefonatë për të vendosur int dhe një thirrje për të vendosur array. Përkufizimet e array vendosur dhe të vendosur int janë poshtë, në pjesën e poshtme. Dhe kështu, përsëri, unë ju pyesni pyetje. Çfarë merr shtypur këtu në fund të kryesore? Ka një col printuar. Unë jam shtypjen nga dy integers. Unë jam shtypjen nga përmbajtjen e një dhe përmbajtja e B katror kllapa 0. Ndalo video këtu dhe për të marrë një minutë. A mund të kuptoj se çfarë kjo Funksioni do të shtypura në fund? Shpresojmë, nëse ju kujtohet Dallimi në mes të kalojë pranë vlerës dhe duke kaluar duke iu referuar, kjo Problemi nuk ishte shumë i ndërlikuar për ju. Dhe përgjigja ju do të kanë gjetur është kjo. Nëse ju nuk jeni me të vërtetë i sigurt për pse se është rasti, të marrë një të dytë, kthehem, të shqyrtojë atë që unë ishte vetëm diskutuar në lidhje me kalimin vargjeve duke iu referuar, kundrejt kaluar variabla të tjerë nga vlera, dhe me shpresë, se do të bëjë pak më shumë kuptim. Unë jam Doug Lloyd, dhe kjo është CS50.