Koncepcje programowania/Zmienne

Z Wikibooks, biblioteki wolnych podręczników.

Zmienne[edytuj]

Zmienna w obliczeniach to nazwany fragment danych, który może zawierać różne wartości. Zmienne są używane w językach programowania do przechowywania informacji, które mogą być używane i manipulowane na różne sposoby.

Na przykład wyobraź sobie, że piszesz program do obliczania średniej zbioru liczb. W tym programie możesz użyć zmiennej do przechowywania sumy liczb, a następnie możesz użyć innej zmiennej do przechowywania liczby liczb w zbiorze. Zmienne te umożliwiłyby użycie tych samych wartości w różnych częściach programu, a także zmianę wartości zmiennych w razie potrzeby w celu wykonania różnych obliczeń.

Tak, jak nasz świat składa się z atomów, tak świat komputerów składa się z informacji. I każdy program potrzebuje sposobu na ich przechowywanie. Na przykład, program który mnoży dwie liczby, więc potrzebuje przechować 3 różne elementy: pierwszą liczbę, drugą liczbę oraz wynik mnożenia. I do tego właśnie służą zmienne. Zmienna jest swego rodzaju pojemnikiem, miejscem w pamięci komputera, które zostało odpowiednio nazwane i przechowuje jakąś wartość. Jest zmienną ponieważ może zmieniać swoją wartość. Jak na przykład gra, która może przechowywać nasz aktualny wynik (score).

do utworzenia zmiennej może być potrzebne słowo kluczowe, jak np. w języku JavaScript:

var x;

i spacja w środku jest obowiązkowa. Zauważ też że nie mamy tu przypisanej zmiennej, bo nie jest potrzebna, słowo kluczowe w tym wypadku mówi komputerowi, że to jest zmienna.

Tymczasem, w językach nie opartych o C, jak Python, zmienne są deklarowane w sposób niejawny. Przypisanie zmiennej w Pythonie wartości jest równoznaczne z jej utworzeniem.

Wymyślmy jakiś pojemnik o nazwie x. Możemy w nim coś schować - na przykład liczbę 98. Gdybyśmy mielibyśmy to zapisać w Pythonie, użylibyśmy polecenia x = 98 co oznacza, że stworzyliśmy zmienną o nazwie x, której nadaliśmy wartość 98.

x = 98

spacje nie są potrzebne ale zostały dla zachowania czytelności.

Aby utworzyć zmienną w Emacs Lisp, użyj funkcji setq. Ta funkcja przyjmuje dwa argumenty: nazwę zmiennej i wartość, którą chcesz przypisać zmiennej. Na przykład:

(setq x 10)

Istnieją także reguły co do tworzenia nazw zmiennych. W Pythonie:

  • nazwy zmiennej mogą być dowolnej długości.
  • Mogą one zawierać litery i cyfry, ale muszą się rozpoczynać od litery lub podkreślenia (_).
  • Można stosować duże litery, natomiast pamiętaj że X i x, będą różnymi zmiennymi. Zostanie to omówione dokładniej pod koniec rozdziału.

Prawidłowe nazwy zmiennych:

name = 2
jid = 2
score = 2
OrderNumber = 2
a;

Czego natomiast nie wolno robić?

  • Zmienna w swej nazwie nigdy nie może zawierać spacji. - można zamiast nich, użyć znaku podkreślenia który może nam ją zastąpić.
  • Używać jakichkolwiek nazw ze zbioru słów zastrzeżonych języka programowania którym się posługujesz. Zbiór ten zawiera operatory, które stanowią reguły składniowe i strukturę języka przez co nie mogą być używane jako zmienne.
  • Znaków specjalnych (jak wykrzykniki, znaki dolara czy inne znaki procentów)

Nieprawidłowe nazwy zmiennych:

%name!; = 2
log in = 2
100kolumn = 2
class = 2

Początkujący programiści często mylą pojęcia -zrozumiałe dla człowieka- z -zrozumiałe dla komputera-. Skutkuje to błędnie interpretowanymi znaczeniami zmiennej, tzn. średnia nie jest utożsamiana w żaden sposób z działaniem matematycznym o tej nazwie, a zmienna o nazwie pi, nie oznacza że posiada wartość 3.14159. Komputer w żaden sposób nie przydziela znaczeń semantycznych do zmiennych.

Typowanie silne i słabe[edytuj]

Zmienne mogą przechowywać dane rożnego typu. Przykłady:

  • Integer - liczby całkowite
  • Float - liczby zmiennoprzecinkowe
  • String - ciągi znaków
  • Boolean - wartości typu prawda/fałsz

silne typowanie i słabe typowanie odnoszą się do sposobu, w jaki język programowania obsługuje typy danych. Język programowania z silnym typowaniem pozwoli na wykonywanie operacji na danych tylko wtedy, gdy dane mają właściwy typ, podczas gdy język ze słabym typowaniem pozwoli na wykonywanie operacji na danych, nawet jeśli dane nie mają prawidłowego typu.

Typowanie silne - Musisz z góry wiedzieć jakiego typu wartości będzie przechowywać zmienna. Czyli nie wystarczy podać nazwy dla tej zmiennej, trzeba jeszcze określić jakiego typu dane ta zmienna będzie mogła przechowywać. Każde wyrażenie ma ustalony typ i nie można go używać w kontekście przeznaczonym dla innych typów.

Przykład w języku Python:

# This code will raise a TypeError, because you cannot concatenate
# an integer and a string without first converting the integer to a string
x = 10
y = "hello"
z = x + y

Nie da się tego później zmienić, nie można przypisać niewłaściwego typu danych do zmiennej. Nie możesz na przykład przypisać zmiennej która przechowuje wartości prawda/fałsz do zmiennej która przechowuje liczby i tym podobne. Jest to wymuszone, jeśli jest zmienna typu tekst, to tylko tekst może być w nim przechowywany.

Typowanie słabe - każda zmienna może przyjąć wartość dowolnego typu. Czyli wystarczy podać jej nazwę, nie musisz deklarować jakiego typu wartości ma zamiar przechowywać. Czyli może to być najpierw liczba, do tej samej zmiennej możesz przypisać później tekst i tak dalej. Czyli koncepcja całkiem podobna do zmiennych, gdzie jedna zmienna może przechowywać wiele różnych wartości, tak w typowaniu słabym, każda zmienna może przechowywać wiele rożnych typów. Nie masz co prawda wówczas pewności że wartość zmiennej jest właściwego typu ale można łatwo to naprawić, stosując specjalny operator porównania, który sprawdza czy oba argumenty są tego samego typu i mają tę samą wartość.

Przykład w języku JavaScript:

var x = 1;
if ("1" == x) {
  // mimo porównywania z tekstem, warunek jest prawdziwy, ponieważ liczba jest rzutowana na typ string
}

jeśli piszesz ten sam program w słabo typowanym języku, program pozwoli ci dodać liczby, nawet jeśli nie są tego samego typu. W takim przypadku program automatycznie przekonwertuje jedną z liczb na ten sam typ co druga i poda wynik dodawania. Jednak wynik dodania może nie być zgodny z oczekiwaniami, ponieważ konwersja typu danych może nie zostać przeprowadzona poprawnie.

Ogólnie rzecz biorąc, silne typowanie jest uważane za lepszy sposób obsługi typów danych w języku programowania, ponieważ pomaga zapobiegać błędom i zapewnia, że programy dają poprawne wyniki. Jednak słabe typowanie może być przydatne w przypadku niektórych typów programów lub zadań, ponieważ zapewnia większą elastyczność i może przyspieszyć i ułatwić proces programowania.

typowanie statyczne i typowanie dynamiczne odnosi się do sposobu, w jaki język programowania obsługuje typy danych. Język programowania ze statycznym typowaniem wymaga określenia typu danych zmiennej podczas jej deklarowania, podczas gdy język z dynamicznym typowaniem nie wymaga określania typu danych.

Typowanie statyczne - Na przykład wyobraź sobie, że piszesz program w języku o typie statycznym i chcesz utworzyć zmienną do przechowywania liczby. W takim przypadku musisz określić typ danych zmiennej (na przykład „liczba całkowita” lub „dziesiętna”) podczas jej deklarowania. Poinformowałoby to program, jakie dane może przechowywać zmienna, i zapobiegłoby przechowywaniu w zmiennej wartości niewłaściwego typu danych.

Przykład w języku C++

int i = 42;
i = "test";

Kompilator zwróci błąd, ponieważ wcześniej zdefiniowali do zmiennej liczbę a potem chcieli do tej samej zmiennej przypisać tekst.

Python nie posiada mechanizmu typowania statycznego wbudowanego w język, ale istnieją pewne rozszerzenia języka, takie jak mypy, które pozwalają na dodanie tej funkcjonalności do kodu Python. Typowanie statyczne polega na jawnym określeniu typów danych, które są używane w kodzie, co pozwala na wykrywanie błędów w czasie kompilacji zamiast w czasie wykonywania programu.

Poniżej znajduje się przykład kodu z typowaniem statycznym w Pythonie:

def greet(name: str) -> str:
  return "Hello, " + name

print(greet("Alice")) # wyświetli "Hello, Alice"

W tym przykładzie funkcja greet() jest zadeklarowana z informacjami o typie dla jej argumentu name i wartości zwracanej. W rezultacie, jeśli kod zostanie skompilowany przy użyciu narzędzia mypy, to wykryje on błąd, jeśli greet() zostanie wywołane z argumentem innego typu niż ciąg znaków.

JavaScript jest językiem o dynamicznym typowaniu, co oznacza, że nie trzeba określać typu danych zmiennej podczas jej deklarowania. Typ zmiennej jest określany automatycznie na podstawie przypisanej jej wartości.

Istnieją jednak sposoby na dodanie pewnego poziomu sprawdzania typu do kodu JavaScript. Jedną z opcji jest użycie biblioteki do sprawdzania typu, takiej jak TypeScript lub Flow. Te narzędzia dodają do kodu warstwę adnotacji typu, którą można następnie sprawdzić w czasie wykonywania, aby upewnić się, że zmienne są używane poprawnie.

Na przykład, oto jak możesz zadeklarować zmienną określonego typu w TypeScript:

let myString: string = "Hello, world!";

W tym przypadku notacja : string po nazwie zmiennej wskazuje, że zmienna myString jest typu string. Jeśli spróbujesz przypisać tej zmiennej wartość inną niż łańcuch, narzędzie do sprawdzania typu oznaczy ją jako błąd.

Korzystanie z narzędzia do sprawdzania typu może pomóc wcześnie wykryć błędy i sprawić, że kod będzie bardziej przewidywalny i łatwiejszy w obsłudze. Warto jednak zauważyć, że sprawdzanie typu w JavaScript jest opcjonalne i nie jest wbudowane w sam język.

Typowanie dynamiczne - jeśli piszesz ten sam program w języku o typie dynamicznym, nie musisz określać typu danych zmiennej podczas jej deklarowania. W takim przypadku program automatycznie ustali typ danych zmiennej na podstawie wartości, którą w niej przechowujesz. Na przykład, jeśli zapiszesz w zmiennej liczbę 10, program automatycznie potraktuje zmienną jako liczbę całkowitą.

Język Python czy emacs lisp jest silnie, dynamicznie typowany. Co oznacza dynamicznie? Oznacza to, że obiekty (wartości) środowiska wykonawczego mają typ, w przeciwieństwie do typowania statycznego, w którym zmienne mają typ. Innymi słowy chociaż zmienna nie może przyjąć wartości dowolnego typu, to może je zmieniać w trakcie wykonywania programu. Przykład:

x = 2
x = -2
x = 100
x = 3.16
print(x)

Python nie wyrzuci komunikatu błędu tak jak to było w C++, mimo faktu że pomieszali liczby całkowite z liczbą zmiennoprzecinkową. Natomiast, dlaczego po jego wykonaniu pojawia się 3.16? Jest to wartość zmiennej x która znajduje się na końcu. W programach zawsze wszystko wykonuje się od początku, do końca, od góry do dołu, więc Python pokaże najświeższą wartość zmiennej.

Stałe[edytuj]

Być może nie każdemu będzie się podobać takie zachowywanie się języka. Co jeśli chcemy żeby zmienna nie zmieniała swojej wartości? Tutaj wchodzą tzw. stałe. W przypadku zmiennych (jak sama nazwa wskazuje), wartości mogą się zmieniać podczas działania programu. Gdy tworzymy stałą, musimy jej nadać wartość początkową, która przez cały okres działania programu nie może zmienić swojej wartości.

Stałe w JavaScript możesz stworzyć za pomocą słowa kluczowego const. Pozostała składnia jest taka sama jak w przypadku zmiennych, wszystkie zasady, które obowiązywały w przypadku tworzenia zmiennych, obowiązują również przy tworzeniu stałych.

W JavaScript słowo kluczowe const służy do deklarowania zmiennej stałej. Zmienna stała to zmienna, której po zadeklarowaniu nie można ponownie przypisać nowej wartości.

Na przykład, oto jak możesz użyć słowa kluczowego const do zadeklarowania stałej zmiennej w JavaScript:

const myVariable = "Hello, world!";

W tym przypadku zmienna myVariable jest zadeklarowana jako stała i jest inicjowana wartością ciągu znaków „Witaj, świecie!”. Po zadeklarowaniu tej zmiennej nie można ponownie przypisać jej nowej wartości.

Oto przykład tego, co się stanie, jeśli spróbujesz ponownie przypisać nową wartość do zmiennej stałej:

const myVariable = "Hello, world!";
myVariable = "Goodbye, world!"; // this will throw an error

W tym przypadku zmienna myVariable jest zadeklarowana jako stała i jest inicjowana wartością ciągu znaków „Witaj, świecie!”. Jednak przy próbie ponownego przypisania nowej wartości do zmiennej myVariable zgłaszany jest błąd, ponieważ nie można ponownie przypisać nowej wartości do zmiennej stałej.

Użycie słowa kluczowego const może pomóc w uniknięciu przypadkowego ponownego przypisania wartości do zmiennych, co może sprawić, że kod będzie bardziej przewidywalny i łatwiejszy w obsłudze. Warto jednak zauważyć, że nadal możesz zmieniać właściwości obiektu zadeklarowanego jako const, nawet jeśli nie możesz ponownie przypisać samego obiektu.

Python nie posiada funkcji deklarowania stałych - istnieje kilka obejść tego problemu - użycie krotek:

krotka = (x)

Innym sposobem jest przypisanie wartości do zmiennej i nadanie jej atrybutu __const__. Poniżej znajduje się przykład takiego sposobu tworzenia stałej:

PI = 3.14

def set_const(name, value):
  setattr(name, "__const__", True)
  setattr(name, "value", value)

set_const(PI, 3.14)

W tym przykładzie stała PI jest zadeklarowana jako zmienna i następnie przypisana wartość 3.14. Następnie do tej zmiennej zostają dodane atrybuty __const__ i value, co oznacza, że jest to stała i jej wartość nie może być zmieniona.

String[edytuj]

Dane które w programowaniu określa się jako string (łańcuchy znaków). Przykład:

'Hello world'

Często używa się także cudzysłowów, można się także spotkać z apostrofami jak w powyższym przykładzie - w przypadku Pythona, obie metody są jak najbardziej poprawne, ale może się zdarzyć iż konkretne języki programowania mogą wymagać tylko apostrofu bądź tylko cudzysłowu. Ale nigdy nie wolno tego stosować mieszając jeden z drugim, czyli dając apostrof na końcu i cudzysłów na końcu lub odwrotnie, trzeba używać ich konsekwentnie.

Stringi, posiadają także swoje właściwości. Przykład:

len("Programowanie komputerów")

Wypisze, ile znaków posiada ww. string, w tym wypadku 24.

Operatory[edytuj]

Operatory to specjalne konstrukcje które pozwalają wprowadzić jakieś zmiany do zmiennej. Jeśli dotrwałeś do tego momentu to jeden z nich już dobrze znasz, czyli Operator przypisania

liczba = 20

Jest to chyba najczęściej wykorzystywany operator w programowaniu. Za jego pomocą, jak sama nazwa wskazuje, przypisujemy (wrzucamy) jakąś wartość do zmiennej. W powyższym przykładzie, mamy zmienną "liczba" i za pomocą znaku równości, pozwala wstawić liczbę bądź inną wartość jakiej potrzebujemy.

Operatory arytmetyczne:

OPERATOR OPIS UŻYCIE
+ Suma, symbol dodatni x + y
- Różnica, symbol ujemny x - y
* Iloczyn x * y
/ Iloraz x / y
% Modulo - reszta z dzielenia x % y
// Dzielenie całkowite x // y
** Potęga x ** y

Przykład w języku Python:

a = 3
b = 5
print(a + b)

Oczywiście, kolejność wykonywania działań obowiązuje zgodnie z obecną konwencją matematyczną.

Kombinowane operatory:

Zwiększanie wartości zmiennej:

liczba = liczba + 10

lub

number += 10

Rezultat będzie dokładnie taki sam, do bieżącej wartości zmiennej "liczba", dodajemy wartość 10. Jedyna różnica jest taka że jest to zapis w bardziej skróconej formie.

Operatory inkrementacji i dekrementacji

x++
x--

Nie robią nic innego jak zwiększanie, bądź zmniejszanie wartości o 1. Bardzo często przydatny operator wykorzystywany w programowaniu. Wyobraź sobie np. człowieka grającego w grę który przechodzi kolejne poziomy gry albo zużywającą się amunicję. Python w którym pracujemy, niestety go nie posiada, więc musisz użyć wcześniej wymienionego, operatora kombinowanego += 1 bądź -= 1. Z kolei w JavaScipt, ww. operator jak najbardziej istnieje. Mała uwaga: x w nazwie, nie jest częścią operatorów inkrementacji i dekrementacji, to nazwa zmiennej, ale został tu podany by móc łatwo zrozumieć, w jaki sposób się go wstawia do programu. Po prostu do zmiennej którą chcemy zwiększyć bądź zmniejszyć o 1, dodajemy bez odstępów, dwa plusy bądź dwa minusy, dwie poziome kreski.

Białe znaki[edytuj]

Każdy tekst, ma jakieś odstępy i to są właśnie te białe znaki, jak np. spacje, tabulatory, przejście do nowej linii, innymi słowy takie znaki, których nie widać.

Odstępy pomiędzy liniami, w większości języków programowania nie będą stanowiły problemu, zarówno w JavaScript i Python. Możesz sobie wstawić z 5-10 odstępów i taki kod zadziała prawidłowo. Odstępy w pionie, te dodatkowe linie, nie będą miały znaczenia, one tylko mogą zmniejszyć czytelność kodu czyli będą miały wpływ na nas, nie na komputer.

W przypadku JavaScript można te odstępy, zlikwidować. Na przykład zamiast napisać kod w ten sposób:

var x = 1;
var y = 2;
var z = 3;

napisać go tak:

var x = 1; var y = 2; var z = 3;

I to też nie będzie miało wpływu na działanie programu. Wyjątkiem jest tu Python. Dlaczego? Jak już wspominałem na wstępie, w poprzednim rozdziale, znacznik ; nie jest w nim wymagany. Python do kończenia polecenia używa właśnie białego znaku - przejścia wiersza do nowej linii. Dlatego tam nie można czegoś takiego zrobić. Skutkiem ubocznym jest oczywiście wymuszenie ładnego formatowania kodu, co jest bardzo dobre dla nas, programistów.

Teraz odstępy w poziomie czyli spacje. Na przykład tutaj:

x = 2

mamy zmienną, operator przypisania oraz wartość. Spacje pomiędzy znakami znaku równości nie mają znaczenia, zarówno w JavaScript i Python.

Natomiast, jeśli używamy słów kluczowych, takich jak class w python albo var w javascript i nie wstawimy tam spacji, to taki kod nie będzie działał prawidłowo. Bo zarówno python jak i JavaScript, nie będzie wiedział co to znaczy classx albo varx. Nie można tego odstępu zlikwidować. Analogicznie w sytuacji wstawiania spacji w słowie kluczowym var bądź class. W obu językach, żadna odmiana tych słów nie będzie poprawnie interpretowana. Analogicznie z operatorami kombinowanymi jak operatory inkrementacji bądź mniejszości (>=). Tam też nie wolno wstawić spacji, bo wtedy nie będzie już kombinowanym operatorem tylko dwiema zupełnie różnymi operatorami.

Jeśli chcielibyśmy wstawić białe znaki na początku jakiegoś polecenia, interpreter JavaScript nie będzie miał z nimi problemów, natomiast w języku Python pełnią kluczową rolę do implementacji dużo bardziej skomplikowanych koncepcji jak np. Pętli które zostaną omówione w kolejnych rozdziałach tego podręcznika.

Wielkość liter w nazwach[edytuj]

Wielkość liter w zmiennych, ma znaczenie, zarówno w języku Python jak i JavaScript. Bardzo prosty przykład:

name = "Programowanie"
print(Name);

Taki program nie będzie działał, interpreter zgłosi błąd o nieznanej zmiennej.

Zadania[edytuj]

Praktyka czyni mistrza. Dlatego po poznaniu podstawowych informacji o właściwościach języków możemy już podjąć się pracy samodzielnej, która będzie polegała na rozwiązaniu kilku matematycznych zadań.

  1. Zadanie - Napisz program,, który oblicza logarytm naturalny podanej na wejściu danych liczby
  2. Zadanie - Napisz program, który oblicza pole koła o podanych na wejściu danych promieniu.
  3. Zadanie - Napisz program, który oblicza pole prostokąta. Wartości boków a i b są typu float i należy je wyprowadzić z klawiatury. Wynik działania programu należy wyprowadzić na ekran komputera.
  4. Zadanie - Napisz program, który wyświetla na ekranie komputera wartość predefiniowanej stałej pi = 3.14... Naley przyjąć format wyświetlania tej stałej z dokładnością do trzech miejsc po przecinku
  5. Zadanie - Napisz program, który wyświetla na ekranie komputera pierwiastek kwadratowy z wartości predefiniowanej pi = 3.14 z dokładnością do czterech miejsc po przecinku
  6. Zadanie - Napisz program, który oblicza resztę z dzielenia całkowitego dwóch liczb całkowitych a = 37 i b = 11
  7. Zadanie - Napisz program, w który generuje 5 liczb pseudolosowych z przedziału od 1 do 100