Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 11

Рекурсия, поиск второго максимального элемента

13.05.2013, 21:05. Показов 3175. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не получается выполнить задание:

Данная последовательность натуральных чисел (одно число в строке), что завершается числом 0.
Определите значение второго по величине элемента в этой последовательности, то есть элемента, будет наибольшим, если из последовательности удалить наибольший элемент. В этой задаче нельзя использовать глобальные переменные. Функция получает данные, считывая их с клавиатуры, но не получая их в виде параметра. В программе на языке С + + результат записывается в переменные, которые передаются в функцию по ссылке. Других параметров, кроме как используются для возвращения значения, функция не получает. Гарантируется, что последовательность содержит хотя бы 2 два числа (кроме нуля).

Help!
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.05.2013, 21:05
Ответы с готовыми решениями:

Рекурсия: поиск второго максимального числа из заданного набора целых чисел
Напишите рекурсивное решение для поиска второго максимального числа из заданного набора целых чисел. Входные данные: 5 5 8 7 9 3 ...

Поиск максимального и второго по величине элемента в матрице
помогите пожалуйста решить: В каждой строке матрицы поменять местами максимальный и второй по величине после максимального элементы.

Поиск максимального элемента
Нужна сделать поиск максимального элемента массива путем деления пополам не через рекурсию, а через цикл. #include <stdio.h> ...

19
55 / 55 / 12
Регистрация: 01.12.2012
Сообщений: 456
13.05.2013, 21:07
Что-то такое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void f(int &max, int &second){
  int c;
  cout>>c;
  if(c > max){
    second= max;
    max= с;
    }
  else if(c > second) second= c;
  if(c == 0) return;
  else f(max, second);
}
...
int m1,m2= 0;
cout>>m1;
if(m1>m2) f(m1,m2);
else f(m2,m1);
0
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 11
13.05.2013, 21:13  [ТС]
MihalNik, Это же не полная программа, где здесь вводится последовательность?

Я не очень просто понимаю рекурсию...
0
55 / 55 / 12
Регистрация: 01.12.2012
Сообщений: 456
13.05.2013, 21:18
C++
1
cout>>c
в рекурсивном цикле, не?
0
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 11
13.05.2013, 21:21  [ТС]
MihalNik,



Цитата Сообщение от MihalNik Посмотреть сообщение
int m1,m2= 0;
cout>>m1;
if(m1>m2) f(m1,m2);
else f(m2,m1);
что делает эта часть программы?
0
55 / 55 / 12
Регистрация: 01.12.2012
Сообщений: 456
13.05.2013, 21:23
Ну Вы же где-то собираетесь запускать необходимую функцию? Да еще параметры должны быть инициализированы у нее, так ведь?

Блин,
C++
1
cout>>c

Конечно, там
C++
1
2
cin>>c;
cin>>m1;
0
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 11
13.05.2013, 21:27  [ТС]
MihalNik,
Цитата Сообщение от MihalNik Посмотреть сообщение
void f(int &max, int &second){
* int c;
* cout>>c;
* if(c > max){
* * second= max;
* * max= с;
* * }
* else if(c > second) second= c;
* if(c == 0) return;
* else f(max, second);
}
Я так понимаю это сама рекурсия.
Где

Цитата Сообщение от MihalNik Посмотреть сообщение
int c;
* cout>>c;
последовательность натуральных чисел.
Простите что я не очень понимаю, но как вводить эту последовательность, или это и есть ввод?
0
55 / 55 / 12
Регистрация: 01.12.2012
Сообщений: 456
13.05.2013, 21:33
Смотрите поправку сообщения выше. Там исправлено.
Это ввод чисел, типа:
2 4 5 34 455 0<Enter>

В программу-то вставьте и протестируйте.
0
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 11
13.05.2013, 21:33  [ТС]
MihalNik, Не могу что то я понять, можете пожалуйста написать полный листинг?
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
13.05.2013, 21:49
Цитата Сообщение от Amenti Посмотреть сообщение
Рекурсия, поиск второго максимального элемента
А с помощью цикла в состоянии это сделать?
0
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 11
13.05.2013, 21:50  [ТС]
Какой должен быть полный листинг программы?
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2013, 22:13
Держите
C++
1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <limits.h>
 
int main(int argc, char **)
{
    static int max_value = INT_MIN, cur;
 
    argc ? scanf("%d", &cur), main(cur ? argc + ( max_value < cur && (max_value = cur) ) : cur, 0) : printf("max value is %d\n", max_value);
}
Чуть-чуть не по плюсовому стандарту, но не смертельно.

Добавлено через 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
#include <stdio.h>
 
int main(int argc, char**)
{
    static int first_max_value, second_max_value, cur;
 
    if (argc > 0)
    {
        scanf("%d%d", &first_max_value, &second_max_value);
 
        if (first_max_value < second_max_value)
        {
            int tmp = first_max_value;
            first_max_value = second_max_value;
            second_max_value = tmp;
        }
 
        main(-argc, 0);
    }
    else if (argc < 0)
    {
        scanf("%d", &cur);
 
        if (cur != 0)
        {
            if (cur >= first_max_value)
            {
                second_max_value = first_max_value;
                first_max_value = cur;
            }
            else if (cur >= second_max_value)
            {
                second_max_value = cur;
            }
 
            main(argc, 0);  
        }
        else
        {
            printf("second max value is %d\n", second_max_value);
        }
    }
}
1
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 11
13.05.2013, 22:30  [ТС]
go, У меня не получается ввести числа, просто только сегодня начал изучать рекурсию (функции) и совсем не могу понять как вводить.

Добавлено через 1 минуту
diagon, Спасибо

Добавлено через 1 минуту
diagon,
Цитата Сообщение от diagon Посмотреть сообщение
обфусцировать лень
Как это обфусцировать?

Добавлено через 2 минуты
diagon, выбивает ошибку

Добавлено через 3 минуты
diagon, на вот этом
main(argc, 0);
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2013, 22:30
Цитата Сообщение от Amenti Посмотреть сообщение
diagon, выбивает ошибку
Ну, попробуйте так.
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
#include <stdio.h>
 
int main(int argc, char ** argv)
{
    static int first_max_value, second_max_value, cur;
 
    if (argc > 0)
    {
        scanf("%d%d", &first_max_value, &second_max_value);
 
        if (first_max_value < second_max_value)
        {
            int tmp = first_max_value;
            first_max_value = second_max_value;
            second_max_value = tmp;
        }
 
        main(-argc, argv);
    }
    else if (argc < 0)
    {
        scanf("%d", &cur);
 
        if (cur != 0)
        {
            if (cur >= first_max_value)
            {
                second_max_value = first_max_value;
                first_max_value = cur;
            }
            else if (cur >= second_max_value)
            {
                second_max_value = cur;
            }
 
            main(argc, argv);   
        }
        else
        {
            printf("second max value is %d\n", second_max_value);
            return 0;
        }
    }
}
А лучше скажите, какая именно ошибка. Единственное место, где я вижу ошибку - рекурсия в мейне. Но большинство компиляторов забивает на это. Скорее всего компилятор убогий.
1
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 11
13.05.2013, 22:35  [ТС]
diagon, [C++ Error] Unit1.cpp(18): E2120 Cannot call 'main' from within the program Там же само

Добавлено через 1 минуту
diagon, можете сказать какая у вас С++ может моя просто старая, но прошлые программы все работают.
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2013, 22:36
Окей, тогда так(
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
#include <stdio.h>
 
int foo(int argc, char ** argv)
{
    static int first_max_value, second_max_value, cur;
 
    if (argc > 0)
    {
        scanf("%d%d", &first_max_value, &second_max_value);
 
        if (first_max_value < second_max_value)
        {
            int tmp = first_max_value;
            first_max_value = second_max_value;
            second_max_value = tmp;
        }
 
        foo(-argc, argv);
    }
    else if (argc < 0)
    {
        scanf("%d", &cur);
 
        if (cur != 0)
        {
            if (cur >= first_max_value)
            {
                second_max_value = first_max_value;
                first_max_value = cur;
            }
            else if (cur >= second_max_value)
            {
                second_max_value = cur;
            }
 
            foo(argc, argv);    
        }
        else
        {
            printf("second max value is %d\n", second_max_value);
            return 0;
        }
    }
}
 
int main(int argc, char ** argv)
{
    foo(argc, argv);
    return 0;
}
1
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 11
13.05.2013, 22:46  [ТС]
diagon, Должно работать, огромное спасибо

Добавлено через 6 минут
diagon, Какая у вас версия программы С++? Если можно то дайте ссылку откуда можно скачать её.
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2013, 22:57
Цитата Сообщение от Amenti Посмотреть сообщение
diagon, Какая у вас версия программы С++? Если можно то дайте ссылку откуда можно скачать её.
У меня несколько компиляторов :)
Данный код писал из под MSVS 2012 (ссылку на рутракер дать не могу (запрещено правилами форума), погуглите самостоятельно).
1
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
14.05.2013, 15:55
Цитата Сообщение от diagon Посмотреть сообщение
А лучше скажите, какая именно ошибка.
Я могу ошибаться, но функцию main можно вызвать из нутри программы только в языке Си, в С++, по-моему, так нельзя.

Добавлено через 4 минуты
Чтобы не быть голословным, открыл стандарт.
5.2.2
9. Recursive calls are permitted, except to the function named main (3.6.1).
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
14.05.2013, 15:56
Цитата Сообщение от go Посмотреть сообщение
Я могу ошибаться, но функцию main можно вызвать из нутри программы только в языке Си, в С++, по-моему, так нельзя.
Дочитайте цитируемый абзац до конца :)
Цитата Сообщение от diagon Посмотреть сообщение
Единственное место, где я вижу ошибку - рекурсия в мейне. Но большинство компиляторов забивает на это. Скорее всего компилятор убогий.
И я, кстати, не просто так написал С-совместимый код :)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.05.2013, 15:56
Помогаю со студенческими работами здесь

Поиск максимального элемента массива
Задание из ОГЭ , требуется написать, какое число выведет программа. Почему выводит 41 а не 20, ведь 20 не больше 20, по идее цикл должен...

Поиск максимального элемента массива
Всем вечер добрый Вот моя ситуация: дано два одномерных массива А и Б допустим как мне найти максимальный G если G=a*a+b*b как...

Поиск максимального элемента вектора
Написала программу поиска максимального элемента вектора, только теперь её надо переделать немного с использованием указателей... ...

Поиск максимального элемента в файле
Доброго времеи суток. Не подскажие, как осуществить поиск максимального элемета из записаных в файл. В файле 5 столбиков чисел типа double,...

Поиск максимального элемента по модулю
Дана целочисленная прямоугольная матрица А. Составить новую матрицу В из тех строк матрицы А, первым элементом в которых является...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru