Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> C++ Массив 
:(
    Опции темы
andrey1997
Дата 21.10.2015, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 21.10.2015

Репутация: нет
Всего: нет



Даны целые числа а1...аn, где n - целое положительное число (n<=100). Оставить без изменения последовательность, если она упорядочена по неубыванию или невозрастанию; в противном случае удалить из последовательности все члены, порядковые номера которых кратны четырем, сохранив прежним порядок остальных членов.
PM MAIL   Вверх
feodorv
Дата 22.10.2015, 00:38 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



И что? smile 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
rudolfninja
Дата 22.10.2015, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



Цитата(feodorv @  22.10.2015,  00:38 Найти цитируемый пост)
И что?   


У нас преподователь по аналоговым и аналогово-цифровым устрайствам всгде спрашивал этот вопрос. Даже если ответил правильно, он все равно спросит "и что?". И в итоге, пока рикурсывным спуском не дойдешь до самых основ предмета - не сдашь... Это я просто молодость вспомнил  smile 

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

Код

bool is_sorted_up(int* arr, int cnt)
{
  for (int i=0; i < cnt - 1; i++)
 {
    if (arr[i] > arr[i + 1]) 
   {
       return false;
    }
  }
 return true;
}

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

Функция, удаляющая элемент массива по номеру выглядит примерно так:
Код

void del_element_by_number(int *arr, int cnt, int number)
{
    for(int i = number - 1; i < cnt - 1; i++)
    {
        arr[i] = arr[i + 1];
    }
}

Только в эту функцию надо добавить проверку на то, чтоб номер был корректный и не забыть уменьшать количество элементов массива. Поэтому, советую второй параметр передавать по ссылке, а не по значению и уменьшать количество элементов прямо в функции.

Ну а дальше все просто. Справитесь сами.
PM MAIL Skype   Вверх
konshyn
Дата 23.10.2015, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(rudolfninja @  22.10.2015,  12:41 Найти цитируемый пост)
Только в эту функцию надо добавить проверку на то, чтоб номер был корректный и не забыть уменьшать количество элементов массива. Поэтому, советую второй параметр передавать по ссылке, а не по значению и уменьшать количество элементов прямо в функции.


Это функция, мало того, что неправильная, так и работать будет очень долго при больших n - сейчас это 100 элементов, а завтра 1млрд.
Неправильная, потому что как только мы удалим первый элемент сдвигая массив, все остальные элементы, которые нужно было бы удалить, больше не будут удовлетворять условию и удаляться дальше будут уже не те элементы.

Описанные выше проблемы решаются простым использованием временного массива.

Код

int del_every_fourth_element(int *a, int c) {
    int tmp[c];
    int tmp_c = 0;
    for(int i = 0; i < c; i++) {
        if ((i + 1) % 4 == 0)
            continue;
        tmp[tmp_c++] = a[i];
    }

    for (int i = 0; i < tmp_c; i++)
        a[i] = tmp[i];
    return tmp_c;
}


Код

    ...
    return tmp_c;
    ...

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

Это сообщение отредактировал(а) konshyn - 23.10.2015, 14:34


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
volatile
Дата 23.10.2015, 14:27 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 16
Всего: 85



Код

int del_every_fourth_element (int *a, int cnt)
{
    int j = 0;
    for(int i = 0; i < cnt; ++ i)
        if (i % 4)
           a [j++] = a [i];
    return j;
}

PM MAIL   Вверх
konshyn
Дата 23.10.2015, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 295
Регистрация: 19.9.2013

Репутация: нет
Всего: нет



Цитата(volatile @ 23.10.2015,  14:27)
Код

int del_every_fourth_element (int *a, int cnt)
{
    int j = 0;
    for(int i = 0; i < cnt; ++ i)
        if (i % 4)
           a [j++] = a [i];
    return j;
}

Ну да, так в 2 раза лучше:)

P.S. if ((i + 1) % 4) 


--------------------
«Потому что ценность акта действия в этой стране возрастает в несколько раз».
PM MAIL Skype   Вверх
Starikan
Дата 23.10.2015, 15:46 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 25.10.2007

Репутация: 1
Всего: -15




Модератор: Сообщение скрыто.

PM MAIL   Вверх
Starikan
Дата 24.10.2015, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 25.10.2007

Репутация: 1
Всего: -15




Модератор: Сообщение скрыто.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0721 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.