You are on page 1of 17

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

C#. wiczenia.
Wydanie II
Autor: Marcin Lis
ISBN: 83-246-0595-9
Format: A5, stron: 216
Przykady na ftp: 65 kB

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

C# to jeden z najmodszych jzykw programowania. Opracowany w firmie Microsoft


jzyk jest poczeniem najlepszych cech C++ i Javy. Stanowi wietne narzdzie do
tworzenia aplikacji dla systemu Windows i urzdze mobilnych. C# jest stosunkowo
atwy do opanowania, ma prost i czyteln skadni. cisa integracja z platform .NET
pozwala programistom korzysta z oferowanych przez ni klas i komponentw. Bardzo
duym atutem najnowszej wersji jzyka C# jest to, i wszyscy, ktrzy chc pozna jego
moliwoci, mog skorzysta z dostpnego nieodpatnie rodowiska programistycznego
Microsoft Visual Studio Express Edition.
Dziki ksice C#. wiczenia. Wydanie II poznasz podstawy jzyka C# i nauczysz
si korzysta ze rodowiska Visual Studio Express. Dowiesz si, z jakich elementw
skadaj si programy napisane w C# i na czym polega programowanie obiektowe.
Przeczytasz o obsudze wyjtkw, projektowaniu okien dialogowych, przetwarzaniu
danych i programowaniu sterowanym zdarzeniami. Wykonujc kolejne wiczenia,
poznasz zasady tworzenia aplikacji dla systemu Windows z wykorzystaniem
komponentw platformy .NET.
Obsuga rodowiska Visual Studio Express
Typy danych
Operatory
Instrukcje warunkowe i ptle
Programowanie obiektowe
Obsuga bdw
Wywietlanie okien w systemie Windows
Korzystanie z komponentw platformy .NET
Rozpocznij przygod z programowaniem

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl

Spis treci
Wstp

Rozdzia 1. Pierwsza aplikacja

Jzyk C#
Jak waciwie nazywa si ten jzyk?
rodowisko uruchomieniowe
Narzdzia
Najprostszy program
Kompilacja i uruchamianie
Visual C# Express
Dyrektywa using

Rozdzia 2. Zmienne i typy danych


Typy danych
Operatory
Komentarze

Rozdzia 3. Instrukcje
Instrukcje warunkowe
Instrukcja goto
Ptle
Wprowadzanie danych

Rozdzia 4. Programowanie obiektowe


Klasy
Metody
Konstruktory
Specyfikatory dostpu
Dziedziczenie

7
8
8
10
10
12
13
17

19
19
28
41

43
43
50
54
64

77
77
79
87
90
96

C#. wiczenia

Rozdzia 5. Tablice

99

Deklarowanie tablic
Inicjalizacja
Ptla foreach
Tablice wielowymiarowe

99
103
105
107

Rozdzia 6. Wyjtki i obsuga bdw

113

Obsuga bdw
Blok try...catch
Hierarchia wyjtkw
Wasne wyjtki

Rozdzia 7. Interfejsy
Prosty interfejs
Interfejsy w klasach potomnych
Czy to interfejs?

Rozdzia 8. Pierwsze okno


Utworzenie okna
Wywietlanie komunikatu
Zdarzenie ApplicationExit

Rozdzia 9. Delegacje i zdarzenia


Delegacje
Zdarzenia

Rozdzia 10. Komponenty


Etykiety (Label)
Przyciski (klasa Button)
Pola tekstowe (TextBox)
Pola wyboru (CheckBox, RadioButton)
Listy rozwijalne (ComboBox)
Listy zwyke (ListBox)
Menu

113
118
124
126

131
131
135
142

153
153
157
159

161
161
165

171
171
177
180
185
189
192
195

5
Tablice
Tablice to jedne z podstawowych struktur danych i znane s
z pewnoci nawet pocztkujcym programistom. Przypomnijmy jednak na wstpie podstawowe wiadomoci i pojcia
z nimi zwizane. Tablica to stosunkowo prosta struktura danych pozwalajca na przechowanie uporzdkowanego zbioru elementw danego typu. Skada si z ponumerowanych kolejno komrek, a kada
taka komrka moe przechowywa pewn porcj danych.
Jakiego rodzaju bd to dane, okrela typ tablicy. Jeli zatem zadeklarujemy tablic typu cakowitoliczbowego (int), bdzie moga ona zawiera liczby cakowite, a jeli bdzie to typ znakowy (char), poszczeglne komrki bd mogy zawiera rne znaki.

Deklarowanie tablic
Przed skorzystaniem z tablicy naley zadeklarowa zmienn tablicow, a poniewa w C# tablice s obiektami, naley rwnie utworzy
odpowiedni obiekt. Schematycznie robimy to w sposb nastpujcy:
typ_tablicy[] nazwa_tablicy = new typ_tablicy[liczba_elementw];

100

C#. wiczenia

Oczywicie deklaracji zmiennej tablicowej oraz przypisania jej nowo


utworzonego elementu mona dokona w osobnych instrukcjach, np.
piszc:
typ_tablicy[] nazwa_tablicy;
nazwa_tablicy = new typ_tablicy[liczba_elementw];

Piszc zatem:
int tablica[];

zadeklarujemy odniesienie do tablicy, ktra bdzie zawieraa elementy


typu int, czyli 32-bitowe liczby cakowite. Samej tablicy jednak jeszcze wcale nie ma. Przekonamy si o tym, wykonujc kolejne wiczenie.
W I C Z E N I E

5.1

Deklaracja zmiennej tablicowej

Zadeklaruj tablic elementw typu cakowitego. Przypisz zerowemu


elementowi tablicy dowoln warto. Sprbuj wywietli zawarto
tego elementu na ekranie.
using System;
public
class main
{
public static void Main()
{
int[] tablica;
tablica[0] = 11;
Console.WriteLine("Zerowy element tablicy to: " + tablica[0]);
}
}

Ju przy prbie kompilacji kompilator uprzejmie poinformuje nas, e


chcemy odwoa si do zmiennej, ktra prawdopodobnie nie zostaa
zainicjalizowana, tak jak jest to widoczne na rysunku 5.1.

Rysunek 5.1. Prba uycia niezainicjowanej zmiennej tablicowej

Rozdzia 5. Tablice

101

Skoro wic wystpi bd, naley go natychmiast naprawi.


W I C Z E N I E

5.2

Utworzenie tablicy

Zadeklaruj i zainicjalizuj tablic elementw typu cakowitego. Przypisz zerowemu elementowi tablicy dowoln warto. Sprbuj wywietli zawarto tego elementu na ekranie.
using System;
public
class main
{
public static void Main()
{
int[] tablica = new int[1];
tablica[0] = 10;
Console.WriteLine("Zerowy element tablicy to: " + tablica[0]);
}
}

Wyraenie new tablica[1] oznacza stworzenie nowej, jednowymiarowej, jednoelementowej tablicy liczb typu int. Ta nowa tablica zostaa
przypisana zmiennej odnonikowej o nazwie tablica. Od tej chwili
mona odwoywa si do kolejnych elementw tej tablicy, piszc:
tablica[index]

Warto przy tym zauway, e elementy tablicy numerowane s od zera, a nie od 1. Oznacza to, e pierwszy element tablicy 10-elementowej
ma indeks 0, a ostatni 9 (nie 10!). Co si stanie, jeli nieprzyzwyczajeni do takiego sposobu indeksowania odwoamy si do indeksu o numerze 10?
W I C Z E N I E

5.3

Odwoanie do nieistniejcego elementu tablicy

Zadeklaruj i zainicjuj tablic dziesicioelementow. Sprbuj przypisa


elementowi o indeksie 10 dowoln liczb cakowit.
using System;
public
class main
{

102

C#. wiczenia

public static void Main()


{
int[] tablica = new int[10];
tablica[10] = 1;
Console.WriteLine("Element o indeksie 10 to: " + tablica[10]);
}

Powyszy kod daje si bez problemu skompilowa, jednak przy prbie


uruchomienia takiego programu na ekranie zobaczymy okno widoczne na rysunku 5.2 informujce o wystpieniu bdu. Chwil pniej
(po klikniciu Dont send) ujrzymy na konsoli komunikat podajcy
konkretne informacje o typie bdu oraz miejscu programu, w ktrym
on wystpi (rysunek 5.3).
Rysunek 5.2.
Prba
odwoania si
do nieistniejcego
elementu tablicy
powoduje
bd aplikacji

Rysunek 5.3. Systemowa informacja o bdzie

Wbrew pozorom nie stao si jednak nic strasznego. Program co prawda nie dziaa, ale bd zosta wychwycony przez rodowisko uruchomieniowe. Konkretnie mwic, zosta wygenerowany tak zwany wyjtek i aplikacja zakoczya dziaanie. Taki wyjtek moemy jednak
przechwyci i tym samym zapobiec niekontrolowanemu zakoczeniu
wykonywania kodu. To jednak odrbny temat, ktrym zajmiemy si
w rozdziale 6. Wane jest to, e prba odwoania si do nieistniejcego
elementu zostaa wykryta i to odwoanie tak naprawd nie wystpio! Program nie naruszy wic obszaru pamici niezarezerwowanej
dla niego.

Rozdzia 5. Tablice

103

Inicjalizacja
Tablice mona zainicjalizowa ju w momencie ich tworzenia. Dane,
ktre maj si znale w poszczeglnych komrkach, podajemy w nawiasach klamrowych po deklaracji tablicy. Schematycznie wyglda to
nastpujco:
typ[] nazwa = new typ [liczba_elementw]{dana1, dana2,...,danaN}

Jeli zatem chcielibymy utworzy picioelementow tablic liczb cakowitych i od razu zainicjowa j liczbami od 1 do 5, moemy zrobi
to w taki sposb:
int[] tablica = new int[5] {1, 2, 3, 4, 5}
W I C Z E N I E

5.4

Inicjalizacja tablicy

Zadeklaruj tablic picioelementow typu int i zainicjuj j liczbami


od 1 do 5. Zawarto tablicy wywietl na ekranie.
using System;
public
class main
{
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 dziaania kodu z powyszego wiczenia widoczny jest na rysunku 5.4. Nie jest niespodziank, e wywietlone zostay kolejne liczby od 1 do 5.

104

C#. wiczenia

Rysunek 5.4.
Zawarto
kolejnych
komrek tablicy
utworzonej
w wiczeniu 5.4

Kiedy inicjujemy tworzon tablic z gry znan liczb elementw, moemy pomin fragment kodu zwizany z tworzeniem obiektu, a kompilator doda go za nas. Zamiast pisa:
typ[] nazwa = new typ [liczba_elementw]{dana1, dana2,...,danaN}

moemy rwnie dobrze uy konstrukcji:


typ[] nazwa = {dana1, dana2,...,danaN}

Oba sposoby s sobie rwnowane i moemy uywa tego, ktry jest


dla nas wygodniejszy.
W I C Z E N I E

5.5

Bezporednia inicjalizacja tablicy

Zadeklaruj tablic picioelementow typu int i zainicjuj j liczbami


od 1 do 5. Uyj drugiego z poznanych sposobw inicjalizacji. Zawarto
tablicy wywietl na ekranie.
using System;
public
class main
{
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]);
}
}
}

Rozdzia 5. Tablice

105

Ptla foreach
Dotychczas poznalimy trzy rodzaje ptli: for, while i dowhile. W przypadku tablic (jak rwnie kolekcji, ktrymi si w niniejszej publikacji
nie zajmujemy) moemy rwnie skorzysta z ptli typu foreach. Jest
ona bardzo wygodna, gdy umoliwia prost iteracj po wszystkich
elementach tablicy; nie musimy te wprowadza dodatkowej zmiennej iteracyjnej. Ptla foreach ma posta nastpujc:
foreach(typ identyfikator in wyraenie)
{
//instrukcje
}

Konkretnie, jeeli mamy tablic o nazwie tab zawierajc liczby typu int, moemy zastosowa konstrukcj:
foreach(int i in tab)
{
//instrukcje
}

W tym wypadku w kolejnych przebiegach ptli pod i bd podstawiane kolejne elementy tablicy.
W I C Z E N I E

5.6

Wykorzystanie ptli foreach


do wywietlenia zawartoci tablicy

Wykorzystaj ptl foreach do wywietlenia wszystkich elementw tablicy przechowujcej liczby cakowite.
using System;
public
class main
{
public static void Main()
{
int[] tab = new int[10];
for(int i = 0; i < 10; i++){
tab[i] = i;

106

C#. wiczenia
}
foreach(int i in tab){
Console.WriteLine(i);
}
}
}

W I C Z E N I E

5.7

Zliczanie wartoci w ptli foreach

Wykorzystaj ptl foreach do sprawdzenia, ile jest liczb parzystych,


a ile nieparzystych w tablicy z elementami typu int.
using System;
public
class main
{
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("Tablica zawiera {0} liczb parzystych i {1} liczb
nieparzystych", parzyste, nieparzyste);
}
}

Tym razem przy wypenianiu tablicy danymi korzystamy z obiektu


klasy Random, ktra udostpnia wartoci pseudolosowe. Dokadniej mwic, kolejn pseudolosow liczb cakowit uzyskujemy, wywoujc
metod Next teje klasy. Do stwierdzenia, czy kolejna komrka tablicy zawiera liczb parzyst czy nieparzyst, wykorzystujemy operator
dzielenia modulo. Oczywicie liczba parzysta modulo dwa daje wynik
zero i taki te warunek sprawdzamy w instrukcji if.

Rozdzia 5. Tablice

107

Tablice wielowymiarowe
Tablice nie musz by jednowymiarowe, jak w dotychczas prezentowanych przykadach. Tych wymiarw moe by wicej, na przykad
dwa otrzymujemy wtedy struktur widoczn na rysunku 5.5, czyli
rodzaj tabeli o zadanej iloci wierszy i kolumn. W tym przypadku mamy dwa wiersze oraz cztery kolumny. Oczywicie w takiej sytuacji,
aby jednoznacznie wyznaczy komrk, trzeba poda dwie liczby.
Rysunek 5.5.
Przykad tablicy
dwuwymiarowej

Musimy si teraz dowiedzie, w jaki sposb zadeklarowa tego typu


tablic. Zacznijmy od deklaracji samej zmiennej tablicowej. W przypadku tablicy dwuwymiarowej ma ona posta:
typ_tablicy[,] nazwa_tablicy;

Sam tablic tworzymy natomiast za pomoc instrukcji:


new int[wiersze, kolumny];

Przykadowo, dwuwymiarow tablic widoczn na rysunku 5.5 utworzymy nastpujco (zakadajc, e ma ona przechowywa liczby cakowite):
int[,] tablica = new tablica[2, 5];

Inicjalizacja samych komrek moe odbywa si, podobnie jak w przypadku tablic jednowymiarowych, ju w trakcie deklaracji:
typ_tablicy[,] nazwa_tablicy = {(dana1, dana2), (dana3, dana4),...,
(danaM, danaN)};

Zobaczmy, jak wyglda to na konkretnym przykadzie.

108

C#. wiczenia

W I C Z E N I E

5.8

Tworzenie tablicy dwuwymiarowej

Zadeklaruj tablic dwuwymiarow typu int o dwch wierszach i piciu kolumnach i zainicjuj j kolejnymi liczbami cakowitymi. Zawarto tablicy wywietl na ekranie.
using System;
public
class main
{
public static void Main()
{
int[,] tablica = new int[2, 5];
int counter = 0;
for(int i = 0; i < 2; i++){
for(int j = 0; j < 5; j++){
tablica[i, j] = counter++;
}
}
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 wypeniania tablicy uywamy dwch zagniedonych


ptli for. Pierwsza, zewntrzna, odpowiada za iteracj po indeksach
wierszy tablicy, druga za iteracj po indeksach kolumn. Zmienna
counter suy nam jako licznik i jest w kadym przebiegu zwikszana
o jeden, dziki czemu w kolejnych komrkach uzyskujemy kolejne
liczby cakowite. Po wypenieniu danymi nasza tablica ma posta widoczn na rysunku 5.6.
Rysunek 5.6.
Tablica
z wiczenia 5.8
po wypenianiu
danymi

Rozdzia 5. Tablice

109

Do wywietlenia danych uywamy analogicznej konstrukcji z dwoma


zagniedonymi ptlami. Po uruchomieniu kodu na ekranie zobaczmy
widok przedstawiony na rysunku 5.7. Jak wida, dane te zgodne s ze
struktur przedstawion na rysunku 5.6.
Rysunek 5.7.
Wynik dziaania
programu
z wiczenia 5.6

Tablica dwuwymiarowa nie musi mie wcale, tak jak w poprzednich


przykadach, ksztatu prostoktnego, tzn. takiego, gdzie liczba komrek w kadym wierszu i kadej kolumnie jest staa. Rwnie dobrze
moemy stworzy tablic o ksztacie trjkta (rysunek 5.8.A) lub zupenie nieregularn (rysunek 5.8.B). Przy tworzeniu struktur nieregularnych musimy si jednak nieco wicej napracowa, gdy kady wiersz
zazwyczaj trzeba tworzy rcznie, piszc odpowiedni lini kodu.
Rysunek 5.8.
Przykady
bardziej
skomplikowanych tablic
dwuwymiarowych

Postarajmy si utworzy struktur przedstawion na rysunku 5.8.B.


Zauwamy, e kady wiersz mona traktowa jako oddzieln tablic
jednowymiarow. Zatem tak naprawd jest to jednowymiarowa tablica, ktrej poszczeglne komrki zawieraj inne jednowymiarowe

110

C#. wiczenia

tablice. Inaczej mwic, jest to tablica tablic. Wystarczy zatem zadeklarowa zmienn tablicow o odpowiednim typie, a nastpnie poszczeglnym jej elementom przypisa nowo utworzone tablice jednowymiarowe o zadanej dugoci. To cae rozwizanie problemu.
Pytanie brzmi: co to znaczy odpowiedni typ tablicy. Pomylmy jeli w tablicy (jednowymiarowej) chcielimy przechowywa liczby cakowite typu int, to typem tej tablicy byo int. Pisalimy wtedy:
int[] tablica;

Jeli zatem typem nie jest int, ale tablica typu int, ktr oznaczamy
jako int[], naley napisa:
int[][] tablica;

Z kolei utworzenie czteroelementowej tablicy zawierajcej tablice


z liczbami cakowitymi wymaga wpisu:
new tablica[4][];

Te wiadomoci powinny nam wystarczy do wykonania kolejnego


wiczenia.
W I C Z E N I E

5.9

Budowa tablicy nieregularnej

Napisz kod tworzcy struktur tablicy widocznej na rysunku 5.8.B


przechowujcej liczby cakowite. W kolejnych komrkach powinny
znale si kolejne liczby cakowite, zaczynajc od 1.
using System;
public
class main
{
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};
}
}

Rozdzia 5. Tablice

111

W tej chwili nasza struktura zostaa wypeniona danymi, tak jak widoczne jest to na rysunku 5.9. Jak sobie jednak poradzi z jej wywietleniem na ekranie. Oczywicie moemy zrobi to rcznie, piszc kod
oddzielnie dla kadego wiersza. W przypadku tak maej tablicy nie
bdzie to problemem. Czy jednak tej czynnoci nie da si zautomatyzowa? Najwygodniej byoby przecie wyprowadza dane na ekran
w zagniedonej ptli, tak jak w przypadku wiczenia 5.8.
Rysunek 5.9.
Tablica
z wiczenia 5.9
wypeniona
przykadowymi
danymi

Okazuje si, e jest to jak najbardziej moliwe, a z nieregularnoci naszej tablicy poradzimy sobie w bardzo prosty sposb. Kada tablica jest
obiektem; posiada waciwo Length, dziki czemu moemy sprawdzi
jej dugo. To cakowicie rozwizuje problem wywietlenia danych
nawet z tak nieregularnej struktury jak obecnie opisywana.
W I C Z E N I E

5.10

Wywietlanie danych z tablicy nieregularnej

Zmodyfikuj kod z wiczenia 5.9 w taki sposb, aby dane zawarte


w tablicy zostay wywietlone na ekranie (rysunek 5.10). W tym celu
uyj zagniedonych ptli for.
using System;
public
class main
{
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};

112

C#. wiczenia
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("");
}
}
}

Rysunek 5.10.
Wywietlenie
danych
z nieregularnej
tablicy
w wiczeniu 5.10

You might also like