Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаб_2_метод_указания.doc
Скачиваний:
2
Добавлен:
09.11.2018
Размер:
412.67 Кб
Скачать

Корректная организация циклов

  • Для корректного входа в цикл необходимо до начала цикла сделать начальные установки переменных, управляющих условием выполнения цикла. В цикле for такая установка может быть сделана в заголовке цикла.

  • Необходимо позаботиться об инициализации переменной, в которой накапливается результат.

  • Для выполнения в теле цикла нескольких операторов необходимо использовать составной оператор.

  • В теле цикла должны присутствовать операторы, изменяющие значение переменной цикла так, чтобы цикл через некоторое число итераций завершился. В цикле for изменение значения параметра цикла выполняется в заголовке цикла.

  • Условие завершения цикла должно состоять из корректных выражений и значений, определенных еще до первого выполнения тела цикла.

  • Оператор break обеспечивает досрочное завершение выполнения действий в цикле. Оператор сontinue обеспечивает переход на следующую итерацию цикла, причем операторы в теле цикла, записанные после сontinue, игнорируются. Оператор return завершает выполнение функции. Нормальный ход выполнения действий в цикле может быть нарушен и оператором goto.

Оптимизация программы

Оптимизация – преобразование исходного текста программы, при котором:

  • результат выполнения остается неизменным,

  • улучшаются некоторые характеристики программы (время выполнения, затраты оперативной памяти, размер исходного кода).

Оптимальность программы в значительной степени определяется ее алгоритмом. При оптимизации программы необходимо выявить ее фрагменты, являющиеся «основными потребителями» ресурса, а затем перепрограммировать их: например, схема Горнера преобразовывает алгоритм с целью сокращения количества выполняемых операций.

Большинство компиляторов сегодня выполняют сами некоторые виды оптимизации программы. И тем не мене, отметим некоторые приемы:

  1. Выделять общие подвыражения и вычислять их отдельно.

  2. При вычислении сумм с использованием циклов, общий множитель (при его наличии) необходимо выносить из цикла: это уменьшает количество умножений и увеличивает точность вычислений:

summa=0;

for (j=1; j<=1000; j++) summa += a*x[i];

summa=0; for (j=1; j<=1000; j++) summa += x[i];

summa *= a;

Это лучше!!!!! Объяснить почему

  1. При программировании вложенных циклов следует иметь в виду, что затраты процессорного времени на выполнение таких конструкций могут зависеть от порядка следования вложенных циклов. По возможности, следует делать цикл с наибольшим числом повторений самым внутренним, а цикл с наименьшим числом повторений – самым внешним:

for (j=1; j<=100000; j++) for (k=1; k<=1000; k++) a=1;

for (j=1; j<=1000; j++) for (k=1; k<=100000; k++) a=1;

Это лучше!!!!! Объяснить почему

  1. Ветвящийся алгоритм описать как совокупность непересекающихся ветвей: описывать каждую из ветвей максимально структурировано и компактно, в частности, оформляя последовательности операторов, выполняющих некоторые алгоритмы, в виде составных операторов или в виде функций; завершать каждую из ветвей подходящим оператором завершения (break, continue, return, exit()).

Рассмотрим нахождение корней квадратного уравнения, как пример оптимизации алгоритма с ветвлением:

2 + bx + c = 0 (a, b, c – вещественные)

if (!a && !b && !c) выведем на экран: “Корней бесконечно много”;

if (!a && !b && c) выведем на экран: “Корней нет”;

if (!a && b) выведем на экран: “Один вещественный корень”;

d = b*b – 4*a*c; вычислим дискриминант

if (d >= 0) выведем на экран: “Вещественные корни:”;

и найдем корни:

d1= sqrt (d);

х1= (-b + d1) /(2 *a);

х2= (-b - d1) /(2 *a);

if (d < 0) выведем на экран: “Комплексные корни:”;

и вычислим их:

dk = -b / (2 * a); //действ.часть mk = sqrt (-d) / (2 * a); //мним. часть

Рассмотрим структуру программы:

//каждая ветвь завершается оператором return

double a, b, c, d, d1, x1, x2, dk, mk; ……….

/*_1_*/

if (!a && !b && !c) {

{

cout << “Корней бесконечно много”; _getch(); return 1; }

/*_2_*/

if (!a && !b && c)

{ ….

return 2;

}

/*_3_*/

if (!a && b)

{ ….

return 3;

}

d = b*b – 4*a*c; //вычисление дискриминанта

/*_4_*/

if (d >= 0) // действительные корни

{ ….

return 4 ;

}

/*_5_*/

//комплексные корни:*/ d = -b / (2 * a); //действ.часть m = sqrt (-d) / (2 * a); //мним. часть

Без оператора return последовательность прохождения операторов в каждой ветви будет: _1_ à _2_ à _3_ à _4_ à _5_

Примеры граф-схем алгоритмов

Циклические алгоритмы

Алгоритмы циклов с параметром

Пример 1. Вычисление произведения целых чисел

Вычислить и вывести на печать произведение целых чисел x и y в предположении, что операцией умножения пользоваться нельзя: в данном случае придется у раз выполнить операцию сложения (накапливать в переменной z у раз слагаемое х).

Пример 2. Нахождение суммы 100 чисел

Вариант а Вариант b

да

нет

да

нет

да