OOP-Lecture 8 2013

advertisement
OOP-Lecture 8
2013
Taking Input from the User
There are several ways to input values in Java. But here, we shall look at one
simple way by using the Scanner class. You may not be able to understand
every line of code that we would be writing here but still at the end, you will
know how you can take different types of input- integers, real numbers, Strings
from the user . For now, we shall look at the Scanner class.
As already said, Java has a number of predefined classes which we can use.
These classes are just like the HelloWorld and Addition classes that we have
written but they do not contain a main method. Instead, they have some
variables, constructors and some different methods. With the help of
constructors, we instantiate (create) objects from these classes. We can
create as many objects as we want from a single class and each of them have
their own set of instance variables. And, we call the methods of these objects
to perform tasks.
These predefined classes are organized in the form of packages. For now, you
can think of a package as a simple collection of classes. Before we can use
the class, we need to either import the entire package or the class. We import
the Scanner class using the following line.
import java.util.Scanner;
The import statement should be the first line in our program. And then as usual
we write the code for our class or program, similar to what we have done
earlier.
import java.util.Scanner;
public class Addition {
public static void main(String[] args) {
// some code here
}
}
Information flows as a stream just like the way water flows through a hose.
The System class which we have used contains two pre-defined streams. One
is the output stream (out) which is connected the console. We have used it in
our earlier programs to print information on the screen. The other stream is the
1
Lecturer: Hawraa Sh.
OOP-Lecture 8
2013
input stream (in) which is by default connected to the keyboard. We need to
obtain the stream and convert the information in that stream into meaningful
data like integers and Strings. The input stream object (in) is accessed by the
statement System.in 'System', as we have already said is a predefined class
and 'in' is a variable in that class which holds a reference to an input stream
object. We now use this in object to create a Scanner object. As we have
already said, to create an object from a class, we use the constructor of that
class. The constructor just like methods may require arguments. A Scanner
constructor requires an input stream object as an argument. Therefore we
pass the in object to the Scanner constructor and create a Scanner object
named s in the following way.
Scanner s = new Scanner ( System.in );
Note that s is an identifier- a variable name just like firstNumber and
secondNumber. And therforore you can give any name that you want. The
proper way to access a variable of another class (here, in) is to refer to its
name by specifying the class name followed by a dot operator and the variable
name.
The keyword new is used to create an object.
The Scanner class has several methods which are used to take different types
of inputs. They are listed in the table below.
Method
Description
nextByte()
Accept a byte
nextShort()
Accept a short
nextInt()
Accept an int
nextLong()
Accept a long
next()
Accept a single word
nextLine()
Accept a line of String
nextBoolean()
Accept a boolean
nextFloat()
Accept a float
nextDouble()
Accept a double
2
Lecturer: Hawraa Sh.
OOP-Lecture 8
2013
Suppose, we want to accept an integer and store it in the variable firstNumber,
we write the following statement:
int firstNumber = s.nextInt( );
In a similar way, we can accept other data types from the user. The following
code shows the complete program which accepts two numbers from the user
and adds them and displays the result.
import java.util.Scanner;
public class Addition {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.print("Enter first number: ");
int firstNumber = s.nextInt( );
System.out.print("Enter second number: ");
int secondNumber = s.nextInt( );
int sum = firstNumber + secondNumber;
System.out.println("The result of addition was " +
sum);
}
}
Following shows a sample output when we enter the numbers 34 and 43 as
input.
Enter first number: 34
Enter second number: 43
The result of addition was 77
In a similar way, you can take other data types as input.
Following program shows another example usage of the Scanner class. Here
we take the marks of a student in three subjects and display his average and
his average as in done a progress report.
import java.util.Scanner;
3
Lecturer: Hawraa Sh.
OOP-Lecture 8
2013
public class Average Marks {
public static void main(String[] args) {
Scanner s = new Scanner ( System.in);
System.out.print("Enter your name: ");
String name=s.next();
System.out.print("Enter marks in three subjects: ");
int marks1=s.nextInt();
int marks2=s.nextInt();
int marks3=s.nextInt();
double average = ( marks1+marks2+marks3)/3.0;
System.out.println("\nName: "+name);
System.out.println("Average: "+average);
}
}
There are a few things worth mentioning regarding this code. The first thing is
that we have taken the marks of the student in three subjects by using the
nextInt( ) method repeatedly. Following are some sample outputs.
Enter your name: Sai
Enter marks in three subjects: 100 98 99
Name: Sai
Average: 99.0
Enter your name: Sai
Enter marks in three subjects: 100
99
98
Name: Sai
Average: 99.0
Enter your name: Sai
Enter marks in three subjects:
100
4
Lecturer: Hawraa Sh.
OOP-Lecture 8
2013
99
98
Name: Sai
Average: 99.0
Enter your name: Sai
Enter marks in three subjects:
100 99
98
Name: Sai
Average: 99.0
We have given the same input in all the cases but the way in which we have
input the values was different. In the first case, we separated the different
marks with a space. In the second case, we have pressed the enter key after
entering each subject's marks. In few of the outputs, we have also entered
some blank lines but still the output was the same in all the cases. This is
because of the way in which the input from the keyboard. Whatever in entered
by us goes to the input steam, in and then we extract data from it using the
nextInt() method. What actually happens is that the data is separated into
tokens. Token are pieces of information. Tokens are not generated randomly
but by noting the delimiters. Every time, the delimiter appears, the input is split
at that point and a new token is created. The default delimiter is a whitespace.
A whitespace can be a tab, space, a new line or a combination of theses. For
example- a new line followed by three spaces is also a delimiter. After the
input is split into tokens, the tokens are accessed by the method nextInt(). In
all the cases, the three tokens formed were the same and hence we got the
same output.
Another thing has to be noted is the following statement:
double average = ( marks1 + marks2 + marks3 ) / 3.0;
5
Lecturer: Hawraa Sh.
OOP-Lecture 8
2013
The first thing is the use of parentheses. If we have omitted the parentheses,
then marks3 would have been divided by three first and then added to marks1
and marks2. Precedence of operators exists in Java just as in mathematics. In
Java /, * and % have equal preference which is higher than the preference for
+ and -.
In order to alter the order in which evaluation is performed, we use
parentheses. Change 3.0 to 3 and you will notice that the average printed
would be incorrect. This is because, the three integers marks1, marks2 and
marks3 on addition give an integer and an integer on division with another
integer gives another integer and not a floating point number. In simpler
words, an integer on division with another integer gives the quotient and not
the entire result that includes the remainder part in the form of a decimal part.
However, when the expression involves atleast a single decimal, we get the
decimal part of the calculation as well. That is why we have written 3.0 instead
of 3. We shall see more about mathematical calculations in the next chapter.
import java.util.Scanner;
public class ScannerExample {
public static void main(String[] args) {
// Initiate a new Scanner
Scanner userInputScanner = new Scanner(System.in);
// Testing nextLine();
System.out.print("\nWhat is your name? ");
String name = userInputScanner.nextLine();
// Testing nextInt();
System.out.print("How many cats do you have? ");
int numberOfCats = userInputScanner.nextInt();
// Testing nextDouble();
System.out.print("How much money is in your wallet? $");
double moneyInWallet = userInputScanner.nextDouble();
System.out.println("\nHello " + name + "! You have " +
numberOfCats
+ (numberOfCats > 1 ? " cats" : " cat")
+ " and $" + moneyInWallet + " in your wallet.\n");
}
}
6
Lecturer: Hawraa Sh.
OOP-Lecture 8
7
2013
Lecturer: Hawraa Sh.
Download