PodstawyProgramowania W02


WYKAADY W02 v1.0 (2014) Podstawy programowania (dr.inż Marcin Głowacki) 1
PODSTAWY
PROGRAMOWANIA
Wykład 2
PROWADZCY: dr inż. Marcin Głowacki
E-Mail: Marcin.Glowacki@pwr.edu.pl
Pok. 907 C-5
Wrocław 2014
WYKAADY W02 v1.0 (2014) Podstawy programowania (dr.inż Marcin Głowacki) 2
2. REPREZENTACJA DANYCH
Dane przechowywane i przetwarzane w komputerach są postaci cyfrowej, zatem w postaci liczb o
pierwotnej postaci liczb binarnych  zapisanych w systemie dwójkowym.
Dane, które zapisane są w pamięci komputera to tzw. zmienne, ze względu na fakt, że ich wartości
mogą być modyfikowane w trakcie działania programu. Każda zmienna jest określonego typu i
posiada unikalną nazwę lub wskazanie w postaci adresu czyli miejsca w pamięci operacyjnej.
Wyróżniono trzy typy zmiennych, w zależności od zasięgu dostępności danych w różnych
miejscach programu:
Globalne  deklarowane na początku programu, przed funkcją główną: main() ) dostępne w
każdym miejscu programu. Rezydują w pamięci przez cały czas funkcjonowania programu w
miejscu na stałe zarezerwowanym.
Lokalne  dostępne w bloku, w którym zostały zadeklarowane i używane tylko w jego obszarze,
np. w funkcji głównej lub innych zdefiniowanych funkcjach. Przeznaczone są do lokalnego
przetwarzania i dlatego mają charakter tymczasowy  znikają po zakończeniu funkcji lub nie są
dostępne po opuszczeniu funkcji, np. w celu realizacji innej funkcji, a po powrocie są nadal
dostępne. Każde jednak nowe wywołanie funkcji tworzy na nowo zestaw zadeklarowanych
zmiennych z ich wartościami początkowymi. Tworzone są w pamięci podręcznej programu, w
przestrzeni, która może być wielokrotnie użyta do deklarowania różnych zmiennych lokalnych.
Statyczne  podobnie jak zmienne lokalne dostępne są w bloku, w którym zostały zadeklarowane, z
tą jednak różnicą, że zachowują swoją wartość podczas ponownego wywołania funkcji. Musza
posiadać stałą rezerwację w pamięci, podobnie jak zmienne globalne.
Widoczność zmiennych, zmienne statyczne oraz zjawisko przesłaniania zostanie omówione w
dalszej części kursu.
DEKLARACJE ZMIENNYCH
Deklaracja zmiennej polega na wskazaniu typu zmiennej i nazwy. Nie można zakładać, że zmienne
posiadają istotną wartość początkową, która może być przypadkowa. Nie można zakładać, że
będzie to zero dla zmiennych przechowujących liczby. Możliwe jest zadeklarowanie zmiennych z
wartościami początkowymi:
Typ nazwa_zmiennej = wartość_początkowa;
int a,b,c;
float d,e,f;
double g,h;
Inicjalizacja wartości początkowych:
int a=0,b=1,c=5;
float d=0.1,e=0.5,f=7;
double g=0,h=0;
WYKAADY W02 v1.0 (2014) Podstawy programowania (dr.inż Marcin Głowacki) 3
W języku C definicje zmiennych mają ustalone miejsce, zwykle na początku programu lub funkcji.
W języku C++ dopuszczono większą swobodę co do miejsca umieszczenia deklaracji zmiennych 
zwykle mogą się pojawiać w dowolnym miejscu programu, np. przed ich pierwszym użyciem lub
nawet w trakcie ich użycia:
for (int i=0;i<100;i++){
...
}
int a= (int b=5) + (int c=7); //to tylko przykład - proszę nie stosować takich praktyk.
Poprawiła się wygoda użycia zmiennych, ale jednocześnie pojawić się bałagan. Należy stosować
przede wszystkim rozsądek i utrzymywać w równowadze rozproszenie deklaracji zmiennych oraz
porządek i czytelność programu.
STRUKTURA PROGRAMU
W przypadku rozbudowanych programów może być bardzo zróżnicowana. Dla prostych
przypadków można przyjąć ogólną strukturę składającą się z dyrektyw dołączenia plików
nagłówkowych #include, następnie zmiennych globalnych
Przykładowa postać ogólna struktury programu:
#include //pliki nagłówkowe
int konto, licznik; //zmienne globalne
int XYZ(int dana1, int dana2){
int wynik, suma, m,n; //zmienne lokalne w funkcji XYZ
& .
return suma; //powrót z funkcji
}
int main(){
int a=0, b, c; //zmienne lokalne w funkcji głównej
...
XYZ(b,10); //wywołanie funkcji XYZ
for (int i=0; i<10; i++){
...
}
return 0; //powrót z kodem  0 jeśli poprawne zakończenie
}
WYKAADY W02 v1.0 (2014) Podstawy programowania (dr.inż Marcin Głowacki) 4
TYPY DANYCH  WBUDOWANE
UWAGA Komputery nie mają pojęcia o matematyce. Rozpoznają tylko liczby. Zauważają tylko
odpowiedni poziom napięcia na określonym złączu przewodów. Jeśli występuje napięcie, jest ono
symbolicznie oznaczane jako jedynka, zaś gdy nie występuje, jest oznaczane jako zero. Poprzez
grupowanie zer i jedynek, komputer jest w stanie generować wzory, które mogą być interpretowane
jako liczby stało lub zmiennoprzecinkowe.
Jednostką informacji jest "bit", który niesie informację o stanie 0 lub 1, co można interpretować,
jako Prawda/Fałsz, Tak/Nie lub jako cząstkę liczby binarnej powstałej ze złożenia bitów w szereg.
"Bajt" jest szeregiem 8 bitów, który może mieć różną interpretację w zależności od typu danej
liczby i przyjętej metody kodowania. Kilka bajtów formuje "słowo", które w zależności od przyjętej
konwencji może zawierać kilka bajtów, zwykle parzysta wielokrotność, np. 2, 4, 8 itd.
Zarówno w języku C, jak i w języku C++ wyróżniamy pięć podstawowych typów danych:
int  typ całkowity. Używany jest do zapamiętywania i zapisywania liczb całkowitych.
float  typ zmiennopozycyjny (zmiennoprzecinkowy).
double  typ zmiennoprzecinkowy podwójnej długości. Zmienne typu float oraz double
umożliwiają zapamiętywanie i zapisywanie liczb posiadających część całkowitą i
ułamkową. Część ułamkową oddzielamy kropką.
char  typ znakowy stosowany do zapamiętywania i zapisywania znaków ASCII oraz
krótkich liczb reprezentowanych na 8 bitach. Na niektórych architekturach zajmuje może zajmować
więcej niż jeden bajt.
void  typ pusty. Za jego pomocą można deklarować funkcje nie zwracające żadnych wartości
oraz funkcje, które nie pobierają argumentów. Dodatkowo możliwe jest tworzenie
ogólnych wskazników.
Rozmiar typu <=> zakres liczb
jest uzależniony od architektury procesora (zwykle 16 lub 32 bity) oraz kompilatora. W
nowoczesnych, 32-bitowych procesorach rodziny Pentium z najnowszymi kompilatorami, liczby
całkowite mają cztery bajty.
Znak jest zawsze pojedynczą literą, cyfrą lub symbolem i zajmuje pojedynczy bajt pamięci.
WYKAADY W02 v1.0 (2014) Podstawy programowania (dr.inż Marcin Głowacki) 5
TYPY ZMIENNYCH
Nazwa Przykład deklaracji Zakres Bajtów Zastosowanie
Litera, char cZnak; - 128 ... 127 1 Teksty
Litera bez znaku unsigned char ucMala; 0 ... 255 1 Male liczby
Mała liczba całkowita short int siLiczba; 0 ... 255 1 Małe liczby całkowite
short siLiczba; 0 ... 65535 2
Liczba całkowita int liczba -32768 ... 32767 2 Liczby całkowite
 2 147 483 648 do 2 147 4
483 647
Liczba naturalna unsigned int i,j,k; 0 ... 65535 2 Liczba naturalna
unsigned 0 ... 4 294 967 295 4
 2 147 483 648 do 2 147
Duża liczba całkowita long int lDuza_liczba; 4 Duże liczby całkowite
483 647
long lDuza_liczba; 8
-2^31 ... 2^31-1
B. duże liczby naturalne unsigned long int ulBduza; 0 ... 2^64-1 8 Bardzo duże liczby
naturalne
unsigned long ulBduza; 0 ... 2^128-1 16
Zmiennoprzecinkowa float fLiczba; ą(1,2e-38 ... 3,4e38) 4 Z przecinkiem
double float dfUlamek; ą(2,2e-308 ... 1,79e308) 8
double dfUlamek;
long double ldXduza -3,3e-4932 ... 1,1e4932 16
WYKAADY W02 v1.0 (2014) Podstawy programowania (dr.inż Marcin Głowacki) 6
REPREZENTACJA LICZB STAAOPOZYCYJNYCH
Bit znaku dodawany jest na początku liczby blokując jeden bit, pozostała część liczby zapisana jest w naturalnym kodzie binarnym (NKB) lub w
kombinacjach z modułem lub operacją negowania liczby.
NKB to zapis liczby w naturalnym kodzie binarnym sumy kolejnych potęg liczby 2.
ZM to zapis znak-moduł (ang. sign-magnitude) utworzono przez dodanie jednego bitu do modułu (wartości bezwzględnej liczby zakodowanej w
NKB). Występuje podwójna reprezentacja zera.
U1  kod uzupełnień do 1 (ang. 1s complement) Najbardziej znaczący bit jest bitem znaku (0-liczba dodatnia, 1-liczba ujemna). Jeśli liczba jest
dodatnia to wartość liczby zakodowana jest w NKB, a jeśli liczba posiada znak ujemny to negacja pozostałej części liczby stanowi jej wartość poniżej
zera. Występuje podwójna reprezentacja zera.
U2  kod uzupełnień do 2 (ang. 2s complement) Najbardziej znaczący bit jest bitem znaku (0-liczba dodatnia, 1-liczba ujemna). Jeśli liczba jest
dodatnia to wartość liczby zakodowana jest w NKB, a jeśli liczba posiada znak ujemny to negacja pozostałej części liczby, po dodaniu 1 stanowi jej
wartość poniżej zera. Występuje pojedyncza reprezentacja zera.
BIAS  kod polaryzowany używany do zapisu cechy liczb zmiennopozycyjnych. Najbardziej znaczący bit jest bitem znaku (1-liczba dodatnia, 0-liczba
ujemna). Dalej podobnie jak w U2. Jeśli liczba jest dodatnia to wartość liczby zakodowana jest w NKB, a jeśli liczba posiada znak ujemny to negacja
pozostałej części liczby, po dodaniu 1 stanowi jej wartość poniżej zera. Występuje pojedyncza reprezentacja zera.
BCD  kod binarny liczb dziesiętnych reprezentowanych w postaci tetrad (czwórek bitów) reprezentujących kolejne cyfry dziesiętne. Każda tetrada
koduje cyfrę w NKB. Pierwszy bit jest bitem znaku (0-liczba dodatnia, 1-liczba ujemna)
Liczba ZM U1 U2 BIAS BCD
-128 10000000 00000000
-127 11111111 10000000 10000001 00000001 1000100100111
-126 11111110 10000001 10000010 00000010 1000100100110
... ... ... ... ... ...
-1 10000001 11111110 11111111 01111111 1000000000001
0 10000000 11111111 00000000 10000000 1000000000000
0 00000000 00000000 00000000 10000000 0000000000000
1 00000001 00000001 00000001 10000001 0000000000001
2 00000010 00000010 00000010 10000010 0000000000010
3 00000011 00000011 00000011 10000011 0000000000011
4 00000100 00000100 00000100 10000100 0000000000100
... ... ... ... ... ...
126 01111110 01111110 01111110 11111110 0000100100110
127 01111111 01111111 01111111 11111111 0000100100111
WYKAADY W02 v1.0 (2014) Podstawy programowania (dr.inż Marcin Głowacki) 7
REPREZENTACJA LICZB ZMIENNOPOZYCYJNYCH
Binarny zapis liczb składa się z trzech części kodowanych o osobnych polach:
- jednobitowe pole znaku (ang. sign)
- n  bitowe pole części ułamkowej zwane mantysą S (ang significant part)
- m  bitowe pole części wykładniczej zwane cechą E (ang. exponent part)
Liczba A = +/- S * B +/- E gdzie B jest podstawą wykładnika i zwykle przyjmuje się 2, 10, 16
Część ułamkowa mantysa S jest zawsze z przedziału: [0.5, 1) lub inaczej 0.5 <= S < 1
A w postaci binarnej: 0.100...0 <= S =< 0.111 ....1 co oznacza 0*20 + 1*2-1 + 0* .... =0.5
Można zauważyć, że dwie pierwsze pozycje binarne dla całego przedziału są takie same zatem:
0.1 a -2 a -3& a -(n+1) co oznacza: 1*2-1+ a -2 * 2-2 + a -3 * 2-3 + ... + a -(n+1) * 2-(n+1)
Przykładowe długości cechy i mantysy [bity]
Komputer Słowo Znak Mantysa Cecha
VAX11 32 1 23 8
Intel 80 1 64 15
Standard 64 1 48 15
IEEE754 32 1 23 8
Standard IEEE 754 dla mantysy 23 bitowej i cechy 8 bitowej umożliwia zapis liczb
od 0.5*2-128 do (1-2-24) 2+127
-(1-2-24) 2+127 - 0.5*2-128 +0.5*2-128 +(1-2-24) 2+127
0
Przykład przeliczenia danej dziesiętnej na binarną postać zmiennoprzecinkową:
Liczbę: 0,625625 * 103 można przedstawić jako 625,625
Osobno traktując część całkowitą 625 można ją zapisać binarnie jako 10 0111 0001
Część ułamkowa: 0,625 jest sumą 0,5 i 0,125 czyli 1*2-1 + 0* 2-2 + 1*2  3 zatem 0.101
W rezultacie otrzymujemy liczbę 10 0111 0001.101
Ponieważ część całkowita mieści się na 10 bitach normalizujemy liczbę przesuwając przecinek o
10 pozycji w lewo  robiąc z niej ułamek z częścią wykładnika o wartości 10:
0.1001110001101 * 210
ale odrzucamy również przy zapisie mantysy dwa pierwsze bity: 0.1001110001101
Bit znaku Mantysa Cecha
0 (dodatnia) 0011 1000 1101 0000 0000 000 1 0001010
znak cechy (zapis polaryzowany BIAS)
Trudność może sprawić przekształcenie części ułamkowej do mantysy. Często trzeba
normalizować liczbę dziesiętną do odpowiedniego zakresu aby część ułamkowa mieściła się w
zakresie od 0,5 do 1.
WYKAADY W02 v1.0 (2014) Podstawy programowania (dr.inż Marcin Głowacki) 8
Przykład. Sprawdzanie rozmiarów typów zmiennych istniejących w twoim
komputerze
#include
int main(){
using std::cout;
cout << "Rozmiar zmiennej typu int to:\t\t"<< sizeof(int) << " bajty.\n";
cout << "Rozmiar zmiennej typu short int to:\t"<< sizeof(short) << " bajty.\n";
cout << "Rozmiar zmiennej typu long int to:\t"<< sizeof(long) << " bajty.\n";
cout << "Rozmiar zmiennej typu char to:\t\t"<< sizeof(char) << " bajty.\n";
cout << "Rozmiar zmiennej typu float to:\t\t"<< sizeof(float) << " bajty.\n";
cout << "Rozmiar zmiennej typu double to:\t"<< sizeof(double) << " bajty.\n";
cout << "Rozmiar zmiennej typu bool to:\t"<< sizeof(bool) << " bajty.\n";
return 0;
}
Efekt:
Rozmiar zmiennej typu int to: 4 bajty.
Rozmiar zmiennej typu short int to: 2 bajty.
Rozmiar zmiennej typu long int to: 4 bajty.
Rozmiar zmiennej typu char to: 1 bajty.
Rozmiar zmiennej typu float to: 4 bajty.
Rozmiar zmiennej typu double to: 8 bajty.
Rozmiar zmiennej typu bool to: 1 bajty.
UWAGA: W twoim komputerze rozmiary zmiennych mogą być inne.
WYKAADY W02 v1.0 (2014) Podstawy programowania (dr.inż Marcin Głowacki) 9
DEFINICJA TYPÓW przez typedef
Dla przykładu ciągłe wpisywanie unsigned short int może być żmudne, a co gorsza, może
spowodować wystąpienie błędu.
C++ umożliwia użycie słowa kluczowego typedef (od type definition, definicja typu), dzięki
któremu możesz stworzyć skróconą formę takiego zapisu.
Dzięki skróconemu zapisowi tworzony jest synonim, lecz nie jest to nowy typ.
Przy zapisywaniu synonimu typu używa się słowa kluczowego typedef, po którym wpisuje się
istniejący typ, zaś po nim nową nazwę typu.
Na przykład:
typedef unsigned short int USHORT;
tworzy nową nazwę typu, USHORT, której można użyć wszędzie tam, gdzie mógłbyś użyć
zapisu unsigned short int.
Przykład użycia typedef
// *****************
// Demonstruje użycie słowa kluczowego typedef
#include
typedef unsigned short int USHORT; //definiowane poprzez: typedef
int main() {
using std::cout;using std::endl;
USHORT Width = 5;
USHORT Length;
Length = 10;
USHORT Area = Width * Length; // UWAGA: * (gwiazdka) oznacza mnożenie.
cout << "Szerokosc:" << Width << "\n";
cout << "Dlugosc: " << Length << endl;
cout << "Obszar: " << Area <return 0;
}
Efekt:
Szerokosc:5
Dlugosc: 10
Obszar: 50
Analiza
W linii 4. definiowany jest synonim USHORT dla typu unsigned short int.
WYKAADY W02 v1.0 (2014) Podstawy programowania (dr.inż Marcin Głowacki) 10
STAAE
Do przechowywania danych służą także stałe - wartość stałej nie ulega zmianie. Podczas
tworzenia stałej trzeba ją zainicjalizować, pózniej nie można już przypisywać jej innej wartości.
C++ posiada dwa rodzaje stałych: literały i stałe symboliczne.
LITERAAY
Literał jest wartością wpisywaną bezpośrednio w danym miejscu programu. Na przykład:
int mojWiek = 19;
mojWiek jest zmienną typu int i może być przypisywana dowolna wartość z zakresu int w
dowolnym momencie działania programu w miejscu dostępu do zmiennej;
19 jest literałem. Programista umawia się sam ze sobą, że nie będzie zmieniał wartości literału w
trakcie działania programu. WARTOŚĆ TA MOŻE ALE NIE POWINNA BYĆ ZMIENIANA.
STAAE SYMBOLICZNE
Stała symboliczna jest reprezentowana poprzez swoją nazwę - po zainicjalizowaniu stałej, nie
można pózniej zmieniać jej wartości.
" Definicja klasyczna z użyciem dyrektywy preprocesora #define przez proste podstawienie
tekstu:
#define STUDENCI 89
gdzie stała STUDENCI nie ma określonego typu (int, char, itd.). Za każdym razem, gdy
preprocesor natrafia na słowo STUDENCI, zastępuje je napisem 89.
" Definicja stałych za pomocą const, gdzie stała posiada swój typ
const unsigned short int STUDENCI = 89;
Stała ma typ, którym jest unsigned short int.
Zalety const:
- kod programu jest łatwiejszy w konserwacji i jest bardziej odporny na błędy,
- kompilator może wymusić użycie jej zgodnie z tym typem.
UWAGA Stałe nie mogą być zmieniane podczas działania programu. Jeśli chcesz na
przykład
zmienić wartość stałej STUDENCI, musisz zmodyfikować kod zródłowy, po czym
skompilować program ponownie.
Możliwy jest zapis liczb w formie wykładniczej:8e2 (8*102), 10.4e8 (10.4*108), 5.2e-3 (5.2*10-3)
STAAE WYLICZENIOWE
Stałe wyliczeniowe umożliwiają tworzenie nowych typów, a następnie definiowanie ich
wartości, które ograniczają się do wartości określonych w definicji typu.
Na przykład, możesz zadeklarować typ COLOR (kolor) jako wyliczenie, dla którego możesz
zdefiniować pięć wartości: RED, BLUE, GREEN, WHITE oraz BLACK.
Składnię definicji wyliczenia stanowią słowo kluczowe enum, nazwa typu, otwierający nawias
klamrowy, lista wartości oddzielonych przecinkami, zamykający nawias klamrowy oraz średnik.
WYKAADY W02 v1.0 (2014) Podstawy programowania (dr.inż Marcin Głowacki) 11
Przykład:
enum COLOR { RED, BLUE, GREEN, WHITE, BLACK };
W efekcie nowe wyliczenie otrzymuje nazwę COLOR, tj. tworzony jest nowy typ.
- RED (czerwony) jest stałą symboliczną o wartości 0,
- BLUE (niebieski) jest stałą symboliczną o wartości 1,
- GREEN (zielony) jest stałą symboliczną o wartości 2, itd.
Każda wyliczana stała posiada wartość całkowitą. Jeśli tego nie określisz, zakłada się że pierwsza
stała ma wartość 0, następna 1, itd. Każda ze stałych może zostać zainicjalizowana dowolną
wartością. Stałe, które nie zostaną zainicjalizowane, będą miały wartości naliczane począwszy od
wartości od jeden większej od wartości stałych zainicjalizowanych. Zatem, jeśli napiszesz:
enum COLOR { RED=100, BLUE, GREEN=500, WHITE, BLACK=700 };
To:
- RED będzie mieć wartość 100,
- BLUE będzie mieć wartość 101,
- GREEN wartość 500,
- WHITE (biały) wartość 501,
- BLACK (czarny) wartość 700.
Możesz definiować zmienne typu COLOR, ale mogą one przyjmować tylko którąś z wyliczonych
wartości (w tym przypadku RED, BLUE, GREEN, WHITE lub BLACK, albo 100, 101, 500, 501
lub 700). Zmiennej typu COLOR możesz przypisać dowolną wartość koloru.
W rzeczywistości możesz przypisać jej dowolną wartość całkowitą, nawet jeśli nie odpowiada
ona dozwolonemu kolorowi - dobry kompilator powinien w takim przypadku wypisać
ostrzeżenie. Należy zdawać sobie sprawę, że stałe wyliczeniowe to w rzeczywistości zmienne
typu unsigned int oraz że te stałe odpowiadają zmiennym całkowitym. Możliwość nazywania
wartości okazuje się bardzo pomocna, na przykład podczas pracy z kolorami, dniami tygodnia
czy podobnymi zestawami.
Przykład stałych wyliczeniowych
#include
int main() {
enum Days { Sunday, Monday, Tuesday,
Wednesday, Thursday, Friday, Saturday };
Days today;
today = Monday; //przypisanie
if (today == 0 || today == Saturday) //sprawdzanie warunku
std::cout << "\nUwielbiam weekendy!\n";
else
std::cout << "\nWracaj do pracy.\n";
Efekt:
return 0;
Wracaj do pracy.
}
WYKAADY W02 v1.0 (2014) Podstawy programowania (dr.inż Marcin Głowacki) 12
Analiza
W linii 3. definiowana jest stała wyliczeniowa Days (dni), posiadająca siedem, odpowiadających
dniom tygodnia, wartości. Każda z tych wartości jest wartością całkowitą, numerowaną od 0 w
górę (tak więc Monday  poniedziałek  ma wartość 1)1.
Tworzymy też zmienną typu Days  tj. zmienną, która będzie przyjmować wartość z listy
wyliczonych stałych. W linii 7. przypisujemy jej wartość wyliczeniową Monday, którą następnie
sprawdzamy w linii 9.
Program podobny do poprzedniego, ale wykorzystujący stałe całkowite
#include
int main() {
const int Sunday = 0;
const int Monday = 1;
const int Tuesday = 2;
const int Wednesday = 3;
const int Thursday = 4;
const int Friday = 5;
const int Saturday = 6;
int today;
today = Monday;
if (today == Sunday || today == Saturday)
std::cout << "\nUwielbiam weekendy!\n";
else
std::cout << "\nWracaj do pracy.\n";
return 0;
}
Efekt:
Wracaj do pracy.
Analiza
ISTOTNY FAKT: Amerykanie liczą dni tygodnia zaczynając od niedzieli.
Wynik działania tego programu jest identyczny z wynikiem programu z listingu 3.7. W tym
programie każda ze stałych (Sunday, Monday, itd.) została zdefiniowana jawnie i nie istnieje typ
wyliczeniowy Days. Stałe wyliczeniowe mają tę zaletę, że się same dokumentują 
przeznaczenie typu wyliczeniowego Days jest oczywiste.


Wyszukiwarka

Podobne podstrony:
PodstawyAutomatyki w02
469 W02 SKiTI wprowadzenie podstawowe pojecia
w02 demo podstawy i zrodla
W02 Z ABu WSB ZDiU Podstawy LD z dn04 10 09
W02 elementy podstawowe
Wyk6 ORBITA GPS Podstawowe informacje
Podstawowe informacje o Rybnie
3 podstawy teorii stanu naprezenia, prawo hookea
zestawy cwiczen przygotowane na podstawie programu Mistrz Klawia 6
podstaw uniw
Jezyk angielski arkusz I poziom podstawowy (5)
07 GIMP od podstaw, cz 4 Przekształcenia
Podstawy dzialania routerow i routingu

więcej podobnych podstron