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

Mam problem - C++

Object Storage Arubacloud
0 głosów
193 wizyt
pytanie zadane 12 października 2020 w C i C++ przez Hubert_123 Początkujący (380 p.)
Mój problem polega na tym, że jeśli podam liczby a i b które będą pasować do: if(a%b==0) cout<<b; albo do if(b%a==0) cout<<a; to program się skończy, nie ważne jak dużo bym testów podał. Żeby to zobaczyć: wpiszcie za liczbę testów więcej niż jeden, i w pierwszym teście wpiszcie 11 i 22.

Moj program:

#include <iostream>

 

using namespace std;

int t,a,b,Dzielnik;

int main()

{

cout << "Podaj mi ilosc testow: ";

cin >>  t;

 

for (int k=0; k<t; k++)

{

   cout<<"Podaj pierwsza liczbe: ";

    cin>>a;

    cout<<"Podaj druga liczbe: ";

    cin>>b;

{

        if(a>b)

{if(a%b==0) cout<<b;

Dzielnik = a%b;}

 

 

        if(b>a)

{if(b%a==0) cout<<a;

    Dzielnik = b%a;}

 

cout<<(a*b)/Dzielnik<<endl;

}

}

    return 0;

}

2 odpowiedzi

+1 głos
odpowiedź 12 października 2020 przez Whiskey_Taster Pasjonat (15,610 p.)

Po pierwsze - zasady. Jeśli dodajesz cokolwiek na stronę i wklejasz kod, użyj czegoś takiego jak "Dodaj lub zaktualizuj bloczek kodu". Ma to na celu ominięcie tego, co zrobiłeś. 

Po drugie - błąd tkwi w zapisie. 
 

{if(a%b==0) cout<<b;

Dzielnik = a%b;}

Jeśli dobrze to rozumiem, to sprawdzasz jakiś warunek, mianowicie czy a%b == 0. A potem... dzielnik = a%b, czyli dzielnik = 0. A potem... dzielisz przez 0. Więcej dodawać komentarza chyba nie trzeba laugh

Popraw formatowanie kodu, a potem zastanów się nad tym, czy gdzieś nie powinieneś mieć jakichś klamr bądź innych warunków. 

komentarz 12 października 2020 przez Hubert_123 Początkujący (380 p.)
Zadaniem tego programu jest znalezienie najmniejszej wspólnej wartości. Dzielnik odgrywa tu rolę największego wspólnego dzielnika (nazwałem go dzielnikiem, żeby było dla mnie łatwiej). a warunek if(a%b==0) i if(b%a==0), ponieważ nie działał mi program dla liczb które po dzieleniu przez siebie nie dają reszty. Jak już to poprawiłem, to pojawił mi się problem z działaniem tego programu. Kiedy go włączam wpisuję tam więcej niż jeden test (załóżmy, że 3) i w pierwszym teście wpisując liczby, które pasują do jednego z tych warunków [if(a%b==0) i if(b%a==0)], to nie mogę po tym nic zrobić i nie wiem jak to naprawić.
komentarz 12 października 2020 przez Whiskey_Taster Pasjonat (15,610 p.)

O widzisz, to już są konkretne informacje i część rzeczy nabiera sensu. Tylko czym jest "najmniejsza wspólna wartość" dwóch liczb? Jaka będzie najmniejsza wspólna wartość liczby 2 i 4, a jaka -5 i 10? A może chodzi o znalezienie najmniejszej wspólnej wielokrotności? 

A nie możesz nic zrobić, bo - tak jak już powiedziałem - po spełnieniu warunku a%b == 0 lub b%a == 0 otrzymujesz, że dzielnik = 0. A potem robisz 
 

cout << (a*b)/dzielnik

I jaki wynik dostaniesz, gdy dzielnik = 0? Ano żaden, dzielenie przez 0 nie jest zdefiniowane. W dodatku nie masz rozpatrzonego przypadku, gdy obie liczby są identyczne. Ja tam widzę tylko warunki a > b oraz b > a. 
To, co chcę Ci przekazać, to fakt, że kod jest brzydko napisany, niechlujnie. Masz jakieś zbędne klamry momentami, w dodatku wiesz, co robi poniższy warunek
 

if (a%b == 0) cout << b;

? Otóż jeśli jest spełniony, to wypisuje w konsoli wartość zmiennej b, a następnie do zmiennej Dzielnik przypisuje a%b. Tyle, że jeśli a%b = 0, to Dzielnik = 0. 
Ogółem błędów jest sporo - nie wiadomo, co ma robić program (a przynajmniej ja nie wiem, co to najmniejsza wspólna wartość dwóch liczb, nie uczą tego na matematyce na studiach). Ponadto warunki są mało sensowne. Niby są sprawdzane jakieś warunki, ale ich spełnienie nie robi prawie nic. W dodatku nie masz opisanej sytuacji, gdy dwie liczby są równe. Gdy podasz dwie identyczne liczby, program się wysypie, bo Dzielnik jest niezdefiniowany - nie wiesz, co w nim jest, może jakieś śmieci, może 10, a może 0. 

komentarz 12 października 2020 przez Hubert_123 Początkujący (380 p.)

Teraz zauważyłem, że napisałem najmniejsza wspólna wartość a miało być najmniejsza wspólna wielokrotność.

 

komentarz 12 października 2020 przez Whiskey_Taster Pasjonat (15,610 p.)
No widzisz, jest to już zupełnie co innego. Skasuj to wszystko i najpierw napisz algorytm znajdujący największy wspólny dzielnik dwóch liczb - będzie Ci potrzebny w algorytmie. Następnie mając NWD możesz już znaleźć NWW. Wówczas nie trzeba nawet rozróżniać żadnych przypadków (pomijając 0), bo nawet jeśli dwie liczby będą równe, to NWD(a, a) = a i NWW(a, a)  = (a*a)/a = a
0 głosów
odpowiedź 12 października 2020 przez Utlamo Obywatel (1,540 p.)
Sądząc po nazwie problem leży tu:

Dzielnik = a%b;

Skoro to dzielnik to daj tak

Dzielnik = a/b;

teraz jest okej?
komentarz 12 października 2020 przez Hubert_123 Początkujący (380 p.)
Nazwałem tą zmienną tak, ponieważ miała ona dawać największy wspólny dzielnik liczb: a i b, więc z tym jest wszystko dobrze.

Podobne pytania

0 głosów
1 odpowiedź 209 wizyt
pytanie zadane 25 stycznia 2023 w C i C++ przez benny13 Obywatel (1,150 p.)
0 głosów
1 odpowiedź 107 wizyt
pytanie zadane 19 grudnia 2020 w C i C++ przez Eriss69 Gaduła (4,470 p.)
0 głosów
2 odpowiedzi 211 wizyt
pytanie zadane 28 sierpnia 2020 w C i C++ przez alek747 Nowicjusz (120 p.)

92,536 zapytań

141,377 odpowiedzi

319,452 komentarzy

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

...