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

[C++] Działanie programu różne z wykorzystaniem funkcji i bez.

Ostatnio zmodyfikowano 2013-11-21 11:43
Autor Wiadomość
waldorm
Temat założony przez niniejszego użytkownika
[C++] Działanie programu różne z wykorzystaniem funkcji i bez.
» 2013-11-20 05:02:25
Witam, gdy pisałem ostatnio ćwiczeniowe programy na uczelnie zauważyłem coś takiego że dany program napisany za pomocą funkcji bywa, że ma inny efekt niż bez wykorzystania funkcji... Dla przykładu:

Program napisany z wykorzystaniem funkcji:
C/C++
#include <iostream>

using namespace std;

void write( int tab[] ) // funkcja wczytujaca oceny
{
    float a, srednia;
    for( int i = 0; i < 1010; i++ )
    {
        cin >> tab[ i ];
       
       
        if( tab[ i ] >= 2 && tab[ i ] <= 5 ) a += tab[ i ];
        else if( tab[ i ] == 1 )
        {
            srednia = a / i;
            cout.precision( 3 );
            cout << srednia << endl;
            i--;
        }
        else if( tab[ i ] == 0 )
        {
            for( i = 0; tab[ i ] > 0; i++ )
            {
                cout << tab[ i ] << " ";
            }
            cout << endl;
            i--;
        }
        else if( tab[ i ] == - 1 ) break;
       
    }
   
}

int main()
{
    int oceny[ 1010 ]; // tablica przechowyujaca oceny
    write( oceny );
   
   
}
Ma inne działanie niż program napisany bez tej funkcji:
C/C++
#include <iostream>

using namespace std;

int main()
{
    int oceny[ 1010 ]; // tablica przechowyujaca oceny
   
    float a, srednia;
    for( int i = 0; i < 1010; i++ )
    {
        cin >> oceny[ i ];
       
        if( oceny[ i ] >= 2 && oceny[ i ] <= 5 ) a += oceny[ i ];
        else if( oceny[ i ] == 1 ) // wypisanie sredniej
        {
            srednia = a / i;
            cout.precision( 3 );
            cout.setf( ios::showpoint );
            cout << srednia << endl;
            i--;
        }
        else if( oceny[ i ] == 0 ) // wypisanie poprzednich ocen
        {
            for( i = 0; oceny[ i ] > 0; i++ )
            {
                cout << oceny[ i ] << " ";
            }
            cout << endl;
            i--;
        }
        else if( oceny[ i ] == - 1 ) break; // zakonczenie programu
       
    }
    return 0;
}
Potrafi mi ktoś wytłumaczyć dlaczego takie zjawisko powstaje?
P-96756
Monika90
» 2013-11-20 09:13:59
W obydwu programach występuje odczyt z niezainicjalizowanej zmiennej, dlatego ich zachowanie jest całkowicie dowolne.
P-96763
waldorm
Temat założony przez niniejszego użytkownika
» 2013-11-20 11:57:39
Możesz powiedzieć w którym miejscu?
P-96772
Monika90
» 2013-11-20 12:10:00
Tu
a += tab[ i ]
 i tu
a / i
 i tu
tab[ i ] > 0
 i (co zależy od wersji języka) w wielu innych miejscach.

EDIT:
tab[ i ] > 0
 to akurat jest OK :)
P-96774
waldorm
Temat założony przez niniejszego użytkownika
» 2013-11-20 12:16:31
Mogłabyś wytłumaczyć jaśniej?:) Jestem dość początkujący i nie rozumiem. Przez inicjalizacje rozumiem nadanie wartości zmiennej, czyli jak mam nadać wartość zmiennej 'a' jeśli ja po prostu sumuje wartości które są w tablicy, do której wartości przypisywane są przez użytkownika?
P-96775
Monika90
» 2013-11-20 12:21:28
Jeżeli używasz zmiennej a jako akumulatora, to musisz jej nadać wartość początkową.
Np.
float a = 0, srednia;
P-96776
waldorm
Temat założony przez niniejszego użytkownika
» 2013-11-20 12:38:55
Aha, rozumiem tylko najlepsze to jest to, że ten program w funkcji źle działa a program bez funkcji dobrze działa a w obydwu ten sam błąd.
P-96778
Monika90
» 2013-11-20 12:45:42
ich zachowanie jest całkowicie dowolne.
Zatem może być i takie, które ty uważasz za poprawne.
A w ogóle skąd wiesz, że działa dobrze?
P-96779
« 1 » 2
  Strona 1 z 2 Następna strona