Witam. Piszę koledze projekt z programowania.
Napisać program "budżet domowy", który umożliwia zapisanie poszczególnych
wydatków i przychodów - kwota, opis, rodzaj (jedzenie, rozrywka, ubrania, itp.).
Umożliwić zapis/odczyt bazy z/do pliku oraz dodawanie/edytowanie/usuwanie
poszczególnych wydatków/przychodów. Program powinien umożliwić tworzenie raportów .
Dodać możliwość zapisu raportu do pliku tekstowego. Dobrać odpowiednią strukturę
danych.
Niestety napotkałem na pewien błąd w działaniu list. Otóż kiedy dodaje drugi element do listy(dodaje do już istniejącej kategorii drugi wydatek) program się wysypuje.
Wcześniej wszystko działało(czyli zanim dodałem przychody.Program zapisywał same wydatki. Próbowałem wywalić nową część ale nadal ten sam błąd). Już 2 dni szukam błędu. Wiem że to dużo pracy zanalizować kogoś kod ale może komuś Od razu w oczy się rzuci błąd.
Z góry dziękuje za pomoc i pozdrawiam.
Aha i Obsługę plików narzazie pominąłem.
program Project1;
uses crt;
type
wsk_kat = ^kategorie;
wsk_dan = ^dana;
dana = record
nazwa:string;
koszt:real;
nast_dan:wsk_dan;
end;
kategorie =record
nazwa:string;
opis:string ;
nast_kat:wsk_kat;
pier_dan:wsk_dan;
end;
//*****************************
PROCEDURE nowa_dana(var pierwsza:wsk_dan);
var
nowy:wsk_dan;
tmp:wsk_dan;
co_robic:byte;
nazwa:string;
begin
writeln('Podaj nazwe wydatku');
readln(nazwa);
if pierwsza = nil then // jesli lista pusta
begin
new(nowy);
writeln('Podaj koszt wydatku');
nowy^.nazwa := nazwa;
readln(nowy^.koszt);
nowy^.nast_dan := nil;
pierwsza := nowy;
end
else
begin
tmp := pierwsza;
while( (nazwa <> tmp^.nazwa) and (tmp^.nast_dan <> nil) ) do
tmp := tmp^.nast_dan;
if(nazwa = tmp^.nazwa) then // jesli nazwa istnieje
begin
writeln('Podany wydatek juz istnieje. Jesli chesz edytowac podaj 1 a jesli pominac podaj 2');
readln(co_robic);
if(co_robic = 1) then
begin
writeln('Podaj kosztwydatku ');
nowy^.nazwa := nazwa;
readln(nowy^.koszt);
end;
end
else // jesli dana nie istnieje
begin
new(nowy);
tmp^.nast_dan := nowy;
writeln('Podaj koszt wydatku');
readln(nowy^.koszt);
nowy^.nast_dan := nil;
end;
end
end;
//---------
PROCEDURE nowa_kat(var glowa:wsk_kat ; nazwa:string);
var
nowy:wsk_kat;
tmp:wsk_kat;
begin
if glowa = nil then // jesli lista pusta
begin
new(nowy);
nowy^.nazwa := nazwa;
writeln('Podaj opis ' ,nazwa,' (maks 255 znakow)');
readln(nowy^.opis);
nowy^.nast_kat := nil;
nowy^.pier_dan := nil;
glowa := nowy;
nowa_dana(glowa^.pier_dan)
end
else
begin
tmp := glowa;
while( (nazwa <> tmp^.nazwa) and (tmp^.nast_kat <> nil) ) do
tmp := tmp^.nast_kat;
if(nazwa = tmp^.nazwa) then // jesli kategoria istnieje
nowa_dana(nowy^.pier_dan)
else // jesli kateogira nie istnieje
begin
new(nowy);
tmp^.nast_kat := nowy;
nowy^.nazwa := nazwa;
writeln('Podaj opis kateogri(maks 255 znakow)');
readln(nowy^.opis);
nowy^.nast_kat := nil;
nowy^.pier_dan := nil;
nowa_dana(nowy^.pier_dan)
end
end
end;
//-------------
FUNCTION wyswietl(tmp:wsk_kat) : real ;
var
temp:wsk_dan;
sum:real = 0;
sum_kat:real;
begin
while(tmp <> nil) do
begin
writeln('KATEGORIA: ' , tmp^.nazwa);
writeln();
writeln(' ', tmp^.opis);
writeln();
temp := tmp^.pier_dan;
sum_kat := 0;
while(temp <> nil) do
begin
writeln(temp^.nazwa , ' ' , temp^.koszt:0:2);
writeln();
sum_kat := sum_kat + temp^.koszt;
temp := temp^.nast_dan;
end;
writeln('Wydatki/Przychody w ', temp^.nazwa ,' to: ' , sum_kat:0:2);
sum := sum + sum_kat;
tmp := tmp^.nast_kat;
writeln();
wyswietl := sum;
end;
end;
//-------------
PROCEDURE wyswietl_raport(rozchody:wsk_kat ; przychody:wsk_kat);
var
sum_przychody,sum_wydatki,roznica:real;
begin
writeln('-------------==WYDATKI==-------------');
sum_wydatki :=wyswietl(rozchody);
writeln('-------------==PRZYCHODY==-------------');
sum_przychody := wyswietl(przychody);
roznica :=sum_przychody - sum_wydatki;
writeln('Twoje wydatki to:', sum_wydatki, ' a przychody: ' , sum_przychody,#10#13, 'Roznica miedzy przychodami a wydatkami to: ' ,roznica );
if (roznica < 0) then
writeln('Suma wydatków przekracza suma przychodów. Wprowadz zmiany do swojego budżetu !!!');
writeln('Wcisniej ENTER jesli chcesz kontynulowac');
readln();
end;
//******************************
var
nazwa_kat:string;
glowa_wydatki:wsk_kat = nil;
glowa_przychody:wsk_kat = nil;
co_robic:byte;
wyd_przy:boolean;
//******************************
begin
REPEAT
clrscr;
write('----------------------'+#10#13+'Co chcesz wykonac ?'+#10#13+'1 - Dodaj wydadki'+#10#13+'2 - Dodaj przychody'+#10#13+'3 - Wczytaj wydatki'+#10#13+'4 - Zapisz wydakit'+#10#13+'5 - Drukuj Raport'+#10#13+'9 - Zakoncz'+#10#13+'----------------------'+#10#13);
readln(co_robic);
clrscr;
case co_robic of
1:
begin
writeln('Podaj nazwe kateogori do ktorej chcesz dodac wydatek.'+#10#13+'Jesli katoegoria nie istnieje zostanie ona dodana');
readln(nazwa_kat);
clrscr;
nowa_kat(glowa_wydatki,nazwa_kat);
end;
2:
begin
writeln('Podaj nazwe kateogori do ktorej chcesz dodac przychod.'+#10#13+'Jesli katoegoria nie istnieje zostanie ona dodana');
readln(nazwa_kat);
clrscr;
nowa_kat(glowa_przychody,nazwa_kat);
end;
3:;
5: wyswietl_raport(glowa_wydatki,glowa_przychody);
9: co_robic := 9;
else
writeln('Nieprawidlowa komenda');
end;
UNTIL co_robic = 9;
end.