{<Z Kordian Zadrożny

AI, Strony WWW, Programowanie, Bazy danych

Kurs programowania od zera, lekcja: 4B: C# Dogania Pythona (Klasy, Obiekty i Listy Rekordów)

utworzone przez | gru 14, 2025 | kurs programowania | 0 komentarzy

W poprzedniej lekcji (4A) zrobiliśmy w Pythonie razem duży krok naprzód, użyliśmy Słowników, żeby łączyć opis wydatku z jego kwotą. Zakończyliśmy teorią o Obiektach.

Dziś wchodzimy w świat C#, gdzie te obiekty są fundamentem wszystkiego. A na deser? Pokażemy, jak zrobić to samo w Pythonie, żebyś zobaczył/a, że te języki wcale tak bardzo się od siebie nie różnią.

Krok 1: Tworzymy podstawową Klasę w C#

W Pythonie słownik tworzyliśmy „w locie”. W C# musimy najpierw zdefiniować, jak wygląda nasza dana. Musimy stworzyć projekt.

Stwórz nowy projekt w Visual Studio ( może to być czas żeby zainstalować visual studio community, które do pisania kodu i kompilowania jest wygodniejsze niż vscode: https://visualstudio.microsoft.com/pl/thank-you-downloading-visual-studio/?sku=Community&channel=Stable&version=VS18&source=VSLandingPage&passive=false&cid=2500 ) / VS Code.

Stworzysz pierwsza świadomą klasę w twoim programie, do tej pory widziałeś taki podstawowy blok:

Teraz po using a przed klasą program dodasz swoją foremkę.

public class Transakcja
{    
    public string Opis { get; set; }
    public decimal Kwota { get; set; }
    public string Typ { get; set; } 
}

Co tu się stało?

  1. public class Transakcja: Ogłaszamy światu: „Hej, od teraz istnieje nowy typ danych o nazwie Transakcja!”.
  2. public string Opis { get; set; }: Każda transakcja musi mieć opis, który jest tekstem. To samo Kwota w formacie zmiennoprzecinkowym i Typ transakcji. oznaczenia get; set; to skrótowa informacja, że dane tej zmiennej mogą być pobierane i ustawiane.
  3. Brak możliwości pomyłki: Jeśli spróbujesz wpisać liczbę do Opis, C# nie pozwoli Ci nawet uruchomić programu. To jest ta słynna „kontrola typów”.

Krok 2: Tworzenie Obiektów czyli Wypiekamy Pierniczki 😉

Skoro mamy klasę, stwórzmy obiekt, czyli mamy juz foremke, upieczmy ciasteczko. W funkcji Main (tam gdzie zawsze piszemy kod), tworzenie obiektu wygląda tak:


 Transakcja t1 = new Transakcja();
 t1.Opis = "Pensja";
 t1.Kwota = 5000;
 t1.Typ = "Wpływ";

 Transakcja t2 = new Transakcja
 {
     Opis = "Biedronka",
     Kwota = -50,
     Typ = "Wydatek"
 };
 
 Console.WriteLine($"Opis: {t1.Opis}, Kwota: {t1.Kwota}, Typ: {t1.Typ}");
 Console.WriteLine($"Opis: {t2.Opis}, Kwota: {t2.Kwota}, Typ: {t2.Typ}");

Teraz dokładnie to wyjaśnię jeszcze raz. To co widzisz powyżej, czyli definicja klasy public class Transakcja ora utworzenie obiektu Transakcja t1 = new Transakcja(); to podstawy współczesnego programowania w najprostszej wersji.

Klasa zawiera właściwości, czyli takie wewnętrzne zmienne. poza tym, klasy mogą mieć metody, czyli wewnętrzne funkcje. Specjalną wersją metody jest konstruktor, czyli taka metoda, która tworzy dane w obiekcie na podstawie przekazanych przez program zmiennych. Najczęściej zmienne, nie będą w klasach public a private, czyli będą odizolowane od reszty kodu, a dostęp do nich, będzie realizowany tylko przez metody. Ale to później, najpierw przywyknij do tego co tu się dzieje.

Krok 3: Lista Obiektów (To, na co czekaliśmy)

Pamiętasz List<decimal>? Była fajna, ale trzymała tylko liczby. Teraz zrobimy listę naszych nowych, wypasionych obiektów.

List<Transakcja> historia = new List<Transakcja>(); // Tworzymy zmeinną historia przechowująca listę obiektów typu Transakcja

historia.Add(t1); // dodajemy obiekt do listy
historia.Add(t2);
foreach (Transakcja t in historia) // iterujemy po elementach listy
{
    Console.WriteLine($"Opis: {t.Opis}, Kwota: {t.Kwota}, Typ: {t.Typ}");
}

Krok 4: C# Monitor Budżetu v4.0 (Kod Programu)

Złóżmy to w całość. Użyjemy List<Transakcja>, pętli foreach i instrukcji switch (która jest bliźniakiem pythonowego match case).

using System;
using System.Collections.Generic; // Niezbędne do List
using System.Globalization;

// Nasza Klasa (Foremka)
public class Transakcja
{
    public string Opis { get; set; }
    public decimal Kwota { get; set; }
    public string Typ { get; set; }
}

class Program
{
    static void Main()
    {
        Console.WriteLine("--- MONITOR BUDŻETU v4.0 (Obiekty) ---");

        // Lista przechowująca nasze obiekty
        List<Transakcja> historia = new List<Transakcja>();

        while (true)
        {
            Console.WriteLine("\n1. Dodaj PRZYCHÓD");
            Console.WriteLine("2. Dodaj WYDATEK");
            Console.WriteLine("3. Pokaż Historię");
            Console.WriteLine("4. Koniec");
            Console.Write("Wybierz: ");
            
            string wybor = Console.ReadLine();

            // SWITCH - odpowiednik Pythonowego MATCH CASE
            switch (wybor)
            {
                case "1":
                    DodajTransakcje(historia, "Przychód");
                    break;
                case "2":
                    DodajTransakcje(historia, "Wydatek");
                    break;
                case "3":
                    PokazHistorie(historia);
                    break;
                case "4":
                    return; // Wyjście z programu
                default:
                    Console.WriteLine("Nieznana opcja.");
                    break;
            }
        }
    }

    // METODA (Funkcja w C#)
    // Zauważ: Przekazujemy listę jako parametr!
    static void DodajTransakcje(List<Transakcja> bazaDanych, string typ)
    {
        Console.Write($"Podaj opis ({typ}): ");
        string opis = Console.ReadLine();

        Console.Write("Podaj kwotę: ");
        string tekstKwota = Console.ReadLine();

        if (decimal.TryParse(tekstKwota.Replace(",", "."), NumberStyles.Any, CultureInfo.InvariantCulture, out decimal kwota))
        {
            if (kwota <= 0) 
            {
                Console.WriteLine("Kwota musi być dodatnia!");
                return;
            }

            // Trik księgowego (minus dla wydatków)
            decimal finalnaKwota = (typ == "Wydatek") ? kwota * -1 : kwota;

            // TWORZYMY OBIEKT!
            Transakcja nowaTransakcja = new Transakcja
            {
                Opis = opis,
                Kwota = finalnaKwota,
                Typ = typ
            };

            // Dodajemy obiekt do listy
            bazaDanych.Add(nowaTransakcja);
            Console.WriteLine("Zapisano!");
        }
        else
        {
            Console.WriteLine("Błąd kwoty.");
        }
    }

    static void PokazHistorie(List<Transakcja> bazaDanych)
    {
        Console.WriteLine("\n--- TWOJE PARAGONY ---");
        decimal suma = 0;
        int i = 1;

        // Pętla foreach wie, że 'pozycja' to 'Transakcja'
        foreach (Transakcja pozycja in bazaDanych)
        {
            // Dzięki klasie mamy dostęp do .Opis, .Typ, .Kwota!
            Console.WriteLine($"{i}. [{pozycja.Typ}] {pozycja.Opis}: {pozycja.Kwota} zł");
            suma += pozycja.Kwota;
            i++;
        }
        Console.WriteLine($"----------------\nSALDO: {suma} zł");
    }
}

Krok 5: Python też to potrafi! (Python OOP)

Obiecałem, że pokażę, jak zastąpić słowniki klasami w Pythonie. Składnia jest inna, ale idea identyczna.

Otwórz w VScode nowy katalog i stwórz plik budzet.py

# Definicja Klasy w Pythonie
class Transakcja:
    # __init__ to konstruktor - uruchamia się przy tworzeniu obiektu
    # self oznacza "JA" (ten konkretny obiekt)
    def __init__(self, opis, kwota, typ):
        self.opis = opis
        self.kwota = kwota
        self.typ = typ

# Użycie w programie (zamiast słownika)
# Tworzymy obiekt:
nowy_rekord = Transakcja("Biedronka", -50.00, "Wydatek")

# Dostęp do danych (kropka zamiast nawiasów kwadratowych!):
print(nowy_rekord.opis, nowy_rekord.kwota, nowy_rekord.typ) 
# Zamiast: nowy_rekord["opis"]

Jak widzisz definicja klasy w pythonie od razu musi zawierać konstruktor, czyli funkcję która nazywa się __init__.

Słowo self. oznacza, że zmienna należy do danego obiektu, że to jego właściwość. W PHP używa się słowa this.

W Pythonie używanie klas jest opcjonalne (dlatego w 4A użyliśmy słowników, bo szybciej), ale przy dużych projektach robi się to dokładnie tak, jak w C#.

Przykład z listą:


class Transakcja:    
    def __init__(self, opis, kwota, typ):
        self.opis = opis
        self.kwota = kwota
        self.typ = typ


t1 = Transakcja("Pensja", 8000.00, "Wpływ")
t2 = Transakcja("Biedronka", -50.00, "Wydatek")
historia = []
historia.append(t1)
historia.append(t2)
for t in historia:
    print(t.opis, t.kwota, t.typ)

Podsumowanie Lekcji 4 (A+B)

Zrobiłeś/aś gigantyczny postęp. Zobacz, gdzie byliśmy, a gdzie jesteśmy:

  • Lekcja 1-2: Pojedyncze zmienne (budzet = 100).
  • Lekcja 3: Listy liczb ([100, -20, -50]).
  • Lekcja 4: Listy Obiektów (Lista Transakcji).

Teraz nasz program „rozumie” świat. Nie operuje na cyferkach, ale na pojęciach biznesowych (Transakcja, Opis, Typ). To jest esencja bycia programistą.

Przybornik C# – Nowości z Lekcji 4B

W C# wszystko jest obiektem. Oto Twoje nowe narzędzia:

Komenda / Słowo kluczoweCo to robi?Wyjaśnienie
class Nazwa { ... }Definiuje nową klasę (Foremkę).Tworzysz swój własny typ danych, np. Samochód, Faktura, Użytkownik.
public string Opis { get; set; }Właściwość (Property).Cechy twojej klasy. get pozwala czytać, set pozwala zmieniać wartość.
new Nazwa()Tworzy nową instancję (Obiekt).Wykrawasz ciastko foremką. new Transakcja() powołuje obiekt do życia w pamięci.
List<NazwaKlasy>Lista, która przechowuje obiekty danej klasy.Kontener, do którego wrzucasz tylko konkretne obiekty (np. listę zakupów).
switch (zmienna)Odpowiednik Pythonowego match.Steruje przepływem programu (wybór opcji menu).
static void Nazwa()Metoda (Funkcja).W C# funkcje muszą być wewnątrz klas. static oznacza (w uproszczeniu), że nie potrzebujemy obiektu, by jej użyć (jak narzędzia w warsztacie).
obiekt.PoleKropka (.) służy do dostępu do wnętrza obiektu.Jak otwieranie szufladki wewnątrz obiektu, żeby wyciągnąć dane.

Przybornik Python – Wersja Obiektowa (Lekcja 4B)

W tej lekcji weszliśmy na poziom „Pro” w Pythonie. Zamiast luźnych słowników, tworzymy własne typy danych. Oto nowe pojęcia:

Komenda / Słowo kluczoweCo to robi?Wyjaśnienie „na chłopski rozum”
class Nazwa:Definiuje nową Klasę (Foremkę).Projektujesz nowy rodzaj danych. Od teraz Python wie, co to jest Transakcja.
def __init__(self, ...):Konstruktor. Specjalna funkcja, która uruchamia się automatycznie w momencie tworzenia nowego obiektu.To moment, w którym wlewasz ciasto do foremki. Tutaj ustalasz startowe wartości (np. opis i kwotę).
selfOznacza „JA” (ten konkretny obiekt).Kiedy tworzysz 100 transakcji, self pozwala każdej z nich wiedzieć, która jest która. self.opis znaczy: „MÓJ opis (a nie sąsiada)”.
self.zmienna = wartoscTworzy Pole (Właściwość) w obiekcie.Naklejasz etykietę na obiekt. Dzięki temu obiekt zapamiętuje tę daną na zawsze.
obiekt.poleKropka (.) służy do wyciągania danych z obiektu.Np. t1.kwota. Czytamy to: „Z obiektu t1 podaj mi wartość pola kwota”.
NazwaKlasy(...)Tworzy nową instancję (Obiekt).Wywołuje konstruktor (__init__). Np. t1 = Transakcja(...) to narodziny nowego obiektu.

Zadanie Domowe

W pythonie, zmień nasz program z lekcji poprzedniej tak, aby używał klas.

0 komentarzy

Wyślij komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Share This

Share this post with your friends!