Поиск
 
 

Результаты :
 


Rechercher Расширенный поиск

Кто сейчас на форуме
Сейчас посетителей на форуме: 1, из них зарегистрированных: 0, скрытых: 0 и гостей: 1

Нет

[ Посмотреть весь список ]


Больше всего посетителей (9) здесь было Вс Фев 11, 2018 12:54 pm
Самые активные пользователи за неделю


Домашняя работа №10

Страница 1 из 2 1, 2  Следующий

Перейти вниз

Домашняя работа №10

Сообщение автор Gragory023 в Пн Мар 06, 2017 4:18 pm

Возникли следующие вопросы:
Не понял что означает вот это функция:
Код:
void swap(int a[], int i, int j) {
   int temp = a[i];
   a[i] = a[j];
   a[j] = temp;
}
По первому заданию:
Что значит написать функцию, сортирующую по возрастанию или убыванию, но по умолчанию сортировка идет по убыванию?
По второму заданию:
Как я понял надо сначала найти минимальное значение слева потом справа, потом сохранить индексы этих значений, и между ними напечатать оставшиеся числа.
Но как искать слева и справа, надо использовать 2 функции для сортировки?

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Ярослав в Вт Мар 07, 2017 2:16 pm

swap переводится «поменять местами». Функция меняет местами элементы массива a, стоящие на местах i и j:



1. Функция должна сортировать массив либо по возрастанию; либо по убыванию. Направление сортировки задаётся третьим параметром функции. Например, он может быть числовым: 0 означает по возрастанию, 1 по убыванию. (Я рекомендую здесь использовать перечислимый тип enum).

Третий параметр функции должен иметь значение по умолчанию (см. Урок 8 ). Значение по умолчанию должно совпадать с константой, задающей сортировку по убыванию.

2. Правильно, нужно найти по очереди левое отрицательное и правое отрицательное значение, сохранить их позиции. Однако напечатать числа между ними мало: по заданию их надо отсортировать.

Для поиска левого и правого отрицательного числа надо использовать алгоритм линейного поиска: перебираем индексы, пока не найдём первый отрицательный элемент. Когда элемент найден, поиск нужно прерывать break или return.

При поиске левого отрицательного элемента цикл линейного поиска будет возрастающим (i++). При поиске правого отрицательного элемента нужно поменять поиск, чтобы он был убывающим (i--).
avatar
Ярослав
Admin

Posts : 580
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Gragory023 в Чт Мар 09, 2017 10:27 am

Вообще толком ничего не получается((((
По первому сортирует неправильно
Код:
inline void swap(int a[], int i, int j) {
 int temp = a[i];
 a[i] = a[j];
 a[j] = temp;
}

void selectionSpot(int a[], int n, int change) {
 for (int i = 0; i < n; i++) {
 int minPlace = i;
 for (int j = i; j < n; j++)
 if (change == 0) {
 if (a[j] < a[minPlace])
 minPlace = j;
 swap(a, i, minPlace);
 }
 else if (change == 1) {
 if (a[j] > a[minPlace])
 minPlace = j;
 swap(a, i, minPlace);
 }
 else
 cout << "Please enter corret change" << endl;
 }
}

void main() {
 srand(time(NULL));
 const int SIZE=10;
 int ar[SIZE];
 int change;
 cin >> change;
 for (int i = 0; i<SIZE; i++) {
 ar[i] = rand() % 100;
 cout << ar[i] << " ";
 }
 cout << "\n\n";

 selectionSpot(ar, SIZE, change);

 // после сортировки
 for (int i = 0; i<SIZE; i++) {
 cout << ar[i] << " ";
 }
 cout << "\n\n";
}
Во втором не ищет отрицательные числа в правой части, так же не понятно какая там сортировка должна быть.
Код:
inline void swap(int a[], int i, int j) {
 int temp = a[i];
 a[i] = a[j];
 a[j] = temp;
}
void minus_left(int a[], int n) {
 for (int i = 0; i < n/2; i++) {
 int minus_left;
 if (a[i] < 0) {
 minus_left = i;
 cout << minus_left << endl;
 break;
 }
 
 }
}
void minus_right(int a[], int n) {// поиск левого работает, а правого выдает, совершенно непонятное что то
 for (int i = 12; i > n/2 ; i--) {
 int minus_right;
 if (a[i] < 0) {
 minus_right = i;
 cout << minus_left << endl;
 break;
 }

 }
}

void selectionSpot(int a[], int minus_left, int minus_right) {
 for (int i = minus_left; i <= minus_right; i++) {
 int minPlace = i;
 for (int j = i; j < minus_right; j++)
 if (a[j] > a[minPlace])
 minPlace = j;
 swap(a, i, minPlace);
 }
}


void main() {
 srand(time(NULL));
 const int SIZE = 12;
 int ar[SIZE];
 for (int i = 0; i<SIZE; i++) {
 ar[i] = rand() %40-20;
 cout << setw(3)<<ar[i] << " ";
 }
 cout << "\n\n";

 minus_left(ar, SIZE);
 minus_right(ar, SIZE);
 selectionSpot(ar, minus_left, minus_right);//вроде так нельзя делать, но как по другому поставить условия для сортировки в избранном участке
 
 
}
Третье даже еще не начинал(

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Gragory023 в Чт Мар 09, 2017 12:50 pm

Вот по третьему, что получилось.
Код:
void random(int ar[], int SIZE){
 for (int i = 0; i < SIZE; i++) {
 ar[i] = rand() % 20 + 1;
 cout << setw(2) << ar[i] << " ";
 }
}

void random_number(int ar[],int SIZE) {
 int number = rand() % 20 + 1;;
 cout <<endl << endl << number<<" - random number" << endl;
 for (int i=0; i < SIZE; i++)
 if (ar[SIZE] == number) {
 cout << SIZE << endl;//почему то не печатает индекс
 break;
 }
 else {
 cout << "Didn't have this number" << endl;
 break;
 }

}
void main() {
 srand(time(NULL));
 const int SIZE = 20;
 int ar[SIZE];
 for (int i = 0; i < SIZE; i++) {
 ar[i] = rand() % 20+1;
 cout << setw(2) << ar[i] << " ";
 }
 cout << endl;
 random(ar, SIZE);
 random_number(ar, SIZE);
}
Правда, не получается вывести индекс, и не знаю как потом отсортировать(

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Ярослав в Чт Мар 09, 2017 10:15 pm

1. В первом не совсем верный алгоритм. По сути, цикл по j — это поиск позиции минимального элемента. swap делается не когда надо: он вызывается внутри цикла по j. Надо сначала найти позицию минимального элемента (завершить цикл по j), а потом сделать 1 обмен местами.

Трудно читать алгоритмы из-за неправильных табов.

2. Цикл поиска правого отрицательного элемента в принципе правильный, неправильные границы цикла. Он должен быть поиском по массиву с правого конца по убыванию. Это значит, что i начинается с макимально допустимого значения; в случае массива размера n самая правая позиция равна (n - 1). И перебирать надо, пока не будет достигнуто начало массива, то есть i >= 0. Ведь самый правый отрицательный элемент может быть и не в правой половине массива?

Сортировку во 2-й можно использовать любую. Главное — скорректировать границы сортировки, чтобы сортировать только часть массива между minus_left и minus_right.
avatar
Ярослав
Admin

Posts : 580
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Ярослав в Чт Мар 09, 2017 10:22 pm

3. Перемешивание массива должно быть устроено по-другому. Не создаём все значения заново случайные; а меняем местами случайные пары много раз. Так числа останутся те же, но порядок будет другой: случайный.

В алгоритме поиска одна ошибка: ar[SIZE]. Никогда нельзя писать ar[SIZE], потому что это доступ к элементу массива по индексу SIZE, который за пределами массива. У нас в массиве элементы пронумерованы 0, 1, 2, ... SIZE - 1. SIZE был бы за пределами.

Тут, наверное, подразумевалось какое-то другое выражение в квадратных скобках. Чаще всего это выражение выглядит как a[i].
avatar
Ярослав
Admin

Posts : 580
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Gragory023 в Пт Мар 10, 2017 10:01 am

По первому, непонятно, в классе делали именно так, как у меня.
По второму, что значит перебирать надо, пока не будет достигнуто начало массива, то есть i >= 0. Почему начало то, если слево был найден минимальный, то перебирать надо до него, вроде как.
По тертьему, а как поменять, то местами рандомно?
Так же изменил ar[SIZE] == number на ar[i] == number,и все равно ничего не находит.

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Ярослав в Пт Мар 10, 2017 12:32 pm

1. swap надо делать после того, как найден минимальный. Минимальный найден, когда цикл по j закончен.

Алгоритм немного отличается из-за дополнительных if-ов по направлению сортировки.

2. Да, хорошо, можно останавливаться по достижении minus_left. Ну во всяком случае не n/2.

3. Выбираем, кого поменять, рандомно:
i = rand () % n;
Выбираем, с кем поменяеть, рандомно:
j = rand () % n;
Меняем:
swap (a, i, j);

Повторяем достаточно много раз.
avatar
Ярослав
Admin

Posts : 580
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Gragory023 в Пт Мар 10, 2017 12:59 pm

Что то я в тупике(((( Огорчён

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Ярослав в Пт Мар 10, 2017 1:03 pm

По которой задаче?

Код:
void selectionSpot(int a[], int n, int change) {
  // для каждого i
  for (int i = 0; i < n; i++) {
    // цель — найти минимальный(максимальный) элемент
    // и поменять его с i

    int minPlace = i;
    for (int j = i; j < n; j++)
      if (change == 0) {
        if (a[j] < a[minPlace]) // a[j] меньше минимума
          minPlace = j;
        // убрал swap отсюда — рано
      }
      else if (change == 1) {
        if (a[j] > a[minPlace]) // a[j] больше максимума
          minPlace = j;
        // убрал swap отсюда — рано
      }
      else
        cout << "Please enter corret change" << endl;
   
    // Нашли. По окончании поиска меняем:
    ?
  }
}
avatar
Ярослав
Admin

Posts : 580
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Gragory023 в Пт Мар 10, 2017 1:13 pm

С первой вроде получилось.
Со второй в minus_right не полчается вывести границу, т.к нужно из minus_left вытащить как то i, попробовал return i, не получается.

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Ярослав в Пт Мар 10, 2017 1:23 pm

Беда с функциями minus_left и minus_right в том, что они нигде не сохраняют результат своей работы. Он хранится в локальной переменной minus_left / minus_right, печатается на экран, но по выходу из функции уничтожается вместе с локальной переменной.

Есть два основных способа сохранить результат работы функции minus_left:
1) Глобальная переменная
2) Значение возврата функции

Лучше пользоваться вторым. Для этого надо поменять функцию minus_left, чтобы она имела значение возврата, а именно, указать тип возврата функции:
Код:
int minus_left (......)

Также надо добавить инструкцию возврата значения return (последней инструкцией функции):
Код:
return minus_left;

Теперь эта функция возвращает значение; но этого мало. Надо его ещё сохранить. Этим должна заниматься та функция, где мы вызываем minus_left (). То есть main:
Код:
int left_border = minus_left (....);

Я завёл локальную переменную в main, с типом int, с названием left_border (левая граница). И присвоил ей значение — результат работы функции minus_left(), то есть её значение возврата.

Теперь эта переменная есть в main, но её всё ещё нет в minus_right. Есть два способа передать значение left_border в функцию minus_right:
1) Глобальная переменная
2) Параметр функции

Лучше глобальными переменными не пользоваться; добавим ещё один параметр minus_right:
Код:
void minus_right(int a[], int n, int left_border) {

Теперь в нашей функции есть значение, найденное minus_left. Его можно использовать как границу цикла for:
Код:
for (int i = n - 1; i >= ??? ; i++)
avatar
Ярослав
Admin

Posts : 580
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Gragory023 в Пт Мар 10, 2017 1:47 pm

Индексы нашел, потом делаю сортировку:
Код:
void selectionSpot(int a[], int left_border, int right_border) {
   for (int i = left_border; i <= right_border; i++) { //ult <= пишет несовместимые типы операндов
      int minPlace = i;
      for (int j = i; j <= minus_right; j++)
         if (a[j] > a[minPlace])
            minPlace = j;   
      swap(a, i, minPlace);
   }

}

В main ввел вот так:
Код:

   selectionSpot(ar, left_border, right_border)

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Ярослав в Пт Мар 10, 2017 1:54 pm

В той строчке вроде бы нет ошибок.

Ошибка скорее всего здесь:
Код:
for (int j = i; j <= minus_right; j++)

Потому что minus_right — это имя функции, а не переменной, и компилятор думает: тут стоит функция, но нет круглых скобок, значит, это указатель на функцию, несовместимый тип. Видимо, подразумевалось right_border?

Ещё одна тонкость: надо, чтобы left_border и right_border остались на месте, а сортировалась часть строго между ними. Сейчас left_border и right_border сортируются наравне со всеми.
avatar
Ярослав
Admin

Posts : 580
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Gragory023 в Пт Мар 10, 2017 2:47 pm

Вторая получилась!!!
Теперь третье пытаюсь сделать.
Рандомную замену сделал так:
Код:
void random(int ar[], int SIZE){
 for (int i = 0; i < SIZE; i++) {
 int j = rand() %19;
 int temp = ar[i];
 ar[i] = ar[j];
 ar[j] = temp;
 cout << setw(2) << ar[i] << " ";
 }
}
Но вроде не совсем правильно(

Так же не могу разобраться с индексом
Код:
int random_number(int ar[],int SIZE, int number) {

 for (int i = 0; i < SIZE; i++)
 if (ar[i] == number) {
 return i;
 break;
 }
 
}
void main() {
 srand(time(NULL));
 const int SIZE = 20;
 int ar[SIZE];
 int number = rand() % 20 + 1;
 for (int i = 0; i < SIZE; i++) {
 ar[i] = rand() % 20+1;
 cout << setw(2) << ar[i] << " ";
 }
 cout << endl << endl;
 
 
 random(ar, SIZE);
 int random_border=random_number(ar, SIZE,number);
 cout << endl<<"Rondom number = "<< number << endl;
 cout << "Number random index = " << random_border << endl;
}

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Ярослав в Пт Мар 10, 2017 2:57 pm

Функции называются не очень хорошо. Функции надо называть по тому, что они делают. «Перемешать массив» по-английски будет «shuffle array». «Найти число в массиве» — «find number in array».

Почему j = rand() % 19?
j будет использовано как номер элемента массива, a[j], то есть j — это индекс. Допустимые значения для индекса — от 0 до SIZE - 1. Логично было бы в этом случае
Код:
j = rand () % SIZE

В функции random_number не предусмотрен случай, если цикл for выполнился до конца, так и не найдя элемент. Такое в принципе может случиться. Что тогда возвращает функция? Может, вся проблема в этом.

break после return не нужен, т.к. return — команда немедленного выхода из функции.
avatar
Ярослав
Admin

Posts : 580
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Gragory023 в Пт Мар 10, 2017 3:12 pm

Добавил в else break, но видимо это не то.
Как можно по другому сделать?
Код:
void shuffle_array(int ar[], int SIZE){
   for (int i = 0; i < SIZE; i++) {
      int j = rand() % SIZE;
      int temp = ar[i];
      ar[i] = ar[j];
      ar[j] = temp;
      cout << setw(2) << ar[i] << " ";
   }
}

int find_number_in_array(int ar[],int SIZE, int number) {

   for (int i = 0; i < SIZE; i++)
      if (ar[i] == number) {
         return i;
      }
      else
         break;
   
}

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Ярослав в Пт Мар 10, 2017 3:14 pm

Все поисковые циклы устроены по схеме:

Код:
для i от 0 до N - 1 {
    если i — подходящий элемент
        выйти из функции, i — ответ
}
// если мы здесь, то цикл окончен, и мы ни разу не нашли, что искали
вернуть сообщение, что ничего не найдено
avatar
Ярослав
Admin

Posts : 580
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Gragory023 в Пт Мар 10, 2017 3:20 pm

Код:
int find_number_in_array(int ar[],int SIZE, int number) {

   for (int i = 0; i < SIZE; i++)
      if (ar[i] == number) {
         return i;
      }
   cout << "Random number didn't find" << endl;
   

Все равно неправильно(

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Ярослав в Пт Мар 10, 2017 3:25 pm

В случае функции, возвращающей int, у программиста есть обязанность по выходу из функции вернуть какое-то целое число (даже если по смыслу никакое число не годится).

Когда мы нашли значение, мы возвращаем его позицию (индекс): return i;
Когда мы не нашли ничего, общепринятым является специальное значение возврата -1, которое будет сигнализировать: ничего не найдено.

Писать в cout в функции не надо; нужно вернуть -1.

Вызывавшая функция, то есть main(), должна учитывать, что find_number_in_array может ничего не найти и вернуть -1. Это работа main() — проанализировать возвращённое значение, и в случае -1 предпринять какие-то другие действия. (Наше задание — отсортировать массивы слева и справа по возарастанию / убыванию невозможно выполнить в этом сценарии). Сообщение об ошибке более уместно здесь.
avatar
Ярослав
Admin

Posts : 580
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Gragory023 в Пт Мар 10, 2017 4:00 pm

Все, запутался(
Код:
void shuffle_array(int ar[], int SIZE){
   for (int i = 0; i < SIZE; i++) {
      int j = rand() % SIZE;
      int temp = ar[i];
      ar[i] = ar[j];
      ar[j] = temp;
      cout << setw(2) << ar[i] << " ";
   }
}

int find_number_in_array(int ar[],int SIZE, int number) {

   for (int i = 0; i < SIZE; i++)
      if (ar[i] == number) {
         return i;
      }
   return-1;
   
}
inline void swap(int a[], int i, int j) {
   int temp = a[i];
   a[i] = a[j];
   a[j] = temp;
}

void selectionSpot_left(int a[],  int random_border) {
   for (int i = 0; i < random_border; i++) {
      int minPlace = i;
      for (int j = i; j < random_border; j++)
         if (a[j] < a[minPlace])
            minPlace = j;
      swap(a, i, minPlace);
   }
}
void selectionSpot_right(int a[], int random_border,int SIZE) {
   for (int i = random_border + 1; i < SIZE; i++) {
      int minPlace = i;
      for (int j = i; j < random_border; j++)
         if (a[j] > a[minPlace])
            minPlace = j;
      swap(a, i, minPlace);
   }
}
void main() {
   srand(time(NULL));
   const int SIZE = 20;
   int ar[SIZE];
   int number = rand() % 20 + 1;
   for (int i = 0; i < SIZE; i++) {
      ar[i] = rand() % 20+1;
      cout << setw(2) << ar[i] << " ";
   }
   cout << endl << endl;
   
   
   shuffle_array(ar, SIZE);
   int random_border= find_number_in_array(ar, SIZE,number);
   if (random_border != -1) {
      cout << endl<< "Number random index = " << random_border << endl;
      selectionSpot_left(ar, random_border);
      selectionSpot_right(ar, random_border, SIZE);
      for (int i = 0; i<SIZE; i++) {
         cout << setw(2) << ar[i] << " ";
      }
      cout << endl;
   }
      else
         cout << endl << "Random number didn't find" << endl;
         cout << endl << "Rondom number = " << number << endl;
}

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Ярослав в Пт Мар 10, 2017 4:06 pm

Выглядит неплохо. Навскидку ошибок не видно. У else наверное { } нужны. Я бы поменял if и else ролями: сначала рассмотрел бы плохой случай и вышел бы из программы (приём «Охранника»).

А работает?
avatar
Ярослав
Admin

Posts : 580
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Gragory023 в Пт Мар 10, 2017 7:42 pm

Кое как работает, но совершенно не правильно, бывает выдает рандомное число, которое потом появляется в массиве. Такое ощущение, что программа сравнивает рандмное число с последним массивом или что то типо того. Так же, кажется, что не правильно сделал изменение чисел в массиве.

Gragory023

Posts : 75
Join date : 2016-12-28

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Ярослав в Сб Мар 11, 2017 5:02 pm

Надо отлаживать, так непонятно
avatar
Ярослав
Admin

Posts : 580
Join date : 2016-12-21
Location : Москва

Посмотреть профиль http://itstep.forum2x2.ru

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Евгений в Вт Мар 14, 2017 6:12 pm

Ярослав пишет:Надо отлаживать, так непонятно
Ярослав, ты не мог бы создать тему и выложить туда коды пройденных видов сортировок? К сожалению, у меня не сохранился код с предпоследнего урока, а примере в интернете какие-то кривые

Евгений

Posts : 6
Join date : 2017-01-30

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Домашняя работа №10

Сообщение автор Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Страница 1 из 2 1, 2  Следующий

Вернуться к началу


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