Linguaggio c 1

30
LINGUAGGIO C Per permettere una più facile utilizzazione della programmazione dei microcontrollori PIC usando il linguaggio C esaminano le nozioni di base del linguaggio C. Il programma in C viene scritto mediante un EDITOR per testi, in formato ASCII, senza formattazione. Quello che si ottiene è il file sorgente del tipo nome_file.cpp Il programma sorgente, per divenire eseguibile, deve essere opportunamente compilato, servendosi del compilatore proprio del linguaggio che si sta adoperando. Quindi mediante il compilatore C il sorgente viene trasformato in file oggetto del tipo nome_file.obj. Il file oggetto mediante il Linker viene tradotto nel file eseguibile del tipo nome_file.exe. Oggi tutti i compilatori C (TurboC, C++Builder, DevC++,ecc.) sono sistemi integrati che permettono di ottenere il file eseguibile in modo automatico.

description

linguaggio di programmazione

Transcript of Linguaggio c 1

LINGUAGGIO C

Per permettere una più facile utilizzazione della programmazione dei microcontrollori PIC usando il linguaggio C esaminano le nozioni di base del linguaggio C.

Il programma in C viene scritto mediante un EDITOR per testi, in formato ASCII, senza formattazione. Quello che si ottiene è il file sorgente del tipo nome_file.cpp

Il programma sorgente, per divenire eseguibile, deve essere opportunamente compilato, servendosi del compilatore proprio del linguaggio che si sta adoperando. Quindi mediante il compilatore C il sorgente viene trasformato in file oggetto del tipo nome_file.obj.

Il file oggetto mediante il Linker viene tradotto nel file eseguibile del tipo nome_file.exe.

Oggi tutti i compilatori C (TurboC, C++Builder, DevC++,ecc.) sono sistemi integrati che permettono di ottenere il file eseguibile in modo automatico.

Tipi di dati primari

I valori di tipo numerico o alfanumerico utilizzati e elaborati all’interno di un programma devono essere dichiarati prima di essere utilizzati. Occorre definire a quale tipo di dati appartengono mediante l’utilizzo di parole chiave:

Tab. 1 – Tipi di dati

Parola chiave

Tipo di dato

Occupazione memoria

Campo definizione

char Carattere ASCII

1 byte 0 255

int Intero relativo

2 byte 32768  +32767

float virgola mobile sing. precis.

4 byte 3.4E38 3.4E+38

double doppia precis.

8 byte 1.7E308 1.7E+308

 (il campo di definizione dei dati primari e l'occupazione della memoria sono strettamente legati all'architettura del computer e al compilatore con cui si opera. I campi di definizione della tabella 1, sono tipici di un compilatore in ambiente a 16 bit.)

Esempi di dichiarazione:

int area;

float radice;

char lettera;

 Per il C non esiste come dato primario il tipo stringa (unione di caratteri alfanumerici). Le stringhe vengono pertanto trattate come un insieme (array) di dati tipo char.(es. Char nome[20])

Modificatori di tipo

I dati primari possono subire delle modifiche utilizzando i modificatori di tipo: sono parole chiave che anteposte ai tipi primari ne variano l'estensione numerica (tab. 2).

Tab. 2 – Modificatori di tipo

signed con segno

unsigned senza segno

long lungoshort corto

 Non sempre i modificatori di tipo operano variazioni sui dati primari su cui agiscono. Nel C si hanno in genere le modifiche esposte nella tabella 3 (i valori sono legati al compilatore utilizzato).

 

Tab. 3 – Effetti dei modificatori di tipo sui dati di tipo int

Forma abbreviata

Forma completa

da a n° byte

unsigned unsigned int

0 65535 2 byte

unsigned long

unsigned long int

0 4.294.967.295 4 byte

long long int 2.147.483.648 +2.147.483.648 4 byte

long double

  3.4E4932 1.1E4932 10 byte

short Short int -127 +127 1byte

VARIABILI

Sono tutti i dati, di tipo numerico o carattere, che possono assumere valori diversi durante elaborazione del programma.

I dati variabili sono individuati nel C con un nome, detto identificatore, che permette di distinguere una variabile dall'altra. Gli identificatori validi

possono essere formati da un insieme di caratteri alfabetici e numerici, debbono iniziare necessariamente con un carattere alfabetico e non devono eccedere i 32 caratteri.

Il C è case sensitive: i caratteri maiuscoli e minuscoli sono considerati diversi: Alfa, alfa e ALFA sono considerati tutti distinti.

   Non possono essere usate come identificatori le parole chiave del linguaggio.

   Non bisogna mai confondere l’identificatore assegnato ad una variabile (nome) con il valore che essa assume nel corso del programma. Se per esempio si scrive alfa = 3, il nome della variabile è alfa ed il suo valore è 3.

Nella stesura di un programma deve essere sempre fatta la dichiarazione delle variabili e delle costanti che debbono essere usate nel corso del programma stesso. Nel C la dichiarazione deve essere fatta prima dell’inizio del blocco in cui esse vengono usate. 

Esempi di dichiarazione di variabili

 

int  alfa, numero;

float somma, risultato, area;

char car, lettera;

int y = 4;

 

La variabile y durante la dichiarazione viene anche inizializzata, ovvero viene assegnato ad essa un valore.

COSTANTI

Per attribuire ad un identificatore un valore che non può essere modificato dopo l’assegnazione, si deve usare il modificatore d’accesso const.

 Esempi di dichiarazione di costanti

 

const float    num = 45.765;

const int      z = 32;

 

I valori assegnati in fase di dichiarazione agli identificatori num e z non possono essere cambiati nella parte restante del programma.

 

Si definiscono costanti (letterali) quei valori di tipo numerico, letterale o alfanumerico usati durante la scrittura del codice.

Esempi di costanti assegnate nella scrittura del codicei = 10area = 2 3.1415 raggio.

 I numeri 10, 2 e 3.1415 sono delle costanti.

In C sono presenti costanti intere, in virgola mobile, a caratteri :       

1. Costanti intere. Possono assumere gli stessi valori compresi nel range dei dati del tipo unsigned int. Le costanti intere possono essere decimali, ottali ed esadecimali.

 Costanti intere

Base Modalità di rappresentazione

Esempi

Decimali 10 Senza 0 iniziale 32576

Ottali 8 Iniziano con 0 03765 (= 2037)

Esadecimali 16 Iniziano con 0x 0 F5A4  (= 62884)

2. Costanti in virgola mobile. Sono rappresentate da un numeri con la virgola. Per default sono di tipo double.

3. Costanti di caratteri. Sono rappresentate da un carattere racchiuso tra apici: '3' , 'A', ‘a’.

Tra le costanti di caratteri sono da annoverare le così dette "sequenze di Escape"  che servono per rappresentare dei caratteri speciali non stampabili.  Per introdurre la sequenza è utilizzato il carattere \ (barra rovesciata). Sequenze di Escape:

Un caso particolare di costanti di caratteri è la costante stringa. In questo caso i caratteri sono racchiusi tra doppi apici: “Questa è una stringa”. 

Campo d’azione delle variabili e delle costanti

Un blocco di programma è costituito da un insieme di istruzioni racchiuse tra due parentesi graffe. Le variabili (o le costanti) dichiarate all’inizio di un blocco hanno campo d’azione in quel blocco e in tutti i sottoblocchi in esso contenuti. Se non sono dichiarate all’inizio del blocco esse hanno campo d’azione dal punto in cui vengono dichiarate fino alla fine del blocco. Le variabili dichiarate in un blocco sono dette locali.

Caratteri Tipo\a attivazione segnale

acustico\b spazio indietro\n nuova riga\f nuova pagina\r ritorno carrello\t tabulazione orizzontale\v tabulazione verticale\\ barra rovesciata \’ apice\” doppio apice

Le variabili dichiarate fuori da tutti i blocchi sono dette globali ed hanno un campo d’azione in tutto il programma.

Schematizzazione dei programmi in C

Tutte le funzioni del C sono in gran parte racchiuse in un file di libreria fornito insieme con il compilatore. Sono inoltre forniti all'utente un certo numero di file di intestazione (header) detti anche include file (perché utilizzati con la direttiva #include) che contengono i prototipi delle funzioni da usare con i relativi tipi di dati e i nomi delle variabili usate nelle funzioni stesse.

            La stesura dei programmi in C deve seguire uno schema ben preciso. Esso si presenta nel modo seguente:

1)    Elenco dei file include contenenti i prototipi delle funzioni che debbono essere utilizzate. I nomi dei file debbono essere preceduti dal simbolo # e debbono essere racchiusi tra apici o tra i segni <  >. I file include hanno estensione ".h". Esempio “stdio.h” o <stdio.h>

2)    Dichiarazione delle variabili globali cioè quelle variabili che possono essere utilizzate e modificate da tutte le funzioni presenti nel programma.

3)    Prototipi delle funzioni (cioè una dichiarazione della funzione che indichi sia il tipo del valore che la funzione ritornerà al programma chiamante, sia il tipo di parametri che le saranno passati dal programma chiamante).

4)    Funzione main( ); deve essere sempre presente in ogni programma.

5)    Codice di tutte le funzioni utilizzate, ognuna di esse strutturata come precedentemente esposto. Non si dimentichi che tutte le istruzioni componenti ciascuna funzione debbono essere racchiuse tra due parentesi graffe (blocco di programma). Poiché le parentesi graffe non sono presenti nella normale tastiera, si ricorda che si possono ottenere:

ALT + 123 per aprire parentesi:         {

ALT + 125 per chiudere parentesi:     }

(Nei notebook AltGr+Ctrl+Shift+ tasto [ oppure ] )

La funzione printf() serve per visualizzare dati e messaggi sul video, scanf() per acquisire dati dalla tastiera.

All’interno della funzione printf(), si utilizzano i caratteri:

\n   per andare a capo ad ogni riga;

%d    per la visualizzazione di un numero intero;

%f    per la visualizzazione di un numero di tipo float;

%c    per la visualizzazione di un carattere;

%s   per la visualizzazione di una costante stringa.

Per le costanti stringa si è dovuto assegnare (tra parentesi quadre) il numero di caratteri che le compongono più uno, non visibile, che serve da terminatore della stringa ed è aggiunto automaticamente dal compilatore. Tutti i programmi in C, come detto, debbono contenere la funzione main( ).

 

Programma 1 - Esempio

/* PROGRAMMA DI ESEMPIO */ #include "stdio.h";  int     num1;  float   num2;  char car = 'A' ;  char stringa1 [7]  = "INTERO";  char stringa2 [11] = "TIPO FLOAT";

 main() {    printf ("\n INTORDUCI UN NUMERO INTERO COMPRESO TRA -32578 E +32767 ");   scanf ("%d",&num1);  printf ("\n INTRORDUCI UN NUMERO CON VIRGOLA ");   scanf ("%f",&num2);  printf ("\n QUESTA E' UNA COSTANTE DI TIPO CHAR:  %c",car);  printf ("\n IL PRIMO NUMERO  %d  E' %s", num1,stringa1);  printf ("\n IL SECONDO NUMERO  %f E' %s", num2,stringa2);  }

Operatori

Gli operatori servono per manipolare i valori assegnati alle variabili ed alle costanti. Di seguito sono elencati gli operatori usati nel C suddivisi in gruppi funzionali:

1. operatore di assegnazione, 2. operatori aritmetici,

3. operatori di relazione,

4. operatori logici,

5. operatori sui singoli bit.

Tab. 5 – Elenco degli operatori di assegnazione

assegnazione= num = 123  assegna alla variabile

posta a sinistra del simbolo il valore posto a destra

assegna il prodotto = num = a equivale a:  num = num aassegna il quoziente /= num /= a equivale a:  num = num / aassegna il resto %= num %= a equivale a:  num = num % aassegna la somma += num += a equivale a:  num = num + aassegna la differenza –= num –= a equivale a:  num = num – aassegna lo scorrimento a sinistra

<<= num <<= 1 equivale a:  num = num << 1

assegna lo scorrimento a destra

>>= num >>= 1 equivale a:  num = num >> 1

assegna l’AND dei bit &= num &= a  equivale a:  num = num & aassegna lo XOR dei bit

^= num ^= a  equivale a: num = num ^ a

assegna l’OR dei bit |= num |= a  equivale a:  num = num | a

Tab. 6 – Elenco degli operatori aritmetici

moltiplicazione * num = num1 * num2 assegna a num il prodotto delle due variabili num1 e num2

divisione / num = num1 / num2 assegna a num il quoziente delle due variabili num1 e num2

addizione + num = num1 + num2 assegna a num  la somma delle due variabili num1 e num2

sottrazione num = num1 – num2 assegna a num la differenza tra le due variabili num1 e num2

più unario + num = + num1 meno unario num = num1

resto divisione tra interi % res = num1 % num2 se num1 e num2 sono due interi, alla variabile res è assegnato il valore del resto della divisione tra num1 e num2

incremento

preincremento

++

B = ++A il valore di A viene aumentato di 1 e poi assegnato alla variabile B

postincremento B = A++ il valore di A viene assegnato alla variabile B e poi aumentato di 1

decremento

predecremento

––

B = ––A il valore di A viene diminuito di 1 e poi assegnato alla variabile B

postdecremento B = A––  il valore di A viene assegnato alla variabile B e poi diminuito di 1

 

Tab. 7 – Elenco degli operatori di relazione

maggiore di>  if (a > b) se a è maggiore di b

minore di <  if (a < b) se a è minore di buguale a == if (a== b) se a è uguale a bmaggiore o uguale

>= if (a >= b) se a è maggiore o uguale a b

minore o uguale

>= if (a <= b) se a è minore o uguale a b

non uguale != if (a != b) se a è diverso da b

  Tab. 8  – Elenco degli operatori logici su variabili

AND && A && B AND logico tra A e B. (A e B di tipo scalare, risultato int).

OR || A || B  OR logico tra A e B. (A e B di tipo scalare, risultato int).

NOT ! !A    negazione logica di A. (A di tipo scalare, risultato int). 

Gli effetti degli operatori logici su dati di tipo scalare è riportato nella tabella che segue:

A B A and B   A or B   A not Afalso (0) falso

(0)falso (0)   falso (0)   falso

(0)vero (1)

falso (0) vero () falso (0)   vero (1)   vero (0)

falso (0)

vero (0)

falso (0)

falso (0)   vero (1)      

vero (0)

vero (0)

vero (1)   vero (1)      

In C si ha:

il dato  è  vero se   0     (diverso da zero)

il dato è falso   se  = 0     (uguale a zero)

 

Quando il risultato delle operazioni logiche è vero, viene restituito 1 (che è diverso da zero).

Gli operatori finora esaminati agiscono tutti sull'intera variabile. Si analizzano ora gli operatori che influenzano i singoli bit della variabile, che deve pertanto essere scritta in binario; non bisogna assolutamente confondere gli operatori logici AND, OR e NOT che operano a livello di variabili con i corrispondenti operatori logici che operano sui singoli bit della variabile. I primi infatti producono solo un risultato logico di  vero  o  falso, mentre i secondi operano una vera e propria trasformazione delle variabili.

Gli operatori sui singoli bit

  a) Operatori logici sui singoli bit

Tab. 9 – Elenco degli operatori logici  su singoli bit

AND & A & B Opera la AND bit a bit delle variabili (int) A e B

OR| A | B Opera la OR bit a bit delle variabili

(int) A e B

XOR^ A ^ B Opera la XOR bit a bit delle variabili

(int) A e Bcomplemento a uno

A Opera il complemento dei singoli bit della variabile (int) A

 Gli effetti degli operatori logici su singoli bit è riportato nella tabella che segue:

bit1 bit2 AND (&)

  OR (|)

  XOR (^)

  bit complemento

0 0 0   0   0   0 10 1 0   1   1   1 01 0 0   1   1      1 1 1   1   0      

b) Operatori di scorrimento dei bit

Tab. 10 – Elenco degli operatori logici  su singoli bit

Scorrimento a destra

>>  A >> 1  tutti bit della variabile (int) A  sono traslati di una posizione a destra; l'ultimo bit a destra (meno significativo) viene perso; al posto del primo bit a sinistra (più significativo) viene posto uno zero. Possono effettuarsi più traslazioni variando il numero posto dopo il segno di scorrimento.

Scorrimento a sinistra

<<  A << 1  tutti bit della variabile (int) A  sono traslati di una posizione a sinistra; l'ultimo bit a sinistra (più significativo) viene perso; al posto dell'ultimo bit a destra  (meno significativo) viene posto uno zero. Possono effettuarsi più traslazioni variando il numero posto dopo il segno di scorrimento.

 Per chiarire la differenza che intercorre tra gli operatori che operano sull’intera variabile e quelli che invece agiscono sui singoli bit, si forniscono alcuni esempi:

int a, b, c, d;

/* si definiscono le variabili  a, b ,c, d di tipo intero */

a = 5  ; b = 8;

/* si assegnano alle variabili a e b dei valori */

c = a & b /* si esegue l’operazione logica AND sui singoli bit */

d = a && b /* si esegue l’operazione logica AND sulle intere variabili */

Dopo l’operazione AND bit a bit, la variabile c sarà uguale a:

 

Valore in binarioa = 5 0000 0101b = 8 0000 1000c = 0 0000 0000

 Dopo l’operazione AND sulle variabili a e b, ricordando che un’operazione logica su due variabili può restituire solo due valori, vero (1) o falso (0), la variabile d sarà uguale:

a = 5a 0   quindi = vero ( 0)

b = 8 b 0   quindi = vero ( 0)d = 1 vero AND vero = vero (1)

 

Deve essere quindi ben chiaro che gli operatori logici sulle intere variabili producono come risultato sempre solo due possibili valori: 0 (falso) o 1 (vero); le operazioni logiche sui bit invece creano valori diversi che dipendono dall’operazione logica effettuata sui singoli bit e dal valore attribuito inizialmente alle variabili.

 Programma 2  - Uso di operatori aritmetici #include "stdio.h"main() {  int a,b,c,d,g;  /*si definiscono le variabili a, b ,c, d di tipo intero*/  clrscr();       /*si cancella il contenuto dello schermo*/  a = 10 ;        /*si assegnano alle variabili a e b dei valori*/

  b = 16;  c = a + b;      /*si esegue la somma tra i valori assegnati ad a e b*/  d = c * a;      /*si esegue il prodotto tra i valori assegnati ad a e b*/  printf ("\n a = %d",a);           /*si visualizza il valore assegnato ad a*/  printf ("\n b = %d",b);           /*si visualizza il valore assegnato ad b*/  printf ("\n c = a + b = %d",c);   /*si visualizza il valore trovato per c*/  printf ("\n d = c * a = %d",d);   /*si visualizza il valore trovato per d*/  a = d / b;                        /*ad a viene assegnato il nuovo valore                                      risultato della divisione tra d e b*/  g = d % b;                        /*a g viene attribuito il valore del resto                                      della divisione tra d e b*/  printf ("\n a = d : b = %d",a);   /*si visualizza il valore trovato per a*/  printf ("\n g = resto = %d",g);   /*si visualizza il valore di g*/  getch();                          /*attende che si prema un tasto*/ }

Programma 3 - Uso di operatori sui bit

#include "stdio.h"main()  {  char a, b, c, d; /*si definiscono le variabili a, b ,c, d di tipo carattre*/  a = 5  ; b = 8;   /*si assegnano alle variabili a e b dei valori*/  c = a & b;        /*si esegue l'operazione logica AND sui singoli bit*/  d = a && b;       /*si esegue l'operaz. logica AND sulle intere variabili*/  printf ("\n a = %d",a);   /*si visualizza il valore assegnato ad a*/  printf ("\n b = %d",b);  /*si visualizza il valore assegnato ad b*/  printf ("\n c = a & b = %d",c);    /*si visualizza il valore trovato per c*/  printf ("\n d = a && b = %d",d);   /*si visualizza il valore trovato per d*/  getch();  }

Le funzioni printf( ) e scanf( )

Si prendono ora in esame le due funzioni che permettono di effettuare l'input e l'output verso la consolle. Queste due funzioni fanno parte della libreria standard del C e i loro prototipi si trovano nel file include “stdio.h” (standard input-output)

 Funzione di output: printf()

 Sintassi:

printf ("messaggio da visualizzare e direttive di conversione", argomenti).

 La parte racchiusa tra virgolette è generalmente costituita da due tipi di elementi diversi:

1. il messaggio da visualizzare rappresentato da caratteri alfanumerici che vengono visualizzati, così come sono, sul video;

2. le direttive di conversione servono invece per rappresentare correttamente gli eventuali argomenti posti dopo la virgola. Le direttive di conversione sono sempre formate dal carattere "%"  seguito da una lettera.

Tab. 11 – Direttive di conversione

Direttiva Viene Visualizzato%d un intero%c un carattere%u un intero senza segno%f un numero in virgola mobile%e un numero in virgola mobile in

formato esponenziale%s una stinga%x un intero in formato esadecimale

  

Esempio di utilizzo della funzione printf() int num1,num2; float num3; /*dichiara le variabili di tipo

int*/char alfa,beta; /*dichiara le variabili di tipo

char*/  num1=23;num2=55;

num3=3.14;/*assegna i valori alle variabili*/

  alfa='A'; beta='b';    printf("i numeri sono:  %d  %d  %f", num1, num2, num3);  printf ("\n i caratteri sono:   %c  %c", alfa, beta);

 Il frammento di programma dell’esempio visualizza sul video:

 

i numeri sono : 23  55  3.14i caratteri sono : A  b

 

Notare che la spaziatura tra il messaggio e tra i singoli caratteri è ottenuta inserendo opportuni spazi sia dopo il messaggio che tra i simboli di formattazione (%d, %f e %c). Vale a dire il contenuto delle variabili è visualizzato esattamente in corrispondenza della posizione del relativo carattere di formattazione.

       Il simbolo speciale  "\n"  serve per andare a capo. Siccome la barra retroversa  "\" precede sempre un carattere speciale e il segno "%" un carattere di formattazione se in un messaggio si vogliono visualizzare detti simboli bisogna porli duplicati; cioè  "\\"  visualizza una barra rovesciata e  "%%" fa visualizzare un segno di percentuale.

       A volte è necessario impostare a priori la lunghezza del campo occupato nella visualizzazione di un dato; in tal caso si impone tale lunghezza ponendo un numero tra il segno "%" e il carattere di formattazione. Esso rappresenterà appunto il numero di spazi riservati al campo. Per esempio "%5d", riserverà al dato intero da visualizzare 5 posizioni e lo allineerà sulla destra premettendovi spazi bianchi. Se il dato è più lungo dello spazio riservato vengono visualizzate tutte le cifre.

       Se si vogliono limitare le cifre decimali dopo la virgola, per un numero in virgola mobile, si dovrà porre dopo l'ampiezza del campo un punto seguito dal numero di cifre decimali che si vogliono visualizzare. Per esempio con "%8.3f", il numero in virgola mobile visualizzato occuperà otto o più spazi (se più lungo), con un totale di tre cifre decimali dopo la virgola.

Funzione di input:  scanf()

Sintassi:

scanf ("stringa di formato" , indirizzi degli argomenti);

La stringa di formato utilizza per lo più gli stessi formati utilizzati per  printf(). La novità più rilevante del comando di input rispetto a quello di output risiede nel fatto che  scanf(), come argomento, richiede non il valore di una variabile, ma l'indirizzo in cui essa è posta in memoria.

E' chiaro che il programmatore non conosce esplicitamente tale indirizzo, ma il compilatore sì; per indicare quindi quale è tale indirizzo si fa precedere il nome della variabile dall'operatore  "&".

char  car;

scanf ("%c",&car);

 Quando viene trovata l'istruzione scanf(), il programma si arresta e il computer rimane in attesa che venga introdotto un carattere attraverso la tastiera. Il carattere digitato sarà attribuito all'identificatore car e memorizzato all'indirizzo &car.

Se si vuole introdurre da tastiera più di una variabile, utilizzando la stessa funzione  scanf(), queste possono essere separate da uno spazio. Verrà in tal caso usata la seguente sintassi:

 char  car1;

int  num;

..........

printf ("INTRODUCI UN CARATTERE ED UN INTERO  ");

scanf ("%c  %d",&car1,&num);

 In tal caso lo spazio bianco tra i simboli di formato indica che in fase di digitazione delle variabili da introdurre esse debbono essere separate da uno o più spazi o da un comando "a capo". Nel caso precedente si dovrà quindi introdurre prima un carattere, poi uno o più spazi bianchi ed infine un intero.

Il messaggio visualizzato prima dell'acquisizione, avverte l'operatore su cosa deve immettere dalla tastiera.

Altre funzioni di input e output

A volte, in modo più semplice, possono essere usate altre funzioni di input già predefinite. Tra le principali si indicano:

Tab.12   - Funzioni di input e output

getch() acquisisce un carattere da tastiera senza visualizzarlo sul video; non attende che venga digitato il ritorno a capo.

getche() acquisisce un carattere da tastiera e lo visualizza su video; non attende che venga digitato il ritorno a capo.

getchar() acquisisce un carattere da tastiera e lo visualizza su video; attende che venga digitato il ritorno a capo.

gets() acquisisce una stringa da tastiera; la stinga deve terminare con un ritorno a capo

putchar() visualizza un carattere sul video.puts() visualizza una stringa sul video.

Le strutture di controllo in C

Le strutture condizionali: la selezione binaria

    Struttura if

In questa struttura selettiva viene posta una condizione, se essa è verificata si esegue un’istruzione, o un blocco di istruzioni, altrimenti il programma procede dalla prima istruzione dopo il blocco. Questa struttura in C viene implementata con  if ....

La sintassi del comando è la seguente: 

if (condizione){blocco istruzioni;}

 

Se è presente una sola istruzione le parentesi graffe possono essere omesse e l’istruzione viene posta sulla stessa riga di if.

    Struttura if...else

Una seconda forma, più versatile, della struttura condizionale è rappresentata dalla

struttura if...else  che utilizza la seguente sintassi:

 

if (condizione)

{blocco istruzioni;}

else

{blocco istruzioni;}

 

ove il blocco istruzioni può essere in una o tutte due le parti una singola istruzione. Il costrutto appena visto permette di operare la scelta tra due possibilità diverse eseguendo o un gruppo o l'altro di istruzioni. Nel caso di istruzioni singole queste vanno poste sulla stessa riga di if ed else.

In figura sono rappresentati i diagrammi di flusso corrispondenti alla struttura di controllo “if “ e alla struttura “if  ... else ”.

Si possono avere strutture if-else nidificate:

Le strutture condizionali: la selezione multipla

    Struttura    switch...case

Quando bisogna operare scelte multiple invece di utilizzare una serie di if ... else  anche nel C è presente una struttura condizionale di tipo particolare.

Essa è la struttura  switch...case   che ha la seguente sintassi:

 

switch(variabile tipo int o char) {    case valore1:     blocco istruzioni;  break;  case valore2:  blocco istruzioni;  break;  ..................  default:  blocco istruzioni; }  

 

La struttura ora esaminata controlla che il valore della variabile dopo switch coincida con uno dei valori posti dopo case ed in caso affermativo esegue il gruppo di istruzioni fino a quando incontra break. Se non si verifica alcuna uguaglianza viene saltata l'intera struttura.

La parola chiave default; può essere messa alla fine del costrutto qualora si vogliano eseguire delle istruzioni quando non si verifichi alcuno dei "case".

Bisogna osservare che con tale costrutto però è possibile effettuare solo un controllo di uguaglianza ed inoltre la variabile dopo switch deve essere di tipo compatibile con valori di tipo int.

 

In figura il diagramma di flusso corrispondente alla struttura condizionale switch: