Sei sulla pagina 1di 6

Le basi della programmazione in C

Breve storia della programmazione

Ada Lovelace, la prima programmatrice

● Charles Bobbage aveva progettato una macchina calcolatrice automatica che non
riuscì però a completarne la costruzione.
● L’analytical Engine era un dispositivo meccanico alimentato a vapore che
comprendeva un’unità logico-aritmetica, un'unità di controllo e una memoria interna
proprio come i computer moderni. I dati input erano inseriti in mediante schede
perforate e per l'output erano previsti una stampante, un plotter e una campanella.
● Ada Lovelace programma il primo algoritmo per la macchina calcolatrice progettata
da Charles Bobbage usando il suo linguaggio per scrivere un algoritmo per calcolare
i numeri di bernoulli.
Il computer moderni sono stati sviluppati sulla base del concetto proposto da Alan Turing di
una macchina ideale capace di risolvere problemi di ordine generale.
● prevede un insieme (o set) limitato di istruzioni per svolgere tutte le operazioni
possibili
● usa il processo di elaborazione per eseguire procedure di tipo algoritmico, che
consentono di affrontare e risolvere problemi di ordine generale
● può elaborare non soltanto dati numerici, ma anche simboli astratti: il computer non è
più concepito semplicemente come «una calcolatrice più veloce» ma diventa un
dispositivo general-purpose, cioè adattabile a molti usi diversi
→ Grazie al progresso tecnico dell'elettronica, in pochi decenni si è passati da calcolatori
che occupavano intere stanze, (ENIAC) poi al P101 che funzionava a transistor, al IBM Con
il sistema operativo ms-dos della Microsoft fino agli odierni personal computer.

I linguaggi di programmazione

➔ I linguaggi di programmazione sono notazioni formali progettate per descrivere degli


algoritmi e quindi scrivere i programmi nel computer.
➔ I programmi, per essere compresi, devono essere scritti in linguaggio macchina.
➔ I programmatori scrivono con linguaggi di programmazione di alto livello che poi il
computer convertirà in linguaggio macchina.
Dal linguaggio macchina ai linguaggi di alto livello.

● Scrivendo direttamente in linguaggio macchina (architetture MIPS) ha molti difetti:


era facile sbagliare e difficile correggere, richiedeva molto tempo e ogni programma
era legato all’architettura di un particolare processore.
● Linguaggi assembly: le istruzioni per essere eseguite dovevano essere tradotte dal
programma “assembler”. Linguaggio di basso livello perché manteneva una
dipendenza dall’architettura hardware per cui si scriveva il programma.
● Linguaggi di alto livello: utilizzabili su computer diversi; Fortran, Algol, Lisp, Cobol.
L‘applicazione di questi linguaggi era destinata ad ambiti scientifici o commerciali
● Uso sistemi operativi: i software di sistema che si occupano della gestione delle
componenti hardware del computer. Ciò liberava i programmatori dall'impegno di
prevedere in ogni programma le istruzioni per la gestione delle periferiche.
● Al 1972 risale l'ideazione del C, un linguaggio di alto livello che però fornisce anche
molti strumenti per interfacciarsi con l'architettura hardware
● Nel 1975 Paul Allen e Bill Gates idearono l'Altair BASIC, il primo linguaggio di
programmazione scritto per personal computer
Questo linguaggio di alto livello, semplice e adatto a un uso generale, si diffuse su
numerose piattaforme dei 70 come Altair, Commodore e Atari, sui primi computer
Apple e infine su quelli IBM, diventando in seguito il linguaggio più diffuso su tutti i pc
basati sul sistema operativo DOS
● Da allora sono nati centinaia di altri linguaggi di programmazione di alto livello, tra i
più conosciuti ci sono Pascal, Visual Basic C++ C#, Java e Python.

Modelli di programmazione: top down e bottom-up

➔ L’algoritmo si basa sull’astrazione


➔ Metodo top-down: analizza il problema nella sua generalità per individuare le parti
significative che lo compongono e poi per scomposizioni successive, fino ad arrivare
a problemi semplici, la cui soluzione è facilmente traducibile in algoritmi e quindi in
codice per il computer.
➔ Metodo bottom-up: si concentra inizialmente sulla soluzione di parti specifiche del
problema, per poi costruire una connessione tra le parti che sia capace di fornire la
soluzione.
Linguaggi e paradigmi della programmazione

I linguaggi di programmazione di alto livello hanno un proprio vocabolario e una propria


sintassi.
● Linguaggi specializzati: forniscono strumenti avanzati pensati per un'applicazione
particolare.
● Linguaggi settoriali: hanno un uso limitato a un solo settore.
● Linguaggio di uso generale si prestano ad applicazioni di ogni genere.
Questi ultimi si possono suddividere in base ai paradigmi di programmazione.
Nel paradigma imperativo le istruzioni dicono al computer quale azione eseguire.
● Programmazione procedurale: modello top-down, i programmi sono formate da
funzioni (procedure). Una funzione principale richiama le altre sotto funzioni e così
via. :: Pascal e C
● Programmazione orientata agli oggetti: modello bottom-up. L'elemento di base è
un oggetto software che può comprendere sia dati che le procedure con cui
elaborarli e si definiscono in grande dettaglio tutti gli oggetti e poi li si collega tra loro
per formare il programma completo. :: C++, Java, Python.
Linguaggi compilati e linguaggi interpretati

➔ L'insieme delle istruzioni che formano un programma scritto in un linguaggio di alto


livello si chiama codice sorgente o file sorgente o semplicemente il codice.
➔ Il linguaggio di programmazione deve essere tradotto per poter essere compreso ed
elaborato dai microprocessori.
➔ La traduzione è effettuata in modo automatico da speciali programmi che sono
chiamati compilatori se traducono l'intero programma in un colpo solo oppure gli
interpreti che trasformano le istruzioni in una volta.
➔ Processo della compilazione: i file con il codice sorgente (.c) vengono letti dal
compilatore che ne verifica la correttezza lessicale e sintattica e li trasforma in
linguaggio macchina creando per ognuno un file oggetto ( con estensione.obj).
Il linker produce un collegamento con il file oggetto includendo anche tutte le
funzioni esterne e crea il file eseguibile finale che in Windows ha estensione .exe.
➔ Interpretazione: attraverso l'interprete le istruzioni del codice sorgente vengono
tradotte in linguaggio macchina ed eseguite al momento. L'interpretazione è più
lenta ma può essere preferibile per applicazioni specifiche come quelle web o per
progetti complessi poiché permette una verifica più immediata del funzionamento del
software.
➔ Alcuni linguaggi uniscono il processo di compilazione e quello di interpretazione
come per esempio Java che compila il codice sorgente così da ottenere il bytecode
che si avvicina al linguaggio macchina e può essere eseguito da una macchina
virtuale chiamato a JVM che è replicabile via software su qualsiasi piattaforma.
Questo sistema ha due vantaggi: i file creati possono essere interpretati più
velocemente e sono portabili.
Sintassi e semantica

Un codice deve essere sintatticamente corretto. La sintassi → regole da seguire per


costruire frasi corrette in quel linguaggio. Semantica → insieme dei significati da attribuire
alle frasi costruite nel linguaggi.
Gli errori di programmazione il testing e il debugging.

Ogni programma va provato con la procedura chiamata testing.


Versione Alfa → che viene testata all'interno dell'azienda produttrice.
Versione beta→ testata dagli utenti finali.
Risoluzione problemi → debugging
● Errore di sintassi: consistono nella scrittura errata di comando o di una variabile e
vengono rilevate dal compilatore.
● Errori runtime: dovuti a situazioni particolari che non sono state previste in fase di
progettazione
● Errori di logica o semantica: errori di progettazione e fanno sì che il programma
Non produca il tipo di risultato che si attende.
Per individuare i problemi si possono usare le tabelle di traccia oppure i debugger.
I commenti e la leggibilità del codice

È sempre bene se inserire nel codice commenti esplicativi e in tentazioni così da fare
facilitare la lettura e la manutenzione futura nei programmi.

Gli elementi del linguaggio

La storia del c

Nel 1972 Dennis Ritchie inventò il linguaggio di programmazione C e lo usò per riscrivere
unix. Questo software di sistema diventa il sistema operativo più diffuso sui mainframe, i
grandi computer centrali che all'epoca elaboravano i dati e con cui gli utenti comunicavano
tramite terminali periferici. Dall’unix scritto in C sarebbero in seguito derivati il sistema
operativo MacOS della Apple e quello Open Source Linux.
Caratteristiche generali:
● il C usa un vocabolario e una sintassi piuttosto ristretti
● mette a disposizione del programmatore strumenti che consentono una buona
gestione dell'architettura hardware e dalla memoria RAM
● è un linguaggio procedurale e modulare perciò un programma ben scritto in C è
facile da leggere modificare e riutilizzare
➢ Il successo del C ha presto reso necessaria una sua regolamentazione e
standardizzazione così da fissare regole universali per il suo uso.

Il vocabolario

➔ Ogni linguaggio di programmazione ha un proprio vocabolario costituito da un nucleo


di keyword
➔ Le keyword sono i tipi di dati e cicli di istruzione fondamentali
➔ Il vocabolario del linguaggio C in tutto usa 32 parole chiave
La sintassi del C

● Ogni variabile viene introdotta specificando il suo tipo di dati


● Per assegnare un valore a una variabile si usa il simbolo =
● Le istruzioni di ogni funzione devono essere racchiuse tra parentesi graffe
● Ogni istruzione di una funzione deve terminare con il punto e virgola
➢ Il C è un linguaggio case sensitive
Variabili, costanti e tipi di dati

Variabile: → corrisponde a uno spazio di memoria RAM contenente un valore che può
mutare nel corso di elaborazione
→ Nel linguaggio C ogni variabile è identificata dalla definizione del tipo di dato che
contiene e da un nome assegnato dal programmatore.
Le costanti: → hanno un valore che non cambia nel corso dell'elaborazione perciò possono
risiedere nella memoria di massa anziché nella RAM.
→ vanno precedute dalla parola const.
Tipi di dati: → char: usa 8 bit di memoria
→ int: 32 bit di memoria
→ float: 32 bit di memoria e permette di rapp. cifre decimali
➢ A partire da questi ci sono derivati che sono short (16), long (32) e long long (64)
➢ Double (64) e long double (128)
➢ I primi sei possono essere di tipo signed o unsigned
Le funzioni

➔ blocchi di istruzione che si possono riutilizzare in programmi diversi


➔ considerata come Black Box che risolve un problema particolare
➔ è necessario conoscere l'interfaccia ma non l'implementazione
Gli elementi caratterizzanti di una funzione C sono:
● Il tipo di dato: che la funzione restituirà come output
● Il nome: attraverso cui può essere richiamato
● Gli argomenti: ossia la quantità e il tipo di dati dei valori di input che verranno
elaborati nella funzione racchiusi in()
● Le istruzioni: specificano in che modo gli argomenti debbano essere elaborati
la fine del blocco di istruzioni vengono delimitati con parentesi graffe
➔ In un programma C nel codice si definisce una funzione che deve sempre chiamarsi
main.

Le librerie

Raccolta di funzioni pronte all'uso richiamabile all'interno di un programma per risolvere


specifici problemi.
Offrono due vantaggi:
● Le funzioni più comuni e frequenti non vanno riscritte ogni volta ma è sufficiente
richiamare la libreria che le contiene
● Attraverso la libreria e il linguaggio può evolversi e caratterizzarsi offrendo ai
programmatori strumenti già pronti per particolari compiti.
● In C, un programma che usa funzioni esterne deve iniziare con le cosiddette direttive
cioè con istruzioni del tipo #include.

La struttura di base dei programmi in C

● l'istruzione #include <stdio h> segnala al compilatore che il programma userà una
funzione contenuta nella libreria standard dedicata alle funzioni di input/output,
stdio.h, l'estensione .h sta per header cioè testata iniziale.
● l'istruzione int main (void) dichiara una funzione che non è di libreria: infatti main è la
funzione principale, che dev'essere presente in ogni programma in C ed è definita dal
codice del programma
● ogni istruzione di dichiarazione deve specificare il tipo di dati trattati, il nome della
funzione e suoi argomenti, racchiusi tra parentesi tonde
● la parentesi graffa aperta indica l'avvio dell'elaborazione: corrisponde al blocco
d'inizio del diagramma di flusso
● printf con tra parentesi l’argomento racchiuso tra virgolette. Il comando \n (new line)
fa sì che nell'output il cursore vada a capo al termine della frase.
● la parentesi graffa chiusa { indica il termine dell'elaborazione corrisponde al blocco
finale del diagramma di flusso
● Ci possono essere commenti
La lettura dei dati di input

#include <stdio.h>
int main ()
{
float cambio, dollari, euro;
printf ("Inserisci il valore in euro di un dollaro: ");
scanf ("%f", &cambio);
printf ("Inserisci la cifra in dollari");
scanf ("%f", &dollari);
euro= dollari*cambio;
printf ("La cifra equivale a %f", euro);
printf ("euro");
}
● punto al posto della virgola
Operatori aritmetici

+-*/%

Potrebbero piacerti anche