Spojový zoznam – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Spojový zoznam – Pascal – Fórum – Programujte.comSpojový zoznam – Pascal – Fórum – Programujte.com

 

peto1254
~ Anonymní uživatel
9 příspěvků
12. 6. 2013   #1
-
0
-

Zdravím Potrebujem pomôcť z výpisom zoznamu. Vypisuje mi iba posledne zadaného v zozname v procedúre hladaj 

Program evidencia;
uses    crt;

type    Uk=^prvok;
        zoznam = record
        odbor: string[20];
        meno: string[20];
        priez: string[20];
        rok: integer;
end;
        prvok= record
        hod:zoznam;
        dalsi:Uk;
end;

var     prvy:Uk;
        volba:integer;
        vymaz, najdi:string;

procedure vloz;
var     novy:Uk;
begin
        new(novy);
        write('Zadaj odbor:  ');
        readln(novy^.hod.odbor);
        write('Meno:  ');
        readln(novy^.hod.meno);
        write('Priezvisko: ');
        readln(novy^.hod.priez);
        write('rok narodenia:  ');
        readln(novy^.hod.rok);

        novy^.dalsi:=prvy;
        prvy:=novy;
        writeln();
        end;

procedure vypis;
var     akt:Uk;
begin
        akt:=prvy;
        if akt<>nil  then begin

        writeln('Vypis evidencie:');
        writeln;
        writeln('odbor       | meno      | priezvisko      | rok' );
        writeln('-----------------------------------------------------------');
repeat
        writeln(akt^.hod.odbor,akt^.hod.meno:15,akt^.hod.priez:13,akt^.hod.rok:16);
        akt:=akt^.dalsi;
until   akt=nil;
        writeln();
        akt:=prvy;
end
else    writeln('evidencia je prazdna.');
        readln;
end;

procedure vyhladaj(var x:string);
var     akt,hladaj:Uk;
begin
        akt:=prvy;
while   ((akt<>nil) and ((Pos(x,akt^.hod.odbor)=0))) do begin
        akt:= akt^.dalsi;
end;
        hladaj:=akt;
        if (hladaj<>nil) then begin
        writeln('Hladany odbor:');
        writeln;
        writeln('odbor       | meno      | priezvisko      | rok narodenia' );
        writeln('-----------------------------------------------------------');
        writeln(hladaj^.hod.odbor,hladaj^.hod.meno:15,hladaj^.hod.priez:13,hladaj^.hod.rok:16);
        end
        else  writeln('odbor neexistuje');
readln;
end;

procedure zrus(var x:string);
var     akt,pom,zmaz: Uk;
begin
        akt:=prvy;
        pom:=nil;
while   ((akt<>nil) and (akt^.hod.priez<>x)) do begin
        pom:=akt;
        akt:= akt^.dalsi;
end;
        zmaz:=akt;
        if zmaz=nil then begin
        writeln('zadal si zle');
        readln;
        akt:=nil;
end
else begin if (zmaz=prvy) then begin
        prvy:=prvy^.dalsi;
        dispose(zmaz);
        writeln;
        writeln ('zaznam bol vymazany');
        readln;
end
else begin
        pom^.dalsi:=zmaz^.dalsi;
        dispose(zmaz);
        writeln;
        writeln ('zaznam bol vymazany');
        readln;
        end;end;
end;

begin
        prvy:=nil;
repeat
        clrscr;
        writeln('Evidencia studentov');
        writeln;
        writeln('Menu:');
        writeln('1: Vlozit zaznam');
        writeln('2: Vypis zaznamu');
        writeln('3: Vyhladanie zaznamu');
        writeln('4: Zrusenie zaznamu');
        writeln('5: Koniec');
        writeln;
        writeln('Zadaj cislo operacie: ');
        readln(volba);

case volba of
                1:vloz;
                2:vypis;
                3:begin
                  if (prvy=nil) then begin writeln('zoznam je prazdny');
                  readln;
                  continue;
                  end
                  else write('Zadaj odbor ktory chces hladat:  ');
                  readln(najdi);
                  vyhladaj(najdi);
                  end;
                4:begin
                  if (prvy=nil) then begin write('zoznam je prazdny');
                  readln;
                  continue;
                  end
                  else writeln('Zadaj priezvisko studenta ktoreho chces zrusit:  ');
                  readln(vymaz);
                  zrus(vymaz);
                  end;
                5:;
else            writeln('zadal si zle, zadaj cisla od 1 po 4.');
                end;
until volba=5;
end.


ďakujem

Nahlásit jako SPAM
IP: 46.229.224.–
JoDiK
~ Anonymní uživatel
987 příspěvků
12. 6. 2013   #2
-
0
-

Když odhlédnu od toho, že nově přidávaný záznam umisťuješ nestandardně na začátek seznamu (takže posledně přidaný je v seznamu první) tak ti snad dojde, že v proceduře vyhledání najdeš první záznam splňující podmínky hledání, tím končíš hledání a ten jeden nalezený záznam vypíšeš.

Takže si odděl procházení seznamu a podmínku pro hledání záznamu...

Nahlásit jako SPAM
IP: 88.100.43.–
peto1254
~ Anonymní uživatel
9 příspěvků
13. 6. 2013   #3
-
0
-

#2 JoDiK
Nejak mi to nejde keď zadám znova iné slovo na vyhľadavanie vypíše mi aj  tých ktorých nechcem aby vypísalo ktorých som nedal vyhľadať 

Nahlásit jako SPAM
IP: 46.229.224.–
JoDiK
~ Anonymní uživatel
987 příspěvků
13. 6. 2013   #4
-
0
-

#3 peto1254
Nevím co hledáš a co zadáváš, ale vzhledem k použité funkci POS hledáš výskyt podřetězce v řetězci.

Takže v případě hledání napříkad data ti to najde i text databáze, flexidata nebo kontradatace...

Nahlásit jako SPAM
IP: 88.103.236.–
peto1254
~ Anonymní uživatel
9 příspěvků
13. 6. 2013   #5
-
0
-

#4 JoDiK
zadanie je :

Vytvor program na evidenciu študentov. Pri každom študentovi je nutné registrovať, priezvisko, rok narodenia, zameranie štúdia. Program bude ovládaný pomocou menu, pričom bude obsahovať procedúry na vkladanie, rušenie študenta a vyhľadanie podľa odboru ( po zadaní odboru ktorý chceme vyhľadať budú vypísaný všetci študenti tohto odboru). Na implementáciu použite spojový zoznam nie pole.

Nahlásit jako SPAM
IP: 46.229.224.–
JoDiK
~ Anonymní uživatel
987 příspěvků
13. 6. 2013   #6
-
0
-

#5 peto1254
Na to jsem se neptal...

Už jsi opravil to vyhledávání, aby neskončilo u prvního nalezeného?

Pokud chceš přesnou shodu u porovnávání, nepoužívej POS ale rovnou porovnávej takže místo:

Pos(x,akt^.hod.odbor)=0)  dej  x=akt^.hod.odbor

Nahlásit jako SPAM
IP: 88.100.43.–
peto1254
~ Anonymní uživatel
9 příspěvků
13. 6. 2013   #7
-
0
-

#6 JoDiK
hej to už som opravil  cer repeat until 

Nahlásit jako SPAM
IP: 46.229.224.–
JoDiK
~ Anonymní uživatel
987 příspěvků
13. 6. 2013   #8
-
0
-

#7 peto1254
Tak pokud ti to pořád vypisuje "aj  tých ktorých nechcem aby vypísalo ktorých som nedal vyhľadať" a nemůžeš přijít na to proč, tak sem dej opravený kód...

Nahlásit jako SPAM
IP: 88.100.43.–
peto1254
~ Anonymní uživatel
9 příspěvků
13. 6. 2013   #9
-
0
-

#6 JoDiK
dal som x=akt^.hod.odbor namiesto Pos(x,akt^.hod.odbor)=0) a teraz mi už vypisuje stále všetkých čo sú v zozname predtým ak som zadal tých ktorý boli na konci zoznamu tak vypisalo iba tých ešte som ich vytriedil bublesoftom

Nahlásit jako SPAM
IP: 46.229.224.–
JoDiK
~ Anonymní uživatel
987 příspěvků
13. 6. 2013   #10
-
0
-

#9 peto1254
Promiň, slovensky umím, ale z tvé odpovědi jsem nevyčetl jestli už je to vyhledávání v pořádku nebo ne...

Nahlásit jako SPAM
IP: 88.100.43.–
peto1254
~ Anonymní uživatel
9 příspěvků
13. 6. 2013   #11
-
0
-

#8 JoDiK


#6 JoDiK
 

Program evidencia;
uses    crt;

type    Uk=^prvok;
        zoznam = record
        odbor: string[20];
        meno: string[20];
        priez: string[20];
        rok: integer;
end;
        prvok= record
        hod:zoznam;
        dalsi:Uk;
end;

var     prvy:Uk;
        volba:integer;
        vymaz, najdi:string;

procedure vloz;
var     novy:Uk;
begin
        new(novy);
        write('Zadaj odbor:  ');
        readln(novy^.hod.odbor);
        write('Meno:  ');
        readln(novy^.hod.meno);
        write('Priezvisko: ');
        readln(novy^.hod.priez);
        write('rok narodenia:  ');
        readln(novy^.hod.rok);

        novy^.dalsi:=prvy;
        prvy:=novy;
        writeln();
        end;

procedure vypis;
var     akt:Uk;
begin
        akt:=prvy;
        if akt<>nil  then begin

        writeln('Vypis evidencie:');
        writeln;
        writeln('odbor       | meno      | priezvisko      | rok' );
        writeln('-----------------------------------------------------------');
repeat
        writeln(akt^.hod.odbor,akt^.hod.meno:15,akt^.hod.priez:13,akt^.hod.rok:16);
        akt:=akt^.dalsi;
until   akt=nil;
        akt:=prvy;
end
else    writeln('evidencia je prazdna.');
        readln;
end;



procedure usporiadaj(var co:Uk);
var bublac :Uk ;
    pompo : zoznam;
    uzjedobublane : boolean;
begin
  repeat
    bublac:=co;
    uzjedobublane:=true;

    while bublac^.dalsi<>nil do begin
      if bublac^.hod.odbor>bublac^.dalsi^.hod.odbor then begin
        uzjedobublane:=false;
        pompo := bublac^.hod;
        bublac^.hod:= bublac^.dalsi^.hod;
        bublac^.dalsi^.hod:= pompo;
      end;
      bublac:=bublac^.dalsi;
    end;

  until uzjedobublane;
end;


procedure vyhladaj(var x:string);
var     akt,hladaj:Uk;
begin
        akt:=prvy;
while   ((akt<>nil) and (x=akt^.hod.odbor)) do begin
        akt:= akt^.dalsi;
end;
        if hladaj<>nil  then begin

        writeln('Vypis evidencie:');
        writeln;
        writeln('odbor       | meno      | priezvisko      | rok' );
        writeln('-----------------------------------------------------------');
repeat
        writeln(akt^.hod.odbor,akt^.hod.meno:15,akt^.hod.priez:13,akt^.hod.rok:16);
        akt:=akt^.dalsi;
until   akt=nil;
repeat until keypressed;
        writeln;
        akt:=prvy;
end
else    writeln('evidencia je prazdna.');
        readln;
end;
procedure zrus(var x:string);
var     akt,pom,zmaz: Uk;
begin
        akt:=prvy;
        pom:=nil;
while   ((akt<>nil) and (akt^.hod.priez<>x)) do begin
        pom:=akt;
        akt:= akt^.dalsi;
end;
        zmaz:=akt;
        if zmaz=nil then begin
        writeln('zadal si zle');
        readln;
        akt:=nil;
end
else begin if (zmaz=prvy) then begin
        prvy:=prvy^.dalsi;
        dispose(zmaz);
        writeln;
        writeln ('zaznam bol vymazany');
        readln;
end
else begin
        pom^.dalsi:=zmaz^.dalsi;
        dispose(zmaz);
        writeln;
        writeln ('zaznam bol vymazany');
        readln;
        end;end;
end;

begin
        prvy:=nil;
repeat
        clrscr;
        writeln('Evidencia studentov');
        writeln;
        writeln('Menu:');
        writeln('1: Vlozit zaznam');
        writeln('2: Vypis zaznamu');
        writeln('3: Vyhladanie zaznamu');
        writeln('4: Zrusenie zaznamu');
        writeln('5: Koniec');
        writeln;
        writeln('Zadaj cislo operacie: ');
        readln(volba);

case volba of
                1:begin vloz;
                usporiadaj(prvy);
                end;
                2:vypis;
                3:begin
                  if (prvy=nil) then begin writeln('zoznam je prazdny');
                  readln;
                  continue;
                  end
                  else write('Zadaj odbor ktory chces hladat:  ');
                  readln(najdi);
                  vyhladaj(najdi);

                  end;
                4:begin
                  if (prvy=nil) then begin write('zoznam je prazdny');
                  readln;
                  continue;
                  end
                  else writeln('Zadaj priezvisko studenta ktoreho chces zrusit:  ');
                  readln(vymaz);
                  zrus(vymaz);
                  end;
                5:;
else            writeln('zadal si zle, zadaj cisla od 1 po 4.');
                end;
until volba=5;
end.


takto to vyzerá teraz

Nahlásit jako SPAM
IP: 46.229.224.–
JoDiK
~ Anonymní uživatel
987 příspěvků
13. 6. 2013   #12
-
0
-

#11 peto1254
Aha, takže neopravil...

Nahlásit jako SPAM
IP: 88.100.43.–
peto1254
~ Anonymní uživatel
9 příspěvků
13. 6. 2013   #13
-
0
-

#10 JoDiK
ne, stále vypisuje všechny obory při vyhledávání, a potřebuji aby vypsalo pouze ten který jsem dal vyhledat

Nahlásit jako SPAM
IP: 46.229.224.–
JoDiK
~ Anonymní uživatel
987 příspěvků
13. 6. 2013   #14
-
0
-

#13 peto1254
Opakuji co už jsem jednou psal (a pořád to platí):

v proceduře vyhledání najdeš první záznam splňující podmínky hledání, tím končíš hledání a ten jeden nalezený záznam vypíšeš.

Takže si odděl procházení seznamu a podmínku pro hledání záznamu...

Navíc jsi tam přidal nesmyslnou chybu:

if hladaj<>nil  then begin

proměnná hladaj není vůbec nastavená, takže má náhodnou hodnotu..

Nahlásit jako SPAM
IP: 88.100.43.–
JoDiK
~ Anonymní uživatel
987 příspěvků
13. 6. 2013   #15
-
0
-

#14 JoDiK
ten repeat until co jsi přidal dělá jen to, že vypíše všechny zbývající záznamy počínaje tím prvním nalezeným...

Nahlásit jako SPAM
IP: 88.100.43.–
peto1254
~ Anonymní uživatel
9 příspěvků
13. 6. 2013   #16
-
0
-

#14 JoDiK
hladaj:=akt;

if hladaj<>nil  then begin

promiň 

tak že odstrániť repeat until ?

a jak to neoddělím?

Nahlásit jako SPAM
IP: 46.229.224.–
JoDiK
~ Anonymní uživatel
987 příspěvků
13. 6. 2013   #17
-
0
-

Zkus si ti nejdřív namalovat na papír a pak teprve piš do programu - evidentně se v tom matláš...

Jak to vidím já:

akt:=prvy;
while   ((akt<>nil) and (x=akt^.hod.odbor)) do begin
        akt:= akt^.dalsi;
end; { co je vysledkem tohoto cyklu? Já to čtu takto: dokud aktuální záznam je ten, který hledám, jdi na další záznam; Takže po skončení cyklu je v proměnné akt ukazatel na první záznam, který jsem nehledal!}

repeat
  writeln(akt^.hod.odbor,akt^.hod.meno:15,akt^.hod.priez:13,akt^.hod.rok:16);
  akt:=akt^.dalsi;
until   akt=nil;

{tento cyklus pak vypíše všechny zbývající záznamy, takže pokud první záznam není hledaný, vypíše úplně všechny, pokud první záznam je hledaný, tak vypíše všechny počínaje druhým}
 

Nahlásit jako SPAM
IP: 88.100.43.–
JoDiK
~ Anonymní uživatel
987 příspěvků
13. 6. 2013   #18
-
0
-

#17 JoDiK
Takže procházej všechny záznamy jedním while cyklem ve kterém v samostatném větvení zkoumej, jestli je aktuální záznam hledaný. Takový vypiš.

Až to budeš mít, promysli jak vyřešit, když se nenajde nic...

Nahlásit jako SPAM
IP: 88.100.43.–
peto1254
~ Anonymní uživatel
9 příspěvků
13. 6. 2013   #19
-
0
-

#17 JoDiK
nic vzdávám se předám to tak. i tak dik

Nahlásit jako SPAM
IP: 46.229.224.–
Mircosoft+1
Věrný člen
17. 6. 2013   #20
-
0
-

akt:=prvy;
while akt<>nil do
begin
if je to ten, který hledám then vypiš ho;
akt:=akt^.dalsi;
end;

Nahlásit jako SPAM
IP: 212.118.224.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 8 hostů

Podobná vlákna

Zoznam — založil CJ

Zoznam funkcii — založil Milan

Zoznam uživateľov — založil Jack

Kruhovy zoznam — založil tom

Jednosmerny zoznam — založil Grungy

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý