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

Problem z funkcją int Pary()

Object Storage Arubacloud
0 głosów
144 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 Ekspert (344,860 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 Ekspert (344,860 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 Ekspert (344,860 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 Ekspert (344,860 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 Ekspert (344,860 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,574 wizyt
0 głosów
2 odpowiedzi 900 wizyt
pytanie zadane 13 czerwca 2019 w C i C++ przez magda_19 Gaduła (3,080 p.)
0 głosów
1 odpowiedź 452 wizyt
pytanie zadane 17 grudnia 2022 w Python przez Kubas23 Użytkownik (630 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

61,940 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!

...