• Non ci sono risultati.

La programmazione in linguaggio C

N/A
N/A
Protected

Academic year: 2021

Condividi "La programmazione in linguaggio C"

Copied!
33
0
0

Testo completo

(1)

FONDAMENTI DI INFORMATICA

Prof. PIER LUCA MONTESSORO Ing. DAVIDE PIERATTONI

Facoltà di Ingegneria

Università degli Studi di Udine

La programmazione in linguaggio C

(2)

Questo insieme di trasparenze (detto nel seguito slide) è protetto dalle leggi sul copyright e dalle disposizioni dei trattati internazionali. Il titolo ed i copyright relativi alle slides (ivi inclusi, ma non limitatamente, ogni immagine, fotografia, animazione, video, audio, musica e testo) sono di proprietà degli autori prof. Pier Luca Montessoro e ing. Davide Pierattoni, Università degli Studi di Udine.

Le slide possono essere riprodotte ed utilizzate liberamente dagli istituti di ricerca, scolastici ed universitari afferenti al Ministero della Pubblica Istruzione e al Ministero dell'Università e Ricerca Scientifica e Tecnologica, per scopi istituzionali, non a fine di lucro. In tal caso non è richiesta alcuna autorizzazione.

Ogni altro utilizzo o riproduzione (ivi incluse, ma non limitatamente, le riproduzioni su supporti magnetici, su reti di calcolatori e stampe) in toto o in parte è vietata, se non esplicitamente autorizzata per iscritto, a priori, da parte degli autori.

L'informazione contenuta in queste slide è ritenuta essere accurata alla data della pubblicazione. Essa è fornita per scopi meramente didattici e non per essere utilizzata in progetti di impianti, prodotti, reti, ecc. In ogni caso essa è soggetta a cambiamenti senza preavviso. Gli autori non assumono alcuna responsabilità per il contenuto di queste slide (ivi incluse, ma non limitatamente, la correttezza, completezza, applicabilità, aggiornamento dell'informazione).

In ogni caso non può essere dichiarata conformità all'informazione contenuta in queste slide.

In ogni caso questa nota di copyright e il suo richiamo in calce ad ogni slide non devono

Nota di Copyright

(3)

specifiche

del problema analisi algoritmo

programma sorgente

implementazione

compilazione e linking

programma eseguibile

esecuzione

controllo

dei risultati deb

ugg ing

e c orre

zion e del pro gra

mm a

Strumenti per la programmazione

(4)

Strumenti per la programmazione

specifiche

del problema analisi algoritmo

programma sorgente

implementazione

compilazione e linking

programma eseguibile

esecuzione

controllo

dei risultati deb

ugg ing

e c orre

zion e del pro gra

mm a

In questo corso non è previsto

l’utilizzo di sistemi di analisi

automatica né di strumenti

di CASE (Computer Aided

Software Engineering)

(5)

Strumenti per la programmazione

specifiche

del problema analisi algoritmo

programma sorgente

implementazione

compilazione e linking

programma eseguibile

esecuzione

controllo

dei risultati deb

ugg ing

e c orre

zion e del pro gra

mm a

TEXT EDITOR: programma

per scrivere file di testo (ASCII) Esempi: EDIT di MS-DOS,

Notepad, Wordpad o Notepad++ di

MS-Windows, gedit o emacs di Unix

(6)

Strumenti per la programmazione

specifiche

del problema analisi algoritmo

programma sorgente

implementazione

compilazione e linking

programma eseguibile

esecuzione

controllo

dei risultati deb

ugg ing

e c orre

zion e del pro gra

mm a

Compilatore C/C++ della GNU Linguaggio C:

gcc -o foobar.exe foobar.c Linguaggio C++:

g++ -o foobar.exe foobar.cpp

(7)

Strumenti per la programmazione

specifiche

del problema analisi algoritmo

programma sorgente

implementazione

compilazione e linking

programma eseguibile

esecuzione

controllo

dei risultati deb

ugg ing

e c orre

zion e del pro gra

mm a

In MS-DOS e in unix per eseguire un programma è sufficiente scriverne il nome sulla linea di comando,

seguito da invio:

C:\PROGRAMMI> foobar

(8)

Strumenti per la programmazione

specifiche

del problema analisi algoritmo

programma sorgente

implementazione

compilazione e linking

programma eseguibile

esecuzione

controllo

dei risultati deb

ugg ing

e c orre

zion e del pro gra

mm a

Strumenti di base:

• attenta analisi ragionata del codice

• selezione di casi significativi

• printf (per la stampa dei valori delle variabili) Strumenti avanzati:

• debugger

(9)

Utilizzo del compilatore GCC

• Compilazione:

C:\PROGR> gcc -o nome.exe nome.c

• Esecuzione:

C:\PROGR> nome

• Compilazione per il debugger:

C:\PROGR> gcc -g -o nome.exe nome.c

• Esecuzione con debugger grafico:

C:\PROGR> gdb nome

C:\PROGR> insight nome C:\PROGR> nemiver prova

(versioni gcc precedenti alla 3)

(in ambiente Ubuntu)

(10)

Principi fondamentali

• “Implementare un algoritmo” significa tradurre una serie di operazioni aritmetico-logiche in procedure eseguibili dal calcolatore

• Tale traduzione è diversa a seconda del linguaggio di programmazione scelto

Un programma C è costituito fondamentalmente

da variabili e funzioni

(11)

Variabili e funzioni

• Le variabili memorizzano i valori (o dati) in input e/o in output e quelli usati durante

l’esecuzione

• Le funzioni sono sequenze di istruzioni, ossia

operazioni da effettuare sui dati

(12)

Esempio: hello.c

#include <stdio.h>

#include <stdlib.h>

/* programma principale */

int main() {

printf ("Hello world!\n");

return EXIT_SUCCESS;

}

/* fine del programma */

(13)

Esempio: hello.c

#include <stdio.h>

#include <stdlib.h>

/* programma principale */

int main() {

printf ("Hello world!\n");

return EXIT_SUCCESS;

}

/* fine del programma */

Direttiva al preprocessor:

include il file (del

compilatore) stdio.h che serve per l’utilizzo delle

funzioni di input/output

(14)

Esempio: hello.c

#include <stdio.h>

#include <stdlib.h>

/* programma principale */

int main() {

printf ("Hello world!\n");

return EXIT_SUCCESS;

}

/* fine del programma */

Commento: viene ignorato

dal compilatore

(15)

Esempio: hello.c

#include <stdio.h>

#include <stdlib.h>

/* programma principale */

int main() {

printf ("Hello world!\n");

return EXIT_SUCCESS;

}

/* fine del programma */

Funzione main: tutto comincia da qui

Corpo della funzione main

(16)

Esempio: hello.c

#include <stdio.h>

#include <stdlib.h>

/* programma principale */

int main() {

printf ("Hello world!\n");

return EXIT_SUCCESS;

}

/* fine del programma */

Istruzione per stampare la scritta

"Hello world!" e poi andare a capo Istruzione per terminare la

funzione main (e quindi il programma) restituendo al sistema operativo il valore numerico associato, in

stdlib.h, a EXIT_SUCCESS

(17)

• Ogni funzione è identificata da un nome

• Il programma inizia sempre l’esecuzione a

partire da una funzione “speciale”: la funzione main

• Nei programmi C più semplici, tutte le

operazioni da fare risiedono nella funzione main

• I programmi complessi prevedono che main

invochi altre funzioni, suddividendo le molte

istruzioni in blocchi logici più semplici

(18)

Direttive al preprocessor

• La prima linea del programma:

#include <stdio.h>

è comune a molti programmi C

• Indica al compilatore di includere

automaticamente le funzioni della libreria standard di input/output stdio.h , come ad esempio la funzione di stampa su video

printf ()

(19)

Commenti

• In ogni programma C è utile poter inserire dei commenti, a descrizione di quanto viene

eseguito da una o più istruzioni

• La riga di commento:

/* programma principale */

non contiene istruzioni C e quindi non viene

processata dal compilatore

(20)

Input e output

• printf () è una funzione di uso generale offerta della libreria standard di input/output

• Nell’esempio, essa stampa sul monitor (lo

standard output) semplicemente la sequenza di

caratteri: Hello world!

(21)

#include <stdio.h>

#include <stdlib.h>

int main() /* somma due numeri interi */

{

int num1, num2, somma;

printf ("inserire num1: ");

scanf ("%d", &num1);

printf ("inserire num2: ");

scanf ("%d", &num2);

somma = num1 + num2;

printf ("num1 + num2 = %d\n", somma);

return EXIT_SUCCESS;

}

(22)

Esempio: somma.c

#include <stdio.h>

#include <stdlib.h>

int main() /* somma due numeri interi */

{

int num1, num2, somma;

printf ("inserire num1: ");

scanf ("%d", &num1);

printf ("inserire num2: ");

scanf ("%d", &num2);

somma = num1 + num2;

printf ("num1 + num2 = %d\n", somma);

return EXIT_SUCCESS;

dichiarazione di

variabili intere

(23)

#include <stdio.h>

#include <stdlib.h>

int main() /* somma due numeri interi */

{

int num1, num2, somma;

printf ("inserire num1: ");

scanf ("%d", &num1);

printf ("inserire num2: ");

scanf ("%d", &num2);

somma = num1 + num2;

printf ("num1 + num2 = %d\n", somma);

return EXIT_SUCCESS;

}

input di un intero

(input formattato)

(24)

Esempio: somma.c

#include <stdio.h>

#include <stdlib.h>

int main() /* somma due numeri interi */

{

int num1, num2, somma;

printf ("inserire num1: ");

scanf ("%d", &num1);

printf ("inserire num2: ");

scanf ("%d", &num2);

somma = num1 + num2;

printf ("num1 + num2 = %d\n", somma);

return EXIT_SUCCESS;

somma e

assegnazione

(25)

#include <stdio.h>

#include <stdlib.h>

int main() /* somma due numeri interi */

{

int num1, num2, somma;

printf ("inserire num1: ");

scanf ("%d", &num1);

printf ("inserire num2: ");

scanf ("%d", &num2);

somma = num1 + num2;

printf ("num1 + num2 = %d\n", somma);

return EXIT_SUCCESS;

}

stampa del

risultato (output

formattato)

(26)

Variabili e dichiarazioni

• Per poter essere utilizzate da un’istruzione, tutte le variabili di un programma C devono essere dapprima dichiarate

• Una dichiarazione stabilisce il tipo e il nome di una o più variabili, come ad esempio:

int numero;

• Il tipo di dato determina la natura della

variabile, ovvero il modo in cui verrà trattata

nelle successive operazioni

(27)

Variabili ed espressioni

• L’istruzione

numero = numero * 20;

rappresenta di fatto la traduzione di due operazioni logiche distinte

• Dapprima viene valutata l’espressione a destra del segno =

• Il risultato di tale espressione è poi assegnato alla stessa variabile numero, che viene

dunque sovrascritta:

numero numero * 20;

(28)

Input e output formattato

• scanf () e printf () consentono di leggere e stampare dati formattati

• La funzione scanf () legge un dato dalla

tastiera (lo standard input) e ne scrive il valore in una variabile (o locazione in memoria)

• Esse operano in modo diverso a seconda del tipo dei dati da manipolare (numeri interi,

numeri floating point, stringhe di caratteri, singoli byte ecc.)

• L’input/output formattato in C è molto potente!

(29)

Funzioni e argomenti

• Un metodo per comunicare dati alle funzioni è quello di fornire ad esse una lista di valori, detti argomenti

• Le parentesi che seguono il nome della funzione racchiudono tale lista, come per:

scanf ("%d", &numero);

• Esistono funzioni che non si aspettano

argomenti: nell’esempio, main () ha la lista

di argomenti vuota

(30)

Esempio: potenza.c

#include <stdio.h>

#include <stdlib.h>

/* elevamento a potenza con moltiplicazioni successive */

int main() {

int base, esponente, potenza, contatore;

printf ("inserire base: ");

scanf ("%d", &base);

printf ("inserire esponente: ");

scanf ("%d", &esponente);

potenza = 1;

contatore = 0;

while (contatore < esponente) {

potenza = base * potenza;

contatore = contatore + 1;

}

printf ("potenza = %d\n", potenza);

return EXIT_SUCCESS;

struttura di controllo:

ciclo while

(31)

Strutture di controllo

• L’esempio precedente rappresenta una possibile implementazione del calcolo

dell’elevamento a potenza (esponente non negativo!)

• Il ciclo while è una struttura di controllo, il cui diagramma di flusso è:

Y

N

(32)

Strutture di controllo

• Il costrutto:

while (contatore < esponente) {

potenza = base * potenza;

contatore = contatore + 1;

}

è un semplice ciclo iterativo

• Dapprima viene valutata la condizione contatore < esponente

• Se tale espressione risulta vera, allora il blocco di istruzioni racchiuse tra le parentesi graffe

viene eseguito e, alla fine, la condizione viene

valutata di nuovo (iterazione)

(33)

Strutture di controllo

• Il ciclo while viene così ripetuto fino a che (while) la condizione

contatore < esponente è ancora vera

• Nell’esempio, le istruzioni interne al ciclo

vengono eseguite un numero di volti pari al

valore dell’esponente

Riferimenti

Documenti correlati

nei testi, nelle pubblicazioni ed in ogni altra forma di divulgazione di studi, analisi ed elaborazioni di qualsiasi tipo realizzati dal soggetto richiedente utilizzando in tutto o

Settori – Tipologia di impianti di trasformazione/elaborazione Domanda Finale – Consumi finali dei prodotti per settori e/o destinazione.. Energy SUT aggregata toscana: 2015..

• FileOutputStream implementa questi metodi nel caso parti- colare in cui l’output è un file, il cui nome è passato al costrut- tore di FileOutputStream ; in alternativa si

¨  Se la stringa di formato contiene un white space, la scanf legge zero o più white space, che verranno scartati, fino al primo carattere non white space.

 An efficient means of transferring data directly between I/O and memory for large data transfers since programmed I/O is suitable only for slow devices and individual

whose name is distinct from all other existing files, and opens the file for binary writing and reading (as if the mode string &#34;wb+&#34; were used in an fopen() call). If

• Regola 3: Anche se le stringhe di formato della scanf() assomigliano molto a quelle della printf(), hanno una semantica leggermente differente (leggete il manuale!). • Regola

 saves pertinent information including last instruction executed and data values in registers in the PCB (process control block).  branches to