Конспект лекций по программированию для начинающих. Гладков В.П. - 51 стр.

UptoLike

Составители: 

53
Для вычисления полученного выражения нужно всего лишь семь операций.
Соответствующий фрагмент программы показан ниже:
write('Введите x ');
readln(x);
y:=3*sqr(x)+4;
y:=((5*y-3)*y+7)*y-0.25)*y;
write('Ответ ',y)
Запомним, что для решения одной и той же задачи можно построить разные
алгоритмы. Они отличаются друг от друга эффективностью, т.е. количеством
используемых операций и переменных. В рассмотренном примере с помощью
схемы Горнера удалось построить алгоритм с меньшим количеством операций,
не вводя дополнительных переменных. Однако это возможно не всегда. Чаще
всего выигрыш во времени выполнения алгоритма влечет дополнительный
расход памяти (вводятся дополнительные переменные) и наоборот.
Пример 8.16. Присвоить целой переменной h третью от конца цифру в
записи положительного целого числа k (например, если k=130985, то h=9).
Решение. Здесь задано произвольное целое число, которое в компьютере
представляется в виде последовательности нулей и единиц. Над ним разрешено
выполнение арифметических операций и стандартных функций. Это
представление отличается от представления чисел, привычного для человека. В
последнем случае число - это последовательность записанных друг за другом
цифр. Его можно рассматривать как
число, тогда над ним выполняются
арифметические операции и стандартные функции. Можно это же число
рассматривать и как последовательность символов, тогда к нему применимы
операции «вырезки» отдельных символов, замены их другими символами,
вставки новых символов и другие операции, разрешенные над строками
символов. Такие операции над машинным представлением числа невозможны.
Однако приведенные
рассуждения приводят к мысли изменить форму
представления числа, использовав для этого процедуру str(число,строка), а
затем функцию copy(строка,позиция,длина). Получим:
var k:integer; { заданное число }
h:string; { третья цифра заданного числа }
s:string; { число, представленное в виде строки символов }
begin str(k,s); { преобразовали число в строку 13098 -> '13098' }
h:=copy(s,length(s)-2,1) { выделили нужную цифру }
end.
Возможно другое решение. Представим исходное число в многочленной
форме: 1·10
5
+3·10
4
+0·10
3
+9·10
2
+8·10+5. Такое представление числа
подсказывает, что последнюю цифру числа можно найти как остаток от деления
на 10, т.е. k mod 10. Это упрощает исходную задачу, сводя ее к задаче
изменения числа таким образом, чтобы третья цифра числа стала последней,
выделять которую мы научились. Последняя задача сводится к переносу
запятой в числе на два разряда
влево, что равносильно уменьшению числа в 100
раз, полученная в результате такого переноса дробная часть не нужна и ее
можно отбросить. Описанную работу можно выполнить, воспользовавшись
                                         53

    Для вычисления полученного выражения нужно всего лишь семь операций.
Соответствующий фрагмент программы показан ниже:
    write('Введите x ');
    readln(x);
    y:=3*sqr(x)+4;
    y:=((5*y-3)*y+7)*y-0.25)*y;
    write('Ответ ',y)
    Запомним, что для решения одной и той же задачи можно построить разные
алгоритмы. Они отличаются друг от друга эффективностью, т.е. количеством
используемых операций и переменных. В рассмотренном примере с помощью
схемы Горнера удалось построить алгоритм с меньшим количеством операций,
не вводя дополнительных переменных. Однако это возможно не всегда. Чаще
всего выигрыш во времени выполнения алгоритма влечет дополнительный
расход памяти (вводятся дополнительные переменные) и наоборот.
    Пример 8.16. Присвоить целой переменной h третью от конца цифру в
записи положительного целого числа k (например, если k=130985, то h=9).
    Решение. Здесь задано произвольное целое число, которое в компьютере
представляется в виде последовательности нулей и единиц. Над ним разрешено
выполнение арифметических операций и стандартных функций. Это
представление отличается от представления чисел, привычного для человека. В
последнем случае число - это последовательность записанных друг за другом
цифр. Его можно рассматривать как число, тогда над ним выполняются
арифметические операции и стандартные функции. Можно это же число
рассматривать и как последовательность символов, тогда к нему применимы
операции «вырезки» отдельных символов, замены их другими символами,
вставки новых символов и другие операции, разрешенные над строками
символов. Такие операции над машинным представлением числа невозможны.
Однако приведенные рассуждения приводят к мысли изменить форму
представления числа, использовав для этого процедуру str(число,строка), а
затем функцию copy(строка,позиция,длина). Получим:
    var        k:integer;   { заданное число }
               h:string;    { третья цифра заданного числа }
               s:string;    { число, представленное в виде строки символов }
    begin      str(k,s);    { преобразовали число в строку 13098 -> '13098' }
               h:=copy(s,length(s)-2,1) { выделили нужную цифру }
    end.
    Возможно другое решение. Представим исходное число в многочленной
форме:      1·105+3·104+0·103+9·102+8·10+5.      Такое   представление      числа
подсказывает, что последнюю цифру числа можно найти как остаток от деления
на 10, т.е. k mod 10. Это упрощает исходную задачу, сводя ее к задаче
изменения числа таким образом, чтобы третья цифра числа стала последней,
выделять которую мы научились. Последняя задача сводится к переносу
запятой в числе на два разряда влево, что равносильно уменьшению числа в 100
раз, полученная в результате такого переноса дробная часть не нужна и ее
можно отбросить. Описанную работу можно выполнить, воспользовавшись