Basi Programmazione c++

September 17, 2017 | Author: Federico Cerruti | Category: Programming Language, Software Development Process, Method (Computer Programming), C++, Control Flow
Share Embed Donate


Short Description

C++ guida programmazione, dispensa, teoria, esercizi svolti,...

Description

Le Basi della Programmazione

Linguaggio C++ Le basi

1

Le Basi della Programmazione

2

1. Linguaggio C++, la storia

Nel 1972 Dennis Ritchie progettava e realizzava, presso i Bell Laboratories, la prima versione del linguaggio C. Ritchie aveva ripreso e sviluppato molti dei costrutti sintattici utilizzati nella costruzione del sistema operativo UNIX da Ken Thompson. Successivamente gli stessi Thompson e Ritchie riscrissero in C il codice di UNIX. Da allora il C ha subito pochissime trasformazioni, mantenendosi un linguaggio di alto livello che possiede un ristretto insieme di costrutti e di parole chiave, ma con una straordinaria forza espressiva. Il C consente di programmare in maniera modulare, utilizzando macro e funzioni, di interagire direttamente con funzioni tipiche del basso livello come ad esempio l’indirizzamento assoluto di memoria. Per l’eleganza della sua sintassi e la compattezza dei costrutti, il C è una sfida permanente alle capacità intellettuali del programmatore. Quando nella prima metà degli anni Ottanta, nella teoria della programmazione si sviluppano le basi per la OOP (Object Oriented Programming, programmazione orientata agli oggetti) si capisce presto che quella sarà la chiave di volta per lo sviluppo di applicazioni general-purpose. Ecco allora che il danese Bjarne Stroustrup propone nel 1983 un nuovo linguaggio denominato ”C con classi” e successivamente C++. Mantenendo una compatibilità quasi assoluta con il C, il C++ è un linguaggio Object Oriented che diventerà lo standard de facto per la programmazione di applicativi nel ventennio a seguire. Il C++ rappresenta un linguaggio completamente autonomo rispetto al C, pur utilizzandone sostanzialmente la sintassi. In particolare, l’introduzione di costrutti quali i template e le classi rende il C++ un linguaggio multi paradigma, principalmente quello a oggetti. Ciò che ha sempre differenziato il C e il C++ da altri linguaggi ”artificiali” è il fatto di essere stati creati da dei programmatori che dovevano fronteggiare particolari esigenze quali la codifica dei programmi e l’organizzazione del codice e non da un gruppo di ricerca appositamente creato allo scopo. Questo ha portato un sacco di programmatori a inviare commenti, suggerimenti e migliorie a Ritchie e Stroustrup nei primi anni dello sviluppo dei due linguaggi ottenendo un prodotto sicuramente più ”malleabile” e adatto alle necessità.

Le Basi della Programmazione

3

I paradigmi di programmazione Quando si utilizzavano sistemi operativi a linea di comando, come UNIX e il DOS, l’unica programmazione possibile era basata sul paradigma imperativo. Il paradigma imperativo (da imperio, comando) è fondato sull’esplicita richiesta di eseguire un comando. In tale contesto il programmatore dovrà privilegiare l’esame del processo di calcolo in quanto precisa sequenza di azioni da svolgere. Le strutture di controllo assumono la forma di istruzioni di flusso (GOTO, FOR, IF/THEN/ELSE, ecc.) e il calcolo procede per iterazione piuttosto che per ricorsione. I valori delle variabili sono spesso assegnati a partire da costanti o da altre variabili (assegnamento) e raramente per passaggio di parametri (istanziazione). La programmazione strutturata è una tecnica il cui scopo è di limitare la complessità della struttura del controllo dei programmi. Il programmatore è vincolato ad usare solo le strutture di controllo canoniche definite dal Teorema di Bohm-Jacopini, ovvero la sequenza, la selezione e il ciclo, evitando le istruzioni di salto incondizionato. La programmazione orientata agli oggetti (OOP) si è dimostrata la più adeguata nello sviluppo di sistemi software complessi. In questo paradigma il concetto principale è quello di oggetto in quanto metafora di un concetto del mondo reale. In tale contesto il programmatore interpreta lo svolgersi delle azioni come una sequenza di interazioni fra oggetti, quindi come un flusso (più) semplice da interpretare e sviluppare. La programmazione guidata dagli eventi (EDP, event driven programming) perde la sequenza logica precisa descritta dai precedenti paradigmi, ma il flusso delle azioni viene guidato dagli eventi che il programma intercetta. Evento è l’interazione del mondo esterno con il programma, quindi la pressione di un tasto sull’interfaccia grafica da parte dell’utente, come la stampante che segnala di aver finito la carta o l’inchiostro.

Linguaggi compilati e linguaggi interpretati In informatica, un linguaggio di programmazione è un linguaggio formale, dotato di una sintassi e di una semantica ben definite, utilizzabile per il controllo del comportamento di una macchina formale. L’utilità dei linguaggi di programmazione sta nel fatto che le macchine formali sono descrizioni teoriche di strumenti implementati tipicamente come microcontrollori o microprocessori. Sostanzialmente quindi, un linguaggio di programmazione è lo strumento che ci permette di creare il software adatto a controllare strumenti governati da processori. Se si considera infine che si stima che ogni strumento elettronico attualmente in commercio dal valore superiore alle 50 euro contenga un

Le Basi della Programmazione

4

processore, si capisce subito l’importanza dei linguaggi di programmazione nella definizione della tecnologia moderna. Programmare in un dato linguaggio di programmazione significa generalmente scrivere uno o più semplici file di testo chiamato codice sorgente, seguendo sintassi e semantica del linguaggio scelto. I linguaggi di programmazione si dividono dunque in due grandi classi di linguaggi: 1. linguaggi compilati 2. linguaggi interpretati. I linguaggi compilati sono quelli che sottopongono il codice sorgente a compilazione. Questa è l’operazione di traduzione del codice sorgente dal linguaggio comprensibile all’uomo, quello stabilito dalla sintassi del linguaggio scelto, al linguaggio comprensibile dal processore, definito linguaggio macchina. Il risultato della compilazione viene solitamente definito codice oggetto. Per fare questo ogni linguaggio compilato ha bisogno di un suo proprio compilatore: questo è genericamente un programma che si occupa della traduzione descritta. La compilazione crea dunque un legame fra il codice oggetto prodotto e il processore che dovrà eseguirlo. Questo crea importanti vantaggi, come la velocità di esecuzione del codice e l’efficienza nella gestione della memoria, ma anche svantaggi come una difficile portabilità (su altre architetture) del codice oggetto e a volte anche del codice sorgente. Esempi di linguaggi compilati sono il C, C++, Pascal e Fortran. I linguaggi interpretati si propongono di eliminare il problema della portabilità. Il codice sorgente in questi casi non viene più compilato per la creazione del codice oggetto, ma coincide esattamente con esso! Viene infatti interpretato in fase di esecuzione riga per riga e tradotto ogni volta nella corrispondente operazione da eseguire. In questo caso, i linguaggi interpretati necessitano dunque di un interprete che interpreti e faccia eseguire il codice. L’interpretazione in teoria libera dalla dipendenza dalla piattaforma: sarà sufficiente avere un interprete adatto ad ogni piattaforma per poter eseguire il codice ovunque. D’altro canto però si assiste ad un grosso decadimento delle prestazioni in fase di esecuzione, per il doppio lavoro di dover interpretare ed eseguire in real-time. Alcuni linguaggi (java, C#) cercano di mitigare questo aspetto negativo dell’interpretazione mantenendo i suoi aspetti positivi, fornendo una sorta di semi-compilazione preventiva che fornisce un linguaggio intermedio (bytecode) facilmente interpretabile. Esempi di linguaggi interpretati sono il Basic, il Perl, il Python e in generale tutti i linguaggi di scripting.

Le Basi della Programmazione

5

Valutare un linguaggio di programmazione Non ha senso, in generale, parlare di linguaggi migliori o peggiori, o di linguaggi migliori in assoluto: ogni linguaggio nasce per affrontare una classe di problemi più o meno ampia, in un certo modo e in un certo ambito. Però, dovendo dire se un dato linguaggio sia adatto o no per un certo uso, è necessario valutare le caratteristiche dei vari linguaggi:

Caratteristiche intrinseche Sono le qualità del linguaggio in sé, determinate dalla sua sintassi e dalla sua architettura interna. Influenzano direttamente il lavoro del programmatore, condizionandolo. Non dipendono né dagli strumenti usati (compilatore/interprete, IDE, linker) né dal sistema operativo o dal tipo di macchina. •

Espressività: la facilità e la semplicità con cui si può scrivere un dato algoritmo in un dato linguaggio.



Didattica: la semplicità del linguaggio e la rapidità con cui lo si può imparare.



Leggibilità: la facilità con cui, leggendo un codice sorgente, si può capire cosa fa e come funziona. La leggibilità dipende non solo dal linguaggio ma anche dallo stile di programmazione di chi ha creato il programma.



Robustezza: la capacità del linguaggio di prevenire, nei limiti del possibile, gli errori di programmazione.



Modularità: quando un linguaggio facilita la scrittura di parti di programma indipendenti (moduli) viene definito modulare. In genere la modularità si ottiene con l’uso di sottoprogrammi (subroutine, procedure, funzioni) e con la programmazione ad oggetti.



Flessibilità: la possibilità di adattare il linguaggio, estendendolo con la definizione di nuovi comandi e nuovi operatori.



Generalità: la facilità con cui il linguaggio si presta a codificare algoritmi e soluzioni di problemi in campi diversi.



Efficienza: la velocità di esecuzione e l’uso oculato delle risorse del sistema su cui il programma finito gira.



Coerenza: l’applicazione dei principi base di un linguaggio in modo uniforme in tutte le sue parti.

Le Basi della Programmazione

6

Caratteristiche esterne Oltre alle accennate qualità dei linguaggi, possono essere esaminate quelle degli ambienti in cui operano. Un programmatore lavora con strumenti software, la cui qualità e produttività dipende da un insieme di fattori che vanno pesati anch’essi in funzione del tipo di programmi che si intende scrivere. •

Diffusione: il numero di programmatori nel mondo che usa il tale linguaggio.



Standardizzazione: L’esistenza di alcuni dialetti del linguaggio frammenta la comunità di programmatori, limitandone l’utilità e la diffusione generale.



Integrabilità: dovendo scrivere programmi di una certa dimensione, è molto facile trovarsi a dover integrare parti di codice precedente scritte in altri linguaggi: se un dato linguaggio di programmazione consente di farlo facilmente, magari attraverso delle procedure standard, questo è decisamente un punto a suo favore.



Portabilità: la possibilità che portando il codice scritto su una certa piattaforma su un’altra, questo funzioni subito, senza doverlo modificare.

Le Basi della Programmazione

7

2. Tecniche di programmazione

Un programmatore, inteso come “creatore di software”, deve essere in grado di occuparsi di un po' tutte le fasi del ciclo di vita del software. Questa ultima espressione si riferisce al modo in cui si scompone l'attività di progettazione, creazione, test e manutenzione di un software in sotto attività coordinate fra loro. Questo concetto è fondamentale in programmazione e segna la sua comparsa del mondo informatico segna la definitiva trasformazione della programmazione da attività “artigianale”, affidata alla creatività dei singoli individui, ad attività “scientifica”, con un forte accento sul processo di creazione come strumento di controllo del software. Esistono numerosi modelli su cui basare il ciclo di vita di un software, che prevedono comunque la scomposizione del processo di sviluppo in attività analoghe. Le distinzioni fra questi si basano soprattutto su: • l'enfasi relativa che si attribuisce a ciascuna attività; • l'individuazione degli attori specifici incaricati di ciascuna attività; • l'ordine in cui le attività si svolgono. Le principali attività costituenti il processo di sviluppo sono: • Analisi, ovvero l'indagine preliminare sul contesto in cui il prodotto software deve inserirsi, sulle caratteristiche che deve esibire, ed eventualmente su costi e aspetti logistici della sua realizzazione. Al termine della fase verrà creato un documento che descrive le caratteristiche del sistema, tale documento viene definito "documento di Specifica". • Progettazione, in cui si definiscono le linee essenziali della struttura del sistema da realizzare, in funzione dei requisiti evidenziati dall'analisi e dal documento finale da essa creato. In questa fase sarà sviluppato un documento che permetterà di avere una definizione della struttura di massima (architettura di alto livello) e una definizione delle caratteristiche dei singoli componenti (moduli). • Implementazione, ovvero la sua realizzazione concreta; questa tipicamente consiste nella realizzazione di uno o più programmi in un determinato linguaggio di programmazione.

Le Basi della Programmazione

8

• Collaudo, volta a misurare in che modo il sistema realizzato soddisfa i requisiti stabiliti nella fase di analisi, ovvero a valutarne la correttezza rispetto alle specifiche. Le tipologie specifiche di test (prove) si possono inoltre distinguere in funzione dei particolari aspetti dei moduli o del sistema che vengono valutati; si parla per esempio di test funzionali, test di performance, test di accettazione, test d'installazione. • Manutenzione, che comprende tutte le attività di modifica del software successive al suo rilascio presso il cliente o la sua immissione sul mercato. Queste attività possono essere volte a correggere errori del software, adattarlo a nuovi ambienti operativi, o estenderne le funzionalità. La manutenzione incide sui costi tanto che si stima che il 60% di questo dipenda dalla manutenzione. Ogni modifica al software comporta necessariamente la necessità di nuovi test, sia relativi alle nuove funzionalità eventualmente introdotte, sia mirati a verificare che le modifiche apportate non abbiano compromesso funzionalità preesistenti (test di regressione).

Vediamo con un migliore dettaglio come sviluppare queste fasi in modo da ottenere un'organizzazione il più possibile precisa del lavoro da svolgere, lasciando comunque ad ognuno la possibilità di “personalizzare” il lavoro, mettendo l'accento su uno degli aspetti, a seconda delle inclinazioni proprie e delle difficoltà del progetto.

Le Basi della Programmazione

9

La fase di Analisi Prevede l'analisi dei requisiti, uno studio del problema il cui obiettivo è stabilire se vale la pena (da un punto di vista tecnico ed economico) realizzare il sistema del quale si vanno definendo i requisiti. Ovviamente in un progetto scolastico o in un progetto personale questa fase è autoreferenziale. I requisiti del problema vanno individuati mettendo in evidenza l'obiettivo finale del processo stesso: in questa fase vanno individuate le variabili di input e di output, il linguaggio di programmazione più adatto a risolvere il problema e l'obiettivo finale del progetto software.

La fase di Progettazione In questa fase si scompone il problema in tutti i suoi sotto-problemi (moduli) secondo uno sviluppo top-down, si definisce la gerarchia e la interdipendenza fra questi e se ne discute la soluzione, supportandola con esempi, modelli matematici, diagrammi di flusso. Obiettivo della fase è definire l'algoritmo risolutivo del problema.

Strategie Risolutive Elaborare un algoritmo non è una operazione semplice ed è sempre diversa per ognuno dei problemi che ci si trova ad affrontare. Spesso però le tecniche di risoluzione, come i modi di ragionare delle persone, tendono a seguire determinati schemi, consolidati con il tempo. Eccone alcuni:

Sfruttare L'esperienza “Gioco dello Scarabeo numerico” Lo scarabeo numerico si gioca con 9 carte numerate da 1 a 9, poste sul tavolo scoperte. I due giocatori devono prendere, alternativamente, una carta dal tavolo. Vince chi per primo riesce a totalizzare 15 con tre carte. Cercate di definire una strategia di gioco che vi consenta di vincere, o quanto meno di non perdere. (saper giocare a tris potrebbe essere utile!)

Le Basi della Programmazione

10

Procedere a ritroso “Gioco dei 24 dadi” Si hanno a disposizione 24 dadi di cui uno, ma non si sa quale, è leggermente più pesante di tutti gli altri. Utilizzando una bilancia a due piatti identificare il dado più pesante in non più di 3 pesate “Gioco del 100” Si gioca in due, uno per volta, partendo da zero e aggiungendo almeno 1 al totale e al massimo 10. Vince chi dice 100. Algebra “Zio e nipote” Augusto ha il triplo degli anni che aveva sua nipote Clarabella 10 anni fa, e Clarabella, ora, ha la metà degli anni che suo zio Augusto avrà fra 5 anni. Che differenza di età c'è tra zio e nipote?

La fase di Implementazione In questa fase si passa alla realizzazione pratica dell'algoritmo progettato, implementandolo nel linguaggio di programmazione scelto nella fase di analisi. Per ogni difficoltà implementativa incontrata in questo livello è necessario interrompere la fase e tornare alla precedente fase di progettazione, risolvere l'ostacolo, rielaborare l'algoritmo risolutivo e procedere di nuovo alla sua implementazione. La fase termina con la realizzazione di un software funzionante che risolve il problema individuato nella fase di analisi.

Le Basi della Programmazione

11

3. C++, primi elementi

La struttura generale del codice e l’organizzazione dei programmi nel linguaggio C++, è perfettamente compatibile con quella del C ed è descrivibile tramite un semplice schema: •

DIRETTIVE AL PREPROCESSORE



DICHIARAZIONE VARIABILI GLOBALI



PROGRAMMA PRINCIPALE (main)



FUNZIONE 1



FUNZIONE 2



...



FUNZIONE n

Di tutte le sezioni componenti la struttura di un programma, è comunque doveroso notare che solo una è obbligatoria e cioè la dichiarazione di un programma principale. Tutte le altre possono essere omesse. Le direttive al preprocessore C sono istruzioni di ”pre-elaborazione” del codice sorgente, che permettono un’organizzazione dinamica del codice. Sono semplicemente distinguibili da ogni altra istruzione perché ogni direttiva inizia sempre con un ”#”. Le direttive più comuni sono la ”#include” che serve a dichiarare l’utilizzo di una determinata libreria e la direttiva ”#define” che serve a dichiarare una sostituzione di testo. Ogni programma scritto in C++ è strutturato come una serie di chiamate a funzione. Non c’è codice esecutivo fuori da una delle funzioni, che sono l’ambiente predefinito per le operazioni. La funzione main è semplicemente la funzione che viene chiamata per prima. A questa viene dunque affidato il compito di contenere tutte le chiamate alle altre funzioni disponibili. La sintassi generale di una funzione è della forma:

Le Basi della Programmazione

12

( ) { ; ; ... ; } dove: •

”tipo restituito” indica il tipo del valore di uscita della funzione,



”elenco parametri” rappresenta l’insieme dei parametri che la funzione accetta in ingresso.

Il linguaggio C++ prevede un insieme di categorie lessicali chiaramente distinguibili fra loro: •

commenti



identificatori



parole chiave



costanti letterali



punteggiatura e operatori

I commenti sono una parte fondamentali di ogni buon programma in qualsiasi linguaggio di programmazione!! Infatti i commenti sono parti inserite direttamente nel codice, ma ignorate dal compilatore. Questo permette dunque di ”commentare” il codice nella nostra lingua, descrivendo le operazioni effettuate. Sono importanti anche nell’ottica di permettere ad altri di leggere il nostro codice o di ricordarne a noi stessi la funzionalità. In C++ sono possibili due tipi di commenti: •

il commento di riga // questo commento termina quando si va a capo



il commento lungo /* questo commento inizia qui e termina quando qui */

Le Basi della Programmazione

13

Identificatore è un nome generico utilizzato per descrivere assieme variabili, costanti, tipi, funzioni e macro. Ognuna di queste categorie rappresenta una caratteristica del linguaggio. Ogni identificatore deve iniziare con una lettera o con un underscore (’_’) e non può contenere spazi. Tutti gli identificatori presenti in un programma devono essere diversi, indipendentemente dalla categoria cui appartengono.

Tipi di dato fondamentali Ogni identificatore che un programma intende utilizzare deve essere prima dichiarato. Per le variabili abbiamo la seguente sintassi: ; dove: •

qualificatore è un parametro opzionale che descrive il tipo e può assumere i valori: signed, unsigned, short, long.



tipo rappresenta (appunto) il tipo di dato memorizzato.

In C++ i tipi fondamentali si dividono in due categorie: semplici e strutturati. I tipi semplici, gli unici che ci interessano per adesso, sono:

Nome

Descrizione

int

Comprende i numeri interi relativi compresi in un certo intervallo, che dipende dalle caratteristiche fisiche della macchina ospite. (a 32 bit, circa 8 miliardi fra positivi e negativi)

char

Comprende i numeri interi da 0 a 255. Tipicamente questo numero viene rappresentato per` come un carattere in base all’utilizzo del codice ASCII.

float

Comprende i numeri reali, rappresentati in virgola mobile con precisione singola (a 32 bit, 7 cifre).

Le Basi della Programmazione Nome

14 Descrizione

double

Comprende i numeri reali, rappresentati in virgola mobile con precisione doppia (a 32 bit, 16 cifre).

bool

Rappresenta i valori logici true (1) e false (0).

enum

Rappresenta una sequenza di interi come una sequenza di identificatori costanti.

I tipi strutturati si dicono così perché non sono tipi definiti autonomamente come i tipi semplici, ma sono piuttosto strutture di dati creati a partire da altre già esistenti. I tipi strutturati saranno comunque approfonditi più avanti nel corso degli studi. Le categorie di tipi strutturati comprendono:

Nome

Descrizione

array

Sono variabili in grado di ospitare un numero predefinito di valori omogenei. Ad esempio la variabile array ”nomeMesi” potrebbe essere un array contenente 12 stringhe ognuna corrispondente al nome di un mese.

struct

Sono variabili in grado di ospitare un numero predefinito di valori NON omogenei fra loro, ma solitamente unite da caratteristiche comuni. Ad esempio la variabile struct ”persona” potrebbe contenere nome, cognome, data di nascita, peso, altezza.

union

Sono variabili in grado di memorizzare nella stessa variabile tipi differenti in istanti differenti. Ad esempio la variabile ”temperatura” potrebbe essere una union contenente un valore float che indica la temperatura oppure il valore ”NULL” ad indicare una temperatura non misurata.

Stringhe e Caratteri La gestione di caratteri e stringhe (sequenze di caratteri, cioè parole) è uno degli argomenti peculiari del linguaggio C++ e una delle cose in cui si discosta maggiormente dal genitore C.

Le Basi della Programmazione

15

Sostanzialmente però, rimane anche la possibilità di gestire le stringhe come in C, eliminando di fatto ogni eventuale problema di compatibilità fra i due approcci. Essendo però le stringhe solo un insieme di caratteri, sarà utile introdurle successivamente a questi. I caratteri in C++ sono gestiti tramite una variabile di tipo char che abbiamo detto contenere un numero intero fra 0 e 255. La corrispondenza numero - carattere viene affidata alla cosiddetta tabella dei codici ASCII (American Standard Code for Information Interchange), che vediamo qui rappresentata:

Come visto all’interno di questa troviamo una serie di caratteri speciali, visualizzabili, ma non descrivibili direttamente. Per esempio, sappiamo che per andare a capo in un testo digitato, basta premere il tasto INVIO, ma come è possibile indicare questo carattere? Per tutti i caratteri speciali come questo esiste un insieme di shorcut (scorciatoie, combinazioni di tasti) speciali, definite sequenze di escape:

Le Basi della Programmazione

16

Sequenza di escape

Descrizione

\n

New line

\t

tab

\a

beep

\f

Form feed

\r

Carriage return

\v

Vertical tab

\b

backspace

\\

backslash

\'

apex

\''

Double apex

\?

Question mark

\0

End string

Una qualsiasi sequenza di caratteri, lettere, numeri, spazi e sequenze di escape, può essere inclusa fra doppi apici ( ” ) a formare una stringa costante. Ad esempio, la stringa "ciao, Mondo!\n" indica la scritta ciao, Mondo! con alla fine un carattere newline, lo stesso effetto che si otterrebbe premendo INVIO su un testo digitato.

Le Basi della Programmazione

17

Operatori Un operatore è un simbolo che opera su una o più espressioni, producendo un valore che può essere assegnato ad una variabile. In C++ sono disponibili nativamente i seguenti insiemi di operatori:

Operatori Aritmetici Operatore

Descrizione

+

Addizione

-

Sottrazione

*

Moltiplicazione

/

Divisione

%

Modulo (resto divisione intera)

++

Incremento

--

Decremento

Esempio x=2 x+2 x=2 5-x x=4 x*5 15/5 5/2 5%2 10%8 10%2 x=5 x++ x=5 x--

Risultato 4 3 20 3 2.5 1 2 0 x=6 x=4

Bisogna notare che la divisione funziona diversamente a seconda del tipo. Cioè se a=5 e b=2 sono variabili intere, il risultato di a/b sarà l’intero 2 (troncamento della parte decimale), mentre se sono variabili reali (float), il risultato sarà il reale 2.5. Nel caso di una operazione fra un reale e un intero il risultato è sempre un reale.

Le Basi della Programmazione

18

Operatori di Assegnazione Operatore = += -= *= /= .= %=

Esempio x=y x+=y x-=y x*=y x/=y x.=y x%=y

È come fare x=y x=x+y x=x-y x=x*y x=x/y x=x.y x=x%y

Operatori di confronto Operatore == != > < >= 8 restituisce false 5=8 restituisce false 5 1) restituisce true x=6 y=3 (x==5 || y==5) restituisce false x=6 y=3 !(x==y) restituisce true

Esistono inoltre alcuni operatori meno comuni che saranno approfonditi in caso di necessità: Operatori sui bit

Le Basi della Programmazione Operatore && || ^ >> ? < Espr1 >: che valuta Espr1 se EsprLogica è vera, Espr2 altrimenti.

a = (b > 0?1 : 2) assegnerà ad a il valore 1 se b è maggiore di zero, 2 altrimenti.

Le Basi della Programmazione

20

1. Ciao, Mondo! 2. Programma per calcolare l’area e il perimetro di un rettangolo di base = 4 e altezza = 6. 3. Programma che permette l'inserimento, da parte dell'utente, di un numero intero e che lo visualizza. 4. Programma che permette l'inserimento, da parte dell'utente, di un numero reale e che lo visualizza. 5. Programma che permette l'inserimento, da parte dell'utente, di un carattere e che lo visualizza. 6. Programma che permette l'inserimento, da parte dell'utente, di una stringa e che la visualizza. 7. Programma che visualizza il numero intero int n = 5 e va a capo, il carattere char c = 'b' e va a capo, il numero reale float r = 3.14 e va a capo. 8. Programma per calcolare l’area e il perimetro di un rettangolo con i valori di base e altezza inseriti dall'utente. 9. Lavorare coi parametri della funzione main(). 10. Calcolo dello spazio occupato da ognuno dei tipi fondamentali semplici, tramite l’operatore sizeof. 11. La libreria climits e i limiti superiore e inferiore dei tipi interi. 12. Dati tre numeri interi, considerarli come hh:mm:ss di un orario determinato. Calcolare i secondi trascorsi dalla mezzanotte del giorno prima. 13. Sapendo che in un parcheggio la prima ora costa 1.5 mentre tutte lo successive costano 1 e, scrivere un programma che richieda il numero complessivo delle ore e visualizzi il totale da pagare.

Le Basi della Programmazione

21

4. Le strutture di controllo

Il lavoro di creazione e organizzazione dell’algoritmo risolutivo di un certo problema si può descrivere, in buona approssimazione, con la stesura di una serie di operazioni da compiere per ottenere il risultato prefissato. Durante questo lavoro, vanno tenute in considerazioni anche variabili come il linguaggio implementativo scelto, il sistema che ospiterà il programma finale e ogni variabile contingente. È ovvio dunque che la stesura dell’algoritmo un’operazione preliminare alla stesura del codice e andrebbero sempre ben distinte. La schematizzazione sistematica delle operazioni da svolgere per le risoluzione del problema è il procedimento che viene definito programmazione strutturata. Obiettivo di questa tecnica di programmazione è quello di organizzare in strutture più semplici ogni algoritmo risolutivo. In un algoritmo le istruzioni possono essere organizzate in: 1. sequenza, in cui le istruzioni sono eseguite una dopo l’altra 2. alternanza, in cui alcune istruzioni sono eseguite alternativamente (o un gruppo o un altro) 3. ripetizione, in cui alcune istruzioni sono ripetute un numero finito di volte. Accanto a queste semplici strutture possono esserne inserite altre più generali o più particolari, per schematizzare ogni algoritmo secondo i criteri che più si adattano ai propri gusti. Queste tre sono state scelte perchè vale il seguente teorema (Jacopini-Bohm, 1966) “Qualsiasi algoritmo può essere riscritto in maniera equivalente utilizzando solo le strutture di sequenza, alternanza, ripetizione.” Questo algoritmo cioè sostanzialmente afferma che le tre strutture indicate sono i mattoni fondamentali per riprodurre qualsiasi algoritmo formulabile dall’uomo. In altre parole, tutti i problemi che sono risolvibile, hanno anche una soluzione costruita semplicemente con istruzioni in sequenza, alternanza e ripetizione.

Le Basi della Programmazione

22

Struttura alternativa La struttura alternativa viene rappresentata in C++ tramite lo schema: if CONDIZIONE ISTRUZIONI cond VERA [else ISTRUZIONI cond FALSA] ove ovviamente il primo gruppo di istruzioni viene eseguito solo se la condizione è vera, mentre il secondo solo se la condizione è falsa. Le istruzioni rappresentano sempre un blocco e vanno quindi racchiuse fra parentesi graffe { e }. La condizione è una espressione booleana di cui viene valutata la veridicità. Le parentesi quadre nello schema stanno invece ad indicare che la seconda parte dell’istruzione ` opzionale, cioè si potrebbe creare semplicemente una struttura del tipo if CONDIZIONE ISTRUZIONI in modo da eseguire un blocco di istruzioni solo nel caso che una condizione si verifichi.

Le Basi della Programmazione

23

Proviamo con un esempio a prendere pratica con le strutture illustrate. Immaginiamo di dover risolvere il seguente problema: dati due numeri dall’utente, disporli in ordine crescente; Il seguente codice lo risolve. int primo, secondo, min, max; cout > primo; cout > secondo; if (primo < secondo) { min = primo; max = secondo; } else { min = secondo; max = primo; } cout
View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF