1

Тема: Периметр матриці

Дано натуральні числа n та m, що визначають відповідно кількість ряд- ків та стовпців у деякій заданій матриці дійсних чисел. Знайти периметр цієї матриці (суму елементів першого та останнього стовпців та рядків).

#include "pch.h"
#include <stdio.h>
#include <cmath>
#define ROWS 10 //я не до кінця розумію яка функція цього рядка?
#define COLS 10 //ну і цього теж
int main()
{
    float matrix[ROWS][COLS], per=0.;
    unsigned int i, j, n, m;
    printf("n=");
    scanf_s("%i", &n);    //кількість рядків матриці
    printf("m=");
    scanf_s("%i", &m);    //кількість стовпців матриці
    for (i = 0;i < n;i++)
        for (j = 0;j < m;j++)
        {
            printf("m[%i][%i]=", i, j);
            scanf_s("%f", &matrix[i][j]);
            if (i == 0 || i == n-1)        //тут рахую суму першого і останнього рядків матриці
            {
                per += matrix[i][j];
            }
            if (???????)        //тут маю порахувати суму першого і останнього стовпців
            {
                per += matrix[i][j];
            }
        }
    printf("%f", per);
    return 0;
}

Умову для додавання рядків я зміг скласти, а от щоб додати бічні  стовпці мені трохи бракує розуму. Підкажіть трошки

2

Re: Периметр матриці

#include "pch.h"
#include <stdio.h>
#include <cmath>
#define ROWS 10 
#define COLS 10 
int main()
{
    float matrix[ROWS][COLS], per=0.;
    unsigned int i, j, n, m;
    printf("n=");
    scanf_s("%i", &n);    //кількість рядків матриці
    printf("m=");
    scanf_s("%i", &m);    //кількість стовпців матриці
    for (i = 0;i < n;i++)
        for (j = 0;j < m;j++)
        {
            printf("m[%i][%i]=", i, j);
            scanf_s("%f", &matrix[i][j]);
            if (i == 0 || i == n-1)        
            {
                per += matrix[i][j];
            }
            if (!(i == 0 || i == n - 1) && j == 0)        
            {
                per += matrix[i][j];
            }
            if (!(i == 0 || i == n - 1) && j == m - 1)
            {
                per += matrix[i][j];
            }
        }
    printf("Source matrix:\n");
    for (i = 0;i < n;i++)
    {
        for (j = 0;j < m;j++)
        {
            printf("%5.0f", matrix[i][j]);
        }
        printf("\n");
    }

    printf("%f", per);
    return 0;
}

Результат:
n=3
m=4
m[0][0]=1
m[0][1]=2
m[0][2]=3
m[0][3]=4
m[1][0]=5
m[1][1]=6
m[1][2]=7
m[1][3]=8
m[2][0]=9
m[2][1]=10
m[2][2]=11
m[2][3]=12
Source matrix:
    1    2    3    4
    5    6    7    8
    9   10   11   12
65.000000
В умові треба вводи дійсні, але я вводив цілі числа, щоб дивитись як працює програма.
Якщо все правильно, то чи можна якось спростити код?

3

Re: Периметр матриці

Контрольні питання:
1) Що таке алгорітм
2) Що таке декомпозиція?

4

Re: Периметр матриці

Дивіться. Зараз ви перебираєте всі елементи, а потім перевіряєте, чи підходять вони вам, і додаєте.
А можна перебирати лише елементи потрібних рядків і стовпчиків. Підкажу, що вираз

for(всі можливі i)
   for(всі можливі j)
       if(j==X)
              /*зробити щось із A[i][j]*/

Це те саме, що й

for(всі можливі i)
    /*зробити щось із A[i][X]*/

Немає потреби перебирати всі j, щоб знайти X - ми й без того знаємо, що це X.

5

Re: Периметр матриці

А, так, #define проголошує заміну: в тексті після

#define ROWS 10

усі зустрічні ROWS будуть замінені на 10. Це такий жорсткий спосіб проголошувати константи.

Ну і

    for (j = 0;j < m;j++)
         perimeter += matrix[0][j]+matrix[n-1][j];
    for (i = 1;i < n-1;i++)
         perimeter += matrix[i][0]+matrix[i][m-1];