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

Вычислить минимальный элемент - C++

Восстановить пароль Регистрация
 
meowsaw
0 / 0 / 0
Регистрация: 05.06.2012
Сообщений: 29
05.06.2012, 16:07     Вычислить минимальный элемент #1
В одномерном массиве вычислить минимальный элемент и вытолкнуть его из массива.
Помогите пож.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2012, 16:07     Вычислить минимальный элемент
Посмотрите здесь:

C++ одномерном массиве, состоящем из n вещественных, вычислить минимальный элемент массива
C++ В одномерном массиве вычислить минимальный элемент
Вычислить минимальный по модулю элемент массива C++
C++ В одномерном массиве вычислить минимальный по модулю элемент массива
вычислить минимальный по мо-дулю элемент массива C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
05.06.2012, 16:29     Вычислить минимальный элемент #2
C++
1
2
3
4
5
6
7
8
template <typename T>
void RemoveMin(T a[ ], unsigned n) {
    unsigned min = 0;
    for (unsigned i = 1; i < n; i++)
        if (a[i] < a[min])
            min = i;
    a[min] = a[n - 1];
}
bLesk
 Аватар для bLesk
40 / 40 / 1
Регистрация: 24.11.2009
Сообщений: 165
05.06.2012, 16:35     Вычислить минимальный элемент #3
Кот Ангенс
хороший пример, но слишком мне кажется общий. для человека, который самые основы не знает, шаблонные функции будут только всё усложнять =)

Добавлено через 2 минуты
ммм кстати, вы вначале принимаете за минимальный элемент = 0, а если в массиве все отрицательные числа, и нет нуля?
lowercase
 Аватар для lowercase
211 / 200 / 34
Регистрация: 09.05.2012
Сообщений: 494
05.06.2012, 16:47     Вычислить минимальный элемент #4
както так.. громоздко(иза выталкивания) но работает. иначе хз как.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream.h>
#include <conio.h>
 
int main(){
    cout << "enter array size: ";
    int n; cin >> n;
    int *a = new int[n];
    for(int i = 0; i < n; i++){
        cout << "enter a["<<i+1<<"]: ";
        cin >> a[i];
    }
    int min = a[0];
    for(int i = 1; i < n; i++)
        if(a[i] < min) min = a[i];
 
    int ns = n;
    for(int i = 0; i < n; i++)
        if(a[i] == min) ns--;
 
    int *t = new int[ns];
    int k = 0;
    for(int i = 0; i < n; i++){
        if(a[i] != min) t[k++] = a[i];
    }
    a = t;
    delete[] t;
    for(int i = 0; i < ns; i++)
        cout << t[i] << endl;
    delete[] a;
    getch();
}
Добавлено через 1 минуту
Цитата Сообщение от bLesk Посмотреть сообщение
а если в массиве все отрицательные числа, и нет нуля?
тогда вначале минимальному елемету надо присвоить первый елемент масива. а в примере от Кот Ангенс, не минимальный елемент, а индекс минимального
bLesk
 Аватар для bLesk
40 / 40 / 1
Регистрация: 24.11.2009
Сообщений: 165
05.06.2012, 16:50     Вычислить минимальный элемент #5
тогда вначале минимальному елемету надо присвоить первый елемент масива
я это знаю =) ещё можно присвоить наименьшее значение для типа, ну например для int вроде -32с чем то тысяч, т.к. для int - меньше числа быть не может, то в массиве точно найдется хоть один больше такого значения
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
05.06.2012, 16:57     Вычислить минимальный элемент #6
Цитата Сообщение от bLesk Посмотреть сообщение
ммм кстати, вы вначале принимаете за минимальный элемент = 0, а если в массиве все отрицательные числа, и нет нуля?
Нулём принимается индекс минимального элемента, а не значение. Так что всё правильно будет работать.
bLesk
 Аватар для bLesk
40 / 40 / 1
Регистрация: 24.11.2009
Сообщений: 165
05.06.2012, 17:08     Вычислить минимальный элемент #7
Цитата Сообщение от grizlik78 Посмотреть сообщение
Нулём принимается индекс минимального элемента, а не значение. Так что всё правильно будет работать.
действительно, прошу прощения =)
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
05.06.2012, 17:11     Вычислить минимальный элемент #8
Название переменной min, просто, неудачное. Лучше было бы i_min какое-нибудь.
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
05.06.2012, 19:19     Вычислить минимальный элемент #9
Цитата Сообщение от bLesk Посмотреть сообщение
хороший пример, но слишком, мне кажется, общий.
Спасибо, но автор темы не говорил, из каких элементов состоит массив.
lowercase, похоже, я неправильно понял, что значит "вытолкнуть". Если требуется сдвиг, тогда вот так:
C++
1
2
3
4
5
6
7
8
9
template <typename T>
void RemoveMin(T a[ ], unsigned n) {
    unsigned minInd = 0;
    for (unsigned i = 1; i < n; i++)
        if (a[i] < a[minInd])
            minInd = i;
    while (++minInd < n)
        a[minInd - 1] = a[minInd];
}
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
05.06.2012, 20:24     Вычислить минимальный элемент #10
вот простенький быдло код
C++
1
2
3
4
5
6
7
8
#define size_aray 100
int aray[size_aray],min=aray[0],tmp=0;
for(int i=0;i<size_aray;i++)
{
if (min<aray[i])
{min=aray[i];tmp=i;
}
memcpy(aray[tmp],aray[tmp+1],(size_aray-tmp-1)*sizeof(int))
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
05.06.2012, 21:59     Вычислить минимальный элемент #11
Van111, в случае перекрывающихся областей вместо memcpy() следует использовать memmove().
meowsaw
0 / 0 / 0
Регистрация: 05.06.2012
Сообщений: 29
05.06.2012, 23:40  [ТС]     Вычислить минимальный элемент #12
спасибо большое, ребят
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
06.06.2012, 15:21     Вычислить минимальный элемент #13
Цитата Сообщение от grizlik78 Посмотреть сообщение
Van111, в случае перекрывающихся областей вместо memcpy() следует использовать memmove().
тут такой проблемы не возникнет

Добавлено через 16 секунд
Цитата Сообщение от grizlik78 Посмотреть сообщение
Van111, в случае перекрывающихся областей вместо memcpy() следует использовать memmove().
тут такой проблемы не возникнет
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
06.06.2012, 16:07     Вычислить минимальный элемент #14
Цитата Сообщение от Van111 Посмотреть сообщение
тут такой проблемы не возникнет
Это почему? Хотя знаю почему. Потому что вызов в таком виде вообще не скомпилируется
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
06.06.2012, 20:47     Вычислить минимальный элемент #15
meowsaw, вот правильно работающий код
C++
1
2
3
4
5
6
7
8
9
10
11
int push_min(int aray[])
{
    int min=aray[0],tmp=0;    
    for(int i=0;i<size_aray;i++)
        if (min>aray[i])
        {
            min=aray[i];
            tmp=i;
        }
memcpy(&aray[tmp],&aray[tmp+1],(size_aray-tmp-1)*sizeof(int));    
}
grizlik78, вот специально из за вас привёл код в работу, и все равно я оказался прав ,memcpy достаточно
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
06.06.2012, 21:04     Вычислить минимальный элемент #16
Van111, ага, что приводит к undefined behavior. Область, из которой копируется, не должна пересекаться с областью, в которую копируется.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
06.06.2012, 21:16     Вычислить минимальный элемент #17
Цитата Сообщение от Van111 Посмотреть сообщение
вот специально из за вас привёл код в работу
Специально из-за меня! Какая честь!
Toshkarik прав, это неопределённое поведение. То, что всё работает — просто повезло. Вернее не повезло, так как реально есть системы, где этот код будет работать неправильно. И некоторые пользователи федоры ощутили это "на своей шкуре".
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 12
07.06.2012, 13:02     Вычислить минимальный элемент #18
Цитата Сообщение от grizlik78 Посмотреть сообщение
То, что всё работает — просто повезло. Вернее не повезло, так как реально есть системы, где этот код будет работать неправильно.
я рассчитывал что из рабочих команд memcpy использует только
Assembler
1
2
3
4
mov edi,var1
mov esi,var2
mov ecx,var3
rep movcb
вместо var1, var2, var3 будет конечно стоять [ebp+c],[ebp+8],[ebp+4]

Добавлено через 1 минуту
А Зубков ничего не говорил о том что если области перекрывающиеся то movcb работать не будет
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
07.06.2012, 13:12     Вычислить минимальный элемент #19
Но никто не обещал, что memcpy будет реализована именно так. В glibc-2.12.90-4 вносилось изменение, которое приводит к тому, что на некоторых процессорах копирование выполняется задом наперёд: https://bugzilla.redhat.com/show_bug.cgi?id=638477#c29. Я не хочу здесь разжигать войну по поводу правы разработчики или нет (бесполезность спора видна по этой баге), но формально новая реализация memcpy продолжает соответствовать её описанию, когда для перекрывающихся областей обещается неопределённое поведение.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2012, 13:35     Вычислить минимальный элемент
Еще ссылки по теме:

Вычислить минимальный по модулю элемент массива C++
Вычислить минимальный элемент побочной диагонали матрицы C++
C++ Вычислить минимальный по модулю элемент

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

Или воспользуйтесь поиском по форуму:
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
07.06.2012, 13:35     Вычислить минимальный элемент #20
Ну вот опять же, зачем обсуждать реализацию на коде ассемблера. Это ведь форум C++, у него есть свой стандарт, реализация может абсолютно любая. Мне кажется, это основная ошибка большинства, не нужно смешивать понятия из разных языков, и, более того, разных уровней.
Yandex
Объявления
07.06.2012, 13:35     Вычислить минимальный элемент
Ответ Создать тему
Опции темы

Текущее время: 05:55. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru