Creazione di un header:e' corretto?[C]

Messaggioda fk16 » 03/02/2012, 10:50

Volevo solo sapere se era corretto il seguente esercizio.
/*Scrivere il codice di un file header che contenga solo i prototipi delle funzioni per la gestione di matrici di double. Prevedere almeno le funzioni per la somma e la moltiplicazione di matrici, la moltiplicazione di una matrice per una costante e una funzione per il calcolo della trasposta.*/

#include<stdio.h>
#include<stdlib.h>

void somma(double**,double**,int,int);
void prodotto(double**,double**,int,int);
void k_prodotto(double**,int,int,int);
void trasposta(double**,int,int);
fk16
Junior Member
Junior Member
 
Messaggi: 220
Iscritto il: 08/03/2011, 13:39

Re: Creazione di un header:e' corretto?[C]

Messaggioda apatriarca » 03/02/2012, 12:21

No, non è corretto. Per prima cosa non è chiaro il motivo per cui siano stati inclusi stdio.h e stdlib.h. Sono certamente inutili in una libreria di questo tipo e certamente ancora meno nell'header. Per cui vanno eliminati. Abbastanza importanti in pratica sono invece le include guards che non hai inserito. Forse non te li hanno insegnati.

Infine, non hanno senso i prototipi delle funzioni. In particolare, il risultato non sembra venire restituito in nessun modo. Devi o aggiungere un parametro apposito per restituire il risultato oppure avere come tipo di ritorno double **. Ma la matrice risultato deve essere restituita in qualche modo se no non ha senso. Per quanto riguarda il resto dei parametri delle funzioni, la somma va bene, anche se io non rappresenterei una matrice in quel modo ma come un array monodimensionale. Il prodotto è invece sbagliato. Ci sono infatti 3 dimensioni delle matrici da conoscere in questo caso e non due. Perché si possano moltiplicare due matrici è infatti necessario che la prima sia di dimensione \(m \times k\) e la seconda \(k \times n\) e il risultato avrà dimensione \(m \times n\). Per cui manca un parametro int. k_prodotto va abbastanza bene, ma non è chiaro perché la costante dovrebbe essere un intero invece del più sensato double. La trasposta va infine abbastanza bene come argomenti.
apatriarca
Moderatore
Moderatore
 
Messaggi: 2124
Iscritto il: 08/12/2008, 20:37
Località: Torino

Re: Creazione di un header:e' corretto?[C]

Messaggioda fk16 » 03/02/2012, 12:59

Quindi dovrebbe essere così???
double** somma(double**,double**,int,int);
double** prodotto(double**,double**,int,int,int);
double** k_prodotto(double**,double,int,int);
double** trasposta(double**,int,int);
fk16
Junior Member
Junior Member
 
Messaggi: 220
Iscritto il: 08/03/2011, 13:39

Re: Creazione di un header:e' corretto?[C]

Messaggioda apatriarca » 03/02/2012, 14:15

Sì, così va meglio. Ma sarebbe meglio inserire anche le include guard.
apatriarca
Moderatore
Moderatore
 
Messaggi: 2124
Iscritto il: 08/12/2008, 20:37
Località: Torino

Re: Creazione di un header:e' corretto?[C]

Messaggioda Raptorista » 07/02/2012, 00:35

Scusate se mi intrometto :)
Nelle funzioni somma e k_prodotto non è inutile dire le dimensioni delle matrici?
Un matematico ha scritto:... come mia nonna che vuole da anni il sistema per vincere al lotto e crede che io, in quanto matematico, sia fallito perché non glielo trovo


Immagine
Avatar utente
Raptorista
Moderatore
Moderatore
 
Messaggi: 2330
Iscritto il: 28/09/2008, 19:58

Re: Creazione di un header:e' corretto?[C]

Messaggioda apatriarca » 07/02/2012, 01:08

Una volta che un array viene passato ad una funzione, la sua dimensione viene persa e quindi è necessario passare sempre la dimensione insieme ad ogni array.
apatriarca
Moderatore
Moderatore
 
Messaggi: 2124
Iscritto il: 08/12/2008, 20:37
Località: Torino

Re: Creazione di un header:e' corretto?[C]

Messaggioda Raptorista » 07/02/2012, 09:34

Ok, ma se sto sommando due matrici, io sommo posto a posto indipendentemente dalla dimensione; potrei benissimo prendere due array, sommare posto a posto e restituire l'array. La dimensione con cui ricostruire la matrice è un problema dello scope in cui la matrice è memorizzata, se vogliamo.
Idem per il prodotto per uno scalare. Dico bene?
Un matematico ha scritto:... come mia nonna che vuole da anni il sistema per vincere al lotto e crede che io, in quanto matematico, sia fallito perché non glielo trovo


Immagine
Avatar utente
Raptorista
Moderatore
Moderatore
 
Messaggi: 2330
Iscritto il: 28/09/2008, 19:58

Re: Creazione di un header:e' corretto?[C]

Messaggioda apatriarca » 07/02/2012, 11:15

No, perché all'interno della funzione si ha solo un indirizzo e non si ha alcuna idea di quale possa essere la dimensione della matrice o il numero di elementi. Passando tralaltro la matrice come scelto da fk16, le due dimensioni sono necessarie in quanto ogni riga è memorizzata separatamente.
apatriarca
Moderatore
Moderatore
 
Messaggi: 2124
Iscritto il: 08/12/2008, 20:37
Località: Torino

Re: Creazione di un header:e' corretto?[C]

Messaggioda Raptorista » 07/02/2012, 11:27

Sì, vero, quindi al limite se le matrici sono di dimensioni \(m \times n\) dovrei passare il numero \(mn\) e poi muovermi con matrix++ per \(mn\) volte.
Un matematico ha scritto:... come mia nonna che vuole da anni il sistema per vincere al lotto e crede che io, in quanto matematico, sia fallito perché non glielo trovo


Immagine
Avatar utente
Raptorista
Moderatore
Moderatore
 
Messaggi: 2330
Iscritto il: 28/09/2008, 19:58

Re: Creazione di un header:e' corretto?[C]

Messaggioda vict85 » 07/02/2012, 14:37

Raptorista ha scritto:Sì, vero, quindi al limite se le matrici sono di dimensioni \(m \times n\) dovrei passare il numero \(mn\) e poi muovermi con matrix++ per \(mn\) volte.


In genere non si lavora con matrici bidimensionali ma con array monodimensionali di dimensione \(\displaystyle mn \). D'altra parte la funzione da te proposta la trovo poco coerente con l'interfaccia della matrice. Lo sarebbe se invece si usasse la rappresentazione vettoriale della matrice sin dall'inizio.
vict85
Cannot live without
Cannot live without
 
Messaggi: 3383
Iscritto il: 16/01/2008, 00:13
Località: Torino

Prossimo

Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti