Salve a tutti, avrei sto avendo un problema nello stendere un algoritmo che stampi a schermo una matrice sparsa di "rig" righe e "col" colonne, che contenga "valori" valori non nulli. E' richiesto che la stampa venga eseguita tramite delle triple costituite dai dati "riga,colonna,valore". Per fare un esempio la seguente matrice (che è anche come dovrei stampare la matrice sul programma, senza parentesi quadre):
[10 0 0]
[ 0 0 7]
[ 0 0 0]
avrà una rappresentazione in un array di triple
A[0]=3,3,2
A[1]=1,1,10
A[2]=2,3,7
Dove il primo elemento dell'array A[0] contiene il numero di righe, di colonne e di valori non nulli. I restanti elementi indicano in quale riga e in quale colonna si trova quale valore non nullo.
Il mio ragionamento è il seguente: faccio un doppio ciclo for (usando come indici i,j) e utilizzo un terzo indice k inizializzato ad 1. Il doppio for scorrerà tutti gli elementi della matrice e controllerà ad ogni passaggio se in A[k] trovo esattamente quella riga e quella colonna. Se è così stamperà A[k].valore e incrementerà k, in caso contrario stamperà zero. In aggiunta ogni volta che si stampa un valore k viene incrementato solo se è <= del numero dei valori non nulli. Infine se il secondo indice j (quello delle colonne) raggiunge effettivamente il numero delle colonne, oltre a stampare lo zero va anche accapo. Come ragionamento mi sembra giusto, ma quando vado a compilare escono meno numeri di quanti ne dovrei vedere e in ordine sballato. Scusatemi se sono stato prolisso ma ho preferito spiegare bene prima di chiedere aiuto. Questo è il codice, se sapeste aiutarmi mi dareste un aiuto tremendo, davvero. Grazie e buona serata.
codice:#include <stdio.h>#include <stdlib.h> #define MAX_COL 200 #define MAX_RIG 200 #define MAX_VALORI 200*200 int main() { int rig=(MAX_COL+1), col=(MAX_COL+1),valori=(MAX_VALORI+1),i, j, k=1, temp, choice; typedef struct { int riga; int colonna; int valore; }matrice; printf("Software di gestione per matrici sparse"); while(rig>MAX_RIG) { printf("\nQuante righe ha la tua matrice? (valore massimo: 200)\n"); scanf("%d",&rig); if(rig>MAX_RIG) {printf("\nvalore non ammesso\n");} } while(col>MAX_COL) { printf("\nQuante colonne ha la tua matrice? (valore massimo: 200)\n"); scanf("%d",&col); if(col>MAX_COL) {printf("\nvalore non ammesso\n");} } while(valori>(rig*col)) { printf("quanti valori non nulli ha la tua matrice? (valore massimo: 200)\n"); scanf("%d",&valori); if(col>(rig*col)) {printf("\nvalore non ammesso\n");} } matrice A[valori+1]; A[0].riga=rig; A[0].colonna=col; A[0].valore=valori; printf("\nInserisci riga, colonna e valore, volta per volta e premi invio dopo ogni dato immesso:\n"); for(i=1;i<=valori;i++) { temp=MAX_RIG+1; while(temp>rig) { printf("\n riga: "); scanf("%d",&temp); A[i].riga=temp; if(temp>rig) {printf("\nil valore non e' valido\n");} }temp=MAX_COL+1; while(temp>col) { printf("\n colonna: "); scanf("%d",&temp); A[i].colonna=temp; if(temp>col) {printf("\nil valore non e' valido\n");} } printf("\n valore: "); scanf("%d",&temp); A[i].valore=temp; printf("\n"); } printf(" 1: visualizzazione 2: ricerca 3) trasposizione\n "); scanf("%d",&choice); printf("\n"); switch(choice) { case(1): for(i=1;i<=(rig);i++) { for(j=1;j<=(col);j++) { if((A[k].riga==i)&&(A[k].colonna==j)&&(k<=valori)) { printf(" %d ",A[k].valore); {k++;} } else { printf(" 0 "); if(j=col){printf("\n");} } } } break; } }

Rispondi quotando
