Algorytmy, struktury danych i
Algorytmy, struktury danych i
techniki programowania.
techniki programowania.
Laboratorium z podstaw programowania w j
Laboratorium z podstaw programowania w j
ę
ę
zyku ANSI C
zyku ANSI C
Zadanie
Zadanie
Prosz
Prosz
ę
ę
napisa
napisa
ć
ć
program, kt
program, kt
ó
ó
ry wpisuje do tablicy 100 element
ry wpisuje do tablicy 100 element
ó
ó
w typu
w typu
int
int
losowe liczby ca
losowe liczby ca
ł
ł
kowite z przedzia
kowite z przedzia
ł
ł
u od
u od
-
-
20 do 20 a nast
20 do 20 a nast
ę
ę
pnie oblicza
pnie oblicza
ś
ś
redni
redni
ą
ą
arytmetyczn
arytmetyczn
ą
ą
element
element
ó
ó
w dodatnich o indeksach nieparzystych.
w dodatnich o indeksach nieparzystych.
Wylosowane liczby oraz
Wylosowane liczby oraz
ś
ś
redni
redni
ą
ą
wy
wy
ś
ś
wietli
wietli
ć
ć
na ekranie. Zadeklarowa
na ekranie. Zadeklarowa
ć
ć
rozmiar tablicy za pomoc
rozmiar tablicy za pomoc
ą
ą
sta
sta
ł
ł
ej przy u
ej przy u
ż
ż
yciu dyrektywy #
yciu dyrektywy #
define
define
.
.
Umie
Umie
ś
ś
ci
ci
ć
ć
w programie instrukcj
w programie instrukcj
ę
ę
kt
kt
ó
ó
ra przy ka
ra przy ka
ż
ż
dym uruchomieniu
dym uruchomieniu
automatycznie zmienia ziarno losowania.
automatycznie zmienia ziarno losowania.
Rozwi
Rozwi
ą
ą
zanie
zanie
#include
<stdio.h>
#include
<stdlib.h>
#include
<time.h>
#define
ROZMIAR 100
#define
DOL -20
#define
GORA 20
int
main(
void
){
int
tab_los[ROZMIAR], i, suma, ile;
srand((
unsigned
)time(0));
// losowe ziarno
printf(
"Liczby losowe:\n"
);
for
(i = 0; i < ROZMIAR; ++i ){
tab_los[i] = DOL + rand() % ((GORA - DOL) + 1);
printf(
" %d = % d \n"
,i , tab_los[i]);
}
suma = 0;
ile = 0;
for
(i = 1; i < ROZMIAR; i += 2 ){
// iteracja po indeksach
// nieparzystych
if
(tab_los[i] > 0){
suma += tab_los[i];
// sumowanie liczb dodatnich
++ile;
//zliczanie ilości liczb dodatnich
}
}
printf(
"\nSrednia wynosi: %lf\n"
, (
double
)suma/(
double
)ile);
return
0;
}
Tablice 2
Tablice 2
-
-
wymiarowe: macierze
wymiarowe: macierze
Tablice dwuwymiarowe czyli macierze deklarujemy podobnie jak wek
Tablice dwuwymiarowe czyli macierze deklarujemy podobnie jak wek
tory, (tablice
tory, (tablice
jednowymiarowe) podaj
jednowymiarowe) podaj
ą
ą
c typ danych w tablicy, nazw
c typ danych w tablicy, nazw
ę
ę
tablicy i rozmiar tablicy w
tablicy i rozmiar tablicy w
nawiasach kwadratowych (najpierw liczb
nawiasach kwadratowych (najpierw liczb
ę
ę
wierszy, potem liczb
wierszy, potem liczb
ę
ę
kolumn).
kolumn).
Przyk
Przyk
ł
ł
ad:
ad:
int
int
macierz_1[3][5];
macierz_1[3][5];
double
double
mac_2[5][2];
mac_2[5][2];
lub wygodniej i bardziej uniwersalnie:
lub wygodniej i bardziej uniwersalnie:
#
#
define
define
WIERSZE 4
WIERSZE 4
// liczba wierszy macierzy mac
// liczba wierszy macierzy mac
#
#
define
define
KOLUMNY 7
KOLUMNY 7
// liczba kolumn macierzy mac
// liczba kolumn macierzy mac
int
int
main(
main(
void
void
){
){
float
float
mac[WIERSZE][KOLUMNY
mac[WIERSZE][KOLUMNY
];
];
return
return
0;
0;
}
}
Tablice 2
Tablice 2
-
-
wymiarowe: macierze
wymiarowe: macierze
Zadeklarowana wewn
Zadeklarowana wewn
ą
ą
trz funkcji
trz funkcji
main
main
() macierz ma (podobne jak inne zmienne
() macierz ma (podobne jak inne zmienne
automatyczne) elementy o warto
automatyczne) elementy o warto
ś
ś
ciach przypadkowych. Trzeba tak
ciach przypadkowych. Trzeba tak
ą
ą
macierz
macierz
zainicjalizowa
zainicjalizowa
ć
ć
(podobnie jak ka
(podobnie jak ka
ż
ż
d
d
ą
ą
zmienn
zmienn
ą
ą
wewn
wewn
ą
ą
trz funkcji
trz funkcji
main
main
()) czyli
()) czyli
przypisa
przypisa
ć
ć
warto
warto
ś
ś
ci elementom macierzy.
ci elementom macierzy.
Mo
Mo
ż
ż
na to zrobi
na to zrobi
ć
ć
ju
ju
ż
ż
przy deklaracji macierzy za
przy deklaracji macierzy za
pomoc
pomoc
ą
ą
listy warto
listy warto
ś
ś
ci w nawiasach klamrowych:
ci w nawiasach klamrowych:
#
#
define
define
WIERSZE 3
WIERSZE 3
// liczba wierszy macierzy mac
// liczba wierszy macierzy mac
#
#
define
define
KOLUMNY 5
KOLUMNY 5
// liczba kolumn macierzy mac
// liczba kolumn macierzy mac
int
int
main(
main(
void
void
){
){
int
int
mac[WIERSZE][KOLUMNY
mac[WIERSZE][KOLUMNY
] = {{10, 5, 13, 28, 6},
] = {{10, 5, 13, 28, 6},
{ 8, 1, 19, 32, 5},
{ 8, 1, 19, 32, 5},
{45, 48, 2, 6, 16}};
{45, 48, 2, 6, 16}};
return
return
0;
0;
}
}
Przecinki pomi
ę
dzy
elementami i na ko
ń
cu
ka
ż
dej listy !
Tablice 2
Tablice 2
-
-
wymiarowe: macierze
wymiarowe: macierze
Do operowania na elementach macierzy najcz
Do operowania na elementach macierzy najcz
ęś
ęś
ciej u
ciej u
ż
ż
ywa si
ywa si
ę
ę
dw
dw
ó
ó
ch p
ch p
ę
ę
tli (jedna
tli (jedna
wewn
wewn
ą
ą
trz drugiej). Zewn
trz drugiej). Zewn
ę
ę
trzna p
trzna p
ę
ę
tla przeskakuje po wierszach a wewn
tla przeskakuje po wierszach a wewn
ę
ę
trzna po
trzna po
elementach w wierszu lub odwrotnie (zewn
elementach w wierszu lub odwrotnie (zewn
ę
ę
trzna po kolumnach a wewn
trzna po kolumnach a wewn
ę
ę
trzna po
trzna po
elementach w kolumnie).
elementach w kolumnie).
Najwygodniej u
Najwygodniej u
ż
ż
y
y
ć
ć
do tego celu p
do tego celu p
ę
ę
tli
tli
for
for
poniewa
poniewa
ż
ż
grupuje ona wszystkie warunki
grupuje ona wszystkie warunki
steruj
steruj
ą
ą
ce p
ce p
ę
ę
tl
tl
ą
ą
w jednej zwi
w jednej zwi
ę
ę
z
z
ł
ł
ej linii.
ej linii.
for
for
(
(
…
…
){
){
for
for
(
(
…
…
){
){
instrukcje;
instrukcje;
}
}
}
}
7
2
1
8
6
4
8
3
2
2
1
0
9
4
5
3
3
1
0
4
6
8
5
3
1
Macierze
Macierze
-
-
wpisywanie warto
wpisywanie warto
ś
ś
ci
ci
#include
<stdio.h>
#define
WIERSZE_1
5
//liczba wierszy macierzy mac_1
#define
KOLUMNY_1
5
//liczba kolumn macierzy mac_1
int
main(
void
){
int
mac_1[WIERSZE_1][KOLUMNY_1];
int
i, j;
//zestaw 2 pętli do wpisywania wartości do macierzy
for
( i = 0; i < WIERSZE_1; ++i ){
//pierwsza pętla przeskakuje po wierszach
for
( j = 0; j < KOLUMNY_1; ++j ){
//druga pętla przeskakuje po elementach w wierszu
mac_1[i][j] = i+j;
//element przyjmuje wartość sumy wartości
//jego indeksów
}
}
return
0;
}
Sprawd
ź
my jak to zadziała
Macierze
Macierze
-
-
wpisywanie warto
wpisywanie warto
ś
ś
ci
ci
#include
<stdio.h>
#define
WIERSZE_3
2
//liczba wierszy macierzy mac_1
#define
KOLUMNY_3
3
//liczba kolumn macierzy mac_1
int
main(
void
){
int
mac_3[WIERSZE_3][KOLUMNY_3];
int
i, j;
//Wpisywanie elementów macierzy z klawiatury
printf(
"Wczytuje elementy macierzy z klawiatury "
);
printf(
"kolejno wierszami...\n"
);
for
( i = 0; i < WIERSZE_3; ++i ){
printf(
"Wiersz %d:\n"
, i);
for
( j = 0; j < KOLUMNY_3; ++j )
scanf(
"%d"
,&mac_3[i][j]);
}
return
0;
}
Sprawd
ź
my jak to zadziała
Macierze
Macierze
–
–
wy
wy
ś
ś
wietlanie warto
wietlanie warto
ś
ś
ci
ci
.
.
.
//zestaw 2 pętli do wyświetlenia wartości do macierzy
for
( i = 0; i < WIERSZE_3; ++i ){
for
( j = 0; j < KOLUMNY_3; ++j ){
printf(
" %3.1d\t "
, mac_3[i][j]);
}
printf(
"\n"
);
}
printf(
"\n"
);
.
.
.
Sprawd
ź
my jak to zadziała
Macierze
Macierze
–
–
sumowanie element
sumowanie element
ó
ó
w
w
// na początku trzeba zadeklarować zmienne
// suma_wszystkich i suma_diag
suma_wszystkich = suma_diag = 0;
for
( i = 0; i < WIERSZE_1; ++i ){
for
( j = 0; j < KOLUMNY_1; ++j ){
suma_wszystkich += mac_1[i][j];
// sumowanie wszystkich elementów macierzy
if
( i == j )
suma_diag += mac_1[i][j];
// sumowanie elementów leżących na
// przekątnej głównej macierzy
}
}
printf(
"Suma elem. mac_1: %d\n"
, suma_wszystkich);
printf(
"Suma elem. diagonali mac_1: %d\n"
, suma_diag);
Sprawd
ź
my jak to zadziała
Sumowanie element
Sumowanie element
ó
ó
w w wierszu lub w kolumnie
w w wierszu lub w kolumnie
/* Przygotowanie macierzy sum. Na początku trzeba zadeklarować
mac_sum[WIERSZE_SUM][KOLUMNY_SUM] i ją zainicjalizować.
KOLUMNY_SUM muszą być równe max(WIERSZE_1, KOLUMNY_1) */
for
( i = 0; i < WIERSZE_SUM; ++i )
for
( j = 0; j < KOLUMNY_SUM; ++j )
mac_sum[i][j] = 0;
//wypełnienie macierzy zerami
//sumowanie elemenów macierzy mac_1
for
( i = 0; i < WIERSZE_1; ++i )
for
( j = 0; j < KOLUMNY_1; ++j )
mac_sum[0][i] += mac_1[i][j];
//sumy z każdego wiersza mac_1 wpisujemy w
//kolejnych elementach 0-wego wiersza macierzy sum
for
( j = 0; j < KOLUMNY_1; ++j ){
for
( i = 0; i < WIERSZE_1; ++i ){
mac_sum[1][j] += mac_1[i][j];
//sumy z każdej kolumny mac_1 wpisujemy w
//kolejnych elementach 1-szego wiersza macierzy sum
//dalszy ciąg na następnym slajdzie
Sumowanie element
Sumowanie element
ó
ó
w w wierszu lub w kolumnie
w w wierszu lub w kolumnie
//Wyświetlenie na ekranie macierzy sum
printf(
"Macierz mac_sum:\n"
);
for
( i = 0; i < WIERSZE_SUM; ++i ){
for
( j = 0; j < KOLUMNY_SUM; ++j ){
printf(
" %3.1d\t "
, mac_sum[i][j]);
}
if
( i == 0 )
//dla pierwszego wiersza mac_sum
printf(
" -> sumy wierszy mac_1\n"
);
else
//dla drugiego wiersza mac_sum
printf(
" -> sumy kolumn mac_1\n"
);
}
printf(
"\n"
);
Sprawd
ź
my jak to zadziała
Macierze
Macierze
–
–
szukanie min, max
szukanie min, max
#include
<stdio.h>
#define
WIERSZE_2
3
//liczba wierszy macierzy mac_2
#define
KOLUMNY_2
6
//liczba kolumn macierzy mac_2
int
main(
void
){
int
mac_2[WIERSZE_2][KOLUMNY_2] = { {13, 55, 64, 18, 20, 71},
{22, 6, 4, 3, 15, 43},
{33, 7, 78, 12, 6, 75} };
int
i, j, min, max;
//wyszukiwanie minimum i maksimum w macierzy
min = max = mac_2[0][0];
for
( i = 0; i < WIERSZE_2; ++i ){
for
( j = 0; j < KOLUMNY_2; ++j ){
if
( mac_2[i][j] < min )
min = mac_2[i][j];
if
( mac_2[i][j] > max )
max = mac_2[i][j];
}
}
printf(
"Minimum z mac_2 wynosi: %d\n"
, min);
printf(
"Mmaksimum z mac_2 wynosi: %d\n"
, max);
return
0;
}
Sprawd
ź
my jak to zadziała
Dodawanie macierzy
Dodawanie macierzy
#include
<stdio.h>
//Macierze, które chcemy dodać muszą mieć takie same wymiary!
#define
WIERSZE 3
//liczba wierszy w macierzach
#define
KOLUMNY 3
//liczba kolumn w macierzach
int
main(
void
){
//deklaracje zmiennych
int
m_1[WIERSZE][KOLUMNY] = {{5, 9, 1},{1, 2, 1},{9, 8, 3}};
int
m_2[WIERSZE][KOLUMNY] = {{6, 5, 2},{9, 3, 5},{3, 8, 1}};
int
m_s[WIERSZE][KOLUMNY];
int
i, j;
//dodawanie macierzy
for
( i = 0; i < WIERSZE; ++i )
for
( j = 0; j < KOLUMNY; ++j )
m_s[i][j] = m_1[i][j] + m_2[i][j];
//wyświetlenie wyniku na ekranie
printf(
"m_1 + m_2:\n"
);
for
( i = 0; i < WIERSZE; ++i ){
for
( j = 0; j < KOLUMNY; ++j )
printf(
" %3.1d\t "
, m_s[i][j]);
printf(
"\n"
);
}
printf(
"\n"
);
return
0;
}
Sprawd
ź
my jak to zadziała
Mno
Mno
ż
ż
enie macierzy
enie macierzy
#include
<stdio.h>
#define
WIERSZE_MA
4
//liczba wierszy macierzy ma
#define
KOLUMNY_MA
3
//liczba kolumn macierzy ma
#define
WIERSZE_MB
3
//liczba wierszy macierzy mb
#define
KOLUMNY_MB
5
//liczba kolumn macierzy mb
#define
WIERSZE_MC
4
//liczba wierszy macierzy mc
#define
KOLUMNY_MC
5
//liczba kolumn macierzy mc
int
main(
void
){
//deklaracje zmiennych
int
ma[WIERSZE_MA][KOLUMNY_MA] = {{5, 9, 1},
{1, 2, 1},
{9, 8, 3},
{5, 5, 4} };
int
mb[WIERSZE_MB][KOLUMNY_MB] = { {6, 5, 2, 1, 3},
{0, 3, 9, 3, 5},
{3, 4, 1, 8, 1} };
int
mc[WIERSZE_MC][KOLUMNY_MC];
int
i, j, k, temp;
// ciąg dalszy na następnym slajdzie
Mno
Mno
ż
ż
enie macierzy
enie macierzy
//dokończenie
//wyświetlenie macierzy ma na ekranie
printf(
"ma:\n"
);
for
( i = 0; i < WIERSZE_MA; ++i ){
for ( j = 0; j < KOLUMNY_MA; ++j )
printf(
" %3.1d\t "
, ma[i][j]);
printf(
"\n"
);
}
//wyświetlenie macierzy mb na ekranie
printf(
"mb:\n"
);
for
( i = 0; i < WIERSZE_MB; ++i ){
for
( j = 0; j < KOLUMNY_MB; ++j )
printf(
" %3.1d\t "
, mb[i][j]);
printf(
"\n"
);
}
//dalszy ciąg na następnym slajdzie
Mno
Mno
ż
ż
enie macierzy
enie macierzy
//dokończenie
//mnożenie macierzy
for
( i = 0; i < WIERSZE_MA; ++i ){
for
( j = 0; j < KOLUMNY_MB; ++j ){
temp = 0;
for
( k = 0; k < WIERSZE_MB; ++k)
temp += ma[i][k] * mb[k][j];
mc[i][j] = temp;
}
}
printf(
"ma * mb:\n"
);
//wyświetlenie wyniku na ekranie
for
( i = 0; i < WIERSZE_MA; ++i ){
for
( j = 0; j < KOLUMNY_MB; ++j )
printf(
" %3.1d\t "
, mc[i][j]);
printf(
"\n"
);
}
printf(
"\n"
);
return
0;
}
Sprawd
ź
my jak to zadziała
Zagnie
ż
d
ż
enie
trzech p
ę
tli
Dzi
Dzi
ę
ę
kuje za uwag
kuje za uwag
ę
ę
.
.
Najlepsz
Najlepsz
ą
ą
metod
metod
ą
ą
nauczenia si
nauczenia si
ę
ę
programowania.
programowania.
Jest pisanie program
Jest pisanie program
ó
ó
w.
w.
>>Trening czyni mistrza <<
>>Trening czyni mistrza <<