Liste
Partendo da una struttura dati che deve realizzare una lista doppiamente linkata (con le classi per la lista e per i nodi che puntano ad oggetti qualunque), e con la lista che conta gli elementi contenuti:
si veda il codice allegato
Si scriva
il codice del metodo che inserisca due nuovi nodi, il primo
nella prima posizione della lista, il secondo come
ultimo.
Il metodo abbia l'interfaccia:
public void insertInizioeFine (Object oggetto1, Oggetto oggetto2)
Se gli oggetti passati come parametri sono uguali e se la lista NON contiene altri elementi, si deve inserire uno solo dei due oggetti, che diventa l'unico elemento accodato nella lista. Si consideri la relazione di uguaglianza più adatta per verificare la condizione specificata per un inserimento singolo.
public void insertInizioeFine
(Object oggetto1, Object oggetto2)
{ if ((isEmpty())
&& (oggetto1.equals(oggetto2)))
insert(oggetto1);
else {insert(oggetto1); append (oggetto2);}
}
Si noti che si possono utilizzare i metodi esistenti.
Filtri
Si progetti un filtro che sia invocato con due
argomenti, il primo una stringa, il secondo un carattere numerico.
Si controlli che la invocazione avvenga con il numero corretto
di argomenti.
Il filtro deve prendere l'ingresso da System.in
e porre la propria uscita sia su System.out
che su un file di uscita fornito come primo argomento di invocazione.
Il filtro deve operare sul file di ingresso
considerando che deve trasformare i caratteri numerici, lasciando
inalterati tutti gli altri caratteri portati direttamente in uscita.
I caratteri numerici devono essere trasformati negli equivalenti caratteri traslati
secondo quanto specificato dal secondo argomento.
Si noti che il file di ingresso può essere costituito da un numero qualunque
di linee.
Ad esempio, il filtro, invocato come:
filtro fileout 3
deve trasformare i caratteri numerici in input traslandoli di tre posizioni in output:
|
ingresso: |
0 1 2 3 4 5 6 7 8 9 |
|
uscita (ingresso + 3): |
3 4 5 6 7 8 9 0 1 2 |
In caso di seguente input fornito da console:
"Esame di Fondamenti 11\n123456\n78909876543210" si ha un output uguale a:
"Esame di Fondamenti 44\n456789\n01232109876543"
Il risultato dell'elaborazione deve essere scritto sia su System.out che su fileout.
package filtro;
import java.io.*;
public class Filtro {
public static void main(String[] args) {
char ch;if (args.length != 2)
{ System.out.println("Problemi di argomenti\n sono" + args.length); System.exit(1); }if (args[1].length() != 1)
{ System.out.println("Il secondo argomento deve essere un carattere \n e non " + args[2].length()); System.exit(2); }ch = args[1].charAt(0);
if (ch < '0' && ch > '9' )
{ System.out.println("Il secondo argomento deve essere numerico"); System.exit(3); }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,ch - '0');
System.exit(0);
}
public static void filtra(FileWriter
file, integer i) {
InputStreamReader
in = new InputStreamReader(System.in);
OutputStreamWriter
out = new OutputStreamWriter(System.out);
int x;
try {
while ((x = in.read()) >= 0) {
char ch = (char) x;
if (ch == '\n') {out.flush();}
// notate che si esamina
un carattere alla volta
// e non si leggono linee
o l'intero file
//
i caratteri decimali sono alterati
// tutti gli altri inalterati
if
(ch >= '0' && ch <= '9')
{ch += i;
if (ch > '9') ch -= 10;}
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
public class Esame11luglio {
public static void main(String args[]) {
JButton b1 = new JButton("Ingresso 1");
JButton b2 = new JButton("Ingresso 2");
JLabel t1 = new JLabel("NO");
JLabel t2 = new JLabel("NO");
JLabel ORlogico = new JLabel("OR falso");
JPanel panel = new JPanel();
JFrame frame= new JFrame("Frame con Bottoni e Label");
frame.setBounds(200, 200, 150, 250);
frame.setResizable(false);
Container c = frame.getContentPanel();
c.add(panel);
...
frame.show(); }
}
Si consideri che l'applicazione grafica deve mostrare due oggetti bottone. Ogni bottone è associato ad una label che si occupa di visualizzare lo stato corrente del bottone (stati possibili: SI e NO). Inoltre si prevede un ulteriore componente label per visualizzare il risultato di un operatore OR.
Ogni bottone deve essere inizializzato
a partire da stato NO e ogni pressione deve cambiarne lo
stato, segnalandolo nel campo testo corrispondente. Quindi, la prima
pressione di un bottone deve segnalare nel testo corrispondente al bottone lo
stato SI, la successiva lo stato NO, ecc.
Il campo, di nome ORlogico, deve contenere una visualizzazione
del risultato della operazione di OR logico degli stati dei due bottoni.
Quando almeno un bottone è in stato SI, si deve visualizzare "OR vero",
altrimenti si deve visualizzare il testo "OR falso".
Inoltre, facoltativamente, si consideri la possibilità di fornire un numero variabile di bottoni (e label) passandone il numero come argomento di invocazione del programma. In questo caso il testo deve indicare il risultato dell'operatore OR tra lo stato di tutti i bottoni.
La soluzione prevede di avere il frame come unico listener per tutti gli eventi.
package esame11luglio;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Esame11luglio {
public static void main(String
args[]) {
JButton b1 = new JButton("Ingresso
1");
JButton b2 = new JButton("Ingresso
2");
JLabel t1 = new JLabel("NO");
JLabel t2 = new Jlabel("NO");
JLabel
ORlogico = new JLabel("OR falso");
JPanel panel = new
JPanel();
EsameFrame frame=
new EsameFrame("Ingressi per OR",
b1, b2, t1, t2, ORlogico);
Container c = frame.getContentPane();
c.add(panel);
panel.add(b1); panel.add(t1);
panel.add(b2); panel.add(t2);
panel.add(ORlogico);
b1.addActionListener
(frame);
b2.addActionListener
(frame);
frame.addWindowListener(new
Terminator ());
frame.show();
}
}
class EsameFrame extends
JFrame implements ActionListener {
private JLabel t1, t2,
ORl;
private JButton
b1, b2;
public EsameFrame (String
t, JButton b1, JButton b2,
JLabel t1,
JLabel t2, JLabel ORlogico) {
super(t);
setBounds(200, 200, 150,
250);
this.setResizable(false);
this. t1 = t1; this. t2
= t2;
this. b1 = b1; this. b2
= b2;
ORl
= ORlogico;
}
public void actionPerformed(ActionEvent
e){
if (e.getSource()
== b1)
{ System.out.println
(" Ingresso 1 e " + t1.getText() + "\n");
if (t1.getText() == "NO") t1.setText ("SI");
else t1.setText("NO");
}
if (e.getSource()
== b2)
{ System.out.println
(" Ingresso 2 e " + t1.getText() + "\n");
if (t2.getText() == "NO") t2.setText ("SI");
else t2.setText("NO");
}
System.out.println
(" Bottoni " + t1.getText()
+ " " + t2.getText()
+ "\n");
if (t1.getText()==
"SI" || t2.getText()==
"SI")
OR1.setText("OR vero \n");
else OR1.setText("OR
falso \n");
}
}
//----------------------------
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){}
}
Quanto al facoltativo, si veda la implementazione seguente che prevede una invocazione del programma con un valore intero, che rappresenta il numero di elementi da considerare. Si noti la importanza di un linguaggio che consenta di istanziare un array decidendo la dimensione al momento della esecuzione e non in fase di dichiarazione.
package esame11lugliofacoltativo;
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Esame2 {
public static void main(String args[]) {
int i, n = 0;
JButton butts [];
JLabel txts [];
JLabel ORlogico;
if (args.length != 1)
{
System.out.println("Necessario un argomento\n sono invece " + args.length);
System.exit(1);
}
try {
n = Integer.parseInt (args[0]);
}
catch (NumberFormatException
e)
{System.out.println
("Non valore giusto: non intero");
System. exit
(1);}
butts = new JButton [n];
txts = new JLabel [n];
for (i=0; i < n; i++)
{ butts [i] = new JButton("Bottone " + i);
txts[i] = new JLabel("OFF");
}
JPanel panel = new JPanel();
EsameFrame frame= new EsameFrame("Frame
per Bottoni/Testo",
butts, txts, ORlogico);
frame.setBounds(200, 100, 208, 400);
frame.setResizable(false);
Container c = frame.getContentPane();
c.add(panel);
for (i=0; i < n; i++)
{ panel.add(butts [i]);
panel.add(txts[i]);
butts[i].addActionListener
(frame);
}
ORlogico= new JLabel ("OR
logico di " + n + "ingressi ");
panel.add(ORlogico);
frame.addWindowListener(new Terminator ());
frame.show();
}
}
class EsameFrame extends JFrame implements
ActionListener {
private boolean states [];
private JLabel txts[];
private JButton butts[];
private JLabel ORlogico;
int n;
public EsameFrame (String t, JButton
bs[], JLabel ts [], JLabel ORl)
{
super(t);
n = bs.length;
butts = new JButton [n];
txts = new JLabel [n];
ORlogico = ORl;
for ( int i = 0; i < n; i++)
{this. txts [i] = ts [i];
this. butts [i] = bs [i];
}
}
public void actionPerformed(ActionEvent e){
for (int i = 0 ; i < n; i++)
if (e.getSource() == butts[i])
{ System.out.println ("
Ingresso " + i);
if (txts[i].setText()
== "NO") txts[i].setText ("SI"); else txts[i].setText("NO");
}
for (int i = 0; i < n; i++)
System.out.println (" Ingresso
" + i + " vale " + txts[i].setText());
ORlogico. setText(" OR falso
");
for (int i = 0; i < n; i++)
if (txts[i].getText () == "SI") {
ORlogico. setText(" OR vero "); break;}
}
}
//----------------------------
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){}
}