Provo a darti una mano :)
Dunque, partendo dall'esercizio tu sai di avere 4 prodotti che sono tutti venduti da più venditori, in particolare 5. Ora potresti pensare di schematizzarlo in forma tabellare, quindi se supponiamo di avere sulle righe i prodotti e sulle colonne i venditori avremo:
[TABLE="class: grid, width: 500"]
[TR]
[TD][/TD]
[TD]V_1[/TD]
[TD]V_2[/TD]
[TD]V_3[/TD]
[TD]V_4[/TD]
[TD]V_5[/TD]
[/TR]
[TR]
[TD]P_1[/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[/TR]
[TR]
[TD]P_2[/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[/TR]
[TR]
[TD]P_3[/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[/TR]
[TR]
[TD]P_4[/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[/TR]
[/TABLE]
La tua matrice non sarà altro che l'interno della tabella (ovvero le celle formate dalle combinazioni di P_X con V_Y) :)
Dato che il testo non ne fa menzione potresti anche pensare che i venditori vendano i prodotti allo stesso prezzo, quindi puoi definire i loro valori o come costanti (
const) o con delle
define.
A questo punto, se la tua matrice è carica non ti resta che svolgere le operazioni richieste; il testo ti dice di salvare i risultati all'interno della matrice, ma la cosa a mio avviso è abb brutta per una serie di motivazioni:
1)
in termini di significato: abbiamo creato la matrice per inserire quantitativi di elementi e non prezzi, quindi la cosa a mio avviso stona un po';
2)
problemi derivanti dai tipi: il problema è che le quantità sono degli interi (a meno che non parliamo di roba tipo chili di prosciutto ecc...), ma i prezzi possono essere tranquillamente numeri con la virgola, e questo in una matrice di interi non si può fare.
Diciamo che per attenerti all'esercizio potresti semplicemente aggiungere una riga ed una colonna alla matrice (che lascerai libere per calcolare i relativi totali); ora però bisogna risolvere i punti di sopra.
Il primo è più una questione interpretativa; essendo questo un esercizio potresti anche fregartene del primo punto, ma secondo me rendere il codice un po' più leggibile ti può facilitare la vita dopo.
Per il secondo punto, puoi risolverla imponendo che la matrice non sia di interi, ma di numeri con la virgola; sorge però un altro problema, ovvero l'utente può inserire quantità con la virgola senza controllo (pensa se mi compra qualcosa tipo 1,3 ventilatori :D); una soluzione è quella di imporre un controllo sul resto della divisione per 1 sui primi elementi di riga e colonna; i.e. puoi inserire la scanf che deve dare l'utente all'interno di un while:
Codice:
while( scanf("%f",matt[i,j])%1!=0 ) printf("Valore errato, ridigita\n");
Considerando però che la matrice è pre-caricata potresti anche sorvolare su questo punto, ma se ti fidi, più controlli fai, più sarai abituato a farli anche in programmi più complessi, e lì dovrai testarli veramente bene :)
Una volta che la matrice è carica basta che fai delle semplici somme. Solitamente l'approccio a questo tipo di strutture dati, quando le si vuole visionare completamente, è dato da 2 cicli for annidati, uno esterno che scorre le righe ed uno interno che scorre gli elementi per ogni riga (il motivo per cui non si fa l'opposto risiede nel come queste strutture sono memorizzate in memoria).
In questo caso si può sfruttare lo stesso procedimento con un po' di astuzia, ovvero considerando una matrice in cui gli elementi facenti parte dell'ultima riga e dell'ultima colonna siano inizializzati a 0:
Codice:
int i,J; // dichiaro le variabili dei due cicli
for(i=0; i<RIG-1; i++){ // ciclo esterno che cicla le righe
for(j=0; i<COL-1; i++){ // ciclo interno che cicla le colonne
/* la cella che stiamo considerando influisce sia sul totale di riga che su quello di colonna */
matt[i,COL-1] += matt[i,j]; // aggiungo il valore al totale di riga
matt[RIG-1,j] += matt[i,j]; // aggiungo il valore al totale di colonna
} //end for interno
} // end for esterno
NOTA BENE: in questo caso nella matrice che vai a creare
devi moltiplicare ogni valore interno per il relativo costo prima dei sopra-citati cicli, altrimenti non sarai più in grado di distinguerli dopo. Questo tipo di operazione ti conviene farla nel momento in cui l'utente digita i valori che immetterai nella struttura dati (attraverso le costanti di cui ti parlavo all'inizio), in questo modo il tutto assumerebbe anche un significato più chiaro, ovvero avresti una matrice di soli prezzi (però perderesti l'informazione relativa alle quantità dei prodotti venduti per venditori, pur essendo derivabile).
Quindi la matrice risultante sarà l'interno della seguente tabella:
[TABLE="class: grid, width: 500"]
[TR]
[TD][/TD]
[TD]V_1[/TD]
[TD]V_2[/TD]
[TD]V_3[/TD]
[TD]V_4[/TD]
[TD]V_5[/TD]
[TD]TOT[/TD]
[/TR]
[TR]
[TD]P_1[/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[/TR]
[TR]
[TD]P_2[/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[/TR]
[TR]
[TD]P_3[/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[/TR]
[TR]
[TD]P_4[/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[/TR]
[TR]
[TD]TOT[/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD][/TD]
[TD]
NULL[/TD]
[/TR]
[/TABLE]
Come puoi notare sorgerebbe anche un altro problema (seppur di poco conto): l'ultima cella non viene usata (volendo potresti fare il totale complessivo, ma imho è abb inutile).
Questo è più o meno quello che farei io per non sviare dal testo dell'esercizio :)
Tuttavia per rendere il tutto un po' più comprensibile preferirei inserire i totali in 2 vettori piuttosto che nella matrice stessa.
Venendo al codice:
void printarray(const int vendite[VENDITORI][PRODOTTI],int prod,int vend);
La dichiarazione del metodo non mi piace moltissimo, ovvero tu nel main dichiari già la dimensione della matrice; qua è meglio dichiarare il metodo in questo modo:
Codice:
void printarray(int venditore[][],int prod,int vend);
Il resto dipende da come hai inteso il problema; prova a vedere se con la spiegazione di sopra riesci a farlo funzionare :)
Spero di essermi riuscito a spiegare in maniera comprensibile :D
Ciao,
Matteo.