„Mea Culpa” – Refaktoryzacja C# (TryParse) + IF ELSE
Tak jak mówiłem, C# uczę się razem z wami. Przerabiam książkę: C# 12 w pigułce. Kompendium programisty Joseph Albahari. Książka, ebook – Księgarnia informatyczna Helion oraz kurs na Udemy: https://www.udemy.com/course/c-od-podstaw-dla-poczatkujacych-developerow-net
Okazuje się, że blog try catch, który pokazałem ostatnio działa, a i owszem, ale w c# jest bardzo mało wydajny, i używa się go do czegoś bardziej skomplikowanego niż pobieranie wartości od użytkownika.
Zamiast
try {
liczba = decimal.Parse(tekst);
} catch {
Console.WriteLine("Błąd");
}
Powinniśmy użyć bardzo fajnej, i przyjemniej funkcji TryParse
if (decimal.TryParse(tekst, out liczba)) {
// Udało się, 'liczba' ma wartość
} else {
// Nie udało się, wyświetl komunikat
}
Funkcja przyjmuje co najmniej dwa parametry, wsad, czyli powyżej zmienną tekst pobraną od użytkownika, i gdy się udaje, od razu efekt parsowania ląduje w zmiennej liczna a gdy się nie uda, obsługujemy w bloku else.
Ale ZARAZ!
W lekcji pierwszej pokazywałem if else w formie grafu, ale finalnie w ostatnich kodach, tego nie było!
If else to podstawowy w programowaniu blok podejmowania ścieżki, jaką pójdzie apliakcji. We wszystkich językach programowania wygląda bardzo podobnie.
Jeśli prawda, czyli warunek, który zwraca true to rób coś, a jeśli nie, to rób coś innego. Tak to najłatwiej pokazać.
Python:
imie = 'Jan'
if imie == 'Ala':
print('Ala ma kota')
else:
print('Jan ma psa')

C#:
string imie = "Jan";
if (imie == "Ala")
{
Console.WriteLine("Ala ma kota");
}
else
{
Console.WriteLine("Jan ma psa");
}

Widzisz, proste, jak zawsze python elegancki i zwarty, ale tak jak masz w c# to praktycznie identycznie jest w PHP, JavaScript. Programowanie to myślenie algorytmem, komendy, funkcje, sposób zapisu zawsze możesz sobie sprawdzić, nie sposób wszystkiego zapamiętać, najważniejsze, to zrozumieć, jak to działa.
Koniec z Amnezją
W ramach nauki kolejnych zagadnień, będziemy rozbudowywać naszą aplikacje. Na razie, nasz program odejmował. nie wprowadziliśmy ani opcji dodania przychodu, ani pamięci tego co wprowadzamy. Dziś zaczniemy to zmieniać.
Pierwsze co zrobimy to nowa struktura danych.
Zmienna które już znasz przechowuje zwykłą wartość, np w Pythonie kwota = 120.51 albo w c# decimal kwota – 120.51.
My potrzebujemy przechowywać całą historię, jak na rachunku bankowym. Historię operacji.
Potrzebujemy całej LISTY zmiennych.
Python:
wydatki = []
Bardzo prosto, dlatego ludzie kochają Pythona, w c# ciut trudniej:
using System.Collections.Generic; // na górze trzeba dodać nową bibliotekę
List<decimal> wydatki = new List<decimal>(); // Tworzymy zmienną o typie listy zawierającą zmienne typu decimal
Powinniśmy zgodnie z zasadami powalczyć z podstawowymi strukturami a potem przejść do obiektów, ale zrobimy inaczej, podstawy projektowania obiektowego postaram się wyjaśniać już na następnej lekcji, bo dziś, szczególnie, gdy uczymy się równocześnie c#, który praktycznie jest bardzo obiektowy nie chcę abyście, patrzyli na te konstrukcje, bez zrozumienia.
W skrócie na dziś, mamy tym obiektu List, i w ostrych nawiasach dodajemy typ zmiennych, które będzie przechowywać, potem dodajemy nazwę naszej listy, czyli tu wydatki. Następnie mamy = new List<decimal> czyli tworzymy nowy obiekt Listy. Może to się wydawać masłem maślanym. Takie konstrukty w C# (i nie tylko) są normalne, kompilatory czytają to od końca, i muszą na każdym kroku mieć jasne wytyczne. Więcej pisania niż w pythnie, ale kod pewniejszy, bezpieczniejszy i szybszy. Zawsze jest coś za coś.
Jest jeszcze inna różnica. Lista w pythonie potrafi przechowywać co tylko chcemy, np:
rozne_rzeczy = [23.45, 'Ala ma kota', 23]
Natomiast w C3, tylko dane o wartości zadeklarowanej, jak u nas wyżej wartości decimal.
Elementy listy, w każdym języku programowania jaki znam, numerowane są od zera. Czyli w powyższym przykładzie element 0 to 23.45 a element 1 to ala ma kota.

Dodawanie do listy odbywa się poprzez append w pythonie i Add w c#.
Python:
wydatki = []
wydatek = 123.45
wydatki.append(wydatek)
print(wydatki)

C#:
List<decimal> wydatki = new List<decimal>();
decimal wydatek = 123.45M;
wydatki.Add(wydatek);
Console.WriteLine("Wydatek dodany: " + wydatki);

OH NIE!
W python mamy elegancko pokazaną w princie listę z zawartością, ale znów w C# mamy co innego. Tak, w C# lista się przedstawiła, pokazując, jestem listą z wartościami decimal.
Oczywiście, konieczność drukowania zawartości listy w normalnych programach nie jest potrzebna, natomiast codziennością jest przechodzenie po wszystkich elementach listy i operowanie na nich.
Tu z pomocą przychodzi:
pętla FOR
Trzecia nowa rzecz na dziś (no, prawie nowa, bo w lekcji pierwszej wystąpiła w formie grafu) to pętla for, lub jej wersja foreach.
Jak pamiętacie (a jak nie przeczytajcie jeszcze raz programowanie1) pętla for, służy do przechodzenia po kolei przez wartości.
W Pythonie mamy tylko for, ale w C# mamy for, w tak zwanym przeze mnie starym stylu oraz foreach, które przypomina tę for z pythona.
Zacznę tym razem od C#, od klasycznego for.
Dodajmy do naszej listy wydatki kilka rekordów, i sprawdźmy, ile mamy elementów listy za pomocą metody Count.
List<decimal> wydatki = new List<decimal>();
decimal wydatek = 123.45M;
wydatki.Add(wydatek);
wydatki.Add(45.48M);
wydatki.Add(54.54M);
wydatki.Add(12M);
Console.WriteLine(wydatki.Count);
Wynik to: 4 a indexy to od 0 do 3.
Teraz ważna sprawa, czemu piszę M po liczbie w C# ?
Jak wcześniej pisałem, kompilator czyta od tyłu, co powoduje, że musi alokowac dane w pamięci, zanim dowie się, że dana zmienna jest typem decimal. M to właśnie tak zwany sufix, który mówi mu, to będzie zmienna typu decimal.
A teraz for, klasyczna wersja ma trzy elementy, ustawia zmienną początkową licznika, często uzywamy tu zmiennej i, potem wykonujemy test logiczny, czy pętla dalej ma się wykonywać, a finalnie modyfikujemy zmienną licznika. Poniżej bardzo proste wyjaśnienie (Przy okazji znalazłem coś bardzo do nauki przyjaznego, C# PlayGround | C# Online Compiler | .NET Fiddle na tej stronie możecie pisać prosty kod i go testować. dopóki programujemy proste rzeczy bez użycia plików, to wystarczy do nauki.)
C#
List<decimal> wydatki = new List<decimal>();
wydatki.Add(120.50M);
wydatki.Add(45.00M);
wydatki.Add(12.23M);
wydatki.Add(15.00M);
int ile = wydatki.Count;
for (int i=0; i < ile; i++)
{
Console.WriteLine($"wartość wydatku {i} : {wydatki[i]}");
}

Tłumaczę, deklarujemy naszą listę, dodajemy cztery wydatki, potem pod zmienną ile dodajemy ile jest wierszy / rekordów.
Następnie for ( deklaracja licznika i = 0 czyli pierwszy element listy, wykonuj dopóki i < długości listy, powiększ i o jeden.
Teraz przejdźmy do pythona by na końcu wrócić do c#.
Python:
wydatki = []
wydatki.append(120.50)
wydatki.append(45.00)
wydatki.append(12.23)
wydatki.append(15.00)
for wydatek in wydatki:
print(f"wartość wydatko: {wydatek}")
Postać prosta i elegancja, przejdź przez wszystkie zmienne wydatek w liście wydatki. W tej formie, ciężko wyświetlić numerator, musimy go zadeklarować ręcznie albo użyć specjalnej metody, ale to później. Wersja ze zmienną poniżej:

I wracamy do c#, tutaj mamy do dyspozycji podobną wersję pętli for, a mianowicie foreach – czyli dla każdego.
foreach (decimal wydatek in wydatki)
{
Console.WriteLine($"Kwota: {wydatek}");
}

Widzisz więc, jak wszystko to jest podobne. Mam nadzieję, że w najprostszej postaci pętla for nie jest już dla ciebie zagadką.
Rozbudujmy więc nasz program z poprzedniej lekcji o pamięć zmiennych, i o menu! Tak.
Dziś użyjemy if do obsługi menu naszej aplikacji, i for do operacji na liście naszych wydatków.
Scalamy wiedzę: Monitor Wydatków v2.0 (Z Menu!)
Mamy już wszystkie potrzebne elementy:
- Listy (żeby pamiętać historię).
- Pętle (żeby wyświetlać historię i dokonywać obliczeń).
- If / Else (żeby sterować programem).
Napiszmy program, który nie tylko pyta o wydatki, ale daje użytkownikowi wybór. Zrobimy proste Menu Główne.
Algorytm (Plan działania):
- Uruchom pętlę nieskończoną.
- Wyświetl opcje: 1. Dodaj przychód
2. Dodaj wydatek, 3. Pokaż listę i sumę3. Koniec. - Pobierz wybór użytkownika.
- Jeśli
1-> Pobierz kwotę i dodaj do listy. - Jeśli
2-> Uruchom pętlęFORi wyświetl listę. - Jeśli
3-> Przerwij pętlę (break).
Kod w Pythonie
Zwróć uwagę na elif – to skrót od „Else If” (W przeciwnym razie, jeżeli…).
print("--- MONITOR BUDŻETU v2.0 ---")
historia = [] # Wspólna lista na wszystko
while True: # główna pętla programu
# Menu programu
print("\n--- MENU GŁÓWNE ---")
print("1. Dodaj PRZYCHÓD (+)")
print("2. Dodaj WYDATEK (-)")
print("3. Pokaż bilans i historię")
print("4. Koniec")
wybor = input("Wybierz opcję: ")
if wybor == "1":
# PRZYCHÓD
try:
kwota = float(input("Podaj kwotę przychodu: ").replace(",", "."))
if kwota > 0:
historia.append(kwota) # Dodajemy na plusie
print("Zaksięgowano wpłatę!")
else:
print("Przychód musi być większy od zera.")
except:
print("Błąd! To nie jest liczba.")
elif wybor == "2":
# WYDATEK
try:
kwota = float(input("Podaj kwotę wydatku: ").replace(",", "."))
if kwota > 0:
# TRIK KSIĘGOWEGO: Mnożymy przez -1, żeby zapisać jako dług
historia.append(kwota * -1)
print("Zaksięgowano wydatek!")
else:
print("Kwota wydatku musi być dodatnia.")
except:
print("Błąd! To nie jest liczba.")
elif wybor == "3":
# BILANS
print("\n--- HISTORIA OPERACJI ---")
suma = 0
licznik = 1
for operacja in historia:
# Sprawdzamy czy to przychód czy wydatek, żeby ładnie wyświetlić
typ = "Wpływ"
if operacja < 0:
typ = "Wydatek"
print(f"{licznik}. {typ}: {operacja} zł")
suma += operacja # Dodajemy (plus z minusem się odejmie)
licznik += 1
print(f"---------------------------")
print(f"AKTUALNE SALDO: {suma:.2f} zł")
elif wybor == "4":
print("Koniec pracy. Do zobaczenia!")
break
else:
print("Nie ma takiej opcji.")

Oczywiście, można by to ulepszyć na wiele sposobów, ale nie wszystko na raz.
Przybornik Python – Nowości z Lekcji 3
W tej lekcji nauczyliśmy program pamiętać i podejmować więcej niż jedną decyzję. Oto narzędzia, których użyliśmy:
| Komenda / Symbol | Co to robi? | Przykład „z życia” |
[] (Puste nawiasy) | Tworzy nową, pustą listę. | Kupujesz pusty segregator, w którym będziesz trzymać dokumenty. |
.append(wartość) | Dodaje nowy element na koniec listy. | Wpinasz nową koszulkę z dokumentem na koniec segregatora. |
for x in lista: | Pętla, która przechodzi przez każdy element listy po kolei. | Przeglądasz segregator kartka po kartce. |
elif | Skrót od „Else If” (W przeciwnym razie, jeżeli…). Pozwala sprawdzić kolejny warunek, jeśli poprzedni nie zadziałał. | „Nie masz chleba? (if) To daj bułki. (elif)” |
:.2f | Formatowanie tekstu (np. f"{kwota:.2f}"). Wyświetla liczbę z dokładnie dwoma miejscami po przecinku. | Kosmetyczka dla liczb. Sprawia, że 5 wygląda jak profesjonalne 5.00. |
* -1 | Mnożenie przez minus jeden. Zamienia liczbę dodatnią na ujemną (i odwrotnie). | Trik księgowego. Zamienia „Zysk” na „Dług”. |
Czas na C#
c#
using System;
using System.Collections.Generic;
using System.Globalization;
class Program
{
static void Main()
{
Console.WriteLine("--- MONITOR BUDŻETU v3.0 (C#) ---");
List<decimal> historia = new List<decimal>();
while (true)
{
Console.WriteLine("\n--- MENU GŁÓWNE ---");
Console.WriteLine("1. Dodaj PRZYCHÓD (+)");
Console.WriteLine("2. Dodaj WYDATEK (-)");
Console.WriteLine("3. Pokaż bilans i historię");
Console.WriteLine("4. Koniec");
Console.Write("Twój wybór: ");
string wybor = Console.ReadLine();
if (wybor == "1") // PRZYCHÓD
{
Console.Write("Podaj kwotę przychodu: ");
string tekst = Console.ReadLine();
if (decimal.TryParse(tekst.Replace(",", "."), NumberStyles.Any, CultureInfo.InvariantCulture, out decimal kwota))
{
if (kwota > 0)
{
historia.Add(kwota); // Dodajemy normalnie
Console.WriteLine("Zaksięgowano wpłatę!");
}
else Console.WriteLine("Kwota musi być dodatnia!");
}
else Console.WriteLine("To nie jest liczba.");
}
else if (wybor == "2") // WYDATEK
{
Console.Write("Podaj kwotę wydatku: ");
string tekst = Console.ReadLine();
if (decimal.TryParse(tekst.Replace(",", "."), NumberStyles.Any, CultureInfo.InvariantCulture, out decimal kwota))
{
if (kwota > 0)
{
// TRIK: Zmieniamy na minus
historia.Add(kwota * -1);
Console.WriteLine("Zaksięgowano wydatek!");
}
else Console.WriteLine("Kwota musi być dodatnia!");
}
else Console.WriteLine("To nie jest liczba.");
}
else if (wybor == "3") // LISTA
{
Console.WriteLine("\n--- HISTORIA OPERACJI ---");
decimal suma = 0;
int licznik = 1;
foreach (decimal operacja in historia)
{
// Mały dodatek logiczny dla czytelności (operator trójargumentowy - opcja dla chętnych)
// Jeśli operacja > 0 to napisz "Wpływ", jeśli nie to "Wydatek"
string typ = (operacja > 0) ? "Wpływ" : "Wydatek";
Console.WriteLine($"{licznik}. {typ}: {operacja} zł");
suma += operacja;
licznik++;
}
Console.WriteLine("---------------------------");
Console.WriteLine($"AKTUALNE SALDO: {suma} zł");
}
else if (wybor == "4")
{
Console.WriteLine("Koniec programu.");
break;
}
else
{
Console.WriteLine("Nieznana opcja.");
}
}
}
}

Przybornik C# – Nowości z Lekcji 3
W C# doszło sporo nowych „zaklęć”, głównie związanych z bezpieczeństwem typów i listami.
| Komenda / Słowo kluczowe | Co to robi? | Wyjaśnienie |
List<typ> | Deklaracja listy, która może przechowywać tylko jeden konkretny rodzaj danych (np. List<decimal>). | Szuflada z naklejką „Tylko Skarpetki”. Nie wrzucisz tam koszulki (stringa). |
.Add(wartość) | Dodaje element do listy. | Odpowiednik pythonowego .append(). |
.Count | Zwraca liczbę elementów w liście. | Liczy, ile masz skarpetek w szufladzie. |
foreach (typ x in lista) | Pętla „Dla Każdego”. Przechodzi przez listę bez używania liczników. | Najprostszy sposób na wyświetlenie całej listy. Odpowiednik pythonowego for. |
for (int i=0; i<...; i++) | Klasyczna pętla z licznikiem i. | Pętla dla kontrolerów jakości. Używasz, gdy musisz znać numer (indeks) każdego elementu. |
else if | To samo co elif w Pythonie. Kolejny warunek w łańcuszku decyzyjnym. | Uwaga: w C# piszemy to rozdzielnie (dwa słowa)! |
decimal.TryParse(...) | Bezpieczna próba zamiany tekstu na liczbę. Zwraca true lub false. | Kulturalny bramkarz. Zamiast wyrzucić Cię z klubu (błąd programu), grzecznie informuje, czy możesz wejść. |
out zmienna | Słowo kluczowe używane przy TryParse. Mówi: „Jeśli ci się uda, wrzuć wynik TUTAJ”. | Podstawienie wiaderka, do którego wpadnie wynik, jeśli operacja się uda. |
Na zakończenie
Zadanie domowe to zabawa tym co już znacie, spróbujcie przerobić lekcje, a potem napisać coś w tym styku ale z innym tematem, może własna wersja librusa? Notujcie oceny z różnych przedmiotów swoje na studiach lub dzieci, a w raporcie wyciągajcie średnią?
Powodzenia i do zobaczenia za tydzień.
Proszę też o komentarze, czy ten kurs idzie dobrym tempem, i strukturą.

0 komentarzy