2014-01-05 4 views
0

Я пишу программу поиска корней. Я уже нахожусь в этой ошибке часами. Код мне кажется правильным, но вывод терминала ошибочен. И этот новичок имеет множество аргументов в своих функциях. Надеюсь, вы, ребята, не против.Почему другая функция выводит неправильные значения?

Да, я скомпилировал коды снова и снова.

Эти неприятные линии. Ниже приведены все строки, которые, по моему мнению, актуальны. Вместо этого выводя 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); 
+1

Для начала не смешивайте старый вывод C-стиля с новым потоком C++. Они используют разные буферы, которые могут вызвать скремблирование вывода. Наверное, здесь не так, но помните об этом на будущее. Вы можете форматировать вывод более гибким с помощью [манипуляторов ввода/вывода] (http://en.cppreference.com/w/cpp/io/manip). –

+0

Когда вы говорите что-то не так. Обычно полезно указывать, что означает неправильное. Что вы ожидаете и что получаете. Также полезно убедиться, что его легко заметить с довольно большими стенами кода. EDIT: Может быть, это мое плохое, но я думаю, что получил его после третьего прохода и все еще не совсем уверен. – luk32

+0

@ luk32 Я сделал редактирование. Посмотрите на начало сообщения. – Nogurenn

ответ

1

Вы отправили много кода. Но, похоже, эти две линии производят ваш результат.

printf("%25s:%20s\n", "Equation", a[eq-1].c_str()); 
printf("%25s:%20s\n", "Method", b[meth-1].c_str()); 

eq и meth являются 0. Это приводит доступ к векторам с индексом -1. Используйте at вместо оператора [], чтобы проверить пройденные границы, если не уверены. at выдаст исключение, если индекс недействителен; operator [] вместо этого выйдет из строя и произведет UB.

+0

Я думаю, что было бы важно упомянуть, что метод 'at' будет генерировать исключение, которое должно быть уловлено на индекс за пределами. Более конкретно ['std :: out_of_range'] (http://en.cppreference.com/w/cpp/error/out_of_range). –

+0

Я старался предоставить все соответствующие вещи в начале. Да, эти двое. Дело в том, что начальные значения eq и meth заменяются соответствующими значениями перед вызовом 'showSettings'.У меня также есть inputChecker, чтобы убедиться, что значения всегда находятся в пределах. – Nogurenn

+0

@solitude Это все еще выглядит подозрительно. Вы рассматривали эту часть с отладчиком или методом 'at', чтобы быть уверенным на 100%? – user1781290

Смежные вопросы