Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Алгоритмизация и программирование на языке С++. Ч.1. Учебник
.pdf
7. Циклы
и приведены для иллюстрации. В первом фрагменте инструк-
i=i+1
ция (
Для них до и после цикла выводятся значения переменной
) не заключена в фигурные скобки, как во втором.
i
чтобы проиллюстрировать, что действия повторяются.
81
,
Рис. 7.2. Инструкции
while
и
do-while
// 1 operator in cycle body, no curly braces
int i=1, n=3;
cout << " i= " << i << endl; // i=1
while ( i<= n)
i=i+1;
cout << " i= " << i << endl; // i=4
cout << "end" << endl;
i=1;
cout << " i= " << i << endl; // i=1
do
{
i=i+1;
}
while ( i<= n) ;
cout << " i= " << i << endl; // i=1
cout << "end" << endl;
for(i=1; i<4; i=i+1)
cout << " i= " << i << endl;

82
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
Результат работы приведен на рис. 7.3.
Рис. 7.3. Один оператор в цикле
Продолжим рассматривать задачу вычисления суммы членов натурального ряда, добавив в алгоритм дополнительную
переменную.
//i – номер слагаемого
//а – значение слагаемого
//n – количество слагаемых
//S – накапливаемая сумма
int a, S, n;
S=0; n=5;
a=0;
for( int i=1; i<= n; i++)
{ a=a+1; S=S+a; }
cout << "\n цикл S(5) = " << S << endl;
Перепишем эту программу по-другому.
int a, S, n;
S=0; n=5;
for( int i=1; i<= n; i++)
{ a=i; S=S+a; }
cout << "\n цикл S(5) = " << S << endl;
Встает вопрос – зачем введена дополнительная перемен-
а
? Заменив в коде только одну строку
ная
а=i
; на
а=2*i;
но будет находить такую сумму: S = 2 + 4 + 6 + … + 2n.
, мож-

7. Циклы
83
Заметим, что в случае замены на
a=1/i
правильного ре-
зультата не получится. Результат вычисления выражения
1/i
с целочисленными операндами (
) каждый раз будет окру-
гляться до целого значения.
int a, S; int n;
S=0.0; n=5;
for( int i=1; i<= n; i++)
{ a=1/i; S=S+a;
cout << " a " << a << endl;
}
Результат приведен на рис. 7.4.
Рис. 7.4. Сумма пяти членов, обратных натуральному ряду,
с переменными целого типа
Надо объявить переменные a и S вещественными.
double a, S; int n;
S=0.0; n=5;
for( int i=1; i<= n; i++)
{ a=1/(double)i; S=S+a;
cout << " a " << a << endl;
}
Выражение можно записать и без (
double
), например
a=1/(1.0*i);
Результат приведен на рис. 7.5.
Приведенную программу можно рассматривать как «шаблон», который с небольшими изменениями используется для
решения многих задач, что и будет сделано в этом разделе.

84
Рис. 7.5. Сумма пяти членов, обратных натуральному ряду
с переменными вещественного типа
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
Рассмотрим следующую задачу. Вычислить 5 первых членов арифметической прогрессии с начальным членом 4 и разностью 3. (S = 4 + 7 + 10 + 13 + 16).
double dS, da; int i, n;
dS =0.0; n = 5;
cout << " 4+7+10...\n" << endl;
cout << "da NO initialized " << da << endl;
for (int i = 1, da = 4.0; i <= n; i = i + 1)
{
dS = dS + da;
cout << " a= " << da << " dS = " << dS << endl;
da = da + 3.0;
}
cout << " a " << da << " dS " << dS << endl;
Результат приведен на рис. 7.6.
da
Обращаем внимание, что значение переменной
после
окончания цикла равно нулю. До цикла она определена, но
ей не присвоено никакого значения. Так как все изменения
этой переменной осуществляются в цикле, то после его окон-
da
чания значение
также останется равным нулю. Разные среды обрабатывают ситуацию по-разному. В Visual Studio 2020
это считается серьезной ошибкой, и результат не выводится.
В Dev C++ не инициализированной переменной присваивается значение. В нашем случае – ноль. Также поступает и онлайн-компилятор OnlineGDB.

7. Циклы
Рис. 7.6. Сумма пяти членов арифметической прогрессии
Если переменной а присвоить значение (например, 100)
до цикла, то такое же значение будет и после.
double dS, da; int i, n;
dS =0.0; n = 5;
cout << " 4+7+10...\n" << endl;
da=100;
cout << "a initializede " << da << endl;
for (int i = 1, da = 4.0; i <= n; i = i + 1)
{
dS = dS + da;
cout << " a= " << da << " dS = " << dS << endl;
da = da + 3.0;
}
cout << " a " << da << " dS " << dS << endl;
Результат приведен на рис. 7.7.
85
Рис. 7.7. Второй вариант программы вычисления суммы
членов арифметической прогрессии

86
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
В третьем варианте программы присваивание переменной
а
значения первого члена арифметической прогрессии удале-
for
но из оператора
.
double dS, da; int i, n;
dS =0.0; n = 5;
cout << " 4+7+10...\n" << endl;
da=4.0;
cout << "a initializede not in for a= " << da << endl;
for (int i = 1; i <= n; i = i + 1)
{
dS = dS + da;
cout << " a= " << da << " dS = " << dS << endl;
da=da + 3.0;
}
cout << " a " << da << " dS " << dS << endl;
Результат приведен на рис. 7.8.
Рис. 7.8. Третий вариант программы вычисления суммы
членов арифметической прогрессии
Заметим, что с переменной а происходят следующие изменения. Сначала она получает значение 4 (первый член
прогрессии). Далее в теле цикла вычисляются значения всех
требуемых слагаемых. Но после цикла значение этой переменной станет 19 – больше, чем последнее слагаемое. Оно
равно 16.

7. Циклы
87
И в последнем варианте программы внесем в текст такие
а
изменения, чтобы после цикла значение переменной
стало
равным последнему члену арифметической прогрессии, который должен быть добавлен к сумме. Но для этого до цикла
этой переменной присваивается значение, которое не участвует в вычислении (равное 1).
double dS, da; int i, n;
dS =0.0; n = 5;
cout << " 4+7+10...\n" << endl;
da=1.0;
cout << "a initializede not in for (2) = " << da << endl;
for (int i = 1; i <= n; i = i + 1)
{
da = da + 3.0;
dS = dS + da;
cout << " a= " << da << " dS = " << dS << endl;
}
cout << " a " << da << " dS " << dS << endl;
Результат приведен на рис. 7.9.
Рис. 7.9. Четвертый вариант вычисления суммы членов
арифметической прогрессии
Заметим, что один и тот же алгоритм можно записывать
разными способами. Выбор того или иного варианта часто за-

88
( )
4
1
2
.
3
i
i
S
i
=
=
+
∑
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
висит от предпочтений программиста (субъективная составляющая).
Теперь решим следующую задачу. Вычислим сумму
Программа решения этой задачи может быть такой.
cout << "\n (2*i)/(i+3)" << "\n";
double dS, da; dS = 0.0; int n = 5;
cout.setf(ios::xed);
cout.precision(3);
for (int i= 1; i <= n; )
{ da = 1.0*i; // (double)i;
dS = dS + (2*da)/(da+3.0);
// Перенос строки оператора
cout << "(2*da)/(da+3.0) " <<
(2*da)/(da+3.0) << " S=" << dS << endl;
i = i + 1;
}
cout << "\n " << dS << "\n ";
Результат приведен на рис. 7.10.
Рис. 7.10. Вычисление суммы дробей
(2i) / (i + 3)
Обратим внимание, что в программе показано, как мож-
но записать инструкцию в несколько строк. В первом случае

7. Циклы
89
строка заканчивается операцией <<, а во втором – разделено
на отдельные строки арифметическое выражение.
Посмотрим еще одну задачу. Найти значение факториала
f = n! = 1 ⋅ 2 ⋅ 3 ⋅ … ⋅ n. Алгоритм решения этой задачи аналогичен описанному ранее алгоритму вычисления суммы членов натурального ряда. Но начальное значение накапливаемого произведения надо задать не нулем, а единицей.
int f, n;
f=1; n = 5;
for (int i = 1; i <= n; i = i + 1)
f = f*i;
cout << " 1*2*3*4*5 = " << f << endl;
Теперь рассмотрим задачу вычисления произведения n оди-
наковых сомножителей. Если такими сомножителями будут
n
значения х, то это будет х
рального ряда и факториала следующий результат (х
получить из предыдущего х
. Как и для суммы n членов нату-
n
(n–1)
. Приведем пример программы
) можно
вычисления пятой степени числа х = 2.
cout << "\n 2*2*2 . . ." << endl;
int i, x=2; int xn = 1; int n= 5;
for (i = 1; i <= n; i++)
xn = xn * x;
cout << " 2^5 = " << xn << endl;
Такая программы выведет две строки.
2*2*2 . . .
2^5 = 120
Сегодня редко используется такой алгоритмом вычисления
степени. Созданы специальные средства, которые обеспечивают вычисление степени и многих других математических и
тригонометрических функций. В С++ это библиотеки
<cmath>
и
пользуя функцию
. Покажем, как можно вычислить выражение xn, ис-
pow(x,i)
из библиотеки
<math.h>
<math.h>
. Функция
имеет два параметра. На первом месте – значение возводимого в степень аргумента, а на втором – само значение степени.
5
Например, для вычисления 2
надо записать
pow(2.0,5)
.

90
5
1
!
i
i
S
x
i
=
=
∑
АЛГОРИТМИЗАЦИЯ ИПРОГРАММИРОВАНИЕ НАЯЗЫКЕ С++
В математических библиотеках С++ есть несколько функций вычисления степени. Они различаются типом задаваемых параметров. Например, одна из функций предполагает
oat
тип первого параметра
, и второго –
те оба параметра должны иметь тип
int
. В другом вариан-
oat
. В прил. 4 подробно
рассматривается использование функций вычисления степени
для разных типов передаваемых параметров. Также там приводится временная оценка трех алгоритмов вычисления суммы степеней 2.
Теперь рассмотрим вычисление суммы ряда
cout << "\n p = x^n / q =( i! )" << endl;
double dS, x, da, p, q;
int i, n =5;
cout.setf(ios::xed);
cout.precision(3);
x = 2.0; dS=0.0;p =1.0;q =1.0;
cout << "x= " << x << "\n";
for (i = 1; i <= n; i = i +1)
{
p =p * x; q =q * i;
da = p/q;
dS =dS + da;
cout << " i (p/q) S " << i << " "
<< da << " " << dS << endl; // Перенос оператора
}
cout << "\n " << dS << endl;
Результаты х = 2 и х = 0,5 приведены на рис. 7.11 и 7.12
соответственно.
В программе добавлены инструкции для форматирован-
ного вывода:
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
