【问题标题】:Beginner Question - Exiting while loop, input type double as condition, C++初学者问题 - 退出 while 循环,输入类型 double 作为条件,C++
【发布时间】:2011-01-08 18:20:38
【问题描述】:

我最近才开始学习 C++,当 while 循环的条件是来自用户的双精度输入时,我在使用 while 循环时遇到了一点问题。我知道如果用户没有输入与 double 类型兼容的值,那么循环会自动中断。问题是我的控制台应用程序在输入除双精度以外的任何内容时退出。

我正在进行的当前练习要求使用 while 循环和 if 语句来计算输入的测量值并输出总数。用户输入一个值,然后输入测量系统(即 25 m 代表 25 米)。它还必须记录并输出输入的最高和最低值。

double value = 0;
double total = 0;
double high = 0;
double low = 0;
string unit = " ";

while (cin >> value >> unit && unit != "convert")
{
if (unit == "in") {total = total+(value*2.54);// in = inches converting to cm
        if (value*2.54 > high) high = value;
        if (value*2.54 < low) low = value;
        }

else if (unit == "m"){total = total+(value*100);// m = metres, converting to cm
        if (value*100 > high) high = value;
        if (value*100 < low) low = value;
        }

else if (unit == "ft"){total = total+(value*30.48);// ft = feet, converting to ft 
        if (value*30.48 > high) high = value;
        if (value*30.48 < low) low = value;
        }
else if (unit == "cm"){total = total+value;// cm = centremetres 
        if (value*2.54 > high) high = value;
        if (value*2.54 < low) low = value;
        }

else cout << "Unable to calculate unit type - " << unit << endl;

value = 0;
}

cout << "Total length in centre-metres: " << total << endl
     << "Total length in metres: " << total/100 << endl
     << "Total length in feet: " << total/30.48 << endl
     << "Total length in inches: " << total/2.54 << endl
     << "\nHighest value: " << high << ", Lowest value: " << low << endl;


keep_window_open();
return 0; 

keep_window_open() 是我的 C++ 书附带的自定义头文件的一部分,它所做的只是要求用户输入一个字符以退出。

我知道程序的当前状态有点臃肿,但我想先让它正常工作。我不得不使用一种解决方法,如果用户输入“转换”作为一个单元,则循环被终止,所以我实际上可以查看它是否正常工作。当值不是双精度值时,程序会完成/完成其任务,但结果会在控制台窗口上闪烁,然后立即退出。

感谢任何帮助。

【问题讨论】:

    标签: c++ loops while-loop


    【解决方案1】:

    你的问题是当你说:

    cin >> value
    

    并输入除双精度以外的任何内容,流变坏,因为值期望双精度。您的 keep_window_open() 函数也失败了,因为流仍然很糟糕。

    有两种方法可以解决这个问题:

    • 从现有的命令行提示窗口运行您的程序 - 程序结束后该窗口将保持打开状态。这是最好的通用解决方案。

    • 在使用“暂停”代码之前清除流。不幸的是,您键入的结束行仍将在缓冲区中。将您的“暂停”代码替换为:

    _

    string line;
    if ( ! cin ) {
        cin.clear();
        getline( cin, line );
    }
    getline( cin, line );
    

    【讨论】:

      【解决方案2】:

      您的程序之所以存在,是因为它是它假定的工作方式。 您可以在最后添加一个等待字符命中的调用...然后您将看到您的响应,当您点击字符时它将退出。

      std::cin.get();
      

      【讨论】:

        【解决方案3】:

        要退出循环,您可以使用break 指令。

        要在终止前查看结果,您可以使用getchar() 函数。

        【讨论】:

          猜你喜欢
          • 2013-09-26
          • 2015-07-14
          • 2016-04-14
          • 1970-01-01
          • 2013-06-28
          • 1970-01-01
          • 2014-09-08
          • 1970-01-01
          • 2020-07-24
          相关资源
          最近更新 更多