Visualizza versione completa : C++: ordinare le parole
Qualcuno può suggerirmi un/il codice per far sì che, una volta inserite delle parole, vengano ordinate alfabeticamente?
Il codice per inserire i dati l'ho realizzato e funziona; mi manca quello per l'ordine.
THX!
misterx
13-06-2001, 13.01.47
Originally posted by cnco
Qualcuno può suggerirmi un/il codice per far sì che, una volta inserite delle parole, vengano ordinate alfabeticamente?
Il codice per inserire i dati l'ho realizzato e funziona; mi manca quello per l'ordine.
THX!
conosci i puntatori?
Non posso usare i puntatori (e sennò non stavo molto a preoccuparmi) :)
misterx
14-06-2001, 08.37.53
ci sono un milione di modi x riordinare alfabeticamente una lista di nomi, volendo anche lavorando su un paio di file presenti nell'HD, quindi senza impegnare memoria, ma quali limiti ti hanno imposto?
Compito d'esame di Fondamenti di Informatica 1: in teoria non dovrei sapere nulla di puntatori e salvataggi su file su hd. Il programma deve fare tutto in memoria volatile.
quipo.it
14-06-2001, 20.56.44
Allora: io non conosco ancora il C++ ma con il C me la cavavo egregiamente...
Spulciando nei miei archivi, ho trovato questo: algoritmo quicksort (dovresti conoscerlo...).
Si tratta solo di fare qualche modifica, per portarlo in C++, e adattarlo a stringhe.
Concettualmente però dovrebbe andare benissimo. Poi, visto che si tratta di un ESAME, non
sarebbe il caso che ti sbattessi un po'...? :D :D :D
---------------------------------------
/* Algoritmo di quick sort applicato a numeri interi */
/* Qui si assume che i dati siano già contenuti in un vettore...*/
void qsort (int [], int, int);
int main ()
{ int i, len, vet [] = {15, 33, 22, 445, 9, 0, 2, 5, 7};
len = sizeof(vet)/sizeof(int) - 1;
for (i=0; i<=len; i++) {
printf ("%4d -", vet [i]);
}
printf ("\n");
qsort (vet, 0, len);
for (i=0; i<=len; i++) {
printf ("%4d -", vet [i]);
}
printf ("\n");
return 0;
}
void qsort (int v[], int left, int right)
{ int i, last;
void swap (int v[], int i, int j);
if (left >= right) {
return;
}
swap (v, left, (left+right) / 2);
last = left;
for (i=left+1; i<=right; i++) {
if (v[i] < v[left]) {
swap (v, ++last, i);
}
}
swap (v, left, last);
qsort (v, left, last-1);
qsort (v, last+1, right);
}
void swap (int v[], int i, int j)
{ int temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
----------------------------------------
Etabeta
14-06-2001, 21.31.57
miiiinnnn.........che casino..........cmq io ho cercato fra il mio materiale, e devo dire con dispiacere che non ho trovato nisba che faccia al caso tuo....ovvero senza puntatori o salvataggio su hd......quando hai sto esame?
quipo.it
15-06-2001, 09.20.41
Originally posted by Etabeta
miiiinnnn.........che casino..........
Ma perché?!? A me sembra semplicissimo... E' stato semplicemente applicato l'algoritmo quicksort, che nel caso medio fornisce prestazioni migliori di un algoritmo più stupido, ma non mi sembra nulla di incasinato...
quipo.it
15-06-2001, 12.15.03
Te lo posto di nuovo perché veniva filtrato dai tag vB...
---------------------------------------
/* Algoritmo di quick sort applicato a numeri interi */
/* Qui si assume che i dati siano già contenuti in un vettore...*/
void qsort (int [], int, int);
int main ()
{ int i, len, vet [] = {15, 33, 22, 445, 9, 0, 2, 5, 7};
len = sizeof(vet)/sizeof(int) - 1;
for (k=0; k<=len; k++) {
printf ("%4d -", vet [k]);
}
printf ("\n");
qsort (vet, 0, len);
for (k=0; k<=len; k++) {
printf ("%4d -", vet [k]);
}
printf ("\n");
return 0;
}
void qsort (int v[], int left, int right)
{ int i, last;
void swap (int v[], int i, int j);
if (left >= right) {
return;
}
swap (v, left, (left+right) / 2);
last = left;
for (k=left+1; k<=right; k++) {
if (v[k] < v[left]) {
swap (v, ++last, k);
}
}
swap (v, left, last);
qsort (v, left, last-1);
qsort (v, last+1, right);
}
void swap (int v[], int k, int j)
{ int temp;
temp = v[k];
v[k] = v[j];
v[j] = temp;
}
----------------------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
main()
{
char s[][20]={"ugo","andrea","zippo","ilaria","mirella","luciano","irma",
"elena","anna","rita","paolo","antonio","giovanni"}; /* matrice dei nomi */
char buf[20]; /*buffer temporaneo*/
int x , y;
for (x = 0; x < sizeof(s)/20; x++)
{
for(y = x+1; y < sizeof(s)/20; y++)
{
if ( strcmp(s[x],s[y]) > 0)
{
strcpy(buf,s[x]);
strcpy(s[x],s[y]);
strcpy(s[y],buf);
}
}
printf("%d) %s\n",x,s[x]);
}
}/* fine del main */
se hai dei dubbi chiedi
1)sì, potrei "sbattermi di più" se almeno sapessi da dove iniziare!
2)per Quipo:non è che riesci a cambiarlo in C++?
3)Per Asso:tu nel codice hai già inserito i nomi!! e che database è... ogni volta dovrei andare a mettere mano al codice per inserire nuovi nomi? Cmq mi è utile il ciclo for (dovrebbe essere questa la soluzione).
Mi/vi chiedo una cosa. In base a questo ciclo FOR: abbiamo una x ed una y; inserisco un nome e me lo assegna alla x; inserisco un altro nome e me lo assegna alla y; quando inserisco un terzo nome a cosa me lo assegna? di nuovo alla x? e se sì come fa poi a confrontare i tre nomi?
THX!
:confused:
scusa, ma io avevo pensato che ti serviva capire il principio dell'algoritmo, se devi scrivere un programma che deve accettare dei nomi in ingresso da parte dell'utente, fai prima a scrivere una traccia di ciò che vuoi che faccia il tuo programma.
E' l'idea che stà alla base dell'algoritmo che devi guardare non il programma completo.
Così com'è e in puro C ANSI in modo che tu possa compilarlo senza problemi, con qualsiasi compilatore ed osservarne gli effetti.
Scrivere la parte di codice che ti permette l'inserimento dei nomi a piacere mi sembrava la parte più semplice.
Se hai problemi chiedi pure..
Ciao
e riguarda il ciclo FOR: abbiamo una x ed una y; inserisco un nome e me lo assegna alla x; inserisco un altro nome e me lo assegna alla y; quando inserisco un terzo nome a cosa me lo assegna? di nuovo alla x? e se sì come fa poi a confrontare i tre nomi?
quipo.it
17-06-2001, 11.06.44
Originally posted by cnco
e riguarda il ciclo FOR: abbiamo una x ed una y; inserisco un nome e me lo assegna alla x; inserisco un altro nome e me lo assegna alla y; quando inserisco un terzo nome a cosa me lo assegna? di nuovo alla x? e se sì come fa poi a confrontare i tre nomi?
Non vedi la variabile "buf"...? Secondo te a che serve?
Come poi ti diceva asso, i dati puoi acquisirteli da tastiera, guarda l'algoritmo, non il programma completo!
E poi, se non sai leggere nemmeno programmi così semplici, non è forse il caso di rimandare l'esame a quando ne sai qualcosina di più?
A proposito dell'algotitmo quicksort... è sicuramente più efficiente di quello suggerito da asso, almeno nel caso medio, ma indubbiamente quello di asso è il più semplice che si possa fare, anche se io avrei fatto diversamente il core della funzione... Se ho tempo (non ora) te la posto.
Originally posted by quipo.it
Originally posted by cnco
e riguarda il ciclo FOR: abbiamo una x ed una y; inserisco un nome e me lo assegna alla x; inserisco un altro nome e me lo assegna alla y; quando inserisco un terzo nome a cosa me lo assegna? di nuovo alla x? e se sì come fa poi a confrontare i tre nomi?
Non vedi la variabile "buf"...? Secondo te a che serve?
Come poi ti diceva asso, i dati puoi acquisirteli da tastiera, guarda l'algoritmo, non il programma completo!
E poi, se non sai leggere nemmeno programmi così semplici, non è forse il caso di rimandare l'esame a quando ne sai qualcosina di più?
A proposito dell'algotitmo quicksort... è sicuramente più efficiente di quello suggerito da asso, almeno nel caso medio, ma indubbiamente quello di asso è il più semplice che si possa fare, anche se io avrei fatto diversamente il core della funzione... Se ho tempo (non ora) te la posto.
infatti, come dici tu l'efficenza del sistema da mè proposto è alquanto discutibile, va più che bene se i dati in ingresso sono pochi ma se inserisci ad esempio qualche centinaio di nomi, aspetti parecchio tempo.
Se usi lo stesso principio ma facendo uso dei puntatori, è tutta un'altra cosa.
Ciao
se non so cos'è "buf". Forse non conosci il programma universitario che si studia ma tale variabile non viene insegnata (almeno al primo anno). Non c'è neanche nella Guida al C++ della McGraw Hill. Suppongo stia per "buffer"?!
Non è che è una variabile C e non C++?
che ho scritto una st***zata!
Giustamente "buf" è l'etichetta dell'array, cosa che viene insegnata!!!!
Cmq rileggendo il codice in pratica l'ordine viene eseguito dividendo in due parti il database, sinistra e destra, e poi ordinato?
quipo.it
18-06-2001, 20.45.53
Se parli dell'algoritmo di qs, sì, qualcosa del genere...
A proposito di buf, ti sei risposto da solo... e cmq asso aveva scritto una riga di commento in proposito accanto alla dichiarazione...
Ho riletto anche il mio post sopra... scusa, ero mooolto stanco e un pochino nervosetto, quindi la risposta forse poteva sembrare un po' "tesa"... non ci fare caso. ;)
Allora, ecco il codice che ho realizzato:
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char nome[10][10];
char anno[10][4];
char buf[10];
int x, y;
int menu();
void enter(), report();
int main()
{
int choice;
do {
choice=menu();
switch(choice){
case 0: break;
case 1: enter();
break;
case 2: report();
break;
default: cout<<"Riprovare\n";
break;
}
}while(choice!=0);
return 0;
}
int menu()
{
int choice;
cout<<"0. Esci\n";
cout<<"1. Inserisci dati\n";
cout<<"2. Visualizza dati\n";
cout<<"Scegliere una voce\n";
cin>>choice;
return choice;
}
void enter()
{
for (x=0; x<sizeof(nome)/10; x++) {
cout<<"Inserire Cognome: "<<endl;
cin>>nome[x];
cout<<"Inserire Anno di nascita: "<<endl;
cin>>anno[x];
}
for(x=0; x<sizeof(nome)/10; x++)
{
for(y=x+1; y<sizeof(nome)/10; y++)
{
if(strcmp(nome[x],nome[y])>0)
{
strcpy(buf, nome[x]);
strcpy(nome[x], nome[y]);
strcpy(nome[y], buf);
}
}
}
}
void report()
{
printf("%s", x, nome[x]);
}
Il problema è che alla fine mi visualizza solo un campo e non tutti e dieci.
In più mi fa inserire più dei dieci cognomi per me necessari.
Problema??
nessuno che lo prova???
(S)
quipo.it
24-06-2001, 11.46.08
Originally posted by cnco
nessuno che lo prova???
(S)
Non ho il C++... e domani ho un esame ;)
magomerlinopaolo
29-06-2001, 09.48.57
non so nulla di C++,so soltanto che in delphi sarebbe molto + facile :P:P:P;)
almeno penso...non ho mai fatto un algoritmo del genere!
mo ci provo,anche se non ti interessa il delphi immagino...sigh come sono razzisti all' università ;)
Purtroppo non mi serve + la soluzione. L'esame ormai è andato: ho superato lo scritto ma non l'orale: volete sapere come?
Sono andato al computer per l'esame e ho trovato sull'hd il codice dell'esercizio (trovare la media e gli scarti di una lista di vettori) del precedente studente. Ho copiato ed incollato; un solo errore (peraltro non pregiudicante l'esecuzione del prog.): un'array scambiato per valore anziché per riferimento. All'orale mi è stato chiesto di rifare l'esercizio :( .
magomerlinopaolo
29-06-2001, 21.35.55
ma fai ingegneria informatica vero?
ora non più. spero di riuscire a passare a scienze della comunicazione. ;)
vBulletin® v3.8.6, Copyright ©2000-2025, Jelsoft Enterprises Ltd.