#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. Это просто отлично отвечает на вопрос. Ваш вопрос: «как мне убедиться, что в массив попадают только факторы?» Ответ таков: «возьмите код, который помещает числа в массив, и поместите его внутрь блока «выполняйте эту часть, только если число является фактором»».