Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Тема для ответов на задачи.  (Прочитано 37091 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« : 28-01-2004 18:40 » 

Опубликовал задания с приема на работу , тут тема для ответов, сами задачи найти можно здесь: https://club.shelek.ru/viewart.php?id=154
Записан

А птичку нашу прошу не обижать!!!
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 28-01-2004 19:51 » 

1.
Код:
struct s_list {
  struct s_list *next;
  int passed;
  // ....
  };

int check(struct s_list *first) {
  /* на входе все элементы списка имеют passed==0 */
  struct s_list *p;
  int r=true;
 
  for(p=first;p->next;p=p->next)
    if(p->passed) { r=false; break; }
    else p->passed=1;
  for(p=first;p->next;p=p->next)
    if(p->passed) p->passed=0;
    else break;
  return r;
  }
2.
Возвращать адрес переменной класса хранения auto - грубая ошибка, на что и должен указать компилятор. Но данный пример работать будет, т.к. значение со стека (там где хранилось значение переменной X) будет взято раньше, чем оно будет затерто вызовом printf(). При включенной оптимизации результат непредсказуем.
3.
Использовать классическую пузырьковую сортировку.
Кстати, в этом пункте вопрос не задан - даны только вводные.
« Последнее редактирование: 23-11-2007 20:09 от Алексей1153++ » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Xeysan
Гость
« Ответ #2 : 28-01-2004 21:08 » 

1. Написал было я уже программу с еще одним списком для проверки, когда мне в голову стукнула ИДЕЯ! Память выделяется по четному адресу, следовательно можно просмотренным элементам в указателе на след. элемент младший бит установить в 1; при ссылке назад будет
видно, что мы уже там были! Естественно, список потом надо востановить, но это уже делается элементарно. Программу не пишу, так как иду спать.

2. Поведение программы неопределено. Что угодно, только не 10 Улыбаюсь

3. А что сделать то? Отсортировать? Хотя бы вот ( самая простая )

Код:
int i, j;

for( i = 0; i < number_of_stones - 1; i++ )
for( j = i + 1; j < number_of_stones; j++ )
if( color( i ) > color ( j ) )
Switch( i, j );
RXL, прости за повторения, писал ответ в оффлайне.
Цитата
Но данный пример работать будет, т.к. значение со стека (там где хранилось значение переменной X) будет взято раньше, чем оно будет затерто вызовом printf().
Я в этом слабо разбираюсь, но почему стек машины должен быть похож на стек IBM PC. Значение может и затираться после вызова ( чисто теоритически  8) )
« Последнее редактирование: 23-11-2007 20:10 от Алексей1153++ » Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #3 : 28-01-2004 21:13 » 

RXL
2. Где ты там видел класс???  Я шокирован! Обычная стековая переменная, которая инициализируется и return копирует значение указателя, из которого сразу берется данное и запоминается во внешней переменной.
То, что так писать не надо - это верно - играть с указателями для возврата числа можно только в крайнием случае - но то, что ты придумал там класс меня наводит на странные мысли Жаль

3. Забыл - исправил уже.
Записан

А птичку нашу прошу не обижать!!!
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 28-01-2004 21:20 » 

Гром
2. Может я не так выразился (в терминах ошибся), но смысл, imho, ясен - переменная, память для которой выделяется автоматически, при входе в ф-ию. Вспомни, что, помимо static, в С есть такие слова как auto и register. Вот о auto я и говорил.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #5 : 28-01-2004 21:25 » 

Xeysan,
RXL,
ребята СПИСОК ТРОГАТЬ НЕЛЬЗЯ!!!!
Записан

А птичку нашу прошу не обижать!!!
Alf
Гость
« Ответ #6 : 28-01-2004 21:56 » 

Гром, а в третьей задаче условие верно приведено?
Правда, я сильно не вдумывался (уж больно день тяжкий выдался, как никогда прямо), но ведь даже сложные алгоритмы быстрой сортировки требуют порядка n*log(n) сравнений, а по условию вроде бы оно должно быть не более n.
Я уже не говорю о предложенной выше пузырьковой сортировке,  типичном представителе обменных алгоритмов сортировки, для которых число сравнений (n*n - n)/2,
то есть порядка квадрата n, но никак не n.
Или я в условие не вник как следует, или задача явно с подвохом, и те, кто пытается ее решить при таких условиях, тест не проходят автоматом...

Да и вторая странноватая явно какая-то.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #7 : 28-01-2004 22:15 » 

Я не выдумываю задачи , я их решал в течении часа вчера и экзамен сдал. Осталось понравится будущему шефу и надеятся что вчерашний психолог был мной доволен.

А сортировка ведб тоже гранична, если ты заметил, учти. Там всего три цвета по определению и у них фиксированные места, сразу скажу у меня придумать алгоритм заняло 15 минут.
Записан

А птичку нашу прошу не обижать!!!
ChaoticCube
ChaoticCube
Помогающий

ru
Offline Offline
Пол: Мужской
ChaoticCube


« Ответ #8 : 29-01-2004 00:15 » 

Интересно. Выскажу идеи. Писать проги - лень

1.) Создаем последовательный список содержащий все указалова на все предыдущие элементы. Ну и проходя каждый элемент проверяем его на нахождение в предыдущих. Если не нашли - см. не NULL ли следующие и если нет то добавляем в список. Таким образом никогда динамически больше N памяти не займем.
 Мона оптимизировать - по скорости - выкладывать указалова на предыдущие элементы отсортированными.
 по памяти - вместо создания динамического массива бегаем каждый раз сначала структуры до того элемента где мы сейчас.

2.) Результат не предсказуем.

3.) Вопрос: Вызывать функции color() и switch() нельзя более N раз.  - означает что вызвать можно и color() N раз и switch() N раз или что сумма вызовов и того и того<=N?
Записан

Сила ночи, сила дня - одинакого фигня....
ChaoticCube
ChaoticCube
Помогающий

ru
Offline Offline
Пол: Мужской
ChaoticCube


« Ответ #9 : 29-01-2004 00:23 » 

3.) Ксати в условии не сказано - может ли в результате последовательность быть длиннее чем N. То есть, функция switch (I,J) при работе с незуществующим J камнем, положит пустоту на I-ое место?
Думаю конечно - вряд ли, так как если это так то задача совсем неинтересна становиться. Но в условии не сказано - это точно.
Записан

Сила ночи, сила дня - одинакого фигня....
ChaoticCube
ChaoticCube
Помогающий

ru
Offline Offline
Пол: Мужской
ChaoticCube


« Ответ #10 : 29-01-2004 01:07 » 

Если я все понял правильно:

Switch - функция (ты писал switch(I,J) которая

#define N <сколько-то>

int c_Red; //кол-во красного в линейке
int c_Blue; //кол-во синего в линейке
int curIndex1; //текущий индекс
int curIndex2; //идекс зеленого в конце
c_Red=c_Blue=curIndex1=0;
curIndex2=N-1;
while (curIndex1!=curIndex2)
{
 switch (color(curIndex1))
 {
   case RED:
    c_Red++;
    curIndex1++;
   break;
   case BLUE:
    if (c_Blue!=curIndex1) Switch(c_Blue,curIndex1);
    curIndex1++;
    c_Blue++;
   break;
   default: //GREEN
    Switch(curIndex1,curIndex2);
    curIndex2--;
   break;
 }
}
Записан

Сила ночи, сила дня - одинакого фигня....
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #11 : 29-01-2004 07:52 » 

RXL,
2. Извини - не заметил ответа.
Да действительно так и есть, но только я передаю уже бывшие у меня задачи.
Записан

А птичку нашу прошу не обижать!!!
greyer
Гость
« Ответ #12 : 29-01-2004 08:22 » 

3)
int cur_color;
int moved_green_stones = 0;
for (int i = 0; i < N-moved_green_stones; i++) {
   cur_color = color(i);
   if (cur_color == BLUE) switch(i, 0); //синие в начало
   if (cur_color == GREEN) { //зелёные в конец
      switch(i, N-1);
      moved_green_stones++;
      i--;
   }
   //а красные не трогаем
}
Записан
Anonymous
Гость
« Ответ #13 : 29-01-2004 08:41 » 

Гром, ну ты серьезно поменял задачи. Вчера в первой было написано что нельзя использовать динамическую память, а сегодня это в третьей задаче...
3.
Если нужно отсортировать три типа камней за один проход и порядок в одноцветных камнях не интересует, то проще все красные перемещать вперед, а зеленые назад. В результате синие останутся в середине.
Код:
enum e_rock { RED, BLUE, GREEN };

void rocks_sort(enum e_rock *rocks, int n) {
  int i;

  for(i=0;i<n;i++) switch(rocks[i]) {
    case RED: switch(0,i); break; /* надеюсь switch(0,0) не является ошибкой */
    case GREEN: switch(n-1,i); break;
    default:
    }
  }
Использовал enum только для упрощения и наглядности.
« Последнее редактирование: 23-11-2007 20:13 от Алексей1153++ » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 29-01-2004 08:44 » 

Извиняюсь, гостем был я.

"В функции нельзя употреблять памяти больше чем на все элементы списка."
Как это понимать? Можно выделить еще столько же пямяти, сколько использовано на список, или что? Нечеткое понятие...
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Anonymous
Гость
« Ответ #15 : 29-01-2004 09:01 » 

2) Синтаксическая ошибка  Ага

    Return &X; // ключевое слово с большой буквы
Записан
Chatlanin
Гость
« Ответ #16 : 29-01-2004 09:29 » 

Код:
1.
// list description
struct s_element
  {
  s_element * p_next;
  //...
  }

void the_function(s_element * p_first)
  {
  while(p_first->p_next != NULL)
    {
    s_element * p_counter = p_first->p_next;
    do
      {
       if(p_counter == p_first)
         return true;
      p_counter = p_counter->p_next;
      }
    while(p_counter != NULL);
    p_first = p_first->p_next;
    }
  return false;
  }

2. Уже разжевали

3.
enum a_color
  {
  blue = 0,
  red = 1,
  green = 2,
  color_max,
  };

extern a_color color(unsigned i);
extern void swap(unsigned i, unsigned j);

void the_sorting_algorithm(unsigned count)
  {
  unsigned idx[color_max], o=0;
  for (o; o<color_max; ++o) idx[o] = 0;
  while (idx[green] < count)
    {
    a_color col = color(idx[2]);
    if (col == green)
      ++idx[green];
    else
      {
      for (o=green; o>col; --o)
        {
        if(idx[o] != idx[o-1])
          swap(idx[o], idx[o-1]);
        ++idx[o];
        }
      }
    }
  }
« Последнее редактирование: 23-11-2007 20:14 от Алексей1153++ » Записан
Chatlanin
Гость
« Ответ #17 : 29-01-2004 10:20 » 

3. Так будет лучше

enum a_color
  {
  blue = 0,
  red = 1,
  green = 2,
  color_max,
  };

extern a_color color(unsigned i);
extern void swap(unsigned i, unsigned j);

void the_sorting_algorithm(unsigned count)
  {
  unsigned first_red = 0, index = 0;
  while (index < count)
    {
    switch(color(index))
      {
      case blue:
        swap(first_red, index);
        ++first_red;
        ++index;
        break;
      case red:
        ++index;
        break;
      case green:
        --count;
        if(index < count)
          swap(index, count);
        break;
      }
    }
  }
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #18 : 29-01-2004 11:30 » 

2. Результат - для тех кто не понял - будет = 10.
В том частном случае когда есть именно такая программа.

RXL поменял задачи - переписал перепроверил с записей с интервью - из-за того, что найдены были ошибки.
Сейчас там точно такой же текст который был дан мне - только на русском а не на английском.

Chatlanin, не будет работать - так как при ++first_red ты попадаешь не обязательно на красный следующий камень - проверки то нету.
Записан

А птичку нашу прошу не обижать!!!
Xeysan
Гость
« Ответ #19 : 29-01-2004 11:36 » 

1. Неужели полный перебор? Двигаться по списку и при каждой итерации догонять флагмана и проверять. Имхо в лоб  Жаль
3. Работает Отлично
Код:
enum Color {
B, R, G
};

void Switch( int* left, int* right )
{
int tmp = *left;
*left = *right;
*right = tmp;
}
int main()
{
int stones[20];
int i,
blues = 0,
greens = 0;
int n = sizeof( stones )/sizeof( stones[0] );

srand( (unsigned)time( NULL ) );
for( i = 0; i < n; i++ ) {
stones[i] = rand()%3;
printf( " %d ", stones[i] );
}
putchar( '\n' );

for( i = 0; i < n - greens; ) {
switch( stones[i] ) {
case B:
Switch( &stones[blues], &stones[i] );
i = ( i == blues ) ? i + 1 : i;
blues++;
break;
case G:
Switch( &stones[n - greens - 1], &stones[i] );
greens++;
break;
default:
i++;

}
}


for( i = 0; i < n; i++ )
printf( " %d ", stones[i] );
}
« Последнее редактирование: 23-11-2007 20:16 от Алексей1153++ » Записан
Boris Tkach
Гость
« Ответ #20 : 29-01-2004 12:02 » 

Решение первой задачи

Используем два указателя - один перемещаем на 1 элемент, второй на 2 элемента. Если встретили 0 - то все хорошо - возвращаем что 0. Если один догнал другой - значит лист циклический
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #21 : 29-01-2004 12:36 » 

Xeysan, Да именно
Boris Tkach, лучше кодом программы.
Записан

А птичку нашу прошу не обижать!!!
plague
Гость
« Ответ #22 : 29-01-2004 12:54 » 

1.
Во-первых, в С нет true и false. Поэтому и решение задачи не возможно.
Но если предположить, что bool == int, то:

const int true=1;
const int false=0;
typedef int bool;

struct SomeList
{
SomeList *next;
// other data…
};

bool notConnected(const struct SomeList *_first )
{
struct SomeList *last=first;
struct SomeList *temp;

   while( last )
   {
      for ( temp = first, temp != last, temp = temp->next)
if( temp == last->next ) return false;
      last=last->next;
}
return true;
}

2.
Во-первых, компилятор просто не скомпилирует, если ни где не объявлен «Return». Также не скомпилирует если это не С, а например С++, т.к. printf() тоже не объявлен.
После исправления этой ошибки, результат программы не определен.
Записан
Andrey MAG
Гость
« Ответ #23 : 29-01-2004 14:04 » 

3. Алгоритм достаточно простой. Сам на С не пишу поэтому  чем богаты.

Код:
Var BlueBottom, GreenTop, CurrentPos, CurrentColor : integer;
begin
  BlueBottom:=0;
  GreenTop:=N;
  CurrentPos:=0;

  For CurrentPos=0 to N
  begin
      CurrentColor := Color(CurrentPos);
      If CurrentColor=Blue then
      begin
          Switch(BlueBottom,CurrentPos);
          BlueBottom=BlueBottom+1;
      end else if CurrentColor=Green then begin
          Switch(GreenTop,CurrentPos);
          GreenTop:=GreenTop-1;
     end;
  end;
end.
И можно радоваться жизни Жжешь
« Последнее редактирование: 23-11-2007 20:17 от Алексей1153++ » Записан
Чатланин
Гость
« Ответ #24 : 29-01-2004 15:29 » 

Цитата: Гром
2. Результат - для тех кто не понял - будет = 10.
В том частном случае когда есть именно такая программа.

RXL поменял задачи - переписал перепроверил с записей с интервью - из-за того, что найдены были ошибки.
Сейчас там точно такой же текст который был дан мне - только на русском а не на английском.

Chatlanin, не будет работать - так как при ++first_red ты попадаешь не обязательно на красный следующий камень - проверки то нету.


Ну так следующий камень либо текущий либо настоящий красный. А вообще, работает. Только что составил тестпрогу и проверил.
Записан
Доброжелатель
Гость
« Ответ #25 : 29-01-2004 19:16 » 

1. Идея Boris Tkach правильная, а вот и реализация:
Код:
/***************************************
*  с типом bool в С, дело тёмное, несмотря на то, что в C99
*  включён stdbool.h, с макроопределением bool, я не смог
*  его найти. Известный компилятор Comeau 4.3.3 так же
*  выдал ошибку об его отсутсвии. Поэтому, использую постаринке int :)
***************************************/

struct link
{
    struct link *next;
    int  value;
};

int check(struct link const* p)
{
    struct link const* li  = p;
    struct link const* tmp = p;
   
    if (!tmp) return 0;

    while((tmp = tmp->next))
    {   
        if (tmp == li) return 1;
        li = li->next;
        if (!(tmp = tmp->next)) return 0;
        if (tmp == li) return 1;
    }
    return 0;
}

2.
Код:
int * foo()
{
int X;
X=7;
Return &X; /* [b]R[/b]eturn - возможно это банальная опечатка */
           /* но возвращать, указатель на локальный объект, грубейшая ошибка */
}

void main(void)
/***************************************
*  C89/90 здесь все ОК
*  C99 разрешает всег две сигнатуры :
*  1. int main(void)
*  2. int main(int argc, char *argv[] /* или эквивалент char **argv  */)
***************************************/
{
int Y;
Y = *foo();
printf("%d", Y+3);
}
В результате, имеем неопредёленное поведение.

3. уже решена
« Последнее редактирование: 23-11-2007 20:22 от Алексей1153++ » Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #26 : 29-01-2004 20:31 » 

Ответы на задачи:


1. Ну собственно все понятно, самым простым и наглядным решением есть два указателя, один из которых бежит по всему циклу и встречая 0 вовращает 0.
Второй каждый раз бегает от первого элемента списка до первого указателя, и проверяет не на него ли ссылается последний в данный момент элемент списка.

В задаче не стояло указание к оптимизации, так что все решения правильные , которые достигают результата с помощью только проверок.

2. Задача не однозначна, спецом сделал сегодня не только несколько тестов, но и звонок на фирму с вопросом.
Суть ответа была на фирме - указать на неверность условия, с чем большинство с успехом справилось.

Однако!!! ЗАДАЧА НЕКОРРЕКТНА, очередной раз убеждаюсь в неправильном понимании постановки задачи.

В том иде, когда мы реализуем в любой практически системе тот код , который приведен в задаче, кванта на выполнение потока вполне хватает для нормального завершения задачи.
Так как никаких доп. условий в задаче не ставится - то любой тест приводит к выводу 10 в ответе и все.

А вот при работе в теории, если воспринять код программы как метод, тогда првавы те, кто утверждает, что задача не имеет решения.
В общем глупо ИМХО.

3. Решений несколько.
Самым простым является решение движения с двух сторон, т.е. работа с двумя направлениями.
В этом случае происходит проверка, если слева красный цвет - то ничего не делаем, если зелный то переносим в крайне правый - первый не зеленый, и т.д.

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

Собственно задача не сложная. Но с заморочками.
ИМХО опять таки на вступлении без наличия компа написать решение задачи на бумаге достаточно непросто в связи с большим колличеством проверок, которые надо держать в голове без возможности проверки на ошибку или описку.
Записан

А птичку нашу прошу не обижать!!!
NetRaider
Гость
« Ответ #27 : 30-01-2004 03:27 » 

Цитата: Доброжелатель
1. Идея Boris Tkach правильная, а вот и реализация:
Код:
/***************************************
*  с типом bool в С, дело тёмное, несмотря на то, что в C99
*  включён stdbool.h, с макроопределением bool, я не смог
*  его найти. Известный компилятор Comeau 4.3.3 так же
*  выдал ошибку об его отсутсвии. Поэтому, использую постаринке int {:
***************************************/

В С99 нет типа 'bool', а также ключевых слов 'true' & 'false', но есть новый тип - '_Bool'. Действительно, Comeau 4.3.3 не находит файл 'stdbool.h', хотя в документации указано обратное.


Цитата
Код:
int * foo()
{
int X;
X=7;
return &X;
           /* но возвращать, указатель на локальный объект, грубейшая ошибка */
}

Ничего подобного. Грубейшая ошибка - это использование указателя или ссылки на локальный нестатический объект за пределами функции.

Код:
int main()
{
    // Здесь нет ошибки, потому что адрес возвращенного
    // объекта не используется.
    // Такую запись часто применяют в случаях когда
    // нужно подчеркнуть, что возвращаемое значение не используется
    // (в отличие от просто вызова 'foo()')

    static_cast<void>(foo());
}

Цитата
Код:
void main(void)
/***************************************
*  C89/90 здесь все ОК
*  C99 разрешает всег две сигнатуры :
*  1. int main(void)
*  2. int main(int argc, char *argv[] /* или эквивалент char **argv  */)
***************************************/
{
int Y;
Y = *foo();
printf("%d", Y+3);
}
В результате, имеем неопредёленное поведение.

А в этом случае поведение действительно является неопределенным.

P.S. Определение функции 'main' (выше) не соответствует стандарту.
« Последнее редактирование: 23-11-2007 20:26 от Алексей1153++ » Записан
Xeysan
Гость
« Ответ #28 : 30-01-2004 05:46 » 

Кстати, в заголовке вопросов стоит "Часть 1". Следует ждать вторую, третью... :?:
Записан
Anonymous
Гость
« Ответ #29 : 30-01-2004 06:25 » 

Цитата: NetRaider
Цитата: Доброжелатель
Код:
int * foo()
{
int X;
X=7;
return &X;
           /* но возвращать, указатель на локальный объект, грубейшая ошибка */
}

Ничего подобного. Грубейшая ошибка - это использование указателя или ссылки на локальный нестатический объект за пределами функции.

Код:
int main()
{
    // Здесь нет ошибки, потому что адрес возвращенного
    // объекта не используется.
    // Такую запись часто применяют в случаях когда
    // нужно подчеркнуть, что возвращаемое значение не используется
    // (в отличие от просто вызова 'foo()')

    static_cast<void>(foo());
}

static_cast<void>(foo()); Я шокирован! Это похоже на заплатку, с помощью которй мы пытаемся использовать кривой код. Может быть нужно было бы испроавить функцию foo(), а не пользоваться cast'ом, появление которго, говорит о проблемах в проектировании? Так можно было бы написать, если бы мы возвращали валидный адрес, который нам не нужен. Итого, в данном случае, я считаю, что ошибка, все-таки, заключается в возврате указателя на локльный объект.
« Последнее редактирование: 23-11-2007 20:28 от Алексей1153++ » Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines