singlepost

Перевернуть квадратную матрицу на си << На главную или назад  

Мне нужно в Си перевернуть квадаратную матрицу… Вообщем вверх ногами) Первая строка становится последней, вторая предпоследней ….. последняя первой…
Что нужно изменить в программе Транспонирования матрицы, где строка меняется на столбец и наоборот… ,чтобы получить программу переворачивания матрицы???? Помогите плиз

#include <stdio.h>
void transp(int [30][30], int *n);
void main()
{
int i,n,a[30][30];
printf("vvedite razmer massiva ");
scanf("%d",&n);
printf("vvedite elementbl massiva ");
for (int i=0;i<n;i++){
for (int j=0;j<n;j++)
scanf("%d",&a[i][j]);}
for (i=0;i<n;i++){
for (int j=0;j<n;j++)
printf("%d\t",a[i][j]);
printf("\n");
}
printf("\n");
transp(a,&n);
for ( i=0;i<n;i++){
for (int j=0;j<n;j++)
printf("%d\t",a[i][j]);
printf("\n");}

}

void transp(int b[30][30],int *k)
{
int i,c[30][30];
for (int i=0;i<*k;i++){
for (int j=0;j<*k;j++)
c[i][j]=b[i][j];}
for (i=0;i<*k;i++){
for (int j=0;j<*k;j++)
b[j][i]=c[i][j];}
}

77 ответов в теме “Перевернуть квадратную матрицу на си”

  1. 15
    Нету Нету ответил:

    спасибо за внимания. правильный вариант
    #include <stdafx.h>
    void transp(int [30][30], int *n, int *m);
    void main()
    {
    int i,n,m,a[30][30];
    printf("vvedite razmer massiva ");
    scanf("%d %d",&n,&m);
    printf("vvedite elementbl massiva ");
    for (int i=0;i<n;i++){
    for (int j=0;j<m;j++)
    scanf("%d",&a[i][j]);}
    for (i=0;i<n;i++){
    for (int j=0;j<m;j++)
    printf("%d\t",a[i][j]);
    printf("\n");
    }
    printf("\n");
    transp(a,&n,&m);
    for ( i=0;i<n;i++){
    for (int j=0;j<m;j++)
    printf("%d\t",a[i][j]);
    printf("\n");}

    }

    void transp(int b[30][30],int *k,int *l)
    {
    int temp;
    for(int i=0; i < *k/2; i++)
    for (int j = 0; j < *l; j++){
    temp = b[i][j];
    b[i][j] = b[*k-1-i][j];
    b[*k-1-i][j] = temp;
    }
    }

  2. 14
    Леонид Максимов ответил:

    #9, Серж Андреев
    > Это транспонирование матрицы происходит. Что тут непонятного?

    оно говорит duplicate declaration и не компилится. ни в C99, ни в более ранних.

  3. 13
    Нету Нету ответил:

    #include <stdafx.h>
    void transp(int [30][30], int *n);
    void main()
    {
    int i,n,a[30][30];
    printf("vvedite razmer massiva ");
    scanf("%d",&n);
    printf("vvedite elementbl massiva ");
    for (int i=0;i<n;i++){
    for (int j=0;j<n;j++)
    scanf("%d",&a[i][j]);}
    for (i=0;i<n;i++){
    for (int j=0;j<n;j++)
    printf("%d\t",a[i][j]);
    printf("\n");
    }
    printf("\n");
    transp(a,&n);
    for ( i=0;i<n;i++){
    for (int j=0;j<n;j++)
    printf("%d\t",a[i][j]);
    printf("\n");}

    }

    void transp(int b[30][30],int *k)
    {
    int i,j,c[30][30];
    for(i=0;i<*k/2;i++){
    for(j=0;j<*k;j++)
    c[i][j]=b[i][j];}
    for(i=0;i<*k/2;i++){
    for(j=0;j<*k;j++){
    b[*k-1-i][j]=c[i][j];}

    }
    }

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

  4. 12
    Станислав Марков ответил:

    просто заполнить новую матрицу, проходя исходную со строчки
    n, n–,до i. И не будет разницы какого размера исходная матрица

  5. 11
    Dain Here ответил:

    а, ну да :)

  6. 10
    Алексей Гридин ответил:

    Зачем обрабатывать по элементно, когда нам сказано переставить строки.
    N строк, поэтому количество перестановок (N/2). Среднюю строку без пары мы оставяем, если что, в покое.
    Для ясности, пустьу нас 5 строк.
    В цикле i у нас будет принимать значения от 0 до 1.
    нулевую строку мы меняем с 4-ой, 1-ую с 3-ей, 2-ая осталас на месте – получили 4, 3, 2, 1, 0. То что надо.

  7. 9
    Алексей Гридин ответил:

    И ещё отсебятина, если программа сводиться только лишь к транспонированию, то делйте это при вводе: при вводе a[i][j] записывайте его в a[j][i].

  8. 8
    Серж Андреев ответил:

    Это транспонирование матрицы происходит. Что тут непонятного? Только неэффективно сделано: сначала матрицу копируют, а потом уже транспонируют в исходную. Детский садик, ясельная группа.

    А вообще, чтобы перевернуть матрицу, нужно пройтись по строкам и столбцам примерно так:

    for (i=0;i<n-i;i++) // строка
    for (j=0; j<n; j++) // столбец
    { swap( a[i][j] , a[n-i][j] ) }

    Помоему так будет работать…

  9. 7
    Dain Here ответил:

    а зачем N / 2 ?

  10. 6
    Леонид Максимов ответил:

    я не осилил вот эту процедуру:

    void transp(int b[30][30],int *k)
    {
    int i,c[30][30];
    for (int i=0;i<*k;i++){
    for (int j=0;j<*k;j++)
    c[i][j]=b[i][j];}
    for (i=0;i<*k;i++){
    for (int j=0;j<*k;j++)
    b[j][i]=c[i][j];}
    }

    она почему-то не компилится встроенным в мозг компилятором. помогите.

  11. 5
    Алексей Гридин ответил:

    for (i = 0; i < (N / 2); i++){
    int *temp = исходный_массив[i];
    исходный_массив[i] = исходный_массив[N-1-i];
    исходный_массив[N-1-i] = temp;
    }

  12. 4
    Нету Нету ответил:

    спасибо)

  13. 3
    Dain Here ответил:

    Си не помню, но вот те алгоритм:
    итак, есть массив с кол-вом рядов N. Создаем ещё один массив и в цикле заполняем его как-то так:
    for (i = 0; i < N; i++)
    {
    новый_массив[i] = исходный_массив[N-1-i];
    }
    узё вроде =)

  14. 2
    Нету Нету ответил:

    та программа которую я написал – траспонирует матрицу. она работает…
    я думаю что если в ней изменить то чего я не знаю то можно перевернуть матрицу… а вот что изменить??? :)

  15. 1
    Станислав Марков ответил:

    так ты определись, перевернуть, или транспонировать?

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.