Oppure

Loading
10/05/10 16:44
Suxdario88
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!!!




Program ProdottoMatriciale(output);

Type  
  mioTipo = Array of Real; (* La matrice Ë di numeri reali *)

var R1,R2,C1,C2: Integer; (* Dimensioni delle matrici *)

Var  
  myArray1 : mioTipo;	(* Matrice vera e propria *)
  myArray2 : mioTipo;   
  
(* Stampa la schermata iniziale *)
procedure printWS();
begin
  Writeln('***********************');
  Writeln('*     Prodotto tra    *');
  Writeln('*        Matrici      *');
  Writeln('***********************');
  Writeln(); (*Stampa una riga vuota*)
end;


(* Stampa la matrice con 2 cicli FOR *)

procedure printMatrice(mat: mioTipo; R: Integer; C: Integer);
var i,j: Integer;
begin
	For i:=0 to R-1 do  
    	begin  
	    For j:=0 to C-1 do  
		begin
			Write(mat[i*C+j]);  
		end;
	    Writeln;
	end;
end;


(* Fa il prodotto tra matrici: ris(i,j) = m1(i,k)*m2(k,j) Per k = 1..R1 *)

procedure product(m1,m2: mioTipo; R1,C1,R2,C2: Integer);
var i,j,k: Integer;
var attuale: Real;
begin
	attuale :=0;	(* Il singolo elemento. Viene azzerato ogni volta dopo che l'ho stampato *)
	For i:=0 to R1-1 do begin
		For j:=0 to C2-1 do begin
			For k:=0 to R1-1 do begin
				attuale := attuale + m1[i*C1+k]*m2[k*C2+j]
			end;
			Write(attuale);
			attuale :=0
		end;
		Writeln()
	end
		
end;
  	

(* Questo e' il main *)
var i,j: Integer;
begin
	printWS();

	(* Dati di input *)
	Write('Inserisci il numero di righe della prima matrice:');
	Readln(R1);
	Write('Inserisci il numero di colonne della prima matrice:');
	Readln(C1);

	Write('Inserisci il numero di righe della seconda matrice:');
	Readln(R2);
	Write('Inserisci il numero di colonne della seconda matrice:');
	Readln(C2);

	(* Controllo se il prodotto di puÚ fare ( C1 = R2) *)
	if C1 = R2 then begin

		SetLength(myArray1,R1*C1); (* Alloco memoria per la matrice *)
		SetLength(myArray2,R2*C2); (* Alloco memoria per la matrice *)
	
		Writeln('Inserisci la prima matrice');
		For i:=0 to R1-1 do  
    			begin  
			    For j:=0 to C1-1 do  
				begin
	      				Write('Inserisci: Matrice[',i,',',j,']=');
					Readln(myArray1[i*C1+j]);  
				end;
			end;
  
		Writeln('Hai inserito questa matrice: ');
		printMatrice(myArray1,R1,C1);	

		Writeln('Inserisci la seconda matrice');
		For i:=0 to R2-1 do  
    			begin  
			    For j:=0 to C2-1 do  
				begin
	      				Write('Inserisci: Matrice[',i,',',j,']=');
					Readln(myArray2[i*C2+j]);  
				end;
			end;

  		Writeln('Hai inserito questa matrice: ');
		printMatrice(myArray2,R2,C2);	

		Writeln('Verr‡ ora eseguito il prodotto. Premi INVIO per continuare');
		Readln();

		product(myArray1,myArray2,R1,C1,R2,C2);

		
		end
	else 
		Writeln('Operazione non permessa: C1!=R2')
end.



aaa
10/05/10 17:41
pierotofy
Cos'e' che non quadra? Spiega bene l'errore.
Il mio blog: piero.dev
10/05/10 18:38
Phi
Stai attento manca un readln alla fine del programma. :nono:
Concludi il programma con :
 [...]
 readln;
end.

aaa
10/05/10 18:44
Phi

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:
program  ProdottoMatriciale(output);

uses crt;

type  
 [...]//eccetera eccetera


 [...]
(* Questo e'  il main *)
begin
 clrscr;
 printWS();
 [...]//eccetera eccetera
Ultima modifica effettuata da Phi 10/05/10 18:50
aaa
11/05/10 7:29
Suxdario88
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:)
aaa
11/05/10 7:55
lorenzo
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++
aaa
11/05/10 8:32
Suxdario88
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 :(
aaa
11/05/10 13:45
Suxdario88
ragazzi ho seguito i vostri consigli e mi è venuto così...


Program ProdottoMatriciale(output);

uses crt;

Type  
  mioTipo = Array of Real; (* La matrice è di numeri reali *)

var R1,R2,C1,C2: Integer; (* Dimensioni delle matrici *)

Var  
  myArray1 : mioTipo;	(* Matrice vera e propria *)
  myArray2 : mioTipo;   
  
(* Stampa la schermata iniziale *)
procedure printWS();
begin
  Writeln('***********************');
  Writeln('*     Prodotto tra    *');
  Writeln('*        Matrici      *');
  Writeln('***********************');
  Writeln(); (*Stampa una riga vuota*)
end;


(* Stampa la matrice con 2 cicli FOR *)

procedure printMatrice(mat: mioTipo; R: Integer; C: Integer);
var i,j: Integer;
begin
	For i:=0 to R-1 do  
    	begin  
	    For j:=0 to C-1 do  
		begin
			Write(mat[i*C+j]);  
		end;
	    Writeln;
	end;
end;


(* Fa il prodotto tra matrici: ris(i,j) = m1(i,k)*m2(k,j) Per k = 1..R1 *)

procedure product(m1,m2: mioTipo; R1,C1,R2,C2: Integer);
var i,j,k: Integer;
var attuale: Real;
begin
	attuale :=0;	(* Il singolo elemento. Viene azzerato ogni volta dopo che l'ho stampato *)
	For i:=0 to R1-1 do begin
		For j:=0 to C2-1 do begin
			For k:=0 to R1-1 do begin
				attuale := attuale + m1[i*C1+k]*m2[k*C2+j]
			end;
			Write(attuale);
			attuale :=0
		end;
		Writeln()
	end
		
end;
  	

(* Questo e' il main *)
var i,j: Integer;
begin
clrscr;
	printWS();

	(* Dati di input *)
	Write('Inserisci il numero di righe della prima matrice:');
	Readln(R1);
	Write('Inserisci il numero di colonne della prima matrice:');
	Readln(C1);

	Write('Inserisci il numero di righe della seconda matrice:');
	Readln(R2);
	Write('Inserisci il numero di colonne della seconda matrice:');
	Readln(C2);

	(* Controllo se il prodotto di può fare ( C1 = R2) *)
	if C1 = R2 then begin

		SetLength(myArray1,R1*C1); (* Alloco memoria per la matrice *)
		SetLength(myArray2,R2*C2); (* Alloco memoria per la matrice *)
	
		Writeln('Inserisci la prima matrice');
		For i:=0 to R1-1 do  
    			begin  
			    For j:=0 to C1-1 do  
				begin
	      				Write('Inserisci: Matrice[',i,',',j,']=');
					Readln(myArray1[i*C1+j]);  
				end;
			end;
  
		Writeln('Hai inserito questa matrice: ');
		printMatrice(myArray1,R1,C1);	

		Writeln('Inserisci la seconda matrice');
		For i:=0 to R2-1 do  
    			begin  
			    For j:=0 to C2-1 do  
				begin
	      				Write('Inserisci: Matrice[',i,',',j,']=');
					Readln(myArray2[i*C2+j]);  
				end;
			end;

  		Writeln('Hai inserito questa matrice: ');
		printMatrice(myArray2,R2,C2);	

		Writeln('Verrà ora eseguito il prodotto. Premi INVIO per continuare');
		Readln();

		product(myArray1,myArray2,R1,C1,R2,C2);

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

Program ProdottoMatriciale(output);

Type  
  mioTipo = Array of Real; (* La matrice è di numeri reali *)

var R1,R2,C1,C2: Integer; (* Dimensioni delle matrici *)

Var  
  myArray1 : mioTipo;	(* Matrice vera e propria *)
  myArray2 : mioTipo;   
  
(* Stampa la schermata iniziale *)
procedure printWS();
begin
  Writeln('***********************');
  Writeln('*     Prodotto tra    *');
  Writeln('*        Matrici      *');
  Writeln('***********************');
  Writeln(); (*Stampa una riga vuota*)
end;


(* Stampa la matrice con 2 cicli FOR *)

procedure printMatrice(mat: mioTipo; R: Integer; C: Integer);
var i,j: Integer;
begin
	For i:=0 to R-1 do  
    	begin  
	    For j:=0 to C-1 do  
		begin
			Write(mat[i*C+j]);  
		end;
	    Writeln;
	end;
end;


(* Fa il prodotto tra matrici: ris(i,j) = m1(i,k)*m2(k,j) Per k = 1..R1 *)

procedure product(m1,m2: mioTipo; R1,C1,R2,C2: Integer);
var i,j,k: Integer;
var attuale: Real;
begin
	attuale :=0;	(* Il singolo elemento. Viene azzerato ogni volta dopo che l'ho stampato *)
	For i:=0 to R1-1 do begin
		For j:=0 to C2-1 do begin
			For k:=0 to R1-1 do begin
				attuale := attuale + m1[i*C1+k]*m2[k*C2+j]
			end;
			Write(attuale);
			attuale :=0
		end;
		Writeln()
	end
		
end;
  	

(* Questo e' il main *)
var i,j: Integer;
begin
	printWS();

	(* Dati di input *)
	Write('Inserisci il numero di righe della prima matrice:');
	Readln(R1);
	Write('Inserisci il numero di colonne della prima matrice:');
	Readln(C1);

	Write('Inserisci il numero di righe della seconda matrice:');
	Readln(R2);
	Write('Inserisci il numero di colonne della seconda matrice:');
	Readln(C2);

	(* Controllo se il prodotto di può fare ( C1 = R2) *)
	if C1 = R2 then begin

		SetLength(myArray1,R1*C1); (* Alloco memoria per la matrice *)
		SetLength(myArray2,R2*C2); (* Alloco memoria per la matrice *)
	
		Writeln('Inserisci la prima matrice');
		For i:=0 to R1-1 do  
    			begin  
			    For j:=0 to C1-1 do  
				begin
	      				Write('Inserisci: Matrice[',i,',',j,']=');
					Readln(myArray1[i*C1+j]);  
				end;
			end;
  
		Writeln('Hai inserito questa matrice: ');
		printMatrice(myArray1,R1,C1);	

		Writeln('Inserisci la seconda matrice');
		For i:=0 to R2-1 do  
    			begin  
			    For j:=0 to C2-1 do  
				begin
	      				Write('Inserisci: Matrice[',i,',',j,']=');
					Readln(myArray2[i*C2+j]);  
				end;
			end;

  		Writeln('Hai inserito questa matrice: ');
		printMatrice(myArray2,R2,C2);	

		Writeln('Verrà ora eseguito il prodotto. Premi INVIO per continuare');
		Readln();

		product(myArray1,myArray2,R1,C1,R2,C2);

		
		end
	else 
		Writeln('Operazione non permessa: C1!=R2')
  readln();
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 11/05/10 13:48
aaa