
Kurs C# cz. 2 – Zmienne
UWAGA! Już teraz sprawdź NOWY, JESZCZE LEPSZY kurs C#, którzy przygotowałem. Znajdziesz go po TYM linkiem.
Pierwsza część kursu była raczej luźniejsza i miała na celu wprowadzenie Was w serię oraz w podstawowe zagadnienia związane ze środowiskiem .NET. Teraz jednak w końcu bierzemy się do roboty i zaczynamy prawdziwą naukę. Nadal nie szarżujemy z tempem ponieważ wiem, że czytają mnie też osoby, które dopiero zaczynają i mimo, że wcześniej pisałem, że jednak zakładam posiadanie przez czytelników minimum wiedzy imformatyczno-programistycznej to myślę, że wyjaśnienie dokładniej niż przewidywałem dokładniej przynajmniej początkowych zagadnień może być dla niektórych przydatne, a na pewno nie będzie problemem. Jednak oczywiście jestem świadomy, że jeśli ktoś już wcześniej co nieco kumał to czekanie tydzień na taką ilość informacji może go znudzić dlatego kolejne części kursu będą się pojawiać jak najczęściej, niekoniecznie w tygodniowych odstępach czasu.
Polecam przerabianie kolejnych części po kolei ponieważ przyjąłem takie założenie, że zamiast za każdym razem dawać jako przykłady kolejne niezwiązane ze sobą programy będę pokazywał w miarę możliwość nowe zagadnienia dokładając kod do programu, na którym zakończyła się część poprzednia. Dlatego zakładam, że macie już utworzone projekty z programem Hello World, a dla tych, którzy zaczynają dopiero od tej części (a mówiłem przed chwilą – rób po kolei!) lub zgubili kod, a nie chce im się znowu otwierać tamtego tutoriala wklejam tutaj to co pokazywałem poprzednio:
using System; namespace Kurs { class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); } } }
1. Zatrzymajmy te dane!
Wszytko fajnie i w ogóle, program wyświetla ładny napis na ekranie jednak co to za program, który nie operuje na żadnych danych? W końcu cała idea powstania komputerów i pisania programów powstała ponieważ ludzie mieli jakieś dane do przetworzenia. Ale te dane trzeba w programie jednak gdzieś przetrzymywać i móc w miarę łatwy sposób się do niech odnosić. W tym momencie do głosu dochodzą twory nazwane zmiennymi. Zmienne to najogólniej mówiąc oznaczone za pomocą stałej nazwy małe pojemniczki w pamięci trzymające dla nas porcję danych. Ta porcja danych w przypadków języków takich jak C# musi mieć przez nas z góry określony typ dzięki czemu środowisko będzie wiedziało jak ma te dane interpretować Konkretny typ danych
oznacza też konkretną ilość zajmowanej przez nie pamięci. Ponieważ zagadnienie zmiennych w różnej postaci będzie się przewijać jeszcze w późniejszych etapach (zwłaszcza kiedy w końcu zacznę klasy opisywać…) dlatego ta część jest jedynie pierwszym spojrzeniem na nie, bez nadmiernego wchodzenia w zagadnienia związane z obiektami i skupimy się najpierw na typach tzw. wartościowych, a czym one są wyjaśnię w dalszej części. Także już bez nadmiernego gadania, żeby w końcu cokolwiek w tej części kursu zakodzić, przechodzimy do zagadnień związanych ze zmiennymi.
2. Jak to zapisać?
Deklaracja zmiennej (czyli powiedzenie, że od teraz w danym obszarze podana przez nas nazwa będzie oznaczała tą konkretną zmienną o konkretnym typie) w ogólnej postaci wygląda w taki sposób:
typ unikalnaNazwa;
Zaś przypisanie do niej wartości odbywa się za pomocą znaku ‘=’. Zakładając, że nasza zmienna może przechowywać całkowite wartości liczbowe to przypisanie do niej wartości 5 odbędzie się w następujący sposób:
unikalnaNazwa = 5;
Deklaracja i przypisanie mogą być pisane również razem, czyli możliwe jest zadeklarowanie zmiennej i od razu przypisanie jej wartości.
typ unikalnaNazwa = 5;
Możliwe jest również przypisywanie wartości jednej zmiennej do drugiej. Odbywa się to w podobny sposób, a mianowicie również wykorzystywany jest znak ‘=’ jednak teraz zamiast wartości po prawej stronie podajesz nazwę wcześniej utworzonej zmiennej, której wartość chcesz wziąć:
nowaUnikalnaNazwa = unikalnaNazwa;
Ważne jest żeby obie zmienne mogły przechowywać ten sam typ danych! Inaczej kompilator uraczy Was soczystym błędem, a wcześniej edytor podkreśli błąd w kodzie.
W tym momencie trzymajmy się tego, że zmienne można definiować wewnątrz metod. Kiedy dojdziemy do zagadnień związanych z klasami to dowiesz się również jak będą
wyglądać zmienne jako m.in. pola klas (spokojnie, na razie nie musisz zapamiętywać tego pojęcia).
3. Co za typ
W języku C# wyróżnia się dwa typy zmiennych – wartościowe i referencyjne. Być może w tym momencie uznasz to za mało intuicyjne, ale najogólniej mówiąc największa różnica między tymi typami występuje przy przypisywaniu przechowywanej wartości z jednej zmiennej do drugiej, jest to szczególnie istotne kiedy zaczniemy pisać właśne funkcje, którym będziemy przekazywać parametry. W przypadku typów wartościowych takie przypisanie oznacza, że robiona jest kopia przypisywanej wartości i zajmowana jest dodatkowa pamięć, a wartości w obu zmiennych są od siebie całkowicie niezależne, tzn. modyfikując wartość w jednej zmiennej nie zmieniamy wartości w drugiej, do której wcześniej robiliśmy przypisanie (namieszałem Ci już w głowie?). Zaś kiedy mamy do czynienia z wartościami referencyjnymi to przypisanie oznacza, że obie zmienne wskazują na ten sam fragment pamięci i korzystają z tej samej wartości. Dlatego w tym wypadku jeśli będziesz coś robił z wartością (obiektem), do której odwołujesz się przez pierwszą zmienną to zmiana wpłynie również na to co odczytasz z drugiej zmiennej, do której wcześniej robiłeś przypisanie wartości typu referencyjnego.
W tej części pokażę Ci jedynie typy wartościowe, które w znakomitej większości odnoszą się do wartości liczbowych.
W tabeli w pierwszej kolumnie podaję jak dany typ zmiennej będzie wpisywany w kodzie (jak wrócisz do części pokazującej deklarację zmiennej to tam właśnie pojawia się miejsce gdzie podaje się jej typ), a druga kolumna mówić będzie jaki zakres wartości możne przechowywać dany typ. Wszystkie wartości liczbowe poza float, double i decimal operują na liczbach całkowitych i do takich liczb odnoszą się podawane przedziały.
[table]Nazwa,Przedział wartości
sbyte,-128 do 127
byte,0 do 255
char,U+0000 do U+ffff (wszystkie znaki dostępne w kodowaniu Unicode)
short,-32 768 do 32 767
ushort,0 do 65 535
int,-2 147 483 648 do 2 147 483 647
uint,0 do 4 294 967 295
long,-9 223 372 036 654 775 808 do 9 223 372 036 654 775 807
ulong,0 do 18 446 744 073 709 551 615
float,+/- 1.5 * 10-45 do +/- 3.4 * 1038
double,+/- 5.0 * 10-324 do 1.7 * 10308
decimal,(-7.9*1028 do 7.9*1028) / (100 do 28)
bool,true lub false
[/table]4. Zróbmy to
Przyszedł w końcu czas na wstawienie w naszym kodzie pierwszej zmiennej. Będzie to zmienna typu int przechowująca wartości liczbowe. Otwórz więc program, który napisałeś w poprzedniej części i wewnątrz funkcji main(), nad metodą wypisującą tekst na ekranie dopisz
int zmienna = 5;
I teraz program będzie miał postać taką jak poniżej (jeśli używałeś takich samych nazw przestrzeni nazw i klasy):
using System; namespace Kurs { class Program { static void Main(string[] args) { int zmienna = 5; Console.WriteLine("Hello World!"); } } }
Nie pamiętam już czy o tym wspominałem, ale pewnie już zauważyłeś, że każda operacja w kodzie zakończona jest znakiem średnika.
Ok, mamy naszą zmienną więc żeby zobaczyć czy faktycznie to wszystko działa wypadałoby ją wypisać na ekranie. Tak samo jak w przypadku tekstu możemy posłużyć się w tym celu funkcją WriteLine() ponieważ potrafi ona wypisywać również wartości liczbowe. Tak więc zmodyfikujmy znowu nieco nasz program i zamiast wypisywać tekst wypiszmy na ekranie zmienną:
using System; namespace Kurs { class Program { static void Main(string[] args) { int zmienna = 5; Console.WriteLine(zmienna); } } }
W tym momencie po uruchomieniu programu w konsoli wyświetli się wartość '5′. Przy okazji powiem, że jeśli chcesz, żeby program zaczekał aż wciśniesz klawisz Enter do dodaj po wywołaniu funkcji WriteLine() linijkę:
Console.ReadLine();
Dzięki temu program nie zakończy się dopóki nie wciśniesz Entera.
5. Mnóż, dziel, zwyciężaj
Dobra, czyli w tym momencie potrafisz już tworzyć zmienne, przypisywać im nowe wartości lub kopiować wartości z innych zmiennych – jednym słowem zabawa jak przy przelewaniu wody ze szklanki do szklanki :) Dlatego na zakończenie tej części (tak, koniec jest blisko :( ) pokażę Ci kilka operacji arytmetycznych, które możesz wykonać na zmiennych i wartościach liczbowych.
Dostępne operacje arytmetyczne zebrałem w tabelę. Pierwsza kolumna to nazwa, druga to symbol jaki odpowiada jej w kodzie, a trzecia kolumna to przykład użycia.
[table]Nazwa,Symbol,Przykład
dodawanie,+,int zmienna = 2 + 2;
odejmowanie,-,int zmienna = 2 – 2;
mnożenie,*,int zmienna = 2 * 2;
dzielenie,/,int zmienna = 2 / 2;
reszta z dzielenia (modulo),%,int zmienna = 5 % 2;
[/table]Korzystając z programu pokazanego chwilę wcześniej podmienimy przypisanie do zmiennej wartości 5 na przypisanie do niej wyniku z dodawania dwóch liczb:
using System; namespace Kurs { class Program { static void Main(string[] args) { int zmienna = 2 + 2; Console.WriteLine(zmienna); } } }
Po uruchomieniu na ekranie zobaczysz wypisaną wartość '4′.
Wspomniałem wcześniej, że większość typów danych działa na liczbach całkowitych. Co więc się stanie kiedy np. wykonasz dzielenie, którego wynik będzie zawierał wartości po przecinku? Część ułamkowa zostanie obcięta. Warto o tym pamiętać bo jest to przyczyną sporej ilości błędów w programach ;) Jeśli wartości ułamkowe powinny być też zapamiętane skorzystaj z typu float, double lub decimal.
Na dzisiaj to tyle jeśli chodzi o nową wiedzę z języka C#. Wiem, że niektórzy mogą czuć niedosyt jeśli chodzi o ilość nowych zagadnień, ale dajmy na początku również szansę tym, którzy dopiero niedawno weszli w programowanie :) Poza tym uważam, że wpisy na blogu nie mogą ciągnąć się w nieskończoność dlatego muszę je ograniczać objętościowo jednak kiedy zapoznam Was z podstawowymi zagadnieniami, które będą używane potem w każdym miejscu to nowe informacje będą pojawiać się coraz szybciej.
Już niedługo pojawi się kolejna część kursu, dlatego jeśli chcesz być na bieżąco i nie przegapić jej to polecam np. śledzenie mojego bloga na Facebooku gdzie możesz też zostawić komentarz tak samo jak możesz go zostawić bezpośrednio pod tym wpisem ;)
Skorzystalem z typu float , double i decimal jak Pan zasugerowal.
Niestety nie wiem dlaczego ten program dalej nie wyswietla liczby po przecinku…
:(
Jeśli wynik działania jest całkowity , czyli wychodzi np. 4.0 to nie jestem pewien, ale może być tak, że .NET wyświetli wartość bez części po przecinku, a jeśli z działania wynikałoby, że ma być coś po przecinku to możliwe, że zamiast np. 1/3 trzeba pisać 1.0 / 3.0, żeby faktycznie liczył na liczbach zmiennoprzecinkowych, a nie całkowitych.
Nie wiem, czy Pan tu jeszcze zagląda :p ale nie wyświetla mi zmiennej. Tak samo przy równaniu nic sie nie dzieje. Nie wiem gdzie popełniam błąd, mam tak samo zapisane wszystko jak Pan :)
W jakim sensie się nic nie wyświetla? Pokazuje się pusta konsola czy okienko konsoli od razu znika?
Pkt 4 przedostatnia linijka, błąd w kodzie na czytanie entera jest:
Console.ReadLine(); zamiast Console.ReadKey();
Pozdrawiam
na razie super mi się czyta i przypomina :) Kiedyś juz programowałem w języku Pascal, ale było to lata temu. Trochę żałuję, że się rozstałem z tą nauką i teraz postanowiłem wrócić. Jest ok, i czytam dalej :)
Dziękuję za miłe słowa :)
Właśnie pracuję nad nową, ulepszoną wersją kursu C#, która zastąpi aktualny. Także zachęcam do śledzenia przyszłych wiadomości ;)
jak ma mnie nauczyć przepisywanie jakiegos kodu skoro jego nie rozumiem?