Можно ли удалить элемент в векторе в C?

У меня проблема с упражнением. Он просит: «Напишите функцию, которая получает вектор и возвращает вектор, удаляя все простые числа». Также есть предложение: «Удалить i-й элемент в векторе означает перейти от i+1-го элемента к (N-1)-му элементу, чтобы закрыть пустое место, оставшееся от удаленного элемента». И я не могу использовать указатель.

Я не знаю, как это сделать.

Попробуйте цикл for, начинающийся с i. Не забудьте в конце уменьшить переменную, содержащую размер массива!

Alex Zeffertt 30.06.2023 12:05

@Arianna Tatani Переданный массив в функцию уже будет указателем на его первый элемент, а оператор нижнего индекса представляет собой выражение с указателем. :)

Vlad from Moscow 30.06.2023 12:13

Что такое вектор? В C такого нет. Может быть, в библиотеке, которую вы используете? Или это определяется в контексте вашего упражнения? Здесь дело не только в «нацистском словарном запасе». Поскольку «вектор» не является стандартным понятием в C, мы не можем узнать из этого слова, как ваш «вектор» числа организован в памяти. Являются ли элементы «вектора» цепным списком? Или простой «массив» C (массив указателей на блок чисел, то есть все, что можно индексировать с помощью [...])? И если да, то имеет ли значение порядок элементов в нем?

chrslg 30.06.2023 12:29

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

chrslg 30.06.2023 12:31

Я не уверен, что это у вас есть проблемы с. Чтобы уточнить, пожалуйста, укажите, возникла бы у вас проблема, если бы задание было сформулировано более четко, например. Например: «Удалить i-й элемент в векторе означает выполнить итерацию от i+1-го элемента по каждому элементу между ним и (N-1)-м элементом (каждый раз копируя значение, найденное в текущем элементе, в элемент в индексе, который на единицу ниже), чтобы закрыть пустое место, оставшееся от удаленного элемента, и в итоге получить пустое место в конце вектора, который затем считается не частью результирующего и теперь более короткого вектора.

Yunnosch 30.06.2023 13:13

Если это решит вашу проблему, вам нужно спросить своего учителя, имел ли он в виду это, потому что, конечно, от меня это только предположение.

Yunnosch 30.06.2023 13:14
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
7
6
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Напишите функцию, которая получает вектор

В C нет такого понятия, как тип vector. Вероятно, это массив.

И я не могу использовать указатель

хммм... передача массива функции в C на самом деле "передача указателя", поэтому избежать этого будет очень сложно. Но функцию можно написать так, чтобы она как бы скрывала использование указателя.

Теперь для кода функция может выглядеть так:

size_t remove_primes(size_t size, int a[]);

Это функция, которая принимает массив и его размер в качестве аргументов и возвращает новый размер после удаления простых чисел.

В коде это может быть что-то вроде:

size_t remove_primes(size_t size, int a[])
{
    size_t i = 0;
    while ( i < size)
    {
        if (is_prime(a[i]))
        {
            // It's a prime so move all element after i'th element to the left
            //
            // memmove(&a[i], &a[i+i], (size - 1 - i) * sizeof a[0]);
            //
            // or to hide use of pointers
            //
            for (size_t j = i+1; j < size; ++j) a[j-1] = a[j];

            --size;
        }
        else
        {
            ++i;
        }
    }
    return size;
}

или для лучшей производительности, например:

size_t remove_primes(size_t size, int a[])
{
    size_t writer = 0;
    for (size_t reader = 0; reader < size; ++reader)
    {
        if ( ! is_prime(a[reader]))
        {
            // Not a prime so save the value
            a[writer] = a[reader];
            ++writer;
        }
    }
    return writer;
}

Другие вопросы по теме