Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 140, средняя оценка - 4.66
павлов
0 / 0 / 0
Регистрация: 30.03.2017
Сообщений: 1
#1

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

04.01.2011, 00:42. Просмотров 23824. Ответов 13
Метки нет (Все метки)

Ввести с клавиатуры массив из N чисел (N также вводится с клавиатуры). Найти наименьший из его положительных элементов.
Начиная от этого элемента и до конца массива, упорядочить все элементы по убыванию.
Если положительных элементов в массиве нет, вывести сообщение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2011, 00:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ввести с клавиатуры массив из N чисел (N также вводится с клавиатуры). Найти наименьший из его положительных элементов. (C++):

Ввести массив с клавиатуры и найти количество его элементов - C++
Две связанные между собой задачи: 6. Напишите программу, использующую следующие функции: Fill_array() принимает в качестве...

Сформировать массив из 12 элементов. Найти заданный элемент (вводится с клавиатуры) и вывести его индекс - C++
Сформировать массив из 12 элементов случайным образом. Вывести его. Найти заданный элемент (вводится с клавиатуры) и вывести его...

Как ввести двумерный массив с клавиатуры? Его размерность [n][m] нужно задавать с клавиатуры. - C++
Привет всем. Как ввести двумерный массив с клавиатуры? Его размерность нужно задавать с клавиатуры.

Ввести с клавиатуры массив целых чисел и вывести его на экран в виде матрицы - C++
Ввести с клавиатуры массив целых чисел и вывести его на экран в виде матрицы 3 * 3 (двохмирний массив)

Ввести по строкам с клавиатуры двумерный массив и вычислить среднее арифметическое его элементов - C++
Ввести по строкам с клавиатуры двумерный массив и вычислить среднее арифметическое его элементов . Хочу понять как это делается напишите...

Ввести по строкам с клавиатуры двумерный массив и вычислить среднее арифметическое его элементов - C++
float v ; int i,j; int kk; float sr; float sum=0; for(int i=0; i<kk;i=i+1) cout<<endl<<"v="; cin>>v; for(int j=0;...

13
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
04.01.2011, 01:04 #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;
}
0
igorrr37
1718 / 1346 / 167
Регистрация: 21.12.2010
Сообщений: 2,069
Записей в блоге: 10
04.01.2011, 01:23 #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]<<" ";
    }
}
0
st_dent
64 / 64 / 3
Регистрация: 05.07.2010
Сообщений: 219
04.01.2011, 02:21 #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;
 
}
0
volovzi
268 / 170 / 8
Регистрация: 14.03.2010
Сообщений: 501
04.01.2011, 03:02 #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;
}
0
vx5
187 / 171 / 4
Регистрация: 04.09.2010
Сообщений: 656
04.01.2011, 03:08 #6
Цитата Сообщение от volovzi Посмотреть сообщение
ForEveR, у тебя с СБШ получилось длиннее, чем без неё . А можно сделать эффективнее
это тоже не особо изящно) наподключали библиотек дабы сократить пару строк в простейшей программе
0
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
04.01.2011, 03:33 #7
volovzi, Ну я делал без циклов и только с использование STL, и своих функторов. Мне просто так сейчас интереснее и я не гонюсь за кол-вом строчек в коде)
0
NightmareZ
1382 / 594 / 38
Регистрация: 31.03.2009
Сообщений: 1,978
04.01.2011, 05:22 #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;
}
0
volovzi
268 / 170 / 8
Регистрация: 14.03.2010
Сообщений: 501
04.01.2011, 14:02 #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;
}
0
NightmareZ
1382 / 594 / 38
Регистрация: 31.03.2009
Сообщений: 1,978
04.01.2011, 14:36 #10
Цитата Сообщение от volovzi Посмотреть сообщение
Но программа у тебя написана неправильно. Во-первых, поиск минимума у тебя организован неправильно (см. мою программу)
Что значит "неправильно"?
0
volovzi
268 / 170 / 8
Регистрация: 14.03.2010
Сообщений: 501
04.01.2011, 14:58 #11
Это значит, что, например, в случае, если первый элемент массива не положителен, то положительный минимум найден не будет.
0
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
04.01.2011, 16:56 #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;
}
0
volovzi
268 / 170 / 8
Регистрация: 14.03.2010
Сообщений: 501
04.01.2011, 17:24 #13
ForEveR, типтого, хотя, мне кажется, что использование лямбды здесь всё-таки излишне. Лямбды, по сути, нужны для упрощения, а тут получилось наоборот, сложнее.

Кстати,
не «There is no», а «there aren't any» :) .
1
ForEveR
В астрале
Эксперт С++
7988 / 4747 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
04.01.2011, 17:31 #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;
}
0
04.01.2011, 17:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.01.2011, 17:31
Привет! Вот еще темы с ответами:

Ввести по строкам с клавиатуры двумерный массив и вычислить среднее арифметическое его элементов - C++
#include &quot;stdafx.h&quot; #include&quot;iostream&quot; using namespace std; int _tmain(int argc, _TCHAR* argv) { float v ; int i,j; int kk; ...

Ввести по строкам с клавиатуры двумерный массив и вычислить среднее арифметическое его элементов - C++
Ребят, надо написать программу, которая вводит по строкам с клавиатуры двумерный массив и вычисляет среднее арифметическое его...

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

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


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

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

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