String, Math e Scanner
Corso di Programmazione
Laurea in Informatica per il Management – A.A. 2024/25
Prof. Roberto Amadini
String, Math e Scanner
• In questo modulo vedremo alcune classi che ci saranno
molto utili:
– String
– Math
– Scanner
• …Senza approfondire troppo il significato di “classe”
– Per ora, pensate ad una classe come a un
contenitore di dati (variabili) e operazioni (metodi)
– Oggetto = elemento o istanza di una certa classe
(stessi metodi, dati possibilmente diversi)
Stringhe
• Una stringa di lunghezza k è una sequenza di k ≥ 0
caratteri consecutivi
– La stringa vuota ha lunghezza 0
• In Java ogni carattere è memorizzato internamente come
un 16-bit Unicode character
• Ogni carattere della stringa ha un indice associato,
corrispondente alla sua posizione nella stringa
– Gli indici partono da 0
String
• La classe String di Java permette di creare stringhe
immutabili
– Una volta create non possono essere modificate
– Non sono costanti: possono essere sovrascritte
• Le costanti di stringa (literals) sono sequenze di
caratteri delimitate da doppi apici, ad es. “Hello”
– Stringa vuota: “”
H e l l o
0 1 2 3 4
• Gli indici vanno da 0 a n-1
dove n è la lunghezza della stringa
Concatenazione
• L’operazione più comune fra stringhe è probabilmente la
concatenazione (operazione binaria infissa)
– “appendo” una stringa alla fine di un’altra
• In Java per concatenare stringhe si usa l’operatore +
– Overloading: il simbolo + è usato anche per la somma
• Attenzione: se in a+b un’espressione fra a e b è di tipo
stringa, l’altra viene convertita in stringa, se necessario
– Es. il numero 42 viene convertito nella stringa “42”
Esempio
String first = "William";
String middle = "James";
String last = "Duncan";
String fullName =
first + " " + middle + " " +
last;
fullname diventa "William James Duncan"
Quante stringhe ci sono in questo programma?
Esempio
"The sum of " + x + " and " +
y + " is " + x + y
Se x è il numero 3 e y è il numero 4, la stringa diventa:
"The sum of 3 and 4 is 34"
Perchè?
Davvero voglio
questo?
Esempio
"The sum of " + x + " and " +
y + " is " + x + y
Se x è il numero 3 e y è il numero 4, la stringa diventa:
"The sum of 3 and 4 is 34"
perchè almeno un operando della concatenazione è
una stringa: il numero 3 viene convertito implicitamente
nella stringa “3” e il numero 4 nella stringa “4” quindi
x + y è la concatenazione di “3” e “4”, cioè “34”
Esempio
"The sum of " + x + " and " +
y + " is " + (x + y)
Se x è il numero 3 e y è il numero 4, la stringa diventa:
"The sum of 3 and 4 is 7"
perchè prima viene effettuata la somma tra x e y, e
poi il risultato (7) viene convertito nella stringa “7”
Da numeri a stringhe
• La conversione numero→ stringa è implicita se almeno
un operando dell’operazione + è una stringa
– Possiamo comunque farlo esplicitamente, es.
int age = 34;
float area = 2.24;
String s1 = age + “”, s2 = “” + area;
• Attenzione! Conversioni di questo tipo:
String s1 = (String) age;
non sono sintatticamente corrette! error: incompatible
types: int cannot be converted to String
Operazioni su stringhe
• Vediamo ora una panoramica delle operazioni più
comuni offerte classe String
– Più precisamente, vedremo metodi di String
• Metodo = operazione offerta da una certa classe
• Invocare un metodo = richiamare una certa operazione
• Abbiamo già invocato il metodo println
[Link](“Hello, world”)
• Quali altre operazioni hanno senso sulle stringhe?
Lunghezza e Selezione
• int length()
• Ritorna la lunghezza di una stringa, es.
String name = "Harry";
– int len = [Link](); // len = 5
• char charAt(int i)
• Ritorna il carattere in posizione i, es.
String s = "Hello";
chat c = [Link](1); // c = ‘e’
Lunghezza e Selezione
int length()
Tipo di Nome del Parametri del
ritorno metodo metodo
Attenzione!!! charAt ritorna
char charAt(int i) un carattere della stringa, ma
non può essere utilizzato per
modificare un carattere della
stringa: gli oggetti di tipo String
sono immutabili
Attenzione!
String s = “hello”; // Ok
s = s + “ world”; // Ok
char c = s[2]; // Non compila
[Link](0) = ‘H’; // Non compila
char d = “foo”.charAt(3); // Compila ma...
• Esistono classi come StringBuilder che permettono
l’implementazione di stringhe mutabili
– La vedremo più avanti nel corso…
Altre operazioni
• String substring(int i)
– Ritorna la sottostringa dall’indice i fino a fine stringa
• String substring(int i, int j)
– Ritorna la sottostringa tra gli indici i e j-1
• String trim()
– Rimuove i whitespaces a inizio e fine stringa
• String toLowerCase()
– Converte tutti i caratteri in minuscolo
• String toUpperCase()
– Converte tutti i caratteri in maiuscolo
Esempio
int d = 531452;
[Link](sd);
String sd = "" + d;
int len = [Link]();
sd = "$" + [Link](0,len-3)
+ "," + [Link](len-3);
[Link](sd);
sd += "\t\tdollars\n\n\n";
[Link](sd); Cosa stampa?
sd = [Link]();
[Link]([Link]());
Esempio
> javac [Link]
Process javac exited with code 0
> java HelloPrinter
$531,452
$531,452 dollars
$531,452 DOLLARS
Process java exited with code 0
Esempio
> javac [Link]
Process javac exited with code 0
> java HelloPrinter
$531,452
$531,452 dollars
\t\t
\n\n\n
\t\t
$531,452 DOLLARS
Process java exited with code 0
Sequenze di Escape
• Java usa le sequenze di escape per stampare alcuni
caratteri speciali, ad es.
\n newline
\t tab
\\ backslash (per stampare \)
\" double quote (per stampare ")
\' single quote (per stampare ')
…
• Attenzione! Sono memorizzati come singoli caratteri,
non doppi (es. ASCII(‘\t’) = 9, ASCII(‘\n’) = 10, …)
Esempio
[Link]("Person\tHeight\tShoe size");
[Link]("=========================");
[Link]("Hannah\t5'1\"\t7");
[Link]("Jenna\t5'10\"\t9");
[Link]("JJ\t\t6'1\"\t14");
Provate!
Person Height Shoe size
==================
Hannah 5'1" 7
Jenna 5'10“ 9
JJ 6'1“ 14
Ricerca
• Un’altra operazione molto comune è la ricerca di una
certa stringa “pattern” in un’altra stringa “target”, es.
• int indexOf(char c)
– Ritorna l’indice della prima occorrenza del carattere
c a partire dall’inizio della stringa (cioè dall’indice 0)
• int indexOf(char c)
– Come sopra, ma a partire dall’indice i
• int indexOf(String s)
• int indexOf(String s, int i)
– Come sopra, ma il pattern è una stringa s
Esempio
String target = "This is the target string";
[Link](‘u’) /* Ritorna -1: il
carattere ‘u’ non occorre in target */
[Link](”the”) /* Ritorna 8: il primo
pattern ”the” comincia all’indice 8 */
[Link](”target”, 13) /* Ritorna -1,
eppure la sottostringa ”target” è presente…
perché? */
Print e Println
• I metodi print e println hanno diverse “versioni”
– print(int n)
– print(double d)
– print(String s)
– println(int n)
– println(double d)
– println(String s)
– println()
• La differenza è che println “va a capo” dopo la
stampa
Esempio
[Link]("Person\tHeight\tShoe size\n");
[Link]("=========================\n");
[Link]("Hannah\t5'1\"\t7\n");
[Link]("Jenna\t5'10\"\t9\n");
[Link]("JJ\t\t6'1\"\t14\n");
Provate!
Person Height Shoe size
==================
Hannah 5'1" 7
Jenna 5'10“ 9
JJ 6'1“ 14
La Classe Math
Corso di Programmazione
Laurea in Informatica per il Management – A.A. 2024/25
Prof. Roberto Amadini
Math
• La classe Math fornisce diverse operazioni matematiche
avanzate, ad es.
– [Link](x) radice quadrata di x
– [Link](x) arrotonda x al long più vicino
– [Link](x,y) calcola x elevato ad y
– [Link](x) seno di x in radianti
– [Link](x) coseno di x in radianti
– [Link](x) tangente di x in radianti
– [Link](x) funzione esponenziale ex
– [Link](x) logaritmo naturale
– ...
Round
• Per arrotondare un valore double all’intero più vicino
si può usare [Link]
• [Link] ritorna un long: se vogliamo un int serve
un cast, ad es.
int i = (int) [Link](3.7) // i = 4
double x = 2.1;
int j = (int) [Link](x); // j = 2
Round
• Se x è una variabile double, con:
[Link](x * 100) / 100.0
si arrotonda x a 2 cifre decimali
– Es. x = 123.456 → [Link](x * 100) /
100.0 = [Link](12345.6) / 100.0 =
12346 / 100.0 = 123.46
– Provate!
• E se volessimo arrotondare a k cifre decimali?
Random
• [Link]() restituisce un numero double
(pseudo-)casuale nell’intervallo [0.0, 1.0)
• E.g. x = [Link]() assegna ad x un valore
casuale tra 0.0 (incluso) e 1.0 (escluso)
– Ogni volta che rieseguo l’assegnamento il valore di x
sarà (probabilmente...) differente
– Scrivete un programma Java con una sola istruzione:
[Link]([Link]())
– ...ed eseguitelo più volte, senza ricompilarlo
Random
• Per generare un intero casuale, basta fare il cast
– (int)([Link]() * 10) genera un intero
casuale tra 0 e 9
– (int)([Link]() * 5 + 2) genera un
intero casuale tra 2 e 6
• In generale, (int)(a + [Link]() * b)
genera un intero casuale tra a e a+b-1
– Quindi, per generare un intero casuale in [a..b] posso
fare (int)(a + [Link]()*(b – a + 1))
Random
• Si possono usare anche metodi della classe Random,
che per ora non vediamo
La Classe Scanner
Corso di Programmazione
Laurea in Informatica per il Management – A.A. 2024/25
Prof. Roberto Amadini
Scanner
• Così come esiste [Link]() per l’output,
esiste [Link]() per l’input
– Non è il massimo: legge un solo byte (compresi
whitespaces) e ne restituisce il codice ASCII
• La classe Scanner permette invece permette di leggere
input di tipo diverso da sorgenti diverse
– Per ora, consideriamo solo la tastiera (std input) che
di default corrisponde in java a [Link]
Scanner
• Per poter usare oggetti di tipo Scanner, va sempre
inserita questa riga a inizio programma:
import [Link];
• Per creare un oggetto Scanner per leggere da tastiera:
Scanner scan = new Scanner([Link]);
• Una volta creato, possiamo utilizzarne i metodi per
leggere dati di diverso tipo da tastiera, ad es.
String answer = [Link]();
next e nextLine
• Il metodo nextLine legge una stringa (anche gli spazi)
finchè non si digita INVIO e ritorna quanto letto
– Esercizio: scrivere un programma [Link] che
“faccia l’eco”, cioè legga una stringa da tastiera e poi
la stampi a video così com’è
• Attenzione! il metodo next() è simile ma diverso!
– nextLine legge fino a una newline (‘\n’)
– next legge fino a un whitespace (spazi, tab, new
line..) e ritorna la stringa letta (token), whitespace
escluso
next*
• Ce n’è per tutti i tipi:
– boolean nextBoolean()
– byte nextByte()
– short nextShort()
– int nextInt()
– long nextLong()
– float nextFloat()
– double nextDouble()
– char nextChar() NON ESISTE!
useLocale
• Per leggeri numeri con la virgola, si possono usare
nextFloat o nextDouble
• Se avete settato il vostro PC in italiano, è possibile che
dobbiate scrivere il numero con la “,” e non con il “.”
– Es: 1,4 invece di 1.4
• Se volete usare il punto invece della virgola:
– Usate import [Link].*; invece di import
[Link];
– Se scan è l’oggetto Scanner, scrivete l’istruzione:
[Link]([Link]);
Esempio
import [Link].*;
…
Scanner scan = new Scanner ([Link]);
[Link]([Link]);
double base, altezza, area;
[Link]("Inserisci la base: ");
base = [Link]();
altezza = 12.0;
area = base * altezza / 2;
[Link]("area = " + area);
Provate!