Tworząc ten kurs, kierowałem się jedną zasadą, nie da się niczego nauczyć, jeśli nie zobaczy się mnóstwa przykładów i nie zmusi się odbiorcy do samodzielnej pracy. Szczerze mówiąc, pisząc i robiąc przykłady do tego działu, sam uczę się nowych rzeczy i rozwijam swoje umiejętności. Rozdział ten będzie wprowadzeniem do dalszej pracy. Aby zacząć programować, należy najpierw wiedzieć, jak działa komputer. Najmniejszą ilością informacji w komputerze jest bit, przyjmuje on wartości od 0 do 1. Binarny sposób zapisu informacji związany jest, z tym że komputer jako urządzenie cyfrowe rozpoznać może dwa stany napięciowe:
- 0 – brak napięcia lub bardzo niskie (mniej niż 10% wartości wysokiego)
- 1 – wysokie napięcie (np. 5V).
Z tego względu obliczenia wykonywane przez procesor opierają się na binarnym (dwójkowym) systemie liczbowym. Każdy znak wyświetlony na komputerze, obrazek film da się przedstawić jako zbiór 0 i 1. Każde 8 bitów nazywane jest bajtem i przyjmuje on kombinacje od 00000000 do 11111111 i można go przedstawić w systemie dziesiętnym jako 0 do 255. Dlatego też kolory w palecie barw RGB przyjmują wartości od 0 do 255, ponieważ każdy piksel reprezentowany jest przez 3 bajty koloru. Każdy plik jest zbiorem bajtów, tak więc każdy znak wyświetlony na komputerze można przekształcić na cyfrę dziesiętną, szesnastkową itd. Kiedy mówimy, że coś jest 16-bitowym typem danych lub zmienna zajmuje 16-bitów pamięci, mówimy o zbiorze szesnastu jedynek i zer, wartość osiągnięta z tych 16 bitów będzie więc permutacją jedynek i zer. Tak więc u podstaw wszystkiego w komputerze stoją liczby. Programy odczytują i interpretują te liczby, a następnie przedstawiają nam swój rezultat na monitorze komputera. Jeśli otworzymy plik graficzny (obrazek) w programie do podglądu obrazów, na monitorze komputera wyświetli się odpowiednia interpretacja pliku, którą wygenerował program do podglądu obrazów, jeśli jednak ten sam plik otworzymy programem do podglądu tekstu, (np. notatnik) wtedy każdy bajt pliku zostanie przekształcony na przyporządkowaną mu literę z określonego zakresu od 0 do 255. Jak więc takie programy działają, każdy program to instrukcja, którą wykonuje komputer. Jeśli komputer ma przekształcić bajty na obrazek, jego instrukcja polegałaby na czytaniu trzech bajtów i zamienianiu ich na odpowiedni kolor w palecie barw i połączenie ich w całość. Notatnik pobiera bajty i zamienia je na znaki z poszerzonej tabeli ASCII zwanej ISO, która zawiera wszystkie znaki łacińskie, znaki specjalne i znaki specjalne występujące w regionie wskazanym wcześniej przez użytkownika (np. przy instalacji Windowsa). Aby nasza instrukcja, którą stworzymy, była prawidłowo odczytana, musi być przetłumaczona na język maszynowy, który wykona proces. Zajmuje się tym kompilator i asembler, które są programami tworzącymi kod maszynowy na podstawie kodu źródłowego, z tą różnicą, że kompilatory mogą mieć możliwość automatycznej alokacji pamięci dla zmiennych, implementowania struktur kontrolnych lub procedur wejścia-wyjścia.
Do wykonywania zadań program wykorzystuje zmienne. Zmienne posiadająca trzy podstawowe atrybuty: symboliczną nazwę, miejsce przechowywania i wartość. Utworzenie zmiennej rezerwuje miejsce pamięci lub przestrzeń w pamięci, do przechowywania wartości. Nazywamy ją zmienną, ponieważ, ponieważ informacje przechowywane w tej lokalizacji mogą być zmieniane podczas pracy programu. Aby użyć zmiennej, należy najpierw zadeklarować, podając nazwę i typ danych. Nazwa zmienna, nazywana również identyfikatorem, może zawierać litery, liczby i znaki podkreślenia (_) i muszą zaczynać się literą lub podkreśleniem. Chociaż nazwa zmiennej może zawierać dowolny zestaw liter i cyfr, najlepszym identyfikatorem jest opis danych, które będą zawierać. To bardzo ważne, aby utworzyć jasny, zrozumiały i czytelny kod! Na przykład: „imie” i „nazwisko” to dobre opisowe zmiennej, a „abc” i „xyz” już nie za bardzo.
Typ danych definiuje informacje, które mogą być przechowywane w zmiennej, rozmiar wymaganej pamięci i operacje, które mogą być skuteczne w stosunku do sprawdzonych. Na przykład, aby zapisać wartość całkowitą w zmiennej, użyj słowa kluczowego int:
1 |
int Wiek; |
Powyższy kod nazywamy deklaracją, tworzy zmienną o nazwie „Wiek” typu całkowitego.
Linia kodu, która kończy działanie, nazywa się instrukcją. Każda instrukcja w języku C # musi kończyć się średnikiem.
Podczas deklaracji, można przypisać wartość zmiennej:
1 |
int Wiek = 18; |
lub później:
1 2 |
int myAge; myAge = 18; |
Każda metoda, funkcja lub zdarzenie w C#, wykonywane jest od góry w dół, a więc pamiętaj, że przed użyciem zmiennej należy ją najpierw zadeklarować.
W języku C # znajduje się wiele wbudowanych typów danych.
Typ | Minimum | Maksimum | Opis |
---|---|---|---|
float | -3.4 × 1038 | 3.4 × 1038 | Przechowuje 32-bitowe wartości zmiennoprzecinkowe. |
double | ±5.0 × 10−324 | ±1.7 × 10308 | Przechowuje 64-bitowe wartości zmiennoprzecinkowe. |
char | U+0000 | U+FFFF | Reprezentuje pojedynczy znak Unicodu, czyli literę, cyfrę itp. Wartość tego obiektu jest 16-bitowa |
bool | 0 | 1 | Używany do deklaracji zmiennej przechowującej tylko dwie wartości: prawda (true)(1) lub fałsz (false)(0) |
string | Łańcuch znaków. | ||
int | -2,147,483,648 | 2,147,483,647 | Jest 32-bitowym typem danych. Oznacza rodzaj całkowity, który przechowuje wartości w zależności od rozmiaru i zakresu. |
byte | 0 | 255 | Jeden bajt przechowuje osiem bitów, czyli jest zbiorem permutacji ośmiu jedynek i zer, które można zamienić na liczbę całkowitą z określonego zakresu. |
decimal | (-7.9 x 1028) / (100 do 1028) | (7.9 x 1028) / (100 do 1028) | Jest 128-bitowym typem danych. W porównaniu z innymi typami zmiennoprzecinkowych typ dziesiętny ma większą precyzję i mniejszy zakres, co czyni go odpowiednim do obliczeń finansowych i walutowych. |
enum | Słowo kluczowe enum jest używane do deklarowania wyliczenia, odrębnego typu, który składa się ze zbioru nazw stałych zwanych listą wyliczeniową. | ||
long | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 | Jest 32-bitowym typem danych. Oznacza rodzaj całkowity, który przechowuje wartości w zależności od rozmiaru i zakresu. |
sbyte | -128 | 127 | Jeden bajt przechowuje osiem bitów, czyli jest zbiorem permutacji ośmiu jedynek i zer, które można zamienić na liczbę całkowitą z określonego zakresu. Od byte różni go tylko zakres jaki można osiągnąć wywołując z niego wartość całkowitą. |
short | -32,768 | 32,767 | Jest 16-bitowym typem danych. Oznacza rodzaj całkowity, który przechowuje wartości w zależności od rozmiaru i zakresu. |
struct | Zazwyczaj stosuje się do hermetyzacji małych grup powiązanych zmiennych, takich jak współrzędne prostokąta lub cechy elementu w magazynie. | ||
uint | 0 | 4,294,967,295 | Jest 32-bitowym typem danych. Oznacza rodzaj całkowity, który przechowuje wartości w zależności od rozmiaru i zakresu. |
ulong | 0 | 18,446,744,073,709,551,615 | Jest 32-bitowym typem danych. Oznacza rodzaj całkowity, który przechowuje wartości w zależności od rozmiaru i zakresu. |
ushort | 0 | 65,535 | Jest 16-bitowym typem danych. Oznacza rodzaj całkowity, który przechowuje wartości w zależności od rozmiaru i zakresu. |
Istnieją jeszcze dwa typy danych, o których warto wspomnieć, są to:
Typ | Opis |
---|---|
void | Kiedy jest używany jako typ zwracany dla metody, void określa, że metoda nie zwraca wartości. Void jest również używany w niebezpiecznym kontekście, aby zadeklarować wskaźnik do nieznanego typu. |
var | Począwszy od Visual C # 3.0, zmienne, które są zadeklarowane w zakresie metody, mogą mieć domyślny typ „var”. Niejawnie wpisana zmienna lokalna jest silnie wpisywana tak, jakby zadeklarowała typ samodzielnie, ale kompilator określa typ. |
Kiedy znamy już rodzaje zmiennych i zainstalowaliśmy Visual studio lub SharpDevelop czas utworzyć naszą pierwszą aplikację. Aby to zrobić, w Visual Studio należy wybrać File–>New–>Project, a następnie odszukać na liście „Console Application” tak jak na obrazku poniżej:
Wprowadź nazwę projektu i kliknij OK.
Program sam wygeneruje pewne linijki kodu dla twojego projektu.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MojaPierwszaApka { class Program { static void Main(string[] args) { } } } |
Nauczysz się, co oznaczają w dalszej części kursu. Chwilowo pamiętaj, że każda aplikacja konsoli musi zawierać główną metodę zwaną „Main”. Metoda ta jest punktem startowym każdej aplikacji konsolowej.
Aby uruchomić program, wciśnij Ctrl+F5 co uruchomi program bez debugowania lub rozwiń Debugowanie–>Uruchom bez debugowania. Po uruchomieniu aplikacji zobaczysz efekt:
Jest to okno konsoli. Puki nie mamy żadnych deklaracji w naszej metodzie „Main”, program po prostu wyświetli ogólną wiadomość. Wciśnięcie klawisza spowoduje zamknięcie konsoli. Istnieje możliwość uruchomienia programu z debugowaniem, aby to zrobić, wciśnij F5 lub przycisk z wypełnionym znakiem „play”. Różnica, jaka jest między jedną a drugą opcją, wykracz trochę poza podstawowy zakres nauki, więc jeśli jesteś zainteresowany teraz, czytaj dalej lub wróć tutaj, jak będziesz nią zainteresowany.
Różnica między uruchomieniem programu z debugerem i bez niego
Podczas naciśnięcia klawisza F5 (Start Debugging) w programie Visual Studio uruchamia aplikację, przyłącza Debuger i wykonaj wszystkie „normalne” rzeczy, których można oczekiwać. Co robi debuger, według dokumentacji: https://msdn.microsoft.com/en-us/library/k0k771bt(v=VS.100).aspx
„Program Visual Studio debugger jest potężnym narzędziem, które pozwala obserwować działanie programu w czasie wykonywania i lokalizować błędy logiczne. Debuger współpracuje z wszystkimi językami programowania Visual Studio i ich powiązanymi bibliotekami. Za pomocą debuggera można przerwać lub zawiesić wykonanie swojego programu w celu sprawdzenia kodu, oceny i edycji zmiennych w programie, przeglądania rejestrów, zapoznania się z instrukcjami utworzonymi z Twojego kodu źródłowego oraz zapamiętywania przestrzeni pamięci używanej przez aplikację. ”
Aby sprawdzić działanie debugera, w pewnym kodzie dla kompilacji Release build należy ustawić punkt Breakpoint F9, a następnie nacisnąć klawisz F5, aby sprawdzić, czy zostanie tam zatrzymany:
Oczywiście zostanie, ponieważ debugger jest włączony. Użycie Ctr+F5 pominie Brakepoint. Teraz jest kilka rzeczy, które również się nie zdarzają. Na przykład nie można użyć metod klasy System.Diagnostics.Debug do wysyłania wiadomości do okna Wyjście, ponieważ kompilator usuwa je z wersji Release builds:
Jeśli nie pojawia wam się okno Wyjścia, należy przycisnąć Ctrl+Alt+O. Po uruchomieniu programu, bez debuggowania, dane wyjścia będą puste.
Uruchomienie aplikacji bez włączonego debuggowania spowoduje, że nie będzie on trafiał w punkt przerwania i nie będzie emitował komunikatów debugowania itd. Opcje te przydają się do sprawdzania i analizy poszczególnych elementów kodu krok po kroku, bez konieczności wyświetlania ich w oknie konsoli.
Oczywistym pytaniem jest „Dlaczego?”. Dlaczego mieliby nam dawać tę opcję? Cóż najbardziej oczywistą odpowiedzią jest możliwość uruchomienia aplikacji bez konieczności kłopotania się z punktami przerywania. Aby szybko wykonać test „Smoke Test” i sprawdzić, czy działa. Mogą wystąpić inne przyczyny, dla których chcesz działać bez dołączonego Debuggera.