import java.awt.*;
import java.applet.Applet;
/*------------------------------------------------------*/
/* SUMBEVARENDE AFRUNDING */
/* */
/* Programmet demonstrerer addition med sumbevarende */
/* afrunding. Man kan selv vælge antallet af decimaler */
/* hvormed de afrundede resultater trykkes. For hvert */
/* nyt indtastet tal trykkes henholdsvis den afrundede */
/* værdi efter 5-reglen og den afrundede værdi efter */
/* sumbevaringsreglen. */
/* */
/* H.B.Hansen, februar 1998, revideret juni 1999 */
/*------------------------------------------------------*/
public class Sumdemo extends Applet
{
Panel P1,P2,P3; //Paneler til bl.a. indtastning af data
Label promt,decimaler; //Ledetekster
TextField input,deci; //Indtastningsfelter
TextArea output; //Resultatarray
Button again; //Ny beregning
Button done; //Slutknap
int dec; //Antal decimaler
StringBuffer table; //Output af hele beregningen
//Her skabes et beregningsobjekt.
Sumbevar c = new Sumbevar();
// Denne procedure kaldes ved hver ny beregnings begyndelse.
private void initialize()
{
table = new StringBuffer("Indtastet 5-regel sumbevar\n");
c.initialize();
}
/*---------------------------------------------------*/
/* KONVERTERING TIL TRYKFORMAT */
/* */
/* x konverteres til et trykbart format. Width er */
/* antal anslag i trykkefeltet og dec er antal */
/* decimaler. Cifrene i x anbringes højrestillet i */
/* trykkefeltet med foranstillede mellemrum. Hvis */
/* der er for mange cifre til at trykningen kan */
/* gennemføres, bliver der trykt width stjerner. */
/*---------------------------------------------------*/
private String toString(double x,int width,int dec)
{
int tipot = 1,i,size;
String s1,s4;
for (i = 1; i <= dec; i++) tipot *= 10;
//s1 er et HELT tal som String
s1 = Integer.toString((int)Math.floor(x*tipot + 0.5));
s1.trim();
if (dec 0) //Der trykkes kun decimaltegn hvis dec 0
{
size = s1.length();
String s2 = s1.substring(0,size-dec); //s2 er heltalsdelen af s1
String s3 = s1.substring(size-dec,size); //og s3 er decimalerne
s4 = s2.concat(new String(".").concat(s3)); //Punktummet proppes ind
} else s4 = s1;
size = s4.length();
StringBuffer buf = new StringBuffer(); //Buffer til foranstillede mellemrum
if (size <= width) //Der skal være plads til hele tallet
{
for (i = 1; i <= width-size; i++) buf.append(" ");
return new String(buf).concat(s4);
}
//Hvis der ikke er plads returneres lutter stjerner
for (i = 1; i <= width; i++) buf.append("*");
return new String(buf);
}
/*------------------------------------------------------*/
/* START PÅ EN TABELLINIE */
/* */
/* Hjælpeprocedure til at indlede en outputlinie. Proce-*/
/* duren returnerer en String bestående af parameteren */
/* efterfulgt af så mange punktummer, at længden bliver */
/* ialt 10 tegn, efterfulgt af kolon. */
/*------------------------------------------------------*/
private String intro(String s)
{
int size = s.length();
StringBuffer buf = new StringBuffer(s);
for (int i = 10; i size; i--) buf.append('.');
return new String(buf.append(':'));
}
/*--------------------------------------------------*/
/* SELVE BEREGNINGSALGORITMEN */
/* */
/* Parameteren s er det sidste indtastede tal som en*/
/* String. Der udføres summation efter 5-reglen og */
/* med sumbevarende afrunding. De afrundede størrel-*/
/* ser appendes til den globale textbuffer table, og*/
/* de beregnede summer konkateneres til table. Pro- */
/* ceduren returnerer den nye tabel som en String. */
/*--------------------------------------------------*/
public String makeOutput(String s)
{
c.makeSums(s,dec);
table.append(intro(s) + toString(c.tastetTal(),dec+5,dec));
table.append(toString(c.sumbevTal(),dec+8,dec) + '\n');
//De endelige summer hæftes på
return new String(table).concat(intro("Sum") +
toString(c.femregelSum(),dec+5,dec) +
toString(c.sumbevSum(),dec+8,dec) + '\n');
}
// Og her kommer så de almindelige stumper i et Javaprogram
public void init()
{
setFont(new Font("Courier",Font.PLAIN,12));
P1 = new Panel();
P2 = new Panel();
decimaler = new Label("Antal decimaler:");
deci = new TextField(2);
P1.setLayout(new FlowLayout(FlowLayout.LEFT,0,10));
P1.setBackground(Color.gray);
P1.add(decimaler);
P1.add(deci);
promt = new Label("Tast et tal:");
input = new TextField(7);
input.setEditable(false); //Jeg vil have decimalerne først
P2.setLayout(new FlowLayout(FlowLayout.LEFT,0,10));
P2.setBackground(Color.red);
P2.add(promt);
P2.add(input);
output = new TextArea(40,20);
output.setBackground(Color.green);
P3 = new Panel();
again = new Button("Ny beregning");
done = new Button("Exit");
P3.setLayout(new FlowLayout(FlowLayout.LEFT,0,10));
P3.add(again);
P3.add(done);
setLayout(new BorderLayout());
add("North",P1);
add("West",P2);
add("Center",output);
add("South",P3);
initialize();
}
public boolean action(Event e,Object o)
{
if (e.target == deci)
{
dec = Integer.parseInt((String)e.arg);
deci.setEditable(false); //Man må ikke ændre antal decimaler
input.setEditable(true); //Der åbnes for indtastning af tal
return true;
}
if (e.target == input)
{
output.setText(makeOutput(input.getText()));
input.setText("");
return true;
}
if (e.target == again)
{
input.setEditable(false);
deci.setEditable(true);
deci.setText("");
output.setText("");
initialize();
return true;
}
if (e.target == done)
{
input.setEditable(false);
output.setText("Farvel og tak!");
System.exit(0);
return true;
}
return false;
}
}