[ overdose @ 09.09.2004. 10:25 ] @
Tekst zadatka glasi:

Napisati potprogram na programskom jeziku Pascal kojim se iz jednostruko ulančane liste zapisa o studentima izbacuju svi oni zapisi kod kojih je prosečna ocena manja od 8, kao i potprogram koji ispisuje prosečne ocene za sve studente o čijim ocenama postoje zapisi u listi. Prosečna ocena se računa tako što se poziva funkcija kojoj se prosleđuje zapis za koji se traži prosečna ocena. Ne treba pisati potprogram za unos liste, pretpostaviti da je već napisan, da se zove UnosListe i da kao rezultat vraća pokazivač na početak liste koju formira. Program najpre poziva potprogram za unos liste, zatim potprogram za ispis prosečnih ocena za sve studente u listi, zatim potprogram za izbacivanje zapisa po opisanom kriterijumu, a onda ponovo potprogram za ispis prosečnih ocena za sve studente u listi. Na kraju u glavnom programu treba dealocirati listu. Zapis o studentu sadrži sledeća polja: redni broj indeksa (u opsegu od 1 do 1000), godinu upisa, broj položenih ispita i niz od najviše 40 ocena većih od 5, dobijenih na tim ispitima.
Napomena: Potprogrami treba da razmenjuju podatke samo putem lista argumenata. Rešenje zadatka gde potprogrami direktno koriste promenljive glavnog programa ne donosi pun broj poena.


Kod je prilozen u atacmentu. Sve je proslo dobro osim u jednom specijalnom slucaju. Potrebno je analizirati proceduru 'Izbaci' koja pravi problem. Naime, kada poslednji unos (student) ima prosek <= 8 tada dolazi do runtime error-a. Drugim recima, kada prvi zapis u listi zadovoljava kriterijum za izbacivanje tada dolazi do problema (relevantan deo procedure sledi)

Code:

.
.
.
else
          begin
            stari:=tekuci;
            tekuci:=stari^.sledeci;
            stari^.sledeci:=nil;
            dispose(stari)
          end
.
.
.


Program je cak radio, samo pogresno, kada je koriscen drugi kompajler. Tada, u tom specijalnom slucaju, je ispisivan samo taj student koji ima prosek <= 8 (!?), a njegov redni broj je bio potpuno netacan i veliki. Dakle,neki za*** je sigurno, samo ne vidim gde ?

OverDose
[ stalker @ 09.09.2004. 11:22 ] @
Mislim da treba ovako:
Code:

                  tekuci:=tekuci^.sledeci;
                  dispose(ListaZaObradu);
                  ListaZaObradu:=tekuci;

Necu da objasnjavam jer si ostatak lepo uradio, tako da pretpostavljam da znas sta hocu da kazem. Kompajlirao sam sa fpc-om (gpc nemam) i radi lepo.
P.S. I meni je ovo lepa vezba pred ispit;)
[ overdose @ 09.09.2004. 11:51 ] @
stalker, hvala na brzom odgovoru ! Sada je sve korektno. :) Greska u mom delu koda je bila sto sam baratao sa pokazivacem tekuci (koji sam poistovetio sa ListaZaObradu) umesto sa ListaZaObradu, jer kad procedura vrati listu glavnom programu onda se poziva procedura za ispis kojoj se predaje pokazivac na pocetak liste koji u mom slucaju pokazuje ni na sta (jer je uradjen dispose prvog, a pokazivac ListaZaObradu nije azuriran).

over