для петли необычного поведения в C - PullRequest
0 голосов
/ 06 ноября 2018

В программировании c я пишу код, как показано ниже: Но проблема состоит в том, что сначала цикл не работает должным образом. Это означает, что цикл for выполняется только 1 раз, а не t, а иногда, когда сначала работает цикл, затем вывод выводит «да» или «нет» только для l = 1 и от l = 2 до l = t, он печатает пустой экран.

int t,i,n,arr[n+1],j,k,l,flag,x,y;
scanf("%d",&t);
for(l=1;l<=t;l++)
{
    scanf("%d",&n);
    for(i=1;i<n+1;i++)
    {
        scanf("%d",&arr[i]);
    }
    for(k=1;k<n;k++)
    {
        for(j=k+1;j<n+1;j++)
        {
            if(arr[k]==arr[j])
            {
                flag=1;
            }
            else if(arr[k]!=arr[j])
            {
                x=arr[k];
                y=arr[j];
                if(arr[x]==arr[y])
                {
                    flag=2;
                    printf("YES");
                    break;
                }
            }
        }
        if(flag==2)
        {
            break;
        }
    }
    if(flag==1)
    {
        printf("NO");
    }
}

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Другая проблема здесь:

int t,i,n,arr[n+1],j,k,l,flag,x,y;
//      ^     ^
//      |     |--- non initialized n used here
//      |     
//      |-- n declared here bot not initialized

при объявлении arr[n+1] содержание n не определено.

Вы, вероятно, хотите что-то вроде этого:

int t,i,n,j,k,l,flag,x,y;

scanf("%d",&t);
for(l=1;l<=t;l++)
{
  scanf("%d",&t);
  for(l=1;l<=t;l++)
  {
      scanf("%d",&n);
      int arr[n+1];

      for(i=1;i<n+1;i++)
      {
        scanf("%d",&arr[i]);
      }
      ...

Скорее всего, в другом месте больше ошибок. Смотрите также другой ответ.

0 голосов
/ 06 ноября 2018

Это невозможно диагностировать без дополнительного контекста, но вот огромный красный флаг:

for(i=1;i<n+1;i++)
{
    scanf("%d",&arr[i]);
}

Вы не показываете объявление arr, но 1-индексирование в массиве - очень хороший способ выстрелить себе в ногу. Помните, что массив N-элементов в C имеет допустимые индексы от 0 до (N - 1) включительно.

Если вышеприведенное переписывает массив, вы получаете неопределенное поведение, что, конечно, может привести к преждевременному завершению внешнего цикла.

ОБНОВЛЕНИЕ : Теперь, когда вы показываете объявление arr, мы можем посмотреть:

int t,i,n,arr[n+1],j,k,l,flag,x,y;

Это ... очень сломано, поскольку n неинициализирован в точке, где он используется в VLA, это дает вам неопределенное поведение. Я на самом деле немного удивлен, что ваш компилятор принял это. Я попытался создать его на ideone.com , но он не удался, сказав:

error: ‘n’ is used uninitialized in this function [-Werror=uninitialized]

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

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