W jaki sposób porównać zawartości 2 tablic 2-u wymiarowych i wypisać ich elementy wspólne i elementy rożne ?
hmm... lecisz po elementach tablicy i sprawdzasz przykladowo:
var
a1,a2:array[0..5,0..2] of byte;
...
var
i,j:byte;
begin
for i:=0 to 5 do
for j:=0 to 2 do
if a1[i,j]<>a2[i,j] then showmessage(Format('a1[%d,%d]: %d '#10'a2[%d,%d]: %d',[i,j,a1[i,j],i,j,a2[i,j]]));
nie sprawdze bo w tej chwili nie mam Delphi pod reka moze gdzies zgubilem nawiad albo przecinek, albo calosc jest zle ;) :P
W macierzy 3 na 3 mam znaleźć te liczby, których NIE MA
- w macierzy znajdują się liczby z zakresu 1..9 które się nie powtarzają
- w danej komórce znajduje się liczba albo jej brak
- nie jest ważna kolejność
2 1 3
4
8 7
w jaki sposób wykazać ze brak 5 6 i 9
jako pustej liczby uzywaj -1 :]
type TMat=array[0..2,0..2]of Byte;
const Mat:TMat=((2,1,3),(0,4,0),(8,7,0));
function Sprawdz(const M:TMat):Word;
var X,Y:Integer;
begin
Rezult:=0;
for Y=0 to 2 do for X=0 to 2 do Result:=(Result)or((1)shl(M[Y,X]));
end;
function BrakujeCzegos(WordZeSprawdz:Word):Boolean;
begin
Result:=((WordZeSprawdz)and(1))<>0;
end;
function BrakujeLiczby(WordZeSprawdz:Word;Liczba:Byte):Boolean;
begin
Result:=((WordZeSprawdz)and((1)shl(Liczba)))=0;
end;
procedure Jakas;
var W:Word;
var B:Byte;
begin
W:=Sprawdz(Mat);
if BrakujeCzegos(W) then
begin
for B:=1 to 9 do if BrakujeLiczby(W,B) then ShowMessage(...);
end;
end;
Tak a propos czy to nie do rozwiazania sudoku programik piszesz ?
Zapomnialem dodac ze po obliczeniu tego WordZeSprawdz1 dla pierwszej tablicy i WordZeSprawdz2 do drugiej mozna uzyc:
var Wspolne,Rozne,Razem:Word;
Wspolne:=WordZeSprawdz1 and WordZeSprawdz2;
Rozne:=WordZeSprawdz1 xor WordZeSprawdz2;
Razem:=WordZeSprawdz1 or WordZeSprawdz2;
a potem traktowac funkcja CzyBrakLiczby.
Nie wiem, dlaczego ale powyższy kod nie wyświetla mi ze brak niektórych liczb
tamto pisalem z reki no i sa bledy ale wylacznie syntaksyczne.
ten kod u mnie dziala:
type TMat=array[0..2,0..2]of Byte;
function Sprawdz(const M:TMat):Word;
var X,Y:Integer;
begin
Result:=0;
for Y:=0 to 2 do for X:=0 to 2 do Result:=(Result)or((1)shl(M[Y,X]));
end;
function BrakujeCzegos(WordZeSprawdz:Word):Boolean;
begin
Result:=((WordZeSprawdz)and(1))<>0;
end;
function BrakujeLiczby(WordZeSprawdz:Word;Liczba:Byte):Boolean;
begin
Result:=((WordZeSprawdz)and((1)shl(Liczba)))=0;
end;
function JestLiczba(WordZeSprawdz:Word;Liczba:Byte):Boolean;
begin
Result:=((WordZeSprawdz)and((1)shl(Liczba)))<>0;
end;
procedure TForm1.Button1Click(Sender: TObject);
var W1,W2,Wspolne,Rozne,Razem:Word;
var B:Byte;
var Str:String;
const Mat1:TMat=((2,1,3),(0,4,0),(8,7,0));
const Mat2:TMat=((0,0,4),(1,0,0),(9,5,0));
begin
W1:=Sprawdz(Mat1);
if BrakujeCzegos(W1) then
begin
SetLength(Str,0);
for B:=1 to 9 do if BrakujeLiczby(W1,B) then Str:=Str+IntToStr(B)+',';
SetLength(Str,Length(Str)-1);
ShowMessage('W Mat1 brakuje liczb: '+Str);
end;
W2:=Sprawdz(Mat2);
if BrakujeCzegos(W2) then
begin
SetLength(Str,0);
for B:=1 to 9 do if BrakujeLiczby(W2,B) then Str:=Str+IntToStr(B)+',';
SetLength(Str,Length(Str)-1);
ShowMessage('W Mat2 brakuje liczb: '+Str);
end;
Wspolne:=W1 and W2;
SetLength(Str,0);
for B:=1 to 9 do if JestLiczba(Wspolne,B) then Str:=Str+IntToStr(B)+',';
SetLength(Str,Length(Str)-1);
ShowMessage('Wspolne liczby w Mat1 i Mat2: '+Str);
Rozne:=W1 xor W2;
SetLength(Str,0);
for B:=1 to 9 do if JestLiczba(Rozne,B) then Str:=Str+IntToStr(B)+',';
SetLength(Str,Length(Str)-1);
ShowMessage('Rozne liczby w Mat1 i Mat2: '+Str);
Razem:=W1 or W2;
SetLength(Str,0);
for B:=1 to 9 do if JestLiczba(Razem,B) then Str:=Str+IntToStr(B)+',';
SetLength(Str,Length(Str)-1);
ShowMessage('Razem liczby w Mat1 i Mat2: '+Str);
end;