Для циклов, подсчитывающих превышение предела C

#c

Вопрос:

У меня действительно странная проблема с for loop. Я должен сделать программу, которая, учитывая сумму трех кубиков, должна найти все возможные комбинации из этих трех кубиков, которые дают эту сумму. Проблема в том, что циклы for отсчитывают превышенный лимит, который у них есть, и я понятия не имею, почему.

 for (k1 = 1; k1 <= 6; k1  ) //k1 - die 1
{
    for (k2 = 1; k2 <= 6; k2  ) //k2 - die 2
    {
        for (k3 = 1; k3 <= 6; k3  ) //k3 - die 3
        {
            if (k1 k2 k3 == z) //z - sum
                cout<<k1<<"-"<<k2<<"-"<<k3<<endl;
        }

        if (k1 k2 k3 == z)
            cout<<k1<<"-"<<k2<<"-"<<k3<<endl;
    }

    if (k1 k2 k3 == z)
        cout<<k1<<"-"<<k2<<"-"<<k3<<endl;
}
 

Если я введу 16 для суммы, это будут результаты, которые я получу:

 2-7-7
3-6-7
4-5-7
4-6-6
5-4-7
5-5-6
5-6-5
6-3-7
6-4-6
6-5-5
6-6-4
 

Это действительные результаты для суммы 16, но у меня не должно быть числа 7 на кубиках, и кубики не должны быть в состоянии добраться до 7 из-за того, как делается for.

Я использую c 17 в Eclipse с Eclipse CDT.

Комментарии:

1. Вы используете k3 его после завершения цикла. for (k3 = 1; k3 <= 6; k3 ) Итак , когда k3 == 7 этот цикл закончится. То же самое с k2 .

2. Вам нужно всего 1 if . И если бы вы использовали переменные с областью действия (например for (int k1 = 1; k1 <= 6; k1 ) ), компилятор остановил бы вас от совершения этой ошибки.

Ответ №1:

Это происходит потому,что у вас есть переменные k2, k3, которые распределены выше.

Что касается цикла, он работает до тех пор, пока не закончится цикл, когда k3=7. Итак, k3 сохранит его, и после цикла, когда вы его получите, у вас будет 7.

Вы могли бы использовать один из предложенных подходов Сета Фолфнера или Иксисарвинена. Если вы хотите сохранить значения для использования в будущем, используйте код Сета Фолфнера. Если в этом нет необходимости, используйте код Иксисарвинена.

Ответ №2:

Почему бы просто не проверить внутри петель?

 for (k1 = 1; k1 <= 6; k1  ) //k1 - die 1
{
    for (k2 = 1; k2 <= 6; k2  ) //k2 - die 2
    {
        for (k3 = 1; k3 <= 6; k3  ) //k3 - die 3
        {
            if (k1 k2 k3 == z) //z - sum
                cout<<k1<<"-"<<k2<<"-"<<k3<<endl;
        }
    }
}
 

Ответ №3:

Проблема в том, что переменная k3 не повторяется за пределами последнего цикла for. Вот тут-то и возникает проблема. Для получения желаемого результата проверьте сумму и распечатайте, если она верна; это следует делать только один раз в последнем цикле for.

Пример кода будет выглядеть так :-

 #include <iostream>
using namespace std;

int main()

{
    
int num,i,j,k;

cout<<"enter a number"<<endl;

cin>> num;

cout<<"dice combinations are "<<endl;

for(i=1;i<=6;i  )
{
    for(j=1;j<=6;j  )
    {
        for(k=1;k<=6;k  )
        {
            if(i j k == num)
            {
                cout<<i<<"-"<<j<<"-"<<k<<endl;
            }
        }
    }
}

}