Могу ли я передать значения матрицы в другую матрицу, одновременно проиндексировав обе матрицы в c? - PullRequest
0 голосов
/ 25 мая 2018

Я пишу фрагмент кода, который использует структуру и 5 предопределенных функций, у меня возникают проблемы при передаче значений входного 2d-массива по выбранному индексу в новый 2d-массив.

Я включил свои функции и код для функции, с которой у меня возникают трудности.

struct matrix
{
char name;
int mValues[10][10];
int ncols;
int nrows;
};

void matrixInput(struct matrix *matA);
void matrixDisplay(struct matrix matA);
void matrixTrace(struct matrix matA, int *trace);
void matrixDeterminant(struct matrix m1, struct matrix *m2, int * determinant);


///function body 
void matrixDeterminant(struct matrix m1, struct matrix *m2, int * determinant)
{
int i, j, k, l;
FILE* fin;
fin = fopen("marks.txt", "r");
if(((m1.nrows)>2))
{
    printf("\n\nFinding the deterinamt now.\n");
    if(fin!=NULL)
    {
        do
        {
             printf("Please assign a letter to name your matrix A - Z : ");
             scanf(" %c", &((*m2).name));
        }
             while((((*m2).name)<'A') || ((*m2).name)>'Z');
        do
        {
             printf("\n\nEnter the row where you want to start the 2x2 matrix.\nNumber needs to be between 1 and %d : ", ((m1).nrows-1));
             scanf("%d", &k);
        }
             while((k) >= ((m1).nrows));
        do 
        {
             printf("\n\nEnter the column where you want to start you 2x2 mtrix.\nNumber needs to be between 1 and %d : ", ((m1).ncols-1));
             scanf("%d", &l);
        }
             while((l) >= ((m1).ncols));
    }

    for(i=0; i<2; i++,k++)
        {
             printf("Row %d:\t", i+1);

             for(j=0; j<2; j++,l++)
                 {
                    ((*m2).mValues[i][j]) = ((m1).mValues[k-1][l-1]);
                    printf("%d\t",((*m2).mValues[i][j])); 
                 }
                 printf("\n");
        }

}

/// Input/Output
Please assign a letter to name your matrix A - Z : H

Please enter the number of rows in matrix H > 1 < 10 :8

Please enter the number of cols in matrix H > 1 < 10 :8

Matrix H has 8 rows and 8 columns and contains:

Row 1:  55  7   40  30  32  45  43  77
Row 2:  72  1   20  65  85  40  46  22  
Row 3:  45  77  88  32  30  55  59  99  
Row 4:  72  37  33  18  44  73  44  12  
Row 5:  88  2   11  55  7   40  30  32  
Row 6:  24  73  13  99  99  22  45  77  
Row 7:  88  32  22  11  98  34  38  37  
Row 8:  33  18  44  73  22  45  77  88 

Trace of matrix H = 317 

Finding the deterinamt now.
Please assign a letter to name your matrix A - Z : F

Enter the row where you want to start the 2x2 matrix.
Number needs to be between 1 and 7 : 3

Enter the column where you want to start you 2x2 mtrix.
Number needs to be between 1 and 7 : 3
Row 1:  88  32  
Row 2:  44  73   // This has shifted 2 columns. 

Process returned 0 (0x0)   execution time : 14.807 s
Press ENTER to continue.

Первая функция позволяет имени пользователя и определять размеры матрицы, которая затем заполняется из файла .txt, содержащего целые числа 10x10.

Вторая функция отображает матрицу итретий вычисляет след.

Четвертая функция просит пользователя выбрать матрицу 2x2, которая является подмножеством исходной матрицы.Содержимое матрицы 2x2 должно храниться в новой структурной матрице вместе с ее именем и размером.

То, что я «думаю», что я сделал, это спросить пользователя, где запустить подматрицу и сохранить значения в k и l, затем я использую эти значения в качестве индекса.

Там, где я считаю, что моя проблема возникает в передаче этих значений в новую матрицу, во вложенных циклах for я увеличил i и j, чтобы проиндексировать новую матрицу, а l и k, чтобы проиндексировать матрицу, которой я передаю значенияот.

ПРИМЕЧАНИЕ. Я никогда не видел, чтобы 2 значения увеличивались в цикле for раньше, поэтому я ожидаю, что он не выполняет то, что, как мне кажется, он делает, поскольку строка 2 подматрицы сместила 2 столбца.

Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Ваш l, который увеличивается в самом внутреннем цикле, является виновником

для (j = 0; j <2; j ++, l ++) </p>

, вам нужнопереинициализировать его

for(i=0; i<2; i++,k++)
        {
             printf("Row %d:\t", i+1);

             for(j=0; j<2; j++,l++)
                 {
                    (m2->mValues[i][j]) = ((m1).mValues[k-1][l-1]);
                    printf("%d\t",(m2->mValues[i][j])); 
                 }
                 printf("\n");
                 l=l-2;
        }

Поскольку в первой строке значение l увеличивается вдвое, во второй оно снова увеличивается вдвое.

Я бы посоветовал вам избегать однобуквенных переменных, особенно "l"как сказал @JohnColeman, так как они являются кошмаром при отладке.

0 голосов
/ 25 мая 2018

Ваш индекс l должен быть сброшен до начального значения при выходе из второго цикла (цикл j).

В вашем случае, вот как ваши индексы выглядят во время выполнения:

    loop i => i=0, k=3, j=0, l=3  
    loop j => i=0, k=3, j=0, l=3  
    loop j => i=0, k=3, j=1, l=4
    exit loop j => i=0, k=3, j=2, l=5  
    loop i => i=1, k=4, j=2, l=5 
    so on...

Так что ваши индексы будут повреждены при выходе из второго цикла!

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