При обращении к ячейке можно использовать описанные ранее ВЗ, А1:G9 и т. д. Такая адресация называется относительной. При ее использовании в формулахExcelзапоминает расположение относительно текущей ячейки. Так, например, когда вы вводите формулу =B1+B2 в ячейку В4, тоExcelинтерпретирует формулу как "прибавить содержимое ячейки, расположенной тремя рядами выше, к содержимому ячейки, расположенной двумя рядами выше".
Если вы скопировали формулу =В1+В2 из ячейки В4 в С4, Excelтакже интерпретирует формулу как «прибавить содержимое ячейки, расположенной тремя рядами выше, к содержимому ячейки двумя рядами выше». Таким образом, формула в ячейке С 4 примет вид =С1+С2.
Если при копировании формул вы пожелаете сохранить ссылку на конкретную ячейку или область, то вам необходимо воспользоваться абсолютной адресацией. Для ее задания необходимо перед именем столбца и перед номером строки ввести символ $. Например: $В$4 или $C$2:$F$48 и т. д.
Смешанная адресация. Символ $ ставится только там, где он необходим. Например: В$4 или $С2. Тогда при копировании один параметр адреса изменяется. а другой — нет.
Инвариантные фрагменты кода Оптимизация инвариантных фрагментов кода тесно связана с проблемой оптимального программирования циклов. Внутри цикла могут встречаться выражения, фрагменты которых никак не зависят от управляющей переменной цикла. Их называют инвариантными фрагментами кода. Современные компиляторы часто определяют наличие таких фрагментов и выполняют их автоматическую оптимизацию. Такое возможно не всегда, и иногда производительность программы зависит целиком от того, как запрограммирован цикл. В качестве примера рассмотрим следующий фрагмент программы (язык Turbo Pascal): for i := 1 to n do begin ... for k := 1 to p do for m := 1 to q do begin a[k, m] := Sqrt(x * k * m - i) + Abs(u * i - x * m + k); b[k, m] := Sin(x * k * i) + Abs(u * i * m + k); end; ... am := 0; bm := 0; for k := 1 to p do for m := 1 to q do begin am := am + a[k, m] / c[k]; bm := bm + b[k, m] / c[k]; end; end; Здесь инвариантными фрагментами кода являются слагаемое Sin(x * k * i) в первом цикле по переменной m и операция деления на элемент массива c[k] во втором цикле по m. Значения синуса и элемента массива не изменяются в цикле по переменной m, следовательно, в первом случае можно вычислить значение синуса и присвоить его вс переменной, которая будет использоваться в выражении, находящемся внутри цикла. Во втором случае можно выполнить деление после завершения цикла по m. Таким образом, можно существенно сократить количество трудоёмких арифметических операций. [править] Приоритеты оптимизации
Объяснение:
При обращении к ячейке можно использовать описанные ранее ВЗ, А1:G9 и т. д. Такая адресация называется относительной. При ее использовании в формулахExcelзапоминает расположение относительно текущей ячейки. Так, например, когда вы вводите формулу =B1+B2 в ячейку В4, тоExcelинтерпретирует формулу как "прибавить содержимое ячейки, расположенной тремя рядами выше, к содержимому ячейки, расположенной двумя рядами выше".
Если вы скопировали формулу =В1+В2 из ячейки В4 в С4, Excelтакже интерпретирует формулу как «прибавить содержимое ячейки, расположенной тремя рядами выше, к содержимому ячейки двумя рядами выше». Таким образом, формула в ячейке С 4 примет вид =С1+С2.
Если при копировании формул вы пожелаете сохранить ссылку на конкретную ячейку или область, то вам необходимо воспользоваться абсолютной адресацией. Для ее задания необходимо перед именем столбца и перед номером строки ввести символ $. Например: $В$4 или $C$2:$F$48 и т. д.
Смешанная адресация. Символ $ ставится только там, где он необходим. Например: В$4 или $С2. Тогда при копировании один параметр адреса изменяется. а другой — нет.
Оптимизация инвариантных фрагментов кода тесно связана с проблемой оптимального программирования циклов. Внутри цикла могут встречаться выражения, фрагменты которых никак не зависят от управляющей переменной цикла. Их называют инвариантными фрагментами кода. Современные компиляторы часто определяют наличие таких фрагментов и выполняют их автоматическую оптимизацию. Такое возможно не всегда, и иногда производительность программы зависит целиком от того, как запрограммирован цикл. В качестве примера рассмотрим следующий фрагмент программы (язык Turbo Pascal):
for i := 1 to n do
begin
...
for k := 1 to p do
for m := 1 to q do
begin
a[k, m] := Sqrt(x * k * m - i) + Abs(u * i - x * m + k);
b[k, m] := Sin(x * k * i) + Abs(u * i * m + k);
end;
...
am := 0;
bm := 0;
for k := 1 to p do
for m := 1 to q do
begin
am := am + a[k, m] / c[k];
bm := bm + b[k, m] / c[k];
end;
end;
Здесь инвариантными фрагментами кода являются слагаемое Sin(x * k * i) в первом цикле по переменной m и операция деления на элемент массива c[k] во втором цикле по m. Значения синуса и элемента массива не изменяются в цикле по переменной m, следовательно, в первом случае можно вычислить значение синуса и присвоить его вс переменной, которая будет использоваться в выражении, находящемся внутри цикла. Во втором случае можно выполнить деление после завершения цикла по m. Таким образом, можно существенно сократить количество трудоёмких арифметических операций.
[править] Приоритеты оптимизации