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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
Туся111
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 43
#1

максимальный из элементов встречающийся в матрице более 1 раза - C++

28.04.2013, 10:34. Просмотров 1463. Ответов 30
Метки нет (Все метки)

с комментариями пожалуйста))))
вот половина программы доработайте пожалуйста..
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
#include "stdafx.h" // подключение файла перекомпилированного заголовка
#include "iostream" // подключение библиотеки ввод/вывод
#include "math.h" // подключение библиотеки тригонометрических функций
using namespace std;
 
void main(void) // головная программа
{
setlocale (0, "Rus"); // русский язык
int a;
do
{
int count=0; // счетчик
int count1=0; 
int n; // переменая для количества строк
int m; //переменая для количества столбцов
int i; //обьяв. переменую
int j,; //обьяв. переменую
cout<<"введите количество строк"<<endl;
        cin>>n;// вводим кол строк
cout<<"введите количество столбцов"<<endl;
        cin>>m;// водим количество столбцов
        int**mass=new int*[n];                  //      динамическое 
for (i=1; i<=n; i++)                    //      выделение
    mass[i]=new int[m];             //          памяти под массив
cout<<"введите элементы массива"<<endl;
 for (i=1; i<=n; i++)
    {
        for (j=1; j<=m; j++)
          { 
                    cin>>mass[i][j];// водим массив
          }
    } 
  for (i=1; i<=n; i++)
  {    
        for (j=1; j<=m; j++)
        {         
            if (mass[i][j]==0)// если не равно 0 тогда....
             {
                count1++;//нарастили счетчик
             }
        }
      if (!count1)// если коли. нулевых элементов в массиве равно количество строк тогда
        {
          count++;// нарастили счетчик
        }
        count1=0;// обнулили счетчик
   }  
    cout<<"количество строк не содержащие нулевые эжлементы "<<count<<endl;// выводим результат
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.04.2013, 10:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос максимальный из элементов встречающийся в матрице более 1 раза (C++):

Двумерные массивы. Найти максимальный среди элементов, повторившихся более одного раза - C++
Дан массив A. Найти максимальный среди элементов, повторившихся более одного раза.

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

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

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

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

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

30
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
04.05.2013, 19:53 #16
Цитата Сообщение от Туся111 Посмотреть сообщение
это возможно?
Возможно. Сформулируйте задание ПОЛНОСТЬЮ. Постараюсь Вам помочь.
0
kamre
126 / 130 / 4
Регистрация: 25.12.2011
Сообщений: 443
05.05.2013, 00:56 #17
Цитата Сообщение от Туся111 Посмотреть сообщение
максимальный из элементов встречающийся в матрице более 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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>
#include <fstream>
#include <iomanip>
#include <algorithm>
#include <vector>
#include <map>
 
using namespace std;
 
typedef vector<int> row_t;
typedef vector<row_t> matrix_t;
 
bool find_max_dup(const matrix_t & matrix, int & max_dup)
{
    // count each value in the matrix
    typedef map<int, int> map_t;
    map_t count;
    for (const auto & row : matrix) {
        for (auto elem : row) {
            count[elem]++;
        }
    }
    // find duplicate with maximum value
    typedef map_t::value_type val_t;
    auto comp = [] (val_t v0, val_t v1) -> bool {
        return (v0.second <= 1) ||
               (v1.second > 1 && v0.first < v1.first);
    };
    map_t::const_iterator iter = max_element(count.begin(),
                                             count.end(),
                                             comp);
    max_dup = iter->first;
    return iter->second > 1;
}
 
int main()
{
    // read matrix from file
    ifstream inp("input.txt");
    int n, m;
    inp >> n >> m;
    matrix_t matrix(n, row_t(m));
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            inp >> matrix[i][j];
        }
    }
    // print matrix
    for (const auto & row : matrix) {
        for (auto elem : row) {
            cout << setw(5) << elem;
        }
        cout << endl;
    }
    // find maximum among duplicates
    int max_dup;
    if (!find_max_dup(matrix, max_dup)) {
        cout << "No duplicates!" << endl;
    } else {
        cout << "Maximum duplicate: " << max_dup << endl;
    }
}
Цитата Сообщение от input.txt
5 5
0 1 0 1 0
1 0 2 0 0
0 0 3 0 1
0 1 4 0 3
0 0 5 0 0
Цитата Сообщение от stdout
0 1 0 1 0
1 0 2 0 0
0 0 3 0 1
0 1 4 0 3
0 0 5 0 0
Maximum duplicate: 3
Добавлено через 4 часа 45 минут
Концовку функции find_max_dup можно немного упростить, учитывая что в std::map все хранится в сортированном виде:
C++
1
2
3
4
5
6
7
    // find duplicate with maximum value
    auto iter = find_if(count.rbegin(), count.rend(),
                        [] (map_t::value_type v) { return v.second > 1; });
    if (iter == count.rend())
        return false;
    max_dup = iter->first;
    return true;
0
Туся111
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 43
05.05.2013, 06:25  [ТС] #18
Цитата Сообщение от Tulosba Посмотреть сообщение
Возможно. Сформулируйте задание ПОЛНОСТЬЮ. Постараюсь Вам помочь.
Максимальный элемент встречающийся в матрице более 1 раза, т.е дана матрица:
1 2
1 3
максимальным элементом будет 1
1 2
3 4
Одинаковых элементов нет
теперь понятно???

Добавлено через 1 час 3 минуты
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
90
91
void main(void) // головная программа
{
setlocale (0, "Rus"); // русский язык
int a;
do
{
int count=0; // счетчик
int count1=0; 
int n; // переменая для количества строк
int m; //переменая для количества столбцов
int i, x; //обьяв. переменую
int j, z; //обьяв. переменую
cout<<"введите количество строк"<<endl;
        cin>>n;// вводим кол строк
cout<<"введите количество столбцов"<<endl;
        cin>>m;// водим количество столбцов
        int**mass=new int*[n];                  //      динамическое 
for (i=1; i<=n; i++)                    //      выделение
    mass[i]=new int[m];             //          памяти под массив
cout<<"введите элементы массива"<<endl;
 for (i=1; i<=n; i++)
    {
        for (j=1; j<=m; j++)
          { 
                    cin>>mass[i][j];// водим массив
          }
    } 
  for (i=1; i<=n; i++)
  {    
        for (j=1; j<=m; j++)
        {         
            if (mass[i][j]==0)// если не равно 0 тогда....
             {
                count1++;//нарастили счетчик
             }
        }
      if (!count1)// если коли. нулевых элементов в массиве равно количество строк тогда
        {
          count++;// нарастили счетчик
        }
        count1=0;// обнулили счетчик
   }  
    cout<<"количество строк не содержащие нулевые эжлементы "<<count<<endl;// выводим результат
for(int c=1;c<=(n*m);c++)//колличество проходов
    {
        //в строках упорядочиваем
        //____________________________________________
       for(i=1;i<=n;i++)
         {
           for(j=1;j<=m-1;j++)
            {
              if(mass[i][j]>mass[i][j+1])
               {
                 int temp=mass[i][j];
                 mass[i][j]=mass[i][j+1];
                 mass[i][j+1]=temp;
               }
            }
         }
       //в столбах упорядочиваем
       //_____________________________________________
       for( x=1;x<=m;x++)
         {
           for( z=1;z<=n-1;z++)
            {
              if(mass[z][x]>mass[z][x+1])
               {
                 int temp=mass[z][x];
                 mass[z][x]=mass[z][x+1];
                 mass[z][x+1]=temp;
               }
           }
        }
     }
    //вывод на экран после сортировки
    //__________________________________________________________
    
    cout<<"После сортировки по возрастанию""\n\n\n\n";
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            cout<<mass[i][j]<<"\t";
        }
        cout<<"\n\n\n\n";
    }
cout << "Повторить нажми 0" << endl; // вывод сообщения на экран
cin>> a;
}
 while(a==0);
}
найдите ошибку в сортировке я ввожу
1 2
3 5
он выводит
0 1
3 5
откуда взялся 0??? и где 2?
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
05.05.2013, 11:17 #19
Туся111, вот вариант в Вашем стиле:
Кликните здесь для просмотра всего текста
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
90
91
92
93
94
#include <iostream>
 
using namespace std;
 
int main() // головная программа
{
    setlocale (0, "Rus"); // русский язык
    int a;
    do
    {
        int count=0; // счетчик
        int count1=0;
        int n; // переменая для количества строк
        int m; //переменая для количества столбцов
        cout<<"введите количество строк"<<endl;
        cin>>n;// вводим кол строк
        cout<<"введите количество столбцов"<<endl;
        cin>>m;// водим количество столбцов
        int**mass=new int*[n]; // динамическое
        for (int i=0; i<n; i++) // выделение
        mass[i]=new int[m]; // памяти под массив
        cout<<"введите элементы массива"<<endl;
        for (int i=0; i<n; i++)
        {
            for (int j=0; j<m; j++)
            {
                cin>>mass[i][j];// водим массив
            }
        }
        for (int i=0; i<n; i++)
        {
            for (int j=0; j<m; j++)
            {
                if (mass[i][j]==0)// если не равно 0 тогда....
                {
                    count1++;//нарастили счетчик
                }
            }
            if (!count1)// если коли. нулевых элементов в массиве равно количество строк тогда
            {
            count++;// нарастили счетчик
            }
            count1=0;// обнулили счетчик
        }
        cout<<"количество строк не содержащие нулевые эжлементы "<<count<<endl;// выводим результат
        for(int c=1;c<=(n*m);c++)//колличество проходов
        {
        //в строках упорядочиваем
        //____________________________________________
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<m-1;j++)
                {
                    if(mass[i][j]>mass[i][j+1])
                    {
                        int temp=mass[i][j];
                        mass[i][j]=mass[i][j+1];
                        mass[i][j+1]=temp;
                    }
                }
            }
        
        //в столбах упорядочиваем
        //_____________________________________________
            for( int i=0;i<n-1;i++)
            {
                for( int j=0;j<n;j++)
                {
                    if(mass[i][j]>mass[i+1][j])
                    {
                        int temp=mass[i][j];
                        mass[i][j]=mass[i+1][j];
                        mass[i+1][j]=temp;
                    }
                }
            }
        }
        //вывод на экран после сортировки
        //__________________________________________________________
 
        cout<<"После сортировки по возрастанию""\n\n\n\n";
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<m;j++)
            {
                cout<<mass[i][j]<<"\t";
            }
            cout<<"\n\n\n\n";
        }
        cout << "Повторить нажми 0" << endl; // вывод сообщения на экран
        cin>> a;
    }
    while(a==0);
}

Главная ошибка у Вас была в том, что индексация массивов в С++ идет с нуля, а не с единицы.
Однако, ни о каком поиске максимальных повторяющихся значений тут речи пока не идет.
Если исправленный вариант кода устроит, можно уже прикручивать поиск максимумов. Если нет, то я бы не стал мешать несколько задач в кучу. Сначала надо разобраться с чем-то одним.
P.S. Не забывайте использовать для оформления кода соответствующие теги.
0
daslex
1285 / 529 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
05.05.2013, 12:19 #20
Немного не доделанный, но вот вам вариант решения согласно вашему условию
максимальный из элементов встречающийся в матрице более 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
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <iostream>
#include <ctime>
using namespace std;
 
/*ФУНКЦИЯ ВЫДЕЛЯЕТ ПАМЯТЬ ДЛЯ ДВУМЕРНОГО МАССИВА*/
void initmas(int **(&mas),int N,int M)
{
    mas=new int*[N];
    for (int i=0;i<M;i++)
    {
        mas[i]=new int[M];
    }
}
 
/*ФУНКЦИЯ ОЧИЩАЕТ ПАМЯТЬ ОТ ВЫДЕЛЕННОЙ ПАМЯТИ ПО ДВУМЕНРНЫЙ МАССИВ*/
void destroymas(int **(&mas), const int N,const int M)
{
  for (int i = 0; i < M; i++)
  {
     delete [] mas[i];
  }
  
}
 
/*ФУНКЦИЯ ЗАПОЛНЯЕТ ДВУМЕРНЫЙ МАССИВ ДАННЫМИ*/
void fillmas(int **(&mas),int N,int M)
{
   srand(time(NULL)); //Использован генератор случайных значений для экономии времени
   for (int i=0;i<N;i++)
   {
       for (int j=0;j<M;j++)
       {
           mas[i][j]=rand()%50+1;
       }
   }
}
 
/*ФУНКЦИЯ ПОКАЗЫВАЕТ ДВУМЕРНЫЙ МАССИВ НА ЭКРАНЕ*/
void showmas(int **(&mas),int N,int M)
{
    for (int i=0;i<N;i++)
    {
        for (int j=0;j<M;j++)
        {
            cout<<mas[i][j]<<"\t";
        }
        cout<<"\n";
    }
}
 
 
/*ФУНКЦИЯ ДЛЯ ПОЛУЧЕНИЯ ЭЛЕМЕНТОВ ДВУМЕРНОГО МАССИВА В ПОРЯДКЕ ВОЗРАСТАНИЯ
Т.Е. нужна для определения каждого из последующих вероятных максимумов*/
void createsortmas(int **mas,int N,int M)
{
   int *temp=new int[N*M]; //Один из самых простых вариантов рассматривать двумерный массив как одномерный
   int count=0; //индексы одномерного массива
 
   /*Копируем данные двумерного массива в одномерный*/
   for (int i=0;i<N;i++)
   {
       for (int j=0;j<M;j++)
       {
          temp[count]=mas[i][j];
          count++;
       }       
   }
 
   /*НЕ эффективная, но максимально простая пузырьковая сортировка одномерного массива*/
    for (int i=1;i<N*M;i++) 
    {
        for (int j=0;j<N*M-1;j++)
        {
                  if (temp[j]<temp[j+1]) swap(temp[j],temp[j+1]); //Если текущий элемент больше следующего, меняем их местами
        }
    }
 
   /*АНАЛИЗ ОДНОМЕРНОГО МАССИВА НА ДВА ИДУЩИХ ПОДРЯД ОДИНАКОВЫХ ЭЛЕМЕНТОВ (в нашем случае это и есть максимум, встречающийся два раза)*/
   for (int i=0;i<N*M;i++)
   {
       if (temp[i]==temp[i+1])
       {
           cout<<"Максимальный элемент, встречающийся более одного раза = ";
           cout<<temp[i];
           break;
       }
   }
   //Остается дописать несложное условие на случай если таких элементов в массиве не будет
   
   delete []temp; //Не забываем чистить память
  
}
 
int main()
{
 
    
    int N=3,M=4,**Arr=NULL,**temp=NULL; //N строки,M столбцы, Arr массив
 
    
    initmas(Arr,N,M); //Выделение памяти
    fillmas(Arr,N,M); //Заполнение массива
    showmas(Arr,N,M); //Показываем что получилось
    createsortmas(Arr,N,M); //Функция создает одномерный массив на основе двумерного и анализирует максимумы
    destroymas(Arr,N,M); //Очистка памяти
 
 
 
 cin.get();
 cin.get();
 
 
 
}
1
kamre
06.05.2013, 10:14
  #21

Не по теме:


Цитата Сообщение от daslex Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
/*ФУНКЦИЯ ВЫДЕЛЯЕТ ПАМЯТЬ ДЛЯ ДВУМЕРНОГО МАССИВА*/
void initmas(int **(&mas),int N,int M)
{
   mas=new int*[N];
  for (int i=0;i<M;i++)
   {
     mas[i]=new int[M];
   }
}
Почему все так любят вручную с памятью возиться? Чем это лучше простого:
C++
1
vector<vector<int> > mas(n, vector<int>(m));
?

0
Tulosba
06.05.2013, 10:45
  #22

Не по теме:

Цитата Сообщение от kamre Посмотреть сообщение
Почему все так любят вручную с памятью возиться?
Потому что раздел для начинающих. Изучают основы.

0
kamre
06.05.2013, 12:21
  #23

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
Потому что раздел для начинающих. Изучают основы.
Так это же раздел по C++, а не по чистому C. Разве основы C++ не включают STL?

0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
06.05.2013, 12:36 #24
kamre, а в чистом Си new нет, там *alloc'и всевозможные Когда ТС не знает базовых вещей, типа ввода/вывода, циклов, массивов грузить его неокрепший мозг STL'ями преждевременно. Ручным выделением памяти, в принципе тоже. Но по мере обучения, всё равно сначала надо научиться выделять память руками, а потом, осознав, что это не очень удобно и чревато нехорошими последствиями при недостаточной внимательности, научиться пользоваться стандартной библиотекой. Как говорится, от простого к сложному.
0
Туся111
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 43
07.05.2013, 11:02  [ТС] #25
Цитата Сообщение от daslex Посмотреть сообщение
Немного не доделанный, но вот вам вариант решения согласно вашему условию
максимальный из элементов встречающийся в матрице более 1 раза
спасибо огромное очень помогли))))))))))))))))

Добавлено через 1 час 54 минуты
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
void main(void) // головная программа
{
setlocale (0, "Rus"); // русский язык
int a;
do
{
int count=0; // счетчик
int count1=0; 
int n; // переменая для количества строк
int m; //переменая для количества столбцов
int i; //обьяв. переменую
int j; //обьяв. переменую
cout<<"введите количество строк"<<endl;
        cin>>n;// вводим кол строк
cout<<"введите количество столбцов"<<endl;
        cin>>m;// водим количество столбцов
        int**mass=new int*[n];                  //      динамическое 
for (i=1; i<=n; i++)                    //      выделение
    mass[i]=new int[m];             //          памяти под массив
cout<<"введите элементы массива"<<endl;
 for (i=1; i<=n; i++)
    {
        for (j=1; j<=m; j++)
          { 
                    cin>>mass[i][j];// водим массив
          }
    } 
  for (i=1; i<=n; i++)
  {    
        for (j=1; j<=m; j++)
        {         
            if (mass[i][j]==0)// если не равно 0 тогда....
             {
                count1++;//нарастили счетчик
             }
        }
      if (!count1)// если коли. нулевых элементов в массиве равно количество строк тогда
        {
          count++;// нарастили счетчик
        }
        count1=0;// обнулили счетчик
   }  
    cout<<"количество строк не содержащие нулевые эжлементы "<<count<<endl; // выводим результат
    int k;
    k=n*m;  
int* temp = new int[k]; //Один из самых простых вариантов рассматривать двумерный массив как одномерный
   int wr=0; //индексы одномерного массива
 
   //Копируем данные двумерного массива в одномерный
   for (int i=1;i<=n;i++)
   {
       for (int j=1;j<=m;j++)
       {
          wr++;
           temp[wr]=mass[i][j];
          cout << temp[wr]<<endl;
       }       
   }
 
   //сортировка одномерного массива
    for (int i=1;i<=n*m;i++) 
    {
        for (int j=1;j<=n*m-1;j++)
        {
                  if (temp[j]<temp[j+1]) swap(temp[j],temp[j+1]); //Если текущий элемент больше следующего, меняем их местами
        }
    }
 int nm=0;
     //АНАЛИЗ ОДНОМЕРНОГО МАССИВА НА ДВА ИДУЩИХ ПОДРЯД ОДИНАКОВЫХ ЭЛЕМЕНТОВ (это и есть максимум, встречающийся два раза)
   for (int i=1;i<=n*m;i++)
   {
       if (temp[i]==temp[i+1])
       {
           int nm=i;
        
       }            
   }
 if (nm==0)
     {cout << "Одинаковых элементов нет" << endl; } 
 else
    {cout<<"Максимальный элемент, встречающийся более одного раза = ";
 cout<<temp[nm];}
cout << "Повторить нажми 0" << endl; // вывод сообщения на экран
cin>> a;
}
 while(a==0);
}
у меня выводит неправильно, в чем проблема? напишите нормальный вывод?)) если я вывод запихаю в цикл он несколько раз ту же строку выводить будет, отдельное условие не получается сделать(заранее спасибо)
0
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
07.05.2013, 11:50 #26
Цитата Сообщение от Туся111 Посмотреть сообщение
у меня выводит неправильно, в чем проблема?
Я же Вам говорил (максимальный из элементов встречающийся в матрице более 1 раза) про индексацию с 0. Совсем не слушаете советы.
0
daslex
1285 / 529 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
07.05.2013, 12:18 #27
Туся111, вот лень делать пока что.
У меня в том коде много ошибок. И никто говорить о них вам не хочет.

предлагаю вам зайти с другого конца.
получать из массива те элементы, которые встречаются более чем 2 раза.
по ходу получения элемента из массива сразу определять является ли большим полученный элемент.

может так будет проще.
0
Genn55
372 / 219 / 41
Регистрация: 26.12.2012
Сообщений: 718
09.05.2013, 00:55 #28
Туся111 попытался исправить вашу программу быстро не получилось.Вы все советы запхали в кучу и разгрести не так просто,хотя все что вам предлагали работает так как понял каждый.Я вам предлагаю свой вариант он работает так как вы указали в примере и судя по вашей программе.Потестируйте,что не понятно спрашивайте помогу чем смогу.
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<Windows.h>
 
using namespace std;//пространство имен
 
int main()//главная функция
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);//русский
 
    srand(time(NULL));//для правильной работы рандомизатора
 
         int n=0,m=0,label,flag=1;//необходимые переменные
for (;;)
{
    cout <<"Введите количество строк"<<"\n";
    cin >> n;
    cout<<"Введите количество столбцов"<< "\n";
    cin >> m;
    // динамическое создание двумерного массива
    int **A = new int* [n]; // строк в массиве
    for (int i = 0; i < n; i++)
        A[i] = new int [m]; // столбцов
    // заполнение массива и вывод на экран
    /////////////////////////////////////////////////////////////////
//каким образом будем заполнять массив
cout << "  Заполнение массива : случайно - 0, вручную - 1 "<<"\n";
cin >> label;
cout << "\n";
//если будем заполнять вручную, вводим с клавиатуры
 if(label==1)
 {
    cout<<"введите элементы массива";
    cout << "\n";
   for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
         {
           cin >> A[i][j];
         }
     }
 
 }
 //чтобы не умереть за клавиатурой при вводе больших массивов
// заполняем рандомно
    else
     for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
         {
            A[i][j]=rand()%100-50;//заполняем в интервале -50 +50
            cout<<A[i][j]<<"\t";// выводим сформированный массив
         }
        cout<<"\n";
    }
 
///////////////////////////////////////////////////
//ищем не нулевые строки
 int mark=0,count=0;
    for(int i=0; i<n; i++)// перебираем отдельные строки
    {
        mark = 0;//обнуляем при каждом входе в цикл
        for(int j=0; j<m; j++)//
        {
            if(A[i][j]==0)// считаем элементы, которые равны 0
            mark++;
        }
        if(mark==0)// считаем строки, в которых нет нулевых элементов
            count++;
    }
    cout<<"\n\n";
    cout<<"Количество строк, не содержащих ни одного нулевого элемента: "<<count<<"\n\n";
    ///////////////////////////////////////////////////////////////////////
   int *B=new int[n*m]; //одномерный массив
   int namber=0; //индексы одномерного массива
 
  //Копируем данные двумерного массива в одномерный
   for (int i=0;i<n;i++)
   {
       for (int j=0;j<m;j++)
       {
          B[namber]=A[i][j];
          namber++;
       }
   }
 /////////////////////////////////////////////////////////////
 //контрольный вывод для работы не нужен только для теста
 for (int i=0;i<n*m;i++)
 cout<<B[i]<<",";
 cout<<"\n\n";
 /////////////////////////////////////////////////////////////////////////
  // Удаление массива
    for (int i = 0; i < n; i++)
    {
        delete[]A[i]; // Удаляем каждый элемент
    }
    delete [] A; // А потом массив
    ///////////////////////////////////////////////////////////////////////
     //сортируем пузырьком
 for (int i = 1; i < n*m; i++)//внешний цикл
 for (int j = 0; j < n*m - 1; j++)//внутренний цикл
    if (B[j] > B[j + 1])
      {
        int temp = B[j];
            B[j] = B[j + 1];//заменяем элементы
            B[j + 1] = temp;
      }
 ////////////////////////////////////////
  //контрольный вывод для работы не нужен только для теста
//выводим на экран отсортированный массив
for (int k = 0; k < n*m; k++)
cout << B[k] << ",";
cout<<"\n\n";
 
/////////////////////////////////////////////////////////////////////////////////
//ищем максимальный элемент, встречающийся более одного раза
 bool var = 0;
   for (int i=n*m;i>=0;i--)//проходим массив с конца все макс в конце
   {
       if (B[i]==B[i-1])
       {
           cout <<"Максимальный элемент, встречающийся более одного раза =  "<< B[i]<<"\n\n";
          var = 1;//если есть меняем флаг
           break;
       }
    }
   if (var == 0)
 cout <<"В массиве нет элементов, встречающийся более одного раза  "<<"\n\n";
 var = 0;//меняем при выходе из цикла
    // Удаление массива
   delete [] B;
 cout << "Повторить? да нажми 1 нет нажми 0 " << endl; // вывод сообщения на экран
cin>> flag;//если 1 возвращаемся в начало
if (flag ==0)//завершение программы
break;
}
    /////////////////////////////////////////////////////////////////////////
return 0;
}
Я вам ее разбил на отдельные блоки.Контрольные выводы хотите удаляйте,хотите нет на работе это не скажется никак.
P.S Не забывайте про кнопочку люди старались для вас.
0
daslex
1285 / 529 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
09.05.2013, 01:45 #29
Туся111, а вот вам и тот вариант, который я предлагал как вариант с другим подходом.

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
90
91
92
93
94
95
96
97
98
99
100
101
#include <iostream>
#include <ctime>
 
using namespace std;
 
/*ЗАПОЛНЕНИЕ ДВУМЕРНОГО ДИНАМИЧЕСКОГО МАССИВА*/
void fillmas(int *mas[],const int N,const int M)
{
    srand(time(NULL)); //Генератор псевдослучайных значений включаем
    for (int i=0;i<N;i++)
    {
        for (int j=0;j<M;j++)
        {
            mas[i][j]=rand()%20+1; //Генерируем элементы
        }
    }
}
 
/*ПОКАЗЫВАЕМ ИСХОДНЫЙ МАССИВ НА ЭКРАНЕ*/
void showmas(int *mas[],const int N,const int M)
{
    for (int i=0;i<N;i++)
    {
        for (int j=0;j<M;j++)
        {
            cout<<mas[i][j]<<"\t";
        }
        cout<<"\n";
    }
}
 
/*ВОТ ВАША ЗАДАЧА */
void search_double_max(int *mas[],const int N,const int M)
{
    int *temp=new int[N*M]; //Создаем одномерный массив для копирования в него элементов двумерного
    int count=0; //Будущий индекс одномерного массива 
    bool flag=false; //Признак того, что в массиве есть дважды встречающийся элемент
 
    /*КОПИРУЕМ ДАННЫЕ ИЗ ДВУМЕРНОГО МАССИВА В ОЛНОМЕРНЫЙ*/
    for (int i=0;i<N;i++)
    {
        for (int j=0;j<M;j++)
        {
            temp[count]=mas[i][j];
            count++;
        }
    }
 
    /*АНАЛИЗ ДУБЛИКАТОВ И ОПРЕДЕЛЕНИЕ МАКСИМУМА*/
    int max=0; //в эту переменную запишем максимальный элемент, встречающийся более 1 раза
 
    /*БРУТФОРС МАССИВА, СРАВНИВАЕМ ЭЛЕМЕНТЫ*/
    for (int i=0;i<N*M-1;i++)
    {
        for (int j=i+1;j<N*M;j++)
        {
            if (temp[i]==temp[j]) //Если найден дубликат, то 
            {
                if (false==flag) //Сначала определяем был ли дубликат найден ранее, если нет
                {
                    flag=true; //Обозначаем, что дубликат уже один раз был найден
                    max=temp[i]; //Записываем значение как максимум. В дальнейшем его сравниваем и при необходимости перезаписываем
                }
                else //если дубликат ранее уже определялся, то
                {
                    if (max<temp[i]) max=temp[i]; //Сравниваем текущий максимум с элементом из массива и определяем, что из них больше. При необходимости обновляем максимум.
                }
            }
        }
    }
 
    cout<<"\n";
 
    
    delete []temp; //Очищаем память от динамически созданного одномерного массива
 
    if (flag) cout<<"МАКСИМУМ = "<<max<<"\n"; //Если признак дубликатов был изменен, выводим максимум
    else cout<<"В массиве не было найдено подходящих значений\n"; //Иначе выводим сообщение о неуспешном поиске
}
 
void main()
{
    system("CHCP 1251"); //Это для кодировки (при шрифте lusidia console)
    int **mas=NULL; //Анализируемый двумерный массив
    int N=3,M=3; //Число колонок и строк массива
 
    /*ВЫДЕЛЕНИЕ ПАМЯТИ ПОД ДВУМЕРНЫЙ МАССИВ*/
    mas=new int*[N]; 
    for (int i=0;i<N;i++) mas[i]=new int[M];
 
 
       fillmas(mas,N,M); //Заполнение массива
       showmas(mas,N,M); //Показываем массив
       search_double_max(mas,N,M); //Ищем максимум, встречаемый более чем 1 раз
 
    /*ОЧИСТКА ПАМЯТИ ОД ДВУМЕРНОГО МАССИВА*/
    for (int i=0;i<N;i++) delete []mas[i];
    delete []mas;
 
    cin.get();
}
0
Туся111
0 / 0 / 0
Регистрация: 18.03.2013
Сообщений: 43
10.05.2013, 07:20  [ТС] #30
Tulosba, я все программы пишу с 1, так что это тоже правильно)

Добавлено через 32 секунды
всем большое спасибо, у меня все работает
0
10.05.2013, 07:20
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.05.2013, 07:20
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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