|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Dec 2009
Messaggi: 284
|
[C++]Ordinare una matrice secondo questi criteri
Ciao, ho una matrice formata da un numero di righe variabili e da un numero di colonne fisso (5) quindi del tipo [x][5].
Esempio: 999 aaa bbb ccc ddd 333 eee rrr sss ttt 112 www kkk qqq ppp 543 vvv nnn mmm hhh E voglio ordinare le intere righe della matrice secondo la prima colonna, quindi il risultato deve essere: 112 www kkk qqq ppp 333 eee rrr sss ttt 543 vvv nnn mmm hhh 999 aaa bbb ccc ddd Qual' è l'algoritmo che mi permette di farlo? ![]()
__________________
"L' amore è l'unica cosa che possiamo percepire che trascende il tempo e lo spazio." |
![]() |
![]() |
![]() |
#2 |
Junior Member
Iscritto dal: May 2012
Messaggi: 23
|
Ciao, allora la tua domanda mi sembra abbia un problema di fondo...
La matrice che tu hai messo è "mista" nel senso che la prima colonna è fatta da numeri, mentre le altre sono composte da stringhe... Ora non so se tu le hai buttate li a caso, ma come ben sai non è mica possibile dichiarare una matrice di questo tipo... Se invece si tratta di una matrice fatta di soli numeri e da ordinare in base alla prima colonna allora diventa quasi banale ![]() Comunque questa schifezza che ho scritto in C e non in C++ perché non lo conosco per niente bene, fa quasi quel che richiedi, l'unico problema è che non vi è alcun controllo sul numero di parole che si inseriscono dopo il numero, anche se credo vi si possa ovviare facilmente( ma è tardi ![]() Probabilmente esistono modi molto migliori ed eleganti, ma questo è il primo che sono riuscito a buttar giù, visto che la base di dati non permette di ricorrere ad una matrice bidimensionale, utilizzando il tipo stringa per quelle strane sequenze di lettere ed il tipo intero per i numeri davanti... Codice:
#include <stdio.h> #include <stdlib.h> #define A 5 #define MAX_STR 20 struct pippo { int numero; char stringa [MAX_STR]; }; int cmp(void const *a, void const *b); int main() { struct pippo vettore[A]; int i; for(i=0;i<A;i++) { printf("Inserisci la riga %d:\n",(i+1)); scanf("%d",&vettore[i].numero); fgets(vettore[i].stringa,MAX_STR,stdin); } printf("Ecco la pseudomatrice\n"); for(i=0;i<A;i++) { printf("%d ",vettore[i].numero); printf("%s\n",vettore[i].stringa); } qsort(vettore,A,sizeof(struct pippo),cmp); printf("Ordinamento\n\n"); for(i=0;i<A;i++) { printf("%d ",vettore[i].numero); printf("%s\n",vettore[i].stringa); } return 0; } int cmp(void const *a, void const *b) { struct pippo first= *(struct pippo *)a; struct pippo second= *(struct pippo *)b; if(first.numero>second.numero) return 1; if(first.numero<second.numero) return -1; return 0; } Ultima modifica di Teardrop92 : 22-03-2013 alle 02:12. |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
O sono invece tutti campi stringa? O ancora sono tutti campi stringa ma il primo è sempre una "stringa numerica"? Perchè nel primo caso ti conviene realizzare una classe che incorpori i vari campi (quindi un campo numerico e un array di 4 stringhe), nel secondo devi definire un criterio di ordinamento per le stringhe (perchè dire che una stringa è maggiore di un altra stringa non vuol dir nulla se non poni un criterio, tipo l'ordine alfabetico), e nel terzo io tornerei alla prima soluzione. Quale di questi è il tuo caso? |
|
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Dec 2009
Messaggi: 284
|
No no, quella è una matrice di interi, ho messo le lettere per semplicità e solo per rendere l'idea
![]()
__________________
"L' amore è l'unica cosa che possiamo percepire che trascende il tempo e lo spazio." |
![]() |
![]() |
![]() |
#5 | |
Member
Iscritto dal: Dec 2009
Messaggi: 284
|
Quote:
![]() Pensandoci un po' però alla fine la soluzione era banale. Esempio di prima: 999 aaa bbb ccc ddd 333 eee rrr sss ttt 112 www kkk qqq ppp 543 vvv nnn mmm hhh Prendiamo la prima riga, il primo elemento della prima riga è maggiore del primo elemento della seconda riga? Si. Allora scambio tutti gli elementi delle due righe e si viene ad avere una situazione di questo tipo: 333 eee rrr sss ttt 999 aaa bbb ccc ddd 112 www kkk qqq ppp 543 vvv nnn mmm hhh Continuo con tutte le righe della matrice fino ad arrivare all'ultima in cui la matrice risulterà così composta: 112 www kkk qqq ppp 333 eee rrr sss ttt 543 vvv nnn mmm hhh 999 aaa bbb ccc ddd Fare tutto questo in codice risulta una sciocchezza ![]() Grazie comunque dell'aiuto
__________________
"L' amore è l'unica cosa che possiamo percepire che trascende il tempo e lo spazio." |
|
![]() |
![]() |
![]() |
#6 |
Junior Member
Iscritto dal: May 2012
Messaggi: 23
|
Il problema è che non è una matrice quella
![]() Come abbiamo già detto il problema non è ordinare ( io ho usato la qsort che addirittura esiste già in stdlib), ma riuscire a definire quel tuo tipo di dati che non può essere una matrice... contiene stringhe e numeri, mentre una matrice può contenere solo uno di questi tipi di dati ![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:47.