[C++] Iniziano i primi problemi di percorso!

stellacometa
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:


#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
lorven
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;
}

:-)

stellacometa
Si ecco..ora funziona!!!

Grazie mille lorven!! :D

lorven
Bene; hai capito gli errori?

stellacometa
Si, penso di si!! Una domanda però mi sorge: perchè si deve mettere (risp=='s') con due uguali?? Cosa sta ad indicare?

groucho1
mettere due uguali è un'operazione di comparazione, mettere un solo uguale un'assegnamento :P

indi per cui
risp=='s'

controlla che risp sia uguale a s

risp='s'

assegna a risp il valore s

chiaro no? :)

stellacometa
Si adesso è chiaro!!! Grazie
Un'altra domanda..come si dichiara una variabile stringa?

groucho1
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]; ...

stellacometa
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!! :wink:

Kroldar
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"

groucho1
hai pienamente ragione kroldar... ma ho preferito dare una risposta completa piuttosto che una a metà! :P
...e si, malloc è del C e non del C++ (solo che io programmo in C, non ci ho pensato subito :D) cmq il concetto è identico..,
ah, ricorda una cosa: una stringa va terminata con il carattere '\0' (che è il terminatore di stringa appunto)...

gigilatrottola2
...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.

stellacometa
"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! :wink:

gigilatrottola2
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.

stellacometa
Perfetto..Grazie!!! :D

eugenio.amitrano
"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

stellacometa
Eugenio potresti spiegarmi meglio questa cosa in C++ per eliminare gli spazi in una stringa? Passo per passo, dalla dichiarazione alla fine!

Grazie

eugenio.amitrano
Cioe' vuoi capire meglio, la differenza tra le due dichiarazioni, oppure come realizzare una funzione che elimina gli spazi da una stringa ?

Eugenio

stellacometa
Entrambe le cose!!

eugenio.amitrano
Va bene.
dammi 10 minuti che preparo.

eugenio.amitrano
Ecco fatto!
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

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.