Problem z tablicą

0

Mam taki problemik, mam tablice 20x20 i chce porownac w niej wartosci - kazda z kazda i jezeli sa sobie rowne to do zmiennej c dodaje 1. Napisalem taki kodzik, jednak nie dziala. Moze ktos ma jakies wskazowki ??

for j := 1 to ile_losowan - 1 do
 begin
 for i := 1 to 20 do
  begin
  for k := 1 to 20 do
   begin
    if Wyniki[j][i] = Wyniki[j+1][k] then c := c + 1;
   end;
  end;
 end;

Pozdrawiam
Anti2k

0

Procedure Policz;
Var
 Tablica: Array[1..20, 1..20] Of Integer;//Twoja 20 elementowa tablica
 IloscLos : Integer;
 x, y : Integer;// zmienne pomocnicze - tu dla pętli For
 Powtorki : Integer;// zmienna, która będzie zliczać powtórki

Begin
 Powtorki:= 0;
 For IloscLos:=1 To 20 Do
  For x:=1 To 20 Do
  For y:=x+1 To 20 Do
   If Tablica[IloscLos, x]=Tablica[IloscLos, y] Then Inc(Powtorka);//Powtorka:=Powtorka+1
End; { koniec procedury }

0

Najlepiej wszystko sprowadzić do pojedynczego wymiaru...

const 
  a=1;
  b=1;   
var 
  tab:array[a..a+19,b..b+19]of byte;
  i,j:word;
  wynik:word;
begin
  wynik:=0;
  for i:=0 to 398 do
    for j:=i+1 to 399 do
      inc(wynik,byte(tab[(i div 20)+a,(i mod 20)+b]=tab[(j div 20)+a,(j mod 20)+b]));
      // if(tab[(i div 20)+a,(i mod 20)+b]=tab[(j div 20)+a,(j mod 20)+b])then inc(count);
end.

Tylko, że powyższa metoda jest dobra, gby masz szeroki zakres mozliwych wartości, jakie może przyjmować każda komórka tablicy. Gdy masz mało komórek, i sporo różnych wartości. Natomiast...

const 
  a=1;
  b=1;  
  c=1;   // dolna granica zakresu
  d=49;  // górna granica zakresu
type 
  zakreswartosci=c..d;  // czy inny szczęśliwy numerek
var 
  count:array[zakreswarotsci]of word; // word, bo 20*20 to 400
  tab:array[a..a+19,b..b+19]of zakreswartosci;
  i,j:word;  // indekzy muszą pokrywać... zakreswartosci , a..a+19 , b..b+19;
  wynik:integer;
begin
  fillchar(count,sizeof(count),0);   // czyścim tablice
  wynik:=0;
  for i:=a to a+19 do
    for j:=b to b+19 do
      inc(count[tab[i,j]]);
  for i:=c to d do
    if count[i]<>0 then // albo nawet if count[i]>1 then
      inc(wynik,count[i]-1);  // why -1, to już musisz sam się domyslić.
end.

... ta metoda juz na pierwszy rzut oka wydaje się troszkę szybsza, ale tylko dla małego zakrseu przyjmowanych przez komórki tablicy wartości. Jest yeż proporcjonalnie pamięciożerna do tego zakresu. Ale za to wydajmośc w stosunku do poprzedniej rosnie, gdy rośnie liczba komórek.

0

Napisalem w koncu cos takiego:


begin

   for l := 1 to 20 do
    for o := 1 to 20 do
     for k := 1 to 19 do
      for x := k to 19 do
       if Wyniki[k,l] = Wyniki[x+1,o] then Inc(n);

  end;

Co o tym sadzicie ? Jestem swiezy, dopiero sie ucze, takze jak macie jakies poprawki to walcie. Ten kodzik spelnia zamierzony efekt.

0
  for x1 := 1 to 20 do
    for y1 := 1 to 20 do
      if((x1<>20)and(y1<>20))then // sprawdź predkość z i bez tego warunku. Może sie okazać, że prędzej będzie bez niego.
        for x2 := 1 to 20 do
          for y2 := 1 to 20 do
            if((x1<>x2)or(y1<>x2))then // if(((y1 shl 5)+x1)<((y2 shl 5)+x2))then
              if(Wyniki[x1,y1] = Wyniki[x2,y2] then Inc(n);

Zamiast 'then if' powinno byc 'and', ale rozbiłem, żeby było lepiej widać... poza tym po to sprowadziłem to do jednego wymiaru, aby nie porównywać już raz porównanych komórek... To samo uzyskasz stosując warunek z komentarza. W obecna wersja jest najminiej optymalną z możliwych. Jest prosta, pewna, ale maksymalnie wolna. Jaszcze jedna rzecz. Nie wolno ze sobą porównywać komórek z obydwoma takimi samymi indeksami, bo to oczywiste, że będą sobie równe. Co do shl nie ma znaczenia, czy napiszesz y1*21, czy y1 shl 7. Ważne, aby w jakis sposób wprowadzic zależność pomiędzy indeksami, a liniowym numerem komórki (nie ważne, czy ten numer jest prawdziwy, ważne aby jednoznacznie identyfikował komórki, bo potrzebne jest tylko do porównaniam a shl jest najszybszym z mnożących operatorów).

0

To co napisalem wcale nie porownuje tych samych indeksow tablic, porownuje 1 rzad tablicy z 2, 3 itd, pozniej 2 z 3, 4 itd. Nie ma takiej opcji zeby porownywal 1 rzad z 1, 2 z 2.

0

chce porownac w niej wartosci - kazda z kazda

A teraz ciekaw jestem, jak porównasz ze sobą komórki np. Wynik[1,4] i Wynik[1,6]. Albo ogólnie wynik[1,m] i wynik[1,n] dla n<>m ? Załóż sobie brejka warunkowego dla x+1=1 (x=0) i sam sie przekonaj, że podczas sprawdzania olewasz całkowicie jedną kolumnę.

// Życzę ci dokładnych wyników ;p Nadal twierdzę, że (ze względu na sfomułowanie pytania) schrzaniłeś.

0

Masz racje, zle sformulowalem pytanie, natomiast algorytm dziala tak jak chcialem.
dzieki

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