JavaRush /Блоги Java /Random-TG /Синфи сканер дар Java

Синфи сканер дар Java

Дар гурӯҳ нашр шудааст
Салом! Дарси имрӯзаи мо махсус хоҳад буд! Пеш аз ин, њангоми њалли масъалањо ва навиштани барномањо алгоритм содда буд: мо ягон code менависем, усули main() -ро ба кор меандозем , барнома он чизеро, ки аз он талаб карда мешавад, мекунад ва мебарояд. Аммо акнун ҳама чиз тағир хоҳад ёфт! Имрӯз мо меомӯзем, ки чӣ тавр бо барнома чӣ гуна муносибат карданро кунем: мо онро таълим медиҳем, ки ба амалҳои худ ҷавоб диҳанд! Шояд шумо аллакай фаҳмед, ки мо бо ин ба куҷо меравем. Мо ин лексияро ба таҳлor муфассали яке аз синфҳои забони Java - Scanner мебахшем. Ин синф муфид хоҳад буд, агар ба шумо маълумоте, ки корбарон ворид мекунанд, хонед. Пеш аз он ки мо ба омӯзиши code гузарем, ба ман бигӯед, ки оё шумо ягон бор бо чунин дастгоҳ ба мисли сканер дучор шудаед? Албатта ҳа. Сохтори дохorи сканер хеле мураккаб аст, аммо моҳияти кори он хеле содда аст: он маълумотеро, ки корбар ба он ворид мекунад (масалан, шиноснома ё полиси суғурта) мехонад ва маълумоти хондашударо дар хотира нигоҳ медорад (масалан , дар шакли тасвир). Ҳамин тавр, имрӯз шумо сканери шахсии худро эҷод мекунед! Албатта, ӯ наметавонад ҳуҷҷатҳоро идора кунад, аммо вай метавонад маълумоти матниро хеле хуб идора кунад :) Биёед!Синфи сканер - 1

Синфи сканери Java

Аввалин ва муҳимтарин чизе, ки мо бояд бо он шинос шавем, синф аст java.util.Scanner. Функсияи он хеле содда аст. Мисли сканери воқеӣ, он маълумотро аз манбаъе, ки шумо барои он нишон додаед, мехонад. Масалан, аз сатр, аз файл, аз консол. Он гоҳ ин маълумотро эътироф мекунад ва ҳангоми зарурат коркард мекунад. Оддатарин мисолро меорем:
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);
   }
}
Мо an objectи сканер офаридем ва манбаи маълумотро барои он муайян кардем (сатр бо матн). Усул nextLine()ба манбаи маълумот дастрасӣ пайдо мекунад (матни мо бо quatrains), дар он ҷо сатри навбатиеро, ки ҳанӯз нахондааст, пайдо мекунад (дар ҳолати мо, якум) ва онро бармегардонад. Пас аз он мо онро ба консол мебарорем: Натиҷаи консол:

Люблю тебя, Peterа творенье,
Мо метавонем ин усулро nextLine()якчанд маротиба истифода барем ва тамоми порчаи шеърро бароварем:
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);
   }
}
Ҳар дафъа сканери мо як қадам ба пеш меравад ва сатри навбатиро мехонад. Натиҷаи барнома ба консол бароварда мешавад:

Люблю тебя, Peterа творенье,
Люблю твой строгий, стройный вид,
Невы державное теченье,
Береговой ее гранит
Тавре ки мо аллакай гуфта будем, манбаи маълумот барои сканер метавонад на танҳо сатр, балки инчунин, масалан, консол бошад. Хабари муҳим барои мо: агар қаблан мо танҳо дар он ҷо маълумот мебарорем, ҳоло мо маълумотро аз клавиатура ворид мекунем! Биёед бубинем, ки синфи Scanner боз чӣ кор карда метавонад :
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);

   }
}
Усул nextInt()рақами воридшударо мехонад ва бармегардонад. Дар барномаи мо, он барои таъин кардани арзиш ба тағирёбанда истифода мешавад number. Ин бештар ба сканери воқеӣ монанд аст! Барнома аз корбар хоҳиш мекунад, ки ягон рақамро ба сатр ворид кунад. Пас аз он ки корбар ин корро анҷом дод, барнома ба ӯ ташаккур мегӯяд, натиҷаи кори худро дар консол нишон медиҳад ва ба итмом мерасад. Вале мо хануз як проблемаи чиддй дорем. Истифодабаранда метавонад хато кунад ва чизеро нодуруст ворид кунад. Ин як мисолест, ки кай барномаи кунунии мо корашро қатъ мекунад:
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);

   }
}
Биёед кӯшиш кунем, ки ба ҷои рақам сатри "JavaRush" -ро ворид кунем: Натиҷаи консол:
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
Оҳ, ҳама чиз бад аст -_- Барои пешгирӣ кардани чунин ҳолатҳо, мо бояд роҳи тасдиқи маълумоте, ки корбар ворид мекунад, пайдо кунем. Масалан, корбар ба ғайр аз рақам чизи дигареро ворид мекунад, хуб мебуд, ки дар консол огоҳӣ нишон дода шавад, ки маълумоти воридшуда рақам нест ва агар ҳама чиз дар тартиб бошад, матни тасдиқро намоиш диҳед. Аммо барои ин, мо воқеан бояд "ба оянда назар кунем" - бифаҳмем, ки дар ҷараёни мо чӣ аст. Оё сканер дар Java ин корро карда метавонад? Чӣ тавр ӯ метавонад! Ва барои ин он як гурӯҳи пурраи усулҳо дорад: hasNextInt()- усул месанҷад, ки қисми навбатии маълумоти воридшуда адад аст ё не (мутаносибан ҳақиқӣ ё нодурустро бармегардонад). hasNextLine()— тафтиш мекунад, ки порчаи навбатии маълумот сатр аст ё не. hasNextByte(), hasNextShort(), hasNextLong(), hasNextFloat(), hasNextDouble()- ҳамаи ин усулҳо барои дигар намудҳои додаҳо ҳамин тавр мекунанд. Биёед кӯшиш кунем, ки барномаи худро барои хондани рақамҳо тағир диҳем:
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!");
       }

   }
}
Акнун барномаи мо тафтиш мекунад, ки аломати навбатии воридшуда рақам аст ё не. Ва танҳо агар он бошад, он тасдиқро нишон медиҳад. Агар вуруд аз санҷиш нагузарад, барнома инро пай мебарад ва аз шумо хоҳиш мекунад, ки дубора кӯшиш кунед. Аслан, шумо метавонед бо an objectи Сканер муошират кунед ва пешакӣ бидонед , ки кадом намуди маълумотро интизор шудан мумкин аст. «Эй сканер, оянда чӣ мешавад? Рақам, сатр ё чизи дигар? Рақам? Ва кадомаш - int, short, long?” Ин чандирӣ ба шумо имкон медиҳад, ки мантиқи барномаи худро вобаста ба рафтори корбар созед. Боз як усули муҳиме, ки ба он диққат додан лозим аст useDelimiter(). Ин усул сатреро, ки шумо мехоҳед ҳамчун ҷудокунанда истифода баред, гузаронида мешавад. Масалан, мо ногаҳон ба шеъри ҷопонӣ шавқу рағбат пайдо кардем ва тасмим гирифтем, ки тавассути сканер чанд хайкуи шоири бузург Матсуо Башоро мутолиа кунем. Ҳатто агар се мисраи гуногун ба мо дар як сатри нофаҳмо дода шавад ҳам, мо метавонем онҳоро ба осонӣ ҷудо кунем ва онҳоро ба таври зебо формат кунем:
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();
   }
}
Мо усули useDelimeter()- и синфи Scanner- ро ҳамчун ҷудокунандаи хат истифода мебарем : он барои тақсим кардани маълумоти воридотӣ ба қисмҳо масъул аст. Дар ҳолати мо, як иқтибос ( "'" ) ҳамчун аргумент интиқол дода мешавад ва барои ҷудо кардани сатрҳо истифода мешавад . Матни пас аз ин иқтибос дар сатри нав пайдо мешавад, зеро дар даври while мо барои хондани маълумот усули println()- и синфи System -ро истифода мебарем . Дар натиҷа, мо дар консол баромади зебо хоҳем дошт, ба мисли китобҳо:
На голой ветке
Ворон сидит одиноко.
Осенний вечер.

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

*** 
 
Как разлилась река!
Цапля бредет на коротких ножках,
По колено в воде.
Дар ҳамин мисол боз як усули дигар вуҷуд дорад, ки шумо бояд бешубҳа ба он диққат диҳед - close(). Мисли ҳама гуна an objectе, ки бо ҷараёнҳои воридот ва баромад кор мекунад, сканер бояд пас аз анҷоми кори худ баста шавад, то дигар захираҳои компютери моро истеъмол накунад. Ҳеҷ гоҳ усулро фаромӯш накунед 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!

   }
}
Ҳамааш ҳамин! Тавре ки шумо мебинед, синфи Scanner барои истифода хеле осон ва хеле муфид аст! :)
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION