• 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.

VPS Starter Arubacloud
+1 głos
232 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 927 wizyt
pytanie zadane 21 kwietnia 2020 w C i C++ przez Fuszion74 Początkujący (310 p.)
0 głosów
1 odpowiedź 271 wizyt
pytanie zadane 3 maja 2022 w JavaScript przez Maciek06 Użytkownik (680 p.)

92,453 zapytań

141,262 odpowiedzi

319,086 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...