Przerywająca się pętla for

0

Nie wiem dlaczego ta pętla się przerywa, próbowałem zapisu (wyrażenie relacyjne)!=true/==false i to samo. Raz się wykona i przerywa. Próbowałem zapisu i< 40 i dobrze zwracało wartości boolowskie. Proszę jakieś wskazówki bo zgłupiałem

 
#include <iostream>

int main()
{
	using namespace std;


    
    double os1[1000], os2[100];

    os1[0]= 100.0;
    os2[0]= 100.0; 
    os1[1] = os1[0] + os1[0] * 0.1;   // zysk co 10% pierwotnego kapitału
    os2[1] = os2[0] + os2[0] * 0.05; 
    

	int j=1;
	// petla przerywa się gdzy os1 osiagnie wiekszy zysk od os1
	for (int i=1; (os1[i] < Dafne[i]) ; ++i, j++)
	{
		os2[i] = os2[i-1] + os2[0] * 0.1;   // zysk co 10% pierwotnego kapitału
		os1[i] = os1[i-1] + os1[i-1] * 0.05;  // procent składany
		cout.setf(ios_base::boolalpha); 
		cout << "os1 " << os1[i] << "Dafne " << os2[i] <<" " << (os1[i] < os2[i]) << endl;
	}

    return 0;
}
	


0

Dam zamiast Dafne w warunku pętli jest os2 :P, teraz się pomyliłem pisząc post.

0

W warunku pętli sprawdzasz co się dzieje w komórkach o indeksie i, ale odpowiednie wartości tych komórek wyznaczasz dopiero po zrobieniu testu. Kolejność powinna być odwrotna czyli w warunku pętli weź i-1 zamiast i lub wewnątrz pętli i + 1 zamiast i. Poza tym na początku jedna wartość jest równa drugiej (obydwa salda to 100) dlatego powinieneś dać tam nierówność słabą (>=) lub sprawdzać warunek dopiero po wykonaniu pierwszego kroku. Kolejnym błędem jest kierunek porównania. Zamiast (<) powinno być (>). Saldo liniowe (s1) z początku rośnie szybciej niż saldo składane (s2) i dopiero po jakimś czasie się zrównają.

Tak poza tym to zrezygnuj w ogóle z tablicy, nie potrzebujesz jej. Obliczaj na bieżąco aktualne saldo, potrzebujesz mieć informację tylko z poprzedniego i pierwszego okresu rozliczeniowego. Ponazywaj magiczne liczby stałymi!

const double wklad = 100;
const double procent_liniowy = 0.10;
const double procent_skladany = 0.05;

double saldo_liniowe = wklad;
double saldo_skladane = wklad;

do {
    saldo_liniowe += wklad * procent_liniowy;
    saldo_skladane *= 1 + procent_skladany;
}
while (saldo_liniowe > saldo_skladane)

Dodatkowo jeśli w zadaniu nie każą Ci wypisywać salda z każdego okresu rozliczeniowego to nawet pętla ci nie jest potrzebna, a wszytko można wyliczyć jednym wzorem. Z poniższego równania trzeba wyznaczyć dodatnią liczbę 'N' i zaokrąglić ją w górę (jest to ilość okresów rozliczeniowych po których saldo składane zrówna się lub przewyższy saldo liniowe):
wklad * (1 + N * procent_liniowy) = wklad * ((1 + procent_skladany) ^ N)Jak łatwo zauważyć wysokość wkładu nie robi różnicy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1