Esercitazione 9 Lunedi 15
Dicembre 2008
Nelle precedenti
esercitazioni abbiamo visto come usare array e stringhe usando lo stile del
linguaggio C.
In C++ esistono delle librerie per definire sia array che stringhe di
dimensione variabile.
Vector
Gli array dinamici sono definiti
nella classe vector
che si include con #include<vector>
Una variabile vector si
dichiara nel seguente modo:
vector<type> variable_name (number_of_elements);
Il numero di elementi e’
opzionale.
Infatti e’ possibile ridimensionare dinamicamente il vettore (funzione resize)
come nel seguente esempio (provate ad eseguirlo):
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<double>
student_marks;
// dichiarazione di un vettore di double senza
specifica del numero di elementi
int num_students;
cout <<
"Number of students in this group: ";
cin >> num_students;
// leggiamo
numero di elementi
student_marks.resize
(num_students);
// ridimensioniamo il vettore
for
(int i = 0; i < student_marks.size(); i++)
{
cout << "Enter marks for student #" << i+1
<< ": ";
cin >> student_marks[i];
}
return 0;
}
Si puo’ anche estendere un vettore inserendo elemento per elemento usando la funzione push_back come
nel seguente esempio (provate ad eseguirlo):
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<double>
student_marks;
int number;
char answer;
cout << "Vuoi
inserire un numero (y/n)? ";
cin >> answer;
while (answer == 'y')
{
cout << "Inserisci valore: ";
cin >> number;
// aggiungi in fondo al vettore
student_marks.push_back(number);
cout << "Vuoi inserire un altro numero (y/n)? ";
cin >> answer;
}
// stampiamo il risultato usando size
for (int i = 0; i < student_marks.size();
i++)
{
cout << "Student #" << i+1 << '\t' <<
student_marks[i];
}
// '\t' =carattere TAB
return 0;
}
String
Le stringhe di questa libreria hanno tipo string.
Si inizializzano e copiano
utilizzando direttamente l’assegnamento “=”.
Nel seguente programma troverete alcuni esempi d’uso di funzioni della libreria
string.h
(es. compare, length) e di altre operazioni correlate (es. getline). Provate ad
eseguirlo.
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string str1;
// Dichiarazione stringa
string str2 ("labo di programmazione");
// Dichiarazione con inizializzazione stringhe
str1="labo di programmazione";
// assegnamento di una nuova stringa
if (str1.compare(str2) == 0) // confronto tra str1 e str2
cout
<< str1 << " uguale a " << str2 << endl;
str1=str1+" a.a. 2008/09";
if (str1.compare(str2) != 0)
cout << str1 << " diversa da
" << str2 << endl;
cout << "The length of str1 is " << str1.length()
<< " characters.\n";
cout << "Digita una stringa senza blank e premi invio: ";
cin >> str1;
cout << "Hai digitato: " << str1 << endl;
cin.ignore();
cout << "Digita ora una stringa anche con blank e premi invio: ";
getline(cin, str1);
cout << "Hai digitato: " << str1 << endl;
return 0;
}
I record in C si definisco
usando il costruttore struct, spesso
usato insieme a typedef.
Ad esempio la dichiarazione:
typedef struct {
float x;
float y;
float z;
} point
point P;
definisce una variabile di tipo point, un record con 3 campi di tipo intero.
I campi della variabile P si possono manipolare usando P.x, P.y e P.z come nell’assegnamento P.x=0.5.
Definire ora un tipo record Studente contente i campi Nome, Cognome, Esame (string), Voto (int).
Definire quindi un vettore (vector) di Studenti e definire opportune procedure (che utilizzano le librerie vector e string) per
- inserimento dei dati di un esame di uno studente;
- stampa dei dati degli esami di un dato studente;
- stampa dei dati degli esami di tutti gli studenti;
- stampa della media dei voti di ogni studente.
Provate ad usare le
procedure inserendo i voti di alcuni studenti in diversi esami e poi calcolate
la loro media.