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

Найти два наибольших числа из всех введенных, при условии что цифры не повторяются - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.85
russia91
0 / 0 / 0
Регистрация: 14.03.2010
Сообщений: 5
15.03.2010, 19:49     Найти два наибольших числа из всех введенных, при условии что цифры не повторяются #1
Вот сижу над очередной задачкой. Найти 2 наиболее высоких числа из 10 введенных, при условии что цифры не повторяются.

Максимальное вытащил а вот как второе по величине все придумать не могу...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream.h>
#include<conio.h>
 
main()
{
 int counter, max=0, min=0, n; //max- масимальное число. min - второе по велечине число.
 
 for(counter=1;counter<=10;counter++)
 {
  cout << "vvedite 4islo: "; cin >> n;
  if(n>max)
  max=n;
 }
 cout << "max: " << max << endl;
 cout << "min: " << min << endl;
 getch();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2010, 19:49     Найти два наибольших числа из всех введенных, при условии что цифры не повторяются
Посмотрите здесь:

C++ найти произведение двух наибольших из трех введенных с клавиатуры чисел
Оператор for,if ( найти два наибольших числа) C++
C++ Даны четыре разных числа. Найти среди них два наибольших
Можно ли вернуть функцией два значения при условии что она будет вещественного типа? C++
Программа которая выводит два наибольших числа из десяти введенных. Пожалуйста объясните суть работы программы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sekt
 Аватар для Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
15.03.2010, 19:56     Найти два наибольших числа из всех введенных, при условии что цифры не повторяются #2
исп динамический массив и удалите первое макс.число .
Или сравнивайте с первым максимальным.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
15.03.2010, 20:00     Найти два наибольших числа из всех введенных, при условии что цифры не повторяются #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
 
/* Найти 2 наиболее высоких числа из 10 введенных, при условии что числа не повторяются. */
int main(){
    int tmp, cnt = 10;
    std::vector<int> vec;
    
    while ( cnt-- ){
        std::cout << "Value (" << cnt << " left): ";
        std::cin >> tmp;
        vec.push_back(tmp);
    }
    std::sort(vec.begin(), vec.end(), std::greater<int>());
    std::cout << "Two highest values: " << vec[0] << "  " << vec[1] << std::endl;
    
    return 0;
}
лендер
46 / 46 / 2
Регистрация: 12.01.2010
Сообщений: 183
15.03.2010, 20:00     Найти два наибольших числа из всех введенных, при условии что цифры не повторяются #4
попытайся так
C++
1
2
3
4
5
6
7
8
for(counter=1;counter<=10;counter++)
 {
  cout << "vvedite 4islo: "; cin >> n;
  if(n>max)
  max=n;
        if(n<max&&n>min)
  min=n;
 }
эх запоздал...
russia91
0 / 0 / 0
Регистрация: 14.03.2010
Сообщений: 5
15.03.2010, 20:08  [ТС]     Найти два наибольших числа из всех введенных, при условии что цифры не повторяются #5
Цитата Сообщение от лендер Посмотреть сообщение
попытайся так
C++
1
2
3
4
5
6
7
8
for(counter=1;counter<=10;counter++)
 {
  cout << "vvedite 4islo: "; cin >> n;
  if(n>max)
  max=n;
        if(n<max&&n>min)
  min=n;
 }
эх запоздал...
Твой код не работает если последнее число самое большое.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
15.03.2010, 20:14     Найти два наибольших числа из всех введенных, при условии что цифры не повторяются #6
russia91, попробуй так:
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
#include <iostream>
#include <limits>
 
struct TwoMax
{
  int first;
  int second;
};
 
int main()
{
  TwoMax two_max = {
    -std::numeric_limits<int>::max(), 
    -std::numeric_limits<int>::max()
  };
 
  for (int i = 0; i < 10; i++) {
    int n;
    
    std::cout << "Enter number: ";
    std::cin >> n;
 
    if (n > two_max.first){
      two_max.second = two_max.first;
      two_max.first  = n;
    } else if (n > two_max.second)
      two_max.second = n;
  }
 
  std::cout << "First max: "  << two_max.first  << std::endl;
  std::cout << "Second max: " << two_max.second << std::endl;
 
  return 0;
}
al072
14 / 14 / 0
Регистрация: 03.02.2010
Сообщений: 132
15.03.2010, 20:24     Найти два наибольших числа из всех введенных, при условии что цифры не повторяются #7
Вот функция которая находит максимальное значение в массиве и возвращает его:
Код
double& max(double array[], int len)
{
   int j = 0;                               
   for(int i = 1; i < len; i++)
      if(array[j] < array[i])                      
         j = i;                             
   return array[j];                            
                                            
}
лендер
46 / 46 / 2
Регистрация: 12.01.2010
Сообщений: 183
15.03.2010, 20:28     Найти два наибольших числа из всех введенных, при условии что цифры не повторяются #8
вот еще
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream.h>
#include<conio.h>
 
main()
{
clrscr();
 int counter, max=0, min=0,min2, n; //max- масимальное число. min - второе по велечине число.
 
 for(counter=1;counter<=10;counter++)
 {
  cout << "vvedite 4islo: "; cin >> n;
  min2 = max;
    if(n > max)
    max = n;
 
      if(min2 != max)
    min = min2;
 }
 cout << "max: " << max << endl;
 cout << "min: " << min << endl;
 getch();
}
russia91
0 / 0 / 0
Регистрация: 14.03.2010
Сообщений: 5
15.03.2010, 20:33  [ТС]     Найти два наибольших числа из всех введенных, при условии что цифры не повторяются #9
Всем большое спасибо!!! Супер форум.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
15.03.2010, 20:37     Найти два наибольших числа из всех введенных, при условии что цифры не повторяются #10
Цитата Сообщение от easybudda Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
 
/* Найти 2 наиболее высоких числа из 10 введенных, при условии что числа не повторяются. */
int main(){
    int tmp, cnt = 10;
    std::vector<int> vec;
    
    while ( cnt-- ){
        std::cout << "Value (" << cnt << " left): ";
        std::cin >> tmp;
        vec.push_back(tmp);
    }
    std::sort(vec.begin(), vec.end(), std::greater<int>());
    std::cout << "Two highest values: " << vec[0] << "  " << vec[1] << std::endl;
    
    return 0;
}
easybudda, в данном случае лучше использовать std::set, и тогда никаких сортировок не потребуется:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <set>
 
int main()
{
        std::set<int> set;
  const int           count = 10;
 
  for (int i = 0; i < count; ++i) {
    int n;
 
    std::cout << "Enter number: ";
    std::cin >> n;
 
    set.insert(n);
  }
 
  std::cout << "First max: "  << *(--set.end())     << std::endl;
  std::cout << "First max: "  << *(--(--set.end())) << std::endl;
 
  return 0;
}
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
15.03.2010, 21:12     Найти два наибольших числа из всех введенных, при условии что цифры не повторяются #11
CyBOSSeR, хорошо, но мало! Тогда уж так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <set>
#include <algorithm>
#include <functional>
 
/* Найти 2 наиболее высоких числа из 10 введенных, при условии что числа не повторяются. */
int main(){
    int tmp, cnt = 10;
    std::set<int, std::greater<int> > vec;
    
    while ( cnt-- ){
        std::cout << "Value (" << cnt << " left): ";
        std::cin >> tmp;
        vec.insert(tmp);
    }
    std::cout << "Two highest values: " << *vec.begin() << "  " << *(++vec.begin()) << std::endl;
    
    return 0;
}
а то два наибольших значения из-под хвоста получаются...
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
15.03.2010, 21:28     Найти два наибольших числа из всех введенных, при условии что цифры не повторяются #12
easybudda, ну, да как вариант.
Кстати, лучше все таки использовать multiset, а то никто пользователю не запрещает ввести все одинаковые числа.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
15.03.2010, 21:35     Найти два наибольших числа из всех введенных, при условии что цифры не повторяются #13
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Кстати, лучше все таки использовать multiset, а то никто пользователю не запрещает ввести все одинаковые числа.
Не, лучше тогда проверку сделать на присутствие в наборе числа перед его вставкой. По условию числа не должны повторяться.
R136a1
 Аватар для R136a1
142 / 111 / 15
Регистрация: 14.04.2011
Сообщений: 261
08.10.2011, 19:53     Найти два наибольших числа из всех введенных, при условии что цифры не повторяются #14
Это задача из 4ой главы дейтелов. В ней предполагается что человек ещё не знаком с STL ) В главе описываются основные управляющие операторы - операторы выбора (if if..else) и оператор цикла while
лендер твой код работает только в одном "направлении". Например если будет последовательность 1, 2, 3, 4, 5, 321, 6, 7, 123, 9, 10 , то он не будет работать
Вот если кому надо. Вроде правильно работает
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
#include <iostream>
 
int lowmax( int );
 
int main()
{
    int counter = 1;
    int number;
    int min, min2 = 0, max = 0;
    int temp;
 
    while(counter <= 10)
    {
            std::cout << "Введите число: ";
            std::cin >> number;
 
        temp = max;
 
        if(number > max)
        {
            max = number;
            if(temp != max)
                min = temp;
        }
        else if(number < max)
            min2 = lowmax(number);
 
        counter++;
    }
 
    if(min2 > min)
        min = min2;
 
    std::cout << "max: " << max << std::endl;
    std::cout << "min: " << min << std::endl;
 
    return 0;
}
 
int lowmax( int min )
{
    static int bigTemp = 0, temp = 0;
    static int returnMin;
 
    if(bigTemp < min)
    {
        if(temp < min)
        {
                returnMin = min;
            bigTemp = min;
        }
    }
 
    temp = min;
 
    return returnMin;
}
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
08.10.2011, 19:58     Найти два наибольших числа из всех введенных, при условии что цифры не повторяются #15
Не проще ли после того, как нашли первое число, заменить его на ноль? Потом найти и второе не должно составить проблем.
R136a1
 Аватар для R136a1
142 / 111 / 15
Регистрация: 14.04.2011
Сообщений: 261
08.10.2011, 20:07     Найти два наибольших числа из всех введенных, при условии что цифры не повторяются #16
vortexx1, что-то не пойму я вашу мысль. Можно код?
vortexx1
 Аватар для vortexx1
6 / 6 / 2
Регистрация: 06.03.2011
Сообщений: 269
08.10.2011, 20:28     Найти два наибольших числа из всех введенных, при условии что цифры не повторяются #17
R136a1,

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
#include <iostream>
using namespace std;
 
int main ()
{
    const int size = 6;
    
    int array [ size ] = { 1, 2, 3, 4, 5, 6 };
    
    // находим первое максимальное
    int max = array [ 0 ];
    
    for ( int i = 0; i < size; i++ )
        if ( array [ i ] > max )
           max = array [ i ];
           
    cout << max << endl;
    
    // находим порядковый номер максимального
    int number;
    
    for ( int k = 0; k < size; k++ )
        if ( array [ k ] == max )
           number = k;
    
    // ставим ноль вместо первого максимального       
    array [ number ] = 0;
    
    // находим второе максимальное
    max = 0;
    
    for ( int i = 0; i < size; i++ )
        if ( array [ i ] > max )
           max = array [ i ];
           
    cout << max << endl;
    
    system ( "pause" );
    return 0;
}
R136a1
 Аватар для R136a1
142 / 111 / 15
Регистрация: 14.04.2011
Сообщений: 261
08.10.2011, 20:46     Найти два наибольших числа из всех введенных, при условии что цифры не повторяются #18
vortexx1, я думал, что вы имели в виду алгоритм без использования массива.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
08.10.2011, 22:22     Найти два наибольших числа из всех введенных, при условии что цифры не повторяются #19
Цитата Сообщение от russia91 Посмотреть сообщение
C++
1
max=0, min=0; //max- масимальное число. min - второе по велечине число.

Не по теме:

Такую ошибку обычно новички в программировании делают, так нельзя инициализировать для произвольного набора элементов!

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2011, 16:00     Найти два наибольших числа из всех введенных, при условии что цифры не повторяются
Еще ссылки по теме:

Найти два наибольших числа из десяти C++
C++ Сравнить два введенных числа, не используя логические выражения
При использовании rand числа постоянно повторяются C++

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

Или воспользуйтесь поиском по форуму:
R136a1
 Аватар для R136a1
142 / 111 / 15
Регистрация: 14.04.2011
Сообщений: 261
09.10.2011, 16:00     Найти два наибольших числа из всех введенных, при условии что цифры не повторяются #20
Thinker, благодаря вашему замечанию, я пришел к мысли, что мой код не ищет максимумы, если все числа, к примеру отрицательные

немного подредактировал свой код

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
82
83
84
85
86
87
88
89
#include <iostream>
#include <limits>
 
int lowmax( int );
 
int main()
{
    int counter = 1;
    int number;
    int min, min2, max;
    int temp;
 
    while(counter <= 10)
    {
            std::cout << "Введите число: ";
            std::cin >> number;
 
        if(counter == 1)
            max = number;
 
        temp = max;
 
        if(number > max)
        {
            max = number;
            if(temp != max)
                min = temp;
        }
        else if(number < max)
            min2 = lowmax(number);
 
        counter++;
    }
 
    if(max < 0)
        min = min2;
    else if(max > 0 && min2 > min)
        min = min2;
 
    std::cout << "max: " << max << std::endl;
    std::cout << "min: " << min << std::endl;
 
    return 0;
}
 
int lowmax( int min )
{
    static int plusTemp = 0, minusTemp = std::numeric_limits< int >::min();
    static int plusReturnMin = 0, minusReturnMin = 0;
    static int ptemp = 0;
    static int mtemp = std::numeric_limits< int >::min();
    static int returnMin;
 
    if(min > 0)
    {
        if(plusTemp < min)
        {
            if(ptemp < min)
            {
                    plusReturnMin = min;
                plusTemp = min;
            }
        }
 
    }
    else if( min < 0 )
    {
        if(minusTemp < min)
        {
            if(mtemp < min)
            {
                minusReturnMin = min;
                minusTemp = min;
            }
        }
    }
 
    mtemp = min;
    ptemp = min;
 
    if(plusReturnMin == 0 && minusReturnMin != std::numeric_limits< int >::min())
        returnMin = minusReturnMin;
    else if(minusReturnMin == std::numeric_limits< int >::min() && plusReturnMin != 0)
        returnMin = plusReturnMin;
    else if(minusReturnMin != std::numeric_limits< int >::min() && plusReturnMin != 0)
        returnMin = plusReturnMin;
 
    return returnMin;
}
Yandex
Объявления
09.10.2011, 16:00     Найти два наибольших числа из всех введенных, при условии что цифры не повторяются
Ответ Создать тему
Опции темы

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