pascal

Sekcia: Programovanie 20.03.2008 | 16:46
Avatar zr3zo Arch Linux  Používateľ
Zdravim
mam problem pri jednej funkcii, ktora deli intervali na polku a hlada v poli jedno cislo ... no jednotucho,ide o to , ze sa zacykli do aleluja .... nevidi tam niekto nejaku chybu???
Function Najdi(nazov:string;NajCis:byte):boolean;
Var f: File of byte;
    cislo:array[1..50] of byte;  
    i,min,max,pol:byte;
Begin
  Assign(f,nazov);
  Reset(f);
  For i:=1 to 50 do
    Read(f,cislo[i]);
  Close(f);
  min:= 1;
  max:= 50;
  Repeat
    pol:= (max + min - 1) div 2;
    If cislo[pol] = NajCis
    Then
      Najdi:= true
    Else
      If cislo[pol] > NajCis
      Then
        max:= pol
      Else
        min:= pol; 
    If (max - min) = 1
    Then
      Najdi:= false;
  Until false;
End;

zrezo@jabbim.sk
    • Re: pascal 20.03.2008 | 17:00
      Avatar nardew debian  Používateľ
      nie je to tak, ze v pascale funkcia konci prejdenim na koniec jej tela?
      • Re: pascal 20.03.2008 | 17:20
        skywaker   Návštevník
        ja uz s pascalom dlho nerobym ale nemalo by tam byt pri porovnani "Until (Najdi=false);
    • Re: pascal 20.03.2008 | 17:17
      Avatar Lukáš Polák   Používateľ
      no tak ideme na to od zaciatku :)
      ocividne sa snazis skodit Binary search. pozri si o tom nieco na wiki - moc sa mi ale nepozdava podmienka (max-min) = 1 ale to som len narychle prebehol kod, takze to moze byt ok(este som sa s takymto zapisom binary search popravde nestretol :) ) - tam by som skorej daj <= 1
      druha poznamka je k tomu, preco sa ti to zacykli. Je to jasne, kedze repeat konci vtedy,kedy je za until podmienka splnena a kedze ty tam mas natvrdo False, tak neskonci nikdy. Pokial tam chces mat na tvrdo podmienku false, tak z repeat vyskocis pomocou prikazu break;
      problem nastava v tom, ze ty predpokladas, ze ked zadas funkcii vratit hodnotu, tak skonci jej beh, co u pascalu neplati a ona pokracuje dalej
      • Re: pascal 20.03.2008 | 18:46
        Avatar zr3zo Arch Linux  Používateľ
        Ouu a ja som bol v tom ze sa funkcia ukonci ked jje nieco predam ... oki diki moc ... mi to mohlo skor napadnut ... sice su tam este jemne chybicky ale to uz odladim
        zrezo@jabbim.sk
    • Re: pascal 20.03.2008 | 18:39
      Avatar Zefram Cochrane MS Windows Vista Ultimate 64bi  Používateľ
      Co ma robit ta funkcia? Lebo ak len ma najst char v stringu, a ten char moze byt hoci kde, tak bisekcia nema imho vyznam. Co presne ma robit ta funkcia? Jo a ked uz tam mas until false, asi by bolo dobre dat tam nieco ako if nasiel_som then break; alebo aspon until najdi;
      • Re: pascal 20.03.2008 | 18:53
        Avatar zr3zo Arch Linux  Používateľ
        ta funkcia mi mala len dat vystup ako true alebo false , ze ci sa zadane cislo nachadza v subore, predtim som samozrejme cisla utriedil vzostupne, a toto mal byt pokus o algoritmus vyhladavania cez delenim na polky (ci jak sa to vola 8) ) , ten string je len nazov suboru. A ten unti false som tam mal lebo som bol v tom ,ze funkcia sa automaticky ukonci ak jej nieco predam.
        zrezo@jabbim.sk
        • Re: pascal 20.03.2008 | 20:48
          skywaker   Návštevník
          podla mna nemozes tam dat len cisto false.. musis tam mat nejaku premenu ktora nadobuda stav false? nie? ak sa mylim tak ma niekto opravte.
          • Re: pascal 20.03.2008 | 20:53
            Avatar zr3zo Arch Linux  Používateľ
            ano mas pravdu , nemozem dat cisto false ... akosom uz spominal bol som v tom ze ked predamnieco funkcii tak vyskocim z funkcie inak to uz mam opravene :-)
            zrezo@jabbim.sk
          • Re: pascal 20.03.2008 | 22:30
            Avatar Zefram Cochrane MS Windows Vista Ultimate 64bi  Používateľ
            ale samozrejme ze mozes dat cisto false:

            repeat
            ...
            until false;

            je nekonecny cyklus rovnako ako:

            while true do
            begin
            end;

            Tiez v podmienke nemusi byt prenna=true ale staci samotna premenna

            if ladenie then
            writeln('Som tu')

            alebo mozno pouzit not:

            if not ladenie then
            writeln('ladenie je vypnute');