Matrice Triangolare [Pascal]
Salve a tutti,
so di sottoporvi un quesito forse un po' complesso (non perché non ci sia chi lo sa, ma scrivere codice e farlo interpretare non è sempre semplicissimo!)
Io ho creato due funzioni in Pascal (bleah!) per capire se una matrice è triangolare o meno. Il problema è che con la triangolare superiore funziona, con la triangolare inferiore (ovviamente) no!
Gentilmente potete dare un'occhiata e vedere se riuscite a trovare l'errore? GRAZIE MILLE
function TriangolareSuperiore(M: TMAT; R,C: longint):boolean;
var I,J: longint;
TS: boolean;
begin
TS:=false;
for I:=1 to R do
begin
J:=1;
while ((I-J)>0) AND (J<=C) AND TS do
begin
if (M[I,J]=0) then
TS:=true
else
begin
TS:=false;
TriangolareSuperiore:=TS;
end;
J:=J+1;
end;
end;
TriangolareSuperiore:=TS;
end;
function TriangolareInferiore(M: TMAT; R,C: longint):boolean;
var I,J: longint;
TI: boolean;
begin
TI:=false;
for I:=1 to R do
begin
J:=1;
while ((I-J)<0) AND (J<=C) AND TI do
begin
if (M[I,J]=0) then
TI:=true
else
begin
TI:=false;
TriangolareInferiore:=TI;
end;
J:=J+1;
end;
end;
TriangolareInferiore:=TI;
end;
Un saluto a tutti!!
so di sottoporvi un quesito forse un po' complesso (non perché non ci sia chi lo sa, ma scrivere codice e farlo interpretare non è sempre semplicissimo!)
Io ho creato due funzioni in Pascal (bleah!) per capire se una matrice è triangolare o meno. Il problema è che con la triangolare superiore funziona, con la triangolare inferiore (ovviamente) no!
Gentilmente potete dare un'occhiata e vedere se riuscite a trovare l'errore? GRAZIE MILLE

function TriangolareSuperiore(M: TMAT; R,C: longint):boolean;
var I,J: longint;
TS: boolean;
begin
TS:=false;
for I:=1 to R do
begin
J:=1;
while ((I-J)>0) AND (J<=C) AND TS do
begin
if (M[I,J]=0) then
TS:=true
else
begin
TS:=false;
TriangolareSuperiore:=TS;
end;
J:=J+1;
end;
end;
TriangolareSuperiore:=TS;
end;
function TriangolareInferiore(M: TMAT; R,C: longint):boolean;
var I,J: longint;
TI: boolean;
begin
TI:=false;
for I:=1 to R do
begin
J:=1;
while ((I-J)<0) AND (J<=C) AND TI do
begin
if (M[I,J]=0) then
TI:=true
else
begin
TI:=false;
TriangolareInferiore:=TI;
end;
J:=J+1;
end;
end;
TriangolareInferiore:=TI;
end;
Un saluto a tutti!!
Risposte
non l'ho visto con molta calma, e poi sono secoli che non programmo più, ma mi pare che il problema sia nell'istruzione "while":
nella triangolare superiore scrivi "while (i-j>0)", e j aumenta...
nella triangolare inferiore scrivi "while (i-j<0)", e sempre j aumenta...: quindi o il programma non parte o va all'infinito.
potrei avere anche preso una cantonata, ma ti conviene controllare e rivedere questa parte.
ciao.
nella triangolare superiore scrivi "while (i-j>0)", e j aumenta...
nella triangolare inferiore scrivi "while (i-j<0)", e sempre j aumenta...: quindi o il programma non parte o va all'infinito.
potrei avere anche preso una cantonata, ma ti conviene controllare e rivedere questa parte.
ciao.
Perché scrivi (I-J)>0 e (I-J)<0 invece che i più leggibili I > J e I < J? Una matrice triangolare non dovrebbe anche essere quadrata? Ho sempre pensato che era richiesto dalla definizione.
Il problema è che J parte sempre da uno e invece dovrebbe partire da I + 1 in questo caso. Quando inizia il ciclo la condizione nel while verifica che I sia minore di J e non è mai vero.
Il problema è che J parte sempre da uno e invece dovrebbe partire da I + 1 in questo caso. Quando inizia il ciclo la condizione nel while verifica che I sia minore di J e non è mai vero.
"friggi195":
...
Io ho creato due funzioni in Pascal (bleah!) ...![]()
non offendermi così il Pascal!
Queste funzioni mi pare possano scriversi in maniera più semplice, forse più chiara ed efficiente. Ad esempio, quella non funzionante:
function TriangolareInferiore(M: TMAT; R: longint):boolean; var I,J: longint; TI: boolean; begin TI:=true; I:=0; while(I<R) AND TI do begin I:=I+1; J:=I; while (J<=R) AND TI do if (M[I,J]<>0) then TI:=false else J:=J+1; end; TriangolareInferiore:=TI; end;
