【问题标题】:I have an error within my code, probably syntax or with the if statements that I can't find. New to programming我的代码中有错误,可能是语法或我找不到的 if 语句。编程新手
【发布时间】:2016-02-27 17:00:08
【问题描述】:

所以这可能是我的第一个程序。它接受用户关于三角形的输入,然后对它们进行分类并输出给定​​的数据所暗示的三角形。我在猜测事情是如何工作的,只是为了玩 c++,但我遇到了一个问题。我现在没有从我的程序中得到预期的结果(尽管它们以前并不完美),而不是输入边长,我输入了第一个边长,它会自动跳过其他 2 个边长并继续使用代码.

#include <iostream>

using std::cout;
using std::cin;
int sideA, sideB, sideC, angleA, angleB, angleC, longest, middle, shortest, sumbc, sumac, sumab;
int main()
{
cout << "Enter an angle for angle A\n";
cin >> angleA;
cout << "Enter an angle for angle B\n";
cin >> angleB;
cout << "Enter an angle for angle C\n";
cin >> angleC;
sumbc = angleB+angleC;
sumac = angleA+angleC;
sumab = angleA+angleB;
if(angleA + angleB + angleC == 180){ // This confirms that the angles add to 180 to form a triangle
        cout << "This is a triangle!(Based on Angles)\n";

if(angleA == 90){ // These are for right angle triangles
        cout << "This is a real right triangle!(angleA is 90 degrees..)\n";
        cout << "Please enter the side lengths now\n";
        cout << "Side 1:\n";
        cin >> sideA;
        cout << "Side 2:\n";
        cin >> sideB;
        cout << "Side 3:\n";
        cin >> sideC;
        if(sideA > sideB && sideA > sideC){
            longest = sideA;
            cout << "Side 1 is the hypotenuse!\n";
        }
        else if(sideB > sideA && sideB > sideC) {
            cout << "Side 2 is the hypotenuse\n";
            longest = sideB;
        }
        else if(sideC > sideA && sideC > sideB){
            cout << "The hypotenuse is Side 3\n";
            longest = sideC;
        }
        if(longest == sideC && sideA == sideB) { //Determines what kind of triangle it is if the longest side is sideC
                cout << "This triangle is Right and Isosceles\n  ";

        }
        else if(longest == sideB && sideC == sideA){
                cout << "This triangle is Right and Isosceles\n  ";

        }
        else if(longest == sideA && sideB == sideC ){
            cout << "This triangle is Right and Isosceles\n  ";
        }
        else {
            cout << "This triangle is right and Scalene!\n";
        }


    }
if(angleB == 90){ // These are for right angle triangles

        cout << "This is a real right triangle!(angleB is 90 degrees..)\n";
        cout << "Please enter the side lengths now\n";
        cout << "Side 1:\n";
        cin >> sideA;
        cout << "Side 2:\n";
        cin >> sideB;
        cout << "Side 3:\n";
        cin >> sideC;
        if(sideA > sideB && sideA > sideC){ //Finds longest side
            longest = sideA;
            cout << "Side 1 is the hypotenuse!\n";
        }
        else if(sideB > sideA && sideB > sideC) {
            cout << "Side 2 is the hypotenuse\n";
            longest = sideB;
        }
        else if(sideC > sideA && sideC > sideB){
            cout << "The hypotenuse side is Side 3";
            longest = sideC;
        }
        if(longest == sideC && sideA == sideB) { //Determines what kind of triangle it is if the longest side is sideC
                cout << "This triangle is Right and Isosceles\n  ";

        }
        else if(longest == sideB && sideC == sideA){
                cout << "This triangle is Right and Isosceles\n  ";

        }
        else if(longest == sideA && sideB == sideC ){
            cout << "This triangle is Right and Isosceles\n  ";
        }
        else {
            cout << "This triangle is right and scalene!\n";
        }


    }
if(angleC == 90){ // These are for right angle triangles


        cout << "This is a real right triangle!(angleC is 90 degrees..)\n";
        cout << "Please enter the side lengths now\n";
        cout << "Side 1:\n";
        cin >> sideA;
        cout << "Side 2:\n";
        cin >> sideB;
        cout << "Side 3:\n";
        cin >> sideC;
        if(sideA > sideB && sideA > sideC){
            longest = sideA;
            cout << "Side 1 is the hypotenuse!\n";
        }
        else if(sideB > sideA && sideB > sideC) {
            cout << "Side 2 is the hypotenuse\n";
            longest = sideB;
        }
        else if(sideC > sideA && sideC > sideB){
            cout << "The hypotenuse is Side 3";
            longest = sideC;
        }
        if(longest == sideC && sideA == sideB) { //Determines what kind of triangle it is if the longest side is sideC
                cout << "This triangle is Right and Isosceles\n  ";

        }
        else if(longest == sideB && sideC == sideA){
                cout << "This triangle is Right and Isosceles\n  ";

        }
        else if(longest == sideA && sideB == sideC ){
            cout << "This triangle is Right and Isosceles\n  ";
        }
        else {
            cout << "This triangle is right and scalene!\n";
        }


    }
if(angleA == angleB && angleB == angleC){ // This is for equiangular/equilateral triangles

            cout << "This is an equiangular/equilateral triangle.\n ";
            cout << "Please enter the side lengths now\n";
            cout << "Side 1:\n";
            cin >> sideA;
            int periequal = sideA*3;
            int areaequal = sideA*sideA*.5;
            cout << "The area is : " << areaequal << std::endl << "The perimeter is: " << periequal << std::endl;
            cout << "This triangle is Isosceles, Equiangular, Equilateral, and Acute ";


            }

    if(angleA < 90 && sumbc != 120 && angleB < 90 && angleC < 90){ //deals with acute triangles
        cout << "This is an acute triangle!\n";
        cout << "Please enter the side lengths now\n";
        cout << "Side 1:\n";
        cin >> sideA;
        cout << "Side 2:\n";
        cin >> sideB;
        cout << "Side 3:\n";
        cin >> sideC;
        int AcuteIsoPeri = sideA + sideB + sideC;
            if (sideA == sideB){
                    cout << "This is an Acute, Isosceles Triangle. \n" << "With a perimeter of: " << AcuteIsoPeri;

            }
             else if(sideA == sideC){
                 cout << "This is an Acute, Isosceles Triangle. \n" << "With a perimeter of: " << AcuteIsoPeri;
            }
            else if(sideB == sideC){
                 cout << "This is an Acute, Isosceles Triangle. \n" << "With a perimeter of: " << AcuteIsoPeri;
            }
            else{
                cout << "This is an Acute, Scalene Triangle. \n" << "With a perimeter of " << AcuteIsoPeri;
            }

    } //end of angleA if statement
    if(angleA > 90){  //Deals with obtuse
    cout << "This angle is Obtuse, angle A is greater than 90..";
    cout << "Please enter the side lengths now\n";
        cout << "Side 1:\n";
        cin >> sideA;
        cout << "Side 2:\n";
        cin >> sideB;
        cout << "Side 3:\n";
        cin >> sideC;
            if (sideA == sideB){
                    cout << "This is an Obtuse, Isosceles Triangle. \n";

            }
            else if(sideA == sideC){
                 cout << "This is an Obtuse, Isosceles Triangle. \n";
            }
            else if(sideB == sideC){
                 cout << "This is an Obtuse, Isosceles Triangle. \n";
            }
            else{
                cout << "This is an Obtuse, Scalene Triangle. \n";
            }
}
        else if(angleB > 90){
    cout << "This angle is Obtuse, angle B is greater than 90..";
    cout << "Please enter the side lengths now\n";
        cout << "Side 1:\n";
        cin >> sideA;
        cout << "Side 2:\n";
        cin >> sideB;
        cout << "Side 3:\n";
        cin >> sideC;
                       if (sideA == sideB){
                    cout << "This is an Obtuse, Isosceles Triangle. \n";

            }
            else if(sideA == sideC){
                 cout << "This is an Obtuse, Isosceles Triangle. \n";
            }
            else if(sideB == sideC){
                 cout << "This is an Obtuse, Isosceles Triangle. \n";
            }
            else{
                cout << "This is an Obtuse, Scalene Triangle. \n";
            }
}
        else if(angleC > 90){
        cout << "This angle is Obtuse, angle C is greater than 90..";
        cout << "Please enter the side lengths now\n";
        cout << "Side 1:\n";
        cin >> sideA;
        cout << "Side 2:\n";
        cin >> sideB;
        cout << "Side 3:\n";
        cin >> sideC;
                    if (sideA == sideB){
                    cout << "This is an Obtuse, Isosceles Triangle. \n";

            }
        else if(sideA == sideC){
                 cout << "This is an Obtuse, Isosceles Triangle. \n";
            }
        else if(sideB == sideC){
                 cout << "This is an Obtuse, Isosceles Triangle. \n";
            }
        else{
                cout << "This is an Obtuse, Scalene Triangle. \n";
            }
}
        }




//scalene, obtuse, acute
return 0;
}

所以我可能不知道我在做什么,而且我是一个糟糕的程序员或什么的哈哈,但是当我输入这些信息时,我得到了以下信息: 信息:角度是 40,114,26 ..它确定它是正确的钝角,然后它要求边长,这也是我打算让它做的..然后我输入第一个边长(6.4)和一旦我按下回车,程序就会跳到最后。我可能犯了一个我找不到的语法错误,或者我使用 if 语句的方式完全错误。如果你能帮助解决这个烂摊子,那将不胜感激! (前几天晚上开始研究 c++,想把它应用到真实的东西上,这就是这个怪物是如何被创造出来的......)Examle of Proper Output... Example of Wrong Output

【问题讨论】:

  • 你有一个逻辑错误。程序编译和链接很好。如果出现语法错误,程序将无法编译
  • @Nandu 哦,好的,谢谢,我会更新问题..
  • 欢迎来到 Stack Overflow。我无法重现您的错误。当您编写代码时,最好先从可以完美运行的小而简单的东西开始,然后一次一点地增加复杂性,在每一步都进行测试。这样,您就不会最终寻找可能存在于大型程序中的任何地方的错误。如果您确实到了那里,请尝试将代码简化minimal complete example,这是产生错误的最简单示例。这将使您和我们的狩猎变得更加容易。
  • @Beta 嗯,一开始很简单。当我几个小时前开始它时,它只识别等角三角形,但我试图让它能够按角度和边对每种类型的三角形进行分类两个都。我想我会放弃这个,明天再试一次,考虑到这个建议(最少的编码),当我编码这个时,我一次拿一点,但我可能没有尽可能多地测试每一位代码。五。
  • @user3739597 查看我的答案的编辑。

标签: c++ if-statement syntax


【解决方案1】:
int sideA, sideB, sideC, angleA, angleB, angleC, longest, middle, shortest, sumbc, sumac, sumab;

你所有的变量都是typeint。这些仅包含整数。您可能想要的类型是floatdouble,它们是可以保存实数的浮点类型:

double sideA, sideB, sideC, angleA, angleB, angleC, longest, middle, shortest, sumbc, sumac, sumab;

在你开始使用这些类型之后,你会遇到这些行的问题:

if(angleA + angleB + angleC == 180)
if(angleA == 90)

问题在于,即使您在纸上输入的值加起来可能是 180,但在计算机中,50.0+50.0+80.0 可能等于 179.999992 或类似的值。见What every programmer should know about floating point math

您确定这三个 if 语句之一将始终评估为 true

    if(sideA > sideB && sideA > sideC){
        longest = sideA;
        cout << "Side 1 is the hypotenuse!\n";
    }
    else if(sideB > sideA && sideB > sideC) {
        cout << "Side 2 is the hypotenuse\n";
        longest = sideB;
    }
    else if(sideC > sideA && sideC > sideB){
        cout << "The hypotenuse is Side 3\n";
        longest = sideC;
    }

如果没有,longest 将永远不会被赋值,你会得到意想不到的结果。

您的代码中还有其他问题,但我不再关注这一点。祝你好运。

【讨论】:

  • 最长仅适用于直角三角形。那么,如果它只适用于三角形是直角三角形,它是否需要一个值?而且由于我的工作速度很快,而且我的知识非常有限,我确信这个程序很少是正确或有效的。
【解决方案2】:

问题的缺点是您正在尝试将浮点数/双精度数放入整数中。当你混合这样的类型时,cin 不喜欢它。如果您输入字母“a”,也会发生同样的事情。尝试使用浮点数而不是整数。

编辑:澄清我的意思是让你的边和角度变成浮动。只要我没有输入带小数点的数字,该程序就对我有用。

【讨论】:

  • 我还没有了解“浮点”数据类型,这似乎解决了问题。我应该始终将浮点数用于低位十进制数吗?
  • 取决于您的需要。浮点数和双精度数可以但不总是有小数位。这取决于数字的大小。我强烈建议您现在就研究一下,因为浮点舍入可能会导致您出现错误,让您搜索数天。
猜你喜欢
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 2012-12-20
  • 2021-03-06
  • 1970-01-01
  • 2015-06-10
相关资源
最近更新 更多