Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
bupal
25 / 25 / 2
Регистрация: 30.03.2010
Сообщений: 343
Записей в блоге: 1
#1

Минимальный элемент массива - C++

24.11.2011, 22:36. Просмотров 1502. Ответов 32
Метки нет (Все метки)

Доброго времени суток!
Как найти номер элемента массива, содержащий самое маленькое значение...
тобишь у меня есть массив с определённым количеством элементов..и в нём есть цифры..
мне нужно узнать в каком элементе массива содержится самая маленькая цифра..
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2011, 22:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Минимальный элемент массива (C++):

Определить, что больше: максимальный элемент массива А[10] или минимальный элемент массива В[7] - C++
Определить, что больше: максимальный элемент массива А или минимальный элемент массива В. Поставить максимальный элемент из них на место...

Минимальный элемент одномерного массива A заменить на третий отрицательный элемент - C++
Минимальный элемент одномерного массива A заменить на третий отрицательный элемент. Третий отрицательный искать от минимального элемента.

Поменять местами минимальный элемент с первым элементом массива, а максимальный элемент с последним - C++
Здравствуйте. Помогите пожалуйста написать программу: для поиска минимального и максимального элементов массива из 15 действительных чисел....

Поменять местами минимальный элемент и первый отрицательный элемент массива целых чисел - C++
Поменять местами минимальный элемент и первый отрицательный эле-мент массива целых чисел.Необходимо использовать указатели и динамическйи...

В одномерном массиве, состоящем из n элементов массива, вычислить минимальный элемент массива - C++
помогите

Массивы. Вычислить минимальный элемент массива, сумму элементов массива, преобразовать массив - C++
При написании программ использовать динамические массивы. Размерность массивов задаётся именованной константой. Задача 2. В...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Сыроежка
Заблокирован
25.11.2011, 01:58 #16
Цитата Сообщение от bupal Посмотреть сообщение
Извеняюсь..исправился..))
большое спасибо..
Делается все очень просто. Допустим, вы нашли первый индекс минимума - min. Если он не равен N, значит в массиве еще остались элементы, которые не были просмотрены. Значит надо для следующего вызова функции передать адрес массива, начиная со следующего элемента после найденного. И естественно второй аргумент, задающий длину массива, следует уменьшить на этот индекс. Итак, пусть при первом вызове мы имеем

C++
1
unsigned int min = min_element( a, N );
и при этом минимум был найден, то есть min != N. Тогда для следующего вызова функции вы пишите

C++
1
2
min++;
min = min_element( a + min, N - min );
То есть мы установили начало массива на адрес следующего элемента после найденного минимума и, соответственно, уменьшили на это же число размер последовательности, которая будет просматриваться в функции.

И так будете делать, пока функция вам не скажет, что больше нет минимумов, то есть когда она min получит из функции значение, равное N-min. Обратите внимание, не N, как было в первом случае, а именно N - min, так как мы сокращаем размер просматриваемой последовательности.
Эти значения вы можете хранить в отдельной переменной.
bupal
25 / 25 / 2
Регистрация: 30.03.2010
Сообщений: 343
Записей в блоге: 1
25.11.2011, 02:17  [ТС] #17
Цитата Сообщение от Сыроежка Посмотреть сообщение
Делается все очень просто. Допустим, вы нашли первый индекс минимума - min. Если он не равен N, значит в массиве еще остались элементы, которые не были просмотрены. Значит надо для следующего вызова функции передать адрес массива, начиная со следующего элемента после найденного. И естественно второй аргумент, задающий длину массива, следует уменьшить на этот индекс. Итак, пусть при первом вызове мы имеем

C++
1
unsigned int min = min_element( a, N );
и при этом минимум был найден, то есть min != N. Тогда для следующего вызова функции вы пишите

C++
1
2
min++;
min = min_element( a + min, N - min );
То есть мы установили начало массива на адрес следующего элемента после найденного минимума и, соответственно, уменьшили на это же число размер последовательности, которая будет просматриваться в функции.

И так будете делать, пока функция вам не скажет, что больше нет минимумов, то есть когда она min получит из функции значение, равное N-min. Обратите внимание, не N, как было в первом случае, а именно N - min, так как мы сокращаем размер просматриваемой последовательности.
Эти значения вы можете хранить в отдельной переменной.
а для чего инкриментировать min ??? (min++)
Сыроежка
Заблокирован
25.11.2011, 02:21 #18
Цитата Сообщение от bupal Посмотреть сообщение
а для чего инкриментировать min ??? (min++)
Потому что надо следующий поиск начинать с элемента, следующего за найденным минимумом. Иначе, если начинать поиск с этого же индекса, то функция всегда будет его возвращать, так как она находит первый минимум в последовательности.
bupal
25 / 25 / 2
Регистрация: 30.03.2010
Сообщений: 343
Записей в блоге: 1
25.11.2011, 02:24  [ТС] #19
Цитата Сообщение от Сыроежка Посмотреть сообщение
Потому что надо следующий поиск начинать с элемента, следующего за найденным минимумом. Иначе, если начинать поиск с этого же индекса, то функция всегда будет его возвращать, так как она находит первый минимум в последовательности.
не знаю почему, но у меня возвращает вместо второго минимума - максимум...
Сыроежка
Заблокирован
25.11.2011, 02:26 #20
Цитата Сообщение от bupal Посмотреть сообщение
не знаю почему, но у меня возвращает вместо второго минимума - максимум...
Показывайте код, что вы там написали.
bupal
25 / 25 / 2
Регистрация: 30.03.2010
Сообщений: 343
Записей в блоге: 1
25.11.2011, 02:28  [ТС] #21
Цитата Сообщение от Сыроежка Посмотреть сообщение
Показывайте код, что вы там написали.
C++
1
2
3
4
5
6
7
8
9
int n = min_elem(TT, sizeof(TT));
    if (n == flag)
    {
        n++;
        n = min_elem(TT + n, sizeof(TT) - n);
        return n;
    }
    else
        return n;
flag - это тот минимум, который был предыдущим..
Сыроежка
Заблокирован
25.11.2011, 02:34 #22
Цитата Сообщение от bupal Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
int n = min_elem(TT, sizeof(TT));
    if (n == flag)
    {
        n++;
        n = min_elem(TT + n, sizeof(TT) - n);
        return n;
    }
    else
        return n;
flag - это тот минимум, который был предыдущим..
Во-первых, почему вы в качестве второго элемента указываете sizeof( TT )? Надо же, как я писал, начинать поиск со следующего элемента массива.

Выкладывайте весь код!
bupal
25 / 25 / 2
Регистрация: 30.03.2010
Сообщений: 343
Записей в блоге: 1
25.11.2011, 02:39  [ТС] #23
Цитата Сообщение от Сыроежка Посмотреть сообщение
Во-первых, почему вы в качестве второго элемента указываете sizeof( TT )? Надо же, как я писал, начинать поиск со следующего элемента массива.

Выкладывайте весь код!
sizeof..как я понял...возвращает количество элементов в массиве...
нам ведь это и нужно в качестве второго аргумента в функции?....
Сыроежка
Заблокирован
25.11.2011, 02:47 #24
Цитата Сообщение от bupal Посмотреть сообщение
sizeof..как я понял...возвращает количество элементов в массиве...
нам ведь это и нужно в качестве второго аргумента в функции?....
Нет, во-первых, я не знаю, как у вас объявлен тип TT, но если это имя массива, то sizeof TT вернет вам не количество элементов, а размер участка памяти занимаемым массивом. Например, если у вас есть массив из трех элементов, имеющих тип int, то тогда вам этот оператор вернет число 12 = 3 * sizeof( int ), который в свою очередь обычно равен 4 байтам.
Вам не надо заниматься самодеятельностью, а стараться делать то, что я пишу.
bupal
25 / 25 / 2
Регистрация: 30.03.2010
Сообщений: 343
Записей в блоге: 1
25.11.2011, 02:53  [ТС] #25
хм..а что нужно написать..чтобы получить количество элементов массива?...

или что нужно написать в качестве N..
просто я понял это как количество элементов массива..

массив объявлен: double TT[N];
Сыроежка
Заблокирован
25.11.2011, 03:00 #26
Цитата Сообщение от bupal Посмотреть сообщение
хм..а что нужно написать..чтобы получить количество элементов массива?...

или что нужно написать в качестве N..
просто я понял это как количество элементов массива..

массив объявлен: double TT[N];

N == sizeof( TT ) / sizeof( double );

Но надо сомтреть весь ваш код, иначе это надолго затянется.
bupal
25 / 25 / 2
Регистрация: 30.03.2010
Сообщений: 343
Записей в блоге: 1
25.11.2011, 03:15  [ТС] #27
Цитата Сообщение от Сыроежка Посмотреть сообщение
N == sizeof( TT ) / sizeof( double );

Но надо сомтреть весь ваш код, иначе это надолго затянется.
просто весь код решает совершенно иную задачу..а вычисление минимума является лишь её отдельной..маленькой частью..

Добавлено через 6 минут
сейчас кстати проверил...он почему то в итоге возвращает min+1..тобишь если min был 0, то он вернул 1
а это не то, что нужно..потому что в итоге выходит так, что из массив {10, 170, 12}
он озвращает в качестве min элемент под номером 0 (тобишь там где 10), а в качестве второго минимального элемент под номер 1 (тобишь там где 170)..
Сыроежка
Заблокирован
25.11.2011, 03:59 #28
Цитата Сообщение от bupal Посмотреть сообщение
просто весь код решает совершенно иную задачу..а вычисление минимума является лишь её отдельной..маленькой частью..

Добавлено через 6 минут
сейчас кстати проверил...он почему то в итоге возвращает min+1..тобишь если min был 0, то он вернул 1
а это не то, что нужно..потому что в итоге выходит так, что из массив {10, 170, 12}
он озвращает в качестве min элемент под номером 0 (тобишь там где 10), а в качестве второго минимального элемент под номер 1 (тобишь там где 170)..
Я тут глупость наговорил, на ночь глядя.

На самом деле вам один раз надо искать минимуму по всему массиву. А затем уже не пользоваться этой функцией, а написать функцию поиска заданного элемента. То есть так как минимум уже известен, то в оставшейся последовательности просто нужно найти такой же по значению элемент.

Примерная функция (напишу ее для double массива

C++
1
2
3
4
5
6
7
8
unsigned int find( double a[], unsigned int n, double value )
{
   unsigned int index = 0;
   
   while ( index < n && !( a[index] == value ) ) index++;
 
   return ( index );
}
Только при вызове нужно правильно задавать аргументы. Допустим, вы сначала вызываете min_element

C++
1
2
3
4
5
6
7
8
unsigned int min = min_element( a, N );
 
while ( min != N )
{
   std::cout << "minimum = " << a[min] << std::endl;
   unsigned int start = min + 1;
   min = find( a + start, N - start, a[min] ) + start;
}

Проверьте как раз этот код. Будет ли у вас печатать все минимумы массива?
bupal
25 / 25 / 2
Регистрация: 30.03.2010
Сообщений: 343
Записей в блоге: 1
25.11.2011, 14:46  [ТС] #29
Цитата Сообщение от Сыроежка Посмотреть сообщение
Я тут глупость наговорил, на ночь глядя.

На самом деле вам один раз надо искать минимуму по всему массиву. А затем уже не пользоваться этой функцией, а написать функцию поиска заданного элемента. То есть так как минимум уже известен, то в оставшейся последовательности просто нужно найти такой же по значению элемент.

Примерная функция (напишу ее для double массива

C++
1
2
3
4
5
6
7
8
unsigned int find( double a[], unsigned int n, double value )
{
   unsigned int index = 0;
   
   while ( index < n && !( a[index] == value ) ) index++;
 
   return ( index );
}
Только при вызове нужно правильно задавать аргументы. Допустим, вы сначала вызываете min_element

C++
1
2
3
4
5
6
7
8
unsigned int min = min_element( a, N );
 
while ( min != N )
{
   std::cout << "minimum = " << a[min] << std::endl;
   unsigned int start = min + 1;
   min = find( a + start, N - start, a[min] ) + start;
}

Проверьте как раз этот код. Будет ли у вас печатать все минимумы массива?
Привет...что то не так происходит..
после нахождения первого минимума, функция find сразу выдаёт номер последнего элемента + 1...
тобишь если массив был из 8 элементов, то она выдаёт 9

Добавлено через 3 минуты
ой..кажется Вы меня не правильно поняли...
я имел в виду не то, чтобы был найден такой же по значению элемент
а чтобы был минимум, который больше первого минимума, но меньше всего остального..
тоесть в массиве {10, 30, 12} первый минимум это 10, а второй минимум это 12
ForEveR
В астрале
Эксперт С++
7970 / 4732 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
25.11.2011, 15:49 #30
C++
1
2
3
4
5
6
7
8
9
10
#include <vector>
#include <iostream>
#include <algorithm>
 
int main()
{
    std::vector<int> vec = {10,30,12};
    std::cout << 
    (std::min_element(std::min_element(vec.begin(), vec.end()) + 1, vec.end()) - vec.begin()) << std::endl;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2011, 15:49
Привет! Вот еще темы с ответами:

Записать элементы массива X, удовлетворяющие условию в массив Y; найти минимальный элемент массива X - C++
4. Записать элементы массива X, удовлетворяющие условию Х, подряд в массив Y =. Определить минимальный элемент массива X.

Определить номер столбца массива, в котором расположен минимальный элемент четвертой строки массива - C++
Доброго времени суток, помогите пожалуйста решить задачи по C++ 3)Дан двумерный массив. Определить: a) номер столбца, в котором...

Найти минимальный элемент массива (через указатели, запрещено обращаться к элементам массива по индексам) - C++
Написать программу, создающую массив из 10 случайных целых чисел из отрезка . Вывести на экран весь массив и на ...

Поменять местами минимальный и максимальный элемент массива V[25] и подсчитать количество парных элементов массива - C++
Поменять местами минимальный и максимальный элемент массива V и подсчитать количество парных элементов массива


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.11.2011, 15:49
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru