Baza studentów - funkcja sumująca kwoty z listy rat

0

Witam ! Mam problem z napisaniem pewnej funkcji :( Chodzi o funkcje "Uzupelnij_raty" w kodzie poniżej. Napisalem cos takiego ale źle działa :( ma ona za zadanie dla kazdego studenta osobno przeglądać liste z ratami i jeśli kierunek studiow w rekordzie z ratami i w rekordzie ze studentami oraz jesli wynik funkcji "kalendarz" będzie rowny 1 to ma dodawac kwoty wszystkich rat pasujacych do platnosci studenta.
Teraz niestety dziala jak sama chce :( Byłbym bardzo wdzieczny za jakąkolwiek pomoc :(

program project1;
uses CRT,Dos,SysUtils;
type TNazwa = string[50];
     TPlatnosci = record
                  wplacone:integer;
                  wszystkie:integer;
                  pozostale:integer;
                  end;

     TStudent = record
                nazwisko:TNazwa;
                imie:TNazwa;
                data_ur:DateTime;
                kier:TNazwa;
                platnosci:TPlatnosci;
                data_przyjecia:TDateTime;
                end;
     TRata = record
             dla:TNazwa;
             nr:byte;
             kwota:integer;
             data_raty:TDateTime;
             end;
     TWsk = ^TElement;
     TElement = record
                student:TStudent;
                prev,next:TWsk;
                end;
     TWsk_rata = ^TElement_rata;
     TElement_rata = record
                raty:TRata;
                prev,next:TWsk_rata;
                end;

var P,K:TWsk;
    P_r,K_r:TWsk_rata;
    DD,DM,DR,dw:word;
{**********************************************************************}
function Dzisiejsza_data():TDateTime;
begin
 GetDate(DR,DM,DD,dw);
 Dzisiejsza_data:=EncodeDate(DR,DM,DD);
end;
{**********************************************************************}
function kalendarz( data_przyjecia:TDateTime; Data_raty:TDateTime; Dzisiejsza_data:TDateTime): word;
var dt:TDateTime;
     k:word;
begin
      k:=0;
      dt:=data_raty;
      if (data_przyjecia<=dt)and(dt<=Dzisiejsza_data) then k:=1;
      kalendarz:=k;
end;
{*******************************************************************}
procedure Uzupelnij_raty( P_r:TWsk_rata ; P:TWsk);
var suma:integer;
    W:TWsk_rata;
begin
     while P<>NIL do
               begin
               suma:=0;
               W:=P_r;
               while W<>NIL do
                     begin
                     if (kalendarz(P^.student.data_przyjecia,W^.raty.data_raty,Dzisiejsza_data)=1) and (P^.student.kier = P_r^.raty.dla) then
                         begin
                         suma:=suma+ W^.raty.kwota;
                         end;
                     P^.student.platnosci.wszystkie:=suma;
                     W:=W^.next;
                     end;
               P:=P^.next;
               end;
end;
{*******************************************************************}
procedure Wprowadz_studenta(var x:TStudent);
var day,month,year:word;
begin
with x do
  begin
  write('Nazwisko: '); readln(nazwisko);
  write('Imie: '); readln(imie);
  write('Data urodzenia: ');
  with data_ur do readln(day,month,year);
  write('Kierunek studiow: '); readln(kier);
  write('platnosci wplacone: '); readln(platnosci.wplacone);
  platnosci.wszystkie:=0;
  platnosci.pozostale:=0;
  write('Data przyjecia: ');
  readln(day,month,year); data_przyjecia:=EncodeDate(year,month,day);
  end;
end;
{*******************************************************************}
procedure Pokaz_studenta(x:TStudent);
begin
with x do
  begin
  write(nazwisko); GotoXY(20,WhereY);
  write(imie); GotoXY(30,WhereY);
  with data_ur do write(day:2,'.',month:2,'.',year:4);
  GotoXY(45,WhereY); write(kier);
  GotoXY(70,WhereY); writeln(platnosci.wszystkie);
  end;
end;
{*******************************************************************}
procedure Dodaj_do_listy(var P,K:TWsk ; x:Tstudent);
var Q:TWsk;
begin
New(Q);
Q^.student:=x; Q^.prev:=NIL; Q^.next:=NIL;
IF (P = NIL) and (K=NIL) then
       begin
       P:=Q;
       K:=Q;
       end
else begin
     K^.next:=Q;
     Q^.prev:=K;
     K:=Q;
     end;
end;
{*******************************************************************}
procedure Dodaj_nowe_dane(var P,K:TWsk);
var x:TStudent;
    z:char;
begin
write('Czy chcesz dodac nowe dane ? (T/N) : ');
repeat
z:=UpCase(ReadKey)
until z in ['N','T'];
writeln(z);
while z='T' do
   begin
   Wprowadz_studenta(x);
   Dodaj_do_listy(P,K,x);
   write('Czy chcesz dodac nowa osobe ? (T/N) : ');
   repeat
   z:=UpCase(ReadKey)
   until z in ['N','T'] ;
   writeln(z);
   end;
end;
{*******************************************************************}
procedure Wyswietl_liste(P:Twsk);
begin
while P<>NIL do
    begin
    Pokaz_studenta(P^.student);
    P:=P^.next;
    end;
end;
{*******************************************************************}
procedure Wyszukaj_nazwisko(P,K:TWsk);
var nazwisko:string[30];
    il:word;
begin
il:=0;
writeln('Podaj nazwisko: '); readln(nazwisko);
while (P<>NIL) or (P=K) do
    begin
    if (nazwisko=P^.student.nazwisko) then
                                        begin
                                        Pokaz_studenta(P^.student);
                                        il:=il+1;
                                        end;
    P:=P^.next;
    end;
if il=0 then writeln('Nie znaleziono takiego nazwiska ! ');
readln;
end;
{*******************************************************************}
procedure Do_pliku(P:TWsk;n_p:string);
var plik:file of TStudent;
begin
Assign(plik,n_p); rewrite(plik);
while (P<>NIL) do
    begin
    write(plik,P^.student);
    P:=P^.next;
    end;
close(plik);
end;
{*******************************************************************}
procedure Z_pliku(var P,K:TWsk;n_p:string);
var plik:file of TStudent;
    x:TStudent;
begin
Assign(plik,n_p); reset(plik);
while not EOF(plik) do
    begin
    read(plik,x);
    Dodaj_do_listy(P,K,x);
    end;
close(plik);
end;
{*******************************************************************}
function szukaj(P : TWsk; nazwisko: TNazwa) : TWsk;
begin
    while (P <> nil) and (P^.student.nazwisko <> nazwisko) do
          P :=P^.next;
    szukaj := P;
end;
{*******************************************************************}
procedure usun_wybrany_element(var P : TWsk);
var
  pom, tmp : TWSk;
  nazwisko : TNazwa;
begin
  write('Podaj nazwisko ucznia: ');
  readln(nazwisko);
  tmp := szukaj(P, nazwisko);
  if tmp = nil then
    write('nie ma takiego ucznia')
  else
    begin
       if tmp = P then
         begin
            if (P^.next=NIL) then begin
                                  P:=NIL;
                                  K:=NIL;
                                  end
            else begin
                 P := P^.next;
                 P^.prev := nil;
                 dispose(tmp);
                 end;
         end
       else
           begin
                pom := P;
                while pom^.next <> tmp do
                      pom := pom^.next;
                pom^.next := tmp^.next;
                if tmp^.next <> nil then
                  tmp^.next^.prev := pom;
                dispose(tmp);
           end;
    end;
  readln;
end;
{*******************************************************************}
procedure usun_liste(var P:TWsk);
var Q:TWsk;
begin
while P<>NIL do
       begin
       Q:=P;
       P:=P^.next;
       dispose(Q);
       end;
end;
{******************************************************************}
procedure Wprowadz_rate(var x:TRata);
var day,month,year:word;
begin
with x do
  begin
  write('Dla kieruku: '); readln(dla);
  write('Numer raty - w czasie trwania studiów: '); readln(nr);
  write('Kwota: '); readln(kwota);
  write('Data raty: ');
  readln(day,month,year); data_raty:=EncodeDate(year,month,day);
  end;
end;
{*******************************************************************}
procedure Pokaz_rate(x:TRata);
var day,month,year:word;
begin
with x do
  begin
  write(dla); GotoXY(27,WhereY);
  write(nr);GotoXY(30,WhereY);
  write(kwota); GotoXY(40,WhereY);
  DecodeDate(data_raty,year,month,day);write(day:2,'.',month:2,'.',year:4);
  end;
writeln;
end;
{*******************************************************************}
procedure Dodaj_do_listy_rat(var P_r,K_r:TWsk_rata ; x:TRata);
var Q:TWsk_rata;
begin
New(Q);
Q^.raty:=x; Q^.prev:=NIL; Q^.next:=NIL;
IF (P_r = NIL) and (K_r=NIL) then
       begin
       P_r:=Q;
       K_r:=Q;
       end
else begin
     K_r^.next:=Q;
     Q^.prev:=K_r;
     K_r:=Q;
     end;
end;
{*******************************************************************}
procedure Dodaj_rate(var P_r,K_r:TWsk_rata);
var x:TRata;
    z:char;
begin
write('Czy chcesz dodac nowa rate ? (T/N) : ');
repeat
z:=UpCase(ReadKey)
until z in ['N','T'];
writeln(z);
while z='T' do
   begin
   Wprowadz_rate(x);
   Dodaj_do_listy_rat(P_r,K_r,x);
   write('Czy chcesz dodac nowa rate ? (T/N) : ');
   repeat
   z:=UpCase(ReadKey)
   until z in ['N','T'] ;
   writeln(z);
   end;
end;
{*********************************************************************}
procedure Do_pliku_rat( P_r:TWsk_rata; n_p:string);
var plik:file of TRata;
begin
Assign(plik,n_p); rewrite(plik);
while (P_r<>NIL) do
    begin
    write(plik,P_r^.raty);
    P_r:=P_r^.next;
    end;
close(plik);
end;
{***********************************************************************}
procedure Wyswietl_liste_rat(P_r:Twsk_rata);
begin
while P_r<>NIL do
    begin
    Pokaz_rate(P_r^.raty);
    P_r:=P_r^.next;
    end;
writeln;
readln;
end;
{***********************************************************************}
procedure Z_pliku_raty(var P_r,K_r:TWsk_rata;n_p:string);
var plik:file of TRata;
    x:TRata;
begin
Assign(plik,n_p); reset(plik);
while not EOF(plik) do
    begin
    read(plik,x);
    Dodaj_do_listy_rat(P_r,K_r,x);
    end;
close(plik);
end;

begin
P:=NIL; K:=NIL;
P_r:=NIL; K_r:=NIL;
ClrScr;
Z_pliku(P,K,'C:\Users\Karol\Documents\Lazarus projekty\projekt PP\studenci.dat');
Z_pliku_raty(P_r,K_r,'C:\Users\Karol\Documents\Lazarus projekty\projekt PP\raty.dat');
{writeln('Dodawanie rat: ');
Dodaj_rate(P_r,K_r);}
writeln('Lista rat : ');
Wyswietl_liste_rat(P_r);
{writeln('---------------------------------------------------------');
writeln('Lista studentow : ' );
Wyswietl_liste(P);
writeln('----------------------------------------------------------');
Dodaj_nowe_dane(P,K);}
writeln('----------------------------------------------------------');
Uzupelnij_raty(P_r,P);
writeln('Lista studentow: ' );
Wyswietl_liste(P);
{writeln('----------------------------------------------------------');
writeln('Wyszukaj po nazwisku: ');
Wyszukaj_nazwisko(P,K);
writeln('----------------------------------------------------------');
writeln('usuwanie srtudenta po nazwisku : ');
usun_wybrany_element(P);}
//Usun_liste(P) ;
//riteln('Lista usunieta');
writeln('----------------------------------------------------------');
Do_pliku(P,'C:\Users\Karol\Documents\Lazarus projekty\projekt PP\studenci.dat');
Do_pliku_rat(P_r,'C:\Users\Karol\Documents\Lazarus projekty\projekt PP\raty.dat');
//writeln('Lista studentow : ' );
//Wyswietl_liste(P); }
ReadKey;
end.                          
0

Co to znaczy, że działa "jak sama chce"? Jakie są objawy? /nie przejrzałem kodu, póki co/

0

Sumuje wszystkie wpłaty i zapisuje do pierwszego studenta :(

0

Ma ktoś jakiś pomysł jak to poprawić ? :(

0

Zacznij od refactoringu - czyli wymianę nazw i typów na sensowne - wtedy sam zauważysz.
Ta funkcja Uzupelnij_raty jest czarnym pieprzem ... więc ją wywal i napisz jeszcze raz, przy pisaniu weź pod uwagę że ta sama rata może być dodana dla kilku studentów.

0

Okey :) Sprubuje jeszcze raz to napisać :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1