Повтор двумерный массив

149
16 марта 2019, 13:50

Задача: выяснить, есть ли одинаковые числа в массиве или же массив содержит только разные.

Задал двумерный массив случайными значениями, вывел. Некоторые переменные введены с заделом на следующие задачи.

На стадии проверки я хочу:

1) Остановить цикл там, где находится первый повтор. Сейчас цикл проверяет все значения массива

2) Вывести в cout повторяющиеся значения без повторов (если "2" встречается в массиве 3 раза, то я вывожу его только один раз.

Как это можно грамотно реализовать?

#include "pch.h"
#include <iostream>
#include <time.h>
#include <iomanip>
using namespace std;
int main()
{
srand(time(0));
const int N = 5; //строки
const int M = 5; // столбцы
int a[N][M]; //массив
int i, j, k, l; //счётчики циклов
int temp; //переменная, которая проверяет повторность
int crep = 0; //счётчик повторов
int cnotrep = 0; //счётчик разности
int saveeq = 0; //сохраняет повторяющиеся значения
bool flag = false;
for (i = 0; i < N; i++) {
    for (j = 0; j < M; j++) {
        a[i][j] = rand() % 10;
    }
}
for (i = 0; i < N; i++) {
    for (j = 0; j < M; j++) {
        cout << setw(3) << a[i][j] << " ";
    }
    cout << '\n' << '\n';
}
for (i = 0; i < N; i++) {
    for (j = 0; j < M; j++) {
        for (k = i; k < N; k++) {
            for (l = j; l < M; l++) {
                temp = a[i][j];
                if (temp == a[k][l] && (&a[i][j] != &a[k][l]))
                {
                    flag = true;
                    break;
                    cout << temp << " ";
                }
            }
        }
    }
}
cout << '\n' << '\n';
if (flag == true) cout << "There are equal. Number of equal: " << crep;
else cout << "There are not equal. Number of equal: " << crep;
cout << '\n' << '\n';
Answer 1

Путём сортировки и создания одномерного массива всё делается просто и красиво, тут можно и количество повторов, и вхождения, и всё, что душа пожелает. Код прилагаю (буду рад комментариям).

Интересует именно реализация перебора значений матрицы, её логика и синтаксис. Возможно ли вообще посредством циклов и условий корректно перебрать двумерный массив. Буду очень благодарен за элементарный пример.

#include "pch.h"
#include <iostream>
#include <time.h>
#include <iomanip>
using namespace std;
int main()
{
srand(unsigned(time(0)));
const int N = 10; //строки
const int M = 10; // столбцы
const int P = N * M;
int a[N][M]; //массив
int b[P]; //одномерный массив для проверки
int c; //временная переменная
int i, j, k, l; //счётчики циклов
bool equal = false; // переменная, говорящая о наличии повтора
int count = 0; //счётчик повторов
int number = 0; // нумерация значений
int total = 0; // сколько всего повторов
for (i = 0; i < N; i++) {   
    for (j = 0; j < M; j++) {
        a[i][j] = rand() % 10; // заполнили массив случайным числами
    }
}  
for (i = 0; i < N; i++) {
    for (j = 0; j < M; j++) {
        cout << setw(3) << a[i][j] << " "; //вывели
    }
    cout << '\n' << '\n';
}
for (i = 0; i < N; i++) {
    for (j = 0; j < M; j++) {
        for (k = 0; k < N; k++) {
            for (l = 0; l < M; l++) {
                if (a[k][l] > a[i][j])
                {
                    c = a[k][l];
                    a[k][l] = a[i][j];  //отсортировали
                    a[i][j] = c;
                }
            }
        }
    }
}
cout << '\n' << '\n';
for (i = 0; i < N; i++) {
    for (j = 0; j < M; j++) {
        cout << setw(3) << a[i][j] << " "; //вывели сортировку
    }
    cout << '\n' << '\n';
}
cout << '\n' << '\n';
for (k = 0; k < P; k++) {
    for (i = 0; i < N; i++) {
       for (j = 0; j < M; j++) {
           b[k] = a[i][j];
           cout << b[k] << " ";             //запихали в одномерный
           k++;
    }
    }
    break;
}
cout << '\n' << '\n';
for (k = 0; k < P; k++)
{
    c = b[k];
    number = c;
    if (c == b[k + 1])
    {
        count = count + 1;  // проверяем одномерный на повторы
        equal = true;
        total = total + 1;
    }
    if (c != b[k + 1])
    { 
        cout << "Number " << number << " repeats : " << count << endl;
        number = number + 1;
        count = 0;
    }
}
    if (equal == true)
{
    cout << '\n' << "There are " << total << " repeats" << '\n' << '\n';
}
else cout << "There are not repeats";
}
Answer 2
#include <iostream>
#include <time.h>
#include <iomanip>
#include <set>
using namespace std;
int main()
{
    srand(unsigned(time(0)));
    const int N = 10; //строки
    const int M = 10; // столбцы
    const int P = N * M;
    set <int> temp;
    set <int> double_temp;
    int a[N][M]; //массив
    int i, j, k, l; //счётчики циклов
    for (i = 0; i < N; i++) {   
        for (j = 0; j < M; j++) {
            a[i][j] = rand() % 10; // заполнили массив случайным числами
            if (temp.count(a[i][j])) double_temp.insert(a[i][j]);
            temp.insert(a[i][j]);
        }
    }
    for (const auto &i:double_temp) cout << i << endl;
}
READ ALSO
Какие есть библиотеки или методы для постоянного получения снимков экрана?

Какие есть библиотеки или методы для постоянного получения снимков экрана?

Есть ли какие-нибудь библиотеки или методы для постоянного получения снимков экрана? Максимальная частота снимков - 60/сек, но в случае если...

138
Ошибка в NetBeand IDE 8.2

Ошибка в NetBeand IDE 8.2

Установил NetBeans, с самого начала была эта ошибкаУже и MinGW переустанавливал, и пути все проверял, ничего не помогло

168
Проверка симметричности строки

Проверка симметричности строки

Нужно как то проверить симметричность строки относительно центраВернее: здесь идет проверка строки

177
Не работает контекстное меню

Не работает контекстное меню

У меня есть в форме listWidgetВ конструкторе окна я привязываю customContextMenuRequested к моей функции ShowContextMenu:

140