G. Mecca – M. Samela – Università della Basilicata
Programmazione Procedurale in Linguaggio C++
Il Linguaggio C Concetti Avanzati
versione 3.0
Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina)
G. Mecca - Programmazione Procedurale in Linguaggio C++ 2
Sommario
m
Elementi di Base
ðIstruzione printf ðIstruzione scanfm
Strutture di Controllo
m
Sottoprogrammi
m
Tipi Strutturati
Linguaggio C: Concetti Avanzati >> Sommario
G. Mecca - Programmazione Procedurale in Linguaggio C++ 3
Elementi di Base
m
In generale
ðil C è molto simile al “clean C” che abbiamo approfondito
ðper alcuni aspetti è più spartano
ðe questo lo rende in molti casi più complesso come linguaggio di programmazione
m
Nel seguito
ðl’elenco delle principali differenze
Linguaggio C: Concetti Avanzati >> Elementi di Base
Elementi di Base
m
Attenzione
ðimparare a scrivere programmi complessi in C NON è tra gli obiettivi del corso
ðsi tratta di un livello secondario
ðle differenze vengono illustrate a scopo di completezza, e per preparare gli studenti che dovessero successivamente programmare in C ad ulteriori approfondimenti
Linguaggio C: Concetti Avanzati >> Elementi di Base
G. Mecca - Programmazione Procedurale in Linguaggio C++ 5
Elementi di Base
m
Tipo di ritorno del main
ðnormalmente int (non void, come ANSI C++)
m
Libreria di input/output
ð#include <stdio.h>
m
Definizione di costanti
ðesiste la parola chiave “const”, ma ha una semantica leggermente diversa
ðnormalmente si utilizza la direttiva #define es: #define PIGRECO 3.14
Linguaggio C: Concetti Avanzati >> Elementi di Base
G. Mecca - Programmazione Procedurale in Linguaggio C++ 6
Elementi di Base
m
Istruzioni di lettura e di stampa
ðsono basate sui flussi standard di ingresso e uscita come in tutti i linguaggi
ðma ci sono differenze sintattiche
m
Differenza principale
ðnon esistono cout e cin (che sono oggetti) ðistruzione printf per scrivere dati
ðistruzione scanf per leggere dati
Linguaggio C: Concetti Avanzati >> Elementi di Base
G. Mecca - Programmazione Procedurale in Linguaggio C++ 7
Istruzione printf
m
Sintassi
ðprintf(<stringa>);
ðprintf(<stringaFormato>, argomenti);
m
Stringa formato
ðstringa che descrive la natura degli argomenti successivi
m
Esempi
ðprintf(“Immetti il valore \n”);
ðprintf(“Il cerchio vale: %d”, cerchio);
Linguaggio C: Concetti Avanzati >> Elementi di Base
Istruzione printf
m
Descrittori di formato
ð%d: numero intero ð%f: numero reale ð%c: carattere singoloð%s: sequenza di caratteri (stringa)
m
Attenzione
ðin C non esiste il tipo stringa
ðle stringhe si rappresentano come array di caratteri
Linguaggio C: Concetti Avanzati >> Elementi di Base
G. Mecca - Programmazione Procedurale in Linguaggio C++ 9
Istruzione scanf
m
Sintassi
ðscanf(<stringaFormato>, &variabile);
m
Stringa formato
ðanaloga a quella della printf
m
Esempi
ðscanf(“%d”, &raggio);
m
Nota
ðè indispensabile la & prima della variabile
Linguaggio C: Concetti Avanzati >> Elementi di Base
ATTENZIONE:
la mancanza della &
è una fonte di errore molto frequente
G. Mecca - Programmazione Procedurale in Linguaggio C++ 10
Istruzione scanf
m
Infatti
ðscanf è una procedura
ðil secondo argomento deve essere
modificato attraverso il corrispond. param.
m
Ma
ðin C esistono solo parametri standard
ðper simulare la semantica dei parametri per riferimento si utilizzano i puntatori
Linguaggio C: Concetti Avanzati >> Elementi di Base
G. Mecca - Programmazione Procedurale in Linguaggio C++ 11 Linguaggio C: Concetti Avanzati >> Elementi di Base
// Calcolo della superficie del cerchio
#include <stdio.h>
#define PIGRECO 3.14 int main() {
// Dichiarazioni int raggio;
float cerchio, circonf;
// Operazioni
printf("Immetti la lungh. del raggio\n");
printf("(deve essere un numero intero)\n");
scanf("%d", &raggio);
cerchio = raggio * raggio * PIGRECO;
circonf = 2 * PIGRECO * raggio;
printf("La circonferenza misura: %f \n", circonf);
printf("Il cerchio ha superficie: %f \n", cerchio);
return 0;
}
Un Semplice Programma in C
>>
Istruzione scanf
m
Attenzione
ðla scanf esegue un input formattato
ðesistono ulteriori procedure per effettuare l’input non formattato nel caso di stringhe
m
Le stringhe in C
ðnon esiste il tipo string
ðuna stringa è un array di caratteri terminato in maniera particolare (con un carattere ‘\0’)
Linguaggio C: Concetti Avanzati >> Elementi di Base
G. Mecca - Programmazione Procedurale in Linguaggio C++ 13
Esempio
#include <stdio.h>
int main() { char targa[8];
char modello[20];
printf("Immetti la targa : ");
scanf("%s", &targa); // input formattato getchar(); // equivalente della ignore printf("Immetti il modello : ");
gets(modello); // input non formattato printf("Dati dell'automobile : \n");
printf("Targa : %s\n", targa);
printf("Modello : %s\n", modello);
return 0;
}
Linguaggio C: Concetti Avanzati >> Elementi di Base
NOTA: scanf e gets
aggiungono automaticamente il carattere ‘\0’ al termine della stringa letta
G. Mecca - Programmazione Procedurale in Linguaggio C++ 14
Istruzione scanf
m
Inoltre
ðnon è possibile effettuare il confronto tra stringhe utilizzando ==
ðè necessario utilizzare la funzione strcmp ðstrcmp(s1, s2) ritorna 0 se le due stringhe
sono uguali, altrimenti un valore diverso da 0 ðfa parte (come tutte le principali funzioni sulle
stringhe) della libreria string.h
Linguaggio C: Concetti Avanzati >> Elementi di Base
G. Mecca - Programmazione Procedurale in Linguaggio C++ 15
Esempio
#include <stdio.h>
#include <string.h>
int main() {
char targa[8];
printf("Immetti la targa : ");
scanf("%s", &targa); // input formattato if (strcmp(targa, "ab762de") == 0) {
printf("Auto corretta\n");
}
return 0;
}
Linguaggio C: Concetti Avanzati >> Elementi di Base
Strutture di Controllo
m
Strutture di controllo in C
ðle istruzioni hanno la stessa sintassi e la stessa semantica
m
Differenza principale
ðin C NON esiste il tipo bool
ðè necessario simularne il funzionamento con espressioni di tipo int
ðvero se il valore dell’espressione è > 0 ðfalso se il valore dell’espressione è = 0
Linguaggio C: Concetti Avanzati >> Strutture di Controllo
G. Mecca - Programmazione Procedurale in Linguaggio C++ 17
Un Esempio: Media con For in C
#include <stdio.h>
int main() {
int voto, sommaVoti;
float media;
int numeroEsami, i;
printf("Quanti esami hai sostenuto ? \n");
scanf("%d", &numeroEsami);
sommaVoti = 0;
for (i = 0; i < numeroEsami; i++) {
printf("Immetti il voto di un esame \n");
scanf("%d", &voto);
sommaVoti += voto;
}
if (numeroEsami > 0) {
media = ((float)sommaVoti) / numeroEsami;
printf("La media vale: %f \n", media);
} else {
printf("Non hai fornito nessun voto \n");
}
return 0;
}
Linguaggio C: Concetti Avanzati >> Strutture di Controllo
G. Mecca - Programmazione Procedurale in Linguaggio C++ 18
Un Esempio: Media con For in C
#include <stdio.h>
int main() {
int voto, sommaVoti, numeroEsami;
float media;
int continua;
continua = 1;
numeroEsami = 0;
sommaVoti = 0;
printf("Calcolo della media (versione C)\n");
while (continua) {
printf("Immetti il voto di un esame \n");
printf("(0 per fermarti) \n");
scanf("%d", &voto);
if (voto == 0) { continua = 0;
} else {
numeroEsami++;
sommaVoti += voto;
} }
if (numeroEsami > 0) {
media = ((float)sommaVoti) / numeroEsami;
printf("La media vale: %f \n", media);
} else {
printf("Non hai fornito nessun voto \n");
} return 0;
}
Linguaggio C: Concetti Avanzati >> Strutture di Controllo
>> mediaForConvalida.c
>> mediaWhileConvalida.c
G. Mecca - Programmazione Procedurale in Linguaggio C++ 19
Sottoprogrammi
m
Sostanzialmente
ði sottoprogrammi in C sono usati allo stesso modo del C++
m
Un’unica, sostanziale, differenza
ðin C esistono solo parametri per valore ðNON esistono parametri per riferimentom
Come si modificano gli argomenti ?
ðattraverso i puntatori (discussi in seguito >>)
Linguaggio C: Concetti Avanzati >> Sottoprogrammi
>> equazioni1.c
Tipi Strutturati
m
Tipi strutturati in C
ðessenzialmente gli stessi del C++
m
Array
ðpossono essere monodimesionali o multidimensionali
ðvengono utilizzati esattamente allo stesso modo del C++
ðanche il passaggio dei parametri è uguale
Tipi Strutturati: Dettagli e Approfondimenti >> Differenze con il C
>> temperature1.c
>> sommaDiMatrici.c
G. Mecca - Programmazione Procedurale in Linguaggio C++ 21
Differenze con il C
m
Strutture
ðdue differenze essenziali
ðla dichiarazione del modello di struttura è sintatticamente diversa: utilizzeremo typedef ðassenza del tipo “string”: per le stringhe è
necessario utilizzare gli array di caratteri (ci sono alcune sottigliezze che ignoreremo)
m
Naturalmente
ðcambia il passaggio dei parametri (>>)
Tipi Strutturati: Dettagli e Approfondimenti >> Differenze con il C
>> partite1.c
G. Mecca - Programmazione Procedurale in Linguaggio C++ 22
Definizione di Tipi con typedef
m
Il sistema di tipi del C++
ðconsente di “definire” nuovi tipi a partire dai tipi di base
m
Costruttori di tipo
ðtipi enumerati ðtipi struttura ðtipi arrayðtipi riferimento e tipi puntatore
Tipi Strutturati: Dettagli e Approfondimenti >> Definizione di Tipi con typedef
G. Mecca - Programmazione Procedurale in Linguaggio C++ 23
Definizione di Tipi con typedef
m
Di questi
ði tipi struttura e i tipi enumerati possono essere nominati
ðgli altri hanno nomi particolari
m
Esempio: dato il tipo int
ðint[] è il tipo degli array di interi ðint* è il tipo dei puntatori ad intero ðint& è il tipo dei riferimenti a intero
Tipi Strutturati: Dettagli e Approfondimenti >> Definizione di Tipi con typedef
Definizione di Tipi con typedef
m
In effetti
ðesiste nel linguaggio un meccanismo per dare un nome a qualsiasi tipo
m
typedef
ðistruzione del linguaggio che consente di dare un identificatore ad un tipo strutturato ðe di utilizzare successivamente
l’identificatore per le dichiarazioni dei dati
Tipi Strutturati: Dettagli e Approfondimenti >> Definizione di Tipi con typedef
G. Mecca - Programmazione Procedurale in Linguaggio C++ 25
Definizione di Tipi con typedef
m
Sintassi
typedef <definizioneDelTipo> <nome>;
m
dove
ð<definizioneDelTipo> è la definizione di un tipo (di base o strutturato)
ð<nome> è un identificatore
Tipi Strutturati: Dettagli e Approfondimenti >> Definizione di Tipi con typedef
G. Mecca - Programmazione Procedurale in Linguaggio C++ 26
Definizione di Tipi con typedef
m
Esempi
typedef struct {
float a, b, c;
} equazione;
typedef int arrayDiInteri[10];
typedef int interi;
equazione eq;
arrayDiInteri a;
interi x;
Tipi Strutturati: Dettagli e Approfondimenti >> Definizione di Tipi con typedef
effetto equivalente a:
struct equazione { float a, b, c;
}
G. Mecca - Programmazione Procedurale in Linguaggio C++ 27
Differenze con il C
m
In effetti
ðnon c’è nessuna differenza tra la costruzione di liste e pile in C++ e in C
ðrappresentazione con array e indicatore di riempimento
ðattenzione solo alla sintassi per dichiarare i record
ðe, come al solito, al passaggio dei parametri
Strutture di Dati: Approfondimenti >> Differenze con il C
Differenze con il C
#include <stdio.h>
#define N 100
typedef struct { int indicatore;
float elementi[N];
} lista;
int main() { lista l;
...
return 0;
}
Strutture di Dati: Approfondimenti >> Differenze con il C
l.valori[2] xxx l
#104
l.valori[3] xxx
#105
l.valori[4] xxx
#106
... ...
...
xxx
#202
xxx
#99
l.valori[99] xxx
#201
l.valori[1] xxx
#103
l.valori[0] xxx
#102
l.valori #102
#101
l.indicatore xxx
#100
G. Mecca - Programmazione Procedurale in Linguaggio C++ 29
Differenze con il C
#include <stdio.h>
#define N 100
typedef struct {
char squadraCasa[20];
char squadraTrasf[20];
int goalCasa;
int goalTrasf;
char segno;
} partita;
typedef struct { int indicatore;
partita elementi[N];
} listaDiPartite;
int main() {
listaDiPartite l;
...
return 0;
}
Strutture di Dati: Approfondimenti >> Differenze con il C
G. Mecca - Programmazione Procedurale in Linguaggio C++ 30
Passaggio dei Parametri in C
m
In C non esistono riferimenti
ðper fare la stessa cosa, il sottoprogramma dovrebbe avere due parametri di tipo puntatore
ðvoid scambia (int* px, int* py);
ðgli argomenti dovrebbero essere puntatori ad a e b
ðint* pa=&a; int* pb=&b;scambia(pa, pb);
ðnel sottoprogramma dovrei usare la deref.
ðz = *px; *px = *py; *py = z;
Tipi Strutturati: Concetti Avanzati >> Passaggio dei Parametri
G. Mecca - Programmazione Procedurale in Linguaggio C++ 31
Passaggio dei Parametri in C
void scambia (int* px, int* py);
void main() { int a, b;
cout << "Immetti il valore di a: "; cin >> a;
cout << "Immetti il valore di b: "; cin >> b;
int* pa = &a;
int* pb = &b;
scambia(pa, pb); // in alternativa: scambia(&a, &b);
cout << "Valore di a dopo lo scambio: " << a << endl;
cout << "Valore di b dopo lo scambio: " << b << endl;
}
void scambia (int* px, int* py) { int z;
z = *px;
*px = *py;
*py = z;
return;
}
Tipi Strutturati: Concetti Avanzati >> Passaggio dei Parametri
>> scambio2.cpp
Passaggio dei Parametri in C
m
In C
ðquesta tecnica deve essere utilizzata ogni volta che ci sono argomenti da modificare
m
Riassumendo
ðil parametro per riferimento viene surrogato da un parametro puntatore
ðl’argomento è un puntatore al dato ðnel sottoprogramma è necessario
dereferenziare il puntatore per usare il dato
Tipi Strutturati: Concetti Avanzati >> Passaggio dei Parametri
G. Mecca - Programmazione Procedurale in Linguaggio C++ 33
Passaggio dei Parametri in C
#include <stdio.h>
void scambia (int* px, int* py);
void main() { int a, b;
printf("Immetti il valore di a: ");
scanf("%d", &a);
printf("Immetti il valore di b: ");
scanf("%d", &b);
scambia(&a, &b);
printf("Valore di a dopo lo scambio: %d\n", a);
printf("Valore di b dopo lo scambio: %d\n", b);
}
void scambia (int* px, int* py) { int z;
z = *px;
*px = *py;
*py = z;
return;
}
Tipi Strutturati: Concetti Avanzati >> Passaggio dei Parametri
>> scambio2.c
G. Mecca - Programmazione Procedurale in Linguaggio C++ 34
Passaggio dei Parametri in C
m
La procedura scanf
ðdue parametriðuna stringa (il formato): standard ðil puntatore ad un dato da modificare
m
Di conseguenza
ðl’argomento deve essere un puntatore al dato da modificare
ðscanf(“%d”, &a);
ðscanf(“%d”, &b);
Tipi Strutturati: Concetti Avanzati >> Passaggio dei Parametri
G. Mecca - Programmazione Procedurale in Linguaggio C++ 35
Passaggio dei Parametri in C
m
Un caso interessante
ðche succede se scanf deve essere chiamata in un sottoprogramma
m
Esempio
void leggi (int* px, int* py) {
printf("Immetti il valore della I var.: ");
scanf("%d", &(*px));
printf("Immetti il valore della II var.: ");
scanf("%d", py);
return;
}
Tipi Strutturati: Concetti Avanzati >> Passaggio dei Parametri
indirizzo di memoria del dato puntato da px; ovvero: il valore di px - &(*p) = p
>> scambio3.c
Passaggio dei Parametri in C
m Attenzione
ðl’uso di questa tecnica in C è dovuto esclusivamente alla mancanza dei riferimenti
ðil puntatore “simula” la funzione di intermediario del riferimento
m Svantaggio
ðla manipolazione dei parametri è più complessa ed è più facile fare errori
ðdi conseguenza in C++ non è opportuno usare questo meccanismo
ðlo strumento corretto sono i parametri per riferimento
Tipi Strutturati: Concetti Avanzati >> Passaggio dei Parametri
G. Mecca - Programmazione Procedurale in Linguaggio C++ 37
Passaggio dei Parametri in C
m
A questo punto
ðsiamo in grado di interpretare
completamente il codice dei programmi precedentemente visti in C
ðincluso l’utilizzo dei parametri
Tipi Strutturati: Concetti Avanzati >> Passaggio dei Parametri
>> equazioni1.c
>> partite1.c
G. Mecca - Programmazione Procedurale in Linguaggio C++ 38
Riassumendo
m
Elementi di Base
Linguaggio C: Concetti Avanzati >> Sommario
G. Mecca - Programmazione Procedurale in Linguaggio C++ 39
Termini della Licenza
m This work is licensed under the Creative Commons Attribution- ShareAlike License. To view a copy of this license, visit
http://creativecommons.org/licenses/by-sa/1.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
Termini della Licenza
m Questo lavoro viene concesso in uso secondo i termini della licenza “Attribution-ShareAlike” di Creative Commons. Per ottenere una copia della licenza, è possibile visitare
http://creativecommons.org/licenses/by-sa/1.0/ oppure inviare una lettera all’indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.