JavaRush /Java blogi /Random-UZ /Java-da skaner sinfi

Java-da skaner sinfi

Guruhda nashr etilgan
Salom! Bugungi darsimiz o'zgacha bo'ladi! Bundan oldin, muammolarni hal qilish va dasturlarni yozishda algoritm oddiy edi: biz bir nechta kod yozamiz, main() usulini ishga tushiramiz , dastur undan talab qilinadigan narsani bajaradi va chiqadi. Ammo endi hamma narsa o'zgaradi! Bugun biz dastur bilan qanday qilib chinakam munosabatda bo'lishni o'rganamiz: biz uni harakatlarimizga javob berishga o'rgatamiz! Bu bilan qaerga ketayotganimizni allaqachon tushungan bo'lishingiz mumkin. Biz ushbu ma'ruzani Java tili sinflaridan biri - Skanerni batafsil tahlil qilishga bag'ishlaymiz. Agar foydalanuvchilar kiritgan ma'lumotlarni o'qish kerak bo'lsa, bu sinf foydali bo'ladi. Kodni o'rganishga o'tishdan oldin, ayting-chi, siz hech qachon skaner kabi qurilmaga duch kelganmisiz? Albatta ha. Skanerning ichki tuzilishi ancha murakkab, lekin uning ishining mohiyati juda oddiy: u foydalanuvchi unga kiritgan ma'lumotlarni (masalan, pasport yoki sug'urta polisi) o'qiydi va o'qilgan ma'lumotlarni xotirada saqlaydi (masalan, , tasvir shaklida). Shunday qilib, bugun siz o'zingizning skaneringizni yaratasiz! Albatta, u hujjatlar bilan ishlay olmaydi, lekin u matn ma'lumotlarini juda yaxshi boshqara oladi :) Ketdik!Skaner sinfi - 1

Java brauzeri sinfi

Biz bilan tanishishimiz kerak bo'lgan birinchi va eng muhim narsa - bu sinf java.util.Scanner. Uning funksionalligi juda oddiy. Haqiqiy skaner kabi, u siz ko'rsatgan manbadan ma'lumotlarni o'qiydi. Masalan, satrdan, fayldan, konsoldan. Keyin u ushbu ma'lumotni tan oladi va kerak bo'lganda uni qayta ishlaydi. Eng oddiy misol keltiramiz:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("I love you, Petra creation,\n" +
               "I love your stern, slim look,\n" +
               "Neva sovereign current,\n" +
               "Coastal granite");
       String s = scanner.nextLine();
       System.out.println(s);
   }
}
Biz skaner ob'ektini yaratdik va u uchun ma'lumotlar manbasini belgiladik (matnli satr). Usul nextLine()ma'lumotlar manbasiga kiradi (bizning to'rtburchaklar bilan matn), u erda hali o'qimagan keyingi qatorni topadi (bizning holatlarimizda, birinchi) va uni qaytaradi. Shundan so'ng biz uni konsolga chiqaramiz: Konsol chiqishi:

Люблю тебя, Peterа творенье,
Biz usuldan nextLine()bir necha marta foydalanishimiz va she'rning butun qismini chiqarishimiz mumkin:
public class Main {

   public static void main(String[] args) {

       Scanner scanner = new Scanner("I love you, Petra creation,\n" +
               "I love your stern, slim look,\n" +
               "Neva sovereign current,\n" +
               "Coastal granite");
       String s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
       s = scanner.nextLine();
       System.out.println(s);
   }
}
Har safar skanerimiz bir qadam oldinga siljiydi va keyingi qatorni o'qiydi. Dastur natijasi konsolga chiqariladi:

Люблю тебя, Peterа творенье,
Люблю твой строгий, стройный вид,
Невы державное теченье,
Береговой ее гранит
Yuqorida aytib o'tganimizdek, skaner uchun ma'lumotlar manbai nafaqat satr, balki, masalan, konsol ham bo'lishi mumkin. Biz uchun muhim yangilik: agar ilgari u yerda faqat ma'lumotlarni chiqargan bo'lsak, endi klaviaturadan ma'lumotlarni kiritamiz! Keling, Scanner sinfi yana nima qila olishini ko'rib chiqaylik :
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the number:");

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

   }
}
Usul nextInt()kiritilgan raqamni o'qiydi va qaytaradi. Bizning dasturimizda u o'zgaruvchiga qiymat berish uchun ishlatiladi number. Bu haqiqiy skanerga o'xshaydi! Dastur foydalanuvchidan istalgan raqamni qatorga kiritishni so'raydi. Foydalanuvchi buni qilgandan so'ng, dastur unga minnatdorchilik bildiradi, o'z ishining natijasini konsolda ko'rsatadi va tugaydi. Ammo bizda hali bitta jiddiy muammo bor. Foydalanuvchi xato qilishi va biror narsani noto'g'ri kiritishi mumkin. Bizning joriy dasturimiz qachon ishlamay qolishi haqida bir misol:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the number:");

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

   }
}
Raqam o‘rniga “JavaRush” qatorini kiritishga harakat qilaylik: Konsol chiqishi:
Enter the number:
JavaRush
Exception in thread "main" java.util.InputMismatchException
  at java.util.Scanner.throwFor(Scanner.java:864)
  at java.util.Scanner.next(Scanner.java:1485)
  at java.util.Scanner.nextInt(Scanner.java:2117)
  at java.util.Scanner.nextInt(Scanner.java:2076)
  at Main.main(Main.java:10)

Process finished with exit code 1
Voy, hammasi yomon -_- Bunday holatlarning oldini olish uchun foydalanuvchi kiritgan ma'lumotlarni tekshirish usulini o'ylab topishimiz kerak. Misol uchun, foydalanuvchi raqamdan boshqa narsani kiritsa, konsolda kiritilgan ma'lumotlar raqam emasligi haqida ogohlantirishni ko'rsatish yaxshi bo'lar edi va agar hamma narsa tartibda bo'lsa, tasdiqlash matnini ko'rsatish. Ammo buning uchun biz aslida "kelajakka qarashimiz" kerak - bizning oqimimizda nima bo'lishini bilib oling. Java'dagi skaner buni qila oladimi? Qanday qilib u! Va buning uchun u barcha usullar guruhiga ega: hasNextInt()- usul kiritilgan ma'lumotlarning keyingi qismi raqam yoki yo'qligini tekshiradi (mos ravishda rost yoki noto'g'ri qaytaradi). hasNextLine()— keyingi maʼlumotlarning satr ekanligini tekshiradi. hasNextByte(), hasNextShort(), hasNextLong(), hasNextFloat(), hasNextDouble()- bu usullarning barchasi boshqa ma'lumotlar turlari uchun xuddi shunday qiladi. Keling, raqamlarni o'qish uchun dasturimizni o'zgartirishga harakat qilaylik:
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the number:");

       if (sc.hasNextInt()) {
           int number = sc.nextInt();
           System.out.println("Thank you! You entered a number" + number);
       } else {
           System.out.println("Sorry, but this is clearly not a number. Restart the program and try again!");
       }

   }
}
Endi dasturimiz keyingi kiritilgan belgi raqam yoki raqam emasligini tekshiradi. Va faqat shunday bo'lsa, u tasdiqlashni ko'rsatadi. Agar kirish sinovdan o'tmasa, dastur buni sezadi va sizdan qayta urinib ko'rishingizni so'raydi. Asosan, siz Skaner ob'ekti bilan bog'lanishingiz va qanday turdagi ma'lumotlarni kutishingizni oldindan bilishingiz mumkin. “Hoy, skaner, keyin nima bo'ladi? Raqam, satr yoki boshqa narsa? Raqam? Va qaysi biri - int, short, long?” Ushbu moslashuvchanlik sizga foydalanuvchi xatti-harakatlariga qarab dasturingiz mantig'ini yaratish imkoniyatini beradi. E'tibor berishga arziydigan yana bir muhim usul - bu useDelimiter(). Bu usul siz ajratuvchi sifatida foydalanmoqchi bo'lgan qatordan o'tkaziladi. Misol uchun, biz to'satdan yapon she'riyatiga qiziqib qoldik va skaner yordamida buyuk shoir Matsuo Bashoning bir nechta haykusini o'qishga qaror qildik. Bitta bema'ni satrda uch xil misra berilgan bo'lsa ham, ularni osongina ajratib, chiroyli tarzda formatlashimiz mumkin:
public class Main {
   public static void main(String[] args) {
       Scanner scan = new Scanner("On a Bare Branch" +
               "Raven sits alone.'" +
               "Autumn evening." +
               "''***''" +
               "There's such a moon in the sky,'" +
               "Like a tree cut down at the root:'" +
               "A fresh cut turns white." +
               "''***''" +
               "How the river has overflowed!" +
               "The heron wanders on short legs,'" +
               "Knee-deep in water.");

       scan.useDelimiter("'");

       while (scan.hasNext()) {
           System.out.println(scan.next());
       }

       scan.close();
   }
}
Biz chiziq ajratuvchi sifatida Scanner sinfining useDelimeter() usulidan foydalanamiz : u kiruvchi ma'lumotlarni qismlarga bo'lish uchun javobgardir. Bizning holatda, bitta tirnoq ( "'" ) argument sifatida uzatiladi va satrlarni ajratish uchun ishlatiladi . Ushbu iqtibosdan keyingi matn yangi qatorda paydo bo'ladi, chunki while siklida biz ma'lumotlarni o'qish uchun System sinfining println() usulidan foydalanamiz . Natijada, biz kitoblardagi kabi konsolda chiroyli chiqishga ega bo'lamiz:
На голой ветке
Ворон сидит одиноко.
Осенний вечер.

*** 
 
В небе такая луна,
Словно дерево спилено под корень:
Белеет свежий срез.

*** 
 
Как разлилась река!
Цапля бредет на коротких ножках,
По колено в воде.
Xuddi shu misolda, albatta e'tibor berishingiz kerak bo'lgan yana bir usul bor - close(). I/U oqimlari bilan ishlaydigan har qanday ob'ekt singari, skaner ham kompyuterimiz resurslarini iste'mol qilmasligi uchun ishi tugagach yopilishi kerak. Usulni hech qachon unutmang close()!
public class Main {

   public static void main(String[] args) {

       Scanner sc = new Scanner(System.in);
       System.out.println("Enter the number:");

       int number = sc.nextInt();

       System.out.println("Thank you! You entered a number" + number);

       sc.close();//Now we did everything right!

   }
}
Ana xolos! Ko'rib turganingizdek, Skaner sinfidan foydalanish juda oson va juda foydali! :)
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION