Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 56
1

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

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

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

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");
За ранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.01.2013, 00:27
Ответы с готовыми решениями:

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

Определить максимальное из чисел, встречающихся в заданной матрице более одного раза
Здравствуйте!Помогите пожалуйста решить задачу. Дана целочисленная матрица. Определить...

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

Определить максимальное из чисел, встречающихся в заданной матрице более одного раза
Есть код. 1 задание, где определяет количество строк, не содержащих ни одного нулевого элемента уже...

7
18 / 18 / 4
Регистрация: 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, в который записываем числа из массива А и кол-во их повторений. После ищем максимальный элемент уже в новом массиве.
1
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++?
0
18 / 18 / 4
Регистрация: 18.05.2010
Сообщений: 83
30.01.2013, 01:53 4
Цитата Сообщение от LiV Посмотреть сообщение
я так понял это, аналог строки
да
Цитата Сообщение от LiV Посмотреть сообщение
сделать ваш код меньше по обьему
быстрее - наверняка, хотя как - сходу не скажу. А меньше(всмысле кол-ва строк) если и можно, то не намного. Он и так невелик .
1
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");
}
0
18 / 18 / 4
Регистрация: 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");
}
1
73 / 73 / 64
Регистрация: 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;
}
}
0
0 / 0 / 0
Регистрация: 28.01.2013
Сообщений: 56
02.02.2013, 22:44  [ТС] 8
3BEPb_TyTa, ясно. Спасибо за хороший ответ
0
02.02.2013, 22:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.02.2013, 22:44
Помогаю со студенческими работами здесь

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

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

Максимальное из чисел встречающихся в заданной матрице более одного раза
Есть программа, она работает, но мне не понятен принцип, мог бы кто нибудь помочь? #include...

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru