Il corso che vi proporrò è tratto dal corso di "Fondamenti di Informatica" (Ingegneria Elettronica) A.A. 2008-2009. Il corso si occuperà di fornire le basi fondamentali della programmazione C++ via via introducendo argomenti sempre più complessi. Verranno spiegati in modo esauriente gli argomenti fondamentali del C++, descrizioni dettagliate e materiale per una maggiore comprensione fornite dal sottoscritto e molto altro ancora Si ringrazia l'Ing. Luigi P. Cordella dell'Università degli Studi di Napoli - Federico II per gli appunti e programmi svolti in C++ Premessa - La ProgrammazioneUn programma è un insieme di istruzioni che descrivono la sequenza delle operazioni che un esecutore deve compiere (si dice anche: l' algoritmo che deve essere eseguito) per assolvere un determinato compito Possiamo raggruppare le istruzioni in tre grandi categorie: - Istruzioni di ingresso o uscita (input/output): consentono di acquisire dall'esterno quanto necessario ai fini dell'esecuzione del compito prescritto o di fornire all'esterno i risultati dell'elaborazione eseguita;
- Istruzioni di elaborazione: descrivono le azioni elaborative (operazioni) da compiere;
- Istruzioni di controllo di sequenza: consentono di gestire l'ordine in cui le istruzioni vanno eseguite.
Il C++Inoltre è bene capire cos'è il C++: Il C++ è un linguaggio di programmazione di alto livello orientato agli oggetti ( Object Oriented Programming - OOP), cioè, un linguaggio di programmazione che prevede di raggruppare in un'unica entità (in una classe) sia le strutture dati che le procedure che operano su di esse, creando per l'appunto un "oggetto" software dotato di proprietà (dati) e metodi (procedure) che operano sui dati dell'oggetto stesso. Inoltre è un linguaggio all-purpose (per tutti gli usi) La traduzione del programma che verrà scritta spetta ai compilatori, che traducono dapprima tutto il programma e poi lo mandano in esecuzione (a differenza degli interpreti che traducono e mandano immediatamente in esecuzione ogni singola istruzione) In C++ un programma è un insieme di "funzioni". Una funzione è un sottoprogramma che può essere eseguito solo su chiamata di un altro programma. Una funzione può chiamare un'altra funzione o anche se stessa (ricorsione). L'unica funzione che può essere eseguita autonomamente è la funzione main (), che pertanto deve necessariamente essere presente in un programma per poter chiamare ogni altra funzione Componenti di un programmaI componenti di un programma sono tre: - Commenti (documentazione) - rivolti all'utente
- Dichiarazioni - rivolti al traduttore
- Istruzioni eseguibili - rivolti all'esecutore
Struttura di programmaEcco com'è strutturato un programma: CODE | /*Program nome e scopo. Questo è un commento.*/ Intestazioni: #include<> Eventuali dichiarazioni globali Eventuali prototipi di funzioni chiamate nel programma tipo main () { Dichiarazioni locali Istruzioni } Eventuale seequenza di funzioni, ognuna tipo nome_funzione1 (lista parametri formali) {Dichiarazioni locali Istruzioni} |
Nella situazione più semplice (e anche più comune), il tipo del main dovrebbe essere void (vuoto). Questo era possibile con gli standard C++ precedenti, ma non più possibile con l'ultimo standard che richiede l'indicazione di un tipo (di norma int). Se il tipo del main o di una funzione non è void, occorre che le istruzioni siano terminate da un return valore, con valore dello stesso tipo della funzione. Si può anche non assegnare un tipo a main: per default il tipo sarà int. Il return 0 restituisce 0 a main. Se non c'è il return, in compilazione si ha un Warning, ma il programma viene eseguito ugualmente
Le intestazioni di minima sono:
CODE | #include<iostream.h>//Secondo il vecchio standard
#include<iostream>//Secondo il nuovo standard using namespace std; |
Se si lavora in ambiente Dev C++ occorre che l'ultima istruzione del main sia:
CODE | system("PAUSE");//Richiede l'intestazione #include<stdlib.h> secondo sia il nuovo che il vecchio standard |
In assenza di questa istruzione, la finestra di lavoro nella quale sono visualizzati i dati di input e di output, verrebbe immediatamente chiusa alla fine dell'esecuzione del programma impedendo di fatto la valutazione dei risultati dell'elaborazione L'intestazione #include<iostream> e using namespace std; permette di utilizzare l'istruzione cin>> cout<<cin e cout stanno rispettivamente per console input e console output mentre ">>" e "<<" indica lo stream (flusso) dei dati cin>> (immettere dati) cout<< (visualizzare dati) DichiarazioniSono possibili: - Fuori da ogni funzione
- Entro le funzioni
- Nelle liste di parametri formali
Dichiaratori di tipo: - int (intero)
- float (reale)
- double (doppio)
- char (carattere)
- bool (booleano)
- void (vuoto)
Modificatori di tipo: N.B. Per quest'ultimo bisogna conoscere necessariamente la rappresentazione dei numeri nei registri di memoria in un calcolatore con la tecnica fixed point (virgola fissa) e floating point (virgola mobile) con Mantissa ed Esponente. Vi fornirò personalmente degli appunti al riguardo con le relative illustrazioni, perchè per quanto mi possa sforzare di spiegarvi la tecnica non riuscirò ad essere abbastanza comprensibile visto che è anche un concetto abbastanza delicato e di fondamentale importanza per quasi tutti i linguaggi di programmazione orientati agli oggetti Tipo enumerativo: CODE | enum tipo {lista identificatori} lista variabili |
oppure
CODE | enum tipo {lista identificatori} tipo lista variabili |
Definizione di tipo:
CODE | typedef tipo nuovo_tipo; nuovo_tipo lista variabili; |
Es:
CODE | typedef enum (falso, vero) boolean; boolean flag |
Le istruzioni ( costrutti di programmazione) sono ascrivibili a tre classi, a seconda del meccanismo che mettono in essere per controllare la dinamica del programma nel corso dell'esecuzione Costrutti: Costrutti SerialiIstruzioni di I/O (si legge AI/O): CODE | cin>>lista di variabili cout<<lista di variabili o stringa di caratteri |
QUOTE | cin e cout stanno rispettivamente per console input e console output mentre ">>" e "<<" indica lo stream (flusso) dei dati
cin>> (immettere dati) cout<< (visualizzare dati) |
Video tutorial - Basic Input and Output -> Si ringrazia XoaX.net per il video tutorial Istruzioni di calcolo e assegnazione: La forma tipica è: CODE | variabile=espressione |
"variabile" ed "espressione" sono due registri di memoria. L'istruzione dice di copiare nel registro "variabile" il valore contenuto nel registro "espressione"
Istruzioni di chiamata di sottoprogrammi (funzioni)
Sono possibili espressioni di ognuno dei tipi definiti. In esse possono figurare i seguenti operatori:
int -> + - * / % ++ -- float e double -> + - * / char -> è trattabile come intero bool -> ! && || di relazione -> > < >= <= == !=
Precedenze fra operatori
! (> >= < <=) (== !=) && || (++ --) (* / %) (+ -)
Compatibilità fra tipi diversi Conversione automatica: regola di dominanza double, float, int, char Il tipo bool è comunque trattato come intero
Casting: es, (float) var
Esempi:
Secondo il vecchio standard (Dev4.01), si poteva scrivere come segue:
CODE | /*Il primo programma*/ #include<iostream.h> #include<stdlib.h> void main() { cout<<"Questo e\' il mio primo programma"; system("PAUSE"); } |
Prova Questo e' il mio primo programma Premere un tasto per continuare
Secondo l'ultimo standard C++ (Dev 5) le intestazioni debbono scriversi nella forma mostrata di seguito:
N.B. Il tipo del main non può essere void. I nomi di alcuni file di intestazione, se facenti parte della libreria C++, debbono essere preceduti dalla lettera c. Gli analoghi file della libreria C possono però essere inclusi con la notazione del vecchio standard
Si può perciò scrivere:
CODE | /*Il primo programma*/ #include<iostream> #include<cstdlib> int main() { cout<<"Questo e\' il mio primo programma"; system("PAUSE"); return 0;//Restituisce valore 0 al main perchè di tipo int } |
oppure:
CODE | /*Il primo programma*/ #include<iostream> using namespace std; #include<stdlib.h> int main() { cout<<"Questo e\' il mio primo programma"; system("PAUSE"); return 0; } |
Il compilatore dell'ambiente Dev5-C++ aderisce al nuovo standard, quindi d'ora in poi ci si adeguerà al formalismo del nuovo standard C++, ma per semplicità, useremo le librerie del C ovunque possibile. Scriveremo quindi: #include<stdlib.h> e non #include<cstdlib>ma #include<iostream>using namespace std; e non: #include<iostream.h> (che non sarebbe accettato dal Dev5) Download Dev-C++D'ora in avanti possiamo cominciare a sviluppare i nostri primi programmi in C++. Per il Download del compilatore andate a questa paginaIl nostro primo vero programmaPremessaD'ora in avanti entreremo nel vivo della programmazione realizzando i nostri primi programmi in C++. Un buon programmatore deve associare alle proprie conoscenze informatiche l'ingegno per la risoluzione di qualsiasi problema. Ciò per dire che bisogna usare la testa nella programmazione, perchè senza di essa non si va da nessuna parte Ecco come si presenta il compilatorePer creare il file sorgente basta cliccare sul foglio cerchiato in rosso nell'immagine (o in alternativa Ctrl+N). Prima però andate su Strumenti-> Opzioni dell'Editor andate su Mostra e spuntate la casella Numeri di Linea. Così se il compilatore vi rileverà un errore nel codice vi segnalerà anche il rigo in cui si trova l'errore così da facilitarvi la correzione Programma che risolve un sistema di due equazioni in due incogniteVi riporterò il codice del programma per poi spiegarvi per filo e per segno ogni singolo passaggio. Potete fare copia-incolla dal tag Code e copiarlo sul vostro compilatore così potrete anche eseguirlo, l'importante è capire il procedimento CODE | /*Program sistema di due equazioni in due incognite*/ /*Prima versione: attenzione! Questo programma potrebbe non funzionare correttamente per motivi che spiegheremo in seguito*/
//Intestazioni di minima
#include<iostream> using namespace std; #include<stdlib.h>
int main() {
//Dichiarazioni
float a,b,c,d,e,f; //Variabili di input float x,y; //Variabili di output
cout<<"Assegna valore ad a,b,c,d,e,f\t"; cin>>a>>b>>c>>d>>e>>f; //Assegna valore alle variabili da console
x=(c*e-b*f)/(a*e-b*d); //Algoritmo risolutivo y=(a*f-c*d)/(a*e-b*d); //Algoritmo risolutivo
cout<<"Il valore di x e/':"<<x<<endl; cout<<"Il valore di y e/':"<<y<<endl;
system("PAUSE"); return 0; } |
Prova
Assegna valore ad a,b,c,d,e,f 2 4 6 1 3 5 Il valore di x e':-1 Il valore di y e':2
Si noti che la fase di analisi che ha preceduto il progetto del programma non è stata condotta adeguatamente. Non si è tenuto conto della possibilità che il determinante dei coefficienti sia nullo. Pertanto il programma non funziona correttamente per qualsiasi insieme di dati in ingresso
I caratteri "/*" e "*/" servono per inserire dei commenti abbastanza lunghi (solitamente quelli che superano più di un rigo) e il commento va interposto tra /* e */
CODE | /*Questo è il mio primo programma*/ |
mentre il doppio slash "//" è valido solo per un rigo, e se si vuole "invadere" il rigo seguente è necessario ripetere il doppio slash
CODE | //Questo è il mio primo //programma |
Ricordo che i commenti non sono visti dal compilatore, ma servono esclusivamente all'utente, quindi potete scriverci quello che volete senza subire ritardi nella compilazione e di conseguenza senza peggiorare il costo computazionale e la presentazione dei dati di output
Ritornando al programma possiamo notare le intestazioni di minima che consentono di utilizzare i costrutti seriali cin e cout e l'inclusione delle librerie standard del C++
Dopo le intestazioni inseriamo la funzione main, indispensabile per poter chiamare qualsiasi altra funzione (il concetto di funzione verrà ripreso più in là nel corso)
Fatto ciò passiamo alle dichiarazioni delle variabili di input assegnandone un tipo (float). Col tipo float possiamo assegnare in ingresso numeri reali (con la virgola per intenderci), se invece le avevamo dichiarate di tipo int potevamo immettere in ingresso solo numeri interi
Dapprima tramite il cout digitiamo l'istruzione che l'utente dovrà eseguire, e poi tramite il cin immettiamo i valori alle singole variabili
Poi troviamo l'algoritmo risolutivo, ovvero, il cuore del programma, quello che ci permette di risolvere il problema. L'algoritmo è la chiave di tutti i programmatori, più esso è sintetizzato e migliore sarà il programma e migliore sarà il suo costo computazionale
Infatti l'algoritmo
CODE | x=(c*e-b*f)/(a*e-b*d); y=(a*f-c*d)/(a*e-b*d); |
può essere raffinato (vedremo poi come)
Una volta eseguito l'algoritmo bisogna rappresentare sulla finestra di output i dati ricavati dal programma tramite il cout (vedi programma)
N.B. Nel C++ vengono utilizzati alcuni codici per rendere più comprensibile il programma in fase di output:
\t carattere di tabulazione: stessa funzione del TAB \n carattere di accapo (oppure cout<<endl;): permette di andare a capo per scrivere la "e'" (verbo) è necessario interporre tra la "e" e l'accento " ' " uno slash altrimenti non verrà rilevato dal compilatore come carattere ASCII (vedi programma)
Per compilare il programma andate su Esegui->Compila, scegliete dove compilare il programma e in caso di esito positivo (programma privo di errori sintattici) verrà creato l'eseguibile. Per eseguire il programma andate su Esegui->Esegui
Programma che risolve un sistema di due equazioni in due incognite (versione migliorata)
Vediamo come migliorare il precedente programma per quanto riguarda il costo computazionale
CODE | /*Program sistema di due equazioni in due incognite*/ /*Seconda versione: attenzione! Questo programma potrebbe non funzionare correttamente per motivi che spiegheremo in seguito*/
//Intestazioni di minima
#include<iostream> using namespace std; #include<stdlib.h>
int main() {
//Dichiarazioni
float a,b,c,d,e,f; //Variabili di input float x,y; //Variabili di output float det; //Determinante
cout<<"Assegna valore ad a,b,c,d,e,f\t"; cin>>a>>b>>c>>d>>e>>f; //Assegna valore alle variabili da console
det=(a*e-b*d);
x=(c*e-b*f)/det; //Algoritmo risolutivo y=(a*f-c*d)/det; //Algoritmo risolutivo
cout<<"Il valore di x e/':"<<x<<endl; cout<<"Il valore di y e/':"<<y<<endl;
system("PAUSE"); return 0; } |
Ecco il programma, stavolta migliorato per quanto riguarda il costo computazionale Non abbiamo fatto altro che dichiarare una variabile det, assegnando a questa variabile il determinante dell'equazione. Poichè il determinante dell'equazione compare in entrambe le istruzioni possiamo migliorare il programma mettendo in evidenza il polinomio (a*e-b*d) così da semplificare la traduzione al compilatore N.B. Quando si introducono nuove variabili nel programma ricordate sempre di dichiararle! La dichiarazione di una variabile in C++ non fa altro che riservare in memoria un registro, e questo registro verrà poi "riempito" da un valore numerico (o carattere) a seconda delle esigenze del programmatore Questo lavoro verrà fatto in automatico dal compilatore, però è bene capire il procedimento Si noti che la fase di analisi che ha preceduto il progetto del programma non è stata condotta adeguatamente. Non si è tenuto conto della possibilità che il determinante dei coefficienti sia nullo. Pertanto il programma continua a non funzionare correttamente per taluni insiemi di dati in ingresso. Il programma è stato invece migliorato per quanto riguarda il costo computazionale e la presentazione dei dati di output Programma che risolve un sistema di due equazioni in due incognite (versione completa)Prima di svolgere il programma è necessario introdurre un nuovo costrutto che sarà d'ora in poi onnipresente in quasi tutti i programmi che tratteremo in questo corso Costrutti selettiviIF..THEN (o semplicemente IF)CODE | if (espressione) { Blocco; } Seguito programma |
Ovvero, se (IF tradotto in italiano) è verificata l'espressione tra parentesi, esegui il blocco di istruzioni (Blocco), in caso contrario salta l'istruzione IF e prosegui con il programma
IF..THEN..ELSE (o semplicemente IF..ELSE)
CODE | if (espressione) { Blocco 1; } else { Blocco 2; } Seguito programma |
Ovvero, se (IF tradotto in italiano) è verificata l'espressione tra parentesi, esegui il blocco 1 e prosegui con il programma saltando l'ELSE, altrimenti (ELSE tradotto in italiano) esegui il blocco 2 e poi prosegui con il programma Blocco è una sequenza di istruzioni. In ogni caso, se Blocco è costituito da una singola istruzione, le parentesi graffe che lo delimitano si possono eliminareespressiome è in linea di principio una espressione booleana o di relazione, cioè suscettibile di assumere valore booleano. Per la chiarezza del programma è opportuno attenersi a questa regola. In pratica, per il modo in cui è definito il tipo booleano in C++, qualsiasi espressione aritmetica lecita nel linguaggio potrebbe essere usata, assumendo come valori booleani lo 0 ( false) e ogni valore diverso da 0 ( true) ( vedi algebra di Boole) Video tutorial - Costrutto If, Else If, Else -> Si ringrazia XoaX.net per il video tutorial Ecco riportata la versione definitiva del programma che risolve un sistema di due equazioni in due incognite CODE | /* Program sistema di due equazioni in due incognite */ /* Terza versione: versione definitiva con esempio d'uso del costrutto if..else */
//Intestazioni di minima
#include<iostream> using namespace std; #include<stdlib.h>
int main() {
//Dichiarazioni
float a,b,c,d,e,f; //Variabili di input float x,y; //Variabili di output float det; //Variabile di algoritmo
cout<<"Assegna valore ad a,b,c,d,e,f\t"; cin>>a>>b>>c>>d>>e>>f; //Assegna valore alle variabili da console
det=(a*e-b*d); //Calcolo del determinante del sistema if (det!=0) /* Se il determinante è diverso da 0, quindi ammette soluzioni, esegui il calcolo delle soluzioni */ { //Calcolo soluzioni x=(c*e-b*f)/det; //Algoritmo risolutivo y=(a*f-c*d)/det; //Algoritmo risolutivo
cout<<"Il valore di x e/':"<<x<<endl; // Manda il risultato delle soluzioni cout<<"Il valore di y e/':"<<y<<endl; // in output da console } else // Altrimenti, il caso opposto al precedente, ovvero, se det è uguale a 0 /* Caso soluzioni inesistenti */ cout<<"\n Il sistema non ammette soluzioni (det=0)"; /* Manda in output il seguente messaggio per avvertire all'utente che il sistema non ammette soluzione (det=0) */
system("PAUSE"); /* Blocca la schermata di output (quella nera per intenderci) per prendere nota dei risultati dell'elaborazione */ return 0; // Restituisce al main valore 0 } |
Ora il programma funziona correttamente per ogni insieme di dati in ingresso. Il programma è anche stato migliorato per quanto riguarda la documentazione
PROVE
Assegna valore ad a,b,c,d,e,f 2 4 6 4 2 8
Il valore di x è: 1.66667 Il valore di y è: 0.666667
Assegna valore ad a,b,c,d,e,f 2 1 5 8 4 6
Il sistema non ammette soluzioni (det=0)
Programma massimo fra tre
Il programma che andremo a trattare a breve si occuperà di individuare, dati tre valori in input, il massimo fra i tre con il semplice utilizzo del costrutto IF
Vediamo come sarà strutturato il codice:
CODE | /* Program max_fra_tre (esempio d'suo del costrutto if) */
//Intestazioni di minima
# include <iostream> using namespace std; #include <stdlib.h>
int main() { float a,b,c; //Variabili di input float max; //Variabile di output
cout<<"Assegna valore ad a,b,c\t"; cin>>a>>b>>c;
max=a; //Pongo nel registro "max" il valore della variabile assunta da "a"
if(b>max) //Confronto max (cioè "a") con b { max=b; //Pongo nel registro "max" il valore contenuto nel registro "b" } //End if
if(c>max) //Confronto max (cioè "a" o "b") con c max=c; //Pongo nel registro "max" il valore contenuto nel registro "b"
cout<<"\nIl massimo valore è: "<<max; //Stampo su console il valore di "max"
system("PAUSE"); return 0; } //End main |
PROVA
Assegna valore ad a,b,c 2.3 4.5 1.7
Il massimo valore è: 4.5
Passiamo all'analisi del programma
Abbiamo dichiarato tre variabili di tipo float (il programma prevede di individuare il massimo fra tre) che saranno le nostre variabili di input che verranno inserite da console e una variabile "max" che conterrà il massimo valore tra i tre
L'algoritmo da utilizzare è il seguente: parto nel caso in cui la variabile "a" è quella che ha il valore massimo, quindi copio nel registro "max" il valore contenuto nel registro "a" (potete scegliere arbitrariamente il valore da inserire in "max") Poi tramite il costrutto IF effettuo una serie di confronti che determineranno il massimo fra i tre
Che viene tradotto così: SE b>max, ovvero, se il contenuto del registro "b" è maggiore di quello di "max" (che contiene inizialmente il valore di "a") copia nel registro "max" il valore contenuto nel registro "b" poichè risulta essere maggiore di quello di "a", in caso contrario salta l'IF e prosegui con il programma
N.B. Nell'istruzione precedente le parentesi graffe che delimitano il costrutto IF possono essere eliminate perchè contengono un'unica istruzione (come già precisato all'inizio del corso)
Passiamo all'istruzione successiva
Ora in "max" sarà contenuto il maggiore tra "a" e "b" (dipendente dai valori assegnati in input da console), quindi passiamo al successivo confronto con "c" per determinare chi tra i tre risulta essere il maggiore. Ciò viene tradotto: SE c>max,ovvero, se il contenuto del registro "c" è maggiore di quello di "max" (che contiene il valore di "a" o di "b" a seconda dell'assegnazione in input), copia nel registro "max" il valore di "c" poichè risulta essere maggiore del valore contenuto da "max", in caso contrario salta l'IF e prosegui con il programma
N.B. Si può notare che le parentesi graffe che delimitano lIF nell'ultima istruzione sono praticamente assenti per motivi sopraccitati
CODE | cout<<"\nIl massimo valore è: "<<max; |
Stampa su console il valore di "max", che in definitiva corrisponde al massimo valore tra le variabili a, b e c AvvisoPer QUALSIASI dubbio non esitate a chiedere in questo topic o a contattarmi in privato Non appena possibile realizzerò la seconda parte del corso, forse la più interessante riguardante la realizzazione di semplici programmi aritmetici con il Dev-C++. Ogni passaggio e frammento di codice verrà commentato opportunamente per rendervi la vita quanto più facile possibile Quindi restate sintonizzati Da Cetramod per ora è tutto...Curti$...Napoli...a voi in studio Messaggio modificato da Curti$ il 28/08/2009, 17:27:05
Si vis pacem, para bellum
|