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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.07.2018, 04:36   #1
Vladimer123
Новичок
Джуниор
 
Регистрация: 21.07.2018
Сообщений: 1
По умолчанию Интерполяция Лагранжа

Привожу код ниже в виде zip файла, где используются динамические списки:

Но прошу помощи, данный код попросили перевести в массивы, но у меня одни ошибки , прошу помочь:
Код:
#include <sstream> 
#include <iostream> 
#include <fstream> 
#include <string.h> 
using namespace std; 

struct MonicPoly{ 
	double coef; 
	int power; 

}; 

class Poly{ 
	int MonicPoly [1]; 
	public: 
	Poly(); 
	Poly(int Coef, int Power); 
	Poly(const Poly & P); 
	
	void Add(Poly P); 
	void ConstMult(double c); 
	void XMult(); 
	void MultToKXPlusB(double k, double b) { 
		Poly P(*this); 
		P.XMult(); 
		P.ConstMult(k); 
		ConstMult(b); 
		Add(P); 
	}; 
	void Derivative(); 
	
	std::string GetOutputString(); 
}; 

Poly::Poly(){ 
	MonicPoly [0] = 1; // вместо head->coef 
	MonicPoly [1] = 0; //вместо head->power 
} 

Poly::Poly(int Coef, int Power){ //Создает полином вида Coef*x^Power 
	AdditionHead [0] = Coef; // вместо head->coef 
	MonicPoly [1] = Power; //вместо head->power
} 

void Poly::Add(Poly P){ //Функция сложения 
	MonicPoly *AdditionHead = P.head; 
	MonicPoly *PHead, *buf; 
	
	int AdditionHead [1]; // создаем массив на 2 переменые
	
	if (MonicPoly [1] < AdditionHead [0]){ //Начало - "паталогический" случай, тк нет предшественника, обрабатываем отдельно // заменила AdditionHead->power
		MonicPoly [1] = AdditionHead [0]; 
		MonicPoly [0]= AdditionHead [1]; //]AdditionHead> вместо AdditionHead->coef; 
		continue; 
	} 
	if (MonicPoly [1] == AdditionHead [0]){ 
		AdditionHead [0]+= ditionHead [1]; 
		continue; 
	} 

	else{
		int PHead [1]; //]нужно лишь 2 переменных
		if (PHead[0] == AdditionHead [0]){ // вместо Phead->power
			PHead[1] += AdditionHead [1]; // вместо PHead->coef
			break; 
		} 
	else{
		if(PHead[0] < AdditionHead [0]){ 
			int buf[1]
			buf[0] = AdditionHead [0];// вместо PHead->next->power
			buf[1]=AdditionHead [1] ; // вместо PHead->next->coef
			} 
		} 
	} 
} 

string Poly::GetOutputString(){ 
	MonicPoly *PHead = head; 
	string ret = ""; 
	ostringstream sstream; 
	int fl = 0; 
	if(fl && buf[1]PHead->coef>0) sstream « "+"; 
	if(buf[1] != 1 || buf[0] == 0) sstream « buf[1]; 
	if(buf[1] != 1 ){ 
		sstream « "*x^"; else sstream « "x^"; 
		sstream « buf[0]; 
	} 
	fl = 1; 
} t
ret = sstream.str(); 
return ret; urn ret; 
	} 

	void Poly::ConstMult(double c){ //Умножение на константу 
	MonicPoly *cur; 
	cur = head; 
	while(cur){ 
		cur->coef*=c; 
		cur = cur -> next; 
	} 
} 

void Poly::XMult(){ //Умножение на f(x) = x 
	MonicPoly *cur; 
	cur = head; 
	while(cur){ 
		cur->power++; 
		cur = cur -> next; 
	} 
} 

void Poly::Derivative(){ //Вычисление производной 
	MonicPoly *cur; 
	cur = head; 
	while(cur){ 
		if (cur->power){ 
			cur->coef *= cur->power; 
			cur->power--; 
			if (cur -> next && cur -> next -> power == 0){ 
				cur->next = NULL; 
				break; 
				} 
			cur = cur -> next; 
			} 
		else { 
			cur->coef = 0; 
		} 
	} 
}

Poly *interpolate(double *x, double *y, int N) {
	Poly *l = new Poly[N];
    for (int i=0; i < N; i++){ //Здесь "собираются" базисные полиномы посредством умножения на очередные множители, являющиеся полиномами первой степени
        l[i].ConstMult(y[i]);
        for (int j=0; j < N; j++){
            if(j != i) {
            	l[i].MultToKXPlusB(1/(x[i] - x[j]), -x[j]/(x[i] - x[j]));
            }
        }
    }
    
    Poly *L = new Poly(l[0]);
    for (int i = 1; i < N; i++){ //Суммируем базисные полиномы(на значения функции они домножены выше)
        L->Add(l[i]);
    }
    
    delete[] l;
    
    return L;
}

int main() {
	setlocale(LC_ALL,"Russian");

	int N;
	
	ifstream fin;
	fin.open("input.txt");
	fin >> N;
	
	double *x = new double[N];    
    double *y = new double[N];
	
	for (int i = 0; i < N; i++)
		fin >> x[i];
		
	for (int i = 0; i < N; i++)
		fin >> y[i];

	Poly *L = interpolate(x, y, N);
	
    cout << L->GetOutputString() << endl;
    L->Derivative();
    cout << L->GetOutputString();
    
    delete L;
    
	return 0;
}
_____
Код программы нужно выделять (форматировать) тегами [CODE] (читать FAQ)
Модератор
Вложения
Тип файла: zip Лагранж через динамические списки .zip (2.0 Кб, 6 просмотров)

Последний раз редактировалось Serge_Bliznykov; 23.07.2018 в 10:56.
Vladimer123 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Интерполяция Лагранжа Smitt&Wesson Свободное общение 10 26.01.2015 16:57
Интерполяция полиномом Лагранжа(DELPHI) VENOMIK Помощь студентам 3 01.03.2013 14:38
Интерполяция табличных данных полиномом Лагранжа VENOMIK Помощь студентам 3 06.11.2011 14:04
Интерполяция лагранжа Styks Общие вопросы C/C++ 4 14.12.2009 18:47
интерполяция методом Лагранжа (синус) сон Общие вопросы C/C++ 6 09.11.2009 11:02