1.определить, что будет на экране после выполнения следующего фрагмента программ: var n, k: byte; begin n: =5; for k: =1 to n do begin n: =n+1; writeln(‘k=’, k, ’n=’, n); end; end
Инвариантные фрагменты кода Оптимизация инвариантных фрагментов кода тесно связана с проблемой оптимального программирования циклов. Внутри цикла могут встречаться выражения, фрагменты которых никак не зависят от управляющей переменной цикла. Их называют инвариантными фрагментами кода. Современные компиляторы часто определяют наличие таких фрагментов и выполняют их автоматическую оптимизацию. Такое возможно не всегда, и иногда производительность программы зависит целиком от того, как запрограммирован цикл. В качестве примера рассмотрим следующий фрагмент программы (язык 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. Таким образом, можно существенно сократить количество трудоёмких арифметических операций. [править] Приоритеты оптимизации
maxborod
02.01.2021
Решение с использование длинной арифметики. var i, j, n, len, rem: integer; a: array[1..200] of byte; begin write('Введите число: '); read(n); len := 1; a[1] := 1; for i := n + 1 to 99 {100} do begin for j := 1 to len do begin rem := a[j] * i + rem; a[j] := rem mod 10; rem := rem div 10; end; while rem > 0 do begin inc(len); a[len] := rem mod 10; rem := rem div 10; end; end; writeln('Произведение чисел из интервала (', n, '; 100): '); for i := len downto 1 do write(a[i]); end. Пример работы программы: Введите число: 1 Произведение чисел из интервала (1; 100): 1948348720420644788695888257080283249381963823594360049498643927185579338215778728274424636079639781709574621897447185108592230400000000000000000000
mariy-y34
02.01.2021
Dim A(100) As Integer, Odin As Boolean Dim k As Integer , i As Integer Randomize For i = 1 To 100 A(i) = Int(Rnd*100) + 1 ' Заполняем массив случайными числами от 1 до 100 Print A(i) & CHR(9); ' Выводим начальный массив через табуляцию Next i Print "Повторяющиеся элементы" For i = 1 To 100 For k = i+1 To 100 If A(i) = A(k) Then Print A(i) & CHR(9); Next k Next i Print "Не повторяющиеся элементы" For i = 1 To 100 Odin = True For k = i+1 To 100 If A(i) = A(k) Then Odin = False Next k If Odin = True Then Print A(i) & CHR(9); Next i End
Ответить на вопрос
Поделитесь своими знаниями, ответьте на вопрос:
1.определить, что будет на экране после выполнения следующего фрагмента программ: var n, k: byte; begin n: =5; for k: =1 to n do begin n: =n+1; writeln(‘k=’, k, ’n=’, n); end; end
Оптимизация инвариантных фрагментов кода тесно связана с проблемой оптимального программирования циклов. Внутри цикла могут встречаться выражения, фрагменты которых никак не зависят от управляющей переменной цикла. Их называют инвариантными фрагментами кода. Современные компиляторы часто определяют наличие таких фрагментов и выполняют их автоматическую оптимизацию. Такое возможно не всегда, и иногда производительность программы зависит целиком от того, как запрограммирован цикл. В качестве примера рассмотрим следующий фрагмент программы (язык 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. Таким образом, можно существенно сократить количество трудоёмких арифметических операций.
[править] Приоритеты оптимизации