Sadikova Gavrikov
?>

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

Информатика

Ответы

shymilin19951783
Инвариантные фрагменты кода
Оптимизация инвариантных фрагментов кода тесно связана с проблемой оптимального программирования циклов. Внутри цикла могут встречаться выражения, фрагменты которых никак не зависят от управляющей переменной цикла. Их называют инвариантными фрагментами кода. Современные компиляторы часто определяют наличие таких фрагментов и выполняют их автоматическую оптимизацию. Такое возможно не всегда, и иногда производительность программы зависит целиком от того, как запрограммирован цикл. В качестве примера рассмотрим следующий фрагмент программы (язык 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
Решение с использование длинной арифметики.
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
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
Ваше имя (никнейм)*
Email*
Комментарий*

Популярные вопросы в разделе

katdavidova91
sve707ta
Akvamontaz
tatianaesipenko
lescha-77766
delta88
shumeikoElena362
Tatyanaaarzieva72
uvarovig
ashkiperova6
Васильевичь Виктория457
nekrasovaolga27
kristina1989
Дил1779
martabunova