Entra

View Full Version : Calcolatrice - programmino in JAVA


Hawk88
05-02-2012, 10: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, 22: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, 17:20
Non funziona, non mi consente di inserire S o N per continuare.

PGI-Bis
06-02-2012, 17: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, 13:23
Ora mi consente di inserire una lettera però appena faccio "invio" mi da l'errore!

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

che errore ti da?

Hawk88
07-02-2012, 15: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, 15:57
Passa la stringa: "\\w" (al posto di "\\W") come pattern al metodo next() dello scanner.

PGI-Bis
07-02-2012, 16: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, 17: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