Podprogramy.pdf

(97 KB) Pobierz
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
POLITECHNIKALSKA
wGliwicach
WYDZIAŁ INYNIERII BIOMEDYCZNEJ
LABORATORIUM
JZYKÓW PROGRAMOWANIA
Programowanie strukturalne
Opracował: mgr in». Jakub Murawskid
Gliwice, 2009
 
1Cel¢wiczenia
2
1
Cel ¢wiczenia
Celem ¢wiczenia jest zapoznanie studentów z problematyk¡ programowania strukturalnego w
j¦zyku C#, oraz zdobycie praktycznych umiej¦tno±ci w tym zakresie.
2
Wprowadzenie
W przypadku tworzenia zło»onych projektów równie istotna obok poprawno±ci tworzonego kodu
jest tzw. metodyka programowania. Jej wybór mo»e zasadniczo wpłyn¡¢ na kształt projektu,
wydajno±¢ tworzonego oprogramowania, a tak»e na wygod¦ jego tworzenia i modyfikacji.
Najprostszym podej±ciem jest tzw. programowanieliniowe , gdzie aplikacja jest ci¡giem nast¦-
puj¡cych po sobie instrukcji wykonywanych jedna po drugiej. Wad¡ tego systemu jest trudno±¢
modyfikacji aplikacji, mała przejrzysto±¢ kodu, a tak»e kolejno±¢ wielokrotnego powtarzania
bloków kodu wykonuj¡cych te same operacje.
Programowanie strukturalne stoi w opozycji do programowania liniowego. Głównym zało-
»eniem jest istnienie tzw. bloku głównego, który definiuje wył¡cznie ogóln¡ kolejno±¢ operacji,
które s¡ realizowane w podprogramach (funkcjach). Funkcja jest osobnym blokiem kodu, który
mo»e by¢ wielokrotnie wywoływany z bloku głównego. Do zdefiniowania funkcji konieczne jest:
ˆ okre±lenie nazwy funkcji, jej identyfikator podlega tym samym rygorom jakim podlegaj¡
identyfikatory zmiennych,
ˆ zdefiniowanie rodzaju argumentów wej±ciowych, ich liczby oraz typu,
ˆ podanie typu warto±ci, która jest zwracana przez funkcj¦.
Funkcja wykonuje zdefiniowane w sobie operacje, u»ywaj¡c przy tym (o ile s¡ zdefiniowane)
argumentów wywołania. Nast¦pnie otrzymany wynik jest zwracany z funkcji do nadrz¦dnego
bloku kodu, z którego ta funkcja została wywołana. Funkcja nie musi zwraca¢ warto±ci – ta-
kie funkcje spełniaj¡ rol¦ bloku procedur. Poni»ej zamieszczono przykład definiowania bardzo
prostej funkcji:
staticvoidHW()
{
Console.WriteLine("HelloWorld!\n");
Console.ReadKey();
}
Pokazana powy»ej funkcja o nazwie HW ogranicza si¦ jedynie do wypisania na ekranie konsoli
ci¡gu znaków HelloWorld! . Warto zauwa»y¢, »e w nawiasach umieszczonych za identyfika-
torem funkcji nie znajduj¡ si¦ »adne deklaracje argumentów wej±ciowych, w zwi¡zku z czym
funkcja nie wymaga »adnych parametrów wywołania. Równie» słowo kluczowe void umiesz-
czone przed identyfikatorem deklaruje brak typu zwracanego, co oznacza, »e instrukcje wyko-
naj¡ si¦, ale funkcja nie zwróci »adnego wyniku. Zdefiniowanie funkcji jako statycznej (słowo
3Zwracaniewarto±cizfunkcji
3
kluczowe static ) spowodowane jest wymogami narzuconymi przez obiektowy charakter progra-
mów pisanych w C# i zostanie wytłumaczone w trakcie laboratorium z programów obiektowych.
Przykładowe wywołanie takiej funkcji w bloku głównym wygl¡da nast¦puj¡co:
HW();
Pozostaje jeszcze okre±li¢ gdzie mo»emy w naszym programie definiowa¢ i wywoływa¢ funk-
cje. Funkcje mog¡ by¢ definiowane jedynie w ramach klasy Program , niedozwolone jest de-
finiowanie funkcji wewn¡trz innych funkcji (np. wewn¡trz funkcji Main() ). Przeciwnie jest z
wywołaniami funkcji – te z kolei musz¡ by¢ umieszczane wewn¡trz bloków funkcyjnych. Poni»ej
przedstawiono cało±¢ kodu zawieraj¡cego definicj¦ funkcji HW i jej wywołanie:
usingSystem;
namespaceConsoleApplication2
{
classProgram
{
staticvoidMain(string[]args)
{
HW();//wywołaniefunkcjiHW
}
//DefinicjafunkcjiHW
staticvoidHW()
{
Console.WriteLine("HelloWorld!\n");
Console.ReadKey();
}
}
}
3
Zwracanie warto±ci z funkcji
Po wykonaniu zaprogramowanych operacji, funkcja mo»e (ale nie musi) zako«czy¢ si¦ zwra-
caniem warto±ci. Decyzja czy funkcja powinna zwraca¢ warto±¢ nale»y do programisty i jest
zwi¡zana ze specyfik¡ działania funkcji. Warto±¢ zwracana mo»e by¢ wynikiem operacji mate-
matycznej, ale równie» mo»e by¢ jak¡± arbitraln¡ warto±ci¡ wybran¡ przez programist¦. Poni»ej
przedstawiono działanie funkcji, która zwraca ci¡g znaków:
3Zwracaniewarto±cizfunkcji
4
usingSystem;
namespaceConsoleApplication2
{
classProgram
{
staticvoidMain(string[]args)
{
stringtext=HW();//wywołaniefunkcjiHW
Console.WriteLine(text);
Console.ReadKey();
}
//DefinicjafunkcjiHW
staticstringHW()
{
return"HelloWorld!\n";
}
}
}
Jak widzimy funkcja HW przed identyfikatorem posiada w definicji okre±lenie typu zwraca-
nego (w tym wypadku string ). Zwrócenie warto±ci odbywa si¦ przy pomocy słowa kluczowego
return . Po tym słowie musi znale¹¢ si¦ zwracana warto±¢ podana wprost jak w tym przypadku,
lub poprzez identyfikator zmiennej. By poprawnie zdefiniowa¢ funkcj¦ zwracaj¡c¡ warto±¢ na-
le»y pami¦ta¢ o nast¦puj¡cych czynnikach:
ˆ Funkcja, która ma zadeklarowany typ zwracany musi zawsze zwraca¢ warto±¢ tego typu.
Musi by¢ to równie» zapewnione na ka»dej mo»liwej drodze wykonania takiej funkcji.
Oznacza to, »e je»eli np. mamy wewn¡trz funkcji bloki instrukcji warunkowych if i else
i s¡ to bloki ko«cz¡ce wykonanie funkcji (ostatnie w ci¡gu procedur) musimy upewni¢ si¦,
zarówno blok if jak i blok else zawieraj¡ polecenie return ;
ˆ Polecenie return ko«czy wykonywanie funkcji, nawet je±li za poleceniem wci¡» znajduj¡
si¦ inne instrukcje. Warto zauwa»y¢, »e jest to równie» sposób na zako«czenie działania
funkcji nie zwracaj¡cych warto±ci (typ void ) wystarczy wówczas we wła±ciwym miejscu
funkcji umie±ci¢ linijk¦ return;
4Przekazywanieargumentudofunkcji
5
4
Przekazywanie argumentu do funkcji
4.1
Modyfikacja zmiennych globalnych
Wi¦kszo±¢ funkcji wykonuje operacje na danych, w zwi¡zku z tym musz¡ uzyska¢ w jaki± spo-
sób do nich dost¦p. Najprostsz¡ metod¡ jest modyfikowanie zmiennych globalnych. W klasie
Program nale»y zadeklarowa¢, poza funkcj¡ Main i innymi funkcjami, potrzebn¡ zmienn¡ –
wówczas ka»da funkcja zadeklarowana w klasie Program otrzymuje do niej dost¦p. Zademon-
strowano to na poni»szym przykładzie:
usingSystem;
namespaceConsoleApplication2
{
classProgram
{
staticdoublex=0;
staticvoidMain(string[]args)
{
Console.WriteLine("Warto±¢xprzedwykonaniemfunkcjif:x={0}",x);
f();//wywołaniefunkcjif
Console.WriteLine("Warto±¢xpowykonaniufunkcjif:x={0}",x);
Console.ReadKey();
}
//DefinicjafunkcjiHW
staticvoidf()
{
x+=10;//operacjanazmiennejglobalnej
}
}
}
Przedstawione podej±cie nie jest najlepsze. Jego główna wada le»y w tym co jest jego istot¡
– zmiennych globalnych. Ich istnienie, jakkolwiek nie jest bł¦dem samym w sobie, jest wad¡
utrudniaj¡ca znacznie wykorzystanie cz¦±ci gotowej aplikacji w innym programie. Funkcje, które
operuj¡ na zmiennych globalnych, by zadziała¢ w innym programie oprócz przeniesienia swojej
definicji wymagaj¡ równie» zadeklarowania zmiennych globalnych, na których operuj¡. Jedyn¡
zalet¡ tego rozwi¡zania jest brak konieczno±ci definiowania argumentów wywołania i warto±ci
zwracanej.
Zgłoś jeśli naruszono regulamin