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

Problem z funkcją int Pary()

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
205 wizyt
pytanie zadane 28 maja 2019 w C i C++ przez szprej Nowicjusz (120 p.)

Witam mam problem z funkcją Pary. Zadanie polega na wczytaniu liczb z pliku binarnego, utworzenia par <N,P> (nieparzyste, parzyste), nieparzyste są brane w kolejność występowania ich w pliku z danymi, zaś parzyste odwrotnej jak wystąpiły w pliku z danymi.

Funkcja w zasadzie działa, zapisuje mi pary do pliku ale nie tak jak trzeba

 

 

int Pary(const string &binarny, const string &tekstowy)
{
    stack<int> parzyste; ///deklaracja stosu
    queue<int> nieparzyste; ///deklaracja kolejki

    int x;

    ifstream dane;
    dane.open(binarny.c_str(), ios_base::binary);

    if(!dane.is_open())
        return -1;

    while(dane.read(reinterpret_cast <char *> (&x), sizeof(int))) ///dopoki czytamy dane to zmieniamy wskaznik z intow na wskaznik char
    {
        if(x%2==0)
            parzyste.push(x);
        else
            nieparzyste.push(x);
    }

    ofstream wyniki;
    wyniki.open(tekstowy.c_str(), ios_base::out);
    int a=0, b=0;
    while(!parzyste.empty() && !nieparzyste.empty()) ///dopoki parzyste nie sa puste i nieparzyste nie sa puste
    {
        a = parzyste.top();
        b = nieparzyste.front();
        cout<<a<<b;
       wyniki<<"<"<<b<<","<<a<<">"<<endl;/// zapisujemy pare <N,P>
       parzyste.pop();
       nieparzyste.pop();

    }
    int ile=0;
    int c=0,d=0;
    while(!parzyste.empty() || !nieparzyste.empty())  ///dopoki parzyste nie sa puste lub nieparzyste nie sa puste
    {
        c=parzyste.top();
        d=nieparzyste.front();
        if(c!=NULL) /// jesli zostaly liczby parzyste zmniejszamy ile
            ile--;
        if(d!=NULL) /// jesli zostaly liczby nieparzyste zwiekszamy ile
            ile++;
    }
    wyniki.close();
    dane.close();
    return ile;
}
int main()
{

    cout<<Pary("binarny.bin","wynik.txt");

    return 0;
}

W pliku binarny.bin mam zapisane liczby: 3 -2 -5 0 6 7 -4 -6 4 2 1

Do pliku wynikowego powinno utworzyć pary: <3,2> <-5,4> <7,-6><1,-4>

Natomiast do pliku zapisuje mi:

<868203503,873073974>
<841812493,755633460>
<892144141,168637962>


Czy ktoś mógłby naprowadzić mnie gdzie jest błąd?

1 odpowiedź

0 głosów
odpowiedź 28 maja 2019 przez adrian17 Mentor (350,120 p.)
while(dane.read(reinterpret_cast <char *> (&x), sizeof(int))) ///dopoki czytamy dane to zmieniamy wskaznik z intow na wskaznik char
    {

Dla pewności, wypisz sobie te wczytane liczby na konsolę.

while(!parzyste.empty() || !nieparzyste.empty())  ///dopoki parzyste nie sa puste lub nieparzyste nie sa puste
    {
        c=parzyste.top();
        d=nieparzyste.front();
        if(c!=NULL) /// jesli zostaly liczby parzyste zmniejszamy ile
            ile--;
        if(d!=NULL) /// jesli zostaly liczby nieparzyste zwiekszamy ile
            ile++;
    }

Um, kiedy ta pętla się skończy?

I czemu int mógłby mieć wartość NULL?

komentarz 29 maja 2019 przez szprej Nowicjusz (120 p.)
Pętla kończy się gdy stos i kolejka są puste, ponieważ po utworzeniu par muszę zliczyć ile liczb zostało.

 

NULL oznacza brak dalszych elementów, na stosie nie można bardziej w prawo, w kolejce w lewo.
komentarz 29 maja 2019 przez adrian17 Mentor (350,120 p.)

Pętla kończy się gdy stos i kolejka są puste

No i OK, ale nigdzie w tej pętli nie opróżniasz kolejki, więc jak raz wejdziesz w pętlę, to nigdy z niej nie wyjdziesz.

NULL oznacza brak dalszych elementów

Nie, NULL to nullowy wskaźnik. Próbujesz porównać wartość liczbową (int c, d) z wskaźnikiem, co nie ma sensu.

komentarz 31 maja 2019 przez szprej Nowicjusz (120 p.)

No i OK, ale nigdzie w tej pętli nie opróżniasz kolejki, więc jak raz wejdziesz w pętlę, to nigdy z niej nie wyjdziesz.

Okej tu już ogarniam

 

Nie, NULL to nullowy wskaźnik. Próbujesz porównać wartość liczbową (int c, d) z wskaźnikiem, co nie ma sensu.

Czyli zamiast c,d sprawdzać parzyste.top() oraz nieparzyste.front(), dobrze rozumiem?

komentarz 31 maja 2019 przez adrian17 Mentor (350,120 p.)

Czyli zamiast c,d sprawdzać parzyste.top() oraz nieparzyste.front(), dobrze rozumiem?

Um, nie zrozumiałem.

Czy Ty chcesz tutaj po prostu porównać rozmiary dwóch kolejek? Nie wystarczy porównać .size() ?

komentarz 31 maja 2019 przez szprej Nowicjusz (120 p.)
W parzystych czy są jakieś elementy jeśli tak to zliczyć ile. W nieparzystych to samo.

 

Generalnie już tworzy pary jak trzeba, tylko nie zwraca ilu liczb nie użyto
komentarz 31 maja 2019 przez adrian17 Mentor (350,120 p.)
No, ale jak zliczasz to w zasadzie jest .size().
komentarz 31 maja 2019 przez szprej Nowicjusz (120 p.)
Już wszystko działa, zamiast NULL dałem parzyste.size()!=0 [z nieparzystymi to samo] i zwiększam licznik,

Dzięki za pomoc :)
komentarz 31 maja 2019 przez adrian17 Mentor (350,120 p.)

OK, tylko jakby co, z tego co widzę, ta ostatnia pętla to wciąż po prostu

int ile = nieparzyste.size() - parzyste.size();

 

Podobne pytania

0 głosów
1 odpowiedź 3,895 wizyt
0 głosów
2 odpowiedzi 1,017 wizyt
pytanie zadane 13 czerwca 2019 w C i C++ przez magda_19 Gaduła (3,080 p.)
0 głosów
1 odpowiedź 630 wizyt
pytanie zadane 17 grudnia 2022 w Python przez Kubas23 Użytkownik (630 p.)

93,109 zapytań

142,088 odpowiedzi

321,611 komentarzy

62,450 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...