Appunti, esempi ed esercizi sui linguaggi C/C++

Transcript

Appunti, esempi ed esercizi sui linguaggi C/C++
Appunti, esempi ed esercizi sui linguaggi C/C++
Dispense e materiale didattico su
http://www.eclecticforce.com/
Ambiente di sviluppo Dev C++
http://www.bloodshed.net/devcpp.html
// commento su una linea
/* commento su più linee - inizio
commento su più linee – fine */
//programma n° 1 – uso di cin e cout, stringa di caratteri
#include <iostream.h>
#include <stdlib.h>
void main() //dichiarazione della funzione principale
{
//inizio blocco
char * nome_utente;
cout<<"inserisci il tuo nome ";
cin>> nome_utente;
cout << "ciao "<< nome_utente << endl;
system("PAUSE");
}
//fine blocco
cin e cout non sono istruzioni, bensì oggetti particolari (stream) che possiamo tuttavia utilizzare al posto
delle funzioni printf() e scanf() tipiche del C, per semplificare la scrittura del codice.
L’operatore << si può utilizzare più volte sulla stessa linea. In alcune righe viene specificato anche endl
come operando destro dell’operatore <<. Si tratta di un manipolatore che manda a capo l’output su console.
//programma n° 2 – controllo (con if) su due variabili di tipo intero
#include <iostream.h>
#include <stdlib.h>
void main()
{ int a, b;
cin>>a;
cin>>b;
//dichiarazione della funzione principale
//dichiarazione di due variabili di tipo intero
//lettura di a da tastiera
//lettura di b da tastiera
//controllo sul numero più grande
}
if (a>b) cout << a << " e' più grande di" << b << endl;
else if (a<b) cout << b << " e' più grande di" << a << endl;
else cout << a << " e' uguale a " << b << endl;
system("PAUSE");
//esercizio n° 3a – controllo (con if e for) ricerca del massimo
//esercizio da completare, seguendo l’esempio dell’esercizio 2
#include <iostream.h>
// file di intestazione (header) che contiene
#include <stdlib.h>
void main()
{ int n, x, max=-32768;
cin>>n;
}
//dichiarazione della funzione principale
//dichiarazione di tre variabili di tipo intero
//lettura di n da tastiera
for (int i=1;i<=n;i++){
//lettura di x
//confronto di x con max ed eventuale memorizzazione in max
}
// scrivere il massimo (valore di max)
system("PAUSE");
//es. 3 b modificare il programma dell’es. n° 3 utilizzando solo interi senza segno
// e quindi modificando anche il valore di max
si può utilizzare il tipo:
unsigned int
//soluzione dell’esercizio 3a
#include <iostream.h>
#include <stdlib.h>
void main()
//dichiarazione della funzione principale
{ int n, x, max=-32768;
//dichiarazione di tre variabili di tipo intero
cin>>n;
//lettura di n da tastiera
for (int i=1;i<=n;i=i+1) {
cin >> x;
//lettura di x
if (x>max) max=x; // se x è maggiore di max, max=x
}
cout << max;
// scrive il massimo (valore di max)
system("PAUSE");
}
//esercizio n° 4 – stesso problema, ma risolto con un vettore di interi con segno
#include <iostream.h>
#include <stdlib.h>
void main()
{ int n, x, imax;
int v[100];
//dichiarazione della funzione principale
//dichiarazione di tre var. intere
//dichiarazione di un vettore v di 100 interi
int c;
do{
cin>>n;}
while(n>=100);
//lettura di n da tastiera
//lettura (o caricamento) del vettore
for (int i=1;i<=n;i++) {
cout<<”inserisci l’elemento n° “<<i;
cin >> v[i-1];
//lettura di v[i-1]
}
//ricerca del massimo
imax=0;
for (int i=1;i<n;i=i+1) {
if (v[i]>v[imax]) imax=i; // se v[i] è maggiore di v[imax], imax=i
}
// visualizzazione del massimo
cout << “la posizione del massimo è”<<imax; // scrive l’indice del massimo (valore di
imax)
cout << “e il massimo valore è”<<v[imax];
}
system("PAUSE");
//esercizio 4b
#include <iostream.h>
#include <stdlib.h>
int main()
{
float v[81];
int i;
//caricamento del vettore
for(i=0;i<10;i++){
cout<<"inserisci l'elemento di posizione "<<i<<" -> ";
cin>>v[i];
}
// visualizzazione del vettore
for(i=0;i<10;i++){
cout<<"elemento di posizione "<<i<<" -> "<<v[i]<<endl;
}
for(i=0;i<10;i++) v[i]-=0.5; //si diminuisce il voto di mezzo punto
//per ogni elemento del vettore
// visualizzazione del vettore
for(i=0;i<10;i++){
cout<<"elemento di posizione "<<i<<" -> "<<v[i]<<endl;
}
}
system("PAUSE");
return 0;
Esercizio n° 4b
#include <iostream.h>
#include <stdlib.h>
int main()
{
//dichiarazione e inizializzazione con costanti
int a[]={5,1,3,8,7};
for(int i=0;i<5;i++) cout<<a[i]<<" ";
system("PAUSE");
return 0;
}
Esercizio n° 5
Realizzare un programma per:
 leggere il raggio (di tipo non intero)
 calcolare l’area di un cerchio e la circonferenza
 visualizzare i valori calcolati
(definire pi greco come costante utilizzando prima #define e poi const)
soluzione: il programma in pratica non cambia, si può utilizzare uno dei due seguenti metodi:
#define PI 3.14159
const float PI=3.14159;
//Soluzione con #define
//Soluzione con const
#include <iostream.h>
#include <stdlib.h>
#include <iostream.h>
#include <stdlib.h>
#define pigreca 3.14159
void main( )
{
float raggio;
const float pigreca = 3.14159;
float area;
cout << "Inserire il raggio: ";
cin >> raggio;
cout << endl;
area = raggio * raggio * pigreca;
cout << "L'area del cerchio è: "
<< area << endl;
system(“PAUSE”);
}
void main( )
{
float raggio;
float area;
cout << "Inserire il raggio: ";
cin >> raggio;
cout << endl;
area = raggio * raggio * pigreca;
cout << "L'area del cerchio è: "
<< area << endl;
system(“PAUSE”);
}
(in grassetto le differenze)
Prova dei programmi di sopra.
Esercizio 6
Calcolo del fattoriale. Si ricorda che il fattoriale si indica in matematica come:
n! = n * (n-1) * (n-2) * … 1
esempio 5!=5*4*3*2*1
Realizzare una funzione C/C++ per il calcolo del fattoriale:
prima con il while, poi con il for (da n a 1 e poi il contrario).
N.B.
il ! non può essere utilizzato come parte di un identificatore (ovvero il nome di una variabile) perché è un
simbolo riservato che vuol dire NOT. Quindi non si può definire una variabile n!, ma si può chiamare f o
fatt.
//soluzione con for a crescere, da trasformare in funzione
#include <iostream.h>
#include <stdlib.h>
int main()
{
int n, i, fatt;
cin>>n;
fatt=1;
for(i=1;i<=n; i++;) fatt=fatt*i;
cout<<fatt<<endl;
system("PAUSE");
return 0;
}
Esercizio 7
Sempre utilizzando le istruzioni di sopra per le iterazioni (cicli) realizzare prima un programma E POI
UNA FUNZIONE per la calcolare il numero di Fibonacci (serie di Fibonacci)
1) a=0
//equivale a f0
2) b=1
//equivale a f1
3) c=a+b 2 3
//equivale a f2
a=b
1 2
b=c
2 3
//spunto di soluzione (solo ciclo), IL RESTO FATELO VOI…
a=0;
b=1;
for(i=3;i<=n;i++) { c=a+b;
a=b;
b=c;
}
//esercizio n° 8
//le funzioni definite dall’utente in C/C++
#include <iostream.h>
#include <stdlib.h>
/*funzioni: doppio restituisce il doppio di un intero passato come parametro in ingresso
funzioni: dividi restituisce il primo numero diviso il secondo*/
void ciccio(){
cout<<”ciao ciccio”;
}
int doppio(int n){
return n*2;}
float dividi(float a, float b)
{
return a/b;
}
void main()
{int x; float y;
ciccio();
cin >> x;
cin >> y;
//doppio(6) ; errata
cout << doppio(3) << endl;
int z=doppio(x);
cout << dividi(7, 5)<< endl;
system("PAUSE");
}
Modificare il main in modo da visualizzare il doppio di 3, e la divisione di 7 per 5, usando le
funzioni dichiarate in precedenza.
Esistono funzioni definite in altri programmi o librerie (ad esempio la funzione sizeof() già
utilizzata precedentemente)
//esercizio n° 9
//visualizzazione della data e dell’ora di sistema
//si utilizza la funzione time() che opera una modifica del valore della var. tempo,
passata per riferimento (c’è & davanti)
#include <iostream.h>
#include <time.h> // libreria per la gestione di data, ora e intervalli di tempo
void main()
{
long tempo;
time(&tempo);
//la funzione time modifica una variabile tempo di tipo long
cout << "Data e ora istantanea : " << asctime(localtime(&tempo)) << endl;
cin.get();
// anche questa è una funzione; attende un carattere
// in alternativa a system("PAUSE")
}
//esercizio n° 10
//variabili per riferimento
#include <iostream.h>
#include <stdlib.h>
/*funzione che scambia due interi passati come parametri in ingresso
a e b sono passate per indirizzo o per riferimento (c'è & davanti) */
void scambia(int &a, int &b)
{ //c è una variabile interna o locale alla funzione, mentre a e b vengono modificate
int c;
c=a;
a=b;
b=c;
}
//scambia è dichiarata di tipo void, quindi non restituisce nulla!
//funzione principale main che richiama la funzione definita sopra
void main()
{int x,y;
cin >> x;
cin >> y;
scambia(x, y);
cout << x << endl;
cout << y << endl;
system("PAUSE");
}
//esercizio n° 11
//realizzare una funzione per il calcolo del fattoriale, SOSTITUENDO AI COMMENTI
LE ISTRUZIONI APPROPRIATE E PROVARNE IL FUNZIONAMENTO
#include <iostream.h>
#include <stdlib.h>
long int fattoriale(int n)
{ //dichiarazione variabili necessarie alla funzione (variabili locali)
//calcolo del fattoriale (con un ciclo for)
return fatt;
}
int main()
{
int x;
//leggi x da tastiera
//scrivi fattoriale(x)
system("PAUSE");
return 0;
}
//esercizio n° 12
//realizzare una funzione per il calcolo della potenza(a, esp) come a elevato a esp
STAMPARE E CONSEGNARE I LISTATI AI PROFESSORI (SCRIVERE ANCHE NOME E COGNOME)
//esercizio n° 13
esercizio con i cicli:
realizzare un semplice programma in C/C++ per
leggere dieci valori interi da tastiera e visualizzarli
funzione per risolvere un’equazione di secondo grado
ritorna 1 se sol. reali e distinte
ritorna 0 se sol. reali e coincidenti
ritorna –1 se sol. Immaginarie
int soluzioni(float a, float b, float c, float &x1, float &x2){
float delta=b*b-4*a*c;
if (delta>0) {x1=(-b-sqrt(delta))/(2*a);
x2=(-b+sqrt(delta))/(2*a);
return 1;
}
if (delta==0) {x1=x2=-b/(2*a);
return 0;
}
if (delta<0) return -1;
}
// esercizio 14
// esercizio con gli array
//dichiarazione dell’array di 10 elementi di tipo intero
int a[10];
// lettura di un array di 10 elementi
for(i=0; i < 10; i++)
{
cout << ”inserisci l’elemento n. “ << i << endl;
cin >> a[i];
}
/
// visualizzazione di un array di 10 elementi (un elemento per riga)
for(i=0; i < 10; i++)
{
cout << a[i] <<endl;
}
// visualizzazione di un array di 10 elementi nella stessa riga
for(i=0; i < 10; i++)
{
cout << a[i] << “
}
cout<<”\n”;
“;
//dichiarazione dell’array di 10 righe e 20 colonne di elementi di tipo intero
int a[10][20];
0..9 e 0..19
1) realizzare un programma che, letto un array di 10 elementi di tipo intero,
calcola la media degli elementi pari
variante dello stesso programma
2) realizzare un programma che letto un array di 10 elementi di tipo intero,
calcola la media degli elementi con indice pari
una volta che i programmi funzionano, trasformarli utilizzando le funzioni:
FUNZIONE PER LEGGERE UN ARRAY
N.B. Non si devono controllare gli elementi in lettura.
FUNZIONE CHE RESTITUISCE LA MEDIA DEI PARI
(è un ciclo che controlla ogni elemento e se è pari lo somma per calcolare poi la media)
FUNZIONE CHE RESTITUISCE LA MEDIA DEGLI ELEMENTI CON INDICE PARI
Ovviamente le funzioni devono essere richiamate dal main.
Operazioni logiche
Linguaggio
parlato
Nome
inglese
Linguaggio
matematico
Pascal
C/C++
E
O
logico logico
AND
OR
NON
logico
NOT
∧
∨
¬
and
&
or
|
not
!
Esempi
linguaggio parlato
(significato in
italiano)
metalinguaggio o
pseudocodifica
Pascal
Linguaggio C/C++
se x è minore o uguale a y allora assegna a z il valore 6
se x<=y allora z=6
se x<=y allora z←6
if x<=y then z:=6 ;
if(x<=y) z=6;
Attenzione!
In C/C++, nelle condizioni, dobbiamo indicare i simboli & e | due volte come nel caso di =
Esempi in C++
La frase ‘ se a è uguale a 0 allora scrivi”la divisione non si può fare” ‘ si traduce in C/C++:
if (a==0) cout<<”la divisione non si può fare”;
La frase ‘se a è minore di b e b è minore di c allora scrivi “il più piccolo è a” ‘ si traduce in C+
+:
if ((a<b)&&(b<c)) cout<<”il più piccolo è a”;
la frase “se a è più grande di b oppure a è più grande di c scrivi ‘a è più grande di b o c’” si
traduce:
if (a>b||a>c) cout<<” a è più grande di b o c”;
se a è pari scrivi “a è pari”
if (a%2==0) cout<<” a è pari”;
se x è multiplo di 5 incrementa la somma dei multipli di 5
if (x%5==0) multipli5=multipli5+1;
if (x%5==0) multipli5++;
alcuni esempi di funzioni predefinite (file math.h e stdlib.h)
radice quadrata di n:
sqrt(n)
elevamento a potenza:
pow(base, esponente)
Tipi elementari (o primitivi)
Un tipo è una coppia < V, O >, dove V è un insieme di valori e O è un insieme di operazioni per la
creazione e la manipolazione di elementi di V.
In un linguaggio di programmazione i tipi rappresentano le categorie di informazioni che il
linguaggio consente di manipolare. I tipi di dato base principali forniti dal C++, o tipi predefiniti,
sono i seguenti:
Tipo di dato
Booleani
Caratteri
Interi
Virgola mobile
Virgola mobile doppia precisione
Parola chiave
bool
char
int
float
double
Il tipo bool serve a rappresentare i valori di verità e su di esso sono definite sostanzialmente le
normali operazioni logiche (&& per l'AND, || per l'OR, ! per la negazione...).
Il tipo char è utilizzato per rappresentare piccoli interi (e quindi su di esso possiamo eseguire le
normali operazioni aritmetiche) e singoli caratteri, viene memorizzato su almeno un byte.
int è utilizzato per contenere numeri interi in un intervallo più grande di char e viene memorizzato
su almeno due byte.
float e double contengono entrambi numeri reali, spesso nella rappresentazione a virgola mobile;
float contiene valori in precisione semplice, mentre double rappresenta numeri in doppia
precisione.
Ai tipi fondamentali è possibile applicare dei qualificatori. I qualificatori modificano il significato
dei tipi di base, ed estendono l’insieme dei tipi di dati predefiniti. Esistono quattro qualificatori:
signed (con segno), unsigned (senza segno), short (piccolo) e long (lungo).
I qualificatori long e short modificano i valori massimo e minimo che un tipo di dato può
contenere; ordinando i tipi interi per dimensione, abbiamo:
short int
int
long int
mentre ordinando i tipi reali per dimensione, abbiamo:
float
double
long double
I qualificatori signed e unsigned indicano al compilatore come usare il bit di segno con i tipi interi
e i caratteri (i numeri a virgola mobile hanno sempre un segno).
I qualificatori non sono liberamente applicabili a tutti i tipi: short si applica solo a int, signed e
unsigned solo a char e int e infine long solo a int e double. Il tutto è riassunto nella tabella cvhe
segue:
Tipo di dato
Booleani
Caratteri
Interi brevi
Interi
Interi lunghi
Caratteri con segno
Interi brevi con segno
Interi con segno
Interi lunghi con segno
Caratteri senza segno
Interi brevi senza segno
Interi senza segno
Interi lunghi senza segno
Virgola mobile
Virgola mobile doppia precisione
Reali lunghi
Parola chiave
Bool
Char
short int
Int
long int
signed char
signed short int
signed int
signed long int
unsigned char
unsigned short int
unsigned int
unsigned long int
float
double
long double
Il tipo int è per default signed e quindi è equivalente a tipo signed int, invece i tipi char, signed
char e unsigned char sono considerate categorie distinte. I vari tipi sopra elencati differiscono per
l'intervallo dei valori rappresentabili e per la quantità di memoria richiesta per rappresentare un
valore di quel tipo (che però può variare da implementazione a implementazione).
Nota
Un bit è una cifra del sistema binario. Esso può assumere valore 0 o 1. Ad esempio, nel sistema
binario, i numeri sono rappresentati nel modo seguente:
Sistema decimale
0
1
2
3
4
5
Sistema binario
0
1
10
11
100
101
e così via. Una sequenza di otto bit prende il nome di byte. Utilizzando i byte, quindi, lo zero è
rappresentato con 8 bit a zero: 00000000, l’uno come 00000001, il due come 00000010 e così via.
Dato che per ogni bit è possibile specificare solo 2 cifre (0 oppure 1), con un byte si possono
rappresentare 28=256 numeri diversi, come gli interi compresi tra 0 e 255. Se si vogliono anche gli
interi negativi, è possibile rappresentare gli interi compresi tra -128 e 127. Da questo si può capire
che le variabili di tipo char occupano in pratica un byte all’interno della memoria.
Un discorso analogo si può fare per gli short, che rappresentano generalmente le word, cioè
sequenze di due byte. Gli interi (e spesso anche i long) rappresentano sequenze di quattro byte
chiamate doubleword.
La dimensione delle locazioni di memoria associate a variabili che hanno certi tipi non è fissa per
tutte le architetture.
La funzione sizeof del C++ permette di avere la dimensione in byte dei vari tipi di dato. Vediamo
un esempio:
// dimensione dei tipi di dato
#include <iostream.h>
#include <stdlib.h>
int main()
{
cout << "Dimensione (in byte) dei tipi di dato:" << endl;
cout << "bool: " << sizeof(bool) << endl;
cout << "char: " << sizeof(char) << endl;
cout << "short: " << sizeof(short) << endl;
cout << "int: " << sizeof(int) << endl;
cout << "long: " << sizeof(long) << endl;
cout << "float: " << sizeof(float) << endl;
cout << "double: " << sizeof(double) << endl;
cout << "long double: " << sizeof(long double) << endl;
system("PAUSE");
return 0;
}