PDA

Visualizza la versione completa : [C] Esercizio: estrarre valore massimo e vettore da una matrice


amico9120
16-07-2011, 15:22
salve di nuovo
devo realizzare un programma che data una matrice di massimo 100 righe e 100 colonne restituisca un valore max e un vettore.
nelle righe della matrice sono scritte le vittorie del giocatore, nelle colonne le sue sconfitte.
ad esempio se questa è la matrice
-1 3 4 5 2 1
4 -1 2 1 2 3
3 4 -1 4 5 4
1 2 2 -1 3 3
2 2 3 4 -1 1
0 0 0 0 1 -1

le vittorie del giocatore 0 (prima riga) sono 3+4+5+2+1=15 e le sue sconfitte(colonna 0) sono 4+3+1+2+0=10.
N.B. -1 lungo la diagonale principale che devono essere ignorati

scopo del programma è restituire l'indice della riga del giocatore che ha il massimo rapporto tra partite vinte e (partite vinte + partite perse) ed inoltre un array in cui in ogni locazione è salvata la differenza tra partite vinte e partite perse.
ad esempio nel caso del giocatore 0 nella locazione [0] dell'array c'è 5 cioè 15-10.

questo è il codice che ho creato



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

#define MAXRIGHE 100
#define MAXCOLONNE 100

int Matrice(int partite[MAXRIGHE][MAXCOLONNE],int d[],int n)
{
int i,j,max=0;
int partite_vinte=0,partite_perse=0;
for(j=0;j<MAXRIGHE;j++)
{
for(j=0;j<MAXCOLONNE;j++)
{
if(partite[i][j]==partite[j][i])
;
else
{
partite_vinte+=partite[i][j];
partite_perse+=partite[j][i];
}
}
if((partite_vinte/(partite_vinte + partite_perse))>max)
max=i;
d[i]=partite_vinte - partite_perse;
}
return max;
}

int main()
{
int partite[MAXRIGHE][MAXCOLONNE]={{-1,3,4,5,2,1},{4,-1,2,1,2,3},{3,4,-1,4,5,4},{1,2,2,-1,3,3},{2,2,3,4,-1,1},{0,0,0,0,1,-1}};
int d[6]={0};
int n=6;
printf("%d",Matrice(partite,d,n));
return 0;
}


ci sono alcuni problemi:
prima cosa non so come una funzione(nel mio caso 'Matrice' possa restituire sia un intero(max) che un array di int e quindi come possa restituire 2 cose.
per secondo così compilando non da errori ma nell'esecuzione mi compare segmentation fault :/

oregon
16-07-2011, 15:31
La funzione può restituire il valore intero richiesto mentre uno dei parametri può essere il puntatore all'array di int passato dall'esterno e modificato all'interno della funzione.

amico9120
16-07-2011, 15:56
quindi se ho capito bene modifico


printf("%d",Matrice(partite,d,n)); in printf("%d",Matrice(partite,&d,n));

e

int Matrice(int partite[MAXRIGHE][MAXCOLONNE],int d[],int n)

in

int Matrice(int partite[MAXRIGHE][MAXCOLONNE],int *d[],int n)

e

d[i]=partite_vinte - partite_perse;

in

*d[i]=partite_vinte - partite_perse;


?

oregon
16-07-2011, 16:06
No ... nulla di tutto ciò ... già il codice che hai scritto passa i valori correttamente ...

amico9120
16-07-2011, 16:07
ah ottimo allora...per il segmentation fault cosa si può fare?

oregon
16-07-2011, 16:10
Beh .... controlla il codice ...

Come fai ad usare due cicli for innestati con la stessa variabile j ?

E la i? Quando la inizializzi?

amico9120
16-07-2011, 16:15
sembra che oggi io tenda a mettere j al posto di i -.-

oregon
16-07-2011, 16:18
Può capitare ma i programmi (di poche righe) vanno letti e riletti con attenzione ... come faresti se il programma fosse di migliaia di righe ...?

Probabilmente rivolgersi ad un forum risulta più facile che fare prove, leggere e debuggare il codice ...

amico9120
16-07-2011, 17:59
hai ragione.
con un po' di debug sono riuscito a far funzionare il codice :)

eccolo



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

#define MAXRIGHE 100
#define MAXCOLONNE 100

int Matrice(int partite[MAXRIGHE][MAXCOLONNE],int d[],int n)
{
int i,j;
double max=0,max_indice=0;
double partite_vinte=0,partite_perse=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
//printf("%d\n",partite[i][j]);
if(partite[i][j]!=-1)
{
partite_vinte+=partite[i][j];
partite_perse+=partite[j][i];
}
}
printf("%lf\t%lf",partite_vinte,partite_perse);
if((partite_vinte/(partite_vinte + partite_perse)) > max)
{
max=(partite_vinte/(partite_vinte + partite_perse));
max_indice=i;
}
d[i]=partite_vinte - partite_perse;
partite_vinte=0;
partite_perse=0;
}
return max_indice;
}

int main()
{
int partite[MAXRIGHE][MAXCOLONNE]={{-1,3,4,5,2,1},{4,-1,2,1,2,3},{3,4,-1,4,5,4},{1,2,2,-1,3,3},{2,2,3,4,-1,1},{0,0,0,0,1,-1}};
int d[6]={0};
int n=6;
int i;
printf("\n%d",Matrice(partite,d,n));
for(i=0;i<6;i++)
printf("\n%d\n",d);
return 0;
}



l'unica cose che manca sono i dati nel vettore...con un semplice for nel main mi stampa solo il primo indice del vettore ripetuto(5 in questo caso)..qualche aiuto?:D

oregon
16-07-2011, 18:08
Ma nel main dov'è la chiamata alla funzione?

Loading