Многомерные массивы

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

Хочу посмотреть коды,кто как решает,и разобраться лучше. Просто мне что то не доходит.

MonkeyHip, ты выложи свой код, объясни в каком месте тебе не доходит, глядишь и ситуация прояснится ;)

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

Найти номер первого из столбцов, не содержащих ни одного отрицательного элемента.( ну вот тут я думаю нужно проверять столбцы если хоть 1 отриц элемент, «браковать ее» и идти дальше, пока условию не подойдет.

"
а вот здесь я вообще не могу придумать условие Проверить, все ли строки матрицы содержат хотя бы один нулевой элемент. Если нет, то заменить значения всех отрицательных элементов матрицы на нулевые.
Кто хорошо разбирается помогите пожалуйста.

Это один из вариантов как можно в матрице найти первую колонку в которой нет ни одного отрицательного числа.

Матрица фиксированная 5 строк x 4 столбца

#include <iostream>
using std::cout;
using std::right;

#include <cstdlib>      // rand(), srand()
using std::rand;
using std::srand;

#include <ctime>            // time()
using std::time;

#include <iomanip>
using std::setw;

const int STR = 5;      // кол-во строк матрицы
const int COL = 4;      // кол-во столбцов матрицы

int main()
{
    int matrix[::STR][::COL];

    srand(static_cast<int>(time(0)));

    for (int a = 0; a < ::STR; a++){
        for (int b = 0; b < ::COL; b++){
            matrix[a][b] = -10 + rand() % 21;           // заполняем матрицу случ. числами от -10 до 10
            cout << setw(5) << right << matrix[a][b];   // выводим матрицу на экран
        }
        cout << '\n';
    }

    int foundColumn = 0;
    bool flag;

    for (int i = 0; i < ::COL; i++){            // здесь ищем колонки без отрицательных чисел
        for(int j = 0; j < ::STR; j++){
            if (matrix[j][i] >= 0){
                flag = true;
                continue;
            }
            else{
                flag = false;
                break;
            }
        }
        if (flag)
            foundColumn = i + 1;
    }

    if (foundColumn)
        cout << "Column number " << foundColumn << " hasn't any negative numbers.\n";
    else
        cout << "All columns contains negative numbers.\n";

    return 0;
}

Таким образом можно проверить матрицу на нулевые значения и в случае если в матрице они есть, заменить все отрицательные значения нулями.

#include <iostream>
using std::cout;
using std::right;

#include <cstdlib>      // rand(), srand()
using std::rand;
using std::srand;

#include <ctime>        // time()
using std::time;

#include <iomanip>
using std::setw;

const int STR = 5;      // кол-во строк матрицы
const int COL = 4;      // кол-во столбцов матрицы

int main()
{
    int matrix[::STR][::COL];

    srand(static_cast<int>(time(0)));

    for (int a = 0; a < ::STR; a++){
        for (int b = 0; b < ::COL; b++){
            matrix[a][b] = -10 + rand() % 21;           // заполняем матрицу случ. числами от -10 до 10
            cout << setw(5) << right << matrix[a][b];   // выводим матрицу на экран
        }
        cout << '\n';
    }

    int foundColumn = 0;
    bool flag = false;

    for (int i = 0; i < ::STR; i++){            // здесь ищем нулевое значение
        for(int j = 0; j < ::COL; j++){
            if (0 == matrix[i][j]){
                flag = true;
                break;
            }
        }
        if (flag)
            break;
    }

    cout << "\n\n";

    if (flag){                                  // если нулевое значение в матрице найдено...
        for (int i = 0; i < ::STR; i++){
            for (int j = 0; j < ::COL; j++){
                if (matrix[i][j] < 0)
                    matrix[i][j] = 0;           // заменяем отриц. числа нулями
                cout << setw(5) << right << matrix[i][j];   // и выводим результаты на экран
            }
            cout << '\n';
        }
    }
    else
        cout << "There is no any 0 value in matrix.\n"; // иначе выводим сообщение, что нулевых значений в матрице нет

    return 0;
}

Alf/ Спасибо тебе.сегодняшний вечер я буду сидеть и вникать в каждую строку. но у нас Си. я думаю я смогу разобраться.)

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

В общем в целом я разобраться, но не могу понять как сделать, что бы во втором было,( если нет нулевых значений) то оно заменяла отрицательные на нулевые.) как условие прописать.
вот у тебя получается, если они есть, то он заменяет,

if (0 == matrix[i][j]){
flag = true;
break;
}
}
if (flag)
break;
}

cout << "\n\n";

if (flag){                                  // если нулевое значение в матрице найдено...

В общем в целом я разобраться, но не могу понять как сделать, что бы во втором было,( если нет нулевых значений) то оно заменяла отрицательные на нулевые.) как условие прописать.
вот у тебя получается, если они есть, то он заменяет,

if (0 == matrix[i][j]){
flag = true;
break;
}
}
if (flag)
break;
}

cout << "\n\n";

if (flag){                                  // если нулевое значение в матрице найдено...

кажется понял,там просто в условии if (0 != massiv[i][j]) вот так нужно сделать. а еще, почему рандомные числа не новые каждый раз,я читал что то. но может можно как то сделать, что бы они все время были новые, и вот с этим условием Упорядочить строки целочисленной прямоугольной матрицы по возрастанию количества одинаковых элементов в каждой строке все равно не могу разобраться. а так в целом уже осваиваю по тихоньку.

2)Проверить, все ли строки матрицы содержат хотя бы один нулевой элемент. Если нет, то заменить значения всех отрицательных элементов матрицы на нулевые.

bool has_zero = true;    // флаг: в строке есть нулевой элемент
for (int i = 0; i < MAX_STR && has_zero; i++) {
    has_zero = false;
    for (int j = 0; j < MAX_COL && !has_zero; j++) {
        has_zero = 0 == array[i][j];
    }
}
if (!has_zero) {
    // в одной из строк нет нулевого элемента.
    // меняем все отрицательные элементы на 0
    for (int i = 0; i < MAX_STR; i++) {
        for (int j = 0; j < MAX_COL; j++) {
            if (array[i][j] < 0)
                array[i][j] = 0;
        }
    }
}

Не проверял, но вроде должно работать.

Макар, у меня немного другой код и вроде как рботает. ребят, кто может объяснить как выставить элементы каждого столбца по возрастанию

Найти номер первого из столбцов, не содержащих ни одного отрицательного элемента.

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

1)Упорядочить строки целочисленной прямоугольной матрицы по возрастанию количества одинаковых элементов в каждой строке.

А вот с этим посложнее. «Упорядочить строки» — я бы сделал матрицу как динамический двумерный массив. Т.е. как одномерный массив ссылок на массивы строк. Тогда операции со строками (т.е. с массивами) сведутся к операциям над указателями.

Можно попробовать такой алгоритм:

struct SStrInfo {   // вспомогательная структура для хранения информации для строки исходной матрицы
    int str_num;    // номер строки
    int repeats;    // количество одинаковых элементов
};

SStrInfo strinfos[MAX_STR];  // массив структур (размер - по количеству строк исходной матрицы)

// заполнить массив структур
for (int i = 0; i < MAX_STR; i++) {
    strinfos[i].str_num = i;
    strinfos[i].repeats = calc_repeats(array[i]);  // вызов функции подсчета одинаковых элементов в строке
}

qsort(strinfos, ...);  // отсортировать массив записей по полю repeats по возрастанию

int new_array = new int * [MAX_STR];  // создать новый массив указателей на массивы целых

// скопировать указатели на строки из исходного массива в новый
// в нужном порядке 
for (int i = 0; i < MAX_STR; i++) {
    new_array[i] = array[strinfos[i].str_num];
}

как выставить элементы каждого столбца по возрастанию

Копай функцию qsort() из стандартной библиотеки.

Копай функцию qsort() из стандартной библиотеки.

уж лучше std::sort.

std::sort работает с контейнерами STL. Здесь пока что все крутится без STL. Использовать вместе две технологии из-за одной функции — геморой. Тем более что задача про многомерные массивы, а не про вектора и пр.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.