Vlozeni prvku na konec seznamu – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Vlozeni prvku na konec seznamu – Pascal – Fórum – Programujte.comVlozeni prvku na konec seznamu – Pascal – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
sparky290
Návštěvník
31. 10. 2013   #1
-
0
-

Prosim o radu mel jsem za ukol vkladat do lin. seznamu unikatni real hodnoty. Ale nemuzu prijit na proceduru ktera ten prvek ulozi na konec.

type UkPrvek = ^Prvek;

     Prvek = record

               Data: real;

               Dalsi: UkPrvek;

     end;

function vyhledejHodnotu(var S:UkPrvek; hodnota:real): boolean;

var pom:UkPrvek;

    vyhodnoceni: boolean;

begin

    pom:=S;

    vyhodnoceni:=false;

    while (pom <> nil) do

      begin

        if (pom^.Data = hodnota) then vyhodnoceni:=true;

        pom:=pom^.Dalsi

      end;

    vyhledejHodnotu:=vyhodnoceni

end;

procedure pridejUnikatni(var S: UkPrvek; hodnota:real);

var pom:UkPrvek;

begin

  if vyhledejHodnotu(S,hodnota) then exit

  else

      begin

       new(pom);

       pom^.Data:=hodnota;

       pom^.Dalsi:=S;

       S:=pom;

      end;

end;

Nahlásit jako SPAM
IP: 195.178.73.–
Reklama
Reklama
JoDiK
~ Anonymní uživatel
981 příspěvků
31. 10. 2013   #2
-
0
-

#1 sparky29
Pokud funkce vyhledejHodnotu nebyla požadována, tak z ní udělej rovnou proceduru pridejUnikatni, protože přece když prohledáš celý seznam aniž bys ji našel, tak jsi na jeho konci a můžeš tam tu nenalezenou unikátní hodnotu přidat (jen trošku polaď to procházení, buď si vždy někam ulož předchozí ukazatel, nebo poslední hodnotu testuj zvlášť - to zvládneš ne?). A pokud byla požadována, tak použij její mírně modifikovaný kód v té proceduře.

Nahlásit jako SPAM
IP: 88.103.233.–
sparky290
Návštěvník
31. 10. 2013   #3
-
0
-

http://pastebin.com/unF0XN6e

Nahlásit jako SPAM
IP: 195.178.73.–
sparky290
Návštěvník
31. 10. 2013   #4
-
0
-

pozadovana nebyla, ale nevim jak jinak bych to vlozil nakonec

Nahlásit jako SPAM
IP: 195.178.73.–
sparky290
Návštěvník
1. 11. 2013   #5
-
0
-

type

  UkPrvek = ^Prvek;

  Prvek = record

    Data: real;

    Dalsi: UkPrvek

  end;

procedure pridejNaKonec(var S: UkPrvek; hodnota: real);

var

  pom: UkPrvek;

  nalezeno: boolean;

begin

  pom:= S;

  nalezeno:=true;

  while (pom<>nil) and nalezeno do begin

    if pom^.Data=hodnota then

      nalezeno:=false

    else

      pom:=pom^.Dalsi;

    end;

    if nalezeno then

      pom^.Data:=hodnota;

end;

procedure kontrola(var S:UkPrvek);

var pom: UkPrvek;

begin

  pom:=S;

  while (pom <> nil) do begin

    write(pom^.Data:2:2,'; ');

    pom:=pom^.Dalsi;

    end;

end;

var S:UkPrvek;

begin

pridejNaKonec(S,3.1);

pridejNaKonec(S,3.4);

pridejNaKonec(S,7.2);

pridejNaKonec(S,3.1);

kontrola(S);

end.

ale nehazi mi to pekny hodnoty a hodi to runtime error 216

Nahlásit jako SPAM
IP: 195.178.73.–
JoDiK
~ Anonymní uživatel
981 příspěvků
1. 11. 2013   #6
-
0
-

#5 sparky29
A co takhle zabírat dynamické proměnné na haldě? (A pak po sobě uklízet?)

Co nastavování výchozích hodnot (včetně ukazatele na další prvek?)

A neškodily by komentáře co kde děláš....

A v neposlední řadě zkus příště nazývat proměnné pravými jmény, nalezeno/nenalezeno.

Nemám teď čas tě vést za ruku krok za krokem, tak prozkoumej jak by to třeba mohlo být a zjisti, kde máš nedostatky:

type

  UkPrvek = ^Prvek;
  Prvek = record
    Data: real;
    Dalsi: UkPrvek
  end;

procedure pridejNaKonec(var S: UkPrvek; hodnota: real);
var
  pom,predchozi: UkPrvek;
  nenalezeno: boolean;
begin
  pom:= S;
  predchozi:=nil;
  nenalezeno:=true;
  if pom<>nil
     then
         begin
         {Seznam není prázdný, můžeme hledat}
           while (pom<>nil) and nenalezeno do
             begin
               if pom^.Data=hodnota then nenalezeno:=false;
               predchozi:=pom;
               pom:=pom^.Dalsi;
             end;
           if nenalezeno then
             begin
		{Nic jsme nenašli, musíme vytvořit nový prvek 
		a zařadit ho na konec - neboli za předchozí}
               new(pom);
               pom^.Data:=hodnota;
               pom^.Dalsi:=nil;
               predchozi^.Dalsi:=pom;
             end;
         end
     else
       begin
         {Seznam byl prázdný, musíme založit nový}
         new(pom);
         pom^.Data:=hodnota;
         pom^.Dalsi:=nil;
         S:=pom;
       end;

end;

procedure kontrola(var S:UkPrvek);
var pom: UkPrvek;
begin
  pom:=S;
  while (pom <> nil) do begin
    write(pom^.Data:2:2,'; ');
    pom:=pom^.Dalsi;
  end;
end;

var S:UkPrvek;

begin
S:=nil;
pridejNaKonec(S,3.1);
pridejNaKonec(S,3.4);
pridejNaKonec(S,7.2);
pridejNaKonec(S,3.1);
pridejNaKonec(S,7.2);
pridejNaKonec(S,3.5);
kontrola(S);
end.
Nahlásit jako SPAM
IP: 88.103.236.–
sparky290
Návštěvník
1. 11. 2013   #7
-
0
-

Diky moc pokusim se to projit a priste davat komentare

Nahlásit jako SPAM
IP: 195.178.73.–
JoDiK
~ Anonymní uživatel
981 příspěvků
1. 11. 2013   #8
-
0
-

#7 sparky29
Jasně, a až to projdeš přidej ještě proceduru na uvolnění paměti...

Nahlásit jako SPAM
IP: 88.103.236.–
Sparky29
~ Anonymní uživatel
64 příspěvků
1. 11. 2013   #9
-
0
-

procedure uklid(var S: UkPrvek);
var pom, nasmazani: UkPrvek;
begin
 pom:=S;
 while pom <> nil do begin
  nasmazani:=pom;
  pom:=pom^.dalsi;
  dispose(nasmazani);
 end;
 S:=nil;
end;

Nahlásit jako SPAM
IP: 195.178.73.–
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, 15 hostů

Moderátoři diskuze

 

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