PDA

View Full Version : Calcolatrice - programmino in JAVA


Hawk88
05-02-2012, 11:50
Ho realizzato un programmino in Java che simula il funzionamento di una calcolatrice che svolge le 4 operazioni matematiche fondamentali.

Ecco il codice:


import java.util.Scanner;

public class Calcolatrice {
public void intestazione() {
System.out.println("+--------------------------+");
System.out.println("| CALCOLATRICE |");
System.out.println("+--------------------------+");
System.out.println("***Realizzato da xxx***\n");
}

public void presentazione() {
Scanner input = new Scanner(System.in);
System.out.println("Ciao! Come ti chiami?");
String nome = input.nextLine();
System.out.println("Ciao " +nome+ "!");
}

public void operazioni() {
Scanner input = new Scanner(System.in);
System.out.printf("Digita un numero: ");
float num1 = input.nextFloat();
System.out.printf("Digita un altro numero: ");
float num2 = input.nextFloat();
System.out.println("Ora digita l'operazione che desideri fare:\n1) somma;\n2) sottrazione;\n3) moltiplicazione;\n4) divisione.");
int scelta = input.nextInt();
switch(scelta) {

case 1: {
System.out.println("Hai scelto la somma.");
float result = num1+num2;
System.out.printf("La somma tra %.2f e %.2f vale %.2f.\n", num1,num2,result);
break;
}

case 2: {
System.out.println("Hai scelto la sottrazione.");
float result = num1-num2;
System.out.printf("La differenza tra %.2f e %.2f vale %.2f.\n", num1,num2,result);
break;
}

case 3: {
System.out.println("Hai scelto la moltiplicazione.");
float result = num1*num2;
System.out.printf("La moltiplicazione tra %.2f e %.2f vale %.2f.\n", num1,num2,result);
break;
}

case 4: {
System.out.println("Hai scelto la divisione.");
float result = num1/num2;
System.out.printf("La divisione tra %.2f e %.2f vale %.2f.\n", num1,num2,result);
break;
}

default: {
System.out.println("Scelta non riconosciuta.");
break;
}

}
}

public static void main(String[] args) {
Calcolatrice calc = new Calcolatrice();
calc.intestazione();
calc.presentazione();
calc.operazioni();
System.exit(0);
}
}


Volevo però fare in modo che quando veniva effettuata un'operazione, non terminava subito il programma ma richiedeva all'utente di reinserire nuovamente 2 numeri per fare un'altra operazione.
Ho provato con un ciclo do...while ma senza avere successo...

Consigli?

PGI-Bis
05-02-2012, 23:59
Direi che il do-while può andare. Tipo:

Scanner input = new Scanner(System.in);
boolean termina = false
do {
//tutto il malloppone

System.out.println("avanti savoia [n/s]?")
termina = "n".equals(scanner.nextLine());
} while(!termina)

A occhio dovrebbe funzionare.

Hawk88
06-02-2012, 18:20
Non funziona, non mi consente di inserire S o N per continuare.

PGI-Bis
06-02-2012, 18:53
Quel birichino.

Usa

"n".equals(input.next("\\W"))//cioè dammi un carattere

al posto di

"n".equals(input.nextLine())

Ho scritto input.nextLine() per via dell'abitudine a lavorare per linee con Scanner. Quel che capita col nextLine() è che, poichè la console java richiede un invia per nutrire lo scanner "vuoto", quando chiedi un intero e premi invio lo scanner ti da l'interno ma si tiene l'interruzione di linea nel buffer. Un successivo nextInt la scarterebbe mentre per un "nextLine" è valida, è restituita e fa "saltare" la richiesta.

next("\\W") è come nextInt, solo che piglia una lettera.

Hawk88
07-02-2012, 14:23
Ora mi consente di inserire una lettera però appena faccio "invio" mi da l'errore!

PGI-Bis
07-02-2012, 14:30
Qui funziona. Mhhh... la trama si infittisce...

che errore ti da?

Hawk88
07-02-2012, 16:46
Ecco la schermata di NetBeans:


+--------------------------+
| CALCOLATRICE |
+--------------------------+
***Realizzato da xxx***

Ciao! Come ti chiami?
Matteo
Ciao Matteo!
Digita un numero: 104
Digita un altro numero: 250
Ora digita l'operazione che desideri fare:
1) somma;
2) sottrazione;
3) moltiplicazione;
4) divisione.
1
Hai scelto la somma.
La somma tra 104,00 e 250,00 vale 354,00.
Vuoi continuare? [S/N]
S
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:909)
at java.util.Scanner.next(Scanner.java:1530)
at java.util.Scanner.next(Scanner.java:1463)
at calcolatrice.Calcolatrice.operazioni(Calcolatrice.java:66)
at calcolatrice.Calcolatrice.main(Calcolatrice.java:75)
Java Result: 1
BUILD SUCCESSFUL (total time: 12 seconds)

banryu79
07-02-2012, 16:57
Passa la stringa: "\\w" (al posto di "\\W") come pattern al metodo next() dello scanner.

PGI-Bis
07-02-2012, 17:10
Anche \\w non va bene.

Facciamo così.

Anzichè nextFloat() usa:

Float.parseFloat(input.nextLine())

al posto di:

input.nextInt()

usa

Integer.parseInt(input.nextInt())

e anzichè:

"w".equals(next("\\w"))

usa

input.nextLine().toLowerCase().startsWith("S")

Riassumendo:

float num1 = Float.parseFloat(input.nextLine());
System.out.printf("Digita un altro numero: ");
float num2 = Float.parseFloat(input.nextLine());
System.out.println("Ora digita l'operazione che desideri fare:\n1) somma;\n2) sottrazione;\n3) moltiplicazione;\n4) divisione.");
int scelta = Integer.parseInt(input.nextLine());

e:

System.out.println("Vuoi terminare [n/s]?");
termina = input.nextLine().toLowerCase().startsWith("s");

Altrimenti il rilevamento del carattere di terminazione devi farlo con un'espressione regolare più complessa di \\w (e non vale mai la pena di usare le espressioni regolari).

Anche così non è a prova di bomba ma è già più tollerante.

Hawk88
08-02-2012, 18:12
Ho semplicemente sostituito


"n".equals(input.next("\\W"));


con:


"n".equals(input.next("\\w"));


così come ha suggerito banryu79.

Ora funziona, grazie a tutti! :D

Hardware Upgrade Forum Database Error
Database Error Database error
The Hardware Upgrade Forum database has encountered a problem.

Please try the following:
  • Load the page again by clicking the Refresh button in your web browser.
  • Open the www.hwupgrade.it home page, then try to open another page.
  • Click the Back button to try another link.
The www.hwupgrade.it forum technical staff have been notified of the error, though you may contact them if the problem persists.
 
We apologise for any inconvenience.