PDA

Zobacz pełną wersję : Problem z macierza w pascalu



Chrzanek
14-06-07, 03:54
Witam,
Sprawa jest tego typu ze podaje jakas macierz kwadratową A o elementach od 1 do 4 i program ma wypisac macierz B o wartosciach takich ze w B[i,j] sa wartosci rowne ilosci liczby "i" w kolumnie "j" w macierzy A.... zawiło brzmi ale jak sie ktoś wczyta i pomyśli to dosyć prosta sprawa niby... problem w tym że tylko niby ;)

Całego kodu nie będe wklejał tylko tą procedure która nie spełnia swego zadania...



...

procedure tworz_macierz(var mac:macierz;stopien:integer);

var
i,j,x,y:integer;

begin
for j:=1 to stopien do
for i:=1 to 4 do
begin
x:=0;
for y:=1 to stopien do
begin
if mac[y,j]=i then
x:=x+1
else
x:=x;
end;
mac[i,j]:=x;
end;
end;

...
dla jasności typ macierz to zadeklarowany typ zmiennej ;) błąd napewno znajduje sie gdzieś tutaj bo wszystkie inne procedury wykorzystywane w tym programie spełniają swoje zadania... procedura teoretycznie powinna sprawdzac po koleji kazda kolumne i w momencie kiedy trafi na "liczoną" liczbe zwiększa zmianną x o 1 i na koniec pod B[i,j] podstawia x.... jednak nie robi tego prawidlowo bo juz przy stopniu 1 macierzy tylko dla 1 wypisuje poprawna macierz B a dla 2,3 lub 4 tworzyt macierze zerowe... :?
Będe wdzięczny za jakieś wskazówki....
Pozdrawiam

RRybak
15-06-07, 08:26
Szczerze mówiąc, ani z opisu, ani z kodu nie potrafię wyłapać sensu tej procedury. Przeanalizujmy:

1. Dla podanej ilości wierszy (stopień) przeglądasz każdy wiersz..
2. ..w którym to każdym CZTERY razy..
3. zerujesz X, przeglądasz wszystkie kolumny wiersza i zliczasz czy są one równe wartościom kolejno 1,2,3,4.. (swoją drogą te "else x:=x" jest niepotrzebne, bo i tak nic nie robi)
4. jeśli znajdzie jakieś:
a) jedynki, to wpisze ich ilość w pierwszej kolumnie sumowanego wiersza
b) dwójki - ilość do drugiej kolumny sumowanego (przeglądanego) wiersza
c) trójki ... itd, itp
d) czwórki.. itd, itp

Czyli powstanie Ci macierz wypełniona w pierwszych czterech kolumnach, a reszta pozostanie nieruszona. Generalnie macierz A i B to ta sama macierz(??), macierz A nie ma elementów od 1..4 tylko co najwyżej zawiera wartości od 1 do 4 - rozmiar ma "stopien x stopien". Macierz B z definicji ma rozmiar "4 x stopien", co przeczy temu, ze A i B to to samo (co wynika z kodu - nadpisuje Ci przekazywaną macierz A, ale tylko częsciowo).

Nie jestem pewien, czy niszczenie macierzy A (var w deklaracji) jest tym co chcesz uzyskać i być może dostać do kolejnych procedur, które zakładasz że działają dobrze, a być może które uważają, że nadal mają A, a tak naprawdę dostają "mix A + B"... :???:

Poza tym zauważ, że poruszasz się na zewnątrz pętli wierszami, a w środku kolumnami, jednocześnie niszcząc sobie wiersz w trakcie zabawy (osławiony miks). Dlaczego? Przeglądasz wiersz j - zliczasz jedynki, i jednocześnie w tym samym wierszu wpisujesz ilość jedynek. Potem liczysz drugi raz ten sam wiersz pod kątem dwójek, ale masz już go zniszczony bo wpisałeś ilość jedynek. I tak aż do czwórki.

Np. wiersz 2 1 1 1
masz 3 jedynki, dostajesz: 3 1 1 1
liczysz dwójki, nie masz, bo sobie zniszczyłeś (a było), dostajesz: 3 0 1 1
i ostatecznie 3 0 0 0

Blah, zamieszane. Nie będę pisał kodu - myślę, że Cię wystarczająco naprowadziłem :-P

Chrzanek
15-06-07, 13:21
Heh nawet nie wiesz ile mi ta odpowiedzi pomogla :)
Z tym else x:=x; to juz tez mi sie tak zdawalo ale jzu bylem tak zniesmaczony ze sam nie wiedzialem gdzie jest błąd...
Poprostu nie wziąłem pod uwage że procedura już podczas trwania zmienia wartości macierzy i potem dalej je liczy dla innych liczb....


Jakby ktoś był zainteresowany :


procedure tworz_macierz(var baza,mac:macierz;stopien:integer);

var
i,j,x,y:integer;

begin
for j:=1 to stopien do
for i:=1 to 4 do
begin
x:=0;
for y:=1 to stopien do
begin
if baza[y,j]=i then
x:=x+1;
end;
mac[i,j]:=x;
end;
end;

A co do sensu tej procedury spróbuje to wyjasnić jeszcze raz :)
Mamy wprowadzoną macierz kwadratową "baza".... procedura sprawdza kolejno kolumnami ile w danej kolumnie jest wartości 1,2,3 lub 4 (robi to w kolejności : ile 1 w kolumnie 1, ile 2 w kolumnie 1, itd.) a nastepnie tworzy macierz o elementach mac[i,j] (gdzie i to elementy (1..4) a j to numer kolumny macierzy "baza") mających wartości odpowiadające temu ile "i" jest w "j".

Przykładowo :
macierz wejściowa :
1 2 3
2 3 1
4 4 2

Otrzymujemy macierz :
1 0 1
1 1 1
0 1 1
1 1 0

Dziękuje serdecznie i pozdrawiam :)