2014-10-08 3 views
0

Так что я немного ржав в своих навыках программирования и не имею никакого реального опыта в мире, кроме классов колледжа, которые я взял в прошлом. Я работаю над программой для класса, но сталкиваюсь с проблемой, я не могу понять, как использовать значение переменной внутри цикла For вне цикла. Вот код, я ссылка:Как использовать переменную из цикла For вне цикла в C++?

#include "iostream" 

using namespace std; 

int want, have, need; 
int counter = 0; 

char response, cont; 

int diff(int want, int have); 

int main(){ 
cout << "Welcome!\n"; 
cout << "This program will help you reach your money saving goals!\n"; 
cout << "Would you like to use this program? (y/n)\n"; 
    cin >> response; 
    while (response == 'y'){ 
     cout << "Please enter all amounts in whole dollars only!\n"; 
     cout << "Please enter the amount of money you would like to have saved: $"; 
     cin >> want; 
     cout << "\nPlease enter the amount of money you currently have saved: $"; 
     cin >> have; 
     if (have >= want){ 
      cout << "You have already reached or exceeded your goal, this program will not be able to help you!\n"; 
      system("Pause"); 
      return 0; 
     } 
     cout << "\nYou need to save $" << diff(want, have) << " more money to reach your goal!\n"; 
     cout << "Would you like me to help you with a savings plan?"; 
     cin >> cont; 
     while (cont == 'y'){ 
      int menu; 
      cout << "Please select from the following options: \n"; 
      cout << "1 - Daily Saving Plan\n"; 
      cout << "2 - Weekly Saving Plan\n"; 
      cout << "3 - Monthly Saving Plan\n"; 
      cout << "Enter the number associated with your choice: \n"; 
      cin >> menu; 

      switch (menu){ 
       case 1: { 
        int daily; 
        cout << "You have chosen the Daily Savings Plan\n"; 
        cout << "How much money can you save every day? $"; 
        cin >> daily; 
        for (int x = daily; x < need; x++){ 
         daily = daily + daily; 
         counter++; 
        } 
        cout << "\nIt will take you " << counter << " days to reach your goal!\n"; 
        break; 
       } 
       case 2: { 
        int weekly; 
        cout << "You have chosen the Weekly Savings Plan\n"; 
        cout << "How much money can you save every week? $"; 
        cin >> weekly; 
        for (int x = weekly; x < need; x++){ 
         counter++; 
        } 
        cout << "\nIt will take you " << counter << " weeks to meet your goal!\n"; 
        break; 
       } 
       case 3: { 
        int monthly; 
        cout << "You have chosen the Monthly Savings Plan\n"; 
        cout << "How much money can you save every month? $"; 
        cin >> monthly; 
        for (int x = monthly; x < need; x++){ 
         monthly = monthly + monthly; 
         counter++; 
        } 
        cout << "\nIt will take you " << counter << " months to reach your goal!\n"; 
        break; 

       } 
       default: cout << "You made an invalid selection"; 

        cout << "Would you like to look at a different saving plan? (y/n)\n"; 
        cin >> cont; 
      } 
     } 
    } 
} 

int diff(int want, int have){ 
return want - have; 
} 

Так что, когда я запускаю программу, все работает нормально, но значение счетчика всегда отображаются как «0» в заключительном cout заявления.

Я понимаю, почему это делается, я думаю .. и это связано с объявлением «int counter = 0» за пределами цикла, поэтому я предполагаю, что он возвращается к этому значению после выхода цикла.

Если я не инициирую переменную счетчика, я получаю сообщение об ошибке, и если я объявляю значение внутри цикла, я получаю сообщение об ошибке, пытающееся использовать его в инструкции cout, как указано выше.

Я даже не уверен, что мой цикл цикла структурирован правильно ... в основном я хочу, чтобы он добавлял к себе еженедельную переменную до x = need. Я также хочу, чтобы понять, сколько итераций требуется для этого, а затем выводить его как количество недель. Надеюсь, что все имеет смысл; всякая помощь приветствуется.

+0

почтовый индекс, который воспроизводит проблему. –

+7

Нет, 'counter' не вернется к нулю после цикла. Если он равен нулю, значит, он никогда не увеличивался. Перед началом цикла проверьте значения 'weekly' и' need'. –

+0

для начала, я бы попытался объявить счетчик внешнего переключателя в начале функции. перед запуском цикла должна быть инициализация: counter = 0; – user3621602

ответ

0

Похоже, что вы хотите сделать, это можно сделать с помощью ceil(double(need/weekly)), и это округляет потребность в делении на неделю.

Ваше объявление вне цикла не влияет на значение, которое вы cout после того, как закончите цикл for.

Что касается вашей проблемы, это выглядит, как вы никогда не инициализируетесь need так что ваше для петли никогда не делала итерации как неопределенный не меньше или равно 0.

0

эскиза в C++ 11 вашей программы.

char prompt(std::initializer_list<const char*> message, std::initializer_list<const char*> question, std::initializer_list<char> options) { 
    for(auto msg:message) 
    std::cout << msg; 
    while(true) { 
    char response; 
    for(auto q:question) 
     std::cout << q; 
    std::cin >> response; 
    for (char option:options) { 
     if (response == option) 
     return response; 
    } 
    } 
} 
int prompt(std::initializer_list<const char*> message, std::initializer_list<const char*> question, int min = 0, int max = std::numeric_limits<int>::max()) { 
    for(auto msg:message) 
    std::cout << msg; 
    while(true) { 
    int response; 
    for(auto q:question) 
     std::cout << q; 
    std::cin >> response; 
    if (response >= min && response <= max) 
     return response; 
    } 
    } 
} 
void saving(const char* plan, const char* unit, const char* units, int target) { 
    int daily = prompt(
    {"You have chosen the ", plan, "\n"}, 
    {"How much money can you save every ", unit, "? $"}, 
    1 // min saving of 1$ per unit time to prevent infinite loops 
); 
    std::cout << "\n"; 
    int counter = 0; 
    int amount_saved = 0; 
    while (amount_saved < target) { 
    ++counter; 
    amount_saved += daily; 
    } 
    if (counter != 1) 
    std::cout << "It will take you " << counter << " " << units << " to reach your goal\n"; 
    else 
    std::cout << "It will take you " << counter << " " << unit << " to reach your goal\n"; 
} 

int main() { 
    while(
    prompt(
     {"Welcome!\nThis program will help you reach your money saving goals!\n"}, 
     {"Would you like to use this program? (y/n)\n"}, 
     {'y', 'n'} 
    ) == 'y' 
) 
    { 
    int want = prompt({"Please enter all amounts in whole dollars only!\n"}, 
     {"Please enter the amount of money you would like to have saved?"}); 
    int have = prompt({"\n"}, {"Please enter the amount of money you currently have saved?\n"}); 
    std::cout << "\n"; 
    if (have >= want) { 
     std::cout << "You win!\n"; 
     system("Pause"); // ick 
     return 0; 
    } 
    std::cout << "You need to save $" << (have-want) << " more money to reach your goal!\n"; 
    while('y' == prompt(
     {}, 
     {"Would you like me to help you with a savings plan? (y/n)"}, 
     { 'y', 'n' } 
    )) { 
     char menu = prompt(
     { 
      "Please select from the following options: \n", 
      "1 - Daily Saving Plan\n", 
      "2 - Weekly Saving Plan\n", 
      "3 - Monthly Saving Plan\n" 
     }, 
     {"Enter the number associated with your choice: \n"}, 
     { '1', '2', '3' } 
     ); 
     switch (menu) { 
     case '1': { 
      saving("Daily Saving Plan", "day", "days", have-want); 
     } break; 
     case '2: { 
      saving("Weekly Saving Plan", "week", "weeks", have-want); 
     } break; 
     case '3': { 
      saving("Monthly Saving Plan", "month", "months", have-want); 
     } break; 
     } 

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