Мне нужно в Си перевернуть квадаратную матрицу… Вообщем вверх ногами) Первая строка становится последней, вторая предпоследней ….. последняя первой…
Что нужно изменить в программе Транспонирования матрицы, где строка меняется на столбец и наоборот… ,чтобы получить программу переворачивания матрицы???? Помогите плиз
#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];}
}
2 декабря 2008 в 22:03
спасибо за внимания. правильный вариант
#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 декабря 2008 в 21:05
#9, Серж Андреев
> Это транспонирование матрицы происходит. Что тут непонятного?
оно говорит duplicate declaration и не компилится. ни в C99, ни в более ранних.
2 декабря 2008 в 19:05
#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];}
}
}
я либо чтото не то сделал, но она как то наполовину работает. если сделать размер три на три, то первая строка останется такой же… а остальные то что нужно
2 декабря 2008 в 8:04
просто заполнить новую матрицу, проходя исходную со строчки
n, n–,до i. И не будет разницы какого размера исходная матрица
2 декабря 2008 в 4:01
а, ну да
2 декабря 2008 в 1:02
Зачем обрабатывать по элементно, когда нам сказано переставить строки.
N строк, поэтому количество перестановок (N/2). Среднюю строку без пары мы оставяем, если что, в покое.
Для ясности, пустьу нас 5 строк.
В цикле i у нас будет принимать значения от 0 до 1.
нулевую строку мы меняем с 4-ой, 1-ую с 3-ей, 2-ая осталас на месте – получили 4, 3, 2, 1, 0. То что надо.
2 декабря 2008 в 1:02
И ещё отсебятина, если программа сводиться только лишь к транспонированию, то делйте это при вводе: при вводе a[i][j] записывайте его в a[j][i].
1 декабря 2008 в 23:05
Это транспонирование матрицы происходит. Что тут непонятного? Только неэффективно сделано: сначала матрицу копируют, а потом уже транспонируют в исходную. Детский садик, ясельная группа.
А вообще, чтобы перевернуть матрицу, нужно пройтись по строкам и столбцам примерно так:
for (i=0;i<n-i;i++) // строка
for (j=0; j<n; j++) // столбец
{ swap( a[i][j] , a[n-i][j] ) }
Помоему так будет работать…
1 декабря 2008 в 22:03
а зачем N / 2 ?
1 декабря 2008 в 22:03
я не осилил вот эту процедуру:
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];}
}
она почему-то не компилится встроенным в мозг компилятором. помогите.
1 декабря 2008 в 22:01
for (i = 0; i < (N / 2); i++){
int *temp = исходный_массив[i];
исходный_массив[i] = исходный_массив[N-1-i];
исходный_массив[N-1-i] = temp;
}
1 декабря 2008 в 21:02
спасибо)
1 декабря 2008 в 21:01
Си не помню, но вот те алгоритм:
итак, есть массив с кол-вом рядов N. Создаем ещё один массив и в цикле заполняем его как-то так:
for (i = 0; i < N; i++)
{
новый_массив[i] = исходный_массив[N-1-i];
}
узё вроде =)
1 декабря 2008 в 20:05
та программа которую я написал – траспонирует матрицу. она работает…
я думаю что если в ней изменить то чего я не знаю то можно перевернуть матрицу… а вот что изменить???
1 декабря 2008 в 20:04
так ты определись, перевернуть, или транспонировать?