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

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

Восстановить пароль Регистрация
 
LiV
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 54
30.01.2013, 00:27     Определить максимальное из значений, встречающихся в заданной матрице более одного раза #1
Здравствуйте! Пытался решить данную задачу, но по ходу возник вопрос, как подсчитать максимальные значения которые встречаются именно более одного раза. Как найти максимальное значение написал, что требуется дописать или исправить что б решить задачу:

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++ максимальное из чисел, встречающихся в заданной матрице более одного раза.(исправить 1 ошибку)
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
Сообщений: 54
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
Сообщений: 54
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++ Определить максимальное из чисел, встречающихся в заданной матрице более одного раза

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

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

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