Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 05.06.2012
Сообщений: 29
1

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

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

Author24 — интернет-сервис помощи студентам
В одномерном массиве вычислить минимальный элемент и вытолкнуть его из массива.
Помогите пож.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.06.2012, 16:07
Ответы с готовыми решениями:

Вычислить минимальный элемент массива
Вечер добрый.Имеется две задачи:. В одномерном массиве, состоящем из n вещественных элементов...

Вычислить минимальный по модулю элемент
Ребят помогите пожалуйста изменить код что бы искало по "модулю" а не просто минимальный элемент...

Вычислить минимальный элемент массива
Привет всем!! Здесь нужна ваша помощь ребята!! В одномерном массиве, состоящем из п...

Вычислить минимальный по модулю элемент массива
В одномерном массиве , состоящем из n целых элементов , вычислить : 1. минимальный по модулю...

19
320 / 270 / 128
Регистрация: 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];
}
1
42 / 42 / 8
Регистрация: 24.11.2009
Сообщений: 165
05.06.2012, 16:35 3
Кот Ангенс
хороший пример, но слишком мне кажется общий. для человека, который самые основы не знает, шаблонные функции будут только всё усложнять =)

Добавлено через 2 минуты
ммм кстати, вы вначале принимаете за минимальный элемент = 0, а если в массиве все отрицательные числа, и нет нуля?
0
213 / 202 / 85
Регистрация: 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 Посмотреть сообщение
а если в массиве все отрицательные числа, и нет нуля?
тогда вначале минимальному елемету надо присвоить первый елемент масива. а в примере от Кот Ангенс, не минимальный елемент, а индекс минимального
1
42 / 42 / 8
Регистрация: 24.11.2009
Сообщений: 165
05.06.2012, 16:50 5
тогда вначале минимальному елемету надо присвоить первый елемент масива
я это знаю =) ещё можно присвоить наименьшее значение для типа, ну например для int вроде -32с чем то тысяч, т.к. для int - меньше числа быть не может, то в массиве точно найдется хоть один больше такого значения
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
05.06.2012, 16:57 6
Цитата Сообщение от bLesk Посмотреть сообщение
ммм кстати, вы вначале принимаете за минимальный элемент = 0, а если в массиве все отрицательные числа, и нет нуля?
Нулём принимается индекс минимального элемента, а не значение. Так что всё правильно будет работать.
0
42 / 42 / 8
Регистрация: 24.11.2009
Сообщений: 165
05.06.2012, 17:08 7
Цитата Сообщение от grizlik78 Посмотреть сообщение
Нулём принимается индекс минимального элемента, а не значение. Так что всё правильно будет работать.
действительно, прошу прощения =)
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
05.06.2012, 17:11 8
Название переменной min, просто, неудачное. Лучше было бы i_min какое-нибудь.
0
320 / 270 / 128
Регистрация: 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];
}
1
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 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))
1
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
05.06.2012, 21:59 11
Van111, в случае перекрывающихся областей вместо memcpy() следует использовать memmove().
0
0 / 0 / 0
Регистрация: 05.06.2012
Сообщений: 29
05.06.2012, 23:40  [ТС] 12
спасибо большое, ребят
0
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 12
06.06.2012, 15:21 13
Цитата Сообщение от grizlik78 Посмотреть сообщение
Van111, в случае перекрывающихся областей вместо memcpy() следует использовать memmove().
тут такой проблемы не возникнет

Добавлено через 16 секунд
Цитата Сообщение от grizlik78 Посмотреть сообщение
Van111, в случае перекрывающихся областей вместо memcpy() следует использовать memmove().
тут такой проблемы не возникнет
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
06.06.2012, 16:07 14
Цитата Сообщение от Van111 Посмотреть сообщение
тут такой проблемы не возникнет
Это почему? Хотя знаю почему. Потому что вызов в таком виде вообще не скомпилируется
1
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 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 достаточно
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
06.06.2012, 21:04 16
Van111, ага, что приводит к undefined behavior. Область, из которой копируется, не должна пересекаться с областью, в которую копируется.
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
06.06.2012, 21:16 17
Цитата Сообщение от Van111 Посмотреть сообщение
вот специально из за вас привёл код в работу
Специально из-за меня! Какая честь!
Toshkarik прав, это неопределённое поведение. То, что всё работает — просто повезло. Вернее не повезло, так как реально есть системы, где этот код будет работать неправильно. И некоторые пользователи федоры ощутили это "на своей шкуре".
0
290 / 193 / 23
Регистрация: 03.08.2011
Сообщений: 2,824
Записей в блоге: 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 работать не будет
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
07.06.2012, 13:12 19
Но никто не обещал, что memcpy будет реализована именно так. В glibc-2.12.90-4 вносилось изменение, которое приводит к тому, что на некоторых процессорах копирование выполняется задом наперёд: https://bugzilla.redhat.com/sh... 638477#c29. Я не хочу здесь разжигать войну по поводу правы разработчики или нет (бесполезность спора видна по этой баге), но формально новая реализация memcpy продолжает соответствовать её описанию, когда для перекрывающихся областей обещается неопределённое поведение.
1
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
07.06.2012, 13:35 20
Ну вот опять же, зачем обсуждать реализацию на коде ассемблера. Это ведь форум C++, у него есть свой стандарт, реализация может абсолютно любая. Мне кажется, это основная ошибка большинства, не нужно смешивать понятия из разных языков, и, более того, разных уровней.
0
07.06.2012, 13:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.06.2012, 13:35
Помогаю со студенческими работами здесь

Вычислить минимальный по модулю элемент массива
Привет всем :) помогите пожалуйста решить две задачки: 1. В одномерном массиве, состоящем из n...

Вычислить минимальный по модулю элемент массива
Помогите решить задачу! Наработки есть, но... В одномерном массиве, состоящем из n целых...

Вычислить минимальный элемент одномерного массива
В одномерном массиве, состоящем из N действительных элементов, вычислить: n минимальный элемент...

В одномерном массиве вычислить минимальный элемент
В одномерном массиве, состоящем из п вещественных элементов, вычислить: - минимальный элемент...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru