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

Wypisanie sąsiadujących wierszy spełniających warunek.

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
+1 głos
505 wizyt
pytanie zadane 12 kwietnia 2021 w C i C++ przez xTMx3 Obywatel (1,560 p.)

Witam. 

Rozwiązuje właśnie różne zadania maturalne z poprzednich lat i natrafiłem na problem przy jednym z nich, a mianowicie przy tym: Trójki liczb

"W pliku trojki.txt w oddzielnych wierszach znajduje się 1000 trójek liczb naturalnych z przedziału od 1 do 550000000. W każdym wierszu są umieszczone trzy liczby rozdzielone pojedynczymi odstępami."

Zadanie ma 4 podpunkty, z czego 3 mam już zrobione. Problem mam tylko z jednym z nich, a mianowicie z tym: 

"Wypisz z pliku trojki.txt wszystkie pary sąsiadujących ze sobą wierszy, takie że liczby w tych wierszach są długościami boków trójkątów prostokątnych."

Przykład:   3 4 5            3² + 4² = 5²

               12 5 13          5² +12² =13²

 

To fragment kodu, który ma odpowiadać za to zadanie. 

while(plik>>a>>b>>c)
    {
        if(czyTrojkat(a,b,c))
        {
            wyjscie<<a<<" "<<b<<" "<<c<<endl;
        }
    }

Co jest czym: "plik" to wczytanie danych z pliku, "a","b" i "c" są zmiennymi w których przechowuję te dane, "czyTrojkat(a,b,c)" to funkcja, która sprawdza czy warunek z polecenia dla 3 liczb z tego samego wiersza jest spełniony, a "wyjscie" oznacza wypisanie danych do pliku.

Mój problem polega na wypisaniu do pliku PAR sąsiadujących ze sobą wierszy, zamiast pojedynczego wiersza, który ten warunek spełnia.

Czy mógłby ktoś podpowiedzieć w jaki sposób mogę to zrobić najlepiej nie rezygnując przy tym wczytywania liczb pętlą while? Szukałem na różnych stronach rozwiązań, żeby jakoś się nakierować, ale nigdzie nie znalazłem nic co by mi pomogło, więc będę wdzięczny za wszelkie podpowiedzi. 

Tak na koniec jeszcze proszę, aby w miarę możliwości podejść do tego w jakiś niezbyt skomplikowany sposób, ze względu na to, że wciąż się uczę i chciałbym rozumieć co robię. Z góry dziękuję. 

1 odpowiedź

+2 głosów
odpowiedź 12 kwietnia 2021 przez Michał Muzyka Pasjonat (24,080 p.)
wybrane 13 kwietnia 2021 przez xTMx3
 
Najlepsza
Nie wiem czy dobrze zrozumiałem zadanie ale według mnie trzeba zrobić to tak, dodać 3 zmienne prev(a, b, c), w których zachowamy wartości poprzedniej linii oraz zmienną bool w której zapiszemy informacje czy spełniony jest warunek boków trójkąta prostokątnego (trzeba pamiętać, że zmienne prev przy odczycie 1 linii nie będą zainicjowane). I jeżeli nasza linijka spełnia warunek, to patrzymy czy poprzednia też spełniała warunek, jeżeli tak to wypisujemy, oraz niezależnie zawsze zapisujemy wartości do prev i informacje o poprawności poprzedniej linijki
komentarz 12 kwietnia 2021 przez xTMx3 Obywatel (1,560 p.)
Tylko w jaki sposób mógłbym zachować wartości tej poprzedniej linii? Przecież while zawsze bierze wszystkie wiersze z pliku po kolei. Chyba że jest jakiś sposób, o którym nie wiem, żeby przechowywać wartość poprzednią?
2
komentarz 12 kwietnia 2021 przez Michał Muzyka Pasjonat (24,080 p.)

musimy to po prostu okodować po swojemu:

int prev_a, prev_b, prev_c;
bool was_good;

plik >> prev_a >> prev_b >> prev_c;
was_good = CzyTrojkat(prev_a, prev_b, prev_c);

int a, b, c;
while(plik >> a >> b >> c){
    bool status = CzyTrojkat(a, b, c);

    if(status && was_good){
         wyjscie << prev_a << ' ' << prev_b << ' ' << prev_c << '\n';
         wyjscie << a << ' ' << b << ' ' << c << '\n'; 
    }

    prev_a = a;
    prev_b = b;
    prev_c = c;
    was_good = status;
}

kod powinien działać, pomijam oczywiście sprawdzanie błędów

komentarz 13 kwietnia 2021 przez xTMx3 Obywatel (1,560 p.)
I rzeczywiście działa. Sam chyba myślałbym ze 2 tygodnie zanim bym pomyślał o takim rozwiązaniu, bo ciągle skupiałem się na robieniu wszystkiego wewnątrz pętli i nawet przez myśl nie przechodziło mi zrobienie czegokolwiek poza nią. Bardzo dziękuję za pomoc.

Podobne pytania

0 głosów
2 odpowiedzi 1,196 wizyt
pytanie zadane 21 kwietnia 2020 w C i C++ przez Fuszion74 Początkujący (310 p.)
0 głosów
1 odpowiedź 393 wizyt
pytanie zadane 3 maja 2022 w JavaScript przez Maciek06 Użytkownik (680 p.)

93,435 zapytań

142,429 odpowiedzi

322,664 komentarzy

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

...