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

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

Восстановить пароль Регистрация
 
Amenti
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 11
13.05.2013, 21:05     Рекурсия, поиск второго максимального элемента #1
Не получается выполнить задание:

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

Help!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MihalNik
55 / 55 / 6
Регистрация: 01.12.2012
Сообщений: 433
13.05.2013, 21:07     Рекурсия, поиск второго максимального элемента #2
Что-то такое:
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);
Amenti
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 11
13.05.2013, 21:13  [ТС]     Рекурсия, поиск второго максимального элемента #3
MihalNik, Это же не полная программа, где здесь вводится последовательность?

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



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

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

Конечно, там
C++
1
2
cin>>c;
cin>>m1;
Amenti
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 11
13.05.2013, 21:27  [ТС]     Рекурсия, поиск второго максимального элемента #7
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;
последовательность натуральных чисел.
Простите что я не очень понимаю, но как вводить эту последовательность, или это и есть ввод?
MihalNik
55 / 55 / 6
Регистрация: 01.12.2012
Сообщений: 433
13.05.2013, 21:33     Рекурсия, поиск второго максимального элемента #8
Смотрите поправку сообщения выше. Там исправлено.
Это ввод чисел, типа:
2 4 5 34 455 0<Enter>

В программу-то вставьте и протестируйте.
Amenti
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 11
13.05.2013, 21:33  [ТС]     Рекурсия, поиск второго максимального элемента #9
MihalNik, Не могу что то я понять, можете пожалуйста написать полный листинг?
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
13.05.2013, 21:49     Рекурсия, поиск второго максимального элемента #10
Цитата Сообщение от Amenti Посмотреть сообщение
Рекурсия, поиск второго максимального элемента
А с помощью цикла в состоянии это сделать?
Amenti
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 11
13.05.2013, 21:50  [ТС]     Рекурсия, поиск второго максимального элемента #11
Какой должен быть полный листинг программы?
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2013, 22:13     Рекурсия, поиск второго максимального элемента #12
Держите
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);
        }
    }
}
Amenti
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 11
13.05.2013, 22:30  [ТС]     Рекурсия, поиск второго максимального элемента #13
go, У меня не получается ввести числа, просто только сегодня начал изучать рекурсию (функции) и совсем не могу понять как вводить.

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

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

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

Добавлено через 3 минуты
diagon, на вот этом
main(argc, 0);
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2013, 22:30     Рекурсия, поиск второго максимального элемента #14
Цитата Сообщение от 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;
        }
    }
}
А лучше скажите, какая именно ошибка. Единственное место, где я вижу ошибку - рекурсия в мейне. Но большинство компиляторов забивает на это. Скорее всего компилятор убогий.
Amenti
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 11
13.05.2013, 22:35  [ТС]     Рекурсия, поиск второго максимального элемента #15
diagon, [C++ Error] Unit1.cpp(18): E2120 Cannot call 'main' from within the program Там же само

Добавлено через 1 минуту
diagon, можете сказать какая у вас С++ может моя просто старая, но прошлые программы все работают.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2013, 22:36     Рекурсия, поиск второго максимального элемента #16
Окей, тогда так(
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;
}
Amenti
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 11
13.05.2013, 22:46  [ТС]     Рекурсия, поиск второго максимального элемента #17
diagon, Должно работать, огромное спасибо

Добавлено через 6 минут
diagon, Какая у вас версия программы С++? Если можно то дайте ссылку откуда можно скачать её.
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
13.05.2013, 22:57     Рекурсия, поиск второго максимального элемента #18
Цитата Сообщение от Amenti Посмотреть сообщение
diagon, Какая у вас версия программы С++? Если можно то дайте ссылку откуда можно скачать её.
У меня несколько компиляторов :)
Данный код писал из под MSVS 2012 (ссылку на рутракер дать не могу (запрещено правилами форума), погуглите самостоятельно).
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
14.05.2013, 15:55     Рекурсия, поиск второго максимального элемента #19
Цитата Сообщение от diagon Посмотреть сообщение
А лучше скажите, какая именно ошибка.
Я могу ошибаться, но функцию main можно вызвать из нутри программы только в языке Си, в С++, по-моему, так нельзя.

Добавлено через 4 минуты
Чтобы не быть голословным, открыл стандарт.
5.2.2
9. Recursive calls are permitted, except to the function named main (3.6.1).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.05.2013, 15:56     Рекурсия, поиск второго максимального элемента
Еще ссылки по теме:

Поиск максимального элемента по модулю C++
Поиск максимального элемента в массиве оформить функцией C++
C++ Поиск максимального элемента дерева

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

Или воспользуйтесь поиском по форуму:
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
14.05.2013, 15:56     Рекурсия, поиск второго максимального элемента #20
Цитата Сообщение от go Посмотреть сообщение
Я могу ошибаться, но функцию main можно вызвать из нутри программы только в языке Си, в С++, по-моему, так нельзя.
Дочитайте цитируемый абзац до конца :)
Цитата Сообщение от diagon Посмотреть сообщение
Единственное место, где я вижу ошибку - рекурсия в мейне. Но большинство компиляторов забивает на это. Скорее всего компилятор убогий.
И я, кстати, не просто так написал С-совместимый код :)
Yandex
Объявления
14.05.2013, 15:56     Рекурсия, поиск второго максимального элемента
Ответ Создать тему
Опции темы

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