Dato il codice per una lista semplicemente linkata (con le classi per la lista e per i nodi che puntano ad oggetti qualunque), con la lista che conta gli elementi contenuti:
Si scriva il codice di un metodo che scorre la lista e inserisce dopo un elemento con un certo valore un nuovo elemento di contenuto specificato: la esecuzione può portare anche ad inserire molti elementi.
Il metodo deve verificare gli elementi della lista e per ogni occorrenza di un valore specificato (dopo nella interfaccia deve puntare ad un oggetto uguale a quello puntato dal nodo corrente) si produca l’inserimento di un nuovo nodo della lista che punti ad un elemento di valore specificato (oggetto nella interfaccia).
Si consideri la relazione di uguaglianza opportuna (equals e non ==) per verificare la condizione di inserimento.
Il metodo abbia la interfaccia:
public
void insertDopo (Object dopo, Object oggetto)
public void
insertDopo (Object dopo, Object o)
{ListNode
nodo = first;
while (nodo.getNext()!= null)
{
if (nodo.getItem().equals(dopo))
{ ListNode nuovoNodo = new ListNode(o, this);
nuovoNodo. setNext(nodo. getNext());
nodo.setNext(nuovoNodo);
size++;}
nodo = nodo.getNext();
}
}
Si noti che
la lista deve esere scorsa tutta: per ogni elemento trovato uguale come
oggetto puntato al parametro
(la uguaglianza
è data con il metodo equals), si deve inserire l'oggeto cercato.
Poi si continua
a scorrere la lista.
Filtri
Scrivere un filtro che prenda l'ingresso da System.in e ponga la propria uscita oltre a System.out su un file uscita fornito come argomento di invocazione (si controlli che la invocazione avvenga con il numero corretto di argomenti).
Il filtro deve filtrare il file di ingresso considerando che si vogliono trasformare tutti i caratteri alfabetici sui file di uscita: i caratteri maiuscoli sono trasformati nel corrispondente carattere minuscolo, e, in modo complementare, i caratteri minuscoli sono trasformati nel corrispondente carattere maiuscolo. Si noti che il file di ingresso può essere costituito da un numero qualunque di linee, fino alla fine del file.
Ad esempio, il filtro, invocato con argomento fileout.txt, deve trasformare i caratteri forniti da console:
"Esame di Fondamenti di Informatica A II &%$£"/())=?" in
"eSAME DI fONDAMENTI DI iINFORMATICA a ii &%$£"/())=?"
Il risultato dell'elaborazione
deve essere scritto sia su System.out che su fileout.txt.
package filtro;
import java.io.*;
public class Filtro {
public static
void main(String[] args) {
int totale=0;
if
(args.length != 1) {
System.out.println("Problemi di argomenti\n sono" + args.length);
System.exit(1);
}
FileWriter
file = null;
try
{
file = new FileWriter (args[0]);
}
catch
(IOException e) {
System.out.println("Errore. Problema nella apertura file.");
System.exit(2);
}
filtra
(file);
System.exit(0);
}
public static
void filtra(FileWriter file) {
InputStreamReader
in = new InputStreamReader(System.in);
OutputStreamWriter
out = new OutputStreamWriter(System.out);
int
x; boolean statoMaiuscolo = false;
try
{
while ((x = in.read()) >= 0) {
char ch = (char) x;
if (ch == '\n') {out.flush();}
// notate che
si esamina un carratere alla volta
// e non si leggono
linee o l'intero file
if (ch >= 'a' && ch <= 'z') ch += - 'a' + 'A';
if (ch >= 'A' && ch <= 'Z') ch += - 'A' + 'a';
// solo i caratteri
alfabetici sono stati cambiati
// tutti gli altri
inalterati
out.write(ch); file.write (ch);
}
}
catch
(IOException e) {
System.out.println("Errore. Problema nella scrittura ");
System.exit(3);
}
try
{ out.close(); file.close ();}
catch
(IOException e) {
System.out.println("Errore. Problema in chiusura");
System.exit(4);
}
}
}
Componenti grafici
Dato il seguente codice:
public class Esame1 {
}public static void main(String args[]) {
JButton b1 = new JButton("Bottone 1");
JButton b2 = new JButton("Bottone 2");
JButton b3 = new JButton("Bottone 3");
JTextField testosomma = new JTextField("0");
JPanel panel = new JPanel();
JFrame frame= new JFrame("Bottoni con pressioni uguali");
frame.setBounds(200, 100, 208, 180);
frame.setResizable(false);
Container c = frame.getContentPane();
c.add(panel);
…
frame.show(); }
Si consideri un componente che deve gestire tre bottoni. Ogni bottone deve tenere conto del numero di pressioni che lo hanno interessato (tramite un contatore). Il componente deve visualizzare il numero totale di pressioni attraverso un campo di testo che espone la somma corrente (testosomma). Per ogni pressione di un bottone, si deve considerare la variazione del numero di pressioni e il testo deve cambiare la visualizzazione.
Quando i bottoni si trovano tutti con un valore di contatore uguale (quindi anche all'inizio), il titolo del frame deve segnalarlo imponendo un titolo: "Bottoni con pressioni uguali"; in tutti gli altri casi, il frame deve avere un titolo "Situazione non concorde".
Inoltre, facoltativamente,
si consideri la possibilità di fornire un numero qualunque di bottoni
passando il valore numerico come argomento.
package esame2;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Esame2 {
public static void main(String
args[]) {
JButton b1 =
new JButton("Bottone 1"); JTextField t1 = new JTextField("0", 5);
JButton b2 =
new JButton("Bottone 2"); JTextField t2 = new JTextField("0", 5);
JButton b3 =
new JButton("Bottone 3"); JTextField t3 = new JTextField("0", 5);
JTextField testosomma
= new JTextField("La somma vale 0", 20);
JPanel panel
= new JPanel();
EsameFrame
frame= new EsameFrame("Bottoni con pressioni uguali",
b1, b2, b3, t1, t2, t3, testosomma);
Container
c = frame.getContentPane();
c.add(panel);
panel.add(b1);
panel.add(t1);
panel.add(b2);
panel.add(t2);
panel.add(b3);
panel.add(t3);
panel.
add(testosomma);
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 JTextField
t1, t2, t3, testosomma;
private JButton
b1, b2, b3;
public EsameFrame
(String t, JButton b1, JButton b2, JButton b3,
JTextField
t1, JTextField t2, JTextField t3, JTextField testosomma) {
super(t);
setBounds(200,
100, 400, 300);
// this.setResizable(false);
this. t1 = t1;
this. t2 = t2; this. t3 = t3;
this. b1 = b1;
this. b2 = b2; this. b3 = b3;
this. testosomma
= testosomma;
}
public void actionPerformed(ActionEvent
e){
if
(e.getSource() == b1)
{
System.out.println (" Bottone 1\n");
s1 ++;
t1.setText ("Vale" + s1);
}
if
(e.getSource() == b2)
{
System.out.println (" Bottone 2\n");
s2 ++;
t2.setText ("Vale" + s2);
}
if
(e.getSource() == b3)
{
System.out.println (" Bottone 3\n");
s3 ++;
t3.setText ("Vale" + s3);
}
somma
= s1 + s2 + s3;
testosomma.setText( "La somma vale " + somma);
System.out.println
(" Bottoni " + s1 + " " + s2 + " " + s3 + "\n");
if
(s1 == s2 && s2 == s3)
setTitle("Bottoni con pressioni uguali");
else
setTitle("Bottoni con pressioni non uguali");
}
}
//----------------------------
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){}
}
Si considerino anche soluzioni alternative per la visualizzazione di un intero come stringa (o di un reale, ecc).
Per la parte facoltativa, si veda la soluzione dell'esercizio numero 1.