Esercitazione 9 Lunedi 15 Dicembre  2008

Soluzione esercizio sudoku.

 

 

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;

}

 

 

Esercizio su record, vettori e stringhe C++

 

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.