27 settembre 2007

Strumenti di base del C++

Lezione di giovedì 27 settembre 2007 - 2h
[65 presenti]

Argomenti:

  • tipi/variabili
  • indirizzi/valori
  • compile-time/ runtime
  • overloading operatori
  • conversioni / cast
  • valutazione espressioni
  • array
  • if-else
  • while
  • for
  • puntatori


Dispense:
stumenti di base e strutture di controllo


Podcast della lezione:
http://multicommunity.di.uniroma1.it/podcast/panizziC++20070927.mp3

Seconda parte esonero dell'anno scorso

Università di Roma La Sapienza - Corso di Programmazione a oggetti

A.A. 2006/2007 - Docente: Emanuele Panizzi

Prova del 10 novembre 2006

SECONDA PARTE: BONUS

Svolgere il seguente programma in C++. Tempo a disposizione: 40 minuti.

E’ POSSIBILE CONSULTARE LIBRI ETC., UTILIZZARE IL COMPUTER PER COMPILARE E PROVARE IL PROGRAMMA, SVOLGERE IL PROGRAMMA CON ALTRE PERSONE

NOME: COGNOME: MATRICOLA:

NOME: COGNOME: MATRICOLA:

NOME: COGNOME: MATRICOLA:

NOME: COGNOME: MATRICOLA:

NOME: COGNOME: MATRICOLA:

NOME: COGNOME: MATRICOLA:

NOME: COGNOME: MATRICOLA:

NOME: COGNOME: MATRICOLA:

NOME: COGNOME: MATRICOLA:

NOME: COGNOME: MATRICOLA:

NOME: COGNOME: MATRICOLA:

Si scriva un programma C++ che:

a) legga dieci valori int da tastiera e li memorizzi in un array v. I valori saranno forniti in ordine crescente.

b) Allochi un array w di dimensione n pari al numero di elementi differenti di v, e vi copi tali elementi.

c) Sostituisca ad ogni elemento w[i] la somma degli elementi w[i]+...+w[n-1] (MEDIANTE FUNZIONE RICORSIVA)

d) Chiami, per ogni w[i], la funzione int Sum(int* p) che sommi il valore w[i] ad un accumulatore interno e restituisca il totale t accumulato (DEFINIRE LA FUNZIONE Sum())

e) Stampi v, w e t.

Ogni punto deve essere svolto realizzando almeno una funzione separata, chiamata dal main.

v, w e t devono essere dichiarate nel main.

Esonero dell'anno scorso

Università di Roma La Sapienza - Corso di Programmazione a oggetti

A.A. 2006/2007 - Docente: Emanuele Panizzi

Prova del 10 novembre 2006

PRIMA PARTE: ESONERO

Rispondere alle domande seguenti barrando la risposta. Un punto per ogni risposta corretta. 0 punti per risposte sbagliate o non date.

Tempo a disposizione: 40 minuti.

E’ PROIBITO CONSULTARE LIBRI O ALTRO MATERIALE

E’ PROIBITO COMUNICARE CON ALTRE PERSONE PRESENTI O A DISTANZA

NOME: COGNOME: MATRICOLA:

(ripetere la matricola su tutti i fogli)

1

float v[10];

v[10] = v[0];

a) corretto

b) errore di compilazione

c) possibile errore runtime

2

int x = 10;

int& y = x;

a) b) c)

3

int cubo(int x);

a) x per valore, ritorno per valore

b) x per riferimento, ritorno per valore

c) x per valore, ritorno per riferimento

d) x per riferimento, ritorno per riferimento

4

Per cambiare il segno di una variabile int mediante una funzione la cui chiamata nel main è la seguente:

CambioSegno(i);

l’intestazione della funzione deve essere:

a) void CambioSegno(int x);

b) void CambioSegno(int& x);

c) int CambioSegno(int* px);

5

Il parametro attuale a in:

main()

{ int a;

f(a);

}

è passato:

a) per valore

b) per riferimento

c) non si può stabilire senza guardare la dichiarazione della funzione

6

void f(int val, int& rif)

{ val++;

rif++;

}

main()

{ int i = 1;

int j = 1;

f(i,j);

cout << style=""> “ <<>

}

La cout stamperà:

a) 1 1

b) 1 2

c) 2 1

d) 2 2

7

void f(int& x, int& y)

{ int t = x;

x = y;

y = t;

t = x;

}

main()

{ int a = 10;

int b = 20;

f(a,b);

cout <<> “ <<>

}

a) 10 20

b) 20 10

c) 10 10

d) 20 20

8

void f(int* v)

{ // ...

}

main()

{ int v[1000];

f(v);

}

a) passaggio per valore dell’array v

b) pass. Per valore del puntatore alla prima locazione dell’array

c) pass. Per riferimento dell’array

d) pass per riferimento del punt alla prima locazione

9

int f()

{}

a) corretta in C++

b) errore: non restituisce nessun valore

c) errore: il corpo di una funzione non può essere mai vuoto

10

int* f()

{ int l;

// ...

return &l;

}

a) corretta

b) l’indirizzo restituito al chiamante non esiste più: errore a runtime

c) il contenuto della locazione puntata può essere cambiato

11

void f(int*& p)

{ p++;

}

a) corretta, modifica il parametro attuale

b) corretta, incrementa l’oggetto puntato dal parametro attuale

c) errata

12

int v[5] = {5,10,15,20,25};

int* p = &v[2];

cout << *(p+2) <<>

a) stampa 15

b) stampa 25

c) stampa 20

d) errata

13

int v[5] = {5,10,15,20,25};

int* p = &v[2];

*(p+2) = p[2] + 3;

Il vettore v cambia in:

a) 5,10,15,23,25

b) 5,10,18,20,25

c) Errata

d) 5,10,15,20,28

14

delete p;

a) dichiara libera la locazione di memoria puntata da p

b) cancella il contenuto della locazione puntata da p

c) cancella il contenuto del puntatore p

15

int* p = new int[100];

//...

Quale è corretta:

a) delete p;

b) delete [] p;

c) delete *p;

d) delete p[100];

16

int* v = new int[100];

Data questa dichiarazione si può affermare che v[0] e *v:

a) sono equivalenti

b) indicano rispettivamente un int e un puntatore

c) sono equivalenti, ma la seconda è sconsigliabile

d) solo la seconda è corretta

17

void Alloca(...p)

{ p = new int[100]; }

I puntini di sospensione vanno sostituiti con:

a) int*

b) int&

c) int*&

d) nessuna delle precedenti

18

int n;

cin >> n;

int* v = new int[n];

a) corretta

b) errore di compilazione: non si può usare una variabile nella new

c) errore runtime: il compilatore non ha potuto allocare v non conoscendo il valore di n

19

int n;

cin >> n;

int v[n];

a) errore, le dichiarazioni di variabile devono precedere tutte le istruzioni

b) errore di compilazione: il compilatore non può allocare v non conoscendone la dimensione

c) corretta

20

for (i = 0; i <>

{ int j = 0;

j = j + 1;

}

cout <<>

a) stampa 0,1,3,6,10

b) stampa 0,1,2,3,4

c) errore: ridichiarazione di variabile

21

void f()

{ cout <<>

main()

{ int i = 100;

f();

}

a) stampa 100

b) stampa 0 perché la i dentro f() è diversa da quella del main

c) errore: i non è visibile in f()

22

void f(int i)

{ cout <<>

main()

{ int i = 10, j = 20;

f(j);

}

a) stampa 10

b) stampa 20

c) errore: ridichiarazione di variabile

23

int a = 0;

void f()

{ cout <<>

a = 20;

}

main()

{ a = 100;

f();

int a = 30;

}

a) stampa 100

b) stampa 0

c) stampa 20

d) stampa 30


24

main()

{ int i = 5, j;

if (i <>

{ int k;

k = i * 2;

y = k / 3;

}

cout <<>

cout <<>

}

a) 3 10

b) 3.333333 10

c) 3 0

d) Compile error, k ha terminato il suo ciclo di vita

25

Visibilità e ciclo di vita di una variabile:

a) sono sinonimi

b) sono due concetti distinti

c) si riferiscono rispettivamente alle variabili locali e globali

26

int fatt(int n)

{ return n * fatt(n – 1); }

a) corretto, calcola il fattoriale ricorsivamente

b) errato: non c’è il passo base della ricorsione

c) errore di compilazione: la fatt() non è ancora definita quando viene usata

27

Un campo privato di un oggetto:

a) può essere acceduto solo dalle funzioni proprie dell’oggetto

b) può essere acceduto solo dalle funzioni proprie della classe

c) può essere acceduto solo dagli oggetti pubblici autorizzati

28

class Coppia

{ // ...

int Primo();

}

La Primo():

a) non ha argomenti

b) ha un argomento, l’oggetto di invocazione

c) ha due argomenti di cui uno implicito


29

class Coppia

{ // ...

int Primo();

}

La Primo():

a) può modificare l’oggetto di invocazione

b) non può modificare l’oggetto di invocazione

c) non è dichiarata correttamente

30

Un metodo (funzione propria di una classe) può accedere:

a) i campi privati di qualsiasi oggetto della sua classe

b) i campi privati di qualsiasi oggetto di qualsiasi classe

c) i campi privati del solo oggetto di invocazione