Udit Gupta
Udit Gupta

Reputation: 3272

How could I circularly shift each row of an 2-d array by two positions?

First of all I want to show you what actually I want........

if input is ...

  2  3  4 
  5  6  6
  7  5  4

the output should be ...

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

I tried this code acc. to my knowledge (I am a beginner in C) and have written this thing ..

 /*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;

 }

where am I wrong.....Please correct me ????

Upvotes: 0

Views: 851

Answers (2)

alimg
alimg

Reputation: 141

  1. Your sample output looking like shifted along column :)
  2. scanf("%d",*(a+i)+j); is not a good way, use scanf("%d",&a[i][j]); instead
  3. You tried to copy a row at temp = *(a+i);, but you can only copy adresses here. temp is going to point a[i], but won't copy it's data.

This code below gives input

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

output

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

I have shifted columns like your sample and used a new array b instead of 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;

}

Upvotes: 1

Elemental
Elemental

Reputation: 7466

Although the concept that you are driving at could be made to work (but there is a LOT wrong with it at the moment) using pointer arithmetic in this context makes the code look very complicated so I wonder why you don't try to rewrite this using array syntax.

For example you could write your output like this:

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

I think this is the easier syntax for a beginner to understand. Similarly the row cycle / swap is far more transparent in this form.

Upvotes: 0

Related Questions