Kalkulator.java [Last ned]

/*
 *  Klassen implementerer en kalkulator med støtte 
 *  for +, *, -, /, snu fortegn og blank ut. 
 *  Kalkulatoren sjekker for divisjon med 0.
 *
 *  Kalkulatoren regner kun med heltall.
 *  Divisjon er altså heltallsdivisjon.
 *
 *  Mulig utvidelse:
 *  Denne kalkulatoren godtar ikke gjentatt bruk av
 *  operatorer, f.eks. 2 + 3 = = = eller 2 + 3 + + +
 *  Test gjerne hvordan en virkelig kalkulator håndterer
 *  dette, og prøv å endre koden. Tips: Når brukeren
 *  har klikket 2 og + og 3 og = skal det stå 5 i
 *  displayet, men kalkulatoren må huske 3 for å kunne
 *  danne 8 ved et nytt klikk på =. Og hva skjer ved
 *  bruk av - i stedet for + ? Sett inn kall på metoden
 *  dump for å forstå hvordan objektvariablene brukes
 *  og få ideer til utvidelsen.
 *
 */
 
public class Kalkulator {
 
  private int     tall;         // Nåværende verdi til kalkulatoren
  private int     forrige;      // Forrige innleste tall
  private boolean inputFase;    // Har vi startet på et tall?
  private boolean divMedNull;   // Har vi forsøkt å dele på 0?
  private char    operat;       // Forrige operator
 
 
  public Kalkulator() {
    nullstill();
  }
 
 
  // Sett kalkulatoren tilbake til utgangsposisjon.
  public void nullstill() {
    tall = 0;
    forrige = 0;
    inputFase = false;
    divMedNull = false;
    operat = ' ';
  }
 
 
  // Behandle et nytt siffer.
  public void siffer(int n) {
    if ( inputFase ) {
      if ( tall<0 )
        tall = 10*tall-n;
      else
        tall = 10*tall+n;
    }
    else {
      forrige = tall;
      tall = n;
      inputFase = true;
    }
  }
 
 
  // Behandle en operator
  public void oper(char op) {
 
    // Godtar ikke gjentatt bruk av operatorer,
    // se innledende kommentar om mulig utvidelse.
    if (!inputFase)
      return;
 
    if (operat == '+')
      tall = forrige+tall;
    else if (operat == '-')
      tall = forrige-tall;
    else if (operat == '*')
      tall = forrige*tall;
    else if (operat == '/') {
      if (tall == 0)
        divMedNull = true;
      else
        tall = forrige/tall;
    }
 
    // I denne versjonen er det greit å bare overskrive
    // operat, men for å håndtere gjentatte klikk på =
    // bør tilordningen kun gjøres hvis op ikke er =.
    // Se kommentar i toppen.
    operat = op;
 
    inputFase = false;
  }
 
 
  // Metoden snur fortegnet på nåværende verdi.
  public void snuFortegn() {
    tall = -tall;
  }
 
 
  // Behandling av "er-lik".
  public void erLik() {
    oper( '=' );
  }
 
 
  // Returner nåværende verdi.
  public String hentVerdi() {
    if (divMedNull)
      return "Divisjon med 0!";
    else
      return Integer.toString(tall);
  }
 
 
  // Skriver tilstanden i kalkulatoren til konsollet.
  // Brukes kun for testing.
  public void dump() {
    String s = "Kalkulator: "
      + "tall="         + tall
      + ", forrige="    + forrige
      + ", inputFase="  + inputFase
      + ", divMedNull=" + divMedNull
      + ", operat="     + operat;
    System.out.println(s);
  }
 
}
 
Kildekode blir vist ved hjelp av GeSHi.