[c#] ordinamento stringhe

Return89
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:)

Risposte
apatriarca
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?

Return89
Non so perchè ho messo il cancelletto (sarà stato l'orario), comunque C ovviamente.

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?

Return89
qualcuno che sappia rispondermi?

apatriarca
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..

Return89
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..

apatriarca
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..

Return89
Quale sarebbe la funzione standard qsort?

apatriarca
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.

Return89
Si ho visto..
Quindi nel mio caso come la dovrei riscrivere con qsort?

apatriarca
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.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.