2015-10-26 2 views
1

У меня возникла проблема, когда я просил меня цитировать столбцы матрицы MxN Z числа раз. Код, который у меня есть сейчас, ниже, но когда я его запускаю, некоторые из столбцов исчезают.Циклы столбцов матрицы

Мой код должен переместить первый столбец во второй, второй в третий и т. Д., А затем последний в первый столбец.

int first[5][5], second[5][5], i, j;  

int temp[5][5]; 
     for(i = 0; i < 5; i++){ 
     for(j = 0; j < numprocs; j++){ 
      temp[i][j] = second[i][j]; 
      second[i][j] = second[i--][j]; 
      second[i++][j] = temp[i][j]; 
     } 
     } 
+0

Показать декларации, инициализацию – ameyCU

+1

Пожалуйста, какие мы Предполагалось сделать с этим. Что такое 'm',' n'? Каковы их значения в отношении 'numprocs'? Что такое «мид»? Голосование закрывается, потому что у вас отсутствует MCVE http://stackoverflow.com/help/mcve –

+0

И ваша проблема, скорее всего, является злоупотреблениями указателей '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '. Вы меняете переменные цикла. –

ответ

1
  • Там нет необходимости иметь дубликат массива всего размера. Вы можете циклически перемещать элементы в одном массиве. Попробуйте на листе бумаги.
  • Вам нужно будет делать резервную копию 1-го столбца каждый раз, потому что это будет перезаписано. Затем восстановите эту резервную копию.

Я сделал это, используя простой массив и некоторый цикл. Посмотрите на код, это само за себя, и я прокомментировал соответствующим образом:

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

#define M 2 //no of rows 
#define N 5 //no of columns 

int print(int (*matrix)[N]); 

int main(void) 
{ 
    int matrix[M][N]; 
    int backup[M]; 

    int Z; //no of times to cycle 
    int i, j, k; 

    //get the i/p 
    printf("Enter matrix:\n"); 
    for(i = 0 ; i < M ; i++) 
     for(j = 0 ; j < N ; j++) 
      scanf("%d", &matrix[i][j]); 

    //get Z 
    printf("How many times to cycle?\n"); 
    scanf("%d", &Z); 

    //for Z = 0 
    if(Z == 0) 
    { 
     print(matrix); 
     return 0; 
    } 



    Z = (Z%N); //adjust Z to avoid unnecessary rotations because 
//rotating an array of 5 columns 25 times is same as rotating 0 times 
//(it will end up in original position after 25 rotations) 

    for(k = 0 ; k < Z ; k++) //first loop for Z rotations 
    { 
     //take backup of 1st col of matrix 
     for(int i = 0 ; i < M ; i++) 
     backup[i] = matrix[i][0]; 

     for(i = N - 1 ; i >= 0 ; i--) //second loop for copying each column 
     { 
      //copy ith column into (i+1)%n th column 
      for(j = 0 ; j < M ; j++)  //loop to copy all elements of column 
      { 
       matrix[j][(i+1)%N] = matrix[j][i]; //logic to wrap the last col to first one 
      } 
     } 

     //restore backup into 1st col 
     for(j = 0 ; j < M ; j++) 
      matrix[j][1] = backup[j]; 

    } 

    print(matrix); 
} 

int print(int (*matrix)[N]) 
{ 
    int i, j; 
    for(i = 0 ; i < M ; i++) 
    { 
     for(j = 0 ; j < N ; j++) 
     { 
      printf("%d ", matrix[i][j]); 
     } 
     printf("\n"); 
    } 
} 

Вот прогон программы образца:

Enter matrix: 
1 2 3 4 5 
1 2 3 4 5 
How many times to cycle? 
1 
5 1 2 3 4 
5 1 2 3 4 
[email protected]:~/Desktop$ cc so.c -std=c11&& ./a.out 
Enter matrix: 
1 2 3 4 5 
1 2 3 4 5 
How many times to cycle? 
3 
3 4 5 1 2 
3 4 5 1 2 
Смежные вопросы