PDA

Visualizza la versione completa : [Pascal] Calcolo del prodotto di due matrici usando la variabile record


serfabio
31-10-2011, 10:07
Salve a tutti amici del Forum!!!Voglio sottoporvi un problema da risolvere mediante un programma redatto in linguaggio Pascal che mi dà purtroppo un errore a tempo di compilazione che non riesco ad interpretare ( è per questo che chiedo il vostro aiuto). Si tratta di realizzare un programma che calcoli il prodotto di due matrici quadrate di ordine n, che non supporremo mai superiore a 10, usando per rappresentare le medesime la nozione di record, dunque sia le matrici da moltiplicare che quella risultante saranno del tipo:




type termine= record
riga: integer;
colonna: integer;
val: real;
end;
mat= array[1..n*n]of termine;



Il programma che ho elaborato è il seguente:




program CalcoloProdottoDiDueMatrici(input,output);
label 99;
const n=10;
bell=07;

type termine= record
riga: integer;
colonna: integer;
val: real;
end;
mat= array[1..n*n]of termine;

var a,b,p,q : mat;
i,j,c,h,k : integer;


procedure ScriviMatriceUsandoRecord( var q : mat );
begin

writeln('Inserire gli elementi della matrice ciascuno separato da <INVIO>:');
writeln;
for c:=1 to h
do begin
readln(q[c].riga);
readln(q[c].colonna);
readln(q[c].val);
end;
writeln;
writeln;
writeln('La matrice risultante e'':');
writeln;
writeln;
for i:=1 to n
do begin
for j:=1 to n
do for c:=1 to h
do if(q[c].riga=i)and(q[c].colonna=j)
then write(' ',(q[c]).val:2:2,' ');
writeln;
end;
end;{ fine procedura ScriviMatriceUsandoRecord }

procedure ProdottoDiMatriciUsandoRecord( a : mat; b : mat ; var p : mat);
begin

for i:=1 to n
do for j:=1 to n
do begin
p[c].riga:=i;
p[c].colonna:=j;
p[c].val:=0;
for k:=1 to h
do if(a[c].colonna)=(b[c].riga)
then p[c].val:=p[c].val+(a[c].val)*(b[c].val);
end;
writeln;
writeln;
writeln('La matrice prodotto risultante e'':');
writeln;
writeln;
for i:=1 to n
do begin
for j:=1 to n
do for c:=1 to h
do if(p[c].riga=i)and(p[c].colonna=j)
then write(' ',(p[c]).val:4:2,' ');
writeln;
end;
end;{ fine procedura ProdottoDiMatriciUsandoRecord }
{ Corpo del programma }

begin

writeln('-------------------------- Dati di ingresso -----------------------------');
writeln;
writeln;
write('Fornire la dimensione n delle due matrici quadrate di ingresso a e b: ');
readln(n);
h:=n*n;
writeln;
if n>10 then begin
writeln(chr(bell),'Errore nei dati di ingresso! - STOP -');
goto 99;
end
else begin
ScriviMatriceUsandoRecord(a);
writeln;
ScriviMatriceUsandoRecord(b);
writeln;
ProdottoDiMatriciUsandoRecord(a,b,p)
end;
99 :
readln;

end.



Solo che quando vado a compilarlo (uso il compilatore Dev-Pascal) mi dà il seguente risultato:

Fatal: Internal error 334.

Qualcuno è in grado di spiegarmi il significato dell'errore interno 334, poichè cercando con Google non sono riuscito a trovare granchè, ed è altresì in grado di dirmi quindi se il programma è corretto o come fare per eliminare l'errore? Grazie mille per la collaborazione. Ciao!!! :ciauz:

serfabio
31-10-2011, 11:37
Riporto qui una correzione nella procedura ProdottoDiMatriciUsandoRecord, nella quale si dovrebbero calcolare i termini della matrice prodotto p=a*b, in modo che risulti:

p11=a11*b11+a12*b21+...a1n*bn1, p12=a11*b21+a12*b22+...

ecco la procedura con la correzione:




procedure ProdottoDiMatriciUsandoRecord( a : mat; b : mat ; var p : mat);
begin

for i:=1 to n
do for j:=1 to n
do begin
p[c].riga:=i;
p[c].colonna:=j;
p[c].val:=0;
for k:=1 to h
do if((a[c].colonna)=(b[c].riga))and((a[c].riga)=j)and((b[c].colonna=i))
then p[c].val:=p[c].val+(a[c].val)*(b[c].val);
end;
writeln;
writeln;
writeln('La matrice prodotto risultante e'':');
writeln;
writeln;
for i:=1 to n
do begin
for j:=1 to n
do for c:=1 to h
do if(p[c].riga=i)and(p[c].colonna=j)
then write(' ',(p[c]).val:4:2,' ');
writeln;
end;
end;{ fine procedura ProdottoDiMatriciUsandoRecord }




Ma il risultato della compilazione è il solito errore intero 334!!! :nillio:

serfabio
31-10-2011, 21:47
Salve. L'errore di cui sopra era dovuto ad un'errata scrittura della generalizzazione del problema. Pubblico una versione del programma che tuttavia non dà risultati corretti, in particolare non fornisce la matrice prodotto ma un vettore con elementi errati. Ecco il codice:




program CalcoloProdottoDiDueMatrici(input,output);
label 99;
const n=10;
bell=07;

type termine= record
riga: integer;
colonna: integer;
val: real;
end;
mat= array[1..n*n]of termine;

var a,b,p,q : mat;
i,j,c,h,k,l : integer;


procedure ScriviMatriceUsandoRecord( var q : mat );
begin

writeln('Inserire gli elementi della matrice ciascuno separato da <INVIO>:');
writeln;
for c:=1 to h
do begin
readln(q[c].riga);
readln(q[c].colonna);
readln(q[c].val);
end;
writeln;
writeln;
writeln('La matrice risultante e'':');
writeln;
writeln;
for i:=1 to n
do begin
for j:=1 to n
do for c:=1 to h
do if(q[c].riga=i)and(q[c].colonna=j)
then write(' ',(q[c]).val:2:2,' ');
writeln;
end;
end;{ fine procedura ScriviMatriceUsandoRecord }

procedure ProdottoDiMatriciUsandoRecord( a : mat; b : mat ; var p : mat);
begin

for c:=1 to h
do for i:=1 to n
do for j:=1 to n
do begin
p[c].riga:=i;
p[c].colonna:=j;
p[c].val:=0;
for k:=1 to h
do if((a[k].riga)=(b[k].colonna))and(a[k].riga=i)and(b[k].colonna=j)
then p[k].val:=p[k].val+(a[k].val)*(b[k].val);
end;
writeln;
writeln;
writeln('La matrice prodotto risultante e'':');
writeln;
writeln;
for i:=1 to n
do begin
for j:=1 to n
do for c:=1 to h
do if(p[c].riga=i)and(p[c].colonna=j)
then write(' ',(p[c]).val:4:2,' ');
writeln;
end;
end;{ fine procedura ProdottoDiMatriciUsandoRecord }
{ Corpo del programma }

begin

writeln('-------------------------- Dati di ingresso -----------------------------');
writeln;
writeln;
write('Fornire la dimensione delle due matrici quadrate di ingresso a e b: ');
readln(l);
h:=l*l;
writeln;
if l>10 then begin
writeln(chr(bell),'Errore nei dati di ingresso! - STOP -');
goto 99;
end
else begin
ScriviMatriceUsandoRecord(a);
ScriviMatriceUsandoRecord(b);
ProdottoDiMatriciUsandoRecord(a,b,p)
end;
99 :
readln;

end.


Credo che l'errore sia nella procedura ProdottoDiMatriciUsandoRecord, in particolare:




for c:=1 to h
do for i:=1 to n
do for j:=1 to n
do begin
p[c].riga:=i;
p[c].colonna:=j;
p[c].val:=0;
for k:=1 to h
do if((a[k].riga)(b[k].colonna))and(a[k].riga=i)and(b[k].colonna=j)
then p[k].val:=p[k].val+(a[k].val)*(b[k].val);
end;



dove si dovrebbe calcolare la matrice prodotto p. Qualcuno degli utenti del Forum è in grado di segnalarmi la corretta scrittura della procedura? Ve ne sarei molto grato.
Grazie a tutti!!! :ciauz:

serfabio
01-11-2011, 10:46
Ho provato a modificare ancora la procedura ProdottoDiMatriciUsandoRecord, introducendo tre cicli while concatenati relativi rispettivamente alle variabili c,i,j e ciascuno racchiudente l'altro e poi ho inserito un istruzione goto in quella relativa alla variabile i, dopo averla incrementata, in modo da impedire che nel calcolo degli elementi di p(matrice prodotto) vengano sommati i prodotti dei corrispondenti elementi di tutta l'intera matrice e non solo la singola riga e colonna selezionata. La procedura così modificata è la seguente:





procedure ProdottoDiMatriciUsandoRecord( a : mat; b : mat ; var p : mat);
begin

while(c>=1)and(c<=h)
do begin
while(i>=1)and(i<=l)
do begin while(j>=1)and(j<=l)
do begin
p[c].riga:=i;
p[c].colonna:=j;
p[c].val:=0;
for k:=1 to l
do if(a[k].riga=i)and(b[k].colonna=j)and(a[k].colonna=b[k].riga)
then p[c].val:=p[c].val+(a[k].val)*(b[k].val);
j:=j+1;
end;
i:=i+1;
goto 1;
end;
1 : c:=c+1;
end;
writeln;
writeln;
writeln('La matrice prodotto risultante e'':');
writeln;
writeln;
for i:=1 to l
do begin
for j:=1 to l
do for c:=1 to h
do if(p[c].riga=i)and(p[c].colonna=j)
then write(' ',(p[c]).val:4:2,' ');
writeln;
end;
end;{ fine procedura ProdottoDiMatriciUsandoRecord }



Tuttavia il risultato non è ancora una la matrice prodotto!!! :confused:

serfabio
01-11-2011, 12:34
Ancora una versione riveduta e corretta che usa sempre l'istruzione goto. Però ancora non funziona!!! :confused:




program CalcoloProdottoDiDueMatrici(input,output);
label 1,99;
const n=10;
bell=07;

type termine= record
riga: integer;
colonna: integer;
val: real;
end;
mat= array[1..n*n]of termine;

var a,b,p,q : mat;
i,j,c,h,k,l : integer;


procedure ScriviMatriceUsandoRecord( var q : mat );
begin

writeln('Inserire gli elementi della matrice ciascuno separato da <INVIO>:');
writeln;
for c:=1 to h
do begin
readln(q[c].riga);
readln(q[c].colonna);
readln(q[c].val);
end;
writeln;
writeln;
writeln('La matrice e'':');
writeln;
writeln;
for i:=1 to l
do begin
for j:=1 to l
do for c:=1 to h
do if(q[c].riga=i)and(q[c].colonna=j)
then write(' ',(q[c]).val:2:2,' ');
writeln;
end;
end;{ fine procedura ScriviMatriceUsandoRecord }

procedure ProdottoDiMatriciUsandoRecord( a : mat; b : mat ; var p : mat);
begin

while(c>=1)and(c<=h)
do begin
while(i>=1)and(i<=l)
do begin while(j>=1)and(j<=l)
do begin
p[c].riga:=i;
p[c].colonna:=j;
p[c].val:=0;
for k:=1 to l
do if(a[k].riga=i)and(b[k].colonna=j)and(a[k].colonna=b[k].riga)
then p[c].val:=p[c].val+(a[k].val)*(b[k].val);
j:=j+1;
if j<=l then goto 1;
end;
i:=i+1;
end;
1 : c:=c+1;
end;
writeln;
writeln;
writeln('La matrice prodotto risultante e'':');
writeln;
writeln;
for i:=1 to l
do begin
for j:=1 to l
do for c:=1 to h
do if(p[c].riga=i)and(p[c].colonna=j)
then write(' ',(p[c]).val:4:2,' ');
writeln;
end;
end;{ fine procedura ProdottoDiMatriciUsandoRecord }
{ Corpo del programma }

begin

writeln('-------------------------- Dati di ingresso -----------------------------');
writeln;
writeln;
write('Fornire la dimensione delle due matrici quadrate di ingresso a e b: ');
readln(l);
h:=l*l;
writeln;
if l>10 then begin
writeln(chr(bell),'Errore nei dati di ingresso! - STOP -');
goto 99;
end
else begin
ScriviMatriceUsandoRecord(a);
writeln;
ScriviMatriceUsandoRecord(b);
ProdottoDiMatriciUsandoRecord(a,b,p)
end;
99 :
readln;

end.

serfabio
01-11-2011, 22:33
Nell'ultima versione ho dimenticato di inizializzare gli indici nei cicli while della procedura ProdottoDiMatriciUsandoRecord. La scrittura corretta sintatticamente del programma è pertanto la seguente:




program CalcoloProdottoDiDueMatrici(input,output);
label 1,99;
const n=10;
bell=07;

type termine= record
riga: integer;
colonna: integer;
val: real;
end;
mat= array[1..n*n]of termine;

var a,b,p,q : mat;
i,j,c,h,k,l : integer;


procedure ScriviMatriceUsandoRecord( var q : mat );
begin

writeln('Inserire gli elementi della matrice ciascuno separato da <INVIO>:');
writeln;
for c:=1 to h
do begin
readln(q[c].riga);
readln(q[c].colonna);
readln(q[c].val);
end;
writeln;
writeln;
writeln('La matrice e'':');
writeln;
writeln;
for i:=1 to l
do begin
for j:=1 to l
do for c:=1 to h
do if(q[c].riga=i)and(q[c].colonna=j)
then write(' ',(q[c]).val:2:2,' ');
writeln;
end;
end;{ fine procedura ScriviMatriceUsandoRecord }

procedure ProdottoDiMatriciUsandoRecord( a : mat; b : mat ; var p : mat);
begin

c:=1;
while(c>=1)and(c<=h)
do begin
i:=1;
while(i>=1)and(i<=l)
do begin
j:=1;
while(j>=1)and(j<=l)
do begin
p[c].riga:=i;
p[c].colonna:=j;
p[c].val:=0;
for k:=1 to h
do if(a[k].riga=i)and(b[k].colonna=j)and(a[k].colonna=b[k].riga)
then p[c].val:=p[c].val+(a[k].val)*(b[k].val);
j:=j+1;
if j<=l then goto 1;
end;
i:=i+1;
end;
1 : c:=c+1;
end;
writeln;
writeln;
writeln('La matrice prodotto risultante e'':');
writeln;
writeln;
for i:=1 to l
do begin
for j:=1 to l
do for c:=1 to h
do if(p[c].riga=i)and(p[c].colonna=j)
then write(' ',(p[c]).val:4:2,' ');
writeln;
end;
end;{ fine procedura ProdottoDiMatriciUsandoRecord }
{ Corpo del programma }

begin

writeln('-------------------------- Dati di ingresso -----------------------------');
writeln;
writeln;
write('Fornire la dimensione delle due matrici quadrate di ingresso a e b: ');
readln(l);
h:=l*l;
writeln;
if l>10 then begin
writeln(chr(bell),'Errore nei dati di ingresso! - STOP -');
goto 99;
end
else begin
ScriviMatriceUsandoRecord(a);
writeln;
ScriviMatriceUsandoRecord(b);
ProdottoDiMatriciUsandoRecord(a,b,p)
end;
99 :
readln;

end.



Il programma medesimo continua però a non funzionare producendo in uscita un vettore di l*l elementi identici. :confused:

serfabio
02-11-2011, 09:46
Ovviamente le condizioni iniziali per c, i, j vanno poste all'inizio; correggo ancora il programma.




program CalcoloProdottoDiDueMatriciUsandoRecord(input,outp ut);
label 1,99;
const n=10;
bell=07;

type termine= record
riga: integer;
colonna: integer;
val: real;
end;
mat= array[1..n*n]of termine;

var a,b,p,q : mat;
i,j,c,h,k,l : integer;


procedure ScriviMatriceUsandoRecord( var q : mat );
begin

writeln('Inserire gli elementi della matrice ciascuno separato da <INVIO>:');
writeln;
for c:=1 to h
do begin
readln(q[c].riga);
readln(q[c].colonna);
readln(q[c].val);
end;
writeln;
writeln;
writeln('La matrice e'':');
writeln;
writeln;
for i:=1 to l
do begin
for j:=1 to l
do for c:=1 to h
do if(q[c].riga=i)and(q[c].colonna=j)
then write(' ',(q[c]).val:2:2,' ');
writeln;
end;
end;{ fine procedura ScriviMatriceUsandoRecord }

procedure ProdottoDiMatriciUsandoRecord( a : mat; b : mat ; var p : mat);
begin

c:=1;
i:=1;
j:=1;
while(c>=1)and(c<=h)
do begin
while(i>=1)and(i<=l)
do begin
while(j>=1)and(j<=l)
do begin
p[c].riga:=i;
p[c].colonna:=j;
p[c].val:=0;
for k:=1 to h
do if(a[k].riga=i)and(b[k].colonna=j)and(a[k].colonna=b[k].riga)
then p[c].val:=p[c].val+(a[k].val)*(b[k].val);
j:=j+1;
if j<=l then goto 1;
end;
i:=i+1;
end;
1 : c:=c+1;
end;
writeln;
writeln;
writeln('La matrice prodotto risultante e'':');
writeln;
writeln;
for i:=1 to l
do begin
for j:=1 to l
do for c:=1 to h
do if(p[c].riga=i)and(p[c].colonna=j)
then write(' ',(p[c]).val:4:2,' ');
writeln;
end;
end;{ fine procedura ProdottoDiMatriciUsandoRecord }
{ Corpo del programma }

begin

writeln('-------------------------- Dati di ingresso -----------------------------');
writeln;
writeln;
write('Fornire la dimensione delle due matrici quadrate di ingresso a e b: ');
readln(l);
h:=l*l;
writeln;
if l>10 then begin
writeln(chr(bell),'Errore nei dati di ingresso! - STOP -');
goto 99;
end
else begin
ScriviMatriceUsandoRecord(a);
writeln;
ScriviMatriceUsandoRecord(b);
ProdottoDiMatriciUsandoRecord(a,b,p)
end;
99 :
readln;

end.




Ma il medesimo continua a dare errori a tempo di esecuzione, e non riesco a capire il perchè!!! :confused:

serfabio
02-11-2011, 22:20
Correggo ulteriormente la procedura ProdottoDiMatriciUsandoRecord inserendo l'istruzione di assegnazione j:=1 dopo l'incremento i:=i+1 poichè deve cominciare un'altra serie l di cicli while per il calcolo del pi1,pi2,..,pil-esimo componente della riga i della matrice prodotto p:




procedure ProdottoDiMatriciUsandoRecord( a : mat; b : mat ; var p : mat);
begin

c:=1;
i:=1;
j:=1;
while(c>=1)and(c<=h)
do begin
while(i>=1)and(i<=l)
do begin
while(j>=1)and(j<=l)
do begin
p[c].riga:=i;
p[c].colonna:=j;
p[c].val:=0;
for k:=1 to h
do if(a[k].riga=i)and(b[k].colonna=j)and(a[k].colonna=b[k].riga)
then p[c].val:=p[c].val+(a[k].val)*(b[k].val);
j:=j+1;
if j<=l
then goto 1;
end;
i:=i+1;
j:=1;
end;
1 : c:=c+1;
end;
writeln;
writeln;
writeln('La matrice prodotto risultante e'':');
writeln;
writeln;
for i:=1 to l
do begin
for j:=1 to l
do for c:=1 to h
do if(p[c].riga=i)and(p[c].colonna=j)
then write(' ',(p[c]).val:4:2,' ');
writeln;
end;
end;{ fine procedura ProdottoDiMatriciUsandoRecord }



Il risultato è una matrice quadrata incompleta, che manca cioè degli elementi al di sopra della diagonale principale!!!:(

serfabio
02-11-2011, 22:25
A questo punto pubblico l'intero programma sin qui elaborato nella speranza che qualcuno sia in grado di segnalarmi gli errori commessi:




program CalcoloProdottoDiDueMatriciUsandoRecord(input,outp ut);
label 1,99;
const n=10;
bell=07;

type termine= record
riga: integer;
colonna: integer;
val: real;
end;
mat= array[1..n*n]of termine;

var a,b,p,q : mat;
i,j,c,h,k,l : integer;


procedure ScriviMatriceUsandoRecord( var q : mat );
begin

writeln('Inserire gli elementi della matrice ciascuno separato da <INVIO>:');
writeln;
for c:=1 to h
do begin
readln(q[c].riga);
readln(q[c].colonna);
readln(q[c].val);
end;
writeln;
writeln;
writeln('La matrice e'':');
writeln;
writeln;
for i:=1 to l
do begin
for j:=1 to l
do for c:=1 to h
do if(q[c].riga=i)and(q[c].colonna=j)
then write(' ',(q[c]).val:2:2,' ');
writeln;
end;
end;{ fine procedura ScriviMatriceUsandoRecord }

procedure ProdottoDiMatriciUsandoRecord( a : mat; b : mat ; var p : mat);
begin

c:=1;
i:=1;
j:=1;
while(c>=1)and(c<=h)
do begin
while(i>=1)and(i<=l)
do begin
while(j>=1)and(j<=l)
do begin
p[c].riga:=i;
p[c].colonna:=j;
p[c].val:=0;
for k:=1 to h
do if(a[k].riga=i)and(b[k].colonna=j)and(a[k].colonna=b[k].riga)
then p[c].val:=p[c].val+(a[k].val)*(b[k].val);
j:=j+1;
if j<=l
then goto 1;
end;
i:=i+1;
j:=1;
end;
1 : c:=c+1;
end;
writeln;
writeln;
writeln('La matrice prodotto risultante e'':');
writeln;
writeln;
for i:=1 to l
do begin
for j:=1 to l
do for c:=1 to h
do if(p[c].riga=i)and(p[c].colonna=j)
then write(' ',(p[c]).val:4:2,' ');
writeln;
end;
end;{ fine procedura ProdottoDiMatriciUsandoRecord }
{ Corpo del programma }

begin

writeln('-------------------------- Dati di ingresso -----------------------------');
writeln;
writeln;
write('Fornire la dimensione delle due matrici quadrate di ingresso a e b: ');
readln(l);
h:=l*l;
writeln;
if l>10 then begin
writeln(chr(bell),'Errore nei dati di ingresso! - STOP -');
goto 99;
end
else begin
ScriviMatriceUsandoRecord(a);
writeln;
ScriviMatriceUsandoRecord(b);
ProdottoDiMatriciUsandoRecord(a,b,p)
end;
99 :
readln;

end.



Spero solo che questi miei ragionamenti non cadano nel vuoto. Ciao e grazie a tutti!!! :ciauz:

serfabio
03-11-2011, 21:53
Sono riuscito a realizzare la seguente versione del programma:




program CalcoloProdottoDiDueMatriciUsandoRecord(input,outp ut);
label 1,99;
const n=10;
bell=07;

type termine= record
riga: integer;
colonna: integer;
val: real;
end;
mat= array[1..n*n]of termine;

var a,b,p,q : mat;
i,j,c,h,k,l : integer;


procedure ScriviMatriceUsandoRecord( var q : mat );
begin

writeln('Inserire gli elementi della matrice ciascuno separato da <INVIO>:');
writeln;
for c:=1 to h
do begin
readln(q[c].riga);
readln(q[c].colonna);
readln(q[c].val);
end;
writeln;
writeln;
writeln('La matrice e'':');
writeln;
writeln;
for i:=1 to l
do begin
for j:=1 to l
do for c:=1 to h
do if(q[c].riga=i)and(q[c].colonna=j)
then write(' ',(q[c]).val:2:2,' ');
writeln;
end;
end;{ fine procedura ScriviMatriceUsandoRecord }

procedure ProdottoDiMatriciUsandoRecord( a : mat; b : mat ; var p : mat);
begin

c:=1;
i:=1;
j:=1;
while(c>=1)and(c<=h)
do begin
while(i>=1)and(i<=l)
do begin
while(j>=1)and(j<=l)
do begin
p[c].riga:=i;
p[c].colonna:=j;
p[c].val:=0;
for k:=1 to h
do if(a[k].riga=i)and(b[k].colonna=j)
then p[c].val:=p[c].val+(a[k].val)*(b[k].val);
j:=j+1;
if j<=l
then goto 1;
end;
i:=i+1;
if j>l then begin
j:=1;
goto 1;
end;
end;
1 : c:=c+1;
end;
writeln;
writeln;
writeln('La matrice prodotto risultante e'':');
writeln;
writeln;
for i:=1 to l
do begin
for j:=1 to l
do for c:=1 to h
do if(p[c].riga=i)and(p[c].colonna=j)
then write(' ',(p[c]).val:4:2,' ');
writeln;
end;
end;{ fine procedura ProdottoDiMatriciUsandoRecord }
{ Corpo del programma }

begin

writeln('-------------------------- Dati di ingresso -----------------------------');
writeln;
writeln;
write('Fornire la dimensione delle due matrici quadrate di ingresso a e b: ');
readln(l);
h:=l*l;
writeln;
if l>10 then begin
writeln(chr(bell),'Errore nei dati di ingresso! - STOP -');
goto 99;
end
else begin
ScriviMatriceUsandoRecord(a);
writeln;
ScriviMatriceUsandoRecord(b);
ProdottoDiMatriciUsandoRecord(a,b,p)
end;
99 :
readln;

end.




Con quest'ultima inserendo due matrici quadrate in ingresso ottengo una matrice quadrata anch'essa i cui elementi sono ciascuno il prodotto dell'elemento dell'altra preso riga per colonna e cioè a11*b11,a12*b21,..,an1*a1n e non la somma dei prodotti dei corrispondenti elementi di un'intera riga per un'intera colonna come dovrebbe essere....Siamo però ad un passo dalla soluzione. Credo che il problema risieda nella condizione dell'istruzione if:



for k:=1 to h
do if(a[k].riga=i)and(b[k].colonna=j)
then p[c].val:=p[c].val+(a[k].val)*(b[k].val);


del ciclo for in cui si calcolano i valori p11,p12,..,pnn. :)

Loading