Politechnika Białostocka
Politechnika Białostocka -- Wydział Elektryczny Wydział Elektryczny
Elektrotechnika, semestr III, studia stacjonarne I stopnia, dualne Elektrotechnika, semestr III, studia stacjonarne I stopnia, dualne
Rok akademicki 2020/2021 Rok akademicki 2020/2021 Rok akademicki 2020/2021 Rok akademicki 2020/2021
Pracownia nr 6 (18.11.2020) Pracownia nr 6 (18.11.2020)
dr inż. Jarosław Forenc
Język C
Język C -- deklaracja tablica dwuwymiarowej deklaracja tablica dwuwymiarowej
float tab[3][4]; 0 1 2 3
float tab[3][4];
nazwa
liczba kolumn
typ elementów liczba wierszy
0 1 2 3
0 1 2
indeks kolumny
indeks wiersza
Rozmiar tablicy (liczba wierszy, liczba kolumn) to wartość:
– całkowita, dodatnia
– znana na etapie kompilacji programu
(stała liczbowa: 5, #define N 5, const int n = 5;)
Język C
Język C -- odwołania do elementów macierzy odwołania do elementów macierzy
[ ] - dwuargumentowy operator indeksowania
indeks (numer) kolumny
nazwa tablicy
[ ] dwuargumentowy operator indeksowania
tab[1][2];
Indeks:
indeks (numer) wiersza
– stała liczbowa, np. 0, 1, 10
– nazwa zmiennej, np. i, idx
– wyrażenie, np. i*j+5
Brak sprawdzania
poprawności indeksów!
Język C
Język C -- inicjalizacja elementów macierzy inicjalizacja elementów macierzy
0 1 2
int T[2][3] = {{1,2,3},{4,5,6}};
int T[2][3] {1,2,3,4};
int T[2][3] = {1,2,3,4,5,6};
1 0
2 3 1 2
4 5 6
0 1
int T[2][3] = {1,2,3,4};
int T[2][3] = {{1},{4,5}};
Język C
Język C -- inicjalizacja elementów macierzy inicjalizacja elementów macierzy
0 0
0 0 1 2
int T[2][3] = {0}; 0
int T[][3] = {{1,2,3},{4,5,6}};
1 0
2 3 1 2
4 5 6
0 1
0 0 0
0 0 0
0 1
wyzerowanie elementów macierzy
pominięcie liczby wierszy
Język C
Język C -- operacje na macierzy operacje na macierzy
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 3 /* liczba wierszy */
#define M 3 /* liczba kolumn */
int main(void) {
M
int tab[N][M];
int i, j;
0 1 2
0
1
2
N
Język C
Język C -- operacje na macierzy operacje na macierzy
/* generowanie pseudolosowe elementów macierzy */
/* generowanie pseudolosowe elementów macierzy */
srand((unsigned int) time(NULL));
for (i=0; i<N; i++)
for (j=0; j<M; j++)
tab[i][j] = rand() % 10;
M
9
0
3 1
1 2
6 4 8
9 4 6
0
1
2
N
0 1 2
0
1
2
kolejność zapisywania
wartości elementów
macierzy (wierszami)
Język C
Język C -- operacje na macierzy operacje na macierzy
/* generowanie pseudolosowe elementów macierzy */
/* generowanie pseudolosowe elementów macierzy */
srand((unsigned int) time(NULL));
for (j=0; j<M; j++)
for (i=0; i<N; i++)
tab[i][j] = rand() % 10;
M
9
0
3 1
1 2
6 4 8
9 4 6
0
1
2
kolejność zapisywania N
wartości elementów
macierzy (kolumnami)
Program INF_D06_1: operacje na tablicy Program INF_D06_1: operacje na tablicy
tablica wypełniona zerami
0
0
0 0
1 2
0 0 0
0
1
N
M
0 0 0 0
0 0 0 0
3 4 5 6
0 0 0
2
N
0 0 0 0
0 0 0 0 0 0 0
3
Program INF_D06_1: operacje na tablicy Program INF_D06_1: operacje na tablicy
zapisz do tablicy (wierszami) kolejne liczby całkowite 1, 2, 3, …;
wyświetl elementy tablicy z podziałem na wiersze i kolumny wyświetl elementy tablicy z podziałem na wiersze i kolumny
1
0
2 3
1 2
8 9 10
0
1
N
M
4 5 11 12
6 7 13 14
3 4 5 6
15 16 17
2
N
18 19 20 21 22 23 24 25 26 27 28
3
Program INF_D06_1: operacje na tablicy Program INF_D06_1: operacje na tablicy
zapisz do tablicy (kolumnami) kolejne liczby całkowite 1, 2, 3, …;
wyświetl elementy tablicy z podziałem na wiersze i kolumny
wyświetl elementy tablicy z podziałem na wiersze i kolumny
Program INF_D06_1: operacje na tablicy Program INF_D06_1: operacje na tablicy
zapisz do tablicy wygenerowane pseudolosowo liczby całkowite z zakresu
-9, 9; wyświetl elementy tablicy z podziałem na wiersze i kolumny
9, ; wyświetl elementy tablicy z podziałem na wiersze i kolumny
-1
0
0 -2
1 2
-6 -7 6
0
1
N
-7 6 -9 6
3 7 -2 6
3 4 5 6
M
9 2 -8
2
N
-7 7 9 9 2 -4 -7 3 9 -2 7
3
Program INF_D06_1: operacje na tablicy Program INF_D06_1: operacje na tablicy
zapisz do tablicy wygenerowane pseudolosowo liczby całkowite z zakresu
-9, 9; wyświetl elementy tablicy z podziałem na wiersze i kolumny
9, ; wyświetl elementy tablicy z podziałem na wiersze i kolumny
-1
0
0 -2
1 2
-6 -7 6
0
1
N
-7 6 -9 6
3 7 -2 6
3 4 5 6
M
9 2 -8
2
N
-7 7 9 9 2 -4 -7 3 9 -2 7
3
Program INF_D06_1: operacje na tablicy Program INF_D06_1: operacje na tablicy
zastąp wszystkie ujemne elementy tablicy wartością zero;
wyświetl elementy tablicy z podziałem na wiersze i kolumny
wyświetl elementy tablicy z podziałem na wiersze i kolumny
Program INF_D06_3: mnożenie macierzy Program INF_D06_3: mnożenie macierzy
Operacja: C = A ⋅ B
A[N][M] macierz N × M elementowa
⋅
=
33 32
31
23 22
21
13 12
11
33 32
31
23 22
21
13 12
11
33 32
31
23 22
21
13 12
11
b b
b
b b
b
b b
b
a a
a
a a
a
a a
a
c c
c
c c
c
c c
c
A[N][M] - macierz N × M - elementowa
B[M][K] - macierz M × K - elementowa
C[N][K] - macierz N × K - elementowa
N M N
31 33 21
32 11
31 31
31 23 21
22 11
21 21
31 13 21
12 11
11 11
b a b
a b
a c
b a b
a b
a c
b a b
a b
a c
+ +
=
+ +
=
+ +
=
32 33 22
32 12
31 32
32 23 22
22 12
21 22
32 13 22
12 12
11 12
b a b
a b
a c
b a b
a b
a c
b a b
a b
a c
+ +
=
+ +
=
+ +
=
33 33 23
32 13
31 33
33 23 23
22 13
21 23
33 13 23
12 13
11 13
b a b
a b
a c
b a b
a b
a c
b a b
a b
a c
+ +
=
+ +
=
+ +
= M K
K
Program INF_D06_3: mnożenie macierzy Program INF_D06_3: mnożenie macierzy
Operacja: C = A ⋅ B ( A [N][M], B [M][K], C [N][K])
Program w języku C:
(i) (i)
(j)
(j) (k) (k)
⋅
=
33 32
31
23 22
21
13 12
11
33 32
31
23 22
21
13 12
11
33 32
31
23 22
21
13 12
11
b b
b
b b
b
b b
b
a a
a
a a
a
a a
a
c c
c
c c
c
c c
c
N M
M K K
N
for (i=0; i<N; i++) for (k=0; k<K; k++) {
C[i][k] = 0.0;
for (j=0; j<M; j++)
C[i][k] = C[i][k] + A[i][j] * B[j][k];
}
K k
N b i
a c
M
j
jk ij
ik
1 , 2 , ,
, , 2 , , 1
1
…
…
=
⋅ =
=
=