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

Problem z funkcją int Pary()

VPS Starter Arubacloud
0 głosów
185 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 (349,740 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 (349,740 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 (349,740 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 (349,740 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 (349,740 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,857 wizyt
0 głosów
2 odpowiedzi 999 wizyt
pytanie zadane 13 czerwca 2019 w C i C++ przez magda_19 Gaduła (3,080 p.)
0 głosów
1 odpowiedź 616 wizyt
pytanie zadane 17 grudnia 2022 w Python przez Kubas23 Użytkownik (630 p.)

93,016 zapytań

141,977 odpowiedzi

321,272 komentarzy

62,361 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 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...