2014-10-08 208 views
0

所以我的编程能力有点生疏,除了我过去参加的大学课程之外,没有任何实际经验。我正在为一个课程开发一个程序,但遇到了一个障碍;我无法弄清楚如何在循环外的For循环内使用变量的值。这里是我引用的代码:如何使用C++循环外的For循环中的变量?

#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; 
} 

所以,当我运行程序,一切运行正常,但计数器的值在最后cout声明始终显示为“0”。

我明白为什么它会这样做,我想..这是因为循环外有“int counter = 0”声明,所以我假设在循环结束后它会回到那个值。

如果我不启动计数器变量,我得到一个错误,并且如果我在循环中声明了值,我会在cout语句中出现一个错误,正如我上面所述。

我甚至不确定我的循环结构是否正确...基本上我希望它自己添加周变量,直到总数为x = need。我也想捕获它需要多少次迭代,然后输出它作为周数。希望这一切都有道理;任何和所有的帮助表示赞赏。

+0

重现问题的邮政编码。 – 2014-10-08 16:24:22

+7

不,在循环后'counter'不会回零。如果它为零,那是因为它从来没有增加过。在循环开始之前检查'weekly'和'need'的值。 – 2014-10-08 16:24:46

+0

对于初学者,我会尝试在函数的开头声明计数器外部开关。在循环开始之前应该进行初始化:counter = 0; – user3621602 2014-10-08 16:25:14

回答

0

看起来你想要做的事情可以用ceil(double(need/weekly))完成,并且需求除以每周。

在完成for循环后,您在环路外的声明不会影响您cout的值。

至于你的问题,它看起来像你从来没有初始化need让你为未定义是在你的程序的C++ 11比不小于或等于0

0

草图for循环从未迭代。

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; 
     } 

    } 
    } 
}