Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    52

    [Pascal] Calcolo del prodotto di due matrici usando la variabile record

    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:

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

    Il programma che ho elaborato è il seguente:

    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 : 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!!!

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    52

    [Pascal] Calcolo del prodotto di due matrici usando la variabile record

    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:

    codice:
    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!!!

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    52

    [Pascal] Calcolo del prodotto di due matrici usando la variabile record

    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:

    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:

    codice:
    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!!!

  4. #4
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    52

    [Pascal] Calcolo del prodotto di due matrici usando la variabile record

    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:


    codice:
    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!!!

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    52

    [Pascal] Calcolo del prodotto di due matrici usando la variabile record

    Ancora una versione riveduta e corretta che usa sempre l'istruzione goto. Però ancora non funziona!!!

    codice:
    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.

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    52

    [Pascal] Calcolo del prodotto di due matrici usando la variabile record

    Nell'ultima versione ho dimenticato di inizializzare gli indici nei cicli while della procedura ProdottoDiMatriciUsandoRecord. La scrittura corretta sintatticamente del programma è pertanto la seguente:

    codice:
    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.

  7. #7
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    52

    [Pascal] Calcolo del prodotto di due matrici usando la variabile record

    Ovviamente le condizioni iniziali per c, i, j vanno poste all'inizio; correggo ancora il programma.

    codice:
    program CalcoloProdottoDiDueMatriciUsandoRecord(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;
       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è!!!

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    52

    [Pascal] Calcolo del prodotto di due matrici usando la variabile record

    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:

    codice:
    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!!!

  9. #9
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    52

    [Pascal] Calcolo del prodotto di due matrici usando la variabile record

    A questo punto pubblico l'intero programma sin qui elaborato nella speranza che qualcuno sia in grado di segnalarmi gli errori commessi:

    codice:
    program CalcoloProdottoDiDueMatriciUsandoRecord(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;
       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!!!

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    52

    [Pascal] Calcolo del prodotto di due matrici usando la variabile record

    Sono riuscito a realizzare la seguente versione del programma:

    codice:
    program CalcoloProdottoDiDueMatriciUsandoRecord(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;
       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:

    codice:
    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.