Programmazione Procedurale in Linguaggio C Elementi di Base
Programmazione Procedurale in Linguaggio C++ Elementi di Base Parte 7 Dettagli e Approfondimenti versione 2. 6 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina) G. Mecca – M. Samela – Università della Basilicata
Elementi di Base: Dettagli e Approfondimenti >> Sommario m Ricapitolazione m ANSI C++ ðCompilatori in Ambiente Linux m Approfondimenti sui Tipi di Dato ðAltri Tipi di Dato m Operatore di Cast m Espressioni m Differenze con il C G. Mecca - Programmazione Procedurale in Linguaggio C++ 2
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione m Elementi di Base ðnozioni sintattiche di base ðnozioni sulla dichiarazione dei dati ðnozioni sulle operazioni di base sui dati di un programma m In sintesi ðquello che serve per scrivere programmi che si comportano come una calcolatrice G. Mecca - Programmazione Procedurale in Linguaggio C++ 3
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione Nozioni Sintattiche di Base m Direttive ðper librerie di sistema e librerie dell’utente ð#include <iostream. h> (librerie di sistema) ð#include <fstream. h> (librerie di sistema) ð#include “equazioni. Lib. h” (librerie utente) m Commenti ðlinea singola // questo è un commento ðmultilinea /* commento */ G. Mecca - Programmazione Procedurale in Linguaggio C++ 4
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione Nozioni Sintattiche di Base m Identificatori ðnomi degli oggetti di un programma (variabili, costanti, parametri, moduli) m Regole sintattiche ðsequenza di lettere/cifre/_ ðprimo carattere: lettera o _ ðcodice ASCII a 7 bit ðsensibile alle maiuscole ðescluse le parole chiave riservate (es: main) G. Mecca - Programmazione Procedurale in Linguaggio C++ 5
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione Dichiarazione dei Dati m Tipi di dato di base ðint: 32 bit in complemento a 2, da -2 miliardi a +2 miliardi circa ðfloat: 32 bit in v. m. , da -1038 a +1038 circa ðdouble: 64 bit in v. m. , da -10308 a +10308 ca. ðchar: 8 bit, codice ASCII a 7 bit ðbool: 1 bit m Tipo string: classe di oggetti del C++ G. Mecca - Programmazione Procedurale in Linguaggio C++ 6
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione Dichiarazione dei Dati m Dichiarazioni di costante simbolica ðconst <tipo> <identificatore> = <valore>; ðes: const float PIGRECO = 3. 1415; m Semantica ðspazio nella memoria del tipo specificato, non modificabile, contenente il valore m Vantaggi ðpoter cambiare il valore intervenendo solo sulla dichiarazione G. Mecca - Programmazione Procedurale in Linguaggio C++ 7
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione Dichiarazione dei Dati m Dichiarazioni di variabili ð<tipo> <identificatore>; ð<tipo> <identif 1>, <identif 2>, . . . <identifn>; ðes: int raggio; ðes: float cerchio, circonf; m Semantica ðspazio nella memoria del tipo specificato ðmodificabile liberamente nel corso del programma (lettura o assegnazione) G. Mecca - Programmazione Procedurale in Linguaggio C++ 8
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione Dichiarazione dei Dati m Attenzione ðsubito dopo la dichiarazione il valore della variabile è casuale (indefinibile) ðè necessario inizializzare la variabile leggendone il valore da un flusso ðo con un’istruzione di assegnazione m Esempio ðint raggio; cin >> raggio; ðint raggio; raggio = 3; G. Mecca - Programmazione Procedurale in Linguaggio C++ 9
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione Dichiarazione dei Dati m In alternativa ðinizializzazione contestuale alla dichiarazione ðes: int raggio = 0; m Equivalente a ðint raggio; due istruzioni ðraggio = 0; G. Mecca - Programmazione Procedurale in Linguaggio C++ 10
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione Dichiarazione dei Dati m Attenzione (2) ðpossibili errori di rappresentazione m Varie cause ðlimitatezza dello spazio in memoria (trabocco) ðnatura della rappresentazione in virgola mobile (arrotondamenti) G. Mecca - Programmazione Procedurale in Linguaggio C++ 11
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione Istruzioni di Base sui Dati m Istruzioni di base ðistruzioni di assegnazione ðistruzioni di lettura e stampa m Istruzioni di assegnazione ðservono ad assegnare il risultato di un calcolo ad una variabile m Istruzioni di lettura e stampa ðservono ad acquisire e stampare i valori delle variabili G. Mecca - Programmazione Procedurale in Linguaggio C++ 12
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione Istruzioni di Assegnazione m Sintassi <nome. Variabile> = <espressione>; m Semantica ðviene calcolato il valore dell’espressione ðse il valore risultante è compatibile con il tipo della variabile, viene assegnato alla variabile (ovvero: il valore viene scritto nello spazio di memoria associato alla variabile) ðaltrimenti si genera un errore G. Mecca - Programmazione Procedurale in Linguaggio C++ 13
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione Espressioni m Formule per il calcolo di un valore ðcomposte di operandi e operatori m Operandi ðcostanti ðvariabili m Operatori ðoperatori predefiniti ðfunzioni predefinite G. Mecca - Programmazione Procedurale in Linguaggio C++ 14
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione Istruzioni di Lettura e Stampa m Basate sul concetto di “flusso” ðcanale di comunicazione tra il processore ed un dispositivo di ingresso o di uscita m Standard input ðflusso standard di ingresso, proveniente dalla tastiera m Standard output ðflusso standard di uscita, diretto verso lo schermo G. Mecca - Programmazione Procedurale in Linguaggio C++ 15
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione Standard Input Tastiera Flusso di ingresso File su disco Flusso di ingresso Processore Esegue le istruzioni del Programma Concetto di Flusso Standard Output Schermo Flusso di uscita Stampante Flusso di uscita File su disco Flusso di uscita G. Mecca - Programmazione Procedurale in Linguaggio C++ 16
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione Istruzioni di Stampa m Sintassi cout << <espressione>; cout << <espressione 1> << <espressione 2>. . . ; ðespressione: costante, variabile, espr. complessa m Semantica ðviene calcolato il valore di ciascuna espressione ðil valore viene inserito nel flusso diretto allo schermo sotto forma di sequenza di caratteri G. Mecca - Programmazione Procedurale in Linguaggio C++ 17
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione Istruzioni di Lettura m Sintassi cin >> <variabile>; m Semantica: input formattato ðappena nel flusso è presente almeno una riga, il processore analizza il flusso ðnell’analisi del flusso ignora eventuali spazi bianchi iniziali ðgli spazi bianchi vengono utilizzati anche come separatori tra i valori G. Mecca - Programmazione Procedurale in Linguaggio C++ 18
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione Lettura e Stampa da e verso File m ofstream ðflusso associato ad un file in cui si stampano dati es: ofstream flusso. Su. File (“file. Dati. txt”); m ifstream ðflusso associato ad un file da cui si leggono dei dati es: ifstream flusso. Da. File (“file. Dati. txt”); m Per utilizzarli è necessario specificare ð #include <fstream. h> G. Mecca - Programmazione Procedurale in Linguaggio C++ 19
Elementi di Base: Dettagli e Approfondimenti >> Ricapitolazione Domande ed Esercizi di Riepilogo G. Mecca - Programmazione Procedurale in Linguaggio C++ 20
Elementi di Base: Dettagli e Approfondimenti >> ANSI C++ m Versione standard del C++ ðsuccessiva alla prima introduzione m Prevede alcune varianti nella sintassi m Alcuni esempi ðcambiamenti nelle direttive di inclusione ðintroduzione dei “namespace” ðcambiamenti nella struttura del programma principale G. Mecca - Programmazione Procedurale in Linguaggio C++ 21
Elementi di Base: Dettagli e Approfondimenti >> ANSI C++ Un Semplice Programma in ANSI C++ // Calcolo della superficie del cerchio #include <iostream> using namespace std; int main() { const float pigreco=3. 14; int raggio; float cerchio, circonf; cout << “Immetti la lungh. del raggio” << endl; cout << “(deve essere un numero intero)” << endl; cin >> raggio; cerchio = raggio*pigreco; circonf = 2*pigreco*raggio; cout << “La circonferenza misura: “ << circonf << endl; cout << “Il cerchio ha superficie: “ << cerchio << endl; return 0; } G. Mecca - Programmazione Procedurale in Linguaggio C++ 22
Elementi di Base: Dettagli e Approfondimenti >> ANSI C++ m Le modifiche sono orientate prevalentemente alla programmazione a oggetti m Complicano la descrizione del linguaggio ðes: concetto di namespace m Nel seguito NON faremo riferimento al C++ ANSI G. Mecca - Programmazione Procedurale in Linguaggio C++ 23
Elementi di Base: Dettagli e Approfondimenti >> ANSI C++ Compilatori in Ambiente Linux m Attenzione ðalcuni compilatori, però, richiedono necessariamente codice ANSI C++ m Esempio ðGCC (GNU C Compiler) compilatore storico per Linux – digerisce solo ANSI C++ m Utilizzo ðcompilazione: g++ <sorgente>. cpp ðesecuzione: . /a. out G. Mecca - Programmazione Procedurale in Linguaggio C++ >> 24
Elementi di Base: Dettagli e Approfondimenti >> ANSI C++ Compilatori in Ambiente Linux m La particolarità di gcc ðè una collezione di compilatori m Compilatore FORTRAN ðg 77 ðstesse modalità di funzionamento di gcc m Utilizzo ðcompilazione: g 77 <sorgente>. for ðesecuzione: . /a. out G. Mecca - Programmazione Procedurale in Linguaggio C++ >> 25
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi di Dato m Finora ðci siamo concentrati solo sui tipi di dato fondamentali del C++ m Ma ðesistono altri tipi di dato ðle regole di compatibilità sono più complesse di quelle che abbiamo descritto G. Mecca - Programmazione Procedurale in Linguaggio C++ 26
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi Altri Tipi di Dato m Esistono altri tipi m Intero corto: short int ðesempio: short int raggio; ð 16 bit di memoria, valori (-32768, +32767) m Intero lungo: long int ðesempio: long int risultato; ðtipicamente: bit int ≤ bit long int G. Mecca - Programmazione Procedurale in Linguaggio C++ 27
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi Altri Tipi di Dato m Intero con segno/senza segno ðsigned int risultato; ðsigned short int risultato; ðunsigned long int risultato; m Reali lunghi: long double ðesempio: long double circonferenza; ðtipicamente: #bit double ≤ #bit long double G. Mecca - Programmazione Procedurale in Linguaggio C++ 28
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi Altri Tipi di Dato m Caratteri con segno/senza ðchar car 1; ðunsigned char car 2; segno m Inoltre ðesiste un tipo per rappresentare caratteri al di fuori del set di caratteri ASCII standard ðtipo wchar_t (“wide char type”) ðnormalmente 16 bit per la rappresentazione ðdipende dal compilatore G. Mecca - Programmazione Procedurale in Linguaggio C++ 29
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi Altri Tipi di Dato m Attenzione ða differenza di quanto affermato per semplicità in precedenza, lo spazio assegnato a ciascun tipo di dato non è fisso ðdipende dal compilatore e dal processore m Esempio ðin alcune macchine int può essere di 32 bit ðin altre macchine di 16 bit G. Mecca - Programmazione Procedurale in Linguaggio C++ 30
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi Altri Tipi di Dato m Operatore sizeof ðoperatore fornito dal linguaggio per scoprire la dimensione esatta attribuita dal processore ad una variabile o un tipo di dato m Sintassi ðsizeof(<tipo>) ðsizeof(<variabile>) G. Mecca - Programmazione Procedurale in Linguaggio C++ 31
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi Altri Tipi di Dato m Esempi int i; cout << cout << "i : " << sizeof(i); //4 "short int: " << sizeof(short int); //2 "int : " << sizeof(int); //4 "long int: " << sizeof(long int); //4 "char : " << sizeof(char); //1 "float: " << sizeof(float); //4 "double: " << sizeof(double); //8 "long double: “<< sizeof(long double); //10 G. Mecca - Programmazione Procedurale in Linguaggio C++ 32
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi Una Classificazione Complessiva Tipi di base del C++ tipi “enumerabili” tipo booleano tipi carattere tipi interi tipi in virgola mobile bool char unsigned wchar_t short int long unsigned char short int long float double long double G. Mecca - Programmazione Procedurale in Linguaggio C++ 33
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi Compatibilità tra Tipi m Le regole di compatibilità tra tipi sono più complesse di quanto visto finora ðtutti i tipi di base sono compatibili tra loro m In particolare ðil tipo char è considerato un tipo numerico (valore di un carattere pari al codice ASCII) ðil tipo bool è considerato un tipo numerico (valore pari a 0 oppure 1); qualsiasi valore diverso da 0 è considerato true G. Mecca - Programmazione Procedurale in Linguaggio C++ 34
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi Compatibilità tra Tipi m Esempio: int i; bool b; char c; c = ‘a’; i = c; // assegno b = i; // assegno cout << c << “ “ << un char ad un int ad un bool i << “ “ b; a 97 1 G. Mecca - Programmazione Procedurale in Linguaggio C++ 35
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi Compatibilità tra Tipi m Gerarchia di Tipi Numerici ðtipo booleano: bool (tipo meno generale) ðtipi carattere: char, unsigned char ðtipi interi: short int, long int (tutti signed e unsigned) ðtipi reali: float, double, long double (tipi più generali) m Nelle espressioni sono compatibili ðtroncamento e ampliamento G. Mecca - Programmazione Procedurale in Linguaggio C++ 36
Elementi di Base: Dettagli e Approfondimenti >> Approfondimenti sui Tipi Compatibilità tra Tipi m Attenzione ðqueste sono da considerarsi idiosincrasie del C/C++ (non presenti in FORTRAN) ðè opportuno evitare di utilizzare queste funzionalità (i caratteri sono diversi dagli interi) ðè importante conoscerle perché a volte nascondono errori (es: assegnazioni errate) G. Mecca - Programmazione Procedurale in Linguaggio C++ 37
Elementi di Base: Dettagli e Approfondimenti >> Operatore di Cast Importante m Riassumendo ðogni dato trattato dal processore ha un tipo ðalcuni valori possono essere considerati di tipi diversi m Esempio: il numero 1 ðvalore di tipo bool ðvalore di tipo int ðvalore di tipo float ðvalore di tipo double G. Mecca - Programmazione Procedurale in Linguaggio C++ 38
Elementi di Base: Dettagli e Approfondimenti >> Operatore di Cast m In questi casi ðil valore può essere soggetto a conversioni di tipo m Conversioni di tipo ðconsistono nella trasformare la rappresentazione in memoria del valore ðche da quel momento è considerato di tipo diverso rispetto al suo tipo originale G. Mecca - Programmazione Procedurale in Linguaggio C++ 39
Elementi di Base: Dettagli e Approfondimenti >> Operatore di Cast m Normalmente ðle conversioni di tipo vengono effettuate automaticamente dal processore ðma possono essere richieste esplicitamente dal programmatore m Operazioni di “Cast” ðoperazione attraverso cui il programmatore chiede esplicitamente di trasformare la rappresentazione e il tipo di un valore G. Mecca - Programmazione Procedurale in Linguaggio C++ 40
Elementi di Base: Dettagli e Approfondimenti >> Operatore di Cast m Operatori di Cast ðl’operazione viene realizzata attraverso opportuni operatori unari ðun operatore per ciascun tipo m Esempio ðes: float x; bool b; x = (float) 3; b = (bool) x; dato di tipo int, valore 3 dato di tipo float, valore 3. 0 dato di tipo bool, valore 1 G. Mecca - Programmazione Procedurale in Linguaggio C++ 41
Elementi di Base: Dettagli e Approfondimenti >> Operatore di Cast m Sintassi ð(<tipo>)<valore> m Semantica ðsupponiamo che <valore> sia di tipo <tipo’> ðil processore trasforma la rappresentazione in memoria del <valore> nella corrispond. rappresentazione del <tipo> specificato ðda quel momento <valore> è considerato di tipo <tipo> G. Mecca - Programmazione Procedurale in Linguaggio C++ 42
Elementi di Base: Dettagli e Approfondimenti >> Operatore di Cast m Utilizzo ðconsentono di controllare le trasformazioni di tipo nelle espressioni m Esempio: float media; int somma. Voti, num. Esami; somma. Voti = 64; num. Esami = 3; media = cout << somma. Voti/num. Esami; media; (float)somma. Voti/num. Esami; media; G. Mecca - Programmazione Procedurale in Linguaggio C++ 21 21. 3334 43
Elementi di Base: Dettagli e Approfondimenti >> Operatore di Cast m Attenzione ðl’operatore ha priorità molto alta ðattenzione all’ordine di applicazione media = (float)somma. Voti/num. Esami; cout << media; 21. 3334 media = ((float)somma. Voti)/num. Esami; cout << media; 21. 3334 media = (float)(somma. Voti/num. Esami); cout << media; 21 G. Mecca - Programmazione Procedurale in Linguaggio C++ 44
Elementi di Base: Dettagli e Approfondimenti >> Espressioni m Un altro esempio di stranezza del C/C++ ðin C++ tutte le istruzioni sono in effetti considerate espressioni ðovvero regole per calcolare un valore m In particolare ðle istruzioni di assegnazione sono complessivamente anche espressioni ðle istruzioni di lettura e stampa sono complessivamente anche espressioni G. Mecca - Programmazione Procedurale in Linguaggio C++ 45
Elementi di Base: Dettagli e Approfondimenti >> Espressioni Assegnazioni m Operatore di assegnazione (=) ðha una duplice funzione ðassegna il valore a destra alla variabile a sinistra ðrestituisce il valore assegnato m Esempio int a; a = 1; // assegna 1 ad a e restituisce 1 m E’ possibile includere le assegnazioni in espressioni più complesse G. Mecca - Programmazione Procedurale in Linguaggio C++ 46
Elementi di Base: Dettagli e Approfondimenti >> Espressioni Assegnazioni m Esempio n. 1 int a, b, c; a = (a = 5) + (b = 7); equivalente a; a = 5; m Esempio b = 7; c = a + b; n. 2 int a, b, c; a = (b = (c = 0)); // equivalente a a=b=c=0; equivalente a; c = 0; b = 0; a = 0; G. Mecca - Programmazione Procedurale in Linguaggio C++ 47
Elementi di Base: Dettagli e Approfondimenti >> Espressioni Istruzioni di Lettura e Stampa m Operatore di Lettura (>>) ðha una duplice funzione ðacquisisce il valore da assegnare alla var ðrestituisce 1 se la lettura si è svolta correttamente, 0 se c’è stato un errore m Anche in questo caso ðè possibile combinare le istruzioni di lettura e stampa in espressioni più complesse m Esempio int a, b, c; cout << (cin >> a); // stampa 0 se c’è errore G. Mecca - Programmazione Procedurale in Linguaggio C++ 48
Elementi di Base: Dettagli e Approfondimenti >> Espressioni m Possono essere complesse ðIl C++ fornisce numerosi altri operatori ðle regole di precedenza sono intricate m Esempi ðoperatori “bit a bit”: &, |, ~ ðoperatori di scorrimento: >>, << ðoperatore condizionale: ? ðoperatore “virgola”: , G. Mecca - Programmazione Procedurale in Linguaggio C++ 49
Elementi di Base: Dettagli e Approfondimenti >> Espressioni m Operatori unari con effetti collaterali ðpossono essere postfissi o prefissi m Operatore postfisso ðeffetto collaterale dopo la valutazione ðes: a++ (valuta a e poi la incrementa) m Operatore prefisso ðeffetto collaterale prima della valutazione ðes: ++a (incrementa a e poi valuta) G. Mecca - Programmazione Procedurale in Linguaggio C++ 50
Elementi di Base: Dettagli e Approfondimenti >> Espressioni m Esempio 1 int i, j, k; prima viene valutata la sottoespressione a (valore 10) e poi la variabile viene incrementata i = 10; j = 20; k = i++ + j; // k vale 30 m Esempio 1 int i, j, k; prima viene incrementata la variabile a (valore 11) e poi viene valutata la sottoespressione i = 10; j = 20; k = ++i + j; // k vale 31 G. Mecca - Programmazione Procedurale in Linguaggio C++ 51
Elementi di Base: Dettagli e Approfondimenti >> Espressioni Una Annotazione Importante m Attenzione ðè possibile programmare benissimo anche ignorando le stranezze descritte in questa lezione ðanzi, per molti versi si programma meglio se queste cose non vengono usate ðservono a rendere più compatto ma anche più incomprensibile il codice G. Mecca - Programmazione Procedurale in Linguaggio C++ 52
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C 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 G. Mecca - Programmazione Procedurale in Linguaggio C++ 53
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C 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 G. Mecca - Programmazione Procedurale in Linguaggio C++ 54
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C 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 G. Mecca - Programmazione Procedurale in Linguaggio C++ 55
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C 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 G. Mecca - Programmazione Procedurale in Linguaggio C++ 56
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C Istruzione printf m Sintassi ðprintf(<stringa>); ðprintf(<stringa. Formato>, 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); G. Mecca - Programmazione Procedurale in Linguaggio C++ 57
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C 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 G. Mecca - Programmazione Procedurale in Linguaggio C++ 58
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C Istruzione scanf m Sintassi ðscanf(<stringa. Formato>, &variabile); m Stringa formato ðanaloga a quella della printf m Esempi ðscanf(“%d”, &raggio); m Nota ATTENZIONE: la mancanza della & è una fonte di errore molto frequente ðè indispensabile la & prima della variabile G. Mecca - Programmazione Procedurale in Linguaggio C++ 59
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C 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 G. Mecca - Programmazione Procedurale in Linguaggio C++ 60
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C Un Semplice Programma in C // 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 raggion"); printf("(deve essere un numero intero)n"); scanf("%d", &raggio); cerchio = raggio * PIGRECO; circonf = 2 * PIGRECO * raggio; printf("La circonferenza misura: %f n", circonf); printf("Il cerchio ha superficie: %f n", cerchio); return 0; } G. Mecca - Programmazione Procedurale in Linguaggio C++ >> 61
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il 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 ‘ ’) G. Mecca - Programmazione Procedurale in Linguaggio C++ 62
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C Esempio #include <stdio. h> NOTA: scanf e gets aggiungono automaticamente il carattere ‘ ’ al termine della stringa letta 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 : %sn", targa); printf("Modello : %sn", modello); return 0; } G. Mecca - Programmazione Procedurale in Linguaggio C++ 63
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C Istruzione scanf m Inoltre ðnon è possibile effettuare il confronto tra stringhe utilizzando == ðè necessario utilizzare la funzione strcmp ðstrcmp(s 1, s 2) 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 G. Mecca - Programmazione Procedurale in Linguaggio C++ 64
Elementi di Base: Dettagli e Approfondimenti >> Differenze con il C Esempio #include <stdio. h> #include <string. h> int main() { char targa[8]; printf("Immetti la targa : "); scanf("%s", &targa); // input formattato if (strcmp(targa, "ab 762 de") == 0) { printf("Auto correttan"); } return 0; } G. Mecca - Programmazione Procedurale in Linguaggio C++ 65
Elementi di Base: Dettagli e Approfondimenti >> Sommario Riassumendo m Ricapitolazione m ANSI C++ ðCompilatori in Ambiente Linux m Approfondimenti sui Tipi di Dato ðAltri Tipi di Dato m Operatore di Cast m Espressioni m Differenze con il C G. Mecca - Programmazione Procedurale in Linguaggio C++ 66
Termini della Licenza m This work is licensed under the Creative Commons Attribution. Share. Alike 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. m Questo lavoro viene concesso in uso secondo i termini della licenza “Attribution-Share. Alike” 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. G. Mecca - Programmazione Procedurale in Linguaggio C++ 67
- Slides: 67