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

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

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

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

30.01.2013, 00:27. Просмотров 952. Ответов 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");
За ранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.01.2013, 00:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Определить максимальное из значений, встречающихся в заданной матрице более одного раза (C++):

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

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

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

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

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

Максимальное из чисел встречающихся в заданной матрице более одного раза - C++
Есть программа, она работает, но мне не понятен принцип, мог бы кто нибудь помочь? #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

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

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

Двумерный массив. Найти: максимальное из чисел, встречающихся в заданной матрице более одного раза - C++
Найти: максимальное из чисел, встречающихся в заданной матрице более одного раза Матрица: 2 4 7 6 5 8 9 34 43 4 34 53 45 345 3 6 5 56...

Найти максимальное число из, встречающихся в матрице более одного раза - C++
Хей. Есть рабочая программа, но для её полной правильности в ней нужно использовать Функцию или процедуру. Задание: Найти максимальное...

Найти максимальное из чисел встречающихся в матрице более одного раза. Сделать используя указатели и классы - C++
Ребята..помогите,пожалуйста.Надо решить задачу,а никак не выходит(даже не знаю..прочитала в книге все про указатели и не пойму как...


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

Или воспользуйтесь поиском по форуму:
8
Yandex
Объявления
02.02.2013, 22:44
Ответ Создать тему
Опции темы

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