Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Кто круче сделает? А?

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
AVES



Зарегистрирован: 12.09.2004
Сообщения: 132
Откуда: С-Петербург

СообщениеДобавлено: Пн Фев 14 2005 12:05    Заголовок сообщения: Кто круче сделает? А? Ответить с цитатой

Попалась мне такая задача:
есть массив n*n (где 0<n<=40).
Значения диагональных элментов формируются как сумма элементов строки и столбца, а остальные как сумма координат элемента.
Нач. коорд. матрицы (i=1,j=1).
А теперь самое интересное:
Повернуть матрицу на 90 градусов по часовой стрелке, вывести получившуюся матрицу.

кто круче и проще код придумает?

Далее мой код. Twisted Evil
_________________
Ошибки в программах - есть следствие ошибок в ДНК


Последний раз редактировалось: 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    Заголовок сообщения: Ответить с цитатой

мдя я этот код на первом курсе в колледже проходил Sad
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...