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 produca la eliminazione di un elemento della lista alla posizione i-esima nella lista. Si consideri il primo elemento (puntato da first) di posizione 1. In caso la posizione non sia presente e l’inserimento non sia possibile si deve generare la eccezione ListException.
Il metodo abbia la interfaccia:
public
void removeAt (int i) throws ListException
public void
removeAt(int i) throws ListException
{
if(isEmpty())
throw new ListException("lista con elementi insufficienti");
if (i == 1 && first != null)
{ first = first. getNext(); size --; return;}
ListNode nodo = first; ListNode prima = null;
int position = 1;
while ((position < i) && (nodo.getNext()!= null))
{position ++; prima = nodo; nodo = nodo.getNext();}
if (position < i)
throw new ListException("lista con elementi insufficienti");
prima. setNext(nodo. getNext());
size--;
}
Si noti che si deve scandire
la lista fino alla posizione desiderata: se non esiste si lancia la eccezione
richiesta.
In caso la posizione si
sia trovata, allora si inserisce l'elemento stesso.
Si noti la differenza fra
la rimozione alla prima posizione o in altre.
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 eliminare tutti i caratteri alfabetici dai file di uscita. 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
" &%$£"/())=?"
Si noti che non
devono essere cancellati gli spazi bianchi. 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' && ch <= 'Z') continue;
// solo i caratteri
non alfabetici passano in uscita
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");
JTextField tOR = new JTextField("True");
JTextField tAND = new JTextField("True");
JPanel panel = new JPanel();
JFrame frame= new JFrame("Bottoni e AND e OR");
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 due oggetti di tipo bottone, considerando che gli stati possibili di un bottone sono True e False. Per ogni bottone, si parte da stato True e ogni pressione cambia lo stato. Quindi, la prima pressione di un bottone cambia lo stato in False, la seconda lo riporta true, ecc.
Il componente deve realizzare la visualizzazione delle funzioni OR logico e AND logico dei due stati correnti dei bottoni. Il testo che riporta il valore della funzione logica OR deve partire da un valore iniziale True, poi, ad ogni pressione deve tenere conto dello stato dei diversi bottoni. Lo stesso per la funzione AND.
Inoltre, facoltativamente,
si consideri la possibilità di fornire un numero variabile
di bottoni, passandone il numero come argomento di invocazione
del programma che rappresenta il componente.
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");
JButton b2 =
new JButton("Bottone 2");
JTextField tOR
= new JTextField("OR True", 15);
JTextField tAND
= new JTextField("AND True", 15);
JTextField t1
= new JTextField("True", 10);
JTextField t2
= new JTextField("True", 10);
JPanel panel
= new JPanel();
EsameFrame
frame= new EsameFrame("Frame per Bottoni e AND e OR",
b1, b2, t1, t2, tOR, tAND);
Container
c = frame.getContentPane(); c.add(panel);
panel.add(b1);
panel.add(t1);
panel.add(b2);
panel.add(t2);
panel.add(tOR);
panel.add(tAND);
b1.addActionListener
(frame);
b2.addActionListener
(frame);
frame.addWindowListener(new
Terminator ());
frame.show();
}
}
class EsameFrame extends
JFrame implements ActionListener {
private boolean
s1 = true, s2 = true;
private JTextField
t1, t2, tOR, tAND;
private JButton
b1, b2;
public EsameFrame
(String t, JButton b1, JButton b2, JTextField t1,
JTextField
t2, JTextField tOR, JTextField tAND) {
super(t);
setBounds(200,
100, 400, 300);
// this.setResizable(false);
this. tOR = tOR;
this. tAND = tAND;
this. b1 = b1;
this. b2 = b2;
this. t1 = t1;
this. t2 = t2;
}
public void actionPerformed(ActionEvent
e){
if
(e.getSource() == b1)
{
System.out.println (" Bottone 1\n");
s1 = !s1;
if (s1) t1.setText ("b1 True"); else t1.setText("b1 False");
}
if
(e.getSource() == b2)
{
System.out.println (" Bottone 2\n");
s2 = !s2;
if (s2) t2.setText ("b2 True"); else t2.setText("b2 False");
}
System.out.println
(" Bottone AND OR");
System.out.println
(" Bottoni " + s1 + " " + s2 + "\n");
if
(s1 && s2)
tAND.setText("AND true");
else
tAND.setText("AND false");
if
(s1 || s2)
tOR.setText("OR true");
else
tOR.setText("OR false");
}
}
//----------------------------
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){}
}
Per la realizzazione facoltativa, si veda la soluzione per il compito numero 1. Si facciano gli opportuni cambiamenti.