Programmazione Informatica – Informatica per la Comunicazione Digitale 22 febbraio 2016 Matricola: . . . . . . . . . . . . . . . . . . . . . . Cognome: . . . . . . . . . . . . . . . . . . . . . . Nome: . . . . . . . . . . . . . . . . . . . . . . Informatica Comunicazione Digitale FAP 1. Considerate la seguente gerarchia di classi (rappresentata mediante un diagramma UML): A +f(long x): int +f(String x): int +f(booleanO x): int B +f(int x): int +f(String): int O C +f(int x): int +f(double x): int ipotizzando che tutte le classi abbiano un costruttore pubblico senza argomenti. Assumete le seguenti definizioni: A a = new A(); A b = new B(); C c = new C(); A d = new C(); 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( b.f( c.f( d.f( a.equals( b ) ): . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A: f( boolean ) b.equals( c ) ): . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . A: f( boolean ) d.toString() ): . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B: f( String ) 3d ): . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Errore 2. Sia la seguente definizione di variabili: int x = 0, y = 1; 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 = x++ ) >= x && ( y = y++ ) >= y true 0 1 ( x = x++ ) < x & ( y = y++ ) >= y false 0 1 ( x = x++ ) < x || ( y = y++ ) > y false 0 1 ( y = y++ ) >= y && ( x = ++x ) <= x–- true 0 1 1 3. Considerate il seguente frammento di programma: String s = "ciclone", t = ""; for ( int i = 0; i < s.length(); t += s.charAt( i ), i += 2 ); Quale sarà il valore finale della variabile t? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . "ccoe" 4. Considerate il seguente metodo ricorsivo: public static int f( int x, int y ) { return y == 0 ? x : f( y, x % y ); } Quale sarà il valore restituito dall’invocazione f( 17, 5 )? . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 5. Scrivete il metodo statico public static boolean conta( String x, int y ) che restituisce true se nella stringa x esiste un carattere ripetuto almeno y volte, false altrimenti. Ad esempio, l’invocazione conta( "attonito", 2 ) restituirà true in quanto il carattere ’t’ è ripetuto 3 volte nella stringa "attonito" (ed anche perché la ’o’ è ripetuta 2 volte). L’invocazione conta( "attonito", 5 ) restituirà invece false poiché non esistono caratteri in "attonito" ripetuti 5 o più volte. —— Svolgimento qui sotto —— public static boolean conta( String x, int y ) { int k; for ( int i = 0; i < x.length(); i++ ) { k = 0; for ( int j = 0; j < x.length(); j++ ) if ( x.charAt( j ) == x.charAt( i ) ) k++; if ( k >= y ) return true; } return false; } 2 6. ATTENZIONE! Per questo esercizio è richiesta la scrittura completa del codice del programma. Scrivete il programma Cancella che acquisisce A LINEA DI COMANDO un intero n e una parola p. Successivamente, il programma deve: • Leggere dall’utente un brano di n righe (assumete per semplicità che le righe del brano consistano unicamente di parole separate da spazi ). • Stampare il brano “cancellando” le occorrenze della parola p, cioè, rimpiazzando ogni occorrenza di p con una stringa di ’-’ (carattere “meno”) di lunghezza pari a quella di p. Ad esempio, la parola "casa" verrà cancellata rimpiazzandola con la stringa "––––". —— Esempio d’esecuzione —— ← lancio del programma $:> java Cancella 4 ken ← lettura del brano di 4 righe INSERISCI IL BRANO DI 4 RIGHE: il suo nome è ken ken falco non lo batteranno mai quello che fa ken ken falco tu da grande lo farai ← stampa del brano con BRANO OVE HO CANCELLATO LE OCCORRENZE DI ken: le occorrenze di "ken" cancellate il suo nome è ––– ––– falco non lo batteranno mai quello che fa ––– ––– falco tu da grande lo farai —— Svolgimento sul retro —— 3 import java.util.Scanner; import java.util.ArrayList; class Cancella { public static void main( String[] args ) { Scanner in = new Scanner( System.in ); int n = Integer.parseInt( args[ 0 ] ); String p = args[ 1 ], canc = ""; String[] B = new String[ n ], S; // costruisco in canc la stringa di cancellazione for ( int i = 0; i < p.length(); canc += ’-’, i++ ); // leggo il brano System.out.println( "\nINSERISCI IL BRANO DI " + n + " RIGHE:" ); for ( int i = 0; i < n; B[ i++ ] = in.nextLine() ); // stampo il brano ove le occorrenze di p sono state cancellate (rimpiazzate da canc) System.out.println( "\n\nBRANO OVE HO CANCELLATO LE OCCORRENZE DI " + p + ":" ); for ( String x : B ) { S = x.split( " " ); for ( int i = 0; i < S.length; i++ ) { System.out.print( S[ i ].equals( p ) ? canc : S[ i ] ); System.out.print( i < S.length - 1 ? " " : "\n" ); } } } } 4 7. ATTENZIONE! Per questo esercizio è sufficiente scrivere il corpo del main, assumendo a vostro piacimento una variabile in per l’input dei dati da tastiera. È invece necessario l’utilizzo della classe Frazione ampiamente utilizzata nei temi d’esame in linea, documentata in Rete e illustrata al corso. Scrivete un programma che: (a) Acquisisca dall’utente una sequenza di frazioni, ognuna delle quali viene inserita scrivendo su una riga numeratore e denominatore separati da uno spazio. Ad esempio, la frazione 15 6 viene inserita scrivendo la riga "15 6". L’utente può anche inserire una frazione scrivendo su una riga un solo intero, il numeratore; in tal caso si assume che il denominatore sia 1. Ad esempio, scrivendo la riga "7" s’intende inserire la frazione 17 . Il termine dell’acquisizione della sequenza di frazioni è segnalato dall’inserimento della riga nulla. (b) Stampi la somma e la media delle frazioni inserite, seguite dall’elenco delle frazioni che superano la media. —— Esempio d’esecuzione —— ← lettura della sequenza di frazioni INSERISCI LA SEQUENZA DI FRAZIONI: 11 5 7 15 2 -11 15 ← stampa di somma e media SOMMA FRAZIONI: 59/15 MEDIA FRAZIONI: 59/60 ELENCO FRAZIONI CHE SUPERANO LA MEDIA: ← stampa delle frazioni superiori alla media 11/5 2 —— Svolgimento sul retro —— 5 import prog.utili.Frazione; import java.util.Scanner; import java.util.ArrayList; class Fraz { public static void main( String[] args ) { Scanner in = new Scanner( System.in ); int n, d, k = 0; Frazione sm = new Frazione( 0 ); String s; ArrayList<Frazione> F = new ArrayList<Frazione>(); // leggo la sequenza di frazioni System.out.println( "\nINSERISCI LA SEQUENZA DI FRAZIONI:" ); while ( ( s = in.nextLine() ).length() > 0 ) { n = Integer.parseInt( s.split( " " )[ 0 ] ); d = s.split( " " ).length == 1 ? 1 : Integer.parseInt( s.split( " " )[ 1 ] ); F.add( new Frazione( n, d ) ); sm = sm.piu( new Frazione( n, d ) ); k++; } if ( k == 0 ) System.out.println( "NON SONO STATE INSERITE FRAZIONI" ); else { // stampo somma, media e frazioni che superano la media System.out.println( "\n\nSOMMA FRAZIONI: " + sm ); System.out.println( "MEDIA FRAZIONI: " + sm.diviso( new Frazione( k ) ) ); System.out.println( "ELENCO FRAZIONI CHE SUPERANO LA MEDIA:" ); for ( Frazione x : F ) if ( x.isMaggiore( sm.diviso( new Frazione( k ) ) ) ) System.out.println( x ); } } } 6