Znalazłem taki kod jako rozwiązanie zadania MWPZ06A Ciążowy Specjalista:
unsigned N, X, Y, Z;
for (cin >> N; N--; cout << (unsigned)(12 * (Y - X / (Z - 1.)) + 0.5) << endl) cin >> X >> Y >> Z;
Nie rozumiem tego kodu, bo gdziekolwiek czytam opis pętli for, to mam taki:
for (initialization; condition; increase) statement;
czyli intialization to wczytanie N. I to jest jedyny element który rozumiem
Pytanie 1. Condition to N--. Tego nie rozumiem. Jak warunkiem może być zmniejszenie N? Przede wszystkim warunek to tylko porównanie i nie powinien być wykonywany..? A tutaj jest wykonywany? Dlaczego?
Pomijając fakt wykonania, to rozumiem, że pętla będzie wykonywana do momentu uzyskania FALSE, tj. N stanie się zero.
Pytanie 2. increase to cout. To już najbardziej mnie rozwala... przecież tutaj nie ma żadnego increase i ten kod nie jest zgodny z definicją... :( chcę płakać, bo ktoś mnie tu oszukuje...
Jeszcze na koniec same wyliczenia to kolejny koszmar, którego nie rozumiem
Pytanie 3. Dlaczego we wzorze mamy jeden z kropką? Mam na myśli (Z-1.). Co to ma za znaczenie, czy 1 jest z kropką czy bez?
Pytanie 4. Dlaczego w tym wzorze dodaje 0.5? Gdy liczę tym wzorem na signed int, to daje mi złe rezultatu. Czyli dla przykładowych wejść wychodzi 9.5, 1.5, etc. Z kolei ten wzór działa gdy wszystkie zmienne są zdefiniowane jako unsigned, a wynik ze wzoru jest rzutowany na unsigned.
Samemu napisałem taki wzór: cin >> X >> Y >> Z; cout << (-12 * ((X + Y) - Y * Z) / (Z - 1)) << endl;
W tej sytuacji oba wzory dają te same, prawidłowe rezultaty:
unsigned int X, Y, Z;
cin >> X >> Y >> Z;
cout << (-12 * ((X + Y) - Y * Z) / (Z - 1)) << endl;
cout << (unsigned)(0.5+ 12 * (Y - X / (Z - 1.)) ) << endl;
Natomiast w poniżeszej sytuacji pierwszy wzór daje dziwne, bardzo wysokie wartości (rozumiem, że to z powodu usunięcia ujemnych i przesunięcia wartości), ale drugi wzór nadal daje prawie dobry wynik tylko, że za duży o te dziwne 0.5. Pytanie 5. Dlaczego drugi wzór nie został przesunięty po usunięciu ujemnych?
unsigned int X, Y, Z;
cin >> X >> Y >> Z;
cout << (unsigned)(-12 * ((X + Y) - Y * Z) / (Z - 1)) << endl;
cout << (0.5+ 12 * (Y - X / (Z - 1.)) ) << endl;