Preparazione allo Scritto di Programmazione Informatica / Comunicazione Digitale A.A. 2014/2015 Matricola:...................... Cognome:...................... Nome:...................... Informatica Comunicazione Digitale FAP 1. Considerate la seguente gerarchia di classi (rappresentata mediante un diagramma UML): A +f(double x): +f(string x): C +f(long x): +f( x): B +f(double x): +f( x): D +f(string x): +f( x): e ipotizzate che tutte le classi abbiano un costruttore pubblico senza argomenti. Assumete le seguenti definizioni e inizializzazioni: A a = new D(); C b = new D(); C c = new C(); D d = new D(); Per ciascuna delle seguenti invocazioni di metodo, dire se essa è consentita e in caso affermativo indicare il nome della classe che contiene il metodo che verrà effettivamente eseguito: a.f( ciao ):....................................................... D: f(string) c.f( ciao ):....................................................... A: f(string) b.f( 4 ):................................................................. D: f() d.f( 3d ):........................................................... A: f(double) a.f( 3 ):.............................................................A: f(double) 2. Considerate il seguente frammento di programma: k = 0; for ( h = 0; h < 3; h++ ) for ( i = 0; i < 3; i++ ) for ( j = 0; j < 3; j++ ) k = k + i*j; Quale sarà il valore di k dopo la sua esecuzione? k:.................. 27 1
3. Sia la seguente definizione di variabili: x = 2; y = 3; Dite quale sarà il contenuto di x e y dopo l esecuzione degli assegnamenti indicati: Assegnamento x y x = y++ + ++x + y++ 10 5 y = y++ + ( x *= y ) 8 11 y += ( -y >= x? ++x : x++ ) 3 6 x = y = x = y 3 3 4. Sia la seguente definizione di variabili: y = 2; x = ++y; Dite quale sarà il valore di verità delle seguenti espressioni booleane e quale sarà il contenuto delle variabili x e y dopo la valutazione delle espressioni indicate: Espressione Verità x y ( x >= ( y = x ) ) & ( x - == ++x ) true 3 3 ( ( y + x ) > ( y = ++x ) ) &&!( ++x >= y++ ) false 5 5 ( ( y + x ) > ( y = ++x ) ) ( ++x >= y++ ) true 4 4 ( ( y + x ) >= ( y = ++x ) )!( ++x >= y++ ) true 5 5 2
5. Scrivete un programma (basta il corpo del main; assumete inoltre le due variabili in e out) che: legga dall utente una sequenza A di numeri reali. Attenzione! I numeri possono solamente essere positivi. L inserimento dei numeri termina quando l utente inserisce 0, legga dall utente una sequenza B di figure geometriche, ognuna delle quali può essere un cerchio, un quadrato, oppure un rettangolo. Scegliete a vostro piacimento il modo in cui l utente segnala la terminazione dell inserimento delle figure. Successivamente, il programma deve stampare: i cerchi la cui area compare nella sequenza A, i rettangoli (non quadrati) la cui base supera la media dei numeri nella sequenza A, i quadrati (non rettangoli) la cui diagonale supera il massimo nella sequenza A. Attenzione: nel caso in cui anche solo una delle sequenze fosse vuota, il programma deve errompersi emettendo un opportuno messaggio. - Svolgimento alla pagina seguente - 3
ArrayList<Double> A = new ArrayList<Double>(); double d, max = -1, s; d = in.readdouble(); if ( d > 0 ) { if ( d > max ) max = d; s += d; A.add( d ); while ( d!= 0 ); ArrayList<Figura> B = new ArrayList<Figura>(); char c; c = in.readchar( "Rettangolo (r), Quadrato (q), Cerchio (c), Esci (x): " ); while ( c!= r && c!= q && c!= c && c!= x ), switch ( c ) { case r : B.add( new Rettangolo( in.readdouble("base: "), in.readdouble("altezza: ") ) ); case q : B.add( new Quadrato( in.readdouble("lato: ") ); case c : B.add( new Cerchio( in.readdouble("raggio: ") ); while ( c!= x ); if ( A.size() > 0 && B.size() > 0 ) { if ( f instanceof Cerchio ) for ( double x : A ) if ( f.getarea() == x ) { out.prln( f ); if ( f instanceof Rettangolo &&!( f instanceof Quadrato ) ) if ( ((Rettangolo) f).getbase() > s / A.size() ) out.prln( f ); if ( f instanceof Quadrato ) if ( Math.sqrt( 2 * ((Quadrato) f).getlato() * ((Quadrato) f).getlato() ) > max ) out.prln( f ); else System.out.prln( "Le sequenze non sono entrambe piene" ); 4
6. L ampiezza di una stringa s è la massima lunghezza di un segmento iniziale di s il cui reverse è anche un segmento finale; da sottolineare che i segmenti iniziali e finali non devono sovrapporsi e vanno considerati a prescindere da maiuscolo/minuscolo. Ad esempio: abbbba1234abbbba ha ampiezza 6 (che è la lunghezza del segmento abbbba), abbbba12 34AbbBBa ha ampiezza 6 (per le stesse ragioni di prima e per il fatto che maiuscolo/minuscolo non conta), abcdef hghg a ha ampiezza 1, abbbbbbbbbbbc ha ampiezza 0, aaaaaaaaa ha ampiezza 4. Scrivete il metodo statico ampiezza che restituisce l ampiezza di una stringa passata come argomento. Utilizzate tale metodo nella scrittura di un programma (basta il corpo del main; assumete inoltre le due variabili in e out) che: acquisisca dall utente un brano riga per riga, assumendo come fine inserimento brano l acquisizione della stringa nulla, successivamente, stampi LE (notate il plurale!) righe del brano aventi l ampiezza più grande. - Svolgimento - // metodo statico ampiezza public static ampiezza( String t ) { String s = t.touppercase() a = 0; while ( a < s.length() / 2 && s.charat( a ) == s.charat( s.length() - a++ - 1 ) ) ; return a; // main ArrayList<String> B = new ArrayList<String>(); String s; maxamp = -1; while ( ( s = in.nextline() ).length() > 0 ) { if ( ampiezza( s ) > maxamp ) maxamp = ampiezza( s ); B.add(s); if ( B.size() > 0 ) for ( String x : B ) if ( ampiezza( x ) == maxamp ) System.out.prln( x ); else System.out.prln( Nessun brano inserito" ); 5