Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР8-С++-10-апреля-2012.doc
Скачиваний:
9
Добавлен:
15.09.2019
Размер:
3.09 Mб
Скачать

А) суммы; б) произведения

Повторяя эти операции до 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;

}