Lista kolejek

Odpowiedz Nowy wątek
rupiku
2009-01-14 22:17
rupiku
0

program cykliczna_lista;

{$apptype CONSOLE}

type
wskKolejka=^kolej;
kolej = record
cyfra : integer;
nastepny:wskKolejka;
end;

wskLista=^Lista;
Lista = record
nazwa: string;
liczba: real;
kolejka : wskKolejka;
nastepny:wskLista;

end;

var poczatek:wskLista;
nazwa:string;
liczba:real;
pierwszy,ostatni :wskKolejka;
//----------------------------------------------------------------------------

procedure inicjuj_liste(var poczatek:wskLista); // inicjacja lsity
begin
poczatek:=nil;
end;
//----------------------------------------------------------------------------
procedure inicjuj_kolejke(var pierwszy,ostatni: wskKolejka); // inicjacja kolejki
begin
pierwszy:= nil;
ostatni:=nil;

end;
//----------------------------------------------------------------------------

//-----------------------------------------------------------------------------

{procedura odpowiedzialna za dodanie kolejnego elementu do listy,
jezeli nie ma zadnego to tworzy pierwszy element}

procedure dodaj_do_listy( liczba:real; nazwa:string; var poczatek: wskLista);
var

pomocniczy_wsk: wskLista;
begin
pomocniczy_wsk := poczatek;
new(poczatek); // utworzenie nowego elementu listy
begin
poczatek^.liczba := liczba; // przypisanie watosci w rekordzie
poczatek^.nazwa:= nazwa; // przypisanie nazwy w rek.
poczatek^.nastepny := pomocniczy_wsk;

end;
end;

//-----------------------------------------------------------------------------
{wyswietlenie listy w oknie konsoli}
procedure wyswietl_liste(poczatek : wskLista);

var pomocniczy_wsk : wskLista;
begin
write(' ');
if poczatek <> nil then
begin
pomocniczy_wsk := poczatek;
repeat
write(pomocniczy_wsk.liczba:3:3,' ', pomocniczy_wsk.nazwa);
write(' '); // wyswietlenie nazwy i wartosci elementu
repeat
if pomocniczy_wsk.kolejka <> nil then
begin

       write(pomocniczy_wsk.kolejka.cyfra, ' ');               // wyswietlenie kolejki w danym elemencie
       pomocniczy_wsk.kolejka:=pomocniczy_wsk.kolejka^.nastepny;   // przejscie o jeden element
       end;
       until pomocniczy_wsk^.kolejka = nil;

       pomocniczy_wsk :=pomocniczy_wsk^.nastepny;       // przejscie o jeden element
       if pomocniczy_wsk <> nil then
          write(', ');
     until (pomocniczy_wsk =poczatek) or (pomocniczy_wsk = nil);
   end;
write(' ');
readln;

end;

//-----------------------------------------------------------------------------
procedure znajdz_element_po_nazwie(poczatek : wskLista; nazwa:string);
var
pomocnik,pom :wskLista;
begin
pomocnik:= poczatek;
while poczatek^.nastepny <> pomocnik do // analogiznie do szukanie po wartosci
if poczatek^.nazwa=nazwa then
break
else
poczatek:=poczatek^.nastepny;
pom:=poczatek;
writeln('ten element to : ');
writeln(pom.nazwa, ' ', pom.liczba:3:3);
readln;
end;

//----------------------------------------------------------------------------

procedure znajdz_element_po_wartosci(poczatek :wskLista; liczba:real);
var
pomocnik,pom : wskLista; // zmienne pomocnicze
begin
pomocnik:= poczatek;
while poczatek^.nastepny <> pomocnik do // dopoki nastepny jest rozny od peirwszego elementu
if poczatek^.liczba=liczba then
break
else
poczatek:=poczatek^.nastepny;
pom:=poczatek; // przpisanie zmiennej pomocniczej danego elementu
writeln('ten element to : ');
writeln(pom.nazwa, ' ',pom.liczba:3:3); // wyswietlenie
readln;
end;

//-----------------------------------------------------------------------------
{usuniecie calej listy}
procedure usun_liste(var poczatek: wskLista);
var
pom:wskLista; // zmienna pomocnicza
begin
while poczatek<> nil do
begin
pom:=poczatek; // przypisanie zmiennej pomocniczej danego elementu
poczatek:=poczatek^.nastepny; // przejscie do nastepnego elementu
dispose(pom); // usuniecie
end;
end;
//----------------------------------------------------------------------------
procedure dodawanie_kol(pom: wskLista); // dodaje element kolejki przy danym elemencie listy
var
cyfra,decyzja: integer;
ostatni:wskKolejka;
blad:byte;
begin
repeat //powtarzamy
repeat
writeln('kolejny element? 1- tak,2-nie'); // pytanie czy dodac nastepny element do kolejki
{$I-}ReadLn(decyzja);{$I+}
blad:=IOResult;
if blad <> 0 then writeln('podales ciag znakow a nie liczbe/wlasciwa liczbe');
Until (blad=0);
if decyzja=1 then
begin
repeat
writeln('Podaj liczbe');
{$I-}ReadLn(cyfra);{$I+} // pobranie cyfry
blad:=IOResult;
if blad <> 0 then writeln('podales ciag znakow a nie liczbe/wlasciwa liczbe');
Until (blad=0);
// pobranie wartosci elementu kolejki, zabezpiecznie
if pom^.kolejka = nil then
begin
new(pom^.kolejka); // utworzenie nowego elementu kolejki
pom^.kolejka.cyfra:=cyfra; // przypisanie wartosci do rekordu
pom^.kolejka.nastepny:=nil; // nastepny element=nil
end
else
begin
ostatni:=pom^.kolejka;
while ostatni^.nastepny <> nil do //przechodzimy na koniec kolejki
ostatni:=ostatni^.nastepny;
new(ostatni^.nastepny); // utworzenie nowego elemntu
ostatni.nastepny.cyfra :=cyfra; // przypisanie wartosci
ostatni.nastepny.nastepny :=nil;
end;
end;
until decyzja=2; // dopoki nie zostanie podany klawisz '2'
end;

//-----------------------------------------------------------------------------

procedure znajdz_element_do_dod_kol(poczatek :wskLista; nazwa:string); // znajduje element listy do ktorego chcemy dopisac element kolejki
var
pomocnik,pom : wskLista;
begin
pomocnik:= poczatek; // przypisanie zmiennej pomocniczej wartosci poczatek
while poczatek^.nastepny <> pomocnik do
if poczatek^.nazwa=nazwa then
break
else
poczatek:=poczatek^.nastepny;
pom:=poczatek;
dodawanie_kol(pom); // przejscie do procedury dodawania elementu kolejki
end;
//------------------------------------------------------------------------------
procedure dodawanie_kolejki_pytanie; // pobiera nazwe elementu do wyszukania
begin
writeln('Musisz podac nazwe elementu, do ktorego chcesz dodac kolejke');
write('podaj nazwe elementu : ');
readln(nazwa);
znajdz_element_do_dod_kol(poczatek,nazwa); // przejscie do procedury znajdywania elementu do ktorego ma byc dopisana kolejka
end;
//-----------------------------------------------------------------------------
procedure zwracanie_pierwszego_el_kol(pom:wskLista);

begin
writeln('pierwszy element w kolejce to: ', pom^.kolejka.cyfra);
end;

//----------------------------------------------------------------------------

procedure znajdz_element_do_zwrotu(poczatek : wskLista; nazwa:string);
var
pomocnik,pom : wskLista;
begin
pomocnik:= poczatek; // przypisanie zmiennej pomocniczej wartosci poczatek
while poczatek^.nastepny <> pomocnik do
if poczatek^.nazwa=nazwa then
break
else
poczatek:=poczatek^.nastepny;
pom:=poczatek;
zwracanie_pierwszego_el_kol(pom);
// przejscie do procedury 'zwracania' elementu
end;

//----------------------------------------------------------------------------

procedure pobierz_nazwe_do_zwrotu(poczatek:wskLista); // pobiera nazwe elementu do wyszukania
var
nazwa:string;
begin
writeln('Musisz podac nazwe elementu, z ktorego chcesz znac 1 el. kolejki');
write('podaj nazwe elementu : ');
readln(nazwa);
znajdz_element_do_zwrotu(poczatek,nazwa); // przejscie do procedury znajdywania elementu
end;

procedure usun_ostatni(var poczatek : wskLista);
var pomocniczy_wsk :wskLista;
begin
if poczatek <> nil then
begin
pomocniczy_wsk := poczatek^.nastepny;
dispose(poczatek);
poczatek := pomocniczy_wsk;
end;

end;

//-----------------------------------------------------------------------------
{procedura 'menu'}
procedure menu;
begin
writeln;
writeln (' MENU');
writeln('------------------');
writeln('1. dodaj el. listy(na poczatek)');
writeln('2. wyszukaj element po wartosci');
writeln('3. dodaj el. kolejki');
writeln('4. usun ostatni dodany/ostatni w chwili obecnej element z listy');
writeln('5. zwroc pierwszy element kolejki');
writeln('6. wyszukaj element po nazwie');
writeln('7. wyswietl liste');
writeln('8. usun liste');
end;
//-------------------------------------------------------------------------------

var
wybor: integer;
blad:byte;
begin
inicjuj_liste(poczatek);
inicjuj_kolejke(pierwszy,ostatni);
menu;
repeat
repeat
writeln;
write('nr. opcji : ');
{$I-}ReadLn(wybor);{$I+} // idiotoodpornosc ;-)
blad:=IOResult;
if blad <> 0 then writeln('podales ciag znakow a nie liczbe/wlasciwa liczbe');
until (blad=0);
case wybor of
1 : begin
repeat
write('podaj liczbe : ');
{$I-}ReadLn(liczba);{$I+} //idiotoodpornosc
blad:=IOResult;
if blad <> 0 then writeln('podales ciag znakow a nie liczbe/wlasciwa liczbe');
until (blad=0);
write('podaj nazwe : ');
readln(nazwa);
dodaj_do_listy(liczba,nazwa,poczatek);

                end;

            2 : begin
                   repeat
                    write('podaj liczbe : ');
                    {$I-}ReadLn(liczba);{$I+}   //idiotoodpornosc
                    blad:=IOResult;
                    if blad <> 0 then writeln('podales ciag znakow a nie liczbe/wlasciwa liczbe');
                    until (blad=0);
                   znajdz_element_po_wartosci(poczatek,liczba)
                end;

            3 : begin
                   dodawanie_kolejki_pytanie;
                end;
            4 : begin
                usun_ostatni(poczatek)  ;
                end;
            5 : begin
                   pobierz_nazwe_do_zwrotu(poczatek);
                end;

            6 : begin
                   write('podaj nazwe : ');
                   readln(nazwa);
                   znajdz_element_po_nazwie(poczatek,nazwa)
                end;

            7 : begin
                  writeln;
                  writeln('lista : ');
                  wyswietl_liste(poczatek);
               end;

            8 : begin
                  usun_liste(poczatek) ;
                end;
            9 :;

            else

    end;

until (wybor =9);
usun_liste(poczatek);  // 'sprzatanie' ;-)

end.

jezeli dwa razy wyswietlam liste to w drugim wyswietleniu nie pojawia sie kolejka:( co jest zle? dzieki za pomoc:)

Pozostało 580 znaków

ŁF
2009-01-15 00:28
ŁF
Moderator

Rejestracja: 17 lat temu

Ostatnio: 12 godzin temu

0

prześledź kod linijka po linijce debugerem i sam zobacz, co się dzieje... podpowiem: pomocniczy_wsk.kolejka:=pomocniczy_wsk.kolejka^.nastepny (przecież nie operujesz na kopii danych, tylko na kopii adresu).
naucz się formatować kod, bo tego powyżej aż się nie chce czytać. do tego zapoznaj się z funkcjami (wczytywanie liczb) i z pętlą while (czasem dużo bardziej sensowna od repeat).


Pozostało 580 znaków

rupiku
2009-01-15 15:54
rupiku
0
ŁF napisał(a)

podpowiem: pomocniczy_wsk.kolejka:=pomocniczy_wsk.kolejka^.nastepny (przecież nie operujesz na kopii danych, tylko na kopii adresu).

moglbys mi to lepiej opisac?:)

Pozostało 580 znaków

ŁF
2009-01-15 17:30
ŁF
Moderator

Rejestracja: 17 lat temu

Ostatnio: 12 godzin temu

0

nie rozumiesz swojego własnego kodu? napisałem: użyj debugera, zobaczysz jak ładnie twój własny kod niszczy swoje własne dane.

dla jednej iteracji, np. dla pierwszej pozycji:
wykonujesz w pętli

pomocniczy_wsk.kolejka:=pomocniczy_wsk.kolejka^.nastepny

pomocniczy_wsk to nie kopia elementu listy, tylko sam element (bo to przecież wskaźnik). w efekcie w pierwszej iteracji wewnętrznej pętli przypisujesz drugi element kolejki (pomocniczy_wsk.kolejka^.nastepny) jej pierwszemu elementowi (pomocniczy_wsk.kolejka), potem trzeci pierwszemu itp, aż na końcu przypisujesz nil, gubiąc całą kolejkę i trochę pamięci. i to samo dla kolejnych elementów głównej listy.
musisz utworzyć oddzielny wskaźnik na "kolejkę" (w cudzysłowie, bo ta kolejka to też lista), tak samo jak robisz to ze wskaźnikiem na listę.


Pozostało 580 znaków

rupiku
2009-01-15 19:27
rupiku
0
<ort>rozumie </ort>swoj kod ale <ort>po prostu </ort>nie do konca zrozumialem o co Ci chodzi:) tak czy owak sprobuje:) dzieki za pomoc w razie czego wrzuce tu jeszcze cos:) mam nadzieje, ze cierpliwosci nie straciles:)

Pozostało 580 znaków

rupiku
2009-01-17 19:56
rupiku
0

Jeszcze jedno pytanie. Mam stworzyć coś żeby zapisywało "historię" wybieranych opcji przez użytkownika do pliku:| jak się coś takiego robi?

Pozostało 580 znaków

2009-01-18 19:57

Rejestracja: 17 lat temu

Ostatnio: 1 rok temu

0
rupiku napisał(a)

Jeszcze jedno pytanie. Mam stworzyć coś żeby zapisywało "historię" wybieranych opcji przez użytkownika do pliku:| jak się coś takiego robi?

Po wybraniu opcji wrzucasz numer pozycji menu do pliku.

Pozostało 580 znaków

rupiku
2009-01-18 21:16
rupiku
0

dzieki:) koles wspominal cos o jakims "log" ale nie zajarzylem:|

Pozostało 580 znaków

rupiku
2009-01-19 09:53
rupiku
0

chcialem jeszcze zrobic cos takiego, zeby nie wysypywalo sie przy podaniu niewlasciwej nazwy:|

procedure znajdz_element_po_nazwie(poczatek : wskLista; nazwa:string);
var
pomocnik,pom :wskLista;
pomoc:wskKolejka;
jest: boolean;
begin
pomocnik:= poczatek;
jest:= false;
while poczatek^.nastepny <> pomocnik do // analogiznie do szukanie po wartosci
if poczatek^.nazwa=nazwa then
begin
jest:=true;
break
end
else
poczatek:=poczatek^.nastepny;
if jest=false then
begin
writeln('nie ma takiego elementu');
znajdz_element_po_nazwie(poczatek,nazwa);
end;
pom:=poczatek; // przypisanie zmiennej pomocniczej danego elementu
writeln('ten element to : ');
write(pom.nazwa, ' ',pom.liczba:3:3, ' ');

       pomoc:=pomocnik^.kolejka;
       repeat
       if pomoc <> nil then
       begin

       write(pomoc^.cyfra, ' ');               // wyswietlenie kolejki w danym elemencie
       pomoc:=pomoc.nastepny;   // przejscie o jeden element
       end;
       until pomoc = nil;          // wyswietlenie

readln;
end;

co jest nie tak?:|

Pozostało 580 znaków

ŁF
2009-01-19 11:44
ŁF
Moderator

Rejestracja: 17 lat temu

Ostatnio: 12 godzin temu

0

po pierwsze formatuj kod i umieszczaj w tagach code=delphi, po drugie zrobiłeś jedną rzecz źle i jedną wręcz bezmyślnie:

procedure znajdz_element_po_nazwie(poczatek : wskLista; nazwa:string);
var
  element : wskLista;
  jest : boolean;
begin
  element := poczatek;
  jest := false;
  while element <> nil do // poczatek^.nastepny <> pomocnik <- to nie lista cykliczna, ma koniec i początek, końcem nie jest element równy początkowi, tylko nil. a przynajmniej powinien być.
  if element^.nazwa = nazwa then
  begin
    jest:=true;
    break
  end else element := element^.nastepny;

  if not jest then
  begin
    writeln('nie ma takiego elementu');
    exit;  //    znajdz_element_po_nazwie(poczatek,nazwa); <- WTF? przecież w ten sposób robisz nieskończoną rekurencję, jeśli raz element się nie znalazł, to kolejny milion razy też się nie znajdzie; bezmyślne
  end;
// ...

Pozostało 580 znaków

Odpowiedz

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