[c#] ordinamento stringhe
Ciao a tutti.
Scrivo perché sto avendo difficoltà nello scrivere un algoritmo per l'ordinamento di stringhe (array).
Pensavo di utilizzare un algoritmo come il quicksort ma il compilatore mi da diversi problemi.
Avete un codice già scritto da voi che risolve questo problema?
Mi serve entro domani perché devo dare ad un amico un programmino che ordina i nomi della sua rubrica. Abbiamo quindi creato la funzione che inizializza 100 elementi di tipo char [20] ma usando due cicli annidati e la funzione strcmp ci da sempre risultati sbagliati.
Vi ringrazio anticipatamente per gli aiuti:)
Scrivo perché sto avendo difficoltà nello scrivere un algoritmo per l'ordinamento di stringhe (array).
Pensavo di utilizzare un algoritmo come il quicksort ma il compilatore mi da diversi problemi.
Avete un codice già scritto da voi che risolve questo problema?
Mi serve entro domani perché devo dare ad un amico un programmino che ordina i nomi della sua rubrica. Abbiamo quindi creato la funzione che inizializza 100 elementi di tipo char [20] ma usando due cicli annidati e la funzione strcmp ci da sempre risultati sbagliati.
Vi ringrazio anticipatamente per gli aiuti:)
Risposte
Puoi usare Array.Sort per ordinare un array. Fornirti una soluzione che sembra incredibilmente scolastico/universitario è invece contro il regolamento. Facci vedere la tua soluzione che non funzione e vedremo di correggertela, ma qui non avrai soluzioni già pronte.
EDIT: Tu parli di C#, ma poi dall'ultima parte sembra che tu stia parlando del C (o al massimo C++). Che linguaggio usate davvero? Che significa che la funzione strcmp vi da sempre risultati sbagliati? Avete provato a usare il debugger per vedere il contenuto di questi array?
EDIT: Tu parli di C#, ma poi dall'ultima parte sembra che tu stia parlando del C (o al massimo C++). Che linguaggio usate davvero? Che significa che la funzione strcmp vi da sempre risultati sbagliati? Avete provato a usare il debugger per vedere il contenuto di questi array?
Non so perchè ho messo il cancelletto (sarà stato l'orario), comunque C ovviamente.
Comunque sia ho risolto adattando l'algoritmo BlubbleSort:
L'unico mio dubbio è nel momento dello scambio: va bene così (scambio semplicemente i valori) oppure devo usare puntatori?
Comunque sia ho risolto adattando l'algoritmo BlubbleSort:
typedef char persona[30]; void BubbleSort(persona *pers,int dim){ int scambio,i,j; char temp[30]; scambio=0; for(j=0;j<dim&&!scambio;j++){ scambio=1; for(i=dim-1;i>j;i--){ if(strcmp(pers[i],pers[i-1])<0){ strcpy(temp,pers[i]); strcpy(pers[i],pers[i-1]); strcpy(pers[i-1],temp); scambio=0; } } } }
L'unico mio dubbio è nel momento dello scambio: va bene così (scambio semplicemente i valori) oppure devo usare puntatori?
qualcuno che sappia rispondermi?
NdM: Utilizza il tag code per mantenere la formattazione. È passata meno di mezza giornata dall'ultima risposta a questa discussione. Devi aspettare almeno 24 ore prima di poter richiedere nuovamente aiuto, anche se mi rendo conto che hai detto che è urgente. Devi renderti conto che le persone di questo forum non sono al tuo servizio e possono avere un lavoro o studiare.
Per come hai definito pers dovrebbe andare bene così comunque. temp andrebbe però essere definito in modo diverso usando il tipo persona. Se infatti decidessi che una persona può avere un nome più lungo potresti incontrare problemi. Che problemi ti da? Potresti postare tutto il codice e indicare almeno un input per cui il risultato in output è sbagliato? Nota che sono al lavoro per ora e non ho provato il codice..
Per come hai definito pers dovrebbe andare bene così comunque. temp andrebbe però essere definito in modo diverso usando il tipo persona. Se infatti decidessi che una persona può avere un nome più lungo potresti incontrare problemi. Che problemi ti da? Potresti postare tutto il codice e indicare almeno un input per cui il risultato in output è sbagliato? Nota che sono al lavoro per ora e non ho provato il codice..
Si, hai perfettamente ragione sul tipo di temp (l'ho impostato con la stessa dimensione di persona ma è più corretto come hai detto tu).
Comunque adesso non mi da nessun problema, scambia ed ordina perfettamente le stringhe. L'unico dubbio era sul fatto di scambiare semplicemente i valori o se devo agire sugli indirizzi (usando quindi i puntatori), come si fa usualmente per scambiare due valori.
Grazie e scusate per l'up irregolare ma ho pochissime ore rimaste..
Comunque adesso non mi da nessun problema, scambia ed ordina perfettamente le stringhe. L'unico dubbio era sul fatto di scambiare semplicemente i valori o se devo agire sugli indirizzi (usando quindi i puntatori), come si fa usualmente per scambiare due valori.
Grazie e scusate per l'up irregolare ma ho pochissime ore rimaste..
Ma stai lavorando su pers come se fosse un array di elementi di tipo persona, per cui di fatto un array di dimensione 30*(numero di persone). È quindi corretto copiare le stringhe in quel modo.. Se avessi voluto usare i puntatori avresti dovuto scrivere il programma diversamente. In effetti è più comune, ma questo modo è perfettamente corretto.
Avresti anche potuto usare la funzione standard qsort..
Avresti anche potuto usare la funzione standard qsort..
Quale sarebbe la funzione standard qsort?
Hai provato a cercare il termine su google? Trovi tantissimi riferimenti ed esempi del suo utilizzo. È una funzione di ordinamento generica nella libreria standard del C.
Si ho visto..
Quindi nel mio caso come la dovrei riscrivere con qsort?
Quindi nel mio caso come la dovrei riscrivere con qsort?
Ma no.. se il tuo ciclo funziona e rispetta i requisiti dell'esercizio non conviene complicarsi la vita usando qualche altra soluzione. Lo dicevo per il futuro, nel caso avessi bisogno di ordinare qualcosa in C, sappi che esiste una funzione standard per farlo.