JAVA ΕΝΟΤΗΤΑ 22 – ACCEPTING INPUT BY USING THE SCANNER CLASS

 

Δωρεάν μαθήματα Java

ΕΙΣΑΓΩΓΗ

Στο σημερινό δωρεάν μάθημα Java θα δούμε πως μπορούμε να χρησιμοποιήσουμε την Scanner κλάση που μας προσφέρει η Java για να εισάγουμε τιμές στο πρόγραμμα μας ενώ αυτό εκτελείται.

Τα παραδείγματα που έχουμε δει μέχρι τώρα περιέχουν τιμές που είναι ήδη ορισμένες μέσα στον κώδικα. Τις περισσότερες φορές όμως, επιθυμούμε να έχουμε τη δυνατότητα να περνάμε εμείς τις τιμές στο πρόγραμμα μας τη στιγμή που ήδη είναι σε εκτέλεση. Αυτή η διαδικασία συνήθως γίνεται με την εμφάνιση κάποιου μηνύματος στην οθόνη (ή terminal) που μας ζητάει να εισάγουμε ένα είδος τιμής. Φυσικά όλες οι μοντέρνες εφαρμογές παρουσιάζουν στην οθόνη του χρήστη κάποιο είδος φόρμας για να εισάγει δεδομένα. Στα δικά μας παραδείγματα θα χρησιμοποιήσουμε το cmd terminal των Windows.

SCANNER CLASS

 Μέχρι τώρα έχουμε χρησιμοποιήσει την System.out.println( ) για να δείξουμε στο τελικό χρήστη μηνύματα που σχετίζονται με την εφαρμογή μας. Γράφοντας System.out στην ουσία ζητάμε να δείξουμε το μήνυμα μας στο default output που είναι το terminal των Windows. Υπάρχει και το αντίστοιχο System.in το οποίο δέχεται δεδομένα από τη default input συσκευή του υπολογιστή που είναι το πληκτρολόγιο. Το System.in όμως δεν είναι καθόλου εύχρηστο γιατί διαβάζει μόνο δεδομένα σε μορφή bytes. Εμείς όμως επιθυμούμε να έχουμε τη δυνατότητα να περάσουμε στο πρόγραμμα μας τιμές που ανήκουν σε data types που ήδη γνωρίζουμε όπως double, int, char κτλ.

Ευτυχώς οι μηχανικοί της Java είδαν αυτή την δυσκολία και δημιούργησαν μια καινούργια κλάση με το όνομα Scanner για να μας δώσουν ένα πιο ευέλικτο τρόπο εισαγωγής δεδομένων σε ένα java πρόγραμμα που ήδη εκτελείται.

Αφού η Scanner είναι κλάση, θα πρέπει να δημιουργήσουμε ένα αντικείμενο από αυτή ώστε να έχουμε πρόσβαση στις μεθόδους που μας προσφέρει. Επίσης, όπως ήδη γνωρίζουμε, κάθε κλάση μας προσφέρει τουλάχιστον ένα default no-argument constructor. Η Scanner κλάση προσφέρει αρκετούς διαφορετικούς constructors ανάλογα από πού θέλετε να διαβάσετε τα input στοιχεία – για παράδειγμα από το πληκτρολόγιο ή από ένα αρχείο. Για να δείτε τη λίστα με τους constructors της Scanner όπως και τις μεθόδους της δεν έχετε παρά να πάτε στο επίσημο site της Oracle.

Scanner Class Documentation


Εμείς επιλέγουμε να χρησιμοποιήσουμε το constructor που δέχεται InputStream αντικείμενο σαν μεταβλητή. Ποιο αντικείμενο γνωρίζουμε που μπορούμε να περάσουμε άμεσα στο constructor της Scanner και έχει σαν default input το πληκτρολόγιο? Μα φυσικά το System.in. Οπότε για να δημιουργήσουμε ένα αντικείμενο από τη Scanner που διαβάζει τιμές από το πληκτρολόγιο γράφουμε τον εξής κώδικα:

Scanner input = new Scanner(System.in);

Η λίστα με τις μεθόδους που είναι διαθέσιμοι για το αντικείμενο input που μόλις δημιουργήσαμε είναι αρκετά μεγάλη. Μπορείτε άλλωστε να το επιβεβαιώσετε αυτό αν κοιτάξετε το documentation.


Γιατί όμως υπάρχουν τόσες πολλές μέθοδοι? Η απάντηση είναι γιατί η Java απαιτεί από εμάς, κατά την εισαγωγή των στοιχείων, να γνωρίζουμε ήδη το data type των τιμών που εισάγουμε στο πρόγραμμα. Με αυτό τον τρόπο αποφεύγουμε τυχόν λάθη αλλά και άσκοπες μετατροπές μέσα στο κώδικα μας.

Πως ακριβώς χρησιμοποιούμε τις μεθόδους της Scanner? Για αρχή, θα πρέπει να γράψουμε ένα μήνυμα στο τελικό χρήστη για να γνωρίζει τι ακριβώς θα πρέπει να εισάγει στο πρόγραμμα. Αμέσως μετά καλούμε μια από τις μεθόδους του αντικειμένου που έχουμε δημιουργήσει. Το αποτέλεσμα το αναθέτουμε σε μια καινούργια μεταβλητή ίδιου data type με εκείνο που επιστρέφει η μέθοδο της Scanner που χρησιμοποιήσαμε. Για παράδειγμα, για να ζητήσουμε το όνομα του χρήστη θα μπορούσαμε να γράψουμε:

System.out.print(“What is your name? “);

String name = input.nextLine();

Όπως ήδη αναφέραμε, ο λόγος ύπαρξης τόσων πολλών μεθόδων είναι γιατί θα πρέπει να καλύψουμε όλα τα πιθανά data type που μπορεί να εισάγει ο τελικός χρήστης. Στο παραπάνω παράδειγμα, η μέθοδο nextLine( ) διαβάζει και δέχεται String σαν input.

Με την ίδια λογική, θα μπορούσαμε να δεχτούμε και μια int τιμή σαν input. Αν κοιτάξετε το documentation θα δείτε ότι αυτό μπορεί να γίνει αν καλέσουμε τη μέθοδο nextInt( ). Για παράδειγμα:

System.out.print(“How old are you? “);

int age = input.nextInt( );

COMPLETE EXAMPLE USING SCANNER

Πριν δούμε ένα απλό παράδειγμα, πρέπει να αναφέρουμε ότι θα πρέπει να κάνουμε import την κλάση Scanner από το πακέτο java.util αφού η Java δεν την περιέχει μέσα στις κλάσεις που φορτώνει αυτόματα όταν δημιουργούμε ένα πρόγραμμα. Οι default κλάσεις που φορτώνει η Java περιέχονται μέσα στο πακέτο java.lang. Οποιαδήποτε κλάση που δεν υπάρχει σε αυτό το πακέτο πρέπει να τη δηλώσουμε εμείς πριν τη χρησιμοποιήσουμε στο κώδικα μας.

TaxCalculator.java

package com.example;

import java.util.Scanner;

public class TaxCalculator {

    public static void main(String[] args) {
        double RATE1 = 0.10;
        double RATE2 = 0.25;
        double RATE1_SINGLE_LIMIT = 32000;
        double RATE1_MARRIED_LIMIT = 64000;

        double tax1 = 0;
        double tax2 = 0;

        Scanner in = new Scanner(System.in);
        System.out.print("Please enter your income: ");
        double income = in.nextDouble();

        System.out.print("Please enter s for single, m for married: ");
        String maritalStatus = in.next();

        if (maritalStatus.equals("s")) {
            if (income <= RATE1_SINGLE_LIMIT) {
                tax1 = RATE1 * income;
            } else {
                tax1 = RATE1 * RATE1_SINGLE_LIMIT;
                tax2 = RATE2 * (income - RATE1_SINGLE_LIMIT);
            }
        } else {
            if (income <= RATE1_MARRIED_LIMIT) {
                tax1 = RATE1 * income;
            } else {
                tax1 = RATE1 * RATE1_MARRIED_LIMIT;
                tax2 = RATE2 * (income - RATE1_MARRIED_LIMIT);
            }
        }

        double totalTax = tax1 + tax2;

        System.out.println("The tax is $" + totalTax);
    }
}

Output

Please enter your income: 35000

Please enter s for single, m for married: s

The tax is $3950.0

Στην αρχή του προγράμματος, ανάμεσα στον ορισμό του package και της class, θα δείτε ότι κάνουμε import τη κλάση Scanner για να μπορεί να αναγνωριστεί σωστά ο ορισμός της όταν την χρησιμοποιήσουμε μέσα στο κώδικα μας.

Αφού ορίσαμε κάποιες συνθήκες, ζητάμε από το τελικό χρήστη να εισάγει ένα double αριθμό που αντιστοιχεί στο εισόδημα του και έναν χαρακτήρα που αντιπροσωπεύει την οικογενειακή του κατάσταση. Με βάση αυτές τις δύο πληροφορίες κάνουμε κάποιους απλούς υπολογισμούς για να υπολογίσουμε ποιος θα είναι ο τελικός φόρος για το συγκεκριμένο εισόδημα.

Αν ποτέ χρειαστεί να ζητήσετε από το χρήστη να εισάγει κάποιο password τότε η Scanner δεν είναι η πιο κατάλληλη κλάση για αυτό το σκοπό γιατί δεν κρύβει τους χαρακτήρες που τυπώνει η χρήστης. Για αυτό το συγκεκριμένο σκοπό υπάρχει μια άλλη κλάση που ονομάζεται Console και θα μπορούσατε να την χρησιμοποιήσετε κάπως έτσι:

Console cons = System.console();

String username = cons.readLine(“User name:”);

char[] passwd = cons.readPassword(“Password:”);

 Για λόγους ασφάλειας των δεδομένων, η readPassword( ) επιστρέφει ένα array από χαρακτήρες και όχι ένα String. Θα ήταν λοιπόν συνετό όταν επεξεργαστείτε το password μέσα στο κώδικα σας, να γυρίσετε πίσω και να γεμίσετε τον array με τυχαίες τιμές.

Μην ξεχάσετε να κάνετε ένα μικρό donation έτσι ώστε αυτό το blog να μεγαλώσει ακόμα πιο πολύ και να έχει περισσότερες δυνατότητες στην online παράδοση δωρεάν μαθημάτων.

full-width

Post a Comment

0 Comments