1

Тема: матриця

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main() 
{
    int j,i,n = 9;
    int A[n][n];

  int k = 0;
    
    
    for (i = 0; i < n; i++)
    { 
        for (j = 0; j<n; j++)
      {
     
        A[i][j]=rand() % 99;
        printf("%2d ", A[i][j]);
      }
        printf("\n");
    }   
    int m;
    int l = n%2;
    if (l) 
 { 
    m = int (n/2);
 }  else
  {
    m = n/2 - 1;
  } 
    for (int i = 1; i < n - 1; i++)  {
    int sum = 0;
    if (i <= m)  {
      k ++;
    }  else if (i > m && l == 1)  {
      k --;
    }  else l = 1;
    for (int j = 1; j <= k; j++)  {
        sum = sum + A[i - j][8-i - j] + A[i + j][8];
      }  

    A[i][n-1-i] += sum;
  }

  printf("\n\n\n");
  for (int i = 0; i < n; i ++)  {
    for (int j = 0; j < n; j ++)  {
      printf("%3d ", A[i][j]);
      }
        printf("\n");
    }   
  }

Заповнити матрицю випадковими числами.
Розмістити на бiчнiй діагоналі суми елементів, котрі
лежать на діагоналях, перпендикулярних до бічної.

Допоможіть будь-ласка з виправленям помилки.

2

Re: матриця

Вирівняйте код. Вам же самому його складно читати.

3

Re: матриця

Rод вирівняв:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int** CreateMatrix(int M, int N)
{
    int** a;
    a = (int**)malloc(M * sizeof(int*));
    for (int i = 0; i < M; i++)
        a[i] = (int*)malloc(N * sizeof(int));
    return a;
}
int main()
{
    int j, i, n = 7;
    int k = 0;

    int** A = CreateMatrix(n, n);
    double m;
    double l = n % 2;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            A[i][j] = rand() % 10;
            printf("%d ", A[i][j]);
        }
        printf("\n");
    }
    printf("l:%lf\n", &l);
    if (l == 1)
    {
        m = n / 2;

    }
    else
    {
        m = n / 2 - 1;

    }
    printf("m:%lf", &m);
    for (int i = 1; i < n - 1; i++) {
        int sum = 0;
        if (i <= m) {
            k++;

        }
        else if (i > m && l == 1) {
            k--;

        }
        else l = 1;
        for (int j = 1; j <= k; j++) {
            sum += A[i - j][(n - 1) - i - j];

            sum += A[i + 1][n - i];
        }
        A[i][n - 1 - i] += sum;

    }

    printf("\n\n\n");
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%3d ", A[i][j]);
        }
        printf("\n");
    }
}

4 Востаннє редагувалося wander (23.11.2022 18:39:53)

Re: матриця

maks60207 написав:

Код вирівняв

Вважатимемо, що перший пункт ви виконали. Наступним вашим завданням буде пояснити, яка помилка (логічна, синтаксична чи може помилка компіляції) у вас виникає. Це допоможе нам допомогти вам її виправити.

5

Re: матриця

Мені потрібно розмістити на бiчнiй діагоналі суми елементів, котрі
лежать на діагоналях, перпендикулярних до бічної. Буду вдячний за допомогу!

6

Re: матриця

Гаразд, те що вам потрібно, ми зрозуміли. Так, а помилка в чому?

7

Re: матриця

Початкова матриця:
1  7  4  0  9
4  8  8  2  4
5  5  1  7  1
1  5  2  7  6
1  4  2  3  2


  1  7  4  0  9
  4  8  8  7  4
  5  5  24 7 1
  1  12 2  7 6
  1 4  2  3  2

Програма погано рахує середню діагональ

8

Re: матриця

У вас у коді n=7, а матриця, яку ви навели, 5 на 5. Це точно результат роботи саме цього коду? Бо якщо ви його змінюєте, то допомогти вам буде дуже складно.

maks60207 написав:
        for (int j = 1; j <= k; j++) {
            sum += A[i - j][(n - 1) - i - j];

            sum += A[i + 1][n - i];
        }

Так,  A[i - j][(n - 1) - i - j] - це ніби щось з діагоналі, паралельної основній. А що таке A[i + 1][n - i]?

І від оцього фрагмента у мене просто зуби зводить:

maks60207 написав:
    double l = n % 2;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            A[i][j] = rand() % 10;
            printf("%d ", A[i][j]);
        }
        printf("\n");
    }
    printf("l:%lf\n", &l);
    if (l == 1)
    {
        m = n / 2;

    }
    else
    {
        m = n / 2 - 1;

    }

Ви проголошуєте змінну l, потім блок коду, де вона не використовується, потім з нею працюєте. Не треба так. Змінні треба проголошувати безпосередньо перед тим, як із нею починаєте працювати - принаймні, не раніше, ніж вона стає потрібна.
Далі, змінна l типу double, але заносите ви в неї ціле і працюєте далі як із цілим. Нащо вам тут double?
Виводите ви чомусь її адресу. Нащо вам адреса змінної? Приберіть &.
У блоках if-else явно зайвий порожній рядок, і взагалі просту математику легше за допомогою тернарного оператора робити, типу

m = (l==1)?n/2:n/2-1;

Але можна зробити ще один крок. l - це залишок від ділення n на 2. Досить легко помітити, що це можна записати як

m = (n-1)/2;

Тобто разом цей фрагмент можна переписати як

    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            A[i][j] = rand() % 10;
            printf("%d ", A[i][j]);
        }
        printf("\n");
    }

    m = (n-1)/2;
    int l = n%2;
    printf("l:d\n", l);

Правда, простіше?

9

Re: матриця

Дякую за поради!!!Буд