Практикум ргппу 2017 3 Аннотация
Скачать 3.14 Mb.
|
Тестовый пример: проверяется только количество цифр. Пример 3. Вычислить сумму n вещественных чисел. Исходные данные: n - количество введенных чисел - целый тип; х – переменная, куда помещаются вводимые числа - вещественный тип. Результат: s - сумма введенных чисел – вещественный тип. При вычислении суммы выполняется операция накопления данных в одной переменной, в данном случае в переменной s: s=s+x. Эта операция должна выполняться n раз. Для того чтобы в результате первой операции накопления было получено значение первого х, переменную S предварительно надо очистить, т.е. s=0. Тестовый пример: при n=7 и последовательности:1.2, 3, 5.6, 6.1, -4, -1, 4.2, s=17.1. Ввод n i=2,n,1 d=rand()%(10) m=rand()%(10) d=d*10+m Вывод d Получаем первую цифру, которая не может быть равна 0 Получаем новую цифру от 0 до 9 Добавляем эту цифру в число #include #include #include #include using namespace std; int main() { int n,m,d; srand(( unsigned )time(NULL)); cout<< "n= " ; cin>>n; d=rand()%(10); for ( int i=2;i<=n;i++) { m=rand()%(10); d=d*10+m; } cout<< "d= " < return 0; } 61 n s=0 i=1,n,1 Ввод x s=s+x Вывод s Ввод n #include #include using namespace std; int main() { int n,x,s=0; cout<< "n=" ; cin>>n; for ( int i=1; i<=n; i++) { cout<< "x= " ; cin>>x; s+=x; } cout<< "s= " < return 0; } Пример 4. Во многих языках программирования отсутствует стандартная операция возведения в степень. Необходимо написать программу возведения в целую степень вещественного числа. Исходные данные: n - степень, в которую возводится число – целый тип. х - число, которое возводится в степень n – вещественный тип. Результат: p – вещественный тип. Возвести в n-ю степень число – значит перемножить это число n раз p=x x x … x Операция перемножения х похожа на операцию сложения, только знак «+» заменяется на знак «*». Как и при сложении, в результате первого действия умножения надо получить само число х, т.е., и в этом отличие от суммирования, первоначально p должно быть равно 1. Тестовый пример: При х=4 и n=5, p=1024. Пример 5. Ввести последовательность из n целых чисел. Найти минимальный член этой последовательности. Исходные данные: n - количество введенных чисел - целый тип; а переменная, куда помещаются вводимые числа – целый тип. p=1 i=1,n,1 p=p*x Вывод p Ввод x,n 62 Результат: min – целый тип. Поиск минимального члена последовательности чисел похож на процедуру определения лучшего результат на соревновании лыжников с раздельным стартом. Когда первый лыжник прибегает на финиш, его результат считается лучшим, т.е. в min записывается этот результат. Затем, когда прибегает очередной лыжник, его результат сравнивается с лучшим (min), и если этот результат меньше, то в значение min записывается этот результат. Следует обратить внимание, что первоначальное значение min не может равняться нулю, так как в результате будет получен этот ноль. Поиск максимального элемента отличается от поиска минимального только проверкой: если новое значение больше текущего максимального, в максимальное значение записывается это новое значение. min=a i=2,n,1 Ввод a Вывод min Ввод n Ввод a a Нет Тестовый пример: при n=7, последовательность: 8, 0, -1, 2, 10, 3, 5, min=-1. Пример 6. Дана числовая последовательность n a n sin , где n=1, … 15. Определить, сколько отрицательных элементов в этой последовательности. k=0 i=1,15,1 an=sin(n) an<0 k=k+1 Вывод k 63 Исходные данные: количество элементов последовательности – 15. Результат: количество отрицательных элементов k – целый тип. Для нахождения количества отрицательных членов необходимо вычислить член последовательности и сравнить его с 0, если член меньше 0 увеличить k на единицу. В начале задачи k необходимо обнулить. Тестовый пример: С помощью Excel получаем k=6. Рассмотренные алгоритмы относятся к так называемым стандартным алгоритмам. Отметим. что у всех этих алгоритмов много общего. Рассмотрим следующую таблицу: Пример 7. Вычислить факториал k. Факториалом называется произведение k!=1 2 3 … k. Исходные данные: k – целый тип. Результат: fact – тип long int. Факториал числа очень быстро растет. Поэтому результат должен иметь длинный целый тип. Тестовый пример: При k=5, fact=120. Пример 8. Даны натуральное число n, символы s 1 , …, s n . Известно, что среди s 1 , …, s n есть по крайней мере одна запятая. Найти такое натуральное i, что s i – первая по порядку запятая; Исходные данные: Количество элементов n целое число, s – вводимый символ. этап Сумма s Произведение p Количество k Минимум min До цикла s=0 p=1 k=0 min=первый элемент В ц и к ле 1 Получение элемента последовательност и Получение элемента последовательност и Получение элемента последовательност и Получение элемента последовательнос ти 2 Проверка, надо ли данный элемент суммировать (необязательно) Проверка, надо ли данный элемент умножать (необязательно) Проверка, удовлетворяет ли элемент условию Проверка, элемент меньше Min? 3 s=s+элемент p=p*элемент k=k+1 min=элемент Fact=1 i=1,k,1 Fact=Fact*i Вывод Fact Ввод k 64 Результат: k – номер первой запятой. Тестовый пример: при n=10 и последовательности ‗4hgj,e,6+,‘ k=5. k=0 i=1,n,1 Ввод s s= ‟,‟ Вывод k Ввод n Да Нет #include #include #include using namespace std; int main() { int n,k=0; char s; setlocale(0, "" ); cout<< "n=" ; cin>>n; cout<< "Введите последовательность символов в строку " ; for ( int i=1;i<=n;i++) { cin>>s; if (s== ',' ) {cout<< "номер первой запятой - " <break ; } } _getch(); return 0; Во многих задачах требуется выполнять вычисления над элементами числовой последовательности, в которой каждый член a n является функцией натурального аргумента n. В примере 6 приведен вариант такой последовательности. Часто по элементам числовой последовательности требуется определить формулу для вычисления n-го элемента. Пример 9. Дана числовая последовательность {a 1 =2, a 2 =5, a 3 =8, …}. Члены последовательности с четными номерами заменили на обратные им числа (5 на -5). Найти сумму членов последовательности с десятого по тридцать первый включительно. Исходные данные: начальный член последовательности 10, конечный член последовательности – 31. Результат: Сумма членов последовательности s – целый тип. Необходимо определить формулу для вычисления члена последовательности в зависимости от номера члена. С увеличением номера на 1 член последовательности изменяется на 3, т.е. член зависит от 3*n. При n=1 элемент равен 2. Чтобы получить 2 необходимо из 3*n вычесть 1. Таким образом a n =3*n-1. Чтобы определить четность номера достаточно найти остаток от деления номера на 2. Если остаток равен 0, то номер четный. Тестовый пример: с помощью Excel получаем s=-33 s=0 i=10,31,1 an=3*n-1 an % 2=0 an= - an Вывод s s=s+an Да Нет 65 Существуют числовые последовательности, в которых каждый новый член вычисляется через предыдущие. Формула, в которой каждый член последовательности вычисляется через предыдущие, называется рекуррентной. Рекуррентная формула, если она существует, позволяет вычислить любой член последовательности посредством вычисления всех предыдущих членов. Пример 10. Пусть a 0 =1; a k =ka k-1 +1/k, k=1,2,… . Дано натуральное число n. Получить a n Исходные данные: номер элемента n - целый тип. Результат: n-й элемент последовательности а – вещественный тип. Тестовый пример: с помощью Excel получаем при n=5, a n =278.12. Рассмотрим пример более сложной рекуррентной формулы Пример 11. Дана числовая последовательность: {a 1 =0, a 2 =4, …, a n =a n-1 -3a n-2 }. Найти сумму отрицательных элементов при n=25. Исходные данные: количество элементов n - целый тип, значение х - a n-2 целый тип, y - a n-1 целый тип. Результат: Сумма отрицательных элементов S – целый тип. Для вычисления нового значения a n необходимо знать 2 предыдущих значения. Для получения нового значения a n надо знать a n-1 и a n-2 , которые необходимо сохранять в дополнительных переменных. Тестовый пример: с помощью Excel получаем S= -1644128 Ввод n k=1,n,1 ak=k*ak+1/k Вывод ak ak=1 66 x=1 y=4 S=0 i=3,25,1 an=y-3*x an<0 S=S+an Вывод S x=y y=an Да Нет Значение а 1 Значение а 2 Значение a n Значение a n-1 в a n-2 Значение a n в a n-1 Пример 12. Даны натуральное число n, символы s 1 , …, s n Выяснить, имеются ли в последовательности s 1 , …, s n такие члены последовательности, что s i и s i+1 совпадает с буквой t. Исходные данные: Количество элементов n целое число, s – вводимый символ. Результат: k – количество пар, равных t. Для сравнения пар введенных символов необходимо сохранять предыдущий введенный символ в переменной а. Тестовый пример: при n=15 в последовательности ‗ertbyttbnvttvcd‘ k=2. Пример 13. Дано натуральное число n. Определить, сколько у этого числа делителей (1 и само число не учитывать). Исходные данные: n – целый тип. Результат: количество делителей k- целый тип. Тестовый пример: при n=24, k=6. k=0 Ввод n i=2,n,1 Ввод a Ввод s s=a и s=‟t‟ k=k+1 a=s Вывод k Да Нет 67 Пример 14. Даны натуральное число n, символы. s 1 , …, s n Подсчитать наибольшее количество идущих подряд запятых. Исходные данные: натуральное число n, вводимые символы s. Результат: Максимальное количество пробелов max целый тип. Если введенный символ равен ‗,‘ надо увеличивать количество запятых идущих подряд на 1 (k). Если символ не запятая, надо проверить k, если символ следует сразу же после запятой (k>0) надо сравнить k с максимальным количеством запятых на данный момент. Если k>max, надо изменить значения max. После сравнения надо обнулить k перед поиском количества в новой серии запятых. Тестовый пример: при n=20, последовательность ‘23,,wer,,,,,tyu,,,cv‘, max=5. Ввод n m=n / 2 k=0 i=2,m,1 n % i=0 k=k+1 Вывод k Наибольший возможный делитель Перебор возможных делителей Да Нет Проверка, является ли i делителем N 68 Ввод n max=0 i=1,n,1 Ввод s s= ‟ „ k=k+1 k=0 k>0 k>max max=k k=0 k>max max=k Вывод max Да Нет Да Да Нет Нет Да Нет Начальное значение max приравниваен 0, т.к. вычисляется максимум среди положительных чисел Ввод количества элементов последовательности обнуляем количество идущих подряд запятых Цикл для перебора элементов последовательности Ввод элемента последовательности Если это запятая Увеличиваем количество запятых Если серия запятых закончилась Если количество запятых в серии больше текущего max Меняем значение max на новое Подготавливаемся к подсчету количества в новой серии Если последовательность заканчивается серией запятых, сравниваем количество с max Если количество больше max, меняем на новое значение Задание 1 Написать программу и отладить Пример 13 Контрольные вопросы 1. Как можно выйти досрочно из цикла. 2. Если начальной значение счетчика окажется меньше конечного значения, будет ли выполняться тело цикла хотя бы один раз. 3. Можно ли при поиске максимального значения в произвольной последовательности чисел первоначальное значения максимума задавать равное нулю и почему. 4. Как будет выглядеть блок-схема примера 3, если надо найти не минимум, а максимум. 5. Почему в примере 12 m=n/2 – наибольший возможный делитель? 6. Объясните проверку условия в примере 12. 7. Объяснить в примере 11 две последние операции в цикле. 69 Индивидуальные задания 1. Спортсмен в первый день пробежал 10 км. Каждый следующий день он увеличивал дневную норму на 10% от результата предыдущего дня. Найти какой путь пробежит спортсмен на 7 день. 2. Даны натуральное число n, символы s 1 , …, s n . Подсчитать: сколько раз среди данных символов встречается символ + и сколько раз символ *; общее вхождение символов +, -, * в последовательность s 1 , …, s n 3. Даны натуральное число n, символы s 1 , …, s n . Известно, что среди s 1 , …, s n есть по крайней мере одна запятая. Найти такое натуральное i, что s i – последняя по порядку запятая. 4. Дана числовая последовательность . Найти сумму членов с 10 по 25-й включительно. 5. Дано натуральное число n. Найти наибольшее среди чисел ) 1 ( sin 2 k ke (k=1, …, n), а также сумму всех этих чисел. 6. Вычислить , где , 7. Дано натуральное число n, действительные числа y 1 , y 2 , …y n . Найти: Max(|z 1 |, |z 2 |, …, |z n |), где случае противном в при , 5 0 , 2 | y | , i i i y z 8. Даны натуральное n. Действительные числа a 1 , …a n . Определить в этой последовательности число соседств двух чисел разного знака. 9. Пусть x 1 =0.3; x 2 =-0,3; x i =i+sin(x i-2 ), i=3,4, …, 100. Найти в этой последовательности ближайшее к какому-нибудь целому. 10. Даны натуральное число n, символы s 1 , …, s n . Выяснить, имеются ли в последовательности s 1 , …, s n такие члены последовательности s i , s i+1 , что s i – это запятая, а s i+1 – тире. 11. Даны натуральное число n, символы s 1 , …, s n . Выяснить, верно ли, что в последовательности s 1 , …, s n имеются пять идущих подряд букв е. 12. Даны натуральное число n, символы s 1 , …, s n . Группы символов, разделенные пробелами (одним или несколькими) и не содержащими пробелов внутри себя, будем называть словами. Подсчитать количество букв в последнем слове данной последовательности. ,... 16 1 , 12 1 , 8 1 2 30 1 ) ( i i i b a случае противном в , нечетное - i если , 3 2 i i b i случае противном в , 2 / нечетное - i если , i i a i 70 Цикл с условием Теория Когда не известно сколько раз проработает цикл, используются циклы с условием. Окончание цикла происходит, когда выполняется/не выполняется условие. Существует два таких оператора цикла. Это цикл с предусловием или цикл «пока», и цикл с постусловием или цикл «до». Цикл с предусловием сначала проверяет, нужно ли выполнять операторы в цикл (тело цикла), а затем выполняет эти операторы. Блок-схема такого цикла и оператор ее реализующую: условие работы цикла тело цикла while ( условие работы цикла) тело цикла; да нет Точно так же как и в операторе со счетчиком, если тело цикла состоит из нескольких операторов, используются операторные скобки { }. Если тело цикла состоит из одного оператора, операторные скобки можно не использовать. В цикле с постусловием сначала выполняется тело цикла, а потом идет проверка условия выхода из цикла. Блок-схема и оператор имеет вид. тело цикла условие выхода из цикла do { тело цикла } while ( условие работы цикла); нет да При разработке программы выбор конкретного типа цикла лучше отложить. Вначале следует разработать блок-схему цикла, а уже затем преобразовать блок- схему в инструкции языка C++. На этом этапе будет проще принять решение об использовании определенного типа цикла языка C++. Цикл for обычно используется при числовых расчетах с применением переменной, изменяющейся при каждом проходе цикла на одну и ту же величину (вообще говоря, цикл for следует рассматривать в качестве основной альтернативы всякий раз, когда мы имеем дело с числовыми расчетами). В большинстве прочих случаев следует использовать циклы while и do-while; выбор нужного — задача довольно легкая. Если тело цикла должно быть выполнено по крайней мере один раз, следует использовать цикл do-while. Если же возможна 71 ситуация, когда тело цикла не будет выполняться ни разу, остановите свой выбор на цикле while. Он довольно часто используется при считывании входных данных, когда есть вероятность того, что входные данные могут отсутствовать вообще. Оператор досрочного выхода из цикла break. Примеры Пример 15. Вещественные числа в программировании всегда являются приближенными т.е. несут в себе погрешность, которая называется погрешностью машинного округления. Разность между вещественной единицей и ближайшим к ней числом, представимым в памяти компьютера называется машинным эпсилон. Найти машинный Исходные данные: начальное значение е=1. е – вещественное число. Результат: значение, которое существенно для компьютера. Пример 16. Дан ряд целых чисел. Сколько отрицательных чисел стоит до первого нуля. Исходные данные: члены ряда записываются в переменную a – целый тип. Результат: количество отрицательных цифр k – целое. e=1 1+e>1 e=e/2 Вывод e да #include #include using namespace std; void main() { double e=1.0; while (1+e>1) e=e/2.0; cout<< "e=" < } нет k=0 Ввод a a<0 k=k+1 a=0 Вывод k нет да да нет #include #include #include using namespace std; void main() { int a,k=0; setlocale(0, "" ); do { cout<< "Введите число " ; cin>>a; if (a<0) k++; } while (a!=0); cout<< "k= " < } 72 Тестовый пример: для ряда 5 -9 6 -8 -3 5 9 0, k=3. Пример 17. Алгоритм Евклида. Даны целые числа A и B. Найти наибольший общий делитель этих чисел. Исходные данные: A, B – целый тип Результат: NOD наибольший общий делитель Тестовый пример: при A=36, B=48, НОД=12. Пример 18. Д ана числовая последовательность: {a 1 =8.2, a 2 =7.9, a 3 =7.6, …} Найти сумму всех положительных членов. Исходные данные: элементы последовательности а – вещественный тип. Из приведенных данных видно, что очередной член числовой последовательности получен из предыдущего члена вычитанием 0.3. Результат: Сумма положительных элементов последовательности S – вещественный тип. Тестовый пример:S=116.2. Пример 19. Дано натуральное число. Определить, сколько цифр в этом числе. Исходные данные: n – целый тип. Результат: количество цифр k – целый тип. a=8.2 s=0 a>0 s=s+a a=a- 0.3 Вывод s Начальное значение элемента Начальное значение суммы Пока элемент положительный Суммирование элемента Получение нового элемента да нет Введите A, B A<>B A>B A=A-B B=B-A „НОД =‟ NOD Да Нет Да Нет NOD=A 73 Для получения количества цифр надо выполнять целочисленное деление на 10, до достижения 0. Тестовый пример: при n=12345, k=5. Пример 20. Создать программу вычисляющую k a Для этого надо вычислить элементы числовой последовательности: , 2 , 1 , 1 : 1 1 1 0 i x k a x k k x a x k i i i Найти первое значение x n , для которого |x n k -a|<10 -4 Исходные данные: a вещественный тип, k – целочисленный тип Результат: x – вещественный тип Тестовый пример: при a=8, k=3, x=2. Пример 21. Ввод a,k x=a p=1 j=1,k-1,1 p=p*x x=((k-1)/k)x+a/(k*p) |p1-a|<10 -4 p1=p*x Вывод x Задание начального значения x Вычисление k-1 степени x Вычисление k-той степени x Вычисление нового x Проверка на конец приближения да нет Ввод n n / 10>0 n=n / 10 Вывод k k=k+1 k=1 Да Нет начальное значение количества цифр - 1 Пока в числе более 1 цифры Сокращение числа на 1 цифру Увеличение количества цифр на 1 74 Дано натуральное число N. Верно ли утверждение, что цифры в этом числе образуют возрастающую последовательность. Исходные данные: N целый тип. Результат: ключ k – равен нулю, если последовательность цифр возрастает, единице, если не возрастает. Для сокращения числа на 1 цифру делим число на 10, для получения цифр в числе вычисляем остаток от деления на 10. Чтобы сравнивать две цифры используем переменные а и b. а – правая цифра в паре, b – левая цифра в паре. Тестовый пример: при N=35679 вывод ‗возрастает‘; при N=35479 вывод ‗не возрастает‘. Пример 22. Даны натуральное число n, символы. Известно, что символ s 1 отличен от восклицательного знака и что среди s 2 , s 3, … есть по крайней мере один восклицательный знак. Пусть – символы данной последовательности, предшествующие первому восклицательному знаку (n заранее неизвестно). Выяснить, верно ли, что среди символов имеются все буквы, входящие в слово дом. Исходные данные: элементы последовательности s – символьный тип. k=0 и a Да если ключ остался равным 0 и вторая цифра меньше первой А Ввод n a=n % 10 n=n / 10 n / 10 >0 b=n % 10 ak=1 Да Нет a=b Да Нет определение последней цифры в числе ключ определяющий возрастание последовательности пока в числе больше 1-й цифры сокращаем число на 1 цифру получаем последнюю цифру в новом числе если последующая цифра меньше предыдущей сохраняем в а значение последней цифры изменяем значение ключа на 1 и выходим из цикла А 75 Результат: количество букв «о» о – цедый тип, количество букв «д» d – целый тип, количество букв «м» m – целый тип. Если каждое из этих значений больше 0 – из символов последовательности можно составить слово «дом». Тестовый пример: при вводе последовательности ‗имркпоовдя!‘ – вывод ‗можно‘ при вводе последовательности ‗имркпгрпоовя!‘ – вывод ‗нельзя‘ Задание 2 Написать и отладить программу для примеров 21 и 22. Контрольные вопросы. 1. Когда надо использовать цикл «до», а когда цикл «пока». 2. К какому виду цикла относится цикл со счетчиком. 3. Какой из 3 циклов является универсальным. 4. Укажите, в каких ситуациях вместо цикла со счетчиком приходится использовать цикл while. 5. Всегда ли цикл while можно заменить циклом do. 6. Какой оператор надо использовать, если надо досрочно выйти из цикла. s d=0 o=0 m=0 s=‟д‟ s=‟м‟ d=d+1 m=m+1 s=‟о‟ o=o+1 s=‟!‟ да нет да нет да нет да нет А d>0 and o>0 and m>0 нельзя можно да нет А 76 7. Что означает условие выхода из цикла в примере 15. 8. Что такое наибольший общий делитель и каком алгоритм его нахождения. 9. Как можно сократить пример 20. Индивидуальные задания 1. Спортсмен в первый день пробежал 10 км. Каждый следующий день он увеличивал дневную норму на 10% от результата предыдущего дня. Найти через сколько дней спортсмен пробежит суммарный путь более 100 км? 2. Сколько чисел нужно взять в последовательности ..., 4 1 3 1 2 1 чтобы получить число, больше чем N? 3. Шары расположены в форме треугольника так, что в первом ряду находится один шар, во втором – два, в третьем – три и так далее. Сколько рядов удастся построить, если имеется N шаров? 4. Вывести значения K, для которых Z=U+M-20K+T больше 0, 2U, если M<2 где K= U, если 2 M 4 1-M, если M>4 и U=3M+1, M изменяется от 0 до 6 с шагом 1.5, Т – произвольное число. 5. Дано натуральное n. Выяснить, входит ли цифра 3 в запись числа n2. 6. Дано натуральное n. Чему равна сумма его цифр? 7. Даны действительные числа x, y (x>1, y>1). Получить целое число k, удовлетворяющее условию k k y x y 1 8. Даны натуральное число n, символы. Известно, что символ s 1 отличен от восклицательного знака и что среди s 2 , s 3 , … есть по крайней мере один восклицательный знак. Пусть – символы данной последовательности, предшествующие первому восклицательному знаку (n заранее неизвестно). Определить количество пробелов среди s 1 , …, s n 9. Даны натуральное число n, символы. Известно, что символ s 1 отличен от восклицательного знака и что среди s 2 , s 3 , … есть по крайней мере один восклицательный знак. Пусть – символы данной последовательности, предшествующие первому восклицательному знаку (n заранее неизвестно). Выяснить, имеется ли среди s 1 , …, s n пара соседствующих одинаковых символов. 10. Даны натуральное число n, символы. Известно, что символ s 1 отличен от восклицательного знака и что среди s 2 , s 3 , … есть по крайней мере один восклицательный знак. Пусть – символы данной последовательности, предшествующие первому восклицательному знаку (n заранее неизвестно). Выяснить, верно ли, что в последовательности имеются пять идущих подряд букв е. 11. Дано натуральное число N. Если число содержит 5 цифр, то получить новое число M, которое образуется путем исключения средней цифры исходного числа Если количество цифр не 5, то M=N. 77 12. Среди всех n-значных чисел указать те, сумма цифр которых равна заданному числу k. 78 Вычисления с точностью* Теория Число x называется пределом числовой последовательности {a 1 , a 2 , …, a n }, если для любого сколь угодно малого можно указать такое достаточно большое положительное число N, что для всех n>N выполняется неравенство |a n – x|< Многие из математических величин или значений функций могут быть выражены как сумму таких бесконечных последовательностей. Например функции sin(x) и cos(x). )! 2 ( ) 1 ( ! 6 ! 4 ! 2 1 ) cos( )! 1 2 ( ) 1 ( ! 5 ! 3 ! 1 ) sin( 2 6 4 2 1 2 5 3 n x x x x x n x x x x x n n n n Чем больше членов ряда участвуют в вычислении суммы, тем более точным получается результат. Разность между суммой ряда и суммой бесконечного ряда называется погрешностью сложения. Часто оценивают n- ный член, если он достаточно мал, т.е. меньше некоторого числа , которое часть называют точностью, считается, что найденная сумма достаточно хорошо приближается к действительному значению суммы и следующие слагаемые можно не учитывать. Приведем блок-схему алгоритма вычисления суммы с заданной точностью S=0 a= нач.знач. |a|> точность n= нач. знач. Вычисление значение a S=S=a n=n+1 Ввод данных Вывод S да нет Очистка суммы Задать начальное значение элементу последовательности Задать начальное значение n проверить, надо ли суммировать этот элемент Суммирование элемента последовательности Вычисление нового элемента последовательности Получение сследующено n 79 Примеры Пример 23. Вычислить бесконечную сумму с заданной точностью ( >0). 0 2 5 4 1 i i i Исходные данные: точность eps вещественный тип, член последовательности а – вещественный тип. Результат: сумма S – вещественный тип. Тестовый пример: при eps=10 -4 , S=0.0482. При вычислении суммы бесконечного ряда, члены ряда с увеличением номера стремятся к нулю. Это происходит потому, что значение знаменателя быстро растет и в конце концов достигает очень большого значения, что приводит к ошибке переполнения. Чем выше точность, тем легче получить такую ошибку. В некоторых ситуациях этого модно избежать, если использовать рекуррентную формулу, т.е. выразить новый член ряда через предыдущий. Рассмотрим примеры построения рекуррентной формулы. Пример 24. Даны действительные числа x, (x 0, >0). Вычислить с точностью : a=1/(1+25) s=0 i=0 Ввод eps |a|>eps a=1/(p1+p2) s=s+a Вывод s да нет p1=pow(4,i) p2=pow(5,i+2) i=i+1 #include #include #include using namespace std; void main() { int i; double a,eps,p1,p2,s=0; cout<< "eps=" ; cin>>eps; i=0; a=1.0/(1+25); while (fabs(a)>eps) { s=s+a; i++; p1=pow(4.0,i); p2=pow(5.0,i+2); a=1/(p1+p2); } cout<< "s= " < <_getch(); } 80 0 2 ! 2 k k k k x Попробуем выразить формулу для a k+1 через a k ! 2 2 k x a k k k ) 1 ( 2 ) 1 ( 2 ! 2 ) 1 ( ! 2 2 )! 1 ( 2 2 2 2 2 2 1 ) 1 ( 2 1 k x a k x k x k k x x k x a k k k k k k k k Таким образом: k k a k x a ) 1 ( 2 2 1 Исходные данные: x – вещественный тип, eps – вещественный тип, член последовательности а – вещественный тип. Результат: сумма S – вещественный тип. Тестовый пример: при eps=10 -4 , x=1, S=1.6488. Следует обратить внимание, что так как рекуррентная формула составлена для a k+1 , увеличение k на единицу выполняется после вычисления a. Рассмотрит еще пример построения рекуррентной формулы: ) 3 4 ( )! 1 2 ( ) 1 ( 3 4 k k x a k k k ) 7 4 ( ) 3 2 ( ) 2 2 ( )! 1 2 ( ) 1 ( ) 1 ( ) 7 4 ( )! 3 2 ( ) 1 ( ) 1 ( ) 3 ) 1 ( 4 ( )! 1 ) 1 ( 2 ( ) 1 ( 4 3 4 3 4 4 3 ) 1 ( 4 1 1 k k k k x x k k x k k x a k k k k k k k ) 7 4 )( 3 2 )( 2 2 ( ) 3 4 ( ) 1 ( ) 7 4 ( ) 3 2 ( ) 2 2 ( ) 1 ( ) 3 4 ( ) 3 4 ( )! 1 2 ( ) 1 ( 4 4 3 4 k k k k x a k k k x k k k x k k k k=0 S=0 |a|>eps a=1 S=S+a k=k+1 a=x*x*a/(2*(k+1)) Вывод S Ввод x, eps да нет 81 В некоторых числовых последовательностях требуется получать элементы до тех пор, пока разность между элементами не достигнет заданной точности: |a n - a n-1 |< . В этом случае надо сохранять в памяти два элемента последовательности. Пример 25. Данодействительное число ( >0). Последовательность a 1 , a 2 , … образована по следующему закону: 1 1 1 3 1 1 2 1 1 n a n Найти первый член a n (n 2), для которого выполняется условие |a n -a n-1 |< Исходные данные: eps – вещественный тип, элемент a n-1 а1 – вещественный тип, элемент a n а2 вещественный тип Результат: элемент a2 - вещественный тип. Тестовый пример: при eps=10 -4 , a2=0.14. Задание 3 Написать и отладить программу для примера 23. Контрольные вопросы 1. Почему при вычислении суммы бесконечной последовательности можно ограничить количество членов. 2. Почему в проверке на достижение точности член ряда указан по модулю. 3. В какой ситуации при вычислении с заданной точностью, несмотря на увеличение члена ряда с ростом n, можно завершить вычисления в цикле. 4. Почему рекомендуется получать рекуррентное соотношение для вычисления суммы ряда, который содержит факториал и возведение в целую степень. 5. Можно ли для примера 1 построить рекуррентное соотношение. Ввод eps a2=1/2 n=1 a2=a1 (1-1/(n+1)) n=n+1 a1=a2 |a1-a2| да нет Начальное значение n Начальное значение а n Значение a n передается в a n-1 Переход к следующему n Получаем a n цикл заканчивается когда разнича между членами ряда станет меньше eps 82 6. Если в примере 2 условие выхода из цикла будет не значение элемента меньше , а значение разности меньше . Количество слагаемых будет больше или меньше. Индивидуальные задания В приведенных вариантах заданий вычислить значения функций с помощью бесконечного ряда и с помощью соответствующих математических функций. Сравнить результаты. Вариант Задание 1 x при , + + + x = x + = x + x = n + 5x 1 3x 1 1 2 1 2n 1 2 1 1 ln 5 3 0 1 2n 2 1 1 4 3 2 1 1 4 3 2 0 x при , ! x + ! x ! x + x = n! x = e = n n n x 3 1 1 4 3 2 1 1 1 ln 4 3 2 0 1 x при , x x + x x = + n x = + x = n + n n 4 1 5 3 2 1 2n 2 1 1 ln 5 3 0 1 2n < x при , + x + x + x = + x = x x + = n + 5 1 1 4 2 1 ln 4 2 1 < x при , + x + x + x = n x = x = n n 6 1 5 3 2 1 2n 1 2 5 3 0 1 2n 1 x при , x x + x π = + x + π = x arcctg = n + + n 7 1 5x 1 3x 1 1 2 1 2n 1 2 5 3 0 1 2n 1 > x при , + x π = x + + π = x arctg = n + + n 8 1 7 5 3 1 2n 1 ) ( 7 5 3 0 1 2n x при , + x x + x x = + x x arctg = n + n 9 < x при , ! x + ! x ! x + x = n! x = e = n n x 4 3 2 1 1 8 6 4 2 0 2n 2 10 < x при , + ! x ! x + ! x = ! x = x = n n 6 4 2 1 2n 1 cos 6 4 2 0 2n 11 < x при , + ! x ! x + ! x = ! + x = x x = n n 7 5 3 1 1 2n 1 sin 6 4 2 0 2n 12 0 1 5 1 1 3 1 1 1 2 1 1 2n 1 2 ln 5 5 3 3 0 1 2n 1 2n > x при , + + x x + + x x + + x x = + x + x = x = n + + |