[Powered by Google Translate] Le të flasim për vargjeve.
Pra, pse do të kemi ndonjëherë të dëshironi të përdorni vargjeve?
E pra, le të thonë se ju keni një program që ka nevojë për të ruajtur 5 studentëve ID.
Kjo mund të duket e arsyeshme të ketë 5 variablat të ndara.
Për arsye ne do të shohim në një grimë, ne do të fillojë numërimi nga 0.
Variablat ne do të kemi do të jetë id0 int, int id1, dhe kështu me radhë.
Çdo logjika ne duam të kryer mbi një ID të studentëve do të duhet të kopjohet dhe të ngjit
për secilin prej këtyre ID studentore.
Nëse ne duam të kontrolloni që studentët të ndodhë të jetë në CS50,
ne do së pari duhet të kontrolloni nëse id0 përfaqëson nxënës në kurs.
Pastaj të bëjë të njëjtën gjë për nxënësit e ardhshëm, ne do të duhet të kopjoni dhe ngjisni kodin për id0
dhe të zëvendësojë të gjitha dukuritë e id0 me id1 dhe kështu me radhë për id2, 3, dhe 4.
>> Sa më shpejt që ju dëgjoni se ne kemi nevojë të kopjoni dhe ngjisni,
ju duhet të fillojnë të mendojnë se ka një zgjidhje më të mirë.
Tani çfarë nëse ti e kupton se ju nuk keni nevojë ID studentore 5 por 7?
Ju duhet të shkoni përsëri në kodin tuaj burim dhe shtoni në një id5, një id6,
dhe kopjoni dhe ngjisni logjikën për të kontrolluar nëse ID i përkasin klasës për këto 2 ID të reja.
Nuk ka asgjë që lidh të gjitha këto së bashku ID, dhe kështu që nuk ka asnjë mënyrë për të kërkuar
programi për të bërë këtë për kartat e identitetit 0 deri 6.
E pra tani ti e kupton se ju keni 100 ID studentore.
Është filluar të duket më pak se ideale për të duhet të deklarojë veçmas secilin nga këto ID,
dhe kopjoni dhe ngjisni ndonjë logjikë për ato ID të reja.
Por ndoshta ne jemi të vendosur, dhe ne bëjmë atë për të gjithë 100 studentët.
Por, çfarë nëse ju nuk e dini se sa nxënës ka në të vërtetë janë?
Nuk janë vetëm disa studentë n dhe programi juaj ka për të kërkuar përdoruesit se çfarë është n.
Uh oh. Kjo nuk do të punojnë shumë mirë.
Programi juaj punon vetëm për një numër të vazhdueshëm të studentëve.
>> Zgjidhja e të gjitha këtyre problemeve është bukuria e vargjeve.
Pra, çfarë është një grup?
Në disa gjuhë programimi një lloj grup mund të jetë në gjendje të bëjë pak më shumë,
por këtu ne do të përqëndrohet në strukturën bazë të të dhënave array ashtu si ju do të shihni atë në C.
Një grup është vetëm një bllok i madh i kujtesës. Kjo ishte.
Kur ne themi se kemi një rrjet të integers 10, që vetëm do të thotë që ne kemi një bllok
e kujtesës që është mjaft e madhe për të mbajtur 10 integers veçantë.
Duke supozuar se një numër i plotë është 4 bytes, kjo do të thotë se një grup i integers 10
është një bllok i vazhdueshëm i 40 bytes në kujtesë.
Edhe kur ju përdorni vargjeve shumëdimensionale, të cilat ne nuk do të shkojnë në këtu,
është ende vetëm një bllok i madh i kujtesës.
Shënimi shumëdimensionale është vetëm një komoditet.
Nëse ju keni një 3 nga 3 grup shumëdimensionale të integers,
atëherë programi juaj do të me të vërtetë vetëm trajtojnë këtë si një bllok i madh i 36 bytes.
Numri i përgjithshëm i integers është 3 herë 3, dhe secila integer merr 4 bytes.
>> Le të marrin një vështrim në një shembull themelor.
Ne mund të shohim këtu 2 mënyrat e ndryshme të vargjeve që deklarojnë.
Ne do të duhet të komentojë 1 prej tyre për programin për të hartuar
pasi ne deklarojë x dy herë.
Ne do të hedhim një vështrim në disa nga dallimet në mes këtyre 2 lloje të deklaratave në një grimë.
Të dyja këto linja të deklarojë një sërë N madhësi,
ku kemi N # define si 10.
Ne mund po aq e lehtë kanë kërkuar përdoruesit për një numër i plotë pozitiv
dhe përdoret si një numër i plotë që numri i elementeve në array tonë.
Ashtu si shembullin tonë ID studentore më parë, kjo është lloj i si shpallja e 10 krejtësisht të veçantë
variablat imagjinare; X0, X1, x2, dhe kështu më lart në Xn-1.
Injorimi linjat ku ne deklarojë koleksion, njoftim kllapa katrore paprekur
brenda për sythe.
Kur kemi shkruar diçka si x [3], të cilën unë vetëm do të lexohet si parantezë x 3,
ju mund të mendoni për atë si të pyesësh për x3 imagjinare.
Vini re se sa me një grup të madhësisë N, kjo do të thotë se numri i brenda kllapa,
të cilat ne do të thërrasë indeksin, mund të jetë çdo gjë nga 0 deri N-1,
cila është një total prej indekseve N.
>> Të mendoni se si kjo punon
mos harroni se array është një bllok i madh i kujtesës.
Duke supozuar se një numër i plotë është 4 bytes, x tërë array është një bllok 40 bajt memorie.
Pra, x0 referohet shumë para 4 bytes e bllokut.
X [1] i referohet të ardhshëm 4 bytes dhe kështu me radhë.
Kjo do të thotë se fillimi i X është mbi të gjitha programi kurrë ka nevojë për të mbajtur gjurmët e.
Nëse ju doni të përdorni x [400], atëherë programi e di se kjo është e barabartë
për vetëm 1,600 bytes pas fillimit të x.
Ku kemi marrë 1600 bytes nga? Kjo është vetëm 400 herë në 4 bytes numër të plotë.
>> Para se të lëvizin, është shumë e rëndësishme të kuptohet se në C
nuk ka zbatimi i indeks që ne përdorim në rrjet.
Bllok ynë i madh është vetëm 10 integers gjatë, por asgjë nuk do të çirrem në ne, nëse kemi shkruar x [20]
apo edhe x [-5].
Indeksi as nuk duhet të jetë një numër.
Ajo mund të jetë çdo shprehje arbitrare.
Në programin ne i përdorim i ndryshueshëm nga lak për të indeksit në rrjet.
Ky është një model shumë i zakonshëm, looping nga i = 0 deri në gjatësinë e vektorit,
dhe pastaj i përdorur si indeks për rrjet.
Në këtë mënyrë ju në mënyrë efektive lak mbi të gjithë grup,
dhe ju ose mund të caktojë në çdo vend, në grup apo e përdorin atë për disa llogaritje.
>> Në rastin e parë për lak, i fillon në 0,
dhe kështu ajo do të caktojë në vend 0 në grup, vlera 0 herë 2.
Pastaj i increments, dhe ne të caktojë vendin e parë në grup vlera 1 herë 2.
Atëherë unë increments përsëri dhe kështu me radhë deri ne caktojë pozitën N-1 në rrjet
vlera N-1 herë 2.
Pra, ne kemi krijuar një koleksion me 10 numrat e parë madje.
Ndoshta evens do të kishte qenë një emër pak më mirë për variablin se x,
por që do të kanë dhënë gjërat larg.
Dytë për lak vetëm atëherë shtyp vlerat që kemi ruajtur tashmë brenda array.
>> Le të provoni drejtimin e programit me të dy llojet e deklaratave array
dhe për të marrë një vështrim në prodhimin e programit.
Aq sa ne mund të shohim, programi sillet në të njëjtën mënyrë për të dy llojet e deklaratave.
Le të marrin një vështrim në çfarë ndodh nëse ne ndryshojmë lak e parë që të mos ndalemi në N
por thonë 10,000.
Rruga pas përfundimit të vektorit.
Oops. Ndoshta ju keni parë këtë më parë.
Një faji segmentimit të thotë programi juaj ka u rrëzua.
Ju filloni duke parë këto kur ju prek fushat e kujtesës që ju nuk duhet të jetë prekur.
Këtu ne jemi të prekur 10.000 vende përtej fillimit të x,
e cila dukshëm është një vend në kujtesë, ne nuk duhet të prekur.
Pra, shumica prej nesh ndoshta nuk do të aksidentalisht vënë në vend të 10.000 N,
por çfarë nëse ne bëjmë diçka shumë delikate si thonë shkruaj pak se ose e barabartë me N
në gjendje për lak në krahasim me më pak se N.
Mos harroni se një grup ka vetëm indekseve nga 0 deri N-1,
që do të thotë se indeksi N është përtej përfundimit të vektorit.
Programi nuk mund të rrëzimit në këtë rast, por është ende një gabim.
Në fakt, ky gabim është aq e zakonshme që ajo ka emrin e vet,
një off nga 1 gabim.
>> Kjo është ajo për bazat.
Pra, çfarë janë dallimet kryesore në mes të 2 llojet e deklaratave array?
Një ndryshim është vendi ku blloku i madh i kujtesës shkon.
Në deklaratën e parë, të cilën unë do të thërrasë llojin kllapa-array,
edhe pse kjo nuk është aspak një emër konvencional,
ajo do të shkojë në rafte.
Ndërsa në të dytin, që unë do të thërrasë llojin pointer-grup, ajo do të shkojë në tog.
Kjo do të thotë se kur kthehet funksion, array kllapa automatikisht do të ç'alokohen,
ndërsa si ju duhet të telefononi explicitily lirë në grup akrep
ose tjetër ju keni një rrjedhje kujtesës.
Përveç kësaj, array kllapa nuk është në fakt një ndryshore.
Kjo është e rëndësishme. Kjo është vetëm një simbol.
Ju mund të mendoni për atë si një konstante që përpiluesi zgjedh për ju.
Kjo do të thotë se ne nuk mund të bëjmë diçka si x + + me llojin kllapa,
edhe pse kjo është krejtësisht e vlefshme me llojin akrep.
>> Lloji akrep është një variabël.
Për llojin akrep, ne kemi 2 blloqe të veçanta të kujtesës.
X ndryshueshme vetë është ruajtur në rafte dhe është vetëm një tregues të vetëm,
por blloku i madh i kujtesës është ruajtur në tog.
X ndryshueshme në rafte vetëm ruan adresë
e bllokut të madh të kujtesës në tog.
Një implikim i kësaj është me madhësinë e operatorit.
Nëse ju pyesni për madhësinë e vektorit parantezë, ai do t'ju japë madhësinë e bllokut të madh të kujtesës,
diçka si 40 bytes,
por në qoftë se ju kërkoni për madhësinë e llojit akrep array së,
ai do t'ju japë përmasat e vetë x ndryshueshme, e cila në zbatim ka të ngjarë vetëm 4 bytes.
Duke përdorur të tipit pointer-array, është e pamundur për të drejtpërdrejt të kërkojë
madhësia e bllokut të madh të kujtesës.
Kjo zakonisht nuk është shumë i një kufizimi që ne duam shumë rrallë madhësinë
nga blloku i madh i memories, dhe ne zakonisht mund të llogarisim se në qoftë se ne kemi nevojë për atë.
>> Së fundi, array kllapa ndodh që të na japin me një shkurtore për fillimin e një sërë.
Le të shohim se si ne mund të shkruaj e para 10 integers madje duke perdoruremailin e initilization shkurtore.
Me grup akrep, nuk është një mënyrë për të bërë një shkurtore si kjo.
Kjo është vetëm një hyrje për atë që ju mund të bëni me vargjeve.
Ata shfaqen në pothuajse çdo program që ju shkruani.
Shpresojmë që ju tani mund të shihni një mënyrë më të mirë për të bërë shembullin e studentëve IDS
nga fillimi i video.
>> Emri im është Rob Bowden, dhe kjo është CS50.