Adrikk
@Adrikk
Студент

Как сделать преобразование полинома в строку и обратно?

Подскажите как разработать фукнции: перевод полинома в строку и обратно
Полином хранится в виде двух полей:
int deg; //степень полинома
double koef[deg+1]; //массив коэффициентов полинома

Вывод на экран пока такой:
Пример: 3x^2-5x^1+5
Собственно и хранится он:
deg = 2;
koef[0] = 5;
koef[1]= -5;
koef[2] = 3;
  • Вопрос задан
  • 578 просмотров
Решения вопроса 2
@vanyamba-electronics
#include <iostream>
#include <string>
#include <vector>

using namespace std;

class Polynom : public vector<int>
{
public:
	Polynom() {}
	Polynom(int _degree, int* koef = 0);
	inline int degree() const {
		return (size() > 0) ? size() - 1 : 0;
	}
	string toString () const;
	Polynom& operator << (const string& src);
	void addDegree(int _degree, int koef);
protected:
	static string itoa(int value);
	static int readNumber(string::const_iterator& it, string::const_iterator end);
};

Polynom::Polynom(int _degree, int* koef)
{
	if (_degree < 0)
		_degree = 0;
	resize(_degree + 1);
	if (koef) {
		for (int n = 0; n <= _degree; ++n)
			(*this)[n] = koef[n];
	}
	else {
		for (int n = 0; n < size(); ++n)
			(*this)[n] = 0;
	}
}

string Polynom::itoa(int value)
{
	char buf[50];
	sprintf(buf, "%d", value);
	return string(buf);
}

string Polynom::toString () const
{
	string result;
	for(int n = degree(); n >= 0; --n) {
		if (at(n) != 0) {
			if (at(n) > 0) {
				if (n != degree())
					result += "+";
			}
			result += itoa(at(n));
			if (n > 0) {
				result += "x";
				if (n > 1) {
					result += "^";
					result += itoa(n);
				}
			}
		}
	}
	return result;
}

inline basic_ostream<char>& operator << (basic_ostream<char>& os,const Polynom& p)
{
	os << p.toString();
	return os;
}

void Polynom::addDegree(int _degree, int koef)
{
	if (_degree >= degree()) {
		int oldSize = size();
		resize(_degree + 1);
		for(int n = oldSize; n < size(); ++n )
			(*this)[n] = 0;
	}
	(*this)[_degree] += koef;
}

int Polynom::readNumber(string::const_iterator& it, string::const_iterator end)
{
	enum { ReadSign, ReadDigit } state = ReadSign;
	enum { Positive, Negative } sign = Positive;
	int result = 0;
	while(it != end)
	{
		switch (state) {
		case ReadSign:
			if (*it == '+' || *it == '-') {
				if (*it == '+')
					sign = Positive;
				else
					sign = Negative;
				state = ReadDigit;
			}
			else if (*it == 'x') {
				return 1;
			}
			else if (*it < '0' || *it > '9') {
				string err("Not a digit '");
				err += *it;
				err += "' while reading number";
				throw(err);
			}
			else {
				state = ReadDigit;
				result = *it - '0';
			}
			break;
		case ReadDigit:
			if (*it == 'x' || *it == '+' || *it == '-') {
				return result * ((sign == Positive) ? 1 : -1);
			}
			else if (*it < '0' || *it > '9') {
				string err("Not a digit '");
				err += *it;
				err += "' while reading number";
				throw(err);
			}
			else {
				state = ReadDigit;
				result = result * 10 + *it - '0';
			}
			break;
		}
		it++;
	}
	return result * ((sign == Positive) ? 1 : -1);
}

Polynom& Polynom::operator << (const string& src)
{
	enum { ReadKoef, ReadPower } state = ReadKoef;
	int koef;
	int power = 0;
	for(string::const_iterator it = src.begin(); it != src.end(); it++)
	{
		switch(state) {
		case ReadKoef:
			koef = readNumber(it, src.end());
			if (it == src.end()) {
				addDegree(0, koef);
				return *this;
			}
			if (*it == 'x') {
				state = ReadPower;
			}
			else if (*it == '+' || *it == '-') {
				addDegree(0, koef);
			}
			break;
		case ReadPower:
			if (*it == '^') {
				it++;
				if (*it == '+') {
					it++;
				}
				if (*it >= '0' && *it <= '9') {
					power = readNumber(it, src.end());
					addDegree(power, koef);
					if (it == src.end())
						return *this;
					it--;
					state = ReadKoef;
				}
				else {
					string err("Unexpected symbol '");
					err += *it;
					err += "' while reading polynom from \"";
					err += src;
					err += '"';
					throw(err);
				}
			}
			else if (*it == '+' || *it == '-') {
				addDegree(1, koef);
				it--;
				state = ReadKoef;
			}
			else {
				string err("Unexpected symbol '");
				err += *it;
				err += "' while reading polynom from \"";
				err += src;
				err += '"';
				throw(err);
			}
			break;
		}
	}
	if (state == ReadPower) {
		string err("Unexpected end of string while reading polynom from \"");
		err += src;
		err += '"';
		throw(err);
	}
	return *this;
}

int main()
{
	int deg = 2;
	int koef[3] = { 3, 4, 5 };

	Polynom polynom(deg, koef);
	cout << polynom << endl;

	Polynom p2;
	p2 << "-18x^3+4x-2";
	cout << p2 << endl;

	return 0;
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы