View Full Version : [C++] Scrivere i nomi di una stringa in ordine inverso
Alex88na
18-11-2007, 17:13
Salve ragazzi, volevo chiedervi una mano su un esercizio(martedì ho la prova intercorso... perciò entro lunedì sera devo riuscire a farlo :buonafortuna: ).
Ecco il testo:
Dati 2 array A e B di caratteri di lunghezza N. L’array A contiene dei nomi separati da uno spazio, l’array B è vuoto. Scrivere una procedura che scriva nell’array B, separati da uno spazio, gli stessi nomi presenti in A ma in ordine inverso.
Esempio:
A=DARIO ALDO CIRO ANNA
B=ANNA CIRO ALDO DARIO
Io ho scritto questo codice ma non capisco già all'inizio perchè non mi legge la stringa :snow :
// invertire l'ordine delle parole di una stringa
#include <iostream>
#include <string>
using namespace std;
void scambia(const string, string, int);
int main()
{
int n;
string A, B;
cout << "\t\tInserisci una stringa e l'avrai con le parole invertirte" << endl;
cout << "\nInserisci la lunghezza della stringa: "; cin >> n;
cout << "Inserisci la stringa: ";
cin >> A;
scambia(A, B, n);
cout << "\nEcco la stringa con l'ordine dele parole invertite"<< B << endl;
system("pause");
}
void scambia(const string A, string B, int n)
{
int j=0, k, z;
cout << "sto nella procedura" << endl;
for(int i=n-1; i>=0; i--)
{
//calcolo lunghezza parola
k=0;
while((A[i]!=' ') && (i!=0))
{
k++;
i++;
}
//se non ci troviamo nella prima posizione inserisci lo spazio
if(i!=0)
B[i]=' ';
//copia la parola nella nuova stringa
j=i; z=0;
while(z<k)
{
B[j]=B[j+z];
j++; z++;
}
} //chiusura for esterno
} //fine procedura
thx :buonafortuna:
onestamente non so come funzioni il tipo string, però dubito che sia un semplice puntatore; quindi penso che prima di tutto dovresti passarlo per riferimento se vuoi modificarlo.
Alex88na
18-11-2007, 18:34
onestamente non so come funzioni il tipo string, però dubito che sia un semplice puntatore; quindi penso che prima di tutto dovresti passarlo per riferimento se vuoi modificarlo.
ho provato e mi sa ke essengo le stringhe dei vettori vengono passate direttamente x indirizzo, ma il problema è che quando devo inserire la stringa:
cout << "Inserisci la stringa: ";
cin>>A;
non mi chiede nulla:eek: , va avanti da solo e va nella procedura :(
Attento che il cin termina l'estrazione quando becca un qualsiasi char invisibile quindi anche spazio...
Riguardo al problema io credo che N sia la lunghezza massima possibile e che non debba essere chiesta in input. Anche perchè ogni volta che vado ad inserire le stringhe, devo ogni volta contarmi io i caratteri a video??
Definisci N
Ti crei dei vettori di lunghezza N
e poi puoi usare cin.getline
La funzione scambia è cannata. Il ciclo for è sballato...parti da fine stringa e con l'indice vai indietro ma poi all'interno del for aumenti i :eek:
Il resto della funzione come sopra....rifai tutto da capo.
Alex88na
18-11-2007, 20:55
cin.getline(A,n)
mi dà qst errore
http://img66.imageshack.us/img66/3412/immaginebk9.jpg
per il fatto di n nn ci pensiamo,conto io ora,facciamo prima funzionare poi si vede :)
La funzione scambia è cannata. Il ciclo for è sballato...parti da fine stringa e con l'indice vai indietro ma poi all'interno del for aumenti i :eek:
Il resto della funzione come sopra....rifai tutto da capo.
dove vedi ke aumento la i? cmq mi sn dimenticato di cambiare il valore di i alla fine del for,quindi devo usare un while, ora coreggo xò se nn si risolve il problema di cin.geline nn si può andare avanti ^^
marko.fatto
18-11-2007, 21:03
se non erro getline vuole caratteri non string...
Alex88na
18-11-2007, 21:56
se non erro getline vuole caratteri non string...
ecco con il vettore di char(ho modificato cn un while la procedura), mi dà qst errore:
In function 'main':
[Link error]undefined reference to 'scambia::string const&, std::string&,int)'
id returned 1 exit status
// invertire l'ordine delle parole di una stringa
#include <iostream>
#include <string>
using namespace std;
void scambia(const string , string , int);
using namespace std;
int main()
{
int n;
string A, B;
cout << "\t\tInserisci una stringa e l'avrai con le parole invertirte" << endl;
cout << "\nInserisci la lunghezza della stringa: "; cin >> n;
cout << "Inserisci la stringa: ";
cin.getline(A, n);
cout << "Ecco la stringa inserita: " << A;
scambia(A, B, n);
cout << "\nEcco la stringa con l'ordine delle parole invertite"<< B << endl;
system("pause");
}
void scambia(const string A, string B, int n)
{
int j=0, k, z, i=n-1;
cout << "\nsto nella procedura" << endl;
while(i>=0)
{
//calcolo lunghezza parola
k=0;
while((A[i]!=' ') && (i!=0))
{
k++;
i++;
}
//se non ci troviamo nella prima posizione inserisci lo spazio
if(i!=0)
B[i]=' ';
//copia la parola nella nuova stringa
j=i; z=0;
while(z<k)
{
B[j]=B[j+z];
j++; z++;
}
i-=k;
} //chiusura for esterno
} //fine procedura
marko.fatto
18-11-2007, 22:25
xkè se usi caratteri non puoi prendere stringhe in scambia..
anzichè const string a e string b prendi const char a[] e char b[]
Per getline:
string str;
getline(cin, str);
Le string sono oggetti, quindi ti devi passarlo per riferimento in modo che ritorni al chiamante.
La lunghezza della stringa non la devi prendere in input, le string servono proprio per evitare questi problemi ;)
Ti dico come la farei, ma suppongo che non vada bene a te, perché mi immagino che tu debba operare con gli elementi della stringa.
void scambia(const string s, string &ret)
{
string s2 = s;
reverse(s2.begin(). s2.end());
istringstream is(s);
while(!is.fail())
{
string tmp;
is >> tmp;
reverse(tmp.begin(), tmp.end());
ret.append(tmp);
ret.append(1, ' ');
}
ret.erase(ret.end());
}
marko.fatto
18-11-2007, 22:35
Per getline:
string str;
getline(cin, str);
Le string sono oggetti, quindi ti devi passarlo per riferimento in modo che ritorni al chiamante.
La lunghezza della stringa non la devi prendere in input, le string servono proprio per evitare questi problemi ;)
Ti dico come la farei, ma suppongo che non vada bene a te, perché mi immagino che tu debba operare con gli elementi della stringa.
void scambia(const string s, string &ret)
{
string s2 = s;
reverse(s2.begin(). s2.end());
istringstream is(s);
while(!is.fail())
{
string tmp;
is >> tmp;
reverse(tmp.begin(), tmp.end());
ret.append(tmp);
ret.append(1, ' ');
}
ret.erase(ret.end());
}
quello doveva essere una virgola?
Sì ;) Non l'ho compilato il codice :D
C'è un altro errore:
istringstream is(s2);
Alex88na
18-11-2007, 22:40
nel testo mi dice di avere N in ingresso :(
cmq si devo operare cn gli elementi, di preciso sai dirmi xkè mi dà quell'errore e cs devo modificare?
se metto come dici tu per poter passare le stringhe x riferimento:
void scambia(const string &, string &, int);
mi dà un'altra marea di errori :mbe: , e poi credo che come i vettori si possono solamente passare per indirizzo...
sono andato a veder ein un altro esercizio e nel prototipo di funzione ho così:
void stampa(const float [], const string [], int);
quindi string vuole le parentesi quadre....peccato che se le vado a mettere in qst programma mi escono altri mille errori :doh:
Mmmmhhhh...non è che stai mescolando un po' di cose ?
Il secondo string va passato per riferimento se vuoi che possa tornare al chiamante modificato.
Le string non sono vettori...sono oggetti.
Se i progetto ti chiede di inserire n allora devi probabilmente non usare string, ma usare i vettori di char ;)
E quindi a quel punto avrebbe senso questo:
char *s = new char[n];
cin.getline(s, n);
Alex88na
18-11-2007, 23:23
ecco cn i char,stava fatto prima,errore:
In function 'main':
[Link error]undefined reference to 'scambia::string const&, std::string&,int)'
id returned 1 exit status
// invertire l'ordine delle parole di una stringa
#include <iostream>
#define max_vet 500
void scambia(const char [], char [], int);
using namespace std;
int main()
{
int n;
char A[max_vet], B[max_vet];
cout << "\t\tInserisci una stringa e l'avrai con le parole invertirte" << endl;
cout << "\nInserisci la lunghezza della stringa: "; cin >> n;
cout << "Inserisci la stringa: "; cin.getline(A, n);
scambia(A, B, n);
cout << "\nEcco la stringa con l'ordine delle parole invertite"<< B << endl;
system("pause");
}
void scambia(const string A, string B, int n)
{
int j=0, k, z, i=n-1;
cout << "sto nella procedura" << endl;
while(i>=0)
{
//calcolo lunghezza parola
k=0;
while((A[i]!=' ') && (i!=0))
{
k++;
i++;
}
//se non ci troviamo nella prima posizione inserisci lo spazio
if(i!=0)
B[i]=' ';
//copia la parola nella nuova stringa
j=i; z=0;
while(z<k)
{
B[j]=B[j+z];
j++; z++;
}
i-=k;
} //chiusura for esterno
} //fine procedura
ecco cn i char,stava fatto prima,errore:
In function 'main':
[Link error]undefined reference to 'scambia::string const&, std::string&,int)'
id returned 1 exit status
// invertire l'ordine delle parole di una stringa
#include <iostream>
#define max_vet 500
void scambia(const char [], char [], int);
using namespace std;
int main()
{
int n;
char A[max_vet], B[max_vet];
cout << "\t\tInserisci una stringa e l'avrai con le parole invertirte" << endl;
cout << "\nInserisci la lunghezza della stringa: "; cin >> n;
cout << "Inserisci la stringa: "; cin.getline(A, n);
scambia(A, B, n);
cout << "\nEcco la stringa con l'ordine delle parole invertite"<< B << endl;
cout << "Programma sviluppato e realizzato da pippo e pluto" << endl;
system("pause");
}
void scambia(const string A, string B, int n)
{
int j=0, k, z, i=n-1;
cout << "sto nella procedura" << endl;
while(i>=0)
{
//calcolo lunghezza parola
k=0;
while((A[i]!=' ') && (i!=0))
{
k++;
i++;
}
//se non ci troviamo nella prima posizione inserisci lo spazio
if(i!=0)
B[i]=' ';
//copia la parola nella nuova stringa
j=i; z=0;
while(z<k)
{
B[j]=B[j+z];
j++; z++;
}
i-=k;
} //chiusura for esterno
} //fine procedura
Ti ho sottolineato cioò che non va...intendevo quell'incremento di i, entri in un loop infinito.
L'errore che ti da il compilatore è perchè hai ancora string nella dichiarazione della funzione mentre nel prototip hai messo giustamente char[]
Alex88na
18-11-2007, 23:59
Ti ho sottolineato cioò che non va...intendevo quell'incremento di i, entri in un loop infinito.
si ora ho notato ke poi io la incremento..ok non ci pensiamo x il momento
L'errore che ti da il compilatore è perchè hai ancora string nella dichiarazione della funzione mentre nel prototip hai messo giustamente char[]
ho modificato,me lo compila ma non mi legge la stringa :muro:
mi chiede: inserisci stringa: e subito dopo mi stampa il cout iniziale della procedura"sto nella pprocedura" :(
Il problema nasce dal fatto che cin mantiene in memoria il \n quindi è come se nell'istruzione successiva (in questo caso cin.getline()) nell'immettere la stringa facessi un invio.
Dopo il cin >> n;
metti
cin.ignore(); e magicamente dovrebbe andare ;)
Alex88na
19-11-2007, 00:37
Il problema nasce dal fatto che cin mantiene in memoria il \n quindi è come se nell'istruzione successiva (in questo caso cin.getline()) nell'immettere la stringa facessi un invio.
Dopo il cin >> n;
metti
cin.ignore(); e magicamente dovrebbe andare ;)
:eek: :eek: :eek: :eek: :eek: :eek: FUNZIONA:eek: :eek: :eek:
thx!!:D :D :D :D
ora xò vado a dormire,domani penso al loop infinito generato :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.