• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Pomoc z kodem

Object Storage Arubacloud
0 głosów
146 wizyt
pytanie zadane 15 marca 2022 w C# przez Dzik1121 Nowicjusz (160 p.)

Witam
Potrzebował bym w pomocy gdyż dopiero się uczę i do końca nie ogarniam tego języka. Mam do wykonania polecenie jak na zdjęciu jednak mój program nie działa. Dopiero zaczynam swoją przygode w środowisku C# więc licze na wyrozumiałość.

Kod:

using System;
public class Uczen {
    public string Imie {set; get;}
    public string Nazwisko { set; get; }
    public int Pesel { set; get; }
    public Uczen() { }
    public Uczen(string imie, string nazwisko, int pesel)
        {
            Imie = imie;
            Nazwisko = nazwisko;
            Pesel = pesel;
        }
    Uczen u1 = new Uczen("Adam", "Kowalski", 05 285 295 351);
    static void Wypisz()
    {
        Console.WriteLine("Imie: " + Imie + "Nazwisko: " + Nazwisko + "Pesel: " + pesel);
    }
}

public class HelloWorld{
static void Main()
  {
    Console.WriteLine("Koniec programu");
  }
}

2 odpowiedzi

+1 głos
odpowiedź 15 marca 2022 przez adrian17 Ekspert (345,160 p.)

Jest nie tak źle, ale z kilkoma problemami:

static void Wypisz()

metoda Wypisz ma sens dla konkretnej instancji ucznia, więc nie powinna być statyczna.

Uczen u1 = new Uczen("Adam", "Kowalski", 05 285 295 351);

Kod wykonywalny musi zawsze się znaleźć w _jakiejś_ metodzie - tutaj miejscem gdzie chcesz stworzyć ucznia i go wypisać jest wnętrze Main()a. No i musisz też kiedyś wywołać `u1.Wypisz()` :)

public int Pesel { set; get; }

Pesel nie jest liczbą, bo może się zaczynać od zer (i mają one znaczenie). (a nawet gdyby był liczbą, to nie intem, bo int jest za mały na liczbę 11-cyfrową) Znacznie prościej będzie tutaj stringa użyć (lub tablicę 11stu małych liczb, ale to bardziej skomplikowane)

0 głosów
odpowiedź 15 marca 2022 przez Velta Maniak (52,370 p.)
edycja 15 marca 2022 przez Velta

Najważniejsze: programować po angielsku. Tutaj to zapewne zadanie od nauczyciela, więc... po prostu pomińmy to tym razem.

Pole dla numeru PESEL uczyniłbym ciągiem znaków: łatwiej z walidacją z wyrażeniami regularnymi, a poza tym maksymalny zakres typu Int32 to 2^31, czyli liczba 10-cyfrowa, a PESEL ma ich 11:

private string _Pesel { get; set; }

public string Pesel
{
    get => _Pesel;

    set
    {
        Regex regex = new(@"^\d{11}$");
        if (!regex.IsMatch(value))
        {
            throw new ArgumentException("Wprowadzony numer PESEL jest nieprawidłowy.");
        }
        else
        {
            _Pesel = value;
        }
    }
}

Konstruktor z parametrami można skrócić:

public Uczen(string imie, string nazwisko, string pesel)
{
    (Imie, Nazwisko, Pesel) = (imie, nazwisko, pesel);
}

Dodaj metodę publiczną void Wypisz() która wypisuje dane ucznia

Tutaj to – według zadania – musi zostać, ale znacznie lepiej byłoby po prostu przeciążyć metodę ToString, a dopiero z logiki głównej ją wywołać podczas wypisywania:

public override string ToString()
{
    return $"Imie: {Imie}{Environment.NewLine}Nazwisko: {Nazwisko}{Environment.NewLine}PESEL: {Pesel}";
}

W przypadku wypisywania, warto użyć interpolacji, która tworzy jeden ciąg znaków (w .NET ciąg znaków jest niezmienny, a to oznacza, że przy każdej konkatenacji ciągów tworzony jest nowy, a nie dołączany do istniejącego):

public void Wypisz()
{
    Console.WriteLine($"Imie: {Imie}{Environment.NewLine}Nazwisko: {Nazwisko}{Environment.NewLine}PESEL: {Pesel}";);
}

Zamiennie można skorzystać z metody String.Format albo klasy StringBuilder, ale powyższa interpolacja zdecydowanie spełnia swoją rolę w tym przypadku IMHO jest wygodniejszym podejściem do łączenia ciągów znaków.

Tworzenie obiektów pozostaw funkcji głównej programu (a teraz właściwie to plikowi Program.cs). Należy pamiętać, że z racji walidacji, warto byłoby skorzystać z konstrukcji try ... catch, jeżeli numer PESEL będzie niepoprawny:

[...]
Uczen uczen = default;
try
{
    uczen = new(imie, nazwisko, pesel);
}
catch (ArgumentException ex)
{
    Console.WriteLine($"Wystąpił problem z utworzeniem obiektu przechowującego informacje o uczniu:{Environment.NewLine}{ex.Message}");
}

EDIT #1: Poprawiono znak cudzysłowia dla wycinka logiki głównej.
EDIT #2: Zmodyfikowano informację o konkatenacji, zgodnie z dokumentacją metody String.Concat.

komentarz 15 marca 2022 przez adrian17 Ekspert (345,160 p.)
edycja 15 marca 2022 przez adrian17

Zdecydowanie potężnie przekombinowałeś jak dla osoby która prawdopodobnie pisze swoją pierwszą klasę :)

(Imie, Nazwisko, Pesel) = (imie, nazwisko, pesel);

Nie jestem świadom by ktokolwiek tak idiomatycznie pisał.

(w .NET ciąg znaków jest niezmienny, a to oznacza, że przy każdej konkatenacji ciągów tworzony jest nowy, a nie dołączany do istniejącego):

W praktyce kompilator optymalizuje łączenie stringów `a + b + c + d + c + b + a` do jednego String.Concat. Dokumentacja też o tym wspomina:

Even if you use several + operators in one statement, the string content is copied only once

Więc mimo że interpolacja w ogólności jest fajna, to tutaj aż tak wielkiej różnicy nie robi.

Podobne pytania

0 głosów
1 odpowiedź 381 wizyt
pytanie zadane 7 lutego 2016 w C# przez Xxsource98 Nowicjusz (200 p.)
0 głosów
0 odpowiedzi 162 wizyt
0 głosów
4 odpowiedzi 659 wizyt
pytanie zadane 14 kwietnia 2022 w Python przez W1ck Nowicjusz (150 p.)

92,615 zapytań

141,465 odpowiedzi

319,779 komentarzy

61,997 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...