Esercitazioni del 17/1/14

Transcript

Esercitazioni del 17/1/14
Preparazione allo Scritto di Programmazione
Informatica / Comunicazione Digitale – A.A. 2013/2014
1. Una riga di testo è detta numerica se e solo se contiene più cifre che caratteri di altro genere.
Ad esempio, le righe di testo
2 May 2012
3 Jan 1999
333333 trentini 333333 a 333333 Tre5nto 44
sono numeriche, mentre le righe
2 maggio 2012
3 gennaio 1999
33 trentini a Trento 44
non lo sono.
————————————
(a) Scrivete il metodo statico
public static boolean isNumerica( String s )
che restituisce true se e solo se s è una riga di testo numerica.
• Suggerimento. Utili per analizzare i caratteri di s potrebbero essere i metodi statici della
classe Character.
————————————
(b) Usate il metodo statico al punto (a) nella scrittura di un programma che realizzi quanto
segue (per tale programma, è sufficiente il corpo del main; supponete inoltre di avere già due
variabili in e out per realizzare, rispettivamente, input e output):
(1) acquisisca dall’utente un brano il cui inserimento viene terminato dalla stringa nulla,
(2) salvi in un array N di tipo e dimensione opportuni le righe del brano che sono numeriche;
se il brano non contiene righe numeriche, il programma deve interrompersi emettendo
un opportuno messaggio,
(3) stampi le righe in N ordinate alfabeticamente.
• Suggerimento. Per il punto (1), utile per memorizzare il brano potrebbe essere la classe
generica Sequenza. Per quanto riguarda il punto (3), ricordate che la classe String implementa l’interfaccia Comparable proprio nel senso desiderato, e che la classe GestioneArray
offre il metodo statico ordina che ordina array di Comparable passati come argomento.
——— Svolgimento alla pagina successiva ———
1
(a) Metodo statico
public static boolean isNumerica( String s ) {
int d = 0;
for ( int i = 0; i < s.length(); i++ ) {
if ( Character.isDigit( s.charAt( i ) ) )
d++;
return d > s.length()/2;
}
(b) Programma principale
Vector<String> B = new Vector<String>();
String s;
int k;
out.println("Inserisci il brano:");
while ( ( s = in.readLine() ).length() > 0 ) {
B.add( s );
if ( isNumerica( s ) )
k++;
}
if ( k == 0 )
out.println( "Non sono state inserite stringhe numeriche" );
else {
String[] N = new String[ k ];
k = 0;
for ( String x : B )
if ( isNumerica( x ) )
N[ k++ ] = x;
GestrioneArray.ordina( N );
for ( String x : N )
out.println( x );
}
2
2. Attenzione!! Per questo esercizio è richiesta la scrittura completa del codice del programma.
Scrivete il programma FigurePiane che faccia utilizzo della gerarchia di figure geometriche
Figura, Rettangolo, Quadrato, Cerchio ampiamente descritta a lezione, sul libro di
testo ed utilizzata in numerosi esercizi.
Tale programma deve leggere dall’utente m figure tra rettangoli, quadrati e cerchi, dove m
viene acquisito A LINEA DI COMANDO.
Successivamente, il programma deve stampare:
• i rettangoli che possono essere inscritti nel primo cerchio inserito,
• i quadrati la cui area è pari a quella del primo cerchio inserito
Attenzione! Prima di stampare tali elenchi e nel caso non siano stati inseriti cerchi, il
programma deve avvisare opportunamente ed interrompersi.
——— Svolgimento ———
import prog.io.*;
import prog.utili.*;
class FigurePiane {
public static void main( String[] args ) {
ConsoleInputManager in = new ConsoleInputManager();
ConsoleOutputManager out = new ConsoleOutputManager();
int m = Integer.parseInt( args[0] );
Figura[] F = new Figura[m]; char r; Cerchio pr = null;
for ( int i = 0; i < m; i++ ) {
do {
r = in.readChar( "Rettangolo (r), Quadrato (q), Cerchio (c):" );
} while ( r != ’r’ && r != ’q’ && r != ’c’ );
switch ( r ) {
case ’r’: F[i] = new Rettangolo(in.readDouble("Base:"), in.readDouble("Altezza:"));
break;
case ’q’: F[i] = new Quadrato(in.readDouble("Lato:")); break;
case ’c’: F[i] = new Cerchio(in.readDouble("Raggio:"));
if ( pr == null ) pr = (Cerchio) F[i];
break;
}
}
if ( pr != null ) {
for ( int i = 0; i < m; i++ )
if ( F[i] instanceof Rettangolo ) {
Rettangolo t = (Rettangolo) F[i];
double d = Math.sqrt(t.getBase()*t.getBase() + t.getAltezza()*t.getAltezza());
if ( d == 2*pr.getRaggio() ) out.println( t );
}
for ( int i = 0; i < m; i++ )
if ( F[i] instanceof Quadrato && F[i].getArea() == pr.getArea() )
out.println( F[i] );
}
else
out.println( "Non sono stati inseriti cerchi" );
}
}
3
3. Realizzate una gerarchia di classi per la rappresentazione di mobili. Tale gerarchia è costituita
da una classe astratta Mobile e da due classi concrete Guardaroba e Scaffale, figlie di
Mobile.
classi concrete ⇒ • Gli oggetti della classe concreta Guadaroba sono denotati da un codice, un nome,
un numero di ante e da un prezzo per anta; i primi due parametri sono di tipo
String, mentre gli altri due di tipo int. Oltre al costruttore, tale classe deve possedere i metodi getCodice(), getNome(), getNumeroAnte(), getPrezzoPerAnta(),
toString() dall’ovvio significato. In aggiunta, dovete implementare il metodo
getPrezzoTotale()
che restituisce il prezzo totale del guadaroba ottenuto moltiplicando il prezzo per anta
per il numero di ante.
• Gli oggetti della classe concreta Scaffale sono denotati da un codice, un colore,
un numero di scaffali e un prezzo per scaffale; i primi due parametri sono di
tipo String, mentre gli altri due di tipo int. Oltre al costruttore, tale classe deve possedere i metodi getCodice(), getColore(), getNumeroScaffali() ed i metodi getPrezzoPerScaffale(), toString() dall’ovvio significato. In aggiunta, dovete
implementare il metodo
getPrezzoTotale()
che restituisce il prezzo totale dello scaffale ottenuto moltiplicando il prezzo per scaffale
per il numero di scaffali aumentato di due.
classe astratta ⇒ • La classe astratta Mobile deve avere il metodo astratto getPrezzoTotale() ed il metodo concreto haPrezzoTotaleMaggioreDi(Mobile m) che restituisce true se il mobile
che invoca il metodo ha prezzo totale superiore a quello del mobile m, false altrimenti.
——— Svolgimento alla pagina successiva ———
4
class Guardaroba {
private String codice, nome;
private int nante, pante;
public Guardaroba( String c, String n, int na, int pa ) {
codice = c; nome = n; nante = na; pante = pa;
}
public String getCodice() { return codice; }
// in modo analogo si realizzano gli altri metodi get
public String toString() { return codice+" "nome+" "+nante+" "+pante; }
public int getPrezzoTotale() {
return nante * pante;
}
}
class Scaffale {
private String codice, colore;
private int nscaff, pscaff;
public Scaffale( String c, String n, int na, int pa ) {
codice = c; colore = n; nante = na; pante = pa;
}
public String getCodice() { return codice; }
// in modo analogo si realizzano gli altri metodi get
public String toString() { return codice+" "colore+" "+nscaff+" "+pscaff; }
public int getPrezzoTotale() {
return ( nscaff + 2 ) * pscaff;
}
}
abstract class Mobile {
public abstract int getPrezzoTotale();
public boolean haPrezzoTotaleMaggioreDi( Mobile m ) {
return getPrezzoTotale() > m.getPrezzoTotale() ;
}
}
5
4. Sfruttando la gerarchia all’esercizio precedente, scrivete un programma (è sufficiente il corpo
del main) che operi come segue:
• legga un intero positivo che rappresenta la dimensione di un array M entro cui inserire
mobili,
• riempia tale array con guardaroba o scaffali chiesti all’utente,
• tra tutti gli scaffali rossi, stampi quelli dal prezzo totale più elevato.
——— Svolgimento ———
Mobile[] M = new Mobile[in.readInt("Quanti: ")];
int t, annoMin = -1;
String a, b, c, d;
for ( int i = 0; i < M.length; i++ ) {
a = in.readLine( "Codice:" );
if ( in.readSiNo( "Guardaroba? (s/n) " ) )
M[i] = new Guardaroba( a, in.readLine("Nome:"),
in.readInt("Num. ante:"), in.readInt("Pr. anta:") );
else
M[i] = new Scaffale( a, in.readLine("Colore:"),
in.readInt("Num. scaffali:"), in.readInt("Pr. scaffale:") );
}
int pos = -1;
for ( int i = 0; i < M.length; i++ )
if (M[i] instanceof Scaffale && (pos == -1 || M[i].haPrezzoTotaleMaggioreDi(M[pos])))
pos = i;
if ( pos == -1 )
out.println( "Non sono stati inseriti scaffali" );
else
out.println( M[pos] );
6