Я пишу программу поиска корней. Я уже нахожусь в этой ошибке часами. Код мне кажется правильным, но вывод терминала ошибочен. И этот новичок имеет множество аргументов в своих функциях. Надеюсь, вы, ребята, не против.Почему другая функция выводит неправильные значения?
Да, я скомпилировал коды снова и снова.
Эти неприятные линии. Ниже приведены все строки, которые, по моему мнению, актуальны. Вместо этого выводя exp(-x) - x
и Newton-Raphson
соответственно, он дает мне Restart selection
и exp(-4*x) - x
.
printf("%25s:%20s\n", "Equation", a[eq-1].c_str());
printf("%25s:%20s\n", "Method", b[meth-1].c_str());
Вот основные переменные в main().
vector<string> functName;
vector<string> methodName;
vector<string> advSettings;
int c_eq = 0;
int c_met = 0;
int c_settings = 0;
double c_guess1 = 0;
double c_guess2 = 0;
// defaults
int sigFigs = 6;
int iter = 1000;
int iterMode = 0;
int perIter = 0;
int plotMode = 0;
functName.push_back("exp(-x) - x");
functName.push_back("exp(-2*x) - x");
functName.push_back("exp(-3*x) - x");
functName.push_back("exp(-4*x) - x");
methodName.push_back("Newton-Raphson");
methodName.push_back("False Position");
methodName.push_back("Bisection");
methodName.push_back("Secant");
advSettings.push_back("Proceed with settings");
advSettings.push_back("Restart selection");
advSettings.push_back("Change advanced settings");
Вот первая функция, которая выводит вещи должным образом.
template <typename inputType>
void basicInterface(const vector<string> &a,
const vector<string> &b,
int eq,
int meth,
inputType &root1,
inputType &root2)
{
cout << "Input the corresponding number of your choice.\n";
cout << "Choose an equation to solve:\n";
for (int i = 0; i < a.size(); i++)
cout << "[" << i+1 << "] " << a[i] << endl; // line of interest
cout << " >>> ";
inputCheck(eq,1,4);
cout << "Choose a method to use:\n";
for (int i = 0; i < b.size(); i++)
cout << "[" << i+1 << "] " << b[i] << endl; // line of interest
cout << " >>> ";
inputCheck(meth,1,4);
// more stuff
}
Линии интереса выводят следующее в моем терминале, которые являются правильными.
[1] exp(-x) - x
[2] exp(-2*x) - x
[3] exp(-3*x) - x
[4] exp(-4*x) - x
[1] Newton-Raphson
[2] False Position
[3] Bisection
[4] Secant
Эта другая функция, которая должна показать все вещи,
template <typename inputType>
void showSettings( const vector<string> &a,
const vector<string> &b,
int eq,
int meth,
inputType root1,
inputType root2,
int sigs,
int showPerLoop,
int plotRoots,
int loopMode,
int minLoops)
{
cout << "Requirements satisfied.\n";
printf("%25s:%20s\n", "Equation", a[eq-1].c_str());
printf("%25s:%20s\n", "Method", b[meth-1].c_str());
if(meth-1 == 1)
printf("%25s:%20f\n", "Initial Guess", root1);
else
{
printf("%25s:%20f\n", "Initial Guess 1", root1);
printf("%25s:%20f\n", "Initial Guess 2", root2);
}
printf("%25s:%20d\n", "Minimum Sig Figs", sigs);
printf("%25s:%20d (1 if true)\n", "Show Root per Iteration", showPerLoop);
printf("%25s:%20d (1 if true)\n", "Show Root Graph", plotRoots);
printf("%25s:%20d (1 if true)\n", "Iteration Mode", loopMode);
printf("%25s:%20d\n", "Minimum Iterations", minLoops);
}
почти дает прекрасный выход.
Equation: Restart selection // where did these
Method: exp(-4*x) - x // come from?
Initial Guess 1: 1.000000
Initial Guess 2: 0.000000
Minimum Sig Figs: 6
Show Root per Iteration: 0 (1 if true)
Show Root Graph: 0 (1 if true)
Iteration Mode: 0 (1 if true)
Minimum Iterations: 1000
Следующие строки, которые я использовал для вызова двух функций.
basicInterface(functName,
methodName,
c_eq,
c_met,
c_guess1,
c_guess2);
showSettings( functName,
methodName,
c_eq,
c_met,
c_guess1,
c_guess2,
sigFigs,
perIter,
plotMode,
iterMode,
iter);
Для начала не смешивайте старый вывод C-стиля с новым потоком C++. Они используют разные буферы, которые могут вызвать скремблирование вывода. Наверное, здесь не так, но помните об этом на будущее. Вы можете форматировать вывод более гибким с помощью [манипуляторов ввода/вывода] (http://en.cppreference.com/w/cpp/io/manip). –
Когда вы говорите что-то не так. Обычно полезно указывать, что означает неправильное. Что вы ожидаете и что получаете. Также полезно убедиться, что его легко заметить с довольно большими стенами кода. EDIT: Может быть, это мое плохое, но я думаю, что получил его после третьего прохода и все еще не совсем уверен. – luk32
@ luk32 Я сделал редактирование. Посмотрите на начало сообщения. – Nogurenn