Przeszukiwanie liniowe zbioru (pascal)

0

Zadanie nastepujace: program ma wyszukiwac i podawac, na ktorym miejscu w zbiorze znajduje sie dana liczba; teoretycznie to ponizej ma dzialac, i uznajmy ze dziala, problem jednak w tym, ze wskazuje tylko 1 miejsce a zalezy mi aby wykazywalo wszystkie.
aby zobrazować:
mamy ciag liczb (np): 3, 4, 7, 18, 21, 2, 5, 7, 9,
chcĘ, aby program 'powiedzial' nam, na ktorym miejscu jest liczba 7,
'moj' program wykaze, ze jest ona na #3 i koniec, ale jak widzimy na #8 takze jest cyfra 7 i tegoten program nie wskaze;
zatem nalezy cos zmienic w fuckcji FindFirst, aby ta nie zatrzymywala sie po 1 znalezieni, ale zeby szla dalej. Mam wielka nadzieje, ze dosc jasno wytlumaczylem problem i prosze o pomoc. słowem: przerobic fuckcje FindFirst.

Program liniowe;
uses CRT;
Type tablica=array [1..20] of integer;
var t:tablica;
y:integer;

Procedure ZapiszTablice (var t:tablica);
var i:byte;
begin
Randomise;
for i:=1 to 20 do
t[i]:= random (100);
end;

Function FindFirst(n:byte; t:tablica; y:integer) : integer;
var i:byte;
begin
while (i<=n) and (y<>t[i]) do
i:= i+1
if y= t[i] then FindFirst:= i
else FindFirst:= -1;
end;

Procedure PiszTab (t:tablica);
var i:byte;
begin
for i:=1 to 20 do
write (t[i]:4);
writeln;
end;

begin
clrscr;
writeln ('wyszukiwanie elementu w zbiorze nieuporzadkowanym');
writeln ('podaj liczbe, ktorej szukasz: ');
readln (y);
if FindFirst (20, t, y)= -1
then writeln ('brak szukanego elementu w zbiorze');
else writeln ('szukany element wystapil po raz pierwszy na pozycji ', FindFirst (20,t,y));
repeat until keypressed;
end.

0

Dodaj sobie jeszcze jeden parametr w FindFirst (choć wtedy to już nie będzie First), powiedzmy s:byte. Przypisujesz tej zmiennej pozycję na której ostatnio coś znalazłeś, i zaczynasz szukać następnego wystąpienia od s+1. NP:

  Function FindFirst(n,s:byte; t:tablica; y:integer) : integer;
   var i:byte;
    begin
     i:=s+1;
     while (i<=n) and (y<>t[i]) do
      i:= i+1
     if y= t[i] then FindFirst:= i
     else FindFirst:= -1;
    end;

Edytka:
przy pierwszym wywołaniu podajesz s=0.

 var
  p:byte;
  s:boolean;
 begin
  clrscr;
   writeln ('wyszukiwanie elementu w zbiorze nieuporzadkowanym');
   writeln ('podaj liczbe, ktorej szukasz: ');
   readln (y);
   s:=true;
   repeat
    p:=FindFirst (20,p, t, y)= -1
    if (p=-1) and s then
    then writeln ('brak szukanego elementu w zbiorze');
    else 
    begin
     writeln ('szukany element wystapil na pozycji ', p);
     s:=false;
    end;
   until p<>-1;
    repeat until keypressed;
 end.

BTW, to tablica a nie zbiór. Zbiór nie przechowuje duplikatów :>

0

innym rozwiązaniem może być:

repeat
  tmp := FindFirst(start, wartość);
  start = tmp + 1;
  wektor_z_wynikami[i] := tmp;
  Inc(count);
until wektor_z_wynikami[count] = -1;

w tym rozwiązaniu wyszukane elementy są zapisywa w wektorze wektor_z_wynikami.

<font size="1">btw. a dokładniej to wektor właśnie ;)</span>

0

Dziekuje serdecznie za pomoc, ale wasze metody sa po prostu 'za madre' jak na mnie i jak nauczycielka poprosi o wytlumaczenie, to gleba :|

moze prostrzy sposob, z tego co mi wiadomo, trzeba jedynie w FindFirst zmienic cos, moze petle inna zastosowac, jak to pomoze... prosze, pomyslcie nad tym jeszcze

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