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

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

Войти
Регистрация
Восстановить пароль
 
 
Amenti
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 11
#1

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

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

Не получается выполнить задание:

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

Help!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.05.2013, 21:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Рекурсия, поиск второго максимального элемента (C++):

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

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

Поиск максимального элемента дерева - C++
Добрый день! Помогите пожалуйста реализовать поиск максимального элемента в дереве.

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MihalNik
55 / 55 / 6
Регистрация: 01.12.2012
Сообщений: 445
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
Сообщений: 445
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
Сообщений: 445
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
Сообщений: 445
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++
3586 / 1366 / 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
1929 / 1195 / 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
1929 / 1195 / 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, можете сказать какая у вас С++ может моя просто старая, но прошлые программы все работают.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.05.2013, 22:35
Привет! Вот еще темы с ответами:

Поиск минимального и максимального элемента в матрице - C++
Помогите в моем коде реализовать поиск минимального и максимального элемента функция minmax #ifndef _LIBRARYMATRIX_H_ ...

Написание функции на С++ (поиск максимального элемента) - C++
Написать функцию поиска максимального элемента, использовать ее для поиска среди 4х и 5 чисел. Количество чисел передавать в функцию в...

Осуществить поиск индекса максимального элемента - C++
Нужно найти индекс макс. эл-та. Ошибку я нашел, а вот как ее исправить - не знаю. #include &lt;iostream&gt; #include &lt;string&gt; using...

Поиск максимального элемента одномерного массива (рекурсией) - C++
С помощью рекурсивной функции осуществить поиск максимального элемента одномерного массива Добавлено через 51 секунду Ой тоесть...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.05.2013, 22:35
Ответ Создать тему
Опции темы

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