• Non ci sono risultati.

Programmazione Procedurale in Linguaggio C++

N/A
N/A
Protected

Academic year: 2021

Condividi "Programmazione Procedurale in Linguaggio C++"

Copied!
20
0
0

Testo completo

(1)

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 scanf

m

Strutture di Controllo

m

Sottoprogrammi

m

Tipi Strutturati

Linguaggio C: Concetti Avanzati >> Sommario

(2)

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

(3)

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

(4)

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

(5)

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

(6)

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

(7)

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

(8)

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

(9)

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

(10)

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 riferimento

m

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

(11)

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

(12)

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

(13)

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;

}

(14)

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

(15)

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

(16)

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

(17)

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

(18)

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

(19)

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

(20)

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.

Riferimenti

Documenti correlati

Concetti Introduttivi: Linguaggi &gt;&gt; Ciclo di Vita di un Programma.. Mecca - Programmazione Procedurale in Linguaggio

Strutture di Controllo: Conclusioni &gt;&gt; Convenzioni di Stile.. Mecca - Programmazione Procedurale in Linguaggio C++ 11. Convenzioni

il sottoprogramma lavora su tre dati di tipo float chiamati a,b,c attraverso cui è possibile modificare i corrispondenti argomenti. istruzione

Sottoprogrammi: Metodologia di Sviluppo &gt;&gt; Tecniche di Test e

ðDefinizione di Funzioni ðDefinizione di Procedure ðChiamata di Funzioni ðChiamata di Procedure ðPassaggio dei Parametri ðProgrammazione Modulare. Termini

Strutture di Dati: Lista &gt;&gt; Rappresentazione con Record e Array. ATTENZIONE ai

Strutture di Dati: Lista &gt;&gt; Inserimenti e Cancellazioni. Mecca - Programmazione Procedurale in Linguaggio

Strutture di Dati: Lista &gt;&gt; Gestione dei File. i conta il numero di valori prelevati dal