В чем проблема этого оператора if? - PullRequest
0 голосов
/ 22 января 2020

Я написал это консольное приложение в качестве упражнения, но столкнулся с проблемой одного из операторов if. Я не могу понять, в чем проблема, может ли кто-нибудь помочь мне с этим?

Это не будет располагать в алфавитном порядке жирный раздел, я имею в виду s3, s1, s2

#include <iostream>
#include <string>
using namespace std;

int main(int argc, char** argv) {
    string s1, s2, s3;
    cout << "Please enter three words: ";
    cin >> s1;
    cin >> s2;
    cin >> s3;

    if(s1.compare(s2)<0)
    {
        if(s2.compare(s3)<0)
        {
            cout << s1 << ", " << s2 << ", " << s3 << endl;
        }
        else 
            cout << s1 << ", " << s3 << ", " << s2 << endl;
    }
    else if (s2.compare(s3)<0)
    {
        if(s1.compare(s3)<0)
        {
            cout << s2 << ", " << s1 << ", " << s3 << endl;
        }
        else
            cout << s2 << ", " << s3 << ", " << s1 << endl;
    }
    else if(s3.compare(s2)<0)
    {
        if(s1.compare(s2)<0) // <-- HERE!!
        {
            cout << s3 << ", " << s1 << ", " << s2 << endl;
        }
        else
            cout << s3 << ", " << s2 << ", " << s1 << endl;
    }
    return 0;
}

Ответы [ 4 ]

1 голос
/ 22 января 2020

Я проверил ваш код на наличие ошибок и обнаружил кое-что интересное.

Когда порядок должен быть S3, S1, S2 первым, если утверждение все еще верно. Вы можете исправить это, используя оператор and, например:

if ((s1.compare(s2) < 0) && (s1.compare(s3) < 0)) 
{ 
... code here ...
}

Этот дополнительный код в ваших операторах if предотвратит возникновение ошибок. Надеюсь, это поможет!

#include <iostream>
#include <string>
using namespace std;

int main(int argc, char** argv) {
    string s1, s2, s3;
    cout<<"Please enter three words: ";
    cin>>s1;
    cin>>s2;
    cin>>s3;
    if((s1.compare(s2)<0) && (s1.compare(s3)<0))
    {
        if(s2.compare(s3)<0)
        {
            cout<<s1<<", "<<s2<<", "<<s3<<endl;
        }
        else 
        cout<<s1<<", "<<s3<<", "<<s2<<endl;
    }
    else if ((s2.compare(s3)<0) && (s2.compare(s1)<0))
    {
        if(s1.compare(s3)<0)
        {
            cout<<s2<<", "<<s1<<", "<<s3<<endl;
        }
        else
        cout<<s2<<", "<<s3<<", "<<s1<<endl;
    }

    else if((s3.compare(s2)<0) && (s3.compare(s1)<0))
    {
        if(s1.compare(s2)<0)
        {
            cout<<s3<<", "<<s1<<", "<<s2<<endl;
        }
        else
        cout<<s3<<", "<<s2<<", "<<s1<<endl;
    }
    return 0;
}
0 голосов
/ 22 января 2020

ИМХО, на первый должен быть последовательно ссылаться или шаблонироваться другой

#include <iostream>
#include <string>
using namespace std;

int main(int argc, char** argv) {
    string s1, s2, s3;
    cout << "Please enter three words: ";
    cin >> s1 >> s2 >> s3;

    if(s1.compare(s2)<0)
    {
        if(s2.compare(s3)<0)                                    // repeat this pattern
            cout << s1 << ", " << s2 << ", " << s3 << endl;     //

        else if(s2.compare(s3) == 0)                            //
            cout << s1 << ", " << s2 << " = " << s3 << endl;    //

        else
            cout << s1 << ", " << s3 << ", " << s2 << endl;     //
    }                                                           //
    else if (s2.compare(s3)<0)
    {
        if(s3.compare(s1)<0)
            cout << s2 << ", " << s3 << ", " << s1 << endl;

        else if(s1.compare(s3) == 0)
            cout << s2 << ", " << s1 << " = " << s3 << endl;
        else
            cout << s2 << ", " << s1 << ", " << s3 << endl;
    }
    else if(s1.compare(s3)<0)
    {
        if(s3.compare(s2)<0) // <-- HERE!!

            cout << s1 << ", " << s3 << ", " << s2 << endl;

        else if(s2.compare(s3) == 0)
            cout << s1 << ", " << s2 << " = " << s3 << endl;
        else
            cout << s1 << ", " << s2 << ", " << s3 << endl;
    }
    return 0;
}
0 голосов
/ 22 января 2020

Проблема гораздо раньше, чем «ЗДЕСЬ».

Эта часть

if(s1.compare(s2)<0)
{
    if(s2.compare(s3)<0)
    {
        cout << s1 << ", " << s2 << ", " << s3 << endl;
    }
    else 
        cout << s1 << ", " << s3 << ", " << s2 << endl;
}

впервые проверяет, что s1 «меньше» s2. Таким образом, у вас есть частичный заказ s1, s2.

Но тогда вам нужно выяснить, в каком из трех возможных мест s3 должен go: впереди s1, за s2, возможно, между ними. Однако внутреннее условное выражение допускает только два разных выхода ...

Добавлено:

Вы можете решить проблему, начав с комментария выше: Сравнение двух элементов достаточно, чтобы отсортировать их. Затем вам нужно сравнить третий с обоими из них, чтобы решить, должен ли он go первый, второй или последний:

if(s1.compare(s2) <= 0)       // s1 goes before s2
{
    if(s3.compare(s1) <= 0)       // s3 goes before s1
        cout << s3 << ", " << s1 << ", " << s2 << endl;
    else if(s3.compare(s2) <= 0)  // s3 goes before s2 but after s1
        cout << s1 << ", " << s3 << ", " << s2 << endl;
    else                          // s3 goes after s2
        cout << s1 << ", " << s2 << ", " << s3 << endl;
}
else                          // s2 goes before s1
{
    if(s3.compare(s2) <= 0)       // s3 goes before s2
        cout << s3 << ", " << s2 << ", " << s1 << endl;
    else if(s3.compare(s1) <= 0)  // s3 goes before s1 but after s2
        cout << s2 << ", " << s3 << ", " << s1 << endl;
    else                          // s3 goes after s1
        cout << s2 << ", " << s1 << ", " << s3 << endl;
}

Возможны 6 перестановок для 3 входных значений, и все они доступный. На каждом пути проводится не более 3 сравнений, что достаточно для различения guish каждого из 6 возможных выходов.

0 голосов
/ 22 января 2020

Ваше самое первое условие if:

if(s1.compare(s2)<0)

Это означает, что он не может добраться до оператора if, помеченного «ЗДЕСЬ», потому что он всегда будет занимать первую ветвь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...