enter year: 2020
2020 is a leap year? true
enter year: 2021
2021 is a leap year? false
enter year: 0
0 is a leap year? true
כמו שניתן לשים לב, עטפנו את התוכנית שלנו עם while
while (year!=0) {...}
שים לב שמנו את Scanner בחוץ ככה לא נצטרך פעם לייצר משתנה חדש כל פעם. בנוסף גם הסגירה שלו בחוץ
תרגילים: המרות
מה יהיה הפלט?
publicclassMain {publicstaticvoidmain(String[] args) {int x =8, y =13;double d = y/x;System.out.println("y/x = "+d); d = (double)y/x;System.out.println("y/x = "+d);double a =5, b =18;int c = (int)(a/b);System.out.println("a/b = "+c); }}
y/x = 1.0
y/x = 1.625
a/b = 0
שאלו את עצמכם למה ההדפסה הראשונה יוצא 1.0 🤔
מה יהיה הפלט?
publicclassMain {publicstaticvoidmain(String[] args) {double num =123.45687;System.out.println((int)(num *100) /100.0); }}
123.45
מה יהיה הפלט?
publicclassMain {publicstaticvoidmain(String[] args) {float x = (float)1.0, y =3.0f, z=99;System.out.println(x/y);System.out.println(z); }}
0.33333334
99.0
כאן הכזרנו על 3 משתני float
לולי היינו עושים ככה הקוד לא מתקפל
float x = (float)1.0, y =3.0, z=99;
לא היה מתקפל כי ה y היה double. לזה קוראים compilation error
Runtime Error
publicclassMain {publicstaticvoidmain(String[] args) {System.out.println("Integer.MAX_VALUE = "+Integer.MAX_VALUE);System.out.println("Integer.MIN_VALUE = "+Integer.MIN_VALUE);System.out.println("Integer.SIZE = "+Integer.SIZE);int x =Integer.MAX_VALUE+1;System.out.println("Integer.MAX_VALUE + 1 = "+x);int a =0, b=10, z; z = b/a;System.out.println("b/a = "+z); }}
Integer.MAX_VALUE = 2147483647
Integer.MIN_VALUE = -2147483648
Integer.SIZE = 32
Integer.MAX_VALUE + 1 = -2147483648
Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.company.Main.main(Main.java:11)
מאוחר יותר נלמד על try וcatch שיעזרו לנו להתמודד עם שגיאות
תרגיל
כתבו אם מספר הוא int, short or long
importjava.util.Scanner;publicclassMain {publicstaticvoidmain(String[] args) {System.out.print("Enter an integer: ");Scanner scanner =newScanner(System.in);int n =scanner.nextInt();if (Short.MAX_VALUE>=n &&Short.MIN_VALUE<=n)System.out.println("n is a: short");elseif (Integer.MAX_VALUE>=n &&Integer.MIN_VALUE<=n)System.out.println("n is an: int");elseif (Long.MAX_VALUE>=n &&Long.MIN_VALUE<=n)System.out.println("n is a: long"); }}
Enter an integer: 100000
n is an: int
מספר שלם עובד לנו, אבל מה קורה במספר ממשי
Enter an integer: 10.5
Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at com.company.Main.main(Main.java:8)
קיבלנו Runtime error
על הדרך בא נוסיף גם while ככה שכל עוד הקלט אינו 0 הוא ימשיך לבקש
importjava.util.Scanner;publicclassMain {publicstaticvoidmain(String[] args) {System.out.print("Enter a number: ");Scanner scanner =newScanner(System.in);double n =scanner.nextDouble();while (n!=0.) {if (Short.MAX_VALUE>= n &&Short.MIN_VALUE<= n && n %1==0.) {System.out.println(n +" can fit in a: ");System.out.println("* short\n* int\n* long\n"); } elseif (Integer.MAX_VALUE>= n &&Integer.MIN_VALUE<= n && n %1==0.) {System.out.println(n +" can fit in a: ");System.out.println("* int\n* long\n"); } elseif (Long.MAX_VALUE>= n &&Long.MIN_VALUE<= n && n %1==0.)System.out.println(n +" can fit in a: \n* long\n"); else if ((Float.MAX_VALUE >= n && Float.MIN_VALUE <= n) || (Double.MAX_VALUE >= n && Double.MIN_VALUE <= n))
System.out.println("n is either a: float, double\n");//receive next inputSystem.out.print("Enter a number: "); n =scanner.nextDouble(); }scanner.close(); }}
Enter a number: 10.5
n is either a: float, double
Enter a number: 1000000
1000000.0 can fit in a:
* int
* long
Enter a number: 0
גם היינו יכול לעשות && ((short) n) == n ו ((int) n) == n בתנאי