Skip to content

5-dars: 2D massiv (matritsa)

Dars haqida

Davomiyligi: 90 daqiqa Maqsad: Talaba 2D (ikki o'lchovli) massivlar bilan ishlay olishi, matritsalarni boshqara olishi va asosiy amallarni bajara olishi kerak.

1. 2D massiv nima?

2D massiv — qator va ustun shaklidagi massiv (jadval).

c
int matrix[3][4] = {
    {1, 2, 3, 4},
    {5, 6, 7, 8},
    {9, 10, 11, 12}
};
         Ustun 0  Ustun 1  Ustun 2  Ustun 3
Qator 0:    1        2        3        4
Qator 1:    5        6        7        8
Qator 2:    9       10       11       12

2. E'lon qilish

c
int arr[3][4];                     // 3 qator, 4 ustun
int arr[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};  // ham bo'ladi
int arr[3][4] = {0};               // hammasi 0
int arr[][3] = {{1,2,3}, {4,5,6}}; // qator soni avtomatik

3. Element'ga kirish

c
int matrix[3][4];
matrix[1][2] = 10;  // qator 1, ustun 2

printf("%d\n", matrix[0][0]);  // birinchi
printf("%d\n", matrix[2][3]);  // oxirgi

4. Sikl bilan

c
int matrix[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};

// Chiqarish
for (int i = 0; i < 3; i++) {       // qator
    for (int j = 0; j < 4; j++) {   // ustun
        printf("%d ", matrix[i][j]);
    }
    printf("\n");
}

Natija:

1 2 3 4 
5 6 7 8 
9 10 11 12

5. To'ldirish

c
int matrix[5][5];

for (int i = 0; i < 5; i++) {
    for (int j = 0; j < 5; j++) {
        matrix[i][j] = i * 5 + j + 1;
    }
}

Natija:

1  2  3  4  5
6  7  8  9  10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

6. Matritsa amallari

Qo'shish

A + B = C (bir xil o'lchamli matritsalar):

c
void add_matrix(int A[3][3], int B[3][3], int C[3][3]) {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            C[i][j] = A[i][j] + B[i][j];
        }
    }
}

Ayirish

c
C[i][j] = A[i][j] - B[i][j];

Skalar ko'paytirish

c
void scalar_mult(int A[3][3], int k) {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            A[i][j] *= k;
        }
    }
}

7. Matritsa ko'paytmasi

A (m×n) × B (n×p) = C (m×p):

c
void multiply(int A[3][3], int B[3][3], int C[3][3]) {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            C[i][j] = 0;
            for (int k = 0; k < 3; k++) {
                C[i][j] += A[i][k] * B[k][j];
            }
        }
    }
}

3 ta sikl — O(n³).

8. Transpose — qator va ustunlarni almashtirish

c
void transpose(int A[3][3], int T[3][3]) {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            T[j][i] = A[i][j];
        }
    }
}
Original:        Transpose:
1 2 3            1 4 7
4 5 6            2 5 8
7 8 9            3 6 9

9. Diagonal yig'indi

c
int main_diagonal_sum(int A[3][3]) {
    int sum = 0;
    for (int i = 0; i < 3; i++) {
        sum += A[i][i];
    }
    return sum;
}

int anti_diagonal_sum(int A[3][3], int n) {
    int sum = 0;
    for (int i = 0; i < n; i++) {
        sum += A[i][n - 1 - i];
    }
    return sum;
}

10. Qator/ustun yig'indisi

c
int row_sum(int A[3][4], int row) {
    int sum = 0;
    for (int j = 0; j < 4; j++) {
        sum += A[row][j];
    }
    return sum;
}

int col_sum(int A[3][4], int col) {
    int sum = 0;
    for (int i = 0; i < 3; i++) {
        sum += A[i][col];
    }
    return sum;
}

11. Identity matrix (birlik matritsa)

Diagonal — 1, qolgani — 0:

1 0 0
0 1 0
0 0 1
c
void make_identity(int A[3][3], int n) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            A[i][j] = (i == j) ? 1 : 0;
        }
    }
}

12. Eng katta element va uning joyi

c
void find_max(int A[3][3], int *value, int *row, int *col) {
    *value = A[0][0];
    *row = 0;
    *col = 0;
    
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (A[i][j] > *value) {
                *value = A[i][j];
                *row = i;
                *col = j;
            }
        }
    }
}

Pointer'lar bilan bir nechta qiymat qaytarish — keyingi darslarda.

13. Funksiyaga 2D massiv

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

Muhim: C'da 2D massivni funksiyaga uzatish — ustun soni majburiy.

c
void func(int arr[][4], int rows);  // OK
void func(int arr[3][4], int rows); // OK (qatori e'tiborsiz)
void func(int arr[][], int rows);   // XATO

14. To'liq misol: 9x9 ko'paytirish jadvali

c
#include <stdio.h>

int main(void) {
    int table[9][9];
    
    // To'ldirish
    for (int i = 0; i < 9; i++) {
        for (int j = 0; j < 9; j++) {
            table[i][j] = (i + 1) * (j + 1);
        }
    }
    
    // Chiqarish
    printf("    ");
    for (int j = 1; j <= 9; j++) printf("%4d", j);
    printf("\n");
    printf("    ");
    for (int j = 0; j < 9; j++) printf("----");
    printf("\n");
    
    for (int i = 0; i < 9; i++) {
        printf("%2d |", i + 1);
        for (int j = 0; j < 9; j++) {
            printf("%4d", table[i][j]);
        }
        printf("\n");
    }
    
    return 0;
}

Natija:

       1   2   3   4   5   6   7   8   9
       -------------------------------
 1 |   1   2   3   4   5   6   7   8   9
 2 |   2   4   6   8  10  12  14  16  18
 ...
 9 |   9  18  27  36  45  54  63  72  81

15. 3D va undan ortiq

c
int cube[2][3][4];  // 3D — 2*3*4 = 24 element

Foydalanish — kam, lekin mavjud.

Misol: shaxmat doskasi (2D), volumetric data (3D), tensor (4D — neural network).

Darsdagi topshiriqlar

1 — Birinchi 2D

first-2d.c — 3x3 matritsa yarating, to'ldiring, chiqaring.

2 — Ko'paytirish jadvali

Dars matnidagi 9x9 jadval.

3 — Matritsa amallari

matrix-ops.c:

c
void add_matrix(int A[3][3], int B[3][3], int C[3][3]);
void sub_matrix(int A[3][3], int B[3][3], int C[3][3]);
void scalar_mult(int A[3][3], int k);
void multiply(int A[3][3], int B[3][3], int C[3][3]);
void transpose(int A[3][3], int T[3][3]);

Hammasini yozing va sinab ko'ring.

4 — Diagonal va yig'indi

diagonal.c:

  • Asosiy diagonal yig'indisi
  • Antidiagonal yig'indisi
  • Har qator yig'indisi
  • Har ustun yig'indisi
  • Umumiy yig'indi

5 — Spiral matrix

spiral.c — 5x5 matritsani spiral bo'yicha to'ldirish:

 1  2  3  4  5
16 17 18 19  6
15 24 25 20  7
14 23 22 21  8
13 12 11 10  9

Murakkab vazifa — kamida 30 daqiqa o'ylab.

6 — Maze

maze.c — 10x10 labirint (0 va 1):

c
int maze[10][10] = {
    {0,1,0,0,0,0,1,0,0,0},
    {0,1,0,1,1,0,1,0,1,0},
    // ...
};

Chiqaring — 1 o'rniga #, 0 o'rniga . bilan.

7 — Tic-tac-toe board

tictactoe.c — 3x3 doskani chizing:

c
char board[3][3] = {
    {'X', 'O', 'X'},
    {' ', 'X', 'O'},
    {'O', ' ', 'X'}
};
 X | O | X 
-----------
   | X | O 
-----------
 O |   | X

Kim yutdi tekshiruv funksiyasini ham yozing.

8 — Image (greyscale)

image.c — 10x10 "rasm" — har piksel 0-9:

c
int image[10][10] = {0};

// Diagonal chiziq
for (int i = 0; i < 10; i++) image[i][i] = 9;

// Aylanada doira (taxminiy)
for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
        // markazdan masofa
        int dx = i - 5, dy = j - 5;
        int dist = dx*dx + dy*dy;
        if (dist >= 9 && dist <= 16) image[i][j] = 5;
    }
}

Chiqaring — har raqam mos belgisi bilan (0, 5#, 9).

9 — Statistics

stats-2d.c:

5x5 matritsa (random qiymatlar). Topish:

  • Eng katta element va joyi
  • Eng kichik element va joyi
  • O'rtacha
  • Yig'indi
  • Toq va juftlar soni

10 — GitHub

bash
$ mkdir 5-oy-dars-5
$ git add . && git commit -m "feat: dars 5 - 2D arrays" && git push

Lug'at

TerminIzoh
2D arrayIkki o'lchovli massiv
MatrixMatritsa
RowQator
ColumnUstun
DiagonalDiagonal
TransposeQator/ustun almashish
Identity matrixBirlik matritsa
MultidimensionalKo'p o'lchovli

Keyingi dars

6-dars: Pointer asoslari →

Master IT o'quv markazi — o'qitish rejasi