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

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

Войти
Регистрация
Восстановить пароль
 
meowsaw
0 / 0 / 0
Регистрация: 05.06.2012
Сообщений: 29
#1

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

05.06.2012, 16:07. Просмотров 649. Ответов 19
Метки нет (Все метки)

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

C++ Вычислить минимальный по модулю элемент массива
Вычислить минимальный по модулю элемент массива C++
C++ Вычислить минимальный по модулю элемент массива
C++ В одномерном массиве вычислить минимальный элемент
Вычислить минимальный по модулю элемент массива C++
Вычислить минимальный по модулю элемент массива C++
Вычислить минимальный по модулю элемент массива C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Кот Ангенс
317 / 267 / 38
Регистрация: 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
41 / 41 / 1
Регистрация: 24.11.2009
Сообщений: 165
05.06.2012, 16:35     Вычислить минимальный элемент #3
Кот Ангенс
хороший пример, но слишком мне кажется общий. для человека, который самые основы не знает, шаблонные функции будут только всё усложнять =)

Добавлено через 2 минуты
ммм кстати, вы вначале принимаете за минимальный элемент = 0, а если в массиве все отрицательные числа, и нет нуля?
lowercase
212 / 201 / 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
41 / 41 / 1
Регистрация: 24.11.2009
Сообщений: 165
05.06.2012, 16:50     Вычислить минимальный элемент #5
тогда вначале минимальному елемету надо присвоить первый елемент масива
я это знаю =) ещё можно присвоить наименьшее значение для типа, ну например для int вроде -32с чем то тысяч, т.к. для int - меньше числа быть не может, то в массиве точно найдется хоть один больше такого значения
grizlik78
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,989
05.06.2012, 16:57     Вычислить минимальный элемент #6
Цитата Сообщение от bLesk Посмотреть сообщение
ммм кстати, вы вначале принимаете за минимальный элемент = 0, а если в массиве все отрицательные числа, и нет нуля?
Нулём принимается индекс минимального элемента, а не значение. Так что всё правильно будет работать.
bLesk
41 / 41 / 1
Регистрация: 24.11.2009
Сообщений: 165
05.06.2012, 17:08     Вычислить минимальный элемент #7
Цитата Сообщение от grizlik78 Посмотреть сообщение
Нулём принимается индекс минимального элемента, а не значение. Так что всё правильно будет работать.
действительно, прошу прощения =)
grizlik78
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,989
05.06.2012, 17:11     Вычислить минимальный элемент #8
Название переменной min, просто, неудачное. Лучше было бы i_min какое-нибудь.
Кот Ангенс
317 / 267 / 38
Регистрация: 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,587
Записей в блоге: 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
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,989
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,587
Записей в блоге: 12
06.06.2012, 15:21     Вычислить минимальный элемент #13
Цитата Сообщение от grizlik78 Посмотреть сообщение
Van111, в случае перекрывающихся областей вместо memcpy() следует использовать memmove().
тут такой проблемы не возникнет

Добавлено через 16 секунд
Цитата Сообщение от grizlik78 Посмотреть сообщение
Van111, в случае перекрывающихся областей вместо memcpy() следует использовать memmove().
тут такой проблемы не возникнет
grizlik78
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,989
06.06.2012, 16:07     Вычислить минимальный элемент #14
Цитата Сообщение от Van111 Посмотреть сообщение
тут такой проблемы не возникнет
Это почему? Хотя знаю почему. Потому что вызов в таком виде вообще не скомпилируется
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,587
Записей в блоге: 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
1139 / 856 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
06.06.2012, 21:04     Вычислить минимальный элемент #16
Van111, ага, что приводит к undefined behavior. Область, из которой копируется, не должна пересекаться с областью, в которую копируется.
grizlik78
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,989
06.06.2012, 21:16     Вычислить минимальный элемент #17
Цитата Сообщение от Van111 Посмотреть сообщение
вот специально из за вас привёл код в работу
Специально из-за меня! Какая честь!
Toshkarik прав, это неопределённое поведение. То, что всё работает — просто повезло. Вернее не повезло, так как реально есть системы, где этот код будет работать неправильно. И некоторые пользователи федоры ощутили это "на своей шкуре".
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,587
Записей в блоге: 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
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,989
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++ Вычислить минимальный элемент массива
Вычислить минимальный элемент одномерного массива C++
C++ Вычислить минимальный элемент одномерного массива

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

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

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