Esercitazione 1: Lunedi 13 Ottobre 2008

 

Collegatevi con la vostra login utente aprite un browser (es. Explorer) e andate alla pagina:

http://www.disi.unige.it/person/DelzannoG/LABO_PROG/AA0809/

 

Esercizio 1 “Usare un terminale linux”

 

Aprite un terminale (bash shell) per poter lavorare da linea di comando:
- PC1: usate icona Cygwin sul desktop
- MAC: aprite una finestra “terminale”

 

Provate a navigare nel vostro file system usando il comando cd   ed usando /, ~, e .. per far riferimento rispettivamente  alla root,

alla vostra home e al padre della dir. corrente.

Usate ls con le diverse sue opzioni (consultate “man ls” per la lista) per visualizzare il contenuto

delle diverse directory ed in particolare per vedere il primo livello del file system e i file (anche quelli nascosti) nella vostra home.

 

 

Esempi di comandi: 

 

ls –l            visualizza file/directory nella vostra home (eventualmente usate ls –l | less se la lista e’ troppo lunga e poi la barra per proseguire)

ls /              visualizza il I livello del file system Linux

cd ..             vi posizione nella directory genitore

cd ~             vi posiziona nella vostra home directory

 

 

Posizionatevi nella vostra home e create una cartella (directory) Esempi con il comando mkdir (usare “man” per la sintassi).

Entrate nella cartella Esempi e provate ad aprire un editor (nano, pico, gedit o nedit) e a creare e salvare un file salvandolo con il nome prova.

Usate ls –al per visualizzare le informazioni del file prova (es. diritti Unix) file creato e cat prova per vederne il contenuto.

 

 

Esercizio 2 Uso del compilatore g++

 

Aprite un editor (es. gedit su Ubuntu/Linux per lavorare su una finestra separata, nano o pico direttamente dalla linea di comandi su Ubuntu o Cygwin). 

Copiate  il seguente programma C++ in un file primo.cpp e salvatelo nella vostra cartella Esempi
(oppure scaricate direttamente il file primo.cpp; per salvare il file in formato corretto: posizionare il cursore sul link e con il tasto destro selezionare Save link/Save link target o sim.)

 

/*

    Questo programma mostra il range di valori delle variabili di alcuni tipi base del C++ quali  int e unsigned int

 

*/

 

#include <iostream>

#include <climits>     

using namespace std;

 

int main()

{

  cout << "Intervallo dei valori rappresentabili con il tipo int" << endl;

  cout << "Type   Minimum    Maximum" << endl;

  cout << "int" << INT_MIN << "   " <<  INT_MAX << endl;

  return 0;

}

Alcuni chiarimenti:

La prima riga del file (la direttiva #include<iostream>) serve per poter utilizzare il comando di stampa cout (e in generale anche quello di lettura cin).
La seconda riga del file (la direttiva #include<climits>) serve per poter utilizzare le costanti INT_MIN e INT_MAX.La terza riga  verrà posta dopo tutti gli #include nuovamente per usare comandi di stampa e lettura.

Il vero programma è solo la parte fra parentesi graffe dopo int main(), e in questo caso comprende
3 comandi di stampa cout … e l’istruzione return 0 (segnalazione che il programma ha fatto il suo compito con successo).
Le parentesi graffe delineano l'inizio e la fine del programma.

cout è il canale principale per l'output del programma tipicamente sarà lo schermo.
Per noi quindi stampare equivale a visualizzare su schermo.
Nel programma mandiamo i messaggi e valori da stampare a cout usando la doppia freccetta <<.
Il testo fra le virgolette viene stampato tale e quale; endl significa "a capo", cioè passare all'inizio della riga successiva.

Quindi nella prima istruzione mandiamo in stampa su video la stringa “Intervallo …. ”  e poi andiamo a capo;
nella seconda istruzione mandiamo in stampa su video la stringa “Type  Minimum …. ”  e poi andiamo a capo;
nella terza istruzione mandiamo in sequenza la stringa “int”, il valore della costante INT_MIN, uno spazio, il valore di INT_MAX e poi andiamo a capo.
Sul video vedremo quindi un messaggio del tipo (dipende dalla rappresentazione degli interi):

Intervallo dei valori rappresentabili con il tipo int
Type   Minimum    Maximum
int-2147483648   2147483647

 

 

Compilate il programma usando il comando

 

g++ -Wall –pedantic primo.cpp -o myprog

 

Nota:  primo.cpp e’ il programma C++ sorgente mentre la stringa myprog passata con l’opzione –o e’ il nome

del programma eseguibile (risultato di compilazione e link).

Se non usate il parametro –o il programma eseguibile viene salvato con il nome di default: a.out (in ambiente Unix/Mac) o a.exe (Cigwyn)

L’opzione –Wall  serve per ottenere anche possibile “warnings” durante la compilazione

L’opzione –pedantic  per utilizzare lo standard C++

Lanciate ora l’eseguibile con il comando

        

./myprog

 

 

Ricordatevi di usare “./” se non lo fate la shell non trovera’ l’eseguibile e dara’ un’errore.

Cioe’ se provate a lanciare direttamente

myprog

nel 99% dei casi (dipende dalla conf. del sistema Linux/Unix sul quale lavorate) il risultato sara’:

 

bash: myprog: program not found

 

 

 

Considerate ora il seguente programma (variante al precedente).

 

 

#include <iostream>

#include <climits>     

using namespace std;

 

int main()

{

  cout << "Intervallo dei valori rappresentabili con il tipo int" << endl;

  cout << "Type   Minimum    Maximum" << endl

  cout << "int" << INT_MIN << "   " <<  INT_MAX << endl;

  return 0;

}

 

Questo programma contiene un errore di sintassi. Quale?

Provate a compilarlo comunque per vedere quali messaggi invia il compilatore g++.

 

 

Copiate ora il seguente programma in un file prog1.cpp (oppure scaricate direttamente programma prog1.cpp).

 

/*

 Esempio di lettura di un numero da tastiera e scrittura dello stesso (eco) su video  

*/

 

#include <iostream>   

 

using namespace std;       

 /* per le "istruzioni" di lettura e scrittura */

                       

int n;

 /* variabile nella quale memorizziamo il numero da leggere */

 

int main () {

 

        

     cout << "Inserire un numero e poi premere Enter: "  ;

     cin >> n;

     cout << "Hai inserito il numero: " << n << "\n";

                

    

     return (0) ;

}

 

Questo programma, quando eseguito, legge un numero inserito con la tastiera e visualizza un messaggio su video.

Il programma contiene la dichiarazione di una variabile n di tipo intero (int).

Nel corpo del programma (main) inviamo prima su video il messaggio “Inserire… Enter” per indicare all’utente dove inserire il valore.

Quindi usiamo il comando cin per leggere il valore inserito dall’utente (il tasto Enter non ha effetto sul valore associato ad n)
e per memorizzarlo nella variabile n.

Quindi stampiamo il messaggio “Hai inserito …” seguito dal numero in n e da un a capo.

Compilate il programma usando il comando

 

g++ -Wall –pedantic  prog1.cpp –o myprog1

 

Lanciate l’eseguibile con il comando

        

./myprog1

 

Inserite un numero da tastiera e premete Enter (come notifica invio input al programma).


Nota:

Avrete ``quasi sempre’’ in output lo stesso numero inserito.

 

Per capire cosa si intende per ``quasi sempre’’ eseguite nuovamente ./myprog per

recuperare il massimo intero rappresentabile sulla macchina (solitamene 2^31-1).

Rilanciate ./myprog1 inserendo un valore piu grande di tale intero.

 

 

Copiate ora il seguente programma C++ (un esempio del Prof. Costa) in un file
chiamato p3_media.cpp (o scaricate direttamente il file)

/*

   Programma che prende in input (da tastiera)

   un intero  n > 0   ed  n  numeri razionali: a1, a2, ...., an

   e produce in output (su video)

   la somma:  a1+a2+ ... +an  e la media:  (a1+a2+ ... +an) / n

  

   La tastiera  e` la  "sorgente standard"; essendo  standard non

   e` necessario specificarla  nella "istruzione di scrittura"

   l'output e` sulla "destinazione standard" che quindi non viene    

   specificata ........

 

   Supponiamo che l'input venga dato correttamente:

   un intero n > 0  seguito da  n valori razionali

  

*/

 

#include <iostream>

 

using namespace std;

 

int main ( ) {

   

    int n, k ;   /* due variabili di tipo  intero;  notare la virgola  */

    float a, sum;   

       

    cin >> n;

   

     /*  cin >> n;

         equivale all' istruzione di lettura   leggi( <sorgente standard> , n )

         l'equivalente di una lettura multipla, tipo

         leggi( <sorgente standard> , v1, v2, v3 )    e`

        

         cin >> v1 >> v2 >> v3 ;

    */

 

    sum = 0.0 ;

   

    for(k=1 ; k<= n ;  k= k+1) {

            cin >> a;

            sum = sum + a ;

     }

    

    cout <<  "somma = " << sum << "  media = "  << sum/n  << '\n';

   

    /* cout << .........

       equivale a

       scrivi la stringa   somma =    seguito dal valore dell'espressione  sum

       seguito dalla stringa    media =     seguito .....

    */

   

    return(0) ; 

}

 

/*

 

con  INPUT  :    

 

3  2.0  2.25 2.5

 

l'OUTPUT e`:

 

somma = 6.75     media = 2.25  

 

NOTARE  che i numeri in input sono  separati semplicemente

da uno o piu' spazi bianchi

 

*/

 

Questo programma, quando eseguito, legge dal tastiera un numero N che indica quanti numeri ancora leggere
e in successione N numeri x1,…,xN. Quindi calcola la loro media e poi stampa il risultato su video.

Compilate il programma usando il comando

 

g++ -Wall –pedantic  p3_media.cpp –o myprog2

 

 

Per passare l’input al programma potete usare diverse modalità:

 

 

 

E’ possibile salvare in un file ad es. myoutput il risultato altrimenti scritto su video da un programma usando il comando >.
Provate a lanciare ./myprog2 < myinput > myoutput
Usate cat myoutput per vedere il risultato (memorizzato nel file myoutput)

 

Esercizi per casa:
Scaricate gli altri programmi disponibili sul sito del corso (clicca qui).
La descrizione di ogni programma e’ commentata nel codice C++.

Compilate ed eseguite i vari programmi.

 

 

Esercizio 3 Scrittura di nuovi programmi

 

Fate una copia del programma p3_media.cpp dell’esercizio 2 usando il comando

cp p3_media.cpp media_pesata.cpp


 Modificate media_pesata.cpp in modo da poter:

·       Leggete in input un primo numero N e poi N coppie (valore,peso) di numeri (x1,f1),….(xn,fN)
·       Calcolate la media ponderata dei valori x1,..,xn con i relativi pesi f1,..,fn
·       Stampate il risultato su video

Importante:

Nello scrivere il programma seguite state attenti alla sintassi delle istruzioni C.

Il compilatore non interpreta il linguaggio naturale ma solo la sintassi C++ specificata nella documentazione del linguaggio stesso (manuali. guide, ecc).

Potete usare questa guida rapida per la sintassi dei costrutti principali.

 

Salvate (ricordate di farlo dopo aver modificato un file!) il nuovo programma, compilate ed eseguite il programma.

Provate le diverse modalità di input discusse in precedenza.

 

Esercizio 4 Ripetizione di un ciclo “lettura-calcolo-stampa”

 

Copiate media_pesata.cpp in un file ripeti_media_pesata.cpp.

Estendete ora il programma aggiungendo la possibilita’ di ripetere il

calcolo precedente (input di N e delle N  coppie, calcolo della media pesata e output) piu’ volte

(senza dover rieseguire il programma ogni volta).

 

Provate le diverse modalità di input discusse in precedenza.

In particolare provate a ridirezionare l’output su un file myout in modo da memorizzatre i risultati dei vai calcoli.