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