You are on page 1of 188

Micha Wodarczyk

Wprowadzenie do programowania
ITA-104
Wersja 1
Warszawa, Wrzesie 2009

Micha Wodarczyk
ITA-104 Wprowadzenie do programowania
Strona i-2
2009 Micha Wodarczyk. Autor udziela prawa do bezpatnego kopiowania
i dystrybuowania wrd pracownikw uczelni oraz studentw objtych
programem ITAcademy. Wszelkie informacje dotyczce programu mona
uzyska: pledu@microsoft.com.

Wszystkie inne nazwy firm i producentw wymienione w niniejszym
dokumencie mog by znakami towarowymi zarejestrowanymi przez ich
wacicieli.

Inne produkty i nazwy firm uywane w treci mog by nazwami
zastrzeonymi przez ich wacicieli.


Micha Wodarczyk
ITA-104 Wprowadzenie do programowania
Strona i-3
Wprowadzenie
Informacje o kursie
Opis kursu
Kurs przeznaczony jest do prowadzenia przedmiotu Wprowadzenie do
programowania na uczelniach wyszych. Skupia si na nauce podstaw
programowania w jzyku C# w rodowisku programistycznym Visual Studio
2008.
Cel kursu
Celem kursu jest dostarczenie studentom podstawowej wiedzy i
umiejtnoci do tworzenia aplikacji w jzyku C#.
Zakres tematyczny kursu
Opis moduw
W Tab. 1 przedstawiony zosta opis moduw, zawierajcy podzia na
zajcia. Kade zajcie jest zaplanowane na 90 minut. Wykadowca moe
dostosowa harmonogram do swoich potrzeb.
Tab. 1 Zakres tematyczny moduw
Numer modu
Tytu
Opis
Modu 1
Wprowadzenie
W tym module zostan zaprezentowane informacje
podstawowe dotyczce algorytmw, platformy .NET
oraz rodowiska Visual Studio.
Modu 2
Uycie zmiennych
W tym module dowiesz si co to s zmienne, jak je
definiujemy w jzyku C# oraz jak nadajemy im warto.
Poznasz rwnie podstawowe typy jzyka C#. Nauczysz
si pobiera dane od uytkownika. Dowiesz si co to s
wyraenia oraz poznasz operatory przy pomocy ktrych
je konstruujemy.
Modu 3
Instrukcja wyboru
if...else. Obsuga
wyjtkw
W tym module zostan zaprezentowane informacje
dotyczce instrukcji wyboru if...else. Dodatkowo
zostanie przedstawiony problem wyjtkw
(predefiniowane wyjtki, przechwytywanie i zgaszanie
wyjtku)
Modu 4
Instrukcje iteracji -
ptle
W tym module zostan zaprezentowane informacje
dotyczce instrukcji iteracyjnych: while, for oraz
do{..}while.
Modu 5
Pozostae instrukcje
sterujce
W tym module poznasz instrukcj switch. Dowiesz si
jak j definiujemy w jzyku C#. Zobaczysz rwnie jak
korzysta z instrukcji goto. Nauczysz si uywa
instrukcji break oraz continue.
Modu 6
Tablice
W tym module poznasz struktur danych o nazwie
tablica. Dowiesz si jak j definiujemy i korzystamy z niej
w jzyku C#. Dodatkowo poznasz ptla foreach.
Modu 7
Operacje na tablicach
W tym module zostan przedstawione nastpujce
operacje na tablicach: ustawianie wartoci elementw
tablicy (po utworzeniu tablicy), kopiowanie wartoci
elementw jednej tablicy do drugiej tablicy, odwracanie
tablicy, ustawianie elementw tablicy w odpowiedniej
kolejnoci sortowanie oraz sprawdzanie czy tablica
zawiera element o danej wartoci.
Micha Wodarczyk
ITA-104 Wprowadzenie do programowania
Strona i-4

Modu 9
Funkcje - wstp
W tym module zostan zaprezentowane moliwoci
definiowania i wykorzystywania metod w aplikacji.
Przedstawiono moliwoci przekazywania zmiennych do
i z metody oraz mechanizm obsugi wyjtkw w
przypadku zgoszenia wyjtku wewntrz metody.
Modu 10
Przesyanie
argumentw do
metody
W tym module zostan zaprezentowane informacje
dotyczce wywoywania metody z parametrami,
wybierania odpowiedniego sposobu przesyania
argumentw, przeciania metody oraz pobierania
argumentw z linii wywoania programu.
Modu 11
Metody - algorytmy
rekurencyjne i
biblioteka metod
W tym module zostanie przedstawione na przykadach
pojcie rekurencji.
Modu 12
Struktury
W tym module zostanie przedstawiony typ strukturalny
w jzyku C# oraz metody jego wykorzystania do
implementacji kolejek typu FIFO i LIFO. Omwione
zostanie te implementacja tych struktur w bibliotece
.NET Framework.
Modu 13
Rekurencyjne struktury
danych
W tym module zostanie przedstawiony typ referencyjny
w jzyku C# oraz zostanie zaprezentowane jego
wykorzystanie do implementacji rekurencyjnych
struktur danych takich jak lista czy drzewo binarne.
Pokazana zostanie te implementacja tych struktur w
bibliotece .NET Framework.
Modu 14
Dostp do plikw
W tym module zostan zaprezentowane moliwoci
wykorzystania strumieni w jzyku C# oraz dokonywania
operacji na strukturze systemu plikw.

ITA-104 Wprowadzenie do programowania
Micha Wodarczyk
Modu 1
Wersja 2
Wprowadzenie
Spis treci
Wprowadzenie ..................................................................................................................................... 1
Informacje o module ............................................................................................................................ 2
Przygotowanie teoretyczne ................................................................................................................. 3
Przykadowy problem .................................................................................................................. 3
Podstawy teoretyczne.................................................................................................................. 3
Przykadowe rozwizanie ........................................................................................................... 14
Laboratorium podstawowe ................................................................................................................ 18
Problem 1 (czas realizacji 15 minut) .......................................................................................... 18
Problem 2 (czas realizacji 30 minut) .......................................................................................... 19

Micha Wodarczyk Modu 01
ITA-104 Wprowadzenie do programowania Wprowadzenie
Strona 2/19
Informacje o module
Opis moduu
W tym module zostan zaprezentowane informacje podstawowe dotyczce
algorytmw, platformy .NET oraz rodowiska Visual Studio.
Cel moduu
Celem moduu jest wprowadzenia do Platformy .NET oraz rodowiska Visual
Studio oraz przedstawienia podstawowych poj z algorytmiki.
Uzyskane kompetencje
Po zrealizowaniu moduu bdziesz:
zna pojcia takie jak: algorytm, program komputerowy, kompilator,
interpreter, schemat blokowy
wiedzia co to jest Platforma .NET
umia korzysta ze rodowiska Visual Studio
Wymagania wstpne
Przed przystpieniem do pracy z tym moduem powiniene:
umie obsugiwa komputer
zna platform Windows jako uytkownik
potrafi korzysta z dowolnego edytora tekstu
Mapa zalenoci moduu


Rys. 1 Mapa zalenoci moduu

Micha Wodarczyk Modu 01
ITA-104 Wprowadzenie do programowania Wprowadzenie
Strona 3/19
Przygotowanie teoretyczne
Przykadowy problem
Przed przystpieniem do tworzenia wasnego programu, po pierwsze musimy mie pomys - wizj,
co chcemy, aby program dla nas lub za nas robi. Nastpnie t wizj musimy zamieni na kolejne
czynnoci, ktre prowadz do realizacji naszego pomysu. W ten sposb powstaje algorytm. Czsto
zwaszcza przy mniejszych programach sposb realizacji programu pozostaje w gowie osoby
tworzcej lub jest tworzony na bieco w czasie pisania programu. Moe to doprowadzi do
licznych bdw, a co za tym idzie zwikszeniu kosztw stworzenia programu lub jego wadliwego
dziaania. Dobrze jest wic zapisa nasz sposb realizacji w bardziej lub mniej formalny sposb.
Jednym ze sposobw przedstawienia algorytmw w sposb graficzny jest schemat blokowy.
Podczas analizy i projektowania algorytmu naley zwrci uwag na sposb organizacji informacji w
komputerze, czyli jakich struktur danych bdziemy uywali. Ma to ogromny wpyw na nasz
algorytm.
Po opracowaniu algorytmu zapisujemy go w jakim jzyku programowania. Nastpnie tumaczymy
nasz program na cig zer i jedynek, czyli co co moe by uruchomione i wykonane przez komputer.
Tworzymy program wykonywalny.
Jak pisa program bdziemy poznawa na przykadzie jzyka C#. Jzyk C# jest jzykiem
zorientowanym obiektowo, z siln kontrol typw, kompilowanym do kodu zarzdzanego -
tworzymy aplikacje uruchamiane na czym co si nazywa .NET Framework. .NET Framework
stanowi cz skadow pewnej idei firmy Microsoft na temat tworzenia oprogramowania, czyli
Platformy .NET.
Podstawy teoretyczne
Wprowadzenie do algorytmiki
Sowo algorytm pochodzi od przydomku al-Chwarizmi arabskiego matematyka i astronoma
Muhammada ibn Musa yjcego w IX wieku.
Algorytm krtko moemy powiedzie, e oznacza przepis. W yciu codziennym spotkamy si z
wieloma przykadami algorytmw. S to np. wszystkie instrukcje obsugi telewizora, pralki, aparatu
fotograficznego itp., opis czynnoci przy wymianie oleju, zmianie arwki w samochodzie, wymianie
bezpiecznika... Chyba najczciej podawanym jako przykad zbioru algorytmw w yciu codziennym
jest ksika kucharska. Sprbujmy zapisa jaki prosty algorytm, np. przygotowanie herbaty w
postaci listy krokw.
1. Nalej wod do czajnika
2. Postaw czajnik na gaz
3. Wcz gaz
4. Zagotuj wod
5. Wrzu saszetk do szklanki
6. Zalej herbat
7. Posd do smaku
8. Wypij herbat
Przy analizie powyszego algorytmu nasuwaj si jednak pytania. Ile wody mam nala, co mam
zrobi, gdy mam czajnik elektryczny lub, co oznacza posd do smaku. Zapewne kady z nas
zetkn si z jak instrukcj, ktra bya niejednoznaczna, a wrcz niezrozumiaa. Dzieje si tak,
gdy zadania i problemy najczciej formuujemy w jzyku naturalnym, ale jzyk naturalny nie jest
jednoznaczny i precyzyjny.
Sprecyzujmy pojcie algorytmu cilej.
Micha Wodarczyk Modu 01
ITA-104 Wprowadzenie do programowania Wprowadzenie
Strona 4/19
Algorytm - jest to koczony i uporzdkowany zbir jasno zdefiniowanych czynnoci, ktry prowadzi
do rozwizania jakiego problemu w ograniczonej liczbie krokw. Nauk zajmujc si badaniem
algorytmw nazywamy algorytmik.
Z powyszej definicji moemy wyprowadzi nastpujce waciwoci algorytmu:
skoczono - rozwizuje problem w ograniczonej liczbie krokw, musi mie swj koniec
okrelono - zarwno kolejno wykonywania poszczeglnych krokw, jak i zbir
dostpnych instrukcji oraz ich znaczenie powinny by cile zdefiniowane nie zostawiajc
miejsca na dowolno interpretacji
Przy opisie algorytmu naley poda warunki pocztkowe - dane wejciowe dla naszego algorytmu
oraz warunki kocowe - czyli to, co chcemy osign. W przypadku przepisw kulinarnych
warunkami pocztkowymi s potrzebne produkty oraz urzdzenia konieczne do wykonania
przepisu, warunkiem kocowym uzyskanie danej potrawy. Podanie zbioru waciwoci
(warunkw) pocztkowych oraz zabioru warunkw (waciwoci) kocowych nazywamy
specyfikacj algorytmu. Majc okrelone warunki pocztkowe oraz warunki kocowe, algorytm
moemy zdefiniowa jako skoczony cig krokw, przeksztacajcy stan pocztkowy (dane
wejciowe) w stan kocowy (dane wyjciowe). W powyszym opisie pojawia si pojcie dana. Przez
dane bdziemy okrela to, co przetwarza (na czym pracuje) algorytm i co moemy otrzyma po
skoczeniu dziaania algorytmu.
Algorytm oczywicie moemy oceni. Oceniajc algorytm bierzemy pod uwag nastpujce jego
waciwoci:
poprawno - czy algorytm dziaa zgodnie z naszymi oczekiwaniami. Przy ocenie poprawnoci
moemy wyrni:
Algorytm cakowicie poprawny - dla wszystkich danych speniajcych warunek
pocztkowy, algorytm zatrzymuje si i daje wyniki speniajce warunek kocowy
Algorytm czciowo poprawny - dla wszystkich danych speniajcych warunek
pocztkowy, jeeli algorytm zatrzyma si, to uzyskane wyniki speniaj warunek kocowy
efektywno - koszt algorytmu. W przypadku algorytmw implementowanych na
komputerze do porwnania efektywnoci algorytmu wprowadzono pojcie zoonoci
obliczeniowej, ktr definiujemy jako ilo zasobw wymaganych przez dany algorytm.
Gwne zasoby to:
pami - ilo miejsca potrzebna dla danych
czas - wbrew nazwie nie okrelmy to jako o ilo czasu mierzona w sekundach (lub innych
jednostkach czasu) od rozpoczcia wykonywania algorytmu do jego zakoczenia, gdy
ocena w duym stopniu zaleaaby od komputera na ktrym zaimplementowany algorytm
zosta uruchomiony. Zamiast tego stosujemy liczb operacji (instrukcji) podstawowych
wykonanych w czasie realizacji algorytmu.
oglno - czy algorytm odnosi si do konkretnego, szczeglnego przypadku (bardzo
ograniczone dane wejciowe) lub odnosi si do pewnej klasy zada
czytelno - czy algorytm jest zrozumiay
prostota - czy algorytm jest krtki (prosty), stopie skomplikowania
dugo kodu - atwo implementacji algorytmu w danym jzyku programowania
Podsumowujc moemy powiedzie, e dobry algorytm to taki, ktry jest prosty, atwy do
zaimplementowania, atwo go zrozumie, liczy szybko, nie wymaga duo miejsca w pamici i
zawsze daje poprawne wyniki.
Sam algorytm moemy przedstawi na kilka sposobw: w postaci sownego opisu, listy krokw,
drzewa decyzyjnego, schematu blokowego.
Micha Wodarczyk Modu 01
ITA-104 Wprowadzenie do programowania Wprowadzenie
Strona 5/19
Schemat blokowy
Schemat blokowy - diagram, graficzny sposb przedstawienia dziaania algorytmu. Skada si z
figur, zwanych skrzynkami lub blokami, ktre poczone s odcinkami, ktre nazywamy ciekami
sterujcymi.
W schemacie blokowym stosujemy nastpujce symbole graficzne:


cieka sterujca. Przy pomocy strzaki okrelamy
kierunek przepywu danych lub kolejno wykonywania
dziaa


Skrzynka oznaczajca wejcie (pocztek) algorytmu.
Posiada tylko jedn ciek wyjciow. Schemat blokowy
moe mie tylko pojedynczy blok oznaczajcy pocztek
algorytmu.


Skrzynka oznaczajca wyjcie (koniec) algorytmu.
Posiada tylko jedn ciek wejciow. Schemat blokowy
moe mie dowoln ilo blokw oznaczajcych koniec
algorytmu.


Blok wprowadzanie lub wyprowadzania danych. Posiada
jedno wejcie i jedno wyjcie.


Skrzynka operacji. Oznacza wykonanie instrukcji
elementarnej (-ych), w efekcie ktrej zmieni si
wartoci, posta lub miejsce zapisu danych. Posiada
jedno wejcie i jedno wyjcie.


Skrzynka decyzyjna - przedstawia wybr jednego z
dwch wariantw wykonywania programu na podstawie
sprawdzenia warunku wpisanego do wntrza bloku.
Posiada jedno wejcie i dwa wyjcie.


Skrzynka wywoania podprogramu - cz naszego
algorytmu, ktra stanowi odrbn cao i jest
zdefiniowana poza biecym schematem blokowym..
Posiada jedno wejcie i jedno wyjcie.


cznik wewntrzny (stronicowy) - suy do poczenia
czci schematu blokowego znajdujcych si na tej
samej stronie. Powizane ze sob czniki oznaczone s
tym samym napisem lub numerem.


cznik zewntrzny (midzystronicowy)
- suy do poczenia czci schematu blokowego
znajdujcych si na rnych stronach.


Skrzynka komentarza - pozwala wprowadzi opis
wyjaniajcy poszczeglne czci schematu, co uatwia
zrozumienie go czytajcemu
Struktury danych
Struktura danych to sposb organizacji danych w komputerze. Okrela ona relacje midzy danymi i
zbir dostpnych operacji oraz waciwoci tych operacji. Wybr odpowiedniej struktury danych
ma ogromny wpyw na efektywno algorytmu. Poszczeglne typy struktur danych zostan
omwione dokadniej w dalszej czci kursu, tutaj tylko je wymienimy:
Start
Stop
Micha Wodarczyk Modu 01
ITA-104 Wprowadzenie do programowania Wprowadzenie
Strona 6/19
tablica
rekord
lista
stos
kolejka
drzewo
graf (niestety poza zakresem tego kursu)
Program komputerowy
Algorytm piszemy (rysujemy) po to, aby mc utworzy program komputerowy. Tworzc program,
zamieniamy wic pojcia naszego jzyka (tym ktrym mwimy) lub symbole graficzne schematu
blokowego na instrukcje zrozumiane przez komputer. Moemy powiedzie, e program
komputerowy jest to algorytm zapisany w "jzyku komputera". Komputery niestety przetwarzaj
tylko cigi zer i jedynek. Kada operacja, instrukcja jest zakodowana w postaci pewnej liczby
dwjkowej. Ludzie nie s przystosowani do pracy z liczbami, zwaszcza dwjkowymi. Wprowadzono
wic pewne symbole, ktre zastpoway kody poszczeglnych instrukcji i utworzono programy
ktre zamieniay symbole na odpowiadajce im kody instrukcji. Jzyk, ktrego symbole
odpowiadaj dokadnie instrukcj procesora nazywamy Asemblerem. Wraz z rozwojem
informatyki, powstao zapotrzebowanie na coraz bardziej skomplikowane i zawansowane
oprogramowanie. Aby uatwi tworzenie bardziej skomplikowanego oprogramowania, zaczto
tworzy pewne symbole, ktre uatwiay tworzenie oprogramowanie, ale nie miay bezporedniego
odwzorowania na instrukcje procesora. Program tumaczcy (zmieniajcy symbole na odpowiednie
kody instrukcji), zwany translatorem, musi potrafi zamieni te "skomplikowane" symbole na cig
instrukcji danego procesora. Tak powstay jzyki programowania wysokiego poziomu. Zbir
symboli, ktre translator potrafi rozpozna i zamieni na kody instrukcji danego procesora
nazywamy sowami kluczowymi. Sowa kluczowe zostan dokadniej omwione w nastpnym
rozdziale.
Program komputerowy jest to cig instrukcji, ktre maj by wykonywane przez komputer. Z
rozwaa powyszych wynika, e mog by dwie postacie zapisu tych instrukcji. Pierwszy sposb to
bezporedni zapis w kodzie dwjkowym kodw instrukcji danego procesora. Posta tak nazywamy
programem wykonywalnym. Posta wykonywalna jest przechowywana najczciej w plikach z
rozszerzeniem exe lub dll. Drugi sposb to zapis instrukcji przeznaczonych do wykonania przez
komputer w postaci bardziej czytelnej dla czowieka. Posta t nazywamy postaci rdow i do jej
utworzenia uywamy tzw. jzykw wysokiego poziomu. Posta rdowa jest przechowywana w
plikach testowych, z rozszerzeniem zalenym od zastosowanego jzyka programowania wysokiego
poziomu. I tak programy napisane w jzyku C# posiadaj rozszerzenie cs, w jzyku C++ cpp oraz h,
w jzyku Visual Basic vb itd.
Proces zamiany postaci rdowej na posta wykonywaln nazywamy translacj. Translacja
wykonywana jest przez program, jak ju wczeniej wspominano, zwanym translatorem.
Translator moe przetumaczy fragment kodu lub nawet pojedyncz instrukcj i przekaza
przetumaczony kod od razu do wykonania przez komputer. Tak dziaajcy translator nazywamy
interpreterem. Proces tumaczenia za interpretacj kodu. Na zasadzie interpretacji kodu dziaaj
wszystkie jzyki skryptowe (PHP, JavaScript, VBScript).
Innym sposobem dziaania jest najpierw przetumaczenie caego programu (posta rdowa) do
postaci maszynowej. Dopiero gdy mamy przetumaczony cay program, moe zosta on wykonany
na danej maszynie. Translatory dziaajce w ten sposb nazywamy kompilatorami, proces translacji
natomiast kompilacj. Programy napisane w jzykach programowania takich jak Pascal, C/C++,
Fortran s najczciej kompilowane. Sam proces kompilacji moemy podzieli na kilka etapw:
Micha Wodarczyk Modu 01
ITA-104 Wprowadzenie do programowania Wprowadzenie
Strona 7/19
prekompilacja - polega na stworzeniu ostatecznego tekstu rdowego programu, usunicie
formatowania tekstu (spacje), opcjonalne usunicie komentarzy, rozwinicie dyrektyw
preprocesora (rne operacje na tekcie programu - wstawianie, usuwanie, zamiana tekstu)
kompilacja - przetworzenie tekstu rdowego w kod maszynowy. Czsto tekst rdowy
przetwarzany jest najpierw do kodu asemblera (kompilacja), nastpnie kod asemblera jest
optymalizowany (optymalizacja), po czym zoptymalizowany kod asemblera zamieniany jest
na kod maszynowy (asemblacja).
konsolidacja (linkowanie) - czy wybrane pliki obiektowe (plik powstay po kompilacji
pojedynczego pliku rdowego) i biblioteki statyczne w program wykonywalny.
Uaga: Czsto w praktyce kompilator i linker stanowi oddzielne programy.
Interpretacja kodu jest wolniejsza ni uruchamianie skompilowanego kodu, poniewa interpreter
musi przeanalizowa oraz przetumaczy kad instrukcj i dopiero nastpnie wykona akcj, a w
przypadku kodu skompilowanego, komputer jedynie wykonuje ju przetumaczone instrukcje.
Wykonanie powtrnie tego samego fragmentu kodu przez interpreter wymaga powtrnej jego
analizy.
Sam jednak cykl edycja (modyfikacja postaci rdowej) - interpretacja (uruchomienie) moe czsto
by znacznie krtszy ni cykl edycja - kompilacja-uruchomienie.
Platforma .NET
Platforma .NET jest to zbir technologii i pewnych usug, ktre uatwi programicie tworzenie
aplikacji, ze zwrceniem szczeglnej uwagi na Internet i technologie oraz standardy z nim zwizane
(XML, HTML, SOAP...). Tworzenie aplikacji sprbujmy porwna do budowy domu i przy okazji
omwi poszczeglne komponenty platformy .NET.
NET Framework
Gdy budujemy dom musimy stosowa si do praw fizyki i przestrzega prawa
budowlanego. Stawiamy dom w okrelonym rodowisku przyrodniczym i prawnym.
rodowisko to w pewien sposb nas ogranicza. Ograniczenia te jednak powoduj, e nasz
dom jest bezpieczny zarwno dla uytkownikw jak i rodowiska, funkcjonalny i nie
koliduje z otoczeniem i innymi domami. Podstaw, tym rodowiskiem, do budowy i w
ktrym bdziemy uruchamiali nasze programy jest co co si nazywa .NET Framework..
Jeeli chcemy uruchomi nasz program napisany w jzyku C#, musimy na danym
komputerze mie zainstalowane rodowisko w ktrym bdzie on wykonywany, czyli mie
.NET Framework. .NET Framework ver. 2.0 obsuguje nastpujce systemy: Windows
2000, Windows 98, Windows ME, Windows Server 2003, Windows XP. Dokadny opis
obsugiwanych systemw wraz z wersjami mona znale w MSDN pod tematem "System
Requirements for Version 2.0". Istniej rwnie implementacje .NET Framework na inny
systemy (nie "Windowsowe"). Moemy wymieni choby projekt Rotor, zawierajcy
implementacj .NET Framework na FreeBSD, czy projekt MONO implementacja
rodowiska na systemy Linux-owe. .NET Framework zawiera dwa komponenty:
rodowisko uruchomieniowe oraz bibliotek klas. rodowisko uruchomieniowe (common
language runtime - CLR) zarzdza wykonaniem naszego kodu i dostarcza pewnych
serwisw, ktre uatwiaj programicie tworzenie oprogramowania. Kod uruchamiany
pod kontrol CLR-a nazywamy kodem zarzdzanym (managed code). Kod zarzdzany nie
wywouje funkcji sytemu operacyjnego bezporedni, ale za porednictwem rodowiska
uruchomieniowego. Prcz roli poredniczcej CLR rwnie dostarcza szereg serwisw np.:
automatyczne zwalnianie pamici (Garbage collector - GC), zarzdzanie wykonaniem kodu
(Code manager), zarzdzanie wyjtkami (Exception manager), sprawdzanie typw (Type
checker), zarzdzanie bezpieczestwem kodu (Security engine). Gdy rozpoczynamy
budow domu, na dziace mamy materiay, z ktrych moemy wybudowa dom, np.
Micha Wodarczyk Modu 01
ITA-104 Wprowadzenie do programowania Wprowadzenie
Strona 8/19
piasek, kamienie, drzewo. Podobnie z .NET Framework dostajemy bibliotek klas, z tym e
bibliotek klas mona bardziej porwna jakby na dziace byy gotowe elementy
(pfabrykaty ) do budowy domy, a zadaniem programisty jest to tylko je poskada,
niczym dziecice klocki.
Serwery (The .NET Enterprise Servers)
Wyposaajc nasz dom, musi kupi szafy, pralk, lodwk, kuchenk itd. Oczywicie
moemy sprbowa te rzeczy wykona samodzielnie. Koszt jednak wykonania (czas i
materiay) moe znacznie przekroczy cen zakupu. Jako i zgodno ze standardami
prawdopodobnie bdzie te gorsza. Podobnie jest z oprogramowaniem. Moemy napisa
wasny serwer bazy danych lub moemy uy gotowego serwera, zwaszcza e istniej
wersje darmowe (MS SQL Express, MySQL...). Firma Microsoft dostarcza szereg rnych
serwerw: Microsoft SQL Server, Microsoft BizTalk Server, Microsoft Exchange Server,
Microsoft SharePoint Portal Server, Microsoft Internet Security and Acceleration Server,
itd.
Usugi XML Web Services
Chcc mie w peni funkcjonalny i nowoczesny trzeba podczy prd, wod, kanalizacj,
telefon, telewizj kablow, Internet. Moemy oczywicie wykopa studnie gbinow, czy
postawi wiatrak na podwrku, ale w wikszoci przypadkw taniej bdzie skorzysta z
usug odpowiedniego zakadu, wodocigowego czy energetycznego. Podobnie w
przypadku oprogramowania, zamiast przetwarza wszystko lokalnie, lepiej wysa
zlecenie do odpowiedniego serwisu i odebra wyniki w postaci dokumentu XML.
Przykadowym serwisem dostarczanym przez firm Microsoft jest Microsoft Passport.
Narzdzia programistyczne
Prcz wczeniej wymienionych komponentw, do tworzenia oprogramowania niezbdne
s narzdzia programistyczne: Microsoft dostarcza produkt o nazwie Microsoft .NET
Framework Software Development Kit. Zawiera on szereg narzdzi do kompilacji,
konfiguracji, wdraania, debugowania, zabezpieczania itp. Oczywicie rwnie mamy do
dyspozycji Visual Studio - zintegrowane rodowisko programistyczne. Microsoft
udostpnia za darmo, rwnie do celw komercyjnych, wersj Express.
Jak ju wspominano wczeniej, programista tworzy kod rdowy w jzyku programowania
wysokiego poziomu. W przypadku tworzenia oprogramowania uruchamianego pod kontrol .NET
Framework mamy do wyboru szereg rnych jzykw. Microsoft dostarcza Visual Basic, Visual C++,
Microsoft Visual C#, Visual J# i Microsoft JScript. Inni producenci dostarczaj kompilatorw dla
innych jzykw. Warto tu wspomnie choby o jzyku funkcyjnym Emerle, ktrego twrcami s
naukowcy Uniwersytetu Wrocawskiego. Jzyk w ktrym piszemy kod zarzdzany musi by zgodny
ze specyfikacj CLS (common language specification).
Po napisaniu kodu rdowego nastpuje proces kompilacji. Wynikiem tego procesu nie jest jednak
kod maszynowy danego procesora, tylko tak zwany kod jzyka poredniego (Microsoft
Intermediate Language). Dopiero gdy program bdzie uruchamiany, zostanie on skompilowany do
kodu maszynowego danej platformy przez kompilator bezporedni (just-in-time comiler) i
nastpnie wykonany. Zastosowanie jzyka poredniego daje przenono kodu na rne platformy.
Skompilowane obrazy kodu natywnego programw zarzdzanych przechowywane s w obszarze
zwanym native image cache. Do zarzdzania tym obszarem suy program Ngen. Wicej informacji
na temat programu Ngen mona znale w MSDN Library.
Jzyk poredni ma swj asembler. Do dezasemblacji kodu suy narzdzie o nazwie Ildasm. Na
temat Ildasm informacje mona znale rwnie w MSDN Library.
Micha Wodarczyk Modu 01
ITA-104 Wprowadzenie do programowania Wprowadzenie
Strona 9/19
Na platformie .NET uywa si nowej jednostki opakowania, zamiast pliku, zwanej podzespoem
(assembly). Cay kod zarzdzany musi znajdowa si w podzespole. Podzesp skada si z jednego
lub wikszej iloci plikw EXE lub DLL, ktre zawieraj kod IL oraz zasoby aplikacji. Powizanie
midzy plikami podzespou jest logiczne (system operacyjny nic nie wie o powizaniu midzy
plikami stanowicymi podzesp). Podzesp zawiera rwnie manifest, ktry zawiera metadane
opisujce podzesp. Manifest zawiera:
Nazw podzespou (moe to by nazwa silna)
Numer wersji podzespou (wsplny i taki sam dla wszystkich moduw, ktre stanowi
podzesp). Numer wersji skada si z czterech licz: numeru gwnego (major), numeru
drugorzdnego (minor), numeru kompilacji (build) oraz z numeru korekty (revision).
Informacje na temat kultury (lub jzyka) obsugiwanej przez podzesp
List wszystkich plikw, ktre stanowi podzesp, wraz z ich sumami kontrolnymi
List innych wymaganych do pracy podzespow wraz z numerami ich wersji.
Atrybuty dodane przez uytkownika.
Podzesp moe by prywatny dla danej aplikacji, pliki podzespou musz znajdowa si w katalogu
aplikacji lub jego podkatalogach i jest uywany tylko przez t aplikacj. .NET Framework umoliwia
wspuytkowanie podzespow. Podzespoy wspuytkowane naley umieszcza w globalnej
pamici podrcznej podzespow (global assembly cache - GAC) - pseudo podkatalog
WINDIR\assembly. Podzespoy wspuytkowane musz posiada siln nazw.
Do zarzdzania podzespoem, dodawania i usuwania plikw do/z podzespou, suy program AL.exe
(Assembly Generation Utility).
Struktura programu w C#
Program w jzyku C# rozpoczyna si od metody Main, czyli od miejsca w pliku rdowym:
static void Main(string[] args)
lub
static void Main()
Przed wyrazem static moe wystpi jeszcze sowo public.
Co to jest metoda i znaczenie sowa void zostanie wyjanione dokadnie w rozdziale smym
"Funkcje - wstp". Znaczenie sw static i public jest dokadnie omwione w kursie
"Programowanie obiektowe". Na obecnym etapie kursu, mona przyj e metoda jest to pewne
polecenie, ktre nie jest bezporednio instrukcj danego jzyka, ale kompilator potrafi zamieni to
na cig instrukcji.
Uwaga: Dopuszczalna jest rwnie nastpujca definicja metody Main, jako punktu startowego:
static int Main(string[] args)
lub
static int Main()
Poszczeglne instrukcje programu umieszcza si midzy dwoma nawiasami klamrowymi, tymi
bezporednio za metod Main: Nawiasy klamrowe okrelaj blok kodu - pewn logiczn cao.
static void Main(string[] args) {
instrukcja1;
instrukcja2;
...
instrukcjan;
}
Micha Wodarczyk Modu 01
ITA-104 Wprowadzenie do programowania Wprowadzenie
Strona 10/19
Instrukcje s wykonywane jedna po drugiej w kolejnoci ich zapisania. Program w jzyku C# koczy
si po wykonaniu instrukcji tu przed nawiasem klamrowym zamykajcym blok kodu metody Main.
Innym sposobem zakoczenia programu jest wywoanie instrukcji return wewntrz bloku kodu
metody Main. Sowo return dokadnie zostanie omwione w rozdziaach powiconym metodom
- rozdzia smy.
Metoda jest zawsze skadow kasy. Program w jzyku C# to tak naprawd kolekcja jednej lub
wicej klas (w C# nie ma funkcji globalnych). Metod Main dlatego zawsze trzeba umieci w bloku
kodu definiujcym klas.
Pojcie klasy zostanie przyblione w dalszej czci kursu, a dokadnie omwione w kursie
"Programowanie obiektowe".
class Program {
static void Main(string[] args)
{
}
}
Nazwa Program, ktra w powyszym przykadzie stanowi nazw klasy, jest nieobowizkowa. Mona
j zastpi dowolnym inny identyfikatorem. Jakie s dopuszczalne identyfikatory zostanie dokadnie
omwione w nastpnym rozdziale. Powyszy kod pokazuje najprostszy program napisany w jzyku
C#. Program nic nie robi - jest pusty, poniewa blok kodu metody Main nie zawiera adnej
instrukcji.
Uwaga: Program w jzyku C# moe zawiera kilka klas, Kada z klas moe zawiera metod Main.
Punkt startowy programu jest okrelany przez nazw klasy przy pomocy opcji kompilatora /main.
W Visual Studio moemy ustawi to przy pomocy okna "Waciwoci projektu" (menu
Project/Nazwa Projektu Properties...), zakadka Application, lista rozwijana Startup object:.
Najczciej klasy umieszczane s w pewnych logicznych pudekach na nazwy, ktre okrelane s
jako przestrze nazw. Przestrze nazw definiuje si przy pomocy sowa namespace, po ktrym
umieszcza si nazw "pudeka" i blok kodu okrelajcy, co zawiera dana przestrze nazw.
namespace PierwszyProgram {
class Program {
static void Main(string[] args) {
}
}
}
Klasa w powyszym przykadzie ma teraz nazw:
PierwszyProgram.Program
czyli skada si z nazwy przestrzeni nazw, znaku kropki oraz nazwy "waciwej" klasy. Jest to nazwa
w peni kwalifikowana.
W programie mona stosowa nazwy skrcone - bez podawania nazwy przestrzeni nazw i znaku
kropki. Umoliwia si to przez pokazanie na samej grze pliku rdowego, ktre przestrzenie nazw
kompilator powinien przeszuka w celu odnalezienia danej nazwy. Uzyskujemy to przy pomocy
wyrazu using.
Linijka
using System;
oznacza, e jeeli kompilator nie rozpoznaje jakiej nazwy w biecym kontekcie, powinie
sprawdzi przestrze nazw System.
Micha Wodarczyk Modu 01
ITA-104 Wprowadzenie do programowania Wprowadzenie
Strona 11/19
Jeden podzesp moe zawiera kilka przestrzeni nazw. Przestrze nazw danej nazwie moe
wystpowa w kilku podzespoach.
Wewntrz metody Main umieszcza si cig instrukcji. Kad instrukcj koczy si znakiem rednika
- ;. Przy pisaniu programu w C#, w odrnieniu od takich jzykw jak Pascal czy Visual Basic, naley
zwraca uwag na wielko liter. Na przykad, jeeli zostanie uyta nazwa main zamiast Main,
kompilator zgosi bd, e nie odnalaz punku startowego programu.
Dla kompilatora nie ma znaczenia jak bdzie rozmieszczony kod - biae znaki (spacje, tabulatory,
znak przejcia do nowej linii) s ignorowane. Obowizuje jednak pewien styl formatowania kodu.
Kad instrukcj umieszcza si w oddzielnej linii. Instrukcje bdce w tym samy bloku kodu
powinny mi t sam odlego od lewego marginesu - to samo wcicie. Instrukcje w bloku kodu
zagniedonego powinny mie wiksze wcicie.
{
instrukcja_bloku_gwnego1
instrukcja_bloku_gwnego2
{
instrukcja_bloku_zagniedonego1
instrukcja_bloku_zagniedonego2
}
instrukcja_bloku_gwnego1
}
Visual Studio automatycznie formatuje wcicia. Otwarcie nowego bloku przez wstawienie znaku
nawiasu klamrowego otwierajcego i naciniciu klawisza ENTER powoduje automatyczne
zwikszenie lewego wcicia. Wstawienie w nowej linii znaku nawiasu klamrowego zamykajcego
powoduje automatycznie zmniejszenie lewego wcicia.
Visual Studio rwnie bardzo uatwia pisanie kodu dziki automatycznemu uzupenianiu nazw
(IntelliSense). W czasie pisanie Visual Studio podpowiada, jakie nazwy s dostpne wywietlajc
menu kontekstowe. Mona rwnie wymusi pojawienie si menu kontekstowego przez
nacinicie kombinacji klawiszy CTRL+SPACJA.
Spjne stosowanie wci moe znacznie uprzyjemni czytanie i zrozumienie programu. Innym
czynnikiem wpywajcym na czytelno programu s komentarze. Komentarze s tekstami zupenie
ignorowanymi przez kompilator i mog zwiera dowolny cig znakw. Zawieraj najczciej uwagi
na temat szczegw dziaania programu.
W jzyku C# wyrniamy dwa rodzaje komentarzy:
komentarz rozpoczynajcy si od dwch ukonikw // i rozcigajcy si do koca wiersza.
Komentarz ten mona umieci na pocztku wiersz lub za instrukcj:
...
//to jest komentarz
instrukacja; //komentarz po instrukcji
...
komentarz rozpoczynajcy si od znakw /*, a ktry koczy si znakami */. Komentarz ten
moe rozciga si przez wiele linijek. Komentarze tego typu nie mog by w sobie
zagniedone.
...
instrukacja;
/* tu si zaczyna komentarz
tu nadal trwa
tu si koczy*/
...
Micha Wodarczyk Modu 01
ITA-104 Wprowadzenie do programowania Wprowadzenie
Strona 12/19
W rodowisku programistyczny Visual Studio specjalne znaczenie maj trzy ukoniki ///.
Rozpoczynaj komentarz, w ktrym umieszczamy znaczki XML-owe. Znaczniki okrelaj cel
komentarza i na ich podstawie moe by wygenerowana dokumentacja. Visual Studio uywa ich
rwnie przy wywietlaniu podpowiedzi.
Wykonanie programu komputerowego polega czsto na wprowadzeniu danych, wykonaniu
poszczeglnych instrukcji programu oraz wyprowadzeniu uzyskanych wynikw. Do wyprowadzenia
uzyskanych wynikw najczciej suy ekran monitora, natomiast do wprowadzenia danych
klawiatura. Urzdzenia te czsto nazywane konsol.
Jzyk C#, podobnie jak wikszo jzykw nie posiada bezporednio instrukcji wsppracujcych z
konsol. W bibliotece mscorlib.dll, w przestrzeni nazw System, zawarta jest klasa Console, ktra
zawiera szereg metod sucych do wsppracy z konsol. Podzesp mscorlib jest domylnie
dodawany do kadego programu napisanego w jzyku C#.
Do wypisywania tekstu na ekranie suy metoda Write. Stosuje si j w nastpujcy sposb:
System.Console.Write("Tekst do wypisania");
czyli trzeba poda pen ciek gdzie znajduje si metoda, nastpnie otworzy nawias okrgy i
wewntrz znakw cudzysw poda tekst do wypisania na ekranie. Nie wolno zapomnie o
zamkniciu nawiasu okrgego i postawieniu rednika. Stosujc dyrektyw using, mona pozby
si nazwy przestrzeni nazw, czyli skorzysta z nazwy skrconej. Nazwy klasy nie mona pomin.
using System
...
Console.Write("Tekst do wypisania");
...
Inn metod klasy Console wyprowadzajc tekst na ekran jest WriteLine. Metoda WriteLine
po wypisaniu tekstu na ekranie dodatkowo powoduje przejcie do nowej linii.
Do wczytania znakw z klawiatury su odpowiednio metody klasy Console: Read i ReadLine.
Metody te zatrzymuj dziaanie programu dopki uytkownik nie nacinie klawisza <Enter>.
Dokadniej operacje wejcia - wyjcia zostan omwione w nastpnym rozdziale.
Uwaga: Rwnie do wczytania znaku suy metoda klasy Console.ReadKey. W tym przypadku
program czeka tylko do mementu nacinicia dowolnego znaku - uytkownik nie musi naciska
klawisza <Enter>.
Jeeli nie chcemy, aby naciskany znak pojawi si na ekranie (wyczmy echo), metod t naley
wywoa w nastpujcy sposb:
Console.ReadKey(true);
Korzystanie z Visual Studio
W rodowisku Visual Studio nie mona pracowa na pojedynczym pliku rdowym. Trzeba
utworzy co, co si nazywa projektem. Projekt jest logicznym pojemnikiem na wszystkie elementy,
ktry su do budowy aplikacji. Fizycznie projekt jest reprezentowany przez plik XML z
rozszerzeniem csproj. Opisuje on pliki rdowe oraz inne elementy wchodzce w skad projektu,
ich waciwoci oraz waciwoci samego projektu, np. czy produktem finalnym jest plik
wykonywalny exe albo biblioteka dll.
Projekt jest osadzony w innym kontenerze, ktry nazywany rozwizaniem (solution). Rozwizanie
czy ze sob kilka projektw oraz zawiera pliki i metadane, ktre uatwiaj definiowanie
rozwizania jako spjnej caoci. Obecnie tworzone oprogramowanie nie mona zamkn w jednym
projekcie. Mona wymieni choby aplikacj w architekturze klient-serwer, czy choby aplikacja
skadajca si z pliku wykonywalnego oraz kilku bibliotek dll. Dziki rozwizaniu otrzymano atwy
sposb dostpu do wszystkich projektw, ktre s realizowane w trakcie budowy programu.
Micha Wodarczyk Modu 01
ITA-104 Wprowadzenie do programowania Wprowadzenie
Strona 13/19
Dostp ten jest moliwy z pojedynczej uruchomionej instancji Visual Studio. Plik reprezentujcy
rozwizanie ma rozszerzenie sln. Zawiera on informacje na temat projektw wchodzcych w skad
rozwizania, odwoanie do dodatkowych elementw niezwizanych z adnym projektem oraz
pewne ustawienia konfiguracyjne uywane przy budowaniu poszczeglnych typw projektu.
Drugim plikiem zwizanym z rozwizaniem jest plik z rozszerzeniem suo (Solution User Options).
Jest to plik ukryty i specyficzny dla konkretnego uytkownika. Zawiera on pewne ustawienia
dostosowujce rozwizanie do uytkownika. Rozwizanie jest czsto utosamiane z folderem, w
ktrym znajduj si pliki sln i suo oraz podkatalogi poszczeglnych projektw.
Gdy rozpoczyna si prace w Visual Studio nad nowym projektem musimy wybra szablon aplikacji.
Szablon aplikacji lub szablon projektu dostarcza kolekcj plikw koniecznych do rozpoczcia pracy
nad danym typem projektu wraz z szablonem kodu oraz odpowiedni struktur i ustawieniami
projektu.

Micha Wodarczyk Modu 01
ITA-104 Wprowadzenie do programowania Wprowadzenie
Strona 14/19
Przykadowe rozwizanie
Tworzenie schematw blokowych
Naszym zadaniem jest utworzenie schemat blokowego algorytmu, ktry sprawdza czy podana
liczba jest parzysta. Przykadowe rozwizanie jest podane na poniszym rysunku.

















Pierwszy program w C#
W demonstracji zostanie pokazany sposb kompilacji programu z linii polece:
1. Uruchom program Notatnik lub WordPad.
2. Otwrz plik Kurs\Demo\Modul1\Program1.cs, gdzie katalog Kurs jest katalogiem gdzie
zostay skopiowane pliki kursu.
3. Przeanalizuj kod programu.
4. Nacinij przycisk Start systemu Windows, wybierz Wszystkie Programy nastpnie Microsoft
Visual Studio 2005/Visual Studio Tools/Visual Studio 2005 Command Prompt.
Uruchomienie w ten sposb wiersza polece zapewnia odpowiednie ustawienie zmiennych
rodowiskowych, miedzy innymi cieki dostpu do kompilatora jzyka C# (csc.exe).
5. W wierszu polece zmie biecy katalog na: Kurs\Demo\Modul01
6. Skompiluj program nastpujcym poleceniem:
csc /out:Test.exe Program1.cs
7. Opcji kompilatora /out uywamy, gdy chcemy utworzy plik exe o innej nazwie ni plik
rdowy. Dokadny opis opcji kompilatora mona znale w MSDN Library pod tematem " C#
Compiler Options".
8. Uruchom program przez napisanie w wierszu polece: Test.exe
9. Omw dziaanie program z szczeglnym zwrceniem uwagi na metody Write oraz
WriteLine.
Start
Podaj warto
liczby a:
a - liczba cakowita
Czy a % 2 = = 0
% - reszta z dzielenia
= = - porwnanie
Tak Nie
Wypisz: "Podae
liczb nieparzyst"
Wypisz: "Podae
liczb parzyst"
Stop
Micha Wodarczyk Modu 01
ITA-104 Wprowadzenie do programowania Wprowadzenie
Strona 15/19
Korzystanie z Visual Studio
1. Uruchom Visual Studio. W tym celu nacinij przycisk Start systemu Windows, wybierz
Wszystkie Programy nastpnie Microsoft Visual Studio 2005/ Microsoft Visual Studio 2005.
2. Utwrz nowy projekt
a) Z menu File wybierz New/Project... lub W oknie Start Page wybierz Create: Project.
Okno Start Page zawiera rwnie szereg odsyaczy do najnowszych informacji zwizanych
z rodowiskiem Visual Studio jak i ca Platform .NET.
b) W oknie dialogowy New Project
Rys. 2 Okno dialogowe "New Project"
W drzewie Project types: rozwi ga Visual C# i wybierz element Windows.
W licie Templates: wybierz szablon Console Application.
W polu edycyjnym Name: podaj nazw projektu: Program1.
W polu edycyjnym Location: wybierz miejsce na dysku gdzie bdzie utworzony projekt
przy pomocy przycisku Browse...: Moje Dokumenty\Visual Studio 2005\Projects.
Zaznacz pole wyboru Create directory for solution. Zaznaczenie tego pola wyboru
powoduje, e zostanie utworzony katalog dla rozwizania, w ktrym zostan umieszczone
pliki rozwizania (sln i suo) oraz w ktrym zostanie utworzony katalog projektu. Gdy pole
jest niezaznaczone folder projektu jest rwnie katalogiem rozwizania. Mona utworzy
rwnie puste rozwizanie, bez projektu. W tym celu w drzewie Project types: rozwi
ga Other Projects Types i wybierz element Visual Studio Solutions, a nastpnie w licie
Templates: wybierz szablon Blank Solution.
W polu edycyjnym Solution Name: podaj nazw rozwizania: Demo2.
Nacinij przycisk OK.
3. Uruchom Eksplorator Windows i poka, jakie pliki i katalogi zostay utworzone w systemie
plikw po utworzeniu aplikacji.
a) Demo2 - katalog rozwizania
b) Demo2.sln - plik rozwizania
c) Demo2.suo - plik zawierajcy opcje skojarzone z rozwizaniem
d) Program1 - katalog projektu
e) Program1.csproj - plik projektu- Program.cs - plik zawierajcy kod programu
f) Properties - katalog zwierajcy plik AssemblyInfo.cs
g) AssemblyInfo.cs - plik sucy do ustawienia waciwoci podzespou
Micha Wodarczyk Modu 01
ITA-104 Wprowadzenie do programowania Wprowadzenie
Strona 16/19
h) bin i obj - katalogi wykorzystywane przez rodowisko w czasie procesu kompilacji.
Zawieraj rwnie skompilowany kod. W wikszoci przypadkw Visual Studio potrafi
automatycznie odtworzy ich zawarto, wic podczas archiwizacji kodu mona je
skasowa.
4. Zamknij okno programu Eksplorator Windows i przecz si do programu Visual Studio.
5. Opisz gwne okna rodowiska Visual Studio

Rys. 1.2 Graficzny interfejs rodowiska programistycznego Visual Studio.
a) Okno kodu (Code) - suy do pisania kodu rdowego. Edytor kodu dostarcza szereg
waciwoci uatwiajcych tworzenie kodu takich jak: kolorowanie kodu, - ukrywanie
blokw kodu (dyrektywa #region i #endregion), automatyczne uzupenianie i
generowanie kodu (Code Snippets), automatyczne przedefiniowanie kodu (Refactoring),
podpowiedzi, przegldanie metadanych jako kodu rdowego (metadata as source)
b) Solution Explorer - umoliwia przegldanie elementw wchodzcych w skad
poszczeglnych projektw jak i rozwizania. Daje rwnie moliwo zarzdzania
(usuwanie elementu, dodawanie elementu, tworzenie struktury) zarwno pojedynczym
projektem jak i caym rozwizaniem przy pomocy menu kontekstowego. Uatwia rwnie
poruszanie si po kodzie. Dwukrotne kliknicie na plik w Solution Explorer powoduje
pokazanie jego zawartoci w oknie edytora kodu.
c) Properties - okno pokazujce waciwoci wybranego aktualnie elementu. Zaznaczajc np.
element reprezentujcy rozwizanie lub projekt w oknie Solution Explorer, moemy
sprawdzi lokalizacj pliku rozwizania i projektu na dysku.
6. Poka jak mona ukrywa, pokazywa, zmienia pooenie okien. Dowolne okno mona
pokaza za pomoc odpowiedniej pozycji z menu View. Dotyczy to oczywicie rwnie
paskw narzdziowych.. Dowolne okno dokowalne (dockable) mona zadokowa
(przytwierdzi) do dowolnej krawdzi okna gwnego. Mona je rwnie poczy w grupy.
Gdy chcemy zmieni pozycj okna wystarczy je przecign za pasek tytuowy. W przypadku
gdy chcemy oddzieli okno od grupy, "apiemy" je za zakadk (tab). W Visual Studio
wprowadzono dodatkowe ikony, ktre pojawiaj si w momencie gdy zaczynamy przeciga
Code Solution Explorer
Properties
Micha Wodarczyk Modu 01
ITA-104 Wprowadzenie do programowania Wprowadzenie
Strona 17/19
okno i pokazuj gdzie naley umieci kursor myszy, aby zadokowa w danym miejscu
przecigane okno.
a) W celu zwikszenia obszaru roboczego moemy wczy automatyczne ukrywanie si
okien. Robimy to przy pomocy przycisku pineska - .
7. Wewntrz bloku metody Main napisz nastpujcy kod:
static void Main(string[] args) {
Console.WriteLine("Jzyk C# jest atwy");
Console.ReadLine();
}
8. Zbuduj program. Z menu Build wybierz odpowiedni pozycj. Build Solution, Rebuild
Solution, Build Program1, Rebuild Program1. Wybrani pozycji Build Solution i Rebuild
Solution powoduje, e bd kompilowane pliki wszystkich projektw nalecych do
rozwizania. Build Solution kompiluje tylko pliki i komponenty, ktre byy modyfikowane od
ostatniej budowy. Rebuild Solution kompiluje wszystkie pliki.
Analogicznie dziaaj pozycje Build Program1 i Rebuild Program1, z tym e dotycz tylko
pojedynczego projektu. Program1 jest nazw projektu, ktry ma by zbudowany. Jest to
projekt zaznaczony w oknie Solution Explorer. Budujc program moemy rwnie skorzysta
z paska narzdzi Build.
9. Zwr uwag, e w Visual Studio moemy tworzy dwie wersje programu wykonywalnego:
a) wersje Debug - wersja "rozwojowa", wspierajca prac krokow
b) wersja Release - wersja na sprzeda, zoptymalizowana.
10. Uruchom program ze rodowiska Visual Studio. Z menu Build wybierz odpowiedni pozycj
Start Debugging lub Start Without Debugging. Start Debugging - rozpoczyna prac
programu debugger- prac krokow, odpowiednio Start Without Debugging uruchamia tylko
program, bez programu debugger. Program moemy rwnie uruchomi w trybie pracy
krokowej przy pomocy przycisku ,ktry znajduje si na pasku narzdzi Standard.
11. Uruchom program w systemie Windows.
a) Uruchom program Eksplorator Windows.
b) Przejd do katalogu Moje Dokumenty\Visual Studio 2005\Projects\
Demo2\Program1\bin\Debug.
c) Uruchom program Program1.exe
d) Zamknij uruchomiony program i Eksplorator Windows.
12. W rodowisku Visual Studio poka, jak s pokazywane informacje na temat bdw
kompilacji.
a) W nastpujcej linijce kodu skasuj zamykajcy cudzysw.:
Console.WriteLine("Jzyk C# jest atwy");
b) Zauwa, e kod jest podkrelony czerwon falowan lini.
c) Poka okno Error List. Okno Error List zawiera bdy, ostrzeenia oraz komunikaty
tworzone przez edytor kodu jak i kompilator. Dwukrotne kliknicie na linijk z danym
bdem, powoduje otwarcie pliku i przeniesienie w miejsce gdzie jest prawdopodobne
rdo danego bdu.
d) Sprbuj zbudowa program.
Micha Wodarczyk Modu 01
ITA-104 Wprowadzenie do programowania Wprowadzenie
Strona 18/19
e) Poka okienko Output. Okno to wywietla rne informacje zwizane z rnymi cechami
zintegrowanego rodowiska programistycznego (IDE). Midzy innymi wywietla rwnie
komunikaty kompilatora.
f) Popraw bd w kodzie programu i zbuduj program.
13. Docz do biecego rozwizania nowy pusty projekt.
a) Z menu File wybierz Add/New Project...
b) W oknie dialogowym Add New Project, dla typu projektu Visual C#/Windows wybierz
szablon Empty project i nadaj mu nazw Program2. Nacinij przycisk OK.
14. Do nowego projektu docz istniejcy plik rdowy.
a) W oknie Solution Explorer zaznacz element reprezentujcy nowo utworzony projekt.
b) Z menu Project wybierz pozycj Add Existing Item
c) W oknie dialogowym Add Existing Item - Program2 przejd do katalogu
Kurs\Demo\Modul1, gdzie katalog Kurs jest katalogiem, do ktrego zostay skopiowane
pliki kursu. Wybierz plik Program1.cs. Naciskajc przycisk Add powodujemy skopiowanie
wybranego pliku do katalogu naszego projektu. Mona te utworzy tylko dowizanie do
pliku - Add As Link.
15. Ustaw projekt Program2 jako projekt startowy. Projekt startowy jest to projekt, ktry
domylnie jest uruchamiany. Jego nazwa jest napisana czcionk pogrubion.
a) W oknie Solution Explorer kliknij prawym klawiszem element reprezentujcy projekt
Program2.
b) Z menu kontekstowego wybierz Set as StartUp Project. Nastpnie buduj i uruchom
projekt Program2.
Laboratorium podstawowe
Problem 1 (czas realizacji 15 minut)
Utworzenie programu, ktry wypisuje na ekranie powitanie i czeka na reakcje uytkownika. Potem
wypisuje "Koniec" i znw czeka na reakcj uytkownika i nastpnie koczy dziaanie.
Zadanie Tok postpowania
1. Uruchom Visual
C# 2008 Express
Edition
Nacinij przycisk Start systemu Windows, wybierz Wszystkie Programy
nastpnie Microsoft Visual C# 2008 Express Edition.
2. Utwrz nowy
projekt w Visual C#
2008 Express
Edition
Z menu wybierz File -> New Project.
Z listy Visual Studio installed templates wybierz Console Application.
W polu Name wpisz Powitanie.
Kliknij OK.
Z menu wybierz File -> Powitanie.
W polu Location wybierz folder w ktrym bdzie zapisany projekt.
Zaznacz pole wyboru Create directory for solution.
W polu Solution Name wpisz Modul01.
Nacinij przycisk Save.
3. Do metody
Main dodaj
odpowiedni kod
Do metody Main dodaj kod wypisujcy Twoje imi i nazwisko i nastpnie
czekajcy na reakcj uytkownika.
Console.WriteLine("Witam Pana(i) imie nazwisko");
Console.ReadKey(true);
Do metody Main dodaj kod wypisujcy sowo Koniec i nastpnie
Micha Wodarczyk Modu 01
ITA-104 Wprowadzenie do programowania Wprowadzenie
Strona 19/19
czekajcy na reakcj uytkownika.
Console.Write("Koniec");
Console.ReadKey(true);
4. Skompiluj, a
nastpnie uruchom
program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu, z menu Debug wybierz Start Debugging.
Zamknij Visual C# 2008 Express Edition

Problem 2 (czas realizacji 30 minut)
Twoim zadaniem jest poprawianie bdw w istniejcym programie.
Zadanie Tok postpowania
1. Uruchom Visual
C# 2008 Express
Edition
Nacinij przycisk Start systemu Windows, wybierz Wszystkie Programy
nastpnie Microsoft Visual C# 2.008 Express Edition.
2. Otwrz
istniejce
rozwizanie
w Visual C# 2008
Express Edition
Z menu wybierz File -> Open Project.
Otwrz rozwizanie Kurs\Lab\Modul1\Start\Start.sln, gdzie Kurs jest
katalogiem, gdzie zostaa skopiowana zawarto kursu.
Otwrz plik Program.cs.
3. Korzystajc z
okna Error List lub
Output popraw
bdy w programie.
Sprbuj skompilowa program.
Na grze pliku zaimportuj przestrze nazw System.
using System;
Zmie nazw metody main na Main.
static void Main(string[] args)
Zamknij cudzysw.
Console.WriteLine("Zrobi wilk elektrowni, lecz by prd uzyska");
Otwrz cudzysw.
Console.WriteLine("Kopalnia z elektrowni cay prd zeraa,");
Na koniec linii dodaj rednik.
Console.WriteLine("Andrzej Waligrski");
Przed identyfikator ReadLine dodaj nazw klasy i znak kropki.
Console.ReadLine();
Na kocu pliku dodaj jeszcze jeden zamykajcy nawias klamrowy.
}
4. Skompiluj, a
nastpnie uruchom
program
Z menu Build wybierz Build Solution.
W celu uruchomienia programu, z menu Debug wybierz Start Debugging.

ITA-104 Wprowadzenie do programowania
Micha Wodarczyk
Modu 2
Wersja 2
Uycie zmiennych
Spis treci
Uycie zmiennych ................................................................................................................................. 1
Informacje o module ............................................................................................................................ 2
Przygotowanie teoretyczne ................................................................................................................. 3
Przykadowy problem .................................................................................................................. 3
Podstawy teoretyczne.................................................................................................................. 3
Przykadowe rozwizanie ........................................................................................................... 23
Laboratorium podstawowe ................................................................................................................ 25
Problem 1 (czas realizacji 5 minut) ............................................................................................ 25
Problem 2 (czas realizacji 10 minut) .......................................................................................... 25
Problem 3 (czas realizacji 10 minut) .......................................................................................... 26
Problem 4 (czas realizacji 10 minut) .......................................................................................... 27
Problem 5 (czas realizacji 10 minut) .......................................................................................... 28

Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 2/28
Informacje o module
Opis moduu
W tym module dowiesz si co to s zmienne, jak je definiujemy w jzyku C#
oraz jak nadajemy im warto. Poznasz rwnie podstawowe typy jzyka
C#. Nauczysz si pobiera dane od uytkownika. Dowiesz si co to s
wyraenia oraz poznasz operatory przy pomocy ktrych je konstruujemy.
Cel moduu
Celem moduu jest pokazanie informacje dotyczce definiowania
zmiennych oraz podstawowych operatorw w jzyku C#.
Uzyskane kompetencje
Po zrealizowaniu moduu bdziesz:
potrafi definiowa zmienne
zna podstawowe operatory w jzyku C#
Wymagania wstpne
Przed przystpieniem do pracy z tym moduem powiniene:
wiedzie, co to jest Platforma .NET
potrafi korzysta ze rodowiska Visual Studio
wiedzie co to jest projekt oraz rozwizanie
zna struktur programu w jzyku C#
Mapa zalenoci moduu
Zgodnie z map zalenoci przedstawion na rys. 1, przed przystpieniem
do realizacji tego moduu naley zapozna si z materiaem zawartym
w module Wstp.

Rys. 1 Mapa zalenoci moduu

Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 3/28
Przygotowanie teoretyczne
Przykadowy problem
Podczas definicji algorytmu byo wspomniane pojcie dane, czyli co co przetwarza, na czym
pracuje algorytm. Dane w przypadku programu komputerowego nazywamy zmiennymi. Zmienn w
pewnym uproszczeniu mona zdefiniowa jako pewien obszar pamici (cig bitw), do ktrego
mona si odwoa przy pomocy pewnej nazwy, nadanej temu obszarowi przez programist. Przy
pomocy nazwy zmiennej, lub krcej zmiennej, moemy "manipulowa" (zmienia, pobiera
warto) bitami obszaru pamici reprezentowanym przez zmienn. Przy tych "manipulacjach"
wykorzystujemy pewne instrukcje zwane operatorami.
Podstawy teoretyczne
Definiujc zmienn oprcz jej nazwy, czyli identyfikatora zmiennej, musimy poda jej typ . Typ
okrela:
liczb bajtw zajmowanych przez zmienn
sposb interpretacji bitw zmiennej
czyli mona powiedzie, e typ definiuje zbir wartoci, jakie moe przyjmowa zmienna. Typ
rwnie okrela zbir operacji, jakie moemy przeprowadza na zmiennej.
Wsplny system plikw (Common Type System - CTS) - okrela w jaki sposb rodowisko
uruchomieniowe (CLR) definiuje i uywa typy oraz jak nimi zarzdza. Dostarcza rwnie
zorientowany obiektowo model oraz definiuje reguy, ktre musz by stosowane we wszystkich
jzykach programowania, ktrych uywane s do tworzenia oprogramowania na platform .NET.
Reguy te pozwalaj czciom programu napisanych w rnych jzykach wsppracowa ze sob.
Mwic prociej, nasz program napisany w C#, moe uywa typw zdefiniowanych np. w
bibliotece napisanej w Visual Basic-u.
Wszystkie typy w jzyku C#, moemy podzieli na dwie rozczne kategorie:
Typy bezporednie nazywane te typami wartociowymi
Typy referencyjne
Obie kategorie typw zostan dokadnie omwione w dalszej czci rozdziau.
Uwaga: W jzyku C# wszystkie typy dziedzicz po klasie Object. Pojcie dziedziczenia jest
dokadnie omwione w kursie "Programowanie obiektowe".
Jzyk C# dostarcza pewien zbir typw wbudowanych. Typy te s reprezentowane przez
zarezerwowane wyrazy - sowa kluczowe. Kady z typw wbudowanych ma swj odpowiednik
(alians) w przestrzeni nazw System. Typy wbudowane moemy podzieli na nastpujce kategorie:
Typy bezporednie
typ logiczny: bool
typy numeryczne:
o typy cakowite: sbyte, byte, short, ushort, int, uint, long, ulong,
char
o typy rzeczywiste: float, double
o typ rzeczywisty o duej precyzji: decimal
Typy referencyjne:
object
napisy: string
Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 4/28
W poniszej tabeli zostay opisane wszystkie typy wbudowane. Zostao podane sowo kluczowe
identyfikujce typ, nazwa typu w przestrzeni nazw System, liczba bajtw zajmowanych przez
zmienne danego typu oraz przedzia dopuszczalnych wartoci.
Sowo
kluczowe
Alians
Liczba
bajt
w
Przyjmowane wartoci
bool Boolean 1 true lub false
sbyte SByte 1 od -128 do 127
byte Byte 1 od 0 do 255
short Int16 2 od -32768 do 32767
ushort UInt16 2 od 0 do 65535
int Int32 4 od -2147483648 do 2147483647
uint UInt32 4 od 0 do 4294967295
long Int64 8
od -9223372036854775808
do 9223372036854775807
ulong UInt64 8 od 0 do 18446744073709551615
char Char 2
od 0 do 65535
typ znakowy (Unicody)
float Single 4
1.5 10e45 do 3.4 10e38
pojedyncza precyzja (7 cyfr)
double Double 8
5.0 10e324 to 1.7 10e308
podwjna precyzja (15-16 cyfr)
decima
l
Decimal 12
1.0 10e28 to 7.9 10e28
(28-29 cyfr)
object Object - typ podstawowy dla wszystkich innych typw
string String - Napis - dowolny cig znakw

Wybr typu dla zmiennej jest determinowany przez jej zastosowane, czyli dane wartoci. W
przypadku typw reprezentujcych liczby rzeczywiste oprcz wielkoci przedziau (jak due liczby),
bardzo wana jest rwnie precyzja - ilo cyfr znaczcych. Tylko skoczon ilo liczb moemy
zakodowa na skoczonej iloci bajtw.
Przed uyciem zmiennej musimy j zadeklarowa, czyli poda jej typ i nazw np.:
int x;
Powysza linijka rezerwuje cztery bajty pamici (tyle zajmuje typ int) i nadaje temu obszarowi
pamici w naszym programie nazw x.
Uwaga: Kolejno deklaracji jest wana tylko przy deklaracji zmiennych lokalnych, czyli deklaracji w
obrbie bloku metody. W przypadku deklaracji zmiennych jako pl klasy, dostpne one s w caym
bloku klasy, zarwno przed jak i po deklaracji. Podobnie jest z przestrzeni nazw. Nazwa typu
zdefiniowanego bezporednio w bloku przestrzeni nazw lub bloku klasy jest dostpna w caym
bloku przestrzeni nazw lub bloku klasy. Mona powiedzie, e przestrze nazw nie jest liniowa.
Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 5/28
Zmienne moemy deklarowa tylko w bloku metody, tzw. zmienne lokalne oraz w bloku klasy
(struktury), tzw. pola klasy (struktury). W jzyku C# nie ma zmiennych globalnych, czyli
deklarowanych bezporedni w bloku przestrzeni nazw lub poza jakimkolwiek blokiem.
Mona deklarowa wiele zmiennych w pojedynczej deklaracji. Poszczeglne nazwy zmiennych
oddzielamy przecinkami. Przykad deklaracji trzech zmiennych typu double:
double a,b,c;
W miejscu deklaracji zmiennej lub zmiennym rwnie moemy nada warto. W tym celu po
nazwie zmiennej umieszczamy znak rwnoci i nastpnie podajemy warto zmiennej (litera lub
wyraenie, ktrego typ jest zgodny z typem zmiennej):
int p =10;
int q = 2*p, r = 4;
Uwaga: Literay i wyraenia zostan omwione w dalszej czci tego moduu.
Nazwy, ktre moemy nadawa zmiennym, czyli ich identyfikatory, musz spenia nastpujce
reguy:
Nazwa moe skada si z cigu liter, cyfr i znaku podkrelenia. Nazwa nie moe zawiera,
wic takich znakw jak np.: spacja, *, +. !.
Nazwa nie moe zaczyna si od cyfry, czyli niedopuszczalna jest deklaracja:
int 1x;
natomiast nastpujca deklaracja jest poprawna:
int x1;
Nazwa nie moe by sowem kluczowym. Sowa kluczowe s to wyrazy zastrzeone dla
danego jzyka programowania. W jzyku C# wystpuj nastpujce sowa kluczowe:
abstract event new struct
as explicit null switch
base extern object this
bool false operator throw
break finally out true
byte fixed override try
case float params typeof
catch for private uint
char foreach protected ulong
checked goto public unchecked
class if readonly unsafe
const implicit ref ushort
continue in return using
decimal int sbyte virtual
default interface sealed volatile
delegate internal short void
do is sizeof while
double lock stackalloc
else long static
Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 6/28
enum namespace string
Istniej wyrazy w jzyku C#, ktre staj si sowami kluczowymi dopiero w pewnym
kontekcie. Nale do nich:
get partial set
value where yield
Visual Studio przy domylnych swoich ustawieniach wszystkie sowa kluczowe oznacza
kolorem niebieskim.
Uwaga: Mona uywa sw kluczowych jako identyfikatorw stosujc prefiks @: @int @if;.
Znak @ nie jest czci identyfikatora. Sposb ten jest mocno niezalecany i stosuje si go,
gdy czymy program, z bibliotekami napisanymi w innych jzykach, w ktrych wystpuj
identyfikatory bdce sowami kluczowymi jzyka C#.
Nazwa musi by unikalna w danym bloku kodu. W odrnieniu od jzyka C++, w bloku
zagniedonym nie mona przesania identyfikatorw z bloku nadrzdnego:
{
...
int x;
...
{
double x; //bd, ta sama nazwa
}
...
}
ale
{
...
int x;
...
}
{
...
double x; //OK, inny blok
...
}
Uwaga: Od te reguy wystpuj pewne wyjtki. Np.: w klasie mona zadeklarowa zmienn o
danym identyfikatorze (blok klasy), a nastpnie w metodzie klasy uy ponownie tego
identyfikatora dla nowej zmiennej (blok metody jest zagniedony w bloku klasy).
Istnieje te szereg wskazwek, co do tworzenia identyfikatorw. Nieprzestrzeganie ich nie
powoduje bdw. Stosowanie si jednak do nich wiadczy o dobrym stylu i moe uatwi
pniejsz analiz.
Stosuj identyfikatory mwice, do czego suy zmienna. Nazwa powinna mie konkretne
znaczenie.
Zawsze uywaj formatu PascalCase lub formatu camelCase przy tworzeniu nazw. W formacie
PascalCase kady wyraz, z ktrych skada si identyfikator, rozpoczynamy wielk liter
np.:WriteLine, ReadLine, Console, SByte. Formatu PascalCase uywamy dla nazw
typw, staych nazwanych, waciwoci, przestrzeni nazw.
W przypadku formatowania camelCase pierwszy wyraz bdcy czci identyfikatora
piszemy ma liter, pozostae rozpoczynamy wielk liter. np.: loopCountMax. Formatu
camelCase uywamy dla nazw zmiennych lokalnych, parametrw funkcji.
Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 7/28
Unikaj znaku podkrelenia.
Nie uywaj notacji wgierskiej. W notacji wgierskiej w prefiksie bya zawarta informacja o
typie zmiennej.
Unikaj skrtw i akronimw. Jeeli ju uywamy skrtw, powinny by one powszechnie
znane i rozumiane.
Stosujemy w miar moliwoci nazwy anglojzyczne. Szczeglnie jest to wane przy
tworzeniu bibliotek.
Litera jest to cz kodu rdowego, ktra reprezentuje konkretn warto danego typu. Moe
suy na przykad do nadawania zmiennym danych wartoci.
Do oznaczenia wartoci typu logicznego uywamy wyrazw true (prawda) oraz false
(fasz) np.:
bool isHeight = true;
Do okrelania wartoci liczb cakowitych moemy uy systemu dziesitnego lub
szesnastkowego. W przypadku systemu dziesitkowego warto zapisujemy tak jak w
matematyce:
int heiht = 234;
int debt = -23; //warto ujemna
W przypadku systemu szesnastkowego przed cigiem cyfr szesnastkowych umieszczamy 0x.
Do oznaczenia brakujcych cyfr szesnastkowych uywamy liter: a, b, c, d, e, f.
long weight = 0x2a; //42 w dziesitnym
Samemu literaowi jest przyporzdkowany pierwszy z typw int, uint, long albo ulong w
ktrym dana warto jest reprezentowana. Moemy rwnie w sposb jawny okreli typ
literau przez dodanie sufiksu:
u - uint albo ulong, gdy w typie uint si nie mieci,
l - long albo ulong, gdy w typie long si nie mieci
ul, lu - ulong, np.:
long depth = 23l;
Wielko liter w przypadku sufiksw nie ma znaczenia
Uwaga: Gdy warto literau jest poza zakresem typu ulong generowany jest bd
kompilatora.
Stae rzeczywiste moemy wyraa:
przy pomocy znaku kropki:
double x = 3.54;
double y = .34;
double z = -3.0;
stosujc tzw. posta naukow:
double x = 354e-2;
double y = 3.4e-1;
double z = -0.03e2;
gdzie np.: 354e-2 = 354 * 10 -2
uywajc sufiksw
Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 8/28
double a = 2d;
float b = 4.4f;
decimal c = 6m;
Wielko liter w przypadku sufiksw nie ma znaczenia.
Literaom rzeczywistym bez dodanego sufiksu przyporzdkowany jest typ double.
W przypadku literaw rzeczywistych, gdy warto literau nie ma dokadnej reprezentacji w
danym typie, ale mieci si w zakresie dopuszczalnych wartoci danego typu, jest
zaokrglana. W przypadku, gdy warto literau jest poza zakresem dopuszczalnych wartoci
dla danego typu rzeczywistego, generowany jest bd kompilatora.
Stae znakowe reprezentuj pojedynczy znak i zwykle zawieraj dany znak umieszczony w
apostrofach.
char c = 'a', d = '1';
Wewntrz apostrofw moemy rwnie umieci pewn sekwencj znakw, ktra
reprezentuje pojedynczy znak. Sekwencja ta rozpoczyna si od znaku lewego ukonika
(backslash). Poniej umieszczono dopuszczalne sekwencje znakw:
Sekwencja Znak Nazwa znaku
\' ' apostrof
\" " cudzysw
\\ \ lewy ukonik (backslash)
\0 null
\a sygna dwikowy
\b cofnicie o jeden znak
\f nowa strona
\n nowy wiersz
\r powrt karetki
\t tabulacja pozioma
\v tabulacja pionowa
Ponadto mona skorzysta z szesnastkowej sekwencji znakw (hexadecimal escape
sequence), ktra jest poprzedzona znakami \x oraz sekwencji w kodzie Unicode (Unicode
character escape sequence), ktra jest poprzedzona znakami \u. W obu przypadkach
podajemy szesnastkowy kod Unicode danego znaku.
char c='\x4d'; //mona te c = '\x004d';
char d = '\u004d';
Uwaga: W jzyku C# sekwencja w kodzie Unicode (Unicode character escape sequence)
moe rozpoczyna si od znakw \U po ktrym naley umieci cig skadajcy si z omiu
cyfr szesnastkowych. Znaki o kodach z przedziau U+10000 do U+10FFFF nie s dozwolone w
literaach znakowych i napisowych. Znaki o kodzie powyej 0x10FFFF nie s w ogle
wspierane w jzyku C#.
Litera napisowy jest cigiem znakw ujtym w cudzysw:
string s = "Dowolny napis";
Jest to tzw. regularny litera napisowy. Moe on zawiera zero lub wicej znakw, ale nie
moe by dzielony na dwie i wicej linii oraz nie moe zawiera znaku " i pojedynczego znaku
Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 9/28
\. Moe natomiast zawiera sekwencje znakw rozpoczynajcych si od lewego ukonika,
ktre zostay opisane przy literaach znakowych. Polecenie:
Console.WriteLine("\"Pan Tadeusz\"");
spowoduje pojawienie si na ekranie:
"Pan Tadeusz"
Natomiast po wykonaniu polecenia:
Console.WriteLine("Cze!\nTu Twj komputer.");
Na ekranie pojawi si napis w dwch liniach:
Cze!
Tu Twj komputer.
W C# istniej rwnie literay napisowe dosowne (verbatim-string-literal). Rni si od
regularnych literaw napisowych tym, e przed cudzysw otwierajcy wstawiamy znak
mapy @.
string s = @"Dowolny napis";
W literaach napisowych dosownych znak lewy ukonik nie ma adnego specjalnego
znaczenia. Polecenie:
Console.WriteLine(@"Cze!\nTu Twj komputer.");
spowoduje pojawienie si na ekranie:
Cze!\nTu Twj komputer.
Jeeli chcemy uzyska cudzysw " w literale napisowym dosownym, naley uy dwch
znakw cudzysw "". Polecenie
Console.WriteLine(@"""Pan Tadeusz""");
spowoduje pojawienie si na ekranie:
"Pan Tadeusz"
Literay napisowe dosowne mog rozciga si na wiele linii.
Do deklaracji zmiennej mona doda modyfikator const. Otrzymujemy w ten sposb sta nazwan,
czsto nazywan po prostu sta.
const int SpeedLight = 300000; //km/s
Warto staych nazwanych musi by podana w miejscu deklaracji i pniej jej nie mona zmienia.
Warto wyraenia inicjalizujcego sta nazwan jest obliczana w czasie kompilacji. Wyraenie
zatem nie moe zawiera odwoania do zmiennych. Moe natomiast zawiera odwoania do innych
staych.
Przykadami staych zdefiniowanych w bibliotece .NET s:
System.Math.PI; //liczba pi
System.Math.E; //podstawa logarytmu naturalnego
Zastosowanie staych nazwanych, zamiast bezporednio literaw, uatwia zrozumienie i analiz
programu. Program staje si bardziej czytelny.
Uwaga: Staa nazwana zdefiniowana jako pole klasy jest automatycznie polem statycznym tej klasy.
W programie niektre wartoci zmiennych musz by wprowadzone przez uytkownika programu.
W aplikacjach konsolowych wykorzystuje si do tego najczciej metod ReadLine klasy
Console. Metoda ta udostpnia dane wprowadzone przez uytkownika w formie napisu -
Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 10/28
zmiennej typu string. Napis trzeba zamieni, przekonwertowa, na warto danego typu.
Mona wykorzysta do tego metody klasy Convert: ToInt32, ToBoolean, ToDecimal...
Czyli aby pobra od uytkownika warto liczby rzeczywistej naley napisa nastpujcy kod:
string s = Console.ReadLine();
double x = Convert.ToDouble(s);
lub krcej:
double x = Convert.ToDouble(Console.ToString());
W celu wypisania wartoci zmiennej na ekranie moemy uy metody Write lub WriteLine w
nastpujcy sposb:
Console.WriteLine(nazwaZminnej);
Console.Write(nazwaZminnej);
Czsto gdy wypisujemy warto zmiennej, czymy to z pewnym opisem. Metoda Write i
WriteLine umoliwia rwnie wypisanie wartoci kilku zmiennych w pojedynczym wywoaniu
metody. Zamy, e mamy zmienne:
x = 10, y = 20, z = 30.
Polecenie:
Console.WriteLine("x={0}, y={1}, z={2}",x,y,z);
spowoduje wypisanie na ekranie:
x=10, y=20, z=30
Z powyszego przykadu wida, e znaki {index} zostay zastpione wartoci odpowiedniej
zmiennej. Index wskazuje numer pozycji argumentu, ktrego warto naley wstawi w danym
miejscu. Argumenty indeksujemy od zera.
Uwaga: Gdy warto indeksu jest wiksza lub rwna liczbie argumentw zgaszany jest wyjtek.
Gdy chcemy wypisa znak nawias klamrowy otwierajcy {, musimy poda dwa nawisy klamrowe
otwierajce {{, aby wywietli znak nawias klamrowy zamykajcy }, naley poda dwa nawisy
klamrowe zamykajce }}.
Wypisywan warto mona podda formatowaniu. Uzyskuje si to przez dodanie kilku znakw
midzy nawiasy klamrowe. Oto posta oglna:
{index[,n][:symbol]}
index jak ju wspominano, numer argumentu ktry naley wypisa.
n liczba pozycji (miejsc), ktre zajmuje dana warto. Brakujce miejsca uzupeniane s
spacjami. Warto dodatnia oznacza wyrwnywanie do prawej, ujemna do lewej.
symbol - pewna litera oznaczajca sposb formatowania liczb. Po literze moe wystpi
liczba z przedziau od 0 do 99 oznaczajca precyzj. Dostpne litery:
C lub c dodawany jest symbol waluty
D lub d format tylko dla liczb cakowitych. Precyzja okrela z ilu cyfr skada si liczba.
Gdy liczba skada si z mniejszej iloci cyfr brakujce miejsca uzupeniane zerami z lewej
strony.
E lub e liczba jest wywietlana w notacji naukowej - posta wykadnicza. Jedna cyfra
zawsze poprzedza znak dziesitny.
F lub f - liczba jest konwertowana do postaci staopozycyjnej (fixed-point).
G lub g - liczba jest konwertowana do najbardziej zwizej postaci (notacja naukowa lub
staopozycyjna)
N lub n - wstawiany jest separator tysicy.
Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 11/28
X lub x - format tylko dla liczb cakowitych. Liczba jest wywietlana w systemie
szesnastkowym.
P lub p - warto liczby jest mnoona przez sto i dodawany jest znak procentu.
R lub r - gwarantuje, e po skonwertowaniu liczby do napisu (stringu) i pnie wykonaniu
konwersji odwrotnej (napisu do liczby) otrzymamy t sam warto numeryczn.
Wicej informacji mona znale w MSDN Library pod tematem "Standard Numeric Format
Strings".
Przykady zastosowania formatowania mona znale w programie
Kurs\Demo\Modul2\Modul2.sln projekt Formatowanie, gdzie Kurs jest katalogiem gdzie
skopiowano pliki kursu.
W podobny sposb, moemy tworzy napisy przy pomocy metody Format klasy String:
string s;
s = String.Format("{0} + {1} = {2}", 2, 2, 2+2);
Zmienna s bdzie zawieraa nastpujcy napis: 2 + 2 = 4.
Jak wspominano wczeniej w tym module, kady typ naley do jednej z dwch kategorii typw:
typy wartoci lub typy referencyjne.
Do typw bezporednich nale:
Typy wbudowane numeryczne(byte, sbyte, short, ushort, int, uint, long, ulong, char, float,
double, decimal).
Typ wbudowany bool (logiczny).
Typy wyliczeniowe (typ ten zostanie omwiony w dalszej czci tego moduu).
Struktury - jest to typ definiowany przez uytkownika. Wicej o tym typie bdzie w module
12.
Zmienne typu wartociowego bezporednio zawieraj dane. Kada zmienna typu bezporedniego
reprezentuje oddzielny obszar pamici, dlatego operacja na jednej zmiennej nie wpywa na drug.
Zmienne lokalne przechowywane w obszarze pamici zwanym stosem. Z miejscem
przechowywania i sposobem zarzdzania tym obszarem zwizany jest czas ycia zmiennej. Czas
ycia zmiennej moemy zdefiniowa jako czas, przez ktry jest zarezerwowana pami dla
zmiennej. Pami jest zarezerwowana dla zmiennej lokalnej od miejsca jej zadeklarowania do
koca bloku, w ktrym zostaa zadeklarowana.
{
double x; //pocztek "ycia" zmiennej x
...
{
...
int y; //pocztek "ycia" zmiennej y
...
} //koniec "ycia" zmiennej y
...
} //koniec "ycia" zmiennej x
Uwaga: Zasada dziaania stosu zostanie omwiona dokadnie w module 12, natomiast pojcie
zmiennej lokalnej w rozdziale 9 tego kursu.
Przed uyciem zmienna musi by zainicjalizowana - musi mie nadan warto:
int x;
Console.Write(x); //Bd kompilacji
Zmienne typu wartoci posiadaj zawsze jak warto, nie mog by null.
Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 12/28
Uwaga: W wersji C# 2.0 dla wszystkich typw wartoci wprowadzono pewn form typu (nullable
types), ktrej zmienne mog przyjmowa wartoci null (warto nieokrelona). Typ ten
uzyskujemy przez dodanie do koca nazwy typu wartoci znaku zapytania ?.
int? x;
x = null; //OK
int y;
y = null; //Bd kompilacji
Typy nullable wprowadzono, aby uatwi wspprac z bazami danych.
Typ wyliczeniowy
Typ wyliczeniowy jest to typ definiowany przez uytkownika (programist). Stosujemy go, gdy
chcemy, aby zmienne tego typu mogy przyjmowa wartoci z okrelonego zestawu staych.
Definiuje si go przy pomocy sowa kluczowego enum, po ktrym wystpuje nazwa nowego typu, a
nastpnie w nawiasach klamrowych podajemy nazwy symboliczne dopuszczalnych wartoci,
oddzielone przecinkami. Nazwy, jakie moemy nadawa typom wyliczeniowym oraz poszczeglnym
elementom, podlegaj tym samym zasadom co identyfikatory zmiennych. Oto przykad definicji
tego typu:
enum PoryRoku {Wiosna, Lato, Jesien, Zima};
Domylnie pierwszy element ma przypisan warto 0, warto kadego kolejnego elementu jest
wiksza o jeden od wartoci poprzednika. Mona rwnie przypisa w sposb jawny wartoci
poszczeglnym elementom np.:
enum Kolory{czerwony=4, zielony, niebieski=7};
Element zielony ma w sposb niejawny przypisan warto 5.
Wartoci elementom typu wyliczeniowego mog by nadawane w dowolnej kolejnoci, a nawet
mona im przypisa wartoci jednakowe, gdy kilka symboli oznacza t sam warto.
Uwaga: Typy wyliczeniowe, jak inne typy definiowane przez uytkownika (klasy, struktury), nie
mona definiowa wewntrz bloku metody.
Oto prosty przykad uycia typu PoryRoku:
PoryRoku sezon = PoryRoku.Wiosna;
Console.WriteLine("Ulubiona pora roku: {0}", sezon);
Na ekranie zostanie wypisane:
Ulubiona pora roku: Wiosna.
Wida wic, e zamiast wartoci liczbowej zmiennej zostanie wypisana warto symboliczna.
Przykady zastosowania typu wyliczeniowego mona znale w programie
Kurs\Demo\Modul2\Modul2.sln projekt PoryRoku oraz Konsola, gdzie Kurs jest katalogiem gdzie
skopiowano pliki kursu. Konwersja wykorzystywana w projekcie PoryRoku jest opisana w dalszej
czci tego moduu.
Uwag: Przy definicji typu wyliczeniowego mona poda, jaki typ cakowity jest typem bazowym dla
definiowanego typu wyliczeniowego. Typem bazowym moe by dowolny tym cakowity poza
typem char.
enum PoryRoku : byte {Wiosna, Lato, Jesien, Zima};
Przy tworzeniu nazwy typu wyliczeniowego, podobnie jak w przypadku nazw innych typw, stosuje
si format PascalCase.
Stosowanie typu wyliczeniowego, podobnie jak staych nazwanych czyni nasz kod bardziej
czytelnym. Oprcz tego:
Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 13/28
Zapewnia, e zmiennym s przypisane odpowiednie wartoci.
W rodowisku Visual Studio uatwia pisanie kodu dziki automatycznemu uzupenianiu nazw
(IntelliSense).
Typ referencyjny
Drug kategori typw s tak zwane typy referencyjne. Do typw referencyjnych zaliczamy:
Typy wbudowane string i object
Klasy
Interfejsy
Delegacje
Tablice
Klasy, interfejsy oraz delegacje zostan dokadnie omwione w kursie "Programowanie
obiektowe". Tablice zostan omwione w rozdziale szstym i sidmym tego kursu.
Zmienne typw referencyjnych zawieraj odwoanie, nie zawiera bezporednio danych. Dane
(obszar pamici) do ktrych odwouje si zmienna nazywamy obiektem. Zmienne, ktre nie
odwouj si do adnego obiektu, posiadaj warto null, nie myli ze zmiennymi
niezainicjalizowanymi. Czsto stosuje si pewien skrt mylowy i zmienn nazywa si obiektem
danego typu. Obiekty przechowywane s na w obszarze pamici, ktry nazywa si zarzdz stert.
Dwie zmienne danego typu referencyjnego mog odwoywa si do tego samego obiektu, wic
operacja na jednej zmiennej moe zmie dane innej zmiennej.
Obiekty tworzy si przy pomocy sowa kluczowego new, chocia istniej pewne uproszczenia
skadni np. typ string. Przykad utworzenia obiektu klasy Random, ktra reprezentuje generator
liczb pseudolosowych.
Random r; //deklaracja zmiennej
//r.Nex(0,101); //bd kompilatora, zmienna niezainicjalizowana
r = null; //inicjalizacja wartoci null
r = new Random(); //utworzenie obiektu klasy Random
int i = r.Next(0,101); //losowanie liczby cakowitej z przedziau <0;100>
Uwaga: Uycie zmiennej referencyjnej o wartoci null powoduje generacj wyjtku w czasie
dziaania programu.
Oczywicie zmienn moemy zainicjalizowa w miejscu deklaracji:
Random r = new Random();
Na zmienn r stosujc skrt mylowy mona powiedzie, e jest obiektem klasy Random.
Poniszy kod:
string s1 = "Ala ma kota";
string s2 = s1;
mona przedstawi graficznie w nastpujcy sposb:

Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 14/28
Czas ycia obiektu jest zarzdzany przez proces automatycznego odzyskiwania pamici (garbage
collection). Nie jestemy wstanie okreli dokadnie miejsca w programie, kiedy pami zajmowana
przez obiekt zostanie zwolniona, czyli kiedy obiekt zostanie usunity z pamici. Moemy by jednak
pewni, e proces automatycznego odzyskiwania pamici nie usunie obiektu, jeeli istnieje
przynajmniej jedna zmienna, ktra odwouje si do danego obiektu.
Konwersja typw
Skopiowanie wartoci zmiennej do zmiennej innego typu nazywamy konwersj. Konwersja
oczywicie nie jest moliwa midzy dowolnymi dwoma typami. W jzyku C# istnieje szereg
konwersji standardowych.
Uwaga: W jzyku C# dla typw uytkownika moe definiowa wasne metody konwersji. Szerzej o
tym jest napisane w kursie "Programowanie obiektowe".
Konwersje standardowe moemy podzieli na:
Konwersje niejawne.
Konwersje jawne.
Konwersja niejawna zachodzi automatycznie. Programista nie musi jej oznacza:
int x = 10;
long y = x; //konwersja z typu int do typu long
W przypadku konwersji niejawnej nigdy nie ma utraty wartoci, moe by tylko utracona precyzja -
dokadno. Mona j porwna do przelewania zawartoci pojemnika o maej objtoci do
pojemnika o duej objtoci. Konwertowa niejawnie mona z typu "maego" do typu "duego".
"Duy" typ zawiera wartoci typu "maego". Ponisza tabela przedstawia standardowe konwersje
niejawne w jzyku C#.
Z Do
sbyte short, int, long, float, double, decimal
byte short, ushort, int, uint, long, ulong, float, double,
decimal
short int, long, float, double, decimal
ushort int, uint, long, ulong, float, double, decimal
int long, float, double, decimal
uint long, ulong, float, double, decimal
long, ulong float, double, decimal
float double
Ala ma kota
.
.
Obiekt
Stos
Zarzdzana sterta
s1
s2
Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 15/28
char ushort, int, uint, long, ulong, float, double, decimal
Konwersje jawn mona porwna do przelewania z duego naczynia do maego. Przelewajc
ryzykujemy, e cz pynu moe si nie zmieci w maym naczyniu i si rozleje. W przypadku
konwersji jawnej zachodzi, wic obawa o utrat wartoci. Programista musi poinformowa, e
dokonuje tej konwersji wiadomie. Konwersj jawn zapisujemy przy pomocy operatora konwersji:
short s =300;
//byte b = s; //bd, musi by konwersja jawna
byte b = (byte)i; //OK
Console.WriteLine(b);
Na ekranie zostanie wypisane:
44
Zostaa utracona warto liczby. Chcc kontrolowa takie sytuacje mona uy polecenia checked.
checked {
int n = int.MaxValue;
Console.WriteLine(++n); // OverflowException
}
lub operatora checked
int m = int.MaxValue;
int n = checked(m+1); // OverflowException
short s= 300;
byte b = checked((byte)s); // OverflowException
Wyraz checked powoduje, e w czasie wykonania programu jest kontrolowane, czy nie nastpio
przepenienie. Wystpienie przepenienia powoduje rzucenie wyjtku. Wyjtki zostan przyblione
w nastpnym rozdziale.
Przecznik kompilatora /checked+ domylnie sprawdza przepenienie. Domyln opcj
kompilatora jest /checked-, wyczenie sprawdzania przepenienia. Przy wczonej opcji
kompilatora sprawdzenia przepenienia, mona j wyczy przy pomocy sowa unchecked.
Stosuje si je w identyczny sposb jak sowo checked.
Uwaga: checked i unchecked dotycz tylko liczb cakowitych.
Literay rzeczywiste traktowane s jako typ double, wic nastpujcy kod powoduje bdy
kompilatora:
float f = 4.2;
decimal d = 2.4;
Naley to zapisa to:
float f = (float)4.2;
decimal d = (decimal)2.4;
lub krcej
float f = 4.2f;
decimal d = 2.4d;
Kopiujc warto zmiennej typu wyliczeniowego do zmiennej typu cakowitego i dokonujc
konwersji odwrotnej, rwnie musimy stosowa konwersj jawn,.
enum PoryRoku {Wiosna, Lato, Jesien, Zima};
...
int i = 2;
PoryRoku poryRoku = (PoryRoku)i;
int j = (int)poryRoku;
Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 16/28
Uwaga: Podczas konwersji nie jest sprawdzane, czy dana warto cakowita ma swoj reprezentacj
w danym typie wyliczeniowym - nie jest zgaszany aden bd, ani nie ma generacji adnego
wyjtku.
W jzyku C# istnieje jeszcze jedna standardowa konwersja - opakowanie (boxing). Opakowanie
wartoci polega na niejawnym przeksztaceniu typu wartoci w typ object.
int ilosc = 10;
object obj = i; //opakowanie
W wyniku operacji opakowania na zarzdzanej stercie tworzona jest instancja obiektu, do ktrej
jest dowizana zmienna obj. Warto zmiennej ilosc zostaa skopiowana do obiektu obj. Zmienna
ilosc oraz obiekt obj s niezalene. Zmiana wartoci obiektu obj nie wpywa na warto
zmiennej ilosc.
Operacja odwrotna do opakowania - rozpakowanie musi by wywoywana jawnie. Kompilator musi
by poinformowany, jaki typ wartoci ma uzyska z obiektu na zarzdzanej stercie. Podczas
wykonywania rozpakowania nastpuje sprawdzenie, czy instancja obiektu zawiera warto
danego typu. Jeeli jest tak w istocie, to warto zostanie rozpakowana. W przeciwnym wypadku
zostanie zgoszony wyjtek - InvalidCastException. Wicej informacji na temat wyjtkw
mona znale w nastpnym rozdziale.
int ilosc = 10;
object obj = i; //opakowanie
int ilosc2 = (int)obj; //rozpakowanie
double d = (double)obj; //wyjtek
Operatory
Dla wbudowanych typw danych w jzykach programowania wprowadza si pewn liczb
prostych, standardowych operacji. Operacje te wyraone s przy pomocy cigu znakw, ktre
nazywamy operatorami. Cig znakw skada si najczciej z pojedynczego znaku lub dwch
znakw. Przykadem operatora jest znak rwnoci = - operator przypisania. Oznacza on
skopiowanie wartoci zmiennej lub wyraenia znajdujcego si po prawej stronie do zmiennej
znajdujcej si po lewej stronie znaku rwnoci. Pojcie wyraenie, wystpujce w poprzednim
zdaniu, oznacza cig operatorw i argumentw. Wyraenie moe dawa w wyniku pewn warto i
powodowa efekty uboczne. Argumentem moe by identyfikator zmiennej, litera, wywoanie
metody, nazwa typu lub inne wyraenie. Wyraenie moe skada si tylko z pojedynczego
argumentu - identyfikatora zmiennej, literau, wywoania metody.
Uwaga: Dla typw definiowanych przez uytkownika mona przeciy, zdefiniowa wasn wersj
wikszoci operatorw. Temat przecienie operatorw jest omawiany w kursie "Programowanie
obiektowe".
Omawiajc operatory podzielimy je na grupy.
Operatory arytmetyczne - oznaczaj proste dziaania matematyczne. Do operatorw
arytmetycznych zaliczamy: + (dodawanie), - (odejmowanie), * (mnoenie), / (dzielenie), %
(reszta z dzielenia). Jako argumenty mog przyjmowa warto (zmienn) dowolnego typu
numerycznego..
double x = 20, y = 10;
double z = x + y; //z = 30
z = x - y; //z = 10
z = x * y; //z = 200
z = x / y; //z = 2
z = 7 % 3; //z = 1
z = -7 % 3; //z = -1
Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 17/28
z = 7 % -3; //z = 1
z = -7 % -3; //z = -1
Uwaga: W przypadku dzielenie liczb cakowitych wynik jest rwnie cakowity.
z = 6 / 5; // z = 1 nie 1.2
W przypadku liczb cakowitych oraz liczb typu decimal przy dzieleniu przez zero oraz reszty z
dzielenia przez zero zgaszany jest wyjtek.
W przypadku dzielenia liczb typu float lub double przez zero, wynikiem jest nieskoczono
(+ lub minus) lub wynik "nie jest liczb".
W przypadku dodawania, odejmowania, mnoenia licz cakowitych, jeeli wynik przekracza
zakres dopuszczalnych wartoci danego typu, zachowanie jest uzalenione od opcji
kompilatora /checked (patrz temat "Konwersja typw" w tym rozdziale). W przypadku typw
rzeczywistych, jeeli wynik nie mieci si w zakresie dopuszczalnych wartoci danego typu,
wynikiem jest plus lub minus nieskoczono. Dla typu decimal przy przekroczeniu zakresu
dopuszczalnych wartoci rzucany jest wyjtek. OverflowException.
Dokadny opis sposobu dziaania w sytuacjach kopotliwych (zero i nieskoczono, dwie
nieskoczonoci itp.) mona znale w specyfikacji jzyka C# w rozdziale 7.7 - C# Language
Specification 1.2.doc.
Uwaga:
Operatory dodawania i odejmowania s rwnie automatycznie dostpne dla typw
wyliczeniowych. Wynikiem dodawania lub odejmowania dwch wartoci danego typu
wyliczeniowego, jest warto typu cakowitego bazowego dla danego typu wyliczeniowego.
Operator konkatenacji - czenia napisw +. W przypadku znaku dodawania, gdy po jego obu
stronach wystpuj wartoci typu string oznacza on czenie napisw, tworzony jest nowy
obiekt reprezentujcy poczone napisy.
string s = "Ala ma ";
string s2 = s + "kota"; //s2 = "Ala ma kota"
Operatory relacyjne - wynikiem ich dziaania jest prawda lub fasz - typ logiczny. Dla typw
numerycznych oraz typw wyliczeniowych mamy nastpujce operatory relacyjne: == (czy
rwne), != (czy rne), < (czy mniejsze), > (czy wiksze), <= (czy mniejsze lub rwne), >= (czy
wiksze lub rwne) np.:
bool b;
int i =10, j =20;
b = i > j; //b = false
Uwaga:
W przypadku typw rzeczywistych naley pamita e:
== < max < ... < min < 0.0 == +0.0 < +min < ... < +max < + == +
gdzie max oraz min s odpowiednio najwiksz i najmniejsz wartoci dodatni danego
typu rzeczywistego.
W przypadku typw referencyjnych predefiniowane s operatory: == (czy rwne), != (czy
rne). Wersje predefiniowane tych operatorw sprawdzaj czy zmienne odwouj si do
tego samego obiektu (rwno referencji), a nie czy obiekty maj t sam warto (rwno
wartoci). Programista moe zmieni znaczenie tych operatorw. Jest tak np. w przypadku
typu string. Dla typu string operatory te porwnuj warto nie referencje. W przypadku, gdy
obie zmienne danego typu referencyjnego maj warto null przyjmuje si, e s rwne.
Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 18/28
Uwaga: Gdy chcemy porwnywa napisy, moemy uy metody string.Compare.
Opertory <,>,<=, >= dla typu string nie s zdefiniowane.
Operatory == (czy rwne), != (czy rne) zdefiniowane s rwnie dla typu logicznego.
Operatory przesunicia << lub >> - s to dwuargumentowe operatory pracujce na
argumentach typu cakowitego lub typw wyliczeniowych.
x<<n; //przesunicie w lewo
x>>n //Przesunicie w prawo
n - okrela ilo bitw przesunicia.
Uwaga: Do obliczenia rzeczywistej iloci bitw do przesunicia, jeeli x jest typu int lub uint,
branych jest tylko pi najmniej znaczcych bitw n (n & 0x1F), natomiast gdy x jest typu
long lub ulong, branych jest sze najmniej znaczcych bitw n (n & 0x3F)
W przypadku przesunicia w lewo sposb obliczania wartoci liczby po przesuniciu jest
prosty. Zapisujemy liczb w notacji dwjkowej. Nastpnie skrelamy n najbardziej znaczcych
cyfr dwjkowych (z lewej strony), gdzie n oznacza ilo bitw przesunicia i dopisujemy n 0 z
prawej strony.
int x = 0x2f; //101111
int y = x << 2; //10111100
Uwaga:
W przypadku liczb ze znakiem liczby kodowane s nastpujco. Najbardziej znaczcy bit jest
nazywany bitem znaku i jeeli jest ustawiony do rwnania obliczajcego warto liczby
zamiast liczby 1 wstawiamy -1. Zostanie to pokazane na przykadzie typu sbyte (osiem
bitw):
d7(16) = 1101 0111(2) =
-1 * 27 + 1 * 26 + 0 * 25 + 1 * 24 + 0 * 23 + 1 * 22 + + 1 * 21 + 1 * 20 =
-128 +64 + 16 + 4 + 2 + 1 = -41

int x = -1; // 0xffffffff
int y = x << 1; // 0xfffffffe, y=-2
W przypadku przesunicia w prawo sytuacja jest bardziej skomplikowana. Dla liczb dodatnich
skrelamy n najmniej znaczcych bitw i z przodu dodajemy n zer. Dla liczb ujemnych
rwnie skrelamy n najmniej znaczcych bitw, ale z przodu dopisujemy jedynki.
Przesunicie w lewo jest rwnowane mnoeniu przez n-t potg liczby dwa, natomiast
przesunicie w prawo jest rwnowane dzieleniu przez n-t potg dwch.
Operatory bitowe (logical operators) - do operatorw bitowych nale: & (koniunkcja), ^
(rnica symetryczna), | (alternatywa). ~ (negacja bitowa). Zasad ich dziaania dla typw
cakowitych oraz wyliczeniowych przedstawia ponisza tabela:
x = 1 1 0 0 ...(pozostae bity)
y = 1 0 1 0 ...(pozostae bity)
x & y = 1 0 0 0 ...(pozostae bity)
x | y = 1 1 1 0 ...(pozostae bity)
x ^ y = 0 1 1 0 ...(pozostae bity)
~x = 0 0 1 1 ...(pozostae bity)
Argumentami operatorw bitowych & (koniunkcja), ^ (rnica symetryczna), | (alternatywa)
mog by zmienne typu logicznego. Dziaanie ich jest nastpujce:
Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 19/28
x = true false true false
y = true true false false
x & y = true false false false
x | y = true true true false
x ^ y = false true true false
Operatory logiczne (conditional logical operators) - do operatorw logicznych zaliczamy: &&
(iloczyn logiczny), || (suma logiczna) oraz ! (negacja logiczna). Argumentami tych operatorw
mog by wartoci logiczne.
Wyraenie x && y zwraca warto true, jeeli x i y ma warto true. Od wyraenia x & y rni
si tym, e warto y jest obliczana tylko wtedy, gdy x ma warto true.
Wyraenie x || y zwraca warto true, jeeli x lub y ma warto true. Od wyraenia x |
y rni si tym, e warto y jest obliczana tylko wtedy, gdy x ma warto false.
Operator ! (negacja logiczna) zmienia warto true na false i na odwrt.
bool x = true;
bool y = ! x; //y=false
Do operatorw logicznych zaliczamy rwnie operatory true oraz false. Wykorzystywane s
przy przecieniu operatorw && oraz || i s poza zakresem tego kursu.
Operatory inkrementacji (zwikszania o 1) i dekrementacji (zmniejszania o 1). Oba operatory
maj dwie wersje: przyrostkow oraz przedrostkow. Zasada dziaania zostanie pokazana na
przykadzie
int x = 10, y = 10;
int z = x++;
int v = ++y;
Warto zmiennych x, y, v po wykonaniu powyszego kodu bdzie 11, natomiast warto v
bdzie wynosi 10. Dzieje si tak, poniewa wersja przyrostkowa x++ najpierw wstawia
warto zmiennej do wyraenia, a nastpnie zwiksza jej warto o jeden, natomiast wersja
przedrostkowa (++y) najpierw zwiksza warto zmiennej o jeden, a nastpnie zwraca jej
warto, ju zwikszon do wyraenia.
Dla operator dekrementacji bdzie to wygldao nastpujco:
int a = 10, b = 10;
int c = a--; //c=10, a = 9
int d = --b; //d=9, b=9
Operatory te mona stosowa do wszystkich zmiennych typw numerycznych (int, char,
double, decimal ...).
Operatory przypisania. Wczeniej w tym rozdziale by uywany operator przypisania
(podstawienia) oznaczony pojedynczym znakiem rwnoci =. Dla zmiennych typw wartoci
oznacza on skopiowanie wartoci zmiennej lub wyraenia znajdujcego si po prawej stronie
znaku rwnoci, do zmiennej znajdujcej si po lewej stronie znaku rwnoci. Dla zmiennych
typw referencyjnych oznacza skopiowanie tylko odwoania. Do operatorw przypisania
zaliczmy rwnie: +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=.
Znaczenie poszczeglnych operatorw jest zdefiniowane poniej.
x += 2; x = x + 2;
x -= 2; x = x - 2;
x *= 2; x = x * 2;
x /= 2; x = x / 2;
x %= 2; x = x % 2;
Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 20/28
x &= 2; x = x & 2;
x |= 2; x = x | 2;
x ^= 2; x = x ^ 2;
x <<= 2; x = x << 2;
x >>= 2; x = x >> 2;
Plus + i minus - jednoargumentowy. Operatory te s predefiniowane dla typw
numerycznych i maj identyczne znaczenie jak w zapisie matematycznym. W przypadku
operator + do wyraenia wstawiana jest warto jego argumentu, nie zmienia on wartoci
swojego argumentu. Operator - oznacza liczb przeciwn. Operator - nie moe by
stosowany do zmiennych typu ulong, generowany jest bd kompilacji. W przypadku
argumentu typu uint, rezultat jest konwertowany do long.
Operator dostpu do skadowej kropka . . Znak kropki oddziela nazw kontenera (nazwa
przestrzeni nazw, nazwa klasy, nazwa struktury) od nazwy rzeczy zagniedonej (nazwa
podprzestrzeni, nazwa klasy, nazwa metody ...). Peni podobn rol jak znak ukonika przy
podawaniu cieki dostpu, np.:
System.Collections.Generic;
System.Console.WriteLine();
Wyraenie warunkowe. Oglna posta wyraenia warunkowego jest nastpujca:
warunek ? wyraenie1 : wyraenie2;
Warto wyraenia warunkowego jest obliczany w nastpujcy sposb. Jeeli warunek jest
prawdziwy to wartoci caego wyraenia warunkowego jest wyraenie1, w przeciwnym
wypadku wartoci wyraenia warunkowego jest wyraenie2. W zalenoci od wartoci
warunku obliczane jest tylko wyraenie1 albo wyraenie2. Nigdy nie s obliczane oba
wyraenia. Poniej zostanie przedstawiony kod obliczajcy warto bezwzgldn (modu
liczby) przy pomocy wyraenia warunkowego:
double x, modul;
...
modul = x < 0 ? -x : x;
Argumentu warunek musi by typu logicznego. Natomiast wyraenie1 i wyraenie2 musz
by tego samego typu, albo midzy typami tych argumentw musi istnie konwersja
niejawna.
Tworzenie nowego obiektu - operator new. W przypadku wywoania operatora new dla
typw referencyjnych, nastpuje alokacji pamici dla obiektu i inicjalizacja pamici
(wywoanie metody zwanej konstruktorem).
Ranodom r =new Random(); //utworzenie obiektu klasy Random
Operator new moemy rwnie uywa do "tworzenia" zmiennych typw wartoci. W
przypadku typw wartoci nie ma jednak dynamicznej alokacji pamici. Wywoywana jest,
podobnie jak dla typw referencyjnych, metoda inicjalizujca zmienn zwana konstruktorem.
int i = new int(); //int i = 0;
Uwaga: Wicej o metodzie zwanej konstruktorem mona znale w kursie "Programowanie
obiektowe".
Operator rzutowania () i operatory kontrolujce przepenienie typw cakowitych checked
i unchecked zostay opisane wczeniej w tym rozdziale przy omawianiu konwersji jawnych.
Operator indeksowania [] zostanie dokadnie omwiony w rozdziale szstym tego kursu.
Operatory informujce o typie (as, is, sizeof, typeof) zostan przyblione w kursie
"Programowanie obiektowe".
Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 21/28
Operatory operujce na wskanikach (adresach) mog by uywane tylko w kodzie
niezarzdzanym (unsafe context). Jest to tzw. kod niebezpieczny i jest poza zakresem tego
kursu.
Operatory (funkcje operatorowe) charakteryzuj si pewnymi waciwociami. Nale do nich:
liczba argumentw
priorytet
czno
typ argumentw
Ze wzgldu na liczb argumentw operatory moemy podzieli na:
operatory jednoargumentowe (unary operators), np.: inkrementacji ++, dekrementacji --,
minus jednoargumentowy -, ...
operatory dwuargumentowe (binary operators), np.: operatory arytmetyczne, przypisania,
relacyjne...
operator trjargumentowy (ternary operator), istnieje tylko jeden - wyraenie warunkowe (?
:)
Priorytet operatorw to inaczej kolejno dziaa. W wyraeniach zawierajcych wiele operatorw
priorytet (precedence) kontroluje, w jakiej kolejnoci poszczeglne operatory s "obliczane".
Rozwamy prosty przykad:
double x = 10, y = 5, z = 2;
double a = x + y * z;
Wartoci zmiennej a bdzie 20, a nie 30, poniewa najpierw zostanie wykonane mnoenie, ma
wyszy priorytet, a dopiero nastpnie dodawanie, czyli identycznie jak w matematyce. Kolejno
dziaa moemy zmienia stosujc nawiasy. W jzyku C# do ustalenia kolejnoci dziaa moemy
stosowa tylko nawiasy okrge, wielokrotnie je zagniedajc.
double x = 10, y = 5, z = 2;
double a = (x + y) * z; //a = 30
double b = (2*(x+y) + z) * 3; //b= 96
Kolejno oblicze wartoci zmiennej b jest nastpujca:
Obliczamy warto wyraenia znajdujcego si w najbardziej zagniedonych nawiasach, czyli
x+y. Po uproszczeniu otrzymujemy wyraenie (2 * 15 + z) * 3.
Obliczamy warto wyraenia w nawiasie. Poniewa mnoenie ma wyszy priorytet, jest
wykonywane najpierw. Po wykonaniu dziaa w nawiasie otrzymujemy wyraenie 32 * 3,
ktrego warto wynosi 96
Nawiasy okrge stosowane s nie tylko w celu zmiany kolejnoci dziaa, ale rwnie, aby
wyraenie stao si bardziej czytelne.
Ponisza tabela przedstawia operatory w kolejnoci od najwyszego priorytetu do najniszego.
Operatory nalece do tej samej kategorii maj ten sam priorytet.
Kategoria Operatory
Operatory o najwyszym
priorytecie
x.y - dostp do skadowej - kropka
f(x) - wywoanie metody
a[x] - operator indeksowania []
x++ - inkrementacja przyrostkowa
x-- - dekrementacja przyrostkowa
new, typeof, checked, unchecked
Jednoargumentowe +, -, - operatory jednoargumentowe plus i minus
Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 22/28
(unary)

! - negacja logiczna
~ - negacja bitowa (dopenienie do dwch)
++x - inkrementacja przedrostkowa
--x - dekrementacja przedrostkowa
(T)x - operator rzutowania
Operatory
multiplikatywne
* - mnoenie
/ - dzielenie
% - reszta z dzielenia
Operatory addytywne + - dodawanie
- - odejmowanie
Operatory przesunicia <<, >>
Relacyjne i sprawdzajce
typ
<, >, <=, >=
is, as
Rwnoci ==, !=
Iloczyn bitowy
(Logical AND)
&
Rnica symetryczna
(Logical XOR)
^
Suma bitow
(Logical OR)
|
Koniunkcja
(Conditional AND)
&&
Alternatywa
(Conditional OR)
||
Wyraenie warunkowe ? :
Operatory przypisania =, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=

Nasuwa si pytanie, co bdzie, jeeli w wyraeniu wystpuj operatory o tym samym priorytecie.
Kolejno dziaa w takim wypadku jest ustawiana na podstawie waciwoci zwanej cznoci
operatorw. Rozwamy nastpujcy przykad:
double x = 10, y = 5, z = 2;
double a = x - y - z;
Do zmiennej a zostanie podstawiona warto 3, poniewa najpierw zostanie wykonane
odejmowanie x-y, a nastpnie od powyszego wyniku odjta zostanie warto z. Dziaania s
wykonywane od lewej do prawej strony. O tak dziaajcych operatorach mwi si, e s
lewostronnie czne.
Rozwamy teraz inny przykad:
double x = 10, y = 5, z = 2;
double a = x = y = z;
Wszystkie zmienna x, y, z, a, po wykonaniu tego kodu bd miay warto 2, poniewa przypisanie
jest wykonywane od prawej do lewej strony. Czyli najpierw zostanie wykonane y = z, gdzie
wartoci tego wyraenia jest warto stojca po prawej stronie znaku rwnoci. Warto
Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 23/28
wyraenia y = z, czyli w tym przypadku 2, zostanie nastpnie przypisana do x. O tak dziaajcych
operatorach mwi si, e s prawostronnie czne.
Do operatorw prawostronnie cznych nale wszystkie operatory jednoargumentowe, operatory
przypisania oraz wyraenie warunkowe ( ? :).
Natomiast do operatorw lewostronnie cznych nale wszystkie operatory dwuargumentowe
poza operatorami przypisania.
Typ argumentw stojcych obok operatora wpywa na jego znaczenie. I tak operator +, gdy stoj
obok niego wartoci numeryczne oznacza dodawanie, natomiast w przypadku, gdy stoj zmienne
typu string, oznacza czenie napisw (konkatenacj).
W przypadku operatorw dziaajcych na typach numerycznych naley zwrci uwag na proces
zwany promocj typw.
W przypadku operatorw jednoargumentowych: +, -, ~, gdy ich argumentem jest zmienna typu
sbyte lub byte lub short lub ushort lub char, automatycznie jej typ jest konwertowany do typu int.
Dodatkowo dla operatora - zmienna typu uint jest konwertowana do typu long. Wobec powyszego
poniszy kod spowoduje bd kompilator, niedozwolonej konwersji niejawnej.
short x = 10;
short y = +x;
W przypadku natomiast operatorw dwuargumentowych: +, , *, /, %, &, |, ^, ==,
!=, >, <, >=, <= regu promocji mona poda w nastpujcych punktach, ktrych kolejno
ma znaczenie:
1. Jeeli jeden argument jest typu decimal, drugi argument jest konwertowany do typu
decimal, albo jest generowany bad kompilacji gdy konwersja niejawna jest niedozwolona
(drugi argument jest typu double lub float).
2. W przeciwnym wypadku, jeeli jeden argument jest typu double drugi argument jest
konwertowany do typu double.
3. W przeciwnym wypadku, jeeli jedne argument jest typu float drugi argument jest
konwertowany do typu float.
4. W przeciwnym wypadku, jeeli jeden argument jest typu ulong drugi argument jest
konwertowany do typu ulong, albo jest generowany bd kompilacji gdy drugim
argumentem jest liczba ze znakiem (sbyte, short, int, long).
5. W przeciwnym wypadku, jeeli jeden argument jest typu long drugi argument jest
konwertowany do typu long.
6. W przeciwnym wypadku, jeeli jeden argument jest typu uint drugi argument jest typu
sbyte, short lub int oba argumenty konwertowane s do typu long.
7. W przeciwnym wypadku, jeeli jeden argument jest typu uint drugi argument jest
konwertowany do typu uint.
8. W przeciwnym wypadku, oba argumenty konwertowane s do typu int.
Wobec powyszego poniszy kod spowoduje bd kompilator, niedozwolonej konwersji niejawnej:
short x = 10, y = 10;
short z = x + y;
Przykadowe rozwizanie
Pobieranie danych od uytkownika
W celu zademonstrowania wprowadzania i wypisywania wartoci zmiennych napisz program
obliczajcy sum dwch liczb rzeczywistych. Gotowy program jest dostpny w katalogu
Kurs\Demo\Modul2\Modul2.sln projekt Dodawanie, gdzie Kurs jest katalogiem gdzie skopiowano
pliki kursu.
Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 24/28
9. Uruchom Visual Studio
10. Utwrz aplikacj konsolow o nazwie: Dodawanie
11. W metodzie Main napisz nastpujcy kod:
static void Main(string[] args) {
double x, y, suma;
Console.Write("Podaj x: ");
x = Convert.ToDouble(Console.ReadLine());
Console.Write("Podaj y: ");
y = Convert.ToDouble(Console.ReadLine());
suma = x + y;
Console.WriteLine("{0}+{1}={2}", x, y, suma);
Console.ReadKey();
}
12. Zbuduj i uruchom program.
13. Jako warto zmiennej x wprowad:
2.5 <ENTER>
14. Prawdopodobnie program zosta przerwany. Zosta zgoszony wyjtek. Spowodowane jest to
tym, e metody klasy Convert przy zamianie wykorzystuj domylnie informacje o
formatowaniu liczb, dat, godziny, znaku symbolu dziesitnego itp. z ustawie systemu (Panel
Sterowania, Opcje regionalne i jzykowe). W przypadku, gdy wszystkie formaty ustawione s
dla Polski, symbolem dziesitnym jest przecinek.
Uwaga: Tak naprawd ustawienia regionalne (formatowanie liczb, daty) zawarte s we
waciwociach biecego wtku (Thread.CurrentThread.CurrentCulture) i mona je
modyfikowa w programie, czyli mog by niezalene od ustawie systemowych.
15. Z menu Debug wybierz pozycj Stop Debugging.
16. Uruchom program ponownie i wprowad wartoci zmiennych w odpowiednim formacie.

Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 25/28
Laboratorium podstawowe
Problem 1 (czas realizacji 5 minut)
Utworzenie programu, ktry zamienia (wymienia) wartoci dwch zmiennych. Algorytm ten po
angielsku nosi nazw Swap (zamiana). Jest to jeden z podstawowych algorytmw uywany do
budowy bardziej skomplikowanych programw.

Zadanie Tok postpowania
1. Utwrz nowy
projekt w Visual C#
2008 Express
Edition
Otwrz Visual C# 2008 Express Edition.
Z menu wybierz File -> New Project.
Z listy Visual Studio installed templates wybierz Console Application.
W polu Name wpisz Zamiana.
Kliknij OK.
Z menu wybierz File -> Zamiana.
W polu Location wybierz folder w ktrym bdzie zapisany projekt.
Zaznacz pole wyboru Create directory for solution.
W polu Solution Name wpisz Modul02.
Nacinij przycisk Save.
2. Wewntrz
metody Main
zaimplementuj
odpowiedni kod
Zadeklaruj trzy zmienne rzeczywiste a, b, tmp. Zmienna a i b s to te
zmienne, midzy ktrymi bdziemy wymienia wartoci, zmienna tmp
jest zmienn pomocnicz:
double a, b, tmp;
Pobierz od uytkownika wartoci zmiennych a i b.
Console.Write("Podaj warto zmiennej a: ");
a = Convert.ToDouble(Console.ReadLine());
Console.Write("Podaj warto zmiennej b: ");
b = Convert.ToDouble(Console.ReadLine());
Wymie wartoci zmiennych a i b, przy pomocy zmiennej tmp.
tmp = a;
a = b;
b = tmp;
Wypisz wartoci zmiennych po wymianie, a nastpnie zatrzymaj dziaanie
programu.
Console.WriteLine("a = {0}, b = {1}", a, b);
Console.ReadKey();
3. Skompiluj, a
nastpnie uruchom
program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu, z menu Debug wybierz Start Debugging.

Problem 2 (czas realizacji 10 minut)
Utworzenie programu, ktry oblicza warto wyraenia:



) 1 ( 3
4
2
+

=
z
y x
v
Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 26/28
Zadanie Tok postpowania
1. Do biecego
rozwizania dodaj
nowy projekt
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy rozwizanie, a nastpnie z menu kontekstowego wybierz
Add -> New Project.
W oknie dialogowym Add New Project z listy Visual Studio installed
templates wybierz Console Application.
W polu Name wpisz Wyrazenie.
Kliknij OK.
2. Zaznacz projekt
Wyrazenie jako
projekt startowy
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy projekt Wyrazenie, a nastpnie z menu kontekstowego
wybierz Set as StartUp Project.
3. Wewntrz
metody Main
zaimplementuj
odpowiedni kod
Zadeklaruj cztery zmienne rzeczywiste x, y, z, v.
double x,y,z,v;
Pobierz od uytkownika wartoci zmiennych x, y i z:
Console.Write("Podaj warto zmiennej x: ");
x = Convert.ToDouble(Console.ReadLine());
Console.Write("Podaj warto zmiennej y: ");
y = Convert.ToDouble(Console.ReadLine());
Console.Write("Podaj warto zmiennej z: ");
z = Convert.ToDouble(Console.ReadLine());
Napisz zadany wzr z uyciem operatorw jzyka C#, warto
utworzonego wyraenia wstaw do zmiennej v.
v = (4*x-y) / (3*(z*z+1));
Wypisz wartoci obliczonego wyraenia, a nastpnie zatrzymaj dziaanie
programu:
Console.WriteLine("Warto wyraenia wynosi: {0}.", v);
Console.ReadKey();
4. Skompiluj i
uruchom program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu z menu Debug wybierz Start Debugging.
Problem 3 (czas realizacji 10 minut)
Program obliczajcy pole i obwd koa o zadanym promieniu.
Zadanie Tok postpowania
1. Do biecego
rozwizania dodaj
nowy projekt
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy rozwizanie, a nastpnie z menu kontekstowego wybierz
Add -> New Project.
W oknie dialogowym Add New Project z listy Visual Studio installed
templates wybierz Console Application.
W polu Name wpisz Kolo.
Kliknij OK.
2. Zaznacz projekt
Kolo jako projekt
startowy
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy projekt Kolo, a nastpnie z menu kontekstowego wybierz
Set as StartUp Project.
3. Wewntrz
metody Main
Zadeklaruj zmienn rzeczywist r.
Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 27/28
zaimplementuj
odpowiedni kod
double r;
Pobierz od uytkownika dugo promienia:
Console.Write("Podaj dugo promienia: ");
r = Convert.ToDouble(Console.ReadLine());
Zadeklaruj zmienne pole oraz obwod i odpowiednio je zainicjalizuj. We
wzorach na obwd i pole skorzystaj ze staej Math.PI.
double pole = Math.PI * r * r;
double obwod = 2 * Math.PI * r;
Wypisz obliczone wartoci pola i obwodu koa z dokadnoci do trzech
miejsc po przecinku, a nastpnie zatrzymaj dziaanie programu:
Console.WriteLine("Pole koa o promieniu {0} wynosi: {1:f3}.",
r, pole);
Console.WriteLine("Obwd koa o promieniu {0} wynosi: {1:f3}.",
r, obwod);
Console.ReadKey();
4. Skompiluj i
uruchom program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu z menu Debug wybierz Start Debugging.
Problem 4 (czas realizacji 10 minut)
Program obliczajcy cen brutto oraz podatek od podanej ceny netto.
Zadanie Tok postpowania
1. Do biecego
rozwizania dodaj
nowy projekt
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy rozwizanie, a nastpnie z menu kontekstowego wybierz
Add -> New Project.
W oknie dialogowym Add New Project z listy Visual Studio installed
templates wybierz Console Application.
W polu Name wpisz Podatek.
Kliknij OK.
2. Zaznacz projekt
Podatek jako
projekt startowy
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy projekt Podatek, a nastpnie z menu kontekstowego
wybierz Set as StartUp Project.
3. Wewntrz
metody Main
zaimplementuj
odpowiedni kod
Zadeklaruj sta symboliczn rzeczywist o duej precyzji o nazwie Vat i
nadaj jej warto 0,22.
const decimal Vat = 0.22M;
Zadeklaruj zmienn rzeczywist o duej precyzji netto.
decimal netto;
Pobierz od uytkownika cen netto:
Console.Write("Podaj cen netto: ");
netto = Convert.ToDecimal(Console.ReadLine());
Zadeklaruj zmienne podatek oraz brutto i odpowiednio je zainicjalizuj.
decimal podatek = Vat * netto;
decimal brutto = netto + podatek;
Wypisz obliczone wartoci podatku i ceny brutto, dodajc symbol waluty,
a nastpnie zatrzymaj dziaanie programu:
Micha Wodarczyk Modu 02
ITA-104 Wprowadzenie do programowania Uycie zmiennych
Strona 28/28
Console.WriteLine("Cena wynosi {0:C}, w tym kwota podatku: {1:C}.",
brutto, podatek);
Console.ReadKey();
4. Skompiluj i
uruchom program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu z menu Debug wybierz Start Debugging.
Problem 5 (czas realizacji 10 minut)
Program wyznaczajcy maksimum z dwch liczb cakowitych przy pomocy wyraenia
warunkowego..
Zadanie Tok postpowania
1. Do biecego
rozwizania dodaj
nowy projekt
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy rozwizanie, a nastpnie z menu kontekstowego wybierz
Add -> New Project.
W oknie dialogowym Add New Project z listy Visual Studio installed
templates wybierz Console Application.
W polu Name wpisz Maksimum.
Kliknij OK.
2. Zaznacz projekt
Maksimum jako
projekt startowy
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy projekt Maksimum, a nastpnie z menu kontekstowego
wybierz Set as StartUp Project.
3. Wewntrz
metody Main
zaimplementuj
odpowiedni kod
Zadeklaruj zmienne cakowite: a, b, max.
int a, b, max;
Pobierz od uytkownika wartoci zmiennych a i b:
Console.Write("Podaj pierwsz warto: ");
a = Convert.ToInt32(Console.ReadLine());
Console.Write("Podaj drug warto: ");
b = Convert.ToInt32(Console.ReadLine());
Wyznacz warto maksymaln z liczb a i b:
max = a > b ? a : b;
Wypisz obliczon warto maksymaln, a nastpnie zatrzymaj dziaanie
programu:
Console.WriteLine("Warto maksymalna wynosi: {0}.", max);
Console.ReadKey();
4. Skompiluj i
uruchom program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu z menu Debug wybierz Start Debugging.

ITA-104 Wprowadzenie do programowania
Micha Wodarczyk
Modu 3
Wersja 2
Instrukcja wyboru if...else. Obsuga
wyjtkw
Spis treci
Instrukcja wyboru if...else. Obsuga wyjtkw .................................................................................... 1
Informacje o module ............................................................................................................................ 2
Przygotowanie teoretyczne ................................................................................................................. 3
Podstawy teoretyczne.................................................................................................................. 3
Przykadowe rozwizanie ............................................................................................................. 9
Laboratorium podstawowe ................................................................................................................ 11
Problem 1 (czas realizacji 30 minut) .......................................................................................... 11
Problem 2 (czas realizacji 15 minut) .......................................................................................... 12

Micha Wodarczyk Modu 03
ITA-104 Wprowadzenie do programowania Instrukcja wyboru if...else. Obsuga wyjtkw
Strona 2/13
Informacje o module
Opis moduu
W tym module zostan zaprezentowane informacje dotyczce instrukcji
wyboru if...else. Dodatkowo zostanie przedstawiony problem wyjtkw
(predefiniowane wyjtki, przechwytywanie i zgaszanie wyjtku).
Cel moduu
Celem moduu jest pokazanie instrukcji wyboru if...else. oraz
wprowadzenie do problemu wyjtkw.
Uzyskane kompetencje
Po zrealizowaniu moduu bdziesz:
rozumie dziaanie instrukcji if...else i potrafi j uywa
zna predefiniowane wyjtki
umie przechwyci zgaszany wyjtek
umie zgosi wyjtek
Wymagania wstpne
Przed przystpieniem do pracy z tym moduem powiniene:
potrafi korzysta ze rodowiska Visual Studio
zna struktur programu w jzyku C#
umie definiowa zmienne
zna operatory i potrafi definiowa wyraenia
Mapa zalenoci moduu
Zgodnie z map zalenoci przedstawion na rys. 1, przed przystpieniem
do realizacji tego moduu naley zapozna si z materiaem zawartym
w moduach: Wstp, Uycie zmiennych.

Rys. 1 Mapa zalenoci moduu

Micha Wodarczyk Modu 03
ITA-104 Wprowadzenie do programowania Instrukcja wyboru if...else. Obsuga wyjtkw
Strona 3/13
Przygotowanie teoretyczne
Podstawy teoretyczne
Instrukcja warunkowa if moe mie dwie formy:
if(warunek)
instr1;
lub
if(warunek)
instr1;
else
instr2;
W przypadku pierwszym dziaanie instrukcji if jest nastpujce. Jeeli warunek ma warto true,
wtedy instrukcja instr1 jest wykonywana. Natomiast, gdy warunek ma warto false, instrukcja
instr1 jest pomijana.
W przypadku drugim, gdy warunek ma warto true, wtedy instrukcja instr1 jest wykonywana,
ale instrukcja instr2 jest pomijana. Natomiast, gdy warunek ma warto false, instrukcja
instr1 jest pomijana, ale jest wykonywana instrukcja instr2.
Wcicia uyte w powyszym kodzie oczywicie s opcjonalne, ale bardzo zwikszaj czytelno
kodu. Pokazuj zalenoci.
Czstym bdem popenianym przez pocztkujcych programistw jest postawienie rednika tu za
nawisem "zamykajcym" warunek.
if(warunek) ;
instr1;
Nie jest to bd skadni, wic kompilator nie zgosi bdu, chocia zgosi ostrzeenie. W kodzie
powyszym (ze rednikiem "po if") instrukcja instr1 bdzie wykonywana zawsze, bez wzgldu na
warto wyraenia warunek. Od wartoci wyraenia warunek zaley tylko tzw. instrukcja pusta.
Zazwyczaj chodzi o wykonanie warunkowe nie pojedynczej instrukcji, ale caego cigu instrukcji.
Musimy umieci wtedy wszystkie instrukcje w bloku instrukcji (bloku kodu).
if(warunek)
{
instrT1;
...
instrTn
}
else
{
instrN1;
...
instrNn;
}
Stosowanie nawiasw klamrowych (bloku kodu) jest dozwolone rwnie w przypadku, gdy od
wartoci wyraenia warunek zaley wykonanie pojedynczej instrukcji. Zwiksza to czytelno kodu i
pozwala unikn szeregu bdw.
Wyraenie warunek musi mie warto logiczn, true lub false. Nie moe by to. warto
numeryczna, jak w jzyku C/C++.
W wyraeniu warunek stosujemy czsto operatory relacyjne i porwnania w poczeniu z
operatorami logicznymi, np:
Micha Wodarczyk Modu 03
ITA-104 Wprowadzenie do programowania Instrukcja wyboru if...else. Obsuga wyjtkw
Strona 4/13
...
if(x > 10 && x < 100)
{
Console.WriteLine("x naley do przedziau (0; 100).");
}
w powyszym kodzie sprawdzamy czy x naley do przedziau (0; 100), czyli czy 10<x<100.
Wyraenie 10<x<100 w jzyku C# powoduje bd kompilacji.
Poniszy kod natomiast sprawdza czy x naley do sumy przedziaw:
...
if(x < 10 || x > 100)
{
Console.WriteLine("x jest mniejsz od 10 lub wiksze od 100");
}
Instrukcja if moe by umieszczona zarwno w bloku kodu "tu po if" jak i w bloku kodu po else.
if(warunek1)
{
...
if(warunek2)
{
...
}
...
}
else
{
...
if(warunek3)
{
...
}
...
}
Stosowanie pojedynczej konstrukcji if ... else daje moliwo dwuwariantowego wyboru.
Stosujc jednak zagniedon instrukcj if w bloku else mona uzyska moliwo
wielowariantowego wyboru.
if(warunek1) instrukacja1;
else
if(warunek2) instrukcja2;
else if(warunek3) instrukcja3;
else if(warunek4) instrukcja4;
else instrukcja5;
W powyszym kodzie bdzie wykonana albo instrukcja1 albo instrukcja2 albo
instrukcja3 albo instrukcja4 albo instrukcja5. instrukcja5 bdzie wykonana tylko
wtedy, gdy aden warunek nie bdzie prawdziwy (kady bdzie mia warto false).
Stosujc zagniedenie warto zwrci uwag, e instrukcja else skojarzona jest z najblisz
instrukcj if. Rozwamy nastpujcy przykad:
if(warunek1)
if(warunek2)
instrukcja1;
else
instrukcja2;
Micha Wodarczyk
ITA-104 Wprowadzenie do programowania
W powyszym kodzie ukad graficzny (wcicia) sugeruj, e instrukcja
instrukcj if(warunek1), ale naprawd jest skojarzona z instrukcj
ukad graficzny odzwierciedla rzeczy
if(warunek1)
if(warunek2)
instrukcja1;
else
instrukcja2;
Jeeli jednak instrukcja else powinna by powizana z pierwsz instrukcj if kod powinie wyglda
nastpujco:
if(warunek1)
{
if(warunek2)
instrukcja1;
}
else
instrukcja2;
Wyjtki
Zanim przejdziemy do omawiania implementacji wyjtkw w jzyku C#, warto wspomnie, e du
zalet .Net Framework jest standaryzacja obsugi wyjtkw w wielu jzykach. Wyjtek zgoszony w
kodzie napisanym w jzyku C# moe zosta obsuony w kodzie napisany
na odwrt.
Mechanizm obsugi wyjtkw powsta w celu rozwizania nastpujcego problemu: W pewnym
miejscu programu wykrywamy bd, pewn niezgodno z oczekiwaniami. Nie wiemy jednak jak
wykryty bd poprawi w miejscu jego znale
szukamy miejsca w programie, gdzie jest podane jak z danym bdem sobie poradzi. W przypadku
gdy w programie nie ma przepisu jak z danym bdem sobie poradzi lub jest on w nieodpowiednim
miejscu, program zostaje zamknity i na ekranie pojawia si okno dialogowe z komunikatem
opisujcym przyczyny zakoczenia programu.
W celu demonstracji zgoszenia wyjtku mona wykorzysta projekt Dzielenie, ktry jest czci
rozwizania Kurs\Demo\Modul3
kursu. W celu wymuszenia zgoszenia wyjtku jako warto dzielnika naley poda 0 (zero).
Wyjtki w jzyku C# reprezentowane s przez obiekty
mamy pewn hierarchi, jak two
ogln. Wyjtek bardziej oglny moe reprezentowa wszystkie wyjtki, ktre go uszczegawiaj.

Wprowadzenie do programowania Instrukcja wyboru if...else. Obsuga wyjtkw
Strona 5/13
W powyszym kodzie ukad graficzny (wcicia) sugeruj, e instrukcja
, ale naprawd jest skojarzona z instrukcj if(warunek2)
ukad graficzny odzwierciedla rzeczywiste zalenoci w kodzie, naleaoby go zapisa:
instrukcja1;
instrukcja2;
Jeeli jednak instrukcja else powinna by powizana z pierwsz instrukcj if kod powinie wyglda
instrukcja1;
Zanim przejdziemy do omawiania implementacji wyjtkw w jzyku C#, warto wspomnie, e du
zalet .Net Framework jest standaryzacja obsugi wyjtkw w wielu jzykach. Wyjtek zgoszony w
kodzie napisanym w jzyku C# moe zosta obsuony w kodzie napisanym w jzyku Visual Basic i
Mechanizm obsugi wyjtkw powsta w celu rozwizania nastpujcego problemu: W pewnym
miejscu programu wykrywamy bd, pewn niezgodno z oczekiwaniami. Nie wiemy jednak jak
wykryty bd poprawi w miejscu jego znalezienia. Przerywamy wic wykonywanie programu i
szukamy miejsca w programie, gdzie jest podane jak z danym bdem sobie poradzi. W przypadku
gdy w programie nie ma przepisu jak z danym bdem sobie poradzi lub jest on w nieodpowiednim
taje zamknity i na ekranie pojawia si okno dialogowe z komunikatem
opisujcym przyczyny zakoczenia programu.
W celu demonstracji zgoszenia wyjtku mona wykorzysta projekt Dzielenie, ktry jest czci
Modul3\Modul3.sln, gdzie Kurs jest katalogiem gdzie skopiowano pliki
kursu. W celu wymuszenia zgoszenia wyjtku jako warto dzielnika naley poda 0 (zero).
Wyjtki w jzyku C# reprezentowane s przez obiekty - typy referencyjne. Na rysunku pokazan
mamy pewn hierarchi, jak tworz klasy wyjtkw. Strzaka pokazuje klas wyjtku bardziej
ogln. Wyjtek bardziej oglny moe reprezentowa wszystkie wyjtki, ktre go uszczegawiaj.
Modu 03
Instrukcja wyboru if...else. Obsuga wyjtkw
W powyszym kodzie ukad graficzny (wcicia) sugeruj, e instrukcja else jest zwizana z
if(warunek2), czyli aby
wiste zalenoci w kodzie, naleaoby go zapisa:
Jeeli jednak instrukcja else powinna by powizana z pierwsz instrukcj if kod powinie wyglda
Zanim przejdziemy do omawiania implementacji wyjtkw w jzyku C#, warto wspomnie, e du
zalet .Net Framework jest standaryzacja obsugi wyjtkw w wielu jzykach. Wyjtek zgoszony w
m w jzyku Visual Basic i
Mechanizm obsugi wyjtkw powsta w celu rozwizania nastpujcego problemu: W pewnym
miejscu programu wykrywamy bd, pewn niezgodno z oczekiwaniami. Nie wiemy jednak jak
zienia. Przerywamy wic wykonywanie programu i
szukamy miejsca w programie, gdzie jest podane jak z danym bdem sobie poradzi. W przypadku
gdy w programie nie ma przepisu jak z danym bdem sobie poradzi lub jest on w nieodpowiednim
taje zamknity i na ekranie pojawia si okno dialogowe z komunikatem
W celu demonstracji zgoszenia wyjtku mona wykorzysta projekt Dzielenie, ktry jest czci
jest katalogiem gdzie skopiowano pliki
kursu. W celu wymuszenia zgoszenia wyjtku jako warto dzielnika naley poda 0 (zero).
typy referencyjne. Na rysunku pokazan
rz klasy wyjtkw. Strzaka pokazuje klas wyjtku bardziej
ogln. Wyjtek bardziej oglny moe reprezentowa wszystkie wyjtki, ktre go uszczegawiaj.

Micha Wodarczyk Modu 03
ITA-104 Wprowadzenie do programowania Instrukcja wyboru if...else. Obsuga wyjtkw
Strona 6/13
Klasa Exception jest najbardziej ogln klas wyjtku i moe reprezentowa wszystkie wyjtki.
Klasa ApplicationException reprezentuje wszystkie wyjtki specyficzne dla danej aplikacji.
Definicja specyficznych wyjtkw, czyli wasnych, jest poza zakresem tego kursu.
Klasa SystemException jest klas ogln dla pewnej czci predefiniowanych wyjtkw np.:
ArithmeticException - jest zgaszany w razie wystpienia bdu podczas operacji
arytmetycznych lub konwersji. Moe by spowodowany np.: przez dzielenie przez zero w
dzieleniu liczb cakowitych (DivideByZeroException), w przypadku wystpienia
nadmiaru (OverflowException) - patrz temat konwersje i operator checked w
poprzednim rozdziale.
FormatException - jest zgaszany np. przez metody klasy Convert, gdy podany napis nie
reprezentuje wartoci, do ktrej chcemy go przekonwertowa.
NullReferenceException - jest zgaszany, kiedy uywana jest zmienna referencyjna,
ktra ma warto null.
OutOfMemoryException - jest zgaszany, kiedy wystpuje niewystarczajca ilo pamici,
np. gdy prbujemy utworzy niwy obiekt przy pomocy operatora new.
IndexOutOfRangeException - jest zgaszany, gdy nastpuje odwoanie do nieistniejcego
elementu tablicy. Tablice s opisane w rozdziale szstym tego kursu.
ArgumentException - jest zgaszany w przypadku, kiedy jeden z argumentw
dostarczanych do metody jest nieprawidowy Moe by to spowodowane np. przesaniem
wartoci null zamiast odwoania do konkretnego obiektu (ArgumentNullException) lub
przesaniem wartoci spoza dopuszczalnego zakresu (ArgumentOutOfRangeException).
Wicej na temat przesyania argumentw do metody mona znale w rozdziale dziewitym
tego kursu.
Wicej klas reprezentujcych wyjtki mona znale w MSDN LiIbrary pod tematem "Exception
Hierarchy".
Uwaga: Na temat tworzenia hierarchii klas, czyli pojcie dziedziczenie, opisane jest dokadnie w
kursie "Programowanie obiektowe".
W przypadku, gdy pewien fragment kodu moe powodowa zgoszenie wyjtku, a my chcemy go
obsuy, czyli wiemy jak z danym bdem sobie poradzi, umieszczamy dany fragment kodu w
bloku try. Moemy powiedzie, e kod jest pilnowany lub prbowany na wystpienie
ewentualnych bdw. Z kadym blokiem try musi by zwizany, co najmniej jeden blok catch
lub finally. O bloku finally bdzie mwione w dalszej czci tego rozdziau. W po sowie
catch w nawiasach okrgych podajemy typ wyjtku, ktry chcemy obsuy. W bloku kodu
instrukcji catch podajemy kod obsugi wyjtku.
try
{
//kod "pilnowany"
}
catch(TypWyjatku ex)
{
//kod obsugi wyjtku
}
Identyfikator ex jest uchwytem do zgoszonego obiektu wyjtku.
Jeeli podczas wykonywania kodu pilnowanego nie zostanie zgoszony aden wyjtek, to instrukcje
bloku catch (kod obsugi wyjtku) zostaj pominite. W przypadku, gdy podczas wykonywania
kodu pilnowanego zostanie zgoszony wyjtek typu takiego samego, jak ktry jest podany w
instrukcji catch lub typu, dla ktrego typ podany w instrukcji catch jest typem oglnym
(bazowym), wtedy wykonanie kodu pilnowanego zostaje przerwane i przechodzimy do
Micha Wodarczyk Modu 03
ITA-104 Wprowadzenie do programowania Instrukcja wyboru if...else. Obsuga wyjtkw
Strona 7/13
wykonywania kodu obsugi wyjtku. Pami zarezerwowana dla wszystkich zmiennych
zadeklarowanych w bloku try zostaje zwolniona, czyli zmienne lokalne zadeklarowane w bloku try
zostaj zniszczone. Po wykonaniu wszystkich instrukcji kodu obsugi wyjtku program przechodzi
do wykonania instrukcji znajdujcych si za blokiem catch, oczywicie pod warunkiem, e w
kodzie obsugi wyjtku nie zosta zgoszony aden wyjtek.
W przypadku, gdy typ zgoszonego wyjtku jest niezgodny z typem wyjtku podanym w instrukcji
catch, nastpuje prba znalezienia zewntrznego bloku try, w ktrym omawiany wczeniej bloki
try oraz catch s zawarte. Jeeli taki zewntrzny blok zostanie znaleziony, sprawdzane jest, czy
typ podany w instrukcji catch zwizanej z zewntrznym blokiem try, jest zgodny z typem
zgoszonego wyjtku. Jeeli typ jest zgodny, program przechodzi do wykonania kodu obsugi
wyjtku (oczywicie tego zewntrznego), w przeciwnym razie szukamy kolejnego zewntrznego
bloku try. Poszukiwania zewntrznego bloku try trwaj a do napotkania koca metody Main.
Jeeli nie zostanie znaleziony blok try, z ktrym skojarzona jest instrukcja catch z odpowiednim
typem wyjtku, program zostaje przerwany i zostaje wywietlony odpowiedni komunikat o
kopotach z danym programem.
Jeeli chcemy przechwyci wszystkie zgoszone wyjtki w danym bloku try, w instrukcji catch nie
podajemy typu wyjtku:
try
{
...
}
catch
{
...
}
Rozwizanie to uniemoliwia jednak uzyskanie dostpu do obiektu wyjtku, ktry moe zawiera
wane informacje na temat bdu. W celu przychwycenia wszystkich wyjtkw oraz uzyskania
dostpu do informacji o bdzie, wyjtki naley obsugiwa w nastpujcy sposb:
try
{
...
}
catch(System.Exception ex)
{
...
}
Z pojedynczym blokiem try moe by skojarzonych wicej blokw catch. Zgoszony wyjtek moe
by obsuony przez pojedynczy blok cache. Wyjtek zostanie obsuony przez ten pierwszy blok
cache, ktrego typ jest zgodny z typem zgoszonego wyjtku. Ze wzgldu na powysze,
niedozwolone jest umieszczanie bloku catch z typem wyjtku oglnym, przed blokiem catch z
typem wyjtku bardziej szczegowym, poniewa kod obsugi wyjtku szczegowego nigdy nie
zostaby wykonany.
Czsto si zdarza, e chcemy wykona pewne instrukcje bez wzgldu na to, czy nie byo
zgoszonego wyjtku, czy wyjtek by zgoszony i zosta obsuony lub czy zosta zgoszony i
nieprzechwycony.
Instrukcje, ktre musz by zawsze wykonane na zakoczenie bloku try umieszczamy wewntrz
bloku finally. Blok finally moe wystpi tu za blokiem try, gdy z blokiem try nie ma
zwizanego adnego bloku catch albo po wszystkich blokach catch skojarzonych z danym
blokiem try.
Micha Wodarczyk Modu 03
ITA-104 Wprowadzenie do programowania Instrukcja wyboru if...else. Obsuga wyjtkw
Strona 8/13
try
{
...
}
catch(Exception ex)
{
...
}
finally
{
...
}
Wyjtek moemy zgosi samodzielnie. Suy do tego instrukcja throw:
throw new TypWyjatku();
Z wyjtkiem moemy skojarzy rwnie pewien komunikat, informujcy o rdach bdu.
Dokonujemy to w nastpujcy sposb:
throw new TypWyjatku("Tre komunikatu");
Jak skorzysta z komunikatu, pokazane zostanie w przykadzie poniej:
double dzielnik, iloraz;
try
{
dzielnik = Convert.ToDouble(Console.ReadLine());
if(dzielnik == 0)
throw new DivideByZeroException("Dzielnik nie moe mie warto" +
"zero!!!");
iloraz = 10.2 / dzielnik;
Console.WriteLine(iloraz);
}
catch (DivideByZeroException ex)
{
Console.WriteLine("Komunikat wyjatku: {0}", ex.Message);
}
Wewntrz bloku catch mona ponownie zgosi wyjtek, ktry jest wanie obsugiwany. W ten
sposb bdzie go mona obsuy w bloku catch skojarzonym z zewntrznym blokiem try.
Ponowne zgoszenie wyjtku odbywa si przy pomocy samego sowa throw.
try
{
...
}
catch(Exception ex)
{
...
throw ; //ponowne zgoszenie wyjtku
}


Micha Wodarczyk Modu 03
ITA-104 Wprowadzenie do programowania Instrukcja wyboru if...else. Obsuga wyjtkw
Strona 9/13
Przykadowe rozwizanie
Sprawdzenie czy punkt naley do koa?
1. Uruchom Visual Studio. Otwrz projekt CzyWKole. Projekt ten jest czci rozwizania
Kurs\Demo\Modul3\Modul3.sln, gdzie Kurs jest katalogiem gdzie skopiowano pliki kursu.

















2. Skompiluj i uruchom program. Jako wsprzdne punktu podaj wartoci x = 2 i y = 2. Jest to
punkt P1. Na ekranie pojawi si napis:
Punkt naley do koa
3. Uruchom program po raz drugi. Tym razem podaj nastpujce wartoci x = 5, y = 2 - punkt
P2. Na ekranie pojawi si napis:
Punkt nie naley do koa
4. W programie jest uyta metoda Sqrt kasy Math. Oblicza ona pierwiastek kwadratowy np.:
double x = Math.Sqrt(4);
5. Powysza linijka spowoduje obliczenie pierwiastka kwadratowego z czterech i nastpnie
podstawienie obliczonej wartoci do zmiennej x.. Czyli x bdzie miao warto dwa.
6. W programie wystpuje linijka:
double odleglosc = Math.Sqrt((x - SrodekX) * (x - SrodekX) +
(y - SrodekY) *( y - SrodekY));
ktr mona "matematycznie" zapisa
7. Zmienna odlegosc bdzie zawiera odlego punktu o wsprzdnych podanych przez
uytkownika od rodka koa.
Sprawdzenie dziaania bloku finally
Uruchom Visual Studio. Otwrz projekt Finally. Projekt ten jest czci rozwizania
Kurs\Demo\Modul3\Modul3.sln, gdzie Kurs jest katalogiem gdzie skopiowano pliki kursu.
Skompiluj i uruchom program.
Przy pierwszym uruchomieniu jako warto dzielnika podaj 5.
2 2
) ( ) ( SrodekY y SrodexX x odleglosc + =
P2
P1
1
Micha Wodarczyk Modu 03
ITA-104 Wprowadzenie do programowania Instrukcja wyboru if...else. Obsuga wyjtkw
Strona 10/13
Zwr uwag, e aden wyjtek nie zosta zgoszony. Instrukcja bloku finally zostaa wykonana.
Zakocz program.
Uruchom program ponownie. Jako warto dzielnika podaj qwerty. Podanie takiej wartoci
spowoduje zgoszenie wyjtku FormatException. Zwr uwag, e zosta przechwycony wyjtek
i instrukcja bloku finally zostaa wykonana. Zakocz program.
Uruchom program ponownie. Jako warto dzielnika podaj 0. Podanie takiej wartoci spowoduje
zgoszenie wyjtku DivideByZeroException. Zwr uwag, e wyjtek nie zosta przechwycony,
ale instrukcja bloku finally zostaa wykonana. Zakocz program.

Micha Wodarczyk Modu 03
ITA-104 Wprowadzenie do programowania Instrukcja wyboru if...else. Obsuga wyjtkw
Strona 11/13
Laboratorium podstawowe
Problem 1 (czas realizacji 30 minut)
Utwrz programu, ktry obliczy pierwiastki rwnania kwadratowego:
ax2+bx+c=0.

Zadanie Tok postpowania
1. Utwrz nowy
projekt w Visual C#
2008 Express
Edition
Otwrz Visual C# 2008 Express Edition.
Z menu wybierz File -> New Project.
Z listy Visual Studio installed templates wybierz Console Application.
W polu Name wpisz Delta.
Kliknij OK.
Z menu wybierz File -> Delta.
W polu Location wybierz folder w ktrym bdzie zapisany projekt.
Zaznacz pole wyboru Create directory for solution.
W polu Solution Name wpisz Modul03.
Nacinij przycisk Save.
2. Wewntrz
metody Main
zaimplementuj
odpowiedni kod
Zadeklaruj nastpujce zmienne rzeczywiste a, b, c, x1, x2, delta.
Zmienna a, b, s parametrami rwnania kwadratowego, w zmiennych x1,
x2 bdziemy przechowywa wartoci pierwiastkw, zmienna delta jest
zmienn pomocnicz:
double a, b, c, x1, x2, delta;
Ustaw blok try..catch. W bloku catch przechwy wszystkie wyjtki i
wypisz wiadomo zwizan z zgoszonym wyjtkiem:
try
{
...
}
catch(Exception ex)
{
Console.WriteLine("Program zosta przerwany.{0}", ex.Message);
}
Po bloku catch zatrzymaj program, aby uytkownik mg obejrze wyniki.
...
Console.ReadKey();
Dalsza cz kodu bdzie umieszczona w bloku try
Pobierz od uytkownika warto parametru a. Jeeli warto jest
rwna zero zgo wyjtek.
...
Console.Write("Podaj warto parametru a: ");
a = Convert.ToDouble(Console.ReadLine());
if(a == 0)
{
throw new Exception("Parametr a powinien by rny od zera");
}
Pobierz od uytkownika wartoci parametrw b i c:
...
Console.Write("Podaj warto parametru b: ");
b = Convert.ToDouble(Console.ReadLine());
Micha Wodarczyk Modu 03
ITA-104 Wprowadzenie do programowania Instrukcja wyboru if...else. Obsuga wyjtkw
Strona 12/13
Console.Write("Podaj warto parametru c: ");
c = Convert.ToDouble(Console.ReadLine());
Oblicz warto parametru delta dla podanych parametrw.
...
delta = b * b - 4* a * c;
Jeeli delta jest wiksza od zera oblicz oba pierwiastki i wypisz ich
wartoci na ekranie.
...
if(delta > 0)
{
x1 = (-b - Math.Sqrt(delta))/(2*a);
x2 = (-b + Math.Sqrt(delta))/(2*a);
Console.WriteLine("Rwnanie ma dwa pierwiastki:");
Console.WriteLine("\tx1 = {0}", x1);
Console.WriteLine("\tx2 = {0}", x2);
}
W przeciwnym razie sprawd czy delta jest rwna 0 i oblicz
pojedynczy pierwiastek. Jeeli nie, wypisz, e rwnanie nie ma
pierwiastkw rzeczywistych
...
else
{
if(delta == 0)
{
x1 = -b/(2*a);
Console.WriteLine("Rwnanie ma jeden pierwiastek rzeczywisty:");
Console.WriteLine("\tx1 = {0}", x1);
}
else
{
Console.WriteLine("Rwnanie nie ma pierwiastkw " +
"rzeczywistych.");
}
}
3. Skompiluj, a
nastpnie uruchom
program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu, z menu Debug wybierz Start Debugging.

Problem 2 (czas realizacji 15 minut)
Utworzenie programu, ktry oblicza warto wyraenia:




Zadanie Tok postpowania
1. Do biecego
rozwizania dodaj
nowy projekt
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy rozwizanie, a nastpnie z menu kontekstowego wybierz
Add -> New Project.
W oknie dialogowym Add New Project z listy Visual Studio installed
templates wybierz Console Application.

+
= =
< <
=
wartosci h pozostalyc dla y x
y x dla
y i x dla xy
z 0 lub 0 10
0 0
Micha Wodarczyk Modu 03
ITA-104 Wprowadzenie do programowania Instrukcja wyboru if...else. Obsuga wyjtkw
Strona 13/13
W polu Name wpisz Wyrazenie.
Kliknij OK.
2. Zaznacz projekt
Wyrazenie jako
projekt startowy
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy projekt Wyrazenie, a nastpnie z menu kontekstowego
wybierz Set as StartUp Project.
3. Wewntrz
metody Main
zaimplementuj
odpowiedni kod
Zadeklaruj cztery zmienne rzeczywiste x, y, z, v.
double x,y,z;
Pobierz od uytkownika wartoci zmiennych x, y:
Console.Write("Podaj warto zmiennej x: ");
x = Convert.ToDouble(Console.ReadLine());
Console.Write("Podaj warto zmiennej y: ");
y = Convert.ToDouble(Console.ReadLine());
Sprawd czy zmienna x i zmienna y nie s mniejsze od zera. Jeeli s, do
zmiennej z wstaw warto iloczyny xy.
if(x < 0 && y < 0)
{
z = x * y;
}
W przeciwnym wypadku sprawd czy zmienna x lub zmienna y ma
warto zero. Gdy tak jest, do zmiennej z wstaw warto 10, natomiast w
przeciwnym razie do zmiennej z wstaw sum x + y.
else
{
if(x == 0 || y == 0)
{
z = 10;
}
else
{
z = x + y;
}
}
Wypisz warto zmiennej z, a nastpnie zatrzymaj program, aby
uytkownik mg obejrze wyniki.
Console.Write(" z = {0}" , z);
Console.ReadKey();
4. Skompiluj i
uruchom program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu z menu Debug wybierz Start Debugging.

ITA-104 Wprowadzenie do programowania
Micha Wodarczyk
Modu 4
Wersja 2
Instrukcje iteracji - ptle
Spis treci
Instrukcje iteracji - ptle ...................................................................................................................... 1
Informacje o module ............................................................................................................................ 2
Przygotowanie teoretyczne ................................................................................................................. 3
Przykadowy problem .................................................................................................................. 3
Podstawy teoretyczne.................................................................................................................. 3
Laboratorium podstawowe .................................................................................................................. 6
Problem 1 (czas realizacji 10 minut) ............................................................................................ 6
Problem 2 (czas realizacji 10 minut) ............................................................................................ 7
Problem 3 (czas realizacji 15 minut) ............................................................................................ 8
Problem 4 (czas realizacji 10 minut) ............................................................................................ 9

Micha Wodarczyk Modu 04
ITA-104 Wprowadzenie do programowania Instrukcje iteracji - ptle
Strona 2/10
Informacje o module
Opis moduu
W tym module zostan zaprezentowane informacje dotyczce instrukcji
iteracyjnych, czyli ptli. Poznasz jak w jzyku C# mona definiowa
nastpujce ptle: while, for oraz do{..}while.
Cel moduu
Celem moduu jest pokazanie instrukcji iteracyjnych: while, for oraz
do{..}while.
Uzyskane kompetencje
Po zrealizowaniu moduu bdziesz:
potrafi definiowa ptle while
potrafi definiowa ptle for
potrafi definiowa ptle do{...}while
Wymagania wstpne
Przed przystpieniem do pracy z tym moduem powiniene:
zna struktur programu w jzyku C#
umie definiowa zmienne
zna operatory i potrafi definiowa wyraenia
zna instrukcj wyboru
umie obsugiwa wyjtki
Mapa zalenoci moduu
Zgodnie z map zalenoci przedstawion na rys. 1, przed przystpieniem
do realizacji tego moduu naley zapozna si z materiaem zawartym
w moduach: Wstp, Uycie zmiennych, Instrukcja wyboru if...else.
Obsuga wyjtkw.

Rys. 1 Mapa zalenoci moduu

Micha Wodarczyk Modu 04
ITA-104 Wprowadzenie do programowania Instrukcje iteracji - ptle
Strona 3/10
Przygotowanie teoretyczne
Przykadowy problem
Czsto pewn instrukcj lub grup instrukcji nale wykona pewn okrelon ilo razy lub a
zostanie speniony pewien warunek. W takich przypadkach stosujemy specjalne konstrukcje
jzykowe zwane ptlami. Ptle nazywane s rwnie instrukcjami iteracyjnymi. W przypadku ptli
istnieje niebezpieczestwo, e si zaptli. Instrukcje s wykonywane w nieskoczonej ptli z
powodu podania zego warunku wyjcia z ptli. Tak sytuacj dobrze ilustruje dowcip o
programicie pod prysznicem:
Dlaczego programista zgin pod prysznicem?
Poniewa zbyt dokadnie stosowa si do instrukcji uycia szamponu, ktra brzmiaa: "Nanie
szampon na zmoczone wosy. Masuj. Spucz. Powtrz."
Uwaga: W jzyku C# istnieje jeszcze ptla foreach. Zostanie ona omwiona w rozdziale szstym.
Podstawy teoretyczne
Pierwsz instrukcj iteracyjn, ktra zostanie omwiona bdzie instrukcja while.
Instrukcja while ma nastpujc posta:
while(warunek)
instr;
gdzie warunek jest wyraeniem logicznym, czyli czym co moe mie warto true lub false.
Instrukcja instr jest instrukcj, ktra bdzie wykonywana pewn ilo razy. Dziaanie ptli while
jest nastpujce. Najpierw sprawdzana jest warto wyraenia warunek. Jeeli warunek ma
warto false, wykonanie instrukcji instr jest pomijane i program przechodzi do wykonywanie
dalszych instrukcji. Jeeli wyraenie warunek ma warto true, instrukcja instr zostaje
wykonana. Po wykonaniu instrukcji instr, wracamy do sprawdzenia warunku. I znowu, jeeli
wyraenie warunek ma warto false, wykonywanie ptli zostaje przerwane, gdy wyraenie
warunek ma warto true, ponownie wykonywana jest instrukcja instr i po jej wykonaniu
nastpuje powrt do sprawdzania warunku.
Wcicie uyte w powyszym kodzie oczywicie s opcjonalne, ale bardzo zwikszaj czytelno
kodu.
Podobnie jak w przypadku instrukcji if, nie powinno si stawia rednika tu za nawisem
"zamykajcym" warunek.
while(warunek) ;
instr1;
W powyszym kodzie w ptli wykonywana bdzie instrukcja pusta, ktra nie zmieni wartoci
wyraenia warunek. Wynikiem tego moe by zaptlenie.
Jeeli w ptli while chcemy wykonywa cig instrukcji, instrukcje te umieszczamy w bloku.
while(warunek)
{
instrukcja1;
...
instrukcjan;
}
Kara wypisania 100 razy na ekranie np. tekstu "Nie bd uywa komrki na zajciach"
przy pomocy ptli while moe zosta wykonana w nastpujcy sposb:
Micha Wodarczyk Modu 04
ITA-104 Wprowadzenie do programowania Instrukcje iteracji - ptle
Strona 4/10
...
int i = 0;
while(i < 100)
{
i++;
Console.WriteLine("{0}. Nie bd uywa komrki na zajciach", i);
}
...
Ptla for ma nastpujc posta:
for(instr1; warunek; instr2)
instr3;
Schemat dziaania instrukcji for jest nastpujcy. Na pocztku wykonywana jest instrukcja
instr1. Jest ona wykonywana tylko raz, podczas rozpoczcia dziaania ptli. Nastpnie jest
sprawdzana warto wyraenia logicznego warunek. Gdy warunek ma warto false
wykonywanie ptli zostaje zakoczone. Jeeli wyraenie warunek ma warto true, to program
przechodzi do wykonania instrukcji instr3, a dopiero potem wykonuje instrukcj instr2. Po
wykonaniu instrukcji instr2 ponownie przechodzimy do sprawdzenia wartoci wyraenia
warunek i w zalenoci od jego wartoci kontynuujemy wykonanie ptli lub nie. Prosz zwrci
uwag, e program nie wykonuje instrukcji instr1 ponownie.
Podobnie jak w przypadku instrukcji while, jeeli chcemy, aby instrukcja instr3 bya
wykonywana "w ptli", nie stawiamy rednika po nawiasie okrgym, jak poniej, chocia nie jest
bd skadniowy.
for(instr1; warunek; instr2); //koniec ptli
instr3; //instrukcja nie naley do ptli
Rwnie, podobnie jak w przypadku while, jeeli chcemy, aby zamiast pojedynczej instrukcji
instr3, by wykonywany cig instrukcji, nalee je umieci w bloku.
for(instr1; warunek; instr2)
{
instr3_1;
...
instr3_n;
}
Instrukcje instr1 i instr2 nie musz by pojedyncz instrukcj. Moe by ich kilka, wtedy
poszczeglne instrukcje oddzielone s przecinkiem, np.:
for (j=1, i = 2 ; i<5; i++, j++)
Console.WriteLine("{0} + {1} = {2}",i, j , i+j);
Po wykonaniu powyszego fragmentu kodu na ekranie pojawi si:
2 + 1 = 3
3 + 2 = 5
4 + 3 = 7
Instrukcje instr1 i instr2 oraz wyraenie warunek nie musz wcale wystpi. Dowolny z
wymienionych elementw mona opuci, zachowujc jednak rednik oddzielajcy go od ssiada:
for( ; ;)
{
...
}
Opuszczenie wyraenia warunek traktowane jest tak, jakby staa tam warto true. Prowadzi to do
powstania ptli nieskoczonej, z ktrej mona wyj za pomoc instrukcji skoku. Instrukcje skoku
zostan omwione w nastpnym module tego kursu.
Micha Wodarczyk Modu 04
ITA-104 Wprowadzenie do programowania Instrukcje iteracji - ptle
Strona 5/10
Kad ptle for moemy zastpi ptl while i na odwrt. Przyjmuje si, chocia nie jest to
bardzo rygorystycznie przestrzegane, e ptl for stosujemy, gdy od pocztku wiadomo, ile razy
maj zosta wykonane instrukcje ptli. Najczciej ptla for ma nastpujc posta:
for(int i = 0; i < liczba; i++)
{
//instrukcje ptli
}
Powyszy kod mona rwnie zapisa przy pomocy instrukcji while w nastpujcy sposb:
int i = 0; //inicjalizacja ptli
while(i < liczba)
{
//instrukcje ptli
i++; //instrukcja kroku
}
Ptla do...while rni si od instrukcji iteracyjny omawianych wczeniej tym, e warunek jest
sprawdzany dopiero po wykonaniu instrukcji ptli. Ma ona nastpujc posta:
do
{
//instrukcje ptli
}
while(warunek);
Dziaanie ptli jest nastpujce. Najpierw wykonywane s instrukcje ptli. Po ich wykonaniu
sprawdzane jest wyraenie logiczne warunek. Jeeli ma warto true instrukcje ptli zostaj
wykonane ponownie. Jeeli wyraenie warunek ma warto false wykonywanie ptli zostaje
przerwane. W przypadku ptli do...while mamy pewno, e instrukcje ptli zostan wykonane
co najmniej raz.

Micha Wodarczyk Modu 04
ITA-104 Wprowadzenie do programowania Instrukcje iteracji - ptle
Strona 6/10
Laboratorium podstawowe
Problem 1 (czas realizacji 10 minut)
Napisz program, ktry znajduje najwikszy wsplny dzielnik (NWD) dwch liczb naturalnych.
Problemu ten rozwizuje algorytm Euklidesa. Nie wymaga on rozkadania liczb na czynniki
pierwsze. Co ciekawe algorytmu nie wymyli Euklides, a Eudoksos z Knidos grecki filozof i
matematyk. Euklides jedynie algorytm ten zawar w swoim dziele Elementy. Data powstania
algorytmu okoo 300 lat p.n.e.













Zadanie Tok postpowania
1. Utwrz nowy
projekt w Visual C#
2008 Express
Edition
Otwrz Visual C# 2008 Express Edition.
Z menu wybierz File -> New Project.
Z listy Visual Studio installed templates wybierz Console Application.
W polu Name wpisz NWD.
Kliknij OK.
Z menu wybierz File -> NWD.
W polu Location wybierz folder w ktrym bdzie zapisany projekt.
Zaznacz pole wyboru Create directory for solution.
W polu Solution Name wpisz Modul04.
Nacinij przycisk Save.
2. Wewntrz
metody Main
zaimplementuj
odpowiedni kod
Zadeklaruj trzy zmienne cakowite m, n, roznica:
ulong m, n , roznica;
Pobierz od uytkownika wartoci zmiennych m i n:
...
Console.Write("Podaj warto m: ");
m = Convert.ToUInt64(Console.ReadLine());
Console.Write("Podaj warto n: ");
n = Convert.ToUInt64(Console.ReadLine());
Wykonuj pki warto zmiennej roznica bdzie rna od zera
nastpujce polecenia:
Od wikszej liczby odejmij mniejsz, wynik podstaw do zmiennej
Start
Wybierz dwie liczby
naturalne n, m
Od wikszej odejmij mniejsz
roznica = |n-m|
Czy rnica
jest rwna
zero
n jest szukanym
NWD
Podstaw rnic za
wiksz z liczb m, n
Stop
T N
Micha Wodarczyk Modu 04
ITA-104 Wprowadzenie do programowania Instrukcje iteracji - ptle
Strona 7/10
rnica.
Do wikszej liczby z m i n podstaw warto zmiennej roznica.
do
{
roznica = m > n ? m - n: n - m;
if(n>m)
n = roznica;
else
m= roznica;
}
while(roznica != 0);
Wypisz na ekranie, e szukanym najwikszym wsplnym dzielnikiem jest
warto zmiennej n. Zatrzymaj program, aby uytkownik mg obejrze
wyniki.
Console.WriteLine("Najwikszy wsplny dzielnik podanych liczb to" +
" {0}.", n);
Console.ReadKey();
3. Skompiluj, a
nastpnie uruchom
program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu, z menu Debug wybierz Start Debugging.

Problem 2 (czas realizacji 10 minut)
Utwrz programu, ktry oblicza przyblion warto pierwiastka kwadratowego, dla dowolnie
wybranej liczby nieujemnej. Program bdzie dziaa wedug poniszego schematu blokowego












Zadanie Tok postpowania
1. Do biecego
rozwizania dodaj
nowy projekt
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy rozwizanie, a nastpnie z menu kontekstowego wybierz
Add -> New Project.
W oknie dialogowym Add New Project z listy Visual Studio installed
templates wybierz Console Application.
W polu Name wpisz Pierwiastek.
Kliknij OK.
Start
Wybierz liczb nieujemn a
Podstaw za x liczb 1 (x=1)
Oblicz x wedug wzoru:
) (
2
1
x
a
x x + =

Czy x
2
jest
wystarczajco
blisko a
x jest szukanym
pierwiastkiem
Stop
T N
Micha Wodarczyk Modu 04
ITA-104 Wprowadzenie do programowania Instrukcje iteracji - ptle
Strona 8/10
2. Zaznacz projekt
Pierwiastek jako
projekt startowy
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy projekt Pierwiastek, a nastpnie z menu kontekstowego
wybierz Set as StartUp Project.
3. Wewntrz
metody Main
zaimplementuj
odpowiedni kod
Zdefiniuj maksymalny dopuszczalny bd:
const double epsilon = 0.00001;
Zadeklaruj dwie zmienne rzeczywiste a, x. Nadaj zmiennej x warto 1.
double a, x = 1;
Pobierz od uytkownika warto zmiennej a. Gdy warto zmiennej a jest
ujemna zgo wyjtek.
Console.Write("Podaj warto zmiennej a: ");
a = Convert.ToDouble(Console.ReadLine());
if(a < 0)
throw new Exception("a nie moe by ujemne");
Pki odlego midzy x2 i a jest wiksza od epsilon, do zmiennej x
podstawiaj warto wyraenia:


while(Math.Abs(x * x - a) > epsilon)
{
x= (x + a / x) / 2;
}
//Metoda Math.Abs oblicza warto bezwzgldn liczby.
Wypisz na ekranie, e szukanym pierwiastkiem liczby jest warto
zmiennej x Zatrzymaj program, aby uytkownik mg obejrze wyniki.
Console.WriteLine("Wartoci (przyblion) pierwiastka" +
kwadratowego liczby {0} jest {1}.", a, x);
Console.ReadKey();
4. Skompiluj i
uruchom program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu z menu Debug wybierz Start Debugging.
Problem 3 (czas realizacji 15 minut)
Napisz program obliczajcy sum i iloczyn n pierwszych liczb naturalnych podzielnych przez k, gdzie
k oraz n s dowolnymi liczbami naturalnymi.




Zadanie Tok postpowania
1. Do biecego
rozwizania dodaj
nowy projekt
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy rozwizanie, a nastpnie z menu kontekstowego wybierz
Add -> New Project.
W oknie dialogowym Add New Project z listy Visual Studio installed
templates wybierz Console Application.
W polu Name wpisz SumaIloczyn.
) (
2
1
x
a
x x + =
ik a gdzie a iloczyn
i
n
i
i
= =

=1
ik a gdzie a suma
i
n
i
i
= =

=1
Micha Wodarczyk Modu 04
ITA-104 Wprowadzenie do programowania Instrukcje iteracji - ptle
Strona 9/10
Kliknij OK.
2. Zaznacz projekt
SumaIloczyn jako
projekt startowy
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy projekt SumaIloczyn, a nastpnie z menu kontekstowego
wybierz Set as StartUp Project.
3. Wewntrz
metody Main
zaimplementuj
odpowiedni kod
Zadeklaruj cztery zmienne cakowite nieujemne n, k, a, iloczyn oraz
suma. Zmiennej suma nadaj warto 0, zmiennej iloczyn warto 1.
Zmienna a bdzie przechowywa aktualn warto skadnika (czynnika).
Warto 0 jest elementem neutralnym dziaania dodawanie, warto 1
jest elementem neutralnym dziaania mnoenie.
ulong iloczyn = 1, suma = 0;
ushort a, k, n;
Pobierz od uytkownika wartoci zmiennych k i n:
Console.Write("Podaj warto zmiennej n: ");
n = Convert.ToUInt16(Console.ReadLine());
Console.Write("Podaj warto zmiennej k: ");
k = Convert.ToUInt16(Console.ReadLine());
Podstaw warto zmiennej k do zmiennej a.
a = k;
Wykonaj n razy nastpujce polecenia
Warto zmiennej suma zwiksz o warto zmiennej a.
Warto zmiennej iloczyn zwiksz a razy. Zapewnij, e w razie
przepenienia, zostanie zgoszony wyjtek.
Do zmiennej a podstaw warto kolejnej liczby podzielnej przez k.
for(int i = 0; i < n; i++)
{
suma += a;
checked
{
iloczyn *= a;
}
a += k;
}
Wypisz wartoci zmiennych suma i iloczyn, a nastpnie zatrzymaj
program, aby uytkownik mg obejrze wyniki.
Console.Write(" suma = {0}" , suma);
Console.Write(" iloczyn = {0}" , iloczyn);
Console.ReadKey();
4. Skompiluj i
uruchom program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu z menu Debug wybierz Start Debugging.

Problem 4 (czas realizacji 10 minut)
Napisz program, gr - zgadnij liczb. Uytkownik ma zgadn liczb wylosowan przez komputer.
Do wylosowania liczby pseudolosowej stosuj nastpujcy kod.
Random generator = new Random();
int liczba = generator.Next(a, b +1);
Do zmiennej liczba zostanie podstawiona wylosowana warto cakowita z przedziau <a; b>.
Micha Wodarczyk Modu 04
ITA-104 Wprowadzenie do programowania Instrukcje iteracji - ptle
Strona 10/10
Zadanie Tok postpowania
1. Do biecego
rozwizania dodaj
nowy projekt
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy rozwizanie, a nastpnie z menu kontekstowego wybierz
Add -> New Project.
W oknie dialogowym Add New Project z listy Visual Studio installed
templates wybierz Console Application.
W polu Name wpisz Gra.
Kliknij OK.
2. Zaznacz projekt
Gra jako projekt
startowy
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy projekt Gra, a nastpnie z menu kontekstowego wybierz
Set as StartUp Project.
3. Wewntrz
metody Main
zaimplementuj
odpowiedni kod
Zdefiniuj pocztek i koniec przedziau z ktrego bd generowane liczby.
const int a = 0;
const int b = 200;
Zadeklaruj nastpujce zmienne cakowite: n i m. n - liczba
wygenerowana przez generator liczb pseudolosowych; m - liczba podana
przez uytkownika
int n, m;
Wylosuj warto zmiennej n.
Random generator = new Random();
n = generator.Next(a, b +1);
Wykonuj nastpujce instrukcje, pki uytkownik nie zgadnie
wylosowanej wartoci:
Pobierz warto zmiennej m od uytkownika.
Poinformuj uytkownika, czy podana przez niego liczba jest za dua
albo za maa.
do
{
Console.WriteLine("Podaj warto wylosowanej liczby. Warto" +
"jest z przedziau <{0}, {1}>: ", a, b);
m = Convert.ToInt32(Console.ReadLine());
if(m < n)
Console.WriteLine("Warto podana jest za maa");
if(m > n)
Console.WriteLine("Warto podana jest za dua");
}
while(m != n);
Pogratuluj uytkownikowi zgadnicia wylosowanej liczby. Zatrzymaj
program, aby uytkownik mg obejrze wyniki.
Console.WriteLine("Gratulacje!!! Odgade liczb.");
Console.ReadKey();
4. Skompiluj i
uruchom program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu z menu Debug wybierz Start Debugging.


ITA-104 Wprowadzenie do programowania
Micha Wodarczyk
Modu 5
Wersja 2
Pozostae instrukcje sterujce
Spis treci
Pozostae instrukcje sterujce ............................................................................................................. 1
Informacje o module ............................................................................................................................ 2
Przygotowanie teoretyczne ................................................................................................................. 3
Podstawy teoretyczne.................................................................................................................. 3
Przykadowe rozwizanie ............................................................................................................. 7
Laboratorium podstawowe .................................................................................................................. 9
Problem 1 (czas realizacji 45 minut) ............................................................................................ 9

Micha Wodarczyk Modu 05
ITA-104 Wprowadzenie do programowania Pozostae instrukcje sterujce
Strona 2/13
Informacje o module
Opis moduu
W tym module poznasz instrukcj switch. Dowiesz si jak j definiujemy w
jzyku C#. Zobaczysz rwnie jak korzysta z instrukcji goto. Nauczysz si
uywa instrukcji break oraz continue.
Cel moduu
Celem moduu jest pokazanie instrukcji switch, goto, break oraz continue.
Uzyskane kompetencje
Po zrealizowaniu moduu bdziesz:
potrafi korzysta z instrukcji switch
potrafi korzysta z instrukcji goto
potrafi korzysta z instrukcji break
potrafi korzysta z instrukcji continue
Wymagania wstpne
Przed przystpieniem do pracy z tym moduem powiniene:
zna struktur programu w jzyku C#
umie definiowa zmienne
zna instrukcj wyboru
umie obsugiwa wyjtki
zna instrukcje ptli
Mapa zalenoci moduu
Zgodnie z map zalenoci przedstawion na rys. 1, przed przystpieniem
do realizacji tego moduu naley zapozna si z materiaem zawartym
w moduach: Wstp, Uycie zmiennych, Instrukcja wyboru if...else.
Obsuga wyjtkw, Instrukcje iteracji - ptle.

Rys. 1 Mapa zalenoci moduu

Micha Wodarczyk Modu 05
ITA-104 Wprowadzenie do programowania Pozostae instrukcje sterujce
Strona 3/13
Przygotowanie teoretyczne
Podstawy teoretyczne
Przy omawianiu instrukcji wyboru if zostao wspomniane o wyborze wielowariantowym. Jako
wybr wielowariantowy bardziej od instrukcji if, nadaje si instrukcja switch. Oglna posta
instrukcji switch jest nastpujca:
switch(wyrazenie) //nie ma rednika
{
case wartoscA: instrA1;
...;
instrAn;
break;
...
case wartoscN: instrN1;
...;
instrNn;
break;
default: instr1;
...;
instrn;
break;
}
Warto wyraenia wyrazenie musi by typu cakowitego (sbyte, byte, short, ushort, int,
uint, long, ulong, char) lub dowolnego typu wyliczeniowego lub typu string lub typu, z
ktrego istnieje konwersja niejawna do jednego z podanych wczeniej typw. Wartoci stojce
obok sowa case (wartoscA ... wartoscN) musz by znane w czasie kompilacji, czyli mog by to
literay lub stae nazwane .Wartoci te nie mog si powtarza. Typ wartoci stojcych obok sowa
case musi by zgodny z typem wyraenia wyrazenie.
Dziaanie instrukcji switch mona przedstawi w kilku krokach:
1. Obliczana jest warto wyraenia wyrazenie.
2. Jeeli ktra warto stojca obok sowa case jest rwna obliczonej wartoci, to
wykonywane s instrukcje danego bloku case. Po osigniciu instrukcji break nastpuje
wyjcie z bloku instrukcji switch.
3. Jeeli adna warto stojca obok sowa case, nie odpowiada obliczonej wartoci wyraenia
wyrazenie, wykonywane s instrukcje bloku default. Po osigniciu instrukcji break
nastpuje wyjcie z bloku instrukcji switch.
4. Jeeli adna warto stojca obok sowa case, nie odpowiada obliczonej wartoci wyraenia
wyrazenie i w bloku instrukcji switch nie ma instrukcji default, to nastpuje wyjcie z
bloku instrukcji switch.
Blok default moe wystpi w bloku instrukcji switch najwyej jeden raz.
Jeeli chcemy, aby dane instrukcje byy wykonywane dla kilku wartoci wyraenia wyrazenie,
naley postpi jak w poniszym przykadzie, ktry oblicza liczb dni w miesicu, nie uwzgldniajc
lat przestpnych. Zmienna miesiac zawiera numer miesica w roku.
int liczbaDni = 0;
switch(miesiac)
{
case 2 : liczbaDni = 28;
break;
case 4 :
case 6 :
case 9 :
Micha Wodarczyk Modu 05
ITA-104 Wprowadzenie do programowania Pozostae instrukcje sterujce
Strona 4/13
case 11 : liczbaDni = 30;
break;
default : liczbaDni = 31;
break;
}
Trzeba pamita, e jeli w bloku case lub default wystpuje jaka instrukcja, to przed
rozpoczciem nowego bloku case, defaut lub nawiasem klamrowym zamykajcym blok instrukcji
switch, musi wystpi instrukcja skoku: break, goto, throw oraz return. Instrukcja goto
zostanie omwiona w dalszej czci tego rozdziau. Brak instrukcji skoku jest nazywany bdem
przejcia (no fall through rule). Wyjtkiem od tej reguy jest sytuacja, gdy po case wystpuje ptla
nieskoczona. Regua ta rni jzyk C# np. od jzykw C/C++. Pozwolenie na przejcie midzy
blokami case byo przyczyn licznych bdw logicznych w programach napisanych w C/C++.
Poniszy kod spowoduje wic bd kompilatora.
switch(c)
{
case 'a': instrA1; //brak instrukcji skoku
case 'A': instrukcjaA1;
instrukcjaA2;
...
break;
case 'b': instrB1; //brak instrukcji skoku
case 'B': instrukcjaB1;
instrukcjaB2;
...
break;
default: instrukacja1; //brak instrukcji skoku
}
Rozwizanie problemu, gdy jest potrzeba uruchomienia kodu zawartego w inny bloku case, po
kodzie w danym bloku case, jest przedstawione przy omawianiu instrukcji goto w tym module.
Instrukcja goto jest instrukcj o "zej sawie". Uywanie instrukcji goto powoduje, e program
staje si nieczytelny. Powinnimy si, wic stara jej unika. Instrukcja goto ma nastpujc form:
goto etykieta;
Po napotkaniu takiej instrukcji wykonywanie programu przenosi si do miejsca gdzie jest
zdefiniowana dana etykieta. Definicja etykiety skada si z jej nazwy i znaku dwukropka.
etykieta:
Etykieta moe mie nastpujce formy:
identyfikator
case wartosc
default
W przypadku dwch ostatnich rodzajw etykiet, instrukcja goto musi si znajdowa w bloku
instrukcji switch. W przypadku pierwszym, goto moe skoczy do etykiety na zewntrz bloku lub
do etykiety w tym samym bloku. Nie moe skoczy do etykiety, ktra jest zdefiniowana w bloku
zagniedonym, wewntrznym w stosunku do bloku instrukcji goto. Instrukcja goto nie moe
wystpowa w bloku finally.
Uwaga: Instrukcja goto nie moe przenie wykonania kodu z jednej metody do drugie - nie moe
"skaka" midzy metodami.

Micha Wodarczyk Modu 05
ITA-104 Wprowadzenie do programowania Pozostae instrukcje sterujce
Strona 5/13

Etykieta w bloku
zewntrznym - OK
Etykieta w tym
samym bloku - OK
Etykieta w bloku
wewntrznym - le
et:
...
{
...
goto et;
...
}
goto et;
...
et:
...

goto et;
...
{
...
et:
...
}

W przypadku, gdy etykieta nie jest dostpna, podczas kompilacji zgaszany jest bd
Mimo zej sawy s dwie sytuacje, kiedy instrukcja goto jest na pewno przydatna.
1. Natychmiastowe opuszczenie wielokrotnie zagniedonych ptli.
while(...)
{
...
for(...)
{
...
while(...)
{
...
goto Etykieta;
}
}
}
...
Etykieta:
instrukcja1;
2. W celu ominicia reguy zabraniajcego przejcia midzy blokami case lub blokiem
default (no fall through rule).
switch(c)
{
case 'a': instrA1;
goto case 'A';
case 'A': instrukcjaA1;
instrukcjaA2;
...
break;
case 'b': instrB1;
goto default;
default: instrukacja1;
break;
}
Poznalimy ju wczeniej dziaanie instrukcji break - polegao na przerwaniu wykonywania instrukcji
switch. Oprcz tego break moe rwnie przerywa dziaanie ptli. Jeli jest kilka ptli
zagniedonych jedna w drugiej, to instrukcja break powoduje przerwanie tylko tej ptli, w ktrej
bezporednio si znajduje, co demonstruje poniszy kod:

Micha Wodarczyk Modu 05
ITA-104 Wprowadzenie do programowania Pozostae instrukcje sterujce
Strona 6/13
while(...){
...
for(...){
...
while(...){
...
if(warunek)
break;
...
}
instrukcja1;
...
}
instrukcja3
...
}
instrukcja4;
W wyniku dziaania instrukcji break, program przejdzie do wykonania instrukcji instrukacja1.
Instrukcja continue moe wystpowa wewntrz bloku instrukcji iteracyjnych. W odrnieniu od
instrukcji break, instrukcja continue nie koczy dziaania ptli, ale przerywa tylko aktualny obieg
ptli i zaczyna nastpny, kontynuujc prac ptli - patrz poniszy kod. Podobnie jak break, w
przypadku ptli zagniedonych, instrukcja continue przerywa aktualny obieg tej ptli, w ktrej
bezporednio si znajduje.
for(int i = 1; i < 10; i++)
{
if(i % 2 == 1)
continue;
Console.Write("{0}, ", i);
}
W wyniku dziaania powyszego programu na ekranie otrzymamy:
2, 4, 6, 8,

Micha Wodarczyk Modu 05
ITA-104 Wprowadzenie do programowania Pozostae instrukcje sterujce
Strona 7/13
Przykadowe rozwizanie
Szablon programu
Uywajc poznane do tej pory instrukcje, mona przedstawi pewien szablon programu. Szablon
moemy przedstawi przy pomocy nastpujcego schematu:











Przykadow implementacj mona obejrze na slajdzie. Bardziej rozbudowany przykad jest
dostpny projekcie SzablonProjektu, ktry jest czci rozwizania
Kurs\Demo\Modul5\Modul5.sln, gdzie Kurs jest katalogiem gdzie skopiowano pliki kursu.
Skrcona wersja jest umieszczona poniej:
char c;
do //pocztek gwnej ptli programu
{
//Menu
Console.WriteLine("A - Horoskop");
Console.WriteLine("B - Pogoda");
Console.Write("K - Koniec");
c = Console.ReadKey(true).KeyChar;
//Obsuga polece
switch (c)
{
case 'a':
case 'A': Console.WriteLine("\n\nHoroskop\n...\n...");
Console.ReadKey(true);
break;
case 'b':
case 'B': Console.WriteLine("\n\nPogoda\n...\n...");
Console.ReadKey(true);
break;
}
}
while (!(c == 'k' || c == 'K')); //koniec gwnej ptli programu
Uwaga:
W programie wykorzystywane s metody i waciwoci klasy Console, ktre do tej pory nie byy
omwione:
Console.BufferHeight - liczba dostpnych wierszy w okienku..
Wywietlenie menu,
czyli co program robi i
jak go do tego zmusi.
Oczekiwanie na
polecenie od
uytkownika i jego
Przetworzenie
polecenia uytkownika i
wywietlenie wynikw.
Micha Wodarczyk Modu 05
ITA-104 Wprowadzenie do programowania Pozostae instrukcje sterujce
Strona 8/13
Console.WindowHeight - liczba widocznych wierszy w oknie. Musi by ona mniejsza od
waciwoci Console.LargestWindowHeight, ktra oznacza maksymaln ilo wierszy,
wyznaczon w oparciu o biec wielko fontu i rozdzielczo ekranu.
Console.BufferWidth - liczba dostpnych kolumn w okienku. Musi by ona mniejsza od
waciwoci Console.LargestWindowWidth, ktra oznacza maksymaln ilo kolumn,
wyznaczon w oparciu o biec wielko fontu i rozdzielczo ekranu.
Console.WindowWidth - liczba widocznych kolumn w oknie.
Console.BackgroundColor - kolor ta.
Console.ForegroundColor - kolor czcionki.
Console.Clear() - wyczyszczenie caego okna, zamazanie kolorem ta.
Console.CursorLeft - numer kolumny, gdzie znajduje si kursor. Kolumny s
numerowane od lewej do prawej strony okna.
Console.CursorTop - numer wiersza, gdzie znajduje si kursor. Wiersze s numerowane
od gry do dou okna.
Console.SetCursorPosition(kolumna, wiersz) - ustawienie pozycji kursora, czyli gdzie
bdzie rozpoczyna si operacja wypisania na ekranie
Console.ReadKey(true).KeyChar - warto typu char nacinitego klawisza.
Warto wspomnie jeszcze o jednej metodzie klasy Console:
Console.Beep(czestotlowosc, czas) - wydanie dwiku o danej czstotliwo podanej w Hz,
przez okrelony czas podany w ms.


Micha Wodarczyk Modu 05
ITA-104 Wprowadzenie do programowania Pozostae instrukcje sterujce
Strona 9/13
Laboratorium podstawowe
Problem 1 (czas realizacji 45 minut)
Napisz program obliczajcy cak oznaczon z funkcji nieujemnej i cakowalnej na zadanym
przedziale np. f(x) = x4 + x3 + 2. Uytkownik ma do wyboru:
metod (metoda prostoktw lub metoda trapezw)
przedzia cakowania
liczb podziaw (podprzedziaw)
Cak oznaczan w przedziale <a; b> z funkcji nieujemnej cakowalnej na przedziale <a, b>
mona interpretowa jako pole obszaru ograniczonego wykresem tej funkcji, osi OX oraz prostymi
x = a i x = b.
W przypadku metody prostoktw, pole to przybliamy, sum pl odpowiednio dobranych
prostoktw. Sposb postpowania jest nastpujcy: Przedzia cakowania <a; b> dzielimy na n
rwnych podprzedziaw: <x0; x1>, <x1; x2>, ..., <xn-2; xn-1>, <xn-1; xn>
gdzie:


Dla kadego punktu xi, gdzie i = 1...n, wyznaczamy warto funkcji w tym punkcie. Bdzie to
dugo jednego z bokw prostokta. Dugo drugiego boku jest rwna szerokoci podprzedziau.
Sum pl prostoktw, a wic przyblion warto caki, moemy zapisa wzorem:



W przypadku metody trapezw, zamiast sumy pl prostoktw uywamy sum pl trapezw:
n i
n
b a
i a x b x a x
i n
,..., 0 , ,
0
=
+
+ = = =


= =

n
i
i
b
a
n
i
i
x f
n
a b
n
a b
x f dx x f
1 1
) ( ) ( ) (
Micha Wodarczyk Modu 05
ITA-104 Wprowadzenie do programowania Pozostae instrukcje sterujce
Strona 10/13
Pole trapezu jest rwne iloczynowi wysokoci i poowy sumy podstaw trapezu.


Dla podprzedziau <xi-1; xi> pole trapezu mona zapisa:


Wzr na przyblion warto caki, jako sum pl trapezw, mona wic zapisa:





Dziki powyszemu przeksztaceniu podczas obliczania wartoci sumy, f(xi) bdzie obliczane
tylko raz zamiast dwch razy, gdybymy zastosowali wzr bez przeksztace.
Zadanie Tok postpowania
1. Utwrz nowy
projekt w Visual C#
2008 Express
Edition
Otwrz Visual C# 2008 Express Edition.
Z menu wybierz File -> New Project.
Z listy Visual Studio installed templates wybierz Console Application.
W polu Name wpisz Zamiana.
Kliknij OK.
Z menu wybierz File -> Calki.
W polu Location wybierz folder w ktrym bdzie zapisany projekt.
Zaznacz pole wyboru Create directory for solution.
W polu Solution Name wpisz Modul05.
Nacinij przycisk Save.
2. Zdefiniuj nowy
typ wyliczeniowy o
nazwie
MetodyCalkowania
Przed metod Main zdefiniuj nowy typ wyliczeniowy o nazwie
MetodyCalkowania, ktry ma dwa elementy Prostokatow=1 oraz
Trapezow=2
enum MetodyCalkowania { Prostokatow=1, Trapezow=2 }
3. Wewntrz
metody Main
zaimplementuj
odpowiedni kod
Zadeklaruj nastpujce zmienne i nadaj im wartoci pocztkowe:
Dwie zmienne rzeczywiste a i b, reprezentujce pocztek i koniec
przedziau cakowania. a musi by mniejsze od b.
Zmienn dodatni n reprezentujc liczb podziaw przedziau
cakowania.
Zmienn metoda typu MetodyCalkowania.
double a = 0, b = 1;
uint n = 10;
MetodyCalkowania metoda = MetodyCalkowania.Prostokatow;
Ustaw gwn ptl programu:
char c;
do
{
...
}
) (
2
1
2 1
podst podst h P
trapezu
+ =
)] ( ) ( [
2
1
1
+
+
=
i i trapezu
x f x f
n
b a
P

+
+
=
= +

=
+

=
=

1
1
1
1
1
1
) (
2
) ( ) (
)] ( ) ( [
2 2
) ( ) (
) (
n
i
i
n
i
i i
b
a
n
i
i i
x f
b f a f
n
a b
x f x f
n
a b
n
a b x f x f
dx x f
Micha Wodarczyk Modu 05
ITA-104 Wprowadzenie do programowania Pozostae instrukcje sterujce
Strona 11/13
while(!(c =='K' || c=='k'));
W gwnej ptli programu:
Wywietl menu programu. Menu powinno zawiera informacje na
temat: aktualnego przedziau cakowania, iloci podziaw i wybranej
metody cakowania oraz jak zmieni przedzia cakowania, metod
cakowania, liczb podziaw, jak obliczy cak dla podanych
parametrw i jak zakoczy program.
Console.WriteLine("Przedzia cakowania: <{0}; {1}>", a, b);
Console.WriteLine("Liczba podziaw: {0}", n);
Console.WriteLine("Metoda cakowania: {0}", metoda);
Console.WriteLine("-----");
Console.WriteLine("A - Zmiana przedziau");
Console.WriteLine("B - Zmiana liczby podziaw");
Console.WriteLine("C - Zmiana metody cakowania");
Console.WriteLine("D - Policz cak");
Console.WriteLine("K - Koniec");
Pobierz od uytkownika polecenie:
c = Console.ReadKey(true).KeyChar;
Ustaw blok instrukcji switch w celu przetworzenia polece
uytkownika:
switch(c)
{
...
}
W bloku switch napisz nastpujcy kod przetwarzajcy polecenia
uytkownika:
Obsuga zmiany przedziau cakowania:
Pobierz warto pocztku przedziau i wstaw do zmiennej a. Pobierz
warto koca przedziau i wstaw do zmiennej b. Dopilnuj, aby
warto b bya wiksza od a:
case 'a':
case 'A':
do
{
if (a > b)
{
Console.Write("Pocztek musi by mniejszy od koca: ");
}
Console.Write("Podaj pocztek przedziau: ");
a = Convert.ToDouble(Console.ReadLine());
Console.Write("Podaj koniec przedziau: ");
b = Convert.ToDouble(Console.ReadLine());
}
while (a > b);
break;
Obsuga zmiany liczby podziaw:
Pobierz warto liczby podziaw i wstaw do zmiennej n. Jeeli
uytkownik poda zero, zgo wyjtek.
case 'b':
case 'B':
Console.Write("Podaj liczb podziaw: ");
n = Convert.ToUInt32(Console.ReadLine());
if (n == 0)
throw new Exception("Liczba podziaw musi by wiksza " +
Micha Wodarczyk Modu 05
ITA-104 Wprowadzenie do programowania Pozostae instrukcje sterujce
Strona 12/13
"od zera");
break;
Obsuga zmiany metody cakowania:
Pobierz metod cakowania od uytkownika:
case 'c':
case 'C':
int m = 1;
do
{
if (m != 1)
{
Console.Write("Nacinij 1 lub 2: ");
}
Console.WriteLine("Podaj metod liczenia caki: ");
Console. WriteLine("\t1-Metoda prostoktw");
Console. WriteLine ("\t2 - Metoda trapezw: ");
m = Convert.ToInt32(Console.ReadLine());
}
while (!(m == 1 || m == 2));
metoda = (MetodyCalkowania)m;
break;
Obsuga liczenia caki
Dodaj nowy blok case:
case 'd':
case 'D':
Zadeklaruj trzy pomocnicze zmienne rzeczywiste: suma i nadaj jej
warto zero, dx (szeroko podprzedziau) i nadaj jej warto (b-a)/n,
x i nadaj jej warto a.
double suma = 0;
double dx = (b - a) / n;
double x = a;
W zalenoci od wartoci zmiennej metoda, oblicz warto caki i
wstaw j do zmiennej suma. Jeeli warto zmiennej metoda jest
rwna MetodyCalkowania.Prostokatow skorzystaj ze wzoru:



Jeeli warto zmiennej metoda jest rwna
MetodyCalkowania.Trapezow skorzystaj ze wzoru:




Uwaga: W celu optymalizacji obliczania wartoci funkcji w punkcie,
moemy skorzysta z nastpujcego przeksztacenia:
f(x) = x4+x3+2 = x3(x+1)+2
switch (metoda)
{
case MetodyCalkowania.Prostokatow:
for (int i = 0; i < n; i++)
{
x += dx;
suma += x * x * x * (x + 1) + 2;
}
suma *= dx;

n
i
i
b
a
x f
n
a b
dx x f
1
) ( ) (

+
+


=
1
1
) (
2
) ( ) (
) (
n
i
i
b
a
x f
b f a f
n
a b
dx x f
Micha Wodarczyk Modu 05
ITA-104 Wprowadzenie do programowania Pozostae instrukcje sterujce
Strona 13/13
break;
case MetodyCalkowania.Trapezow:
for (int i = 1; i < n; i++)
{
x += dx;
suma += x * x * x * (x + 1) + 2;
}
suma += (a * a * a * (a + 1) + b * b * b * (b + 1) + 4) / 2;
suma *= dx;
break;
}
Wypisz warto caki (sumy) na ekranie i poczekaj na reakcj
uytkownika, aby mg obejrze wynik.
Console.Write("Przybliona warto caki funkcji f(x) " + w
"przedziale <{0}; {1}> wynosi: {2}",a, b, suma);
Console.ReadKey(true);
break;

4. Skompiluj, a
nastpnie uruchom
program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu, z menu Debug wybierz Start Debugging.

ITA-104 Wprowadzenie do programowania
Micha Wodarczyk
Modu 6
Wersja 2
Tablice
Spis treci
Informacje o module ............................................................................................................................ 2
Przygotowanie teoretyczne ................................................................................................................. 3
Podstawy teoretyczne.................................................................................................................. 3
Laboratorium podstawowe ................................................................................................................ 10
Problem 1 (czas realizacji 10 minut) .......................................................................................... 10
Problem 2 (czas realizacji 10 minut) .......................................................................................... 11
Problem 3 (czas realizacji 10 minut) .......................................................................................... 13
Problem 4 (czas realizacji 15 minut) .......................................................................................... 14

Micha Wodarczyk Modu 06
ITA-104 Wprowadzenie do programowania Tablice
Strona 2/16
Informacje o module
Opis moduu
W tym module poznasz struktur danych o nazwie tablica. Dowiesz si jak
j definiujemy i korzystamy z niej w jzyku C#. Dodatkowo poznasz ptla
foreach.
Cel moduu
Celem moduu jest wprowadzenie struktury danych tablicy.
Uzyskane kompetencje
Po zrealizowaniu moduu bdziesz:
widzie, co to jest tablica
potrafi zdefiniowa tablice w jzyku C#
potrafi korzysta z tablic
potrafi uywa ptli foreach
Wymagania wstpne
Przed przystpieniem do pracy z tym moduem powiniene:
umie definiowa zmienne
umie obsugiwa wyjtki
zna podstawowe instrukcje sterujce
Mapa zalenoci moduu
Zgodnie z map zalenoci przedstawion na rys. 1, przed przystpieniem
do realizacji tego moduu naley zapozna si z materiaem zawartym
w moduach: Wstp, Uycie zmiennych, Instrukcja wyboru if...else.
Obsuga wyjtkw, Instrukcje iteracji - ptle, Pozostae instrukcje
sterujce.

Rys. 1 Mapa zalenoci moduu

Micha Wodarczyk Modu 06
ITA-104 Wprowadzenie do programowania Tablice
Strona 3/16
Przygotowanie teoretyczne
Podstawy teoretyczne
Tablica jest cigiem zmiennych tego samego typu, ktre bdziemy dalej nazywa elementami
tablicy. Kady element tablicy moe by wybrany w dowolnej kolejnoci i jest dostpny w tym
samym czasie. Waciwo, e tablica jest zbudowana z elementw tego samego typu, nazywamy
jednorodnoci. Typ elementu nazywamy typem podstawowym tablicy. Struktury danych, ktrej
wszystkie skadowe s jednakowo dostpne, okrelamy jako struktury o dostpie swobodnym
(random access). Liczba elementw tablicy jest staa. Nie moe by zmieniana w czasie dziaania
programu i musi by podana w czasie jej tworzenia. Zmian liczby elementw tablicy jest
pozorowana przez utworzenie nowej tablicy i skopiowanie odpowiednich elementw tablicy
rdowej do nowo utworzonej tablicy. Dodatkow waciwoci wynikajc z implementacji jest
cigo, czyli elementy (zmienne) z ktrych zbudowana jest tablica, zajmuj cigy obszar pamici.
Uwaga: Cigo tablicy w przypadku tablicy, ktrej typem podstawowym jest typ referencyjny, nie
pociga za sob cigoci obszaru pamici zajmowanej przez obiekty danego typu. Wystpuje tylko
cigo pamici zajmowanej przez zmienne - odwoania.
W celu wybrania pojedynczego elementu tablicy posugujemy si tzw. indeksem.
Zmienn typu tablicowego definiuje si przez podanie typu podstawowego tablicy, nastpnie
wystpuj nawiasy kwadratowe, po ktrych umieszcza si nazw zmienne tablicowej. Nazwa ta
podlega tym samym reguom, co nazwy zwykych zmiennych, czyli moe skada si z cyfr, liter,
znaku podkrelenia; nie moe zaczyna si od cyfry; nie moe by sowem kluczowym; musi by
unikalna w danym bloku kodu:
typ [] nazwa;
Typ tablicowy jest typem referencyjnym. Deklaracja zmiennej tablicowej nie tworzy wic
automatycznie tablicy - obiektu tablicy. Do utworzenia obiektu tablicy uywa si operatora new.
Obiekt tablicy mona utworzy zarwno w miejscu deklaracji zmiennej tablicowej:
typ [] nazwa = new typ[ilosc_Elementow];
jak rwnie w dalszej czci programu, po deklaracji zmiennej tablicowej:
typ [] nazwa;
...
nazwa = new typ[ilosc_Elementow];
Podczas definicji obiektu tablicowego musimy poda ilo elementw, z ktrych skada si tablica -
wyraenie ilosc_Elementow. Warto wyraenie ilosc_Elementow musi by liczb cakowit
wiksz lub rwn zero. Warto ta nie musi by znana w czasie kompilacji, czyli wyraenie
ilosc_Elementow moe zawiera odwoanie do zmiennych.
Przykady definicji tablic:
Tablica szeciu liczb rzeczywistych:
double [] liczby = new double[6];
Tablica n elementowa obiektw typu string, gdzie n jest liczb podan przez uytkownika:
Console.Write("Podaj liczb elementw tablicy: ");
uint n = Convert.ToUInt32(Console.ReadLine());
string [] napisy = new string[n];
W przypadku definicji tablicy, w pierwszy nawiasach kwadratowych nie wolno umieszcza adnych
wyrae. Nawisy kwadratowe musz wystpowa midzy nazwa typu a nazw zmiennej. Ponisza
linijki spowoduj wic bd kompilacji:
Micha Wodarczyk Modu 06
ITA-104 Wprowadzenie do programowania Tablice
Strona 4/16
short [3] tab1 = new short[3];
short tab2[] = new short[3];
Uwaga: Istnieje rwnie moliwo alokacji bloku pamici na stosie przy pomocy sowa
stackalloc. Wicej informacji na temat sowa kluczowego stackalloc mona znale w MSDN
Library
W jzyku C# oprcz tablic jednowymiarowych, ktr moemy wyobrazi sobie jako wektor, istniej
rwnie tablice wielowymiarowe. Tablic dwuwymiarow moemy przedstawi w postaci macierzy.
Wymiar tablicy moemy okreli jako liczb indeksw zwizanych z elementem tablicy. Przykadem
tablicy wielowymiarowej moe by tablica zawierajca oceny rnych uczniw z rnych
przedmiotw, ktrzy uczszczaj do rnych klas w rnych szkoach. Poszczeglne indeksy w takiej
tablicy bd zwizane z wyborem szkoy, wyborem klasy oraz okreleniem przedmiotu i ucznia.
Zmienn zawierajc odwoanie do tablicy wielowymiarowej deklarujemy umieszczajc przecinki w
nawiasach kwadratowych. Wymiar tablicy bdzie rwny liczbie przecinkw plus jeden.
int [,] tab2; //tablica dwuwymiarowa
int [,,] tab3; //tablica trjwymiarowa
int [,,,] tab; //tablica czteromiarowa
Do utworzenia obiektu tablicy wielowymiarowej, podobnie jak w przypadku tablicy
jednowymiarowej, uywa si operatora new i mona go utworzy zarwno w miejscu deklaracji
zmiennej tablicowej:
typ [,] nazwa = new typ[wyrazenie1, wtrazenie2];
jak rwnie w dalszej czci programu, po deklaracji zmiennej tablicowej:
typ [,] nazwa;
...
nazwa = new typ[wyrazenie1, wyrazenie2];
gdzie wyrazenie1 oraz wyrazenie2 okrelaj rozmiar tablicy w poszczeglnych wymiarach, czyli
liczb elementw w poszczeglnych wymiarach.
Ilo elementw tablicy wielowymiarowej mona uzyska mnoc przez siebie rozmiary tablicy w
poszczeglnych wymiarach. W powyszym przykadzie liczba wszystkich elementw tablicy jest
rwna iloczynowi: wyrazenie1*wyrazenie2.
W jzyku C# istnieje rwnie moliwo utworzenia tablicy nieregularnej, czyli np. w przypadku
tablicy dwuwymiarowej, takiej tablicy, ktra ma rn liczb elementw w poszczeglnych
wierszach.
Zmienn takiej tablicy tworzymy w nastpujcy sposb:
typ [][] nazwa;
Powysza instrukcja deklaruje zmienn tablicow, ktra moe zawiera odwoanie do tablicy
jednowymiarowej, ktrej elementy s tablicami. Czyli tablica nieregularna w jzyku C# traktowana
jest jako tablica jednowymiarowa, ktrej elementy s tablicami. Poniewa jednak przy zmiennej
tablicowej nieregularnej moe wystpi wiele indeksw, bdziemy mwili o wielu wymiarach
tablicy nieregularnej.
Obiekty tablic nieregularnych moemy rwnie tworzy w miejscu deklaracji zmiennej tablicowej,
jak i w dalszej czci programu. W przypadku tworzenia tablic nieregularnych rozmiar podajemy
tylko dla pierwszego wymiaru. Podanie rozmiaru dla wikszej iloci wymiarw powoduje bd
kompilatora.
typ [][] nazwa2 = new typ[2][];
Micha Wodarczyk Modu 06
ITA-104 Wprowadzenie do programowania Tablice
Strona 5/16
Powysza instrukcja tworzy tablic dwuelementow, ktrej elementami s tablice. Tablice
skadowe, wiersze macierzy, tworzymy w nastpnych instrukcjach.
nazwa2[0] = new typ[4];
nazwa2[1] = new typ[3];
Pierwszy wiersz macierzy, w wyniku wykonania powyszego kodu, bdzie mia cztery elementy,
drugi natomiast trzy. Wicej na temat odwoania si do poszczeglnych elementw tablicy bdzie
przedstawione w dalszej czci tego moduu.
Mona rwnie czy definicj tablic regularnych z nieregularnymi np.:
double [][,] t1 = new double[2][,];
double [,][] t2 = new double[3,2][];
Podczas tworzenia tablicy (obiektu tablicowego), wszystkim jej elementom przypisywana jest
niejawnie warto reprezentujca zero danego typu. Dla typw liczbowych jest to 0, dla typu
logicznego false, dla typw referencyjnych null. W jzyku C# podczas tworzenia tablicy, mona
rwnie nada wasne wartoci poszczeglnym elementom tablicy. Jeeli zdecydowalimy si na
ustawienie wartoci elementw tablicy, musimy poda wartoci dla wszystkich elementw tablicy.
Poszczeglne wartoci oddzielamy przecinkami i umieszczamy w nawiasach klamrowych np.:
string [] zwierzeta = new string[3]{"lis", "lew", "kot"};
Pierwszemu elementowi tablicy zostanie nadana warto lis, drugiemu lew, trzeciemu kot. W
przypadku, gdy podczas tworzenia tablicy podajemy wartoci elementw tablicy, rozmiar musi by
znany w czasie kompilacji - musi by wartoci sta. Rozmiar mona jednak pomin, kompilator
sam wyliczy rozmiar:
string [] zwierzeta = new string[]{"lis", "lew", "kot"};
Zapis utworzenia zainicjalizowanej tablicy mona jeszcze bardziej uproci, pomijajc cz new
typ[rozmiar]:
string [] zwierzeta = {"lis", "lew", "kot"};
W przypadku, gdy tablic nie tworzymy w miejscu deklaracji zmiennej tablicowej, ale w dalszej
czci programu, dopuszczalne s formy:
const int IloscZwierzat = 3;
string [] zwierzeta;
...
zwierzeta = new string[IloscZwierzat]{"lis", "lew", "kot"};
oraz
string [] zwierzeta;
...
zwierzeta = new string[]{"lis", "lew", "kot"};
Poniszy zapis natomiast spowoduje bd kompilatora:
string [] zwierzeta;
...
zwierzeta = {"lis", "lew", "kot"}; //bd
Tablice wielowymiarowe mona rwnie inicjalizowa. Wykonuje si to w nastpujcy sposb:
string [,] zwierzeta = {
{"kruk", "bocian", "orze"},
{"lis", "lew", "kot"},
{"pszczoa", "osa", "komar"}
}; // tablica 3x3
lub (z tym e przykad dla tablicy trjwymiarowej)
Micha Wodarczyk Modu 06
ITA-104 Wprowadzenie do programowania Tablice
Strona 6/16
string [,,] zwierzeta;
...
zwierzeta = new string[,,] {
{ {"kura", "g"}, {"orze", "sok"} },
{ {"pies", "kot"}, {"lew", "tygrys"} },
{ {"pszczoa","jedwabnik"},{"osa","komar"} }
}; // tablica 3x2x2
W przypadku tablic regularnych oczywicie trzeba pamita o jednakowej liczbie elementw w
poszczeglnych wymiarach
Tablice nieregularne tworzymy w nastpujcy sposb:
string [][] zwierzeta = {
new string[]{"lew","tygrys"},
new string[]{"kruk", "sp", "orze", "gil"},
new string[]{"osa"}
};
lub (z tym e przykad dla tablicy trjwymiarowej)
string [][][] zwierzeta;
...
zwierzeta = new string[][][] {
new string[][] {
new string[] {"pies", "kot","ko"},
new string[] {"tygrys"}
}
new string[][] {
new string[]{"kura", "g", "indyk"}
}
};
Jak wida w powyszym przykadzie, podtablice tablicy tablic, czyli skadowe tablicy nieregularnej,
musimy tworzy przy pomocy operatora new.
Do pojedynczego elementu tablicy uzyskuje si dostp przy pomocy operatora indeksowania. W
jzyku C# operatorem indeksowania s nawiasy kwadratowe []. W kadym wymiarze elementy
tablicy indeksujemy od wartoci zero do rozmiaru danego wymiaru minus jeden. Czyli jeeli
utworzymy tablic jednowymiarow o trzech elementach:
char tab = new char[3];
to:
tab[0] - pierwszy element tablicy
tab[1] - drugi element tablicy
tab[2] - trzeci, ostatni element tablicy
Jeeli w programie nastpi odwoanie do nieistniejcego elementu tablicy, czyli do elementu o
indeksie mniejszym od zera albo o wartoci indeksu wikszej lub rwnej liczbie elementw w
danym wymiarze, spowoduje to zgoszenie wyjtku IndexOutOfRangeException.
W przypadku tablic wielowymiarowych regularnych, aby uzyska dostp do elementu tablicy
stosujemy nastpujc notacj:
int [,] tab1 = { {1,2,3},{4,5,6} };
tab1[0,0] = 10;
Console.WriteLine(tab1[1,1]); //5
//tab[2][0] //nie ma takiego elementu byby zgoszony wyjtek
Dla tablic nieregularnych uywamy nastpujc notacj:
Micha Wodarczyk Modu 06
ITA-104 Wprowadzenie do programowania Tablice
Strona 7/16
int [][] tab2 = {
new int[] { 1, 2, 3},
new int[] { 4, 5, 6}
};
tab2[0][0] = 10;
Console.WriteLine(tab1[1][2]); //6
//tab[1][3] //nie ma takiego elementu, byby zgoszony wyjtek
Uwaga: W jzyku C# istnieje moliwo utworzenia tablicy, ktrej dolny indeks jest rny od
wartoci zero. Mona to wykona przy pomocy jednej z metod CreateInstance klasy Array.
O tablicach w jzyku C#, mona powiedzie, e s strukturami samo opisujcymi si. Przy pomocy
nazwy zmiennej tablicowej, mona uzyska informacj na temat liczby jej wszystkich elementw,
liczby wymiarw tablicy, liczby elementw w poszczeglnych rozmiarach.
Uwaga: Informacje opisane powyej moemy uzyska przy pomocy waciwoci lub wywoania
metody na rzecz jakiego obiektu tablicowego. Waciwoci oraz metody wywoywane na rzecz
obiektu danej klasy zostan dokadnie omwione w kursie "Programowanie obiektowe".
W celu uzyskania informacji na temat liczby wymiarw korzystamy z waciwoci Rank.
int [] tab1 = new int[3];
Console.WriteLine(tab1.Rank);
int [,,] tab2 = new int[3,2,2];
Console.WriteLine(tab2.Rank);
Na ekranie zostanie wypisane:
1
3
W przypadku tablic nieregularnych, tablica jest traktowana jako tablica jednowymiarowa, ktrej
elementami s tablice. Poniszy kod spowoduje, wic wypisanie na ekranie wartoci 1.
int [][][] tab3 = new int[4][][];
Console.WriteLine(tab3.Rank);
Waciwo Length oraz LongLength su do otrzymania liczby wszystkich elementw tablicy.
int [] tab1 = new int[3];
Console.WriteLine(tab1.Length);
int [,,] tab2 = new int[3,2,2];
Console.WriteLine(tab2.Length);
Na ekranie zostanie wypisane:
3
12
W przypadku tablic nieregularnych, podobnie jak wczeniej, tablica jest traktowana jako tablica
jednowymiarowa, ktrej elementami s tablice. Waciwo Length zawiera, wic liczb podtablic.
Poniszy kod spowoduje wypisanie na ekranie wartoci 2.
int [][]tab3 = new int[2][] {
new int[4], new int[7]
};
Console.WriteLine(tab3.Length);
I oczywicie
...
Console.WriteLine(tab3[0].Length);
Console.WriteLine(tab3[1].Length);
spowoduje pojawienie si na ekranie:
Micha Wodarczyk Modu 06
ITA-104 Wprowadzenie do programowania Tablice
Strona 8/16
4
7
W celu uzyskania liczby elementw w poszczeglnych wymiarach korzysta si z metody
GetLength lub GetLongLength. Wymiary indeksujemy od wartoci zero:
int [,,] tab2 = new int[3,8,2];
Console.WriteLine(tab2.GetLength(0)); //pierwszy wym.
Console.WriteLine(tab2.GetLength(1)); //drugi wym.
Console.WriteLine(tab2.GetLength(2)); //trzeci wym.
Na ekranie zostanie wypisane:
3
8
2
Odwoanie si do nieistniejcego wymiaru spowoduje zgoszenie wyjtku
IndexOutOfRangeException.
Zamy, e jest potrzebne wypisanie wartoci wszystkich elementw tablicy. Kod przy pomocy
instrukcji for mgby wyglda nastpujco:
int [] t = new int[10];
...
for(int i = 0; i<t.Length; i++)
{
Console.Write ("{0}, ",t[i]);
}
Dla tablicy dwuwymiarowej natomiast:
int [,] tt = new int[10,20];
...
for(int i = 0; i<tt.GetLength(0); i++)
{
for(int j = 0; j<tt.GetLength(1); j++)
{
Console.Write("{0}, ", tt[i,j]);
}
}
Powyszy kod mona rwnie zapisa przy pomocy instrukcji foreach:
int [] t = new int[10];
...
foreach(int element in t)
{
Console.WriteLine("{0}", element);
}
oraz dla tablicy dwuwymiarowej regularnej:
int [,] tt = new int[10,20];
...
foreach(int element in tt)
{
Console.Write("{0}, ",element);
}
Korzystajc z ptli foreach, mylimy raczej o wykonaniu pewnej grupy instrukcji dla kadego
elementu tablicy, ni o wykonaniu pewnej grupy instrukcji okrelon ilo razy.
W nawiasach okrgych, wystpujcych obok sowa foreach, deklarujemy zmienn, ktra w bloku
instrukcji reprezentuje aktualnie przetwarzany element tablicy. Zmienn t nazywamy zmienn
Micha Wodarczyk Modu 06
ITA-104 Wprowadzenie do programowania Tablice
Strona 9/16
iteracyjn ptli foreach. Typ zmiennej iteracyjnej musi by identyczny z typem elementu tablicy
lub musi istnie do niego konwersja niejawna z typu elementu tablicy. Jako zmiennej iteracyjnej nie
mona uy zmiennej zadeklarowanej wczeniej w programie. Wartoci zmiennej iteracyjnej nie
mona zmienia, jest tylko do odczytu.
Uwaga: W nawiasach okrgych, wystpujcych obok sowa foreach, po sowie in, mog
wystpowa zmienne zawierajce uchwyt do obiektw klas kolekcji. Klasy kolekcji w jzyku C#, s
to klasy, ktre implementuj interfejs IEnumerable lub posiadaj odpowiedni metod
GetEnumerator. Wicej na temat interfejsw mona znale w kursie "Programowanie
obiektowe".

Micha Wodarczyk Modu 06
ITA-104 Wprowadzenie do programowania Tablice
Strona 10/16

Laboratorium podstawowe
Problem 1 (czas realizacji 10 minut)
Napisz program, ktry znajduje najwikszy i najmniejszy element tablicy. Tablic zainicjalizuj
liczbami pseudolosowymi, korzystajc z generatora liczb pseudolosowych:
Random r = new Random(); //utworzenie obiektu
//generatora liczb pseudolosowych
int n = r.Next(0,101); //losowanie liczby z przedziau <0;100>
.Zadanie Tok postpowania
1. Utwrz nowy
projekt w Visual C#
2008 Express
Edition
Otwrz Visual C# 2008 Express Edition.
Z menu wybierz File -> New Project.
Z listy Visual Studio installed templates wybierz Console Application.
W polu Name wpisz MaxMin.
Kliknij OK.
Z menu wybierz File -> MaxMin.
W polu Location wybierz folder w ktrym bdzie zapisany projekt.
Zaznacz pole wyboru Create directory for solution.
W polu Solution Name wpisz Modul06.
Nacinij przycisk Save.
2. Wewntrz
metody Main
zaimplementuj
odpowiedni kod
Utwrz obiekt tablicy pitnastoelementowej liczb cakowitych.
int [] tablica = new int[15];
Nadaj elementom tablicy wartoci losowe z przedziau od zera do stu,
korzystajc z generatora liczb pseudolosowych.
Random generator = new Random();
for(int i = 0; i < tablica.Length; i++)
{
tablica[i] = generator.Next(0,101);
}
Wypisz wartoci elementw tablicy korzystajc z ptli foreach.
Console.WriteLine("Wylosowano nastpujce wartoci");
foreach(int i in tablica)
{
Console.Write("{0}, ", i);
}
Zadeklaruj zmienn indexMax i ustaw jej warto na warto zero. Dla
kadego elementu tablicy sprawdzaj, czy jego warto jest wiksza od
wartoci elementu tablicy o indeksie indexMax. Jeeli jest wiksza, ustaw
warto zmiennej indexMax na numer jego indeksu.
int indexMax = 0;
for(int i = 1; i < tablica.Length; i++)
{
if(tablica[indexMax] < tablica[i])
{
indexMax = i;
}
}
Zadeklaruj zmienn indexMin i ustaw jej warto na warto zero. Dla
kadego elementu tablicy sprawdzaj, czy jego warto jest mniejsza od
Micha Wodarczyk Modu 06
ITA-104 Wprowadzenie do programowania Tablice
Strona 11/16
wartoci elementu tablicy o indeksie indexMin. Jeeli jest mniejsza,
ustaw warto zmiennej indexMin na numer jego indeksu.
int indexMin = 0;
for(int i = 1; i < tablica.Length; i++)
{
if(tablica[indexMin] > tablica[i])
{
indexMin = i;
}
}
Uwaga: Wyznaczenie numeru indeksu elementu maksymalnego i
minimalnego mona oczywicie wykona w pojedynczej ptli:
int indexMax = 0;
int indexMin = 0;
for(int i = 1; i < tablica.Length; i++)
{
if(tablica[indexMin] > tablica[i])
{
indexMin = i;
}
if(tablica[indexMax] < tablica[i])
{
indexMax = i;
}
}
Wypisz na ekranie wartoci elementu najwikszego i najmniejszego oraz
numery ich indeksw. Zatrzymaj program, aby uytkownik mg obejrze
wyniki:
Console.WriteLine("\n\nElemnt najmniejszy o indeksie {0} " +
" posiada warto {1}.", indexMin, tablica[indexMin]);
Console.WriteLine("Elemnt najwikszy o indeksie {0} " +
posiada warto {1}.", indexMax, tablica[indexMax]);
Console.ReadKey();
3. Skompiluj, a
nastpnie uruchom
program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu, z menu Debug wybierz Start Debugging.

Problem 2 (czas realizacji 10 minut)
Utwrz programu, ktry oblicza iloczyn dwch macierzy. Wartoci elementw macierzy s
podawane przez uytkownika.
Wartoci elementw macierzy C = A x B, mona wyliczy ze wzoru:


N - liczba wierszy macierzy A i C.
M - liczba kolumn macierzy B i C
K - liczba kolumn macierzy A i liczba wierszy macierzy B
Zadanie Tok postpowania
1. Do biecego
rozwizania dodaj
nowy projekt
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy rozwizanie, a nastpnie z menu kontekstowego wybierz
Add -> New Project.
M j N i gdzie b a c
K
k
kj ik ij
... 1 ; ... 1 ,
1
= = =

=
Micha Wodarczyk Modu 06
ITA-104 Wprowadzenie do programowania Tablice
Strona 12/16
W oknie dialogowym Add New Project z listy Visual Studio installed
templates wybierz Console Application.
W polu Name wpisz MnozenieMacierzy.
Kliknij OK.
2. Zaznacz projekt
MnozenieMacierzy
jako projekt
startowy
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy projekt MnozenieMacierzy, a nastpnie z menu
kontekstowego wybierz Set as StartUp Project.
3. Wewntrz
metody Main
zaimplementuj
odpowiedni kod
Zadeklaruj trzy stae cakowite reprezentujce odpowiednio:
N - liczba wierszy macierzy A i C
M - liczba kolumn macierzy B i C
K - liczba kolumn macierzy A i liczba wierszy macierzy B
const int N = 3;
const int M = 3;
const int K = 2;
Zdefiniuj trzy tablice dwuwymiarowe o rozmiarach: NxK, KxM oraz NxM.
double [,] macierzA = new double[N,K];
double [,] macierzB = new double[K,M];
double [,] macierzC = new double[N,M];
Pobierz od uytkownika wartoci elementw macierzy A oraz macierzy B.
Console.WriteLine("Podaj elementy macierzy A.");
for(int i=0; i<N; i++) {
for(int j=0; j<K; j++)
{
Console.Write("A[{0},{1}] = ", i+1,j+1);
macierzA[i,j] = Convert.ToDouble( Console.ReadLine() );
}
}
Console.WriteLine("Podaj elementy macierzy B.");
for(int i=0; i<K; i++)
{
for(int j=0; j<M; j++)
{
Console.Write("B[{0},{1}] = ", i+1,j+1);
macierzB[i,j] = Convert.ToDouble( Console.ReadLine() );
}
}
Oblicz elementy macierzy C.
for(int i = 0; i<N; i++)
{
for(int j = 0; j<M; j++)
{
macierzC[i,j] = 0;
for(int k=0; k<K; k++)
{
macierzC[i,j]+=macierzA[i,k]*macierzB[k,j];
}
}
}
Uwaga: W biecym programie linijka macierz C[i,j] = 0; jest
zbyteczna, poniewa domylnie wszystkie elementy macierzy C zostay
zainicjalizowane wartoci zero. Umieszczenie jej ma na celu
pokazanie oglnego algorytmu mnoenia macierzy, rwnie wtedy,
Micha Wodarczyk Modu 06
ITA-104 Wprowadzenie do programowania Tablice
Strona 13/16
gdy elementy macierzy wynikowej nie maj wartoci zero.
Wypisz elementy macierzy C. Zatrzymaj program, aby uytkownik mg
obejrze wyniki:
Console.WriteLine("\nWynikiem mnoenia podanych " +
"macierzy jest macierz:");
for(int i = 0; i<macierzC.GetLength(0); i++)
{
for(int j = 0; j<macierzC.GetLength(1); j++)
{
Console.Write("{0,10}, ", macierzC[i, j]);
}
Console.WriteLine();
}
Console.ReadKey();
4. Skompiluj i
uruchom program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu z menu Debug wybierz Start Debugging.
Problem 3 (czas realizacji 10 minut)
Napisz program, ktre losuje sze rnych liczb cakowitych z przedziau <1;49>.
Zadanie Tok postpowania
1. Do biecego
rozwizania dodaj
nowy projekt
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy rozwizanie, a nastpnie z menu kontekstowego wybierz
Add -> New Project.
W oknie dialogowym Add New Project z listy Visual Studio installed
templates wybierz Console Application.
W polu Name wpisz TotoLotek.
Kliknij OK.
2. Zaznacz projekt
TotoLotek jako
projekt startowy
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy projekt TotoLotek, a nastpnie z menu kontekstowego
wybierz Set as StartUp Project.
3. Wewntrz
metody Main
zaimplementuj
odpowiedni kod
Zdefiniuj tablic jednowymiarow, ktra bdzie zawiera sze
wylosowanych liczb:
byte [] numery = new byte[6];
Wypenij tablic liczbami wylosowanymi przez generator liczb
pseudolosowych. Zanim przejdziesz do losowania nastpnej liczby
sprawd, czy wylosowana liczba, nie bya wylosowana wczeniej. Jeeli
dana liczba bya ju wylosowana wczeniej, powtrz losowanie dla
danego elementu tablicy.
Random generator = new Random();
int index = 0; //ile wylosowano liczb
int i;
bool flaga;
do
{
numery[index] = (byte)generator.Next(1,50);
flaga = true;
for(i=0; i<index; i++)
{
if(numery[index] == numery[i])
{
Micha Wodarczyk Modu 06
ITA-104 Wprowadzenie do programowania Tablice
Strona 14/16
flaga = false;
break;
}
}
if(flaga)
{
index++;
}
}
while(index<6);
Wypisz wylosowane liczby. Zatrzymaj program, aby uytkownik mg
obejrze wyniki.
Console.WriteLine("Wylosowane liczby to:");
foreach(int numer in numery)
{
Console.Write("{0}, ",numer);
}
Console.ReadKey();
4. Skompiluj i
uruchom program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu z menu Debug wybierz Start Debugging.
Problem 4 (czas realizacji 15 minut)
Napisz programu, ktry bdzie wyznacza wszystkie liczby pierwsze w zadanym przedziale. Program
bdzie korzysta z algorytmu zwanego sitem Eratostenesa. Algorytm ten polega na tym, e
tworzymy zbir wszystkich liczb naturalnych z danego przedziau wikszych lub rwnych dwa.
Nastpnie wybieramy ze zbioru najmniejsz liczb, czyli dwa i usuwamy wszystkie jej
wielokrotnoci. Wybrana liczba jest liczb pierwsz. Po usuniciu ze zbioru wszystkich
wielokrotnoci liczby dwa, wybieramy kolejn najmniejsz liczb. Bdzie to kolejna liczba pierwsza.
Usuwamy jej wszystkie wielokrotnoci i znowu wybieramy najmniejsz liczb ze zbioru i usuwamy
jej wielokrotnoci. Czynnoci wybierania i usuwania powtarzamy, dopki nie oprnimy zbioru.
Wybrane liczby bd szukanymi liczbami pierwszymi.
Implementacja tego algorytmu polega na utworzeniu tablicy logicznej o liczbie elementw rwnej
iloci liczb naturalnych wikszych lub rwnych dwa w danym przedziale. Pierwszy element tablicy
odpowiada liczbie dwa, drugi liczbie trzy itd. Zakadamy, e wszystkie liczby s liczbami pierwszymi,
co realizujemy przez ustalenie jednakowej wartoci dla wszystkich elementw tablicy - np. false
gdy tak domylnie s inicjalizowane elementy tablic logicznych. Wybieramy pierwszy element
tablicy, ktry ma warto false. Jest to oczywicie pierwszy element tablicy, ktry reprezentuje
liczb dwa. Usunicie wielokrotnoci liczby dwa, bdzie polegao na nadaniu elementom tablicy
reprezentujcym te wielokrotnoci wartoci true, bez zmieniania wartoci wybranego elementu.
Po nadaniu wszystkim elementom tablicy reprezentujcym wielokrotno liczby dwa wartoci
true, wybieramy kolejny element tablicy o wartoci false. Warto elementw tablicy
reprezentujcych wielokrotnoci wybranego elementu ustawiamy na true. Czynnoci wyboru
elementu i ustawienia wartoci elementw reprezentujcych jego wielokrotnoci na true,
powtarzamy a do momentu, gdy nie mamy do wyboru nastpnego elementu tablicy, ktrego
warto jest rwna false. Elementy tablicy, ktre maj warto false, reprezentuj liczby
pierwsze w danym przedziale.
Do algorytmu powyszego warto doda pewne usprawnienia. Niektre liczby s wielokrotnociami
kilku liczb i nadawanie elementom je reprezentujcym wartoci true (usuwanie) wykonywane jest
wiele razy. Zupenie nie uda nam si tego zlikwidowa, ale mona to zoptymalizowa.
Micha Wodarczyk Modu 06
ITA-104 Wprowadzenie do programowania Tablice
Strona 15/16
Pierwsz wielokrotnoci, ktr bdziemy "usuwa", bdzie warto rwna kwadratowi wybranej
liczby pierwszej, poniewa mniejsze wielokrotnoci musiay by rwne iloczynowi wybranej liczby
pierwszej i liczby od niej mniejszej, wic musiay juz by "usunite" wczeniej.
Wybieranie liczb pierwszych naley zakoczy po osigniciu pierwiastka kwadratowego koca
przedziau. Wybr wikszej liczby nie powoduje ju "usunicia" wicej wielokrotnoci - patrz
pierwsza optymalizacja.
Zadanie Tok postpowania
1. Do biecego
rozwizania dodaj
nowy projekt
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy rozwizanie, a nastpnie z menu kontekstowego wybierz
Add -> New Project.
W oknie dialogowym Add New Project z listy Visual Studio installed
templates wybierz Console Application.
W polu Name wpisz LiczbyPierwsze.
Kliknij OK.
2. Zaznacz projekt
LiczbyPierwsze jako
projekt startowy
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy projekt LiczbyPierwsze, a nastpnie z menu
kontekstowego wybierz Set as StartUp Project.
3. Wewntrz
metody Main
zaimplementuj
odpowiedni kod
Pobierz od uytkownika grn granic przedziau, z ktrego chce wypisa
wszystkie liczby pierwsze.
ulong n;
Console.WriteLine("Podaj grn granic przedziau, z ktrego " +
"chcesz wypisa wszystkie liczby pierwsze.");
Console.Write("Liczba nie moe by wiksza od {0}: ",
ulong.MaxValue);
n = Convert.ToUInt64(Console.ReadLine());
Zadeklaruj tablic logiczn o n-1 elementach.
bool[] liczby = new bool[n-1];
W wyniku powyszej deklaracji, kady element tablicy ma nadan
domylnie warto false. Tablica o rozmiarze n-1, bo nie bierzemy pod
uwag liczby jeden.
Dla wszystkich liczb cakowitych od liczby dwa do liczby rwnej
pierwiastkowi kwadratowemu z wartoci koca przedziau, wykonuj co
nastpuje:
Sprawd czy warto elementu reprezentujc wybran liczb jest
rwna false.
Jeeli warto jest rwna false, ustaw wartoci elementw tablicy
reprezentujcych wielokrotnoci wybranej liczby na warto false.
Rozpocznij od liczby rwnej kwadratowi wybranej liczby.
Nastpnie przejd do nastpnej liczby.
ulong m = (uint)Math.Sqrt(n);
ulong index;
for (ulong i = 2; i <= m; i++)
{
if (!liczby[i - 2])
{
index = i * i - 2;
while (index < n - 1)
{
liczby[index] = true;
index += i;
Micha Wodarczyk Modu 06
ITA-104 Wprowadzenie do programowania Tablice
Strona 16/16
}
}
}
Wypisz liczby pierwsze z zadanego przedziau:
Console.WriteLine("Liczby pierwsze z podanego przedziau to:");
int j=0;
for(ulong i=0;i<n-1;i++)
{
if(!liczby[i])
{
Console.Write("{0,22}, ", i + 2);
j++;
if (j % 2 == 0)
Console.WriteLine();
if (j % (2*Console.WindowHeight) == 0)
Console.ReadKey();
}
}
Console.Write("\nLiczb pierwszych w podanym zakresie jest {0}", j);
Console.ReadKey();
4. Skompiluj i
uruchom program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu z menu Debug wybierz Start Debugging.

ITA-104 Wprowadzenie do programowania
Micha Wodarczyk
Modu 7
Wersja 2
Operacje na tablicach
Spis treci
Operacje na tablicach ........................................................................................................................... 1
Informacje o module ............................................................................................................................ 2
Przygotowanie teoretyczne ................................................................................................................. 3
Podstawy teoretyczne.................................................................................................................. 3
Laboratorium podstawowe .................................................................................................................. 9
Problem 1 (czas realizacji 20 minut) ............................................................................................ 9
Problem 2 (czas realizacji 25 minut) .......................................................................................... 10

Micha Wodarczyk Modu 07
ITA-104 Wprowadzenie do programowania Operacje na tablicach
Strona 2/12
Informacje o module
Opis moduu
W tym module zostan przedstawione nastpujce operacje na tablicach
oraz jak s zaimplementowane w bibliotece .NET Framework: ustawianie
wartoci elementw tablicy (po utworzeniu tablicy), kopiowanie wartoci
elementw jednej tablicy do drugiej tablicy, odwracanie tablicy, ustawianie
elementw tablicy w odpowiedniej kolejnoci sortowanie oraz
sprawdzanie czy tablica zawiera element o danej wartoci.
Cel moduu
Celem moduu jest pokazanie podstawowych operacji na tablicach.
Uzyskane kompetencje
Po zrealizowaniu moduu bdziesz:
potrafi ustawi wartoci elementw tablicy (po utworzeniu tablicy)
potrafi kopiowa wartoci elementw jednej tablicy do drugiej
tablicy
potrafi odwraca tablicy
potrafi ustawi elementw tablicy w odpowiedniej kolejnoci -
sortowa
potrafi sprawdzi czy tablica zawiera element o danej wartoci
Wymagania wstpne
Przed przystpieniem do pracy z tym moduem powiniene:
umie definiowa zmienne
zna instrukcje sterujce
potrafi definiowa tablice
Mapa zalenoci moduu
Zgodnie z map zalenoci przedstawion na rys. 1, przed przystpieniem
do realizacji tego moduu naley zapozna si z materiaem zawartym
w moduach: Wstp, Uycie zmiennych, Instrukcja wyboru if...else.
Obsuga wyjtkw, Instrukcje iteracji - ptle, Pozostae instrukcje
sterujce, Tablice.

Rys. 1 Mapa zalenoci moduu

Micha Wodarczyk Modu 07
ITA-104 Wprowadzenie do programowania Operacje na tablicach
Strona 3/12
Przygotowanie teoretyczne
Podstawy teoretyczne
W czasie tworzenia tablicy moemy zainicjalizowa jej elementy dowolnymi wartociami. W dalszej
czci programu w pojedynczej instrukcji moemy nada warto tylko pojedynczemu elementowi
tablicy. W programie czsto istnieje potrzeba nadania pewnej grupie elementw tablicy okrelonej
wartoci. Poniszy kod przedstawia jeden z sposobw implementacji tego zadania:
...
for(int i = index; i < index + iloscElementow; i++)
{
tab[i] = wartosc;
}
...
Zmienna index zawiera numer indeksu pierwszego elementu tablicy tab, ktremu zostanie nadana
warto zmiennej wartosc. Zmienna iloscElemntow zawiera ilo elementw tablicy tab,
ktrej zostanie nadana warto zmiennej wartosc. Oczywicie warto zmiennej index oraz
warto wyraenia index+iloscElemntow-1 musi mieci si w wartociach dopuszczalnych
indeksw tablicy tab.
W bibliotece .Net Framework istnieje metoda Clear klasy Array, ktra ustawia wybrane
elementy tablicy na warto zero, flase lub null w zalenoci od typu podstawowego tablicy.
Przykad jej uycia zosta zaprezentowany poniej.
int[] tab = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Array.Clear(tab,2,4);
foreach (int i in tab)
{
Console.Write("{0}, ",i);
}
Na ekranie, po wykonaniu powyszego kodu, zostanie wypisane:
1, 2, 0, 0, 0, 0, 7, 8, 9,
W wielu programach istnieje potrzeba dokonania kopi tablicy, w celu jej przetworzenia, bez ryzyka
modyfikacji tablicy rdowej. Skopiowanie wartoci jednej zmiennej tablicowej do drugiej
zmiennej tablicowej, powoduje e obie zmienne tablicowe bd odwoywa si do tego samego
obiektu tablicowego. Powyszy problem jest przedstawiony w poniszym kodu:
typ [] tab1 = new typ[4];
typ [] tab2 = new typ[4];
...
tab1 = tab2;
Po wykonaniu ostatniej instrukcji powyszego kodu, zmienne tablicowe tab1 i tab2 bd
odwoywa si do tego samego obiektu tablicowego.
W celu utworzenia dwch oddzielnych tablic, z ktrych jedna bdzie zawiera kopie elementw
drugiej tablicy naley wykona poniszy kod.
typ [] zrodlo = new typ[rozmiar];
typ [] cel = new typ[rozmiar];
Micha Wodarczyk Modu 07
ITA-104 Wprowadzenie do programowania Operacje na tablicach
Strona 4/12
...
for(int i=0;i<rozmiar;i++)
{
...cel[i] = zrodlo[i];
}
W przypadku kopiowaniu tablic, rozmiar (liczba elementw) tablicy do ktrej kopiujemy elementy
(tablica cel), musi by wystarczajcy do pomieszczenie wszystkich elementw tablicy rdowej.
Warto zwrci te uwag, e w powyszym kodzie, jeeli typ jest typem referencyjnym, to w wyniku
jego dziaania otrzymamy dwie rne tablice, ale elementy tablic bd odwoyway si do tych
samych obiektw.
Przykad implementacji kopiowania tablic z okreleniem liczby elementw, z podaniem numeru
indeksu elementu tablicy rdowej, ktry naley skopiowa pierwszy oraz podaniem indeksu
elementu tablicy docelowej, od ktrego maj by nadpisane elementy, mona znale w programie
Kurs\Demo\Modul7\Modul7.sln projekt Kopiowanie, gdzie Kurs jest katalogiem gdzie skopiowano
pliki kursu. Naley zwrci uwag, e w programie nie ma sprawdzenia poprawnoci indeksw
podanych przez uytkownika, ani iloci elementw do skopiowania. W wypadku podania
nieodpowiednich wartoci tych zmiennych, zgoszony zostanie wyjtek
IndexOutOfRangeException.
W bibliotece .Net Framework kopiowanie tablic jest wykonywane przez metod Copy klasy Array.
Przykad jej uycia zosta zaprezentowany poniej.
int[] tab1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int[] tab2 = {11,12,13,14,15,16,17,18,19 };
Array.Copy(tab1,2,tab2,4,4);
foreach (int i in tab2)
{
Console.Write("{0}, ",i);
}
W wyniku dziaania powyszego kodu na ekranie zostanie wypisane:
11, 12, 13, 14, 3, 4, 5, 6, 19,
Uwaga: Do kopiowania tablic mona uy rwnie metody Clone oraz CopyTo klasy Array.
Wicej informacji na temat tych metod, mona znale w MSDN Library.
Odwracanie tablicy polega na zmianie kolejnoci elementw tablicy. Pierwszy staje si ostatnim, a
ostatni pierwszym.
Przykad implementacji odwrcenia tablicy mona znale w programie
Kurs\Demo\Modul7\Modul7.sln projekt Odwracanie, gdzie Kurs jest katalogiem gdzie
skopiowano pliki kursu.
W bibliotece .Net Framework odwracanie tablicy realizowane jest przez metod Reverse klasy
Array. Przykad jej uycia zosta zaprezentowany poniej.
int[] tab1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9};
Array.Reverse(tab1, 2, 5);
foreach (int i in tab1)
{
Console.Write("{0}, ", i);
Micha Wodarczyk Modu 07
ITA-104 Wprowadzenie do programowania Operacje na tablicach
Strona 5/12
};
W wyniku dziaania powyszego kodu na ekranie zostanie wypisane:
1, 2, 7, 6, 5, 4, 3, 8, 9,
W metodzie Reverse w nawiasach okrgych podajemy tablic, ktra ma zosta odwrcona,
nastpnie po przecinku indeks elementu, od ktrego naley rozpocz odwracanie oraz ilo
elementw, ktre zostan odwrcone.
W bibliotece ,Net Framework istnieje rwnie wersja metody Reverse, ktra odwraca ca tablic.
Przykad jej uycia zosta pokazany poniej:
int[] tab1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9};
Array.Reverse(tab1);
foreach (int i in tab1)
{
Console.Write("{0}, ", i);
};
W wyniku dziaania powyszego kodu na ekranie zostanie wypisane:
9, 8, 7, 6, 5, 4, 3, 2, 1,
Obie wersje metody Reverse wsppracuj tylko z tablicami jednowymiarowymi. Prba uycia ich
do tablic wielowymiarowych spowoduje zgoszenie wyjtku RankException.
Sortowaniem nazywamy proces ustawienia elementw pewnego zbioru w okrelonym porzdku.
Sortowanie wykonuje si w celu uatwienia ewentualnego wyszukiwania elementw danego
zbioru. Na przykad w celu znalezienia okrelonego pliku w danym katalogu, mona posortowa
pliki wedug nazwy. Podobnie hasa w sowniku, czy encyklopedii s ustawione w porzdku
alfabetycznym, czyli s posortowane, aby atwo znale dane haso.
Podczas sortowania mog pojawi si obiekty o tej samej wartoci wyznaczajcej porzdek - o tym
samym kluczu. W przypadku takim, jeeli metoda sortowania nie zmienia ich wzgldnego porzdku,
to metod t nazywamy stabiln.
W przypadku sortowania tablic bardzo jest wana oszczdno pamici. Metod sortowania, ktra
nie potrzebuje tworzenia dodatkowej tablicy, do ktrej przenosimy elementy, nazywamy
sortowaniem w miejscu.
W algorytmice jest szereg metod sortujcych. Jedn z najprostszych, cho niestety niezbyt wydajn,
jest metoda nazywana sortowaniem bbelkowym (bubble sort). Sortowanie bbelkowe polega na
zamianie dwch ssiadujcych ze sob elementw, jeeli wzgldem siebie zajmuj nieprawidowe
miejsca. Dokadny schemat dziaania jest przedstawiony na poniszym schemacie blokowym,
natomiast przykadow implementacj w jzyku C# mona znale w programie
Kurs\Demo\Modul7\Modul7.sln projekt Babelki, gdzie Kurs jest katalogiem gdzie skopiowano pliki
kursu.
Inne algorytmy sortowania zostan przedstawione w dalszej czci kursu.

Micha Wodarczyk Modu 07
ITA-104 Wprowadzenie do programowania Operacje na tablicach
Strona 6/12






















W bibliotece .Net Framework do sortowania tablicy mona uy metody Sort klasy Array.
Przykad jej uycia zosta zaprezentowany poniej.
int[] tab1 = { 4, 1, 83, 41, 53, 36, 47, 18, 29};
Array.Sort(tab1);
foreach (int i in tab1)
{
Console.Write("{0}, ", i);
}
W wyniku dziaania powyszego kodu na ekranie pojawi si:
1, 4, 18, 29, 36, 41, 47, 53, 83,
Metoda Sort klasy Array wykorzystuje algorytm QuickSort. Algorytm ten zostanie przedstawiony
w rozdziale 11 "Rekurencja". Za pomoc metody Sort klasy Array mona sortowa tylko tablice
jednowymiarowe. Gdy sprbujemy sortowa tablic wielowymiarow zostanie zgoszony wyjtek
RankException.
Uwaga: Metoda Sort ma rne wersje - rn list argumentw. Wicej na temat rnych wersji
metody Sort mona znale w MSDN Library.
Start
i = 1;
Dane we: tab - tablica elementw do
sortowania typ elementu tablicy ma
zdefiniowany operator < i =;
rozmiar liczba int, ilo elementw
Zmienne lokalne:
i, j - liczby cakowite, int,
x taki sam typ jak element tablicy
i<rozmiar
?
Stop
j = rozmiar - 1;
j >= i
?
N
T
tab[j]<tab[j-
1]
T
T
i++;
N
j--;
N
x = tab[j];
tab[j]=tab[j-1];
tab[j-1] = x;
swap
-
Micha Wodarczyk Modu 07
ITA-104 Wprowadzenie do programowania Operacje na tablicach
Strona 7/12
Uwaga: Przy pomocy metody Sort mona sortowa tylko tablice, ktrych typ podstawowy, typ
elementu tablicy, implementuje interfejs IComparable. lub IComparer, w zalenoci od wersji
metody Sort. Wicej na temat interfejsw mona znale w kursie "Programowania obiektowe".
Algorytm znalezienia elementu tablicy, ktry spenia okrelone kryteria lub czy ma okrelon
warto, polega na wykonaniu ptli, w ktrej sprawdzamy czy aktualny element spenia wymagane
zaoenia. W przypadku znalezienia elementu speniajcego wymagane zaoenia, przerywamy
wykonywanie ptli. Algorytm taki nazywamy wyszukiwaniem liniowym. W ptli musimy rwnie
sprawdza, czy nie zosta osignity koniec tablicy. Osignicie koca tablicy jest rwnoznaczne ze
stwierdzeniem, e dana tablica nie zawiera elementu speniajcego wymagane zaoenia.
Sprawdzenie czy osignlimy koniec tablicy mona przenie poza ptl, poprawiajc w ten
sposb wydajno algorytmu. Realizuje si to przy zaoeniu, e ostatni element tablicy nie zawiera
istotnych danych. Przed rozpoczciem wyszukiwania ustawia si jego warto tak, aby speniaa
kryteria wyszukiwania. Ostatni element tablicy peni wic rol stranika, a algorytmy korzystajce
ze stranika nazywamy algorytmami ze stranikiem.
Przykad z zastosowaniem wyszukiwania liniowego ze stranikiem mona znale w programie
Kurs\Demo\Modul7\Modul7.sln projekt Liniowe, gdzie Kurs jest katalogiem gdzie skopiowano
pliki kursu.
W bibliotece .Net Framework do znalezienia indeksu elementu tablicy o okrelonej wartoci mona
uy metody IndexOf lub LastIndexOf klasy Array. Metoda IndexOf przeszukuje tablic od
pocztku, metoda LastIndexOf natomiast przeglda tablic od koca. Przykad uycia metody
IndexOf w celu znalezienia indeksw wszystkich elementw o danej wartoci zosta
zaprezentowany poniej.
int[] tab1 = { 2, 5, 7, 5, 12, 6, 5};
int i = Array.IndexOf(tab1, 5);
while(i != -1)
{
Console.Write("{0}, ", i);
i = Array.IndexOf(tab1, 5 , i+1);
}
W wyniku dziaania powyszego kodu na ekranie pojawi si:
1, 3, 6,
Metoda IndexOf oraz LastIndexOf zwracaj indeks elementu, ktrego warto jest zgodna z
wartoci poszukiwan. W przypadku braku takiego elementu metoda zwrci warto -1 (tak
naprawd najmniejszy indeks minus jeden). Wicej o wartoci zwracanej przez metod bdzie
opisane w rozdziale 8 "Funkcje - wstp". W powyszym przykadzie wystpuj dwie wersje metody
Sort, z dwom i trzema argumentami. W obu metodach, jako pierwszy argument podajemy zmienn
tablicow zawierajc uchwyt do tablicy, ktr naley przeszuka, a jako drugi argument warto,
ktr szukamy. W przypadku, gdy podany jest trzeci argument, metoda IndexOf rozpocznie
przeszukiwanie tablicy od elementu o indeksie rwnym wartoci trzeciego argumentu. Oczywicie
przy braku trzeciego argumentu, metoda IndexOf rozpocznie przeszukiwanie tablicy od pierwszego
elementu, a LastIndexOf od ostatniego. Wicej o przesyaniu argumentw do metody i
przecieniu nazwy funkcji bdzie w rozdziale 10 "Przesyanie argumentw do funkcji".
Podobnie jak w przypadku sortowania, mona przeszukiwa tylko tablice jednowymiarowe. Gdy
sprbujemy przeszukiwa tablic wielowymiarow zostanie zgoszony wyjtek RankException.
Uwaga: W celu porwnania elementu z podan wartoci uywa si metody Object.Equals.
Micha Wodarczyk Modu 07
ITA-104 Wprowadzenie do programowania Operacje na tablicach
Strona 8/12
Uwaga: W bibliotece .Net Framework w klasie Array istniej rwnie metody Exists, FindLast,
FindAll, FindIndex, FindLastIndex, ktre przeszukuj tablic w celu znalezienia
elementw tablicy speniajce pewne kryteria. Wicej informacji na temat tych metod mona
znale w MSDN Library.
W przypadku, gdy chcemy przeszukiwa tablice posortowane, wydajno operacji wyszukiwania
mona znacznie poprawi, stosujc wyszukiwanie binarne inaczej nazywane powkowym. W
przypadku wyszukiwania binarnego wybran warto porwnujemy z rodkowym elementem
tablicy. Jeeli warto rodkowego elementu jest rwna wybranej wartoci, przerywamy
wyszukiwanie. Element rodkowy jest szukanym elementem. W przypadku, gdy wybrana warto
jest mniejsza od wartoci rodkowego elementu, dan warto prbujemy znale w pierwszej
poowie tablicy. Gdy wybrana warto jest wiksza od wartoci rodkowego elementu, dan
warto prbujemy znale w drugiej poowie tablicy. Oczywicie do wyszukiwania danej
wartoci w poszczeglnych czciach tablicy stosujemy wyszukiwanie powkowe. Wyszukiwanie
koczymy w momencie znalezienia danej wartoci lub, gdy w wyniku podziaw otrzymamy pust
podtablic, co jest rwnowane z brakiem elementu o danej wartoci w tablicy.
W bibliotece .Net Framework wyszukiwanie binarne jest realizowane przez metod
BinarySearch klasy Array. Metoda ta zwraca nur indeksu elementu, ktrego warto jest rwna
danej wartoci. W przypadku, gdy w tablicy znajduje si kilka elementw o danej wartoci,
metoda zwrci numer indeksu tylko jednego elementu i niekoniecznie pierwszego. Gdy tablica nie
zawiera elementu o danej wartoci metoda BinarySearch zwrci warto ujemn. Wicej na
temat wartoci zwracanych przez metod mona znale w rozdziale smym tego kursu. Metoda ta
moe przeszukiwa tylko tablice jednowymiarowe. Gdy sprbujemy przeszukiwa tablic
wielowymiarow zostanie zgoszony wyjtek RankException.
Uwaga: Metoda BinarySearch ma rne wersje - rn list argumentw. Wicej na temat
rnych wersji metody Sort mona znale w MSDN Library.
Uwaga: Przy pomocy metody BinarySearch mona przeszukiwa tylko tablice, ktrych typ
podstawowy, typ elementu tablicy, implementuje interfejs IComparable. lub IComparer, w
zalenoci od wersji metody BinarySearch. Wicej na temat interfejsw mona znale w kursie
"Programowania obiektowe".


Micha Wodarczyk Modu 07
ITA-104 Wprowadzenie do programowania Operacje na tablicach
Strona 9/12
Laboratorium podstawowe
Problem 1 (czas realizacji 20 minut)
Napisz program, ktry sortuje tablic metod przez wstawianie. Tablic zainicjalizuj liczbami
pseudolosowymi, korzystajc z generatora liczb pseudolosowych:
Random r = new Random(); //utworzenie obiektu
//generatora liczb pseudolosowych
double n = r.NextDouble(); //losowanie liczby
//rzeczywistej z przedziau <0;1>
Metoda sortowania przez wstawianie (insertion sort) jest podobna do sposobu, jaki stosujemy przy
ukadaniu kart. Tablice dzielimy na umowne dwie podtablice. Pierwsza podtablica jest
posortowana. Druga podtablica jest rdem elementw, ktre naley wstawi w odpowiednie
miejsce w tablicy pierwszej. Oczywicie po wstawieniu elementu, rozmiar podtablicy posortowanej
jest zwikszany o jeden, natomiast rozmiar podtablicy rdowej zmniejszany o jeden. Sortowanie
rozpoczynamy od zaoenia, e podtablica posortowana zawiera tylko jeden element - pierwszy
element tablicy. Sortowanie koczymy w momencie, kiedy w podtablicy rdowej nie ma wicej
elementw.
Schemat blokowy metody sortowanie przez wstawianie znajduje si w pliku
Kurs\Lab\Modul7\Start\Wstawianie.gif, gdzie Kurs jest katalogiem gdzie skopiowano pliki kursu.
Zadanie Tok postpowania
1. Utwrz nowy
projekt w Visual C#
2008 Express
Edition
Otwrz Visual C# 2008 Express Edition.
Z menu wybierz File -> New Project.
Z listy Visual Studio installed templates wybierz Console Application.
W polu Name wpisz Wstawianie.
Kliknij OK.
Z menu wybierz File -> Wstawianie.
W polu Location wybierz folder w ktrym bdzie zapisany projekt.
Zaznacz pole wyboru Create directory for solution.
W polu Solution Name wpisz Modul07.
Nacinij przycisk Save.
2. Wewntrz
metody Main
zaimplementuj
odpowiedni kod
Utwrz obiekt tablicy pitnastoelementowej liczb rzeczywistych.
double [] tablica = new double[15];
Nadaj elementom tablicy wartoci losowe z przedziau od zera do
jednego, korzystajc z generatora liczb pseudolosowych.
Random generator = new Random();
for(int i = 0; i < tablica.Length; i++)
{
tablica[i] = generator.NextDouble();
}
Wypisz wartoci elementw tablicy korzystajc z ptli foreach.
Console.WriteLine("Wylosowano nastpujce wartoci: ");
foreach(double i in tablica)
{
Console.Write("{0:f3}; ", i);
}
Podziel tablic na dwie czci, podtablic rdow i podtablic
posortowan. Pobieraj elementy z podtablicy rdowej, od pierwszego
Micha Wodarczyk Modu 07
ITA-104 Wprowadzenie do programowania Operacje na tablicach
Strona 10/12
elementu i wstawiaj w odpowiednie miejsce w podtablicy posortowanej.
Czynno powtarzaj pki podtablica posortowana nie bdzie pusta.
double x;
int j;
for (int i = 1; i < tablica.Length; i++)
{
x = tablica[i];
for(j = i-1; j >= 0 && x < tablica[j]; j--)
{
tablica[j + 1] = tablica[j];
}
tablica[j + 1] =
}
Uwaga:
Podczas wstawiania mona wykorzysta wyszukiwanie powkowe.
Powyszy kod mona zastpi wtedy nastpujcym:
int j, l, p, m;
double x;
for (int i = 1; i < tablica.Length; i++)
{
x = tablica[i];
l = 0; p = i - 1;
while (l <= p)
{
m = (l + p) / 2;
if (x < tablica[m])
p = m - 1;
else
l = m + 1;
}
for (j = i - 1; j >= l; j--)
{
tablica[j + 1] = tablica[j];
}
tablica[j + 1] = x;
}
W celu sprawdzenia poprawnoci dziaania programu wypisz wartoci
elementw tablicy..
Console.WriteLine("\n\nElementy tablicy po
sortowaniu: ");
foreach (double i in tablica)
{
Console.Write("{0:f3}; ", i);
}
Console.ReadKey();
3. Skompiluj, a
nastpnie uruchom
program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu, z menu Debug wybierz Start Debugging.

Problem 2 (czas realizacji 25 minut)
Napisz program, ktry w celu sprawdzenia czy w tablicy znajduje si element o danej wartoci
stosuje algorytm wyszukiwania binarnego. Uyj tablicy zawierajcej napisy. Do porwnania dwch
obiektw string, czy zawieraj ten sam napis, uyj metody String.Compare(napis1,
napis2). Metoda ta zwraca warto mniejsz od zera, gdy napis1 "jest mniejszy" od napis2
(jest wczeniej w sowniku). Warto zero oznacza, e obie zmienne zawieraj uchwyt do obiektw
Micha Wodarczyk Modu 07
ITA-104 Wprowadzenie do programowania Operacje na tablicach
Strona 11/12
z tym samym tekstem. Warto wiksza od zera oznacza, e napis1 "jest wikszy" od napis2
(wystpuje pniej w sowniku).
Zadanie Tok postpowania
1. Do biecego
rozwizania dodaj
nowy projekt
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy rozwizanie, a nastpnie z menu kontekstowego wybierz
Add -> New Project.
W oknie dialogowym Add New Project z listy Visual Studio installed
templates wybierz Console Application.
W polu Name wpisz Binarne.
Kliknij OK.
2. Zaznacz projekt
Binarne jako
projekt startowy
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy projekt Binarne, a nastpnie z menu kontekstowego
wybierz Set as StartUp Project.
3. Wewntrz
metody Main
zaimplementuj
odpowiedni kod
Utwrz tablic zawierajc nazwy miast, nastpnie j posortuj i wypisz jej
elementy na ekranie:
string[] miasta = {"Pozna", "Warszawa",
"Czstochowa", "Gdask", "d", "Krakw",
"Wrocaw", "Biaystok", "Szczecin"};
Array.Sort(miasta);
Console.WriteLine("Elementy tablicy po sortowaniu: ");
foreach (string miasto in miasta)
{
Console.Write("{0}, ", miasto);
}
Pobierz od uytkownika nazw miasta do sprawdzenia
Console.Write("\n\nPodaj nazw miasta: ");
string s = Console.ReadLine();
Zadeklaruj trzy zmienne cakowite: lewy, prawy i srodek i nadaj im
odpowiednio wartoci: zmiennej lewy warto zero, zmiennej prawy
warto rwn grnemu indeksowi tablicy, zmiennej srodek warto
indeksu rodkowego elementu tablicy.
int lewy = 0, prawy = miasta.Length - 1;
int srodek = (lewy + prawy) / 2;
Pki warto zmiennej lewy jest mniejsza lub rwna od wartoci
zmiennej prawy, wykonuj co nastpuje:
Jeeli element o indeksie rwnym wartoci zmiennej srodek zawiera
miasto takie jak poda uytkownik zakocz ptl.
Jeeli element o indeksie rwnym wartoci zmiennej srodek zawiera
miasto, ktre w kolejnoci alfabetycznej wystpuje przed miastem
podanym przez uytkownika, zmiennej prawy nadaj warto zmiennej
srodek pomniejszon o jeden.
Jeeli element o indeksie rwnym wartoci zmiennej srodek zawiera
miasto, ktre w kolejnoci alfabetycznej wystpuje po miecie
podanym przez uytkownika, zmiennej lewy nadaj warto zmiennej
srodek powikszon o jeden.
Zmiennej srodek nadaj warto rwn poowie sumy wartoci
zmiennej lewy i prawy.
int flaga;
while (lewy <= prawy )
Micha Wodarczyk Modu 07
ITA-104 Wprowadzenie do programowania Operacje na tablicach
Strona 12/12
{
flaga = String.Compare(s, miasta[srodek]);
if (flaga == 0)
{
break;
}
else
{
if (flaga < 0)
{
prawy = srodek - 1;
}
else
{
lewy = srodek + 1;
}
}
srodek = (lewy + prawy) / 2;
}
Jeeli warto zmiennej lewy jest mniejsza lub rwna od wartoci
zmiennej prawy, wypisz na ekranie informacj, e tablica zawiera podane
miasto, w przeciwnym wypadku wypisz, e tablica nie zawiera podanego
miasta. Nastpnie zatrzymaj program, aby uytkownik mg obejrze
wyniki.
if (lewy <= prawy)
{
Console.Write("Podane miasto ma w tablicy indeks {0}.", srodek);
}
else
{
Console.Write("Tablica nie zawiera podanego miasta.");
}
Console.ReadKey();

4. Skompiluj i
uruchom program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu z menu Debug wybierz Start Debugging.

ITA-104 Wprowadzenie do programowania
Micha Wodarczyk
Modu 9
Wersja 2
Funkcje - wstp
Spis treci
Funkcje - wstp .................................................................................................................................... 1
Informacje o module ............................................................................................................................ 2
Przygotowanie teoretyczne ................................................................................................................. 3
Podstawy teoretyczne.................................................................................................................. 3
Laboratorium podstawowe ................................................................................................................ 10
Problem 1 (czas realizacji 45 minut) .......................................................................................... 10

Micha Wodarczyk Modu 09
ITA-104 Wprowadzenie do programowania Funkcje - wstp
Strona 2/12
Informacje o module
Opis moduu
W tym module zostan zaprezentowane moliwoci definiowania i
wykorzystywania metod w aplikacji. Przedstawiono moliwoci
przekazywania zmiennych do i z metody oraz mechanizm obsugi wyjtkw
w przypadku zgoszenia wyjtku wewntrz metody.
Cel moduu
Celem moduu jest wprowadzenie pojcia funkcji.
Uzyskane kompetencje
Po zrealizowaniu moduu bdziesz:
Definiowa metody w jzyku C#.
Wywoywa metod.
Okrela warto przekazywan przez metod.
Wymienia informacj midzy metodami przy pomocy zmiennych
wspdzielonych.
Rozumie mechanizm obsugi wyjtkw w przypadku zgoszenia
wyjtku wewntrz metody.
Tworzy bibliotek wasnych metod przy pomocy Visual Studio i z niej
korzysta.
Wymagania wstpne
Przed przystpieniem do pracy z tym moduem powiniene:
zna struktur programu w jzyku C#
zna podstawowe instrukcje sterujce
umie definiwa tablice
Mapa zalenoci moduu
Zgodnie z map zalenoci przedstawion na rys. 1, przed przystpieniem
do realizacji tego moduu naley zapozna si z materiaem zawartym
w moduach: Wstp, Uycie zmiennych, Instrukcja wyboru if...else.
Obsuga wyjtkw, Instrukcje iteracji - ptle, Pozostae instrukcje
sterujce, Tablice, Operacje na tablicach.

Rys. 1 Mapa zalenoci moduu

Micha Wodarczyk Modu 09
ITA-104 Wprowadzenie do programowania Funkcje - wstp
Strona 3/12
Przygotowanie teoretyczne
Podstawy teoretyczne
Wyodrbnion cz programu, stanowic pewn cao, majc ustalony sposb wymiany
danych (informacji) z pozostaymi czciami programu, ktra jest reprezentowana przez
jednoznaczn nazw i moe by wywoana dowoln ilo razy w innej czci programu nazywamy
funkcj. Prociej mona powiedzie, e funkcja to cig instrukcji, ktry posiada nazw, czyli jest to
podprogram.
W jzyku C# funkcje moemy tylko definiowa wewntrz klasy lub struktury. Funkcj zdefiniowan
w bloku kodu klasy lub struktury nazywamy metod.
Uywanie funkcji w programie posiada nastpujce zalety:
Moliwo wykorzystania wielokrotnie tego samego kodu bez koniecznoci jego przepisania.
Uproszczenie kodu przez podzia zoonego problemu na mniejsze i spjne logicznie
fragmenty.
Moliwo powtrnego uycia kodu w innym programie, dziki tworzeniu bibliotek funkcji.
atwiejsze testowanie i wykrywanie bdw logicznych - atwiej przetestowa mniejsze
kawaki kodu, ktre maj realizowa konkretne zadania.
Program staje si mniejszy, mniej linii kodu, przez co staje si atwiejszy do zrozumienia.
Moliwo rozdzielenia pracy przy tworzeniu programu wrd kilku osb.
Zmniejszenie rozmiaru pliku wynikowego.
Uwaga: W kursie tym omawiane jest tylko tworzenie metod statycznych. Metody nie statyczne i
rnice miedzy metodami statycznymi i nie statycznymi jest dokadnie omwione w kursie
"Programowanie obiektowe".
W celu zdefiniowania metody stosujemy nastpujc notacj:
static typ_zwracany Nazwa(lista_argumentw)
{
//ciao metody
}
W powyszym zapisie jako typ_zwracany mona poda dowolny typ, zarwno typ wartoci jak i typ
referencyjny. Przekazywanie wartoci przez metod zostanie dokadnie omwione w dalszej czci
tego rozdziau. Do tego czasu bdziemy zakada, e funkcja nie zwraca adnej wartoci. Realizuje
si to przez podanie jako typ_zwracany sowa kluczowego void.
Sowo nazwa oznacza nazw metody, ktra w jednoznaczny sposb identyfikuje metod.
Nadawanie nazw metodom podlega tym samym reguom, co tworzenie identyfikatorw
zmiennych, czyli nazwa moe skada si z cyfr, liter i znaku podkrelenia, nazwa nie moe
rozpoczyna si od cyfry, nie moe by sowem kluczowym i musi by unikalna w danym bloku
kodu. Ostatnia regua w przypadku metod ma jednak pewne wyjtki. Zostanie dokadnie to
omwione w nastpnym rozdziale przy omawianiu tematu "Przecienie nazwy metody". Przy
tworzeniu nazw metod naley stosowa format PascalCase.
Po nazwie metody umieszczamy nawisy okrge. Jeeli metoda przyjmuje jakie argumenty, to
naley ich definicj umieci wewntrz tych nawiasw. Przekazywanie argumentw do funkcji
zostanie przedstawione w rozdziale dziewitym " Przesyanie argumentw do metody".
Nastpnie po nawiasach okrgych umieszczana jest definicja - przepis, co metoda ma realizowa,
czyli cig instrukcji ktre metoda wykonuje. Instrukcje te umieszcza si w nawiasach klamrowych.
Czynno t wykonywae ju wielokrotnie definiujc metod Main.
Micha Wodarczyk Modu 09
ITA-104 Wprowadzenie do programowania Funkcje - wstp
Strona 4/12
W przedstawionej definicji metody wystpuje jeszcze sowo kluczowe static. Dokadna jego
interpretacja zostanie przedstawiona w kursie "Programowanie obiektowe". Na potrzeby tego
kursu naley przyj, e musi ono wystpowa.
W przypadku metod, ktre bd wywoywane z metod definiowanych w innej klasie przed sowem
static naley umieci jeszcze sowo kluczowe public. Dokadne znaczenie sowa kluczowego public
zostanie rwnie omwione w kursie "Programowanie obiektowe".
Poniej przedstawiono przykadowy kod definiujcy dwie metody: metod Main oraz metod
Powitanie.
class Program
{
static void Main()
{
//ciao metody Main
}
public static void Powitanie()
{
Console.WriteLine("Cze!!!");
}
}
Wszystkie funkcje w jzyku C# s metodami, czyli musz by definiowane wewntrz klasy lub
struktury.
Metod nie wolno definiowa wewntrz innej metody, musz by definiowane bezporednio w
bloku kodu klasy lub struktury.
Wywoanie metody polega na wykonaniu cigu instrukcji podanych w bloku kodu metody w
miejscu wywoania. Metod wywouje si przez podanie jej nazwy zakoczonej par nawiasw
okrgych. W przypadku, gdy metoda pobiera argumenty, odpowiednie wartoci lub zmienne
naley poda wewntrz nawiasw okrgych. Wicej na temat przesyania argumentw do metody
bdzie podane w rozdziale dziewitym "Przesyanie argumentw do metody". Przykad wywoania
metody Powitanie w metodzie Main przedstawiono poniej.
class Program
{
static void Main()
{
Powitanie();
Console.ReadKey()
}
public static void Powitanie()
{
Console.WriteLine("Cze!!!");
}
}
W wyniku dziaania powyszego programu na ekranie pojawi si napis:
Micha Wodarczyk Modu 09
ITA-104 Wprowadzenie do programowania Funkcje - wstp
Strona 5/12
Cze!!!
W przypadku gdy metoda jest zdefiniowana w innej klasie ni metoda j wywoujca, przy
wywoaniu nazw metody naley poprzedzi nazw klasy, w ktrej jest zdefiniowana. Midzy
nazw klasy, a nazw metody umieszczamy znak kropki (operator dostpu do skadowej). Ilustruje
to poniszy przykad.
class Program
{
static void Main()
{
KlasaPomocnicza.Powitanie();
Console.ReadKey()
}
}
class KlasaPomocnicza
{
public static void Powitanie()
{
Console.WriteLine("Cze!!!");
}
}
Oczywicie, co ju byo wspominane wczeniej w tym rozdziale, w przypadku metod ktre bd
wywoywane z metod definiowanych w innej klasie, przed sowem static koniecznie trzeba umieci
sowo kluczowe public.
W przypadku gdy definicja klasy znajduje si w innej przestrzeni nazw, naley rwnie uwzgldni
nazw przestrzeni nazw:
NazwaPrzestrzeniNazw.NazwaKlasy.NazwaMetody();
lub uy dyrektywy using.
Warto przekazana lub inaczej zwrcona przez metod jest to warto, ktra jest wstawiana w
miejscu wywoania metody i jest to warto wyraenia wystpujcego z prawej strony instrukcji
return, nalecej do instrukcji danej metody. Nazwa typu umieszczona przed nazw metody okrela
typ wartoci przekazanej. Typ wartoci przekazanej musi by zgodny z typem wyniku wyraenia
stojcego obok instrukcji return - musi by identyczny lub musi istnie konwersja niejawna z typu
wyniku wyraenia do typu wartoci zwracanej. Rozwamy to na przykadzie. Napiszmy metod,
ktra przekazuje liczb lat, ktre upyny od chrztu Polski. W celu uzyskania biecego roku
uyjemy nastpujcej konstrukcji: DateTime.Now.Year. Metoda przekazuje liczb cakowit i jej
definicja moe wyglda nastpujco:
static int LiczbaLat() //brak rednika!!!
{
int iloscLat = DateTime.Now.Year - 966;
return iloscLat;
}
Micha Wodarczyk Modu 09
ITA-104 Wprowadzenie do programowania Funkcje - wstp
Strona 6/12
Metoda LiczbaLat przekazuje liczb cakowit i obok instrukcji return stoi zmienna typu
cakowitego. Powysz funkcj mona zapisa krcej:
static int LiczbaLat()
{
return DateTime.Now.Year - 966;
}
Powysz metod moemy wykorzysta w nastpujcy sposb:
int n = LiczbaLat();
Console.WriteLine("Liczba lat od chrztu Polski: {0}", n);
lub krcej:
Console.WriteLine("Liczba lat od chrztu Polski: {0}", LiczbaLat());
W obu przypadkach na ekranie pojawi si napis (zakadajc e obecny rok to 2006)
Liczba lat od chrztu Polski: 1040
Funkcj rwnie moemy wywoa wewntrz wyraenia. Zamy, e od chrztu Polski rozpoczto
usypywa kopiec i co roku do kopca dodawano 243 kamienie. W celu wypisania na ekranie z ilu
kamieni aktualnie skada si kopiec moemy uy nastpujcego kodu.
int liczbaKamieni = 243 * LiczbaLat();
Console.WriteLine("Ilo komieni z ktrych skada si " +
"kopiec wynosi: {0}", liczbaKamieni);
lub krcej
Console.WriteLine("Ilo komieni z ktrych skada si " +
"kopiec wynosi: {0}", 243 * LiczbaLat());
Instrukcja return oprcz zwrcenia wartoci powoduje natychmiastowe wyjcie z funkcji.
Rozwamy na przykad funkcj obliczajc silni. Mona j zaimplementowa w nastpujcy
sposb:
Uwaga: Silnia dla liczby n cakowitej nieujemnej oznaczamy znakiem wykrzyknika i okrelamy
nastpujcym wzorem:



static long Silnia()
{
uint n;
Console.Write("Podaj n: ");
n = Convert. ToUInt32(Console.ReadLine());
if(n<2)
return 1;
long iloczyn = 1;
for(uint i = 2;i <= n; i++)
{

=
=
=
,... 3 , 2 , 1 * ) 1 ( * ... * 2 * 1
0 1
!
n dla n n
n dla
n
Micha Wodarczyk Modu 09
ITA-104 Wprowadzenie do programowania Funkcje - wstp
Strona 7/12
iloczyn *= i;
}
return iloczyn;
}
W powyszym przykadzie, jeeli uytkownik nada zmiennej n warto jeden lub zero, to metoda
wykona instrukcj return 1, ktra spowoduje wyjcie z metody oraz przekazanie wartoci 1 przez
metod. Instrukcje zaznaczone czcionk pogrubion nie zostan wykonane.
W przypadku gdy jako nazwa typu przekazywanego przez metod pojawi si sowo void, przyjmuje
si, e metoda nie zwraca adnej wartoci. W bloku kodu "metody void" moe pojawi si
instrukcja return. Oznacza ona tylko wyjcie z metody i nie moe obok niej pojawi si adne
wyraenie. Za sowem return trzeba od razu postawi rednik.
zmiennych lokalnych. Zmienne lokalne s dostpne tylko w bloku metody gdzie zostay
zdefiniowane, a dokadniej mona je uywa od miejsca definicji do koca bloku gdzie zostay
zdefiniowane.
static void Metoda()
{
...
int x = 2;
...
{
...
int y = 1;
...
}
...
}
W miejscu koca bloku kodu, pami zajmowana przez zmienne lokalne zdefiniowane w danym
bloku zostaje zwolniona, dlatego te czsto fragment kodu od miejsca definicji zmiennej do koca
bloku, w ktrym zostaa zdefiniowana, nazywamy czasem ycia zmiennej. Naley pamita, e
zwolnienie pamici zajmowanej przez zmienn typu referencyjnego, nie jest rwnoznaczne z
zwolnieniem obiektu, do ktrego zmienna zawieraa odwoanie.
Zmienne moemy rwnie definiowa bezporednio w bloku klasy lub struktury. Zmienne takie
definiujemy podobnie jak zmienne lokalne, z tym e ca definicj poprzedzamy sowem static.
Zmienne te s wsplne dla wszystkich metod danej klasy, dlatego mona je nazwa zmiennymi
wspdzielonymi. Troszeczk upraszczajc moemy zaoy, e zmienne wspdzielone s dostpne
od pocztku dziaania programu do jego koca we wszystkich metodach danej klasy. Mog suy
one do wymiany informacji midzy rnymi metodami.
...
class Program
{
static int Main(string[] args)
{
Console.Write("Podaj liczb n: ");
n = Convert.ToUInt32(Console.ReadLine());
Console.WriteLine("{0}! = {1}",n,Silnia());
Console.ReadKey();
return 0;
}

static uint n; //definicja zmiennej wspdzielonej

"Czas ycia"
zmiennej y
"Czas ycia"
zmiennej x
Micha Wodarczyk Modu 09
ITA-104 Wprowadzenie do programowania Funkcje - wstp
Strona 8/12
static ulong Silnia()
{
ulong iloczyn = 1;
for(uint i = 2;i<=n;i++)
iloczyn*=i;
return iloczyn;
}
}
W powyszym przykadzie zmienna wspdzielona n jest uywana zarwno w metodzie Silnia jak
i metodzie Main. Jak wida nie wana jest kolejno definicji metody i zmiennej wspdzielonej.
Zmienna wspdzielona jest dostpna dla wszystkich metod danej klasy.
Zmienna wspdzielona moe by rwnie dostpna dla metod innych klas. Definicj takiej
zmiennej naley wtedy poprzedzi sowem kluczowym public. Odwoujc si do zmiennej
wspdzielonej zdefiniowanej w innej klasie, jej nazw naley poprzedzi nazw klasy, w ktrej jest
zdefiniowana i znakiem kropki. W przypadku gdy klasy znajduj si w rnych przestrzeniach nazw
nie wolni zapomnie o nazwie przestrzeni nazw lub jej "zaimportowaniu" przy pomocy dyrektywy
using .
NazwaPrzestrzeni.NazwaKlasy.NazwaZmiennej;
Zmienna lokalna moe mie t sam nazw co zmienna wspdzielona. Jest to wyjtek od
zasady, e w danym bloku kodu, dotyczy to rwnie blokw zagniedonych, nie mona nada
jednego identyfikatora dwm rnym elementom. Nadanie zmiennej lokalnej nazwy takiej samej
jak nazwa zmiennej wspdzielonej nazywamy przesoniciem nazwy. W metodzie wewntrz ktrej
zdefiniowana jest zmienna lokalna o identycznym identyfikatorze, jaki ma zmienna wspdzielona,
w celu odwoania si do zmiennej wspdzielonej naley uy konstrukcji:
NazwaKlasy.NazwaZmiennejWspoldzielonej.
class Klasa
{
...
static int nazwa = 10;
...
static int Metoda()
{
...
int nazwa = 200;
Console.WriteLine(nazwa); //200
Console.WriteLine(Klasa.nazwa); //10
...
}
}
Uwaga:
Zmienne wspdzielone najczciej nazywane s polami statycznymi. Pola statyczne i ich prawdziwa
istota i zastosowanie zostanie dokadnie omwione w kursie "Programowanie obiektowe".
W przypadku gdy wewntrz metody zostanie zgoszony wyjtek, na pocztku sprawdzane jest, czy
instrukcja powodujca zgoszenie wyjtku znajduje si w bloku try i z tym blokiem zwizany jest
blok catch obsugujcy zgoszony wyjtek. Jeeli taki blok istnieje wyjtek zostaje obsuony.
Natomiast gdy instrukcja powodujca wyjtek nie znajduje si w adnym bloku try lub z adnym
blokiem try w ktrym znajduje si kod zgaszajcy wyjtek nie jest skojarzony blok catch
obsugujcy dany wyjtek, program wraca w miejsce wywoania danej metody i traktuje instrukcj
wywoania metody, jako instrukcj powodujc zgoszenie wyjtku. Podczas powrotu do miejsca
wywoania metody, wszystkie zmienne lokalne danej metody s usuwane - pami przez nie
zajmowana jest zwalniana. Poszukiwanie bloku catch obsugujcego zgoszony wyjtek, odbywa si
Micha Wodarczyk Modu 09
ITA-104 Wprowadzenie do programowania Funkcje - wstp
Strona 9/12
przez acuch funkcji wywoujcych a do metody Main. Jeeli rwnie w metodzie Main zgoszony
wyjtek nie jest przechwycony program koczy dziaanie.
Proces przegldania acucha wywoa funkcji w celu znalezienia odpowiedniego bloku catch, wraz
ze zwolnieniem pamici zajmowanej przez zmienne lokalne poszczeglnych funkcji nazywamy
zwijaniem stosu.



Micha Wodarczyk Modu 09
ITA-104 Wprowadzenie do programowania Funkcje - wstp
Strona 10/12
Laboratorium podstawowe
Problem 1 (czas realizacji 45 minut)
Napisz program wspierajcy prac kasjera. Program pobiera cen towaru zakupionego przez klienta
oraz kwot ktr wpaca klient, nastpnie wypisuje cen brutto i kwot podatku od danej ceny
brutto oraz minimaln ilo banknotw i monet ktr naley wyda klientowi w postaci reszty.
Program podziel na metody:
metod pobierajc cen netto i obliczajc cen brutto. Po obliczeniu ceny brutto
wypisuje j na ekranie i pobiera kwot wpacon przez klienta. W przypadku gdy cena
brutto towaru jest wiksza od kwoty wpaconej zgo wyjtek. Stawk podatku przechowuj
w staej nazwanej StawkaPodatku.
metod wypisujc na ekranie cen brutto, cen netto, kwot wpacon przez klienta i
kwot podatku.
metod wypisujc jak wyda reszt klientowi. Zakadamy, e chcemy reszt wyda przy
uyciu minimalnej iloci banknotw i monet. Najpierw wydajemy banknot lub monet o
najwikszym dopuszczalnym nominale. Czynno powtarzamy, a do wydania nic nie
pozostanie. Algorytm powyszy funkcjonuje na zasadzie, e wykonuje si dziaanie, ktre
wydaje si najlepsze w danej chwili, nie uwzgldniajc tego, jak to wpynie na
wynik(wydajno) w przyszoci. Algorytmy dziaajce wedug tej zasady nazywamy
algorytmami zachannymi (greedy algorithm).
metody Main, ktra wywouje w ptli powysze metody. Metoda Main rwnie obsuguje
wyjtek zgoszony przez metod obliczajc cen brutto towaru.
Zadanie Tok postpowania
1. Utwrz nowy
projekt w Visual C#
2008 Express
Edition
Otwrz Visual C# 2008 Express Edition.
Z menu wybierz File -> New Project.
Z listy Visual Studio installed templates wybierz Console Application.
W polu Name wpisz Kasjer.
Kliknij OK.
Z menu wybierz File -> Kasjer.
W polu Location wybierz folder w ktrym bdzie zapisany projekt.
Zaznacz pole wyboru Create directory for solution.
W polu Solution Name wpisz Modul09.
Nacinij przycisk Save.
2. Zdefiniuj
zmienne
wspdzielone
Zdefiniuj trzy zmienne wspdzielone typu decimal: cenaBrutto i
kwotaWplacona, cenaNetto.
static decimal cenaBrutto,kwotaWplacona, cenaNetto;
Zdefiniuj sta nazwan wspdzielon StawkaPodatku typu decimal i
nadaj jej warto 0,22.
const decimal StawkaPodatku = 0.22m;
Uwaga:
Sta nazwane wspdzielone definiujemy bez sowa static!!!
3. Utwrz metod
Pobierz, ktra
bdzie pobiera od
uytkownika cen
netto towaru i
oblicza cen
Utwrz metod Pobierz, ktra bdzie pobiera od uytkownika cen
netto towaru i oblicza cen brutto. Nastpnie wypisze cen brutto i
pobierze kwot wpacon przez klienta. Jeeli cena towaru brutto jest
wiksza od kwoty wpaconej przez uytkownika zgo wyjtek. Po
pobraniu obu wartoci (ceny netto i kwoty podanej przez klienta) oraz po
obliczeniu ceny brutto zaokrglij wszystkie wartoci do dwch miejsc po
Micha Wodarczyk Modu 09
ITA-104 Wprowadzenie do programowania Funkcje - wstp
Strona 11/12
brutto. przecinku przy pomocy metody Round struktury Decimal.
cenaNetto = Decimal.Round(cenaNetto, 2); Pilnuj aby wartoci
wprowadzone byy wiksze od zera.
static void Pobierz()
{
do
{
Console.Write("\nPodaj cen (netto) towaru " +
"zakupionego przez klienta: ");
cenaNetto =
Convert.ToDecimal(Console.ReadLine());
}
while (cenaNetto <= 0);
cenaNetto = Decimal.Round(cenaNetto, 2);
cenaBrutto = Decimal.Round(
cenaNetto * ( 1 + StawkaPodatku),2);
Console.WriteLine("Cena brutto wynosi: {0:C}", cenaBrutto);
do
{
Console.Write("\nPodaj kwot wpacon przez klienta: ");
kwotaWplacona = Convert.ToDecimal(Console.ReadLine());
}
while (kwotaWplacona <= 0);
kwotaWplacona = Decimal.Round(kwotaWplacona, 2);
if (cenaBrutto > kwotaWplacona)
throw new Exception("Cena towaru nie moe by " +
"wiksza od kwoty wpaconej przez klienta!!!");
}
4. Utwrz metod
Wypisz, ktra
wypisuje na
ekranie kwot
wpacon przez
klienta, cen
brutto, cen netto,
kwot podatku.
Utwrz metod Wypisz, ktra wypisuje na ekranie kwot wpacon
przez klienta, cen brutto, cen netto, kwot podatku.
static void Wypisz()
{
Console.WriteLine("\n\n\n*******************");
Console.WriteLine("\nKwota wpacona przez klienta: {0:C}",
kwotaWplacona);
Console.WriteLine("\nCena netto: {0:C}", cenaNetto);
Console.WriteLine("\nCena brutto: {0:C}", cenaBrutto);
Console.WriteLine("\nWarto podatku: {0:C}",
cenaBrutto - cenaNetto);
}
5. Utwrz metod
Reszta, ktra
wypisuje na
ekranie ilo
poszczeglnych
banknotw i
monet
Utwrz metod Reszta, ktra wypisuje na ekranie ilo poszczeglnych
banknotw i monet, ktre trzeba da klientowi, aby wyda mu reszt.
Rozpocznij od obliczenia iloci banknotw 100 z, nastpnie 20 z, 10 z
itd.
static void Reszta()
{
decimal reszta = kwotaWplacona - cenaBrutto;
int ilosc = 0;
Console.WriteLine("\nWarto reszty nalenej klientowi: {0:C}",
reszta);
while (100 <= reszta)
{
ilosc++;
reszta -= 100;
}
if (ilosc != 0)
{
Console.WriteLine("\tLiczba banknotw {0:C}: {1}",
100, ilosc);
ilosc = 0;
Micha Wodarczyk Modu 09
ITA-104 Wprowadzenie do programowania Funkcje - wstp
Strona 12/12
}
while (50 <= reszta)
{
ilosc++;
reszta -= 50;
}
if (ilosc != 0)
{
Console.WriteLine("\tLiczba banknotw {0:C}: {1}",
50, ilosc);
ilosc = 0;
}
...
...
...
}
6. Wewntrz
metody Main
zaimplementuj
odpowiedni kod
W metodzie Main wywouj, pki jest klient do obsuenia, powyej
zdefiniowane metody. Obsu rwnie wyjtek zgaszany w metodzie
Pobierz.
static void Main(string[] args)
{
char c='t';
do
{
try
{
Pobierz();
Wypisz();
Reszta();
Console.WriteLine("\n\nCzy jest jeszcze jaki klient?");
c = Console.ReadKey().KeyChar;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
while (c == 't' || c == 'T');
}

7. Skompiluj, a
nastpnie uruchom
program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu, z menu Debug wybierz Start Debugging.


ITA-104 Wprowadzenie do programowania
Micha Wodarczyk
Modu 10
Wersja 2
Przesyanie argumentw do metody
Spis treci
Przesyanie argumentw do metody ................................................................................................... 1
Informacje o module ............................................................................................................................ 2
Przygotowanie teoretyczne ................................................................................................................. 3
Podstawy teoretyczne.................................................................................................................. 3
Laboratorium podstawowe ................................................................................................................ 10
Problem 1 (czas realizacji 15 minut) .......................................................................................... 10
Problem 2 (czas realizacji 25 minut) .......................................................................................... 11

Micha Wodarczyk Modu 10
ITA-104 Wprowadzenie do programowania Przesyanie argumentw do metody
Strona 2/14
Informacje o module
Opis moduu
W tym module zostan zaprezentowane informacje dotyczce
wywoywania metody z parametrami, wybierania odpowiedniego sposobu
przesyania argumentw, przeciania metody oraz pobierania argumentw
z linii wywoania programu.
Cel moduu
Celem moduu jest pokazanie sposobw przekazywania argumentw do
metody.
Uzyskane kompetencje
Po zrealizowaniu moduu bdziesz:
potrafi definiowa metody do ktrych przesyane s argumenty
potrafi wywoywa metody z parametrami
potrafi wybiera odpowiedni sposb przesyania argumentw
potrafi przeciy nazw metody
potrafi pobiera argumenty z linii wywoania programu
Wymagania wstpne
Przed przystpieniem do pracy z tym moduem powiniene:
zna struktur programu w jzyku C#
zna podstawowe instrukcje sterujce
umie definiowa tablice
potrafi definiowa metody
Mapa zalenoci moduu
Zgodnie z map zalenoci przedstawion na rys. 1, przed przystpieniem
do realizacji tego moduu naley zapozna si z materiaem zawartym
w moduach: Wstp, Uycie zmiennych, Instrukcja wyboru if...else.
Obsuga wyjtkw, Instrukcje iteracji - ptle, Pozostae instrukcje
sterujce, Tablice, Operacje na tablicach , Funkcje wstp.

Rys. 1 Mapa zalenoci moduu

Micha Wodarczyk Modu 10
ITA-104 Wprowadzenie do programowania Przesyanie argumentw do metody
Strona 3/14
Przygotowanie teoretyczne
Podstawy teoretyczne
W celu umoliwienia metodzie wykonywanie dziaania dla rnych wartoci i parametrw oraz
przekazania wielu wartoci przez metod moemy przekaza metodzie odpowiednie argumenty.
Przy pomocy argumentw metody, lub inaczej parametrw metody, tworzymy interfejs, przy
pomocy ktrego metoda wymienia informacj (dane) z pozostaymi czciami programu. W
poprzednim rozdziale do wymiany informacji midzy metodami byy uywane zmienne
wspdzielone, w innych jzykach natomiast mona uywa tzw. zmiennych globalnych - zmiennych
zadeklarowanych poza metod i poza klas. Wymiana informacji midzy metodami z uyciem
zmiennych wspdzielonych w porwnaniu do przesyania argumentw do metody, generuje mniej
czytelny kod. Sam mechanizm przesyania argumentw do metody wymusza na programicie
nadanie odpowiednich wartoci parametrom, od ktrych jest zalene dziaanie metody. Dziki
temu mona unikn licznych bdw logicznych. Poszczeglne metody staj si niezalenymi
jednostkami.
List parametrw ktre maj by przekazane do metody, umieszczamy wewntrz nawiasw
okrgych tu za nazw metody. Kady parametr musi mie okrelony typ i nazw. Rwnie gdy
kilka parametrw ma ten sam typ, kademu argumentowi trzeba oddzielnie okreli typ.
Poszczeglne parametry oddzielamy przecinkiem. Wszystkie argumenty zdefiniowane wewntrz
nawiasw okrgych nazywamy parametrami formalnymi metody. Nazwy parametrw s lokalne
dla danej metody i s dostpne w caym "ciele" metody.
Nastpujce przykady pokazuj jak definiowa metod z parametrami:
Metoda przyjmujca dwa argumenty typu string
static void Powitanie(string imie, string nazwisko)
{
Console.WriteLine("Witam Pana(i) {0} {1}", imie, nazwisko);
}
Metoda przyjmujca jeden parametr typu double
static double Szescian(double x)
{
return x*x*x;
}
Wywoujc metod z parametrami, kademu jej argumentowi musimy dostarczy warto
odpowiedniego typu. Wartoci te umieszczamy w nawiasach okrgych po nazwie metody i s one
przypisywane argumentom na podstawie kolejnoci wystpowania. Poszczeglne wartoci
oddzielamy przecinkiem. I tak, aby wywoa metod Powitanie z przykadu powyej naley napisa:
Powitanie("Kubu", "Puchatek");
Argumentowi o nazwie imie zostanie nadana warto Kubu, a argumentowi nazwisko warto
Puchatek. Wykonanie powyszej linijki spowoduje pojawienie si na ekranie napisu:
Witam Pana(i) Kubu Puchatek
Argumenty (wartoci, zmienne) umieszczone w nawiasach okrgych w miejscu wywoania metody
nazywamy parametrami aktualnymi metody.
W jzyku C# mamy trzy sposoby przesyania argumentw do metody:
przez warto
Micha Wodarczyk Modu 10
ITA-104 Wprowadzenie do programowania Przesyanie argumentw do metody
Strona 4/14
przez referencj
jako parametr wyjciowy
Przesyanie parametru przez warto.
Przesyanie przez warto jest domylnym mechanizmem przesyania argumentw do metody.
Argument jest traktowany jako parametr wejciowy. Przesyanie przez warto definiujemy przez
podanie typu argumentu i jego nazwy, czyli tak jak to byo pokazane wczeniej w tym rozdziale. W
miejscu wywoania metody, kady parametr formalny przesyany przez warto reprezentuje nowo
utworzon zmienn lokaln. Zmienne te inicjalizowane s wartociami odpowiednich parametrw
aktualnych.
Mechanizm przesyania przez warto charakteryzuje si nastpujcymi waciwociami:
Argumentem aktualnym moe by dowolne wyraenie odpowiedniego typu. Metod
static void f(int x){...}
mona wywoa:
f(2*4);
lub
f(y);
gdzie y jest zmienn typu int.
Jeeli jako parametr aktualny przesyamy zmienn, musi by ona wczeniej zainicjalizowana.
int y;
f(y); //bd - niezainicjalizowana zmienna
Wewntrz metody parametry przesyane przez warto traktowane s jako zmienne
zainicjalizowane.
Zmiana wartoci parametru formalnego nie wpywa na warto parametru aktualnego.
static void Zwieksz(int x){ x++;}
...
int y = 10;
Zwieksz(y);
Console.Write(y);
Na ekranie pojawi si 10, a nie 11.
Przesyanie parametru przez referencj.
Argument przesyany przez referencj traktowany jest, zarwno jako parametr wejciowy jak i
parametr wyjciowy. Przesyanie przez referencj definiujemy przez dodanie przed nazw typu
parametru sowa ref, dla kadego argumentu przesyanego przez referencj.
static void PrzezReferencje(ref int x,ref int y){...}
W miejscu wywoania metody, dla parametrw przesyanych przez referencj, nie jest tworzona
nowa zmienna. Parametr formalny reprezentuje ten sam obszar pamici, t sam zmienn, co
parametr aktualny. W celu wywoania metody, przed kadym argumentem przesyanym przez
referencj musimy postawi sowa ref.
PrzezReferencje(ref akt1,ref akt2);
Przy powyszym wywoaniu, zmienna akt1 wewntrz metody PrzezReferencje bdzie si
nazywa ("bdziemy przezywa") x, a zmienna akt2 bdzie si nazywa y.
Mechanizm przesyania przez referencj charakteryzuje si nastpujcymi waciwociami:
Argumentem aktualnym moe by tylko zmienna odpowiedniego typu. Metod
Micha Wodarczyk Modu 10
ITA-104 Wprowadzenie do programowania Przesyanie argumentw do metody
Strona 5/14
static void f(ref int x){...}
mona wywoa
f(ref y);
gdzie y jest zmienn typu int. Wywoanie
f(ref 2*4);
spowoduje bd kompilacji
Zmienna przesyana przez referencj do metody musi by wczeniej zainicjalizowana.
int y;
f(ref y); //bd - niezainicjalizowana zmienna
Wewntrz metody parametry przesyane przez referencj traktowane s jako zmienne
zainicjalizowane.
Zmiana wartoci parametru formalnego wpywa na warto parametru aktualnego.
static void Zwieksz(ref int x){ x++;}
...
int y = 10;
Zwieksz(ref y);
Console.Write(y);
Na ekranie pojawi si 11, a nie 10.
Przesyanie parametru jako parametr wyjciowy.
Argument przesyany jako parametr wyjciowy traktowany jest jako parametr wyjciowy.
Przesyanie argumentu jako parametr wyjciowy definiujemy przez dodanie przed nazw typu
parametru sowa out, dla kadego argumentu przesyanego jako parametr wyjciowy.
static void JakoWyjsciowy(out int x,out int y){...}
W miejscu wywoania metody, dla parametrw przesyanych jako parametr wyjciowy, podobnie
jak w przypadku parametrw przesyanych przez referencj, nie jest tworzona nowa zmienna.
Parametr formalny reprezentuje ten sam obszar pamici, t sam zmienn, co parametr aktualny.
W celu wywoania metody, przed kadym argumentem przesyanym jako parametr wyjciowy
musimy postawi sowa out.
JakoWyjsciowy(out akt1,out akt2);
Przy powyszym wywoaniu, zmienna akt1 wewntrz metody JakoWyjsciowy bdzie si
nazywa ("bdziemy przezywa") x, a zmienna akt2 bdzie si nazywa y.
Mechanizm przesyania argumentu jako parametr wyjciowy charakteryzuje si nastpujcymi
waciwociami:
Argumentem aktualnym moe by tylko zmienna odpowiedniego typu. Metod
static void f(out int x){...}
mona wywoa
f(out y);
gdzie y jest zmienn typu int. Wywoanie
f(out 2*4);
spowoduje bd kompilacji.
Zmienna przesyana jako parametr wyjciowy do metody, nie musi by wczeniej
zainicjalizowana.
Micha Wodarczyk Modu 10
ITA-104 Wprowadzenie do programowania Przesyanie argumentw do metody
Strona 6/14
int y;
f(out y); //Wszystko OK
Wewntrz metody parametry przesyane przez referencj traktowane s jako zmienne
niezainicjalizowane.
static void f(out int x)
{
...int y = x; //bd, pobieramy warto
//niezainicjalizowanej zmiennej
}
Przed wyjciem z metody kady parametr przesyany jako parametr wyjciowy musi mie
nadan warto.
Zmiana wartoci parametru formalnego wpywa na warto parametru aktualnego.
static void Zmien(out int x){ x=11;}
...
int y = 10;
Zmien(out y);
Console.Write(y);
Na ekranie pojawi si 11, a nie 10.
Przykady demonstrujce rne sposoby przesyania argumentw do metody mona znale w
programach RodzajePrzesylan i RownanieKwadratowe, ktre stanowi cz rozwizania
Kurs\Demo\Modul9\Modul9.sln, gdzie Kurs jest katalogiem, gdzie skopiowano pliki
kursu.
Przesyanie argumentu przez warto powoduje utworzenie nowej zmiennej i skopiowanie
zawartoci parametru aktualnego do tej zmiennej. W przypadku przesania zmiennej typu
referencyjnego spowoduje to, e nowo utworzona zmienna bdzie si odwoywa do tego samego
obiektu, co zmienna ktra zostaa przesana jako parametr aktualny. Zmiany obiektu wewntrz
metody przy pomocy nowo utworzonej zmiennej, bd widoczne rwnie na zewntrz metody.
Rozwamy to na przykadzie przesyania tablic do metody - tablice s obiektami, typem
referencyjnym.
static void M1(int [] t)
{
t[0] = 1;
}
...
int [] tab = {10,11,12};
M1(tab);
Console.Write(tab[0]);
W wyniku dziaania powyszego kodu na ekranie powinno pojawi si:
1
Dzieje si tak, poniewa zmienna tablicowa t oraz zmienna tablicowa tab odwouj si do tego
samego obiektu.
Rozwamy jeszcze jeden przykad:
static void M2(int [] t)
{
t = new int[3];
t[0] = 1
}
...
int [] tab = {10,11,12};
Micha Wodarczyk Modu 10
ITA-104 Wprowadzenie do programowania Przesyanie argumentw do metody
Strona 7/14
M2(tab);
Console.Write(tab[0]);
W wyniku dziaania powyszego kodu na ekranie powinno pojawi si:
10
Przykad powyszy rni si tym od poprzedniego, e w momencie ustawiania wartoci pierwszego
elementu tablicy w metodzie M2, zmienna t odwouje si ju do innego obiektu tablicy. Linijka
t = new int[3];
powoduje zmian wartoci zmiennej tablicowe, a nie obiektu, a przy przesyaniu przez warto, co
ju wspominano wczeniej, zmiany wartoci parametru formalnego nie s przenoszone na
parametr aktualny.
W przypadku gdyby parametr by przesyany przez referencj lub jako parametr wyjciowy, zmiana
wartoci zmienne, ktr reprezentuje parametr formalny, pociga za sob zmian w parametrze
aktualnym.
Poniszy kod
static void M3(ref int [] t)
{
t = new int[3];
t[0] = 1;
}
...
int [] tab = {10,11,12};
M3(ref tab);
Console.Write(tab[0]);
spowoduje wic, e na ekranie pojawi si:
1
Przesyanie dowolnej liczby argumentw
W jzyku C# istnieje mechanizm przesyania dowolnej liczby argumentw do metody.
Wykorzystywany jest choby w metodzie Write, klasy Console.
Do oznaczenia, e metoda moe przyj dowoln liczb parametrw, uywamy sowa kluczowego
params w poczeniu z deklaracj argumentu typu jednowymiarowej tablicy np.:
static double Suma(params double [] skladniki)
{
double suma = 0;
foreach(double x in skladniki)
suma += x;
return suma;
}
Powysz metod moemy wywoa na dwa sposoby:
1. Przesyajc jako argument tablic
double [] t = {1.3,2.4,3.1,4.3};
double x = Suma(t);
2. Przesyajc jako argument list elementw. Lista moe by rwnie pusta. Jako element
moe wystpowa dowolne wyraenie, ktrego typ jest zgodny z typem podstawowym
tablicy wystpujcej po sowie params.
double y = Suma(1.3,2.4,3.1,4.3);
Micha Wodarczyk Modu 10
ITA-104 Wprowadzenie do programowania Przesyanie argumentw do metody
Strona 8/14
W przypadku powyszego wywoania, automatycznie tworzony jest obiekt tablicy.
W przypadku definiowania metody z dowoln liczb parametrw naley pamita:
Sowa kluczowego params uywamy w poczeniu z deklaracj argumentu typu
jednowymiarowej tablicy.
Argument z modyfikatorem params musi by definiowany na kocu listy parametrw.
Moe by tylko jeden argument z modyfikatorem params dla pojedynczej metody.
Argument z modyfikatorem params zawsze przesyamy przez warto.
Przecienie nazwy metody
W poprzednim rozdziale wspominano, e wyjtkiem od reguy tworzenia unikalnych nazw, jest
moliwo nadania takiej samej nazwy zmiennej wspdzielonej i zmiennej lokalnej. Drugim
wyjtkiem od reguy, e w jednym bloku kodu nie moe wystpowa dwch takich samych
identyfikatorw, jest mechanizm zwany przecieniem nazwy metody. Przecienie nazwy metody
lub krcej przecienie metody, polega na nadaniu kilku metodom jednej klasy tej samej nazwy.
Jest to moliwe, poniewa w trakcie kompilacji nazwa metody jest rozszerzana o typ argumentw
przekazywanych do metody. Metody nalece do jednej klasy musz rni si sygnatur. Na
sygnatur metody skadaj si:
nazwa metody
typ parametrw
ilo parametrw
modyfikator typu parametru
Uwaga: Modyfikatory out i ref nie s rozrnialne przez kompilator.
Do sygnatury metody nie nale:
typ wartoci zwracanej przez metod
nazwy parametrw metody
Dopuszczalna jest wic nastpujca definicja klasy (przykad przecienia nazwy metody):
class MetodyPrzeciazone
{
static void Nazwa(){...}
static void Nazwa(int i){...}
static void Nazwa(int i,int y){...}
static void Nazwa(ref int i){...}
static void Nazwa(double x){...}
static void Nazwa(double x,int i){...}
static void Nazwa(int i,double x){...}
}
Niedopuszczalne s nastpujce pary metod w jednej klasie:
static void Nazwa(){...}
static int Nazwa(){...}
Rni si tylko typem wartoci zwracanej przez metod
static void Nazwa(double a,double b){...}
static void Nazwa(double x,double y){...}
Rni si tylko nazw parametrw
static void Nazwa(ref double a){...}
static void Nazwa(out double x){...}
Modyfikatory out i ref nie s rozrnialne przez kompilator.
Micha Wodarczyk Modu 10
ITA-104 Wprowadzenie do programowania Przesyanie argumentw do metody
Strona 9/14
Napotykajc wywoanie metody, ktrej nazwa jest przeciona, kompilator wybiera odpowiedni
metod na podstawie typu argumentw aktualnych.
Nie mona nadawa takich samych nazw metodzie i innym skadnikom klasy: zmiennym
wspdzielonym, nazwom typw zdefiniowanych w klasie lub staym nazwanym.
Stosowanie jednakowych nazw dla kilku metod tej samej klasy powinno by uywane bardzo
roztropnie, gdy moe powodowa trudnoci z utrzymaniem kodu.
Argument metody Main
Uruchamiajc program, mona przekaza do niego pewn informacj - argumenty w wierszu
wywoania. W celu uruchomienia programu z argumentami w linii polece wydajemy nastpujc
komend.
NazwaProgramu arg1 arg2<ENTER>
W rodowisku Visual Studio mona rwnie ustawi argumenty linii polece. Ustawia si je w oknie
Waciwoci Projektu (Menu Project/Nazwa Projektu Properties...) na zakadce Debug, w polu
edycyjnym Command line arguments:.
Argumenty podane w wierszu wywoania programu, s przekazywane do programu za pomoc
tablicy napisw (string), ktra jest parametrem metody Main. Chcc przetwarza argumenty linii
polece musimy jako punkt startowy naszego programu uy metody Main z argumentem.
static int Main(string[] args)
lub
static void Main(string[] args)
Poniszy program wypisuje na ekranie wszystkie argumenty, ktre zostay podane w wierszu
wywoania.
static int Main(string[] args)
{
foreach (string s in args)
Console.WriteLine(s);
Console.ReadKey();
return 0;
}
Przykad demonstrujcy uycie argumentw linii wywoania mona znale w programie
ArgumentyMain, ktry stanowi cz rozwizania Kurs\Demo\Modul9\Modul9.sln,
gdzie Kurs jest katalogiem, gdzie skopiowano pliki kursu.


Micha Wodarczyk Modu 10
ITA-104 Wprowadzenie do programowania Przesyanie argumentw do metody
Strona 10/14
Laboratorium podstawowe
Problem 1 (czas realizacji 15 minut)
Napisz dwie metody obliczajce warto wielomianu metod Hornera. Pierwsza metoda oblicza
tylko warto wielomianu dla wartoci x podanej jako argument metody i zwraca j do programu.
Wspczynniki wielomianu przesyane s jako parametr z modyfikatorem params (dowolna ilo
argumentw). Druga metoda dodatkowo oblicza stopie wielomianu - argument przesyany jako
parametr wyjciowy.
W metodzie Hornera stosuje si nastpujce przeksztacenie :
a
0
x
n
+ a
1
x
n-1
+ a
2
x
n-2
+... +a
n-1
x
1
+ a
n
= (...((a
0
x + a
1
)*x + a
2
)*x+...+a
n-1
)*x + a
n

W wyniku zastosowania powyszego przeksztacenia zmniejszamy ilo wykonywanych dziaa i
zwikszamy dokadno obliczonego wyniku.
Zadanie Tok postpowania
1. Utwrz nowy
projekt w Visual C#
2008 Express
Edition
Otwrz Visual C# 2008 Express Edition.
Z menu wybierz File -> New Project.
Z listy Visual Studio installed templates wybierz Console Application.
W polu Name wpisz Wielomian.
Kliknij OK.
Z menu wybierz File -> Wielomian.
W polu Location wybierz folder w ktrym bdzie zapisany projekt.
Zaznacz pole wyboru Create directory for solution.
W polu Solution Name wpisz Modul10.
Nacinij przycisk Save.
2. Wewntrz klasy
Program utwrz
metod Wielomian
Wewntrz klasy Program utwrz metod Wielomian, ktra zwraca
warto wielomianu dla wartoci x podanej jako argument metody.
Parametry wielomianu s przekazywane jako argument z modyfikatorem
params.
static double Wielomian(double x,params double[] a)
{
double suma = a[0];
for (int i = 1; i < a.Length; i++)
{
suma = suma * x + a[i];
}
return suma;
}
3. 4. Do klasy
Program dodaj
drug metod
Wielomian
Do klasy Program dodaj drug metod Wielomian, W odrnieniu od
metody zdefiniowanej w punkcie poprzednim, metoda ta posiada
dodatkowy argument przesyany jako parametr wyjciowy w ktrym
zawarta jest informacja o stopniu wielomianu.
static double Wielomian(double x,
out double stopien, params double[] a)
{
stopien = a.Length - 1;
for (int i = 0; i < a.Length - 1; i++)
{
if (a[i] != 0)
break;
stopien--;
}
return Wielomian(x, a);
Micha Wodarczyk Modu 10
ITA-104 Wprowadzenie do programowania Przesyanie argumentw do metody
Strona 11/14
}
4. Wewntrz
metody Main
zaimplementuj
odpowiedni kod
Wewntrz metody Main napisz nastpujcy kod testujcy metody
zdefiniowane w poprzednich krokach:
static void Main(string[] args)
{
double stopienWielomianu;
double[] wspolczynnikiWielomianu={1, 1, 0, 1};

Console.WriteLine("Warto wielomianu obliczona
pierwsz metod {0}",
Wielomian(1,wspolczynnikiWielomianu));
Console.WriteLine("Warto wielomianu obliczona
drug metod {0}",
Wielomian(1,out stopienWielomianu,
wspolczynnikiWielomianu));
Console.WriteLine("Stopie wielomianu: {0}",
stopienWielomianu);

Console.WriteLine("\nInny sposb przekazania
wartoci wspczynnikw wielomianu
do metody");
Console.WriteLine("Warto wielomianu obliczona
pierwsz metod {0}",
Wielomian(1, 0,1,2));
Console.WriteLine("Warto wielomianu obliczona
drug metod {0}",
Wielomian(1, out stopienWielomianu,
0, 1, 2));
Console.WriteLine("Stopie wielomianu: {0}",
stopienWielomianu);
Console.ReadKey();
}

5. Skompiluj, a
nastpnie uruchom
program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu, z menu Debug wybierz Start Debugging.

Problem 2 (czas realizacji 25 minut)
Napisz dwie metody sortujce tablice. Pierwsza niech sortuje tablice liczb rzeczywistych. Druga
metoda bdzie sortowaa tablice napisw. Do porwnania dwch napisw uyj metody
String.Compare(string s1,string s2). Metoda ta zwraca warto mniejsz od zera,
gdy s1 jest "mniejsze" od s2, warto zero gdy oba napisy s jednakowe oraz warto wiksz od
zera gdy s1 jest pniej w kolejnoci alfabetycznej ni s2. Wicej na temat metody Compare
mona znale w MSDN Library.
Do sortowania uyj algorytmu sortowania przez kopcowanie (heap sort). Podstaw tej metody jest
tworzenie tzw. kopca. Kopiec definiujemy jako cig elementw tablicy a[p], a[p+1], ..., a[q]
speniajcych nastpujce warunki:
a[i]>=a[2i+1]
a[i]>=a[2i+2]
dla wszystkich i = p, ..., (q-1)/2
Schemat blokowy metody sortowanie przez kopcowanie znajduje si w pliku
Kurs\Lab\Modul9\Start\Przezkopcowanie.gif, a metody Przesiew, ktra jest wykorzystywana w
Micha Wodarczyk Modu 10
ITA-104 Wprowadzenie do programowania Przesyanie argumentw do metody
Strona 12/14
metodzie sortujcej, w pliku Kurs\Lab\Modul9\Start\Przesiew.gif, gdzie Kurs jest katalogiem
gdzie skopiowano pliki kursu.

Zadanie Tok postpowania
1. Do biecego
rozwizania dodaj
nowy projekt
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy rozwizanie, a nastpnie z menu kontekstowego wybierz
Add -> New Project.
W oknie dialogowym Add New Project z listy Visual Studio installed
templates wybierz Console Application.
W polu Name wpisz SortowanieStogowe.
Kliknij OK.
2. Zaznacz projekt
SortowanieStogow
e jako projekt
startowy
W okienku Solution Explorer zaznacz prawym klawiszem myszy element
reprezentujcy projekt SortowanieStogowe, a nastpnie z menu
kontekstowego wybierz Set as StartUp Project.
3. Do klasy
Program dodaj
metod Przesiewaj
Do klasy Program dodaj metod Przesiewaj, ktrej dziaanie jest
okrelone przez schemat blokowy w pliku Przesiew.gif. Typ double
przyjmij jako typ podstawowy tablicy.
static void Przesiewaj(double[] tab,uint l,uint p)
{
uint i = l,j = 2*i+1;
double x = tab[i];
while(j<=p)
{
if(j<p)
if(tab[j]<tab[j+1])
j++;
if(tab[j]<x)
break;
tab[i] = tab[j];
i=j;
j=2*i+1;
}
if(i != l)
tab[i] = x;
}
4. Do klasy
Program dodaj
drug metod
Przesiewaj
Do klasy Program dodaj metod Przesiewaj, ktrej dziaanie jest
okrelone przez schemat blokowy w pliku Przesiew.gif. Typ string przyjmij
jako typ podstawowy tablicy. Do porwnania elementw tablicy, zmiast
operatora mniejszoci <, uywaj metod Comapre klasy string.
static void Przesiewaj(string[] tab,uint l,uint p)
{
uint i = l, j = 2 * i + 1;
string x = tab[i];
while (j <= p)
{
if (j < p)
if (string.Compare(tab[j],tab[j + 1])<0)
j++;
if (string.Compare(tab[j], x)<0)
break;
tab[i] = tab[j];
i = j;
j = 2 * i + 1;
}
Micha Wodarczyk Modu 10
ITA-104 Wprowadzenie do programowania Przesyanie argumentw do metody
Strona 13/14
if (i != l)
tab[i] = x;
}
5. Do klasy
Program dodaj
metod Sortuj
Do klasy Program dodaj metod Sortuj, ktrej dziaanie jest okrelone
przez schemat blokowy w pliku Przezkopcowanie.gif. Typ double przyjmij
jako typ podstawowy tablicy.
static void Sortuj(double [] tab)
{
uint l = (uint)tab.Length/2,
p=(uint)tab.Length-1;
double x;
while(l>0)
{
l--;
Przesiewaj(tab,l,p);
}
while(p>0)
{
x=tab[0];
tab[0] = tab[p];
tab[p] = x;
p--;
Przesiewaj(tab,0,p);
}
}
6. Do klasy
Program dodaj
drug metod
Sortuj
Do klasy Program dodaj metod Sortuj, ktrej dziaanie jest
okrelone przez schemat blokowy w pliku Przezkopcowanie.gif.
Typ string przyjmij jako typ podstawowy tablicy.
static void Sortuj(string [] tab)
{
uint l = (uint)tab.Length / 2,
p = (uint)tab.Length - 1;
string x;
while (l > 0)
{
l--;
Przesiewaj(tab, l, p);
}
while (p > 0)
{
x = tab[0];
tab[0] = tab[p];
tab[p] = x;
p--;
Przesiewaj(tab, 0, p);
}
}
7. Wewntrz
metody Main
zaimplementuj
odpowiedni kod
Wewntrz metody Main napisz kod testujcy obie metody Sortuj.
static void Main(string[] args)
{
double[] tab = { 2.3, 3, 45, 12.3, 4.3, 7.2 };
Console.WriteLine("Tablica liczb rzeczywistych
przed sortowaniem");
foreach (double d in tab)
Console.Write("{0}; ", d);
Sortuj(tab);
Console.WriteLine("\nTablica liczb
rzeczywistych po sortowanu");
foreach (double d in tab)
Console.Write("{0}; ", d);
Micha Wodarczyk Modu 10
ITA-104 Wprowadzenie do programowania Przesyanie argumentw do metody
Strona 14/14
Console.WriteLine("\n\n*****************\n");
string[] napisy = { "szafa", "Szwecja",
"szalik", "siano", "stg",
"szampan", "Sowacja" };
Console.WriteLine("Tablica wyrazw przed
sortowaniem");
foreach (string s in napisy)
Console.Write("{0}; ", s);
Sortuj(napisy);
Console.WriteLine("\nTablica wyrazw po
sortowanu");
foreach (string s in napisy)
Console.Write("{0}; ", s);
Console.ReadKey();
}
8. Skompiluj i
uruchom program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu z menu Debug wybierz Start Debugging.

ITA-104 Wprowadzenie do programowania
Micha Wodarczyk
Modu 11
Wersja 2
Metody - algorytmy rekurencyjne i
biblioteka metod
Spis treci
Metody - algorytmy rekurencyjne i biblioteka metod tody ................................................................. 1
Informacje o module ............................................................................................................................ 2
Przygotowanie teoretyczne ................................................................................................................. 3
Podstawy teoretyczne.................................................................................................................. 3
Przykadowe rozwizanie ............................................................................................................. 8
Laboratorium podstawowe ................................................................................................................ 10
Problem 1 (czas realizacji 45 minut) .......................................................................................... 10
Laboratorium rozszerzone ................................................................................................................. 12
Zadanie 1 (czas realizacji 90 min) ............................................................................................... 12

Micha Wodarczyk Modu 11
ITA-104 Wprowadzenie do programowania Metody - algorytmy rekurencyjne i biblioteka metod
Strona 2/13
Informacje o module
Opis moduu
W tym module zostanie przedstawione na przykadach pojcie rekurencji.
Zostan rwnie omwione przestrzenie nazw oraz wdraanie aplikacji
zarzdzalnych.
Cel moduu
Celem moduu jest pokazanie co to jest rekurencja.
Uzyskane kompetencje
Po zrealizowaniu moduu bdziesz:
rozumia pojcie rekurencji.
potrafi rozpoznawa problemy, gdzie mona zastosowa rekurencj
potrafi tworzy bibliotek metod
Wymagania wstpne
Przed przystpieniem do pracy z tym moduem powiniene:
zna podstawowe instrukcje sterujce
umie definiowa tablice
potrafi definiowa metody
potrafi przesya argumenty do metody
Mapa zalenoci moduu
Zgodnie z map zalenoci przedstawion na rys. 1, przed przystpieniem
do realizacji tego moduu naley zapozna si z materiaem zawartym
w moduach: Wstp, Uycie zmiennych, Instrukcja wyboru if...else.
Obsuga wyjtkw, Instrukcje iteracji - ptle, Pozostae instrukcje
sterujce, Tablice, Operacje na tablicach, Funkcje wstp,
Przesyanie argumentw do metody.

Rys. 1 Mapa zalenoci moduu

Micha Wodarczyk Modu 11
ITA-104 Wprowadzenie do programowania Metody - algorytmy rekurencyjne i biblioteka metod
Strona 3/13
Przygotowanie teoretyczne
Podstawy teoretyczne
W rozdziale tym oprcz przedstawienia pojcia rekurencji i sposobu tworzenia biblioteki metod,
zostan pokazane metody konstruowania algorytmw, za pomoc ktrych mona rozwiza
rozmaite problemy. Jeden ze sposobw budowania algorytmw zosta zaprezentowany i nazwany
w laboratorium do rozdziau smego. By to tzw. algorytm zachanny (greedy algorithm). Algorytm
ten podejmuje dziaanie, ktre wydaje si w danej chwili najlepsze, nie uwzgldniajc, czy podjte
kroki nie prowadz w lep uliczk, czy uzyskamy satysfakcjonujcy wynik kocowy.
Przez rekurencj lub inaczej rekursj (recursion), w tym rozdziale, bdziemy rozumie zdolno
funkcji (metody) do wywoania samej siebie. Tak naprawd pojcie rekurencji nie odnosi si tylko
do konstruowania metod. Rekurencyjnym moe by dowolny przedmiot - rzecz, jeeli czciowo
skada si z siebie samego. Pewne rekurencyjne struktury danych zostan przedstawione w
rozdziale dwunastym i trzynastym.
Metod nazywamy bezporednio rekurencyjn, jeeli jej definicja zawiera odwoanie do samej
siebie. Metod nazywamy porednio rekurencyjn, jeeli zawiera odwoanie do metody, ktra j
wywouje bezporednio lub porednio, czyli przez acuch wywoa.
Metody rekurencyjne uywane s czsto do algorytmw opartych na strategii "dziel i zwyciaj".
Polega ona na rozwizaniu zadania, przez podzielenie go na mniejsze czci o tej samej postaci co
zadanie pierwotne. Nastpnie podzadania dzielimy w ten sam sposb na coraz mniejsze, a ich
rozmiar stanie si wystarczajco may, aby rozwizanie wydao si oczywiste lub mona byo go
atwo rozwiza przy pomocy innej metody. Po znalezieniu rozwiza zada czstkowych,
konieczne jest nieraz ich scalenie, aby uzyska rozwizanie caego zadania. Wedug strategii "dziel i
zwyciaj" dziaa algorytm wyszukiwania binarnego (powkowego), ktre byo tematem
laboratorium w rozdziale sidmym, chocia nie zastosowano tam rekurencji. Niektre algorytmy
oparte na strategii "dziel i zwyciaj" mona atwo rozwiza bez koniecznoci uywania metod
rekurencyjnych. Opieraj one si na uyciu instrukcji ptli i nazywamy je rozwizaniami
iteracyjnymi.
W celu demonstracji strategii "dziel i zwyciaj" rozwamy zadanie obliczenia silni. Jak ju
wspominano wczeniej w tym kursie, silni dla liczby n cakowitej nieujemnej oznaczamy znakiem
wykrzyknika i okrelamy nastpujcym wzorem:



Metoda iteracyjna obliczajca silni moe by zaimplementowana w nastpujcy sposb:
static ulong Silnia(ushort n)
{
ulong iloczyn = 1;
for(uint i=2;i<=n;i++)
iloczyn *= i;
return iloczyn;
}
Silnie moemy zdefiniowa rwnie rekurencyjnie:


=
=
=
,... 3 , 2 , 1 * ) 1 ( * ... * 2 * 1
0 1
!
n dla n n
n dla
n

=
=
=
,... 3 , 2 , 1 )! 1 ( *
0 1
!
n dla n n
n dla
n
Micha Wodarczyk Modu 11
ITA-104 Wprowadzenie do programowania Metody - algorytmy rekurencyjne i biblioteka metod
Strona 4/13
Stosujc powyszy wzr otrzymujemy nastpujc metod rekurencyjn
static ulong Silnia(ushort n){
if(n == 0 || n == 1)
return 1;
return n * Silnia(n-1);
}
Midzy metodami rekurencyjnymi a instrukcjami iteracyjnymi istnieje pewne podobiestwo. Dla
wywoa rekurencyjnych wystpuje te zagroenie wykonywania nieskoczonych oblicze.
Konieczne jest wic zapewnienie, e w pewnym momencie wywoania rekurencyjne si kocz i
metoda zwraca wynik, czyli rozwaenia tzw. problemu stopu.
Przykadem uycia strategii "dziel i zwyciaj" w poczeniu z wywoaniem rekurencyjnym jest
algorytm rozwizujcy staroytn amigwk, pochodzc z Tybetu, znan jako Wiee Hanoi. Tre
tej amigwki jest nastpujca.
Mamy trzy prty i n krkw o rnych rednicach, ktre s nanizane s na pierwszy prt w
porzdku malejcych rednic tworzc wie. Chcemy przenie krki z pierwszego prta na drugi,
przy pomocy prta trzeciego stosujc nastpujce zasady:
w kadym kroku mona przenie dokadnie jeden krek
krek nie moe by nigdy naoony na krek o mniejszej rednicy
Nazwijmy odpowiedni prt pierwszy jako rdo, prt drugi jako cel, prt trzeci jako tmp.
Rozwizanie jest trywialne, gdy na prcie rdo jest nanizany tylko jeden krek. Przenosimy
wtedy krek z prta rdo na prt cel. W przypadku gdy na prcie rdo jest nanizanych wicej
krkw, naley najpierw przenie n-1 krkw na prt tmp, przy pomocy prta cel, gdzie n jest
liczb krkw. Po wykonaniu tego zadania na prcie rdo zostaje jeden krek, ktry przenosimy
na prt cel. Nastpnie przenosimy n-1 krkw z prta tmp, na prt cel przy pomocy prta rdo.
Oczywicie nasuwa si pytanie jak przenie te n-1 krkw. Postpujemy w sposb identyczny jak
w przypadku n krkw, to znaczy, jeeli n-1 jest rwne jeden, to przenosimy dany krek na
odpowiedni prt. W przypadku gdy n-1 jest wiksze od jeden, to najpierw przenosimy n-2 krkw,
z prta ktry peni rol rda na prt penicy rol prta pomocniczego. Zostaje wtedy nam jeden
krek do przeniesienia, co jest zadaniem trywialnym. Nastpnie przenosimy n-2 krkw z prta
penicego rol pomocnicz na prt penicy w danym kroku rol rda.
Implementacj tego algorytmu mona znale w programie WizeHanoi, ktry stanowi cz
rozwizania Kurs\Demo\Modul10\Modul10.sln, gdzie Kurs jest katalogiem, gdzie
skopiowano pliki kursu.
Uycie rekurencji niesie z sob niestety dodatkowe koszty. S nimi spowolnienie wykonywania
programu (wywoanie funkcji wymaga dodatkowych krokw) oraz zwiksza objto danych
przechowywanych na stosie programu. Argumentem uzasadniajcym uycie metod rekurencyjnych
jest czytelno algorytmw zbudowanych z ich uyciem. Podsumowujc, unikajmy rekurencji, jeeli
istnieje oczywiste rozwizanie iteracyjne.
Rekurencja niestety ma jeszcze jedn wad, wynikajc ze strategii "dziel i zwyciaj". Dzielc
zadanie na podzadania, mona doprowadzi, e cz podzada bdzie identycznych i dua cz
oblicze bdzie powtrnie rozwizywaa ju rozwizane problemy. W celu demonstracji tego
problemu rozwamy tzw. liczby Fibonacciego (liczby Fibonacciego rzdu 1). Liczby Fibonacciego s
definiowane w nastpujcy sposb:


+
<
=
2 ) 2 ( ) 1 (
2
) (
n dla n Fib n Fib
n dla n
n Fib
Micha Wodarczyk
ITA-104 Wprowadzenie do programowania
Bezporednie skorzystanie z tego wzoru prowadzi do metody:
static ulong Fib(ushort n)
{
if(n<2)
return n;
return Fib(n-1)+Fib(n
}
Zamy, e chcemy obliczy Fib(5). W tym celu musimy obliczy Fib(4) i Fib(3),
Fib(4) rwnie liczymy Fib(3)). Drzewo wywoa dla Fib(5), z zaznaczeniem tym samym kolorem
wywoa metody dla tych samych argumentw zostao przedstawione na rysunku.
Metod obliczajc liczby Fibonacciego, zarwno wersj rekurencyjn jak i iteracyjn, mona
znale w programie
Kurs\Demo\Modul10\Modul10
kursu.
W celu uniknicia powtrnych oblicze, kiedy podzadanie mog zawiera te same podzadania,
zamiast strategii "dziel i zwyciaj" stosuje si programowanie dynamiczne. W algorytmach
opartych o programowanie dynamiczne kade zadanie (problem) rozwizuje si raz, a nastp
jego rezultat zapisuje si w pewnej tablicy, unikajc dziki temu powtrnego rozwizywania tego
samego zadania.
Z metodami rekurencyjnymi jest zwizana pewna grupa algorytmw zwanych "algorytmami z
powrotami" (backtracking algorithms). Przy rozwizywan
rne kroki w biecej sytuacji. Jeeli wybrany krok (decyzja), nie prowadzi do rozwizanie, musimy
mie moliwo powrotu do miejsca (stanu programu), gdzie moliwe byo dokonanie innego
wyboru i sprawdzenie innej dr
rysunku poniej.


Wprowadzenie do programowania Metody - algorytmy rekurencyjne i biblioteka metod
Strona 5/13
Bezporednie skorzystanie z tego wzoru prowadzi do metody:
static ulong Fib(ushort n)
1)+Fib(n-2);
Zamy, e chcemy obliczy Fib(5). W tym celu musimy obliczy Fib(4) i Fib(3),
Fib(4) rwnie liczymy Fib(3)). Drzewo wywoa dla Fib(5), z zaznaczeniem tym samym kolorem
wywoa metody dla tych samych argumentw zostao przedstawione na rysunku.
Metod obliczajc liczby Fibonacciego, zarwno wersj rekurencyjn jak i iteracyjn, mona
znale w programie Fibonacci, ktry stanowi cz rozwizania
Modul10.sln, gdzie Kurs jest katalogiem, gdzie skopiowano pliki
icia powtrnych oblicze, kiedy podzadanie mog zawiera te same podzadania,
zamiast strategii "dziel i zwyciaj" stosuje si programowanie dynamiczne. W algorytmach
opartych o programowanie dynamiczne kade zadanie (problem) rozwizuje si raz, a nastp
jego rezultat zapisuje si w pewnej tablicy, unikajc dziki temu powtrnego rozwizywania tego
Z metodami rekurencyjnymi jest zwizana pewna grupa algorytmw zwanych "algorytmami z
powrotami" (backtracking algorithms). Przy rozwizywaniu niektrych problemw, moemy podj
rne kroki w biecej sytuacji. Jeeli wybrany krok (decyzja), nie prowadzi do rozwizanie, musimy
mie moliwo powrotu do miejsca (stanu programu), gdzie moliwe byo dokonanie innego
wyboru i sprawdzenie innej drogi. Oglny schemat algorytmw z powrotami przedstawiony jest na

Modu 11
algorytmy rekurencyjne i biblioteka metod
Zamy, e chcemy obliczy Fib(5). W tym celu musimy obliczy Fib(4) i Fib(3), ale aby obliczy
Fib(4) rwnie liczymy Fib(3)). Drzewo wywoa dla Fib(5), z zaznaczeniem tym samym kolorem
wywoa metody dla tych samych argumentw zostao przedstawione na rysunku.

Metod obliczajc liczby Fibonacciego, zarwno wersj rekurencyjn jak i iteracyjn, mona
, ktry stanowi cz rozwizania
jest katalogiem, gdzie skopiowano pliki
icia powtrnych oblicze, kiedy podzadanie mog zawiera te same podzadania,
zamiast strategii "dziel i zwyciaj" stosuje si programowanie dynamiczne. W algorytmach
opartych o programowanie dynamiczne kade zadanie (problem) rozwizuje si raz, a nastpnie
jego rezultat zapisuje si w pewnej tablicy, unikajc dziki temu powtrnego rozwizywania tego
Z metodami rekurencyjnymi jest zwizana pewna grupa algorytmw zwanych "algorytmami z
iu niektrych problemw, moemy podj
rne kroki w biecej sytuacji. Jeeli wybrany krok (decyzja), nie prowadzi do rozwizanie, musimy
mie moliwo powrotu do miejsca (stanu programu), gdzie moliwe byo dokonanie innego
ogi. Oglny schemat algorytmw z powrotami przedstawiony jest na
Micha Wodarczyk
ITA-104 Wprowadzenie do programowania
Sprbujemy go zastosowa do problemu zwanego znalezieniem drogi skoczka szachowego.
Problem polega na obejciu szachownicy w taki sposb, e kade pole bdzie dokadnie r
odwiedzone, Po szachownicy mona porusza zgodnie z reguami ruchu skoczka szachowego.

Rozwizanie problemu znalezienia drogi skoczka szachowego znajduje si w programie
DrogaSkoczka, ktry stanowi cz rozwizania
gdzie Kurs jest katalogiem, gdzie skopiowano pliki kursu.
W wymienionym programie dopuszczalne ruchy skoczka zawarte s w tablicy
mozliweRuchySkoczka
sprawdzenie czy pozycja jest prawidowa, czyli czy nie "skoczylimy" poza szachownic. Jeeli
pozycja jest prawidowa to sprawdzane jest, czy czasem pole ju nie byo odwiedzone. Informacja o
tym czy pole byo odwiedzone czy nie, przechowywane jest w tablicy
zawiera tyle elementw ile jest pl na szachownicy. Element tablicy
odpowiada polu a1, element
odwiedzonePola[1,0]
oznacza, e odpowiadajce mu pole nie byo jeszcze odwiedzone. Warto elementu tablicy rna
od zera oznacz numer ruchu, w ktrym dane pole byo odwiedzone. Jeeli pole nie byo
odwiedzone, ustawiamy warto odpowiedniego elementu tablicy
aktualnego ruchu. Potem sprawdzamy czy cel zosta osignity, czyli czy pole na ktre

Wprowadzenie do programowania Metody - algorytmy rekurencyjne i biblioteka metod
Strona 6/13
Sprbujemy go zastosowa do problemu zwanego znalezieniem drogi skoczka szachowego.
Problem polega na obejciu szachownicy w taki sposb, e kade pole bdzie dokadnie r
odwiedzone, Po szachownicy mona porusza zgodnie z reguami ruchu skoczka szachowego.
3 2
8 1



5 4
7 6
Rys. Moliwe do wykonania ruchy skoczka
Rozwizanie problemu znalezienia drogi skoczka szachowego znajduje si w programie
, ktry stanowi cz rozwizania Kurs\Demo\Modul
jest katalogiem, gdzie skopiowano pliki kursu.
W wymienionym programie dopuszczalne ruchy skoczka zawarte s w tablicy
mozliweRuchySkoczka. Po obliczeniu pozycji skoczka po wykonaniu danego ruchu, nastpuje
sprawdzenie czy pozycja jest prawidowa, czyli czy nie "skoczylimy" poza szachownic. Jeeli
pozycja jest prawidowa to sprawdzane jest, czy czasem pole ju nie byo odwiedzone. Informacja o
zone czy nie, przechowywane jest w tablicy odwiedzonePola
zawiera tyle elementw ile jest pl na szachownicy. Element tablicy odwiedzonePola[0,0]
odpowiada polu a1, element odwiedzonePola[0,1] odpowiada polu a2, element
odwiedzonePola[1,0] odpowiada polu b1 itd. Element tablicy zawierajcy warto
oznacza, e odpowiadajce mu pole nie byo jeszcze odwiedzone. Warto elementu tablicy rna
od zera oznacz numer ruchu, w ktrym dane pole byo odwiedzone. Jeeli pole nie byo
y warto odpowiedniego elementu tablicy odwiedzonePola
aktualnego ruchu. Potem sprawdzamy czy cel zosta osignity, czyli czy pole na ktre
Modu 11
algorytmy rekurencyjne i biblioteka metod

Sprbujemy go zastosowa do problemu zwanego znalezieniem drogi skoczka szachowego.
Problem polega na obejciu szachownicy w taki sposb, e kade pole bdzie dokadnie raz
odwiedzone, Po szachownicy mona porusza zgodnie z reguami ruchu skoczka szachowego.
Rozwizanie problemu znalezienia drogi skoczka szachowego znajduje si w programie
Modul10\Modul10.sln,
W wymienionym programie dopuszczalne ruchy skoczka zawarte s w tablicy
ka po wykonaniu danego ruchu, nastpuje
sprawdzenie czy pozycja jest prawidowa, czyli czy nie "skoczylimy" poza szachownic. Jeeli
pozycja jest prawidowa to sprawdzane jest, czy czasem pole ju nie byo odwiedzone. Informacja o
odwiedzonePola. Tablica
odwiedzonePola[0,0]
odpowiada polu a2, element
da polu b1 itd. Element tablicy zawierajcy warto zero
oznacza, e odpowiadajce mu pole nie byo jeszcze odwiedzone. Warto elementu tablicy rna
od zera oznacz numer ruchu, w ktrym dane pole byo odwiedzone. Jeeli pole nie byo
odwiedzonePola, na numer
aktualnego ruchu. Potem sprawdzamy czy cel zosta osignity, czyli czy pole na ktre
Micha Wodarczyk Modu 11
ITA-104 Wprowadzenie do programowania Metody - algorytmy rekurencyjne i biblioteka metod
Strona 7/13
"skoczylimy" jest ostatnim polem na szachownicy do odwiedzenia. Osignicie celu komunikujemy
przez przekazanie do metody wywoujcej wartoci true.. Gdy cel jeszcze nie zosta osignity,
sprawdzamy czy z biecej pozycji jest moliwe osignicie celu, przez rekurencyjne wywoanie
metody Sprawdz. Osignicie celu jest oznajmiane przez przekazanie przez metod Sprawdz
wartoci true.. Jeeli metoda Sprawdz zwrci warto false, oznacza e z biecego stanu nie
ma drogi prowadzcej do celu. Cofamy wic ruch i przechodzimy do nastpnego moliwego ruchu.
Jeeli nie ma ju wicej moliwych ruchw, oznacza to, e dotychczasowe ruchy skoczka nie
prowadz do celu, musimy si wic cofn - wychodzimy z metody przekazujc warto false.


Micha Wodarczyk Modu 11
ITA-104 Wprowadzenie do programowania Metody - algorytmy rekurencyjne i biblioteka metod
Strona 8/13
Przykadowe rozwizanie
Utworzenie biblioteki funkcji
Pewne metody mog by uywane w wielu programach. Moemy w tym celu utworzy podzesp
w postaci biblioteki dll i doczy j do programu gwnego. Biblioteka moe by doczana
niezalenie do wielu programw.
W celu zademonstrowania tworzenia biblioteki funkcji napisz bibliotek obliczajc pola
powierzchni rnych figur. Gotowy program jest dostpny w katalogu
Kurs\Demo\Modul2\Modul2.sln projekty Biblioteka i TestBiblioteki, gdzie
Kurs jest katalogiem gdzie skopiowano pliki kursu
1. Uruchom Visual Studio.
Nacinij przycisk Start systemu Windows, wybierz Wszystkie Programy nastpnie Microsoft
Visual Studio 2005/ Microsoft Visual Studio 2005.
2. Utwrz nowy projekt
a. Z menu File wybierz New/Project...
b. W oknie dialogowym New Project okrel nastpujce waciwoci:
i. typu projektu: Visual C#/Windows
ii. szablon: Class Library
iii. lokalizacja: Moje Dokumenty\Visual Studio 2005\Projects\
iv. nazwa projektu: Biblioteka.
v. nazwa rozwizania: Demo10
3. Zmie nazw klasy z Class1 na Pole.
a. Zwr uwag, e jeeli chcemy, aby metody tej klasy byy dostpne dla innych
programw (podzespow), przed nazw klasy musi pojawi si sowo public.
4. Zmie nazw pliku Class1.cs na Pole.cs.
a. W oknie Solution Explorer z menu kontekstowego zwizanego z elementem
reprezentujcym plik Class1.cs wybierz Rename.
b. Zmie tekst Pole.cs na Pole.cs
5. Dodaj do klasy Pole:
a. Metod Kwadrat zwracajcej pole kwadratu i przyjmujc jako argument dugo jego
boku.
b. Metod Kolo zwracajcej pole koa i przyjmujc jako argument dugo jego promienia.
public class Pole
{
public static double Kwadrat(double a)
{
return a * a;
}
public static double Kolo(double r)
{
return Math.PI * r * r;
Micha Wodarczyk Modu 11
ITA-104 Wprowadzenie do programowania Metody - algorytmy rekurencyjne i biblioteka metod
Strona 9/13
}
}
Przypomnij, e definicja metody, ktre maj by wywoane z metod nalecych do innych klas,
musi si rozpoczyna od sowa public.
6. Skompiluj program.
7. Dodaj do biecego rozwizania nowy projekt Nowy program bdzie korzysta z metod
zawartych w programie Biblioteka.
a. Z menu File wybierz Add/New Project...
b. W oknie dialogowym Add New Project okrel nastpujce waciwoci:
i. typu projektu: Visual C#/Windows
ii. szablon: Console Application
iii. nazwa projektu: TestBiblioteki.
8. Uczy nowo utworzony projekt projektem startowym
a. Zaznacz projekt TestBiblioteki w okienku Solution Explorer i z menu kontekstowego wybierz
Set as StartUp Project.
9. Podcz do programu TestBiblioteki, podzesp Biblioteka.
a. W okienku Solution Explorer, z menu kontekstowego zwizanego z elementem
reprezentujcym projekt TestBiblioteki wybierz Add Reference...
b. W okienku Add Reference przejd do zakadki Projects, zaznacz projekt Biblioteka i nacinij
OK.
10. W okienku Solution Explorer, rozwi folder References znajdujcy si w projekcie
TestBiblioteki. Poka, e znajduje si w nim odwoanie do podzespou Biblioteka.
11. Poka, e mona skorzysta z metod zdefiniowanych w podzespole Biblioteka w programie
TestBiblioteki.
a. Do metody Main dodaj nastpujcy kod:
Console.Write("Podaj dugo boku kwadratu: ");
double bok =
Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Pole kwadratu wynosi {0}.",
Biblioteka.Pole.Kwadrat(bok));
b. Zaznacz, e bdziemy korzysta z przestrzeni nazw Biblioteka. W tym celu u gry
pliku Program.cs dodaj nastpujc linijk
using Biblioteka;
c. W dalszej czci metody Main dodaj nastpujcy kod:
Console.Write("\nPodaj dugo promienia: ");
double promien =
Convert.ToDouble(Console.ReadLine());
Console.WriteLine("Pole koa wynosi {0}.",
Pole.Kolo(promien));

Console.ReadKey();
12. Skompiluj i uruchom program.

Micha Wodarczyk Modu 11
ITA-104 Wprowadzenie do programowania Metody - algorytmy rekurencyjne i biblioteka metod
Strona 10/13
Laboratorium podstawowe
Problem 1 (czas realizacji 45 minut)
Napisz bibliotek dll, ktra zawiera metod sortujc tablic liczb cakowitych. Sortowanie ma si
ma odbywa algorytmem zwanym sortowaniem szybkim (quick sort). W sortowaniu szybkim
wybieramy pewn warto x, ktra dzieli nam tablic na dwie czci a[0], a[1]...a[q] oraz
a[q+1]...a[n-1] i jest speniony warunek:
Nastpnie kad z podtablic dzielimy na dwie czci w podobny sposb, jak poprzednio z tym, e
dobieramy inny wartoci x dzielcej podtablice. Dzielenie koczymy, gdy podtablica zwiera tylko
jednakowe wartoci. Algorytm sortowanie szybkie jest przykadem strategii "dziel i rzd".
Schemat blokowy metody sortowania szybkiego znajduje si w pliku
Kurs\Lab\Modul10\Start\QuickSort.gif, gdzie Kurs jest katalogiem gdzie
skopiowano pliki kursu.
Zadanie Tok postpowania
1. Utwrz nowy
projekt w Visual C#
2008 Express
Edition
Otwrz Visual C# 2008 Express Edition.
Z menu wybierz File -> New Project.
Z listy Visual Studio installed templates wybierz Class Library.
W polu Name wpisz QuickSort.
Kliknij OK.
Z menu wybierz File -> QuickSort.
W polu Location wybierz folder w ktrym bdzie zapisany projekt.
Zaznacz pole wyboru Create directory for solution.
W polu Solution Name wpisz Modul11.
Nacinij przycisk Save.
Zmie nazw klasy z Class1 na QuickSort.
Zmie nazw pliku Class1.cs na QuickSort.cs.
2. Dodaj do klasy
QuickSort metod
Sortuj
Dodaj do klasy QuickSort metod Sortuj. Schemat dziaania metody jest
umieszczony w pliku QuickSort.gif.
public static void Sortuj(int[] tab,int lewy,int prawy)
{
int i= lewy,j= prawy;
int x,tmp;
x = tab[(lewy + prawy)/2];
while(i<=j)
{
while(tab[i] < x)
i++;
while(x < tab[j])
j--;
if(i <= j)
{
tmp = tab[i];
tab[i] = tab[j];
tab[j] = tmp;
i++; j--;
}
else break;
}
if(lewy < j) Sortuj(tab, lewy,j);
if(i < prawy) Sortuj(tab,i, prawy);
}
3. Dodaj do klasy
QuickSort drug
Dodaj do klasy QuickSort metod Sortuj. W odrnieniu od poprzedniej
metody, ta przyjmuje tylko jeden argument - tablic do posortowania.
Micha Wodarczyk Modu 11
ITA-104 Wprowadzenie do programowania Metody - algorytmy rekurencyjne i biblioteka metod
Strona 11/13
metod Sortuj. Wewntrz metody wywoaj poprzednio zdefiniowan metod Sortuj z
odpowiednimi parametrami.
public static void Sortuj(int[] tab)
{
Sortuj(tab, 0, tab.Length - 1);
}
4. Do rozwizania
dodaj nowy projekt
Do rozwizania dodaj nowy projekt, ktry przetestuje napisan metod
sortujc
Z menu File wybierz Add/New Project...
W oknie dialogowym Add New Project okrel nastpujce
waciwoci:
typu projektu: Visual C#/Windows
szablon: Console Application
nazwa projektu: TestSortowania.
Uczy nowo utworzony projekt projektem startowym
Podcz do programu TestSortowania, podzesp Sortowanie.
W okienku Solution Explorer, z menu kontekstowego zwizanego z
elementem reprezentujcym projekt TestSortowania wybierz Add
Reference...
W okienku Add Reference przejd do zakadki Projects, zaznacz
projekt Sortowanie i nacinij OK.
Zaznacz, e bdziemy korzysta z przestrzeni nazw Sortowanie.
using Sortowanie;
Do metody Main dodaj kod testujcy metod Sortuj:
static void Main(string[] args)
{
int[] liczby = new int[10];
Random r = new Random();
Console.WriteLine("Tablica przed
sortowaniem:");
for (int i = 0; i < liczby.Length; i++)
{
liczby[i] = r.Next(0, 1001);
Console.Write("{0}, ", liczby[i]);
}
QuickSort.Sortuj(liczby);

Console.WriteLine("\n\nTablica po
sortowaniu:");
foreach(int i in liczby)
Console.Write("{0}, ", i);

Console.ReadKey();
}
5. Skompiluj, a
nastpnie uruchom
program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu, z menu Debug wybierz Start Debugging.


Micha Wodarczyk Modu 11
ITA-104 Wprowadzenie do programowania Metody - algorytmy rekurencyjne i biblioteka metod
Strona 12/13
Laboratorium rozszerzone
Zadanie 1 (czas realizacji 90 min)
Napisz program rozwizujcy problem omiu hetmanw. Problem omiu hetmanw polega na
umieszczeniu na szachownicy omiu hetmanw tak, aby aden nie by na drodze ruchu innego
hetmana, czyli nie by pod biciem. Hetman moe porusza si po polach kolumny, wiersza lub
przektnych do ktrych naley pole, na ktrym znajduje si hetman, co ilustruje poniszy rysunek.:











Rys. Moliwe do wykonania ruchy hetmana.
Przy pisaniu programu skorzystaj ze schematu przedstawionego na slajdzie "Algorytmy z
powrotami", programu droga skoczka oraz nastpujcych wskazwek:
Metoda Sprawdz przyjmuje jako argument numer kolumny, na ktrej chcemy ustawi
hetmana. Ustawiamy hetmana najpierw w pierwszej kolumnie, w miejscu wybranym przez
uytkownika, nastpnie przechodzimy do nastpnej kolumny.
W nastpnych kolumnach, prbujemy ustawi hetmana na polu tej kolumny, rozpoczynajc
od wiersz pierwszego. Jeeli istnieje pole, ktre jest nieatakowane przez pozostaych
hetmanw, zaznaczamy je i przechodzimy do nastpnej kolumny wywoujc ponownie
metod Sprawdz. Jeeli metoda Sprawdz przekazaa warto true, oznacza to e
problem zosta rozwizany. W przeciwnym wypadku sprawdzamy nastpne wiersze,
wczeniej odznaczajc poprzednie pole jako nieatakowane. Jeeli aden wiersz nie daje
oczekiwanego rezultatu, wychodzimy z metody (cofamy si) zwracajc warto false..
W celu sprawdzenia czy pole jest nieatakowane skorzystaj z pomocniczych tablic:
o Tablicy boolowskiej Wiersze, o liczbie pl rwnej liczbie wierszy, element
Wiersze [0] odpowiada wierszowi pierwszemu, itd. Warto false elementu
oznacza, e odpowiadajcy mu wiersz jest wolny, warto true, e wiersz jest
zajty
o Dwch tablic boolowskich dla przektnych. Jedna tablica bdzie zawiera
informacje o przektnych biegncych z gry na d, druga o przektnych z dou do
gry. Kady element tablicy odpowiada pojedynczej przektnej. Podobnie jak
poprzednio, warto false elementu oznacza, e odpowiadajca mu przektna
Micha Wodarczyk Modu 11
ITA-104 Wprowadzenie do programowania Metody - algorytmy rekurencyjne i biblioteka metod
Strona 13/13
jest wolna, warto true, e przektna jest zajta. Zauwa, e dla pl nalecych
do jednej przektnej biegncej z gry na d, suma numeru jego kolumny i wiersza
jest staa, natomiast dla pl nalecych do jednej przektnej biegncej z dou do
gry rnica numeru jego kolumny i wiersza jest staa.
Informacj gdzie ustawiono poszczeglnych hetmanw, przechowuj w tablicy liczb
cakowitych. Indeks elementu tablicy oznacza numer kolumny, warto elementu tablicy
zawiera numer wiersz, gdzie stoi hetman

ITA-104 Wprowadzenie do programowania
Micha Wodarczyk
Modu 12
Wersja 2
Struktury
Spis treci
Struktury............................................................................................................................................... 1
Informacje o module ............................................................................................................................ 2
Przygotowanie teoretyczne ................................................................................................................. 3
Podstawy teoretyczne.................................................................................................................. 3
Laboratorium podstawowe .................................................................................................................. 7
Problem 1 (czas realizacji 45 minut) ............................................................................................ 7
Laboratorium rozszerzone ................................................................................................................. 11
Zadanie 1 (czas realizacji 90 min) ............................................................................................... 11

Micha Wodarczyk Modu 12
ITA-104 Wprowadzenie do programowania Struktury
Strona 2/11
Informacje o module
Opis moduu
W tym module zostanie przedstawiony typ strukturalny w jzyku C# oraz
metody jego wykorzystania do implementacji kolejek typu FIFO i LIFO.
Omwione zostanie te implementacja tych struktur w bibliotece .NET
Framework.
Cel moduu
Celem moduu jest wprowadzenia pojcia rekordu.
Uzyskane kompetencje
Po zrealizowaniu moduu bdziesz potrafi:
Definiowa typ strukturalny w jzyku C#.
Posugiwa si typem strukturalnym.
Implementowa przy pomocy typu strukturalnego kolejk FIFO.
Implementowa przy pomocy typu strukturalnego kolejk LIFO.
Wymagania wstpne
Przed przystpieniem do pracy z tym moduem powiniene:
zna podstawowe instrukcje sterujce
umie definiowa tablice
potrafi definiowa metody
potrafi przesya argumenty do metody
Mapa zalenoci moduu
Zgodnie z map zalenoci przedstawion na rys. 1, przed przystpieniem
do realizacji tego moduu naley zapozna si z materiaem zawartym
w moduach: Wstp, Uycie zmiennych, Instrukcja wyboru if...else.
Obsuga wyjtkw, Instrukcje iteracji - ptle, Pozostae instrukcje
sterujce, Tablice, Operacje na tablicach, Funkcje wstp,
Przesyanie argumentw do metody, Metody - algorytmy rekurencyjne i
biblioteka metod.

Rys. 1 Mapa zalenoci moduu

Micha Wodarczyk Modu 12
ITA-104 Wprowadzenie do programowania Struktury
Strona 3/11
Przygotowanie teoretyczne
Podstawy teoretyczne
Struktur danych, ktra jest kolekcj zmiennych (elementw) rnych typw nazywamy rekordem
lub po prostu struktur. Poszczeglne elementy struktury nazywamy polami.
W celu zdefiniowania struktury w jzyku C# uywamy sowa struct. Po sowie struct
umieszczamy nazw tworzonej struktury, a po niej wewntrz nawiasw klamrowych (wewntrz
bloku struktury) definiujemy list pl struktury. Definicja pola struktury skada si z sowa
public, po ktrym podajemy typ pola oraz nazw pola. Definicj pola koczymy rednikiem. Przy
nadawaniu nazw strukturom i polom, stosowane s identyczne reguy jak przy nadawaniu nazw
zmiennym, czyli nazwa moe skada si z liter, cyfr i znaku podkrelenia, nazwa nie moe zaczyna
si od cyfry, musi by unikalna i nie moe by sowem kluczowym. Zalecane jest uycie formatu
PascalCase.
Uwaga: W przypadku pl prywatnych przy nadawaniu nazwy zaleca si uycie notacji camelCase. O
ukrywaniu szczegw implementacji i polach prywatnych mona znale wicej w kursie
"Programowanie obiektowe".
Struktur moemy definiowa w bloku innej struktury, w bloku klasy, wewntrz przestrzeni nazw
lub poza jakimkolwiek blokiem. Struktury nie wolno definiowa wewntrz metody. Jeeli struktura
ma by dostpna w innym bloku kodu lub w innym podzespole, jej nazw naley poprzedzi
sowem public. Poniej przedstawiono definicje struktury osoba, ktra zawiera trzy pola. Pola
Imie i Nazwisko s typu string, natomiast RokUrodzenia typu int.
public struct Osoba
{
public string Imie,Nazwisko;
public int RokUrodzenia;
}
Definicja struktury tworzy nowy typ - typ strukturalny. Nazwa struktury jest nazw nowego typu,
typu definiowanego przez uytkownika. Typ strukturalny jest typem wartoci - typem
bezporednim.
Definiujc zmienn typu strukturalnego, postpujemy identycznie jak w przypadku typw
wbudowanych. Podajemy nazw typu, a nastpnie nazw zmiennej.
W przypadku, gdy typ strukturalny jest zdefiniowany w innej przestrzeni nazw, odpowiednio przed
nazw typu strukturalnego umieszczamy nazw przestrzeni nazw lub stosujemy instrukcj using.
Poszczeglne nazwy oddzielamy znakiem kropki.
W celu odwoania si do pl zmiennej typu strukturalnego uywamy notacji:
nazwaZmiennej.NazwaPola, np.:
Osoba os;
os.Imie = "Jan";
os.Nazwisko = "Kowalski";
os.RokUrodzenia = 1988;
...
Console.Write("Pan(i) {0} {1}", os.Imie, os.Nazwisko);
Naley zwrci szczegln uwag na inicjalizacj pl struktury. Nie mona pobra wartoci pl
struktury, jeeli wczeniej nie nadalimy im wartoci.
Osoba os2;
int x = os2.RokUrodzenia; //bd kompilatora
Console.WriteLine(os2.Nazwisko); //bd kompilatora
Micha Wodarczyk
ITA-104 Wprowadzenie do programowania
Powyszy kod spowoduje wygenerowanie dwch bdw kompilatora, ktre s spowodowane
prb odwoania do niezainicjalizowanych pl.
Uwaga: Pola struktury mog by inicjalizowane przy pomocy metody zwan
Wicej na temat konstruktorw mona znale w kursie "Programowanie obiektowe".
Pole struktury moe by rwnie typem zoonym (tablic lub struktur). W celu demonstracji
odwoania do pojedynczej wartoci rozwamy nastpujcy przykad:
struct Uczen
{
public string Imie;
public string Nazwisko;
public byte [] Oceny;
}
struct Dziennik
{
public Uczen [] Uczniowie;
}
Warto zauway, co pokazane jest w powyszym przykadzie, typ strukturalny moe by typem
elementu tablicy (tablica Uczniowie
Zamy, e definiujemy zmienn
Dziennik klasaPierwsza;
//Inicjalizacja pl klasy
klasaPierwsza.Uczniowie = new Uczen[10];
W celu nadania imienia pierwszemu uczniowi (uczniowi o indeksie zero) w dzienniku uyjemy
notacji:
klasaPierwsza.Uczniowie[0].Imie = "Ja";
Podobnie, aby utworzy tablic ocen dla Jasia, uyjemy nastpujcego kodu:
klasaPierwsza.Uczniowie[0].Oceny = new byte[15];
Otrzymanie przez Jasia pierwszej oceny, mona zapisa:
klasaPierwsza.Uczniowie[0].Ocen
Poniewa struktura jest typem wartoci, zmienne lokalne reprezentujce dan struktur
przechowywane s na stosie. Oczywicie, jeeli pole jest zmienn typu referencyjnego, zmienna
moe zawiera tylko odwoanie do obiektu, ktry znajduje si na st
uproszczony sposb na rysunku.
Kolejka FIFO (first in - first out
kolejka, jest to struktura danych, ktra zwiera kolekcj elementw tego samego typu oraz posiad
zdefiniowane nastpujce operacje:

rogramowania
Strona 4/11
Powyszy kod spowoduje wygenerowanie dwch bdw kompilatora, ktre s spowodowane
prb odwoania do niezainicjalizowanych pl.
Uwaga: Pola struktury mog by inicjalizowane przy pomocy metody zwan
Wicej na temat konstruktorw mona znale w kursie "Programowanie obiektowe".
Pole struktury moe by rwnie typem zoonym (tablic lub struktur). W celu demonstracji
odwoania do pojedynczej wartoci rozwamy nastpujcy przykad:
public string Imie;
public string Nazwisko;
public byte [] Oceny;
public Uczen [] Uczniowie;
Warto zauway, co pokazane jest w powyszym przykadzie, typ strukturalny moe by typem
Uczniowie)
Zamy, e definiujemy zmienn klasaPierwsza typu dziennik
Dziennik klasaPierwsza;
Inicjalizacja pl klasy
klasaPierwsza.Uczniowie = new Uczen[10];
W celu nadania imienia pierwszemu uczniowi (uczniowi o indeksie zero) w dzienniku uyjemy
klasaPierwsza.Uczniowie[0].Imie = "Ja";
Podobnie, aby utworzy tablic ocen dla Jasia, uyjemy nastpujcego kodu:
klasaPierwsza.Uczniowie[0].Oceny = new byte[15];
ymanie przez Jasia pierwszej oceny, mona zapisa:
klasaPierwsza.Uczniowie[0].Oceny[0] = 3;
Poniewa struktura jest typem wartoci, zmienne lokalne reprezentujce dan struktur
przechowywane s na stosie. Oczywicie, jeeli pole jest zmienn typu referencyjnego, zmienna
moe zawiera tylko odwoanie do obiektu, ktry znajduje si na stosie. Przedstawione jest to w
uproszczony sposb na rysunku.
first out, czyli pierwszy przychodzi - pierwszy wychodzi
kolejka, jest to struktura danych, ktra zwiera kolekcj elementw tego samego typu oraz posiad
zdefiniowane nastpujce operacje:
Modu 12
Struktury
Powyszy kod spowoduje wygenerowanie dwch bdw kompilatora, ktre s spowodowane
Uwaga: Pola struktury mog by inicjalizowane przy pomocy metody zwanej konstruktorem.
Wicej na temat konstruktorw mona znale w kursie "Programowanie obiektowe".
Pole struktury moe by rwnie typem zoonym (tablic lub struktur). W celu demonstracji
Warto zauway, co pokazane jest w powyszym przykadzie, typ strukturalny moe by typem
W celu nadania imienia pierwszemu uczniowi (uczniowi o indeksie zero) w dzienniku uyjemy
Podobnie, aby utworzy tablic ocen dla Jasia, uyjemy nastpujcego kodu:
Poniewa struktura jest typem wartoci, zmienne lokalne reprezentujce dan struktur
przechowywane s na stosie. Oczywicie, jeeli pole jest zmienn typu referencyjnego, zmienna
osie. Przedstawione jest to w

pierwszy wychodzi), lub po prostu
kolejka, jest to struktura danych, ktra zwiera kolekcj elementw tego samego typu oraz posiada
Micha Wodarczyk
ITA-104 Wprowadzenie do programowania
Dodawanie elementu do kolejki. Element ktry dodajemy jest umieszczany na kocu
kolejki. Zazwyczaj operacj dodawania elementu do kolejki implementuje metoda, ktr
nazywamy z angielskiego
przesyany przez referencj) do kolejki, do ktrej chcemy doda nowy element oraz co
chcemy doda (element ktry chcemy doda)
Pobieranie elementu z kolejki. Pobrany element jest to element, ktry wrd elementw
znajdujcych si w kolejce, by najwczeniej do niej dodany. Operacja pobierajca element,
jednoczenie usuwa go z kolejki. Metod implementujc t operacj nazywamy
najczciej Dequeue
referencj (argument przesyany przez referencj) do kolejki, z ktrej chcemy pobra
element.
Kolejk FIFO porwna moemy do kolejek, ktre znamy z ycia codziennego, np. do kolejk
okienka na poczcie. Osoba, ktra przychodzi na poczt, ustawia si na kocu kolejki. Zostanie
obsuona dopiero wtedy, kiedy zostan obsuone wszystkie osoby, ktry przyszy przed ni.
Osoba, ktra zostaa obsuona, odchodzi, czyli zostaje usunita
Uwaga: Kolejka FIFO jest zaimplementowana w bibliotece .Net Framework przy pomocy klasy
System.Collections.Queue
Jedn z moliwych implementacji kolejki jest uycie tablicy. Oprcz tabli
indeksy wskazujce pocztek oraz koniec kolejki. Wszystkie powysze skadowe tworz nam
struktur, ktr moemy nazwa kolejk (Queue). Warto zauway, e elementy dodawane s na
koniec, za usuwane z pocztku, czyli pocztkowe ko
do kolejki, warto sprawdzi przy dodawaniu nastpnika elementu znajdujcego si w ostatniej
komrce tablicy, czy pierwsza komrka tablicy nie jest wolna. Sytuacj t lepiej ilustruje tablica
przedstawiona jako okrg ni jako odcinek, co pokazane jest na rysunku.
Dla kolejki, oprcz operacji dodawania elementu do kolejki oraz usuwania elementu z kolejki,
mona zdefiniowa nastpujce metody (wszystkie przyjmuj jako argument referencj do kolejki,
na ktrej chcemy wykona dan operacj).
Clear - usunicie wszystkich elementw z kolejki.
Peek - pobiera element z kolejki, ale go nie usuwa
GetLength - zwraca ilo elementw w kolejce.
Uwaga:
W klasie System.Collections.Queue
IsFull - sprawdza czy kolejka jest pena (czy wszystkie komrki tablicy zostay zajte)
IsEmpty - sprawdza czy kolejka jest pusta


rogramowania
Strona 5/11
Dodawanie elementu do kolejki. Element ktry dodajemy jest umieszczany na kocu
kolejki. Zazwyczaj operacj dodawania elementu do kolejki implementuje metoda, ktr
nazywamy z angielskiego Enqueue. Przyjmuje ona jako argumenty: referencj (argument
przesyany przez referencj) do kolejki, do ktrej chcemy doda nowy element oraz co
chcemy doda (element ktry chcemy doda)
Pobieranie elementu z kolejki. Pobrany element jest to element, ktry wrd elementw
znajdujcych si w kolejce, by najwczeniej do niej dodany. Operacja pobierajca element,
jednoczenie usuwa go z kolejki. Metod implementujc t operacj nazywamy
Dequeue i zwraca ona pobrany element oraz przyjmuje jako argument
referencj (argument przesyany przez referencj) do kolejki, z ktrej chcemy pobra
FIFO porwna moemy do kolejek, ktre znamy z ycia codziennego, np. do kolejk
okienka na poczcie. Osoba, ktra przychodzi na poczt, ustawia si na kocu kolejki. Zostanie
obsuona dopiero wtedy, kiedy zostan obsuone wszystkie osoby, ktry przyszy przed ni.
Osoba, ktra zostaa obsuona, odchodzi, czyli zostaje usunita z kolejki.
Uwaga: Kolejka FIFO jest zaimplementowana w bibliotece .Net Framework przy pomocy klasy
System.Collections.Queue. Wicej na temat klasy Queue mona znale w MSDN Library.
Jedn z moliwych implementacji kolejki jest uycie tablicy. Oprcz tablicy bd potrzebne rwnie
indeksy wskazujce pocztek oraz koniec kolejki. Wszystkie powysze skadowe tworz nam
struktur, ktr moemy nazwa kolejk (Queue). Warto zauway, e elementy dodawane s na
koniec, za usuwane z pocztku, czyli pocztkowe komrki tablicy s zwalniane. Dodajc elementy
do kolejki, warto sprawdzi przy dodawaniu nastpnika elementu znajdujcego si w ostatniej
komrce tablicy, czy pierwsza komrka tablicy nie jest wolna. Sytuacj t lepiej ilustruje tablica
krg ni jako odcinek, co pokazane jest na rysunku.
Dla kolejki, oprcz operacji dodawania elementu do kolejki oraz usuwania elementu z kolejki,
mona zdefiniowa nastpujce metody (wszystkie przyjmuj jako argument referencj do kolejki,
my wykona dan operacj).
usunicie wszystkich elementw z kolejki.
pobiera element z kolejki, ale go nie usuwa - podejrzenie elementu
zwraca ilo elementw w kolejce.
System.Collections.Queue jest to waciwo Count
sprawdza czy kolejka jest pena (czy wszystkie komrki tablicy zostay zajte)
sprawdza czy kolejka jest pusta
Modu 12
Struktury
Dodawanie elementu do kolejki. Element ktry dodajemy jest umieszczany na kocu
kolejki. Zazwyczaj operacj dodawania elementu do kolejki implementuje metoda, ktr
gumenty: referencj (argument
przesyany przez referencj) do kolejki, do ktrej chcemy doda nowy element oraz co
Pobieranie elementu z kolejki. Pobrany element jest to element, ktry wrd elementw
znajdujcych si w kolejce, by najwczeniej do niej dodany. Operacja pobierajca element,
jednoczenie usuwa go z kolejki. Metod implementujc t operacj nazywamy
i zwraca ona pobrany element oraz przyjmuje jako argument
referencj (argument przesyany przez referencj) do kolejki, z ktrej chcemy pobra
FIFO porwna moemy do kolejek, ktre znamy z ycia codziennego, np. do kolejki do
okienka na poczcie. Osoba, ktra przychodzi na poczt, ustawia si na kocu kolejki. Zostanie
obsuona dopiero wtedy, kiedy zostan obsuone wszystkie osoby, ktry przyszy przed ni.
Uwaga: Kolejka FIFO jest zaimplementowana w bibliotece .Net Framework przy pomocy klasy
mona znale w MSDN Library.
cy bd potrzebne rwnie
indeksy wskazujce pocztek oraz koniec kolejki. Wszystkie powysze skadowe tworz nam
struktur, ktr moemy nazwa kolejk (Queue). Warto zauway, e elementy dodawane s na
mrki tablicy s zwalniane. Dodajc elementy
do kolejki, warto sprawdzi przy dodawaniu nastpnika elementu znajdujcego si w ostatniej
komrce tablicy, czy pierwsza komrka tablicy nie jest wolna. Sytuacj t lepiej ilustruje tablica

Dla kolejki, oprcz operacji dodawania elementu do kolejki oraz usuwania elementu z kolejki,
mona zdefiniowa nastpujce metody (wszystkie przyjmuj jako argument referencj do kolejki,
podejrzenie elementu
Count
sprawdza czy kolejka jest pena (czy wszystkie komrki tablicy zostay zajte)
Micha Wodarczyk
ITA-104 Wprowadzenie do programowania
Kolejka LIFO (last in - first out
to struktura danych, ktra zwiera kolekcj elementw tego samego typu oraz posiada zdefiniowane
nastpujce operacje:
Umieszczenie elementu na stosie. Element jest umieszczany na grze stosu. Zazwyczaj
operacj umieszczenie elementu na stosie implementuje met
angielskiego Push. Przyjmuje ona jako argumenty: referencj (argument przesyany przez
referencj) do stosu, do ktrego chcemy doda nowy element oraz co chcemy doda
(element ktry chcemy doda)
Zdejmowanie elementu ze stosu. Zdejmow
elementw znajdujcych si na stosie, by najpniej na nim umieszczony. Operacja
zdejmujca element, jednoczenie usuwa go ze stosu. Metod implementujc t operacj
nazywamy najczciej
referencj (argument przesyany przez referencj) do stosu, z ktrego chcemy pobra
element.
W yciu codziennym rwnie spotykamy si z kolejkami LIFO. Rozwamy talerze w kuchni.
Ukadajc je kadziemy jeden na drugim two
czyli bierzemy talerz, ktry by pooony jako ostatni.
Zgodnie z zasad dziaania stosu zarzdzana jest pami przydzielana zmiennym lokalnym.
Najpierw zwalniamy pami przydzielon zmiennym, ktre by
Uwaga: Stos jest zaimplementowana w bibliotece .Net Framework przy pomocy klasy
System.Collections.
Library.
Jedn z moliwych implementacji stosu jest rwnie uycie tabli
tylko jeden indeks wskazujcy wierzchoek stosu. Tablica i indeks utworz nam struktur, ktr
moemy nazwa stosem (Stack).
Dla stosu, oprcz operacji umieszczania elementu na stosie oraz zdejmowania elementu ze stosu
mona zdefiniowa nastpujce metody (wszystkie przyjmuj jako argument referencj do stosu,
na ktrym chcemy wykona dan operacj).
Clear - usunicie wszystkich elementw ze stosu.
Peek - pobiera element ze stosu, ale go nie usuwa
GetLength - zwraca il
Uwaga:
W klasie System.Collections.
IsFull - sprawdza czy stos jest peny (czy wszystkie komrki tablicy zostay zajte)
IsEmpty - sprawdza czy stos jest pusty


rogramowania
Strona 6/11
first out, czyli ostatni przychodzi - pierwszy wychodzi), lub po prostu stos, jest
struktura danych, ktra zwiera kolekcj elementw tego samego typu oraz posiada zdefiniowane
Umieszczenie elementu na stosie. Element jest umieszczany na grze stosu. Zazwyczaj
operacj umieszczenie elementu na stosie implementuje metoda, ktr nazywamy z
. Przyjmuje ona jako argumenty: referencj (argument przesyany przez
referencj) do stosu, do ktrego chcemy doda nowy element oraz co chcemy doda
(element ktry chcemy doda)
Zdejmowanie elementu ze stosu. Zdejmowany element jest to element, ktry wrd
elementw znajdujcych si na stosie, by najpniej na nim umieszczony. Operacja
zdejmujca element, jednoczenie usuwa go ze stosu. Metod implementujc t operacj
nazywamy najczciej Pop i zwraca ona zdjty element oraz przyjmuje jako argument
referencj (argument przesyany przez referencj) do stosu, z ktrego chcemy pobra
W yciu codziennym rwnie spotykamy si z kolejkami LIFO. Rozwamy talerze w kuchni.
Ukadajc je kadziemy jeden na drugim tworzc stos. Biorc talerz, zdejmujemy go z gry stosu,
czyli bierzemy talerz, ktry by pooony jako ostatni.
Zgodnie z zasad dziaania stosu zarzdzana jest pami przydzielana zmiennym lokalnym.
Najpierw zwalniamy pami przydzielon zmiennym, ktre byy definiowane jako ostatnie.
Stos jest zaimplementowana w bibliotece .Net Framework przy pomocy klasy
System.Collections.Stack. Wicej na temat klasy Stack mona znale w MSDN
Jedn z moliwych implementacji stosu jest rwnie uycie tablicy. Oprcz tablicy bdzie potrzebny
tylko jeden indeks wskazujcy wierzchoek stosu. Tablica i indeks utworz nam struktur, ktr
moemy nazwa stosem (Stack).
Dla stosu, oprcz operacji umieszczania elementu na stosie oraz zdejmowania elementu ze stosu
mona zdefiniowa nastpujce metody (wszystkie przyjmuj jako argument referencj do stosu,
na ktrym chcemy wykona dan operacj).
usunicie wszystkich elementw ze stosu.
pobiera element ze stosu, ale go nie usuwa
zwraca ilo elementw na stosie.
System.Collections.Stack jest to waciwo Count
sprawdza czy stos jest peny (czy wszystkie komrki tablicy zostay zajte)
sprawdza czy stos jest pusty

Modu 12
Struktury
), lub po prostu stos, jest
struktura danych, ktra zwiera kolekcj elementw tego samego typu oraz posiada zdefiniowane
Umieszczenie elementu na stosie. Element jest umieszczany na grze stosu. Zazwyczaj
oda, ktr nazywamy z
. Przyjmuje ona jako argumenty: referencj (argument przesyany przez
referencj) do stosu, do ktrego chcemy doda nowy element oraz co chcemy doda
any element jest to element, ktry wrd
elementw znajdujcych si na stosie, by najpniej na nim umieszczony. Operacja
zdejmujca element, jednoczenie usuwa go ze stosu. Metod implementujc t operacj
ement oraz przyjmuje jako argument
referencj (argument przesyany przez referencj) do stosu, z ktrego chcemy pobra
W yciu codziennym rwnie spotykamy si z kolejkami LIFO. Rozwamy talerze w kuchni.
rzc stos. Biorc talerz, zdejmujemy go z gry stosu,
czyli bierzemy talerz, ktry by pooony jako ostatni.
Zgodnie z zasad dziaania stosu zarzdzana jest pami przydzielana zmiennym lokalnym.
y definiowane jako ostatnie.
Stos jest zaimplementowana w bibliotece .Net Framework przy pomocy klasy
mona znale w MSDN
cy. Oprcz tablicy bdzie potrzebny
tylko jeden indeks wskazujcy wierzchoek stosu. Tablica i indeks utworz nam struktur, ktr

Dla stosu, oprcz operacji umieszczania elementu na stosie oraz zdejmowania elementu ze stosu,
mona zdefiniowa nastpujce metody (wszystkie przyjmuj jako argument referencj do stosu,
Count
sprawdza czy stos jest peny (czy wszystkie komrki tablicy zostay zajte)
Micha Wodarczyk Modu 12
ITA-104 Wprowadzenie do programowania Struktury
Strona 7/11
Laboratorium podstawowe
Problem 1 (czas realizacji 45 minut)
Napisz program baza kontaktw. Program bdzie skada si z dwch podzespow:
Biblioteki dll, ktra bdzie zawieraa definicj dwch struktur. Struktur Data o polach:
Miesiac, Rok, Dzien. Struktura bdzie rwnie zawieraa metody: WprowadzDate,
WypiszDate, ktre bd przyjmowa jako parametr zmienn typu Data. Drug struktur
bdzie struktura Osoba o polach: Imie, Nazwisko i DataUrodzenia. Wewntrz struktury
bd rwnie zdefiniowane nastpujce metody: WprowadzOsobe, WypiszOsobe, ktre
bd przyjmowa jako parametr zmienn typu Osoba
Programu gwnego, w ktrym bdziemy mogli dodawa informacje o swoich kontaktach.
Informacje bd przechowywane w strukturze ktra bdzie zawieraa pole bdce tablic
elementw typu osoba oraz zmiennej zawierajcej aktualn liczb osb w bazie.
Oczywicie struktur Osoba mona rozszerzy o inne pola np.: telefon, adres, NIP, PESEL itd.
Zadanie Tok postpowania
1. Utwrz nowy
projekt w Visual C#
2008 Express
Edition
Otwrz Visual C# 2008 Express Edition.
Z menu wybierz File -> New Project.
Z listy Visual Studio installed templates wybierz Class Library.
W polu Name wpisz Biblioteka.
Kliknij OK.
Z menu wybierz File -> Biblioteka.
W polu Location wybierz folder w ktrym bdzie zapisany projekt.
Zaznacz pole wyboru Create directory for solution.
W polu Solution Name wpisz Modul11.
Nacinij przycisk Save.
Zmie nazw klasy z Class1 na Data.
Zmie nazw pliku Class1.cs na Biblioteka.cs.
2. Zaimplementuj
struktur Data
Do struktury Data dodaj pola: Rok, Miesiac, Dzien:
public struct Data
{
public int Rok;
public byte Miesiac;
public byte Dzien;
}
Uwaga:
W bibliotece .Net Framework istnieje struktura zawierajca w sobbie
waciwoci daty i czasu: System.DateTime.
Do struktury Data dodaj metody: WprowadzDate, WypiszDate,
ktre bd przyjmowa jako parametr zmienn typu Data. Do metody
WprowadzDate argument bdzie przekazywany jako parametr
wyjciowy.
public static void WprowadzDate(out Data d)
{
Console.Write("Podaj rok: ");
d.Rok = Convert.ToInt32(Console.ReadLine());
do
{
Console.Write("Podaj miesic: ");
d.Miesiac =
Convert.ToByte(Console.ReadLine());
Micha Wodarczyk Modu 12
ITA-104 Wprowadzenie do programowania Struktury
Strona 8/11
}
while (d.Miesiac < 1 || d.Miesiac > 12);
bool flaga = true;
do
{
Console.Write("Podaj dzie: ");
d.Dzien =
Convert.ToByte(Console.ReadLine());
if(d.Dzien>=1 && d.Dzien<=31)
{
switch (d.Miesiac)
{
case 2:
if (d.Dzien < 29)
flaga = false;
break;
case 4:
case 6:
case 9:
case 11:
if(d.Dzien<=30)
flaga = false;
break;
default:
flaga = false;
break;
}
}

}
while (flaga);
}

public static void WypiszDate(Data d)
{
Console.Write("{0}-{1}-{2}",
d.Dzien, d.Miesiac, d.Rok);
}

3. Dodaj struktur
Osoba.
1. Wewntrz przestrzeni nazw Biblioteka utwrz struktur Osoba. Do
struktury Osoba dodaj pola: Imie, Nazwisko, DataUrodzenia:
public struct Osoba
{
public string Imie;
public string Nazwisko;
public Data DataUrodzenia;
}
Do struktury Osoba dodaj metody: WprowadzOsobe, WypiszOsobe,
ktre bd przyjmowa jako parametr zmienn typu Data. Do metody
WprowadzOsobe argument bdzie przekazywany jako parametr
wyjciowy.
public static void WprowadzOsobe(out Osoba os)
{
Console.Write("Podaj imie: ");
os.Imie = Console.ReadLine();
Console.Write("Podaj nazwisko: ");
os.Nazwisko = Console.ReadLine();
Data.WprowadzDate(out os.DataUrodzenia);
}

public static void WypiszOsobe(Osoba os)
Micha Wodarczyk Modu 12
ITA-104 Wprowadzenie do programowania Struktury
Strona 9/11
{
Console.Write("Pan(i) {0} {1}, urodzony(a): ",
os.Imie, os.Nazwisko);
Data.WypiszDate(os.DataUrodzenia);
}
4. Do rozwizania
dodaj nowy projekt
Do rozwizania dodaj nowy projekt, ktry przetestuje napisan metod
sortujc
Z menu File wybierz Add/New Project...
W oknie dialogowym Add New Project okrel nastpujce
waciwoci:
typu projektu: Visual C#/Windows
szablon: Console Application
nazwa projektu: Baza.
Uczy nowo utworzony projekt projektem startowym
Podcz do programu Baza, podzesp Biblioteka.
W okienku Solution Explorer, z menu kontekstowego zwizanego z
elementem reprezentujcym projekt Baza wybierz Add Reference...
W okienku Add Reference przejd do zakadki Projects, zaznacz
projekt Biblioteka i nacinij OK.
Zaznacz, e bdziemy korzysta z przestrzeni nazw Biblioteka.
using Biblioteka;
Wewntrz przestrzeni nazw Baza utwrz struktur Kontakty. Do
struktury Kontakty dodaj pola: Osoby, LiczbaOsob:
struct Kontakty
{
public Osoba [] Osoby;
public uint LiczbaOsob;
}
Do struktury Kontakty dodaj metody: WprowadzKontakt,
UtworzKontakty, WypiszKontakty, ktre bd przyjmowa jako
parametr zmienn typu Kontakty. Do metody WprowadzKontakt
argument bdzie przekazywany przez referencj. Do metody
UtworzKontakty argument bdzie przekazywany jako parametr
wyjciowy. Metoda UtworzKontakty bdzie rwnie przyjmowa
jako parametr ile osb bdzie w bazie.
public static void WprowadzKontakt(ref Kontakty kontakty)
{
if (kontakty.LiczbaOsob >=
kontakty.Osoby.Length)
throw new Exception("Baza jest pena");
Osoba.WprowadzOsobe(
out kontakty.Osoby[kontakty.LiczbaOsob]);
kontakty.LiczbaOsob++;
}

public static void WypiszKontakty(Kontakty kontakty)
{
for (int i = 0; i < kontakty.LiczbaOsob; i++)
{
Console.Write("{0}. ", i+1);
Osoba.WypiszOsobe(kontakty.Osoby[i]);
Console.WriteLine();
Micha Wodarczyk Modu 12
ITA-104 Wprowadzenie do programowania Struktury
Strona 10/11
if ((i+1) % Console.WindowHeight == 0)
Console.ReadKey();
}
Console.ReadKey();
}

public static void UtworzKontakty(
out Kontakty kontakty, uint liczbaKontaktow)
{
kontakty.Osoby = new Osoba[liczbaKontaktow];
kontakty.LiczbaOsob = 0;
}
Do klasy Program dodaj metod Menu. Metod ta bdzie wywietla
opcje dostpne dla uytkownika (dodanie kontaktu, wywietlenie
wszystkich kontaktw, wyjcie z programu) oraz zwraca wybr
dokonany przez uytkownika.
static char Menu()
{
Console.Clear();
Console.WriteLine("\n\t\tA - Dodaj kontakt");
Console.WriteLine("\n\t\tA - Wypisz wszystkie
kontakty");
Console.WriteLine("\n\t\tA - Dodaj kontakt");
return Console.ReadKey().KeyChar;
}
W metodzie Main zdefiniuj zmienn typu Kontakty, wywoaj na jej
rzecz metod UtworzKontakty. Nastpnie utwrz ptle programu i
obsu odpowiednio polecenia uytkownika.
static void Main(string[] args)
{
Kontakty mojeKontakty;
Kontakty.UtworzKontakty(out mojeKontakty, 5);
char c;
do
{
c = Menu();
switch (c)
{
case 'a':
case 'A':
Kontakty.WprowadzKontakt(ref mojeKontakty);
break;
case 'b':
case 'B':
Kontakty.WypiszKontakty(mojeKontakty);
break;
}
}
while (!(c == 'k' || c == 'K'));
}

5. Skompiluj, a
nastpnie uruchom
program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu, z menu Debug wybierz Start Debugging.


Micha Wodarczyk Modu 12
ITA-104 Wprowadzenie do programowania Struktury
Strona 11/11
Laboratorium rozszerzone
Zadanie 1 (czas realizacji 90 min)
Wymagania:
Wymagane jest ukoczenie poprzedniego wiczenia.
Napisz program, ktry bdzie zawiera implementacje kolejki FIFO. Do kolejki bdziemy dodawa
zmienne typu Osoba. Struktura Osoba bya zaimplementowana w poprzednim wiczeniu w
programie Biblioteka. Program bdzie skada si z dwch podzespow:
Biblioteki dll, o nazwie Kolejka, ktra bdzie zawieraa implementacj kolejki FIFO.
Programu gwnego, w ktrym przetestujemy kolejk.
ITA-104 Wprowadzenie do programowania
Micha Wodarczyk
Modu 13
Wersja 2
Rekurencyjne struktury danych
Spis treci
Rekurencyjne struktura danych ........................................................................................................... 1
Informacje o module ............................................................................................................................ 2
Przygotowanie teoretyczne ................................................................................................................. 3
Podstawy teoretyczne.................................................................................................................. 3
Laboratorium podstawowe .................................................................................................................. 7
Problem 1 (czas realizacji 45 minut) ............................................................................................ 7
Laboratorium rozszerzone ................................................................................................................. 12
Zadanie 1 (czas realizacji 45 min) ............................................................................................... 12
Zadanie 2 (czas realizacji 45 min) ............................................................................................... 12

Micha Wodarczyk Modu 13
ITA-104 Wprowadzenie do programowania Rekurencyjne struktura danych
Strona 2/12
Informacje o module
Opis moduu
W tym module zostanie przedstawiony typ referencyjny w jzyku C# oraz
zostanie zaprezentowane jego wykorzystanie do implementacji
rekurencyjnych struktur danych takich jak lista czy drzewo binarne.
Pokazana zostanie te implementacja tych struktur w bibliotece .NET
Framework.
Cel moduu
Celem moduu jest pokazanie definicji wasnych typw referencyjnych.
Uzyskane kompetencje
Po zrealizowaniu moduu bdziesz:
potrafi definiowa wasny typ referencyjny
zna definicj listy jednokierunkowej
potrafi dodawa elementy do listy
potrafi usuwa elementy z listy.
zna listy dwukierunkowe i cykliczne..
Wymagania wstpne
Przed przystpieniem do pracy z tym moduem powiniene:
umie definiowa tablice
potrafi definiowa metody
potrafi przesya argumenty do metody
potrafi definiowa i rozumie struktury
Mapa zalenoci moduu
Zgodnie z map zalenoci przedstawion na rys. 1, przed przystpieniem
do realizacji tego moduu naley zapozna si z materiaem zawartym
w moduach: Wstp, Uycie zmiennych, Instrukcja wyboru if...else.
Obsuga wyjtkw, Instrukcje iteracji - ptle, Pozostae instrukcje
sterujce, Tablice, Operacje na tablicach, Funkcje wstp,
Przesyanie argumentw do metody, Struktury.

Rys. 1 Mapa zalenoci moduu

Micha Wodarczyk
ITA-104 Wprowadzenie do programowania
Przygotowanie teoretyczne
Podstawy teoretyczne
Omawiajc pojcie rekurencji, stwierdzilimy, e jest to definicja, ktra odwouje si do
definiowanego przedmiotu. Powstaje pytanie, czy istnieje moliwo definicji struktury danych,
ktra odwoywaaby si do siebie samej. Przeczytawszy tytu tego rozdziau mona si domy
odpowied brzmi tak.
Przy pomocy sowa struct
programista moe rwnie zdefiniowa wasny typ referencyjny. Realizuje to przez zastpienie
sowa struct sowem class
struktury (rekordy) definiowane przy pomocy sowa
strukturami, natomiast struktury definiowane za pomoc sowa
przyjta nomenklatura stosowana w odnie
Do klas moemy stosowa wszystko to, co zostao do tej pory powiedziane na temat struktur.
Gwna rnica midzy klasami a strukturami jest taka, e pola (skadowe) przedstawiciela klasy,
czyli obiektu, s zawsze "przechowywane" na zarzdzanej stercie, nawet wtedy, gdy pole jest typu
bezporedniego. Przydzia pamici dla obiektu jest pokazany na

Deklaracja zmiennej typu zdefiniowanego przy pomocy sowa
referencyjnego, wic jak ju wspominano wczeniej, deklaracja zmiennej nie tworzy obiektu. Obiekt
tworzymy zawsze przy pomocy sowa kluczowego
nazwaZmiennej = new NazwaKlasy();
Po utworzeniu obiektu wszystkie jego pola s zainicjalizowane. Pola liczbowe maj nadan warto
zero, logiczne false, pola typw referencyjnych warto
domyln warto, podajc j w
class Osoba
{
public string Nazwisko
public string Imie
public int RokUrodzenia
}
Uwaga: Wicej na temat typu referencyjnego mona znale w rozdziale drugim tego kursu.
Struktury stosujemy zazwyczaj do
prostokt, data. W przypadku struktur danych bardziej zoonych powinnimy stosowa klasy (np.
stos, kolejka (:).

Wprowadzenie do programowania Rekurencyjne st
Strona 3/12
Przygotowanie teoretyczne
rekurencji, stwierdzilimy, e jest to definicja, ktra odwouje si do
definiowanego przedmiotu. Powstaje pytanie, czy istnieje moliwo definicji struktury danych,
ktra odwoywaaby si do siebie samej. Przeczytawszy tytu tego rozdziau mona si domy
struct definiowalimy nowy typ wartoci (bezporedni). W jzyku C#
programista moe rwnie zdefiniowa wasny typ referencyjny. Realizuje to przez zastpienie
class. W celu uniknicia pomyek przyjmijmy, e w dalszej czci kursu
struktury (rekordy) definiowane przy pomocy sowa struct bdziemy nazywali krtko
strukturami, natomiast struktury definiowane za pomoc sowa class klasami. Jest to oglnie
przyjta nomenklatura stosowana w odniesieniu do jzyka C#.
Do klas moemy stosowa wszystko to, co zostao do tej pory powiedziane na temat struktur.
Gwna rnica midzy klasami a strukturami jest taka, e pola (skadowe) przedstawiciela klasy,
czyli obiektu, s zawsze "przechowywane" na zarzdzanej stercie, nawet wtedy, gdy pole jest typu
bezporedniego. Przydzia pamici dla obiektu jest pokazany na rysunku na rysunku.
Deklaracja zmiennej typu zdefiniowanego przy pomocy sowa class, tworzy zmienn typu
referencyjnego, wic jak ju wspominano wczeniej, deklaracja zmiennej nie tworzy obiektu. Obiekt
tworzymy zawsze przy pomocy sowa kluczowego new:
nazwaZmiennej = new NazwaKlasy();
Po utworzeniu obiektu wszystkie jego pola s zainicjalizowane. Pola liczbowe maj nadan warto
, pola typw referencyjnych warto null. Polu moemy nada swoj
domyln warto, podajc j w definicji pola:
public string Nazwisko = "Kowalski";
public string Imie = "Ja";
public int RokUrodzenia = 1979;
Uwaga: Wicej na temat typu referencyjnego mona znale w rozdziale drugim tego kursu.
Struktury stosujemy zazwyczaj do reprezentacji prostych struktur danych typu punkt, rozmiar,
prostokt, data. W przypadku struktur danych bardziej zoonych powinnimy stosowa klasy (np.
Modu 13
Rekurencyjne struktura danych
rekurencji, stwierdzilimy, e jest to definicja, ktra odwouje si do
definiowanego przedmiotu. Powstaje pytanie, czy istnieje moliwo definicji struktury danych,
ktra odwoywaaby si do siebie samej. Przeczytawszy tytu tego rozdziau mona si domyli, e
definiowalimy nowy typ wartoci (bezporedni). W jzyku C#
programista moe rwnie zdefiniowa wasny typ referencyjny. Realizuje to przez zastpienie
yek przyjmijmy, e w dalszej czci kursu
bdziemy nazywali krtko
klasami. Jest to oglnie
Do klas moemy stosowa wszystko to, co zostao do tej pory powiedziane na temat struktur.
Gwna rnica midzy klasami a strukturami jest taka, e pola (skadowe) przedstawiciela klasy,
czyli obiektu, s zawsze "przechowywane" na zarzdzanej stercie, nawet wtedy, gdy pole jest typu
rysunku na rysunku.

, tworzy zmienn typu
referencyjnego, wic jak ju wspominano wczeniej, deklaracja zmiennej nie tworzy obiektu. Obiekt
Po utworzeniu obiektu wszystkie jego pola s zainicjalizowane. Pola liczbowe maj nadan warto
. Polu moemy nada swoj
Uwaga: Wicej na temat typu referencyjnego mona znale w rozdziale drugim tego kursu.
reprezentacji prostych struktur danych typu punkt, rozmiar,
prostokt, data. W przypadku struktur danych bardziej zoonych powinnimy stosowa klasy (np.
Micha Wodarczyk
ITA-104 Wprowadzenie do programowania
Definiujc rekurencyjne struktury danych musimy uy klasy. Zmienne typw refere
zawieraj odwoanie. Odwoanie to niekoniecznie musi pokazywa na obiekt danej klasy, moe by
puste, czyli zmienna ma warto
nieskoczona.
Tablice s bardzo przydatnymi strukturami danych, le
1. Rozmiar tablicy musi by podany w trakcie jej tworzenie.
2. Wstawienie nowego elementu, jak rwnie usunicie istniejcego elementu tablicy,
wymaga przesunicia wszystkich elementw znajdujcych si za wstawianym (usuwanym)
elementem.
Ograniczenia powysze rozwizuje struktura zwana list jednokierunkow. Lista jednokierunkowa
jest kolekcj elementw zwanych wzami. Kady wze zawiera dane oraz poczenie (odwoanie)
do nastpnego wza. Pierwszy wze listy nazywamy gow (head)
(head) moemy odwoa si do pozostaych elementw listy, korzystajc z tego, e wzy s
poczone. Ostatni element listy zawiera odwoanie puste. Nazywamy go ogonem (tail).
Procedura dodawania pierwszego elementu do listy (
wyglda nastpujco:
1. Utwrz nowy obiekt wze. Wze zawiera dodawane dane.
2. Odwoanie do nastpnego wza nowo utworzonego obiektu ustaw na
3. Zmienne ogon i gowa (obie typu Wze) ustaw tak, aby odwoyway
utworzonego obiektu wze.
Procedura dodawania elementu do gowy listy wyglda nastpujco:
1. Sprawd czy lista jest pusta. Jeeli lista jest pusta wykonaj procedur dodawania
pierwszego elementu.
2. Utworz nowy obiekt wze. Wze zawiera dodawane
3. Odwoanie do nastpnego wza nowo utworzonego obiektu ustaw na
przez zmienn gowa.
4. Zmienn gowa ustaw tak, aby odwoywaa si do nowo utworzonego obiektu wze.
Procedura dodawania elementu do ogona listy wyglda nastpujco:
1. Sprawd czy lista jest pusta. Jeeli lista jest pusta wykonaj procedur dodawania
pierwszego elementu.
2. Utwrz nowy obiekt wze. Wze zawiera dodawane dane.
3. Odwoanie do nastpnego wza nowo utworzonego obiektu ustaw na

Wprowadzenie do programowania Rekurencyjne st
Strona 4/12
Definiujc rekurencyjne struktury danych musimy uy klasy. Zmienne typw refere
zawieraj odwoanie. Odwoanie to niekoniecznie musi pokazywa na obiekt danej klasy, moe by
puste, czyli zmienna ma warto null. Dziki temu definicja ma swj koniec, nie jest
Tablice s bardzo przydatnymi strukturami danych, lecz maj rwnie pewne wady:
Rozmiar tablicy musi by podany w trakcie jej tworzenie.
Wstawienie nowego elementu, jak rwnie usunicie istniejcego elementu tablicy,
wymaga przesunicia wszystkich elementw znajdujcych si za wstawianym (usuwanym)
Ograniczenia powysze rozwizuje struktura zwana list jednokierunkow. Lista jednokierunkowa
jest kolekcj elementw zwanych wzami. Kady wze zawiera dane oraz poczenie (odwoanie)
do nastpnego wza. Pierwszy wze listy nazywamy gow (head). Przy pomocy zmiennej gowa
(head) moemy odwoa si do pozostaych elementw listy, korzystajc z tego, e wzy s
poczone. Ostatni element listy zawiera odwoanie puste. Nazywamy go ogonem (tail).
Procedura dodawania pierwszego elementu do listy (pierwszych danych), czyli utworzenie listy,
Utwrz nowy obiekt wze. Wze zawiera dodawane dane.
Odwoanie do nastpnego wza nowo utworzonego obiektu ustaw na
Zmienne ogon i gowa (obie typu Wze) ustaw tak, aby odwoyway
utworzonego obiektu wze.
Procedura dodawania elementu do gowy listy wyglda nastpujco:
Sprawd czy lista jest pusta. Jeeli lista jest pusta wykonaj procedur dodawania
pierwszego elementu.
Utworz nowy obiekt wze. Wze zawiera dodawane dane.
Odwoanie do nastpnego wza nowo utworzonego obiektu ustaw na
przez zmienn gowa.
Zmienn gowa ustaw tak, aby odwoywaa si do nowo utworzonego obiektu wze.
Procedura dodawania elementu do ogona listy wyglda nastpujco:
Sprawd czy lista jest pusta. Jeeli lista jest pusta wykonaj procedur dodawania
pierwszego elementu.
Utwrz nowy obiekt wze. Wze zawiera dodawane dane.
Odwoanie do nastpnego wza nowo utworzonego obiektu ustaw na
Modu 13
Rekurencyjne struktura danych
Definiujc rekurencyjne struktury danych musimy uy klasy. Zmienne typw referencyjnych
zawieraj odwoanie. Odwoanie to niekoniecznie musi pokazywa na obiekt danej klasy, moe by
. Dziki temu definicja ma swj koniec, nie jest
cz maj rwnie pewne wady:
Wstawienie nowego elementu, jak rwnie usunicie istniejcego elementu tablicy,
wymaga przesunicia wszystkich elementw znajdujcych si za wstawianym (usuwanym)
Ograniczenia powysze rozwizuje struktura zwana list jednokierunkow. Lista jednokierunkowa
jest kolekcj elementw zwanych wzami. Kady wze zawiera dane oraz poczenie (odwoanie)
. Przy pomocy zmiennej gowa
(head) moemy odwoa si do pozostaych elementw listy, korzystajc z tego, e wzy s
poczone. Ostatni element listy zawiera odwoanie puste. Nazywamy go ogonem (tail).

pierwszych danych), czyli utworzenie listy,
Odwoanie do nastpnego wza nowo utworzonego obiektu ustaw na null.
Zmienne ogon i gowa (obie typu Wze) ustaw tak, aby odwoyway si do nowo
Sprawd czy lista jest pusta. Jeeli lista jest pusta wykonaj procedur dodawania
Odwoanie do nastpnego wza nowo utworzonego obiektu ustaw na obiekt wskazywany
Zmienn gowa ustaw tak, aby odwoywaa si do nowo utworzonego obiektu wze.
Sprawd czy lista jest pusta. Jeeli lista jest pusta wykonaj procedur dodawania
Odwoanie do nastpnego wza nowo utworzonego obiektu ustaw na null.
Micha Wodarczyk Modu 13
ITA-104 Wprowadzenie do programowania Rekurencyjne struktura danych
Strona 5/12
4. Odwoanie do nastpnego wza obiektu wskazywanego przez zmienn ogon ustaw tak,
aby odwoywaa si do nowo utworzonego obiektu wze.
5. Zmienn ogon ustaw tak, aby odwoywaa si do nowo utworzonego obiektu wze.
Procedura wstawiania elementu do listy wyglda nastpujco:
1. Sprawd czy lista jest pusta. Jeeli lista jest pusta wykonaj procedur dodawania
pierwszego elementu.
2. Utwrz nowy obiekt wze. Wze zawiera dodawane dane.
3. Znajd wze, za ktrym naley wstawi nowo utworzony wze. Nazwijmy ten wze
poprzedni. Jeeli wze poprzedni jest ostatnim wzem listy wykonaj procedur
dodawania elementu do ogona. W przypadku, gdy nowy wze ma by pierwszym
elementem listy, wykonaj procedur dodawania elementu do gowy.
4. Odwoanie do nastpnego wza nowo utworzonego obiektu ustaw na wze do ktrego
odwouje si .wze poprzedni.
5. Odwoanie do nastpnego wza wza poprzedni ustaw tak, aby pokazywao na nowo
utworzony obiekt wze.
Procedura usuwania elementu z listy, gdy na licie jest jeden element, wyglda nastpujco:
1. Usu wze z pamici.
2. Warto zmiennych ogon i gowa ustaw na null.
Poniewa w jzyku C# obiekty s usuwane z pamici prze Garbage Collection (automatyczny
odmiecacz pamici), wystarczy wykona tylko krok dwa.
Procedura usuwania pierwszego elementu (gowy) z listy wyglda nastpujco:
1. Sprawd czy lista ma jeden element, Jeeli tak wykonaj procedur usuwania elementu z
listy, gdy na licie jest jeden element.
2. Wska zmienn pomocnicz na element do usunicia.
3. Wska zmienn gowa na drugi element w licie.
4. Usu wze .wskazywany przez zmienn pomocnicz z pamici.
Poniewa w jzyku C# obiekty s usuwane z pamici prze Garbage Collection (automatyczny
odmiecacz pamici), kroki dwa i cztery mog by pominite..
Procedura usuwania ostatniego wza (ogona) z listy wyglda nastpujco:
1. Sprawd czy lista ma jeden element, Jeeli tak wykonaj procedur usuwania elementu z
listy, gdy na licie jest jeden element.
2. Wska zmienn pomocnicz na element do usunicia.
3. Wska zmienn ogon na przedostatni element w licie. Krok ten w listach
jednokierunkowych jest operacj nieefektywn. Wymaga przejcia caej licie. Problem
efektywnoci tego kroku rozwizuj listy dwukierunkowe, o ktrych bdzie mowa w dalszej
czci tego rozdziau.
4. Odwoanie do nastpnego wza obiektu wskazywanego przez zmienn ogon (do tej pory
przedostatni element listy) ustaw na null.
5. Usu wze .wskazywany przez zmienn pomocnicz z pamici.
Poniewa w jzyku C# obiekty s usuwane z pamici prze Garbage Collection (automatyczny
odmiecacz pamici), kroki dwa i pi mog by pominite..
Micha Wodarczyk
ITA-104 Wprowadzenie do programowania
Procedura usuwania ostatniego (ogona) wza z listy wyglda nastpujco:
1. Sprawd czy lista ma jeden element, Jeeli tak, wykonaj procedur usuwania elementu z
listy, gdy na licie jest jeden element.
2. Wska zmienn pomocnicz na el
3. Jeeli zmienna pomocnicza odwouje si do pierwszego elementu listy (gowy) wykonaj
procedur usuwania pierwszego elementu (gowy) z listy. Jeeli zmienna pomocnicza
odwouje si do ostatniego elementu listy (ogona), wykonaj procedur u
ostatniego wza (ogona) z listy.
4. Wska zmienn poprzedni
5. Ustaw odwoanie do nastpnego wza obiektu wskazywanego przez zmienn
poprzedni na wze wystpujcy po wle do skasowania.
6. Usu wze wskazywany przez zmienn pomocnicz z pamici.
Poniewa w jzyku C# obiekty s usuwane z pamici prze Garbage Collection (automatyczny
odmiecacz pamici), krok sze moe by pominity..
Usuwanie ostatniego elementu listy (ogona) z listy jednokierunkowej jest
Problem ten mona rozwiza stosujc tak zwane listy dwukierunkowe. W listach
dwukierunkowych kady wze oprcz wskazania na swojego nastpnika, zawiera rwnie pole
pokazujce poprzednika. Warto poprzednika wza gowa jest ustaw
Innym rodzajem listy, przydatnym w specyficznych sytuacjach s listy cykliczne Specyficzn sytuacj
jest np. zarzdzanie przydziaem pewnego zasobu dla kilku klientw
dostp do zasobu przez pewien okrelony czas, p
proces.. W listach cyklicznych wzy tworz piercie. Kady wze ma swj nastpnik.



Wprowadzenie do programowania Rekurencyjne st
Strona 6/12
Procedura usuwania ostatniego (ogona) wza z listy wyglda nastpujco:
Sprawd czy lista ma jeden element, Jeeli tak, wykonaj procedur usuwania elementu z
listy, gdy na licie jest jeden element.
Wska zmienn pomocnicz na element do usunicia.
Jeeli zmienna pomocnicza odwouje si do pierwszego elementu listy (gowy) wykonaj
procedur usuwania pierwszego elementu (gowy) z listy. Jeeli zmienna pomocnicza
odwouje si do ostatniego elementu listy (ogona), wykonaj procedur u
ostatniego wza (ogona) z listy.
poprzedni na element poprzedzajcy element do usunicia.
Ustaw odwoanie do nastpnego wza obiektu wskazywanego przez zmienn
na wze wystpujcy po wle do skasowania.
ywany przez zmienn pomocnicz z pamici.
Poniewa w jzyku C# obiekty s usuwane z pamici prze Garbage Collection (automatyczny
odmiecacz pamici), krok sze moe by pominity..
Usuwanie ostatniego elementu listy (ogona) z listy jednokierunkowej jest
Problem ten mona rozwiza stosujc tak zwane listy dwukierunkowe. W listach
dwukierunkowych kady wze oprcz wskazania na swojego nastpnika, zawiera rwnie pole
pokazujce poprzednika. Warto poprzednika wza gowa jest ustawiona na
Innym rodzajem listy, przydatnym w specyficznych sytuacjach s listy cykliczne Specyficzn sytuacj
jest np. zarzdzanie przydziaem pewnego zasobu dla kilku klientw - procesw, kady proces ma
dostp do zasobu przez pewien okrelony czas, po czym zasb jest przejmowany przez nastpny
proces.. W listach cyklicznych wzy tworz piercie. Kady wze ma swj nastpnik.
Rys. Lista dwukierunkowa i lista cykliczna.

Modu 13
Rekurencyjne struktura danych

Sprawd czy lista ma jeden element, Jeeli tak, wykonaj procedur usuwania elementu z
Jeeli zmienna pomocnicza odwouje si do pierwszego elementu listy (gowy) wykonaj
procedur usuwania pierwszego elementu (gowy) z listy. Jeeli zmienna pomocnicza
odwouje si do ostatniego elementu listy (ogona), wykonaj procedur usuwania
na element poprzedzajcy element do usunicia.
Ustaw odwoanie do nastpnego wza obiektu wskazywanego przez zmienn
Poniewa w jzyku C# obiekty s usuwane z pamici prze Garbage Collection (automatyczny
Usuwanie ostatniego elementu listy (ogona) z listy jednokierunkowej jest operacj nieefektywn.
Problem ten mona rozwiza stosujc tak zwane listy dwukierunkowe. W listach
dwukierunkowych kady wze oprcz wskazania na swojego nastpnika, zawiera rwnie pole
iona na null.
Innym rodzajem listy, przydatnym w specyficznych sytuacjach s listy cykliczne Specyficzn sytuacj
procesw, kady proces ma
o czym zasb jest przejmowany przez nastpny
proces.. W listach cyklicznych wzy tworz piercie. Kady wze ma swj nastpnik.

Micha Wodarczyk Modu 13
ITA-104 Wprowadzenie do programowania Rekurencyjne struktura danych
Strona 7/12
Laboratorium podstawowe
Problem 1 (czas realizacji 45 minut)
Napisz program, ktry bdzie zawiera implementacje listy jednokierunkowej. Do listy bd
dodawane obiekty klasy Osoba. Klasa Osoba jest zaimplementowana w projekcie Biblioteka.
Projekt Biblioteka jest czci rozwizania Kurs\Modul12\Start\Modul12\Modul12.sln,
gdzie Kurs jest katalogiem, gdzie skopiowano pliki kursu. Program bdzie skada si z dwch
podzespow:
Biblioteki dll, o nazwie Listy, ktra bdzie zawieraa implementacj listy jednokierunkowej. W
klasie lista bd zaimplementowane nastpujce metody:
o IsEmpty - sprawdzenie czy lista jest pusta
o AddToHead - dodanie elementu na pocztek listy
o AddToTail - dodanie elementu na koniec listy
o DeleteFromHead - usunicie elemntu z pocztku listy
o DeleteFromTail - usunicie elementu z koca listy
o PrintAll - wypisanie na ekranie danych wszystkich elementw listy
o GetCount - zwraca ilo elementw w licie
Programu gwnego, w ktrym przetestujemy list.

Zadanie Tok postpowania
1. Otwrz
istniejce
rozwizanie
Skopiuj rozwizanie
Kurs\Modul12\Start\Modul12\Modul12.sln, gdzie Kurs jest
katalogiem, gdzie skopiowano pliki kursu.
Otwrz skopiowane rozwizanie Modul12.sln
2. Dodaj nowy
projekt do
bierzcego
rozwizania
Z menu wybierz File -> Add Project.
W oknie dialogowym Add New Project okrel nastpujce waciwoci:
typu projektu: Visual C#/Windows
szablon: Class Library
lokalizacja: Moje Dokumenty\Visual Studio 2005\Projects\
nazwa projektu: Listy.
3. Podcz do
programu Listy,
podzesp
Biblioteka
W okienku Solution Explorer, z menu kontekstowego zwizanego z
elementem reprezentujcym projekt Listy wybierz Add Reference...
W okienku Add Reference przejd do zakadki Projects, zaznacz projekt
Biblioteka i nacinij OK.
4. Zaimplementuj
klas Lista
Zaznacz, e bdziemy korzysta z przestrzeni nazw Biblioteka.
using Biblioteka;
Zmie nazw pliku Class1.cs na List.cs.
Zmie nazw klasy z Class1 na List Wewntrz klasy List zdefiniuj
klas Node (Wze). .Do klasy Node dodaj nastpujce pola: pole Data
(Dane) typu Osoba, pole Next (Nastepny) typu Node. Do klasy List
dodaj pole Head (Glowa) i Tail (Ogon) typu Node.
public class List
{
Micha Wodarczyk Modu 13
ITA-104 Wprowadzenie do programowania Rekurencyjne struktura danych
Strona 8/12
public class Node
{
public Osoba Data;
public Node Next;
}
public Node Head, Tail;
}
Do klasy List dodaj metod IsEmpty:
public static bool IsEmpty (List lista)
{
return lista.Head == null;
}
Do klasy List dodaj metod AddToHead
public static void AddToHead(List lista,Osoba os)
{
Node tmp = new Node();
tmp.Data = os;
tmp.Next = lista.Head;
lista.Head = tmp;
if (lista.Tail == null)
lista.Tail = tmp;
}
Do klasy List dodaj metod AddToTail:
public static void AddToTail (List lista,Osoba os)
{
Node tmp = new Node();
tmp.Data = os;
if (lista.Tail == null)
lista.Tail = lista.Head = tmp;
else
{
lista.Tail.Next = tmp;
lista.Tail = tmp;
}
}
Do klasy List dodaj metod DeleteFromHead:
public static Osoba DeleteFromHead (List lista)
{
if (lista.Head == null) //lista pusta
throw new InvalidOperationException(
"Lista jest pusta");
Osoba x = lista.Head.Data;
if (lista.Head == lista.Tail
lista.Head = lista.Tail = null;
else
lista.Head = lista.Head.Next;
return x;
}
Do klasy List dodaj metod DeleteFromTail:
public static Osoba DeleteFromTail (List lista)
{
if (lista.Tail == null) //lista pusta
throw new InvalidOperationException(
"Lista jest pusta");
Osoba x = lista.Tail.Data;
if (lista.Head == lista.Tail)
lista.Head = lista.Tail = null;
else
Micha Wodarczyk Modu 13
ITA-104 Wprowadzenie do programowania Rekurencyjne struktura danych
Strona 9/12
{
Node tmp;
for (tmp = lista.Head;
tmp.Next != lista.Tail; tmp = tmp.Next);
lista.Tail = tmp;
lista.Tail.Next = null;
}
return x;
}
Do klasy List dodaj metod PrintAll:
public static void PrintAll(List lista)
{
for (Node tmp = lista.Head; tmp != null;
tmp = tmp.Next)
{
Osoba.WypiszOsobe(tmp.Data);
Console.WriteLine();
}
}
Do klasy List dodaj metod GetCount:
public static int GetCount(List lista)
{
int i;
Node tmp;
for (i = 0, tmp = lista.Head; tmp != null;
i++, tmp = tmp.Next) ;
return i;
}
5. Do rozwizania
dodaj nowy projekt
Do rozwizania dodaj nowy projekt, ktry przetestuje napisan metod
sortujc
Z menu File wybierz Add/New Project...
W oknie dialogowym Add New Project okrel nastpujce
waciwoci:
typu projektu: Visual C#/Windows
szablon: Console Application
nazwa projektu: TestListy.
Uczy nowo utworzony projekt projektem startowym
Podcz do programu TestListy, podzesp Biblioteka oraz Listy.
W okienku Solution Explorer, z menu kontekstowego zwizanego z
elementem reprezentujcym projekt TestListy wybierz Add
Reference...
W okienku Add Reference przejd do zakadki Projects, zaznacz
projekt Biblioteka oraz Listy i nacinij OK.
Zaznacz, e bdziemy korzysta z przestrzeni nazw Biblioteka oraz
Listy.
using Biblioteka;
using Listy;
Napisz kod testujcy list
static char Menu()
{
Console.Clear();
Console.WriteLine("\n\t\tA - Dodaj osob do
Micha Wodarczyk Modu 13
ITA-104 Wprowadzenie do programowania Rekurencyjne struktura danych
Strona 10/12
pocztku listy");
Console.WriteLine("\n\t\tB - Usu pierwsz
osob z listy");
Console.WriteLine("\n\t\tC - Dodaj osob na
koniec listy");
Console.WriteLine("\n\t\tD - Usu ostatni
osob z listy");
Console.WriteLine("\n\t\tE - Podaj liczb osb
na licie");
Console.WriteLine("\n\t\tF - Wypisz osoby z
listy");
Console.WriteLine("\n\t\tK - Koniec");
return Console.ReadKey(true).KeyChar;
}

static void Main(string[] args)
{
List mojaLista = new List();
Osoba tmp;
char c;

do
{
c = Menu();
switch (c)
{
case 'a':
case 'A':
Osoba.WprowadzOsobe(out tmp);
List.AddToHead(mojaLista, tmp);
break;
case 'b':
case 'B':
Console.WriteLine("Usunita osoba to:");
Osoba.WypiszOsobe(
List.DeleteFromHead(mojaLista));
Console.ReadKey();
break;
case 'c':
case 'C':
Osoba.WprowadzOsobe(out tmp);
List.AddToTail(mojaLista, tmp);
break;
case 'd':
case 'D':
Console.WriteLine("Usunita osoba to:");
Osoba.WypiszOsobe(
List.DeleteFromHead(mojaLista));
Console.ReadKey();
break;
case 'e':
case 'E':
Console.WriteLine("Liczba osb na licie
wynosi: {0}",
List.GetCount(mojaLista));
Console.ReadKey();
break;
case 'f':
case 'F':
List.PrintAll(mojaLista);
Console.ReadKey();
break;
}
}
while (!(c == 'k' || c == 'K'));
Micha Wodarczyk Modu 13
ITA-104 Wprowadzenie do programowania Rekurencyjne struktura danych
Strona 11/12
}
6. Skompiluj, a
nastpnie uruchom
program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu, z menu Debug wybierz Start Debugging.


Micha Wodarczyk Modu 13
ITA-104 Wprowadzenie do programowania Rekurencyjne struktura danych
Strona 12/12
Laboratorium rozszerzone
Zadanie 1 (czas realizacji 45 min)
Wymagania:
Wymagane jest ukoczenie poprzedniego wiczenia.
Napisz program, ktry bdzie zawiera implementacje kolejki FIFO przy pomocy listy. Do kolejki
bdziemy dodawa zmienne typu Osoba. Klasa Lista bya zaimplementowana w poprzednim
wiczeniu w programie Listy. Program bdzie skada si z dwch podzespow:
Biblioteki dll, o nazwie Kolejka, ktra bdzie zawieraa implementacj kolejki FIFO.
Programu gwnego, w ktrym przetestujemy kolejk.
Zadanie 2 (czas realizacji 45 min)
Wymagania:
Wymagane jest ukoczenie wiczenia pierwszego.
Napisz program, ktry bdzie zawiera implementacje kolejki LIFO. Na stos bdziemy wkada
zmienne typu Osoba. Struktura Osoba bya zaimplementowana w wiczeniu pierwszym w
programie Biblioteka. Koleka LIFO bdzie zaimplementowana przy pomocy listy jednokierunkowej,
ktra bya utworzona w programie pierwszym. Program bdzie skada si z dwch podzespow:
Biblioteki dll, o nazwie Stos, ktra bdzie zawieraa implementacj kolejki LIFO.
Programu gwnego, w ktrym przetestujemy stos

ITA-104 Wprowadzenie do programowania
Micha Wodarczyk
Modu 14
Wersja 2
Dostp do plikw
Spis treci
Dostp do plikw ................................................................................................................................. 1
Informacje o module ............................................................................................................................ 2
Przygotowanie teoretyczne ................................................................................................................. 3
Podstawy teoretyczne.................................................................................................................. 3
Przykadowe rozwizanie ............................................................................................................. 5
Laboratorium podstawowe .................................................................................................................. 7
Problem 1 (czas realizacji 15 minut) ............................................................................................ 7
Problem 2 (czas realizacji 30 minut) ............................................................................................ 8

Micha Wodarczyk Modu 14
ITA-104 Wprowadzenie do programowania Dostp do plikw
Strona 2/11
Informacje o module
Opis moduu
W tym module zostan zaprezentowane moliwoci wykorzystania
strumieni w jzyku C# oraz dokonywania operacji na strukturze systemu
plikw.
Cel moduu
Celem moduu jest pokazanie jak w jzyku C# mona wykona podstawowe
operacje na plikach.
Uzyskane kompetencje
Po zrealizowaniu moduu bdziesz:
wiedzia co to jest plik
potrafi korzysta z pliku przy pomocy strumieni
potrafi dokonywa operacji na strukturze systemu plikw
Wymagania wstpne
Przed przystpieniem do pracy z tym moduem powiniene:
umie definiowa tablice
potrafi definiowa metody
potrafi przesya argumenty do metody
potrafi definiowa i rozumie struktury
potrafi definiowa i rozumie klasy
Mapa zalenoci moduu
Zgodnie z map zalenoci przedstawion na rys. 1, przed przystpieniem
do realizacji tego moduu naley zapozna si z materiaem zawartym
w moduach: Wstp, Uycie zmiennych, Instrukcja wyboru if...else.
Obsuga wyjtkw, Instrukcje iteracji - ptle, Pozostae instrukcje
sterujce, Tablice, Operacje na tablicach, Funkcje wstp,
Przesyanie argumentw do metody, Struktury, Rekurencyjne
struktura danych.

Rys. 1 Mapa zalenoci moduu

Micha Wodarczyk Modu 14
ITA-104 Wprowadzenie do programowania Dostp do plikw
Strona 3/11
Przygotowanie teoretyczne
Podstawy teoretyczne
Umiemy ju sprawnie manipulowa obiektami przechowywanymi w pamici operacyjnej. Czsto
konieczne jest jednak, przechowanie danych w pamici dyskowej, aby mc je wykorzysta przy
nastpnym uruchomieniu programu.
W jzyku C# wikszo klas pomocnych przy korzystaniu z pamici dyskowej znajduje si w
przestrzeni nazw System.IO.
Plik jest to skoczony zbir danych (informacji) przechowywana na dysku, dostpna za pomoc
nazwy rozszerzonej o ciek dostpu, ktry stanowi dla systemy operacyjnego cao.
Zanim skorzystamy z pliku musimy go otworzy. Otwarcie pliku powoduje utworzenie uchwytu do
pliku. Podczas otwarcia musimy okreli, w jaki sposb bdziemy z niego korzysta. Uzyskujemy to
przez ustawienie pewnych atrybutw, przy pomocy typw wyliczeniowych zdefiniowanych w
przestrzeni nazw System.IO:
System.IO.FileAccess - definiuje tryb dostpu do pliku
o FileAccess.Read - dane mog by czytane z pliku
o FileAccess.Write - dane mog by zapisywane do pliku
o FileAccess.ReadWrite - dane mog by czytane z i zapisywane do pliku
System.IO.FileShare - definiuje zasady wspuytkowania pliku z innymi programami
(procesami):
o FileShare.Delete pozwala inny programom skasowa plik
o FileShare.Inheritable - uchwyt pliku jest dostpny dla procesw potomnych
o FileShare.Read - pozwala otworzy powtrnie plik, ale tylko do zapisu
o FileShare.ReadWrite - pozwala powtrnie otworzy plik do zapisu lub odczytu
o FileShare.Write - pozwala powtrnie otworzy plik, ale tylko do odczytu
System.IO.FileMode - definiuje sposb otwarcia lub utworzenia pliku
o FileMode.Append - otwiera plik w celu dopisywania do pliku, jeeli dany plik nie
istnieje jest tworzony. Atrybut ten moe pracowa tylko w poczeniu z atrybutem
FileAccess.Write.
o FileMode.Create - otwiera plik do zapisu. W przypadku, gdy plik nie istnieje jest
tworzony, jeeli istnieje jest nadpisywany.
o FileMode.CreateNew - otwiera plik do zapisu. W przypadku, gdy plik nie istnieje jest
tworzony, jeeli istnieje rzucany jest wyjtek.
o FileMode.Open - otwiera plik do odczytu lub zapisu w zalenoci od atrybutu FileAccess.
Jeeli plik nie istnieje rzucany jest wyjtek.
o FileMode.OpenOrCreate - otwiera plik do odczytu lub zapisu w zalenoci od atrybutu
FileAccess. Otwiera istniejcy plik, jeeli plik nie istnieje jest tworzony.
o FileMode.Truncate - otwiera plik do zapisu. Otwiera istniejcy plik kasujc jego
zawarto
W celu skorzystania z pliku, musimy skojarzy z nim pewien obiekt zwany strumienie.
Strumie jest to pewna warstwa abstrakcyjna, ktra umoliwia nam zapis i odczyt danych, nie tylko
z pliku, ale z rnych rde. Na strumieniu mamy zdefiniowane pewne operacje, chocia ich
Micha Wodarczyk Modu 14
ITA-104 Wprowadzenie do programowania Dostp do plikw
Strona 4/11
dostpno zaley od typu strumienia i sposobu jego otwarcia. Do operacji zdefiniowanych na
strumieniu nale:
czytanie danych (reading) - pobieranie danych ze strumienia i umieszczanie ich w pewnej
strukturze danych
zapis danych (writting) - wstawienie danych do strumienia z pewnej struktury danych
ustawienie biecej pozycji w strumieniu (seeking)
W bibliotece .Net istnieje szereg rnych klas reprezentujcych strumienie. Klasy te moemy
podzieli na trzy grupy.
Strumienie bezporednio podczone do rda:
System.IO.FileStream, System.IO.MemoryStream,
System.Net.Sockets.NetworkStream
Strumienie poredniczce. Strumienie te mog poredniczy w komunikacji z wyej
wymienionymi strumieniami:
System.Security.Cryptography.CryptoStream,
System.IO.BufferedStream
Klasy uywane do odczytu/zapisu z/do strumienia
o System.IO.BinaryReader, System.IO.BinaryWriter - odczyt lub zapis
danych binarnych
o System.IO.StreamReader, System.IO.StreamWriter - odczyt lub zapis
danych tekstowych (napisw)
Poszczeglne grupy udostpniaj nam rny stopie abstrakcji przesyania danych do strumienia.
Grupa pierwsza udostpnia najprostszy interfejs, w ktrym do strumienia mona zapisywa oraz z
niego pobiera tylko pojedyncze bajty. Grupa druga pozwala na dodanie szyfrowania lub
buforowania strumienia. Przy pomocy obiektw klas grupy trzeciej moemy wymienia ze
strumieniem informacje w formie napisw, liczb i innych obiektw.
W bibliotece .Net Framework istniej rwnie klasy, ktre umoliwiaj nam operacje na strukturze
systemu plikw np. sprawdzenie czy istnieje dany plik, sprawdzenie wielkoci pliku, wylistowanie
zawartoci katalogu, utworzenie katalogu itp.
Directory - suy do bezporednich operacji na plikach i katalogach
File - udostpnia metody do operacji na plikach
Path - zawiera operacje na tekcie zawierajcym informacje o ciece dostpu do pliku lub
katalogu
FileSystemWatcher - ustawienie kontroli na pliku lub katalogu

Uwaga:
W przypadku gdy bdziemy wykonywa kilka operacji na pojedynczym pliku lub katalogu zamiast
korzysta z klas File oraz Directory, powinnimy skorzysta z obiektw klas FileInfo oraz
DirectoryInfo.


Micha Wodarczyk Modu 14
ITA-104 Wprowadzenie do programowania Dostp do plikw
Strona 5/11
Przykadowe rozwizanie
Operacje na pliku
W celu skorzystania z pliku naley wykona nastpujce czynnoci:
1. Utwrz obiekt klasy FileStream skojarzony z odpowiednim plikiem:
a. Plik do odczytu:
FileStream zrodlo = new FileStream(
nazwaZrodlo, FileMode.Open,
FileAccess.Read, FileShare.Read);
b. Plik do zapisu:
FileStream cel = new FileStream(
nazwaCelu, FileMode.Create,
FileAccess.Write, FileShare.None);
2. Wykonaj dane operacje na pliku:
a. Odczyt danych z pliku
i. Wczytywanie pojedynczego bajt-u - metoda ReadByte:
int i = zrodlo.ReadByte();
Przekazanie przez metod wartoci -1 oznacza osignicie koca pliku.
ii. Wczytywanie bloku bajtw do tablicy
byte [] bufor = new byte[liczbaBajtow];
int iloscWczytanychBajtow = zrodlo.Read(bufor, indeks, liczbaBajtow);
Parametr indeks oznacza ktry element tablicy zostanie nadpisany jako pierwszy.
Mniejsza warto zmiennej iloWczytanychBajtow od parametru
liczbaBajtow - ile bajtw naleao wczyta, oznacza osignicie koca pliku
b. Zapis danych do pliku
i. Zapis pojedynczego bajt-u - metoda WriteByte:
cel.WrteByte(wartosc);
ii. Zapis bloku bajtw z tablicy
byte [] bufor = new byte[liczbaBajtow];
//nadanie wartoci elementom tablicy
cel.Read(bufor, indeks, liczbaBajtow);
Parametr indeks oznacza ktry element tablicy zostanie zapisany jako pierwszy.
3. Zamknij plik
zrodlo.Close();
cel.Close();
Poniewa operacje plikowe mog generowa liczne wyjtki np.: brak odpowiednich uprawnie do
pliku, brak danego pliku, brak miejsca na dysku, niedostpny dysk sieciowy itp., powinny by
umieszczone w bloku try:
FileStream zrodlo = null, cel = null;
try{
//operacje na pliku
}
catch (IOException ex){
Console.WriteLine("Problemy z plikiem.\n{0}",
Micha Wodarczyk Modu 14
ITA-104 Wprowadzenie do programowania Dostp do plikw
Strona 6/11
ex.Message);
}
finally{
if (zrodlo != null)
zrodlo.Close();
if (cel != null)
cel.Close();
}
Jeeli chcemy zapisywa do i odczytywa z pliku wartoci konkretnych typw wbudowanych,
moemy skorzysta z klas BinaryWriter i BinaryReader.
Do obsugi plikw tekstowych moemy skorzysta z klas StreamReader i StreamWriter.
Przykady uycia klas FileStream, BinaryWriter i BinaryReader oraz
StreamReader i StreamWriter mona znale w programach: KopiowaniePlikow,
PlikiBinarne, PlikiTekstowe, ktre, stanowi cz rozwizania
Kurs\Demo\Modul14\Modul14.sln, gdzie Kurs jest katalogiem, gdzie skopiowano pliki
kursu.
Trzeba pamita, e przestrze nazw System.IO nie jest domylnie importowana. Jeeli nie
chcemy stosowa w peni kwalifikowanych nazw, sami powinnimy j zaimportowa.


Micha Wodarczyk Modu 14
ITA-104 Wprowadzenie do programowania Dostp do plikw
Strona 7/11
Laboratorium podstawowe
Problem 1 (czas realizacji 15 minut)
Napisz program szyfrujcy plik. Pogram dziaa w nastpujcy sposb.
Pobierz nazw pliku do szyfrowania.
Pobierz nazw pliku zaszyfrowanego.
Pobierz warto klucza (maski) szyfrujcego.
Wczytuj po jednym bajcie z pliku rdowego, nastpnie wykonaj operacje xor na kluczu i
wartoci wczytanej. Wynik wyraenia zapisz do pliku zaszyfrowanego. Czynno powtaaj
do osignicia kooca pliku do szyfrowania.
Warto zauway e podajc jako plik do szyfrowania plik wczeniej zaszyfrowany i klucz ktry zosta
uyty do szyfrowania tego pliku spowodujemy jego rozszyfrowanie.
Zadanie Tok postpowania
1. Utwrz nowy
projekt w Visual C#
2008 Express
Edition
Otwrz Visual C# 2008 Express Edition.
Z menu wybierz File -> New Project.
Z listy Visual Studio installed templates wybierz Console Application.
W polu Name wpisz Koder.
Kliknij OK.
Z menu wybierz File -> Koder.
W polu Location wybierz folder w ktrym bdzie zapisany projekt.
Zaznacz pole wyboru Create directory for solution.
W polu Solution Name wpisz Modul14.
Nacinij przycisk Save.
2. Wewntrz
metody Main
zaimplementuj
odpowiedni kod
Zaimportuj przestrze nazw System.IO.
using System.IO;
W metodzie Main wykonaj instrukcje zgodnie z poleceniem do tego
wiczenia:
static void Main(string[] args)
{
Console.Write("Podaj nazw pliku do
zaszyfrowania: ");
string nazwaZrodla = Console.ReadLine();
Console.Write("Podaj nazw pliku zaszyfrowanego:
");
string nazwaCelu = Console.ReadLine();
Console.Write("Podaj warto klucza (od 0 do
255): ");
byte klucz=Convert.ToByte(Console.ReadLine());

FileStream zrodlo = null, cel = null;
try
{
zrodlo = new FileStream(nazwaZrodla,
FileMode.Open);
cel = new FileStream(nazwaCelu,
FileMode.Create);
int i = zrodlo.ReadByte();
while(i != -1)
{
cel.WriteByte((byte)(i ^ klucz));
i = zrodlo.ReadByte();
}
Micha Wodarczyk Modu 14
ITA-104 Wprowadzenie do programowania Dostp do plikw
Strona 8/11
}
finally
{
if (zrodlo != null)
zrodlo.Close();
if (cel != null)
cel.Close();
}
Console.WriteLine("Operacja szyfrowania
zakoczona.");
Console.ReadKey();
}

3. Skompiluj, a
nastpnie uruchom
program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu, z menu Debug wybierz Start Debugging.

Problem 2 (czas realizacji 30 minut)
Napisz program, ktry bdzie zawiera implementacj bazy kontaktw. W tym wiczeniu bdziemy
rozszerza program napisany w pierwszym wiczeniu laboratorium do rozdziau dwunastego.
Rozszerzenie bdzie polegao na:
dodaniu do klasy Data metody zapisujcej podan dat do podanego pliku
dodaniu do klasy Data metody wczytujcej dat z podanego pliku
dodaniu do klasy Osoba metody zapisujcej podan osob do podanego pliku
dodaniu do klasy Osoba metody wczytujcej osob z podanego pliku
dodaniu do klasy List metody zapisujcej wszystkie osoby z listy do podanego pliku
dodaniu do klasy List metody wczytujcej wszystkie osoby z podanego pliku do danej listy
w programie gwnym dodanie do menu pozycji zapisz baz oraz wczytaj baz i
odpowiednie ich oprogramowanie
Zadanie Tok postpowania
1. Otwrz
istniejce
rozwizanie
Skopiuj rozwizanie
Kurs\Modul12\Start\Modul14\Modul14.sln, gdzie Kurs jest
katalogiem, gdzie skopiowano pliki kursu.
Otwrz skopiowane rozwizanie Modul14.sln
2. Zmodyfikuj kod
pliku Biblioteka.cs
Otwrz plik Biblioteka.cs z projektu Biblioteka.
Zaimportuj przestrze nazw System.IO
using System.IO;
Do klasy Data dodaj metod ZapiszDate, ktra przyjmuje jako
parametry dat do zapisania w pliku oraz obiekt klasy BinaryWriter
przy pomocy ktrego dokonamy zapisu
public static void ZapiszDate(Data d,
BinaryWriter bw)
{
bw.Write(d.Rok);
bw.Write(d.Miesiac);
bw.Write(d.Dzien);
}
Micha Wodarczyk Modu 14
ITA-104 Wprowadzenie do programowania Dostp do plikw
Strona 9/11
Do klasy Data dodaj metod WczytajDate, ktra przyjmuje jako
argumenty dat do wczytania przesyan jako parametr wyjciowy oraz
obiekt klasy BinaryReader przy pomocy ktrego dokonamy wczytania
daty
public static void WczytajDate(out Data d,
BinaryReader br)
{
d.Rok = br.ReadInt32();
d.Miesiac = br.ReadByte();
d.Dzien = br.ReadByte();
}
Do klasy Osoba dodaj metod ZapiszOsobe, ktra przyjmuje jako
parametry osob do zapisania w pliku oraz obiekt klasy BinaryWriter
przy pomocy ktrego dokonamy zapisu
public static void ZapiszOsobe(Osoba os,
BinaryWriter bw)
{
bw.Write(os.Imie);
bw.Write(os.Nazwisko);
Data.ZapiszDate(os.DataUrodzenia, bw);
}
Do klasy Osoba dodaj metod WczytajOsobe, ktra przyjmuje jako
argumenty osob do wczytania przesyan jako parametr wyjciowy oraz
obiekt klasy BinaryReader przy pomocy ktrego dokonamy wczytania
osoby
public static void WczytajOsobe(out Osoba os,
BinaryReader br)
{
os = new Osoba();
os.Imie = br.ReadString();
os.Nazwisko = br.ReadString();
Data.WczytajDate(out os.DataUrodzenia, br);
}
3. Zmodyfikuj kod
pliku List.cs
Otwrz plik List.cs z projektu Listy.
Zaimportuj przestrze nazw System.IO
using System.IO;
Do klasy List dodaj metod ZapiszListe, ktra przyjmuje jako
parametry list do zapisania w pliku oraz obiekt klasy BinaryWriter
przy pomocy ktrego dokonamy zapisu. Jako pierwszy parametr zapisz
ilo elementw listy
public static void ZapiszListe(List mojaLista,
BinaryWriter bw)
{
bw.Write(List.GetCount(mojaLista));
Node tmp = mojaLista.Head;
while (tmp != null)
{
Osoba.ZapiszOsobe(tmp.Data, bw);
tmp = tmp.Next;
}
}
Do klasy List dodaj metod WczytajListe, ktra przyjmuje jako
argumenty list do wczytania przesyan jako parametr wyjciowy oraz
obiekt klasy BinaryReader przy pomocy ktrego dokonamy wczytania
Micha Wodarczyk Modu 14
ITA-104 Wprowadzenie do programowania Dostp do plikw
Strona 10/11
listy. Jako pierwszy parametr wczytaj liczb elementw listy
public static void WczytajListe(
out List mojaLista, BinaryReader br)
{
mojaLista = new List();
int n = br.ReadInt32();
Osoba tmp;
for (int i = 0; i < n; i++)
{
Osoba.WczytajOsobe(out tmp, br);
List.AddToTail(mojaLista, tmp);
}
}
4. Zmodyfikuj kod
pliku Program.cs
Otwrz plik Program.cs z projektu TestListy.
Zaimportuj przestrze nazw System.IO
using System.IO;
Do metody Menu klasy Program dodaj dwie nowe pozycje menu:
"Zapisz list" oraz "Wczytaj list".
...
Console.WriteLine("\n\t\tG - Zapisz list");
Console.WriteLine("\n\t\tH - Wczytaj list");
...
Do metody Main klasy Program dodaj kod obsugujcy nowo dodane
pozycje menu
...
case 'g':
case 'G':
ZapiszListe(mojaLista);
break;
case 'h':
case 'H':
WczytajListe(out mojaLista);
break;
...

.
.
.
public static void ZapiszListe(List mojaLista)
{
FileStream fs;
BinaryWriter bw=null;
Console.Write("Podaj nazw pliku: ");
string nazwa = Console.ReadLine();
try
{
fs = new FileStream(nazwa,
FileMode.Create);
bw = new BinaryWriter(fs);
List.ZapiszListe(mojaLista, bw);
}
finally
{
if (bw != null)
bw.Close();
}
}

public static void WczytajListe(
out List mojaLista)
Micha Wodarczyk Modu 14
ITA-104 Wprowadzenie do programowania Dostp do plikw
Strona 11/11
{
FileStream fs;
BinaryReader br=null;
Console.Write("Podaj nazw pliku skd
czyta dane: ");
string nazwa = Console.ReadLine();
try
{
fs = new FileStream(nazwa, ileMode.Open);
br = new BinaryReader(fs);
List.WczytajListe(out mojaLista, br);
}
finally
{
if (br != null)
br.Close();
}
}
5. Skompiluj i
uruchom program
Z menu Build wybierz Build Solution. Jeeli kompilator wykry bdy,
popraw je i ponownie zbuduj program.
W celu uruchomienia programu z menu Debug wybierz Start Debugging.

You might also like