giovedì 23 ottobre 2014

OPERATORI LOGICI AND, OR, NOT

22/10/2014

Fino ad ora ho imparato ad utlizzare gli operatori di confronto. Maggiore (>), minore (<), uguale (==), Maggiore-uguale (>=) e minore-uguale (<=).

Con il prossimo esercizio comincerò a familiarizzare con gli operatori logici AND (&&), OR (||) e NOT (!).

Solitamente nel linguaggio C un espressione è vera se assume un valore diverso da zero ed è falsa se assume un valore uguale a zero. Qindi 1 = VERO (TRUE) , 0=FALSO (FALSE).

Gli operatori logici sono utlizzati per dare un risultato non ambiguo a un operatore di confronto, ogni confronto indica una condizione.Più sono le condizioni e più saranno le possibilità di risultato. Un confronto tra due condizioni potrà restituire quattro possibilità, tre condizioni restituiranno 8 possibilità, 4 condizioni restituiranno 16 possibilità.
Semplificando: i risultati di una condizione possono essere due (vero o falso) ed elevato alla seconda avremo 4 possibilità, elevato alla 3 potranno avere 8 possibilità e così via, dove l'esponente è il numero delle condizioni. 2^2=4 , 2^3=8 , 2^4=16 etc. etc.
Faccio un piccolo esempio per specificare e capire meglio: se ho tre variabili a=5, b=4 e c=3 e devo verificare magari con un IF se a è maggiore di b e b maggiore di c non posso scrivere IF (a>b>c) ,
ma drovrei scrivere: IF (a>b && b>c) oppure se dovessi verificare se a è maggiore di b o b è maggiore di c dovrei scrivere IF (a>b OR b>c).
Nel primo caso ho bisogno che entrambe le condioni siano vere nel secono caso invece ho bisogno che una delle due sia vera.
Tornando a quanto scritto precdentemente la condizione a>b mi può dare due risultati, vero o falso e stessa cosa per b>c anche qui ho due possibili risultati, vero o falso.
Queste due condizioni quindi mi restituiranno quattro combinazioni. Si può vedere nel dettaglio:

a>b b>c RISULTATO DI a>b && b>c RISULTATO DI a>b || b>c
VERO VERO VERO VERO
VERO FALSO FALSO VERO
FALSO VERO FALSO VERO
FALSO FALSO FALSO FALSO

Quindi come si vede dalla tabella nel caso dell' AND c'è bisogno che entrambe le condizioni siano vere per avere risutlato finale vero, mentre nel caso dell' OR basta che solo una delle due conzioni sia vera per avere il risultato vero.


L'operatore NOT (!) invece si usa per creare l'opposto di una condizione. Quindi per esempio la condizione !(a<b) verificherà la condizione esattamente oppposta ovvero (a>=b).


Come esercizio ho realizzato un semplice programmino  che ho chiamato "Lotteria".
Praticamente verrà richiesto di inserire un numero intero da tastiera compreso tra 1 e 99 e se il numero è compreso tra 0 e 9 oppure tra 30 e 41 oppure tra 55 e 71 restituirà il messaggio che l'utente ha indovinato il numero da inserire. Viceversa l'utente non avrà indovinato e avrà una seconda possibilità di indovinare.
Qui con un semplice IF-ELSE  e con gli operatori AND e OR ho verificato le condizioni per verificare se il numero inserito era compreso nell'intervallo sopra descritto.
Eccolo:

#include <stdio.h>
#include <stdlib.h>

int main ()

{
    int numero;
    printf ("Lotteria 3AI \n");
    printf ("Scegli un numero compreso tra 0 e 99 e vediamo se vinci. Hai 2 tentativi !! \n");
    printf ("Primo tentativo \n");
    printf ("Inserisci il tuo numero \n");
    scanf ("%d", &numero);
    if (numero>=0&&numero<=9||numero>=30&&numero<=41||numero>=55&&numero<=71)
  
    // controllo se il numero inserito è maggiore-uguale di zero e minore-uguale di nove
    // o maggiore-uguale di trenta e minore-uguale di 41 o maggiore-uguale a 55 e minore-uguale a 71
         {          
            printf ("Hai Vinto !! \n");  //se il numero è giusto stampa hai vinto e il programma termina
        }
    else // altrimenti stampa che hai perso e riparte per un altro tentativo
        {
            printf ("Hai Perso. Ritenta !! \n");
            printf ("Secondo e Ultimo Tentativo. Inserisci il tuo Numero \n");
            scanf ("%d", &numero);
            if (numero>=0&&numero<=9||numero>=30&&numero<=41||numero>=55&&numero<=71)
                {
                    printf ("hai Vinto !! \n");
                }
            else
                {
                    printf ("Hai Perso !! \n");
                }  
        }
    return 0;
}


Come si può notare ho ripetuto due volte il controllo con 2 IF. Probabilmente avrei potuto usare un ciclo e un contatore per far ripetere il programma due volte. Ci ho provato sinceramente ma ho avuto problemi con il controllo. Riuscivo a far terminare il programma con il controllo sul contatore ma non sul controllo del numero indovinato in quanto se al primo tentativo si indovinava il programma doveva terminare.
Ci riproverò con i prossimi post, acquisendo man mano le informazioni che al momento mi mancano.

mercoledì 22 ottobre 2014

PARI O DISPARI

21/10/2014

Lo scopo di questo esercizio è quello di inserire un numero. Il programma visualizzerà a video se il numero è pari o dispari.

Il programmino è abbastanza semplice ma mi ha permesso di utilizzare l'ultima operazione che non avevo ancora utilizzato. Nei post precedenti ho creato programmi per la somma, la sottrazione, la moltiplicazione e la divisione. Questa volta è stato utlizzato il MODULO %. Praticamente questa operazione mi restituisce il resto della divisione di due numeri interi. 

Per esempio 5:2=2 con resto di 1. Oppure 4:2=2 con resto di 0.

E' bastato quindi dichiarare una variabile di tipo intero e acquisire un numero da tastiera.
Con un semplice IF-ELSE ho impostato la condizione (numero %2=1) ovvero se il numero:2 mi da resto 1 allora il numero inserito sarà dispari, altrimenti il numero è pari.

Ecco come ho compilato il codice sorgente:


#include <stdio.h>
#include <stdlib.h>

int main ()

{
    int numero;
    printf ("Inserisci il numero \n");
    scanf ("%d", &numero);
   
    if (numero%2==1)
        {
            printf("il numero e dispari \n");
        }
    else
        {
            printf("il numero e' pari \n");
        }   
    return 0;   
}


Ripeto lo scopo di questi esercizi deve essere quella di prendere confidenza con il linguaggio C. Chiaramente anche in questo caso non sono arrivato subito alla soluzione, ma ora ho capito come impostare le condizioni e sopratutto ho visto gli errori che non devo commettere.



sabato 18 ottobre 2014

MAGGIORE E MINORE DI TRE VARIABILI

18/10/2014

Ora veniamo alla parte pratica. Questo esercizio prevede l'inserimento di tre variabili di tipo intero. Il programma controllerà quale delle tre variabili è la maggiore, quale è intermedia e quale è la più piccola.

Questo compito mi ha permesso di iniziare a prendere confidenza con l'uso dei controlli IF-ELSE, e sopratutto con la sintassi.

Molto importante secondo me a livello visivo fare in modo di incolonnare i vari IF con le sue istruzioni e l'ELSE riferito a quell'IF.


#include <stdio.h>
#include <stdlib.h>

int main()

{
  int a,b,c;
  printf("inserisci a \n");      
  scanf("%d", &a);
  printf("inserisci b \n");
  scanf("%d", &b);
  printf("inserisci c \n");// fino qui dichiaro le variabili e le acquisisco
  scanf("%d", &c);
            
  if (a>b) // parto prima a capire se a è il più grande.
   {
     if (a>c) // conrollo se a è più grande anche di c
         {   
             if (b>c)  // e se b è più grande di c
            {
             printf("a maggiore, b sta in mezzo, c minore");
            }
             else if (b==c) // controllo se b è uguale a c
                   {     
                      printf("a maggiore, b e c sono uguali");
                    }
                  else // altrimenti b è minore anche di c
                           {
                            printf("a maggiore, c sta in mezzo, b minore");
                           }
         }
     else if (a==c) //qui se a è maggiore di b ma non di c. controllo se sono uguali
           {
             printf("a e c maggiori e uguali, b minore");
           }
          else  //qui arrivo se c è maggiore di a e quindi anche di b
             {
                printf("c maggiore, a sta in mezzo, b minore");
              }
   }
  else if (a==b) //qui a non è maggiore di b quindi controllo se sono uguali
       {    
         if (a>c) // controllo se a è maggiore di c. qui a e b sono uguali
          {        
            printf ("a e b sono uguali e sono maggiori di c, ");
          }
         else if (a==c) // controllo se a è uguale a c. in questo caso a, b cono uguali
              {
                printf("a, b,c sono tutti uguali");
              }
             else //qui a e b non sono maggiori di c quindi di conseguenza c è il più grande
                {
                  printf("c maggiore sia di a che di b che sono uguali");
                }        
          }          
      else if (b>c) //qui allora b è maggiore di a. controllo se b è maggiore anche di c
           {
             if (a>c)  // e controllo se a è più piuù grande di c
              {
                printf ("b maggiore, a sta in mezzo, c minore");
              }
             else if (a==c) //vedo se a è uguale a c. nel caso b è il più grande e a e c sono uguali
                  {
                    printf("b maggiore sia di a che di c che sono uguali");
                  }      
                 else // altrimenti c è più grande di a ma più piccolodi b
                    {
                      printf("b maggiore, c sta in mezzo, a minore");
                     }
          }
       else if (b==c) //qui b è maggiore di a ma non è maggiore di c. quindi controllo se sono uguali
             {
              printf("b e c sono uguali e sono maggiori di a");
             }
            else // altrimenti c è più grande di b che però è più grande di a
              {
                printf("c maggiore, b sta in mezzo, a minore");
              }                                         
  return 0;

}


Il programmino è un po rozzo, ma funziona. Oltre che l'incolonnamento delle istruzioni, ho trovato molto comodo segnare passo passo cosa quella parte di programma faceva e cosa andava a controllare. Si fa semplicemente mettendo delle descrizioni precedute da due barre "\\". Praticamente il linguaggio "C" non andrà a considerare tutto quello che trova dopo le barrette. Qui nel mio esempio sono le parti scritte in blu, stesso colore utilizzato da DEVCPP per identificare questo tipo di "appunti".
Chiaramente non ci sono riuscito al primo colpo e più volte ho dovuto rivedere cosa avevo inserito e quali controlli avevo fatto.

ISTRUZIONI DI CONTROLLO: IF-ELSE

18/10/2014

Durante la realizzazione del programma può capitare che si necessita di eseguire un operazione piuttosto che un altra, solo al verificarsi di una determinata condizione.
Queste particolari istruzioni sono chiamate strutture di controllo condizionale o, più genericamente, istruzioni condizionali oppure semplicemente controlli.  
Nel linguaggio "C" questi controlli si chiamano IF-ELSE. L'istruzione IF mi permette di indicare una condizione messa tra parentesi tonde. Se la condizione è vera, il programma eseguirà delle istruzioni o una serie di istruzioni, ELSE (altrimenti) il programma eseguirà delle istruzioni o una serie di istruzioni alternative. Sia per IF che per ELSE, l'elenco delle istruzioni da eseguire sono racchiuse da delle parentesi graffe " { } ". Molto Importante quindi diventa la sintassi con cui viene scritto il programma.

Faccio qualche esempio con il programma ALGOBUILD, un semplice ambiente per la programmazione strutturata con diagrammi di flusso (flowchart) e pseudo codice, basato su una sintassi formale grafica strutturata.

Nel primo esempio prendiamo in input da tastiera due variabili e poniamo una semplice condizione: IF (a>b) {stampa a}. Quindi se "a" è maggiore di "b" allora stampa il contenuto della variabile "a". Se "a" quindi sarà maggiore di "b" a video verrà stampato il valore di "b" altrimenti il programma continuerà con le sistruzioni successive e in questo caso procederà a controllare la condizione IF (a=b). "T" e "F" stanno semplicemente per True e False (vero o falso)




Prendiamo ora il secondo esempio e vediamo l'istruzione ELSE. Qui avremo la nostra solita condizione IF (a>b) {stampa a} ELSE {stampa b}. Quindi verrà controllato se "a" è maggiore di "b" allora verrà stampato a video il valore della variabile "a" altrimenti verrà stampato il valore della variabile "b":




Il linguaggio C come gli altri linguaggi ha delle regole ben precise. Non esiste la possibilità che a fronte di un IF e di una condizione vera non corrisponda nessuna istruzione da eseguire. Esiste però la possibilità che non esista un alternativa ELSE (come visto nel primo esempio) con delle istruzioni da eseguire nel caso la condizione sia falsa.
Quindi non esiste la possibilità di eseguire un programma come questo:


STRUTTURA ERRATA


Facciamo un esempio ora di come è possibile utilizzare IF ed ELSE con un programma da me eseguito. Segue al post successivo a questo link: http://lezioniinformatica3ai.blogspot.it/2014/10/maggiore-e-minore-di-tre-variabili.html




sabato 11 ottobre 2014

LINGUAGGI DI PROGRAMMAZIONE, TRADUTTORI E IDE

Un po di teoria.

Linguaggio di programmazione

Semplificando, un linguaggio di programmazione è un modo per comunicare e per impartire istruzioni a un computer.

Esistono linguaggi di programmazione ad alto livello e a basso livello. Per alto livello si intende un linguaggio che è più vicino al modo umano di ragionare, per basso livello si intende il linguaggio più vicino a quello della macchina.

Schematizzando potrei dire che:




Traduttori

Siccome però questi linguaggi di programmazione sono differenti dal linguaggio riconosciuto dal nostro pc, c'è bisogno di qualcosa che ci permetta di tradurre.
Questi programmi sono chiamati traduttori. ne esistono di tre tipi: compilatori, interpreti e assemblatori.

Quindi schematizzando posso dire che:


















Un esempio di compilatore lo si può trovare per esempio nel software DEVCPP che partendo da un linguaggio scritto in C o in C++, produce un file sorgente con il codice scritto e produce un file eseguile della traduzione che potremmo avviare in qualsiasi momento anche da macchine differente.

Un esempio di traduttore invece può essere un normale browser per internet, tipo Explorer, Chrome etc. Questi prendono una pagina scritta per esempio in HTML e la traducono in tempo reale per permetterci di visualizzarla.

Sugli assemblatori ci tornerò più avanti....

Ambienti Di Sviluppo Integrato (IDE)

Esistono dei pacchetti di applicativi che ci permettono di scrivere e tradurre un linguaggio.
In essi sono sempre presenti 5 importanti elementi:

- Un editor, che permette di scrivere il programma e di creare il file sorgente;
- Un compilatore, che traduce il file sorgente nel linguaggio riconosciuto dalla macchina;
- Un linker, che produce il file eseguibile con i pezzi tradotti dal compilatore;
- Un debugger, che individua eventuali errori di sintassi e che aiuta nel test del programma;
- Un loader, che prende l'eseguibile lo sposta in RAM e lo esegue.

Anche qui schematizzando posso dire che:

AMBIENTE DI SVILUPPO INTEGRATO (IDE)
  • SI COMPONE DI
    • EDITOR
      • SCOPO
        • CONSENTE DI SCRIVERE IL PROGRAMMA
      • PRODUCE
        • FILE ASCII (.TXT)
          • CODICE SORGENTE (.CPP)
    • COMPILATORE
      • SCOPO
        • TRADURRE IL CODICE SORGENTE NEL LINGUAGGIO RICONOSCIUTO DALLA CPU
      • PRODUCE
        • MODULO .OBJ
    • LINKER
      • SCOPO
        • ASSEMBLARE UNO O PIù FILE OGGETTO GENERATI DAL COMPILATORE
      • PRODUCE
        • FILE ESEGUIBILI (.EXE)
    • DEBUGGER
      • SCOPO
        • INDIVIDUARE GLI ERRORI SINTATTICI
        • TESTARE IL PROGRAMMA
    • LOADER
      • SCOPO
        • CARICA IL PROGRAMMA SULLA RAM
        • AVVIARE IL PROGRAMMA

Di norma l'editor produce dunque il file sorgente che viene inviato al compilatore che produce dei moduli .OBJ che poi vengono inviati al linker che produce l'eseguile .EXE che viene inviato al debugger che dopo aver controllato lo invia al loader che lo esegue.