Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Pascal - Prodotto tra matrici
Forum - Pascal - Prodotto tra matrici

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Suxdario88 (Normal User)
Newbie


Messaggi: 8
Iscritto: 10/05/2010

Segnala al moderatore
Postato alle 18:44
Lunedì, 10/05/2010
Salve a tutti ragazzi, sono nuovo su questo forum e vi scrivo in quanto sono un pò infognato con un programmino che ci hanno assegnato all'università...
Penso di essere arrivato a buon punto, ma qualcosa alla fine non quadra... potete darmi qualche consiglio per migliorare il mio progetto e magari trovare qualche imprecisione da correggere?? :)

grazie mille!!!



Codice sorgente - presumibilmente Delphi

  1. Program ProdottoMatriciale(output);
  2.  
  3. Type  
  4.   mioTipo = Array of Real; (* La matrice Ë di numeri reali *)
  5.  
  6. var R1,R2,C1,C2: Integer; (* Dimensioni delle matrici *)
  7.  
  8. Var  
  9.   myArray1 : mioTipo;   (* Matrice vera e propria *)
  10.   myArray2 : mioTipo;  
  11.  
  12. (* Stampa la schermata iniziale *)
  13. procedure printWS();
  14. begin
  15.   Writeln('***********************');
  16.   Writeln('*     Prodotto tra    *');
  17.   Writeln('*        Matrici      *');
  18.   Writeln('***********************');
  19.   Writeln(); (*Stampa una riga vuota*)
  20. end;
  21.  
  22.  
  23. (* Stampa la matrice con 2 cicli FOR *)
  24.  
  25. procedure printMatrice(mat: mioTipo; R: Integer; C: Integer);
  26. var i,j: Integer;
  27. begin
  28.         For i:=0 to R-1 do  
  29.         begin  
  30.             For j:=0 to C-1 do  
  31.                 begin
  32.                         Write(mat[i*C+j]);  
  33.                 end;
  34.             Writeln;
  35.         end;
  36. end;
  37.  
  38.  
  39. (* Fa il prodotto tra matrici: ris(i,j) = m1(i,k)*m2(k,j) Per k = 1..R1 *)
  40.  
  41. procedure product(m1,m2: mioTipo; R1,C1,R2,C2: Integer);
  42. var i,j,k: Integer;
  43. var attuale: Real;
  44. begin
  45.         attuale :=0;    (* Il singolo elemento. Viene azzerato ogni volta dopo che l'ho stampato *)
  46.         For i:=0 to R1-1 do begin
  47.                 For j:=0 to C2-1 do begin
  48.                         For k:=0 to R1-1 do begin
  49.                                 attuale := attuale + m1[i*C1+k]*m2[k*C2+j]
  50.                         end;
  51.                         Write(attuale);
  52.                         attuale :=0
  53.                 end;
  54.                 Writeln()
  55.         end
  56.                
  57. end;
  58.        
  59.  
  60. (* Questo e' il main *)
  61. var i,j: Integer;
  62. begin
  63.         printWS();
  64.  
  65.         (* Dati di input *)
  66.         Write('Inserisci il numero di righe della prima matrice:');
  67.         Readln(R1);
  68.         Write('Inserisci il numero di colonne della prima matrice:');
  69.         Readln(C1);
  70.  
  71.         Write('Inserisci il numero di righe della seconda matrice:');
  72.         Readln(R2);
  73.         Write('Inserisci il numero di colonne della seconda matrice:');
  74.         Readln(C2);
  75.  
  76.         (* Controllo se il prodotto di puÚ fare ( C1 = R2) *)
  77.         if C1 = R2 then begin
  78.  
  79.                 SetLength(myArray1,R1*C1); (* Alloco memoria per la matrice *)
  80.                 SetLength(myArray2,R2*C2); (* Alloco memoria per la matrice *)
  81.        
  82.                 Writeln('Inserisci la prima matrice');
  83.                 For i:=0 to R1-1 do  
  84.                         begin  
  85.                             For j:=0 to C1-1 do  
  86.                                 begin
  87.                                         Write('Inserisci: Matrice[',i,',',j,']=');
  88.                                         Readln(myArray1[i*C1+j]);  
  89.                                 end;
  90.                         end;
  91.  
  92.                 Writeln('Hai inserito questa matrice: ');
  93.                 printMatrice(myArray1,R1,C1);  
  94.  
  95.                 Writeln('Inserisci la seconda matrice');
  96.                 For i:=0 to R2-1 do  
  97.                         begin  
  98.                             For j:=0 to C2-1 do  
  99.                                 begin
  100.                                         Write('Inserisci: Matrice[',i,',',j,']=');
  101.                                         Readln(myArray2[i*C2+j]);  
  102.                                 end;
  103.                         end;
  104.  
  105.                 Writeln('Hai inserito questa matrice: ');
  106.                 printMatrice(myArray2,R2,C2);  
  107.  
  108.                 Writeln('Verr‡ ora eseguito il prodotto. Premi INVIO per continuare');
  109.                 Readln();
  110.  
  111.                 product(myArray1,myArray2,R1,C1,R2,C2);
  112.  
  113.                
  114.                 end
  115.         else
  116.                 Writeln('Operazione non permessa: C1!=R2')
  117. end.





PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 19:41
Lunedì, 10/05/2010
Cos'e' che non quadra? Spiega bene l'errore.


Il mio blog: https://piero.dev
PM Quote
Avatar
Phi (Member)
Expert


Messaggi: 241
Iscritto: 30/12/2009

Segnala al moderatore
Postato alle 20:38
Lunedì, 10/05/2010
Stai attento manca un readln alla fine del programma. :nono:
Concludi il programma con :
Codice sorgente - presumibilmente Plain Text

  1. [...]
  2.  readln;
  3. end.



PM Quote
Avatar
Phi (Member)
Expert


Messaggi: 241
Iscritto: 30/12/2009

Segnala al moderatore
Postato alle 20:44
Lunedì, 10/05/2010

Poi le variabili i, j, k le usi per tutto il programma quindi puoi dichiararle una sola volta all'inizio del testo ed evitare di ripeterle in ogni funzione.

Inoltre quando crei un'applicazione su console usando Pascal conviene pulire lo schermo all'avvio del programma, per farlo dichiara la unit crt all'inizione del testo e usa la funzione clrscr.

Ecco parte del testo:
Codice sorgente - presumibilmente Pascal

  1. program  ProdottoMatriciale(output);
  2.  
  3. uses crt;
  4.  
  5. type  
  6.  [...]//eccetera eccetera



Codice sorgente - presumibilmente Pascal

  1. [...]
  2. (* Questo e'  il main *)
  3. begin
  4.  clrscr;
  5.  printWS();
  6.  [...]//eccetera eccetera


Ultima modifica effettuata da Phi il 10/05/2010 alle 20:50
PM Quote
Avatar
Suxdario88 (Normal User)
Newbie


Messaggi: 8
Iscritto: 10/05/2010

Segnala al moderatore
Postato alle 9:29
Martedì, 11/05/2010
grazie mille Phi

l'errore in fondo dovrebbe essere dovuto proprio da quel readln....
infatti mi chiudeva il programma prima di farmi vedere il risultato ;)

per quanto riguarda la clrscr vedrò di metterla subito :)

poi per il resto come vi sembra??
secondo voi per quanto riguarda l'esposizione al professore come posso procedere?

- divido il programma in:intestazione, parte dichiarativa e esecutiva
- esposizione dei cicli for
- sei sottoprogrammi procedure
poi che altro vi sembra rilevante???

grazie mille ancora:)

PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 9:55
Martedì, 11/05/2010
Mi spieghi in che corso di laurea sei? Solo per curiosità, però non pensavo insegnassero ancora il pascal....credevo fossero andati tutti su java/C++

PM Quote
Avatar
Suxdario88 (Normal User)
Newbie


Messaggi: 8
Iscritto: 10/05/2010

Segnala al moderatore
Postato alle 10:32
Martedì, 11/05/2010
Scienze Statistiche ed Economiche a Siena :)

il vecchio professore in effetti ci faceva lavorare in C++ ma questo nuovo ci ha richiesto il pascal...

in effetti cambiano poche cose, la logica è la stessa, però è un pò una rottura fare il passaggio, anche perchè molte cose del C++ non sono compatibili :(

PM Quote
Avatar
Suxdario88 (Normal User)
Newbie


Messaggi: 8
Iscritto: 10/05/2010

Segnala al moderatore
Postato alle 15:45
Martedì, 11/05/2010
ragazzi ho seguito i vostri consigli e mi è venuto così...

Codice sorgente - presumibilmente Delphi

  1. Program ProdottoMatriciale(output);
  2.  
  3. uses crt;
  4.  
  5. Type  
  6.   mioTipo = Array of Real; (* La matrice è di numeri reali *)
  7.  
  8. var R1,R2,C1,C2: Integer; (* Dimensioni delle matrici *)
  9.  
  10. Var  
  11.   myArray1 : mioTipo;   (* Matrice vera e propria *)
  12.   myArray2 : mioTipo;  
  13.  
  14. (* Stampa la schermata iniziale *)
  15. procedure printWS();
  16. begin
  17.   Writeln('***********************');
  18.   Writeln('*     Prodotto tra    *');
  19.   Writeln('*        Matrici      *');
  20.   Writeln('***********************');
  21.   Writeln(); (*Stampa una riga vuota*)
  22. end;
  23.  
  24.  
  25. (* Stampa la matrice con 2 cicli FOR *)
  26.  
  27. procedure printMatrice(mat: mioTipo; R: Integer; C: Integer);
  28. var i,j: Integer;
  29. begin
  30.         For i:=0 to R-1 do  
  31.         begin  
  32.             For j:=0 to C-1 do  
  33.                 begin
  34.                         Write(mat[i*C+j]);  
  35.                 end;
  36.             Writeln;
  37.         end;
  38. end;
  39.  
  40.  
  41. (* Fa il prodotto tra matrici: ris(i,j) = m1(i,k)*m2(k,j) Per k = 1..R1 *)
  42.  
  43. procedure product(m1,m2: mioTipo; R1,C1,R2,C2: Integer);
  44. var i,j,k: Integer;
  45. var attuale: Real;
  46. begin
  47.         attuale :=0;    (* Il singolo elemento. Viene azzerato ogni volta dopo che l'ho stampato *)
  48.         For i:=0 to R1-1 do begin
  49.                 For j:=0 to C2-1 do begin
  50.                         For k:=0 to R1-1 do begin
  51.                                 attuale := attuale + m1[i*C1+k]*m2[k*C2+j]
  52.                         end;
  53.                         Write(attuale);
  54.                         attuale :=0
  55.                 end;
  56.                 Writeln()
  57.         end
  58.                
  59. end;
  60.        
  61.  
  62. (* Questo e' il main *)
  63. var i,j: Integer;
  64. begin
  65. clrscr;
  66.         printWS();
  67.  
  68.         (* Dati di input *)
  69.         Write('Inserisci il numero di righe della prima matrice:');
  70.         Readln(R1);
  71.         Write('Inserisci il numero di colonne della prima matrice:');
  72.         Readln(C1);
  73.  
  74.         Write('Inserisci il numero di righe della seconda matrice:');
  75.         Readln(R2);
  76.         Write('Inserisci il numero di colonne della seconda matrice:');
  77.         Readln(C2);
  78.  
  79.         (* Controllo se il prodotto di può fare ( C1 = R2) *)
  80.         if C1 = R2 then begin
  81.  
  82.                 SetLength(myArray1,R1*C1); (* Alloco memoria per la matrice *)
  83.                 SetLength(myArray2,R2*C2); (* Alloco memoria per la matrice *)
  84.        
  85.                 Writeln('Inserisci la prima matrice');
  86.                 For i:=0 to R1-1 do  
  87.                         begin  
  88.                             For j:=0 to C1-1 do  
  89.                                 begin
  90.                                         Write('Inserisci: Matrice[',i,',',j,']=');
  91.                                         Readln(myArray1[i*C1+j]);  
  92.                                 end;
  93.                         end;
  94.  
  95.                 Writeln('Hai inserito questa matrice: ');
  96.                 printMatrice(myArray1,R1,C1);  
  97.  
  98.                 Writeln('Inserisci la seconda matrice');
  99.                 For i:=0 to R2-1 do  
  100.                         begin  
  101.                             For j:=0 to C2-1 do  
  102.                                 begin
  103.                                         Write('Inserisci: Matrice[',i,',',j,']=');
  104.                                         Readln(myArray2[i*C2+j]);  
  105.                                 end;
  106.                         end;
  107.  
  108.                 Writeln('Hai inserito questa matrice: ');
  109.                 printMatrice(myArray2,R2,C2);  
  110.  
  111.                 Writeln('Verrà ora eseguito il prodotto. Premi INVIO per continuare');
  112.                 Readln();
  113.  
  114.                 product(myArray1,myArray2,R1,C1,R2,C2);
  115.  
  116.                
  117.                 end
  118.         else
  119.                 Writeln('Operazione non permessa: C1!=R2')
  120.   readln();
  121. end.
  122.  
  123. Program ProdottoMatriciale(output);
  124.  
  125. Type  
  126.   mioTipo = Array of Real; (* La matrice è di numeri reali *)
  127.  
  128. var R1,R2,C1,C2: Integer; (* Dimensioni delle matrici *)
  129.  
  130. Var  
  131.   myArray1 : mioTipo;   (* Matrice vera e propria *)
  132.   myArray2 : mioTipo;  
  133.  
  134. (* Stampa la schermata iniziale *)
  135. procedure printWS();
  136. begin
  137.   Writeln('***********************');
  138.   Writeln('*     Prodotto tra    *');
  139.   Writeln('*        Matrici      *');
  140.   Writeln('***********************');
  141.   Writeln(); (*Stampa una riga vuota*)
  142. end;
  143.  
  144.  
  145. (* Stampa la matrice con 2 cicli FOR *)
  146.  
  147. procedure printMatrice(mat: mioTipo; R: Integer; C: Integer);
  148. var i,j: Integer;
  149. begin
  150.         For i:=0 to R-1 do  
  151.         begin  
  152.             For j:=0 to C-1 do  
  153.                 begin
  154.                         Write(mat[i*C+j]);  
  155.                 end;
  156.             Writeln;
  157.         end;
  158. end;
  159.  
  160.  
  161. (* Fa il prodotto tra matrici: ris(i,j) = m1(i,k)*m2(k,j) Per k = 1..R1 *)
  162.  
  163. procedure product(m1,m2: mioTipo; R1,C1,R2,C2: Integer);
  164. var i,j,k: Integer;
  165. var attuale: Real;
  166. begin
  167.         attuale :=0;    (* Il singolo elemento. Viene azzerato ogni volta dopo che l'ho stampato *)
  168.         For i:=0 to R1-1 do begin
  169.                 For j:=0 to C2-1 do begin
  170.                         For k:=0 to R1-1 do begin
  171.                                 attuale := attuale + m1[i*C1+k]*m2[k*C2+j]
  172.                         end;
  173.                         Write(attuale);
  174.                         attuale :=0
  175.                 end;
  176.                 Writeln()
  177.         end
  178.                
  179. end;
  180.        
  181.  
  182. (* Questo e' il main *)
  183. var i,j: Integer;
  184. begin
  185.         printWS();
  186.  
  187.         (* Dati di input *)
  188.         Write('Inserisci il numero di righe della prima matrice:');
  189.         Readln(R1);
  190.         Write('Inserisci il numero di colonne della prima matrice:');
  191.         Readln(C1);
  192.  
  193.         Write('Inserisci il numero di righe della seconda matrice:');
  194.         Readln(R2);
  195.         Write('Inserisci il numero di colonne della seconda matrice:');
  196.         Readln(C2);
  197.  
  198.         (* Controllo se il prodotto di può fare ( C1 = R2) *)
  199.         if C1 = R2 then begin
  200.  
  201.                 SetLength(myArray1,R1*C1); (* Alloco memoria per la matrice *)
  202.                 SetLength(myArray2,R2*C2); (* Alloco memoria per la matrice *)
  203.        
  204.                 Writeln('Inserisci la prima matrice');
  205.                 For i:=0 to R1-1 do  
  206.                         begin  
  207.                             For j:=0 to C1-1 do  
  208.                                 begin
  209.                                         Write('Inserisci: Matrice[',i,',',j,']=');
  210.                                         Readln(myArray1[i*C1+j]);  
  211.                                 end;
  212.                         end;
  213.  
  214.                 Writeln('Hai inserito questa matrice: ');
  215.                 printMatrice(myArray1,R1,C1);  
  216.  
  217.                 Writeln('Inserisci la seconda matrice');
  218.                 For i:=0 to R2-1 do  
  219.                         begin  
  220.                             For j:=0 to C2-1 do  
  221.                                 begin
  222.                                         Write('Inserisci: Matrice[',i,',',j,']=');
  223.                                         Readln(myArray2[i*C2+j]);  
  224.                                 end;
  225.                         end;
  226.  
  227.                 Writeln('Hai inserito questa matrice: ');
  228.                 printMatrice(myArray2,R2,C2);  
  229.  
  230.                 Writeln('Verrà ora eseguito il prodotto. Premi INVIO per continuare');
  231.                 Readln();
  232.  
  233.                 product(myArray1,myArray2,R1,C1,R2,C2);
  234.  
  235.                
  236.                 end
  237.         else
  238.                 Writeln('Operazione non permessa: C1!=R2')
  239.   readln();
  240. end.




solo che quando vado a compilare il computer mi dà questo errore...
il bello è che prima ho dato il via all'eseguibile e l'unico problema era che alla fine (dopo aver inserito i valori delle matrici e tutto il resto) quando andava a calcolare il prodotto mi chiudeva la finestra senza farmi vedere il risultato;
dopo che ho fatto un pò di modifiche invece mi dava questo problema..



Free Pascal Compiler version 1.0.6 [2002/04/23] for i386
Copyright (c) 1993-2002 by Florian Klaempfl
Target OS: Win32 for i386
Compiling c:\users\utente\desktop\prodotto.pas
prodotto.pas(6,19) Fatal: Syntax error, [ expected but OF found


vi prego help me :(

Ultima modifica effettuata da Suxdario88 il 11/05/2010 alle 15:48
PM Quote
Avatar
Phi (Member)
Expert


Messaggi: 241
Iscritto: 30/12/2009

Segnala al moderatore
Postato alle 16:05
Martedì, 11/05/2010
Strano che ti dia quel messaggio.
L'errore che ti segnala non è un errore.

Comunque posso dirti altre 2 cose:
1) E' sbagliato la fine del programma, hai dimenticato ; dopo l'ultimo writeln. Scrivi :
Codice sorgente - presumibilmente Pascal

  1. end
  2.  else  Writeln('Operazione non permessa: C1!=R2');
  3.  readln;
  4. end.



2) Secondo me ti conviene scaricare la nuova versione del compilatore(l'ultima versione è la 2.4.0). Vai a http://www.freepascal.org/download.var

Ultima modifica effettuata da Phi il 11/05/2010 alle 16:08
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo