Newsgroup: it.comp.lang.c++
Titolo: Ordine alfabetico

Ho creato questo programma per l'ordinamento di un array di stringhe
ma non mi funziona nulla, qualcuno può spiegarmi come modificarlo per
cercare di farlo funzionare?
Grazie.
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
int main(){
	char *citta[]={"Palermo", "Roma", "Milano", "Napoli", "Torino",
"Ascoli", "Bari", "Reggio Calabria", "Genova", "Cagliari", "Venezia",
"Trento"};
	char hold[12];
	for (int i=0; i<12; i++)
		cout << citta[i] << endl;
	for (int j=0; j<12; j++)
		if (strcmp(citta[j], citta[j+1])>0){
			hold=strcpy(hold, citta[j]);
			a[j]=strcpy(citta[j], citta[j+1]);
			citta[j+1]=strcpy(citta[j+1], hold);
		}
		for (int y=0; y<12; y++)
			cout << citta[y] << endl;
	return 0;
}

}
dovresti studiare gli algoritmi di sort, troveresti molte sorprese!
cmq, il tuo non funziona per il semplice motivo che dovresti fare piů
passaggi sulla lista, dato che se, ad esempio, hai come ultimo
elemento quello che dovrebbe andare in cima, con il tuo metodo questo
arriverebbe semplicemente al penultimo posto (perché verrebbe preso in
considerazione solo all'ultimo passaggio e verrebbe scambiato con il
penultimo)...
inoltre, per essere precisi: lo scope della variabile i del primo
ciclo for č l'interno dello stesso ciclo, quindi puoi riutilizzare il
nome "i" anche per il secondo ciclo
puoi evitare di prendere il risultato di strcpy, scrivendo
semplicemente strcpy(hold, citta[j]); ecc. e, infine, nella seconda
riga dell'if c'č una variabile di nome a[j] che probabilmente era
citta[j]
infine, non credo di sbagliare nel dire che i char* non possono essere
modificati, dovresti usare dei char[] e quindi definire non un
*char[], bensě un char[][]
-- 
]\/[ad]\/[age (
www.mindreamz.net
)
"Un Maestro insegue semplicemente la sua visione di Eccellenza in
qualunque cosa sta facendo e lascia agli altri decidere se sta 
lavorando o giocando. A lui sembra sempre di fare entrambe." - Anonimo

*char[], bensì un char[][]
hm... char *citta[] definisce un array di puntatori, quindi in realtà
basterebbe semplicemente che tu modifichi i puntatori
se citta[1] deve essere sostituito con citta[2] basta che tu fai
char *pippo = citta[1];
citta[1] = citta[2];
citta[2] = pippo;
perché stai scambiando puntatori a stringa invece che stringhe


 }
E poi questo non e' C++, ma C.  La libreria standard cosa l'hanno
inventata a fare?  Proviamo cosi':
#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <cstring>
using namespace std;
struct compareCharArray
  : public binary_function<const char *, const char *, bool> {
  bool operator () (const char * pc1, const char * pc2) const {
    return strcmp(pc1, pc2) < 0; }
};
int main() {
  const char *citta[] = { "Palermo", "Roma", "Milano", "Napoli", "Torino",    
                          "Ascoli", "Bari", "Reggio Calabria", "Genova",
                          "Cagliari", "Venezia", "Trento" };
  const int nCitta = sizeof(citta) / sizeof(citta[0]);
  copy(citta, citta+nCitta, ostream_iterator<const char *>(cout, "\n"));
  cout << "-------------------\n";
  sort(citta, citta+nCitta, compareCharArray());
  copy(citta, citta+nCitta, ostream_iterator<const char *>(cout, "\n"));
}
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy              ROT13: 
ybe...@cq.vasa.vg

 }
Sono ancora all'inizio quello che mi hai postato tu per me è arabo, ho
provato a modificare il programma che avevo scritto come ti allego
sotto. Il compilatore me lo compila, però al momento dell'esecuzione
mi viene dato un errore dovesbaglio?
Grazie in ogni caso per la risposta.
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
int main(){
 char *citta[]={"Palermo", "Roma", "Milano", "Napoli",
"Torino","Ascoli", "Bari", "Reggio Calabria", "Genova", "Cagliari",
"Venezia","Trento"};
 char hold[20];
 for (int i=0; i<12; i++)
 cout << citta[i] << endl;
 for (int j=0; j<12; j++)
 if (strcmp(citta[j], citta[j+1])>0){
	 for (int k=0; citta[j][k]!='\0'; k++){
		 hold[k]=citta[j][k];
	 }
	 for (int t=0; citta[j+1][t]!='\0'; t++){
		 citta[j][t]=citta[j+1][t];
	 }
	 for (int g=0; hold[g]!='\0'; g++){
		 citta[j+1][g]=hold[g];


  }
        Mauro

 }
perché hai fatto così?!? per fare questo ci sono le funzioni strcpy,
che hai giustamente utilizzato nella precedente versione
il problema è che NON SI POSSONO MODIFICARE le stringhe che dichiari
con char*, quando tu dichiari una char*, il compilatore alloca la
memoria per la stringa e ce la mette e a te dà il puntatore: è questo
puntatore ciò che devi scambiare, la stringa NON PUO' essere
modificata
