Member 13015247 Ответов: 2

Пионт вышел из ошибки в коде?


он дает правильный вывод до order = 3 после этого он дает неправильный ответ.я не получаю место, где я ошибся plz помогите мне. я просто хочу подсказку

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

#include<stdio.h>
#include<math.h>
int m;
int main()
{
int i,j;
printf("enter order of matrix\n");
scanf("%d",&m);
int a[m][m];
printf("enter elements of matrix\n");
for(i=0;i<m;i++)
{
    for(j=0;j<m;j++)
    {printf("a[%d][%d] = \n",i,j);
    scanf("%d",&a[i][j]);}
}
det(m,a);
printf("detrminant = %d",det(m,a));
}
int det(int x,int a[][x])
{   int k,i,j,b[m][m],sum=0;
    if(x==2)
    {
        sum=a[0][0]*a[1][1]-a[0][1]*a[1][0];
        return sum;
    }
    for(k=0;k<x;k++)
    {   int r=0,s=0;
        for(i=1;i<m;i++)
        {
            for(j=0;j<m;j++)
            {
                if(j==k)
                continue;
                b[r][s]=a[i][j];
                s++;
                if(j>m-1)
                {
                    r++;
                    s=0;
                }
                
            }
        }
        sum=sum+a[0][k]*pow(-1,k)*det(x-1,b);
    }
    
    
    return sum;
    
}

Graeme_Grant

Вы пробовали использовать отладчик, установить точку останова, а затем пройти через свой код, чтобы увидеть, что он делает и как он это делает?

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

2 Ответов

Рейтинг:
1

OriginalGriff

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

И в-четвертых, потому что это непроницаемый код, который я, по крайней мере, не могу понять, как он работает.
Измените свой код: прекратите использовать однобуквенные имена переменных и используйте имена, соответствующие функции, которую выполняет переменная. Выберите стиль отступа - мне все равно, какой именно - и придерживайтесь его. [Кроме этого:

for(j=0;j<m;j++)
{printf("a[%d][%d] = \n",i,j);
scanf("%d",&a[i][j]);}
Это бесполезный стиль]
Затем начните смотреть на свой код с помощью отладчика и выяснять, что он делает.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что именно то, что вы ожидали, произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.


Вам уже говорили все это раньше, но если вы не собираетесь слушать, есть ли смысл задавать вопросы?


[no name]

"Тебе уже говорили все это раньше", потому что он вампир-помощник.

OriginalGriff

Кажется, он действительно движется в ту сторону довольно быстро...: вздох:

Рейтинг:
0

CPallini

У вашего кода есть проблемы с обработкой подматриц.
Попробуй:

#include <stdio.h>

int det(int x,int a[][x]);

int main()
{
  int i,j,m;
  printf("enter order of matrix\n");
  scanf("%d",&m);
  int a[m][m];
  printf("enter elements of matrix\n");
  for(i=0;i<m;i++)
  {
    for(j=0;j<m;j++)
    {
      printf("a[%d][%d] = \n",i,j);
      scanf("%d",&a[i][j]);
    }
  }
  printf("determinant = %d\n",det(m,a));
}

int det(int x,int  a[][x])
{
  int k,i,j,b[x-1][x-1],sum=0;
  if(x==2)
  {
    sum=a[0][0]*a[1][1]-a[0][1]*a[1][0];
    return sum;
  }
  for(k=0;k<x;k++)
  {
    int r=0,s=0;
    for(i=1;i<x;i++)
    {
      for(j=0;j<x;j++)
      {
        if(j==k)
          continue;
        b[r][s]=a[i][j];
        s++;
        if( s == x-1)
        {
          r++;
          s=0;
        }
      }
    }
    int sign = k & 1 ? -1 : 1;
    sum=sum+a[0][k]*sign*det(x-1,b);
  }
  return sum;
}


Member 13015247

k & 1? -1 : 1 что это значит, что я знаю ? : оператор состояния, но не смог получить k& 1????

CPallini

Это побитовое и k с 1, чтобы проверить значение бита 0, т. е. равенство из числа. Один странный число имеет бит 0, следовательно, побитовое и с 1 дает 1. с другой стороны, четное число имеет бит 0 ясно, следовательно, побитовое и с 1 дает 0.