Μαθαίνοντας την JAVA – Μέρος 9

Post Pic
στις 23.11.09. Kατηγορίες Java με 2 Σχόλια

Στο σημερινό βοήθημα, θα μάθουμε μια κλάση η οποία υπάρχει έτοιμη στη βιβλιοθήκη της Java. Θα χρησιμοποιήσουμε αυτή την κλάση έτσι ώστε να παίρνουμε δεδομένα από το πληκτρολόγιο του χρήστη. Επίσης, θα μάθουμε ένα νέο είδος «μεταβλητής», με την ονομασία String. Τέλος, θα δούμε παραδείγματα.

Στα παραδείγματα που έχουμε δει μέχρι σήμερα, όλες οι τιμές των μεταβλητών μας ήταν καθορισμένες από εμάς εξ αρχής στον κώδικα. Ένα τέτοιο πρόγραμμα όμως συνήθως είναι άχρηστο. Τι γίνεται στην περίπτωση που θέλουμε ο χρήστης να μας δίνει δικές του τιμές για μερικές ή και για όλες τις μεταβλητές;

Από την έκδοση 5.0 της Java, έχει συμπεριληφθεί μια ειδική κλάση με την ονομασία Scanner. Χρησιμοποιώντας αυτή την κλάση, είναι πολύ εύκολο να γράψουμε ένα πρόγραμμα στο οποίο ο χρήστης θα μπορεί να εισάγει τα δικά του δεδομένα σε αυτό χρησιμοποιώντας το πληκτρολόγιο του. Η κλάση Scanner, είναι μέρος ενός μεγαλύτερου πακέτου (περισσότερα για τα πακέτα/packages θα μάθουμε  στο μέλλον) με την ονομασία util. Για να είμαστε σε θέση να χρησιμοποιήσουμε την κλάση Scanner στο κάθε μας πρόγραμμα θα πρέπει αρχικά να πούμε στον μεταγλωττιστή πως θα την χρησιμοποιήσουμε στο πρόγραμμα μας. Αυτό γίνεται με κάποιο συγκεκριμένο τρόπο ο οποίος είναι ο εξής.

Για να «πούμε» στον μεταγλωττιστή πως θα χρησιμοποιήσουμε την κλάση Scanner η οποία βρίσκεται στο πακέτο util, τότε θα πρέπει στην αρχή του κώδικα μας να προσθέσουμε το εξής:

import java.util.*;

Με τον αστερίσκο (*) λέμε ότι όλες οι κλάσεις του συγκεκριμένου πακέτου (util) μπορεί να χρησιμοποιηθούν στον κώδικα μας, και έτσι ο μεταγλωττιστής θα τις συμπεριλάβει κατά τη διαδικασία της μεταγλώττισης. Με αυτό τον τρόπο, η κλάση Scanner και όλες οι μέθοδοι της είναι διαθέσιμες προς χρήση στο πρόγραμμα μας.

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

Αφού έχουμε εισάγει στο πρόγραμμα μας το πακέτο util, στη συνέχεια στον κώδικα μας βάζουμε στη main μέθοδο μας το εξής:

Scanner keyboard = new Scanner (System.in);

Με αυτό τον τρόπο θα δημιουργηθεί ένα νέο «αντικείμενο» της κλάσης Scanner το οποίο ονομάσαμε keyboard. Αν και ακόμη δεν είσαι σε θέση να κατανοήσεις την ακριβή έννοια της σημασίας της λέξης «αντικείμενο», όμως στο μέλλον θα μάθουμε περισσότερα. Προς το παρόν μην ανησυχεί. Αν και πιστεύω πως η ίδια η λέξη από μόνη της είναι αρκετά αντιπροσωπευτική της σημασίας της. Το System.in, που βρίσκεται στην παρένθεση, αντιπροσωπεύει το πληκτρολόγιο. Με λίγα λόγια, αυτό που βρίσκεται στην παρένθεση προσδιορίζει από πού θα εισάχθούν οι τιμές (πληκτρολόγιο, ποντίκι, οθόνη αφής, σκληρός δίσκος, κτλ). Το System.in αντιπροσωπεύει το πληκτρολόγιο, έτσι τώρα έχει δημιουργηθεί ένα νέο αντικείμενο με την ονομασία keyboard το οποίο θα παίρνει δεδομένα από το πληκτρολόγιο. Το ‘keyboard’ είναι απλά ένα όνομα, για να το ξεχωρίζουμε εύκολα στον κώδικα μας. Θα μπορούσε αντί αυτής της λέξης, να επιλέγαμε οτιδήποτε άλλο.

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

Ας υποθέσουμε πως θέλουμε να εισάγουμε από το πληκτρολόγιο του χρήστη ένα ακέραιο αριθμό και αυτή την τιμή θα την εισάγουμε σε μια μεταβλητή που έχουμε ήδη δηλωμένη με την ονομασία ‘x’. Σε αυτή την περίπτωση, θα χρησιμοποιήσουμε την μέθοδο nextInt() της κλάσης Scanner και η εντολή θα είναι η εξής:

x = keyboard.nextInt();

Σε περίπτωση που ο αριθμός που θέλουμε είναι πραγματικός, τότε θα χρησιμοποιήσουμε την εξής εντολή:

x = keyboard.nextDouble();

Σου φαίνονται περίπλοκα; Και όμως, δεν είναι τόσο δύσκολα. Για να έχουμε πρόσβαση σε κάποια μέθοδο κάποιου αντικειμένου δεν έχουμε παρά να βάλουμε πρώτα το όνομα του αντικειμένου (keyboard), και στη συνέχεια το όνομα της μεθόδου (nextDouble) αφού πρώτα τα χωρίσουμε με μια τελεία (.). Οι δύο παρενθέσεις που βρίσκονται στο τέλος υποδηλώνουν το γεγονός ότι πρόκειται για μέθοδο και μπαίνουν πάντα σε όλες τις μεθόδους.

Τι γίνεται όμως αν θέλουμε να εισάγουμε χαρακτήρα (char); Εδώ η σύνταξη είναι κάπως διαφορετική αφού δεν υπάρχει ενσωματωμένη η μέθοδος nextChar. Αντ’ αυτού τότε θα χρησιμοποιήσουμε τον εξής κώδικα:

x = keyboard.next().charAt(0);

Τι σημαίνει όλο αυτό; Δεν πρόκειται να μάθεις τώρα, αφού η εξήγηση είναι μέρος ενός μεγαλύτερου κεφαλαίου το οποίο θα μάθουμε αργότερα στο μέλλον. Για την ώρα φτάνει να ξέρεις να το χρησιμοποιείς.

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

Παράδειγμα #1

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

Λύση

Για να λύσουμε αυτό το πρόγραμμα, χρειαζόμαστε δύο μεταβλητές οι οποίες θα παίρνουν τις τιμές τις αξίας πώλησης του κάθε παγωτού και τον αριθμό των πωλήσεων. Δηλώνουμε τις μεταβλητές στην αρχή, και στη συνέχεια με αυτές τις μεθόδους που μάθαμε σήμερα, ζητάμε από τον χρήστη να μας δώσει τιμές για αυτές τις μεταβλητές. Τέλος, αφού υπολογιστεί, τυπώνουμε το τελικό αποτέλεσμα στην οθόνη του χρήστη.

Ας δούμε τον κώδικα που κάνει τα πιο πάνω:

import java.util.*; // gia na imaste se thesi na xrisimopioume tin klasi Scanner
public class example1 {
public static void main (String[] args) {
Scanner keyboard = new Scanner(System.in);  //dimiourgia tou keyboard object mas
// dilwsi metavlitwn
int sales;
double sellingPrice;
System.out.println("Poia einai i timi polisis tou kathe pagwtou? "); //tipssi erwtisis stin othoni
sellingPrice = keyboard.nextDouble(); //eisagwgi dedomenwn
System.out.println("Posa pagwta polithikan? "); //tipwsi erwtisis stin othoni
sales = keyboard.nextInt(); //eisagwgi dedomenwn
System.out.println("To kerdos eine: " + sellingPrice*sales);    //ypologismos kai ektiposi apotelesmatwn
}
}

Όπως βλέπεις τώρα, το πρόγραμμα μας είναι δυναμικό, αφού κάθε φορά ανάλογα με τις τιμές που δίνουμε θα παίρνουμε και διαφορετικά αποτελέσματα. Προσοχή τη στιγμή που θα δίνεις τιμές για την αξία του κάθε παγωτού, εάν είναι για παράδειγμα 1 ευρώ η τιμή που θα δώσεις θα είναι 1,00 ή 1 αλλά όχι 1.00. Θα πρέπει να χρησιμοποιήσεις κόμμα (,) για τα δεκαδικά αλλιώς θα πάρεις μήνυμα error.

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

image01

Strings

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

Πρόσεξες πως η λέξη String, γράφεται με κεφαλαίο S, και ο λόγος είναι γιατί οι μεταβλητές αυτού του τύπου δεδομένων δεν υποστηρίζονται εγγενώς από την Java, και στην πραγματικότητα το String δεν είναι τύπος δεδομένων αλλά μια κλάση η οποία προϋπάρχει και χρησιμοποιείτε για αυτό ακριβώς το σκοπό.

Ας δούμε λοιπόν πώς να την χρησιμοποιούμε για να δημιουργούμε μεταβλητές String, αλλά και πώς να εισάγουμε δεδομένα σε αυτήν.

Για να δηλώσουμε μια μεταβλητή αυτού του τύπου, θα το κάνουμε με το συνηθισμένο τρόπο με τη διαφορά ότι το αρχικό ‘S’ θα είναι κεφαλαίο.

Για παράδειγμα:

String onoma;

και θα της δώσουμε τιμή κάπως έτσι:

onoma = “Michel”;

Για να πάρουμε μια ακολουθία χαρακτήρων από το πληκτρολόγιο και να την βάλουμε σε μια μεταβλητή, θα χρησιμοποιήσουμε την μέθοδο next() της κλάσης Scanner. Έχε υπόψη σου όμως πως προς το παρών δεν θα πρέπει να εισάγουμε string δύο ή περισσότερων λέξεων (δηλαδή δεν πρέπει να έχουμε διαστήματα στο string μας) γιατί αυτό θα μας οδηγήσει σε error. Θα μάθουμε στο μέλλον πώς να εισάγουμε και strings τα οποία να αποτελούνται από περισσότερες λέξεις.

Για να εισάγουμε string χρησιμοποιώντας τη μέθοδο nextInt(), αυτό θα γίνει ως εξής:

onoma = keyboard.next();

Ωραία! Ας δούμε ένα παράδειγμα το οποίο περιλαμβάνει εισαγωγή τιμών σε string..

Παράδειγμα #2

Να φτιαχτεί ένα πρόγραμμα το οποίο θα ζητάει απ’ τον χρήστη να εισάγει πρώτα το επώνυμο του (να αποθηκεύεται σε μια μεταβλητή), στη συνέχεια το όνομα του (σε άλλη μεταβλητή), και τελικώς να του τυπώνει το πλήρες ονοματεπώνυμο του.

Λύση

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

Ας δούμε τώρα το δικό μου κώδικα..

import java.util.*; // gia na imaste se thesi na xrisimopioume tin klasi Scanner
public class example2 {
public static void main (String[] args){
Scanner keyboard = new Scanner(System.in);  //dimiourgia tou keyboard object mas
// dilwsi metavlitwn
String onoma;
String epwnimo;
System.out.print("Poio eine to onoma sas? "); //erwtisi pros to xristi
onoma = keyboard.next();    // eisagwgi input sti metavliti
System.out.print("Poio eine to epwnimo sas? "); //erwtisi pros to xristi
epwnimo = keyboard.next();    // eisagwgi input sti metavliti
System.out.println("Geia soy " + onoma + " " + epwnimo); //ektiposi apotelesmatos
}
}

Ας δούμε σε φωτογραφία το πρόγραμμα μας εν δράση..

image02

Ο κώδικας αυτός περιλαμβάνεται επίσης στο αρχείο που μπορείς να κατεβάσεις στο τέλος του βοηθήματος.

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

Θα τα πούμε και πάλι πολύ σύντομα.

Μπορείτε να κατεβάσετε τα αρχεία του βοηθήματος εδώ

download

Tags: , ,

MZinas { Προσωπική Ιστοσελίδα / Άρθρα Στο GreekTuts }
Ο Michel βρίσκεται στο παρα πέντε της απόκτησης Πτυχίου Πληροφορικής. Ασχολείται εδώ και χρόνια με τους υπολογιστές και διατηρεί ιστοσελίδα μέσα απο την οποία δίνει λύσεις σε βασικά προβλήματα που μπορεί να αντιμετωπίσει κάποιος χρησιμοποιώντας τους. Απο τον Σεπτέμβριο του 2009 είναι εξωτερικός συνεργάτης του GreekTuts.

2 Σχόλια στο άρθρο Μαθαίνοντας την JAVA – Μέρος 9

  • η κλαση Scanner βρισκεται στο JRE( JAVA RUNTIME ENVIROMENT) σωστα??
    δηλαδη αν δεν ηταν ετοιμη θα επρεπε να την δημιουργουσαμε εμεις.
    πως εγω μπορω να δω τι μεθοδους εχουν γενικα οι ετοιμες κλασεις??

  • thodoris says:

    Πολύ καλό! Συνέχισε έτσι!
    Όταν έτρεξα το πρόγραμμα με τα παγωτά έδωσα δεκαδική τιμή με κόμμα και μου έβγαλε λάθος. Άρα το να γράφουμε το δεκαδικό με τελεία είναι το σωστό. Γιατί εσύ λες: “Προσοχή τη στιγμή που θα δίνεις τιμές για την αξία του κάθε παγωτού, εάν είναι για παράδειγμα 1 ευρώ η τιμή που θα δώσεις θα είναι 1,00 ή 1 αλλά όχι 1.00. Θα πρέπει να χρησιμοποιήσεις κόμμα (,) για τα δεκαδικά αλλιώς θα πάρεις μήνυμα error.”

    Φτιάξε άμα μπορείς και ένα tut για την savitch.

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>