יום רביעי, 8 בנובמבר 2017

קלט מהמשתמש ב Java (בדומה ל-scanf)

קלט בג'אווה:

1.
מוסיפים את המחלקה:  "java.util.Scanner"
כך:
import java.util.Scanner;

או את כל המחלקה:
import java.util.*;





2.
כותבים פעם אחת בראש הפונקציה את הקוד:
Scanner s = new Scanner(System.in);

(את המשתנה "s" אפשר להחליף בכל שם שנרצה)




3.
כל פעם שנרצה קלט מהמשתמש נשתמש ב-s:


אם נרצה מחרוזת קצרה:
(מילה בלי רווחים)
  String str1 = new String(), str2 = new String();
Scanner s = new Scanner(System.in);
System.out.println("Enter a string: ");
str1 = s.next();
System.out.println("Enter another string: ");
str2 = s.next();
System.out.println(str1+str2);



אם נרצה מחרוזת ארוכה:
(מספר מילים מופרדות ברווחים)
  String str1 = new String(), str2 = new String();
Scanner s = new Scanner(System.in);
System.out.println("Enter a string: ");
str1 = s.nextLine();
System.out.println("Enter another string: ");
str2 = s.nextLine();
System.out.println(str1+str2);




אם נרצה int:
  int x, b, c;
Scanner s = new Scanner(System.in);
System.out.println("Enter a number: ");
x=s.nextInt();
System.out.println("Enter another number: ");
b=s.nextInt();
c=x+b;
System.out.println(c);





אם נרצה double:
  double x, b, c;
Scanner s = new Scanner(System.in);
System.out.println("Enter a number: ");
x=s.nextDouble();
System.out.println("Enter another number: ");
b=s.nextDouble();
c=x+b;
System.out.println(c);






- וכך עבור כל סוג וסוג.








שימו לב:
למעט הדוגמה עם המחרוזת הארוכה, הפונקציה עוצרת את הקריאה ברווח הראשון (או בכל תו מפריד אחר, כגון tab).
אבל: מה שנכתב אחרי הרווח עדיין נשמר בבאפל הקליטה. לכן אם נפעיל שוב את הפונקציה ובאפל הקליטה לא ריק היא תקלוט מיד ממנו!
באופן הזה ניתן לקלוט כמה ערכים בבת אחת מופרדים ברווח.


  int x, b, c;
Scanner s = new Scanner(System.in);
System.out.println("Enter 2 numbers: ");
x=s.nextInt(); // נכניס קלט של שני מספרים מופרדים ברווח. המספר השני ישמר בבאפל הקליטה
b=s.nextInt(); // כעת המספר השני יקלט מבאפל הקליטה
c=x+b;
System.out.println(c);









ייתכן שנרצה לוודא שבאפל הקליטה ריק.
ניקוי באפל הקליטה:
  int x, b, c;
Scanner s = new Scanner(System.in);
System.out.println("Enter 1 number: ");
x=s.nextInt(); // גם אם נקליד הרבה מספרים מופרדים ברווח רק הראשון ישמר בזכות הניקוי
  s.nextLine(); // ניקוי הבאפל
System.out.println("Enter 1 another number: ");
  b=s.nextInt(); // קליטה חדשה
c=x+b;
System.out.println(c);











נוכל לקבוע תו/מילה אישית להפרדה במקום תו רווח:

:קלט
2 and 3 and 100 and 1000 and

  Scanner s = new Scanner(System.in).useDelimiter("\\s*and\\s*");
System.out.println("Enter 2 string, separated by \"and\"");
x = s.nextInt();
y = s.nextInt();
  z = s.nextInt();
  w = s.nextInt();
System.out.println(x+y+z+w);

:פלט
1105
החיסרון של השיטה הזו הוא שצריך להזין "and" גם בסוף הקלט.











3 תגובות:

  1. ממש עוזר!
    נועם בשתי דוגמאות הראשונות יש הבדל אחד.
    בקוד הראשון כתוב ;()str1=s.next
    בקוד השני כתוב: בדיוק כמו שבקוד הראשון רק הוספנו את המילה Line
    אני אישית הרצתי את שתי התוכניות ולא ראיתי שום הבדל בפלט.
    אשמח להסבר שלך לשמוע מה ההבדל בפועל.
    המשך חופשה נעימה!

    השבמחק
    תשובות
    1. nextLine מאפשר רווחים במשפט.
      next לא מאפשר.

      היה לנו עניין דומה בשפת C
      http://barkai-class.blogspot.co.il/2016/11/c-puts-gets.html

      gets == nextLine
      scanf == next

      מחק
    2. thanks

      הסבר קצר וברור

      מחק