Я довольно новичок в C ++, и мне нужна помощь в поиске кода для отбрасывания наименьшего значения из случайно сгенерированного набора чисел. Вот мой код до сих пор:
//Create array and populate the array with scores between 55 and 10
// Drop lowest Score
#include <iostream>
#include <cstdlib>//for generating a random number
#include <ctime>
#include <iomanip>
#include <algorithm>
#include <vector>
using namespace std;//function prototype
int *random (int);int main()
{ int *numbers; //point to numbers
//get an array of 20 values
numbers = random(20);
//display numbers
for (int count = 0; count < 20; count++)
cout << numbers[count] << endl;
cout << endl;system("pause");
return 0;
}
//random function, generates random numbers between 55 and 100 ??
int *random(int num)
{ int *arr; //array to hold numbers
//return null if zero or negative
if (num <= 0)
return NULL;
//allocate array
arr = new int[num];
//seed random number generator
srand(time (0));
//populate array
for (int count = 0; count < num; count++)
arr[count] = (rand()%(45) +55);
//return pointer
//
return arr;
}
Для этого фрагмента кода, как мне отсортировать или найти наименьшую оценку, чтобы отбросить ее после того, как функция вернет случайные числа?
int main()
{ int *numbers; //point to numbers
//get an array of 20 values
numbers = random(20);
//display numbers
for (int count = 0; count < 20; count++)
cout << numbers[count] << endl;
cout << endl;system("pause");
return 0;
}
Ваши предложения приветствуются!
В общем, чтобы найти самое низкое значение в массиве, вы можете следовать этому псевдо-алгоритму:
min = array[0] // first element in array
for (all_values_in_array)
{
if (current_element < min)
min = current_element
}
Однако вы не можете «удалить» значение из статического массива. Вы можете использовать динамический контейнер (например, вектор) или поменять местами самое низкое значение с последним, и притвориться, что размер массива на 1 меньше. Другой вариант низкого уровня — создание собственного динамического массива в куче, однако, это, вероятно, сложнее, чем вы ищете.
Использование вектора было бы намного проще. Чтобы отбросить самый низкий элемент, вам просто нужно сортировать в обратном порядке, затем удалить последний элемент. Лично я бы рекомендовал использовать вектор.
Очевидный подход к поиску наименьшего элемента заключается в использовании std::min_element()
, Вы, вероятно, хотите использовать std::vector<T>
держать ваши элементы, но это не является абсолютно необходимым. Вы можете удалить наименьшее значение из массива следующим образом:
if (count) {
int* it = std::min_element(array, array + count);
std::copy(it + 1, array + count--, it);
}
Предполагая, что вы разумно использовали std::vector<int>
вместо этого код будет выглядеть примерно так:
if (!array.empty()) {
array.erase(std::min_element(array.begin(), array.end()));
}
Сначала найдите индекс наименьшего числа:
int lowest_index=0, i;
for (i=0; i<20; i++)
if (arr[i]<arr[lowest_index])
lowest_index=i;
Теперь, когда мы знаем индекс, переместите числа, следующие за этим индексом, чтобы перезаписать индекс, который мы нашли. Число номеров для перемещения будет 19 минус найденный индекс. То есть, если индекс 2 (третье число, так как первое находится в индексе 0) является самым низким, то после этого индекса идет 17 чисел, так что нам нужно переместиться.
memcpy(&arr[lowest_index],&arr[lowest_index+1],sizeof(int)*(19-lowest_index))
Удачи!
Сортировать массив по возрастанию.
Наименьшее значение будет в начале массива.
Или отсортируйте массив по убыванию и удалите последний элемент.
В дополнение к тому, что говорили другие, вы также можете использовать что-то вроде, например, std :: list. Он имеет встроенную сортировку, также предлагая возможность определить собственную функцию сравнения для двух элементов. (Хотя для ints это не обязательно)
Во-первых, я обычно печатаю определение вектора или списка с типом элементов, которые он будет содержать. Далее, для списков я печатаю определение итератора — хотя оба они являются просто удобством, ни то, ни другое не нужно.
Как только у вас есть список, который будет содержать целые, просто добавьте их в него. Привычка и нет необходимости делать иначе означает, что я буду использовать .push_back для добавления каждого нового элемента. После этого я отсортирую список, возьму элемент с наименьшим значением (также с наименьшим «индексом» — первый элемент), а затем, наконец, удалю этот элемент.
Некоторый код для размышления:
#include <cstdio>
#include <cstdlib>
#include <list>using namespace std;
typedef list<int> listInt;
typedef listInt::iterator listIntIter;
bool sortAsc(int first, int second)
{
return first < second;
}
bool sortDesc(int first, int second)
{
return first > second;
}
int main (void)
{
listInt mList;
listIntIter mIter;
int i, curVal, lowestScore;
for (i=1; i<=20; i++)
{
curVal = rand()%45 + 55;
mList.push_back(curVal);
printf("%2d. %d\n", i, curVal);
}
printf("\n");
mList.sort();
// mList.sort(sortAsc); // in this example, this has the same effect as the above line.
// mList.sort(sortDesc);
i = 0;
for (mIter=mList.begin(); mIter!=mList.end(); mIter++)
printf("%2d. %d\n", ++i, *mIter);
printf("\n");
lowestScore = mList.front();
mList.pop_front();
printf("Lowest score: %d\n", lowestScore);
return 0;
}
Да, и выбор использования printf, а не cout тоже был осознанным. По нескольким причинам.
printf("%d\n", someVar);
cout << someVar << endl;
Вот ссылка std :: list: http://www.cplusplus.com/reference/stl/list/
На мой взгляд, наиболее оптимальным решением вашей проблемы было бы использовать связанный список для хранения чисел, таким образом, вы можете использовать алгоритм со сложностью O (N) = N чтобы найти наименьший элемент в списке, это аналогичный метод поиска, заданный user1599559 или Mikael Lindqvist, вам нужно только сохранить вместе с минимальным значением указатель на Item (ItemX) в связанном списке, который хранит его, затем устранить Элемент X просто скажи Элемент X — 1 указывает на Элемент X + 1 и свободная память, выделенная элементом X