Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Алгоритмизация и программирование на языке С++. Ч.1. Учебник

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
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
соответственно.
В программе добавлены инструкции для форматирован-
ного вывода:
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]