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;
}
}