• Как заставить функцию не реагировать на пробелы?

    Babayka_od
    @Babayka_od
    Full-stack developer
    Попробуй заменить t.split(' '); на t.trim().split(' '); Тогда пробелы с конца строки уйдут
    Ответ написан
    Комментировать
  • Как правильно реализовать возведение полинома в степень?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Если полином степени m возвести в степень n, то результирующий полином будет иметь степень m*n.
    Ответ написан
    9 комментариев
  • Как сделать преобразование полинома в строку и обратно?

    @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;
    }
    Ответ написан
    8 комментариев
  • Массив не передается полностью в функцию потока. Объясните в чем проблема?

    @res2001
    Developer, ex-admin
    Выход за границу массива тут:
    for(int i=0;i<s->m;i++){
    ...
       s->secondSortedArray[i]=num;
    }

    У вас количество элементов в обоих массивах 4, а m вы инициализируете 5. При последнем присваивании secondSortedArray происходит выход за границу массива, а т.к. после secondSortedArray в структуре идет m, то m у вас заменяется последним рандомным значением.
    В firstSortedArray то же есть выход за границу массива, но это не носит деструктивных последствий.
    Подобные вещи часто приводят к краху программы. Вы могли бы это отловить в отладчике. Пользуйтесь им. Отладчик - друг программиста! :-)
    Ответ написан
    4 комментария
  • Как сделать функцию преобразующую степень и коэффициенты многочлена в готовое уравнение?

    @res2001
    Developer, ex-admin
    Вам же элементарно нужно строку сформировать.
    В цикле по массиву koef бежим:
    1.если коэффициент не 0:
    1.1.выводим сам коэффициент из массива
    1.2.Если коэффициент не последний: выводим строку "x^" + str(degree - i)
    Ответ написан
    Комментировать
  • Как сделать функцию преобразующую степень и коэффициенты многочлена в готовое уравнение?

    @eaniconer
    #include <iostream>
    
    void printPolynom(double* coefs, int degree, std::ostream& os)
    {
        static const char VAR = 'x';
        
        bool first = true;  
        for (int i = degree; i >= 0; --i) {
            double coef = *coefs;
            coefs++;
            
            if (!first && coef > 0.0) {
                os << "+";
            }
            first = false;
            
            os << coef;
            for (int j = 0; j < i; ++j) 
                os << '*' << VAR;
        }
    }
    
    int main()
    {
       const int degree = 3;
       double coefs[degree + 1] = { 9, 3, 12, -1 };
       printPolynom(coefs, degree, std::cout);
       
       std::cout << "\nDone";
       return 0;
    }
    Ответ написан
  • Как найти корни полинома(многочлена) действительные и комплексные С++?

    @zuko3d
    Если можно использовать численные методы, то метод Ньютона можно модифицировать чтобы с комплексными тоже работал (делить прямоугольные области пополам). Для определения количества корней на интервале вроде метод Штурма должен помочь. За стартовый интервал предлагаю взять (FLOAT_MIN; FLOAT_MAX) по обеим осям (действительная и мнимая).
    Для удобства предлагаю написать вспомогательный класс для работы в комплексными числами (или взять его из GMP, если можно пользоваться сторонними библиотеками).

    Если нужно "прямое" решение без ЧМов, то Абель в 17 веке показал, что это "задача для мужика" (не выражается в рациональных функциях и радикалах). Но надежда есть: https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D1%80%D... (я, правда, про это только на лекциях слышал и в жизни не применял, так что хз, насколько актуально).
    Ответ написан
    Комментировать
  • Java - тормозит, а Cи - нет?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Программы на C/C++ работают быстрее за счёт отказа от контроля всего и вся (расхода памяти, переполнения стека, корректности указателей), за счёт явной и жёсткой типизации переменных, за счёт меньшего количества обёрток вокруг типов данных. Но это позволяет программисту выстрелить себе в ногу таким количеством способов, которые в Java и не снились.
    Ответ написан
    8 комментариев