ßçûê Ñè - ðóêîâîäñòâî äëÿ íà÷èíàþùèõ.
ÌÀÑÑÈÂÛ
Âû óæå çíàåòå, ÷òî ìàññèâ ïðåäñòàâëÿåò ñîáîé ãðóïïó ýëåìåíòîâ îäíîãî òèïà. Êîãäà íàì òðåáóåòñÿ äëÿ ðàáîòû ìàññèâ, ìû ñîîáùàåì îá ýòîì êîìïèëÿòîðó ïðè ïîìîùè îïåðàòîðîâ îïèñàíèÿ. Äëÿ ñîçäàíèÿ ìàññèâà êîìïèëÿòîðó íåîáõîäèìî çíàòü òèï äàííûõ è òðåáóåìûé êëàññ ïàìÿòè, ò. å. òî æå ñàìîå, ÷òî è äëÿ ïðîñòîé ïåðåìåííîé (íàçûâàåìîé "ñêàëÿðíîé"). Êðîìå òîãî, äîëæíî áûòü èçâåñòíî, ñêîëüêî ýëåìåíòîâ èìååò ìàññèâ. Ìàññèâû ìîãóò èìåòü òå æå òèïû äàííûõ è êëàññû ïàìÿòè, ÷òî è ïðîñòûå ïåðåìåííûå, è ê íèì ïðèìåíèì òîò æå ïðèíöèï óìîë÷àíèÿ. Ðàññìîòðèì ïðèìåðû, ðàçëè÷íûõ îïèñàíèé ìàññèâîâ:
/* íåñêîëüêî îïèñàíèé ìàññèâîâ */
Int temp[365]; /* âíåøíèé ìàññèâ èç 365 öåëûõ ÷èñåë */
Main( ).
{
Float rain[365]; /* àâòîìàòè÷åñêèé ìàññèâ èç 365 ÷èñåë òèïà.
Float */
Static char code[12]; /* ñòàòè÷åñêèé ìàññèâ èç 12 ñèìâîëîâ */
Extern temp[ ]; /* âíåøíèé ìàññèâ; ðàçìåð óêàçàí âûøå */
}
Êàê óæå óïîìèíàëîñü, êâàäðàòíûå ñêîáêè ([ ]) ãîâîðÿò î òîì, ÷òî temp è âñå îñòàëüíûå èäåíòèôèêàòîðû ÿâëÿþòñÿ èìåíàìè ìàññèâîâ, à ÷èñëî, çàêëþ÷åííîå â ñêîáêè, óêàçûâàåò êîëè÷åñòâî ýëåìåíòîâ ìàññèâà. Îòäåëüíûé ýëåìåíò ìàññèâà îïðåäåëÿåòñÿ ïðè ïîìîùè åãî íîìåðà, íàçûâàåìîãî òàêæå èíäåêñîì. Íóìåðàöèÿ ýëåìåíòîâ íà÷èíàåòñÿ ñ íóëÿ, ïîýòîìó temp[0] ÿâëÿåòñÿ ïåðâûì, à temp[364] ïîñëåäíèì 365-ýëåìåíòîì ìàññèâà temp. Íî âñå ýòî âàì óæå äîëæíî áûòü èçâåñòíî, ïîýòîìó èçó÷èì ÷òî-íèáóäü íîâîå.
Èíèöèàëèçàöèÿ ìàññèâîâ è êëàññû ïàìÿòè.
Äëÿ õðàíåíèÿ äàííûõ, íåîáõîäèìûõ ïðîãðàììå, ÷àñòî èñïîëüçóþò ìàññèâû. Íàïðèìåð, â ìàññèâå èç 12 ýëåìåíòîâ ìîæíî õðàíèòü èíôîðìàöèþ î êîëè÷åñòâå äíåé êàæäîãî ìåñÿöà.  ïîäîáíûõ ñëó÷àÿõ æåëàòåëüíî èìåòü óäîáíûé ñïîñîá èíèöèàëèçàöèè ìàññèâà ïåðåä íà÷àëîì ðàáîòû ïðîãðàììû. Òàêàÿ âîçìîæíîñòü, âîîáùå ãîâîðÿ, ñóùåñòâóåò, íî òîëüêî äëÿ ñòàòè÷åñêîé è âíåøíåé ïàìÿòè. Äàâàéòå ïîñìîòðèì, êàê îíà èñïîëüçóåòñÿ.
Ìû çíàåì, ÷òî ñêàëÿðíûå ïåðåìåííûå ìîæíî èíèöèàëèçèðîâàòü â îïèñàíèè òèïà ïðè ïîìîùè òàêèõ âûðàæåíèé, êàê, íàïðèìåð:
Int fix = 1;
Float flàõ = PI*2;
Ïðè ýòîì ïðåäïîëàãàåòñÿ, ÷òî PI - ðàíåå ââåäåííîå ìàêðîîïðåäåëåíèå. Ìîæåì ëè ìû äåëàòü ÷òî-ëèáî ïîäîáíîå ñ ìàññèâîì? Îòâåò íå îäíîçíà÷åí: è äà, è íåò.
Âíåøíèå è ñòàòè÷åñêèå ìàññèâû ìîæíî èíèöèàëèçèðîâàòü.
Àâòîìàòè÷åñêèå è ðåãèñòðîâûå ìàññèâû èíèöèàëèçèðîâàòü íåëüçÿ.
Ïðåæäå ÷åì ïîïûòàòüñÿ èíèöèàëèçèðîâàòü ìàññèâ, äàâàéòå ïîñìîòðèì, ÷òî òàì íàõîäèòñÿ, åñëè ìû â íåãî íè÷åãî íå çàïèñàëè.
/* ïðîâåðêà ñîäåðæèìîãî ìàññèâà */
Main( ) {
Int fuzzy[2]; /*àâòîìàòè÷åñêèé ìàññèâ */
Static int wuzzy[2]; /* ñòàòè÷åñêèé ìàññèâ */
Printf("%d %d\n", fuzzy[1], wuzzy[1];
}
Ïðîãðàììà íàïå÷àòàåò.
525 0.
Ïîëó÷åííûé ðåçóëüòàò èëëþñòðèðóåò ñëåäóþùåå ïðàâèëî:
Åñëè íè÷åãî íå çàñûëàòü â ìàññèâ ïåðåä íà÷àëîì ðàáîòû ñ íèì, òî âíåøíèå è ñòàòè÷åñêèå ìàññèâû èíèöèàëèçèðóþòñÿ íóëåì, à àâòîìàòè÷åñêèå è ñòàòè÷åñêèå ìàññèâû ñîäåðæàò êàêîé-òî "ìóñîð", îñòàâøèéñÿ â ýòîé ÷àñòÿ ïàìÿòè.
Ïðåêðàñíî! Òåïåðü ìû çíàåì, ÷òî íóæíî ïðåäïðèíÿòü äëÿ îáíóëåíèÿ ñòàòè÷åñêîãî èëè âíåøíåãî ìàññèâà - ïðîñòî íè÷åãî íå äåëàòü. Íî êàê áûòü, åñëè íàì íóæíû íåêîòîðûå çíà÷åíèÿ, îòëè÷íûå îò íóëÿ, íàïðèìåð êîëè÷åñòâî äíåé â êàæäîì ìåñÿöå.  ýòîì ñëó÷àå ìû ìîæåì äåëàòü òàê:
/* äíè ìåñÿöà */
Int days[12]=[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
Main( ).
{
Int index;
Extern int days[ ]; /* íåîáÿçàòåëüíîå îïèñàíèå */
For(index = 0; index < 12; index++).
Printf(" Ìåñÿö %d èìååò %d äíåé.\n", index + 1, days[index]);
}
Ðåçóëüòàò:
Ìåñÿö 1 èìååò 31 äíåé. Ìåñÿö 2 èìååò 28 äíåé. Ìåñÿö 3 èìååò 31 äíåé.
Ìåñÿö 4 èìååò 30 äíåé. Ìåñÿö 5 èìååò 31 äíåé. Ìåñÿö 6 èìååò 30 äíåé.
Ìåñÿö 7 èìååò 31 äíåé. Ìåñÿö 8 èìååò 31 äíåé. Ìåñÿö 9 èìååò 30 äíåé.
Ìåñÿö 10 èìååò 31 äíåé. Ìåñÿö 11 èìååò 30 äíåé. Ìåñÿö 12 èìååò 31 äíåé.
Ïðîãðàììà íå ñîâñåì êîððåêòíà, ïîñêîëüêó îíà âûäàåò íåïðàâèëüíûé ðåçóëüòàò äëÿ âòîðîãî ìåñÿöà êàæäîãî ÷åòâåðòîãî ãîäà.
Îïðåäåëèâ ìàññèâ days[ ] âíå òåëà ôóíêöèè, ìû òåì ñàìûì ñäåëàëè åãî âíåøíèì. Ìû èíèöèèðîâàëè åãî ñïèñêîì, çàêëþ÷åííûì â ñêîáêè, èñïîëüçóÿ ïðè ýòîì çàïÿòûå äëÿ ðàçäåëåíèÿ ýëåìåíòîâ ñïèñêà.
Êîëè÷åñòâî ýëåìåíòîâ â ñïèñêå äîëæíî ñîîòâåòñòâîâàòü ðàçìåðó ìàññèâà. À ÷òî áóäåò, åñëè ìû îøèáëèñü â ïîäñ÷åòå? Ïîïðîáóéòå ïåðåïèñàòü ïîñëåäíèé ïðèìåð, èñïîëüçóÿ ñïèñîê, êîòîðûé êîðî÷å, ÷åì íóæíî (íà äâà ýëåìåíòà):
/* äíè ìåñÿöà */
Int days[12]=[31, 28, 31, 30, 31, 30, 31, 31, 30, 31];
Main( ).
{
Int index;
Extern int days[ ]; /* íåîáÿçàòåëüíîå îïèñàíèå */
For(index = 0; index < 12; index++).
Printf(" Ìåñÿö %d èìååò %d äíåé.\n", index + 1, days[index]);
}
 ýòîì ñëó÷àå ðåçóëüòàò îêàçûâàåòñÿ èíûì:
Ìåñÿö 1 èìååò 31 äíåé.
Ìåñÿö 2 èìååò 28 äíåé.
Ìåñÿö 3 èìååò 31 äíåé.
Ìåñÿö 4 èìååò 30 äíåé.
Ìåñÿö 5 èìååò 31 äíåé.
Ìåñÿö 6 èìååò 30 äíåé.
Ìåñÿö 7 èìååò 31 äíåé.
Ìåñÿö 8 èìååò 31 äíåé.
Ìåñÿö 9 èìååò 30 äíåé.
Ìåñÿö 10 èìååò 31 äíåé.
Ìåñÿö 11 èìååò 0 äíåé.
Ìåñÿö 12 èìååò 0 äíåé.
Ìîæíî âèäåòü, ÷òî ó êîìïèëÿòîðà íå âîçíèêëî íèêàêèõ ïðîáëåì: ïðîñòî êîãäà îí èñ÷åðïàë âåñü ñïèñîê ñ èñõîäíûìè äàííûìè, òî ñòàë ïðèñâàèâàòü âñåì îñòàëüíûì ýëåìåíòàì ìàññèâà íóëåâûå çíà÷åíèÿ.
Îäíàêî â ñëó÷àå èçëèøíå áîëüøîãî ñïèñêà êîìïèëÿòîð áóäåò óæå íå ñòîëü "âåëèêîäóøåí" ê âàì, ïîñêîëüêó ïîñ÷èòàåò âûÿâëåííóþ èçáûòî÷íîñòü îøèáêîé. Ïîýòîìó íåò íèêàêîé íåîáõîäèìîñòè çàðàíåå ïîäâåðãàòü ñåáÿ "íàñìåøêàì" êîìïèëÿòîðà. Íàäî ïðîñòî âûäåëèòü ìàññèâ, ðàçìåð êîòîðîãî áóäåò äîñòàòî÷åí äëÿ ðàçìåùåíèÿ ñïèñêà:
/* äíè ìåñÿöà */
Int days[ ]=[31, 28, 31, 30, 31, 30, 31, 31, 30, 31];
Main( ).
{
Int index;
Extern int days[ ]; /* íåîáÿçàòåëüíîå îïèñàíèå */
For(index = 0; index < sizeof days/(sizeof (int)); index++).
Printf(" Ìåñÿö %d èìååò %d äíåé.\n", index + 1, days [index]);
}
Ê ýòîé ïðîãðàììå ñëåäóåò ñäåëàòü äâà ñóùåñòâåííûõ çàìå÷àíèÿ:
Ïåðâîå: åñëè âû èñïîëüçóåòå ïóñòûå ñêîáêè äëÿ èíèöèàëèçàöèè ìàññèâà, òî êîìïèëÿòîð ñàì îïðåäåëèò êîëè÷åñòâî ýëåìåíòîâ â ñïèñêå è âûäåëèò äëÿ íåãî ìàññèâ íóæíîãî ðàçìåðà.
Âòîðîå: îíî êàñàåòñÿ äîáàâëåíèÿ, ñäåëàííîãî ï óïðàâëÿþùåì îïåðàòîðå for. He ïîëàãàÿñü (âïîëíå îáîñíîâàííî) íà ñâîè âû÷èñëèòåëüíûå ñïîñîáíîñòè, ìû âîçëîæèëè çàäà÷ó ïîäñ÷åòà ðàçìåðà ìàññèâà íà êîìïèëÿòîð. Îïåðàòîð sizeof îïðåäåëÿåò ðàçìåð â áàéòàõ îáúåêòà èëè òèïà, ñëåäóþùåãî çà íèì. (Ìû. óæå óïîìèíàëè îá ýòîì â ãë. 3.)  íàøåé âû÷èñëèòåëüíîé ñèñòåìå ðàçìåð êàæäîãî ýëåìåíòà òèïà int ðàâåí äâóì áàéòàì, ïîýòîìó äëÿ ïîëó÷åíèÿ êîëè÷åñòâà ýëåìåíòîâ ìàññèâà ìû äåëèì îáùåå ÷èñëî áàéòîâ, çàíèìàåìîå ìàññèâîì, íà 2. Îäíàêî â äðóãèõ ñèñòåìàõ ýëåìåíò òèïà int ìîæåò èìåòü èíîé ðàçìåð. Ïîýòîìó â îáùåì ñëó÷àå âûïîëíÿåòñÿ äåëåíèå íà çíà÷åíèå ïåðåìåííîé sizeof (äëÿ ýëåìåíòà òèïà int). Íèæå ïðèâåäåíû ðåçóëüòàòû ðàáîòû íàøåé ïðîãðàììû:
Ìåñÿö 1 èìååò 31 äíåé.
Ìåñÿö 2 èìååò 28 äíåé.
Ìåñÿö 3 èìååò 31 äíåé.
Ìåñÿö 4 èìååò 30 äíåé.
Ìåñÿö 5 èìååò 31 äíåé.
Ìåñÿö 6 èìååò 30 äíåé.
Ìåñÿö 7 èìååò 31 äíåé.
Ìåñÿö 8 èìååò 31 äíåé.
Ìåñÿö 9 èìååò 30 äíåé.
Ìåñÿö 10 èìååò 31 äíåé.
Íó âîò, òåïåðü ìû ïîëó÷àåì òî÷íî 10 çíà÷åíèé. Íàø ìåòîä, ïîçâîëÿþùèé ïðîãðàììå ñàìîé íàõîäèòü ðàçìåð ìàññèâà, íå ïîçâîëèë íàì íàïå÷àòàòü êîíåö ìàññèâà.
Ñóùåñòâóåò è áîëåå êîðîòêèé ñïîñîá èíèöèàëèçàöèè ìàññèâîâ, íî ïîñêîëüêó îí ïðèìåíèì òîëüêî ê ñèìâîëüíûì ñòðîêàì, ìû ðàññìîòðèì åãî â ñëåäóþùåé ãëàâå.
 çàêëþ÷åíèå ìû ïîêàæåì, ÷òî ìîæíî ïðèñâàèâàòü çíà÷åíèÿ ýëåìåíòàì ìàññèâà, îòíîñÿùåãîñÿ ê ëþáîìó êëàññó ïàìÿòè. Íàïðèìåð, â ïðèâåäåííîì íèæå ôðàãìåíòå ïðîãðàììû ïðèñâàèâàþòñÿ ÷åòíûå ÷èñëà ýëåìåíòàì àâòîìàòè÷åñêîãî ìàññèâà:
/* ïðèñâàèâàíèå çíà÷åíèé ìàññèâó */
Main( ).
{
Int counter, evens [50];
For(counter = 0; counter < 50; counter++).
Evens[counter] = 2 * counter;
...
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
- 117.
- 118.
- 119.
- 120.
- 121.
- 122.
- 123.
- 124.
- 125.
- 126.
- 127.
- 128.
- 129.
- 130.
- 131.
- 132.
- 133.
- 134.
- 135.
- 136.
- 137.
- 138.
- 139.
- 140.
- 141.
- 142.
- 143.
- 144.
- 145.
- 146.
- 147.
- 148.
- 149.
- 150.
- 151.
- 152.
- 153.
- 154.
- 155.
- 156.
- 157.
- 158.
- 159.
- 160.
- 161.
- 162.
- 163.
- 164.
- 165.
- 166.
- 167.
- 168.
- 169.
- 170.
- 171.
- 172.
- 173.
- 174.
- 175.
- 176.
- 177.
- 178.
- 179.
- 180.
- 181.
- 182.
- 183.
- 184.
- 185.
- 186.
- 187.
- 188.
- 189.
- 190.
- 191.
- 192.
- 193.
- 194.
- 195.
- 196.
- 197.
- 198.
- 199.
- 200.
- 201.
- 202.
- 203.
- 204.
- 205.
- 206.
- 207.
- 208.
- 209.
- 210.
- 211.
- 212.
- 213.
- 214.
- 215.
- 216.
- 217.
- 218.
- 219.
- 220.
- 221.
- 222.
- 223.
- 224.
- 225.
- 226.
- 227.
- 228.
- 229.
- 230.
- 231.
- 232.
- 233.
- 234.
- 235.
- 236.
- 237.
- 238.
- 239.
- 240.
- 241.
- 242.
- 243.
- 244.
- 245.
- 246.
- 247.
- 248.
- 249.
- 250.
- 251.
- 252.
- 253.
- 254.
- 255.
- 256.
- 257.
- 258.
- 259.
- 260.
- 261.
- 262.
- 263.
- 264.
- 265.
- 266.
- 267.
- 268.
- 269.
- 270.
- 271.
- 272.
- 273.
- 274.
- 275.
- 276.
- 277.
- 278.
- 279.
- 280.
- 281.
- 282.
- 283.
- 284.
- 285.
- 286.
- 287.
- 288.
- 289.
- 290.
- 291.
- 292.
- 293.
- 294.
- 295.
- 296.
- 297.
- 298.
- 299.
- 300.
- 301.
- 302.
- 303.
- 304.
- 305.
- 306.
- 307.
- 308.
- 309.
- 310.
- 311.
- 312.
- 313.
- 314.
- 315.
- 316.
- 317.
- 318.
- 319.
- 320.
- 321.
- 322.
- 323.
- 324.
- 325.
- 326.
- 327.
- 328.
- 329.
- 330.
- 331.
- 332.
- 333.
- 334.
- 335.
- 336.
- 337.
- 338.
- 339.
- 340.
- 341.
- 342.
- 343.
- 344.
- 345.
- 346.
- 347.
- 348.
- 349.
- 350.
- 351.
- 352.
- 353.
- 354.
- 355.
- 356.
- 357.
- 358.
- 359.
- 360.
- 361.
- 362.
- 363.
- 364.
- 365.
- 366.
- 367.
- 368.
- 369.
- 370.
- 371.
- 372.
- 373.
- 374.
- 375.
- 376.
- 377.
- 378.
- 379.
- 380.
- 381.
- 382.
- 383.
- 384.
- 385.
- 386.
- 387.
- 388.
- 389.
- 390.
- 391.
- 392.
- 393.
- 394.
- 395.
- 396.
- 397.
- 398.
- 399.
- 400.
- 401.
- 402.
- 403.
- 404.
- 405.
- 406.
- 407.
- 408.
- 409.
- 410.
- 411.
- 412.
- 413.
- 414.
- 415.
- 416.
- 417.
- 418.
- 419.
- 420.