Sagi Binder
Sagi Binder

Reputation: 69

Moving parts right in two - dimensional matrix

I would like to get your help to understand and finish my program.

This is what I have to do:

"You must exercise program that:
First. An absorbing two - dimensional integer arr [M] [N]. M - number of rows N - number of columns. (Matrix size was received from the user)
Two. The program uses auxiliary functions "shift" moves the values ​​of the matrix to the right one place, as shown in the picture (2 entered instead of 1, 3 instead of 2, 4 instead of 3, ... 20 instead of 19, first place 20).
Shift have to write a function and call her three times in the sample matrix loop .."

Example enter image description here

My problems are:

  1. I don't know how to do the matrix two - dimensional integer arrays that there size is entered by the user. I only know by DEFINE SIZE of the row and the cols
  2. My function isn't close to the real deal so I would like to get help finish my function.

My output:

my execution

My code:

#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#define M 4
#define N 5
void shift (int arr[M][N], int length); 

void main()
{
    int arr[M][N];
    int i,j,length;

    printf("Enter %d rows \n",M);
    for (i=0 ; i<M ; i++ )
    {
        printf("Enter %d numbers:\n",N);
        for(j=0 ; j<N ; j++ )
        { 
            scanf("%d" , &arr[i][j] );
        }
    length=N+M;
    }
    shift (arr,length);
    system("pause");
    return ;
}

void shift (int arr[M][N], int length) 
{    
    int i,j,temp;
    temp=arr[0][0];
    for(i=0; i<M; i++)
    {
             for(j=0; j<N-1 ; j++)
             {
                 printf("%d ",arr[i][j]);

             }
             arr[i][j]=temp;
             printf("\n");
    }
} 

Edit: pictures resized

Upvotes: 0

Views: 2553

Answers (2)

francis westlake
francis westlake

Reputation: 11

Shifts all columns to the right. 

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


void shift_columns_right(int M[100][100], int rows, int cols) {

    int tmp_lastcol;
    int j, k;

    for (j = 0; j<rows; j++){
        tmp_lastcol = M[j][cols-1];
        for (k = cols-1;  k > 0; k-- ){
            M[j][k] = M[j][k-1];
        }
        M[j][0] = tmp_lastcol;
    }

}
int main(void){

    int B[100] [100] = { 
                   {1,2,3,4}, 
                   {5,6,7,8}, 
                   {9,10,11,12}, 
                   {13,14,15,16}, 
                   {17,18,19,20}, 
    };

    shift_columns_right(B,5,4);

    return 0;

}

Upvotes: 1

Mahesh
Mahesh

Reputation: 34625

I will you give a hint as how to shift the elements. The logic is to swap the elements between the current and last element in the row as you iterate. I will show you a working example on 1D array.

#include <stdio.h>

#define ARRAY_SIZE 5

int main()
{
    int a[ARRAY_SIZE] = {11,22,33,44,55};
    int i;

    for (i=0; i<ARRAY_SIZE; ++i)
    {
        int temp = a[i];
        a[i] = a[ARRAY_SIZE-1];
        a[ARRAY_SIZE-1] = temp;
    }

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

    return 0;
}

Output: 55 11 22 33 44

To dynamically allocate the memory for array, use malloc. Hope it helps !

Upvotes: 0

Related Questions