Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

scanf i printf-kolejność oraz wpisywaniu kilku zmiennych naraz

Ostatnio zmodyfikowano 2016-08-29 18:06
Autor Wiadomość
kisiel7
Temat założony przez niniejszego użytkownika
scanf i printf-kolejność oraz wpisywaniu kilku zmiennych naraz
» 2016-08-29 16:34:35
Piszę od jakiegoś czasu w C i głowi mnie dlaczego bardzo często scanf, który znajduję się przed printf wykonuje się np. dwa razy podczas, gdy printf ma opóźnienie i co się dzieje, a na końcu np. program każe mi wpisać jeszcze raz jakieś dane mimo tego, że pętla się skończyła oraz co się dzieje gdy wpisujemy dwie zmienne w jednym scanfie i dlaczego takie programy(ze zmodyfikowanym składniowo kodem z C++) często przekraczają limit, mimo, że jego oryginał z C++ działa świetnie. 
Tutaj przykładowe kody(mało skomplikowane, chodzi tylko o problem tematu).

C/C++
#include<stdio.h>
int main()
{
    int t, n, kierunek, ile, poziom, pion;
    scanf( "%d", & t );
   
    while( t-- )
    {
        pion = 0;
        poziom = 0;
        scanf( "%d", & n );
        while( n-- )
        {
            scanf( "%d %d\n", & kierunek, & ile );
            if( kierunek == 0 ) pion += ile;
           
            if( kierunek == 1 ) pion -= ile;
           
            if( kierunek == 2 ) poziom -= ile;
           
            if( kierunek == 3 ) poziom += ile;
           
        }
        if( pion > 0 )
             printf( "0 %d\n", pion );
       
        if( pion < 0 )
             printf( "1 %d\n", - pion );
       
        if( poziom < 0 )
             printf( "2 %d\n", - poziom );
       
        if( poziom > 0 )
             printf( "3 %d\n", poziom );
       
        if(( poziom == 0 ) &&( pion == 0 ) )
             puts( "studnia" );
       
    }
    return 0;
}
C/C++
#include <stdio.h>
float delta( float a, float b, float c )
{
    return b * b - 4.0 * a * c;
}
int main() {
    int t;
    double a, b, c;
    while( scanf( "%lf", & a ) )
    {
        scanf( "%lf %lf", & b, & c );
        if( delta( a, b, c ) == 0 )
             puts( "1" );
        else if( delta( a, b, c ) > 0 )
             puts( "2" );
        else puts( "0" );
       
    }
    return 0;
}
[ \c pp ]
P-151210
Monika90
» 2016-08-29 17:17:37
C/C++
scanf( "%d %d\n", & kierunek, & ile );
znaku \n nie powinno tam być, powoduje on że scanf czeka na wpisanie nie-białego znaku


w drugim przypadku pętla powinna wyglądać tak
C/C++
while( scanf( "%lf", & a ) == 1 )
{
}
P-151215
kisiel7
Temat założony przez niniejszego użytkownika
» 2016-08-29 17:35:38
W tym pierwszy to rzeczywiście przeoczenie, ale jeśli chodzi o ten drugi to nie wiedziałem. Zastanawiam się teraz jak to się dzieje, że na stronach sprawdzających algorytmy ten drugi("oryginalny") kod nie przechodzi(przekracza czas) mimo, że na kompilatorze wszystko działa. Rozumiem, że ta jedynka oznacza, że dopóki będzie wpisywana prawidłowa zmienna(warunek logiczny 1) rób coś..., ale np. jak mam while(t--) to nie muszę wpisywać nic więcej.
P-151217
Monika90
» 2016-08-29 17:44:22
Jeżeli wyczerpane zostaną przypadki testowe to scanf zwróci EOF, a EOF jest różne od zera wiec twoja wersja pętli będzie się wykonywała nadal. W przeciwnym wypadku scanf zwraca ilość prawidłowo odczytanych zmiennych, tu masz tylko jedna zmienną, dlatego porównujemy z jedynką.
P-151218
kisiel7
Temat założony przez niniejszego użytkownika
» 2016-08-29 18:06:36
Ok, dzięki.
P-151226
« 1 »
  Strona 1 z 1