Newsgroup: it.comp.lang.pascal
Titolo: Se qualcuno vuole risolvere questo problema.........

Salve!
Sono un principiante in pascal.
Se qualcuno di voi riesce a programmare tramite 3 procedure nella maniera +
semplice questo programma ne sarei grato (p.s.: lo faccio più che altro per
avere un tutorial/esempio).
Ecco il testo:
Realizzare un programma che sia suddiviso in procedure e che consenta:
1) Date le dimensioni di una matrice ed i suoi elementi, di restituire la
trasposta.
2) Date le dimensioni di due matrici A e B, verificare la possibilità di
somma ed in caso affermativo fornendo gli elementi di A e B venga
restituita la matrice somma.
3) Fare esattamente le cose richieste nel punto 2 ma nel caso che bisogna
fare un prodotto tra le 2 matrici.
Grazie per qualsiasi risposta!
Francesco L
i3...@GIGIO.shineline.it
 (togliere GIGIO. dall'indirizzo)

fare un prodotto tra le 2 matrici.
type tipo_matrice = record
                      righe : integer ;
                      colonne : integer ;
                      mat : array [1..50, 1..50] of integer ;
                    end ;
var A, B, A1, B1, C : tipo_matrice ;
procedure accetta_matrice ( var M : tipo_matrice ) ;
var i, j : integer ;
begin
  write ( 'numero righe   : ' ) ; readln ( M.righe ) ;
  write ( 'numero colonne : ' ) ; readln ( M.colonne ) ;
  for i := 1 to M.righe do
    for j := 1 to M.colonne do
    begin
      write (' a(',i,',',j,') = ' ) ;
      readln ( M.mat [i,j] ) ;
    end ;
end ;
procedure scrivi_matrice ( M : tipo_matrice ) ;
var i, j : integer ;
begin
  for i := 1 to M.righe do
  begin
    write ( '|' ) ;
    for j := 1 to M.colonne do
      write ( M.mat[i,j]:5 ) ;
    writeln ( '|' ) ;
  end ;
end ;
procedure calcola_trasposta ( M : tipo_matrice ;
                              var M1 : tipo_matrice ) ;
var i, j : integer ;
begin
  M1.righe := M.colonne ;
  M1.colonne := M.righe ;
  for i := 1 to M1.righe do
    for j := 1 to M1.colonne do
      M1.mat [i, j] := M.mat [j, i] ;
end ;
function somma_matrici ( M1, M2 : tipo_matrice ;
                         var MS : tipo_matrice ) : boolean ;
var i, j : integer ;
begin
  somma_matrici := true ;
  if ( M1.righe <> M2.righe ) or
     ( M1.colonne <> M2.colonne ) then
     somma_matrici := false
  else
  begin
    MS.righe := M1.righe ;
    MS.colonne := M1.colonne ;
    for i := 1 to MS.righe do
      for j := 1 to MS.colonne do
        MS.mat [i, j] := M1.mat [i, j] + M2.mat [i, j] ;
  end ;
end ;
function moltiplica_matrici ( M1, M2 : tipo_matrice ;
                              var MP : tipo_matrice ) : boolean ;
var i, j, k : integer ;
begin
  moltiplica_matrici := true ;
  if M1.colonne <> M2.righe then
     moltiplica_matrici := false
  else
  begin
    MP.righe := M1.righe ;
    MP.colonne := M2.colonne ;
    for i := 1 to MP.righe do
      for j := 1 to MP.colonne do
      begin
        MP.mat [i, j] := 0 ;
        for k := 1 to M1.colonne do
          inc ( MP.mat [i, j], M1.mat [i, k] * M2.mat [k, j] ) ;
      end
  end ;
end ;
begin
  writeln ( 'inserisci matrice A' ) ;
  accetta_matrice ( A ) ;
  writeln ;
  writeln ( 'inserisci matrice B' ) ;
  accetta_matrice ( B ) ;
  writeln ;
  calcola_trasposta ( A, A1 ) ;
  writeln ( 'matrice A :' ) ;
  scrivi_matrice ( A ) ;
  writeln ( 'matrice trasposta di A :' ) ;
  scrivi_matrice ( A1 ) ;
  writeln ( 'matrice B :' ) ;
  scrivi_matrice ( B ) ;
  if somma_matrici ( A, B, C ) then
  begin
    writeln ( 'matrice C = A + B :' ) ;
    scrivi_matrice ( C ) ;
  end
  else writeln ( 'impossibile sommare le matrici' ) ;
  if moltiplica_matrici ( A, B, C ) then
  begin
    writeln ( 'matrice C = A * B :' ) ;
    scrivi_matrice ( C ) ;
  end
  else writeln ( 'impossibile moltipliare le matrici' ) ;
end.

 
per questo non ho tempo... e' lungo :-))
bye!
-- 
Emanuele Cesena		
http://www.geocities.com/SilionValley/Grid/8879
ami...@iol.it
				    Attenti all'antispam NOSPAM
"Nulla e' impossibile per colui che non deve farlo", legge di Weiler

Andrea Laforgia scrive:
[snip...]
Argh! E' un po' troppo complicata per le conoscenze che ho ricevuto a
scuola. Per esempio non ho fatto le variabili "record" e le funzioni.
Comunque proverò a prendere il tuo programma come esempio generale.
Grazie mille!


Comunque proverò a prendere il tuo programma come esempio generale.
In effetti la programmazione di buon livello si discosta sempre da
quella che viene insegnata a scuola.
E' un peccato, ovviamente, e si finisce con l'impararla da autodidatta
.
Il fatto di aver adottato il tipo record per memorizzare una matrice
e' una mia scelta che risponde ad un principio di "information
hiding", cioe' cerco di rendere le informazioni riguardanti una
matrice quanto piu' possibile private.
L'uso delle variabili globali e' sempre sconsigliabile, ma si sarebbe
potuto implementare il numero di righe e di colonne per ogni matrice
esattamente in questo modo (eliminando percio' i record).
In quanto all'utilizzo di funzioni (cioe' procedure che restituiscono
un valore) in realta' inizialmente avevo implementato tutte le
subroutine come procedure, ma mi sono reso conto che ci deve essere il
modo di stabilire se e' possibile o meno compiere un'operazione di
somma o moltiplicazione tra matrici e quindi il risultato di ciascuna
funzione viene interpretato in questo senso.
Comunque, ti faccio l'esempio per somma_matrici(), essa e'
trasformabile in procedura in questo modo, anche se piu' scomodo da
gestire :
procedure somma_matrici ( M1, M2 : tipo_matrice ;
                          var MS : tipo_matrice ;
                          var somma_ok : boolean ) ;
var i, j : integer ;
begin
  somma_ok := true ;
  if ( M1.righe <> M2.righe ) or
     ( M1.colonne <> M2.colonne ) then
     somma_ok := false


procedure ScriviTrasposta (x, y: word);
Un approccio del genere e' sconsigliabile per almeno tre motivi :
1) non bisogna mai adottare variabili globali laddove non ve ne sia
bisogno.
2) l'uso di limitazioni sull'array A non consente di accedere a
matrici piu' grandi.
3) se volessi stampare due matrici non potrei farlo con un'unica
funzione.
Inoltre, i parametri di una funzione o procedura devono sempre
accordarsi con la descrizione della procedura.
Se chiami la procedura "ScriviTrasposta" si presume che agirai su una
matrice e quindi devi passare una matrice come parametro e non le sue
dimensioni.

dimensioni.
Infatti noi a scuola non abbiamo nemmeno fatto le variabili "word" per ora.
Comunque Andrea, tu mi avevi detto che era possibile passare una matrice
bidimensionale dal programma principale alla procedura soltanto fissando
con il comando type un array. Però il mio prof. ha detto che anche c'è
un'altro metodo che non necessita del type. Tu sai di che parla?
Come si fa a passare una matrice bidimensionale senza usare il "type"?
Ciao!


Come si fa a passare una matrice bidimensionale senza usare il "type"?
La risposta e' semplice : se il tuo prof. intende passarla come
parametro si sbaglia di grosso.
L'errore restituito dal TP e' per l'appunto "type identifier expected"
e quindi, come vedi, il compilatore si aspetta un'IDENTIFICATORE di
tipo.
Per intenderci e' come voler passare un record.
I tipi composti devono essere prima trasformati.
E' probabile che egli si riferisca al suo utilizzo come variabile
globale (come ha fatto EMA) ma e' decisamente cattivo stile di
programmazione.
Oppure passarla come puntatore alla matrice, ma non credo che siate
ancora entrati nel mondo dei puntatori.

ancora entrati nel mondo dei puntatori.
Mah, quando Giovedi vedrò cosa farà, allora te lo dirò.....


 Ciao!
io dico che usa una semplice matrice globale...
Sara' un cattivo utilizzo, ma: 
- e' comodo 
- in casi come questo, non cambia molto...
- visto che sono (sembrano) agli inizi, non si puo' pretendere di spiegare
  tutto sul passaggio di variabili alle funzioni.
ciao :-)
-- 
Emanuele Cesena		
http://www.geocities.com/SilionValley/Grid/8879
ami...@iol.it
				    Attenti all'antispam NOSPAM
"Il tempo speso per ogni punto dell'ordine del giorno e' sempre inversamente
proporzionale alla somma di denaro che il punto comporta", legge
dell'Insignificanza

 
ok, ma la richiesta era:
1) Date le dimensioni di una matrice...
ed ho seguito la strada piu' breve... :)
-- 
Emanuele Cesena		
http://www.geocities.com/SilionValley/Grid/8879
ami...@iol.it
				    Attenti all'antispam NOSPAM
"L'altra coda e' sempre piu' veloce", osservazione di Zenone
"Se si cambia coda, quella che si e' appena lasciata diventera'
immediatamente la piu' veloce", variazione di O'Brien
"Continuare a cambiar coda le rallenta entrambe e fa infuriare tutti",
corollario di Kenton


i "word" sono integer senza segno... ho utilizzato questi solo
per evitare che si passassero dimensioni negative per la
matrice :-)
bye!
-- 
Emanuele Cesena		
http://www.geocities.com/SilionValley/Grid/8879
ami...@iol.it
				    Attenti all'antispam NOSPAM
"Gli amici vanno e vengono, i nemici si accumulano", motto di Jones

  tutto sul passaggio di variabili alle funzioni.
Non e' vero.

ed ho seguito la strada piu' breve... :)
Peccato che e' sbagliata.
Dire "date le dimensioni di una matrice" non significa che esse siano
esterne a qualsiasi struttura.
Posso definire :
record
  n, m : integer ;
  matrice : array .... ;
end ;
e salvare i valori in n e m rispettando un principio di "mascheramento
delle informazioni".

 
ok, ma se loro i record non li hanno fatti, definisco:
var
matrice: array [1..quellochevuoi, 1..quell'altrochevuoi] of integer;
n, m: integer;
ed opero nello stesso modo.
Ciao ciao!
-- 
Emanuele Cesena		
http://www.geocities.com/SilionValley/Grid/8879
ami...@iol.it
				    Attenti all'antispam NOSPAM
"Quando c'e' bisogno di toccar ferro o legno, ci si accorge che il mondo e'
fatto di alluminio e vinile", legge di Flugg

 
mah, personalmente vengo da una classe dove non credo che tutti
abbiano capito bene cos'e' un array... :-)
ciao ciao!
-- 
Emanuele Cesena		
http://www.geocities.com/SilionValley/Grid/8879
ami...@iol.it
				    Attenti all'antispam NOSPAM
"Gli esperti di calcio non fanno mai tredici", osservazione di Malipieri

abbiano capito bene cos'e' un array... :-)
Si vede ;)
(ehm...solo gli array ?)

ed opero nello stesso modo.
Errato, non ti sei ancora convinto che e' il modo sbagliato di
*operare*.
Si costruisce innanzitutto il tipo matrice.
Poi si salvano i valori di riga e colonna nell'array stesso.

 
no... personalmente, se permetti, mi ritengo leggermente piu'
avanti... ovviamente non pretendo, da autodidatta e studente di 4^
superiore, di essere ai tuoi livelli o ai livelli di altri,
di cui fra l'altro non so praticamente nulla, ma il dialogo mi piace, anche
perche' imparo sempre cose nuove... 
Ciao ciao!
-- 
Emanuele Cesena		
http://www.geocities.com/SilionValley/Grid/8879
ami...@iol.it
				    Attenti all'antispam NOSPAM
"La necessita' procura strani compagni di letto", quarta legge di Farber

 
ok, ok, ok... ma non pretendere che in prima o seconda superiore
gia' si conoscano i record...
Se hanno appena iniziato, da loro il tempo di arrivarci...
bai ;-)
-- 
Emanuele Cesena		
http://www.geocities.com/SilionValley/Grid/8879
ami...@iol.it
				    Attenti all'antispam NOSPAM
"Chi sa fare, fa. Chi non sa fare, insegna", legge di H.L. Mencken

Se hanno appena iniziato, da loro il tempo di arrivarci...
Che cosa c'e' di tanto astruso in un record ?
Tra l'altro nei corsi di Pascal viene affrontato come uno dei primi
argomenti, dovendo trattare i tipi di dati.


nulla, ma prima si dovrebbe parlare almeno di writeln e readln, nonche'
dei tipi di dati primitivi...
E, a scuola, spesso i record si rimandano ancora... e' molto piu'
bello fare un programmino tutto colorato, che non uno ben strutturato,
purtroppo :-)
-- 
Emanuele Cesena		
http://www.geocities.com/SilionValley/Grid/8879
ami...@iol.it
				    Attenti all'antispam NOSPAM
"Le probabilita' che un giovane maschio incontri una giovane femmina
attraente e disponibile aumentano in proporzione geometrica quando e' con:
1) la fidanzata, 2) la moglie, 3) un amico piu' bello e piu' ricco",
principio di Beifeld

purtroppo :-)
Probabilmente un programma tutto colorato e' il massimo che ci si
possa aspettare da determinati elementi di una determinata classe.
Non e' vero cio' che dici : nelle scuole si insiste sulle strutture
dati e non sulle stupidaggini come i colori.

 
in che scuole?? A che livello??
Noi studiavamo il Turbo Pascal 1 ora alla settimana, perche' il nostro
prof. di mate era gentile e "rinunciava" ad un'ora di spiegazione.
1 ora alla settimana, e' molto poca... e comunque devi avere un
riscontro a fine anno, devi dare un voto.
Un po' di spiegazione sui tipi di dati semplici, fondamentale, un
minimo sull'input ed output, perche' senza questi i programmi non li
vedi, 2 esempi in laboratorio, ed il primo quadrimestre e' praticamente
finito. Ci ha dato quindi 2 infos sui colori ed i suoni, tanto
da rendere i programmi un po' piu' carini.
Il secondo quadrimestre l'abbiamo passato a realizzare i programmi.
In seconda, abbiamo fatto la grafica, stessa cosa: niente di
tutto :-)
bye!
-- 
Emanuele Cesena		
http://www.geocities.com/SilionValley/Grid/8879
ami...@iol.it
				    Attenti all'antispam NOSPAM
"Tutte le grandi scoperte si fanno per sbaglio", legge di Young

da rendere i programmi un po' piu' carini.
Ma per piacere !...

 
ognuno la pensa come crede... certo mediamente la classe e' stata
piu' produttiva imparando i colori del Pascal, che non i record in
C, dove i programmi avevano un'interfaccia utente pessima:
	Menu'
	  1) Fai questo
	  2) Fai quest'altro
	  3) ecc.
	  4) Esci
	Scegli:
Bisogna anche considerare che il liceo non e' l'universita', dove
vai a studiare quello che vuoi... c'e' pure gente che dell'informatica
non gliene frega nulla... :-(
bye!
-- 
Emanuele Cesena		
http://www.geocities.com/SilionValley/Grid/8879
ami...@iol.it
				    Attenti all'antispam NOSPAM
"1. Un funzionario vorra' sempre moltiplicare i suoi subordinati, non i rivali
 2. I funzionari creano lavoro l'uno per l'altro", assiomi di Parkinson

Bene, adesso che ho letto 3 km di thread dico la mia
Sono in seconda superiore, e la mia prof ha ritenuto che usare {$n+} e le
var extended per un calcolo grosso sia stata una cosa eccezionale;
tutti nella classe mi chiedono sempre poi cosa sono inc e dec
Il liceo scientifico non ha solo informatica da fare :) E 1 ora alla
settimana sě e no... non č certo molto
--
Paolo 83 RE
XXXg...@freemail.it
 (remove XXX)
gher...@iname.com
 (text only)
CIAO!
Ema da TIN <ami...@NOSPAMiol.it> wrote in message 7j6sv3$b5$1...@sufri.it...
