Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00277 004686 14684545 na godz. na dobę w sumie
C#. Ćwiczenia. Wydanie III - książka
C#. Ćwiczenia. Wydanie III - książka
Autor: Liczba stron: 248
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-3869-7 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie >> c# - programowanie
Porównaj ceny (książka, ebook (-30%), audiobook).

Czas na praktyczną naukę C#!

Na początku był język C. Potem przyszedł czas na zorientowane obiektowo C++. Przełomem była Java, lecz dopiero twórcy języka C# odnieśli prawdziwy sukces. Udało im się to dzięki połączeniu najlepszych cech wszystkich poprzedników, prostej, zwartej i doskonale znanej wielu programistom składni oraz możliwościom oferowanym przez platformę .NET. Dodatkowymi atutami były niespotykane wcześniej bezpieczeństwo i wydajność środowiska uruchomieniowego.

Znajomość C# pozwala dziś o wiele łatwiej tworzyć bardzo zaawansowane aplikacje przy stosunkowo niewielkim nakładzie pracy, a nauka języka wcale nie musi być drogą przez mękę. Można się o tym przekonać dzięki książce 'C#. Ćwiczenia. Wydanie III' . Wykonując zawarte w niej zadania, poznasz nie tylko konstrukcje języka, lecz również sposoby zastosowania ich w praktyce oraz metody wykorzystania środowiska C# do tworzenia wydajnych aplikacji Windows.

Poznaj najlepszy język do tworzenia aplikacji Windows!

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Redaktor prowadzący: Ewelina Burska Projekt okładki: Maciej Pasek Materiały graficzne na okładce zostały wykorzystane za zgodą Shutterstock. Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie?cwcsh3 Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Listingi do książki można znaleźć pod adresem: ftp://ftp.helion.pl/przyklady/cwcsh3.zip ISBN: 978-83-246-3869-7 Copyright © Helion 2012 Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis treĂci WstÚp JÚzyk programowania CzÚĂÊ I Rozdziaï 1. Pierwsza aplikacja JÚzyk C# Jak wïaĂciwie nazywa siÚ ten jÚzyk? ¥rodowisko uruchomieniowe NarzÚdzia Najprostszy program Kompilacja i uruchamianie Visual C# Express Dyrektywa using Rozdziaï 2. Zmienne i typy danych Typy danych Typy arytmetyczne Typ bool (Boolean) Deklarowanie zmiennych Nazewnictwo zmiennych Typy odnoĂnikowe Typ string Typ object WartoĂÊ null Operatory Operatory arytmetyczne Operatory bitowe 7 9 11 11 12 12 14 14 15 19 23 25 25 25 27 28 32 33 34 34 35 35 36 43 4 C# • mwiczenia Operatory logiczne Operatory przypisania Operatory porównania (relacyjne) Operator warunkowy (?) Pozostaïe operatory Priorytety operatorów Rozdziaï 3. Komentarze Instrukcje Instrukcje warunkowe Instrukcja if...else Instrukcja if...else if Instrukcja switch PÚtle PÚtla for PÚtla while PÚtla do…while PÚtla foreach Instrukcja goto Wprowadzanie danych Argumenty wiersza poleceñ Instrukcja ReadLine Programowanie obiektowe CzÚĂÊ II Rozdziaï 4. Klasy i obiekty Klasy Metody Konstruktory Specyfikatory dostÚpu Dziedziczenie Rozdziaï 5. Tablice Deklarowanie tablic Inicjalizacja tablic Rozmiar tablicy PÚtla foreach Tablice wielowymiarowe 45 45 46 47 48 48 49 51 51 51 55 57 59 59 66 68 70 70 73 74 80 89 91 91 94 103 107 114 119 120 122 124 127 130 Spis treĂci Rozdziaï 6. WyjÈtki i obsïuga bïÚdów Rozdziaï 7. Obsïuga bïÚdów Blok try...catch Hierarchia wyjÈtków Wïasne wyjÈtki Interfejsy Prosty interfejs Interfejsy w klasach potomnych Czy to interfejs? Rzutowanie Sïowo kluczowe as Sïowo kluczowe is Programowanie w Windows CzÚĂÊ III Rozdziaï 8. Pierwsze okno Utworzenie okna WyĂwietlanie komunikatu Zdarzenie ApplicationExit Rozdziaï 9. Delegacje i zdarzenia Delegacje Zdarzenia Rozdziaï 10. Komponenty Etykiety (Label) Przyciski (Button) Pola tekstowe (TextBox) Pola wyboru (CheckBox, RadioButton) Listy rozwijane (ComboBox) Listy zwykïe (ListBox) Menu Menu gïówne Menu kontekstowe WïaĂciwoĂci Menu Skróty klawiaturowe 5 137 137 143 148 151 155 155 159 167 172 174 175 177 179 179 184 185 187 187 192 197 197 203 206 211 217 220 224 224 232 235 240 6 C# • mwiczenia 5 Tablice Tablice to jedne z podstawowych struktur danych; znane sÈ zapewne nawet poczÈtkujÈcym programistom. Warto jednak w kilku sïowach przypomnieÊ podstawowe wiadomoĂci i pojÚcia z nimi zwiÈzane. Tablica to stosunkowo prosta struktura danych pozwalajÈca na prze- chowanie uporzÈdkowanego zbioru elementów danego typu — moĝna jÈ sobie wyobraziÊ tak, jak zaprezentowano na rysunku 5.1. Skïada siÚ z ponumerowanych kolejno komórek, a kaĝda taka komórka moĝe przechowywaÊ pewnÈ porcjÚ danych. Rysunek 5.1. Schemat struktury tablicy Jakiego rodzaju bÚdÈ to dane, okreĂla typ tablicy. JeĂli zatem zadeklaru- jemy tablicÚ typu caïkowitoliczbowego (int), bÚdzie mogïa zawieraÊ liczby caïkowite, a jeĂli bÚdzie to typ znakowy (char), poszczególne komórki bÚdÈ mogïy zawieraÊ róĝne znaki. Naleĝy zwróciÊ uwagÚ, ĝe w C# (podobnie jak w wiÚkszoĂci wspóïczesnych popularnych jÚzyków programowania) numerowanie komórek zaczyna siÚ od 0, czyli pierw- sza komórka ma indeks 0, druga — indeks 1 itd. 120 C# • mwiczenia Deklarowanie tablic Przed skorzystaniem z tablicy naleĝy zadeklarowaÊ zmiennÈ tablicowÈ. Poniewaĝ w C# tablice sÈ obiektami, naleĝy równieĝ utworzyÊ od- powiedni obiekt. Schematycznie robi siÚ to w sposób nastÚpujÈcy: typ_tablicy[] nazwa_tablicy = new typ_tablicy[liczba_elementów]; OczywiĂcie, deklaracjÚ zmiennej tablicowej oraz przypisanie jej nowo utworzonego elementu moĝna wykonaÊ w osobnych instrukcjach, np. w ten sposób: typ_tablicy[] nazwa_tablicy; nazwa_tablicy = new typ_tablicy[liczba_elementów]; PiszÈc zatem: int tablica[]; zadeklarujemy odniesienie do tablicy, która bÚdzie mogïa zawieraÊ elementy typu int, czyli 32-bitowe liczby caïkowite. Samej tablicy jednak jeszcze nie bÚdzie (odmiennie niĝ w przypadku prostych typów wartoĂciowych, takich jak int, byte czy char) i konieczne jest jej utwo- rzenie. m W I C Z E N I E 5.1 Utworzenie tablicy Zadeklaruj i zainicjalizuj tablicÚ elementów typu caïkowitego. Przypisz pierwszemu elementowi tablicy dowolnÈ wartoĂÊ. WyĂwietl zawartoĂÊ tego elementu na ekranie. using System; public class Program { public static void Main() { int[] tablica = new int[5]; tablica[0] = 10; Console.WriteLine( Pierwszy element tablicy: + tablica[0]); } } Rozdziaï 5. • Tablice 121 Wyraĝenie new tablica[5] oznacza utworzenie nowej, jednowymiarowej, 5-elementowej tablicy liczb typu int. Ta nowa tablica zostaïa przypisa- na zmiennej odnoĂnikowej o nazwie tablica. Od miejsca tego przypi- sania moĝna odwoïywaÊ siÚ do kolejnych elementów tej tablicy, piszÈc: tablica[index] W tym przypadku pierwszemu elementowi (o indeksie 0) zostaïa przy- pisana wartoĂÊ 10. O tym, ĝe takie przypisanie faktycznie miaïo miej- sce, przekonaliĂmy siÚ, wyĂwietlajÈc wartoĂÊ tej komórki na ekranie. Warto w tym miejscu przypomnieÊ, ĝe elementy tablicy numero- wane sÈ od 0, a nie od 1. Oznacza to, ĝe pierwszy element tablicy 10-elementowej ma indeks 0, a ostatni 9 (nie 10!). Co siÚ stanie, jeĂli nieprzyzwyczajeni do takiego sposobu indeksowania odwoïamy siÚ do indeksu o numerze 10? m W I C Z E N I E 5.2 Odwoïanie do nieistniejÈcego elementu tablicy Zadeklaruj i zainicjalizuj tablicÚ 10-elementowÈ. Spróbuj przypisaÊ elementowi o indeksie 10 dowolnÈ liczbÚ caïkowitÈ. using System; public class Program { public static void Main() { int[] tablica = new int[10]; tablica[10] = 1; Console.WriteLine( Element o indeksie 10 to: + tablica[10]); } } Powyĝszy kod da siÚ bez problemu skompilowaÊ, jednak przy próbie uruchomienia takiego programu na ekranie zobaczymy okno z in- formacjÈ o wystÈpieniu bïÚdu. Moĝe ono mieÊ róĝnÈ postaÊ, w za- leĝnoĂci od tego, w jakiej wersji systemu zostaïa uruchomiona apli- kacja. Na rysunku 5.2 jest widoczne okno z systemu Windows 7. Równieĝ na konsoli (w Windows XP dopiero po zamkniÚciu okna dialogowego) ujrzymy komunikat podajÈcy konkretne informacje o ty- pie bïÚdu oraz miejscu programu, w którym wystÈpiï (rysunek 5.3). 122 C# • mwiczenia Rysunek 5.2. Próba odwoïania siÚ do nieistniejÈcego elementu tablicy powoduje bïÈd aplikacji Rysunek 5.3. Systemowa informacja o bïÚdzie Wbrew pozorom, nie staïo siÚ nic strasznego. Program, co prawda, nie dziaïa, ale bïÈd zostaï wychwycony przez Ărodowisko uruchomie- niowe. Konkretnie mówiÈc, zostaï wygenerowany tzw. wyjÈtek i aplika- cja zakoñczyïa dziaïanie. Taki wyjÈtek moĝna jednak przechwyciÊ i tym samym zapobiec niekontrolowanemu zakoñczeniu wykonywania kodu. To jednak odrÚbny temat, który zostanie przedstawiony w rozdziale 6. Waĝne jest to, ĝe próba odwoïania siÚ do nieistniejÈcego elementu zo- staïa wykryta i to odwoïanie nie wystÈpiïo! Program nie naruszyï wiÚc obszaru pamiÚci niezarezerwowanej dla niego. Inicjalizacja tablic TablicÚ moĝna zainicjalizowaÊ juĝ w momencie jej tworzenia. Dane, które majÈ siÚ znaleěÊ w poszczególnych komórkach, podaje siÚ w na- wiasach klamrowych po deklaracji tablicy. Schematycznie wyglÈda to nastÚpujÈco: typ[] nazwa = new typ [liczba_elementów]{dana1, dana2,...,danaN} Rozdziaï 5. • Tablice 123 JeĂli zatem chcielibyĂmy utworzyÊ 5-elementowÈ tablicÚ liczb caïkowi- tych i od razu zainicjalizowaÊ jÈ liczbami od 1 do 5, moĝemy zrobiÊ to w taki sposób: int[] tablica = new int[5] {1, 2, 3, 4, 5}; m W I C Z E N I E 5.3 Inicjalizacja tablicy Zadeklaruj tablicÚ 5-elementowÈ typu int i zainicjalizuj jÈ liczbami od 1 do 5. ZawartoĂÊ tablicy wyĂwietl na ekranie. using System; public class Program { public static void Main() { int[] tablica = new int[5]{1, 2, 3, 4, 5}; for(int i = 0; i 5; i++) { Console.WriteLine( tablica[{0}] = {1} , i, tablica[i]); } } } Wynik dziaïania kodu z powyĝszego Êwiczenia widoczny jest na ry- sunku 5.4. Nie jest niespodziankÈ, ĝe wyĂwietlone zostaïy liczby od 1 do 5, natomiast indeksy kolejnych komórek zmieniajÈ siÚ od 0 do 4. Powstaïa tu bowiem 5-elementowa tablica liczb typu int. Skoro ma 5 elementów, to pierwszy z nich ma indeks 0, a ostatni — 4. Dlatego zmienna sterujÈca pÚtli for, która odczytuje dane z tablicy, ma poczÈt- kowÈ wartoĂÊ 0, a warunek zakoñczenia pÚtli to i 5. Tym samym i zmienia siÚ teĝ od 0 do 4. Rysunek 5.4. ZawartoĂÊ kolejnych komórek tablicy utworzonej w Êwiczeniu 5.3 124 C# • mwiczenia Kiedy inicjalizowana jest tablica o z góry znanej liczbie elementów, dopuszcza siÚ pominiÚcie fragmentu kodu zwiÈzanego z tworzeniem obiektu. Kompilator sam wykona odpowiednie uzupeïnienia. Zamiast pisaÊ: typ[] nazwa = new typ [liczba_elementów]{dana1, dana2,...,danaN} moĝna zatem równie dobrze uĝyÊ konstrukcji: typ[] nazwa = {dana1, dana2,...,danaN} Oba sposoby sÈ równowaĝne i naleĝy uĝywaÊ tego, który jest wygod- niejszy. m W I C Z E N I E 5.4 BezpoĂrednia inicjalizacja tablicy Zadeklaruj tablicÚ 5-elementowÈ typu int i zainicjalizuj jÈ liczbami od 1 do 5. Uĝyj drugiego z poznanych sposobów inicjalizacji. ZawartoĂÊ tablicy wyĂwietl na ekranie. using System; public class Program { public static void Main() { int[] tablica = {1, 2, 3, 4, 5}; for(int i = 0; i 5; i++) { Console.WriteLine( tablica[{0}] = {1} , i, tablica[i]); } } } Rozmiar tablicy Kaĝda tablica posiada wïaĂciwoĂÊ Length, która okreĂla bieĝÈcÈ liczbÚ komórek. Aby uzyskaÊ tÚ informacjÚ, piszemy: tablica.Length Rozdziaï 5. • Tablice 125 Przy tym dopuszczalny jest tylko odczyt, czyli prawidïowa jest kon- strukcja: int rozmiar = tablica.Length; ale nieprawidïowy jest zapis: tablica.Length = 10; m W I C Z E N I E 5.5 Odczyt rozmiaru tablicy Utwórz tablicÚ o dowolnym rozmiarze. Odczytaj wartoĂÊ wïaĂciwoĂci Length i wyĂwietl jÈ na ekranie. using System; public class Program { public static void Main() { int[] tablica = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; Console.Write( Liczba elementów tablicy: ); Console.WriteLine(tablica.Length); } } m W I C Z E N I E 5.6 WïaĂciwoĂÊ Length i pÚtla for Utwórz tablicÚ zawierajÈcÈ pewnÈ liczbÚ wartoĂci caïkowitych. Zawar- toĂÊ tablicy wyĂwietl na ekranie za pomocÈ pÚtli for. Do okreĂlenia rozmiaru tablicy uĝyj wïaĂciwoĂci Length. using System; public class Program { public static void Main() { int[] tab = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 126 C# • mwiczenia }; for(int i = 0; i tab.Length; i++) { Console.WriteLine( tab[ + i + ] = + tab[i]); } } } Zasada odczytu danych w tym przykïadzie jest taka sama jak w Êwi- czeniach 5.3 i 5.4, z tÈ róĝnicÈ, ĝe rozmiar tablicy jest okreĂlany za pomocÈ wïaĂciwoĂci Length (tab.Length). DziÚki temu moĝna np. do- pisaÊ dowolnÈ liczbÚ nowych danych w instrukcji inicjalizujÈcej ta- blicÚ, a kod pÚtli for nie bÚdzie wymagaï ĝadnych zmian. Nowy rozmiar zostanie uwzglÚdniony automatycznie. Do zapisywania danych (podobnie jak do odczytu) w tablicach czÚ- sto uĝywa siÚ pÚtli (przedstawionych w rozdziale 2.). Jest to wrÚcz niezbÚdne, gdyĝ trudno siÚ spodziewaÊ, aby moĝna byïo „rÚcznie” zapisaÊ wartoĂci z wiÚcej niĝ kilkunastu czy kilkudziesiÚciu komórek. WielkoĂÊ tablicy nie musi teĝ byÊ z góry znana, moĝe wynikaÊ z danych uzyskanych w trakcie dziaïania programu. Z tablicami mogÈ wspóïpra- cowaÊ dowolne rodzaje pÚtli. W niektórych przypadkach bardzo wy- godna jest omówiona w kolejnym podrozdziale pÚtla foreach. m W I C Z E N I E 5.7 Uĝycie pÚtli do zapisu danych w tablicy Uĝyj pÚtli for do zapisania w 10-elementowej tablicy 10 kolejnych liczb caïkowitych. using System; public class Program { public static void Main() { int[] tab = new int[10]; for(int i = 0; i tab.Length; i++) { tab[i] = i + 1; } Console.WriteLine( Zawartoħè tablicy: ); for(int i = 0; i tab.Length; i++) { Rozdziaï 5. • Tablice 127 Console.WriteLine( tab[{0}] = {1} , i, tab[i]); } } } Powstaïa 10-elementowa tablica liczb typu int. Mamy w niej zapisaÊ wartoĂci od 1 do 10, czyli komórka o indeksie 0 ma mieÊ wartoĂÊ 1, o in- deksie 1 — wartoĂÊ 2 itd. A zatem wartoĂÊ komórki ma byÊ zawsze o 1 wiÚksza niĝ wartoĂÊ indeksu (zmiennej i). Dlatego instrukcja wewnÈtrz pÚtli ma postaÊ: tablica[i] = i + 1; Druga pÚtla for sïuĝy tylko do wyĂwietlania danych zawartych w ta- blicy. Jej konstrukcja jest taka sama jak w pierwszym przypadku. WewnÈtrz pÚtli znajduje siÚ instrukcja wyĂwietlajÈca wartoĂci kolej- nych komórek. PÚtla foreach Dotychczas poznaliĂmy trzy rodzaje pÚtli: for, while i do…while (byïa o nich mowa w rozdziale 3.). W przypadku tablic (jak równieĝ kolekcji, które w tej ksiÈĝce nie byïy omawiane1) moĝna równieĝ skorzystaÊ z pÚtli typu foreach. Jest ona bardzo wygodna, gdyĝ umoĝliwia prostÈ iteracjÚ po wszystkich elementach tablicy; nie trzeba wtedy wprowa- dzaÊ dodatkowej zmiennej iteracyjnej. PÚtla foreach ma nastÚpujÈcÈ postaÊ: foreach(typ identyfikator in wyraľenie) { //instrukcje } Jeĝeli zatem mamy tablicÚ o nazwie tab zawierajÈcÈ liczby typu int, moĝemy zastosowaÊ konstrukcjÚ: 1 ¥ciĂlej rzecz ujmujÈc, pÚtli foreach moĝna uĝyÊ z kaĝdym obiektem udostÚpniajÈcym tzw. iterator. Ten temat nie bÚdzie jednak poruszany w ksiÈĝce. 128 C# • mwiczenia foreach(int val in tab) { //instrukcje } Wtedy w kolejnych przebiegach pÚtli pod val bÚdÈ podstawiane kolejne elementy tablicy. Sïowo val jest tu identyfikatorem odczytywanej wartoĂci (moĝna je traktowaÊ jak zmiennÈ). OczywiĂcie, moĝna je zmieniÊ na dowolne inne. m W I C Z E N I E 5.8 Uĝycie pÚtli foreach do wyĂwietlenia zawartoĂci tablicy Wykorzystaj pÚtlÚ foreach do wyĂwietlenia wszystkich elementów tablicy przechowujÈcej liczby caïkowite. using System; public class Program { public static void Main() { int[] tab = new int[10]; for(int i = 0; i 10; i++) { tab[i] = i; } foreach(int i in tab) { Console.WriteLine(i); } } } Tablica tab zostaïa zainicjalizowana w pÚtli for kolejnymi liczbami od 0 do 9. Do wyĂwietlenia danych zostaïa natomiast uĝyta pÚtla foreach. W kaĝdym jej przebiegu pod identyfikator val jest podstawiana wartoĂÊ kolejnego elementu tablicy. W pierwszym przebiegu jest to pierwszy element (o indeksie 0), w drugim — drugi element (o indeksie 1) itd. PÚtla koñczy siÚ po osiÈgniÚciu ostatniego elementu (o indeksie 9). Rozdziaï 5. • Tablice 129 m W I C Z E N I E 5.9 Zliczanie wartoĂci w pÚtli foreach Wykorzystaj pÚtlÚ foreach do sprawdzenia, ile jest liczb parzystych, a ile nieparzystych w tablicy z elementami typu int. using System; public class Program { public static void Main() { int[] tab = new int[100]; int parzyste = 0, nieparzyste = 0; Random rand = new Random(); for(int i = 0; i 100; i++) { tab[i] = rand.Next(); } foreach(int i in tab) { if(i 2 == 0) { parzyste++; } else { nieparzyste++; } } Console.WriteLine( Parzyste: {0} , parzyste); Console.WriteLine( Nieparzyste: {0} , nieparzyste); } } Powstaïa tablica tab typu int, 100-elementowa. Do wypeïnienia jej danymi zostaïa uĝyta pÚtla for oraz obiekt rand typu Random, za pomocÈ którego uzyskujemy wartoĂci pseudolosowe. Dokïadniej rzecz ujmujÈc, kolejnÈ pseudolosowÈ liczbÚ caïkowitÈ otrzymujemy, wywoïujÈc metodÚ Next tego obiektu. W pÚtli foreach badamy, które z komórek tablicy tab zawierajÈ wartoĂci parzyste, a które — nieparzyste. Aby to stwierdziÊ, uĝywamy operatora dzielenia modulo. Gdy wynikiem tego dzielenia jest 0, dana komórka zawiera liczbÚ parzystÈ (jest wtedy zwiÚkszana wartoĂÊ pomocniczej zmiennej parzyste), natomiast gdy wynik dzielenia jest róĝny od 0, komórka zawiera wartoĂÊ nieparzystÈ 130 C# • mwiczenia (jest wtedy zwiÚkszana wartoĂÊ pomocniczej zmiennej nieparzyste). Po zakoñczeniu pÚtli na ekranie wyĂwietlany komunikat z poszuki- wanÈ informacjÈ (uĝywane sÈ wartoĂci pobrane ze zmiennych parzyste i nieparzyste). Tablice wielowymiarowe Tablice nie muszÈ byÊ jednowymiarowe, jak w dotychczas prezen- towanych przykïadach. Tych wymiarów moĝe byÊ wiÚcej, np. dwa — otrzymujemy wtedy strukturÚ widocznÈ na rysunku 5.5, czyli rodzaj tabeli o zadanej liczbie wierszy i kolumn. W tym przypadku sÈ dwa wiersze oraz piÚÊ kolumn. OczywiĂcie, aby w takiej sytuacji jedno- znacznie wyznaczyÊ komórkÚ, trzeba podaÊ dwie liczby: indeks wiersza i indeks kolumny. Rysunek 5.5. Przykïad tablicy dwuwymiarowej W jaki sposób moĝna zadeklarowaÊ tego typu tablicÚ? Zacznijmy od deklaracji samej zmiennej tablicowej. Dla tablicy dwuwymiarowej ma ona postaÊ: typ_tablicy[,] nazwa_tablicy; SamÈ tablicÚ tworzy siÚ za pomocÈ instrukcji: new int[wiersze, kolumny]; Przykïadowo dwuwymiarowÈ tablicÚ widocznÈ na rysunku 5.5 utwo- rzymy nastÚpujÈco (przy zaïoĝeniu, ĝe ma przechowywaÊ liczby caï- kowite): int[,] tablica = new tablica[2, 5]; Inicjalizacja komórek moĝe odbywaÊ siÚ, podobnie jak w przypadku tablic jednowymiarowych, juĝ w trakcie deklaracji: Rozdziaï 5. • Tablice 131 typ_tablicy[,] nazwa_tablicy = { (dana1, dana2), (dana3, dana4), ..., (danaM, danaN) }; Zobaczmy, jak wyglÈda to na konkretnym przykïadzie. m W I C Z E N I E 5.10 Tworzenie tablicy dwuwymiarowej Zadeklaruj tablicÚ dwuwymiarowÈ typu int o dwóch wierszach i piÚciu kolumnach i zainicjalizuj jÈ kolejnymi liczbami caïkowitymi. Zawar- toĂÊ tablicy wyĂwietl na ekranie. using System; public class Program { public static void Main() { int[,] tablica = new int[2, 5]; int licznik = 0; for(int i = 0; i 2; i++) { for(int j = 0; j 5; j++) { tablica[i, j] = licznik++; } } for(int i = 0; i 2; i++) { for(int j = 0; j 5; j++) { Console.WriteLine( tablica[{0}, {1}] = {2} , i, j, tablica[i, j]); } } } } Jak widaÊ, do wypeïniania tablicy uĝyto dwóch zagnieĝdĝonych pÚtli for. Pierwsza, zewnÚtrzna, odpowiada za iteracjÚ po indeksach wier- szy tablicy, druga za iteracjÚ po indeksach kolumn. Zmienna licznik sïuĝy jako licznik i jest w kaĝdym przebiegu zwiÚkszana o jeden, dziÚki czemu w kolejnych komórkach uzyskujemy kolejne liczby caïkowite. Po wypeïnieniu danymi tablica przyjmie postaÊ widocznÈ na rysunku 5.6. 132 C# • mwiczenia Rysunek 5.6. Tablica z Êwiczenia 5.10 po wypeïnianiu danymi Do wyĂwietlenia danych uĝywana jest analogiczna konstrukcja z dwo- ma zagnieĝdĝonymi pÚtlami. Po uruchomieniu kodu na ekranie zo- baczmy widok przedstawiony na rysunku 5.7. Jak widaÊ, dane te zgodne sÈ ze strukturÈ przedstawionÈ na rysunku 5.6. Rysunek 5.7. Wynik dziaïania programu z Êwiczenia 5.10 Tablica dwuwymiarowa nie musi mieÊ, tak jak w poprzednich przy- kïadach, ksztaïtu prostokÈtnego, tzn. takiego, gdzie liczba komórek w kaĝdym wierszu i kaĝdej kolumnie jest staïa. Równie dobrze moĝna utworzyÊ np. tablicÚ o ksztaïcie trójkÈta (rysunek 5.8 A) lub zupeïnie nieregularnÈ (rysunek 5.8 B). Przy tworzeniu struktur nieregularnych trzeba siÚ jednak wiÚcej napracowaÊ, gdyĝ kaĝdy wiersz zazwyczaj naleĝy tworzyÊ rÚcznie, piszÈc odpowiedniÈ liniÚ kodu. Rysunek 5.8. Przykïady bardziej skomplikowanych tablic dwuwymiarowych Rozdziaï 5. • Tablice 133 Postarajmy siÚ utworzyÊ strukturÚ przedstawionÈ na rysunku 5.8 B. Naleĝy zauwaĝyÊ, ĝe kaĝdy wiersz moĝna traktowaÊ jak oddzielnÈ tablicÚ jednowymiarowÈ. Zatem jest to jednowymiarowa tablica, której poszczególne komórki zawierajÈ inne jednowymiarowe tablice. Inaczej mówiÈc, jest to tablica tablic. Wystarczy wiÚc zadeklarowaÊ zmiennÈ tablicowÈ o odpowiednim typie, a nastÚpnie poszczególnym jej ele- mentom przypisaÊ nowo utworzone tablice jednowymiarowe o zadanej dïugoĂci. Oto caïe rozwiÈzanie problemu. Jednak co znaczy okreĂlenie „odpowiedni typ tablicy”? PomyĂlmy — jeĂli w tablicy (jednowymiarowej) miaïy byÊ przechowywane liczby caïkowite typu int, typem tej tablicy byï int. PisaliĂmy wtedy: int[] tablica; JeĂli zatem typem nie jest int, ale tablica typu int, którÈ oznacza siÚ jako int[], naleĝy napisaÊ: int[][] tablica; Z kolei utworzenie 4-elementowej tablicy zawierajÈcej tablice z liczbami caïkowitymi wymaga zapisu: new tablica[4][]; Te wiadomoĂci powinny wystarczyÊ do wykonania kolejnego Êwi- czenia. m W I C Z E N I E 5.11 Budowa tablicy nieregularnej Napisz kod tworzÈcy strukturÚ tablicy widocznej na rysunku 5.8 B, przechowujÈcej liczby caïkowite. W kolejnych komórkach powinny znaleěÊ siÚ kolejne liczby caïkowite od 1 do 10. public class Program { public static void Main() { int[][] tablica = new int[4][]; tablica[0] = new int[4]{1, 2, 3, 4}; tablica[1] = new int[2]{5, 6}; tablica[2] = new int[3]{7, 8, 9}; tablica[3] = new int[1]{10}; } } 134 C# • mwiczenia Po wypeïnieniu danymi tablica z Êwiczenia bÚdzie miaïa postaÊ przed- stawionÈ na rysunku 5.9. Jak sobie poradziÊ z wyĂwietleniem jej za- wartoĂci na ekranie? OczywiĂcie, moĝna zrobiÊ to rÚcznie, piszÈc kod oddzielnie dla kaĝdego wiersza. Przy tak maïej tablicy nie bÚdzie to problemem. Czy jednak tej czynnoĂci nie da siÚ zautomatyzowaÊ? Najwygodniej byïoby przecieĝ wyprowadzaÊ dane na ekran w zagnieĝ- dĝonych pÚtlach, tak jak w Êwiczeniu 5.10. Rysunek 5.9. Tablica z Êwiczenia 5.11 wypeïniona przykïadowymi danymi OczywiĂcie, jest to jak najbardziej moĝliwe, a z nieregularnoĂciÈ ta- blicy moĝna sobie poradziÊ w bardzo prosty sposób. Przecieĝ kaĝda tablica ma, omówionÈ wczeĂniej w tym rozdziale, wïaĂciwoĂÊ Length, przy uĝyciu której da siÚ sprawdziÊ jej dïugoĂÊ. To caïkowicie rozwiÈ- zuje problem wyĂwietlenia danych nawet z tak nieregularnej struktury jak obecnie opisywana. m W I C Z E N I E 5.12 WyĂwietlanie danych z tablicy nieregularnej Zmodyfikuj kod z Êwiczenia 5.11 w taki sposób, aby dane zawarte w tablicy zostaïy wyĂwietlone na ekranie (rysunek 5.10). W tym celu uĝyj zagnieĝdĝonych pÚtli for. using System; public class Program { public static void Main() { int[][] tablica = new int[4][]; tablica[0] = new int[4]{1, 2, 3, 4}; tablica[1] = new int[2]{5, 6}; Rozdziaï 5. • Tablice 135 tablica[2] = new int[3]{7, 8, 9}; tablica[3] = new int[1]{10}; for(int i = 0; i tablica.Length; i++) { Console.Write( tablica[{0}] = , i); for(int j = 0; j tablica[i].Length; j++) { Console.Write( [{0}] , tablica[i][j]); } Console.WriteLine( ); } } } Do wyĂwietlenia danych równieĝ zostaïy uĝyte dwie zagnieĝdĝone pÚtle for. W pÚtli zewnÚtrznej jest umieszczona instrukcja Console.Write ´( tablica[{0}] = , i);, wyĂwietlajÈca numer aktualnie przetwarza- nego wiersza tablicy, natomiast w pÚtli wewnÚtrznej znajduje siÚ in- strukcja Console.Write( {0} , tab[i][j]);, wyĂwietlajÈca zawartoĂÊ komórek w danym wierszu. Rysunek 5.10. WyĂwietlenie danych z nieregularnej tablicy w Êwiczeniu 5.12 136 C# • mwiczenia
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

C#. Ćwiczenia. Wydanie III
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: