目前正在使用C ++中的一个简单的Triangle分类器程序,并且它运行得很好,除了一两件事。
好的,我有四个功能,一个用于处理错误,例如输入的值小于零或输入的长度不允许三角形物理上可行;一个用于分类器,根据提供的值确定它的三角形类型;一个计算使用side作为double值的区域使用Heron公式计算区域,最后是main函数,它按照这个顺序调用所有这些函数,并将side赋予它们作为参数,以便if语句可以跟着他们。
我的问题是,当用户输入边长为0时,它会输出用户输入的值等于零的错误消息,然后打印出它的等边三角形。在if语句中满足条件时,我需要更改什么才能使程序完全停止?我认为问题是,条件正常,但因为我在ExceptionHandling之后调用了Classifier函数,所以它打印出它的等边三角形。
我还想设置一个循环,让用户尝试再次输入一个值,如果他们输入的值导致在ExceptionHandling函数中遇到一个条件,但我尝试设置一个while循环,它只是导致无限循环。
我在下面提供了一些代码片段,但是,我无法发布完整代码,因为它是一项任务,我不希望其他任何人找到它。 :P
...
void ExceptionHandling(double side1, double side2, double side3)
{
if (side1 < 1 || side2 < 1 || side3 < 1)
{
cout << "Error: All values must be greater than zero." << endl;
}
}
double Classifier(double side1, double side2, double side3)
{
if (side1 == side2 && side2 == side3)
{
cout << "This would be classified as an equilateral triangle." << endl;
}
...
int main()
{
double side1;
cout << "Enter the longest side: ";
cin >> side1;
...
ExceptionHandling(side1, side2, side3);
Classifier(side1, side2, side3);
Area(side1, side2, side3);
}
我很欣赏一个愚蠢的解释,因为我非常想知道..提前致谢。
答案 0 :(得分:0)
如果您想退出无效输入(而不是让用户再试一次),那么您应该做的是:
int main() {
...
if (not ValidInput(side1, side2, side3))
{
std::cerr << "error: invalid input.\n";
return EXIT_FAILURE;
}
Classifier(side1, side2, side3);
Area(side1, side2, side3);
}
如果你想要一个循环,那么你可以这样做:
int main() {
double side1, side2, side3;
GetInput(side1, side2, side3);
while (not ValidInput(side1, side2, side3)
{
std::cout << "invalid input. Try again.\n";
GetInput(side1, side2, side3);
}
Classifier(side1, side2, side3);
Area(side1, side2, side3);
}
第二个循环示例:
int main() {
double side1 = 0.0, side2 = 0.0, side3 = 0.0;
while (not ValidInput(side1, side2, side3)
{
GetInput(side1, side2, side3);
if (not ValidInput(side1, side2, side3))
{
std::cout << "invalid input. Try again.\n";
}
}
Classifier(side1, side2, side3);
Area(side1, side2, side3);
}
这里只在一个地方调用GetInput,因此您不需要使用单独的函数。
答案 1 :(得分:0)
这是一种非传统的分离 - 但是如果你愿意,你可以这样做:ExceptionHandling函数检查“一切都好”并且只有在一切正常时才返回true:
bool ExceptionHandling(double side1, double side2, double side3)
{
if (side1 < 1 || side2 < 1 || side3 < 1)
{
cout << "Error: All values must be greater than zero." << endl;
return false;
}
return true;
}
double Classifier(double side1, double side2, double side3)
{
if (side1 == side2 && side2 == side3)
{
cout << "This would be classified as an equilateral triangle." << endl;
}
...
int main()
{
double side1;
cout << "Enter the longest side: ";
cin >> side1;
...
if(ExceptionHandling(side1, side2, side3)) {
Classifier(side1, side2, side3);
Area(side1, side2, side3);
}
}
只有“一切正常”,才能完成对分类器和区域的调用。
现在命名有点集中,但你可以很容易地改变,例如 ExceptionHandling 可以称为 preconditionsMet 。