Как я могу циклически сдвинуть каждую строку двумерного массива на две позиции? - PullRequest
0 голосов
/ 22 августа 2011

Прежде всего, я хочу показать вам, что на самом деле я хочу ........

, если ввод ...

  2  3  4 
  5  6  6
  7  5  4

вывод должен быть ...

 7  5  4
 2  3  4
 5  6  6     /*Each row is shifted circularly left by two positons */

Я пробовал этот код в соотв.насколько мне известно (я новичок в C) и написал эту вещь ..

 /*To shift row of a 4 * 5 matrix by 2 positons left*/

 #include<stdio.h>

 int main() {

    int a[4][5],i,j,k,(*temp)[5];

    for(i=0;i<=3;i++) {
            for(j=0;j<=4;j++)
                    scanf("%d",*(a+i)+j);
    }


    for (k=1;k<=2;k++) {

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

                    temp = (a+i);   /*I thought that *(a+i) will point to the address           of each row and so I should take it in a variable which is capable of pointing to a row of 5 variables that why TEMP */
                    (a+i) = (a+i+1);
                    (a+i+1) = temp;
            }

    }


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

                   for(j=0;j<=4;j++)
                            printf("%d\t",*(*(a+i)+j));


            printf("\n");

     }


  return 0;

 }

где я не прав ..... Пожалуйста, поправьте меня ????

Ответы [ 2 ]

1 голос
/ 22 августа 2011
  1. Ваш пример выходных данных выглядит как смещенный вдоль столбца:)
  2. scanf("%d",*(a+i)+j); не очень хороший способ, используйте scanf("%d",&a[i][j]); вместо
  3. Вы пытались скопировать строку в temp = *(a+i);, но вы можете только Копировать адреса здесь. temp собирается указать [i], но не будет копировать это данные.

Этот код ниже дает вход

1 1 1 1 1 
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4

выход

3   3   3   3   3   
4   4   4   4   4   
1   1   1   1   1   
2   2   2   2   2

Я сместил столбцы, как в вашем примере, и использовал новый массив b вместо temp

#include<stdio.h>

 int main() {

    int a[4][5],i,j,b[4][5];

    for(i=0;i<=3;i++) {
            for(j=0;j<=4;j++)
                    scanf("%d",(*(a+i)+j));
    }


    for(i=0;i<=3;i++) 
            for(j=0;j<=4;j++)
                {
                    *(*(b+i)+j)=*(*(a+((i-2+4)%4))+j);
                }


     for(i=0;i<=3;i++) {
                   for(j=0;j<=4;j++)
                            printf("%d\t",*(*(b+i)+j));
            printf("\n");
     }

    return 0;

}
0 голосов
/ 22 августа 2011

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

Например, вы можете написать свой вывод следующим образом:

for(i=0;i<=3;i++) 
{
   for(j=0;j<=4;j++)
       printf("%d\t",a[i][j]);
    printf("\n");     
}

Я думаю, что этот синтаксис проще для начинающего понятьТочно так же цикл строки / своп намного более прозрачен в этой форме.

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