2013-11-11 3 views
1

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

#include <iostream> 
#include <vector> 
#include <iomanip> 

using namespace std; 


void Determine_Output (double); 

int main() 
{ 
    vector<double> thisVector(10); 
    double input=-2; 
    int i=1; 
    double average = 0.00; 
    double highest; 
    double lowest; 

    cout<<setprecision(3); 


    for (unsigned z=0; z<10; z++) 
    { 
     cout<<"Please enter result \"" <<i<< "\": "; 
     cin>> input; 

     if ((input <= 100)&&(input >= 0)) 
      { 
       thisVector.push_back(input); 
       Determine_Output(thisVector[i]); //Offending procedure call 
       i++; 
      } 
     else if (input == -1) 
      break; 
     else 
     { 
      cout<<"Invalid input, must be between 0 and 100\n"; 
      z--; 
     } 

    } 



void Determine_Output (double output) {  //Offending procedure 
    if (output > 90) 
     cout<<"A will be assigned to this result\n"; 
    else if (output > 70) 
     cout<<"B will be assigned to this result\n"; 
    else if (output > 60) 
     cout<<"C will be assigned to this result\n"; 
    else if (output > 50) 
     cout<<"P will be assigned to this result\n"; 
    else 
     cout<<"U will be assigned to this result\n"; 
} 

Когда я первый написал программу, это работало как следует (т.е.. 99 возвращение A, 77 возвращение B, 66 возвращение C и так далее)

Теперь, когда я закончил остальное код (опущен по соображениям пространства), этот раздел всегда возвращает U (вход 50 или ниже), независимо от того, какой фактический вход был. Я буквально работаю над этой частью уже два с половиной часа, и это меня озадачило.

+3

Если ваш синтаксис неверен, компилятор будет жаловаться. –

+0

Поскольку вы используете 'double' для переменных, вы должны использовать' double' константы, такие как 90.0, 70.0, 60.0, 50.0 и 100.0. В настоящее время компилятор конвертирует их для вас. –

+0

Вы отметили «процедуру нарушения», но я думаю, что вы ищете не то место. Проверьте 'Определить_Output', запустив его с некоторыми известными значениями и посмотрев, что вы получаете. –

ответ

7

Вы действительно хотите инициализировать объект i = 1? И вместо того, чтобы использовать индексы, почему бы вам просто не использовать thisVector.back()? Или еще лучше, просто пройдите input до Determine_Output(). Вы можете полностью исключить переменную i, по крайней мере, в коде, который вы нам показали.

Кроме того, вам не нужно объявлять размер для thisVector, так как push_back() будет растянуть вектор при необходимости.

0

Вы можете устранить else if структуры путем изменения порядка сравнения:

void Determine_Output(double output) 
{ 
    char letter = 'U'; 
    if (output > 50) 
    letter = 'P'; 
    if (output > 60) 
    letter = 'C'; 
    if (output > 70) 
    letter = 'B'; 
    if (output > 90) 
    letter = 'A'; 
    cout << letter << " will be assigned to this result.\n"; 
} 

выше структура может быть менее запутанным, хотя он перезаписать Письме много раз.

2
vector<double> thisVector(10); 

Создает вектор 10 удваивается, все инициализирован в 0. Таким образом, thisVector[0], thisVector[1], & hellip ;, thisVector[9] являются все 0.0.

Ваш тест:

thisVector.push_back(input); 
Determine_Output(thisVector[i]); 

где i начинается как 1, и увеличивается на единицу каждый раз. В первый раз через цикл thisVector.push_back(input); добавляет input в конец вектора, делая его одиннадцатым элементом, thisVector[10]. Но DetermineOutput вызывается с элементом thisVector[1], который по-прежнему имеет значение 0.

В следующий раз через петлю, вы добавляете thisVector[11] и i теперь 2 так что вы проверить thisVector[2], которая, конечно, также 0.0. И так далее. Только на последней итерации вы проверяете thisVector[10], который отличен от нуля (так как это первый элемент, который вы читаете).

Так, упрощать:

  1. Не инициализировать вектор 10 элементов. Когда вы начнете, вы хотите, чтобы он был пустым.

  2. Избавиться i. Это совершенно не нужно. Используйте thisVector.back() для ссылки на элемент, который вы только push_back ed. (Или используйте input напрямую.)

  3. Избавьтесь от z. Это также не нужно. Вам нужно запустить цикл, пока thisVector не имеет 10 элементов.

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