Właśnie co z nudów uznałem że czas pobawić się w C++ (wcześniej jedynie php). Napisałem sobie w ramach ćwiczenia program rozwiązujący proste zadanie matematyczne. Wszystko było dobrze aż jeden if nie przestał mi działać (nie wiem po czym) a gapie się w ten ekran już chyba z pół godziny i nie mogę dojść o co biega. Pewnie jakieś głupstwo, no ale będę wdzięczny za wskazanie problemu. Oto kod:
#include
using namespace std;
float till2x (float a, float b)
{
float a1;
a1 = a;
while(a!=b*2)
{
a++;
b++;
}
a = a - a1;
return (a);
}
float ago2x (float a, float b)
{
float a1;
a1 = a;
while(a!=b*2)
{
a--;
b--;
}
a = a - a1;
return (a);
}
int main()
{
int y;
cout << "Czy chcesz sprawdzic kiedy twoj ojciec byl lub bedzie dwa razy starszy od ciebie?\n1. Tak\n2. Nie\n";
cin >> y;
cout << endl;
while(y==1)
{
float f;
float s;
cout << "Aby sprawdzic kiedy twoj ojciec bedzie od ciebie 2x starszy podaj jego wiek \n";
cin >> f;
if(f>0)
{
cout << endl << "Teraz podaj swoj wiek \n";
cin >> s;
if(s>0)
{
if(f/s>2)
{
float x;
x = till2x(f,s);
cout << endl << "Twoj ojciec bedzie od ciebie 2x starszy za " << x << " lat.\n";
}
else
{
float x;
x = ago2x(f,s);
cout << "Twoj ojciec byl od ciebie 2x starszy " << x << " lat temu.\n";
}
cout << endl << "Czy chcesz ponownie sprawdzic kiedy twoj ojciec byl lub bedzie dwa razy starszy od ciebie?\n1. Tak\n2. Nie\n";
cin >> y;
}
else
{
cout << "\n\nPodales nieprawidlowe dane!";
break;
}
}
else
{
cout << "\n\nPodales nieprawidlowe dane!";
break;
}
}
cout << "\n\n";
system("pause");
return 0;
}
Nie działa mi lnijka 51 “if(f/s>2)” - niezależnie czy jest większe czy mniejsze i tak wykonuje pierwszą instrukcję.
W tym if-ie powinno być if(f/s<2.0). Weźmy te Twoje przykładowe dane, czyli 20 i 15, i otrzymamy 20/15=1,(3). Jakby nie patrzeć nie jest to liczba większa niż 2.
A odnośnie samego programu … zastanów się co próbujesz wyliczyć. Jaki wg Ciebie powinien być wynik tego programu dla danych 20 i 15?
przy danych 20 i 15 powinno przejść do else i wykonać fukcję ago2x a następnie napisać “Twoj ojciec byl od ciebie 2x starszy 10 lat temu”, a on cały czas wykonuje to tak jakby 20/15>2 i wykonuje funkcję till2x i pisze “Twoj ojciec bedzie od ciebie 2x starszy za -10 lat.”
Przez przypadek przy przepisywaniu wszystkiego w ago2x zamiast a=a1-a wpisałem drugi raz a=a-a1. A całość ma logiczny sens dla ojca w wieku 50 lat a syna 30 - taka rzecz już jest normalna a odpowiedź będzie taka jak dla 20 i 15. A przed zabezpieczeniem, aby syn nie był starszy od ojca rzeczywiście nie pomyślałem
Wiesz w ogóle, co robi ta instrukcja? Tak się tego nie robi, bo nie ma sensu uzależniać kodu takiego programu od systemu operacyjnego. Użyj po prostu cin.get().
Jeszcze raz spojrzałem na ten kod i faktycznie, masz rację. Znaku nierówności nie trzeba ruszać. Ale to 2.0 zostaw w tym if-ie, żebyś porównywał float z float-em, a nie int z int-em.
Spoko Teraz jest OK. Zamiast negacji można by też zrobić >=, ale w sumie ! bardziej pasuje do linku, który wkleiłem powyżej. Łatwiej można się zorientować o co chodzi.
To zadanie sam sobie wymyśliłem na poczekaniu, aby zrobić program który coś naprawdę robi i chciałem użyć w miarę dużo rzeczy z tych których w tutorialach się nauczyłem. Dzięki wszystkim za rady i opinie, postaram się je uwzględnić zarówno teraz (od dla treningu) jak i na pewno w przyszłości się przydadzą gdy problemy do rozwiązania będą cięższe.
Tak naprawdę w funkcjach a i b są zawsze typu int, jednak float było potrzebne aby uwzględnić w if dzielenie z częścią ułamkową - dlatego zastosowałem float, ale fakt że potem można je zmienić na int, co by uniknąć problemów.
Jeśli na wejściu program ma zawsze otrzymywać liczby całkowite, to powinieneś już na samym początku użyć typu całkowitoliczbowego (o czym zresztą wspominał cayman3_11) do ich przechowywania. Tymczasem u Ciebie zmienne f i s są typu float (tak przy okazji … nadawaj zmiennym nazwy mówiące o ich przeznaczeniu, czyli zamiast tego f mogłeś chociaż zrobić fAge). Owszem w tym if-ie masz dzielenie z częścią ułamkową, ale wyniku tego dzielenia przecież nigdzie nie zapamiętujesz. Mógłbyś więc zrobić rzutowanie, czyli if((float)f/s>2.0) i uzyskałbyś dokładnie to co potrzebujesz. Później te Twoje funkcje jako parametry przyjmowałyby już zmienne całkowitoliczbowe i oszczędziłbyś sobie kłopotów, o których była mowa przed chwilą (mam na myśli fragment kodu, który wrzucił Mad.). Zasada jest prosta … o ile to możliwe unikaj typów zmiennoprzecinkowych.
I jeszcze jedno … rozumiem, że chciałeś wykorzystać jak najwięcej elementów języka, ale przecież w programowaniu nie chodzi o to, żeby komplikować kod na siłę Jak się da napisać prościej, to Twoim zadaniem jest to zrobić. Nic nie stoi na przeszkodzie, żeby sobie wymyślić kolejne zadanie, trudniejsze od tego. Jak znajdę to wrzucę Ci link do strony z zadaniami o różnym poziomie trudności.