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

Ввести с клавиатуры массив из N чисел (N также вводится с клавиатуры). Найти наименьший из его положительных элементов. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 140, средняя оценка - 4.66
Павлов
Сообщений: n/a
04.01.2011, 00:42     Ввести с клавиатуры массив из N чисел (N также вводится с клавиатуры). Найти наименьший из его положительных элементов. #1
Ввести с клавиатуры массив из N чисел (N также вводится с клавиатуры). Найти наименьший из его положительных элементов.
Начиная от этого элемента и до конца массива, упорядочить все элементы по убыванию.
Если положительных элементов в массиве нет, вывести сообщение.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2011, 00:42     Ввести с клавиатуры массив из N чисел (N также вводится с клавиатуры). Найти наименьший из его положительных элементов.
Посмотрите здесь:

Ввести с клавиатуры массив целых чисел и вывести его на экран в виде матрицы C++
C++ Ввести по строкам с клавиатуры двумерный массив и вычислить среднее арифметическое его элементов
C++ Как ввести двумерный массив с клавиатуры? Его размерность [n][m] нужно задавать с клавиатуры.
C++ Ввести по строкам с клавиатуры двумерный массив и вычислить среднее арифметическое его элементов
Ввести по строкам с клавиатуры двумерный массив и вычислить среднее арифметическое его элементов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.01.2011, 01:04     Ввести с клавиатуры массив из N чисел (N также вводится с клавиатуры). Найти наименьший из его положительных элементов. #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
46
47
48
49
50
51
52
53
54
55
56
57
#include <iostream>
#include <algorithm>
#include <iterator>
#include <vector>
#include <functional>
 
struct comparer:public std::binary_function<int, int, bool>
{
    result_type operator () (first_argument_type fir, 
        second_argument_type sec)
    {
        if(fir > 0 && sec > 0)
        {
            return fir < sec;
        }
        return false;
    }
};
 
struct checker:public std::unary_function<int, bool>
{
    int i;
    checker(int t=0):i(t)
    {
    }
    result_type operator () (argument_type one)
    {
        if(one > 0)
        {
            ++i;
            return true;
        }
        return false;
    }
};
 
int main()
{
    typedef std::vector<int> T_vec;
    typedef std::istream_iterator<int> I_ss;
    typedef std::ostream_iterator<int> O_ss;
    typedef std::vector<int>::iterator T_i;
    
    T_vec Vec;
    std::copy(I_ss(std::cin), I_ss(), std::back_inserter(Vec));
    checker check=std::for_each(Vec.begin(), Vec.end(), checker());
    if(check.i == 0)
    {
        std::cerr<<"There is no positive elements\n";
        return 1;
    }
    T_i iter=std::min_element(Vec.begin(), Vec.end(), comparer());
    std::cout<<"Min element is: "<< *iter <<'\n';
    std::sort(iter+1, Vec.end(), std::greater<int>());
    std::copy(Vec.begin(), Vec.end(), std::ostream_iterator<int>(std::cout, " "));
    return 0;
}
igorrr37
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 7
04.01.2011, 01:23     Ввести с клавиатуры массив из N чисел (N также вводится с клавиатуры). Найти наименьший из его положительных элементов. #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
34
#include <iostream>
#include <stdio.h>
#include<algorithm>
using namespace std;
 
main()
{
    int n, min=-1, imin;
    cout<<"enter n\n";
    cin>>n;
    int *mas=new int[n];
    for(int i=0;i<n;i++){
        printf("mas[%d]= ", i);
        cin>>mas[i];
        if(mas[i]>0){
            min=mas[i];
            imin=i;
        }
    }
    if(min==-1){
        cout<<"\nelementov net\n";
        return 0;
    }
    for(int i=0;i<n;i++)
        if(mas[i]>0&&mas[i]<min){
            min=mas[i];
            imin=i;
        }
        cout<<"index min elementa= "<<imin<<endl;
    sort(mas+imin, mas+n, greater<int>());
    for(int i=0;i<n;i++){
        cout<<mas[i]<<" ";
    }
}
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
04.01.2011, 02:21     Ввести с клавиатуры массив из N чисел (N также вводится с клавиатуры). Найти наименьший из его положительных элементов. #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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
 
using namespace std;
int main()
{
    setlocale( LC_ALL,"Russian" );
    cout<<"Введите размер массива"<<endl;
    int size;
    cin>>size;
    int* p=new int[size];
    for(int i=0;i<size;i++)
    {
        cout<<"Введите "<<i+1<<" элемент массива"<<endl;
        cin>>p[i];
    }
    cout<<"Ваш массив"<<endl;
    for(int i=0;i<size;i++)
        cout<<p[i]<<" ";
    cout<<endl;
    int num=0;
    int min=p[0];
    for(int i=0,j=1;j<size;i++,j++)
    {
        if(p[j]>=0&&(p[i]<0||p[i]>p[j]))
            {
                min=p[j];
                if(p[num]!=p[j])num=j;
            }
    }
    if(min<0)cout<<"Все элементы отрицательные!"<<endl;
    else if(num!=size-1)
    {
        int tmp=0;
        for(int k=num;k<size;k++)
        {
            for(int i=num,j=num+1;j<size;i++,j++)
            {
                if(p[j]>p[i])
                {
                    tmp=p[j];
                    p[j]=p[i];
                    p[i]=tmp;
                }
            }
        }
 
        cout<<"Результат"<<endl;
        for(int i=0;i<size;i++)
                cout<<p[i]<<" ";
        cout<<endl;
    }
    delete[]p;
return 0;
 
}
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
04.01.2011, 03:02     Ввести с клавиатуры массив из N чисел (N также вводится с клавиатуры). Найти наименьший из его положительных элементов. #5
ForEveR, у тебя с СБШ получилось длиннее, чем без неё :) . А можно сделать эффективнее:
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
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
 
int main () {
    std::vector<int> numbers;
    
    std::cout << "Введите массив: ";
    std::copy(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(), std::back_inserter(numbers));
    std::vector<int>::iterator minimum = numbers.begin();
    
    for (std::vector<int>::iterator i = numbers.begin(); i != numbers.end(); ++i) {
        if (*i > 0) {
            if (*minimum < 1) minimum = i;
            else if (*i < *minimum) minimum = i;
        }
    }
    
    if (minimum != numbers.end() && *minimum > 0) {
        std::cout << "Наименьший положительный элемент массива: " << *minimum << std::endl;
        
        std::sort(numbers.rbegin(), std::reverse_iterator<std::vector<int>::iterator>(minimum));
 
        std::cout << "Отсортированный массив: ";
        std::copy(numbers.begin(), numbers.end(), std::ostream_iterator<int>(std::cout, " "));
    } else std::cout << "В массиве нет положительных элементов." << std::endl;
 
    return 0;
}
vx5
 Аватар для vx5
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
04.01.2011, 03:08     Ввести с клавиатуры массив из N чисел (N также вводится с клавиатуры). Найти наименьший из его положительных элементов. #6
Цитата Сообщение от volovzi Посмотреть сообщение
ForEveR, у тебя с СБШ получилось длиннее, чем без неё . А можно сделать эффективнее
это тоже не особо изящно) наподключали библиотек дабы сократить пару строк в простейшей программе
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.01.2011, 03:33     Ввести с клавиатуры массив из N чисел (N также вводится с клавиатуры). Найти наименьший из его положительных элементов. #7
volovzi, Ну я делал без циклов и только с использование STL, и своих функторов. Мне просто так сейчас интереснее и я не гонюсь за кол-вом строчек в коде)
NightmareZ
 Аватар для NightmareZ
1336 / 559 / 37
Регистрация: 31.03.2009
Сообщений: 1,907
04.01.2011, 05:22     Ввести с клавиатуры массив из N чисел (N также вводится с клавиатуры). Найти наименьший из его положительных элементов. #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
 
int main()
{
    typedef std::vector<int> Vec;
    typedef Vec::iterator It;
 
    Vec vec((std::istream_iterator<int>(std::cin)),
             std::istream_iterator<int>());
 
    It min = vec.begin();
    for (It it = vec.begin(); it != vec.end(); it++)
        if (*it > 0 && *it < *min) min = it;
 
    std::sort(min + 1, vec.end(), [](int x, int y) { return x > y; });
 
    std::for_each(vec.begin(), vec.end(), [](int x) { std::cout << x << " "; });
    return 0;
}
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
04.01.2011, 14:02     Ввести с клавиатуры массив из N чисел (N также вводится с клавиатуры). Найти наименьший из его положительных элементов. #9
vx5, не скажи, сокращение всё-таки довольно существенное.

ForEveR, понятно. Но всё равно у тебя не очень алгоритмически эффективно реализовано, потому что ты два раза проходишь по массиву: отдельно для подсчёта положительных элементов и отдельно для поиска минимума.

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

Добавлено через 32 минуты
Предлагаю вашему вниманию улучшенный вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <functional>
 
int main () {
    std::cout << "Введите массив: ";
    std::vector<int> numbers(std::istream_iterator<int>(std::cin), std::istream_iterator<int>());
    
    std::vector<int>::iterator minimum = std::find_if(numbers.begin(), numbers.end(), std::bind2nd(std::greater<int>(), 0));
    for (std::vector<int>::iterator i = minimum; i != numbers.end(); ++i) if (*i > 0 && *i < *minimum) minimum = i;
    
    if (minimum != numbers.end()) {
        std::cout << "Наименьший положительный элемент массива: " << *minimum << std::endl;
        
        std::sort(minimum, numbers.end(), std::greater<int>());
        std::cout << "Отсортированный массив: ";
        std::copy(numbers.begin(), numbers.end(), std::ostream_iterator<int>(std::cout, " "));
    } else std::cout << "В массиве нет положительных элементов." << std::endl;
 
    return 0;
}
NightmareZ
 Аватар для NightmareZ
1336 / 559 / 37
Регистрация: 31.03.2009
Сообщений: 1,907
04.01.2011, 14:36     Ввести с клавиатуры массив из N чисел (N также вводится с клавиатуры). Найти наименьший из его положительных элементов. #10
Цитата Сообщение от volovzi Посмотреть сообщение
Но программа у тебя написана неправильно. Во-первых, поиск минимума у тебя организован неправильно (см. мою программу)
Что значит "неправильно"?
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
04.01.2011, 14:58     Ввести с клавиатуры массив из N чисел (N также вводится с клавиатуры). Найти наименьший из его положительных элементов. #11
Это значит, что, например, в случае, если первый элемент массива не положителен, то положительный минимум найден не будет.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.01.2011, 16:56     Ввести с клавиатуры массив из N чисел (N также вводится с клавиатуры). Найти наименьший из его положительных элементов. #12
volovzi, С использованием лямбда функций будет проходить 1 раз только.
Ммм... нет. не катит. использование min_element видимо тут не кстати.

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 <iterator>
#include <algorithm>
#include <vector>
#include <functional>
 
int main()
{
    std::vector<int> Vec((std::istream_iterator<int>(std::cin)),
         std::istream_iterator<int>());
    int cnt=0;
    std::vector<int>::iterator min=std::min_element(Vec.begin(), Vec.end(), [&cnt](int x, int y) -> bool
    {
         if(x > 0 && y > 0)
         { 
             ++cnt; 
             return x < y;
         }
         return false;
    });
    if(cnt)
    {
        std::cout<<"Minimum is: "<<*min<<'\n';
        std::sort(min+1, Vec.end(), std::greater<int>());
        std::copy(Vec.begin(), Vec.end(), std::ostream_iterator<int>(std::cout, " "));
    }
    else
    {
        std::cout<<"There is no positive elements\n";
        return 1;
    }
    return 0;
}
volovzi
266 / 168 / 8
Регистрация: 14.03.2010
Сообщений: 501
04.01.2011, 17:24     Ввести с клавиатуры массив из N чисел (N также вводится с клавиатуры). Найти наименьший из его положительных элементов. #13
ForEveR, типтого, хотя, мне кажется, что использование лямбды здесь всё-таки излишне. Лямбды, по сути, нужны для упрощения, а тут получилось наоборот, сложнее.

Кстати,
не «There is no», а «there aren't any» :) .
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2011, 17:31     Ввести с клавиатуры массив из N чисел (N также вводится с клавиатуры). Найти наименьший из его положительных элементов.
Еще ссылки по теме:

C++ Ввести по строкам с клавиатуры двумерный массив и вычислить среднее арифметическое его элементов
Ввести c клавиатуры массив из 5 элементов, найти минимальный из них C++
Ввести c клавиатуры массив из 5 элементов, найти среднее арифметическое всех элементов массива C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.01.2011, 17:31     Ввести с клавиатуры массив из N чисел (N также вводится с клавиатуры). Найти наименьший из его положительных элементов. #14
В порядке общего бреда...

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
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>
#include <functional>
 
template<class Iter, class Comp>
Iter find_min_pos(Iter first, Iter last, Comp cmp)
{
    Iter found=first;
    if(first != last)
    {
        while(++first != last)
        {
            if(*found < 0)
                found=first;
            if(cmp(*first, *found))
            {
                    found=first;
            }
        }
    }
    return found;
}
 
int main()
{
    std::vector<int> Vec((std::istream_iterator<int>(std::cin)),
         std::istream_iterator<int>());
    int cnt=0;
    std::vector<int>::iterator min=find_min_pos(Vec.begin(), Vec.end(), [&cnt](int x, int y) -> bool
    {
        if (x > 0 && y > 0)
        {
            ++cnt;
            return x < y;
        }
        return false;
    });
    if(cnt)
    {
        std::cout<<"Minimum is: "<<*min<<'\n';
        std::sort(min+1, Vec.end(), std::greater<int>());
        std::copy(Vec.begin(), Vec.end(), std::ostream_iterator<int>(std::cout, " "));
    }
    else
    {
        std::cout<<"All elements are negative\n";
        system("pause");
        return 1;
    }
    system("pause");
    return 0;
}
Yandex
Объявления
04.01.2011, 17:31     Ввести с клавиатуры массив из N чисел (N также вводится с клавиатуры). Найти наименьший из его положительных элементов.
Ответ Создать тему
Опции темы

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