pkpawan123 Ответов: 3

Цикл Else оператора if-else не выполняется даже после того, как условие if имеет значение false. Ссылка на вопрос:-протокол HTTPS://ВСП.codechef.ком/представить/FIBEASY


#include<iostream>
#include<vector>

using namespace std;

int main()
{
    int T,i,j,k,l;
    cin>>T;                           //no of test cases

    long int P[T];

    for(i=0;i<T;++i)
    {
        long int A[T],N[T],E,D[T],size,F[T],Z,m;

        cin>>N[i];
		
        A[0]=0;
        A[1]=1;

        for(m=2;m<N[i];++m)      //fibonacci series of N terms
        {
            A[m]=A[m-1]+A[m-2];

            A[m-2]=A[m-1];
            A[m-1]=A[m];
        }

        for(m=0;m<N[i];++m)
        {                         //finding remainder of fibonacci series  
            D[m]=A[m]%10;
        }

        while(1)
        {
            for(j=0;j<N[i];j+2)
            {
                if(N[i]%2==0)      //to check whether N is even or not 
                {
                    for(k=0;k<(N[i]/2);++k)
                    {
                        F[k]=D[j];     //even elements  copied new array
                        D[k]=F[k];     // updating original array 
                    }

                    N[i]=k;         //updating value of N to last index of new array 
                }
                else
                {
                    if( N[i] == 1 ) // N[i] become 1 breaking it out of loop 
                    {
                        break;
                    }
                    else               // when N is not 1 and is odd 
                    {
                        for(k=0;k<((N[i]+1)/2);++k)       
                        {                 // for odd value half value is N+1/2
                            F[k]=D[j];  

                            //even elements are copied here in new array

                            D[k]=F[k];       

                            // updating original array to only even indices array 
                        }

                        N[i]=k;       //updating  N to last index of new array 
                    }
                }
            }

            if( N[i] == 1 )
            {
                 break;
            }
        }

        P[i]=F[0];            //assigning value to P
    }

    for(i=0;i<T;++i)
    {
        cout<<P[i]<<"\n";
    }
    return 0;
}


Что я уже пробовал:

я запускал его на разных компиляторах, но результат один и тот же: цикл else не выполняется, оператор else для обновления значений для нечетного значения N не выполняется.

Patrice T

Вы должны сказать, что должен делать код.
ссылка на оригинальную проблему тоже была бы хороша.

[no name]

я опубликовал оригинальную ссылку на проблему .

Rick York

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

[no name]

почему, сэр ? является ли синтаксис правильным?

Rick York

В прошлом размеры массивов требовали постоянного выражения для задания их размера. Как отметил г-н 0x1AA, похоже, что это больше не является обязательным требованием.

0x01AA

Похоже, что C++14 наконец-то поддерживает его (G++ поддерживал это с более длительного времени)

3 Ответов

Рейтинг:
2

Patrice T

В серии Фибоначчи ваш код слишком сложен:

A[0]=0;
A[1]=1;
for(m=2;m<N[i];++m)                     //fibonacci series of N terms
{
    A[m]=A[m-1]+A[m-2];

    A[m-2]=A[m-1]; // This line is suspect
    A[m-1]=A[m];   // this line too
}


Чтобы увидеть, что именно делает ваш код, вы должны научиться использовать отладчик, это отличный инструмент обучения.
-----
Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.
-----
Научитесь правильно делать отступы в вашем коде, это покажет его структуру, и это поможет чтению и пониманию. Это также помогает выявлять структурные ошибки.
#include<iostream>
#include<vector>

using namespace std;

int main()
{
    int T,i,j,k,l;
    cin>>T;                               //no of test cases

    long int P[T];


    for(i=0;i<T;++i)
    {

        long int A[T],N[T],E,D[T],size,F[T],Z,m;
        cin>>N[i];

        A[0]=0;
        A[1]=1;
        for(m=2;m<N[i];++m)                     //fibonacci series of N terms
        {
            A[m]=A[m-1]+A[m-2];

            A[m-2]=A[m-1];
            A[m-1]=A[m];
        }

        for(m=0;m<N[i];++m)
        {                             //finding remainder of fibonacci series
            D[m]=A[m]%10;
        }

        while(1)
        {
            for(j=0;j<N[i];j+2)
            {
                if(N[i]%2==0)          //to check whether N is even or not
                {
                    for(k=0;k<(N[i]/2);++k)
                    {
                        F[k]=D[j];        //even elements  copied new array
                        D[k]=F[k];              // updating original array

                    }

                    N[i]=k;        //updating value of N to last index of new array
                }
                else
                {
                    if(N[i]==1)
                    // N[i] become 1 breaking it out of loop
                    {
                        break;
                    }
                    else                 // when N is not 1 and is odd
                    {
                        for(k=0;k<((N[i]+1)/2);++k)
                        // for odd value half value is N+1/2
                        {
                            F[k]=D[j];

                            //even elements are copied here in new array

                            D[k]=F[k];

                            // updating original array to only even indices array

                        }

                        N[i]=k;
                        //updating  N to last index of new array
                    }
                }
            }
            if(N[i]==1)
            {
                break;
            }
        }

        P[i]=F[0];            //assigning value to P
    }
    for(i=0;i<T;++i)
    {
        cout<<P[i]<<"\n";
    }
    return 0;

}

Стиль отступа - Википедия[^]

Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Блокнот++ Главная Страница[^]
личные[^]

[Обновление]
Цитата:
это еще одно утверждение не выполняется, я не знаю, почему?

Поскольку ваш код глючит, условие else никогда не выполняется.
Вам нужно проверять правильность вашего кода на каждом шагу, это отладка.


[no name]

else // когда N не равно 1 и нечетно
{
для(k=0;k< ((N[i]+1)/2);++k)

// для нечетного значения Половинное значение равно N+1/2
{
F[k]=D[j];

//даже индексные элементы копируются здесь в новый массив

D[k]=F[k];

// обновление исходного массива до массива только четных индексов

}

N[i]=k;
//обновление N до последнего индекса нового массива
}

это еще одно утверждение не выполняется, я не знаю, почему?

Рейтинг:
1

CPallini

Неясно, что должен делать ваш код и где находится (предполагаемая) неудачная строка.
Во всяком случае, следующее утверждение

for(j=0;j<N[i];j+2)
вероятно, это неправильно, потому что
j+2
бесполезно (вы, наверное, имели в виду j+=2).

Включите все предупреждения компилятора и прочтите выданные предупреждения.

[обновление]
Вы должны исправить свой код, но, прежде всего, вы должны действительно подумать о проблеме. Например:
На самом деле вам не нужно вычислять ряд Фибоначчи, вычисление его напоминаний просто достаточно.
Возможно, операция "устранение нечетных элементов" не нужна (попробуйте использовать бумагу и карандаш).
[/обновление]

[обновление 2]
Сосредоточьтесь на Дл серии. Поскольку он содержит только напоминания о сумме предыдущих пунктов, он должен в конечном итоге повториться. Это наблюдение является ключом к ответу на вопрос с исходными ограничениями (без TLE).
[/обновление 2]


[no name]

мой код пропускает первый оператор else и все тело оператора else. вот вопрос ссылка https://www.codechef.com/submit/FIBEASY -да .

CPallini

Смотрите мое обновленное решение.

CPallini

Пожалуйста, посмотрите на Обновление 2 к моему решению.

Рейтинг:
0

OriginalGriff

Сколько раз мы должны говорить вам, чтобы вы начали использовать отладчик для определения того, что происходит в ваших приложениях?
Я сбился со счета, потому что большинство ваших вопросов отсутствуют в вашем списке вопросов, интересно, почему ...

Если вы не можете использовать отладчик должным образом, вам нет смысла продолжать выполнять эти упражнения: вы пишете код, он не работает, вы спрашиваете здесь. Это не развитие, это "соберите все вместе и надейтесь, что это сработает" - что является очень плохой методологией и учит вас очень немногому.

Возьмите отладчик и начните учиться его использовать: это улучшит качество вашего кода (в настоящее время оценка "плохой студент") и поможет вам быстрее справиться с этими задачами.


[no name]

хорошо сэр