Сравнить количество полодительных и отрицательных элементов масива относительно столбика с максимальным элементом C++
Не могу разобраться с заданием. Вот моя попытка сделать это соотношение, но я не могу немного понять, правильно ли я вообще понял как делать первое задание, и не могу понять как делать второе задание. Вот задание: 1)Сравнить количество положительных и отрицательных элементов, находящихся в правой и левой прямоугольной части массива, относительно столбика с максимальным элементом. 2)сместить вправо каждую строку массива элементы массива на 5(типа сместить командой rotate? и как это можно применить в моём коде?)
int main() {
const int row = 10;
const int col = 10;
int sq1 = 0, sq2 = 0;
int arr[row][col];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
arr[i][j] =( -20 + rand() % 100);
}
}
int maxvalue = arr[0][0];
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
if (arr[i][j] > maxvalue) {
maxvalue = arr[i][j];
}
}
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++) {
cout << arr[i][j] << "\t";
}
cout << endl;
}
int counter = 0;
cout << "maxvalue: " << maxvalue << endl;
for (int i = 0; i < row; i++){
for (int j = 0; j < col; j++) {
if (arr[i][j] == maxvalue) {
counter = j;
cout << endl << j + 1 << endl;
break;
}
}
}
for (int i = 0; i < row; i++) {
for (int j = 0; j < counter; j++) {
if(arr[i][j] > 0){
sq1++;
}
}
}
for (int i = 0; i < row; i++) {
for (int j = counter+1; j < col; j++) {
if(arr[i][j] < 0){
sq2++;
}
}
}
cout << "left part" << " " << sq1 << endl;
cout << "right part" << " " << sq2 << endl;
cout << (sq1 / sq2) << endl;
}
Ответы (3 шт):
[3] Сравнить количество положительных и отрицательных элементов, [2] находящихся в правой и левой прямоугольной части массива, [1] относительно столбика с максимальным элементом.
[1] находим максимальный элемент всего массива и запоминаем индекс (номер) колонки.
[2] Столбик с максимальным элементом игнорируем? Проходимся цикл-в-цикле по левой части и считаем (отдельно) число положительных и число отрицательных элементов. Лучше это оформить функцией, тогда эту же функцию натравливаем на правую часть массива.
[3] Результаты работы обрабатываем и выводим на экран.
сместить вправо каждую строку массива элементы массива на 5
Цикл по строкам, внутри обработка одной строки.
Запоминаем последние 5 чисел нужной строки во временный массив (циклом).
Проходимся по всей строке и смещаем числа на 5 (что-то вроде A[y,x+5] = A[y,x]. Тут нужно понять какой индекс отвечает за строку, не уверен, что я написал правильно).
Заранее запомненные 5 чисел копируем в начало строки (циклом).
Ну вы почти правильно написали. Работает. Только посчитать нужно и положительные и отрицательные числа отдельно для левой и отдельно для правой половины матрицы, относительно столбца.
Ну и несколько замечаний.
Заполнение массива, поиск максимального элемента, запоминание столбца и вывод массива на экран можно совместить. Незачем 4 раза обходить весь массив.
int main()
{
int maxvalue = -100;
int counter = 0;
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++)
{
arr[i][j] =( -20 + rand() % 100);
if (arr[i][j] > maxvalue)
{
maxvalue = arr[i][j];
counter = j;
}
cout << arr[i][j] << "\t";
}
cout << endl;
}
Также можно совместить в одном цикле подсчет отрицательных и положительных элементов. Это для левой половины, точно так же для правой.
sq1 = 0;
sq2 = 0;
for (int i = 0; i < row; i++) {
for (int j = 0; j < counter; j++) {
if(arr[i][j] > 0)
sq1++;
if(arr[i][j] < 0)
sq2++;
}
}
Ну собственно первую часть вы выполнили. Попробуйте выполнить вторую. Алгоритм вам Vlad Chapl написал.