[C++] Iniziano i primi problemi di percorso!
Allora... come sapete sto iniziando a studiacchiarmi il C++. Giusto ieri, mentre provavo ad utilizzare la struttura condizionale ho provato a fare questo semplice programma:
Ma ecco che sorge il primo problema... Io vorrei che se digito "s" mi stampa la somma, se digito "n" stampi Addio.
Ma indipendentemente da cosa digito, mi stampa entrambi; come mai? Cosa sbaglio?
#include <cstdlib> #include <iostream> using namespace std; int main() { int a; int b; int somma; char risp; cout<<"Inserisci il primo numero"<<endl; cin>>a; cout<<"inserisci il secondo numero"<<endl; cin>>b; cout<<"Effettuare la somma dei numeri? (s/n)"<<endl; cin>>risp; if (risp) 's'; { somma=a+b; cout<<"La somma risulta di:"<<endl; cout<<somma<<endl; if (risp) 'n'; { cout<<"Addio"<<endl; } } system("PAUSE"); return EXIT_SUCCESS; }
Ma ecco che sorge il primo problema... Io vorrei che se digito "s" mi stampa la somma, se digito "n" stampi Addio.
Ma indipendentemente da cosa digito, mi stampa entrambi; come mai? Cosa sbaglio?
Risposte
C'è qualche errore nella struttura degli if. Questo dovrebbe andar bene.
#include <cstdlib> #include <iostream> using namespace std; int main() { int a; int b; int somma; char risp; cout<<"Inserisci il primo numero"<<endl; cin>>a; cout<<"inserisci il secondo numero"<<endl; cin>>b; cout<<"Effettuare la somma dei numeri? (s/n)"<<endl; cin>>risp; if (risp=='s') { somma=a+b; cout<<"La somma risulta di:"<<endl; cout<<somma<<endl; } else if (risp == 'n') cout<<"Addio"<<endl; system("PAUSE"); return EXIT_SUCCESS; }

Si ecco..ora funziona!!!
Grazie mille lorven!!
Grazie mille lorven!!

Bene; hai capito gli errori?
Si, penso di si!! Una domanda però mi sorge: perchè si deve mettere (risp=='s') con due uguali?? Cosa sta ad indicare?
mettere due uguali è un'operazione di comparazione, mettere un solo uguale un'assegnamento 
indi per cui
controlla che risp sia uguale a s
assegna a risp il valore s
chiaro no?

indi per cui
risp=='s'
controlla che risp sia uguale a s
risp='s'
assegna a risp il valore s
chiaro no?

Si adesso è chiaro!!! Grazie
Un'altra domanda..come si dichiara una variabile stringa?
Un'altra domanda..come si dichiara una variabile stringa?
puoi dichiararla
char blabla[n];
char *blabla;
dove n è un numero (usi questo se conosci la lunghezza che avrà o una lunghezza massima), *bla è un vettore di caratteri... questo puoi farlo e disfarlo come vuoi durante il codice... per esempio se vuoi che contenga una stringa di 10 caratteri scriverai;
blabla = (char *)malloc(sizeof(char) * 10);
che equivale a dichiarare all'inizio del codice char blabla[10]; ...
char blabla[n];
char *blabla;
dove n è un numero (usi questo se conosci la lunghezza che avrà o una lunghezza massima), *bla è un vettore di caratteri... questo puoi farlo e disfarlo come vuoi durante il codice... per esempio se vuoi che contenga una stringa di 10 caratteri scriverai;
blabla = (char *)malloc(sizeof(char) * 10);
che equivale a dichiarare all'inizio del codice char blabla[10]; ...
Interessantissimo davvero!! Ma allora che differenza c'è tra: blabla = (char *)malloc(sizeof(char) * 10); e: char blabla[10];??
Insomma se la dichiaro all'inizio è piu comprensibile e piu breve; ma allora quand'è che si usa quella più lunghetta e come si interpreta (malloc)???
Abbì un pò di pazienza sono alle prime armi!!
Insomma se la dichiaro all'inizio è piu comprensibile e piu breve; ma allora quand'è che si usa quella più lunghetta e come si interpreta (malloc)???
Abbì un pò di pazienza sono alle prime armi!!

credo che essendo all'inizio non ti convenga trattare l'allocazione dinamica della memoria. inizia a dichiarare stringhe come vettori di caratteri (metti una dimensione ampiamente maggiore di quella che potrebbe servirti in modo da andare sul sicuro). per le stringhe di lunghezza variabile penso sia meglio trattarle dopo aver conosciuto le classi e avere un'idea di cosa siano le liste a puntatori. tra l'altro mi sembra che "malloc" non sia neanche una funzione del C++... al suo posto opera la funzione "new"
hai pienamente ragione kroldar... ma ho preferito dare una risposta completa piuttosto che una a metà! 
...e si, malloc è del C e non del C++ (solo che io programmo in C, non ci ho pensato subito
) cmq il concetto è identico..,
ah, ricorda una cosa: una stringa va terminata con il carattere '\0' (che è il terminatore di stringa appunto)...

...e si, malloc è del C e non del C++ (solo che io programmo in C, non ci ho pensato subito

ah, ricorda una cosa: una stringa va terminata con il carattere '\0' (che è il terminatore di stringa appunto)...
...anche perchè in C++ nn si lavora con malloc e free ma con new e delete...
appena arrivi alle classi vedrai che il linguaggio te ne mette a disposizione una, chiamata string, che ti permette di manipolarle senza doverti preoccupare di dover allocare tu lo spazio in menoria e di effettuare operazioni di modifica, ricerca e confronto fra stringhe con un solo comando
Idem per i contenitori.
appena arrivi alle classi vedrai che il linguaggio te ne mette a disposizione una, chiamata string, che ti permette di manipolarle senza doverti preoccupare di dover allocare tu lo spazio in menoria e di effettuare operazioni di modifica, ricerca e confronto fra stringhe con un solo comando

Idem per i contenitori.
"groucho":
ah, ricorda una cosa: una stringa va terminata con il carattere '\0' (che è il terminatore di stringa appunto)...
Un esempio?!
@tutti
Grazie dell'aiuto!

Cioè, se definisci le stringhe cn la modalità del C allora una stringa va 'chiusa' col carattere '\0' (è un carattere singolo), altrimenti la macchina nn sa dove finisce.
Viceversa, lavorando col C++, se usi la classe string non devi preoccuparti di nulla, perchè fa tutto lui.
Viceversa, lavorando col C++, se usi la classe string non devi preoccuparti di nulla, perchè fa tutto lui.
Perfetto..Grazie!!!

"groucho":
puoi dichiararla
char blabla[n];
char *blabla;
dove n è un numero (usi questo se conosci la lunghezza che avrà o una lunghezza massima), *bla è un vettore di caratteri... questo puoi farlo e disfarlo come vuoi durante il codice... per esempio se vuoi che contenga una stringa di 10 caratteri scriverai;
blabla = (char *)malloc(sizeof(char) * 10);
che equivale a dichiarare all'inizio del codice char blabla[10]; ...
Ciao a tutti,
c'e' qualche imprecisione.
char *blabla non e' un vettore di caretteri ma un puntatore a carattere.
Potresti anche utilizzarlo come un vettore di caratteri ma non e' questa la sua finalita'.
La sua funzione e' quella di puntare.
Per esempio potrebbe essere utilizzata per risparmiare memoria puntando ad una costante;
Esempio:
int main() { char *stringa; a = ....... b = ....... if(a == b) stringa = "a e b sono uguali"; else stringa = "a e b sono diversi"; cout << stringa }
oppure come parametro di una funzione per modificare quanto e' stato passato.
Suppioniamo che io voglia realizzare una funzione che elimina gli spazi all'interno di una stringa.
int main() { char stringa[80]; strcpy(stringa, "in questa frase non ci saranno spazi"); EliminaSpazi(stringa); }
la funzione EliminaSpazi deve avere come parametro un puntatore a carattere,
int EliminaSpazi(char *buffer);
in modo tale che modificando buffer e come se andassi a modificare direttamente stringa,
perche' buffer lo punta.
Se invece EliminaSpazi non avesse come parametro un puntatore a carattere
int EliminaSpazi(char buffer[80])
tutte le modifiche su buffer non avranno effetto su stringa.
A presto,
Eugenio
Eugenio potresti spiegarmi meglio questa cosa in C++ per eliminare gli spazi in una stringa? Passo per passo, dalla dichiarazione alla fine!
Grazie
Grazie
Cioe' vuoi capire meglio, la differenza tra le due dichiarazioni, oppure come realizzare una funzione che elimina gli spazi da una stringa ?
Eugenio
Eugenio
Entrambe le cose!!
Va bene.
dammi 10 minuti che preparo.
dammi 10 minuti che preparo.
Ecco fatto!
Ho preparato un programmino a volo e l'ho compilato.
Non guardare il fatto che ho usato printf invece di cout, per le cose veloci mi trovo piu' comodo.
Quello che volevo farti notare e' questo:
il parametro buffer della funzione eliminaspazi e' un puntatore a carattere,
cioe' punta ad una variabile stringa. Questo significa che quando modifico
i dati del puntatore, modifico direttamente i dati della variabile a cui sta puntando.
Nel nostro caso, quando richiamo la funzione eliminaspazi nel main passando come parametro la variabile "stringa", e' come se avessi detto a buffer di puntare a stringa.
Se il parametro di eliminaspazi fosse stato char buffer[MAX], quando richiamo la funzione nel main, sccede che copio il contenuto di stringa in buffer, e tutte le modifiche eseguo su buffer nella funzione rimangono li.
Cioe' buffer sara' la stringa senza spazi e stringa rimane invariata.
Ok ?
Eugenio
Ho preparato un programmino a volo e l'ho compilato.
#include <conio.h> #include <stdio.h> #include <stdlib.h> // lunghezza massima della stringa #define MAX 81 // Carattere spazio #define SPACE ' ' // Carattere di fine stringa #define NIL '\0' // prototipo della funzione void eliminaspazi(char *); void main(void) { char stringa[MAX]; clrscr(); printf("Immettere una stringa (max.80 caratteri):\n"); gets(stringa); eliminaspazi(stringa); printf("\n\n Stringa senza spazi:\n%s", stringa); getch(); } void eliminaspazi(char * buffer) { int i, j; for(i = 0; buffer[i] != NIL; i++) if(buffer[i] == SPACE) { // se trovo uno spazio eseguo lo shift // a sinistra di tutti i caratteri successivi // compreso il NIL for(j = i + 1; buffer[j-1] != NIL; j++) buffer[j - 1] = buffer[j]; } }
Non guardare il fatto che ho usato printf invece di cout, per le cose veloci mi trovo piu' comodo.
Quello che volevo farti notare e' questo:
il parametro buffer della funzione eliminaspazi e' un puntatore a carattere,
cioe' punta ad una variabile stringa. Questo significa che quando modifico
i dati del puntatore, modifico direttamente i dati della variabile a cui sta puntando.
Nel nostro caso, quando richiamo la funzione eliminaspazi nel main passando come parametro la variabile "stringa", e' come se avessi detto a buffer di puntare a stringa.
Se il parametro di eliminaspazi fosse stato char buffer[MAX], quando richiamo la funzione nel main, sccede che copio il contenuto di stringa in buffer, e tutte le modifiche eseguo su buffer nella funzione rimangono li.
Cioe' buffer sara' la stringa senza spazi e stringa rimane invariata.
Ok ?
Eugenio