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

[C++] Liczenie sredniej z elementów listy dynamicznej.

Ostatnio zmodyfikowano 2013-05-08 00:30
Autor Wiadomość
awysocki93
Temat założony przez niniejszego użytkownika
[C++] Liczenie sredniej z elementów listy dynamicznej.
» 2013-04-30 16:45:38
Przy drukowaniu elementów, w pierwszym elemencie ocena jest zazwyczaj losowa i przedstawia dziwne liczby jak np. 1.58464e+029 zamiast 3.33. Kolejne elementy mają już dobrą średnia. To wycinek kodu odpowiedzialnego za to:
C/C++
id * wczytaj4( string ident ); //naglowek f-cji wczytujacej liste uzytkownikow ktorzy glosowali
element * wczytaj3( string nazwa ) //f-cja wczytujaca liste elementow
{
    element * glowa, * akt, * ogon;
    ifstream plik;
    double o, suma = 0, i = 0;
    plik.open( nazwa.c_str() );
    elementp x;
    glowa = new element;
    plik >> x.id >> x.marka >> x.model >> x.pojemnosc >> x.hp >> x.vmax >> x.sto; //wczytywanie z pliku elementów do listy
    glowa->id = x.id;
    glowa->marka = x.marka;
    glowa->model = x.model;
    glowa->pojemnosc = x.pojemnosc;
    glowa->hp = x.hp;
    glowa->vmax = x.vmax;
    glowa->sto = x.sto;
    id * oc = wczytaj4( glowa->id ); //wczytywanie listy z ocenami dla danego elementuq
    while( oc )
    {
        if( oc->ocena != 0 )
        {
            suma = suma + oc->ocena;
            i++;
            oc = oc->next;
        }
        else oc = oc->next;
       
    }
    if( i != 0 )
    {
        if( suma != 0 )
        {
            o = suma / i;
        }
        else o = 0;
       
    } else o = 0;
   
    glowa->ocena = o;
    glowa->next = NULL;
    ogon = glowa;
    delete oc;
    suma = 0;
    i = 0;
    o = 0;
    while( !plik.eof() )
    {
        plik >> x.id >> x.marka >> x.model >> x.pojemnosc >> x.hp >> x.vmax >> x.sto;
        akt = new element;
        akt->id = x.id;
        akt->marka = x.marka;
        akt->model = x.model;
        akt->pojemnosc = x.pojemnosc;
        akt->hp = x.hp;
        akt->vmax = x.vmax;
        akt->sto = x.sto;
        id * aoc = wczytaj4( akt->id );
        while( aoc )
        {
            if( aoc->ocena != 0 )
            {
                suma = suma + aoc->ocena;
                i++;
                aoc = aoc->next;
            }
            else aoc = aoc->next;
           
        }
        if( i != 0 )
        {
            if( suma != 0 )
            {
                o = suma / i;
            }
            else o = 0;
           
        } else o = 0;
       
        akt->ocena = o;
        akt->next = NULL;
        ogon->next = akt;
        ogon = akt;
        delete aoc;
        suma = 0;
        i = 0;
        o = 0;
    }
    plik.close();
    return glowa;
   
}
void drukuje( element * adres ) //drukowanie elementow
{
    while( adres )
    {
        cout << adres->id << ".    " << adres->marka << " " << adres->model << "\t" << adres->pojemnosc << " cm^3 " << adres->hp << " hp " << adres->vmax << " km/h " << adres->sto << " s | Ocena = " << adres->ocena << endl;
        adres = adres->next;
    }
}
id * wczytaj4( string ident ) //f-cja wczytujaca liste uzytkownikow ktorzy glosowali
{
    id * glowa, * aktualny, * ogon;
    ifstream plik; //otwieram plik o nazwie takiej jak id elementu
    plik.open( ident.c_str() );
    if( !plik.good() ) //jesli plik nie istnieje tworze plik o nazwie id elementu
    {
        ofstream plik1;
        plik1.open( ident.c_str() );
        plik1.close();
    }
    plik.close();
    ifstream plik3; //ponownie otwieram plik o nazwie takiej jak id elementu i wczytuje do listy login i ocene
    plik3.open( ident.c_str() );
    glowa = new id;
    plik3 >> glowa->log;
    plik3 >> glowa->ocena;
    glowa->next = NULL;
    ogon = glowa;
    while( !plik3.eof() )
    {
        aktualny = new id;
        plik3 >> aktualny->log;
        plik3 >> aktualny->ocena;
        aktualny->next = NULL;
        ogon->next = aktualny;
        ogon = aktualny;
    }
    plik3.close();
    return glowa;
}
P-81611
DejaVu
» 2013-04-30 21:27:45
Ten kod jest napisany w taki sposób, że nawet się go nie chce czytać... W każdym razie: sprawdź czy zawsze ustawiasz początkową wartość zmiennej. Poza tym: "cena jest zazwyczaj losowa" <= co to znaczy 'zazwyczaj'? Albo coś jest w programie losowane albo nie.
P-81632
awysocki93
Temat założony przez niniejszego użytkownika
» 2013-05-01 08:37:58
Możesz powiedzieć czemu jest źle napisany? Zawsze jest losowa, chodziło mi, że zazwyczaj jest to liczba typu 1.58464e+029 ale czasem pojawia się też 2.5 co także jest złym wynikiem.
P-81685
DejaVu
» 2013-05-01 12:21:57
C/C++
id * wczytaj4( string ident )
dopisz sobie couty w tej funkcji i zdiagnozuj gdzie są złe wartości wczytane
P-81692
awysocki93
Temat założony przez niniejszego użytkownika
» 2013-05-01 21:05:47
skorzystałem z twojej podpowiedzi, a nastepnie przebudowałem tą funkcję. teraz najpierw z pliku wczytuję dane a później te dane podstawiam do listy. teraz działa pięknie. możesz wyjaśnić czemu to zrobiło taką różnicę?
P-81760
DejaVu
» 2013-05-08 00:07:45
Nie jestem w stanie udzielić Ci odpowiedzi na Twoje kolejne pytania, bowiem nie czytałem Twojego kodu więcej, niż to było konieczne do napisania wcześniejszego posta :P No ale skoro problem rozwiązałeś to chyba wiesz gdzie był błąd?
P-82409
usmiech
» 2013-05-08 00:30:03
Zgadzam sie z DejaVu, boje sie pomyslec jak napiszesz program , ktory np wskaze uzutkownikowi jakie auto kupic w zaleznosci od liczby usterek, kosztow czesci, serwisu itp... doswiadczeni w programowaniu ludzie mowia.. pisz kod prosty I czytelny dla innych, pozdrawiam :)
P-82410
« 1 »
  Strona 1 z 1