04 operacje wejscia wyjscia


1 Cel ćwiczenia 1
POLITECHNIKA ŚLSKA
w Gliwicach
WYDZIAA INŻYNIERII BIOMEDYCZNEJ
LABORATORIUM
JZYKÓW PROGRAMOWANIA
C#  operacje wejscia-wyjscia
Opracował: mgr inż. Marcin Rudzki
v.2.00, Gliwice 2010
1 Cel ćwiczenia
Celem ćwiczenia jest zapoznanie studentów z podstawowymi metodami wprowadzania do programu danych
numerycznych, tekstowych i znakowych oraz ich wyprowadzania na ekran w języku C#. Studenci zapoznają się
z niektórymi metodami klasyConsolesłużącymi tym celom.
UWAGA! Od studentów wymaga się, aby, przystępując do niniejszego ćwiczenia potrafili, samodzielnie ob-
sługiwać środowisko programistyczne Visual Studio w zakresie umożliwiającym pisanie programu, kompilowanie
i uruchamianie napisanego programu oraz jego debugowanie.
2 Materiał obowiązkowy
Wiedza i umiejętności dotyczące materiału zaprezentowanego w tym rozdziale mogą zostać sprawdzone przed la-
boratorium w ramach krótkiego zadania sprawdzającego (pisemnego lub na komputerach).
2.1 Wyprowadzanie danych na ekran konsoli
Praktycznie każdy program podczas swojego działania wymaga interakcji z użytkownikiem i/lub zaprezentowa-
nia mu wyników obliczeń. W aplikacjach konsolowych pisanych w języku C# do prezentacji wyników działania
programu służą m.in. metody1Console.WriteLine()orazConsole.Write(). Osoby znające język Turbo Pas-
cal powinny już wiedzieć, co te metody robią oraz czym się różnią.
MetodaConsole.Write(argumenty)służy do wypisywania danych tekstowych na ekran konsoli. Opcjonalne
argumentyto dane, które mają zostać wyświetlone. Pamiętać należy, że muszą być one albo bezpośrednio
tekstem (łańcuchem  string) albo konwertowalne na taką postać. Dla prostych typów danych jest to niejako
robione automatycznie i nie trzeba się tym problemem przejmować. Przykłady wywołania dla kilku rodzajów
argumentów pokazano poniżej.
1
czyli inaczej funkcje
2.1 Wyprowadzanie danych na ekran konsoli 2
1 string tekst = "To jest tekst";
2 Console.Write(tekst);
3
4 int calkowita = 1024;
5 Console.Write(calkowita);
6
7 double ulamkowa = 123.456;
8 Console.Write(ulamkowa);
9
10 char znak =  A ;
11 Console.Write(znak);
Po skompilowaniu i wykonaniu powyższego kodu można zobaczyć, że wszystkie wartości wyprowadzone są
na ekran jedna zaraz obok drugiej. MetodaConsole.Write()nie dodaje znaku nowej linii do wyprowadzanego
na ekran tekstu. Wynik wykonania powyższego kodu jest przedstawiony poniżej.
1 To jest tekst1024123,456A
Zapamiętaj! Console.Write()nie dodaje znaku końca linii do wyprowadzanego tekstu.
MetodaConsole.WriteLine(argumenty)jest w zasadzie identyczna jakConsole.Write(argumenty)z tą
różnicą, że dodaje na końcu wypisywanego tekstu znak nowej linii  czyli powoduje, że dane wypisywane
w kolejnych wywołaniach tej metody będą pojawiać się w osobnych liniach.
Zamieniając wywołania metodyConsole.Write()naConsole.WriteLine()
1 string tekst = "To jest tekst";
2 Console.WriteLine(tekst);
3
4 int calkowita = 1024;
5 Console.WriteLine(calkowita);
6
7 double ulamkowa = 123.456;
8 Console.WriteLine(ulamkowa);
9
10 char znak =  A ;
11 Console.WriteLine(znak);
otrzymamy następujący wynik:
1 To jest tekst
2 1024
3 123,456
4 A
Zapamiętaj! Console.WriteLine()dodaje znak końca linii do wyprowadzanego tekstu.
Obie powyżej przedstawione metody umożliwiają zaawansowane formatowanie danych w celu ich wyświe-
tlenia. Wywołanie wygląda podobnie do składni funkcjiprintf()znanej z języka C. W łańcuchu tekstowym
pojawiają się pola {...} określające miejsce gdzie kompilator ma umieścić wartość odpowiadającego argumentu.
I tak {0} oznacza pierwszy argument, {1} drugi, {2} trzeci itd. Dla przykładu następujący kod:
2.1 Wyprowadzanie danych na ekran konsoli 3
1 string tekst = "To jest tekst";
2 int calkowita = 1024;
3 double ulamkowa = 123.456;
4 char znak =  A ;
5
6 Console.WriteLine("liczba calkowita = {0}", calkowita);
7 Console.WriteLine("mozna i wiele razy wyswietlac to samo: {0} {0} {0}", calkowita);
8 Console.WriteLine("liczba calkowita = {0}, a liczba ulamkowa = {1}", calkowita, ulamkowa);
9 Console.WriteLine("to jest znak {1}, a {0}", tekst, znak);
da w wyniku program, który wyświetli taki tekst na ekranie:
1 liczba calkowita = 1024
2 mozna i wiele razy wyswietlac to samo: 1024 1024 1024
3 liczba calkowita = 1024, a liczba ulamkowa = 123,456
4 to jest znak A, a To jest tekst
Zapamiętaj! Console.Write("tekst {0} {1} {0}", arg0, arg1);
2.1.1 Formatowanie danych
Używając tzw. łańcuchów formatujących, można w różny sposób przedstawić daną wartość podczas konwersji
danej numerycznej na tekst. Pierwsza możliwość to określenie minimalnej szerokości pola zarezerwowanego na
daną wartość, np.:
1 Console.WriteLine("{0,3}+{1,4}={2,5}", 1, 1.3, 1+1.3);
powoduje zarezerwowanie dla wartości wpisywanej w polu 0 minimalnie trzech znaków, w polu 1  czterech
znaków, a w polu 2  pięciu znaków. Wypisywane liczby są z lewej strony dopełniane spacjami, tak aby wypełniły
wymaganą szerokość. Wynik przedstawiono poniżej, gdzie symbol oznacza pojedynczy znak spacji.
1 1+ 1,3= 2,3
Zapamiętaj! Definiowanie szerokości pola: {IndeksArgumentu,SzerokośćPola}
symbol opis
C, c (Currency)  formatuje daną jako walutę, zgodnie z ustawieniami systemowymi
D, d (Decimal)  formatuje daną jako wartość dziesiętną (tylko typy całkowitoliczbowe)
E, e (Exponential)  formatuje daną w zapisie naukowym
F, f (Fixed point)  formatuje daną w zapisie stałoprzecinkowym
G, g (General)  formatowanie ogólne
N, n (Numeric)  formatuje daną jako liczbę zgodnie z formatem liczbowym danego kraju
P, p (Percent)  formatuje daną jako procent
R, r (Roundtrip)  zapewnia brak utraty precyzji zapisu po konwersji na tekst
X, x (heXadecimal)  formatuje daną w zapisie szesnastkowym (tylko typy całkowitoliczbowe)
Tab. 1: Zaawansowane formatowanie wartości numerycznych
2.1 Wyprowadzanie danych na ekran konsoli 4
Bardziej zaawansowane formatowanie wartości numerycznych umożliwiają dodatkowe parametry łańcuchów
formatujących, zebrane w Tab. 1. Przykładowy kod prezentujący możliwości formatowania wartości liczbowych
przedstawiono poniżej.
1 Console.WriteLine("{0} bez formatowania ....................... : {0}" , 1234.56);
2 Console.WriteLine("{0} jako waluta ............................ : {0:C}", 1234.56);
3 Console.WriteLine("{0} w notacji naukowej ..................... : {0:E}", 1234.56);
4 Console.WriteLine("{0} w notacji staloprzecinkowej ............ : {0:F}", 1234.56);
5 Console.WriteLine("{0} formatowanie ogolne .................... : {0:G}", 1234.56);
6 Console.WriteLine("{0} formatowanie zalezne od ust. regionalnych: {0:N}", 1234.56);
7 Console.WriteLine("{0} jako procent ........................... : {0:P}", 1234.56);
8 Console.WriteLine("{0} jako liczba dziesietna .................... : {0:D}", 1234);
9 Console.WriteLine("{0} w reprezentacji szesnastkowej ............. : {0:X}", 1234);
Oraz wynik wykonania programu:
1 1234,56 bez formatowania ....................... : 1234,56
2 1234,56 jako waluta ............................ : 1 234,56 zł
3 1234,56 w notacji naukowej ..................... : 1,234560E+003
4 1234,56 w notacji staloprzecinkowej ............ : 1234,56
5 1234,56 formatowanie ogolne .................... : 1234,56
6 1234,56 formatowanie zalezne od ust. regionalnych: 1 234,56
7 1234,56 jako procent ........................... : 123 456,00%
8 1234 jako liczba dziesietna .................... : 1234
9 1234 w reprezentacji szesnastkowej ............. : 4D2
Oczywiście można łączyć definiowanie minimalnej szerokości pola i formatowanie zaawansowane, np. kod:
1 Console.WriteLine("{0} jako waluta zapisana na min. 15 znakach: {0,15:C}", 12.34);
da w wyniku następujący rezultat:
1 12,34 jako waluta zapisana na min. 15 znakach: 12,34 zł
przy czym zależnie od wybranego formatowania wlicza się wszystkie dodatkowe znaki (w tym przykładzie do
tych znaków należy zaliczyć symbol waluty, znak części dziesiętnej i spacje).
Zapamiętaj! Formatowanie liczb: {IndeksArgumentu,SzerokośćPola:TypFormatowania}
2.1.2 Wypisywanie na ekran znaków specjalnych
W języku C#, podobnie jak w języku C, występują pewne sekwencje znaków specjalnych, które umożliwiają
wyświetlenie niektórych  zwykłych znaków oraz znaków sterujących2. Lista tych sekwencji jest zaprezentowana
w Tab. 2.
2
które służyły do sterowania pracą drukarek tekstowych
2.2 Pobieranie danych z klawiatury 5
sekwencja opis
\b (Backspace)  przejście kursora o jeden znak wstecz
\f (Form feed)  nowa strona
\n (Newline)  przejście kursora do następnej linii (oraz do jej początku w przypadku Windows)
\r (Return)  powrót kursora do początku linii
\t (Tab)  tabulacja pozioma, odstęp kilku znaków
\v (Vertical tab)  tabulacja pionowa, odstęp kilku linii
\ znak cudzysłowu
\ znak apostrofu
\\ znak backslash (ukośnik wsteczny)
\xNNNN zamienia kod szesnastkowy NNNN na odpowiadający mu znak
\uNNNN zamienia kod NNNN na odpowiadający mu znak Unicode
\0 znak pusty
Tab. 2: Sekwencje umożliwiające wyświetlenie znaków specjalnych
Przykład:
1 Console.WriteLine("Znak tabulacji \\t :\t przesunie ten tekst o pewna ilosc znakow.");
2 Console.WriteLine("Znak konca linii \\n :\nprzeniesie ten tekst do nowego wiersza.");
3 Console.WriteLine("Znak powrotu \\r :\rrozpocznie ten tekst od pocz. linii.");
4 Console.WriteLine("Cofniecie o jeden znak \\b :\bcofnie kursor o jeden znak.");
5 Console.WriteLine("A jak wpisac apostrof? Tak: \ ");
6 Console.WriteLine("A cudzyslow? Tak: \" ");
7 Console.WriteLine("Ukosnik? \\");
8 Console.WriteLine("Znak pusty: \0 ");
9 Console.WriteLine("Wypisanie znaku podajac jego kod szesnastkowy (0x41=65=\ A\ ): \x41");
10 Console.WriteLine("Wypisanie znaku podajac jego kod Unicode: \u0041");
1 Znak tabulacji \t : przesunie ten tekst o pewna ilosc znakow.
2 Znak konca linii \n :
3 przeniesie ten tekst do nowego wiersza.
4 rozpocznie ten tekst od pocz. linii.
5 Cofniecie o jeden znak \b cofnie kursor o jeden znak.
6 A jak wpisac apostrof? Tak: 
7 A cudzyslow? Tak: "
8 Ukosnik? \
9 Znak pusty:
10 Wypisanie znaku podajac jego kod szesnastkowy (np. 0x41=65= A ): A
11 Wypisanie znaku podajac jego kod Unicode: A
2.2 Pobieranie danych z klawiatury
Prezentowanie użytkownikowi wyników obliczeń i innych komunikatów umożliwia tylko jednostronną komu-
nikację i tylko czasem bywa wystarczające. W większości przypadków program wymaga podania od użyt-
kownika jakichś danych. Mogą to być dane numeryczne (potrzebne do obliczenia np. pierwiastków trójmianu
kwadratowego), tekstowe (np. identyfikujące użytkownika) lub znakowe (np. potwierdzenie komunikatu). Do
wprowadzania danych do programu w języku C# służą metodyConsole.ReadLine(),Console.Read()oraz
Console.ReadKey().
2.2 Pobieranie danych z klawiatury 6
2.2.1 Dane tekstowe
Za pomocą metodyConsole.ReadLine()można wprowadzić dane tekstowe do programu. Metoda ta odczy-
tuje linię tekstu wprowadzoną przez użytkownika i zakończoną klawiszem [Enter]. Przykład wywołania jest
zaprezentowany poniżej.
1 Console.Write("Wpisz coś i nacisnij [Enter]: ");
2 string tekst = Console.ReadLine();
3 Console.WriteLine("Wpisano: " + tekst);
Oraz wynik wywołania programu:
1 Wpisz coś i nacisnij [Enter]: qwerty
2 Wpisano: qwerty
Zapamiętaj! string tekst = Console.ReadLine();
Należy zwrócić uwagę, że nawet jeśli wpiszemy jakąkolwiek liczbę to w wyniku otrzymamy jej tekstową
reprezentację, a nie wartość numeryczną! Co zrobić, aby odczytać wartość liczbową, jest opisane w dalszej
części niniejszej instrukcji.
2.2.2 Dane znakowe
Do wprowadzania danych znakowych (czyli pojedynczych znaków) można także użyć metodyConsole.Read-
Line(), jednak jej użycie nie gwarantuje, że zostanie odczytany dokładnie jeden znak. To zależy, ile znaków
użytkownik wprowadził. Ponadto typem zwracanym przez metodęConsole.ReadLine()jeststring, czyli łań-
cuch znaków.
Bardziej stosowną metodą do wprowadzania pojedynczych znaków jest metodaConsole.ReadKey()zwra-
cająca strukturęConsoleKeyInfo. Do określenia, jaki klawisz został naciśnięty, należy się posłużyć właści-
wością3Keytej struktury, aby odczytać sam znak  właściwościąKeyChar. Dodatkowo można odczytać, czy
były wciśnięte klawisze [Shift], [Alt] lub [Ctrl] za pomocą właściwościModifiers. Przykład użycia metody
Console.ReadKey()pokazano poniżej. Metoda ta przyjmuje opcjonalny argument będący wartościątruebądz
(domyślnie)false. Jeśli argument jest nie podany lub ma wartośćfalse, to metodaConsole.ReadKey()po-
woduje wypisanie na ekran znaku odpowiadającego klawiszowi naciśniętemu przez użytkownika. Jeśli argument
ma wartośćtrue, znak nie zostanie wyświetlony na ekranie.
1 Console.Write("Nacisnij jakis klawisz: ");
2 ConsoleKeyInfo info = Console.ReadKey(false);
3 Console.WriteLine("\nNacisinieto klawisz {0}, odczytano znak {1}", info.Key, info.KeyChar);
4 Console.Write("Nacisnij jakis klawisz: ");
5 info = Console.ReadKey(true);
6 Console.WriteLine("\nNacisinieto klawisz {0}, odczytano znak {1}", info.Key, info.KeyChar);
Oraz wynik wykonania programu:
1 Nacisnij jakis klawisz: q
2 Nacisinieto klawisz Q, odczytano znak q
3 Nacisnij jakis klawisz:
4 Nacisinieto klawisz Q, odczytano znak q
3
na tę chwilę przyjmijmy, że właściwość (Property) jest tożsama z polem struktury. Czym są właściwości zostanie przedstawione
na jednym z pózniejszych ćwiczeń.
2.2 Pobieranie danych z klawiatury 7
Zapamiętaj! ConsoleKeyInfo keyinfo = Console.ReadKey();
Istnieje jeszcze metodaConsole.Read(), która odczytuje kod wprowadzonego znaku jako wartość całkowi-
toliczbową (typint) jednak ze względu na specyfikę działania tej metody nie będzie ona wymagana podczas
laboratorium. Osoby zainteresowane mogą przyglądnąć się rozdziałowi Materiał dodatkowy.
2.2.3 Dane numeryczne
Jak już wspomniano wcześniej, metodaConsole.ReadLine()może być użyta do wprowadzania dowolnego ciągu
znaków, w tym także tekstu reprezentującego wartość liczbową. Jednak po wczytaniu takiego tekstu, nie można
na nim wykonywać żadnych obliczeń, gdyż nie jest on rozumiany przez program jako wartość liczbowa. Aby za-
mienić tekst na wartość liczbową, należy użyć metodyParse()odpowiedniego typu numerycznego. Jeśli program
ma pobrać od użytkownika wartość całkowitoliczbową, to po wczytaniu tekstu metodąConsole.ReadLine()
należy metodą np.int.Parse()skonwertować tekst na wartość liczbową. Jeśli konwersja się powiedzie, to
w zmiennej liczbowej zostanie umieszczona odpowiednia wartość, natomiast jeśli konwersja się nie powiedzie,
to zostanie wygenerowany wyjątek (ang. exception), czyli błąd wykonania programu.
Poniższy kod pokazuje, jak należy dokonać odczytu wartości całkowitoliczbowej (typint) oraz zmienno-
przecinkowej (typdouble). Na poprawnie skonwertowanych wartościach liczbowych można dopiero wykonywać
operacje matematyczne.
1 Console.Write("Wpisz liczbę calkowita: ");
2 string tekst = Console.ReadLine();
3
4 int calkowita = int.Parse(tekst);
5 Console.WriteLine("Wpisano tekst: {0} ktory reprezentuje liczbe: {1}", tekst, calkowita);
6
7 Console.Write("Wpisz liczbę ulamkowa: ");
8 tekst = Console.ReadLine();
9 double ulamkowa = double.Parse(tekst);
10 Console.WriteLine("Wpisano tekst: {0} ktory reprezentuje liczbe: {1}", tekst, ulamkowa);
11
12 calkowita += 3;
13 ulamkowa += 3;
14 tekst += 3;
15 Console.WriteLine("Dodano 3 i otrzymano: \ntekst: {0} \ncalkowita: {1} \nulamkowa: {2}",
16 tekst, calkowita, ulamkowa);
Oraz wynik wykonania programu:
1 Wpisz liczbę calkowita: 123
2 Wpisano tekst: 123 ktory reprezentuje liczbe: 123
3 Wpisz liczbę ulamkowa: 123,45
4 Wpisano tekst: 123,45 ktory reprezentuje liczbe: 123,45
5 Dodano 3 i otrzymano:
6 tekst: 123,453
7 calkowita: 126
8 ulamkowa: 126,45
Zapamiętaj! int calkowita = int.Parse(tekst);
Zapamiętaj! double ulamkowa = double.Parse(tekst);
3 Materiał dodatkowy 8
Oczywiście zaprezentowane typy int oraz double to tylko przykłady. Dla każdego podstawowego typu
numerycznego istnieje metodaParse(), której należy użyć w danym przypadku, zależnie od typu zmiennej, do
której chcemy pobrać wartość od użytkownika.
3 Materiał dodatkowy
3.1 Przekazywanie argumentów do programu z linii poleceń
W przypadku aplikacji konsolowych bardzo przydatym sposobem komunikacji z programem jest przekazywanie
argumentów z linii poleceń. Umożliwia to użycie takiego programu wewnątrz skryptów. W języku C# prze-
kazywanie argumentów do metodyMain()wygląda podobnie jak w języku C do funkcjimain(). Domyślnie
tworzony szablon metodyMain()zawiera listę argumentów w postacistring[] args. Lista argumentów jest
tablicą łańcuchów, której użycie w programie jest bardzo proste:
1 static void Main(string[] args)
2 {
3 for (int i = 0; i < args.Length; i++)
4 Console.WriteLine("argument{0}= {1}", i+1, args[i]);
5
6 Console.ReadKey();
7 }
Taki program po skompilowaniu wywołano z linii poleceń4:wewy.exe ble bla 123 234,56i otrzymano:
1 argument1= ble
2 argument2= bla
3 argument3= 123
4 argument4= 234,56
Pamiętać należy, że wszystkie argumenty wywołania programu są tekstem  jeżeli któryś ma być uznany za
liczbę, należy odpowiednio użyć metodyParse().
3.2 MetodaConsole.Read()
MetodaConsole.Read()umożliwia pobranie kodu znaku odpowiadającego naciśniętemu klawiszowi. Metoda
ta odczytuje kod pojedynczego znaku ze standardowego strumienia wejściowego. Jeżeli w buforze znajdzie
się więcej niż jeden znak, to zostanie odczytany tyko kod pierwszego znaku, natomiast wszystkie pozostałe
nadal pozostaną w buforze. Dlatego kolejne wywołanie np.Console.ReadLine()nie zatrzyma się, by pobrać
dane od użytkownika tylko pobierze to co zostało w buforze. Kolejną niedogodnością w stosowaniu tej metody
jest konieczność zatwierdzania końca danych klawiszem [Enter]. Dlatego wygodniejszym rozwiązaniem przy
konieczności wczytywania pojedynczych znaków jest użycie metodyConsole.ReadKey().
4
zamiast uciążliwego wywoływania z linii poleceń, łatwiej zmienić opcje projektu w Visual Studio, dodając niezbędne parametry
wywołania programu: Project/Properties/Debug/Command line arguments.
4 Program ćwiczenia 9
1 Console.Write("Wpisz ciag znakow i zatwierdz klawiszem [Enter]: ");
2 int znak = Console.Read();
3 Console.WriteLine("Kod pierwszego znaku: {0} czyli znak {1}", znak, (char)znak);
4 string tekst = Console.ReadLine();
5 Console.WriteLine("A oto reszta danych z bufora: " + tekst);
6 Console.WriteLine();
7 Console.Write("Wpisz ciag znakow i zatwierdz klawiszem [Enter]: ");
8 do
9 {
10 znak = Console.Read();
11 Console.Write(znak + " = " + (Char)znak + "\n");
12 } while (znak !=  \n );
1 Wpisz ciag znakow i zatwierdz klawiszem [Enter]: qwerty
2 Kod pierwszego znaku: 113 czyli znak q
3 A oto reszta danych z bufora: werty
4
5 Wpisz ciag znakow i zatwierdz klawiszem [Enter]: qwerty
6 113 = q
7 119 = w
8 101 = e
9 114 = r
10 116 = t
11 121 = y
12 13 =
13 10 =
4 Program ćwiczenia
W ramach ćwiczenia laboratoryjnego studenci mają za zadanie napisać programy zadane przez prowadzącego.
Zakres tematyczny pokrywa się z materiałem przedstawionym w niniejszej instrukcji. Zalecane jest, aby studenci
przed laboratorium przećwiczyli we własnym zakresie zaprezentowaną część materiału. Przed rozpoczęciem
laboratorium przewidziane jest sprawdzenie wiedzy i umiejętności5 studentów z następujących zagadnień:
1. wyprowadzanie danych numerycznych, tekstowych i znakowych na ekran,
2. odpowiednie formatowanie wyprowadzanych danych,
3. używanie znaków specjalnych podczas wyprowadzania danych,
4. wprowadzanie danych numerycznych, tekstowych i znakowych z klawiatury,
5. przekazywanie parametrów do programu z linii poleceń (*).
5
czyli tzw. wejściówka, której niezaliczenie powoduje niezaliczenie całego ćwiczenia laboratoryjnego
LITERATURA 10
Literatura
[1] Hejlsberg A., Wiltamuth S., Golde P.; Microsoft C# Language Specification; Addison-Wesley; 2004.
[2] http://msdn.microsoft.com/en-us/vcsharp/aa336809.aspx
[3] Liberty J. (Tłumaczenie: Walczak T.); C# Programowanie; Helion; 2005.
[4] Lis M.; C# Praktyczny kurs; Helion; 2007.
[5] Dusiński D; Kurs C# (ver 2.0);http://www.toya.net.pl/~daniel_d/csharp/index.html
[6] http://www.google.pl/


Wyszukiwarka

Podobne podstrony:
operacje wejscia wyjscia 13
operacje wejscia wyjscia 7
operacje wejscia wyjscia 8
07 Strumienie, operacje wejścia wyjścia
operacje wejscia wyjscia 10
operacje wejscia wyjscia 3
operacje wejscia wyjscia 6
operacje wejscia wyjscia 1
operacje wejscia wyjscia 9
operacje wejscia wyjscia 0
operacje wejscia wyjscia 5
operacje wejscia wyjscia 2
operacje wejscia wyjscia 12
operacje wejscia wyjscia 11
wejscie wyjscie
Porty wejścia wyjścia

więcej podobnych podstron