(C ) Конкретные значения в массиве

#c #arrays

#c #массивы

Вопрос:

Я не уверен, как озаглавить мой вопрос, но вот что. Я тестирую некоторые функции, и я столкнулся с проблемой.

Что я хочу знать, так это как я могу настроить оператор «for» или «if», чтобы помещать в массив только значения, соответствующие критериям? Например, найдите каждый делитель для числа, но только поместите множители в массив.

Любая помощь была бы приветствована, исходный код может быть предоставлен при необходимости :). Да, я новичок, так что будьте аккуратны!

 #include <iostream>
using namespace std;

int main(){
    int n;
    int counter = 1;
    cout << "What number would you like to use? ";
    cin >> n;
    int DiviArray[n];
    for (int k=0,j=1;k<n;k  ,j  )
    {
        DiviArray[k] = n-k;
    }
    int k = 3;
    int factn[n];
    cout << "Factors of " << n << ": " << endl;

    for (int i=0, j=1;i<n;i  ,j  )
    {
        factn[i] = n/DiviArray[i];
        if(factn[i]*DiviArray[i]==n)
        {
            cout << counter << ". " << factn[i] << " x " << DiviArray[i] << endl;
            counter  ;
        }
    }
    return 0;
}
  

РЕДАКТИРОВАТЬ: решил использовать векторы, не уверен, смогу ли я заставить это работать, но спасибо за отзывы, ребята 🙂

Комментарии:

1. Да, ваш исходный код или ваши идеи о том, как это сделать.

2. @Als pastebin.com/AHjVLyWF Я не уверен, как это сделать. Я могу заставить его печатать все совпадающие значения, но каждое другое значение также помещается в массив :/

3. Я пытался добавить другие параметры в оператор if, но у него их не будет :/

4. Хорошо, что он принимает 2 числа, n и k, и находит k-возможности для n. На данный момент я просто хочу, чтобы он сохранял каждый фактор в массиве, но безрезультатно :/.

5. Я подумываю о том, чтобы иметь 2 массива, один из которых хранит все и будет удален после использования, и тот, который имеет переданные ему факторы. Это сработает или есть что-то проще?

Ответ №1:

Поскольку вы не знаете заранее, сколько значений будет соответствовать условию, вам следует использовать std::vector .

В качестве преимущества он отслеживает, сколько элементов вы уже добавили, поэтому push_back всегда будет использовать следующий доступный индекс.

Это также исправляет

 cin >> n;
int DiviArray[n];
  

что не является законным C .

Комментарии:

1. (Удаленный комментарий: «Как бы я тогда реализовал векторы?») С динамическим распределением и копированием содержимого всякий раз, когда вектор должен расти.

2. std::vector предоставляется стандартной библиотекой (отсюда и название). Вам не нужно «реализовывать» это. Вам нужно использовать это. Он используется очень похоже на массив. .push_back() Метод добавляется в конец, предварительно убедившись, что хранилище достаточно большое. Он делает все это за вас автоматически.

Ответ №2:

Если вы хотите поместить в массив только те значения, которые соответствуют условию, то вам следует вводить число в массив только тогда, когда условие соответствует. Для этого оператор, который помещает число в массив, должен находиться внутри if-блока для условия. Надеюсь, мне не нужно объяснять, почему 🙂

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

Комментарии:

1. Да, j раньше было номером строки, но счетчик заменил его, и я забыл его удалить. То, что вы говорите, имеет смысл, но на самом деле это не отвечает на мой вопрос. Я хочу, чтобы в массиве factn были только коэффициенты, а не числа, которые не умножаются обратно.

2. Это просто отлично отвечает на вопрос. Ваш вопрос: «как мне убедиться, что в массив попадают только факторы?» Ответ таков: «возьмите код, который помещает числа в массив, и поместите его внутрь блока «выполняйте эту часть, только если число является фактором»».