Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Polestar 3 Performance, test drive: comodità e potenza possono convivere
Polestar 3 Performance, test drive: comodità e potenza possono convivere
Abbiamo passato diversi giorni alla guida di Polestar 3, usata in tutti i contesti. Come auto di tutti i giorni è comodissima, ma se si libera tutta la potenza è stupefacente
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
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


Polestar 3 Performance, test drive: comodità e potenza possono convivere Polestar 3 Performance, test drive: comodit&agra...
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
ESA: rilevati 40 mila asteroidi vicino a...
La batteria salva fabbriche di EQORE ott...
SpaceX Starship: iniziati i test della t...
Datacenter IA nello spazio entro 5 anni,...
Telescopio spaziale James Webb: rilevato...
Ericsson Mobility Report: nel 2025 il 5G...
PLAI DEMO DAY: si chiude il secondo cicl...
Google rilascia Nano Banana Pro: il nuov...
ChatGPT si rinnova ancora: disponibile l...
Ring lancia super sconti di Black Friday...
Black Friday 2025: 450 euro di sconto su...
Tutte le offerte Blink in un unico posto...
OpenAI e Foxconn uniscono le forze per r...
Ricarica delle auto elettriche in 3 minu...
Lucid presenta Gravity Touring, il SUV e...
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: 22:55.


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