изменение строк в столбец и столбец в строки этого 2d массива - PullRequest
2 голосов
/ 06 июля 2011

Я хочу изменить строки в столбец, а столбец - в строки этого двумерного массива

Мне нужна программа, которая принимает данные и выдает их, как показано ниже.

Input:   1    2    3                       
         4    5    6

Output:  1    4
         2    5
         3    6

Input:   1    2    3
         4    5    6
         7    8    9

Output:  1    4    7
         2    5    8
         3    6    9

Я сделалпример, который в жестко запрограммированном массиве, как показано ниже

int main()
{
    int i,j;
    int grades[2][3] = { {55, 60, 65},
                                           {85, 90, 95} 
                                        };
    for( j = 0; j < 3; j++)
    {       
      for( i = 0; i < 2;i++)
      {
         printf("%d\t",grades[i][j]);
      }
      printf("\n");
    }

    return 0;
}

Его долгое время с тех пор, как я запрограммировал на C, есть в любом случае, мы можем сделать вещи динамичными или лучше сделать то же самое.Прямо сейчас он жестко запрограммирован.

Я помню, мы должны использовать malloc или около того, верно.

Псевдо-код тоже подойдет.

Ответы [ 6 ]

2 голосов
/ 06 июля 2011

Взяв от пользователя Zhehao Mao и исправив его, выглядело бы так:

#include <stdio.h>

void transpose(int *src, int *dest, int rows, int cols){
    int i,j;
    for(i=0; i<rows; i++){
        for(j=0; j<cols; j++){
            dest[j*rows + i] = src[i*cols + j];
        }
    }
}

int main(void)
{
    int oldar[2][3] = {{1,2,3},{4,5,6}};
    int newar[3][2];
    transpose(&oldar[0][0], &newar[0][0], 2, 3);
    int i, j;

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

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

Причина, по которой оригинальный пост не может работать, в том, что int ** ожидает указатель на указатели, такие как:

 int **a --------->     int *int1    --> 1
                        int *int2    --> 2
                        int *int3    --> 3

это не то, что мы получаем, когда говорим int a [n] [m]. Скорее у нас есть массив, организованный так

               a[0][0] 
                  \
                   1 2 3 4 5 6
                   \___/ \___/
            "a[0]" /      \____ "a[1]"

или что-то в этом роде. Картина, вероятно, не объясняет это хорошо, но в настоящее время я не могу сделать лучше.

1 голос
/ 07 июля 2011
void main()

{

   clrscr();

   int in[10][10];
   int out[10][10];

   int row,column,i,j;
   printf("enter row");
   scanf("%d",&row);
   printf("Enter column");
   scanf("%d",&column);
   //storing values in matrix
   for(i=1;i<=row;i++)
   {
      for(j=1;j<=column;j++)
      {
        printf("Enter (%d,%d)th value",i,j);
        scanf("%d",&in[i-1][j-1]);
      }
   }
   //show stored values
   printf("\ninput is\n\n");
   for(i=0;i<row;i++)
   {
      for(j=0;j<column;j++)
      {
        printf("%d\t",in[i][j]);
      }
      printf("\n");
   }
   //show transposed value. it is also stored in out matrix
   printf("\nOutput is\n\n");
   for(i=0;i<column;i++)
   {
      for(j=0;j<row;j++)
      {
        printf("%d\t",in[j][i]);
        out[i][j]=in[j][i];
      }
      printf("\n");
   }

   getch();

}

//////////////////////////////////////

входная матрица сохраняется в матрице [] [], а выходная матрица сохраняется в матрице out [] [].эта программа будет работать для любой матрицы со строкой и столбцом ниже 10, если мы увеличим значение переменной матрицы, она будет работать и для более крупной матрицы.

1 голос
/ 06 июля 2011

Это наполовину готовая программа, как я бы делал это на C:

int main()
{
    int **data;
    int rows = 0,
        columns = 0;

    char in[256];

    int *irow;

    // Get user input.
    for(rows = 0; 1; ++rows)
    {
        scanf("%255s", in);

        if(strcmp(in, "exit") == 0)
            break;

        // Parse row here. Remove all the tabs. Set column count.
        for(int icolumn = 0; 1; ++icolumn)
        {
            /* ... */
        }

        // Set columns if first time.
        if(rows == 0)
            columns = icolumn;

        // Check to make sure user inputs correct amount of columns.
        if(columns != icolumns)
        {
            printf("OMG! The user is a hacker!\n");
            break;
        }

        // Push parsed row into **data.
        data[rows] = irow;
    }

    // Display output.
    for(int i = 0; i < columns; ++i)
    {       
        for(int j = 0; j < rows; ++j)
        {
            printf("%d\t", data[j][i]);
        }

        printf("\n");
    }

    return 0;
}

Я программист на C ++, поэтому часть пользовательского ввода напутана.

1 голос
/ 06 июля 2011

Вот довольно наивная реализация.Я почти уверен, что есть более эффективные способы, но это все, что я мог придумать.

void transpose(int **src, int **dest, int rows, int cols){
    int i,j;
    for(i=0; i<rows; i++){
        for(j=0; j<cols; j++){
            dest[j][i] = src[i][j];
        }
    }
}

int main(void){
    int oldar[2][3] = {{1,2,3},{4,5,6}};
    int newar[3][2];
    transpose(oldar, newar, 2, 3);
}

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

0 голосов
/ 06 июля 2011

теоретически у вас есть два массива

Массив x и y

Int оценки [x] [y]

вы можете поменять местами эти два массива, и вы получите

int grades [y] [x]

для этого есть много методов, например путем копирования массивов в два других 1D, или в один 2D-массив, или в простой обмен указателями

0 голосов
/ 06 июля 2011

эй, вот простое решение без использования malloc, я сделал это, когда был на 0-м уровне для c и понятия не имел о функциях "alloc.h", у вас может быть квадратный массив с #rows = #cols =max (# rows, # cols), если мы возьмем ваш пример, тогда матрица будет матрицей 3x3, затем добавьте любой специальный символ в пустые записи, чтобы матрица теперь выглядела так

matrix:1 2 3 
       4 5 6 
       @ @ @

Вы можете легко преобразовать матрицу так, как вы хотите ... Итог: чтобы упростить операции с матрицами, попробуйте преобразовать их в квадратную матрицу ... Еще одна вещь, использующая MALLOC, является наилучшим возможным способом, это на всякий случайне пригодны со всеми этими определениями функции alloc.h ...

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