28
Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: [email protected] PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ IDZ DO IDZ DO ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG KATALOG KSI¥¯EK KATALOG KSI¥¯EK TWÓJ KOSZYK TWÓJ KOSZYK CENNIK I INFORMACJE CENNIK I INFORMACJE ZAMÓW INFORMACJE O NOWOCIACH ZAMÓW INFORMACJE O NOWOCIACH ZAMÓW CENNIK ZAMÓW CENNI K CZYTELNIA CZYTELNIA FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE SPIS TRECI SPIS TRECI DODAJ DO KOSZYKA DODAJ DO KOSZYKA KATALOG ONLINE KATALOG ONLINE C#. Æwiczenia Autor: Marcin Lis ISBN: 83-7361-128-2 Format: B5, stron: 166 Jêzyk C# zosta³ opracowany w firmie Microsoft i wywodzi siê z rodziny C/C++, choæ zawiera równie¿ wiele elementów znanych programistom Javy, jak na przyk³ad mechanizmy automatycznego odzyskiwanie pamiêci. £¹czy wiêc w sobie wszystko to, co najlepsze w Javie i C++, a dodatkowo pozwala na wygodne korzystanie z klas wchodz¹cych w sk³ad platformy .NET. Dziêki ksi¹¿ce „C#. Æwiczenia” nauczysz siê programowaæ w C# niezale¿nie od tego, czy znasz ju¿ C++ lub Javê. Kilkadziesi¹t æwiczeñ pozwoli Ci poznaæ jêzyk C# od podstaw po zagadnienia zaawansowane. Zalet¹ ksi¹¿ki jest zwiêz³y i przystêpny opis prezentowanych zagadnieñ i nastawienie na praktykê programistyczn¹, a nie na rozwa¿ania teoretyczne. Poznasz: • rodowisko uruchomieniowe C# i Visual Studio • Zmienne, operatory i typy danych • Instrukcje C# • Podstawy programowania obiektowego, tworzenie klas, metod i konstruktorów • U¿ycie tablic w C# • Obs³ugê b³êdów za pomoc¹ wyj¹tków • Interfejsy i rzutowanie • Obs³ugê zdarzeñ • Korzystanie z komponentów interfejsu u¿ytkownika Windows

C#. Ćwiczenia

Embed Size (px)

DESCRIPTION

Język C# został opracowany w firmie Microsoft i wywodzi się z rodziny C/C++, choć zawiera również wiele elementów znanych programistom Javy, jak na przykład mechanizmy automatycznego odzyskiwanie pamięci. Łączy więc w sobie wszystko to, co najlepsze w Javie i C++, a dodatkowo pozwala na wygodne korzystanie z klas wchodzących w skład platformy .NET.Dzięki książce "C#. Ćwiczenia" nauczysz się programować w C# niezależnie od tego, czy znasz już C++ lub Javę. Kilkadziesiąt ćwiczeń pozwoli Ci poznać język C# od podstaw po zagadnienia zaawansowane. Zaletą książki jest zwięzły i przystępny opis prezentowanych zagadnień i nastawienie na praktykę programistyczną, a nie na rozważania teoretyczne.Poznasz: * Środowisko uruchomieniowe C# i Visual Studio * Zmienne, operatory i typy danych * Instrukcje C# * Podstawy programowania obiektowego, tworzenie klas, metod i konstruktorów * Użycie tablic w C# * Obsługę błędów za pomocą wyjątków * Interfejsy i rzutowanie * Obsługę zdarzeń * Korzystanie z komponentów interfejsu użytkownika Windows

Citation preview

Page 1: C#. Ćwiczenia

Wydawnictwo Helionul. Chopina 644-100 Gliwicetel. (32)230-98-63e-mail: [email protected]

PRZYK£ADOWY ROZDZIA£PRZYK£ADOWY ROZDZIA£

IDZ DOIDZ DO

ZAMÓW DRUKOWANY KATALOGZAMÓW DRUKOWANY KATALOG

KATALOG KSI¥¯EKKATALOG KSI¥¯EK

TWÓJ KOSZYKTWÓJ KOSZYK

CENNIK I INFORMACJECENNIK I INFORMACJE

ZAMÓW INFORMACJEO NOWO�CIACH

ZAMÓW INFORMACJEO NOWO�CIACH

ZAMÓW CENNIKZAMÓW CENNIK

CZYTELNIACZYTELNIA

FRAGMENTY KSI¥¯EK ONLINEFRAGMENTY KSI¥¯EK ONLINE

SPIS TRE�CISPIS TRE�CI

DODAJ DO KOSZYKADODAJ DO KOSZYKA

KATALOG ONLINEKATALOG ONLINE

C#. ÆwiczeniaAutor: Marcin LisISBN: 83-7361-128-2 Format: B5, stron: 166

Jêzyk C# zosta³ opracowany w firmie Microsoft i wywodzi siê z rodziny C/C++, choæ zawiera równie¿ wiele elementów znanych programistom Javy, jak na przyk³ad mechanizmy automatycznego odzyskiwanie pamiêci. £¹czy wiêc w sobie wszystko to, co najlepsze w Javie i C++, a dodatkowo pozwala na wygodne korzystanie z klas wchodz¹cych w sk³ad platformy .NET.

Dziêki ksi¹¿ce „C#. Æwiczenia” nauczysz siê programowaæ w C# niezale¿nie od tego, czy znasz ju¿ C++ lub Javê. Kilkadziesi¹t æwiczeñ pozwoli Ci poznaæ jêzyk C# od podstaw po zagadnienia zaawansowane. Zalet¹ ksi¹¿ki jest zwiêz³y i przystêpny opis prezentowanych zagadnieñ i nastawienie na praktykê programistyczn¹, a nie na rozwa¿ania teoretyczne.

Poznasz:

• �rodowisko uruchomieniowe C# i Visual Studio • Zmienne, operatory i typy danych • Instrukcje C# • Podstawy programowania obiektowego, tworzenie klas, metod i konstruktorów • U¿ycie tablic w C# • Obs³ugê b³êdów za pomoc¹ wyj¹tków • Interfejsy i rzutowanie • Obs³ugê zdarzeñ • Korzystanie z komponentów interfejsu u¿ytkownika Windows

Page 2: C#. Ćwiczenia

Spis treściWstęp.......................................................................................................................... .................................5

Część I Język programowania ................................................................................................................... 7

Rozdział 1. Pierwsza aplikacja ................................................................................................................................9Język C# .........................................................................................................................9Środowisko uruchomieniowe........................................................................................... 10Narzędzia ...................................................................................................................... 11Najprostszy program ...................................................................................................... 11Kompilacja i uruchamianie.............................................................................................. 12Visual Studio ................................................................................................................. 13Dyrektywa using ............................................................................................................ 16

Rozdział 2. Zmienne i typy danych........................................................................................................................17Typy danych.................................................................................................................. 17

Typy arytmetyczne ................................................................................................... 17Typ boolean ............................................................................................................. 19Deklarowanie zmiennych .......................................................................................... 19Typy referencyjne .................................................................................................... 22Typ string ................................................................................................................ 23Typ object ............................................................................................................... 23Wartość null............................................................................................................. 23

Operatory ...................................................................................................................... 24Operatory Arytmetyczne ........................................................................................... 24Operatory bitowe...................................................................................................... 29Operatory logiczne.................................................................................................... 30Operatory przypisania ............................................................................................... 30Operatory porównania............................................................................................... 31Operator warunkowy (?) ........................................................................................... 31Priorytety operatorów ............................................................................................... 32

Komentarze ................................................................................................................... 32

Rozdział 3. Instrukcje ...............................................................................................................................................35Instrukcje warunkowe .................................................................................................... 35

Instrukcja if...else ..................................................................................................... 35Instrukcja if...else if .................................................................................................. 38Instrukcja switch ...................................................................................................... 39

Instrukcja goto ............................................................................................................... 41Pętle ............................................................................................................................. 43

Pętla for................................................................................................................... 43Pętla while ............................................................................................................... 48Pętla do while........................................................................................................... 49

Page 3: C#. Ćwiczenia

4 C#. Ćwiczenia

Wprowadzanie danych.................................................................................................... 50Argumenty wiersza poleceń....................................................................................... 51Instrukcja ReadLine.................................................................................................. 54

Rozdział 4. Programowanie obiektowe.............................................................................................................61Klasy ............................................................................................................................ 61Metody ......................................................................................................................... 63Konstruktory ................................................................................................................. 69Specyfikatory dostępu .................................................................................................... 71Dziedziczenie ................................................................................................................ 75

Rozdział 5. Tablice .......................................................................................................................................................77Deklarowanie tablic........................................................................................................ 77Inicjalizacja ................................................................................................................... 80Pętla foreach.................................................................................................................. 81Tablice wielowymiarowe ................................................................................................ 83

Rozdział 6. Wyjątki .....................................................................................................................................................89Obsługa błędów ............................................................................................................. 89Blok try...catch .............................................................................................................. 93Hierarchia wyjątków ...................................................................................................... 97Własne wyjątki .............................................................................................................. 99

Rozdział 7. Interfejsy ...............................................................................................................................................101Prosty interfejs............................................................................................................. 101Interfejsy w klasach potomnych .................................................................................... 104Czy to interfejs?........................................................................................................... 110

Rzutowanie ............................................................................................................ 113Słowo kluczowe as ................................................................................................. 115Słowo kluczowe is .................................................................................................. 116

Część II Programowanie w Windows ................................................................................................117

Rozdział 8. Pierwsze okno .....................................................................................................................................119Utworzenie okna .......................................................................................................... 119Wyświetlanie komunikatu ............................................................................................. 122Zdarzenie ApplicationExit............................................................................................. 123

Rozdział 9. Delegacje i zdarzenia...................................................................................................................... 125Delegacje .................................................................................................................... 125Zdarzenia .................................................................................................................... 128

Rozdział 10. Komponenty ........................................................................................................................................ 133Etykiety (Label) ........................................................................................................... 133Przyciski (klasa Button) ................................................................................................ 137Pola tekstowe (TextBox)............................................................................................... 140Pola wyboru (CheckBox, RadioButton).......................................................................... 143Listy rozwijalne (ComboBox) ....................................................................................... 146Listy zwykłe (ListBox) ................................................................................................. 149Menu .......................................................................................................................... 151

Menu główne ......................................................................................................... 151Menu kontekstowe ................................................................................................. 157Właściwości Menu ................................................................................................. 159Skróty klawiaturowe ............................................................................................... 162

Page 4: C#. Ćwiczenia

Rozdział 3.

Instrukcje

Instrukcje warunkowe

Instrukcja if...else

Bardzo często w programie zachodzi potrzeba sprawdzenia jakiegoś warunku i, w zależno-ści od tego, czy jest on prawdziwy czy fałszywy, dalsze wykonywanie różnych instrukcji. Dotakiego sprawdzania służy właśnie instrukcja warunkowa �������. Ma ona ogólną postać:

���������������� ������������ �������� ����������������� �������������������������� �������� ����������������� ��������������

Spróbujmy zatem wykorzystać taką instrukcję do sprawdzenia, czy zmienna całkowita jestmniejsza od zera.

Ćwiczenie 3.1.

Wykorzystaj instrukcję warunkową if…else do stwierdzenia, czy wartość zmiennej aryt-

metycznej jest mniejsza od zera. Wyświetl odpowiedni komunikat na ekranie.

�����������

������!��������"�����������#����$����������%&������

Page 5: C#. Ćwiczenia

36 Część I � Język programowania

�����������������������'�() ��������������������*�+������������������,�����-.���/���01������������������������-0� ��������������������������������������,�����-.���/���01���������������������������-0� ��������������

Spróbujmy teraz czegoś nieco bardziej skomplikowanego. Zajmijmy się klasycznym przy-kładem liczenia pierwiastków równania kwadratowego. Przypomnijmy, że jeśli mamyrównanie w postaci:

02 =+∗+∧∗ CxBxA ,

aby obliczyć jego rozwiązanie liczymy tzw. deltę (∆), która równa jest:

CAB ∗∗−∧ 42 .

Jeżeli delta jest większa od zera, mamy dwa pierwiastki:

ABx ∗∆+−= 2)(1

ABx ∗∆−−= 2)(2 .

Jeżeli delta jest równa zero, istnieje tylko jedno rozwiązanie, a mianowicie:

ABx ∗−= 2 .

W przypadku trzecim, jeżeli delta jest mniejsza od zera, równanie takie nie ma rozwią-zań w zbiorze liczb rzeczywistych. Skoro jest tutaj tyle warunków do sprawdzenia, jestto doskonały przykład do potrenowania zastosowania instrukcji �������. Przy tym, abynie komplikować sprawy, nie będziemy się w tej chwili zajmować wczytywaniem parame-trów równania z klawiatury, ale podamy je bezpośrednio w kodzie.

Przed przystąpieniem do realizacji tego zadania musimy się tylko jeszcze dowiedzieć, w jakisposób uzyskać pierwiastek z danej liczby? Na szczęście nie jest to wcale skomplikowane,wystarczy skorzystać z instrukcji ���� ���. Aby zatem dowiedzieć się, jaki jest pier-wiastek kwadratowy z liczby 4, należy napisać:

$��2-�3���4�

Oczywiście zamiast liczby możemy też podać w takim wywołaniu zmienną, a wynik działa-nia wypisać na ekranie np.:

�����������/���"��'�4 ���������/���"��'�$��2-�3����������/���"�� ,�����-.���/��������/���"��

Page 6: C#. Ćwiczenia

Rozdział 3. � Instrukcje 37

Ćwiczenie 3.2.

Wykorzystaj operacje arytmetyczne oraz instrukcje if…else do obliczenia pierwiastków

równania kwadratowego o parametrach podanych bezpośrednio w kodzie programu.

Wyniki wyświetl na ekranie (rysunek 3.1).

�����������

������5������� �����"�����������#����$����������%&�����������������������������6�'�7���������8�'�()���������,�'�4

���������,�����-.���/���05���������9������:;�0� ���������,�����-.���/���06:�0�<��������6�<�0�8:�0�<��������8�<����������0�,:�0�<��������,�<�0;�0�

��������������������6�''�+������������������,�����-.���/���0=����������9������ ��������:�6�'�+>0� �����������������������������������������"�������'��������8�?��������8�(�4�?��������6�?��������, �������������������������*�+�������������������������,�����-.���/���0@����*�+-0� �����������������������,�����-.���/���0=���9�����������������A��������������������������������"���������"������������20� ��������������������������������������������������������������"������ ��������������������������������''�+������������������������������������� �'�(��������8�B�C�?��������6 �������������������������������,�����-.���/���0D����A����:�E�'�0�<����� � ������������������������������������������������������������������������������������� �'��(��������8�<�$��2-�3����������B��������������������������������C�?��������6 �������������������������������,�����-.����0D����A����:�E7�'�0�<����� � ����������������������������������� �'��(��������8�(�$��2-�3����������B��������������������������������C�?��������6 �������������������������������,�����-.���/���0��EC�'�0�<����� � �������������������������������������������������������

Rysunek 3.1.Wynik działaniaprogramuobliczającegopierwiastki równaniakwadratowego

Page 7: C#. Ćwiczenia

38 Część I � Język programowania

Instrukcja if...else ifJak pokazało nam ćwiczenie 3.2, instrukcję warunkową można zagnieżdżać, to znaczy pojednym �� może występować kolejne, po nim następne itd. Jednakże taka budowa kodupowoduje, że przy wielu zagnieżdżeniach staje się on bardzo nieczytelny. Aby tego unik-nąć, możemy wykorzystać instrukcję ����������. Zamiast tworzyć niewygodną konstruk-cję, taką jak przedstawiona poniżej:

��������� 7���������� ��7��������������� C����������������� ��C�������������������������� F������������������������ ��F�������������������������������������������� ��4��������������

Całość możemy zapisać dużo prościej i czytelniej w następującej postaci:

��������� 7���������� ���7������������� C���������� ���C������������� F���������� ���F������������ ���4�

Ćwiczenie 3.3.

Zmodyfikuj program napisany w ćwiczeniu 3.2 tak, aby wykorzystywał on instrukcję if…

else if.

�����������

������5������� �����"�����������#����$����������%&�����������������������������6�'�7���������8�'�()���������,�'�4

���������,�����-.���/���05���������9������:;�0� ���������,�����-.���/���06:�0�<��������6�<�0�8:�0�<��������8�<����������0�,:�0�<��������,�<�0;�0�

��������������������6�''�+������������������,�����-.���/���0=����������9������ ��������:�6�'�+>0�

Page 8: C#. Ćwiczenia

Rozdział 3. � Instrukcje 39

�����������������������������������������"�������'��������8�?��������8�(�4�?��������6�?��������, �������������������"������

�������������������������*�+�������������������������,�����-.���/���0@����*�+-0� �����������������������,�����-.���/���0=���9�����������������A��������������������������������"���������"������������20� ���������������������������������������������''�+����������������������������� �'�(��������8�B�C�?��������6 �����������������������,�����-.���/���0D����A����:�E�'�0�<����� � ��������������������������������������������������������������� �'��(��������8�<�$��2-�3����������B�C�?��������6 �����������������������,�����-.����0D����A����:�E7�'�0�<����� � ��������������������������� �'��(��������8�(�$��2-�3����������B�C�?��������6 �����������������������,�����-.���/���0��EC�'�0�<����� � �������������������������������

Instrukcja switch

Jeżeli mamy do sprawdzenia wiele warunków, instrukcja ���� pozwoli nam wygodniezastąpić ciągi instrukcji ����������. Jeśli mamy następujący fragment kodu:

������''�7���������� ��7����������''�C���������� ��C����������''�F���������� ��F������������ ��4�

możemy zastąpić poniższym:

�����2�����������7:��������������� ��7 ���������"�� ������C:��������������� ��C ���������"�� ������F:��������������� ��F ���������"�� ��������:��������������� ��4 ���������"�� �

Page 9: C#. Ćwiczenia

40 Część I � Język programowania

Sprawdzamy tu po kolei, czy � nie jest przypadkiem równe jeden, potem dwa i w końcutrzy. Jeżeli tak, wykonywane są instrukcje po odpowiedniej klauzuli ����. Jeżeli � niejest równe żadnej z wymienionych liczb, wykonywane są instrukcje po słowie ������.Instrukcja ����� powoduje wyjście z bloku ����. Czyli, jeśli � będzie równe jeden,zostaną wykonane instrukcje ����������, jeśli � będzie równe dwa, zostaną wykonaneinstrukcje ����������, jeśli � będzie równe trzy, zostaną wykonane instrukcje �����������. W przypadku gdyby � nie było równe ani jeden, ani dwa, ani trzy, zostaną wykonaneinstrukcje ����������.

Ćwiczenie 3.4.

Zadeklaruj zmienną typu całkowitego i przypisz jej dowolną wartość. Korzystając z in-

strukcji switch, sprawdź, czy wartość ta równa jest 1 lub 2. Wyświetl odpowiedni komu-

nikat na ekranie.

�����������

������5������� �����"�����������#����$����������%&������������������������'�7 ��������������2�������������������������7:�����������������������,�����-.���/���0��'�70� �����������������������"�� ��������������������C:�����������������������,�����-.���/���0��'�C0� �����������������������"�� ����������������������:�����������������������,�����-.���/���01����������������9��������7������C-0� �����������������������"�� ��������������

Warto w tym miejscu zauważyć, że w przypadku C#, odmiennie niż w językach takichjak C, C++ czy Java, nie możemy pominąć instrukcji �����, powodującej wyjście z in-strukcji ����. Próba taka skończy się błędem kompilacji (rysunek 3.2). Ściślej rzeczbiorąc, nie musi być to dokładnie instrukcja �����, ale dowolna instrukcja, w wyniku któ-rej zostanie opuszczony blok ����. Dokładniejsze wyjaśnienie i przykład takiej kon-strukcji znajduje się przy opisie instrukcji � .

Rysunek 3.2.Próba pominięciainstrukcji break kończysię błędem kompilacji

Page 10: C#. Ćwiczenia

Rozdział 3. � Instrukcje 41

Instrukcja gotoInstrukcja � , czyli instrukcja umożliwiająca skok do określonego miejsca w programie,od dawna jest uznawana za niebezpieczną i powodująca wiele problemów. Niemniej w C#jest ona obecna, choć zaleca się jej stosowanie jedynie w przypadku bloków ���������oraz wychodzenia z zagnieżdżonych pętli, w których to sytuacjach jest faktycznie użyteczna.Używamy jej w postaci

������� ���

gdzie �!���� jest zdefiniowanym miejscem w programie. Nie możemy jednak w tensposób wskoczyć do bloku instrukcji, tzn. nie jest możliwa konstrukcja:

����������'�+ ���*�)++ ��<<���������''�7++���������"�7 �����������'�+ ���*�7+++ ��<<������"�7: �

Nic jednak nie stoi na przeszkodzie, aby zdefiniować etykietę przed lub za druga pętlą, pisząc:

����������'�+ ���*�)++ ��<<���������''�7++���������"�7 ���"�7:����������'�+ ���*�7+++ ��<<��

Taki kod jest już jak najbardziej poprawny.

Ćwiczenie 3.5.

Napisz przykładowy program, w którym instrukcja goto jest wykorzystywana do wyjścia

z zagnieżdżonej pętli for.

�����������

��"������������������"�����������#����$���������������������������'�+ ���*�)++ ��<<����������������������������'�+ ���*�7+++ ��<<�������������������������������''�7++��GG����H�C++�����������������������������������������"�7 ����������������������������������������������������������������� �����������"�7:���������,�����-.���/���05I��������������������>0� ����

Page 11: C#. Ćwiczenia

42 Część I � Język programowania

Wykorzystujemy tutaj dwie pętle, zewnętrzną, gdzie zmienną iteracyjną jest �, oraz we-wnętrzną, gdzie zmienną iteracyjną jest �. Wewnątrz drugiej pętli znajduje się warunek,który należy odczytywać następująco: jeżeli � równe jest 100 oraz � jest większe od 200,idź do miejsca w kodzie oznaczonego etykietą ������. Zatem po osiągnięciu warunkuna ekranie zostanie wyświetlony napis "#���$ ��%��&�$������ oraz aplikacja zakończydziałanie.

Zauważmy, że przed etykietą znajduje się instrukcja ����� powodująca zakończenie dzia-łania funkcji ����. Gdyby jej nie było, napis o przerwaniu pętli wyświetlany byłby zawsze,niezależnie od spełnienia warunku wewnątrz pętli. Oczywiście w tym przypadku warunekzawsze zostanie spełniony, także ����� nie jest niezbędne, ale już w prawdziwej aplikacjizapomnienie o tym drobnym z pozoru fakcie mogłoby przysporzyć nam wielu problemów.

Spróbujmy teraz wykorzystać instrukcję � w drugim z zalecanych przypadków jej użycia,to znaczy w bloku ���������.

Ćwiczenie 3.6.

Napisz przykładowy kod, w którym instrukcja goto jest wykorzystywana w połączeniu

z blokiem switch…case.

�����������

��"������������������"�����������#����$�����������������D��������'����D������� ���������������'��-JE��)� ���������,�����-.���/���0.���������������KL��:�0�<��� ��������������2������������������������7�:�����������������������,�����-.���/���0����������������F-0� �����������������������"�� ��������������������C�:��������������������������������7 ��������������������F�:�����������������������,�����-.���/���0����������������M-0� ���������������������������������� ��������������������4�:��������������������������������F ��������������������)�:��������������������������������F �����������������������:�����������������������,�����-.���/���0J����������� ����������"�� �����7�����������������������������"�� �����C0� �����������������������"�� ��������������

Page 12: C#. Ćwiczenia

Rozdział 3. � Instrukcje 43

Przykładowe wyniki działania tej prostej aplikacji widoczne są na rysunku 3.3. Zmiennej� typu �� przypisujemy losową liczbę całkowitą z zakresu '�(�). Odpowiada za to linia�����*���+�,�)�-, gdzie � jest zmienną wskazującą na obiekt klasy .��� /. Klasa tasłuży właśnie do generowania losowych, a dokładniej pseudolosowych, liczb.

Rysunek 3.3.Przykładowe wynikidziałania programuz ćwiczenia 3.6

Następnie w bloku ��������� rozpatrujemy następujące sytuacje:

� � jest równe ' — wyświetlamy napis +���$ ��%��!� ���!������� ��������0������ ��������

� � jest równe � lub � — wyświetlamy napis ������/�����$�� ����

� � jest równe �, � lub ) — wyświetlamy napis ������/�����$�� ��1�oraz +���$ ��%��!� ���!������� ��������0������� ��������

PętlePętle w językach programowania pozwalają na wykonywanie powtarzających się czynności.Dokładnie w ten sam sposób działają one również w C#. Jeśli chcemy, na przykład, wypisaćna ekranie 10 razy napis 23, to możemy zrobić to, pisząc 10 razy 2 �� ���4����5����6236�-. Jeżeli jednak chcielibyśmy mieć, na przykład, 100 takich napisów, to, pomija-jąc oczywiście sensowność takiej czynności, byłby to już problem. Na szczęście z pomocąprzychodzą nam właśnie pętle.

Pętla for

Pętla typu � � ma następująca składnię:

����������������A� �� ������������� �� �������������� ��A����������� �������� �������

4!��7����� & �$8� �� jest stosowane do zainicjalizowania zmiennej używanej jakolicznik ilości wykonań pętli. 4!��7����������� �� określa warunek, jaki musi być speł-niony, aby dokonać kolejnego przejścia w pętli, �!��7�����/ �!�����8�� używane jestzwykle do modyfikacji zmiennej będącej licznikiem.

Page 13: C#. Ćwiczenia

44 Część I � Język programowania

Ćwiczenie 3.7.

Wykorzystując pętlę typu for, napisz program wyświetlający na ekranie 100 razy napis C#.

�����������

���������������"�����������#����$����������%&�����������������������������'�7 ���*'�7++ ��<<������������������,�����-.����0,N0� ��������������

Wynik działania tego prostego programu widoczny jest na rysunku 3.4.

Rysunek 3.4.Wynik działania pętlifor z ćwiczenia 3.7

Zmienna � to tzw. zmienna iteracyjna, której na początku przypisujemy wartość � (����*��). Następnie, w każdym przebiegu pętli jest ona zwiększana o jeden (�99) orazwykonywana jest instrukcja 2 �� ���4���5����623�6�- Wszystko trwa tak długo, aż��osiągnie wartość 100 (��:*��'').

Wyrażenie modyfikujące jest zwykle używane do modyfikacji zmiennej iteracyjnej. Takiejmodyfikacji możemy jednak dokonać również wewnątrz pętli. Struktura tego typu wyglądanastępująco:

����������������A� �� ������������� �� ���������� �������� ��������������������� ��A��

Ćwiczenie 3.8.

Zmodyfikuj pętle typu for z ćwiczenia 3.7 tak, aby wyrażenie modyfikujące znalazło sięw bloku instrukcji for.

�����������

���������������"�����������#����$����������%&�����������������������������'�7 ���*'�7++ ������������������,�����-.����0,N�0� �����������������<< ���������������

Page 14: C#. Ćwiczenia

Rozdział 3. � Instrukcje 45

Zwracam uwagę, że mimo iż wyrażenie modyfikujące jest teraz wewnątrz pętli, średnikznajdujący się po ��:*��'' jest niezbędny! Jeśli o nim zapomnimy, kompilator zgłosi błąd(rysunek 3.5).

Rysunek 3.5.Pominięcie średnikaw pętli for powodujebłąd kompilacji

Kolejna ciekawą możliwością jest połączenie wyrażenia warunkowego i modyfikującego.Konkretnie należy spowodować, aby wyrażenie warunkowe było jednocześnie wyrażeniemmodyfikującym. Tworzenie takich konstrukcji umożliwiają nam, na przykład, operatoryinkrementacji i dekrementacji.

Ćwiczenie 3.9.

Napisz taką pętlę typu for, aby wyrażenie warunkowe było jednocześnie wyrażeniem

modyfikującym.

�����������

���������������"�����������#����$����������%&�����������������������������'�7 ��<<�*'�7++ ������������������,�����-.����0,N�0� ��������������

W podobny sposób jak w poprzednich przykładach możemy się w pozbyć również wy-rażenia początkowego. Należy je przenieść przed pętlę. Schematyczna konstrukcja wy-gląda następująco:

�����������A� ������� ������������� �� ���������� �������� ��������������������� ��A��

Ćwiczenie 3.10.

Zmodyfikuj pętle typu for w taki sposób, aby wyrażenie początkowe znalazło się przed

pętlą, a wyrażenie modyfikujące wewnątrz pętli.

Page 15: C#. Ćwiczenia

46 Część I � Język programowania

�����������

���������������"�����������#����$����������%&������������������������'�7 �������������� ���*'�7++ ������������������,�����-.����0,N�0� �����������������<< ��������������

Skoro zaszliśmy już tak daleko w pozbywaniu się wyrażeń sterujących, usuńmy równieżwyrażenie warunkowe. Jest to jak najbardziej możliwe!

Ćwiczenie 3.11.

Zmodyfikuj pętle typu for w taki sposób, aby wyrażenie początkowe znalazło się przed pętlą,

natomiast wyrażenie modyfikujące i warunkowe wewnątrz pętli.

�����������

���������������"�����������#����$����������%&������������������������'�7 �������������� � ������������������,�����-.����0,N�0� ���������������������<<�H'�7++��"�� ��������������

Jak można zauważyć, taka pętla też jest możliwa. Przypominam raz jeszcze, że średniki(tym razem już dwa) w nawisach po � � są niezbędne! Warto też zwrócić uwagę na zmianękierunku nierówności. Wcześniej sprawdzaliśmy, czy � jest mniejsze bądź równe 100, a teraz,czy jest większe bądź równe. Dzieje się tak dlatego, że we wcześniejszych ćwiczeniachsprawdzaliśmy, czy pętla ma się dalej wykonywać, natomiast w obecnym, czy ma się za-kończyć.

W zasadzie, zamiast nierówności moglibyśmy napisać również �����99�**��''�������-.Przy okazji nauczyliśmy się, w jaki sposób wykorzystuje się instrukcję ����� w przypadkupętli. Służy ona oczywiście do natychmiastowego przerwania wykonywania pętli.

Kolejna przydatna instrukcja, � �����, powoduje rozpoczęcie kolejnej iteracji — w miejscujej wystąpienia wykonywanie bieżącej iteracji jest przerywane i rozpoczyna się kolejnyobieg. Najlepiej zobaczyć to na konkretnym przykładzie.

Ćwiczenie 3.12.

Napisz program wyświetlający na ekranie liczby od 1 do 20, które nie są podzielneprzez 2. Skorzystaj z pętli for i instrukcji continue.

Page 16: C#. Ćwiczenia

Rozdział 3. � Instrukcje 47

�����������

���������������"�����������#����$����������%&�����������������������������'�7 ���*'�C+ ��<<������������������������O�C�''�+������������������������������� ����������������,�����-.���/����� ��������������

Wynik działania takiej aplikacji widoczny jest na rysunku 3.6. Przypominam, że % tooperator dzielenia modulo — dostarcza on resztę z dzielenia. W każdym zatem przebiegusprawdzamy, czy � modulo � nie jest przypadkiem równe '. Jeśli jest (zatem � jest podzielneprzez �), przerywamy bieżącą iterację instrukcją � �����. W przeciwnym przypadku(� modulo � jest różne od zera) wykonujemy instrukcję 2 �� ���4���5������. Ostatecz-nie na ekranie otrzymamy wszystkie liczby od jeden do dwadzieścia, które nie są podziel-ne przez dwa.

Rysunek 3.6.Program wyświetlającyliczby od 1 do 20niepodzielne przez 2

Ten sam program można by oczywiście napisać bez użycia instrukcji � �����. Jak tegodokonać, pokaże nam kolejne ćwiczenie.

Ćwiczenie 3.13.

Zmodyfikuj kod z ćwiczenia 3.12 tak, aby nie było konieczności użycia instrukcji continue.

�����������

���������������"�����������#����$����������%&�����������������������������'�7 ���*'�C+ ��<<������������������������O�C�>'�+�������������������������,�����-.���/����� �������������������������������

Page 17: C#. Ćwiczenia

48 Część I � Język programowania

Pętla while

O ile pętla typu � � służyła raczej do wykonywania z góry znanej ilości operacji, w przy-padku pętli ���� zwykle nie jest ona znana. Nie jest to oczywiście obligatoryjne. Tak na-prawdę pętlę ���� można napisać tak, by była dokładnym funkcjonalnym odpowiednikiempętli � �, a pętle � � tak, by była odpowiednikiem pętli ����. Ogólna konstrukcja pętlitypu ���� jest następująca:

�2���������������� ������������ �� �

Instrukcje są wykonywane tak długo, dopóki wyrażenie warunkowe jest prawdziwe. Ozna-cza to, że gdzieś w pętli musi nastąpić modyfikacja warunku, bądź też instrukcja �����.Inaczej pętla będzie się wykonywała w nieskończoność!

Ćwiczenie 3.14.

Używając pętli typu while, napisz program wyświetlający na ekranie 100 razy napis C#.

�����������

���������������"�����������#����$����������%&������������������������'�7 ����������2������*'�7++������������������,�����-.����0,N�0� �����������������<< ����������

����

Ćwiczenie 3.15.

Zmodyfikuj kod z ćwiczenia 3.14 tak, aby wyrażenie warunkowe zmieniało jednocześnie

wartość zmiennej i.

�����������

���������������"�����������#����$����������%&������������������������'�7 ����������2�����<<�*'�7++������������������,�����-.����0,N�0� ����������

����

Page 18: C#. Ćwiczenia

Rozdział 3. � Instrukcje 49

Ćwiczenie 3.16.

Korzystając z pętli while, napisz program wyświetlający na ekranie liczby od 1 do 20

niepodzielne przez 2.

�����������

���������������"�����������#����$����������%&������������������������'�7 ����������2������*'�C+������������������������O�C�>'�+�������������������������,�����-.���/����� ����������������������������������<< ��������������

Zauważmy, że w tym przypadku nie możemy skorzystać z konstrukcji takiej jak w poprzed-nim ćwiczeniu. Tym razem zmienna iteracyjna � musi być modyfikowana we wnętrzu pętli.Dzieje się tak dlatego, że wewnątrz korzystamy z jej wartości. Gdybyśmy zatem napisalipętlę tę w postaci �������99�:*��'�, otrzymalibyśmy na ekranie liczby od 2 do 21 nie-podzielne przez 2, co byłoby niezgodne z założeniami programu.

Pętla do whileOprócz przedstawionych dotychczas istnieje jeszcze jedna odmiana pętli. Mianowicie� �����. Jej konstrukcja jest następująca:

����������� �� ��2�������� �

Zapis ten należy rozumieć jako: wykonuj ���������, dopóki ������� jest prawdziwy.Spróbujmy zatem wykonać zadanie przedstawione ćwiczeniu 3.14, ale korzystając z pętlitypu � �����.

Ćwiczenie 3.17.

Korzystając z pętli do…while, napisz program wyświetlający na ekranie 100 razy napis C#.

�����������

���������������"�����������#����$����������%&������������������������'�7 ����������������������������,�����-.����0,N�0�

Page 19: C#. Ćwiczenia

50 Część I � Język programowania

��������������������2�����<<�>'�7+� ����

Wydawać by się mogło, że to przecież to samo, co zwykła pętla ����. Wydaje się wręcz,że to po prostu odwrócona pętla ����. Jest jednak pewna różnica powodująca, że ����i � ����� nie są dokładnymi odpowiednikami. Otóż w przypadku pętli � ������ in-strukcje wykonane będą co najmniej jeden raz, nawet jeśli warunek jest na pewno fałszy-wy. Dzieje się tak oczywiście dlatego, że sprawdzenie warunku zakończenia pętli od-bywa się dopiero po jej pierwszym przebiegu.

Ćwiczenie 3.18.

Zmodyfikuj kod z ćwiczenia 3.17 w taki sposób, aby wyrażenie warunkowe na pewno

było fałszywe. Zaobserwuj wyniki działania programu.

�����������

���������������"�����������#����$����������%&������������������������'�7+7 ����������������������������,�����-.����0,N�0� ��������������������2�����<<�*'�7++� ����

Tym razem, mimo że warunek był fałszywy (początkowa wartość zmiennej � to 101,które na pewno jest większe niż użyte w wyrażeniu warunkowym 100), na ekranie pojawisię jeden napis 23. Jeszcze dobitniej fakt wykonania jednego przebiegu pętli niezależnie odprawdziwości warunku można pokazać, stosując konstrukcję:

�����������,�����-.����0,N�0� ��2���������

W tym przypadku już na pierwszy rzut oka widać, że warunek jest fałszywy. Prawda?

Wprowadzanie danychWiemy, jak wyprowadzać dane na konsolę, czyli po prostu jak wyświetlać je na ekranie.Bardzo przydałaby się jednak możliwość ich wprowadzania do programu. Nie jest to bardzoskomplikowane zadanie, choć napotkamy pewne trudności związane z koniecznością do-konywania konwersji typów danych.

Page 20: C#. Ćwiczenia

Rozdział 3. � Instrukcje 51

Argumenty wiersza poleceń

Przekazywanie danych do aplikacji jako argumentów w wierszu poleceń przy wywoływaniuprogramu jest dobrze znanym większości programistów sposobem. Taka możliwość wy-stępuje prawdopodobnie w większości popularnych języków programowania. Nie inaczejjest w C#, gdzie, aby z tych danych skorzystać, należy odpowiednio zadeklarować funkcję����. Konkretnie deklaracja powinna wyglądać następująco:

��"�����������#���������������%&���������BB������ ���

Jak widać, argumenty są przekazywane do aplikacji w postaci tablicy obiektów �����.Ponieważ w C#, podobnie jak w Javie, tablice są obiektami, nie ma potrzeby dodatkowegoprzekazywania parametru określającego liczbę argumentów, jak ma to miejsce w C i C++.Jej rozmiar określany jest parametrem 5��� (bliższe informacje o tablicach znajdują sięw rozdziale piątym).

Ćwiczenie 3.19.

Wyświetl na ekranie wszystkie argumenty podane przez użytkownika w wierszu poleceń.

�����������

��"������������������"�����������#����$����������%&������������������,�����-.���/���0/���"��������������2��������9�:��+�0������-/���2� �������������������'�+ ���*�����-/���2 ��<<������������������,�����-.���/���0�������%�+�&:��7�0���������%�&� ��������������

Dane są wyprowadzane na ekran przy użyciu typowej pętli � �. Przykładowy efekt dzia-łania programu widoczny jest na rysunku 3.7.

Rysunek 3.7.Program wyświetlającyargumenty podanew wierszu poleceń

Page 21: C#. Ćwiczenia

52 Część I � Język programowania

Przy pracy z argumentami przekazywanymi z wiersza poleceń napotkamy na pewien pro-blem. Załóżmy bowiem, że chcielibyśmy napisać program, który dodaje do siebie dwieliczby całkowite i wyświetla wynik tego działania na ekranie. Wydawać by się mogło, żenajprostsze rozwiązanie wygląda tak jak na poniższym listingu:

�����������

��"������������������"�����������#����$����������%&�������������������������-/���2�*�C������������������,�����-.���/���0J��������L���������������������������P>0� ��������������������� �������������������,�����-.���/���0.��� ����������������:��+�0������%+&�<�����%7&� ����

Oczywiście nie jest ono prawidłowe, gdyż dokonujemy tutaj operacji na dwóch ciągachznaków, a nie dwóch liczbach! Zatem wynikiem dodawania, na przykład, 12 i 8 będziew powyższym programie 128, zamiast spodziewanego 20. Aby aplikacja działała popraw-nie, należy najpierw dokonać konwersji argumentów z typu ����� do typu ��, a dopieropotem wykonywać działanie. Konwersji takiej dokonamy przy wykorzystaniu statycznejmetody "���� w postaci:

�����������'����FC-5����0����"�0�

Ćwiczenie 3.20.

Napisz program dokonujący dodawania dwóch liczb podanych jako parametry w wierszu

poleceń.

�����������

��"������������������"�����������#����$����������%&�������������������������" ����������������-/���2�*�C������������������,�����-.���/���0J��������L���������������������������P>0� ��������������������� �����������������������������������������'����FC-5��������%+&� ����������������"�'����FC-5��������%7&� �����������������������2�QE������������������������,�����-.���/���0R������������9����������������A�����"A>0� ��������������������� �������������������,�����-.���/���0.��� ����������������:��+�0����<�"� ����

Page 22: C#. Ćwiczenia

Rozdział 3. � Instrukcje 53

Konwersji z typu ����� do typu �� dokonuje wspomniana już instrukcja ;����"����.Dodatkowo sprawdzamy również, czy konwersja ta zakończyła się sukcesem poprzezzastosowanie bloku �!����. Dokładniejsze wytłumaczenie tej konstrukcji znajdujesię w rozdziale szóstym, w którym opisane jest stosowanie wyjątków.

Przypomnijmy sobie teraz aplikację napisaną w ćwiczeniach 3.2 i 3.3. Obliczała ona pier-wiastki równania kwadratowego, jednak argumenty tego równania były podawane bezpo-średnio w kodzie. Za każdym razem, kiedy następowała konieczność ich zmiany, musieliśmyponownie kompilować program. Na pewno nie było to zbyt wygodne. Teraz, kiedy wiemyjuż, w jaki sposób stosować argumenty, podając je w wierszu poleceń, i wiemy, w jaki sposóbdokonać konwersji danych, możemy pokusić się o spore usprawnienie tamtych aplikacji.

Ćwiczenie 3.21.

Napisz program obliczający pierwiastki równania kwadratowego, w którym parametry

równania są wprowadzane w wierszu poleceń (rysunek 3.8).

�����������

������5������� �����"�����������#����$����������%&�����������������������������6���������8���������,

����������������-/���2�*�F������������������,�����-.���/���0.����������������:����������������7������������������������C��������F0� ��������������������� ����������

������������������������������������6�'����FC-5��������%+&� �����������������������8�'����FC-5��������%7&� �����������������������,�'����FC-5��������%C&� �����������������������2�QE������������������������,�����-.���/���0R������������9���9���������������������A���������������������"A���� ����A>0� ��������������������� ����������

���������,�����-.���/���0.��������������������9������:;�0� ���������,�����-.���/���06:�0�<��������6�<�0�8:�0�<��������8�<�0�,:�0����������<��������,�<�0;�0�

��������������������6�''�+������������������,�����-.���/���0=����������9������ ��������:�6�'�+>0� �����������������������������������������"�������'��������8�?��������8�(�4�?��������6�?��������, �������������������"������

�������������������������*�+�������������������������,�����-.���/���0@����*�+-0�

Page 23: C#. Ćwiczenia

54 Część I � Język programowania

�����������������������,�����-.���/���0=���9�����������������A���������"��������������������������������"������������20� ���������������������������������������������''�+����������������������������� �'�(��������8�B�C�?��������6 �����������������������,�����-.���/���0D����A����:�E�'�0�<����� � ��������������������������������������������������������������� �'��(��������8�<�$��2-�3����������B�C�?��������6 �����������������������,�����-.����0D����A����:�E7�'�0�<����� � ��������������������������� �'��(��������8�(�$��2-�3����������B�C�?��������6 �����������������������,�����-.���/���0��EC�'�0�<����� � �������������������������������

Rysunek 3.8.Równaniakwadratoweo parametrachpodanychw wierszu poleceń

Instrukcja ReadLine

Wprowadzanie danych do programu w wierszu poleceń nie zawsze jest wygodne. Częstochcielibyśmy wykonywać tę czynność już w trakcie działania programu. Pomoże namw tym instrukcja 2 �� ���.���5�����, która zwraca wprowadzoną przez użytkownikajedną linię tekstu (ciąg znaków zakończony znakiem końca linii).

Ćwiczenie 3.22.

Napisz program, który w pętli wczytuje kolejne wiersze tekstu wprowadzane przez użyt-

kownika i wyświetla je na ekranie. Program powinien zakończyć działanie po odczytaniu

ciągu znaków quit.

�����������

������5������� �����"�����������#����$������������������������� ����������2���>���'�,�����-D��/�����-Q3�����03���0�������������������,�����-.���/����� ��������������

Page 24: C#. Ćwiczenia

Rozdział 3. � Instrukcje 55

Warunek w pętli ���� zapisaliśmy w bardzo skondensowanej formie. Kolejność wyko-nywania instrukcji jest tu następująca:

1. Odczytanie linii znaków z konsoli (2 �� ���.���5�����).

2. Przypisanie odczytanej wartości do zmiennej s (�*).

3. Wywołanie metody < ���� na rzecz obiektu wskazywanego przez s (< �����6 ��6�).

Należy w tym miejscu zwrócić również uwagę, że taki zapis może w pewnych sytuacjachspowodować błąd w działaniu aplikacji, konkretnie wygenerowanie wyjątku +���.���������<,��&� �. Dlaczego? Otóż może się zdarzyć, że metoda .���5����� zamiast ciąguznaków zwróci wartość ����. W takim wypadku wartością przypisaną do zmiennej � rów-nież będzie ����. Skoro tak, nie będzie możliwe wykonanie metody < ����, stąd też wy-generowanie wyjątku.

Zapobiec takiej sytuacji można na dwa sposoby. Albo rozbijając warunek pętli ���� naklika oddzielnych instrukcji i sprawdzając, czy � nie jest równe ����, albo przez odwró-cenie kolejności wykonywania instrukcji, czyli zamiast pisać

���'�,�����-D��/�����-Q3�����03���0�

można zastosować konstrukcję

03���0-Q3�������'�,�����-D��/�����

Ćwiczenie 3.23.

Popraw kod z ćwiczenia 3.22, usuwając warunek z pętli while, i przenieś go do wnętrza

pętli.

�����������

������5������� �����"�����������#����$��������������������������'�00 ����������2��������������������������'�,�����-D��/���� ���������������������>'������GG�>�-Q3�����03���0��������������������������,�����-.���/����� �����������������������������������������������������������"�� �������������������������������

Skoro potrafimy już wykorzystywać instrukcję .���5�����, możemy poprawić programdo obliczania pierwiastków równania kwadratowego tak, aby parametry były wprowa-dzane w trakcie działania programu. Będzie on teraz prosił użytkownika o podanie ko-lejnych liczb i podstawiał je pod zmienne &���/��=, &���/��> i &���/��2.

Page 25: C#. Ćwiczenia

56 Część I � Język programowania

Oczywiście przed przypisaniem danych do wspomnianych zmiennych musimy dokonaćkonwersji z typu ����� na typ ��. Co jednak powinniśmy zrobić w sytuacji, kiedyużytkownik nie poda prawidłowej liczby, ale, na przykład, wpisze dowolną kombinacjęznaków? Najlepiej byłoby poprosić o ponowne wprowadzenie parametru. Jak tego dokonać?Najwygodniej będzie skorzystać z pętli ���� lub � ����� i prosić użytkownika o wpro-wadzanie liczby tak długo, dopóki nie poda poprawnej.

Skoro jednak mamy trzy zmienne, a tym samym trzy parametry do wprowadzenia, nie masensu pisać trzech pętli wyglądających praktycznie tak samo. Lepiej utworzyć dodatkowąfunkcję, której zadaniem będzie właśnie dostarczenie prawidłowej liczby całkowitej wpro-wadzonej przez użytkownika.

Ćwiczenie 3.24.

Napisz program obliczający pierwiastki równania kwadratowego, w którym parametry

są wprowadzane w trakcie działania programu.

�����������

������5������� �����"�����������������"���/���"����������������������������������"��'�+ ���������"������ �� ����������������������������,�����-.���/���05����I�����L��+�����������9������:0�������� �����������������������������������������������"��'����FC-5����,�����-D��/����� ������������������������� ���'���� �������������������������������������2�QE�������������������������������,�����-.���/���05������������������������������A����������������������������"A���� ����A>0� ������������������������� ���'����� �������������������������������������2���>�� ��� �������������������"� �������"�����������#����$����������%&�����������������������������6���������8���������,

����������������6�'���"���/���"�0�������0� ����������������8�'���"���/���"�0�����0� ����������������,�'���"���/���"�0�����0�

���������,�����-.���/���0.��������������������9������:;�0� ���������,�����-.���/���06:�0�<��������6�<�0�8:�0�<��������8�<�0�,:����������0�<��������,�<�0;�0�

��������������������6�''�+������������������,�����-.���/���0=����������9������ ��������:�6�'�+>0� ����������

Page 26: C#. Ćwiczenia

Rozdział 3. � Instrukcje 57

�������������������������������"�������'��������8�?��������8�(�4�?��������6�?��������, �������������������"������

�������������������������*�+�������������������������,�����-.���/���0@����*�+-0� �����������������������,�����-.���/���0=���9�����������������A��������������������������������"���������"������������20� ���������������������������������������������''�+����������������������������� �'�(��������8�B�C�?��������6 �����������������������,�����-.���/���0D����A����:�E�'�0�<����� � ��������������������������������������������������������������� �'��(��������8�<�$��2-�3����������B�C�?��������6 �����������������������,�����-.����0D����A����:�E7�'�0�<����� � ��������������������������� �'��(��������8�(�$��2-�3����������B�C�?��������6 �����������������������,�����-.���/���0��EC�'�0�<����� � �������������������������������

Na tym w zasadzie moglibyśmy zakończyć ćwiczenia z wprowadzania danych i rozwią-zywania równań kwadratowych, ale spróbujmy wykonać jeszcze jeden przykład. Zauważmybowiem, że wygodnie byłoby, aby nasz program umożliwiał zarówno podawanie para-metrów w wierszu poleceń, jak i w trakcie swojego działania. Dzięki temu użytkownikmógłby wybrać bardziej wygodny dla niego sposób. Co więcej, jeśli przy podawaniu da-nych w wierszu poleceń pomyli się, aplikacja pozwoli na ponowne ich wprowadzenie.

Musimy zatem połączyć kod z ćwiczenia 3.21 z kodem z ćwiczenia 3.24. Dodatkowo po-winniśmy wprowadzić jeszcze jedno usprawnienie. Do tej pory zakładaliśmy bowiem, żeparametry równania muszą być liczbami rzeczywistymi. Nie ma jednak żadnego powodu,aby dalej utrzymywać takie ograniczenie. Pozwólmy, aby nasza aplikacja potrafiła równieżrozwiązywać równania, w których parametrami są liczby rzeczywiste.

Dodatkowymi zmianami będzie więc zmiana typu zmiennych &���/��=, &���/��>i &���/��2 z �� na � ���� oraz skorzystanie z metody "���� klasy ? ����.

Ćwiczenie 3.25.

Napisz program rozwiązujący równanie kwadratowe o zadanych parametrach, będących

dowolnymi liczbami rzeczywistymi. Parametry mogą być wprowadzane zarówno w trakcie

działania programu, jak i w wierszu poleceń.

�����������

������5������� �����"��������������"����"���/���"�����������������������������"������"��'�+ ���������"������ �� ������������

Page 27: C#. Ćwiczenia

58 Część I � Język programowania

����������������,�����-.���/���05����I�����L��+�����������9������:0�������� �����������������������������������������������"��'�@��"�-5����,�����-D��/����� ������������������������� ���'���� �������������������������������������2�QE�������������������������������,�����-.���/���05������������������������������A�����"A>0� ������������������������� ���'����� �������������������������������������2���>�� ��� �������������������"� �������"�����������#����$����������%&������������������"���������S�����'���� ������������"���������6�'�+���������8�'�+���������,�'�+

����������������-/���2�*�F�����������������������S�����'����� ���������������������������S��������������������������������������������������������6�'�@��"�-5��������%+&� ������������������������������8�'�@��"�-5��������%7&� ������������������������������,�'�@��"�-5��������%C&� �������������������������������������2�QE�������������������������������,�����-.���/���0R�����������������2��������9���������������������������������������A�����"A>0� ����������������������������S�����'����� ��������������������������

������������>�����S�����������������������������6�'���"���/���"�0�������0� �����������������������8�'���"���/���"�0�����0� �����������������������,�'���"���/���"�0�����0� ����������

���������,�����-.���/���0.��������������������9������:;�0� ���������,�����-.���/���06:�0�<��������6�<�0�8:�0�<��������8�<����������0�,:�0�<��������,�<�0;�0�

��������������������6�''�+������������������,�����-.���/���0=����������9������ ��������:�6�'�+>0� �����������������������������������������"�������'��������8�?��������8�(�4�?��������6�?��������, �������������������"������

�������������������������*�+�������������������������,�����-.���/���0@����*�+-0� �����������������������,�����-.���/���0=���9�����������������A��������������������������������"���������"������������20� ���������������������������������������������''�+����������������������������� �'�(��������8�B�C�?��������6 �����������������������,�����-.���/���0D����A����:�E�'�0�<����� �

Page 28: C#. Ćwiczenia

Rozdział 3. � Instrukcje 59

��������������������������������������������������������������� �'��(��������8�<�$��2-�3����������B�C�?��������6 �����������������������,�����-.����0D����A����:�E7�'�0�<����� � ��������������������������� �'��(��������8�(�$��2-�3����������B�C�?��������6 �����������������������,�����-.���/���0��EC�'�0�<����� � �������������������������������

Nasz program potrafi już skorzystać z liczb rzeczywistych (rysunek 3.9). Jeżeli w wierszupoleceń podane zostały trzy parametry i każdy z nich jest prawidłową liczba całkowitą,zostaną one użyte do rozwiązania równania. Jeśli jednak parametrów jest mniej lub przywprowadzaniu któregokolwiek z nich został popełniony błąd, aplikacja poprosi o ponowneich wprowadzenie.

Rysunek 3.9.Parametryrównania mogą byćpodawane w postaciliczb rzeczywistych

Należy zwrócić uwagę, że sposób wprowadzania liczb z przecinkiem zależy od ustawieńregionalnych systemu! Konkretnie od tego, jaki symbol został ustalony jako separator dzie-siętny. W przypadku ustawień polskich domyślnie jest to przecinek, przy ustawieniach an-gielskich — kropka.