Skip to content

Двумерный массив. Задача 2

Доброго времени суток! Сразу напомню, что с вами автор, который пишет коды для Linux. Сегодня продолжим говорить о двумерных массивах и разберём такой пример:

Дана целочисленная квадратичная матрица. Определить:
1) Сумму элементов в тех строках, которые НЕ содержат хотя бы один отрицательный элемент
2) Минимум среди сумм элементов диагоналей, параллельных побочной диагонали матрицы.

Как видите, задача небольшая. Поехали!

#include <cstdlib>
#include <iostream>
#include <ctime>
#include <cstring>
using namespace std;

int main(void){
    int static N = 10;
        int mas[N][N];
        int i, j;
        srand(time(0));
        for (i = 0; i < N; i++){
                for (j = 0; j < N; j ++){
            mas[i][j] = rand() % 21 - 2;
                        cout << mas[i][j] << "  ";
                }
                cout << "\n";
        }

Тут всё просто: объявляем двумерный массив и записываем в него «рандомные» значения, НО задаём интервал от -1 до 20, потому что, если будет много отрицательных элементов, мы не сможем выполнить 1 задание.

int sum= 0, count = 0;
    for (i = 0; i < N; i++){
        for (j = 0;j < N; j ++){
                if (mas[i][j] <  0) count += 1;      
        }  
        if (count == 0){
            for (j = 0;j < N; j ++){
                sum = sum +  mas[i][j];                      
            }
        }
                count = 0;
     }
     cout <<"Сумма = " << sum << "\n";

В этом куске кода мы находим сумму по заданию 1. Алгоритм: запускаем цикл по i и в нём запускаем цикл по j, в котором проверяем на наличие отрицательных элементов в строке, если таковы имеются, изменяем count. Далее задаём условие, если count не изменялось ( = 0 ), то запускаем ещё один цикл по j, в котором уже суммируем элементы в строке.

int summa[N];
        memset(summa,0,sizeof(summa));
        int k;
        for (k = 0 ;k < N; k++){
                for (i = 0; i < N; i++){
                        for (j = 0; j < N; j ++){
                                if (i + j == k) summa[k] += mas[i][j];
                        }
                }  
        }
        int min = summa[0];
        for (k = 0; k < 10; k++){
                if ((k != N/2 - 1) && min > summa[k] ) min = summa[k]; 
        }
        cout <<"Минимальная сумма по диагоналям = " << min << "\n";
}

В этом отрывке мы работаем над заданием 2.
memset() — функция, которая в данном случаем нужна для обнуления всего массива.

Алгоритм: инициализируем массив summa[], в котором мы будем хранить суммы диагоналей. С помощью «тройного» цикла мы задаём элементы для массива summa[], замечу что для проверки принадлежности элемента к той или иной диагонали используется условие i + j == k. После этого банальным методом находим минимальный элемент в массиве.

Вот и всё =)

Скачать исходники

Опубликовано вC++

Будьте первым, кто оставит комментарий

    Добавить комментарий