Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
maksim_kit
-4 / 0 / 0
Регистрация: 25.02.2016
Сообщений: 34
1

Найти самое минимальное неотрицательное число в массиве

26.02.2016, 01:15. Просмотров 330. Ответов 5
Метки нет (Все метки)

Найти самое минимальное не отрицательное число в массиве, от всех значений отнять полученное число.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2016, 01:15
Ответы с готовыми решениями:

В массиве найти самое большое симметричное число
Здравствуйте! Помогите, пожалуйста, с задачей: в целочисленном массиве найти...

Найти в массиве самое большое число и заменить его на 9
3. Ввести с клавиатуры массив из К чисел (К также вводится с клавиатуры). Затем...

Найти самое большое нечётное число в двухмерном массиве
Пользователь вводит массив 3х3. Программа находит самое большое нечётное число...

Найти минимальное трехзначное число, записанное в массиве
Дан целочисленный массив из 30 элемента, все элементы которого –...

Найти минимальное трехзначное число, записанное в динамическом массиве
// Е_С2_25) Дан целочисленный массив из 30 элемента, //все элементы которого...

5
ViktorNMax
54 / 54 / 41
Регистрация: 20.12.2012
Сообщений: 257
26.02.2016, 01:28 2
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
 
using namespace std;
 
int main(void) {
    int num, *mas, min = 0;
 
    setlocale(0, "");
 
    cout << "Введите количество елементов в массиве ";
    cin >> num;
    mas = new int[num];
 
    cout << "Вводите значения массива через пробел: " << endl;
 
    for (int i = 0; i < num; i++) {
        cin >> mas[i];
    }
 
    for (int i = 0; i < num; i++) {
        if (mas[i] > 0) {
            if (min == 0)
                min = mas[i];
            else
                if (mas[i] < min)
                    min = mas[i];
        }
    }
 
    for (int i = 0; i < num; i++) {
        mas[i] -= min;
    }
 
    cout << "Полученный массив: " << endl;
 
    for (int i = 0; i < num; i++) {
        cout << mas[i] << ' ';
    }
 
    delete[] mas;
 
    system("PAUSE");
 
    return 0;
}
1
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,585
Записей в блоге: 2
Завершенные тесты: 1
26.02.2016, 01:47 3
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
32
33
#include <iostream>
#include <algorithm>
#include <iterator>
 
int main()
{
    int arr[] = {-8, -3, 9, -5, 4, -4, -3, 8};
    auto min_it = std::min_element
        (
        std::find_if
            (
                std::begin(arr), 
                std::end(arr),
                [](auto x)
                {
                    return x>=0;
                }
            ),
        std::end(arr), 
        [](auto f, auto s)
            {
                return f>=0 && f<s;
            }
        );
    if( min_it!=std::end(arr) ){
        for(auto& e: arr){
            e -= *min_it;
            std::cout << e << ' ' ;
        }
    }else{
        std::cerr << "positive element not found\n";
    }
}
http://rextester.com/KXS54295
1
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4772 / 2429 / 679
Регистрация: 18.10.2014
Сообщений: 4,153
26.02.2016, 05:51 4
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
2
3
4
            [](auto f, auto s)
            {
               return f>=0 && f<s;
            }
Так на самом деле нельзя.

Раздел 25.4 Sorting and related operations требует, чтобы компаратор, передаваемый в [почти все] алгоритмы этого раздела соответствовал требованиям strict weak ordering. Это требование распространяется и на 'std::min_element'. Ваш компаратор этому требованию не соответствует.

Например, для вашего компаратора вход (-1, +1) возвращает false и вход (+1, -1) тоже возвращает false, т.е. ваш компаратор считает, что -1 эквивалентно +1. И вообще, согласно вашему компаратору, любое отрицательное число эквивалентно любому положительному числу. А это значит, по транзитивности, что вообще все числа эквивалентны.

Это противоречит тому, что вход (1, 2) возвращает true, а вход (2, 1) - false, т.е. эквивалентности 1 и 2 не наблюдается. Т.е. ваш компаратор не является корректной реализацией strict weak ordering.

Определение 'std::min_element' в стандарте языка говорит, что 'std::min_element' возвращает первый итератор 'i', такой что все пары (*j, *i) возвращают false для всех итераторов 'j' в диапазоне. То есть "каноническая"/"по-определению" реализация 'std::min_element' будет выглядеть примерно так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
template <typename IT, typename C> IT min_element(IT b, IT e, C c)
{
  IT i = b;
  for (; i != e; ++i)
  {
    IT j = b;
    for (; j != e; ++j)
      if (c(*j, *i))
        break;
 
   if (j == e)
     break;
  }
 
  return i;
}
Если проигнорировать формальную некорректность вашего компаратора, то при использовании такой "канонической" реализации с вашим компаратором на массиве, скажем, '{9, -5, 4, -4, -3, 8}' в качестве минимального элемента будет найден элемент '-5'. А это ведь совсем не то, что нужно вашей реализации.

Разумеется, в реальности алгоритм 'std::min_element' реализуется не так, а более эффективно. Он может быть реализован более эффективно и при этом удовлетворять определению именно из-за требования strict weak ordering, накладываемого на компаратор.

Именно комбинация этой оптимизации с вашим формально некорректным компаратором в результате порождает внешне работоспособный код. Т.е. традиционная реализация 'std::min_element' с вашим компаратором на массиве '{9, -5, 4, -4, -3, 8}' находит элемент '4', как вы и хотели. (Хоть это и противоречит стандартному определению 'std::min_element').

Но это не более чем хак и счастливое совпадение. Формально ваше применение 'std::min_element' с таким компаратором некорректно.
1
Croessmah
++Ͻ
14630 / 8379 / 1582
Регистрация: 27.09.2012
Сообщений: 20,585
Записей в блоге: 2
Завершенные тесты: 1
26.02.2016, 06:47 5
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Но это не более чем хак и счастливое совпадение.
Я в курсе, но в gcc оно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
  template<typename _ForwardIterator, typename _Compare>
    _ForwardIterator
    __min_element(_ForwardIterator __first, _ForwardIterator __last,
          _Compare __comp)
    {
      if (__first == __last)
    return __first;
      _ForwardIterator __result = __first;
      while (++__first != __last)
    if (__comp(__first, __result))
      __result = __first;
      return __result;
    }
Никакого шаманства, вроде
Но за замечание благодарен
Где-то в другом месте может быть по другому, тут Вы правы.
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4772 / 2429 / 679
Регистрация: 18.10.2014
Сообщений: 4,153
26.02.2016, 07:32 6
Цитата Сообщение от Croessmah Посмотреть сообщение
Я в курсе, но в gcc оно так:
О том и речь. Если компаратор удовлетворяет SWO, то реализация из GCC будет эквивалентна лобовой "канонической" реализации, но при этом будет работать намного эффективнее.

Но если компаратор не удовлетворяет SWO, то реализация из GCC уже не совпадает с "канонической" и ведет себя "неправильно" (формально, разумеется, поведение вообще не определено). Вы просто тихонько подсмотрели реализацию в GCC и поняли, что ваш компаратор вкупе с такой реализацией будет давать желаемый вами результат. Но это на само деле не более чем завязка на скрытые детали реализации (примерно как в том громком случае, когда кто-то завязался на то, что 'memcpy' копирует память именно от младших адресов к старшим).
0
26.02.2016, 07:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.02.2016, 07:32

Найти и вывести минимальное трехзначное число, записанное в массиве
Дан целочисленный массив из 30 элемента, все элементы которого –...

В массиве из целых чисел найти минимальное простое число
Вообщем задача звучит так: &quot;В массиве из целых чисел найти минимальное простое...

Найти в массиве самое маленькое нечетное число и вывести его на экран
Помогите написать программу: Исходными данными являются массив из 10...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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