Petla do while bez drukowania ostatniego wyniku na ekranie

0

Czesc, staram sie rozwiazac takie oto zadanie,

Napisać program, który wyznacza i drukuje liczby ciągu w ten sposób, że dwa pierwsze są równe odpowiednio 0 i 1,
a każdy następny wyraz jest sumą dwóch poprzednich. Liczby drukować aż do momentu, gdy przekroczą one stałą G.
Następnie wydrukować, ile było liczb parzystych i ile nieparzystych, ile dwucyfrowych i ile trzycyfrowych w tym ciągu.

Napisalem taki kod

#include <iostream>

using namespace std;

int main()
{
	const int G = 1500;
	int poprzedni = 0;
	int aktualny = 1;
	int suma;
	int licznik_parzystych = 0;
	int licznik_nieparzystych = 0;
	int licznik_dwucyfrowych = 0;
	int licznik_trzycyfrowych = 0;


	cout << aktualny;
	do
	{
		
		suma = poprzedni + aktualny;
		poprzedni = aktualny;
		aktualny = suma;
		cout << " " << suma;
		if (suma % 2 == 0)
		{
			licznik_parzystych++;
		}
		else
		{
			licznik_nieparzystych++;
		}
		if (suma < 100 && suma >= 10)
		{
			licznik_dwucyfrowych++;
		}
		else if (suma < 1000 && suma >=100)
		{
			licznik_trzycyfrowych++;
		}

	} while (suma <= G);

	cout << "\nPojawilo sie " << licznik_parzystych << " liczb parzystych i " << licznik_nieparzystych << " liczb nieparzystych. ";
	cout << "\nPojawilo sie " << licznik_dwucyfrowych << " liczb dwucyfrowych " << licznik_trzycyfrowych << " liczb trzycyfrowych. \n";
	system("pause");
	return 0;
}

Jednak nie do konca dziala tak jakbym chcial. Po pierwsze nie moge korzystac z tablic. Problem jest z petla do while, otoz wyswietla mi na koncu rowniez ostatni wynik wiekszy od stalej G.
Czy istnieje mozliwosc aby ten wynik sie nie wyswietlal ?

0

Zmień warunek na mniejszy od G, a nie mniejszy bądź równy.

0
litrmleka napisał(a):

Zmień warunek na mniejszy od G, a nie mniejszy bądź równy.

Dzieki za tak szybka odpowiedz ale niestety to nie pomoglo

screenshot-20190729100402.png

0

Może użyj while zamiast while..do, bo warunek sprawdza Ci po wykonaniu pętli. Teraz doczytałem treść zadania. Nie wypisuje Ci "0" na początku.

0
litrmleka napisał(a):

Może użyj while zamiast while..do, bo warunek sprawdza Ci po wykonaniu pętli. Teraz doczytałem treść zadania. Nie wypisuje Ci "0" na początku.

Po zapisaniu kodu w petli while niestety drukuje wciaz ostatni wynik.

	suma = poprzedni + aktualny;
	cout << " " << poprzedni << " " << aktualny;
	while (suma < G)
	{
		suma = poprzedni + aktualny;
		poprzedni = aktualny;
		aktualny = suma;
		cout << " " << suma;
		if (suma % 2 == 0)
		{
			licznik_parzystych++;
		}
		else
		{
			licznik_nieparzystych++;
		}
		if (suma < 100 && suma >= 10)
		{
			licznik_dwucyfrowych++;
		}
		else if (suma < 1000 && suma >= 100)
		{
			licznik_trzycyfrowych++;
		}
	}

Co do wydrukowania zero nie bylem pewnien czy ma byc wyswietlany wiec go nie wprowadzilem.
Jednak to poprawilem.

0

Sprawdzasz warunek zanim suma przekroczy limit.

0
litrmleka napisał(a):

Sprawdzasz warunek zanim suma przekroczy limit.

przyznam ze teraz nie rozumiem

0
MisiakPisiak napisał(a):
litrmleka napisał(a):

Sprawdzasz warunek zanim suma przekroczy limit.

przyznam ze teraz nie rozumiem

Sprawdzasz POPRZEDNI wyraz ciagu fibbonaciego. Musisz sprawdzic czy obecnie przetwarzany spelnia warunek

while true:
    curr = a + b
    if curr >= G: break
0
stivens napisał(a):
MisiakPisiak napisał(a):
litrmleka napisał(a):

Sprawdzasz warunek zanim suma przekroczy limit.

przyznam ze teraz nie rozumiem

Sprawdzasz POPRZEDNI wyraz ciagu fibbonaciego. Musisz sprawdzic czy obecnie przetwarzany spelnia warunek

while true:
    curr = a + b
    if curr >= G: break

Ha ! dziala !!!
Dziekuje !!
Wklejam kod,

/*
Napisać program, który wyznacza i drukuje liczby ciągu w ten sposób, że dwa pierwsze są równe odpowiednio 0 i 1, 
a każdy następny wyraz jest sumą dwóch poprzednich. Liczby drukować aż do momentu, gdy przekroczą one stałą G. 
Następnie wydrukować, ile było liczb parzystych i ile nieparzystych, ile dwucyfrowych i ile trzycyfrowych w tym ciągu.
*/

#include <iostream>

using namespace std;

int main()
{
	const int G = 1500;
	int poprzedni = 0;
	int aktualny = 1;
	int suma;
	int licznik_parzystych = 0;
	int licznik_nieparzystych = 0;
	int licznik_dwucyfrowych = 0;
	int licznik_trzycyfrowych = 0;


	cout << poprzedni << " " << aktualny;
	suma = poprzedni + aktualny;

	while (suma < G)
	{
		while (true)
		{
			suma = poprzedni + aktualny;
			if (suma <= G)
			{
				break;
			}
		}
		suma = poprzedni + aktualny;
		poprzedni = aktualny;
		aktualny = suma;
		cout << " " << suma;
		if (suma % 2 == 0)
		{
			licznik_parzystych++;
		}
		else
		{
			licznik_nieparzystych++;
		}
		if (suma < 100 && suma >= 10)
		{
			licznik_dwucyfrowych++;
		}
		else if (suma < 1000 && suma >= 100)
		{
			licznik_trzycyfrowych++;
		}
	}

	cout << "\nPojawilo sie " << licznik_parzystych << " liczb parzystych i " << licznik_nieparzystych << " liczb nieparzystych. ";
	cout << "\nPojawilo sie " << licznik_dwucyfrowych << " liczb dwucyfrowych " << licznik_trzycyfrowych << " liczb trzycyfrowych. \n";
	system("pause");
	return 0;
}

0

O matko. Nie tak :D

Tylko jeden while a nie while w while'u

0

Pętla musi wyglądać trochę inaczej:

#include <iostream>

using namespace std;

int main()
{
    const int G = 1500;
    int poprzedni = 0;
    int aktualny = 1;
    int suma;
    int licznik_parzystych = 0;
    int licznik_nieparzystych = 0;
    int licznik_dwucyfrowych = 0;
    int licznik_trzycyfrowych = 0;

    cout << aktualny;
    for (;;)
    {

        suma = poprzedni + aktualny;
        if (suma > G) break;

        poprzedni = aktualny;
        aktualny = suma;
        cout << " " << suma;
        if (suma % 2 == 0)
        {
            licznik_parzystych++;
        }
        else
        {
            licznik_nieparzystych++;
        }
        if (suma < 100 && suma >= 10)
        {
            licznik_dwucyfrowych++;
        }
        else if (suma < 1000 && suma >=100)
        {
            licznik_trzycyfrowych++;
        }

    }

    cout << "\nPojawilo sie " << licznik_parzystych << " liczb parzystych i " << licznik_nieparzystych << " liczb nieparzystych. ";
    cout << "\nPojawilo sie " << licznik_dwucyfrowych << " liczb dwucyfrowych " << licznik_trzycyfrowych << " liczb trzycyfrowych. \n";
    system("pause");
    return 0;
}
0
stivens napisał(a):

O matko. Nie tak :D

Tylko jeden while a nie while w while'u

Zastanawiam się dlaczego nie może być pętla w pętli?

1

A dlaczego zdanie "Ala ma kota." nie jest rownowazne "Kot ma Anię."? Mozesz wypowiedziec oba sformulowania ale czy to masz na mysli?

1

Gdyż pętla

while( true )
{
      suma = poprzedni + aktualny;
      if (suma <= G)
      {
          break;
      }
}

nigdy się nie skończy.

0

ok, poprawilem wzkorzystujac petle while.

	while (true)
	{
		suma = poprzedni + aktualny;
		if (suma >= G)
		{
			break;
		}
		poprzedni = aktualny;
		aktualny = suma;
		cout << " " << suma;
		if (suma % 2 == 0)
		{
			licznik_parzystych++;
		}
		else
		{
			licznik_nieparzystych++;
		}
		if (suma < 100 && suma >= 10)
		{
			licznik_dwucyfrowych++;
		}
		else if (suma < 1000 && suma >= 100)
		{
			licznik_trzycyfrowych++;
		}
	}

Dziekuje za pomoc !!
Jednak mam jeszcze pytanie do tej petli w petli ktora zrobilem. Otoz zastanawia mnie czemu to dzialalo.

1

Dosyc przypadkiem dzialalo. Przeanalizuj co sie dzieje debuggerem to zobaczysz ze wewnetrzny while sie wykonuje po 1 raz, potem znowu dodawales sume (drugi raz w tym samym obiegu) i na koncu zewnetrzny while konczyl zabawe bo nie byl spelniony. Jesli sume zmienialbys tylko raz to powinno sie zapetlic

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