W potrzasku iloczyn trzech tablic

Robson48
Użytkownik
Użytkownik
Posty: 56
Rejestracja: 14 lis 2009, o 17:16
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 4 razy

W potrzasku iloczyn trzech tablic

Post autor: Robson48 »

Mam trzy tablice rosnąco, muszę obliczyć ile jest takich elementów które występują w 3 tablicach naraz nie wiem co jest zle :C siedze na tym ktoras z rzedu godzine. plz HELP, mialem juz kod ktory dawal dobry wynik ale tylko wtedy gdy nie bylo przypadku ze na poczatku w tablicach jest 1,1,2. Ale ten algorytm sie zgubił.
Wszystko jest w kodzie jedyny zly fragment jest zaznaczony komentem. To bardzo ważne, mam kolosa a i nie mogę sobie pozwoilić na takie błędy.

PS: do tego kompilator zaczął mi wywalać błąd że spodziewał się ; przed elsem.(najglebszym w petlach)

Kod: Zaznacz cały

                  program trojaczki;
const
n=10;
var
A:array[1..n] of integer;
B:array[1..n] of integer;
C:array[1..n] of integer;
i,j,w,pom,counter,pom2:integer;
prawda:boolean;
begin


  A[1]:=1;A[2]:=5;A[3]:=6;A[4]:=9;A[5]:=11;A[6]:=12;A[7]:=15;A[8]:=16;A[9]:=19;A[10]:=20;
  B[1]:=1;B[2]:=3;B[3]:=6;B[4]:=7;B[5]:=9;B[6]:=10;B[7]:=15;B[8]:=40;B[9]:=55;B[10]:=57;
  C[1]:=2;C[2]:=3;C[3]:=4;C[4]:=6;C[5]:=8;C[6]:=9;C[7]:=15;C[8]:=22;C[9]:=54;C[10]:=73;

  counter:=0;
  i:=1;   //INICJALIZUJE INDEKSY TABLIC
  j:=1;
  w:=1;
  pom2:=w;


while (i<=n) and (j<=n) and (w<=n) do
  begin
    if A[i]<B[j] then
      i:=i+1
    else if B[j]<A[i] then
      j:=j+1
    else                                                                          //DOTĄD JEST WSZYSTKO DOBRZE, KORZYSTAM Z ZALOZENIA ZE JESLI ELEMENTY MAJA BYC W 3 TABLICACH TO MUSZA BYC W CONAJMNIEJ DWOCH I SZUKAM TEGO TRZECIEGO W TRZECIEJ UWZGLEDNIAJAC ZE TABLICA JEST POSORTOWANA, NIE ROBIE TEGO NA PALE SPRAWDZAJAC KAZDY ELEMENT
    while (w<n) and(i<=n) and (j<=n) and not (C[w]>B[j]) do
      begin
	if C[w]<B[j] then
         w:=w+1;
        if C[w]>B[j] then
        //NIC NULL NOTHING
        else
        begin
	  counter:=counter+1;
          w:=w+1; 
          i:=i+1;
          j:=j+1;
        end
        else

        begin
        i:=i+1;
        j:=j+1;
        end;


     end;










                                       //WYPISY WYNIKOW
   for i:=1 to n do
  writeln(A[i]);
    writeln();
    for i:=1 to n do
  writeln(B[i]);
    writeln();
    for i:=1 to n do
  writeln(C[i]);
  writeln();
  writeln(counter);
end.
Awatar użytkownika
paladin
Użytkownik
Użytkownik
Posty: 148
Rejestracja: 24 sty 2005, o 22:15
Płeć: Mężczyzna
Lokalizacja: Kraków
Pomógł: 19 razy

W potrzasku iloczyn trzech tablic

Post autor: paladin »

Zrób to prościej i szybciej Masz tablice A, B i C. Przygotowujesz sobie trzy wskaźniki i, j, k i ustawiasz na 1. I teraz:
Jeśli A = B[j] = C[k], to znalazłeś dobry element.
Jeśli te trzy liczby nie są wszystkie równe, to zwiększasz o 1 wskaźnik najmniejszej - ona się już na pewno nie przyda.
Powtarzasz, aż któryś wskaźnik wyjdzie poza tablicę.
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

W potrzasku iloczyn trzech tablic

Post autor: smiechowiec »

Kod: Zaznacz cały

   program trojaczki;
const
  n=10;
  
var
  A : array[1..n] of integer;
  B : array[1..n] of integer;
  C : array[1..n] of integer;
  i, j, w, counter : integer;
  
begin
  A[1] := 1;A[2] := 5;A[3] := 6;A[4] := 9;A[5] := 11;A[6] := 12;A[7] := 15;A[8] := 16;A[9] := 19;A[10] := 20;
  B[1] := 1;B[2] := 3;B[3] := 6;B[4] := 7;B[5] := 9;B[6] := 10;B[7] := 15;B[8] := 40;B[9] := 55;B[10] := 57;
  C[1] := 2;C[2] := 3;C[3] := 4;C[4] := 6;C[5] := 8;C[6] := 9;C[7] := 15;C[8] := 22;C[9] := 54;C[10] := 73;

  counter := 0;
  i := 1;
  j := 1;
  w := 1;
  for i := 1 to n do begin
    while ((B[j] < A[i]) and (j < n)) do
      j := j + 1;
    if (B[j] = A[i]) then begin
      while ((C[w] < A[i])  and (w < n)) do
        w := w + 1;
      if (C[w] = A[i]) then
        counter  :=  counter + 1;
    end;
  end;
  write('A :');
  for i := 1 to n do
    write(A[i], ' ');
  writeln('');
  write('B :');
  for i := 1 to n do
    write(B[i], ' ');
  writeln;
  write('C :');
  for i := 1 to n do
    write(C[i], ' ');
  writeln;
  writeln('Wynik ', counter);
end.
Ostatnio zmieniony 19 lis 2009, o 11:02 przez smiechowiec, łącznie zmieniany 1 raz.
Awatar użytkownika
paladin
Użytkownik
Użytkownik
Posty: 148
Rejestracja: 24 sty 2005, o 22:15
Płeć: Mężczyzna
Lokalizacja: Kraków
Pomógł: 19 razy

W potrzasku iloczyn trzech tablic

Post autor: paladin »

Wygląda nieźle.
Robson48
Użytkownik
Użytkownik
Posty: 56
Rejestracja: 14 lis 2009, o 17:16
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 4 razy

W potrzasku iloczyn trzech tablic

Post autor: Robson48 »

JESTEŚ GENIALNY! DZIĘKUJĘ!
ODPOWIEDZ