Читайте также:
|
|
Кафедра вычислительной техники
Отчет о лабораторной работе
по дисциплине
«Программирование»
на тему
«Определение суммы сходящегося числового ряда»
Выполнили:
студенты группы 2891 ________________ (С.С. Мамонтов)
________________ (М.А. Марчук)
________________ (А.М. Синилов)
________________ (В.Б. Сысоев)
Проверил:
________________ ()
Санкт-Петербург, 2012
Содержание
1 Цель работы............................................................................................................................ 3
2 Задача.......................................................................................................................................... 3
3 Алгоритм................................................................................................................................... 3
4 Текст программы................................................................................................................. 5
5 Вывод.......................................................................................................................................... 7
Цель работы
Познакомиться со средой разработки Borland C++ 3.1 и основными операторами языка программирования C++. Получить практические навыки в разработке алгоритма и его реализации на языке высокого уровня.
Задача
Задан сходящийся числовой ряд, состоящий из членов вида:
Необходимо вычислить сумму данного ряда Sn с заданной точностью Eps. Пользователь вводит переменную x, желаемую точность Eps и максимальное количество членов ряда n, суммированием которых программа должна ограничиться при вычислении.
Алгоритм
В заданном ряду существует зависимость очередного члена ряда Xn+1 от предыдущего Xn:
Это позволяет достаточно просто организовать вычисление суммы ряда Sn в цикле, ограниченном веденными пользователем n шагами. Нам необходимо хранить текущее значение суммы Sn и значение текущего члена ряда Xn. На каждом шаге цикла мы вычисляем значение очередного члена ряда Xnn по вышеприведенной формуле и суммируем его с текущим значением Sn, получая текущую сумму ряда. Цикл продолжается пока модуль приращения суммы т.е. в данном случае |Xnn| будет больше заданной точности Eps и не превышено максимальное количество вычисляемых членов n, заданное пользователем.
Блок-схема алгоритма программы приведена на рисунке 1.
Рисунок 1 – Блок-схема алгоритма программы.
В некоторых случаях, когда модуль переменной x меньше Eps, мы уже на первом шаге цикла получим приращение суммы меньше заданной точности. Чтобы корректно вычислять сумму ряда и исключить подобные случаи, введем дополнительное условие на окончание цикла: |Xnn| < |Xn| это означает, что максимальный член ряда уже был просуммирован и приращение суммы убывает по модулю.
Текст программы
Файл MERRITT.CPP:
#include <stdio.h>
#include <conio.h>
#include <math.h>
void main()
{
char ch; //вспомогательный символ для диалогов
int n; //Максимальное количество вычисляемых членов
double eps; //задаваемая точность вычисления суммы
double x; //x, просто x.
double Sn; //Итоговая сумма
double Xn, Xnn; //два последних члена ряда
int i; //вспомогательная переменная
clrscr(); //уборка
printf("\nВычисление суммы сходимого числового ряда");
printf("\nSn = 1 + x + x^2/2! +... + x^(n-1)/(n-1)!");
printf("\nс заданным максимальным количеством вычисляемых членов n ");
printf("и точностью eps.");
do //Начало цикла x
{
x=0; //заведомо не подходящее начальное значение
do //цикл непосредственного ввода х
{
printf("\nВведите х (х<>0):");
scanf("%lf",&x);
fflush(stdin);
}
while (x==0); //конец ввода x, нам нужен х не равный 0
do //Начало цикла по точности (eps)
{
eps=-1;//заведомо не подходящее начальное значение
do //цикл непосредственного ввода eps
{
printf("\nВведите eps (eps>=0):");
scanf("%lf",&eps);
fflush(stdin);
}
while (eps<0); //конец ввода eps. нам нужен eps больше или равный 0
//eps=0 допущен специально, для задания недостижимой
//точности
do //начало цикла по n
{
n=0; //заведомо не подходящее начальное значение
do //цикл непосредственного ввода n
{
printf("\nВведите максимальное число суммируемых членов n (n>1):");
scanf("%d",&n);
fflush(stdin);
}
while (n<1);//конец ввода n. нам нужно как минимум 2 члена
//поэтому n как минимум равно 2
//Основной цикл вычислений
Xnn=1; //Ввод начальных значений
Sn=1;
printf("\nX 0-й = %1.20f, Сумма Sn=%1.20f ",Xnn,Sn); //Вывод X0
for(i=1;i<n;i++) {//Начало цикла. Количество шагов ограничено n
Xn=Xnn; //Сохраняем значение i-1 члена
Xnn=Xn*x/i; //Вычисляем значение текущего i-го члена
Sn=Sn+Xnn; //Вычисляем Сумму
printf("\nX %d-й = %1.20f, Сумма Sn=%1.20f ",i,Xnn,Sn); //Вывод
//выходим из цикла при соблюдении 2 условий
if((fabs(Xnn)<fabs(Xn)) //приращение убывает по модулю
&&(fabs(Xnn)<eps)) break;//приращение меньше заданной погрешности
}//Конец цикла вычислений
// Вывод результатов
printf("\n\nВычисленное значение суммы ряда Sn = %1.20f",Sn);
printf("\nЗаданная точность eps = %1.20f",eps);
printf("\nПоследний вычисленный член Xn = %1.20f",Xnn);
if(i==n) {// В этом случае цикл отработал максимальное кол-во шагов
// не достигнув заданной точности
printf("\nВычислена сумма %d членов",i);
printf("\nЗаданная точность не достигнута на %d-м члене",i-1);
// Возможно нужная точность не достигнута, тк модуль
// приращения возрастал. Проверка и вывод этой инф-и
if(! (fabs(Xnn)<fabs(Xn)))
printf("\nЗначение модуля приращения возрастает");
//тк за заданное количество шагов нужная точность не достигнута
//предлагается ввести другое количество шагов
printf("\nЗадать другое максимальное количество членов \
суммы? (y/n):");
ch=getche();
}
else { //В этом случае нужная точность достигнута
printf("\nВычислена сумма %d членов",i+1);
printf("\nЗаданная точность достигнута на %d-м члене!",i);
ch='N'; // Цикл по n повторяться не будет.
}
}
while(ch=='y' || ch=='Y' || ch=='н' || ch=='Н');//конец цикла по n
//Возможно пользователь хочет поменять точнось?
printf("\nЗадать другую точность (eps)? (y/n):");
ch=getche();
}
while(ch=='y' || ch=='Y' || ch=='н' || ch=='Н');//конец цикла по eps
//Возможно пользователь хочет изменить x?
printf("\nЗадать другой x? (y/n):");
ch=getche();
}
while(ch=='y' || ch=='Y' || ch=='н' || ch=='Н');//конец цикла по x
printf("\nДля завершения программы нажмите любую клавишу.");
getch();//на этом все, конец
}
Вывод
Пример работы программы показан на рисунке 2.
Рисунок 2 – Пример выводимых программой данных.
Дата добавления: 2015-10-26; просмотров: 96 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Таким образом, грамотное использование лексических и грамматических единиц позволяет автору более точно реализовать свой замысе. | | | LES SYMBOLES DE LA FÊTE DE PÂQUES |