Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 18-11-2007, 17:13   #1
Alex88na
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
thx :buonafortuna:
Alex88na è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2007, 17:57   #2
Furla
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.
Furla è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2007, 18:34   #3
Alex88na
Member
 
Iscritto dal: Dec 2005
Messaggi: 135
Quote:
Originariamente inviato da Furla Guarda i messaggi
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:
Codice:
     
     cout << "Inserisci la stringa: "; 
     cin>>A;
non mi chiede nulla , va avanti da solo e va nella procedura
Alex88na è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2007, 19:39   #4
airon
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 19:52.
airon è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2007, 20:55   #5
Alex88na
Member
 
Iscritto dal: Dec 2005
Messaggi: 135
Codice:
cin.getline(A,n)
mi dà qst errore



per il fatto di n nn ci pensiamo,conto io ora,facciamo prima funzionare poi si vede

Quote:
Originariamente inviato da airon Guarda i messaggi
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.
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 ^^
Alex88na è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2007, 21:03   #6
marko.fatto
Senior Member
 
L'Avatar di marko.fatto
 
Iscritto dal: Jul 2007
Messaggi: 499
se non erro getline vuole caratteri non string...
__________________
marko.fatto è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2007, 21:56   #7
Alex88na
Member
 
Iscritto dal: Dec 2005
Messaggi: 135
Quote:
Originariamente inviato da marko.fatto Guarda i messaggi
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

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
Alex88na è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2007, 22:25   #8
marko.fatto
Senior Member
 
L'Avatar di marko.fatto
 
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[]
__________________
marko.fatto è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2007, 22:26   #9
cionci
Senior Member
 
L'Avatar di cionci
 
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());  
}
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2007, 22:35   #10
marko.fatto
Senior Member
 
L'Avatar di marko.fatto
 
Iscritto dal: Jul 2007
Messaggi: 499
Quote:
Originariamente inviato da cionci Guarda i messaggi
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());  
}
quello doveva essere una virgola?
__________________
marko.fatto è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2007, 22:39   #11
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Non l'ho compilato il codice
C'è un altro errore:

istringstream is(s2);
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2007, 22:40   #12
Alex88na
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);
mi dà un'altra marea di errori , 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
Alex88na è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2007, 22:46   #13
cionci
Senior Member
 
L'Avatar di cionci
 
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);
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2007, 23:23   #14
Alex88na
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 14:24.
Alex88na è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2007, 23:40   #15
airon
Senior Member
 
Iscritto dal: Feb 2004
Città: milano
Messaggi: 2148
Quote:
Originariamente inviato da Alex88na Guarda i messaggi
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;

     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[]

Ultima modifica di airon : 29-12-2007 alle 14:34.
airon è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2007, 23:59   #16
Alex88na
Member
 
Iscritto dal: Dec 2005
Messaggi: 135
Quote:
Originariamente inviato da airon Guarda i messaggi
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

Quote:
Originariamente inviato da airon Guarda i messaggi
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

mi chiede: inserisci stringa: e subito dopo mi stampa il cout iniziale della procedura"sto nella pprocedura"
Alex88na è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2007, 00:29   #17
airon
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
airon è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2007, 00:37   #18
Alex88na
Member
 
Iscritto dal: Dec 2005
Messaggi: 135
Quote:
Originariamente inviato da airon Guarda i messaggi
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
FUNZIONA
thx!!

ora xò vado a dormire,domani penso al loop infinito generato
Alex88na è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Meta potrebbe aver mostrato in anticipo ...
Bicicletta elettrica L26 a 474,05€: e-bi...
NVIDIA RTX PRO 5500 Blackwell: 84 GB di ...
Sei alla ricerca di un buon gruppo di co...
Blizzard annuncia un nuovo StarCraft: la...
Ecobonus al 65%: il governo valuta il ri...
Biscotti fatti con bottiglie di plastica...
SIHOO B100 a 161€ e B100 Pro a 209€: sed...
ClickFix dilaga: un finto captcha e un c...
HP Envy 6520e a 63€: stampante multifunz...
Diablo diventa una serie animata Netflix...
iPhone Duo porterà Apple al 25% d...
TSMC brucia le tappe: la produzione dei ...
Lexar ARES, SSD da 1TB a 156,74€: PCIe G...
Un'altra novità in arrivo da Samsung: ec...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 10:43.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v