Последовательность построенная по правилу

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Ronin94
Сообщения: 8
Зарегистрирован: 23 апр 2015, 22:43

Люди спасайте, не могу написать код хоть убейся, задание вроде не сложное а сделать не получается
Даны положительные x,d. Найти номер и значение первого члена последовательности a, построенной по правилу:
а[1]=(х+1)/2, a= (a[i-1]+(x/a[i-1])/2, i=2,3,..., квадрат которого отличается от числа х не более чем на d.

Вот что я пытался сделать:

Код: Выделить всё

#include<iostream>
#include<cmath>

using namespace std;

void posled(int x, int n)
{
	double *a, p;
	a=new double[n];
	
	for(int i=1; i=n; i++)
	{
		if(i=1)
		{
			a[1]=((x+1)/2);
		}
		else
		{
		  a[i] = ((a[i-1]+(x/a[i-1])/2));
		}
		p=pow(a[i],2);
		cout << "a[" << i << "] = " << a[i] << endl;
	}

}

int main()
{
	setlocale(0,"rus");
	int n;
	double x,d;

	cout << "Введите значение х: ";
	cin >> x;
	cout << "Введите значение d: ";
	cin >> d;
	cout << "Введите размер последовательности: ";
	cin >> n;

	posled(x, n);	

	system("pause");
	return 0;
}
Очень буду признателен)))
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

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

Во-вторых, ты никак не использовал d, хотя и считал его из входного потока. Очевидно, что d должно участвовать в условии выхода из цикла. Слова в задании "отличается не более чем" на самом деле обозначают "разность по модулю меньше либо равна чем". Модуль вычисляется с помощью функции fabs.

Исходя из всего вышесказанного предлагаю следующий алгоритм (пседвокод):

Код: Выделить всё

Считать Икс;
Считать Д;

А := (Икс + 1)/2;
Номер := 1;

Пока (Модуль(А*А - Икс) > Д)
{
   А := (А + Икс)/А;
   Инкремент Номер;
}

Вывести А;
Вывести Номер;
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ronin94
Сообщения: 8
Зарегистрирован: 23 апр 2015, 22:43

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

Код: Выделить всё

#include<iostream>
#include<cmath>

using namespace std;

void posled(double x, double d)
{
	double a;
	a=((x+1)/2);
	int i=1;

	while((abs((a*a)-x))>d)
	{
		a=((a+x)/a);
		i++;
	}
	cout<<"a[" << i <<"] = "<< a << endl;

}

int main()
{
	setlocale(0,"rus");
	int n;
	double x,d;

	cout << "Введите значение х: ";
	cin >> x;
	cout << "Введите значение d: ";
	cin >> d;

	posled(x, d);	

	system("pause");
	return 0;
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

В смысле перестаёт что-либо делать? Зависает? Можешь привести примеры конкретных значений a и d, которые нужно ввести, чтобы добиться такого поведения программы?

Надеюсь, ты понимаешь, что твой алгоритм фактически моделирует вычисление членов сходящейся последовательности, так что x не может быть произвольным числом. В качестве x должен быть указан предел, к которому последовательность сходится, иначе условие в цикле всегда будет оставаться ложным для достаточно малых d.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ronin94
Сообщения: 8
Зарегистрирован: 23 апр 2015, 22:43

к примеру я ввожу x=10, d=0.001 после ввода программа перестает что либо делать, просто стоит консоль и никаких действий не происходит нажатия клавиш не реагируются
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Ага, я всё понял. Последовательность расходящаяся получилась, так как я упустил деление на два. Должно быть вот так:

Код: Выделить всё

А := (А + Икс/А)/2;
Мог бы и сам формулу проверить, между прочим :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить