Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Roborock Qrevo Curv 2 Flow: ora lava con un rullo
Qrevo Curv 2 Flow è l'ultima novità di casa Roborock per la pulizia di casa: un robot completo, forte di un sistema di lavaggio dei pavimenti basato su rullo che si estende a seguire il profilo delle pareti abbinato ad un potente motore di aspirazione con doppia spazzola laterale
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite
Abbiamo guidato per diversi giorni la Alpine A290, la prima elettrica del nuovo corso della marca. Non è solo una Renault 5 sotto steroidi, ha una sua identità e vuole farsi guidare
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile
Abbiamo provato a fondo il nuovo Magic 8 Lite di HONOR, e per farlo siamo volati fino a Marrakech , dove abbiamo testato la resistenza di questo smartphone in ogni condizione possibile ed immaginabile. Il risultato? Uno smartphone praticamente indistruttibile e con un'autonomia davvero ottima. Ma c'è molto altro da sapere su Magic 8 Lite, ve lo raccontiamo in questa recensione completa.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 18-11-2007, 18: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, 18: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, 19: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, 20: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 20:52.
airon è offline   Rispondi citando il messaggio o parte di esso
Old 18-11-2007, 21: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, 22: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, 22: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, 23: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, 23: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, 23: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, 23: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, 23: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, 23: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 19-11-2007, 00: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 15:24.
Alex88na è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2007, 00: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 15:34.
airon è offline   Rispondi citando il messaggio o parte di esso
Old 19-11-2007, 00: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, 01: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, 01: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


Roborock Qrevo Curv 2 Flow: ora lava con un rullo Roborock Qrevo Curv 2 Flow: ora lava con un rull...
Alpine A290 alla prova: un'auto bella che ti fa innamorare, con qualche limite Alpine A290 alla prova: un'auto bella che ti fa ...
Recensione HONOR Magic 8 Lite: lo smartphone indistruttibile e instancabile Recensione HONOR Magic 8 Lite: lo smartphone ind...
Sony WF-1000X M6: le cuffie in-ear di riferimento migliorano ancora Sony WF-1000X M6: le cuffie in-ear di riferiment...
Snowflake porta l'IA dove sono i dati, anche grazie a un accordo con OpenAI Snowflake porta l'IA dove sono i dati, anche gra...
Oracle NetSuite si potenzia con nuove fu...
Musica generata con l'IA: Sony lavora a ...
Cyberpunk 2077 in versione PC su smartph...
BYD si gioca un grosso jolly: pronta Rac...
Samsung annuncia l'arrivo in Italia dei ...
Offerta lancio Pixel 10a: come ottenere ...
Google presenta Pixel 10a: poche le novi...
Caos F1 2026: 14 monoposto senza omologa...
Tesla festeggia il primo Cybercab prodot...
Desktop piccolo e potente? NZXT H2 Flow ...
Polestar spinge sull'acceleratore: arriv...
Nuovo record mondiale nel fotovoltaico: ...
L'ultimo baluardo cade: fine supporto pe...
'Il mondo non ha mai visto nulla di simi...
La Commissione europea mette sotto indag...
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: 20:49.


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