как вернуть последний элемент каждой строки в C

#c

#c

Вопрос:

В этом упражнении мне предлагается заполнить первую строку матрицы, затем поместить последний элемент каждой строки в первое поле следующей строки и перенести элементы предыдущей строки в следующую строку, как в следующем примере:

5 7 9 2

2 5 7 9

9 2 5 7

7 9 2 5

5 7 9 2

Проблема в том, чтобы начать со второй строки до конца в моем коде (программа не возвращает последнее значение строки 1 в строку 2), можете ли вы мне помочь

мой код:

 #include <stdio.h>
#include <stdlib.h> 

int main()
{
     int rows=5,cols=4;
     int T[rows][cols];
     int p=1;
     printf("The filling of this matrix :n");
     for(int i=0;i<rows;i  )
     {
          for(int j=0;j<cols;j  )
          {
              if(i==0)
              {
                  scanf("%d",amp;T[i][j]);
              }
              T[p][0]=T[p-1][cols-1];
              for(int k=1;k<rows;k  )
              {
                  T[k][j 1]=T[k-1][j];
              }
           }
         p  ;
     }

     printf("nThe display of this matrix :n");

     for(int i=0;i<rows;i  )
     {printf("n");
          for(int j=0;j<cols;j  )
          {
               printf("[%d]",T[i][j]);
          }
      }
 }
 

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

1. Извините, но «проблема в том, чтобы начать со второй строки до конца в моем коде» недостаточно ясна для меня, чтобы понять вашу проблему.

2. @Yunnosch программа не возвращает последнее значение строки 1 в строку 2

Ответ №1:

 #include <stdio.h>
int main(void){  

    int rows = 5, cols = 4;
    int T[rows][cols];
    printf("Filling the first rown");

    for(int i=0; i < cols; i  ){
        printf("Enter T[0][%d] = ",i)
        scanf("%d",amp;T[0][i]);
    }

    printf("Filling the rest matrixn");
    for(i=1; i < rows; i  ){
        for(j=0; j < cols; j  ){
            if(j == 0){
                T[i][j] = T[i-1][cols-1];
            }
            else{
                T[i][j] = T[i-1][j-1];
            }
        }
    }
    printf("display the matrixn");

    for(i=0 ; i < rows; i  ){
        for(j=0 ; j < cols; j  ){
            printf(" %d ",T[i][j]);
        }
        printf("n")
    }
}
 

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

1. Добро пожаловать в stackoverflow, 1 за правильный ответ, но, пожалуйста, обратите внимание, что предоставление кода без объяснения причин не помогает OP

2. Спасибо за ваш совет @DavidRanieri. Я позабочусь об этом.

Ответ №2:

Здесь вы получаете доступ за пределы массива:

 T[k][j 1]=T[k-1][j]; // j   1 = 4 in the last iteration in a range [0 ... 3]
 

Вы слишком усложняете ситуацию, вам не нужны ни дополнительный цикл ( k ), ни дополнительная переменная ( p ), вся необходимая информация уже находится во внутреннем цикле, просто проверьте положение i и j :

 #include <stdio.h>

int main(void)
{
    int rows = 5, cols = 4; 
    int T[rows][cols];  // Notice that this is a VLA, avoid using
                        // them and use enum {rows = 5, cols = 4}
                        // when values are known before hand

    printf("The filling of this matrix :n");
    for (int i = 0; i < rows; i  )
    {
        for (int j = 0; j < cols; j  )
        {
            if (i == 0)
            {
                scanf("%d", amp;T[i][j]);
            }
            else
            {
                if (j == 0)
                {
                    T[i][j] = T[i - 1][cols -1];
                }
                else
                {
                    T[i][j] = T[i - 1][j - 1];
                }
            }
        }
    }
    printf("nThe display of this matrix :n");
    for (int i = 0; i < rows; i  )
    {
        for (int j = 0; j < cols; j  )
        {
            printf("[%d]", T[i][j]);
        }
        printf("n");
    }
}
 

Вы можете упростить:

             if (j == 0)
            {
                T[i][j] = T[i - 1][cols -1];
            }
            else
            {
                T[i][j] = T[i - 1][j - 1];
            }
 

использование троичного оператора:

             T[i][j] = T[i - 1][(j == 0) ? cols - 1 : j - 1];