C'č un esercizio in C che non mi riesce del tutto, č questo:
Il problema č che il mio codice stampa l'output ma lo restituisce in anagramma cioč:codice:Scrivere un programma che legga da tastiera una sequenza A di N stringhe di lunghezza variabile. L'anagramma principale di una stringa S e l'anagram- ma di S ottenuto ordinando i suoi simboli individualmente. Ad esempio, l'anagramma principale di abracadabra e aaaaabbcdrr. Notare che l'ana- gramma principale di una stringa e unico e che stringhe diverse possono avere lo stesso anagramma principale. Il programma deve raggruppare le stringhe di A aventi lo stesso anagram- ma principale e restituire le stringhe di ciascun gruppo in ordine lessicogra- co non-decrescente. I gruppi devono essere restituiti in ordine lessicograco non-decrescente del corrispondente anagramma principale. L'input e formattato nel seguente modo. La prima riga contiene la lun- ghezza N della sequenza. Si assuma che N sia maggiore di zero. Le righe successive contengono le N stringhe che compongono la sequenza A, una per riga. Si puo assumere che le stringhe abbiano lunghezza inferiore a 20 caratteri. L'output deve contenere solo e soltanto un gruppo di stringhe per riga. Le stringhe dello stesso gruppo devono essere separate da uno spazio. Esempio Input 7 pluto abra pippo raba baar oppip lupto Output abra baar raba oppip pippo lupto pluto
Il mio codice č:codice:aabr aabr aabr ioppp ioppp lupto lupto
codice:#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAXLEN 1000 char **leggi(int *N){ char **A; scanf("%d", N); int i; A = malloc(sizeof(char*)*(*N)); for(i=0;i<*N;i++){ A[i] = malloc((char)sizeof(MAXLEN)+1); scanf("%s",A[i]); } return A; } char *ordina(char *a){ int i,j,prossimo; for(i=0;i<strlen(a);i++){ prossimo = a[i]; j = i; while((j>0) && (a[j-1]>prossimo)){ a[j] = a[j-1]; j--; } a[j] = prossimo; } return a; } int anagramma( char *s1, char *s2){ int i,min; s1 = ordina(s1); s2 = ordina(s2); if (strlen(s1)<strlen(s2)) min = strlen(s1); else min = strlen(s2); int trovato = 0; for(i=0;i<min && !trovato; i++){ if (s1[i]<s2[i]){ trovato = 1; return -1;} else if (s1[i]==s2[i]) i++; else { trovato = 1; return 1; } } if (trovato == 0) return 0; } int compare(const void *s1, const void *s2){ return anagramma(*(char **)s1,*(char **)s2); } int main(){ int N,i; char **A; A = leggi(&N); qsort(A,N,sizeof(char *),compare); for(i=0;i<N;i++) printf("%s ",A[i]); }

Rispondi quotando