plik


ÿþPrzesyBanie argumentów do metody Przegld zagadnieD W celu umo|liwienia metodzie wykonywanie dziaBania dla ró|nych warto[ci i parametrów oraz przekazania wielu warto[ci przez metod mo|emy przekaza metodzie odpowiednie argumenty. Przy pomocy argumentów metody, lub inaczej parametrów metody, tworzymy interfejs, przy pomocy którego metoda wymienia informacj (dane) z pozostaBymi cz[ciami programu. W poprzednim rozdziale do wymiany informacji midzy metodami byBy u|ywane zmienne wspóBdzielone, w innych jzykach natomiast mo|na u|ywa tzw. zmiennych globalnych - zmiennych zadeklarowanych poza metod i poza klas. Wymiana informacji midzy metodami z u|yciem zmiennych wspóBdzielonych w porównaniu do przesyBania argumentów do metody, generuje mniej czytelny kod. Sam mechanizm przesyBania argumentów do metody wymusza na programi[cie nadanie odpowiednich warto[ci parametrom, od których jest zale|ne dziaBanie metody. Dziki temu mo|na unikn licznych bBdów logicznych. Poszczególne metody staj si niezale|nymi jednostkami. Po skoDczeniu tego rozdziaBu studenci bd potrafi: ·ð Definiowa metody do których przesyBane s argumenty. ·ð WywoBywa metody z parametrami. ·ð Wybiera odpowiedni sposób przesyBania argumentów. ·ð Przeci|y nazw metody. ·ð Pobiera argumenty z linii wywoBania programu. Deklaracja i wywoBanie metod z parametrami List parametrów które maj by przekazane do metody, umieszczamy wewntrz nawiasów okrgBych tu| za nazw metody. Ka|dy parametr musi mie okre[lony typ i nazw. Równie| gdy kilka parametrów ma ten sam typ, ka|demu argumentowi trzeba oddzielnie okre[li typ. Poszczególne parametry oddzielamy przecinkiem. Wszystkie argumenty zdefiniowane wewntrz nawiasów okrgBych nazywamy parametrami formalnymi metody. Nazwy parametrów s lokalne dla danej metody i s dostpne w caBym "ciele" metody. Nastpujce przykBady pokazuj jak definiowa metod z parametrami: 1. Metoda przyjmujca dwa argumenty typu string static void Powitanie(string imie, string nazwisko) { Console.WriteLine("Witam Pana(i) {0} {1}", imie, nazwisko); } 2. Metoda przyjmujca jeden parametr typu double static double Szescian(double x) { return x*x*x; } WywoBujc metod z parametrami, ka|demu jej argumentowi musimy dostarczy warto[ odpowiedniego typu. Warto[ci te umieszczamy w nawiasach okrgBych po nazwie metody i s one przypisywane argumentom na podstawie kolejno[ci wystpowania. Poszczególne warto[ci oddzielamy przecinkiem. I tak, aby wywoBa metod Powitanie z przykBadu powy|ej nale|y napisa: Powitanie("Kubu[", "Puchatek"); Argumentowi o nazwie imie zostanie nadana warto[ Kubu[, a argumentowi nazwisko warto[ Puchatek. Wykonanie powy|szej linijki spowoduje pojawienie si na ekranie napisu: Witam Pana(i) Kubu[ Puchatek Argumenty (warto[ci, zmienne) umieszczone w nawiasach okrgBych w miejscu wywoBania metody nazywamy parametrami aktualnymi metody. Sposoby przesyBania argumentów do metody W jzyku C# mamy trzy sposoby przesyBania argumentów do metody: ·ð przez warto[ ·ð przez referencj ·ð jako parametr wyj[ciowy PrzesyBanie parametru przez warto[. PrzesyBanie przez warto[ jest domy[lnym mechanizmem przesyBania argumentów do metody. Argument jest traktowany jako parametr wej[ciowy. PrzesyBanie przez warto[ definiujemy przez podanie typu argumentu i jego nazwy, czyli tak jak to byBo pokazane wcze[niej w tym rozdziale. W miejscu wywoBania metody, ka|dy parametr formalny przesyBany przez warto[ reprezentuje nowo utworzon zmienn lokaln. Zmienne te inicjalizowane s warto[ciami odpowiednich parametrów aktualnych. Mechanizm przesyBania przez warto[ charakteryzuje si nastpujcymi wBa[ciwo[ciami: ·ð Argumentem aktualnym mo|e by dowolne wyra|enie odpowiedniego typu. Metod static void f(int x){...} mo|na wywoBa f(2*4); lub f(y); gdzie y jest zmienn typu int. ·ð Je|eli jako parametr aktualny przesyBamy zmienn, musi by ona wcze[niej zainicjalizowana. int y; f(y); //bBd - niezainicjalizowana zmienna ·ð Wewntrz metody parametry przesyBane przez warto[ traktowane s jako zmienne zainicjalizowane. ·ð Zmiana warto[ci parametru formalnego nie wpBywa 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. PrzesyBanie parametru przez referencj. Argument przesyBany przez referencj traktowany jest, zarówno jako parametr wej[ciowy jak i parametr wyj[ciowy. PrzesyBanie przez referencj definiujemy przez dodanie przed nazw typu parametru sBowa ref, dla ka|dego argumentu przesyBanego przez referencj. static void PrzezReferencje(ref int x,ref int y){...} W miejscu wywoBania metody, dla parametrów przesyBanych przez referencj, nie jest tworzona nowa zmienna. Parametr formalny reprezentuje ten sam obszar pamici, t sam zmienn, co parametr aktualny. W celu wywoBania metody, przed ka|dym argumentem przesyBanym przez referencj musimy postawi sBowa ref. PrzezReferencje(ref akt1,ref akt2); Przy powy|szym wywoBaniu, zmienna akt1 wewntrz metody PrzezReferencje bdzie si nazywa ("bdziemy przezywa") x, a zmienna akt2 bdzie si nazywa y. Mechanizm przesyBania przez referencj charakteryzuje si nastpujcymi wBa[ciwo[ciami: ·ð Argumentem aktualnym mo|e by tylko zmienna odpowiedniego typu. Metod static void f(ref int x){...} mo|na wywoBa f(ref y); gdzie y jest zmienn typu int. WywoBanie f(ref 2*4); spowoduje bBd kompilacji ·ð Zmienna przesyBana przez referencj do metody musi by wcze[niej zainicjalizowana. int y; f(ref y); //bBd - niezainicjalizowana zmienna ·ð Wewntrz metody parametry przesyBane przez referencj traktowane s jako zmienne zainicjalizowane. ·ð Zmiana warto[ci parametru formalnego wpBywa 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. PrzesyBanie parametru jako parametr wyj[ciowy. Argument przesyBany jako parametr wyj[ciowy traktowany jest jako parametr wyj[ciowy. PrzesyBanie argumentu jako parametr wyj[ciowy definiujemy przez dodanie przed nazw typu parametru sBowa out, dla ka|dego argumentu przesyBanego jako parametr wyj[ciowy. static void JakoWyjsciowy(out int x,out int y){...} W miejscu wywoBania metody, dla parametrów przesyBanych jako parametr wyj[ciowy, podobnie jak w przypadku parametrów przesyBanych przez referencj, nie jest tworzona nowa zmienna. Parametr formalny reprezentuje ten sam obszar pamici, t sam zmienn, co parametr aktualny. W celu wywoBania metody, przed ka|dym argumentem przesyBanym jako parametr wyj[ciowy musimy postawi sBowa out. JakoWyjsciowy(out akt1,out akt2); Przy powy|szym wywoBaniu, zmienna akt1 wewntrz metody JakoWyjsciowy bdzie si nazywa ("bdziemy przezywa") x, a zmienna akt2 bdzie si nazywa y. Mechanizm przesyBania argumentu jako parametr wyj[ciowy charakteryzuje si nastpujcymi wBa[ciwo[ciami: ·ð Argumentem aktualnym mo|e by tylko zmienna odpowiedniego typu. Metod static void f(out int x){...} mo|na wywoBa f(out y); gdzie y jest zmienn typu int. WywoBanie f(out 2*4); spowoduje bBd kompilacji. ·ð Zmienna przesyBana jako parametr wyj[ciowy do metody, nie musi by wcze[niej zainicjalizowana. int y; f(out y); //Wszystko OK ·ð Wewntrz metody parametry przesyBane przez referencj traktowane s jako zmienne niezainicjalizowane. static void f(out int x) { ...int y = x; //bBd, pobieramy warto[ //niezainicjalizowanej zmiennej } ·ð Przed wyj[ciem z metody ka|dy parametr przesyBany jako parametr wyj[ciowy musi mie nadan warto[. ·ð Zmiana warto[ci parametru formalnego wpBywa 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. PrzykBady demonstrujce ró|ne sposoby przesyBania argumentów do metody mo|na znalez w programach RodzajePrzesylan i RownanieKwadratowe, które stanowi cz[ rozwizania Kurs\Demo\Modul9\Modul9.sln, gdzie Kurs jest katalogiem, gdzie skopiowano pliki kursu. Argumenty typów referencyjnych PrzesyBanie argumentu przez warto[ powoduje utworzenie nowej zmiennej i skopiowanie zawarto[ci parametru aktualnego do tej zmiennej. W przypadku przesBania zmiennej typu referencyjnego spowoduje to, |e nowo utworzona zmienna bdzie si odwoBywa do tego samego obiektu, co zmienna która zostaBa przesBana jako parametr aktualny. Zmiany obiektu wewntrz metody przy pomocy nowo utworzonej zmiennej, bd widoczne równie| na zewntrz metody. Rozwa|my to na przykBadzie przesyBania 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 dziaBania powy|szego kodu na ekranie powinno pojawi si: 1 Dzieje si tak, poniewa| zmienna tablicowa t oraz zmienna tablicowa tab odwoBuj si do tego samego obiektu. Rozwa|my jeszcze jeden przykBad: static void M2(int [] t) { t = new int[3]; t[0] = 1 } ... int [] tab = {10,11,12}; M2(tab); Console.Write(tab[0]); W wyniku dziaBania powy|szego kodu na ekranie powinno pojawi si: 10 PrzykBad powy|szy ró|ni si tym od poprzedniego, |e w momencie ustawiania warto[ci pierwszego elementu tablicy w metodzie M2, zmienna t odwoBuje si ju| do innego obiektu tablicy. Linijka t = new int[3]; powoduje zmian warto[ci zmiennej tablicowe, a nie obiektu, a przy przesyBaniu przez warto[, co ju| wspominano wcze[niej, zmiany warto[ci parametru formalnego nie s przenoszone na parametr aktualny. W przypadku gdyby parametr byB przesyBany przez referencj lub jako parametr wyj[ciowy, zmiana warto[ci zmienne, któr reprezentuje parametr formalny, pociga za sob zmian w parametrze aktualnym. Poni|szy 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 PrzesyBanie dowolnej liczby argumentów W jzyku C# istnieje mechanizm przesyBania dowolnej liczby argumentów do metody. Wykorzystywany jest choby w metodzie Write, klasy Console. Do oznaczenia, |e metoda mo|e przyj dowoln liczb parametrów, u|ywamy sBowa kluczowego params w poBczeniu 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; } Powy|sz metod mo|emy wywoBa na dwa sposoby: 1. PrzesyBajc jako argument tablic double [] t = {1.3,2.4,3.1,4.3}; double x = Suma(t); 2. PrzesyBajc jako argument list elementów. Lista mo|e by równie| pusta. Jako element mo|e wystpowa dowolne wyra|enie, którego typ jest zgodny z typem podstawowym tablicy wystpujcej po sBowie params. double y = Suma(1.3,2.4,3.1,4.3); W przypadku powy|szego wywoBania, automatycznie tworzony jest obiekt tablicy. W przypadku definiowania metody z dowoln liczb parametrów nale|y pamita: ·ð SBowa kluczowego params u|ywamy w poBczeniu z deklaracj argumentu typu jednowymiarowej tablicy. ·ð Argument z modyfikatorem params musi by definiowany na koDcu listy parametrów. ·ð Mo|e by tylko jeden argument z modyfikatorem params dla pojedynczej metody. ·ð Argument z modyfikatorem params zawsze przesyBamy przez warto[. Przeci|enie nazwy metody W poprzednim rozdziale wspominano, |e wyjtkiem od reguBy tworzenia unikalnych nazw, jest mo|liwo[ nadania takiej samej nazwy zmiennej wspóBdzielonej i zmiennej lokalnej. Drugim wyjtkiem od reguBy, |e w jednym bloku kodu nie mo|e wystpowa dwóch takich samych identyfikatorów, jest mechanizm zwany przeci|eniem nazwy metody. Przeci|enie nazwy metody lub krócej przeci|enie metody, polega na nadaniu kilku metodom jednej klasy tej samej nazwy. Jest to mo|liwe, poniewa| w trakcie kompilacji nazwa metody jest rozszerzana o typ argumentów przekazywanych do metody. Metody nale|ce do jednej klasy musz ró|ni si sygnatur. Na sygnatur metody skBadaj si: ·ð nazwa metody ·ð typ parametrów ·ð ilo[ parametrów ·ð modyfikator typu parametru Uwaga: Modyfikatory out i ref nie s rozró|nialne przez kompilator. Do sygnatury metody nie nale|: ·ð typ warto[ci zwracanej przez metod ·ð nazwy parametrów metody Dopuszczalna jest wic nastpujca definicja klasy (przykBad przeci|enia 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(){...} Ró|ni si tylko typem warto[ci zwracanej przez metod ·ð static void Nazwa(double a,double b){...} static void Nazwa(double x,double y){...} Ró|ni si tylko nazw parametrów ·ð static void Nazwa(ref double a){...} static void Nazwa(out double x){...} Modyfikatory out i ref nie s rozró|nialne przez kompilator. Napotykajc wywoBanie metody, której nazwa jest przeci|ona, kompilator wybiera odpowiedni metod na podstawie typu argumentów aktualnych. Nie mo|na nadawa takich samych nazw metodzie i innym skBadnikom klasy: zmiennym wspóBdzielonym, nazwom typów zdefiniowanych w klasie lub staBym nazwanym. Stosowanie jednakowych nazw dla kilku metod tej samej klasy powinno by u|ywane bardzo roztropnie, gdy| mo|e powodowa trudno[ci z utrzymaniem kodu. Argument metody Main Uruchamiajc program, mo|na przekaza do niego pewn informacj - argumenty w wierszu wywoBania. W celu uruchomienia programu z argumentami w linii poleceD wydajemy nastpujc komend. NazwaProgramu arg1 arg2<ENTER> W [rodowisku Visual Studio mo|na równie| ustawi argumenty linii poleceD. Ustawia si je w oknie WBa[ciwo[ci Projektu (Menu Project/Nazwa Projektu Properties...) na zakBadce Debug, w polu edycyjnym Command line arguments:. Argumenty podane w wierszu wywoBania programu, s przekazywane do programu za pomoc tablicy napisów (string), która jest parametrem metody Main. Chcc przetwarza argumenty linii poleceD musimy jako punkt startowy naszego programu u|y metody Main z argumentem. static int Main(string[] args) lub static void Main(string[] args) Poni|szy program wypisuje na ekranie wszystkie argumenty, które zostaBy podane w wierszu wywoBania. static int Main(string[] args) { foreach (string s in args) Console.WriteLine(s); Console.ReadKey(); return 0; } PrzykBad demonstrujcy u|ycie argumentów linii wywoBania mo|na znalez w programie ArgumentyMain, który stanowi cz[ rozwizania Kurs\Demo\Modul9\Modul9.sln, gdzie Kurs jest katalogiem, gdzie skopiowano pliki kursu. Pytania sprawdzajce 1. WymieD trzy sposoby przesyBania parametrów do metody. Odp. Argumenty do metody mo|emy przesyBa: a. Przez warto[. b. Przez referencj. c. Jako parametr wyj[ciowy 2. Co nale|y do sygnatury metody? Odp. Do sygnatury metody nale|: nazwa metody, typ parametrów, ilo[ parametrów, modyfikator typu parametru 3. Zaznacz prawidBowe formy przeci|enia metody: static double Dodaj(int x, double y) a. static double Dodaj(int a, double b) b. static double Dodaj(double x, double y) c. static double Dodaj() d. static double Dodaj(ref int x,out double y) e. static int Dodaj(int x, double y) Odp. PrawidBowe odpowiedzi to: b, c, d. 4. Co zostanie wypisane na ekranie? static void DodajJeden(double [] t){ for(int i=0; i<t.Lenght;i++) t[i]++; } static void Main(){ double [] tab = {1,2,3,4}; DodajJeden(tab); foreach(double d in tab) Console.Write("{0}, ",d); } Odp. Na ekranie zostanie wypisane: 2, 3, 4, 5 5. Jaki popeBniono bBd w poni|szym kodzie? static void Wypisz(out double d){ Console.Write("d = {0}",d) } Odp. W powy|szym kodzie pobierany warto[ niezainicjalizowanej zmiennej. Argumenty przesyBane jako parametr wyj[ciowy s traktowane przez kompilator jako niezainicjalizowane. Laboratorium wiczenie 1: Napisz dwie metody obliczajce warto[ wielomianu metod Hornera. Pierwsza metoda oblicza tylko warto[ wielomianu dla warto[ci x podanej jako argument metody i zwraca j do programu. WspóBczynniki wielomianu przesyBane s jako parametr z modyfikatorem params (dowolna ilo[ argumentów). Druga metoda dodatkowo oblicza stopieD wielomianu - argument przesyBany jako parametr wyj[ciowy. W metodzie Hornera stosuje si nastpujce przeksztaBcenie : a0xn + a1xn-1 + a2xn-2 +... +an-1x1 + an = (...((a0x + a1)*x + a2)*x+...+an-1)*x + an W wyniku zastosowania powy|szego przeksztaBcenia zmniejszamy ilo[ wykonywanych dziaBaD i zwikszamy dokBadno[ obliczonego wyniku. 1. Uruchom Visual Studio Naci[nij przycisk Start systemu Windows, wybierz Wszystkie Programy nastpnie Microsoft Visual Studio 2005/ Microsoft Visual Studio 2005. 2. Utwórz nowy projekt a. Z menu File wybierz New/Project... b. W oknie dialogowym New Project okre[l nastpujce wBa[ciwo[ci: i. typu projektu: Visual C#/Windows ii. szablon: Console Application iii. lokalizacja: Moje Dokumenty\Visual Studio 2005\Projects\ iv. nazwa projektu: Wielomian. v. nazwa rozwizania: Lab9 3. Wewntrz klasy Program utwórz metod Wielomian, która zwraca warto[ wielomianu dla warto[ci 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; } 4. Do klasy Program dodaj drug metod Wielomian, W odró|nieniu od metody zdefiniowanej w punkcie poprzednim, metoda ta posiada dodatkowy argument przesyBany jako parametr wyj[ciowy w którym 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); } 5. 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("StopieD wielomianu: {0}", stopienWielomianu); Console.WriteLine("\nInny sposób przekazania ¬ warto[ci wspóBczynników 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("StopieD wielomianu: {0}", stopienWielomianu); Console.ReadKey(); } 6. Skompiluj i uruchom program. wiczenie 2: Napisz dwie metody sortujce tablice. Pierwsza niech sortuje tablice liczb rzeczywistych. Druga metoda bdzie sortowaBa tablice napisów. Do porównania dwóch napisów u|yj 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 pózniej w kolejno[ci alfabetycznej ni| s2. Wicej na temat metody Compare mo|na znalez w MSDN Library. Do sortowania u|yj algorytmu sortowania przez kopcowanie (heap sort). Podstaw tej metody jest tworzenie tzw. kopca. Kopiec definiujemy jako cig elementów tablicy a[p], a[p+1], ..., a[q] speBniajcych 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, która jest wykorzystywana w metodzie sortujcej, w pliku Kurs\Lab\Modul9\Start\Przesiew.gif, gdzie Kurs jest katalogiem gdzie skopiowano pliki kursu. 1. Dodaj do bie|cego rozwizania nowy projekt a. Z menu File wybierz Add/New Project... b. W oknie dialogowym Add New Project okre[l nastpujce wBa[ciwo[ci: i. typu projektu: Visual C#/Windows ii. szablon: Console Application iii. nazwa projektu: SortowanieStogowe. 2. UczyD nowo utworzony projekt projektem startowym a. Zaznacz projekt SortowanieStogowe w okienku Solution Explorer i z menu kontekstowego wybierz Set as StartUp Project. albo, gdy rozpoczynasz laboratorium od tego wiczenia 1. Uruchom Visual Studio Naci[nij przycisk Start systemu Windows, wybierz Wszystkie Programy nastpnie Microsoft Visual Studio 2005/ Microsoft Visual Studio 2005. 2. Utwórz nowy projekt a. Z menu File wybierz New/Project... b. W oknie dialogowym New Project okre[l nastpujce wBa[ciwo[ci: i. typu projektu: Visual C#/Windows ii. szablon: Console Application iii. lokalizacja: Moje Dokumenty\Visual Studio 2005\Projects\ iv. nazwa projektu: SortowanieStogowe. v. nazwa rozwizania: Lab9 3. Do klasy Program dodaj metod Przesiewaj, której dziaBanie jest okre[lone 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 metod Przesiewaj, której dziaBanie jest okre[lone przez schemat blokowy w pliku Przesiew.gif. Typ string przyjmij jako typ podstawowy tablicy. Do porównania elementów tablicy, zmiast operatora mniejszo[ci <, u|ywaj 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; } if (i != l) tab[i] = x; } 5. Do klasy Program dodaj metod Sortuj, której dziaBanie jest okre[lone 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 metod Sortuj, której dziaBanie jest okre[lone 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 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); Console.WriteLine("\n\n*****************\n"); string[] napisy = { "szafa", "Szwecja", "szalik", "siano", "stóg", "szampan", "SBowacja" }; Console.WriteLine("Tablica wyrazów przed ¬sortowaniem"); foreach (string s in napisy) Console.Write("{0}; ", s); Sortuj(napisy); Console.WriteLine("\nTablica wyrazów po ¬sortowanu"); foreach (string s in napisy) Console.Write("{0}; ", s); Console.ReadKey(); } 8. Skompiluj i uruchom program.

Wyszukiwarka

Podobne podstrony:
14 EW ZEW Srodowisko do metody Johna
05 Wprowadzenie do metodyki RUP
13 EW ZEW Procesy do metody Johna
17 EW ZEW Poradnia do metody Johna
Tablice do metody przemieszczeń 1
18 EW ZEW Osordek Metodyczny do metody Johna
15 EW ZEW Zarzadzanie do metody Johna
do metody Eulera
Metody doboru regulatora do UAR
Metody poz tlenu do oxyfuel
METODY POBIERANIA PRÓBEK DO CELÓW URZĘDOWEJ KONTROLI
Dobór metody przedłużania do rodzaju paznokcie
Amatorskie metody wykonywania płytek drukowanych, czyli do czego może służyć żelazko c d
Metody dostępu do nośnika

więcej podobnych podstron