[C++] Liczenie sredniej z elementów listy dynamicznej.
Ostatnio zmodyfikowano 2013-05-08 00:30
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: id * wczytaj4( string ident ); element * wczytaj3( string nazwa ) { 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; 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 ); 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 ) { 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 ) { id * glowa, * aktualny, * ogon; ifstream plik; plik.open( ident.c_str() ); if( !plik.good() ) { ofstream plik1; plik1.open( ident.c_str() ); plik1.close(); } plik.close(); ifstream plik3; 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; } |
|
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. |
|
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. |
|
DejaVu |
» 2013-05-01 12:21:57 id * wczytaj4( string ident )
dopisz sobie couty w tej funkcji i zdiagnozuj gdzie są złe wartości wczytane |
|
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ę? |
|
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? |
|
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 :) |
|
« 1 » |