Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекцый для 1 курса-1 семестр.doc
Скачиваний:
3
Добавлен:
09.11.2019
Размер:
2.95 Mб
Скачать

Індэксацыя

Індэксы карысныя, хаця яны растрачваюць і час, і памяць.

Разгледзім, якія дзеянні можна выкарыстаць, каб павысіць эфек­тыў­насць праграмы:

1. Няхай падлічваецца

x := (a[i] + 1 / a[i]) * a[i]

Лепш зрабіць так:

ai := a[i];

x := (ai + 1.0 / ai) * ai

2. Няхай падлічваецца

FOR i := 1 TO n DO

FOR j := 1 TO m DO

BEGIN

a[i, j] := 0;

FOR k := 1 TO l DO

a[i, j] := a[i, j] + b[j, k] * c[k, j];

END

Тут для кожнага зафіксаванага i, j трэба падлічваць месца­зна­хо­джан­не элемента a[i, j], калі k змяняецца ад l да l. Аднак суму можна на­коп­лі­ваць у простай пераменнай t, а потым надаваць значэнне элементу a[i, j].

Індэксацыя валодае адной асаблівасцю: чым больш індэксаў вы­ка­ры­стоў­ваецца, тым менш эфектыўная праграма, г. зн., што масіў А[72] больш эфектыўны, чым масіў А[12, 3, 2]. Пры дапамозе прывядзення тыпаў можна налажыць адзін масіў на другі і працаваць з больш эфек­тыў­ным.

Трэба пазбягаць вылічэнняў са складанай індэксацыяй. Замест

FOR i := 1 TO 10 DO

X[3 * i + 4] := Y[3 * i + 4] + C

лепш запраграміраваць

FOR i := 1 TO 10 DO

BEGIN

ik := 3 * i + 4;

X[ik] := Y[ik] + C

END;

Выкарыстанне цыклаў

Памяць эканоміцца, калі мы выкарыстоўваем цыклы замест запісу каманд, якія паўтараюцца. Цыклы патрабуюць некаторага дадатковага часу і памяці на ініцыіраванне, праверку, змяненне параметра цыкла і ўстаноўку ўсіх канстант.

1. Не выкарыстоўваць наступны цыкл:

P := A[1];

FOR i := 1 TO 4 DO P := P * x + a[i];

Лепш запісаць схему Горнера:

P := ((a[1] * x + a[2]) * x + a[3]) * x + a[4];

2. Цыклы можна аб’ядноўваць. Замест

FOR i := 1 TO 500 DO x[i] := 0.0;

FOR j := 1 TO 500 DO y[j] := 0.0;

лепш напісаць

FOR i := 1 TO 500 DO

BEGIN

x[i] := 0.0;

y[i] := 0.0

END;

Заданне 1. Трэба вылічыць значэнне N – цэлага ліку, які скла­даец­ца з лічбы, якая захавана ў сімвальным выглядзе ў масіве a: a[0] – старэйшая лічба, ..., a[k] – малодшая. У элеменце  – знак ліку.

Заданне 2. Па зададзеным цэлым ліку знайсці па­сля­доў­насць лічбаў гэтага ліку: – малодшая, …, – старэйшая.

Алгарытм. ... .

Арганізацыя цыклаў

Значная колькасць часу затрачваецца на ініцыіраванне і праверку па­ра­метра цыкла. Стараннай арганізацыяй укладзеных цыклаў можна зэ­ка­номіць час.

Прыклад.

FOR k:=1 TO 20 DO

{ ініцыіраванне выконваецца 1 раз (k :=  1)}

FOR j:=1 TO 10 DO

{ ініцыіраванне выконваецца 20 разоў (j :=  1)}

FOR l:=1 TO 5 DO

{ ініцыіраванне выконваецца 200 разоў (l :=  1)}

BEGIN

{Цела цыкла}

{ аператары выконваюцца 20 * 5 * 10 = 1000 разоў}

END; {{па l}  завяршэнне 1000 разоў}

{{па j}  завяршэнне 200 разоў}

{{па k}  завяршэнне 20 разоў}

Вывад. Ініцыіраванне выконваецца 221 раз і завяршэнне – 1220 разоў.

Гэты прыклад можна перапраграміраваць такім чынам:

FOR l:=1 TO 5 DO

{ ініцыіраванне 1 раз}

FOR j:=1 TO 10 DO

{ ініцыіраванне 5 разоў}

FOR k:=1 TO 20 DO

{ ініцыіраванне 50 разоў}

BEGIN

{Цела цыкла}

END;

{{па k}  завяршэнне 1000 разоў = 5 * 10 * 20}

{{па j}  завяршэнне 50 разоў = 5 * 10}

{{па l}  завяршэнне 5 разоў}

Вывад. Ініцыіраванне выконваецца 56 разоў і завяршэнне 1055 разоў. Тут яўная эканомія.