Le strutture di controllo del C++, La breve guida di Metal H sul C++ - Capitolo II

« Older   Newer »
  Share  
Metal H
view post Posted on 8/12/2005, 19:31




Ricordo che è possibile riportare quanto scritto qui in altri siti o forum, chi lo fa è però pregato di inserire il mio nick nei riconoscimenti.

Edited by Metal H - 7/1/2008, 19:41
 
Top
Metal H
view post Posted on 10/12/2005, 19:16




Allora, cominciamo!
In C++, TUTTI i programmi seguono una sequenza quando vengono eseguiti. Questa sequenza incomincia dalla prima istruzione del programma, segue una per una le istruizioni nel loro ordine, e poi termina con l'ultima.
Chi programma usando questa regola, programma sfruttando la programmazione procedurale. Il C++ NON è un linguaggio procedurale, ma è orientato agli oggetti, cioè dei "pezzi di codice" che interagiscono tra loro. Comunque, ognuno di questi oggetti segue le regole della programmazione C, il predecessore del C++, ovverossia quella procedurale, quindi è importante conoscerla a fondo.
Bene, ora vedremo come controllare l'ordine delle istruzioni in un programma, con delle semplici strutture.
Ce ne sono sette:
- La struttura procedurale del programma, quella che viene seguita se non è presente nessuna altra struttura
- Le tre strutture di decisione: if, if/else e switch
- Le tre strutture iterative: while, do/while e for

Edited by Metal H - 7/1/2008, 19:43
 
Top
Metal H
view post Posted on 11/12/2005, 15:29




Abbiamo visto sette diversi costrutti: analizziamo ora nello specifico il costrutto di decisione if.
La sintassi del costrutto if è la seguente:
CODICE
if ( condizione )
{
   istruzione 1;
   istruzione 2;
   istruzione n;
}

Come vedete, il costrutto è costituito da una condizione e da un'insieme di n istruzioni, poste tra parentesi graffe.
Queste istruzioni non vengono eseguite in ogni caso, ma SE E SOLO SE la condizione posta tra parentesi tonde è vera.
Ad esempio,
CODICE
if ( 7 < 6 )
{
   cout << "7 < 6";
}

NON visualizza la stringa "7 < 6", perché la condizione 7 < 6 è falsa.
Vediamo allora quali sono le possibili condizioni che si possono porre tra parentesi tonde:
- Il confronto tra due costanti [es. (7 < 6)]
- Il confronto tra due variabili [es. (a < b)]
- Il confronto tra una variabile e una costante, e viceversa [es. (a < 6)]
- Un'operazione [es. (4+1): in questo caso la condizione viene considerata vera se l'intero risultato dell'operazione è diverso da zero]
- Un'istruzione [es. (cout << "ciao"): in questo caso la condizione viene considerata vera se l'istruzione viene eseguita correttamente]
Ricordate, comunque, che in ogni caso non deve essere messo il punto e virgola dopo la codizione, anche in casi come (cout << "ciao"), e nemmeno dopo la parentesi tonda.
CODICE
if ( a < b; )
if ( a < b );

Le righe qui sopra generano infatti errori di sintassi in fase di compilazione.
Allora, penso che a questo punto abbiate ben capito come funziona if, ma rimane un problema: come effettuare un confronto nella condizione?
Risposta semplice: il C++ mette a disposizione 6 operatori di confronto, e sono (quasi) tutto ciò di cui avete bisogno per costruire le vostre condizioni nei costrutti di decisione.

Eccoli:
== (è uguale a)
!= (è diverso da)
< (è minore di)
> (è maggiore di)
<= (è minore o uguale a)
>= (è maggiore o uguale a)

Fate attenzione a non confondere = con ==.
Infatti se scrivete
CODICE
if ( vincita = 2 )
{
   cout << "Bravo, hai vinto!\n";
}

con l'intenzione di confrontare la variabile vincita con la costante numerica 2, commettete un errore logico. Infatti, a = 2 è un assegnamento, e rientra nella categoria delle operazioni, che risultano vere su il loro risultato è diverso da zero. In questo caso, quindi, la variabile vincita verrà alterata e risultarà uguale a 2, e l'intera espressione darà un risultato (2) diverso da zero, quindi l'istruzione cout verrà sempre attivata, indipendentemente dal fatto che il nostro ipotetico giocatore abbia vinto o meno.
La versione corretta del costrutto, quindi è questa:
CODICE
if ( vincita == 2 )
{
   cout << "Bravo, hai vinto!\n";
}


Edited by Metal H - 16/1/2008, 22:10
 
Top
view post Posted on 11/12/2005, 18:34
Avatar

Advanced Member

Group:
Member
Posts:
2,651

Status:


Io ho scritto
CODICE
if ( vincita == 2 )
{
  cout << "Bravo!, hai vinto!\n";
}

e non me lo compilava. Poi ho provato ad includere la libreria del C++ "iostream" così
CODICE
#include <iostream>
if ( vincita == 2 )
{
  cout << "Bravo!, hai vinto!\n";
}

ma niente da fare. Come mai?

Edited by Metal H - 16/1/2008, 22:12
 
Top
view post Posted on 11/12/2005, 18:45

Senior Member

Group:
Amministratore
Posts:
22,566
Location:
Roma

Status:


Anche a me è successo lo stesso... ma credo ci siano altri comandi da scrivere: quella è solo una parte del programma...

Edited by Metal H - 16/1/2008, 22:13
 
Web  Top
view post Posted on 11/12/2005, 19:06
Avatar

Advanced Member

Group:
Member
Posts:
2,651

Status:


Sì, probabile.

Edited by Metal H - 16/1/2008, 22:13
 
Top
Metal H
view post Posted on 11/12/2005, 20:47




Infatti.
Molti degli esempi che farò, d'ora in poi, saranno ipotetici. Questo era un'ipotetico pezzo di un programma di gioco che, a un certo punto, confronta il punteggio del giocatore (vincita) con la costante numerica 2. Per far funzionare quel codice, è necessario dichiarare almeno la variabile vincita.
Comunque, già che ci siamo, vediamo anche il costrutto if/else.
La sintassi è la seguente:
CODICE
if ( condizione 1 )
{
   istruzione 1;
   istruzione n;
}
// opzionali uno o più else if
else if ( condizione 2 )
{
   istruzione x;
}
else
{
   istruzione y;
}

Allora, analizziamo la prima parte: si tratta di un semplice costrutto if.
La seconda parte, else if, viene eseguita solo se la condizione del primo if era risultata falsa.
Si può mettere più di un else if, ciascuno con la sua condizione, ricordandosi però che verrà eseguito solo se le condizioni dei blocchi precedenti saranno risultate false. Infatti il controllo del programma, trovata una condizione vera, esegue le istruzioni previste per quella condizione e poi salta tutti i blocchi successivi, fino ad arrivare alla fine del costrutto if/else.
L'ultima parte, else, non ha condizioni, e viene eseguita in ogni caso SE, E SOLO SE le altre condizioni (quelle dei blocchi precedenti) sono false. Includere una else nel costrutto vuol dire pianificare comunque un'istruzione da eseguire se le condizioni non vengono soddisfatte.
Ecco un semplice programma, che utilizza un costrutto if/else:
CODICE
// main.cpp

#include <iostream>

using namespace std;

int main ( )
{
   int risposta = 0;
   cout << "Quanto fa 4+5? ";
   cin >> risposta;
   
   if ( risposta == 9 )
   {
       cout << "Bravo, risposta esatta!\n";
   }
   else if ( risposta > 7 && risposta < 11 )
   {
       cout << "Hai sbagliato di poco!\n";
   }
   else
   {
       cout << "Asino!\a\n";
   }

 system ( "pause" );
 return 0;
}

Penso che il programma non necessiti di spiegazioni, a parte due cose: il segno &&, il quale non fa altro che concatenare due condizioni. SE, E SOLO SE tutte e due sono vere, l'intera istruzione risulterà vera.
Poi, vorrei farvi notare che ho scritto prima la condizione che verifica se risposta è uguale a 9, e poi quella che verifica se compresa tra 7 e 11, estremi esclusi.
Non invertitele, e fate attenzione all'ordine quando scrivete i vostri programmi: se avessi scambiato il loro ordine, sarebbe stato stampato "Hai sbagliato di poco!" anche se avessi dato la risposta giusta, perché 7 < 9 < 11, e la seconda condizione sarebbe stata lo stesso soddisfatta.

Edited by Metal H - 16/1/2008, 22:20
 
Top
elfosilvano
view post Posted on 11/12/2005, 20:57




io oggi pomeriggio ho fatto questo programmino di prova

CODICE
// main.cpp

#include <iostream>  
using namespace std;

int main ( )
{
float var1 = 0;
cout << "2 X 2 ? ";
cin >> var1;

if ( var1 == 4 )
{
  cout << "Bravo!! ";
}

if ( var1 != 4 )
{
  cout << "Non sai fare una semplice moltiplicazione !! ";
}
system ( "pause" );
return 0;
}


edit 21:05.... metal, nel tuo c'è qualcosa di sbagliato, infatti se sbaglio e metto anche 45 mi da :"Hai sbagliato di poco"..... ??

Edited by elfosilvano - 11/12/2005, 21:06
 
Top
view post Posted on 11/12/2005, 21:21
Avatar

Advanced Member

Group:
Member
Posts:
2,651

Status:


ecco il mio

CODICE




#include <iostream>
using namespace std;

int main ( )
{
   
   int Risposta = 0;
   
   cout <<"Quanto fa 3425-2115?\n\n";
   cin >> Risposta;
   
   if ( Risposta == 1310 )
   {
        cout <<("\nBravo risposta esatta!!\n\n");
   }
   
   else if ( Risposta > 1300 && Risposta < 1320 )
   {
        cout <<("\nHai sbagliato di poco!!\n\n");
   }
   
   else
   {
        cout <<("\nHai Sbagliato!!\a\n\n");
   }
   
   system( "pause" );
   return 0;
}

 
Top
view post Posted on 12/12/2005, 14:11
Avatar

Advanced Member

Group:
Member
Posts:
2,651

Status:


ho un problema ho provato a fare un prog ed in un punto ho inserito che per sapare informazioni bisognava digitare "i" e per uscire "exit" .
per il comando "I" ho impostato una condizione "if" e per exit "else if" solo che nel prog quando digito "exit" mi stampa quello che avrebbe dovuto stampare per "i" vi posto la sorgente per capire meglio:

CODICE

/* Programma di prova in C++*/

#include <iostream>
using namespace std;

int main ( )
{
   
   int risp = 0;
   int rispo = 0;
   int i = 0;
   int exit = 0;
   
   cout <<"\nQuanto fa 3000-2000?\n\n";
   cin >> risp;
   
   if ( risp == 1000 )
   {
        cout <<"Bravo!! Risposta esatta!!\n\n";
   }
   
   else if ( risp != 1000 )
   {
           cout <<"Risposta errata!!\n\n";
   }
   
   system ( "pause" );
   
   cout <<"Per info digitare \"i\" per uscire digitare \"exit\"\n\n";
   cin >> rispo;
   
   if ( rispo == i )
   {
        cout <<"inserire info\n\n";
   }
   
   else if ( rispo == exit)
   {
           cout <<"Programa terminato con successo\n\n";
   }
   
   system ( "pause" );
   return 0;
}


Edited by Alkzx Red Hat - 12/12/2005, 16:10
 
Top
Metal H
view post Posted on 13/12/2005, 13:24




Ok... tutto chiaro.
Non puoi scrivere
CODICE
else if ( rispo == exit)

con l'intenzione di confrontare la stringa "exit" con la variabile rispo. Infatti, rispo è dichiarata come int, cioè può contenere SOLO un numero intero, o al massimo un carattere.
Per fare quello che dici tu, si dovrebbe scrivere rispo == 'e' nella condizione, al posto di exit, perché 'e' è un carattere e, al contrario di una stringa, può essere memorizzato in una variabile di tipo int (a proposito, DEVI mettere i singoli apici nella condizione quando confronti una variabile con una costante carattere, tipo rispo == 'i').
Altrimenti, dovresti dichiarare la variabile rispo come char *, così:
CODICE
char * rispo = { 0 }

ma vedremo questo tipo di dato più avanti. Ok?

Edited by Metal H - 16/1/2008, 22:23
 
Top
view post Posted on 13/12/2005, 22:21
Avatar

Advanced Member

Group:
Member
Posts:
2,651

Status:


altro prob:
al primo caso ho fatto quello che mi ha detto Metal e in questo il compilatore non mi compila proprio il programma:

CODICE

/* Programma di prova in C++*/

#include <iostream>
using namespace std;

int main ( )
{
   
   int risp = 0;
   char * rispo = { 0 };

   cout <<"\nQuanto fa 3000-2000?\n\n";
   cin >> risp;
   
   if ( risp == 1000 )
   {
        cout <<"Bravo!! Risposta esatta!!\n\n";
   }
   
   else if ( risp != 1000 )
   {
           cout <<"Risposta errata!!\n\n";
   }
   
   system ( "pause" );
   
   cout <<"Per info digitare \"i\" per uscire digitare \"exit\"\n\n";
   cin >> rispo;
   
   if ( rispo == 'i' )
   {
        cout <<"inserire info\n\n";
   }
   
   else if ( rispo == 'exit' )
   {
           cout <<"Programa terminato con successo\n\n";
   }
   
   system ( "pause" );
   return 0;
}


invece in questo fatto da me secondo le mie conoscenze questo me lo compila e mi avvia il programma ma quando arriva il momento di scrivere "exit" o "i" scrivi il comando dei due schiacci start e il programma si pianta e mi da errore.

vi allego la sorgente del prog fatto da me eccolo:

CODICE

/* Programma di prova in C++*/

#include <iostream>
using namespace std;

int main ( )
{
   
   int risp = 0;
   char * rispo = { 0 };
   char * i  = { rispo };
   char * exit  = { rispo };
   
   
   
   cout <<"\nQuanto fa 3000-2000?\n\n";
   cin >> risp;
   
   if ( risp == 1000 )
   {
        cout <<"Bravo!! Risposta esatta!!\n\n";
   }
   
   else if ( risp != 1000 )
   {
           cout <<"Risposta errata!!\n\n";
   }
   
   system ( "pause" );
   
   cout <<"Per info digitare \"i\" per uscire digitare \"exit\"\n\n";
   cin >> rispo;
   cin >> i;
   cin >> exit;
   
   if ( rispo == "i" )
   {
        cout <<"inserire info\n\n";
   }
   
   else if ( rispo == "exit" )
   {
           cout <<"Programa terminato con successo\n\n";
   }
   
   system ( "pause" );
   return 0;
}


grazie
 
Top
Metal H
view post Posted on 14/12/2005, 14:19




Il motivo degli errori è semplice: char * non viene usato correttamente. L'UNICO dato che una variabile char * può contenere è una stringa, cioè un insieme di caratteri, posto tra i doppi apici ("") e seguito dal carattere nullo
CODICE
'\0'

rispo NON è una stringa.
"rispo" è una stringa. Se non usi i doppi apici, il compilatore nonm riconoscerà la stringa come tale. Comunque, è meglio che non utilizziate ancora le variabili char *, perché il loro uso corretto implica una buona conoscenza dei puntatori e dei vettori, che faremo più avanti.
Intanto, andiamo avanti con i nostri operatori di decisione.
Abbiamo visto le condizioni semplici, pssiamo ora a quelle composte. Le condizioni composte sono condizioni formate da più decisioni semplici, collegate per mezzo di OPERATORI LOGICI:
&& AND logico
|| OR logico
Nel caso di &&, se noi abbiamo due condizioni di questo tipo, legate da &&,
CODICE
varX == 1 && varY != 1

allora dobbiamo sapere che:
se una sola delle due condizioni è falsa, l'intera condizione sarà falsa. Se tutte e due sono vere, sarà vera.
Questa definizione è traducibile in una tabella di verità, che illustra in modo schematico l'uso degli operatori logici:
Operatore &&
A | B | A && B

V | V | V
V | F | F
F | V | F
F | F | F
Capito?
Se sì, chi è che è capace di farmi la tabella di verità di || (tenendo presente che si chiama OR wink.gif)?
 
Top
cesco1985
view post Posted on 17/12/2005, 12:33




Allora... La && (AND) è verificata se tutte e 2 le condizioni sono verificate:
Faccio un esempio (spero che Metal non se la prenda!)
Ho fame
Ho soldi

Mangio.
Questo è un caso di And, perché:
Se non ho fame e non ho soldi, non mangio...
Se non ho fame ma ho soldi, non mangio...
Se ho fame ma non ho soldi, non mangio...
Se ho fame ed ho soldi, mangio...

Spero che ora sia + chiara...

La OR può essere descritta con questo esempio.
se andiamo o al mare, o in montagna, mi divertirò

Andiamo al mare ed in montagna: mi diverto
Andiamo al mare, non in montagna: mi diverto
Non andiamo al mare, ma andiamo in montagna: mi diverto
Non andiamo al mare, non andiamo in montagna: non mi diverto.

Spero che così sia stata + chiara e che metal non si offenda! wink.gif
 
Top
Metal H
view post Posted on 17/12/2005, 16:00




Ok, va tutto benissimo, mi dispiace se non l'avevo spiegato bene io prima &&.
Bene, passiamo all'ultimo operatore logico che vedremo in questa sezione: ! (negazione logica).
Visto che è stato efficace, copio l'esempio di cesco:
Enunciato A = "Oggi piove"
!A (leggi "non A" o "A negato") = "Non è vero che oggi piove.
Una condizione così scritta
CODICE
if ( varProva != 1 )

può benissimo essere scritta così:
CODICE
if ( ! ( varProva == 1 ) )

(tenete le parentesi, perché ! ha precedenza maggiore rispetto a ==).
Chiaro, allora?
 
Top
20 replies since 8/12/2005, 19:31   1894 views
  Share