Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2011
    Messaggi
    52

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

    Salve amici del Forum. Provo ad aprire una nuova discussione su un argomento già trattato sperando di essere più conciso e chiaro. Si tratta di elaborare un programma Pascal che calcoli il prodotto di due matrici, con a e b matrici da moltiplicare e p matrice prodotto rappresentate sotto forma di record. Il programma che ho elaborato calcola effettivamete una matrice quadrata risultante,ma i suoi elementi non corrispondono esattamente a quelli della matrice prodotto.Credo che l'errore sia nella procedura di elaborazione del prodotto delle due matrici, ma non riesco ad individuare l'errore. Qualcuno di voi può essermi di aiuto in tal senso? Riporto il codice dell'intero programma per la verifica della sua correttezza:

    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.
    Ringraziandovi sin da ora per l'aiuto che vorrete darmi vi saluto tutti.Ciao!!!

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

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

    Salve a tutti. Ho provato a correggere la procedura ProdottoDiMatriciUsandoRecord nella maniera seguente :

    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)
                                           then for r:=(h mod k)+1 to(h mod k)+l
                                                                   do 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 }
    Ma il risultato è ancora una matrice prodotto con elementi non corrispondenti a quella che dovrebbe effettivamente risultare. Grazie a chi mi vorrà fornire un aiuto alla soluzione di questo problema. Ciao!!!

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

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

    Salve a tutti. Ritorno sul medesimo problema, per il quale la soluzione esatta ( e meglio "leggibile" ), dovrebbe essere quella che riporto di seguito. Desidero tuttavia sollecitare l'aiuto degli amici del Forum, poichè il programma non funziona!!! Ovvero non fornisce risultati corretti a tempo di esecuzione. Sarei molto grato a chiunque di voi, più esperto di me in materia, sapesse fornirmi la versione corretta. Grazie!!!

    Di seguito riporto la versione da me elaborata:

    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,m,r : 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 m
                   do begin
                           for j:=1 to m
                                    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<=m)
               do begin
                       while(j>=1)and(j<=m)
                       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 for r:=1 to m
                                                         do p[c].val:=p[c].val+(a[k].val)*(b[k].val);
                               j:=j+1;
                               if j<=m
                               then goto 1;
                          end;
                      i:=i+1;
                      if j>m 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 m
                   do begin
                           for j:=1 to m
                                    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(m);
       h:=m*m;
       writeln;
       if m>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.
    Grazie a tutti sin d'ora per l'aiuto che saprete ( ne sono certo!!! ) fornirmi. Ciao!!!

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.