Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.02.2023, 21:12   #1
Maxon12
Новичок
Джуниор
 
Регистрация: 14.02.2023
Сообщений: 1
По умолчанию Как сравнить группу элементов в одномерном массиве в с++ и заменить определенные элементы в нем на нули?

Дан целочисленный массив а1, а2,…, аn, среди элементов которого могут быть равные. Из каждой группы равных между собой элементов нужно оставить только один, выбросив все остальные. Освободившийся хвост массива заполнить нулями. Нужно сделать циклами и нельзя использовать stl библиотеку. Нельзя использовать динамическое выделение памяти, онли статическое.
Код:
#include <iostream>
int main() {
setlocale(0, "");
int y;

std::cout << "Введите кол - во переменных в массиве: ";
std::cin >> y;

int* a = new int[y];
for (int i = 0; i < y; i++) {
std::cout << "a[" << i << "] = ";
std::cin >> a[i];
 }
}
Maxon12 вне форума Ответить с цитированием
Старый 15.02.2023, 22:25   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Цитата:
Сообщение от Maxon12 Посмотреть сообщение
Нельзя использовать динамическое выделение памяти
Код:
int* a = new int[y];
Так вопрос в чем? Пару циклов написать можете ж?..
p51x вне форума Ответить с цитированием
Старый 16.02.2023, 02:56   #3
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

Код:
#include <limits.h>
#include <iostream>

using namespace std;

int main() {
  int array[] = {1, 1, 1, 2, 3, 3, 3, 4, 5, 5, 5};
  const int len = sizeof(array) / sizeof(int);

  int write_pos = 0;
  int last_elem = INT_MIN; // считаем, что первый элемент массива -- не INT_MIN
  for (int i = 0; i < len; i++) {
    int elem = array[i];
    if (elem != last_elem) {
      array[write_pos++] = elem;
      last_elem = elem;
    }
  }
  // заполняем хвост нулями
  while (write_pos < len) {
    array[write_pos++] = 0;
  }

  for (int i = 0; i < len; i++) {
    cout << array[i] << ' ';
  }
  cout << endl;
  return 0;
}
Вывод на консоль:
Код:
1 2 3 4 5 0 0 0 0 0 0
Пётр Седов вне форума Ответить с цитированием
Старый 16.02.2023, 07:33   #4
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

Цитата:
Сообщение от Пётр Седов Посмотреть сообщение
const int len = sizeof(array) / sizeof(int);
->
Код:
const auto len=std::size(array);
Цитата:
Сообщение от Пётр Седов Посмотреть сообщение
int last_elem = INT_MIN; // считаем, что первый элемент массива -- не INT_MIN
->
Код:
std::optional<int> last_elem;
Алексей1153 вне форума Ответить с цитированием
Старый 16.02.2023, 09:34   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Пётр Седов,
Код:
int array[] = {1, 2, 3, 2, 5, 6, 7, 7, 1, 8};
Вывод в консоль: 1 2 3 2 5 6 7 1 8 0

ADD: Maxon12, Подсказка. Элемент массива является первым в своей очереди, если перед ним (с индексами меньшими чем у текущего элемента) в массиве нету равных ему элементов.

Код:
    int i, j, k;
// Пропускаем сначала все уникальные элементы (не повторяющиеся)
    for (k = 1, j = -1; (k < y) && (k - 1 == j); ++k) // Начинаем с 1, а не 0 т.к. перед 0 нет элементов - он уникален.
        for (j = 0; (j < k) && (a[k] != a[j]); ++j); // Цикл проверки повторяемости элемента k
// Переставляем в начало остальные уникальные элементы и обнуляем оставшиеся
    for (i = k - 1; i < y; ++i) {
        for (k = i + 1, j = i - 1; (k < y) && (i > j); ++k) // Пропускаем повторяющиеся элементы
            for (j = 0; (j < i) && (a[j] != a[k]); ++j); // Цикл проверки повторяемости элемента k
        if (i == j) { // Найден уникальный элемент (k - 1), обмениваем его с i-ым
            j = a[i];
            a[i] = a[k - 1];
            a[k - 1] = j;
        } else for (; i < y; ++i) a[i] = 0; // Уникальный элемент не найден, обнуляем все оставшиеся (заодно прерываем внешний цикл докручивая его счетчик до y)
    }

Последний раз редактировалось macomics; 16.02.2023 в 12:24.
macomics вне форума Ответить с цитированием
Старый 17.02.2023, 01:14   #6
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
Код:
std::optional<int> last_elem;
Можно и так, но автору темы STL запретили:
Цитата:
Сообщение от Maxon12 Посмотреть сообщение
нельзя использовать stl библиотеку.
Хотя скорее всего авторы задания имели в виду, что нельзя использовать функцию std::unique, которая тут как раз подходит. Можно так:
Код:
int last_elem = ~array[0]; // значение, которое не равно первому элементу массива
// #include <limits.h> больше не нужен
Цитата:
Сообщение от macomics Посмотреть сообщение
Код:
int array[] = {1, 2, 3, 2, 5, 6, 7, 7, 1, 8};
Вывод в консоль: 1 2 3 2 5 6 7 1 8 0
Да, всё правильно. Если одинаковые числа не находятся рядом, то я не считаю это группой. В задании написано именно про группы, а не подмножества одинаковых чисел:
Цитата:
Сообщение от Maxon12 Посмотреть сообщение
Из каждой группы равных между собой элементов нужно оставить только один,
Пётр Седов вне форума Ответить с цитированием
Старый 17.02.2023, 01:19   #7
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от Пётр Седов Посмотреть сообщение
В задании написано именно про группы
Но ничего не сказано про то, что группы определены подряд. Такие условия обязательно оговариваются в задании. В данном случае под группой понимаются все равные друг другу элементы (идущие в любой последовательности). А термин группа здесь применяется, чтобы отвести решающего от простоты алгоритма.
macomics вне форума Ответить с цитированием
Старый 17.02.2023, 01:47   #8
Пётр Седов
Форумчанин
 
Регистрация: 26.10.2022
Сообщений: 119
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
Но ничего не сказано про то, что группы определены подряд.
Так это же очевидно, что две единицы в разных концах массива не считаются группой.
Цитата:
Сообщение от macomics Посмотреть сообщение
Такие условия обязательно оговариваются в задании.
Зачем оговаривать очевидное?
Цитата:
Сообщение от macomics Посмотреть сообщение
В данном случае под группой понимаются все равные друг другу элементы (идущие в любой последовательности).
Это ваши домыслы, это нигде в задании не написано.
Пётр Седов вне форума Ответить с цитированием
Старый 17.02.2023, 03:26   #9
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Цитата:
Сообщение от Пётр Седов Посмотреть сообщение
Это ваши домыслы, это нигде в задании не написано.
В задании четко описан принцип определения элементов в группе. Для того, чтобы элемент принадлежал группе он должен соответствовать условию:
Цитата:
Сообщение от Maxon12 Посмотреть сообщение
среди элементов которого могут быть равные. Из каждой группы равных между собой элементов
т.е. достаточно того, чтобы значения элементов массива были равны, чтобы отнести их к одной группе. Читайте внимательнее.

Здесь термин группа применен для того, чтобы показать, что равных между собой элементов может быть несколько значений.

Более того. Разрешается оставить любой элемент из группы, а не обязательно первый. Главное, чтобы он остался в массиве в единственном экземпляре, для каждой группы равных
Цитата:
Сообщение от Maxon12 Посмотреть сообщение
нужно оставить только один, выбросив все остальные
Но предполагается, что элементы будут собраны в начале массива, а все повторяющиеся в конце. После чего они будут обнуляться
Цитата:
Сообщение от Maxon12 Посмотреть сообщение
Освободившийся хвост массива заполнить нулями.
Но это как подсказка к решению без использования динамического выделения памяти.

P.S. Повторите определение терминов группа и последовательность. Вы перепутали группу с последовательностью.

Последний раз редактировалось macomics; 17.02.2023 в 04:01.
macomics вне форума Ответить с цитированием
Старый 17.02.2023, 07:05   #10
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

Цитата:
Сообщение от Пётр Седов Посмотреть сообщение
но автору темы STL запретили
std::cin и std::cout, однако, не запретили Ок, std:: optional легко имитируется флажком
Алексей1153 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В двумерном массиве A из m строк и n столбцов найти сумму всех элементов и заменить на нули элементы на главной диагонали. Григорий 0512 Помощь студентам 0 16.07.2017 13:43
В одномерном массиве все элементы этого массива умножить на среднее арифметическое наибольшего и наименьшего элементов этого массива Danil_322 Паскаль, Turbo Pascal, PascalABC.NET 6 24.12.2016 17:55
в массиве все максимальные элементы заменить первым элементом, а все минимальные элементы заменить последним элементом Валерия2701 Паскаль, Turbo Pascal, PascalABC.NET 1 12.10.2011 15:49
заменить в одномерном массиве каждый из элементов суммой его делителей IRINOK Помощь студентам 2 16.12.2010 12:18
В матрице отрицательные элементы заменить на нули denis12345 Паскаль, Turbo Pascal, PascalABC.NET 2 13.06.2009 17:25