|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Dec 2005
Messaggi: 135
|
[C++] Scrivere i nomi di una stringa in ordine inverso
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 : Codice:
// 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
|
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Feb 2004
Messaggi: 1454
|
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.
|
|
|
|
|
|
#3 | |
|
Member
Iscritto dal: Dec 2005
Messaggi: 135
|
Quote:
Codice:
cout << "Inserisci la stringa: ";
cin>>A;
|
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Feb 2004
Città: milano
Messaggi: 2148
|
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 Il resto della funzione come sopra....rifai tutto da capo. Ultima modifica di airon : 18-11-2007 alle 20:52. |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Dec 2005
Messaggi: 135
|
Codice:
cin.getline(A,n) ![]() per il fatto di n nn ci pensiamo,conto io ora,facciamo prima funzionare poi si vede 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 ^^ |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jul 2007
Messaggi: 499
|
se non erro getline vuole caratteri non string...
__________________
|
|
|
|
|
|
#7 |
|
Member
Iscritto dal: Dec 2005
Messaggi: 135
|
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 Codice:
// 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
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jul 2007
Messaggi: 499
|
xkè se usi caratteri non puoi prendere stringhe in scambia..
anzichè const string a e string b prendi const char a[] e char b[]
__________________
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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. Codice:
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());
}
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jul 2007
Messaggi: 499
|
Quote:
__________________
|
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Sì
C'è un altro errore: istringstream is(s2); |
|
|
|
|
|
#12 |
|
Member
Iscritto dal: Dec 2005
Messaggi: 135
|
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: Codice:
void scambia(const string &, string &, int); , 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
|
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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); |
|
|
|
|
|
#14 |
|
Member
Iscritto dal: Dec 2005
Messaggi: 135
|
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 Codice:
// 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
Ultima modifica di Alex88na : 29-12-2007 alle 15:24. |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Feb 2004
Città: milano
Messaggi: 2148
|
Quote:
L'errore che ti da il compilatore è perchè hai ancora string nella dichiarazione della funzione mentre nel prototip hai messo giustamente char[] Ultima modifica di airon : 29-12-2007 alle 15:34. |
|
|
|
|
|
|
#16 | ||
|
Member
Iscritto dal: Dec 2005
Messaggi: 135
|
Quote:
Quote:
mi chiede: inserisci stringa: e subito dopo mi stampa il cout iniziale della procedura"sto nella pprocedura" |
||
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Feb 2004
Città: milano
Messaggi: 2148
|
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 |
|
|
|
|
|
#18 | |
|
Member
Iscritto dal: Dec 2005
Messaggi: 135
|
Quote:
thx!! ora xò vado a dormire,domani penso al loop infinito generato |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 22:55.













, e poi credo che come i vettori si possono solamente passare per indirizzo...








