Помогите пожалуйста с многомерными разобраться,
1)Упорядочить строки целочисленной прямоугольной матрицы по возрастанию количества одинаковых элементов в каждой строке. Найти номер первого из столбцов, не содержащих ни одного отрицательного элемента.
2)Проверить, все ли строки матрицы содержат хотя бы один нулевой элемент. Если нет, то заменить значения всех отрицательных элементов матрицы на нулевые.
Макар
А конкретно в чем проблема?
MonkeyHip
Хочу посмотреть коды,кто как решает,и разобраться лучше. Просто мне что то не доходит.
Alf
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;
}
MonkeyHip
Alf/ Спасибо тебе.сегодняшний вечер я буду сидеть и вникать в каждую строку. но у нас Си. я думаю я смогу разобраться.)
MonkeyHip
а ты не знаешь как можно упорядочить строки целочисленной прямоугольной матрицы по возрастанию количества одинаковых элементов в каждой строке.??
MonkeyHip
В общем в целом я разобраться, но не могу понять как сделать, что бы во втором было,( если нет нулевых значений) то оно заменяла отрицательные на нулевые.) как условие прописать.
вот у тебя получается, если они есть, то он заменяет,
if (0 == matrix[i][j]){
flag = true;
break;
}
}
if (flag)
break;
}
cout << "\n\n";
if (flag){ // если нулевое значение в матрице найдено...
MonkeyHip
В общем в целом я разобраться, но не могу понять как сделать, что бы во втором было,( если нет нулевых значений) то оно заменяла отрицательные на нулевые.) как условие прописать.
вот у тебя получается, если они есть, то он заменяет,
if (0 == matrix[i][j]){
flag = true;
break;
}
}
if (flag)
break;
}
cout << "\n\n";
if (flag){ // если нулевое значение в матрице найдено...
MonkeyHip
кажется понял,там просто в условии 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;
}
}
}
Не проверял, но вроде должно работать.
MonkeyHip
Макар, у меня немного другой код и вроде как рботает. ребят, кто может объяснить как выставить элементы каждого столбца по возрастанию
Макар
Найти номер первого из столбцов, не содержащих ни одного отрицательного элемента.
Вариация на ту же тему, что и во втором задании. Только сканировать матрицу по столбцам, а не по строкам. Если в столбце нет отрицательных элементов, то запомнить номер текущего столбца и выйти из циклов.
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];
}
Макар
как выставить элементы каждого столбца по возрастанию
std::sort работает с контейнерами STL. Здесь пока что все крутится без STL. Использовать вместе две технологии из-за одной функции — геморой. Тем более что задача про многомерные массивы, а не про вектора и пр.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Помогите пожалуйста с многомерными разобраться,
1)Упорядочить строки целочисленной прямоугольной матрицы по возрастанию количества одинаковых элементов в каждой строке. Найти номер первого из столбцов, не содержащих ни одного отрицательного элемента.
2)Проверить, все ли строки матрицы содержат хотя бы один нулевой элемент. Если нет, то заменить значения всех отрицательных элементов матрицы на нулевые.
А конкретно в чем проблема?
Хочу посмотреть коды,кто как решает,и разобраться лучше. Просто мне что то не доходит.
MonkeyHip, ты выложи свой код, объясни в каком месте тебе не доходит, глядишь и ситуация прояснится ;)
Примеры кода — Гугл тебе в помощь. Там примеров — море ))
Я вот в первом вот это не могу понять Упорядочить строки целочисленной прямоугольной матрицы по возрастанию количества одинаковых элементов в каждой строке. Помогите с условием тут, матрицы я введу уже.
Найти номер первого из столбцов, не содержащих ни одного отрицательного элемента.( ну вот тут я думаю нужно проверять столбцы если хоть 1 отриц элемент, «браковать ее» и идти дальше, пока условию не подойдет.
"
а вот здесь я вообще не могу придумать условие Проверить, все ли строки матрицы содержат хотя бы один нулевой элемент. Если нет, то заменить значения всех отрицательных элементов матрицы на нулевые.
Кто хорошо разбирается помогите пожалуйста.
Это один из вариантов как можно в матрице найти первую колонку в которой нет ни одного отрицательного числа.
Матрица фиксированная 5 строк x 4 столбца
Таким образом можно проверить матрицу на нулевые значения и в случае если в матрице они есть, заменить все отрицательные значения нулями.
Alf/ Спасибо тебе.сегодняшний вечер я буду сидеть и вникать в каждую строку. но у нас Си. я думаю я смогу разобраться.)
а ты не знаешь как можно упорядочить строки целочисленной прямоугольной матрицы по возрастанию количества одинаковых элементов в каждой строке.??
В общем в целом я разобраться, но не могу понять как сделать, что бы во втором было,( если нет нулевых значений) то оно заменяла отрицательные на нулевые.) как условие прописать.
вот у тебя получается, если они есть, то он заменяет,
if (0 == matrix[i][j]){
flag = true;
break;
}
}
if (flag)
break;
}
В общем в целом я разобраться, но не могу понять как сделать, что бы во втором было,( если нет нулевых значений) то оно заменяла отрицательные на нулевые.) как условие прописать.
вот у тебя получается, если они есть, то он заменяет,
if (0 == matrix[i][j]){
flag = true;
break;
}
}
if (flag)
break;
}
кажется понял,там просто в условии if (0 != massiv[i][j]) вот так нужно сделать. а еще, почему рандомные числа не новые каждый раз,я читал что то. но может можно как то сделать, что бы они все время были новые, и вот с этим условием Упорядочить строки целочисленной прямоугольной матрицы по возрастанию количества одинаковых элементов в каждой строке все равно не могу разобраться. а так в целом уже осваиваю по тихоньку.
Не проверял, но вроде должно работать.
Макар, у меня немного другой код и вроде как рботает. ребят, кто может объяснить как выставить элементы каждого столбца по возрастанию
Вариация на ту же тему, что и во втором задании. Только сканировать матрицу по столбцам, а не по строкам. Если в столбце нет отрицательных элементов, то запомнить номер текущего столбца и выйти из циклов.
А вот с этим посложнее. «Упорядочить строки» — я бы сделал матрицу как динамический двумерный массив. Т.е. как одномерный массив ссылок на массивы строк. Тогда операции со строками (т.е. с массивами) сведутся к операциям над указателями.
Можно попробовать такой алгоритм:
Копай функцию
qsort()
из стандартной библиотеки.спасибо вам большое))
уж лучше
std::sort
.std::sort
работает с контейнерами STL. Здесь пока что все крутится без STL. Использовать вместе две технологии из-за одной функции — геморой. Тем более что задача про многомерные массивы, а не про вектора и пр.