Страница 1 из 1

[C++] Сравнить элементы массива в непрямоугольной матрице

Добавлено: 11 апр 2008, 02:00
mozg
Задание такое:
Из входного потока вводится непрямоугольная матрица целых чисел [aij], i=1, ...m, j=1, ...n, ni. Значения m и n заранее не известны и вводятся из входного потока.
Сформировать новую матрицу, поместив в её i-ую строку только те элементы из i-ой строки исходной матрицы, которые встречаются в ней два и более раз.
Исходную и полученную матрицы вывести в выходной поток с необходимыми комментариями.

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

Код: Выделить всё

#include <iostream>

using namespace std;
const int M = 100, N = 100;

void input(int (*p)[M], int mn, int nn);
void source(int &m, int (*p)[M]);
void result(int &m, int (*p)[M]);
int isIn(int &tmp, int &next);

int main(){
    int arr[M][N], m;
    input(arr, M, N);
    return 0;
}

void input(int (*p)[M], int mn, int nn){
    int m, n;
    const char* msg = "";
    do{
        cout << msg << endl;
        cout << "Enter quantity of a rows (not more then " << mn << "): ";
        cin >> m;
        //checking input...
        if(cin.fail())
        {
            cin.clear();
            cin.ignore();
        }
        msg = "Input error";
    } while(m < 1 || m > mn);
    
    for(int i=0;i<m;i++){
        msg = "";
        do{
            cout << msg << endl;
            cout << "Enter quantity of elements for a rows " << i + 1 << "(from 1 to " << (nn - 1) << "): ";
            cin >> n;
            //checking input...
            if(cin.fail()){
                cin.clear();
                cin.ignore();
            }
            msg = "Input error";
        } while(n < 1 || n > (nn - 1));
        p[i][0] = n; //saving quantity of elements in the first element of a row
        cout << "Enter values of a row: " << endl;
        for(int j=1;j<(n + 1);j++){
            cin >> p[i][j];
        }
    }
    //output
    source(m, p);
    result(m, p);
}

//source matrix
void source(int &m, int (*p)[M]){
    cout << endl << "Source matrix:" << endl;
    for(int i=0;i<m;i++){
        for(int j=1;j<p[i][0]+1;j++){
            cout << ((j != 1) ? ", " : "") << p[i][j];
        }
        cout << endl;
    }
}

//reslut matrix
void result(int &m, int (*p)[M]){
    int tmp, r[M][N], count;
    cout << endl << "Result matrix:" << endl;
    for(int i=0;i<m;i++){
        cout << "Row " << i+1 << ": ";
        for(int j=1;j<p[i][0]+1;j++){
            //вот тут отправляю значения в функцию и пытаюсь вываести повторяющиеся значения в каждой строке
            if(isIn(p[i][j], p[i][j+1])){
                cout << "Element : " << p[i][j];
            }
        }
        cout << endl;
    }
}

int isIn(int &tmp, int &next){
    if(tmp == next){
        return true;
    } else {
        return false;
    }
}

Re: [C++] Сравнить элементы массива в непрямоугольной матрице

Добавлено: 11 апр 2008, 04:26
mozg
А вроде как всё правильно сравнивается и выводится. Тогда вопрос следующий. Вот 3 функции из кода (немного обновленный). Как там сформировать новую матрицу(тоже непрямоугольную) и при записи нового элемента пробегаться уже по имеющимся, чтоб не записать число, которое там уже есть.

Код: Выделить всё

void result(int &m, int (*p)[M]){
    cout << endl << "Result matrix:" << endl;
    for(int i=0;i<m;i++){
        for(int j=1;j<p[i][0]+1;j++){
            if(isIn(p[i][j], p[i][j+1])){
                create(i, p[i][j]); //отправляем номер строки и сам элемент, хотя, может и ещё что-то надо
            }
        }
        cout << endl;
    }
}

//create new matrix
int create(int &line, int &n){
    int r[M][N]; //это будет результирующая матрица, которую потом надо вывести
    /*тут хотелось бы пробежаться по уже записанным элементам и, если очередного
 элемента там ещё нет(искать нужно в i-й строке новой матрицы,
а не по всему двумерному массиву), то записываем его в строку. */
    //потом полученную матрицу выводим...
}

int isIn(int &tmp, int &next){
    if(tmp == next){
        return true;
    } else {
        return false;
    }
}

Re: [C++] Сравнить элементы массива в непрямоугольной матрице

Добавлено: 11 апр 2008, 10:41
airyashov
есть непонятный момент
Сформировать новую матрицу, поместив в её i-ую строку только те элементы из i-ой строки исходной матрицы, которые встречаются в ней два и более раз.
так может и не матрица получится в полном смысле слова: а например так
строка 1: 1,3
строка 2: нет
строка 3: 5

Re: [C++] Сравнить элементы массива в непрямоугольной матрице

Добавлено: 11 апр 2008, 15:37
mozg
да, вывод результата вобщем-то такой и должен быть. Но это должна быть матрица. Только вот этого не будет "строка 2: нет", т.к. если одинаковых элементов нет, то в новой матрице просто эта строка и не сформируется.

Re: [C++] Сравнить элементы массива в непрямоугольной матрице

Добавлено: 11 апр 2008, 16:09
airyashov
по вашему нужно сделать в результирующей матрице счетчик элементов в каждой строке, а размерность строки будет максимум половине строки исходной

Re: [C++] Сравнить элементы массива в непрямоугольной матрице

Добавлено: 11 апр 2008, 16:32
mozg
При формировании исходной матрицы(функция input()) я кол-во элементов храню в первом элементе

Код: Выделить всё

        p[i][0] = n; //saving quantity of elements in the first element of a row
        cout << "Enter values of a row: " << endl;
        for(int j=1;j<(n + 1);j++){
            cin >> p[i][j];
        }
Можно и в результирующей так же поступать