1
2/*
3
4 Questo codice visualizza un numero di termini n, inserito da utente, della successione di Fibonacci.
5 Viene gestita la validazione dell'input:
6 – controllo del tipo n (input non intero o overflow);
7 – controllo del valore n (intero positivo);
8 – controllo del limite massimo di termini (n ≤ 93 per evitare overflow del tipo long sul termine n-esimo);
9 – gestione del buffer di input (System.in) in caso di errore.
10
11 Autore: Alessio Severi
12 Licenza: MIT License
13
14 MIT License
15
16 Copyright (c) 2025 Alessio Severi
17
18 Permission is hereby granted, free of charge, to any person obtaining a copy
19 of this software and associated documentation files (the "Software"), to deal
20 in the Software without restriction, including without limitation the rights
21 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
22 copies of the Software, and to permit persons to whom the Software is
23 furnished to do so, subject to the following conditions:
24
25 The above copyright notice and this permission notice shall be included in all
26 copies or substantial portions of the Software.
27
28 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
29 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
30 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
31 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
32 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
33 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
34 SOFTWARE.
35
36*/
37
38
39// File Fibonacci.java
40
41
42import java.util.Scanner;
43
44public class Fibonacci {
45
46 public static void main(String[] args) {
47
48 // dichiarazione variabili nel main e inizzializzate ove necessario
49 int n;
50 int count_flag= 0;
51 int flag_error= 0;
52 long temp, i1= 0, i2= 1;
53
54
55 // creazione dell'oggetto, istanza della classe Scanner
56 Scanner sc= new Scanner(System.in); // warning: da convertire a try-with-resources (verrà trattato nelle lezioni successive)
57 // in tale programma la chiusura dello stream sottostante: System.in, viene gestita manualmente
58
59
60 // descrizione programma
61 System.out.println("\n\nQuesto programma visualizza un numero di termini n (max 93), inserito da utente, della successione di Fibonacci.\n\n");
62
63
64
65 // messaggio descrittivo per l'utente per l'immissione dell'input
66 System.out.print("Inserire un numero intero positivo n: ");
67
68
69 // validazione dell'input n, scelto dall'utente
70 do{
71
72 // gestione della validazione errata e avvisi
73 while( (flag_error== 1) || (flag_error== 2)){
74
75 // messaggio all'utente, ps il codice Unicode per l'insieme dei numeri naturali è 2115, mentre 2208 è il codice Unicode per il simbolo di Peano.
76 // (java non supporta il LaTex)
77 System.out.println("\nAttenzione: input non valido, è necessario inserire un numero naturale n \u2208 \u2115 (convenzione di Bourbaki: \u2115 = {1, 2, 3 …}).");
78 System.out.println(String.format("Hai ancora %d tentativi.", 4-count_flag));
79
80 // messaggio descrittivo per l'utente per l'immissione dell'input
81 System.out.print("Rinserisci un numero, intero positivo, n che sia valido: ");
82
83
84 // svuoto il buffer, se non ho un numero negativo o nullo, riempito dall'input, poiuchè il token viene validato.
85 // sc.nextLine(); restitituisce true se il buffer contiene almeno un token disponibile
86 if (flag_error== 1) sc.nextLine();
87
88
89 // conteggio dei tentativi falliti nella validazione dell'input
90 count_flag++;
91
92 // controllo il numero di tentativi falliti (sono accettati max 5 tentativi)
93 if(count_flag == 5){
94
95 // avviso che sono finiti il numero massimo di tentativi per validare l'input
96 System.out.print("\n\n\nErrore: il numero massimo di tentativi per validare l'input sono finiti, input non validato.\n\n\n");
97
98 // chiusura dello stream sottostante: System.in, ossia libero la risorsa associata allo Scanner
99 sc.close();
100
101 // il programma termina (con buffer svuotato)
102 return;
103 }
104
105 flag_error= 0; // resetto il flag che segnala "errore sull'input" prima di rivalutare l'input
106
107 }
108
109 // controllo del tipo di input (parte 1)
110 if(!sc.hasNextInt()){
111 flag_error = 1; // errore 1: errore di tipo (l'input non è un numero intero: per esempio è una lettera, un carattere speciale, un emoji ecc…)
112 // oppure ho un overflow → fa eseguire il while
113
114 continue; // salta l'esecuzione di sc.nextInt(), poiché prima va svuotato il buffer
115 // → lo svuotamento verrà eseguito nel blocco while, che gestisce l'errore
116 }
117
118 // immissione dell'input dall'utente
119 n= sc.nextInt();
120
121
122 // controllo del tipo di input (parte 2)
123 if (n > 0){
124 if (n > 93) {
125 System.out.println("\nAttenzione: per evitare overflow sul termine n-esimo, n è stato limitato a 93.\n");
126 n = 93;
127 }
128 break; // input valido
129 }
130 else flag_error = 2; // errore 2: errore di valore (intero ≤ 0) → fa eseguire il while
131
132 }while (true);
133
134
135
136
137
138 if(n>=1){
139 // inizio scrittura della successione di Fibonacci con immissione del primo termine (se n>=1)
140 System.out.print(String.format("\nSuccessione di Fibonacci\n\n\t%d, ", i1));
141
142
143 if(n>=2){
144
145 // continuo la scrittura della successione di Fibonacci con immissione del secondo termine (se n>=2)
146 System.out.print(i2 +", ");
147
148 // concludo la successione di fibonacci fino al termine n-esimo se n>=3
149 if(n>=3) for(int i=3; i<=n; ++i ){
150
151 temp= i2;
152 i2= i1 + i2;
153 i1= temp;
154
155 System.out.print(i2);
156 if(i<n) System.out.print(", ");
157
158 }
159
160 }
161
162 }
163
164 // abbellimento tipografico (successione divergente positivamente)
165 System.out.print(" …");
166
167 // chiusura dello stream sottostante: System.in, ossia libero la risorsa associata allo Scanner
168 sc.close();
169
170 // migliora la leggibilità e l'esperienza utente
171 System.out.print("\n\n\n");
172
173 }
174}
175