- •1. Краткие теоретические сведения
- •1.1. Понятие ицвп
- •1.2. Алгоритмы вычисления сумм и произведений в цикле
- •А) суммы; б) произведения
- •1.3. Выбор типа общего члена суммы (произведения) при вычислении сумм и произведений в цикле
- •1.4. Вывод рекуррентных формул
- •А) вариант 1; б) вариант 2
- •1.4. Оператор цикла со спецификацией итерационного типа (типа условия)
- •А) выполнения оператора while ; б) функции примера 8.6
- •1.5. Уточнение корней уравнений
- •1.6. Использование оператора цикла do … while в ицвп
- •1.7. Использование операторов break и continue в ицвп
- •2. Задание
- •2.4.1.2. Пример
- •2.4.1.3. Программа
- •2.4.2.4. Тестирование
- •2.4.3. Задание 3. Использование рекуррентных формул в цикле
- •2.4.3.1. Условие задания
- •Варианты заданий
- •Варианты заданий
- •2.4.3.2. Пример
- •2.4.3.3. Программа
- •Варианты заданий
- •2.4.4.2. Пример
- •2.4.4.3. Программа
- •2.5.1.2. Пример программы
- •2.5.1.3. Программа
- •2.5.1.4. Тестирование
- •2.5.1.5. Типичные ошибки при выполнении работы
- •2.5.2. Задание 2. Накопление произведений в цикле
- •2.5.2.2. Пример 8.4
- •2.5.2.3. Программа
- •2.5.3.2. Пример для варианта 30
- •2.5.3.3. Программа
- •2.5.3.4. Тестирование
- •2.5.4. Задание 4. Вычисление значения функции с помощью разложения в ряд
- •2.5.4.1. Условие задания
- •Варианты заданий
- •2.5.4.2. Пример для варианта 30
- •2.5.4.3. Программа
- •2.5.4.4. Тестирование
- •3. Выводы
- •4. Требование к отчету
- •4. Краткие теоретические сведения.
- •Вопросы для самоконтроля
- •Литература
- •1. Краткие теоретические сведения 2
- •1.1. Понятие ицвп 2
А) суммы; б) произведения
Повторяя эти операции до k = n, мы получим искомое произведение
P = Pn = (1 * Y1 * Y2 * … * Yn-1) * Yn .
Поскольку при вычислениях надобности в запоминании всех сомножителей и промежуточных произведений нет, в качестве p и y нужно использовать простые переменные и накопление произведения вести в цикле по формуле
P = P *Y, (8.10)
где знак = означает присваивание значения.
Если начальное значение р предварительно приравнять единице, то после первого выполнения цикла значение р будет равно первому значению функции, находящейся под знаком произведения.
По аналогии со схемой алгоритма накопления суммы (рис. 8.2,а) построим алгоритм вычислений произведения (рис. 8.2,б). Отличие их состоит только в том, что в блоке 2 присваиваем начальное значение произведения р = 1, а в блоке 5 используем другую рекуррентную формулу.
Необходимость присваивания начального значения переменным S = 0 и р = 1, участвующим в рекуррентных вычислениях но формулам (8.7) и (8.9), соответственно, объясняется и тем фактом, что в ячейках памяти ЭВМ, которые отводит транслятор для хранения значений этих переменных, могут находиться любые произвольные числа, оставшиеся от решения предыдущих задач, и если не сделать присвоения нуля при накоплении суммы (либо единицы при накоплении произведения), то в качестве начального значения будет взято это произвольное число из ячейки памяти ЭВМ и в итоге результат вычислений будет неверен.
Рассмотрим примеры, в которых требуется вычислять суммы и произведения.
Пример 8.1
Вычисление суммы известного числа слагаемых.
Пусть требуется вычислить сумму n чисел натурального ряда s = 1 + 2 + 3 +4 + ... + n, где n – любое наперед заданное число.
Это арифметический цикл, у которого параметром является номер слагаемого, который также определяет и значение очередного слагаемого, включаемого в сумму. Обозначим его буквой i, тогда общая формула тела цикла запишется так:
S = S + i.
Смысл цикличности в том, что к значению суммы многократно прибавляются новые значения слагаемых, обновляя ее. Число повторений цикла равно числу действий сложения, которое нужно выполнить, чтобы достичь результата.
Номер слагаемого (и его значение) i меняется в диапазоне от 1 до n с шагом, равным 1.
Приведем три варианта решения задачи:
Вариант 1. Используется оператор цикла типа арифметической прогрессии for
# include<stdio.h>
int main()
{ int i,n,s;
// i – Управляющая переменная – параметр цикла
// s – Сумма ряда
// n – Число слагаемых, включенное в сумму.
cout << "Введите n :";
cin >> n;
s=0; // Инициализация переменной s нулем обязательна
for(i=1;i<=n;i=i+1) s=s+i; или for(i=1;i<=n;s+=i++);
cout << "Сумма равна s = " << s << endl;
getch();
return 0;
}
Вариант 2. Используется оператор цикла с предусловием
# include<stdio.h>
int main()
{ int a,s;
cout << "Введите n :";
cin >> n;
s=0;
a=1;
while(a<=n)
{ s=s+a;
a=a+1;
}
cout << "Сумма равна s = " << s << endl;
getch();
return 0;
}
Вариант 3. Используется оператор цикла с постусловием
# include<stdio.h>
int main()
{ int a,s;
cout << "Введите n :";
cin >> n;
s=0;
a=1;
do{
s=s+a;
a=a+1;
} while(a<=n);
cout << "Сумма равна s = " << s << endl;
getch();
return 0;
}
Приведенные варианты решения задачи подчеркивает, что любой тип цикла в С++ можно реализовать с помощью любого оператора цикла.
Пример 8.2
Составить программу для вычисления суммы вида
где х = 0,534; k = 0,9; n = 20.
Блок-схема алгоритма решения задачи представлена на рис. 8.3,а.
Таблица 8.1
Таблица выбора идентификаторов примера 8.2
В исходном выражении |
х |
k |
i |
S |
y |
n |
В программе на С++ |
x |
k |
i |
S |
y |
n |
Программа на языке С++ может иметь вид:
int main()
{
int i, n;
float x, k, s, y;
cout << "Введите x, k, n :";
cin >>x >> k >> n;
s=0;
for (i=1; i<=n; i+=1)
{
y = pow(x, i); // можно заменить одним
s = s + y; // оператором s = s + pow(x, i);
}
s = s*k;
cout << "Значение суммы s = " << s << endl;
getch();
return 0;
}
|
|
а)
Рис. 8.З. Блок-схемы алгоритмов: а) примера 8.1; б) примера 8.2
Пример 8.3
Вычислить значение функции:
если х изменяется от нуля с шагом h одновременно с i.
Блок-схема алгоритма решения задачи представлена.на рис. 8.3,б
Таблица 8.2
Таблица выбора идентификаторов примера 8.3
В исходном выражении |
sin |
|
x |
I |
h |
z |
В программе на С++ |
sin |
sqrt |
x |
I |
h |
z |
Программа на языке С++ может иметь вид:
int main()
{
int i;
float x, h, z, y;
cout << "Введите h :";
cin >>h;
x=z=0;
for (i=1; i<=20; i+=1)
{
z = z + sin(x)/sqrt(1 + x);
x = x + h;
}
cout << "Значение суммы z = :" << z << endl;
getch();
return 0;
}
Пример 8.4
Составить фрагмент программы, обеспечивающей вычисление значения
где переменные a и b определяются по формулам:
Для организации определения четности и нечетности переменной введем вспомогательную переменную р, которая будет выполнять функции переключателя по определению четности и нечетности (будем считать, что значение р = 1 соответствует нечетному значению индекса i , а р = 2 соответствует четному значению индекса i ). Блок-схема алгоритма вычисления заданного выражения приведена на рис. 8.4,а.
Таблица 8.3
Таблица выбора идентификаторов примера 8.4
В исходном выражении |
n |
ai |
bi |
I |
p |
|
В программе на С++ |
sn |
a |
b |
I |
p |
|
Программа на языке С++ может иметь вид:
int main()
{
int i, p;
float sn, a, b;
sn=0;
p = 1;
for (i=1; i<=30; i+=1)
{
if (p==1) { a = i; b = i*i; p = 2;} else { a = i/2; b = i*i*i; p = 1;}
sn = sn + pow((a-b), 2);
}
cout << "Значение суммы sn = :" << sn << endl;
getch();
return 0;
}
|
|
а) |
б) |
Рис. 8.4 Блок-схемы алгоритмов: а) примера 8.3; б) примера 8.4
Пример № 8.5
Организация итерационного цикла на примере алгоритма суммирования. Пусть требуется найти сумму прогрессии c точностью ε (например, ε= 0.001).
Количество слагаемых, которое нужно включить в сумму для достижения заданной точности, неизвестно, но известно условие, определяющее точность вычислений. Предел значения очередного слагаемого стремится к нулю:
поэтому можно считать, что именно это значение определяет требуемую точность вычислений, и можно закончить вычисления, когда очередное слагаемое настолько мало, что им можно пренебречь. Все переменные должны иметь вещественный тип, так как участвуют в вычислении вещественного значения.
Программа на языке С++ может иметь вид:
int main ()
{
float S;
float eps; // Значение точности вычислений.
float n; // Номер слагаемого, определяет также его значение,
// изменяется от 1 с шагом 1
cout << "Вычисляем сумму ряда" << endl;
cout << "Введите точность вычислений eps " << endl;
cin >> eps;
n = 1;
S = 0; // Входит в подготовку цикла – правило накопления суммы в цикле
do
{
S += 1 / n;
n += 1;
}
while ( 1. / n >eps); // еps достаточно мало.
cout << "Количество слагаемых n = " << n << endl;
cout << " Сумма S = " << S << endl;
} // End of main
В рассмотренных примерах циклические алгоритмы суммирования являются простыми.
Пример 8.6
Вычислить значение функции
Блок-схема алгоритма представлена на рис. 8.4, б.
Таблица 8.4
Таблица выбора идентификаторов примера 8.4
В исходном выражении |
α |
|
n |
I |
y |
|
В программе на С++ |
alpha |
beta |
n |
I |
y |
|
Программа на языке С++ может иметь вид:
int main()
{
int i, n;
float alpha, beta, y;
cout << "Введите beta, n:";
cin >> beta >> n;
alpha = 1;
for (i=1; i<=n; i+=1)
{
y = (n + i)/i; // Можно заменить одним
alpha = alpha * y; // оператором alpha = alpha *(n + i)/i;
}
alpha = alpha* beta;
cout << "Значение произведения alpha = :" << alpha << endl;
getch();
return 0;
}