Block Image

Realizziamo un programma che risolva il seguente problema:
dati in ingresso un simbolo tra "+" e "-" e 2 numeri interi a e b, restituire la somma o la differenza di a e b a seconda se sia stato inserito in input + o - (se si inserisce +, allora fare la somma, se si inserisce - fare la differenza).

Prerequisiti

  • Aver installato la jdk 8
  • Aver installato un IDE (nella guida useremo Intellij Community Edition)

Passo 1: Aprire Intellij

Seguire il passo 1 della lezione precedente Lezione precedente chiamando il progetto Selezione invece che Somma.

Passo 2: Scriviamo le variabili

Il problema che ci viene posto consiste in un simbolo alfanumerico (+ o -), 2 numeri interi a e b dati in ingresso (in input) e di una somma o differenza restituita in output. Avremo quindi 4 variabili: simbolo, a, b e risultato.

Nota 1: char rappresenta un solo carattere alfanumerico. Se volessimo rappresentare una parola contenente più di 1 carattere, dovremmo scrivere char parola ["dimensione_parola"]. Esempio: per rappresentare la parola "ciao" dovrei fare in questo modo: char parola[4]
package it.enzoracca.somma;

public class Main {

    public static void main(String[] args) {
	// write your code here
		char simbolo;
        int a;
        int b;
        int risultato;
    }
}

Passo 3: Diamo in input il simbolo e a e b

Scanner scanner = new Scanner(System.in);
System.out.println("Scrivi il simbolo (+ o -): ");
simbolo = scanner.next().charAt(0);
System.out.println("Scrivi il valore di a: ");
a = scanner.nextInt();
System.out.println("Scrivi il valore di b: ");

Da notare l'istruzione simbolo = scanner.next().charAt(0). La classe Scanner per leggere da input un intero, ha il metodo nextInt(), mentre per leggere caratteri alfanumerici ha il metodo next(). In realtà questo metodo legge una variabile di tipo String, che non è un tipo primitivo ma è una classe Java che rappresenta caratteri alfanumerici di qualunque dimensione.
Quasi mai infatti si rappresenta una parola che può contenere più di un carattere con char[dimensione], perché ad esempio se volessimo riempire la variabile word con la parola "ciao", dovremmo fare in questo modo:

char[] word = new char[4];
word[0] = 'c';
word[1] = 'i';
word[2] = 'a';
word[3] = 'o';
System.out.println(word);

Nella pratica dovremmo inserire un carattere alla volta, la c nella prima posizione, la i nella seconda e così via. La variabile word rappresenta l'intera parola. Quindi word = word[0] + word[1] + word[2] +word[3] = ciao.
Un po' scomodo vero? Vediamo come rappresentare la parola ciao con una variabile word di tipo String:

String word = "ciao";
System.out.println(word);

Molto più pratico no?

Dopo questa breve parentesi di char e String, torniamo all'esercizio. Abbiamo detto dunque che scanner.next() legge una parola, più precisamente una variabile di tipo String; scrivendo poi .charAt(0) indichiamo che vogliamo valorizzare la variabile simbolo con la prima lettera inserita in input. Quindi se scrivessimo in input "+--", la variabile sarebbe uguale a +.

Nota 2: La dicitura char[] word = new char[4] indica un array di tipo char che ha dimensione 4. Spiegheremo nelle lezioni successive cos'è un array.

Passo 3: calcoliamo la somma o la differenza a seconda del simbolo dato in input

Per risolvere questo problema ci viene in aiuto il costrutto della selezione, che ci permette di selezionare le istruzioni da eseguire a seconda di una o più condizioni. Nella pratica: "se il segno in input è uguale a +, fai la somma, altrimenti fai la differenza". In Java, come in molti altri linguaggi di programmazione, la selezione viene implementata con l'istruzione if-else. Precisamente:

if(condizione) {
  istruzione1
  istruzione2
}
else {
  istruzione3
}

Quindi tra le parentesi tonde si scrive la condizione, tra le parentesi graffe dell'if scriviamo 0,1 o più istruzioni che verranno eseguite se la condizione è verifica (quindi se la condizione è uguale a true), mentre tra le parentesi graffe dell'else scriviamo 0,1 o più istruzioni che verranno eseguite se la condizione non si verifica (quindi la condizione è uguale a false).
Per l'esercizio questo si traduce in:

if(simbolo == '+') {
    risultato = a + b;
}
else {
    risultato = a - b;
}
Nota 3:== viene usato per confrontare le variabili, = invece viene usato per assegnare un valore ad una variabile

Qui il programma completo:

package it.enzoracca.somma;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
	// write your code here
		char simbolo;
		int a;
		int b;
		int risultato;

		Scanner scanner = new Scanner(System.in);
		System.out.println("Scrivi il simbolo (+ o -): ");
		simbolo = scanner.next().charAt(0);
		System.out.println("Scrivi il valore di a: ");
		a = scanner.nextInt();
		System.out.println("Scrivi il valore di b: ");
		b = scanner.nextInt();
		if(simbolo == '+') {
			risultato = a + b;
		}
		else {
			risultato = a - b;
		}

		System.out.println("Il risultato di a " + simbolo + " b è: " + risultato);
    }
}

Dettagli sulla selezione

Possiamo avere 4 casi d'uso diversi per l'if:

if-else classico

Come nell'esempio precedente.

if senza else

Possiamo scrivere un if anche senza else (ma non il viceversa):

if(condizione) {
  istruzione1
  istruzione2
}
istruzione3

In questo caso istruzione1 e istruzione2 vengono eseguite se la condizione è verifica; l'istruzione3 viene eseguita a prescindere.

if-else in cascata
if(condizione1) {
  istruzione1
  istruzione2
}
else if(condizione2) {
  istruzione3
}
else {
  istruzione4
}

In questo caso: se si verifica la condizione1, allora vengono eseguite le istruzioni 1 e 2, se no, viene elaborata la condizione2: se la condizione2 è verificata, allora viene eseguita l'istruzione 3, altrimenti viene eseguita l'istruzione4. Ovviamente possiamo avere più if-else in cascata.

if-else annidati (o nested)

Possiamo avere if o if-else dentro altri if

if(condizione1) {
  if(condizione2) {
    istruzione1
    istruzione1
  }
}
else {
  istruzione3
}

oppure:

if(condizione1) {
  if(condizione2) {
    istruzione1
    istruzione2
  }
  else {
    istruzione3
  }
}
else {
  istruzione4
}

Domanda: Nell'esercizio precedente, cosa succede se inserisco in input un carattere diverso da + e -? Perché?

Esercitazione: Dati un simbolo tra +, -, *, / e 2 numeri interi a e b, restituire la somma, differenza, prodotto o divisione tra a e b a seconda del simbolo dato in input. Inoltre se il risultato è pari ed è maggiore o uguale di 6, stampare il messaggio "risultato pari o maggiore di 6", se invece il risultato è pari ma minore di 6 stampare: "risultato minore di 6". Se è dispari, stampare: "risultato dispari".

Nota 4: La condizione per sapere se un numero è pari è questa: if(risultato % 2 == 0), dove l'operatore % è chiamato operatore modulo e il risultato indica il resto della divisione. Quindi (risultato % 2 == 0) significa "se il resto della divisione tra risultato e 2 è zero, allora... (un numero diviso 2 ha resto 0 se è pari).
Nota 5: Spesso "restituire in output" viene anche detto "stampare".