Programmazione C Massimo Callisto De Donato
www.cs.unicam.it/massimo.callisto
LEZIONE 0 - INTRODUZIONE
Università degli studi di Camerino Scuola di scienze e tecnologia - Sezione Informatica
A.A. 2011/12
Obbiettivi del corso
• Conoscere il linguaggio di programmazione C
• Programmare in linguaggio C
• Padroneggiare gli elementi base del linguaggio
• Conoscenze base da poter applicare in altri linguaggi di programmazione (e.g. C++, JAVA)
• Introduzione ai concetti più avanzati del linguaggio C
Programma nel dettaglio • Introduzione ai linguaggi di programmazione; principi fondamentali;
introduzione storica. Linguaggi funzionali, dichiarativi e logici.
• Organizzazione di un programma in C.
• Tipi, operatori ed espressioni: variabili e costanti; dichiarazioni; operatori aritmetici e logici; conversioni di tipo; espressioni condizionali.
• Strutture di controllo: if-else, else-if, switch-case; cicli for, while e do-while. Array monodimensionali e multidimensionali.
• Funzioni, passaggio di parametri; variabili esterne e static; regole di scope; header file; ricorsione.
• Puntatori e argomenti correlati.
• Strutture; vettori di strutture; puntatori a strutture; strutture ricorsive.
• Input ed output (cenni): standard; accesso a file; lettura e scrittura su file.
Materiale ed esame finale • Testi di riferimento proposti
– B.W. Kernighan e D.M. Ritchie Linguaggio C, II Edizione, Jackson Libri, 1989. – H. Schildt C Guida Completa Mc-Graw-Hill Libri Italia, 1995. – Bellini, A. Guidi Linguaggio C Mc-Graw-Hill Libri Italia, 1999.
• Modalità di esame
– Progetto didattico utilizzando i concetti visti a lezione – Da consegnare qualche giorno prima dell’appello – Da discutere in sede di esame insieme a domande di teoria.
• Per lo sviluppo:
– Code::Blocks per C/C++ (www.codeblocks.org/) – Bloodshed Dev-C++ (www.bloodshed.net/devcpp.html)
• Informazioni aggiuntive – @ [email protected] – www.cs.unicam.it/massimo.callisto – Aula dottorandi del dipartimento di Informatica
I linguaggi di programmazione
• Un linguaggio di programmazione è un linguaggio artificiale progettato per impartire delle istruzioni ad un elaboratore
• Un programma è un algoritmo codificato usando un linguaggio di programmazione (e.s. C).
• Ogni linguaggio di programmazione ha:
– una precisa sintassi: • definisce quali sono le frasi legali del linguaggio
– precisa semantica: • definisce il significato di ogni fase
sintatticamente corrette
Evoluzione
• Nel corso degli anni sono stati sviluppati un certo numero di linguaggi di programmazione differenti
• La scelta dipende dal dominio applicativo e dal tipo di problema che vogliamo risolvere
Livelli di astrazione
• Un calcolatore può essere visto a diversi livelli di astrazione.
• Ad ogni livello usiamo un modo specifico per comunicare con il calcolatore.
Livelli di astrazione
• Un calcolatore può essere visto a diversi livelli di astrazione.
• Ad ogni livello usiamo un modo specifico per comunicare con il calcolatore.
Hardware
E costituita da flusso input/output di dati
• Una memoria centrale in cui vengono
memorizzati sia i programmi che i dati
• Un agente di calcolo, detto processore o
CPU (Central Process Unit) che
esegua le azioni programmate sui dati iniziali
Livelli di astrazione
• Un calcolatore può essere visto a diversi livelli di astrazione.
• Ad ogni livello usiamo un modo specifico per comunicare con il calcolatore.
Linguaggio macchina
• Può essere interpretato ed eseguito senza “mediazioni”
• Corrispondono ad operazioni direttamente eseguibili dall’hardware
• Sono strettamente correlate all’architettura dell’elaboratore
• Sono sequenze binarie con cui vengono codificate sia le istruzione che i loro operandi
Livelli di astrazione
• Un calcolatore può essere visto a diversi livelli di astrazione.
• Ad ogni livello usiamo un modo specifico per comunicare con il calcolatore.
Linguaggio assembler
• Costituisce un primo parziale passo verso la semplificazione della programmazione
• Le istruzioni binarie con dei codici mnemonici più facilmente comprensibili dall’uomo
Livelli di astrazione
• Un calcolatore può essere visto a diversi livelli di astrazione.
• Ad ogni livello usiamo un modo specifico per comunicare con il calcolatore.
Linguaggi di alto livello
• Sono più simili ai linguaggi naturali rispetto alle sequenze di 0 e 1 del linguaggio macchina, ma anche rispetto al linguaggio assembler
• Consentono l’utilizzo di simboli matematici e parole chiave tipiche dei linguaggio naturale
Linguaggio di alto livello • L’aumento della complessità dei programmi ha reso necessario
sviluppare linguaggi di programmazione più semplici dei linguaggi assembler.
• Questi permettono di usare costrutti allo scopo di:
1. Astrazione dalla macchina di riferimento
2. Semplificazione della scrittura dei programmi
3. Similarità con il ragionamento umano
• Appositi software - compilatori - provvedono:
a) Tradurre le istruzioni dei un linguaggio di alto livello (codice sorgente)
b) in equivalente codice eseguibile
c) dalla macchina di riferimento (codice oggetto)
• Sono meno efficienti rispetto al linguaggio assembler e al linguaggio macchina
Tipologie • I linguaggi di programmazione possono essere ulteriormente classificati in
base al loro paradigma di programmazione.
• Ci riferiamo alla metodologia con cui vengono specificati i programmi.
• Non ci riferiamo ai diversi linguaggi di programmazione (i costrutti ed i modi sono spesso simili) ma a come viene organizzata la programmazione.
• I principali paradigmi di programmazione:
– Programmazione imperativa (e.g. C)
– Ad oggetti (e.g. C++/Java)
– Funzionale (e.g. Lisp).
Programmazione imperativa • Un programma è una serie di istruzioni da eseguire in sequenza.
• Costrutti dedicati permettono di alterare tale flusso (di esecuzione): – if-then-else
– cicli
– procedure e funzioni con passaggio di parametri
• Il programmatore deve: – Definire le strutture dati
– Gli algoritmi che operano su di essi
• L’esecuzione non è altro che l’esecuzione sulla CPU delle sequenze di istruzioni.
• Esempi: Fortran, Cobol, Pascal, C.
Storia del linguaggio C • Sviluppato nel 1973 (AT&T Bell Labs) da Dennis M. Ritchie. Nel 1978 venne
formalizzato insieme a B. W. Kernighan.
• Caratteristiche fondamentali: intuitivo, flessibile, estremamente potente ed efficacie nel codice macchina prodotto.
• Tra i linguaggi di programmazione ad alto livello è il più potente e veloce.
• Presto uscirono compilatori per il linguaggio C per tutte le nuove architetture hardware.
• Nel 1983, l’American National Standards Institute (ANSI) definì uno standard per il linguaggio C.
• La versione finale dello standard C (1989) venne tradotta nel 1999 come standard ISO C Standard ANSI/ISO.
Elementi principali • Elementi del linguaggio:
Case sensitive (distingue tra minuscole e maiuscole) Tipi di dati base (interi, vettori, …) Strutture di controllo (if, while, ...) Decomposizione dei programmi (Funzioni e librerie)
o Funzioni standard di I/O (fles, terminale, stampanti) o Gestione stringhe o Gestione dinamica della memoria o Funzioni matematiche o altre librerie
• La grande potenza: Definire tipi di dati derivati (typedef, strutture) Accesso all'hardware se necessario (puntatori) Riutilizzo del codice (librerie del S.O, esterne) ...
• Ma.. Il linguaggio C richiede una certa padronanza di utilizzo!