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

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

13.05.2013, 21:05. Показов 3226. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 30.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru