У меня проблема с упражнением. Он просит: «Напишите функцию, которая получает вектор и возвращает вектор, удаляя все простые числа». Также есть предложение: «Удалить i-й элемент в векторе означает перейти от i+1-го элемента к (N-1)-му элементу, чтобы закрыть пустое место, оставшееся от удаленного элемента». И я не могу использовать указатель.
Я не знаю, как это сделать.
@Arianna Tatani Переданный массив в функцию уже будет указателем на его первый элемент, а оператор нижнего индекса представляет собой выражение с указателем. :)
Что такое вектор? В C такого нет. Может быть, в библиотеке, которую вы используете? Или это определяется в контексте вашего упражнения? Здесь дело не только в «нацистском словарном запасе». Поскольку «вектор» не является стандартным понятием в C, мы не можем узнать из этого слова, как ваш «вектор» числа организован в памяти. Являются ли элементы «вектора» цепным списком? Или простой «массив» C (массив указателей на блок чисел, то есть все, что можно индексировать с помощью [...])? И если да, то имеет ли значение порядок элементов в нем?
И действительно, трудно обрабатывать переменное количество чисел без использования указателей.
Я не уверен, что это у вас есть проблемы с. Чтобы уточнить, пожалуйста, укажите, возникла бы у вас проблема, если бы задание было сформулировано более четко, например. Например: «Удалить i-й элемент в векторе означает выполнить итерацию от i+1-го элемента по каждому элементу между ним и (N-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;
}
Попробуйте цикл for, начинающийся с i. Не забудьте в конце уменьшить переменную, содержащую размер массива!