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

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

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

Определить максимальное из значений, встречающихся в заданной матрице более одного раза - C++

30.01.2013, 00:27. Просмотров 894. Ответов 7
Метки нет (Все метки)

Здравствуйте! Пытался решить данную задачу, но по ходу возник вопрос, как подсчитать максимальные значения которые встречаются именно более одного раза. Как найти максимальное значение написал, что требуется дописать или исправить что б решить задачу:

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
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<Windows.h>
 
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    srand(time(NULL));
    
    const int n=3;
    const int m=4;
    int A[n][m];
    int x=0;
    int max=0;
    
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            A[i][j]=rand()%25;
            cout<<A[i][j]<<"\t";
        }
    }
    
    for(int i=0; i<n; i++)// перебираем отдельные строки
    {
        for(int j=0; j<m; j++)// 
        {
            if(A[i][j]>x)// ищим максимальное значение
                x=A[i][j];
        }
        max=x;
    }
 
    cout<<"\n\n";
 
    cout<<"Максимальное из значений, встречающихся в заданной матрице более одного раза: "<<max<<endl;
 
 
 
    system("pause");
За ранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.01.2013, 00:27     Определить максимальное из значений, встречающихся в заданной матрице более одного раза
Посмотрите здесь:

C++ Определить максимальное из чисел, встречающихся в заданной матрице более одного раза
C++ Максимальное из чисел встречающих в заданной матрице более одного раза
C++ Определить максимальное из чисел, встречающихся в заданной матрице более одного раза
Найти максимальное из чисел встречающихся в матрице более одного раза. Сделать используя указатели и классы C++
C++ Определить количество чисел, встревающих в заданной матрице более одного раза
C++ Максимальное из чисел, встречающихся в заданной матрице более одного раза
C++ Дана произвольная матрица, определить: Максимальное из чисел, встречающихся в заданной матрице более одного раза
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
3BEPb_TyTa
 Аватар для 3BEPb_TyTa
18 / 18 / 1
Регистрация: 18.05.2010
Сообщений: 83
30.01.2013, 00:57     Определить максимальное из значений, встречающихся в заданной матрице более одного раза #2
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
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<Windows.h>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    srand(time(NULL));
    
    const int n=3;
    const int m=4;
    int A[n][m];
    
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            A[i][j]=rand()%25;
            cout<<A[i][j]<<"\t";
        }
    }
    
    int B[2][n*m];
    int BSize = 0;
    for(int i = 0; i < n*m; i++)
        B[1][i] = 0;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            int k;
            for(k = 0; k < BSize; k++){
                if(A[i][j] == B[0][k]){
                    B[1][k]++;
                    break;
                }
            }
            if(!(k < BSize)){
                BSize++;
                B[0][k] = A[i][j];
            }
        }
    }
 
    int max = B[0][0];
    for(int i=1; i<BSize; i++)// перебираем отдельные строки
    {
        if(B[0][i] > max && B[1][i] > 0)
            max = B[0][i];
    }
    cout<<"\n\n";
    cout<<"Максимальное из значений, встречающихся в заданной матрице более одного раза: "<<max<<endl;
    system("pause");
}
вводим доп. массив B, в который записываем числа из массива А и кол-во их повторений. После ищем максимальный элемент уже в новом массиве.
LiV
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 56
30.01.2013, 01:18  [ТС]     Определить максимальное из значений, встречающихся в заданной матрице более одного раза #3
Можете сказать про строку
C++
1
setlocale(LC_ALL, "Russian");
я так понял это, аналог строки
C++
1
2
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
, или у нее есть кроме этого какие то функции?
И еще, есть способ как то сделать ваш код меньше по обьему, не внедряя ничего нового из возможностей c++?
3BEPb_TyTa
 Аватар для 3BEPb_TyTa
18 / 18 / 1
Регистрация: 18.05.2010
Сообщений: 83
30.01.2013, 01:53     Определить максимальное из значений, встречающихся в заданной матрице более одного раза #4
Цитата Сообщение от LiV Посмотреть сообщение
я так понял это, аналог строки
да
Цитата Сообщение от LiV Посмотреть сообщение
сделать ваш код меньше по обьему
быстрее - наверняка, хотя как - сходу не скажу. А меньше(всмысле кол-ва строк) если и можно, то не намного. Он и так невелик .
LiV
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 56
30.01.2013, 03:07  [ТС]     Определить максимальное из значений, встречающихся в заданной матрице более одного раза #5
Черт... не могу разобраться с кодом на 100%, вот как я его понял , подскажите пожалуйста:

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
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<Windows.h>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    srand(time(NULL));
    
    const int n=3;
    const int m=4;
    int A[n][m];
    
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            A[i][j]=rand()%25;
            cout<<A[i][j]<<"\t";
        }
    }
    
    int B[2][n*m];// создаем массив размерностью [2][12]
    int BSize = 0;
    for(int i = 0; i < n*m; i++)// проход по массиву int B[2][n*m]
        B[1][i] = 0;
    for(int i = 0; i < n; i++){ // проход по массиву аналогичному int A[n][m]
        for(int j = 0; j < m; j++){
            int k; // переменная для проверки повторяющихся чисел
            for(k = 0; k < BSize; k++){ // здесь не понял BSize=0 же... 
                if(A[i][j] == B[0][k]){ // проверка повторяющихся чисел
                    B[1][k]++;// подсчет
                    break;
                }
            }
            if(!(k < BSize)){ // наверное сдесь замена максимального числа, если нашлось большее
                BSize++;
                B[0][k] = A[i][j];
            }
        }
    }
 
    int max = B[0][0];
    for(int i=1; i<BSize; i++)// перебираем отдельные строки
    {
        if(B[0][i] > max && B[1][i] > 0) //ищем максимальный элемент
            max = B[0][i];
    }
    cout<<"\n\n";
    cout<<"Максимальное из значений, встречающихся в заданной матрице более одного раза: "<<max<<endl;
    system("pause");
}
3BEPb_TyTa
 Аватар для 3BEPb_TyTa
18 / 18 / 1
Регистрация: 18.05.2010
Сообщений: 83
30.01.2013, 15:03     Определить максимальное из значений, встречающихся в заданной матрице более одного раза #6
Смысл массива B в том, что после его формирования (строки 27-45 в предыдущем ответе) он должен хранить в своей первой строчке какой-то элемент из массива А, а во второй строчке кол-во вхождений этого элемента.
Для этого мы перебираем все элементы массива А
C++
1
2
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){..}
и для каждого из этих элементов проверяем, есть ли он в В. Проверяем в цикле просматривая элементы В начиная с 0 до BSize-1. Если такой элемент находится, то в массиве В увеличивается число повторений.
C++
1
2
3
4
5
6
7
            int k; // переменная-счётчик для цикла ниже
            for(k = 0; k < BSize; k++){ 
                if(A[i][j] == B[0][k]){ // проверка повторяющихся чисел
                    B[1][k]++;// увеличение числа повторений
                    break;
                }
            }
переменная k объявляется вне цикла для того, чтобы после выхода она не уничтожалась. Если в предыдущем цикле не нашлось нужного элемента, то k будет равно BSize. В это случаем мы добавляем новый элемент в В(с индексом k) и увеличиваем BSize, чтобы в дальше поиск производился с учётом нового элемента.
C++
1
2
3
4
            if(!(k < BSize)){
                BSize++;
                B[0][k] = A[i][j]; 
            }
Только после завершения формирования массива В переходим к поиску максимального. Здесь я слегка изменил код(вчерашний некорректен). Для нахождения максимума в массиве В будем использовать переменную хранящую индекс столбца в В, в котором хранится текущий максимальный элемент(maxIndex). Этой переменной нужно присвоить начальное значение, равное первому элементу в массиве В, который встречается в А более одного раза. Также нужно учесть вариант, при котором ни один элемент А не повторяется. Для этого мы присваиваем maxIndex значение -1.(зачем - поясню чуть ниже).
В следующем фрагменте кода ищем первый элемент, встречающийся в А более одного раза(т.е. элемент в В, со значение больше нуля в второй строчке i-ого столбца), присваиваем индекс этого элемента переменной maxIndex и завершаем цикл.
C++
1
2
3
4
5
6
7
    int maxIndex = -1;
    for(int i = 0; i < BSize; i++){
        if(B[1][i] > 0){
            maxIndex = i;
            break;
        }
    }
Далее нужно завершить поиск максимального среди оставшихся повторяющихся элементов. Если в предыдущем цикле не удалось найти ни одного повторяющегося элемента, то значение переменно maxIndex останется равным -1(присвоенному при объявлении). Следовательно в этом случае никаких действий больше предпринимать не надо, а только сообщить о том, что элементов, которые бы повторялись не найдено вовсе.
Если же maxIndex не равна -1, то производим поиск по массиву В начиная со столбца с индексом maxIndex + 1.
C++
1
2
3
4
5
6
7
8
9
10
11
    if(maxIndex != -1){
        for(int i=maxIndex + 1; i<BSize; i++)
        {
            if(B[0][i] > B[0][maxIndex] && B[1][i] > 0) 
                maxIndex = i;
        }
        cout<<"\n\n";
        cout<<"Максимальное из значений, встречающихся в заданной матрице более одного раза: "<<B[0][maxIndex]<<endl;
    }
    else
        cout << "В матрице нет значений, встречающихся более одного раза" << endl;
Итого весь код целиком:
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
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<Windows.h>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    srand(time(NULL));
    
    const int n=3;
    const int m=4;
    int A[n][m];
    
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<m; j++)
        {
            A[i][j]=rand()%25;
            cout<<A[i][j]<<" ";
        }
    }
    cout << endl;
    
    int B[2][n*m];
    int BSize = 0;
    for(int i = 0; i < n*m; i++)
        B[1][i] = 0;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            int k; 
            for(k = 0; k < BSize; k++){ 
                if(A[i][j] == B[0][k]){
                    B[1][k]++;
                    break;
                }
            }
            if(!(k < BSize)){
                BSize++;
                B[0][k] = A[i][j];
            }
        }
    }
 
    int maxIndex = -1;
    for(int i = 0; i < BSize; i++){
        if(B[1][i] > 0){
            maxIndex = i;
            break;
        }
    }
    if(maxIndex != -1){
        for(int i=maxIndex + 1; i<BSize; i++)
        {
            if(B[0][i] > B[0][maxIndex] && B[1][i] > 0) 
                maxIndex = i;
        }
        cout<<"\n\n";
        cout<<"Максимальное из значений, встречающихся в заданной матрице более одного раза: "<<B[0][maxIndex]<<endl;
    }
    else
        cout << "В матрице нет значений, встречающихся более одного раза" << endl;
    system("pause");
}
GggDrej
 Аватар для GggDrej
71 / 71 / 8
Регистрация: 21.01.2013
Сообщений: 147
30.01.2013, 15:12     Определить максимальное из значений, встречающихся в заданной матрице более одного раза #7
Зачем здесь эти ско6ки ??
Цитата Сообщение от 3BEPb_TyTa Посмотреть сообщение
int maxIndex = -1;
for(int i = 0; i < BSize; i++){
if(B[1][i] > 0){
maxIndex = i;
break;
}
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.02.2013, 22:44     Определить максимальное из значений, встречающихся в заданной матрице более одного раза
Еще ссылки по теме:

C++ Двумерный массив. Найти: максимальное из чисел, встречающихся в заданной матрице более одного раза
C++ Определить максимальное из чисел, встречающихся в заданной матрице более одного раза
Найти максимальное число из, встречающихся в матрице более одного раза C++
Максимальное из чисел встречающихся в заданной матрице более одного раза C++
C++ Определить максимальное из чисел, встречающихся в заданной матрице более одного раза

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

Или воспользуйтесь поиском по форуму:
LiV
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 56
02.02.2013, 22:44  [ТС]     Определить максимальное из значений, встречающихся в заданной матрице более одного раза #8
3BEPb_TyTa, ясно. Спасибо за хороший ответ
Yandex
Объявления
02.02.2013, 22:44     Определить максимальное из значений, встречающихся в заданной матрице более одного раза
Ответ Создать тему
Опции темы

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