problem z zapisem obiektów do tablicy

problem z zapisem obiektów do tablicy
K4
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 3 lata
  • Postów:31
0

witam, mam pewien problem. Mianowicie, muszę zrobić zadanie i niby je zrobiłem, błędów nie ma, jednak wyświetla mi złe wyniki. Są 2 klasy, 1 to samochód, a 2 to garaz, który ma zapisywać określoną liczbę samochodów w garażu. obiekty ma przechowywać tablica, jednak działa to źle. klasa garaż wygląda tak:

Kopiuj
using System;
using System.Collections.Generic;
using System.Text;

namespace poo1
{
    class Garaz
    {
        public string adres;
        public int pojemnosc;
        private int liczbaSamochodow = 0;
        private Samochod[] samochody;

        public Garaz()
        {
            adres = "nieznany";
            pojemnosc = 0;
            samochody = null;
        }
        public Garaz(string adres, int pojemnosc)
        {
            this.adres = adres;
            this.pojemnosc = pojemnosc;
            Samochod[] samochody = new Samochod[pojemnosc];
        }
      
        public int Pojemnosc
        {
            get { return pojemnosc; }
            set
            {
                pojemnosc = value;
                samochody = new Samochod[pojemnosc];
            }
        }
        public string Adres
        {
            get { return adres; }
            set { adres = value; }
        }


        public void WprowadzSamochod(Samochod samochod)
        {
            samochody = new Samochod[pojemnosc];
            if (liczbaSamochodow >= pojemnosc)
            { Console.WriteLine("Garaż jest pełny"); }
            else
            {
                samochody[liczbaSamochodow] = samochod;
                liczbaSamochodow = liczbaSamochodow++;

            }
        }
        public Samochod WyprowadzSamochod()
        {
            if (liczbaSamochodow==0)
            {Console.WriteLine("Garaz jest pusty"); }
            else if (liczbaSamochodow >= pojemnosc)
            {
                samochody[liczbaSamochodow - 1] = null;
                
               
                liczbaSamochodow--;
                
            }

            return new Samochod();
        }
        public void WypiszInfo()
        {
            
            foreach (Samochod auto in samochody)
            {
                Console.WriteLine(auto);
            }
        }
    }
}

Testuję ją takim kodem:

Kopiuj
            Samochod s1 = new Samochod("Fiat", "126p", 2, 650, 6.0);
            Samochod s2 = new Samochod("Syrena", "105", 2, 800, 7.6);
            Garaz g1 = new Garaz();
            g1.Adres = "ul. Garażowa 1";
            g1.Pojemnosc = 1;
            Garaz g2 = new Garaz("ul. Garażowa 2", 2);
            g1.WprowadzSamochod(s1);
            g1.WypiszInfo();
            g1.WprowadzSamochod(s2);
            g2.WprowadzSamochod(s2);
            g2.WprowadzSamochod(s1);
            g2.WypiszInfo();

            g2.WyprowadzSamochod();
            g2.WypiszInfo();

            g2.WyprowadzSamochod();
            g2.WyprowadzSamochod();
            Console.ReadKey();




            Console.ReadKey();

Problem jest taki, że nie wyświetla w ogóle elementów s2, a jedynie s1, s1, pusty, s1, pusty, pusty. Czy mógł by ktoś naprowadzić w gdzie robię błąd?

ZK
Kiepski z ciebie programista. Brakuje ci elementarnej wiedzy. Pojemność garażu ustalasz tylko raz przy tworzeniu garażu. Jeśli chcesz żeby twój garaż się powiększał to musisz stworzyć nową tablicę i skopiować elementy ze starej tablicy do nowej Innej możliwości nie ma. Chyba że użyjesz gotowca w postaci np. List<Samochod>
Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
1
Kopiuj
/* ... */
        public void WprowadzSamochod(Samochod samochod)
        {
            samochody = new Samochod[pojemnosc]; // co to robi? / po co to tu?
            /* ... */
        }
/* ... */

edytowany 1x, ostatnio: Patryk27
K4
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 3 lata
  • Postów:31
0

@Patryk27: Inicjuje tablicę, bo bez tego wyskakiwał błąd braku inicjacji. Być może zrobiłem to źle, ale nie wiem jak inaczej.

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad rok
  • Lokalizacja:Wrocław
  • Postów:13042
3

Problem polega na tym, że ta instrukcja za każdym razem tworzy nową, pustą tablicę - tj. każde wywołanie WprowadzSamochod() usuwa wszystkie poprzednie samochody (jak już mogłeś zaobserwować).

Zamiast tablicy, najlepiej byłoby wykorzystać kolekcję - np. List<Samochod> - ponieważ one są automatycznie-rosnące (nie trzeba ich inicjować na konkretną pojemność).


edytowany 3x, ostatnio: Patryk27
K4
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 3 lata
  • Postów:31
0

@Patryk27: Gdy próbuję to wpisać bez new lub w jakiś inny sposób wyrzuca błędy, a z listy nie mogę korzystać, w zadaniu mam określone, że musi to być tablica.

WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 14 godzin
  • Postów:5109
0

@kuku4321:

a czy przypadkiem nie wywala ci błędu przy tym obiekcie, który jest tworzony tym konstruktorem?

Kopiuj
public Garaz()
{
	adres = "nieznany";
	pojemnosc = 0;
	samochody = null;
}
K4
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 3 lata
  • Postów:31
0

@WeiXiao: Nie, tylko w metodzie WprowadzSamochod

WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 14 godzin
  • Postów:5109
0

@kuku4321:

Gdy próbuję to wpisać bez new lub w jakiś inny sposób wyrzuca błędy, a z listy nie mogę korzystać, w zadaniu mam określone, że musi to być tablica.

no dlatego, że tu masz zmienna lokalna

Kopiuj
Samochod[] samochody = new Samochod[pojemnosc];

tutaj

Kopiuj
public Garaz(string adres, int pojemnosc)
{
	this.adres = adres;
	this.pojemnosc = pojemnosc;
	Samochod[] samochody = new Samochod[pojemnosc];
}
edytowany 1x, ostatnio: WeiXiao
AB
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 2 lata
  • Postów:17
1

Taka mała uwaga do pól w klasie Garaż. Pola są publiczne a potem do nich są dodane właściwości. Właściwości są po to aby to przez nie mieć dostęp do prywatnych pól (można w nich ewentualnie sprawdzić czy ktoś nie podaje błędnych danych przy ustawianiu pola). Lepiej by było to zrobić tak:

Kopiuj
private string adres;
public string Adres
        {
            get { return adres; } //ewentualnie get => adres;
            set { adres = value; }
        }

Bo tak to po co mi Adres i jego get jak równie dobrze mogę wartość wziąć bezpośrednio z pola adres, bo jest publiczne. W Visual Studio nawet jak wpiszesz propfull (Code Snippets) naciśniesz dwa razy Tab to wygeneruje Ci właściwość z prywatnym polem.

K4
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 3 lata
  • Postów:31
0

@Abachaczi: mają być prywatne tylko pod wplywem frustracji gdy nie wychodziło zmieniłem szukając źródła problemu i zapomniałem zmienić z powrotem, dzięki

K4
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 3 lata
  • Postów:31
0

@WeiXiao: no tam, ale gdy w metodzie nie dodam tego to wuyskakuje błąd braku inicjacji

WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:około 14 godzin
  • Postów:5109
0

@kuku4321:

a poprawiłeś ten kod w public Garaz(string adres, int pojemnosc)?

Nie inicjalizujesz tam tablicy private Samochod[] samochody;, a tworzysz zmienną lokalną.

edytowany 1x, ostatnio: WeiXiao
K4
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 3 lata
  • Postów:31
0

@WeiXiao: zamiast tego napisałem w konstruktorze Samochod[] auta = samochody, ale nadal nie działa

AB
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 2 lata
  • Postów:17
2

W konstruktorze tworzysz zmienną lokalną Samochod[] a powinieneś po prostu zrobić tak : this.samochody = new Samochody[pojemnosc]. Wyżej w konstruktorze w taki sposób ustawiasz pola nie inaczej powinno tutaj. W metodzie wprowadź samochód tworzysz znowu tablicę za pomocą new. Po co? Przecież już masz tablicę, stworzyłeś ją w konstruktorze (lub w secie przy konstruktorze bezparametrowym).
liczbaSamochodow = liczbaSamochodow++; tu powinno być po prostu liczbaSamochodow++, doczytaj o preinkrementacji i postinkrementacji chyba, że to jakaś pomyłka mała bo później liczbaSamochodow
-- masz ok. W foreach jak wypisujesz auta to może wywalać błąd jak trafi na null więc ja bym dodał if(auto==null) to po prostu return; Dobrze jakbyś jeszcze przeciążył ToString() i w foreach wypisywał auto.ToString() to ładnie wyświetli informacje o samochodzie.

Kopiuj
class Garaz
    {
        private string adres;
        private int pojemnosc;
        private int liczbaSamochodow = 0;
        private Samochod[] samochody;

        public Garaz()
        {
            adres = "nieznany";
            pojemnosc = 0;
            samochody = null;
        }
        public Garaz(string adres, int pojemnosc)
        {
            this.adres = adres;
            this.pojemnosc = pojemnosc;
            this.samochody = new Samochod[pojemnosc];
        }

        public int Pojemnosc
        {
            get { return pojemnosc; }
            set
            {
                pojemnosc = value;
                samochody = new Samochod[pojemnosc];
            }
        }
        public string Adres
        {
            get { return adres; }
            set { adres = value; }
        }

        public void WprowadzSamochod(Samochod samochod)
        {
            if (liczbaSamochodow >= pojemnosc)
            { 
                Console.WriteLine("Garaż jest pełny"); 
            }
            else
            {
                samochody[liczbaSamochodow] = samochod;

                liczbaSamochodow++;
                
            }
        }

        public void WyprowadzSamochod()
        {
            if (liczbaSamochodow == 0)
            { 
                Console.WriteLine("Garaz jest pusty"); 
            }
            else 
            {
                samochody[liczbaSamochodow-1] = null;
                liczbaSamochodow--;
                Console.WriteLine("Wyprowadzaono samochod.");
            }
        }

        public void WypiszInfo()
        {

            foreach (Samochod auto in samochody)
            {
                if (auto == null)
                {
                    return;
                }
                else 
                {
                    Console.WriteLine(auto.ToString());
                }
               
            }
        }
    }

Ja to poprawiłem tak i chyba jest okej ale nie znam treści zadań i wymagań.

K4
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 3 lata
  • Postów:31
0

@Abachaczi: liczbasamochodow to w wybik tego że mi to zakreslalo w wyjątku i kombinowałem, poprawione, przeciążenie jest w klasie samochód. Poprawiłem wszystko tak jak napisales, ale nadal nie działa, wyświetla tylko że garaż jest pełny

ŁF
Naucz się debugować.
AB
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 2 lata
  • Postów:17
0

Pokaż swoją metode Main() co w niej masz.

K4
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 3 lata
  • Postów:31
0

@Abachaczi: wszystko co jest w main wkleilem w pierwszym poscie, to gotowy kod do testowania z zadania

edytowany 1x, ostatnio: kuku4321
AB
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 2 lata
  • Postów:17
1

Przekleiłem 1 do 1 Twojego Maina i działa jak należy z moim kodem który wkleiłem. Nie wiem gdzie może być problem xd. Do g1 o pojemności 1 jest dwa razy g1.WprowadzSamochod() więc za drugim razem wyświetli, że garaż jest pełny a w g2 wprowadzasz 2 auta do garażu o pojemności 2 i wyprowadzasz 3 razy (za trzecim razem pokaże, że garaż jest pusty)

K4
  • Rejestracja:ponad 4 lata
  • Ostatnio:ponad 3 lata
  • Postów:31
0

@Abachaczi: Gdzieś musiałem zrobić literówkę, bo faktycznie po przeklejeniu a nie tylko dopisaniu wszystko działa, bardzo dziękuję.

ŁF
Moderator
  • Rejestracja:ponad 22 lata
  • Ostatnio:dzień
0

A tak nie byłoby prościej (pomijając użycie polskich nazw)?

Kopiuj
    class Garaz
    {
        private List<Samochod> samochody = new List<Samochod>();
        private int pojemnosc;
        public int Pojemnosc
        {
            get { return pojemnosc; }
            set
            {
                if (value < samochody.Count)
                    throw new ArgumentException("Nie można ustawić pojemności garażu na mniejszą, niż ilość aktualnie znajdujących się w nim samochodów");
                pojemnosc = value;
            }
        }
        public string Adres { get; }

        public Garaz(string adres, int pojemnosc)
        {
            Adres = adres;
            Pojemnosc = pojemnosc;
        }

        public void WprowadzSamochod(Samochod samochod)
        {
            if (samochody.Count >= pojemnosc)
                throw new Exception("Garaż jest pełny");

            samochody.Add(samochod ?? throw new ArgumentNullException(nameof(samochód)));
        }

        public void WyprowadzSamochod()
        {
            if (!samochody.Any())
                throw new Exception("Garaż jest pusty");

            samochody.Remove(samochody.Last());
        }

        public void WypiszInfo() => samochody.ForEach(a => Console.WriteLine(a.ToString()));
    }

edytowany 2x, ostatnio: ŁF
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)