Ordinare lettere di una parola

di il
10 risposte

Ordinare lettere di una parola

Salve devo fare un programma abbastanza complesso quindi non vi sto a dire tutta la consegna, però o bisogno di una mano su una parte dell'esercizio:
non so come prendere una stringa e crearne un altra con le lettere della parola messein ordine alfabetico (es. pippo --> ioppp)

ho provato a scrivere questo utilizzando qsort:
int conf(const void *a,const void *b){
	char aa=*(char*)a, bb=*(char*)b;
	return (int)aa-(int)bb;
}

void ordina (serie *a,int i,int len){
	char b[len];
	strcpy(b,a[i].s);
	qsort(b,len,sizeof(char),conf);
	printf("    %s\n",b);
	a[i].o=malloc(len*sizeof(char));
	strcpy(a[i].o,b);
}
la stringa "a.s" fa parte di una struct e "a.o" sarebbe l'altro elemento della struct dove mettere le lettere in ordine.
Il programma però mi da una stringa vuota perche?

10 Risposte

  • Re: Ordinare lettere di una parola

    Ti consiglio di rivedere il prototipo della funzione: dovresti pensare ad una funzione "general-purpose" che riceve due stringhe, una per l'input e una per l'output, e la dimensione allocata (o la lunghezza della stringa di input) per queste due stringhe, come
    int ordinalettere( char *in, char *out, int len)
    {
    //...
    	strcpy( out, in );// <-- questo solo per test! 
    	return 1;
    }
    Con un funzione di questo tipo ti puoi concentrare sul risolvere il problema dell'ordinamento, predisponendo un main() apposito per il test, es.:
    {
    	char strin[80];
    	char strout[80];
    	
    	strcpy(strin, "pippo");
    	ordinalettere( strin, strout, strlen(strin));
    	printf( "risultato %s\n", strout );
    	
    	// ...
    }
    A questo devi solo implementare la ordinalettere e a questo proposito:: devi proprio usare qsort? Guarda che ti bastano due for...
  • Re: Ordinare lettere di una parola

    Quello che ho postato è solo la parte dell'ordinamento il programma è più complesso...quello che mi hai scritto penso sia la stessa cosa che ho fatto io cioè "isolare" la procedura di ordinamento...per il fatto del qsort o due for siccome è un programma di algoritmica preferisco fare una procedura teta(nlogn) che una teta(n^2) alla fine devo fare un programma efficiente e non che funzioni e basta...quindi volevo sapere come poterlo fare con qsort
  • Re: Ordinare lettere di una parola

    Vedi innanzi tutto questo thread per evitare inutili contorsionismi con i cast nella compare UDF, che risultano sicuramente error-prone.

    Sebbene gli stessi Kernighan & Ritchie si dichiarino apertamente poco entusiasti di tale typedef, esso risulta enormemente diffuso in una mole gigantesca di codice C89 (e oltre) del real world e facilita notevolmente la lettura, venendo pertanto privilegiato in numerose coding guides.
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define N 3
    #define MAX_LEN_NAME 50
    
    typedef struct
    {
        char nome[MAX_LEN_NAME + 1];
        char cognome[MAX_LEN_NAME + 1];
        int age;
    } Tpersona;
    
    typedef int (*fptr)(const void*, const void*);
    
    int agecmp(Tpersona *a, Tpersona *b)
    {
        return (a->age - b->age);
    }
    
    int namecmp(Tpersona *a, Tpersona *b)
    {
        return (strcmp(a->cognome, b->cognome));
    }
    
    
    int main(void)
    {
        Tpersona vettore[N];
        int i;
    
        for (i = 0; i < N; i++)
        {
            printf("nome ");
            scanf("%s", vettore[i].nome);
            printf("cognome ");
            scanf("%s", vettore[i].cognome);
            printf("età ");
            scanf("%d", &vettore[i].age);
            printf("------------\n");
        }
    
        qsort(vettore, N, sizeof(Tpersona), (fptr)agecmp);
        for (i = 0; i < N; i++)
        {
            printf("%d: %s %s\n",
                   vettore[i].age,
                   vettore[i].nome,
                   vettore[i].cognome);
        }
        puts("****************************************");
    
        qsort(vettore, N, sizeof(Tpersona), (fptr)namecmp);
        for (i = 0; i < N; i++)
        {
            printf("%s %s, %d\n",
                   vettore[i].cognome,
                   vettore[i].nome,
                   vettore[i].age);
        }
    
        return 0;
    }
    
  • Re: Ordinare lettere di una parola

    Mi permetto di rispondere dopo M.A.W. 1968, a cui chiedo scusa; lo faccio solo per chiudere il mio intervento.
    Invito maffo95 a seguire le indicazione di M.A.W. 1968.
    Quello che ho postato è solo la parte dell'ordinamento il programma è più complesso...
    Proprio perchè è complesso lo devi suddividire in parti indipendenti, altrimenti ottieni spaghetti code.
    per il fatto del qsort o due for siccome è un programma di algoritmica preferisco fare una procedura teta(nlogn) che una teta(n^2) alla fine devo fare un programma efficiente e non che funzioni e basta...
    Intanto fallo con i due for poi quando tutto ti funziona ottimizzi questa parte ma vedrai che... non cambia niente! La parola più lunga che conosco è "precipitevolissimevolmente", 26 lettere, non 1000.
  • Re: Ordinare lettere di una parola

    Scusami M.A.W. 1968 ma il programma che hai scritto non ordina i nomi in ordine di età? Cioè come funziona la procedura qsort bene o male anche se è da poco che la studio penso di aver capito come funziona non capisco come applicarla al problema sopra citato però...
    P.S.
    Il thread che hai inviato non me lo fa aprire

    Per rispondere a candaluar il programma ribadiscono è stato suddiviso in problemi più piccoli per questo l'unico problema è questo...l'input non è una sola parola ma un numero n di parlare e n*26 dove n è un numero superiore a 5000 cambia di tanto
  • Re: Ordinare lettere di una parola

    Per rispondere a candaluar il programma ribadiscono è stato suddiviso in problemi più piccoli per questo l'unico problema è questo...l'input non è una sola parola ma un numero n di parlare e n*26 dove n è un numero superiore a 5000 cambia di tanto
    Permettimi di sottolineare che il numero di parole che ordini non cambia la sostanza: ogni parola è un ordinamento a se stante. Quindi il 5000 non cambia niente dal punto di vista dell'analisi.
    Permettimi inoltre di farti ragionare sul fatto che qsort è più veloce di un bubble sort ma solo perchè il termine di paragone è il numero di confronti; nella pratica potresti accorgerti che fino ad una certa lunghezza di stringa bubble sort è più veloce di qsort, perchè nella pratica la chiamata a funzione (che hai nel qsort e non nei due for) ha un costo...
    Ora probabilmente verrò cacciato da questo forum per le mie eresie quindi è meglio se chiudo qui.
    Buon lavoro!
  • Re: Ordinare lettere di una parola

    Ahahaha ok va bene non sono ancora molto pratico di programazione...comunque rimane il fatto che non so ancora che cosa devo fare ...
  • Re: Ordinare lettere di una parola

    Ho solo riscritto il test facendo ritornare, come da documentazione, -1, 0 o 1.
    Ho anche implementato i "2 for" e ho provato questo programmino con la stringa "precipitevolissimevolmente"... provare per credere!
    In realtà la prova andrebbe fatta con un insieme vario di parole...
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    typedef int (*compfn)(const void*, const void*);
    
    int compare(char *pa, char *pb)
    {
    	char a = *(char *)pa;
    	char b = *(char *)pb;
    
    	if ( a < b)
    		return -1;
    	else if (a > b)
    		return 1;
    	else
    		return 0;
    }
    
    void ordina_qsort(char *strin, char *strout)
    {
    	int len = strlen(strin);
    
    	strcpy( strout, strin );
    	qsort((void *) strout, 
    		len,
    		sizeof(char),
    		(compfn)compare );
    }
    
    void ordina_canda(char *strin, char *strout)
    {
    	int len = strlen(strin);
    	int i, j;
    	char c;
    
    	strcpy( strout, strin );
    	for(i=0; i<len; i++)
    	{
    		for(j=i+1;j<len;j++)
    		{
    			if( strout[i] > strout[j] )
    			{
    				c = strout[j];
    				strout[j] = strout[i];
    				strout[i] = c;
    			}
    		}
    	}
    }
    
    void main(void)
    {
    	char strin[80];
    	char strout[80];
    	int i;
    
    	printf( "Ordinamento parole con qsort\n" );	
    
    	for( i=0; i<1000000; i++ )
    	{
    		strcpy( strin, "precipitevolissimevolmente" );
    		ordina_qsort( strin, strout );
    	}
    
    	printf( "strout %s\n", strout );	
    
    	printf( "Ordinamento parole con 2 for\n" );	
    
    	for( i=0; i<1000000; i++ )
    	{
    		strcpy( strin, "precipitevolissimevolmente" );
    		ordina_canda( strin, strout );
    	}
    
    	printf( "strout %s\n", strout );	
    
    	getch();
    }
  • Re: Ordinare lettere di una parola

    Vai proverò con tutti i due metodi e vedrò se il programma andrà...grazie mille lo stesso per avermi dedicato del tempo ed aiutato
  • Re: Ordinare lettere di una parola

    lo stesso
    mi aspettavo un pò più di entusiasmo ho risolto il tuo problema che ricordo era:
    non so come prendere una stringa e crearne un altra con le lettere della parola messein ordine alfabetico (es. pippo --> ioppp)
    fornendoti sia la correzione a quello che hai scritto, sia una versione notevolmente velocizzata (se provi il programmino che ti ho postato capirai) con relativa spiegazione.
    Ad ogni modo, sono felice di averti aiutato. Buon lavoro
Devi accedere o registrarti per scrivere nel forum
10 risposte