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

Алгоритмические основы информатики. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
774 Кб
Скачать

int init_dep; //первоначальный вклад;

int percent; //процент годового вклада float contribution; //вклад

float size; // заданный размер вклада cout<<"init_dep = ";cin>>init_dep; cout<<"percent = "; cin>>percent; cout<<"size=";cin>>size;

int t=0; contribution=init_dep; while (contribution<size)

{

t++;

contribution+=contribution*percent/100;

}

cout<<"t="<<t<<endl; cout<<"contribution - "<<contribution; return 0;

}

Пример 4. Торговая фирма в первый день работы реализовала товаров на R тыс. руб., а затем ежедневно увеличивала выручку на 10 %. Какой будет выручка фирмы в тот день, когда она впервые превысит заданное значение Z? Сколько дней придется торговать фирме для достижения этого результата?

/*Торговая фирма в первый день работы реализовала товаров на R тыс. руб., а затем ежедневно увеличивала выручку на 10%. Какой будет выручка фирмы в тот день, когда она впервые превысит заданное значение Z? Сколько дней придется торговать фирме для достижения этого результата? */

#include <iostream> using namespace std;

int main()

{

int t, r, z;

cout<<"r,z= "; cin>>r>>z; float reven=r; //выручка t=1;

while (reven<z)

{

t++;

reven+=reven*0.1;

}

41

cout<<"reven= "<<reven<<endl; cout<<"t= "<<t;

return 0;

}

Пример 5. Малое предприятие в первый день работы выпустило R единиц товарной продукции. Каждый последующий день оно выпускало продукции на W единиц больше, чем в предыдущий. Сколько дней потребуется предприятию, чтобы общее количество выпущенной продукциизавсевремяработывпервыепревысилозапланированныйобъем?

/*Малое предприятие в первый день работы выпустило R единиц товарной продукции. Каждый последующий день оно выпускало продукции на W единиц больше, чем в предыдущий. Сколько дней потребуется предприятию, чтобы общее количество выпущенной продукции за все время работы впервые превысило запланированный объем? */

#include <iostream> using namespace std;

int main()

{

float r, z, t; cout<<"r,z = ";cin>>r>>z;

float reven = r; //выручка t=1;

while (reven<z)

{

t++;

reven+=reven*0.1;

}

cout<<"reven= "<<reven<<endl; cout<<"t = "<<t;

return 0;

}

Пример 6. Дано натуральное число N. Получить его запись в двоичной, восьмеричной системах счисления.

/*Дано натуральное число N. Получите его запись в двоичной, восьмеричной системах счисления. */

#include <iostream>

42

using namespace std;

int translation(int n, int p)

{

int tr=0; int razr=1; while (n>0)

{

int t=n%p*razr; tr+=t; razr*=10; n/=p;

}

return tr;

}

int main()

{

int n;

cout<<"n = ";cin>>n; cout<<translation(n,2)<<endl; cout<<translation(n,8)<<endl; return 0;

}

2.5.2. Реализация алгоритмов обработки бесконечных рядов

Часто для вычисления некоторой функции используется её разло-

жение в бесконечный ряд. Например, функцию можно представить в виде ряда Маклорена:

Ряды можно суммировать, учитывая количество слагаемых (например, найти сумму первых n слагаемых) или, если ряд сходящийся, то вычислять сумму с заданной точностью.

Правило. Сумма сходящегося ряда подсчитана с заданной точно-

стью ε, т. е. выполняется неравенство Sn – Sn+1 , если Pn+1 , где Sn – сумма первых n слагаемых, Sn+1 сумма первых n+1 слагае-

мых, Pn+1 n+1 слагаемое.

Исходя из этого правила, несложно понять, что для вычисления суммы ряда с заданной точностью необходимо продолжать процесс суммирования до тех пор, пока абсолютное значение очередного слагаемого превосходит значение заданной точности. Если же очередное

43

слагаемое оказалось меньше (или равно) искомой точности, то процесс суммирования можно прекратить.

Вычисление слагаемых суммируемого ряда далеко не всегда является тривиальной задачей. В зависимости от вида слагаемых ряда выбирается и метод их вычисления. Условно все ряды можно разбить на три группы. Дадим их характеристику и рассмотрим, каким образом лучше суммировать эти ряды.

Первая группа

Первая группа – ряды, в которых каждое слагаемое, кроме, может быть, одного или нескольких первых, полностью выражается через предыдущее слагаемое. Обычно это ряды, в которых для каждого слагаемого требуется вычислять факториалы и возводить некий аргумент в степени высших порядков.

Пример 1. Найти сумму ряда с заданной точностью ε:

.

Как вести суммирование такого ряда? Прежде всего, необходимо вывести формулу для вычисления очередного слагаемого. Введём обозначения для очередных слагаемых:

и так далее. Очевидно, что можно выразить:

.

В общем виде можно записать:

.

Эта формула справедлива для всех слагаемых, кроме P0. Следовательно, все слагаемые, кроме нулевого, вычисляем по этой формуле в цикле и добавляем к ранее найденной сумме. Процесс суммирования продолжаем до тех пор, пока очередное слагаемое не станет меньше или равно требуемой точности.

Возможная реализация программы:

#include <iostream> using namespace std;

44

#include <cmath> int main()

{

double x, p, s, i, eps = 1.0e-4; cout << "x = ";

cin >> x;

for(i = 1, s = 1, p = 1; fabs(p) > eps; i++)

{

p = - p * x / i; s += p;

}

cout << "s = " << s << endl;

return 0;

}

Вторая группа

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

Пример 2. Найти сумму ряда с заданной точностью ε:

… .

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

Возможная реализация программы:

#include <iostream> using namespace std; #include <cmath> int main()

{

double a, x, p, s, i, eps = 1.0e-4; cout << "x = ";

cin >> x;

for(i = 1, a = 1, s = 1, p = 1; fabs(p) > eps; i++)

{

45

a = - a * x / i; p = a / i;

s += p;

}

cout << "s = " << s << endl; return 0;

}

Третья группа

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

Пример 3. Найти сумму первых n слагаемых:

.

Найти формулу для вычисления, очередного слагаемого несложно:

.

Обратите внимание на следующий момент. В предыдущих двух примерах изменение знака слагаемых мы очень просто реализовали или в формулах вычисления очередного слагаемого

p = - p * x / i; // пример 1,

или части слагаемого

a = - a * x / i; // пример 2.

Здесь же (пример 3) пришлось завести специальную переменную z для изменения знака слагаемых, т. е. переменная z может принимать только два значения: 1 или –1. Вычислять это проще всего по формуле:

z = –z.

Естественно, до начала суммирования переменная z должна получить необходимое значение (в нашем случае z=1).

Возможная реализация программы:

#include <iostream> using namespace std; int main()

{

double i, p, s = 0, z = 1; int n = 10;

for(i = 2; i <= n + 1; i++)

46

{

p = z * (i * i - 1) / (i * i * i); s += p;

z = -z;

}

cout << "s = " << s << endl; return 0;

}

Задачи

1.Дано натуральное число N. Получить его запись в шестнадцатеричной системе счисления.

2.Среди чисел

найти номер и значение первого по порядку числа, абсолютная величина которого меньше заданного eps>0. Если таких чисел нет, выведите на печать соответствующий текст.

3. Вычислить приближённое значение бесконечной суммы:

.

Суммирование производите до тех пор, пока очередное слагаемое не станет по абсолютной величине меньше заданного числа e>0.

4. Написать программу для подсчета суммы с заданной

точностью е (е0).

Указание по решению задачи. Рассмотрим, что представляет из себя

заданный ряд: . Как видим, общий

член ряда с увеличением значения i стремится к нулю. Поэтому данную сумму можно вычислить, но только с определенной точностью e. Заметим также, что последовательность слагаемых можно выразить

спомощью рекуррентного соотношения a1=-1, , а всю сумму –

спомощью рекуррентного соотношения S0=0, Sn=Sn-1+an. (Данные рекуррентные соотношения выведите самостоятельно.)

47

2.6. Алгоритмы обработки элементов одномерного массива

До сих пор мы рассматривали примеры работы с небольшим количеством данных, для чего достаточно использовать только простые переменные. Если данных много, то использование одних простых переменных становится явно недостаточным. Гораздо удобнее объединять их в более сложную организацию данных, например, в массивы.

Массив – это совокупность данных одного типа, имеющая одно общее имя. Доступ к отдельному элементу массива осуществляется путем указания имени массива и номера (индекса) этого элемента. До использования массива его необходимо определить, т. е. дать ему имя и указать количество и тип элементов.

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

Для того, чтобы начать работать с массивом, необходимо дать его описание. Формальная запись описания массива такова:

– Тип_элементов_массива имя массива [Количество_элементов];

где

Тип_элементов_массива любой стандартный или ранее определённый пользователем тип данных;

Имя_массива – обычный идентификатор;

Количество_элементов – целое число, большее 0, возможно, именованная константа.

При работе с одномерными массивами существует большое количество алгоритмов, которые считаются типовыми, т. е. часто встречающимися в практических задачах.

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

Основным требованием при составлении алгоритмов обработки массивов является использование минимально необходимого числа переменных. На начальном этапе решения задачи целесообразно рас-

48

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

Пример 1. В заданном целочисленном одномерном массиве A(N) найти среднее арифметическое положительных элементов

/* В заданном целочисленном одномерном массиве A(N) найти среднее арифметическое положительных элементов */

#include <iostream> #include <conio.h> using namespace std;

float sr(int n,int b[10]){

int k=0;int i; float s=0; float sa; for(i=0;i<n;i++)

if (b[i]>0) { k++;s+=b[i]; } if (k>0) sa=s/k;

else sa=s; return sa;

}

int main() {

int i,n,b[20];float s; cout<< "n = "; cin>>n; for (i=0;i<n;i++){ cout<<"b["<<i+1<<"]= "; cin>>b[i];

}

s=sr(n,b); cout<<"sa = "<<s;

}

Пример 2. В заданном одномерном массиве A(N) найти сумму наибольшего и наименьшего по величине элементов.

/* В заданном одномерном массиве A(N)найти сумму наибольшего и наименьшего по величине элементов */

#include <iostream>

49

#include <conio.h> using namespace std;

float mn(int n,int b[10]){ int m1,m2;int i; m1=b[0];m2=b[0]; for(i=1;i<n;i++)

if (b[i]<m1) m1=b[i]; else

if (b[i]>m2) m2=b[i]; float d=m1+m2; return d;

}

int main() {

int i, n, b[20]; float s; cout<<"n = "; cin>>n; for (i=0;i<n;i++){ cout<<"b["<<i+1<<"]= "; cin>>b[i];

}

s=mn(n,b); cout<<"s = "<<s;

}

Пример 3. Элементы исходного целочисленного массива A(N) расположить в обратном порядке

/* Элементы исходного целочисленного массива A(N) расположить в обратном порядке */

#include <iostream> using namespace std; const int n_max=30;

void input_v(int a[n_max],int &n); void output_v(int a[n_max],int n); void preobraz(int a[n_max],int n);

int main(){ int a[n_max]; int n; input_v(a,n); output_v(a,n);

50

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]