Member 13480832 Ответов: 3

Как сортировать уравнения ?


имея Х2+Х1+3х3 ----&ГТ; х1+х2+3х3

Что я уже пробовал:

Я пытался разделиться, но, видимо, я делаю что-то не так, так что любая помощь?

0x01AA

Никто не может сказать вам, что вы делаете неправильно, если вы не покажете, как вы это делаете ;)

Patrice T

Ваш секретный код ошибочен и нуждается в секретной коррекции.

3 Ответов

Рейтинг:
0

KarstenK

вам нужен оператор умножения:

X1 + X2 + 3 * X3
или ты хочешь именно этого:
X + X * X + 3 * X * X * X
что вы можете написать так:
X * ( 1 + X * ( 1 + 3 * X ) ) )


0x01AA

Кстати, эта тройка-с моей стороны.

Patrice T

Вы уверены, что X3-это X^3 ?

Member 13480832

Я не знаю. Мне дали уравнение как оно есть

KarstenK

Вы должны знать и понимать свою задачу. Ты должен спросить!!!

Рейтинг:
0

Arthur V. Ratz

Вот еще одно решение в C++11:


#include <string>
#include <vector>
#include <cctype>
#include <iostream>
#include <algorithm>

typedef struct tagParam
{
	int coeff;
	int subscript;
} PARAM, *LPPARAM;

int main(int argc, char* argv[])
{
	// Let eq is the string containing the equation to be sorted
	std::string eq = "X2+X1+3X3+4X5+2X4+X7+X6";

	// Allocating a vector to store coeff + subscript objects
	std::vector<PARAM> params;
	// Parsing string containing the equation to be sorted
	for (auto FwdIt = eq.begin(); (FwdIt + 1) < eq.end(); FwdIt++)
	{
		// For each character perform a check if preceding character is coeff 
		// and succeeding character is subscript. 
		if (FwdIt != eq.end() && std::isdigit(*FwdIt) && \
			std::isdigit(*(FwdIt + 2)) && *(FwdIt + 1) == 'X')
		{
			// If so, append the coeff and subscript to lpParams buffer previously allocated
			PARAM param = { 0 };
			std::memset((void*)¶m, 0x00, sizeof(PARAM));
			param.coeff = *FwdIt - '0'; param.subscript = *(FwdIt + 2) - '0';
			if (FwdIt + 3 < eq.end()) FwdIt += 3; params.push_back(param);
		}

		// Perform a check if the current character is 'X' and next character is subscript
		else if (FwdIt != eq.end() && *FwdIt == 'X' && std::isdigit(*(FwdIt + 1)))
		{
			// If so, append subscript to lpParams buffer previously allocated
			PARAM param = { 0 };
			std::memset((void*)¶m, 0x00, sizeof(PARAM));
			param.subscript = *(FwdIt + 1) - '0'; params.push_back(param); 
			if (FwdIt + 2 < eq.end()) FwdIt += 2;

		}
	}

	// Perform a sort to order all coeff + subscript objects by the value of subscript
	std::sort(params.begin(), params.end(), [&](const PARAM& param1, \
		const PARAM& param2) { return param1.subscript < param2.subscript; });

	std::string output = "\0";
	// Constructing an output string
	for (auto It = params.begin(); It != params.end(); It++)
		// For each coeff + subscript object perform a check if the subscript
		// is not equal to 0 and coeff is equal to zero (there's no coeff)
		if (It->subscript != 0 && It->coeff == 0)
		{
			// If so, output X_subscript to string buffer
			output += "X" + std::to_string(It->subscript);
			if (It != params.end() - 1) output += "+";
		}
		
		// Otherwise, perform a check if both coeff and subscript are not zero
		else if (It->subscript != 0 && It->coeff != 0)
		{
			// if so, output coeff_X_subscript to string buffer
			output += std::to_string(It->coeff) + "X";
			output += std::to_string(It->subscript);
			if (It != params.end() - 1) output += "+";
		}

	// Output the resulting string buffer containing sorted equation
	std::cout << "input = " << eq << "\n" << "output = " << output;

	std::cin.get();

    return 0;
}


Arthur V. Ratz

Вероятно, этот вариант лучше, так как ваш вопрос касается программирования на C++.

Arthur V. Ratz

Я знаю, что оба моих решения могут оказаться сложными и трудными для понимания, но, вероятно, другого решения этой проблемы, по-видимому, нет. В частности, я использую вектор структурных объектов для хранения данных по каждому коэффициенту и каждому индексу, а затем сортирую этот вектор по значениям переменных индекса. Без него вы, вероятно, никогда не разберетесь в этом уравнении.

KarstenK

Решение на самом деле не совпадает со знаниями спрашивающего. Поэтому он не должен использовать это, потому что риск "пожалуйста, объясните" будет ловушкой. ;-)

Arthur V. Ratz

Мне очень жаль, но я был готов помочь, не зная на самом деле, что это "сделай мое домашнее задание". Заранее я просто не буду отвечать на подобные вопросы. Извините. :) Спасибо за ваш комментарий.

Рейтинг:
0

Arthur V. Ratz

Вот мое решение:


#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <ctype.h>

typedef struct tagParam
{
	int coeff;
	int subscript;
} PARAM, *LPPARAM;

int main(int argc, char* argv[])
{
	// Let eq is a string buffer containing an equation to be parsed
	static char eq[256] = "X2+X1+3X3";

	// Allocate buffer for an array of subscript objects (coeff + subscript)
	LPPARAM lpParams = new PARAM[100];
	memset((void*)lpParams, 0x00, sizeof(PARAM) * 100);

	int n = 0;
	// Parsing string containing the equation to be sorted
	for (int i = 0; eq[i] != '\0'; i++)
	{
		// For each character perform a check if preceding character is coeff 
		// and succeeding character is subscript. 
		if (isdigit(eq[i]) && isdigit(eq[i + 2]) && eq[i + 1] == 'X')
		{
			// If so, append the coeff and subscript to lpParams buffer previously allocated
			lpParams[n].coeff = eq[i] - '0';
			lpParams[n++].subscript = eq[i + 2] - '0';
			i += 3;
		}

		// Perform a check if the current character is 'X' and next character is subscript
		else if (eq[i] == 'X' && isdigit(eq[i + 1]))
		{
			// If so, append subscript to lpParams buffer previously allocated
			lpParams[n++].subscript = eq[i + 1] - '0';
			i += 2;
		}
	}

	// Perform a sort to order all coeff + subscript objects by the value of subscript
	for (int i = 0; lpParams[i].subscript != 0; i++)
	{
		int min = i;
		for (int j = i + 1; lpParams[j].subscript != 0; j++)
			min = (lpParams[j].subscript < lpParams[min].subscript) ? j : min;

		PARAM temp = lpParams[i];
		lpParams[i] = lpParams[min];
		lpParams[min] = temp;
	}

	static char output[256] = "\0";
	// Constructing an output string
	for (int i = 0; lpParams[i].subscript != 0; i++)
		// For each object in the array perform a check if the subscript
		// is not equal to 0 and coeff is equal to zero (there's no coeff)
		if (lpParams[i].subscript != 0 && lpParams[i].coeff == 0)
			// If so, output X_subscript to string buffer
			sprintf_s(output, 256, "%sX%d+", output, lpParams[i].subscript);
		// Otherwise, perform a check if both coeff and subscript are not zero
		else if (lpParams[i].subscript != 0 && lpParams[i].coeff != 0)
			// if so, output coeff_X_subscript to string buffer
			sprintf_s(output, 256, "%s%dX%d+", output, lpParams[i].coeff, lpParams[i].subscript);

	// Shrink output buffer by one ending character (e.g. remove unnecessary '+' character)
	output[strlen(output) - 1] = '\0';

	// Output the resulting string buffer containing sorted equation
	printf("input = %s\noutput = %s\n", eq, output);

	_getch();

    return 0;
}


Arthur V. Ratz

Что плохого в этом решении ? Это действительно работает.

Patrice T

Я не downvoter,
но вы предоставляете полный код тому, что пахнет домашним заданием, а ОП ничего не показал..

Arthur V. Ratz

Мне очень жаль, но я был готов помочь, не зная на самом деле, что это "сделай мое домашнее задание". Заранее я просто не буду отвечать на подобные вопросы. Извините. :) Спасибо за ваш комментарий.

Member 13480832

Это не "домашнее задание" ... это задание, данное другом для развлечения, чтобы расширить наши знания!

Patrice T

- это задание, данное мне другом.
Это считается домашним заданием. Я думаю, что весь интерес заключается в том, чтобы посмотреть, сможете ли вы решить эту проблему сами, а не умолять нас решить ее.
Вам лучше потратить время на изучение методов и алгоритмов анализа.
Вот книга от известных авторов, она поможет вам улучшить свои навыки: Структурного Программирования.формат PDF[^]

Arthur V. Ratz

хорошо. наслаждаться этим.

Arthur V. Ratz

Кроме того, вы, вероятно, лучше помечаете свои вопросы как "это не домашнее задание...", когда публикуете его на форуме.