Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2009, 08:19   #1
Skrip
Пользователь
 
Аватар для Skrip
 
Регистрация: 04.06.2009
Сообщений: 45
Сообщение Программирование алгоритмов итерационной циклической структуры

Стоит такая задача:
Вычислить значение суммы членов бесконечного ряда с заданной точностью e=0.00001 на интервале от Хнач до Хкон с шагом dx. Сделать проверку на случай расходимости в программе.
Вот мой код:
Код:
#include <iostream.h>
#include <windows.h>
#include <math.h>
#include <stdio.h>

char*Rus (const char*text);


void main()

{
	const int maxiter=500; //максимально допустимое число итераций
	double xn,xk,dx, eps;
	bool done=true; //признак достижения точности
	double sn, s; //начальное значение суммы и первый член ряда
    int n;
	//Ввод начальных значений
	printf(Rus("Введите начальное значение аргумента: "));
	cin>>xn;
	printf(Rus("Введите конечное значение аргумента: "));
	cin>>xk;
	printf(Rus("Шаг: "));
	cin>>dx;
	
	//Оформление
    printf(Rus("\t\t\tФуникция arccos(x)\nx\t\tarccos(x)\tn\n---------------------------------\n"));
	
	const double pi=3.1415;
	eps=0.00001;

	for(double x=xn; x<=xk; x+=dx)
	{
        s=x;//первый член при n=0
		sn=0.5;
		n=1;
		while(sn>eps)
		{
			sn*=((2*n-1)*(2*n-1)*(2*n-2)*x*x)/(2*n*(2*n+1)*(2*n-3));//Вычисление очередного члена ряда
			s+=sn;//Сумма членов
			if(n++>maxiter)//проверка на расходимость ряда 
			{
				done=false;
				break;
			}
		}
		if(!done)//вывод
		{
			cout<<Rus("Ряд расходится!")<<endl;
			done=true;
		}
		else printf("%f\t%f\t%d\n",x,pi/2-s,n);
	}
	int a;
	cin>>a;

}
char bufRus[256];
char*Rus (char const*text)
{
	CharToOem(text,bufRus);
	return bufRus;
}
//Skrip\\
К сожалению, он не верно считает арккосинус..

Модератор: тег CODE
Я спокойный, вежливый и уравновешенный человек

Последний раз редактировалось Sazary; 04.06.2009 в 12:48.
Skrip вне форума Ответить с цитированием
Старый 04.06.2009, 13:46   #2
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

А что за формулу вы использовали для разложения?

И хорошо бы добавить еще один столбец, куда бы выводилось реальное значение арккосинуса (которое даст функция acos). Для сравнения.

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

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 04.06.2009, 17:31   #3
Skrip
Пользователь
 
Аватар для Skrip
 
Регистрация: 04.06.2009
Сообщений: 45
По умолчанию

arccosx=πи/2-(x+∑_(n=1)^∞ (1∙3∙…∙(2n-1)∙x^(2n+1))/(2∙4∙…∙2n∙(2n+1)))

я использовала эту формулу по условию. Значение очередного слагаемого ряда находила умножением предыдущего слагаемого на коэффициент, полученного делением выражения n-го и (n-1)-го членов суммы ряда.
Я спокойный, вежливый и уравновешенный человек
Skrip вне форума Ответить с цитированием
Старый 04.06.2009, 17:50   #4
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Подправил:
Код:
#include <iostream.h>
#include <windows.h>
#include <math.h>
#include <stdio.h>

char*Rus (const char*text);


int main()

{
	const int maxiter=500; //максимально допустимое число итераций
	double xn,xk,dx;
	bool done=true; //признак достижения точности
	double sn, s; //начальное значение суммы и первый член ряда
    int n;
	//Ввод начальных значений
	printf(Rus("Введите начальное значение аргумента: "));
	cin>>xn;
	printf(Rus("Введите конечное значение аргумента: "));
	cin>>xk;
	printf(Rus("Шаг: "));
	cin>>dx;
	
	//Оформление
    printf(Rus("\t\t\tФуникция arccos(x)\nx\t\tarccos(x)\tn\n---------------------------------\n"));
	
	const double eps=0.00001;

	for(double x=xn; x<=xk; x+=dx)
	{
  s=x;//первый член при n=0
		sn=x;
		n=1;
		while(sn>=eps)
		{
			sn*=((2*n-1)*x*x)/(2*n*(2*n+1));//Вычисление очередного члена ряда
			s+=sn;//Сумма членов
			if(n++>maxiter)//проверка на расходимость ряда 
			{
				done=false;
				break;
			}
		}
		if(!done)//вывод
		{
			cout<<Rus("Ряд расходится!")<<endl;
			done=true;
		}
		else printf("%lf\t%lf\t%d\t%lf\n",x,M_PI_2-s,n,acos(x));
	}
	
	cin.get();
	cin.get();

}
char bufRus[256];
char*Rus (char const*text)
{
	CharToOem(text,bufRus);
	return bufRus;
}
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 04.06.2009, 18:22   #5
Skrip
Пользователь
 
Аватар для Skrip
 
Регистрация: 04.06.2009
Сообщений: 45
По умолчанию

Хм.. у меня выдает ошибку.., связанную с числом пи..
Я спокойный, вежливый и уравновешенный человек
Skrip вне форума Ответить с цитированием
Старый 04.06.2009, 18:48   #6
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Хм.. у меня выдает ошибку.., связанную с числом пи..
А по-конкретнее? Лучше текст ошибки.
Вообще, число Пи есть в math.h (собственно, его и использовал).
M_PI_2 можно заменить на M_PI/2, ну, или если совсем все плохо будет, то верните как у вас было. Но вообще проблем быть не должно.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 04.06.2009, 19:00   #7
Skrip
Пользователь
 
Аватар для Skrip
 
Регистрация: 04.06.2009
Сообщений: 45
По умолчанию

error C2065: 'M_PI' : undeclared identifier вот это он выдает
Я спокойный, вежливый и уравновешенный человек
Skrip вне форума Ответить с цитированием
Старый 04.06.2009, 19:03   #8
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от Skrip
error C2065: 'M_PI' : undeclared identifier вот это он выдает
Странно. Ну тогда объявите сами константу Пи.

А вообще, загляните в файл math.h. Там должно быть определено макроимя для этого числа:
Код:
#define M_PI		3.14159265358979323846
#define M_PI_2		1.57079632679489661923
#define M_PI_4		0.78539816339744830962
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 04.06.2009, 19:08   #9
Skrip
Пользователь
 
Аватар для Skrip
 
Регистрация: 04.06.2009
Сообщений: 45
По умолчанию

Если я сама ввожу число пи, он выдает не верные значения.. допустим арккосинус 1 не равен 0.
Я спокойный, вежливый и уравновешенный человек
Skrip вне форума Ответить с цитированием
Старый 04.06.2009, 19:49   #10
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Да формула, вроде, верная.
Только посмотрите, что будет, если вручную посчитать.
Для x = 1:
Код:
arccos(1) = PI/2 - (1 + 1/6 + 3/60 + 15/336....) = 1.5707 - 1.2613 != 0
Здесь, похоже, не в программе дело. А именно в ряде.. Чем ближе к 1, тем меньше точность.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программирование алгоритмов циклической структуры для задач табулирования функций одной переменной с пост bbk_serg Помощь студентам 1 10.01.2009 18:16
Программирование линейных алгоритмов в Delphi7 Rom1k Помощь студентам 3 01.12.2008 19:41
Программирование алгоритмов циклическич структур lantian Паскаль, Turbo Pascal, PascalABC.NET 6 22.10.2008 16:05
Помогите с задачей.(Пскаль).по теме программирование алгоритмов разветвляющейся структуры. svobodys Помощь студентам 6 12.10.2008 08:18
Программирование ветвящихся алгоритмов Дима82 Помощь студентам 4 11.05.2008 11:35