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

Program ktory poda wszystkie dlugosci mozliwych trojkatów.

Object Storage Arubacloud
0 głosów
684 wizyt
pytanie zadane 31 października 2016 w C i C++ przez jakobosik Początkujący (340 p.)
Cześć,

głowię się nad tym zadaniem drugi dzień, polecenie brzmi następująco:

"Napisz program który wypisze na ekran wszystkie trójkąty o bokach całkowitej długości, których obwód nie

przekracza liczby podanej przez użytkownika."

Jest to zadanie na pętle w języku C. Polecenie rozumiem następująco: podaję trójkąt (np. a=1,b=1.c=1) w pętli która przerwie się, gdy a+b+c przekroczy zmienną podaną przez użytkownika. Nie mam jednak pomyslu w jaki sposób zwiekszać te boki (pamiętając o tym, że muszą spełniać też warunki istnenia trójkąta tj. a+b>c, a+c>b, b+c>a). Myślałem o tym by dodawać po kolei +1 do każdej zmiennej i by wypisywały się boki  tylko gdy spełnia się warunek istnienia trójkąta, jednakże w ten sposób np. trójąt a=4, b=3,c=2 mimo, że moze istnieć to się nie wypisze. Oczywiscie nie oczekuje napisanego kodu, ale byłbym wdzięczny za jakąś wskazówkę.

Pozdrawiam

Kuba

2 odpowiedzi

0 głosów
odpowiedź 31 października 2016 przez niezalogowany
edycja 30 sierpnia 2017
 
Najlepsza

Proponuję takie coś:

#include <iostream>
using namespace std;

int main()
{
    int obwod;
    cin>>obwod; // wczytanie z klawiatury obwodu

    for(int a = 1; a<obwod; a++)
    {
        for(int b = 1; b<obwod; b++)
        {
            for(int c = 1; c<obwod; c++)
            {
                if( /* 3 warunki istnienia trójkąta i 1 czy dlugosci ich sa rowne obwodowi - wszystkie oddzielone znakiem && - czyli każdy ma być spełniony*/ )
                {

                    cout<<a<<" "<<b<<" "<<c<<endl; // wypisanie na ekran dlugosci bokow a,b,c
                }
            }
        }

    }

    return 0;
}

Może dałoby się znacznie skrócić to rozwiązanie zmieniając warunki brzegowe pętli, ale myślę że tyle na początek wystarczy :)

komentarz 31 października 2016 przez niezalogowany
edycja 31 października 2016

Możesz też zrobić takie pętle:

// ...
for(int a = 1; a<obwod; a++)
// ...
for(int b = a; b<obwod; b++)
// ...
for(int c = b; c<obwod; c++)
// ...

Wtedy zniknie powtarzalność niektórych elementów. Przykładowo jak wcześniej miałeś dla obwodu 5 takie możliwości:

(1 2 2) (2 1 2) (2 2 1)  <-  widać, że to to samo tylko kolejność inna 

Natomiast po zmienieniu początku b-tej i c-tej pętli będą wypisywane wartości bez powtórzenia czyli: (1 2 2)

komentarz 1 listopada 2016 przez jakobosik Początkujący (340 p.)
Ahh, wiedziałem że to musi być proste, ale jak zwykle najciemniej pod latarnią :P.
 Dziękuje bardzo za pomoc, właśnie tego szukałem.
0 głosów
odpowiedź 30 sierpnia 2017 przez mokrowski Mędrzec (155,460 p.)
przywrócone 30 sierpnia 2017 przez mokrowski

Hmm... zakładając że kombinacje boków nie powinny się powtarzać czyli  (1, 2, 2) (2, 2, 1) (2, 1, 2) to ten sam wynik, optymalne rozwiązanie to raczej... 

#include <iostream>

int main() {
    unsigned obwod;
    std::cin >> obwod;
    for(unsigned a = 1; a < obwod - 1; ++a) {
        for(unsigned b = a; b < obwod - a; ++b) {
            for(unsigned c = b; c <= obwod - a - b; ++c) {
                if((a + b > c)) {
                    std::cout << a << ' ' << b << ' ' << c << std::endl;
                }
            }
        }
    }
}

Tu będzie zminimalizowana ilośc przebiegów i sprawdzeń :-) 

komentarz 30 sierpnia 2017 przez niezalogowany

1. Kod działa niepoprawnie. Przykład dla obwodu równego np 5:

1 1 1
1 2 2
komentarz 30 sierpnia 2017 przez mokrowski Mędrzec (155,460 p.)

@Hipcio a jakie trójkąty o długościach boku max 5 włącznie zbudujesz? :-) Właśnie z elementów 1 1 1 oraz 1 2 2. Warunki są spełnione przez zakresy pętli. 

 

komentarz 30 sierpnia 2017 przez niezalogowany
edycja 30 sierpnia 2017
Nie było problemu - coś mi się pomyliło przy czytaniu pytania ;)

Podobne pytania

+1 głos
1 odpowiedź 639 wizyt
0 głosów
1 odpowiedź 843 wizyt
0 głosów
1 odpowiedź 512 wizyt
pytanie zadane 12 grudnia 2021 w C i C++ przez olcia Nowicjusz (200 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

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

...