Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
75 / 22 / 12
Регистрация: 01.06.2019
Сообщений: 566
1

Написать процедуру, которая ищет первых N максимальных чисел из массива

16.08.2019, 00:36. Показов 2092. Ответов 13
Метки нет (Все метки)

Сформировать меню вызова функций данной практики по их номеру через switch конструкцию. Результатом выхода из меню является ввод нуля:

1.Написать процедуру, которая ищет первых N максимальных чисел из массива.

2. В массиве хранится информация о результатах 22 спортсменов, участвовавших в соревнованиях по бегу на 100 м.
Написать функцию, которая определить результат спортсмена, занявший второе место.

 Комментарий модератора 
П.5.16.Правил
Запрещено создавать темы с множеством вопросов во всех разделах, кроме разделов платных услуг. Один вопрос - одна тема.

Задачу сделать через функции

Добавлено через 32 минуты
Вот так должен работать 1 код?
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
#include <iostream> 
#include <ctime>
 
using namespace std;
 
//Заполнение массива
void Zap_mas(int arr[], int sz) 
{
    for (int i = 0; i < sz; i++)
    arr[i] = rand() % 50 + 10;
}
 
//Вывод массива
void Vivod_mas(int arr[], int sz) {
    for (int i = 0; i < sz; i++)
        cout << arr[i] << " ";
}
 
//Поиск первых N макс. чисел
void Max_numb(int arr[], int sz, int n) {
    for (int i = 0; i < sz; i++)
        for (int j = sz - 1; j > i; j--)
            if (arr[j] > arr[j - 1])
                swap(arr[j], arr[j - 1]);
    int k = 0;
    for (int i = 0; i < sz - 1; i++) {
        if (arr[i + 1] != arr[i]) {
            k++;
            if (k == n) 
                break;
            if (k == 1) cout << arr[i] << " " << arr[i + 1] << " ";
            else cout << arr[i + 1] << " ";
        }
    }
}
 
 
int main() {
    setlocale(LC_ALL, "rus");
    srand(time(NULL));
    int input = 0, numb = 0;
    const int s = 20;
    int arr[s];
    cout << "Массив: ";
    Zap_mas(arr, s);
    Vivod_mas(arr, s);
    cout << "\nВведите число N: ";
    cin >> numb;
    cout << "\nПервые N чисел: ";
    Max_numb(arr, s, numb);
    system("pause");
}
1

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.08.2019, 00:36
Ответы с готовыми решениями:

Написать процедуру, которая ищет первых N максимальных чисел из массива
Написать процедуру, которая ищет первых N максимальных чисел из массива. Объясню: надо написать...

Написать процедуру и функцию, которая ищет количество положительных чисел в массиве
11) Создать приложение. Написать процедуру и функцию, которая подсчитывает количество положительных...

Разработайте программу, которая содержит процедуру Sum(N,S), которая находит сумму N первых натуральных и найти сумму первых 10,20 чисел
PASCAL Помогите пожалуйста! Решите, заранее спасибо! Разработайте программу, которая содержит...

Написать процедуру нахождения количества максимальных элеметнов массива
Написать процедуру нахождения кол-ва максимальных элеметнов массива

13
812 / 500 / 210
Регистрация: 19.01.2019
Сообщений: 1,196
16.08.2019, 03:49 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
void fill(int* begin, int* end) {
    for (int* it = begin; it != end; ++it) {
        *it = rand() % 10;
    }
}
 
template<typename T>
void print(T begin, T end) {
    for (T it = begin; it != end; ++it) {
        std::cout << *it << ' ';
    }
    std::cout << '\n';
}
 
void printNMaxNums1(int* begin, int* end, size_t nMax) {
    if (nMax == 0 || begin == end) {
        return;
    }
    std::multiset<int> ms;
    for (int* it = begin; it != end; ++it) {
        if (ms.size() < nMax) {
            ms.emplace(*it);
        }
        else if (*it > *ms.begin()) {
            ms.erase(ms.begin());
            ms.emplace(*it);
        }
    }
    print(ms.begin(), ms.end());
}
 
void printNMaxNums2(int* begin, int* end, size_t nMax) {
    std::sort(begin, end);
    print(end - nMax > begin ? end - nMax : begin, end);
}
 
 
int main()
{
    size_t size = 20;
    int* arr = new int[size];
    fill(arr, arr + size);
    print(arr, arr + size);
 
    size_t n;
    std::cout << "Search for [n] max numbers: ";
    std::cin >> n;
    //вариант без изменения исходного массива
    printNMaxNums1(arr, arr + size, n);
    //вариант с сортировкой
    printNMaxNums2(arr, arr + size, n);
 
    delete[] arr;
    return 0;
}
2
567 / 406 / 132
Регистрация: 22.11.2017
Сообщений: 1,043
16.08.2019, 12:24 3
Лучший ответ Сообщение было отмечено Rudman132 как решение

Решение

Rudman132, привет!
Держи код.

Кликните здесь для просмотра всего текста

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
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream> 
#include <random>
#include <algorithm>
 
using namespace std;
 
//Заполнение массива
template<size_t n>
void Zap_mas(int (&arr)[n])
{
    random_device rd;
    mt19937 g{ rd() };
    uniform_int_distribution<> dist(10, 59);
    auto gen = [&g, &dist]() { return dist(g); };
    for (auto& value : arr)
        value = gen();
}
 
//Вывод массива
template<size_t n>
ostream& operator<<(ostream& os, int(&arr)[n])
{
    for (auto value : arr)
        os << value << " ";
    return os;
}
 
//Поиск первых N макс. чисел
template<size_t n>
void Max_numb(int(&arr)[n], int k)
{
    if (k >= n)
        throw out_of_range("k прибывает вне границ массива");
    int* m = new int[n];
    copy(arr, arr + n, m);
    sort(m, m + n, greater<int>());
    for (auto it = m; it != m + k; ++it)
        cout << *it << " ";
    delete[] m;
}
 
 
int main()
{
    setlocale(LC_ALL, "rus");
 
    const size_t s = 20u;
    int arr[s];
    Zap_mas(arr);
    cout << "Массив: ";
    cout << arr;
 
    cout << "\nВведите число N: ";
    size_t numb = 0u;
    cin >> numb;
    cout << "\nПервые N чисел: ";
    try
    {
        Max_numb(arr, numb);
    }
    catch (const out_of_range& oor)
    {
        cout << "Ошибка " << oor.what() << "\n";
        return 1;
    }
    cout << "\n";
 
    system("pause");
    return 0;
}
1
Миниатюры
Написать процедуру, которая ищет первых N максимальных чисел из массива  
357 / 224 / 120
Регистрация: 25.06.2019
Сообщений: 828
16.08.2019, 12:29 4
а выбрать числа без предварительной сортировки?
0
567 / 406 / 132
Регистрация: 22.11.2017
Сообщений: 1,043
16.08.2019, 12:39 5
Цитата Сообщение от Pvt Посмотреть сообщение
а выбрать числа без предварительной сортировки?
Да к это думать больше надо над кодом. А с сортировкой раз и всё решилось.

Добавлено через 7 минут
Цитата Сообщение от Pvt Посмотреть сообщение
а выбрать числа без предварительной сортировки?
Без сортировки, с использованием C++17
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Поиск первых N макс. чисел
template<size_t n>
void Max_numb(int(&arr)[n], int k)
{
    if (k >= n)
        throw out_of_range("k прибывает вне границ массива");
    optional<int>* m = new optional<int>[n];
    copy(arr, arr + n, m);
    for (size_t idx = 0u; idx < k; ++idx)
    {
        auto max_value = max_element(arr, arr + n);
        cout << *max_value << "\n";
        *max_value = {};
    }
    delete[] m;
}
1
75 / 22 / 12
Регистрация: 01.06.2019
Сообщений: 566
16.08.2019, 12:50  [ТС] 6
Цитата Сообщение от SomniPhobia Посмотреть сообщение
Держи код
А можно без алгоритма и указателей?
0
567 / 406 / 132
Регистрация: 22.11.2017
Сообщений: 1,043
16.08.2019, 13:02 7
Цитата Сообщение от Rudman132 Посмотреть сообщение
А можно без алгоритма и указателей?
Можно. Вот без алгоритма и указателей.
Кликните здесь для просмотра всего текста

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream> 
#include <random>
#include <vector>
#include <optional>
 
using namespace std;
 
//Заполнение массива
template<size_t n>
void Zap_mas(int (&arr)[n])
{
    random_device rd;
    mt19937 g{ rd() };
    uniform_int_distribution<> dist(10, 59);
    auto gen = [&g, &dist]() { return dist(g); };
    for (auto& value : arr)
        value = gen();
}
 
//Вывод массива
template<size_t n>
ostream& operator<<(ostream& os, int(&arr)[n])
{
    for (auto value : arr)
        os << value << " ";
    return os;
}
 
//Поиск первых N макс. чисел
template<size_t n>
void Max_numb(int(&arr)[n], int k)
{
    if (k >= n)
        throw out_of_range("k прибывает вне границ массива");
    vector<optional<int>> m(n);
    copy(arr, arr + n, begin(m));
    for (size_t idx0 = 0u; idx0 < k; ++idx0)
    {
        size_t max_idx = 0u, idx = 0u;
        for (const auto& opt : m)
        {
            if (!!opt && *opt > *(m[max_idx]))
            {
                max_idx = idx;
            }
            ++idx;
        }
        cout << *(m[max_idx]) << " ";
        *(m[max_idx]) = {};
    }
    cout << "\n";
}
 
int main()
{
    setlocale(LC_ALL, "rus");
 
    const size_t s = 20u;
    int arr[s];
    Zap_mas(arr);
    cout << "Массив: ";
    cout << arr;
 
    cout << "\nВведите число N: ";
    size_t numb = 0u;
    cin >> numb;
    cout << "\nПервые N чисел: ";
    try
    {
        Max_numb(arr, numb);
    }
    catch (const out_of_range& oor)
    {
        cout << "Ошибка " << oor.what() << "\n";
        return 1;
    }
    cout << "\n";
 
    system("pause");
    return 0;
}

Звёздочки обозначают НЕ указатели, а получение значения из экземпляров optional < T >.
1
6277 / 4261 / 2454
Регистрация: 18.12.2017
Сообщений: 13,286
16.08.2019, 13:07 8
Rudman132, чем не устраивает код, который Вы сбросили в своём первом сообщении ?
0
75 / 22 / 12
Регистрация: 01.06.2019
Сообщений: 566
16.08.2019, 13:09  [ТС] 9
Цитата Сообщение от Yetty Посмотреть сообщение
первом сообщении
Меня устраивает, мне надо знать он правильно работает?
0
6277 / 4261 / 2454
Регистрация: 18.12.2017
Сообщений: 13,286
16.08.2019, 13:34 10
Цитата Сообщение от Rudman132 Посмотреть сообщение
он правильно работает?
нормально вроде работает - сортирует по убыванию и выводит первые N чисел (без повторений).
1
75 / 22 / 12
Регистрация: 01.06.2019
Сообщений: 566
16.08.2019, 13:44  [ТС] 11
Цитата Сообщение от Yetty Посмотреть сообщение
нормально вроде работает
Cпасибо
0
357 / 224 / 120
Регистрация: 25.06.2019
Сообщений: 828
16.08.2019, 13:53 12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//не сортирует, т.е можно дальше использовать и выводит "как есть" 
void Max_numb(int arr[], int sz, int n)
{
    char *f=(char*)calloc(sz,sizeof(char));
    for(; n; n--)
    {
        int imax;
        for(imax=0; f[imax] && imax<sz; imax++);
        for(int i=imax+1; i<sz; i++)
            if(!f[i] && arr[imax]<=arr[i]) imax=i;
        f[imax]=1;
    }
    for(int i=0; i<sz; i++)
            if(f[i])cout << arr[i] << " ";
    cout <<endl; 
    free(f);
}
0
567 / 406 / 132
Регистрация: 22.11.2017
Сообщений: 1,043
16.08.2019, 15:27 13
Rudman132, вот решение без optional<T> и vector<T>.

Кликните здесь для просмотра всего текста

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include <iostream> 
#include <random>
 
using namespace std;
 
//Заполнение массива
template<size_t n>
void Zap_mas(int (&arr)[n])
{
    random_device rd;
    mt19937 g{ rd() };
    uniform_int_distribution<> dist(10, 59);
    auto gen = [&g, &dist]() { return dist(g); };
    for (auto& value : arr)
        value = gen();
}
 
//Вывод массива
template<size_t n>
ostream& operator<<(ostream& os, int(&arr)[n])
{
    for (auto value : arr)
        os << value << " ";
    return os;
}
 
//Поиск первых N макс. чисел
template<size_t n>
void Max_numb(int(&arr)[n], int k)
{
    if (k > n)
        throw out_of_range("k прибывает вне границ массива");
    bool flags[n];
    for (auto& b : flags)
        b = true;
    for (size_t idx0 = 0u; idx0 < k; ++idx0)
    {
        size_t max_idx = 0u;
        for (size_t idx = 0u; idx < n; ++idx)
            if (flags[idx])
            {
                max_idx = idx;
                break;
            }
        for (size_t idx = 0u; idx < n; ++idx)
            if (flags[idx] && arr[idx] > arr[max_idx])
                max_idx = idx;
        cout << arr[max_idx] << " ";
        flags[max_idx] = false;
    }
    cout << "\n";
}
 
int main()
{
    setlocale(LC_ALL, "rus");
 
    const size_t s = 20u;
    int arr[s];
    Zap_mas(arr);
    cout << "Массив: ";
    cout << arr;
 
    cout << "\nВведите число N: ";
    size_t numb = 0u;
    cin >> numb;
    cout << "\nПервые N чисел: ";
    try
    {
        Max_numb(arr, numb);
    }
    catch (const out_of_range& oor)
    {
        cout << "Ошибка " << oor.what() << "\n";
        return 1;
    }
    cout << "\n";
 
    system("pause");
    return 0;
}
1
75 / 22 / 12
Регистрация: 01.06.2019
Сообщений: 566
16.08.2019, 16:03  [ТС] 14
Цитата Сообщение от SomniPhobia Посмотреть сообщение
вот решение
Спасиб
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.08.2019, 16:03

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Cоздать процедуру, которая ищет слово в массиве и выводит набор индексов массива совпадающих элементов
Имеется массив слов.Необходимо создать процедуру,которая ищет в массиве, переданное в параметре...

Составить процедуру, которая выводит квадраты первых 40 чисел в виде таблицы
Составить процедуру, которая выводит квадраты первых 40 чисел в виде таблицы (в каждой строке 4...

Шаблоны: написать функцию, которая ищет произведение среди двух, трех и четырех целых и действительных чисел
Написать функцию dob, которая ищет произведение среди двух, трех и четырех целых и действительных...

С помощью оператора while написать программу, которая ищет произведение 10 произвольно введенных чисел и выводить его на печать
С помощью оператора while написать программу, которая ищет произведение 10 произвольно введенных...


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

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

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