PDA

View Full Version : [C]Programma con procedura non funzionante


Composition86
20-12-2008, 18:20
Salve a tutti, ho realizzato il seguente semplice programma:
#include <conio.h>
#include <stdio.h>
#include <ctype.h>
#include <math.h>
#define DIM 50

typedef struct {
float media;
float deviazionestandard;
int minimo;
int massimo;
} tipoStatistica ;

void init (int mat[DIM][DIM]);
void stampaMatrice (int mat[DIM][DIM]);
void diagonale (int mat[DIM][DIM], int *);
float media (int v[DIM]);
float deviazione (int v[DIM]);
int min (int v[DIM]);
int max (int v[DIM]);
void statisticaDiagonale (int mat[DIM][DIM], tipoStatistica *stat, int *Diag);
void stampaStatistica (tipoStatistica *stat);


int main (void)
{
int Mat[DIM][DIM], *Diag;
tipoStatistica Stat;
char scelta;

do {
init (Mat);
stampaMatrice (Mat);
statisticaDiagonale (Mat, &Stat, Diag);
stampaStatistica (&Stat);

printf ("\nVuoi ripetere il programma? (Digita 'n' per terminare) ");
scelta=getche();
} while (tolower(scelta) != 'n');
}

void init (int mat[DIM][DIM])
{
int i, j, d;
printf ("Inserire la dimensione della matice quadrata: ");
scanf ("%d", &d);

printf ("Digitare dei numeri interi, elementi della matrice,
distribuendoli sulle righe:\n");

for (i=0 ; i<= d-1 ; i++) {
for (j=0 ; j<= d-1 ; j++) {
scanf ("%d", &mat[i][j]);
}
}
}

void stampaMatrice (int mat[DIM][DIM])
{
int i, j, d;

printf ("Ecco la matrice inizializzata:\n\n");

for (i=0 ; i<= d-1 ; i++) {
for (j=0 ; j<= d-1 ; j++) {
printf ("%d ", mat[i][j]);
}
printf ("\n");
}
}

void diagonale (int mat[DIM][DIM], int *diag) //Il vettore diag è l'output della funzione
{
int i, d;

for (i=0 ; i<= d-1 ; i++) {
diag[d]=mat[i][i];
}
}

float media (int v[DIM])
{
int k, d, somma=0, medium;

for (k=0 ; k<= d-1 ; k++) {
somma+=v[k];
}
medium=somma/d;

return medium;
}

float deviazione (int v[DIM])
{
int k, d, somma=0;
float standardeviation;

for (k=0 ; k<= d-1 ; k++) {
somma+= pow (v[k] - media(v), 2);
}

standardeviation = sqrt (somma/d);

return standardeviation;
}

int min (int v[DIM])
{
int k,d, minimum=v[0];

for (k=0 ; k<= d-1 ; k++) {
if (v[k] < minimum)
minimum = v[k];
}

return minimum;
}

int max (int v[DIM])
{
int k,d, maximum=v[0];

for (k=0 ; k<= d-1 ; k++) {
if (v[k] < maximum)
maximum = v[k];
}

return maximum;
}

void statisticaDiagonale (int mat[DIM][DIM], tipoStatistica *stat, int *Diag) //stat è una variabile ed è l'output
{
int k;

diagonale (mat, Diag);
stat->media = media(Diag);
stat->deviazionestandard = deviazione(Diag);
stat->minimo = min(Diag);
stat->massimo = max(Diag);
}

void stampaStatistica (tipoStatistica *stat)
{
printf ("La media degli elementi e': %.2f", stat->media);
printf ("La deviazione standard e': %.2f", stat->deviazionestandard);
printf ("L'elemento minimo e': %d", stat->minimo);
printf ("L'elemento massimo e': %d", stat->massimo);
}

Viene compilato senza dare errori, ma si blocca al momento di eseguire il gruppo di funzioni e procedure correlate alla procedura statisticaDiagonale ().
Dove sbaglio? Ringrazio anticipatamente.

sottovento
20-12-2008, 21:41
In effetti chiami la funzione statisticaDiagonale() dal main() in questo modo


int Mat[DIM][DIM], *Diag;
tipoStatistica Stat;
...
statisticaDiagonale (Mat, &Stat, Diag);


Pertanto Diag e' un puntatore a uffeta. E' lui il marrano!

Composition86
20-12-2008, 22:48
Grazie, appena posso controllo e vedo di far funzionare il tutto.

Composition86
21-12-2008, 22:08
Ok, ho ricontrollato e c'era anche quell'erorre che hai segnalato. Ho apportato alcune modifiche e funziona tutto, riporto il codice per completezza. Grazie di nuovo.

#include <conio.h>
#include <stdio.h>
#include <ctype.h>
#include <math.h>
#define DIM 50

typedef struct {
float media;
float deviazionestandard;
int minimo;
int massimo;
} tipoStatistica ;

void init (int mat[DIM][DIM], int *);
void stampaMatrice (int mat[DIM][DIM], int *);
void diagonale (int mat[DIM][DIM], int *, int *);
float media (int v[DIM], int *);
float deviazione (int v[DIM], int *);
int min (int v[DIM], int *);
int max (int v[DIM], int *);
void statisticaDiagonale (int mat[DIM][DIM], tipoStatistica *stat, int *Diag, int *);
void stampaStatistica (tipoStatistica *stat);


int main (void)
{
int Mat[DIM][DIM], Diag[DIM], D;
tipoStatistica Stat;
char scelta;

do {
init (Mat, &D);
stampaMatrice (Mat, &D);
statisticaDiagonale (Mat, &Stat, Diag, &D);
stampaStatistica (&Stat);

printf ("\nVuoi ripetere il programma? (Digita 'n' per terminare) ");
scelta=getche();
} while (tolower(scelta) != 'n');
}

void init (int mat[DIM][DIM], int *d)
{
int i, j;
printf ("Inserire la dimensione della matrice quadrata: ");
scanf ("%d", d);

printf ("Digitare dei numeri interi, elementi della matrice, distribuendoli sulle righe:\n");

for (i=0 ; i<= *d-1 ; i++) {
for (j=0 ; j<= *d-1 ; j++) {
scanf ("%d", &mat[i][j]);
}
}
}

void stampaMatrice (int mat[DIM][DIM], int *d)
{
int i, j;

printf ("\nEcco la matrice inizializzata:\n\n");

for (i=0 ; i<= *d-1 ; i++) {
for (j=0 ; j<= *d-1 ; j++) {
printf ("%d ", mat[i][j]);
}

printf ("\n");
}
}

void diagonale (int mat[DIM][DIM], int *diag, int *d) //Il vettore diag è l'output della funzione
{
int i;

for (i=0 ; i<= *d-1 ; i++) {
diag[i]=mat[i][i];
}
}

float media (int v[DIM], int *d)
{
int k, somma=0;
float medium;

for (k=0 ; k<= *d-1 ; k++) {
somma+=v[k];
}
medium = (float) somma/(*d);

return medium;
}

float deviazione (int v[DIM], int *d)
{
int k, somma=0;
float standardeviation;

for (k=0 ; k<= *d-1 ; k++) {
somma+= pow (v[k] - media(v, d), 2);
}

standardeviation = sqrt ((float) somma/(*d) );

return standardeviation;
}

int min (int v[DIM], int *d)
{
int k, minimum=v[0];

for (k=1 ; k<= *d-1 ; k++) { //Inizia da k=1 per risparmiare un ciclo
if (v[k] < minimum)
minimum = v[k];
}

return minimum;
}

int max (int v[DIM], int *d)
{
int k, maximum=v[0];

for (k=1 ; k<= *d-1 ; k++) {
if (v[k] > maximum)
maximum = v[k];
}

return maximum;
}

void statisticaDiagonale (int mat[DIM][DIM], tipoStatistica *stat, int *diag, int *d) //stat è una variabile ed è l'output
{
diagonale (mat, diag, d); //Prima viene costruita la diagonale, le funzioni sotto utilizzano il vettore 'diag': è un calcolo intermedio
stat->media = media(diag, d);
stat->deviazionestandard = deviazione(diag, d);
stat->minimo = min(diag, d);
stat->massimo = max(diag, d);
}

void stampaStatistica (tipoStatistica *stat)
{
printf ("\nSi ricavano adesso alcune informazioni relative alla DIAGONALE PRINCIPALE della matrice:");
printf ("\nLa media degli elementi e': %.2f", stat->media);
printf ("\nLa deviazione standard e': %.2f", stat->deviazionestandard);
printf ("\nL'elemento minimo e': %d", stat->minimo);
printf ("\nL'elemento massimo e': %d", stat->massimo);
printf ("\n");
}