Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
AVES
Зарегистрирован: 12.09.2004 Сообщения: 132 Откуда: С-Петербург
|
Добавлено: Пн Фев 14 2005 12:05 Заголовок сообщения: Кто круче сделает? А? |
|
|
Попалась мне такая задача:
есть массив n*n (где 0<n<=40).
Значения диагональных элментов формируются как сумма элементов строки и столбца, а остальные как сумма координат элемента.
Нач. коорд. матрицы (i=1,j=1).
А теперь самое интересное:
Повернуть матрицу на 90 градусов по часовой стрелке, вывести получившуюся матрицу.
кто круче и проще код придумает?
Далее мой код. _________________ Ошибки в программах - есть следствие ошибок в ДНК
Последний раз редактировалось: AVES (Пн Фев 14 2005 12:12), всего редактировалось 2 раз(а) |
|
Вернуться к началу |
|
|
AVES
Зарегистрирован: 12.09.2004 Сообщения: 132 Откуда: С-Петербург
|
Добавлено: Пн Фев 14 2005 12:08 Заголовок сообщения: |
|
|
Код: | #include <stdio.h>
#include <alloc.h>
#define N 40
//Глобальные переменные
int *matrix;
//Прототипы функций
int* createMatrix(int );
void initMatrix(int );
void printmatrix(int );
void Turn90toLeft(int );
void FourElemTurn90(int ,int ,int );
void main(void)
{
int n;
printf("Vvedite razmer kvadratnoi matrici:");
ret: scanf("%d",&n);
if ((n<=0)||(n>N)) goto ret;
matrix=createMatrix(n);
initMatrix(n);
Turn90toLeft(n);
printmatrix(n);
free(matrix);
}
//================================================
// Функция выделения памяти для матрицы
int* createMatrix(int n)
{
return calloc(n*n,sizeof(int));
}//createMatrix
//================================================
// Функция инициализации матрицы
void initMatrix(int n)
{
int i,j,k;
printf("\nMatrica do povorota:");
for(i=0;i!=n;++i)
{
for(j=0;j!=n;j++)
{
if (i==j)
{for (k=0;k!=n;k++)
{ if (i!=k)
matrix[i*n+j]+=i+k+2;
}
matrix[i*n+j]<<=1;
printf("%5d",matrix[i*n+j]);
continue;
}
matrix[i*n+j]=i+j+2;
printf("%5d",matrix[i*n+j]);
}
printf("\n");
}
}//initMatrix
//================================================
// Функция поворота матрицы на 90 градусов по
//часовой стрелке
void Turn90toLeft(int n)
{int i,j,buf1,buf2,oldi,oldj,newn;
for(i=0;i!=n>>1;i++)
{
for(j=i;j!=n-(i+1);j++)
{
FourElemTurn90(i,j,n-1);
}
}
}//Turn90toLeft
//================================================
//Функция вывода квадратной матрицы
void printmatrix(int n)
{int i,j;
printf("\nMatrica posle povorota:");
for (i=0;i!=n;i++)
{
for (j=0;j!=n;j++)
{
printf("%5d",matrix[i*n+j]);
}
printf("\n");
}
}
//================================================
//Функция циклического переприсваивания 4 элементов
void FourElemTurn90(int i,int j,int n)
{int oldi,k,buf1,buf2;
buf1=matrix[(n+1)*i+j];
for(k=0;k!=4;k++)
{buf2=buf1;
oldi=i;
i=j;
j=n-oldi;
buf1=matrix[(n+1)*i+j];
matrix[(n+1)*i+j]=buf2;
}
}
//Все :)
|
Да, написано на Це (компилить файлик с разширением .c).
На всяк случай... _________________ Ошибки в программах - есть следствие ошибок в ДНК |
|
Вернуться к началу |
|
|
GREA
Зарегистрирован: 14.05.2003 Сообщения: 758 Откуда: Новосибирск
|
Добавлено: Пн Фев 14 2005 21:25 Заголовок сообщения: |
|
|
AVES, Без обид, но стороны кажется, будто какая то хитрая группа студентов не хочет сдавать одну и туже прогу в отчетах из-за боязни, что их попалят. |
|
Вернуться к началу |
|
|
AVES
Зарегистрирован: 12.09.2004 Сообщения: 132 Откуда: С-Петербург
|
Добавлено: Пн Фев 14 2005 22:15 Заголовок сообщения: |
|
|
Не обижаюсь я.
Вполне резонное "кажется"... Но ты не прав!!! Дело в том что задача показалась мне интересной. Код я этот сгенерил без исп. книг поалгоритмам. Потому что книгу А.Ахо я дал поюзать, других книг под рукой нема, а Кнута я да сих пор не могу приобрести, денег нету.
Да и вообще по книжке не интересно, интересно своей репой подумать. А тему создал потому что интересно на сколько эффективнее алгоритм можер быть.
Я и сам против того чтобы делать лабы за даром.
см тему в курилке:"Обращение к Mr.Forum'у и соратникам"
Да, толька без обид, но ты не прав(повторю я еще раз)... _________________ Ошибки в программах - есть следствие ошибок в ДНК |
|
Вернуться к началу |
|
|
OleguS
Зарегистрирован: 09.02.2005 Сообщения: 10 Откуда: Ukraine::Kharkov
|
Добавлено: Вт Фев 15 2005 18:09 Заголовок сообщения: |
|
|
Ты хочешь добиться эфективности программы, или уменьшить количество кода? По правде говоря я не вижу здесь сложной задачи, которая требует алгоритм. Ты все написал правильно, единственное, я бы не разделял функцию Turn90toLeft. |
|
Вернуться к началу |
|
|
AVES
Зарегистрирован: 12.09.2004 Сообщения: 132 Откуда: С-Петербург
|
Добавлено: Вт Фев 15 2005 21:10 Заголовок сообщения: |
|
|
Никто и не говерит что она сложная, я говорил интересная.
Почему лучше ее не делить? _________________ Ошибки в программах - есть следствие ошибок в ДНК |
|
Вернуться к началу |
|
|
критикан
Зарегистрирован: 18.02.2005 Сообщения: 247
|
Добавлено: Вс Фев 20 2005 23:53 Заголовок сообщения: У Авеса всё плохо. Самый правильный (но не проверенный) (+) |
|
|
...вариант следует:
Вариант с массивом
Код: |
void Turn90toLeft(int n)
{
int r, i, e, i0, i1, i2, i3;
i0=i1=-1;
i2=i3=n*n;
r=0
e=n;
while(r<n)
{
i0++;i1+=n;i2--;i3-=n;
for(i=1;i<e;i++)
{
swap(matrix[i0],matrix[i3]);
swap(matrix[i3],matrix[i2]);
swap(matrix[i2],matrix[i1]);
swap(matrix[i1],matrix[i0]);
i0++;i1+=n;i3--;i2-=n;
}
r+=2;e-=2;
i1=--i0;i0+=r;i3=++i2;i2-=r;
}
}
inline void swap(int a0, int a1)
{
a0+=a1;
a1=a0-a1;
a0-=a1;
}
|
Вариант с указателями
Код: |
void Turn90toLeft(int n)
{
int r, i, e, *i0, *i1, *i2, *i3;
i0=i1=matrix-1;
i2=i3=matrix+n*n;
r=0
e=n;
while(r<n)
{
i0++;i1+=n;i2--;i3-=n;
for(i=1;i<e;i++)
{
swap(i0,i3);
swap(i3,i2);
swap(i2,i1);
swap(i1,i0);
i0++;i1+=n;i3--;i2-=n;
}
r+=2;e-=2;
i1=--i0;i0+=r;i3=++i2;i2-=r;
}
}
void swap(int *a0, int *a1)
{
*a0+=*a1;
*a1=*a0-*a1;
*a0-=*a1;
}
|
-------------------------
Весь мир -- тюрьма, все бабы -- шлюхи, и солнце -- грёбаный фонарь
Последний раз редактировалось: критикан (Пн Фев 21 2005 08:31), всего редактировалось 2 раз(а) |
|
Вернуться к началу |
|
|
stealth01
Зарегистрирован: 15.02.2005 Сообщения: 18
|
Добавлено: Пн Фев 21 2005 15:14 Заголовок сообщения: |
|
|
мдя я этот код на первом курсе в колледже проходил
|
|
Вернуться к началу |
|
|
|