27 settembre 2007

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

24 settembre 2007

Prima lezione 24 settembre 2007

[70 presenti]

Argomenti:

  • descrizione del corso
  • descrizione dell'esame
  • organizzazione di un programma c++
  • compilazione e linking
  • tipi e variabili
Statistiche sui corsi (non più) propedeutici di Programmazione I e II:


Corso | seguito | esame superato
P1 |70 (100%) |41 (59%)
P2 |(%) |14 (20%)



Dispense:
http://multicommunity.di.uniroma1.it/learning/50_course/1201/dispenseC++indice.pdf
stumenti di base e strutture di controllo


Podcast della lezione:
http://multicommunity.di.uniroma1.it/podcast/panizziC++20070924.wav

Anno accademico 2007-2008

Oggi inizia il corso di quest'anno.
L'orario delle lezioni è:
Lunedì: 14 - 14.45
Giovedì: 16:30-18
in aula 1 di fisica (nuovo edificio, piano terra)

L'esame consisterà in una prova scritta (esonerabile mediante prova nel corso del semestre) e in un progetto da fare in gruppo che sarà discusso all'orale.

Fornirò ulteriori dettagli durante il corso, sia lezione che su questo blog.

TUTTI GLI STUDENTI SONO INVITATI A PORTARE IN AULA IL COMPUTER PORTATILE.

Installare sul PC l'ambiente di sviluppo DevC++ (http://www.bloodshed.net/devcpp.html)


Ecco la descrizione del corso come riportato sul sito www.di.uniroma1.it:

In questo corso viene insegnato il linguaggio di programmazione C++, per permettere di progettare e realizzare software professionali, complessi e modulari. Tutte le caratteristiche dei linguaggi orientati agli oggetti (classi, oggetti, ereditarietà, polimorfismo, etc.) sono spiegate approfonditamente utilizzando il C++ come strumento ed esempio. Durante le lezioni in aula vengono svolti al computer, con il videoproiettore, molti programmi d’esempio ed esercizi. Anche gli studenti sono invitati a portare in aula i loro computer portatili. L’audio delle lezioni viene successivamente reso disponibile online. La verifica dell’acquisizione delle competenze è prevista sullo svolgimento di progetti di gruppo. Corso del II anno, I semestre, 4 CFU, SSD INF/01

Questo post dell'anno scorso contiene l'elenco dei volumi consigliati.

27 giugno 2007

D: client e proxy del progetto in processi indipendenti? R: No.

Riporto qui il testo di una mail di chiarimenti che ho ricevuto da uno studente e la relativa risposta:

Volevo sapere se:

1) le classi devono essere implementate come processi indipendenti e
le comunicazioni avvengono secondo il paradigma clien/server (quindi
comunicazioni tramite messaggi su socket)

oppure

2) gli obj sono istanziati dal main come server "virtuali" e la
comunicazione avviene attraverso la modellazione suggerita dal
progetto.

Il dubbio è nato dal comportamento DNS (che lei ha descritto a lezione
- vedi MP3).
Lei dice che il DNS deve riconoscere, in base all'IP del client, il
server Proxy geograficamente più vicino.
Ma, se il client è una classe virtuale (e non un processo in rete),
l'indirizzo IP deve essere una sua proprietà (eventualmente
modificabile dal file di configurazione(?) ) altrimenti sarebbe sempre
lo stesso.
Cosi facendo un esecuzione del progetto fornirebbe una statistica
(ovvero il comportamento del DNS sulla richiesta di un solo client
rediretto sempre sullo stesso proxy).
Per avere più statistiche dovremmo lanciare più volte il progetto
cambiando ogni volta l'IP virtuale) del client.
Risposta: in questo corso non ci interessa l'uso dei socket, quindi quando parlo di IP nei podcast delle lezioni mi riferisco a un identificatore per l'oggetto. Tutta la simulazione è fatta nell'ambito di un programma C++, e i parametri sono impostabili nel file di configurazione che il programma legge all'inizio.

Tutti i client, server, proxy e dns sono oggetti.