Programmazione I 11 gennaio 2012 Matricola:........................................................................ Cognome:........................................................................ Nome:........................................................................... 1. Considerate la seguente gerarchia di classi (rappresentata mediante un diagramma UML): A B +f(double x): +f(string x): +f(double x): +f(char x): C +f(double x): +f(string x): D +f(char x): +f( x): e ipotizzate che tutte le classi abbiano un costruttore pubblico senza argomenti e il solo metodo f(...). Assumete le seguenti definizioni e inizializzazioni: A a = new B(); A b = new C(); A 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: d.tostring(): Object: tostring() a.f( 3 + 3 ): b.f( 3 + "3.0" ): b.f( 3 + 3.0 ): B: f(double) ERRORE C: f(double) 1
2. Sia la seguente definizione di variabili: x = 1; y = 2; Dite quale sarà il contenuto di x e y dopo l esecuzione degli assegnamenti indicati: Assegnamento x y y = ( x *= y ) + ( ( x < y )? ++x : y++ ) 2 4 x = ( java.charat( - -y ) == java.charat( y = y + 2*x ) )? ++x : ( x += y ) 2 3 3. Sia la seguente definizione di variabili: x = 1; y = 2; boolean b = ( x >= ( 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 Valore di verità x y x < y ( b & ( x++ > y++ ) ) false 3 3 ( x >= y && b ) x++ == y++ true 3 3 ( x >= y & b ) x++ == y++ true 3 3 4. Considerate il seguente frammento di programma: String s = aababbb ; t = s.length(), x, k; x = k = 0; while ( x < t/2 ) if ( s.charat( x ) == s.charat( t - 1 - x++ ) ) k++; Quale sarà il valore di k dopo la sua esecuzione? k: 1 2
5. Una stringa è detta corretta se e solo se: è formata unicamente da lettere, il numero delle lettere maiuscole supera quello delle lettere minuscole. Ad esempio, le stringhe, ALAbb, AGHTR sono corrette mentre 1ABAna, abaa non lo sono; la stringa nulla è corretta. (a) Scrivete il metodo statico public static boolean corretta( String s ) che restituisce true se e solo se s è corretta. (b) Usate tale metodo nella scrittura di un programma (è sufficiente il corpo del main) che: acquisisca dall utente un brano il cui inserimento viene terminato dalla stringa nulla, visualizzi successivamente le righe del brano che sono stringhe corrette, stampando dopo ognuna di esse il numero delle lettere maiuscole che la compongono. [Suggerimento: utile per memorizzare il brano potrebbe essere la classe generica Sequenza del package prog.utili; ricordiamo che per aggiungere oggetti ad una sequenza si utilizza il metodo add, mentre per scorrere la sequenza si utilizza il costrutto foreach.] public s t a t i c boolean c o r r e t t a ( S t r i n g s ) { M = m = 0 ; for ( i = 0 ; i < s. l e n g t h ( ) ; i++ ) { i f ( Character. isuppercase ( s. charat ( i ) ) ) M++; i f ( Character. islowercase ( s. charat ( i ) ) ) m++; return M + m == s. l e n g t h ( ) && M > m; Nella stesura della classe contenente il metodo statico ed il corpo del main qui sotto va specificata la direttiva di importazione import prog.utili.sequenza al fine di poter utilizzare la classe generica Sequenza Sequenza<String > B = new Sequenza<String >(); S t r i n g s ; k ; out. p r i n t l n ( " Inserisci il brano:" ) ; while ( ( s = i n. readline ( ) ). l e n g t h ( ) > 0 ) B. add ( s ) ; for ( S t r i n g x : B ) i f ( c o r r e t t a ( x ) ) { k = 0 ; for ( i = 0 ; i < x. l e n g t h ( ) ; i++ ) i f ( Character. isuppercase ( x. charat ( i ) ) k++; out. p r i n t l n ( x+" contenente "+k+" lettere maiuscole " ) ; 3
6. Attenzione!! Per questo esercizio è richiesta la scrittura completa del codice del programma. Scrivete il programma CercaFrazione che legga dall utente un insieme B di m frazioni o rettangoli e un insieme S di n eri, dove m ed n vengono acquisiti A LINEA DI COMANDO. Se m ed n non sono entrambi positivi, il programma deve arrestarsi immediatamente emettendo un opportuno messaggio d errore. Successivamente, il programma deve stampare: le frazioni in B minori di ogni ero in S e i rettangoli in B la cui area supera ogni ero in S. import prog. i o. ; class CercaFrazione { public s t a t i c void main ( S t r i n g [ ] a r g s ) { m = I n t e g e r. p a r s e I n t ( a r g s [ 0 ] ) ; n = I n t e g e r. p a r s e I n t ( a r g s [ 1 ] ) ; i f ( m <= 0 n <= 0 ) out. p r i n t l n ( " Parametri errati" ) ; { ConsoleInputManager i n = new ConsoleInputManager ( ) ; ConsoleOutputManager i n = new ConsoleOutputManager ( ) ; Object [ ] B = new Object [m] ; [ ] S = new [ n ] ; char r ; for ( i = 0 ; i < m; i++ ) { do { r = i n. readchar ( " Frazione (f) o Rettangolo (r):" ) ; while ( r!= f && r!= r ) ; i f ( r == f ) B[ i ] = new Frazione ( i n. r e a d I n t ( "Num:" ), i n. r e a d I n t ( "Den:" ) ) ; B[ i ] = new Rettangolo ( i n. readdouble ( "Base:" ), i n. readdouble ( " Altezza :" ) ) ; posmin = posmax = 1; for ( i = 0 ; i < n ; i++ ) { S [ i ] = i n. r e a d I n t ( ) ; i f ( posmin == 1 S [ i ] < S [ posmin ] ) posmin = i ; i f ( posmax == 1 S [ i ] > S [ posmax ] ) posmax = i ; for ( i = 0 ; i < m; i++ ) i f ( B[ i ] i n s t a n c e o f Frazione ) { Frazione f = ( Frazione ) B[ i ] ; i f ( f. isminore ( new Frazione ( S [ posmin ] ) ) out. p r i n t l n ( f ) ; for ( i = 0 ; i < m; i++ ) i f ( B[ i ] i n s t a n c e o f Rettangolo ) { Rettangolo t = ( Rettangolo ) B[ i ] ; i f ( t. getarea ( ) > S [ posmax ] ) out. p r i n t l n ( t ) ; 4
7. Definite la classe Cittadino i cui oggetti rappresentano cittadini. Ogni cittadino è caratterizzato da nome, cognome, cittadinanza, codice fiscale, parametri di tipo String. La classe deve avere: l ovvio costruttore con 4 argomenti; un costruttore con 3 argomenti in cui si assume che la cittadinanza sia Italia (la cittadinanza viene espressa tramite lo stato di appartenenza); i metodi getnome, getcognome, getcitt, getcf dall ovvio significato; il metodo setcitt che assegna all oggetto che lo invoca la cittadidanza passata come argomento (attenzione al prototipo di questo metodo!); i metodi tostring e equals dall ovvio significato (attenzione alla costruzione del metodo equals!). La classe Cittadino va inoltre estesa da una classe Diplomatico i cui oggetti rappresentano appartenenti a corpi diplomatici. Oltre ai parametri che caratterizzano un cittadino, un diplomatico deve possedere l anno (tipo ) in cui ha preso servizio presso il corpo di appartenenza. La classe Diplomatico, oltre ovviamente al costruttore, deve anche avere: i metodi tostring, equals, getanno dall ovvio significato; un metodo public boolean piuvecchio( Diplomatico d ) che restituisce true se la presa di servizio del diplomatico che invoca il metodo è anteriore a quella del diplomatico passato come argomento, false altrimenti. class C i t t a d i n o { private S t r i n g nome, cognome, c i t t, c f ; public C i t t a d i n o ( S t r i n g n, S t r i n g c, S t r i n g ct, S t r i n g cd ) { nome = n ; cognome = c ; c i t t = c t ; c f = cd ; public C i t t a d i n o ( S t r i n g n, S t r i n g c, S t r i n g cd ) { this ( n, c, "Italia", cd ) ; public S t r i n g getnome ( ) { return nome ; // in modo analogo s i r e a l i z z a n o g l i a l t r i metodi g e t public void s e t C i t t ( S t r i n g ct ) { c i t t = c t ; public S t r i n g t o S t r i n g ( ) { return nome+" "+cognome+" "+c i t t+" "+c f ; public boolean e q u a l s ( Object o ) { i f ( o instanceof C i t t a i n o ) { C i t t a d i n o c = ( C i t t a d i n o ) o ; return nome. e q u a l s ( c. nome) && cognome. e q u a l s ( c. cognome ) && c i t t. e q u a l s ( c. c i t t ) && cd. e q u a l s ( c. cd ) ; return f a l s e ; La specifica della classe Diplomatico è alla pagina seguente 5
class Diplomatico extends C i t t a d i n o { private anno ; public Diplomatico ( S t r i n g n, S t r i n g c, S t r i n g ct, S t r i n g cd, a ) { super ( n, c, ct, cd ) ; anno = a ; public S t r i n g t o S t r i n g ( ) { return super. t o S t r i n g ()+" "+anno ; public boolean e q u a l s ( Object o ) { i f ( o instanceof Diplomatico ) { Diplomatico d = ( Diplomatico ) o ; return super. e q u a l s ( d ) && anno == d. anno ; return f a l s e ; 6
8. Sfruttando la gerarchia all esercizio precedente, scrivete un programma (è sufficiente il corpo del main) che operi come segue: legga un ero positivo che rappresenta la dimensione di un array A entro cui inserire cittadini; riempia tale array con cittadini o diplomatici chiesti all utente; stampi il diplomatico con la più vecchia presa di servizio (se non sono stati inseriti diplomatici, il programma deve dare opportuna comunicazione); stampi il numero di cittadini non diplomatici la cui cittadinanza è identica a quella del primo elemento inserito in A. C i t t a d i n o [ ] A = new C i t t a d i n o [ i n. r e a d I n t ( "Quanti: " ) ] ; t, annomin = 1; S t r i n g a, b, c, d ; for ( i = 0 ; i < A. l e n g t h ; i++ ) { a = i n. readline ( "Nome: " ) ; b = i n. readline ( " Cognome : " ) ; c = i n. readline ( " Cittadinanza : " ) ; d = i n. readline ( "Codice Fiscale : " ) ; i f ( i n. readsino ( " Diplomatico (s/n)? " ) ) { t = i n. r e a d I n t ( "Anno:" ) ; i f ( annomin == 1 t < annomin ) annomin = t ; A[ i ] = new Diplomatico ( a, b, c, d, t ) ; A[ i ] = new C i t t a d i n o ( a, b, c, d ) ; i f ( annomin == 1 ) out. p r i n t l n ( "Non sono stati inseriti diplomatici " ) ; for ( i = 0 ; i < A. l e n g t h ; i++ ) i f ( A[ i ] instanceof Diplomatico && ( ( Diplomatico ) A[ i ] ). getanno ( ) == annomin ) out. p r i n t l n ( A[ i ] ) ; t = 0 ; for ( i = 0 ; i < A. l e n g t h ; i++ ) i f (! (A[ i ] instanceof Diplomatico ) && A[ i ]. g e t C i t t ( ) == A [ 1 ]. g e t C i t t ( ) ) t++; out. p r i n t l n ( t ) ; 7