Сравнить количество полодительных и отрицательных элементов масива относительно столбика с максимальным элементом C++

Рейтинг: 0Ответов: 3Опубликовано: 27.02.2023

Не могу разобраться с заданием. Вот моя попытка сделать это соотношение, но я не могу немного понять, правильно ли я вообще понял как делать первое задание, и не могу понять как делать второе задание. Вот задание: 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;

}

Ответы

▲ 0

[3] Сравнить количество положительных и отрицательных элементов, [2] находящихся в правой и левой прямоугольной части массива, [1] относительно столбика с максимальным элементом.

[1] находим максимальный элемент всего массива и запоминаем индекс (номер) колонки.

[2] Столбик с максимальным элементом игнорируем? Проходимся цикл-в-цикле по левой части и считаем (отдельно) число положительных и число отрицательных элементов. Лучше это оформить функцией, тогда эту же функцию натравливаем на правую часть массива.

[3] Результаты работы обрабатываем и выводим на экран.

▲ 0

сместить вправо каждую строку массива элементы массива на 5

Цикл по строкам, внутри обработка одной строки.

  1. Запоминаем последние 5 чисел нужной строки во временный массив (циклом).

  2. Проходимся по всей строке и смещаем числа на 5 (что-то вроде A[y,x+5] = A[y,x]. Тут нужно понять какой индекс отвечает за строку, не уверен, что я написал правильно).

  3. Заранее запомненные 5 чисел копируем в начало строки (циклом).

▲ 0

Ну вы почти правильно написали. Работает. Только посчитать нужно и положительные и отрицательные числа отдельно для левой и отдельно для правой половины матрицы, относительно столбца.
Ну и несколько замечаний.
Заполнение массива, поиск максимального элемента, запоминание столбца и вывод массива на экран можно совместить. Незачем 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 написал.