PDA

View Full Version : [C] ordinamento elementi matrice


blindwrite
20-03-2006, 17:40
Devo fare il seguente esercizio: Trasformata di Burrows-Wheeler.

La trasformata di Burrows-Wheeler (BWT) è un algoritmo molto usato per la
compressione dei dati. Implementare la tecnica di codifica.
Bisogna richiedere all'utente una stringa di testo avente una lunghezza massima
MAX_STR (l'utente può inserire anche meno di MAX_STR caratteri) e bisogna generare
tutte le possibili rotazioni della stringa.
Le varie rotazioni così generate, vanno ordinate considerate come stringhe da
ordinare alfabeticamente in una matrice, di cui si stampa a schermo l'ultima
colonna che è la trasformata BWT della stringa iniziale.

In pratica il programma deve:
* Chiedere di inserire una stringa;
* Generare tutte le rotazioni della stringa in una matrice;
* Ordinare alfabeticamente le RIGHE della matrice contenenti le rotazioni;
* Stampare a schermo l'ultima COLONNA della matrice.

Es.:

Inserisci una stringa:
BANANA

Le rotazioni sono:
BANANA
ANANAB
NANABA
ANABAN
NABANA
ABANAN

Matrice stringhe ordinate:
ABANAN
ANABAN
ANANAB
BANANA
NABANA
NANABA

sono arrivato a fare le rotazioni ma adesso non riesco a ordinare la matrice
posto il programma che ho scritto, con l'ordinamento sbagliato.

grazie in anticipo a tutti coloro che mi aiuteranno!!!

cionci
20-03-2006, 19:07
Fare l'ordinamento è abbastanza semplice:

Puoi usare l'aloritmo di ordinamento che vuoi...
La cosa più importante è il confronto:

strcmp(matrice[i], matrice[j])

ritorna un valore > di zero se la stringa i è maggiore della stringa j, un valore minore di zero se la stringa i è minore della stringa j...

Quindi a seconda del valore ritornato da strcmp compi o meno lo scambio degli elementi...

Lo scambio fra stringhe puoi farlo così:

char tempString[N];
strcpy(tempString, matrice[i]);
strcpy(matrice[i], matrice[j]);
strcpy(matrice[j], tempString);

blindwrite
20-03-2006, 21:08
grazie per la risposta, non pensavo che la strcmp confrontasse elementi di una matrice.

ho corretto in questo modo e funziona!


void ordina(char ruotato[][MAX_STR],int a)
{
int i,max,j;
char tempString[MAX_STR];
for(i=0;i<a-1;i++){
for(j=i+1;j<a;j++){
max=strcmp(ruotato[i],ruotato[j]);


if(max==1){
strcpy(tempString, ruotato[i]);
strcpy(ruotato[i], ruotato[j]);
strcpy(ruotato[j], tempString);
}
}
}

stampa(ruotato,a); //richiama funzione per stampare




}

cionci
20-03-2006, 22:47
Infatti non stai ordinando una matrice, ma di fatto un vettore di stringhe...
matrice[i] è una stringa...

Sostituisci max==1 con max > 0...le specifiche dicono che il valore può essere anche magiore di 1...

wingman87
21-03-2006, 19:08
A me non funziona, mi da problemi quando passo la matrice alla funzione, è come se gli passasse qualcos'altro, infatti poi mi stampa "(null)" un po' di volte quando lo eseguo..

wingman87
21-03-2006, 22:02
Ho trovato il problema: io all'inizio avevo messo come dimensione massima della stringa 20 invece di 100 e dopo mi stampava cose senza senso, invece mettendo 100 va tutto bene. Chissà perchè...