Dlaczego wynik wypisuje się po zakończeniu pętli, a nie w trakcie?

0

Mam za zadanie napisać program który dla podanej ilości par liczba, będzie zliczał ile razy w dodawaniu pod kreską będzie trzeba przenieść 1 do przodu. Ale pojawia się problem, że wyniki pokazują się po ukończeniu pętli, a nie podczas.

#include <iostream>
using namespace std;
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int n;
    long long a,b;
    cin>>n;
    for (int i=1;i<=n;i++)
    {
        int p=0,liczba_przeniesien=0;
        cin>>a>>b;
        while(a!=0 || b!=0)
        {
            if (a%10+b%10+p>=10)
            {
                p=1;
                liczba_przeniesien++;
            }
            else
            {
                p=0;
            }
            a=a/10;
            b=b/10;
        }
        if ((a==9 || b==9) && p==1) liczba_przeniesien++;
        cout<<liczba_przeniesien<<"\n";
    }
    return 0;
}

Próbowałem też z while z warunkiem, że zostały podane dane wejściowe, ale wtedy nic nie wypisuje, tylko od razu przechodzi do podania następnych danych wejściowych.

#include <iostream>
using namespace std;
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int n;
    long long a,b;
    cin>>n;
    while (cin>>a>>b)
    {
        int p=0,liczba_przeniesien=0;
        
        while(a!=0 || b!=0)
        {
            if (a%10+b%10+p>=10)
            {
                p=1;
                liczba_przeniesien++;
            }
            else
            {
                p=0;
            }
            a=a/10;
            b=b/10;
        }
        if ((a==9 || b==9) && p==1) liczba_przeniesien++;
        cout<<liczba_przeniesien<<"\n";
    }
    return 0;
}

Mógłby mi ktoś powiedzieć dlaczego wynik wypisuje się po zakończeniu pętli?

0

Ale pojawia się problem, że wyniki pokazują się po ukończeniu pętli, a nie podczas.

Em, bo cout masz poza pętlą while, a nie ma go w środku?

0
dalbajob napisał(a):

Ale pojawia się problem, że wyniki pokazują się po ukończeniu pętli, a nie podczas.

Em, bo cout masz poza pętlą while, a nie ma go w środku?

Cout jest wpisane w pętle for w przykładzie 1, a w przykładzie 2 w pierwszą pętle while. Program z przykładu 1 wypisuje dobre wyniki, tylko niestety po zakończeniu pętli for, a moim zamiarem było, żeby wypisywał podczas każdego przejścia pętli.

0
jyyyyyg napisał(a):
dalbajob napisał(a):

Ale pojawia się problem, że wyniki pokazują się po ukończeniu pętli, a nie podczas.

Em, bo cout masz poza pętlą while, a nie ma go w środku?

Cout jest wpisane w pętle for w przykładzie 1, a w przykładzie 2 w pierwszą pętle while. Program z przykładu 1 wypisuje dobre wyniki, tylko niestety po zakończeniu pętli for, a moim zamiarem było, żeby wypisywał podczas każdego przejścia pętli.

W 2 przykładzie zamieniłeś for na while i cout jest dalej poza wewnętrzną pętlą while. Dodaj drugiego couta do wewnętrznej pętli i zobacz co się stanie.

0
dalbajob napisał(a):
jyyyyyg napisał(a):
dalbajob napisał(a):

Ale pojawia się problem, że wyniki pokazują się po ukończeniu pętli, a nie podczas.

Em, bo cout masz poza pętlą while, a nie ma go w środku?

Cout jest wpisane w pętle for w przykładzie 1, a w przykładzie 2 w pierwszą pętle while. Program z przykładu 1 wypisuje dobre wyniki, tylko niestety po zakończeniu pętli for, a moim zamiarem było, żeby wypisywał podczas każdego przejścia pętli.

W 2 przykładzie zamieniłeś for na while i cout jest dalej poza wewnętrzną pętlą while. Dodaj drugiego couta do wewnętrznej pętli i zobacz co się stanie.

Ale wewnętrzna pętla odpowiada za zliczanie dwóch cyfr i czy będzie przeniesienie do następnej cyfry. A zewnętrzna za kolejne pary liczb i program ma wypisać liczbę przeniesień dla par liczb. Jak pisałem program z for wypisuje dobre wyniki, odpowiednią ilość razy i w dobrej kolejności, tylko niestety na końcu programu. Jeśli dam cout do wewnętrznej pętli to będzie mi wypisywać wynik obliczony po każdej cyfrze. W przykładzie 1 jeśli dam liczbę par jako 1 i liczby jako 55 i 55, oraz skopiuj cout i wkleję do wewnętrznej pętli to wynik będzie: 1,2,2. W przypadku gdy napiszę liczbę par jako 2 i druga para będzie też równa 55 i 55 to wynik będzie:1,2,2,1,2,2. Pytam się która część kodu odpowiada za to że w powyższym przykładzie wypisuje się po zakończeniu a w poniższym podczas pętli.

#include <iostream>
using namespace std;
int main()
{
    int n,a,b=0;
    cin>>n;
    for (int i=1;i<=n;i++)
    {
        cin>>a;
        if (a%2==0) b++;
        cout<<b<<"\n";
    }
    return 0;
}
1
jyyyyyg napisał(a):
dalbajob napisał(a):
jyyyyyg napisał(a):
dalbajob napisał(a):

Ale pojawia się problem, że wyniki pokazują się po ukończeniu pętli, a nie podczas.

Em, bo cout masz poza pętlą while, a nie ma go w środku?

Cout jest wpisane w pętle for w przykładzie 1, a w przykładzie 2 w pierwszą pętle while. Program z przykładu 1 wypisuje dobre wyniki, tylko niestety po zakończeniu pętli for, a moim zamiarem było, żeby wypisywał podczas każdego przejścia pętli.

W 2 przykładzie zamieniłeś for na while i cout jest dalej poza wewnętrzną pętlą while. Dodaj drugiego couta do wewnętrznej pętli i zobacz co się stanie.

Ale wewnętrzna pętla odpowiada za zliczanie dwóch cyfr i czy będzie przeniesienie do następnej cyfry. A zewnętrzna za kolejne pary liczb i program ma wypisać liczbę przeniesień dla par liczb. Jak pisałem program z for wypisuje dobre wyniki, odpowiednią ilość razy i w dobrej kolejności, tylko niestety na końcu programu. Jeśli dam cout do wewnętrznej pętli to będzie mi wypisywać wynik obliczony po każdej cyfrze. W przykładzie 1 jeśli dam liczbę par jako 1 i liczby jako 55 i 55, oraz skopiuj cout i wkleję do wewnętrznej pętli to wynik będzie: 1,2,2. W przypadku gdy napiszę liczbę par jako 2 i druga para będzie też równa 55 i 55 to wynik będzie:1,2,2,1,2,2. Pytam się która część kodu odpowiada za to że w powyższym przykładzie wypisuje się po zakończeniu a w poniższym podczas pętli.

#include <iostream>
using namespace std;
int main()
{
    int n,a,b=0;
    cin>>n;
    for (int i=1;i<=n;i++)
    {
        cin>>a;
        if (a%2==0) b++;
        cout<<b<<"\n";
    }
    return 0;
}

OK już chyba rozumiem, napisz proszę w głównym poście że chodzi ci o pętlę for

Ja bym powiedział że chodzi o to, że tam masz "\n" który nie wymusza "flushowania" bufora, a nie endl który to wymusza i dlatego dostajesz wynik dopiero na koniec - https://stackoverflow.com/a/213977. Spróbuj z endl zamiast "\n"

Natomiast czemu to działa w tym kodzie który wkleiłeś wyżej - nie mam pojęcia, jakieś czarne magie z tym buforowaniem. Na jakim systemie to uruchamiasz, Windows, Linux, Mac?

0
dalbajob napisał(a):
jyyyyyg napisał(a):
dalbajob napisał(a):
jyyyyyg napisał(a):
dalbajob napisał(a):

Ale pojawia się problem, że wyniki pokazują się po ukończeniu pętli, a nie podczas.

Em, bo cout masz poza pętlą while, a nie ma go w środku?

Cout jest wpisane w pętle for w przykładzie 1, a w przykładzie 2 w pierwszą pętle while. Program z przykładu 1 wypisuje dobre wyniki, tylko niestety po zakończeniu pętli for, a moim zamiarem było, żeby wypisywał podczas każdego przejścia pętli.

W 2 przykładzie zamieniłeś for na while i cout jest dalej poza wewnętrzną pętlą while. Dodaj drugiego couta do wewnętrznej pętli i zobacz co się stanie.

Ale wewnętrzna pętla odpowiada za zliczanie dwóch cyfr i czy będzie przeniesienie do następnej cyfry. A zewnętrzna za kolejne pary liczb i program ma wypisać liczbę przeniesień dla par liczb. Jak pisałem program z for wypisuje dobre wyniki, odpowiednią ilość razy i w dobrej kolejności, tylko niestety na końcu programu. Jeśli dam cout do wewnętrznej pętli to będzie mi wypisywać wynik obliczony po każdej cyfrze. W przykładzie 1 jeśli dam liczbę par jako 1 i liczby jako 55 i 55, oraz skopiuj cout i wkleję do wewnętrznej pętli to wynik będzie: 1,2,2. W przypadku gdy napiszę liczbę par jako 2 i druga para będzie też równa 55 i 55 to wynik będzie:1,2,2,1,2,2. Pytam się która część kodu odpowiada za to że w powyższym przykładzie wypisuje się po zakończeniu a w poniższym podczas pętli.

#include <iostream>
using namespace std;
int main()
{
    int n,a,b=0;
    cin>>n;
    for (int i=1;i<=n;i++)
    {
        cin>>a;
        if (a%2==0) b++;
        cout<<b<<"\n";
    }
    return 0;
}

OK już chyba rozumiem, napisz proszę w głównym poście że chodzi ci o pętlę for

Ja bym powiedział że chodzi o to, że tam masz "\n" który nie wymusza "flushowania" bufora, a nie endl który to wymusza i dlatego dostajesz wynik dopiero na koniec - https://stackoverflow.com/a/213977. Spróbuj z endl zamiast "\n"

Natomiast czemu to działa w tym kodzie który wkleiłeś wyżej - nie mam pojęcia, jakieś czarne magie z tym buforowaniem. Na jakim systemie to uruchamiasz, Windows, Linux, Mac?

Dzięki już działa, zapamiętam różnicę pomiędzy nimi. Uruchamiam na windowsie.

0
jyyyyyg napisał(a):
dalbajob napisał(a):
jyyyyyg napisał(a):
dalbajob napisał(a):
jyyyyyg napisał(a):
dalbajob napisał(a):

Ale pojawia się problem, że wyniki pokazują się po ukończeniu pętli, a nie podczas.

Em, bo cout masz poza pętlą while, a nie ma go w środku?

Cout jest wpisane w pętle for w przykładzie 1, a w przykładzie 2 w pierwszą pętle while. Program z przykładu 1 wypisuje dobre wyniki, tylko niestety po zakończeniu pętli for, a moim zamiarem było, żeby wypisywał podczas każdego przejścia pętli.

W 2 przykładzie zamieniłeś for na while i cout jest dalej poza wewnętrzną pętlą while. Dodaj drugiego couta do wewnętrznej pętli i zobacz co się stanie.

Ale wewnętrzna pętla odpowiada za zliczanie dwóch cyfr i czy będzie przeniesienie do następnej cyfry. A zewnętrzna za kolejne pary liczb i program ma wypisać liczbę przeniesień dla par liczb. Jak pisałem program z for wypisuje dobre wyniki, odpowiednią ilość razy i w dobrej kolejności, tylko niestety na końcu programu. Jeśli dam cout do wewnętrznej pętli to będzie mi wypisywać wynik obliczony po każdej cyfrze. W przykładzie 1 jeśli dam liczbę par jako 1 i liczby jako 55 i 55, oraz skopiuj cout i wkleję do wewnętrznej pętli to wynik będzie: 1,2,2. W przypadku gdy napiszę liczbę par jako 2 i druga para będzie też równa 55 i 55 to wynik będzie:1,2,2,1,2,2. Pytam się która część kodu odpowiada za to że w powyższym przykładzie wypisuje się po zakończeniu a w poniższym podczas pętli.

#include <iostream>
using namespace std;
int main()
{
    int n,a,b=0;
    cin>>n;
    for (int i=1;i<=n;i++)
    {
        cin>>a;
        if (a%2==0) b++;
        cout<<b<<"\n";
    }
    return 0;
}

OK już chyba rozumiem, napisz proszę w głównym poście że chodzi ci o pętlę for

Ja bym powiedział że chodzi o to, że tam masz "\n" który nie wymusza "flushowania" bufora, a nie endl który to wymusza i dlatego dostajesz wynik dopiero na koniec - https://stackoverflow.com/a/213977. Spróbuj z endl zamiast "\n"

Natomiast czemu to działa w tym kodzie który wkleiłeś wyżej - nie mam pojęcia, jakieś czarne magie z tym buforowaniem. Na jakim systemie to uruchamiasz, Windows, Linux, Mac?

Dzięki już działa, zapamiętam różnicę pomiędzy nimi. Uruchamiam na windowsie.

Ze zmianą na endl nawet to z while działa.

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