Alberi
Date le classi TreeNode, con cui costruire i singoli nodi di un albero binario, e Main per il programma principale, entrambe disponibili nel codice allegato TreeMain.java:
class TreeNode {
int item; // informazione del nodo
TreeNode left; // figlio sinistro
TreeNode right; // figlio destro
public TreeNode(int i) { item = i; } // mancano link
public void setLeft (TreeNode n) { if (left==null) left=n; }
public void setRight (TreeNode n) { if (right==null) right=n; }
public void myInsert(TreeNode n) {
TreeNode n1; int l=0, r=0;
if (left==null) { this.setLeft(n); return; }
if (right==null) {this.setRight(n); return;}
left.myInsert(n);
}
public void preOrder() {
System.out.println(item);
if (left!=null) left.preOrder();
if (right!=null) right.preOrder();
}
}
public class TreeMain {
public static void main(String[] args) {
int i=0, x;
TreeNode root = new TreeNode(i);
while (i<10){
i=i+1; x=(int) (Math.random()*10);
root.myInsert(new TreeNode(x));
}System.out.println("Contenuto dell'albero: ");
System.out.println("ad esempio, con visita in preordine\n");
root.preOrder();
//System.out.println("L'elemento 1 è contenuto " + root.quanteVolte(1) + " volte");
}
}
Aggiungere alla classe TreeNode un metodo:
int quanteVolte(int i)
che restituisca il numero di nodi dell’albero che hanno valore del loro item uguale ad i.
int quanteVolte(int i) {
int result = 0;
if (this==null) return result;
if (this.item==i) result++;if (left!=null) result=result + left.quanteVolte(i);
if (right!=null) result=result + right.quanteVolte(i);return result;
}
Si notino i casi di terminazione dlela risorsione.
Filtri
Scrivere un filtro che prenda l'ingresso da System.in e ponga la propria uscita sia su System.out che sul file il cui nome è passato come primo di tre argomenti di invocazione (si controlli il numero degli argomenti).
Il filtro deve considerare i caratteri del file in ingresso e operare un filtraggio su questi in base al secondo e al terzo argomento di invocazione. Essi sono due caratteri alfabetici, o entrambi maiuscoli o entrambi minuscoli in ordine alfabetico (ad esempio C K).
I due caratteri rappresentano gli estremi dell'insieme di caratteri alfabetici, maiuscoli E minuscoli, da eliminare dal file di uscita. Se i caratteri fossero C e K si devono eliminare sia tutti gli alfabetici maiuscoli compresi tra 'C' e 'K' estremi inclusi, sia tutti gli alfabetici minuscoli compresi tra 'c' e 'k' estremi inclusi. Gli altri caratteri devono passare nei file di uscita inalterati.
Ad esempio, il filtro, invocato con: filtro pippo C K
con input fornito da console come segue (il filtro deve lavorare fino alla fine del file):
Esame per FONDAMENTI
produce in uscita:
sam pr ONMNT
package filtro; // compito del 13 09 2001
import java.io.*;
public class Filtro {
public static void main(String[] args) {
int totale=0; char c1, c2;
FileWriter file;
if (args.length != 3) { // numero degli argomenti scorretto
System.out.println("Problemi di argomenti\n Sono " + args.length
+ " e devono essere 3");
System.exit(1);}
try // per verificare la
corretta apertura del file
{
file = new FileWriter (args[0]);
for (int i=1; i < 3; i++)
{if (args[i].length() != 1) { // lunghezza degli argomenti scorretta
System.out.println("Gli argomenti un solo carattere" + "\n e non " + args[1].length()); System.exit(2);
}
char c=args[i].charAt(0);
if ( !isMaiusc(c)&& !isMinusc(c)) { // tipo degli argomenti scorretto
// o entrambi maiuscoli o entrambi minuscoli: ossia alfabetici
System.out.println("Gli argomenti devono essere alfabetici");
System.exit(3);}
}
c1=args[1].charAt(0); c2=args[2].charAt(0);
if ( isMaiusc(c1) ^ isMaiusc(c2) && isMinusc(c1) ^ isMinusc(c2) ) {
// gli argomenti devono essere entrambi o maiuscoli o minuscoliSystem.out.println("Gli argomenti devono essere entrambi o maiuscoli\n"
+ "o entrambi minuscoli e dello stesso tipo");
System.exit(4);}
filtra (file, c1,c2);
System.exit(0);
}
catch (IOException e)
{
System.out.println("Errore. Problema nella apertura file.");
System.exit(5);}
}
// funzioni di appoggio: definite per esercizio: si vedano le corrispondenti Java
static boolean isMaiusc
(char c) {
return c >= 'A' && c <= 'Z';
}
static boolean isMinusc
(char c) {
return c >= 'a' && c <= 'z';
}
static char toMaiusc (char
c) {
if (isMaiusc(c)) return c;
else if (isMinusc(c)) return (char)(c -'a' +'A');
else return c;
}
static char toMinusc
(char c) {
if (isMinusc(c)) return c;
else if (isMaiusc(c)) return (char)(c -'A' +'a');
else return c;
}
public static void filtra
(FileWriter f, char c1, char c2)
{
InputStreamReader in = new
InputStreamReader(System.in);
OutputStreamWriter out = new OutputStreamWriter(System.out);
int x; boolean Maiusc = isMaiusc(c1);
try
{
while ((x = in.read()) >=
0)
{ char ch = (char) x; boolean print = true;
if (ch == '\n') {out.flush();} // notate che si esamina un carattere alla volta
// e non si leggono linee o l'intero fileif ( isMaiusc(ch)) // da scartare
if ( toMaiusc(c1) <= toMaiusc(ch) && toMaiusc(ch) <= toMaiusc(c2))
print = false;if ( isMinusc(ch)) // da scartare
if ( toMinusc(c1) <= toMinusc(ch) && toMinusc(ch) <= toMinusc(c2))
print = false;if (print) {out.write(ch); f.write(ch);}
}
}
catch (IOException e)
{
System.out.println("Errore. Problema nella scrittura "); System.exit(3);
}
try { out.close();}
catch (IOException e) {
System.out.println("Errore. Problema in chiusura");
System.exit(4);}
}
}
Componenti grafici
Partendo dallo schema di codice che segue (disponibile anche come file scaricabile):
public class Es1309 {
public static void main(String args[]) {
JButton b1 = new JButton("Contatore 1");
JLabel l1 = new JLabel("valore 0");
JLabel lab = new JLabel("Bottoni con pressioni uguali"); ...
JPanel panel = new JPanel();
...
EsameFrame frame= new EsameFrame("La somma vale 0", ...);
Container c = frame.getContentPane();
c.add(panel); ...
b1.addActionListener (frame);
frame.show(); }
}
Si consideri un componente grafico che deve gestire tre bottoni, tenendo conto del numero di pressioni di ciascun bottone (tramite un contatore inizializzato al valore 0). Il componente deve visualizzare:
Per ogni pressione di un bottone, si devono considerare sia la variazione del numero di pressioni per il bottone sia la variazione del titolo del frame. Quando i bottoni si trovano tutti con un valore di contatore uguale (quindi anche all'inizio), in una label visualizzata nel frame deve comparire una scritta: "Bottoni con pressioni uguali"; in tutti gli altri casi, la stessa label deve avere contenere la scritta "Bottoni con pressioni disuguali".
La soluzione prevede di avere il frame come unico listener per tutti gli eventi.
package es1309;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Es1309 {
public static void main(String args[]) {
JButton b1 = new JButton("Contatore 1");
JButton b2 = new JButton("Contatore 2");
JButton b3 = new JButton("Contatore 3");
JLabel l1 = new JLabel("valore 0");
JLabel l2 = new JLabel("valore 0");
JLabel l3 = new JLabel("valore 0");
JLabel lab = new JLabel("Bottoni con pressioni uguali");JPanel panel = new JPanel();
EsameFrame frame= new EsameFrame("La somma vale 0", b1, b2, b3, l1, l2, l3, lab); Container c = frame.getContentPane();c.add(panel); panel.add(b1); panel.add(l1); panel.add(b2);
panel.add(l2); panel.add(b3); panel.add(l3); panel. add(lab);b1.addActionListener (frame);
b2.addActionListener (frame);
b3.addActionListener (frame);
frame.addWindowListener(new Terminator ()); frame.show();
}
}
class EsameFrame extends JFrame implements ActionListener {
private int s1 = 0, s2 = 0,
s3 = 0, somma;
private JLabel l1, l2, l3, labsomma;
private JButton b1, b2, b3;
public EsameFrame (String
t, JButton b1, JButton b2, JButton b3,
JLabel l1, JLabel l2,
JLabel l3, JLabel lab)
{
super(t);
setBounds(200, 100, 200, 300);
// this.setResizable(false);this. l1 = l1; this. l2 = l2; this. l3 = l3;
this. b1 = b1; this. b2 = b2; this. b3 = b3; this. labsomma = lab;
}
public void actionPerformed(ActionEvent e){
if (e.getSource() == b1) {
System.out.println (" Bottone 1\n");
s1 ++; l1.setText ("Vale " + s1);
}
if (e.getSource() == b2) {
System.out.println (" Bottone 2\n");
s2 ++; l2.setText ("Vale " + s2);
}
if (e.getSource() == b3) {
System.out.println (" Bottone 3\n");
s3 ++; l3.setText ("Vale " + s3);
}
somma = s1 + s2 + s3; setTitle( "La somma vale " + somma);
System.out.println (" Bottoni
" + s1 + " " + s2 + " " + s3 + "\n");
if (s1 == s2 && s2 == s3) labsomma.setText("Bottoni con pressioni uguali");
else labsomma.setText("Bottoni con pressioni disuguali");
}
}
//----------------------------
class Terminator implements WindowListener {
public void windowClosed(WindowEvent
e){}
public void windowClosing(WindowEvent
e){ System.exit(0); }
public void windowOpened(WindowEvent
e){}
public void windowIconified(WindowEvent
e){}
public void windowDeiconified(WindowEvent
e){}
public void windowActivated(WindowEvent
e){}
public void windowDeactivated(WindowEvent
e){}
}