在C ++中循环赋值

时间:2018-03-13 04:28:38

标签: c++ loops c++11 for-loop cout

我的任务是利用循环。该计划应接受3名员工(玛丽,汤姆和克里斯)的销售投入。流程应如下:

初​​始? >要输入的销售数量>输入销售额>显示17%的佣金>将佣金和销售额添加到相应的变量>>继续直到' z'输入为inputSalesPerson>>显示信息

所以我试图弄清楚为什么我的tempComm变量的返回值没有返回正确的值。如果我要进入'对于变量inputSalesPerson,它让我进入开关盒' t'没问题。输入销售数量和工作量。但是当我进入salesAmount然后显示佣金时,它将无法正确计算。

如果我输入' z'或者' Z'作为inputSalesPerson,它不会结束程序。我有很多事要做。

#include <iomanip>
#include <iostream>
using namespace std;
int main()
{

    int salesT = 0, salesC = 0, salesM = 0;
    double amountT = 0, amountC = 0, amountM = 0;
    double commT = 0, commC = 0, commM = 0;
    double commRate = (17/100);
    int num_sales;
    double salesAmount, totalSales, tempComm;
    char inputSalesPerson;

    do
    {
        cout << "Enter the sales person's initial (\"Z\" to quit): ";
        cin >> inputSalesPerson;
        while(inputSalesPerson != 't' && inputSalesPerson != 'T' && inputSalesPerson != 'm' && inputSalesPerson != 'M' && inputSalesPerson != 'c' && inputSalesPerson != 'C' && inputSalesPerson != 'z' && inputSalesPerson != 'Z')
        {
            cin.get();
            system("cls");
            cout << "Invalid input for employee. Please Input (T)om, (C)hris, (M)ary, or (Z) to End : ";
            cin >> inputSalesPerson;
        }
        switch(inputSalesPerson)
        {
        case 't' :
        case 'T' :
            system("cls");
            cout << "Enter the number of sales : ";
            cin >> num_sales;
            while(num_sales < 1 || num_sales > 5)
            {
                system("cls");
                cout << "Invalid number of sales. Please enter a value between 1 and 5 : ";
                cin >> num_sales;
            }
            salesT += num_sales;
            for(int i = 0; i<num_sales; i++)
            {
                cin.get();
                system("cls");
                cout << "Enter the sale amount : ";
                cin >> salesAmount;
                while(salesAmount < 0)
                {
                    cin.get();
                    system("cls");
                    cout << "Invalid sale amount. Please enter a positive amount : ";
                    cin >> salesAmount;
                }
                tempComm = salesAmount + (salesAmount * commRate);
                cout << fixed << setprecision(2) << "Commission earned by tom on this sale is : " << tempComm << endl;
                cin.get();
                amountT += salesAmount + tempComm;
                commT += tempComm;
                totalSales += amountT;
            }
        break;
        }
    }while(inputSalesPerson != 'z' || 'Z');




    return 0;
}

**** **** EDIT 感谢您提供有关单步调试的信息。感谢这个评论,我能够更深入地学习如何使用调试工具,这有助于我让一切工作更好。

1 个答案:

答案 0 :(得分:0)

我在需要修复的区域评论了您的代码。此外,在整个地方使用cin.get()存在问题。我假设您这样做是为了在每次输入后丢弃返回字符。但是如果在调用cin.get()时标准输入(cin)为空,它将阻止程序直到输入内容。当您输入多个num_sales时会发生这种情况:

for (int i = 0; i<num_sales; i++)
{
     cin.get();   

它处理第一个罚款,但在第二个循环中你得到:

Enter the sale amount : 20
Commission earned by tom on this sale is : 23.40
// cin.get() blocks here, with no user instructions to enter the next sale amount

我已经注释掉了所有的cin.get()。它仍然会起作用,因为cin运算符&gt;&gt;丢弃空格和换行符,所以即使缓冲区中仍然有\ n换行符,下次你执行类似cin&gt;&gt;的操作时num_sales它会丢弃换行符。

#include <iomanip>
#include <iostream>

using namespace std;

int main()
{
    int salesT = 0, salesC = 0, salesM = 0;
    double amountT = 0, amountC = 0, amountM = 0;
    double commT = 0, commC = 0, commM = 0;
    double commRate = (17 / 100.0); // Int divided by int will round to an int. 
                    // commRate is 0.0.  Divide by double instead (17 / 100.0)
    int num_sales;
    double salesAmount, totalSales = 0, tempComm; // totalSales needs to be initialised to 
                                                  // zero, otherwise it holds a garbage value.
    char inputSalesPerson;

    do
    {
        cout << "Enter the sales person's initial (\"Z\" to quit): ";
        cin >> inputSalesPerson;
        while (inputSalesPerson != 't' && inputSalesPerson != 'T' && inputSalesPerson != 'm' && inputSalesPerson != 'M' && inputSalesPerson != 'c' && inputSalesPerson != 'C' && inputSalesPerson != 'z' && inputSalesPerson != 'Z')
        {
            //cin.get();
            system("cls");
            cout << "Invalid input for employee. Please Input (T)om, (C)hris, (M)ary, or (Z) to End : ";
            cin >> inputSalesPerson;
        }
        switch (inputSalesPerson)
        {
        case 't':
        case 'T':
            system("cls");
            cout << "Enter the number of sales : ";
            cin >> num_sales;
            while (num_sales < 1 || num_sales > 5)
            {
                system("cls");
                cout << "Invalid number of sales. Please enter a value between 1 and 5 : ";
                cin >> num_sales;
            }
            salesT += num_sales;
            for (int i = 0; i<num_sales; i++)
            {
                //cin.get();
                //system("cls");
                cout << "Enter the amount for sale number " << i+1 << ": ";
                cin >> salesAmount;
                system("cls"); // I would put the clear here,
                 // Otherwise the user can't see the commission made by Tom

                while (salesAmount < 0)
                {
                    //cin.get();
                    system("cls");
                    cout << "Invalid sale amount. Please enter a positive amount : ";
                    cin >> salesAmount;
                }
                tempComm = salesAmount + (salesAmount * commRate);
                cout << fixed << setprecision(2) << "Commission earned by tom on this sale is : " << tempComm << endl;
                //cin.get();
                amountT += salesAmount + tempComm;
                commT += tempComm;
                totalSales += amountT; // I think you mean to add salesAmount maybe?
            }
            break;
        }

    } //while (inputSalesPerson != 'z'        ||     'Z');
      // Even if {         this ^^^^} is false,      ^^^ this is always
      // 'Z' char will convert to bool, any non-zero value is true.

      while (inputSalesPerson != 'z' && inputSalesPerson != 'Z');

    return 0;
}