Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии 


Тема 1.11 Кoнсольный ввод с помощью класса java.util.Scanner




 

Для ввода данных используется класс Scanner из библиотеки пакетов java.util.

Этот класс надо импортировать в той программе, где он будет использоваться. Это делается до начала открытого класса в коде программы.

В классе есть методы для чтения очередного символа заданного типа со стандартного потока ввода, а также для проверки существования такого символа.

Для работы с потоком ввода необходимо создать объект класса Scanner, при создании указав, с каким потоком ввода он будет связан. Стандартный поток ввода (клавиатура) в Java представлен объектом – System.in. А стандартный поток вывода (дисплей) – уже знакомым вам объектом System.out. Есть ещё стандартный поток для вывода ошибок – System.err, но он будет рассмотрен в теме обработка исключительных ситуаций.

Листинг 1.9

import java.util.Scanner; // импортируем класс

public class ScannerDemo {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in); // создаёмобъекткласса Scanner

int i = 2;

System.out.print("Введите целое число: ");

if (sc.hasNextInt()) { // возвращает истинну если с потока ввода можно считать целое число

i = sc.nextInt(); // считывает целое число с потока ввода и сохраняем в переменную

System.out.println(i * 2);

} else {

System.out.println("Вы ввели не целое число");

}

}

}

 

Метод hasNextDouble(), применённый объекту класса Scanner, проверяет, можно ли считать с потока ввода вещественное число типа double, а метод nextDouble() – считывает его. Если попытаться считать значение без предварительной проверки, то во время исполнения программы можно получить ошибку (отладчик заранее такую ошибку не обнаружит). Например, попробуйте в представленной далее программе(листинг 1.10) ввести какое-то вещественное число

Листинг 1.10

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

double i = sc.nextDouble(); // если ввести букву s, то случится ошибка во время исполнения

System.out.println(i / 3);

}

}

Имеется также метод nextLine(), позволяющий считывать целую последовательность символов, т.е. строку, а, значит, полученное через этот метод значение нужно сохранять в объекте класса String. В следующем примере создаётся два таких объекта, потом в них поочередно записывается ввод пользователя, а далее на экран выводится одна строка, полученная объединением введённых последовательностей символов.

Листинг 1.11

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

String s1, s2;

s1 = sc.nextLine();

s2 = sc.nextLine();

System.out.println(s1 + s2);

}

}

Существует и метод hasNext(), проверяющий остались ли в потоке ввода какие-то символы.

 

Тема 1.12 Классы-оболочки

 

Java – полностью объектно-ориентированный язык. Это означает, что все, что только можно, в Java представлено объектами.

Восемь примитивных типов нарушают это правило. Они оставлены в Java из-за многолетней привычки к числам и символам. Да и арифметические действия удобнее и быстрее производить с обычными числами, а не с объектами классов.

Но и для этих типов в языке Java есть соответствующие классы – классы-оболочки примитивных типов. Конечно, они предназначены не для вычислений, а для действий, типичных при работе с классами – создания объектов, преобразования объектов, получения численных значений объектов в разных формах и передачи объектов в методы по ссылке.

На рис. 1.35 показана одна из ветвей иерархии классов Java. Для каждого примитивного типа есть соответствующий класс. Числовые классы имеют общего предка – абстрактный класс Number, в котором описаны шесть методов, возвращающих числовое значение, содержащееся в классе, приведенное к соответствующему примитивному типу: byteValue(), doubievalue(), floatValue(), intValue(), longValue(), shortValue(). Эти методы переопределены в каждом из шести числовых классов-оболочек.

Рисунок 1.35– Классы примитивных типов

 

Помимо метода сравнения объектов equals (), переопределенного из класса Object, все описанные в этой главе классы, кроме Boolean и Class, имеют метод compareTo(), сравнивающий числовое значение, содержащееся в данном объекте, с числовым значением объекта – аргумента метода compareTo(). В результате работы метода получается целое значение:

· 0, если значения равны;

· отрицательное число (–1), если числовое значение в данном объекте меньше, чем в объекте-аргументе;



· положительное число (+1), если числовое значение в данном объекте больше числового значения, содержащегося в аргументе.

В каждом из шести числовых классов-оболочек есть статические методы преобразования строки символов типа String представляющей число, в соответствующий примитивный тип: Byte.parseByte(), Double.parseDouble(), Float.parseFloat(), Integer.parseInt(), Long.parseLong(), Short.parseShort(). Исходная строка типа String, как всегда в статических методах, задается как аргумент метода. Эти методы полезны при вводе данных в поля ввода, обработке параметров командной строки, т. е. всюду, где числа представляются строками цифр со знаками плюс или минус и десятичной точкой.

В каждом из этих классов есть статические константы MAX_VALUE и MIN_VALUE, показывающие диапазон числовых значений соответствующих примитивных типов. В классах Double и Float есть еще константы POSITIVE_INFINITY, NEGATIVE_INFINITY, NaNи логические методы проверки isNan(), isInfinite().

Если вы хорошо знаете двоичное представление вещественных чисел, то можете воспользоваться статическими методами floatTointBits() и doubieToLongBits(), преобразующими вещественное значение в целое. Вещественное число задается как аргумент метода. Затем вы можете изменить отдельные биты побитными операциями и преобразовать измененное целое число обратно в вещественное значение методами intsitsToFioat() и longBitsToDouble().

Статическими методами toBinaryString(), toHexString() и toOctalString() классов Integer и Long можно преобразовать целые значения типов int и long, заданные как аргумент метода, в строку символов, показывающую двоичное, шестнадцатеричное или восьмеричное представление числа.

В листинге 1.12 показано применение этих методов

Листинг 1.12

class NumberTest{

public static void main(String[] args) {

int i = 0;

short sh = 0;

double d = 0;

Integer kl = new Integer(55);

Integer k2 = new Integer(100);

Double dl = new Double(3.14);

i = Integer.parseInt(args[0]);

sh = Short.parseShort(args[0]);

d = Double.parseDouble(args[1]);

dl = new Double(args[1]);

kl = new Integer(args[0]);

double x = 1.0 / 0.0;

System.out.println("i = " + i);

System.out.println("sh - " + sh);

System.out.println("d. = " + d);

System.out.println("kl.intValue() = " + kl.intValue());

System.out.println("dl.intValue() = " + dl.intValue());

System.out.println("kl > k2? " + kl.compareTo(k2));

System.out.println("x = " + x);

System.out.println("x isNaN? " + Double.isNaN(x));

System.out.println("x islnfinite? " + Double.isInfinite(x));

System.out.println("x == Infinity? "+ (x == Double.POSITIVE_INFINITY));

System.out.println("d = " + Double.doubleToLongBits(d));

System.out.println("i = " + Integer.toBinaryString(i));

System.out.println("i = " + Integer.toHexString(i));

System.out.println("i = " + Integer.toOctalString(i));

}

}

Класс Boolean очень небольшой класс, предназначенный главным образом для того, чтобы передавать логические значения в методы по ссылке.

Конструктор Boolean (String s) создает объект, содержащий значение true, если строкаs равна "true" в любом сочетании регистров букв, и значение false для любой другой строки.

Логический метод booieanValue() возвращает логическое значение, хранящееся в объекте.

В классе Character собраны статические константы и методы для работы с отдельными символами.

Статический метод digit(charch, inradix) переводит цифру ch системы счисления с основанием radix в ее числовое значение типа int.

Статический метод forDigit(intdigit, intradix) производит обратное преобразование целого числа digit в соответствующую цифру (тип char) в системе счисления с основанием radix.

Основание системы счисления должно находиться в диапазоне от Character.MIN_RADIX до Character.MAX_RADIX.

Метод toString() переводит символ, содержащийся в классе, в строку с тем же символом.

Статические методы toLowerCase(), toUpperCase(), toTitieCase() возвращают символ, содержащийся в классе, в указанном регистре. Последний из этих методов предназначен для правильного перевода в верхний регистр четырех кодов Unicode, не выражающихся одним символом.

Множество статических логических методов проверяют различные характеристики символа, переданного в качестве аргумента метода:

· isDefined() – выясняет, определен ли символ в кодировке Unicode;

· isDigit() – проверяет, является ли символ цифрой Unicode;

· isIdentifierIgnorable() – выясняет, нельзя ли использовать символ в идентификаторах;

· isIsoControl() – определяет, является ли символ управляющим;

· isJavaIdentifierPart() – выясняет, можно ли использовать символ в идентификаторах;

· isJavaIdentifierStart() – определяет, может ли символ начинать идентификатор;

· isLetter() – проверяет, является ли символ буквой Java;

· isLetterOrDigit() – Проверяет, является ли символ буквой или цифрой Unicode;

· isLowerCase() – определяет, записан ли символ в нижнем регистре;

· isSpaceChar() – выясняет, является ли символ пробелом в смысле Unicode;

· isTitieCase() – проверяет, является ли символ титульным;

· isUnicodeIdentifierPart() – выясняет, можно ли использовать символ в именах Unicode;

· isUnicodeIdentifierStart() – проверяет, является ли символ буквой Unicode;

· isUpperCase() – проверяет, записан ли символ в верхнем регистре;

· isWhiteSpace() – выясняет, является ли символ пробельным.

Точные диапазоны управляющих символов, понятия верхнего и нижнего регистра, титульного символа, пробельных символов, лучше всего посмотреть по документации Java API.

Листинг 1.13 демонстрирует использование этих методов

Листинг 1.13

class CharacterTest{

public static void main(String[] args){

char ch = '9';

Character c = new Character(ch);

System.out.println("ch = " + ch);

System.out.println("cl.charValue() = "+c.charValue());

System.out.println("number of 'A' = "+ Character.digit('A', 16));

System.out.println("digit for 12 = "+ Character.forDigit(12, 16));

System.out.println("cl = " + c.toString());

System.out.println("ch isDefined? "+ Character.isDefined(ch));

System.out.println("ch isDigit? "+ Character.isDigit(ch));

System.out.println("ch isldentifierlgnorable? "

+ Character.isIdentifierIgnorable(ch));

System.out.println("ch isISOControl? "+ Character.isISOControl(ch));

System.out.println("ch isJavaldentifierPart? "

+ Character.isJavaIdentifierPart(ch));

System.out.println("ch isJavaldentifierStart? "

+ Character.isJavaIdentifierStart(ch));

System.out.println("ch isLetter? " + Character.isLetter(ch));

System.out.println("ch isLetterOrDigit? "

+ Character.isLetterOrDigit(ch));

System.out.println("ch isLowerCase? "+ Character.isLowerCase(ch));

System.out.println("ch isSpaceChar? "+ Character.isSpaceChar(ch));

System.out.println("ch isTitleCase? "+ Character.isTitleCase(ch));

System.out.println("ch isUnicodeldentifierPart? "

+ Character.isUnicodeIdentifierPart(ch));

System.out.println("ch isUnicodeldentifierStart? "

+ Character.isUnicodeIdentifierStart(ch));

System.out.println("ch isUpperCase? " + Character.isUpperCase(ch));

System.out.println("ch isWhitespace? "+ Character.isWhitespace(ch));

}

}

 

Вкласс Character вложеныклассы Subset и UnicodeBlock, причемкласс Unicode иещеодинкласс, InputSubset, являютсярасширениямикласса Subset, какэтовиднонарис. 1.35. Объекты этого класса содержат подмножества Unicode.

Вместе с классами-оболочками удобно рассмотреть два класса для работы со сколь угодно большими числами.

Класс BigInteger. Все примитивные целые типы имеют ограниченный диапазон значений. В целочисленной арифметике Java нет переполнения, целые числа приводятся по модулю, равному диапазону значений.

Для того чтобы было можно производить целочисленные вычисления с любой разрядностью, в состав Java API введен класс BigInteger, хранящийся в пакете java.math. Этот класс расширяет класс Number, следовательно, в нем переопределены методы doubleValue(), floatValue(), intValue(), longValue(). Методы byteVaiue() и shortvalue() не переопределены, а прямо наследуются от класса Number.

Действия с объектами класса BigInteger не приводят ни к переполнению, ни к приведению по модулю. Если результат операции велик, то число разрядов просто увеличивается. Числа хранятся в двоичной форме с дополнительным кодом.

Перед выполнением операции числа выравниваются по длине распространением знакового разряда.

Шесть конструкторов класса создают объект класса BigDecimal из строки символов (знака числа и цифр) или из массива байтов.

Две константы – ZERO и ONE – моделируют нуль и единицу в операциях с объектами класса BigInteger.

Метод toByteArray() преобразует объект в массив байтов.

Большинство методов класса BigInteger моделируют целочисленные операции и функции, возвращая объект класса BigInteger:

· abs() – возвращает объект, содержащий абсолютное значение числа, хранящегося в данном объекте this;

· add(x) – операция this + х;

· and(x) – операция this & х;

· andNot(x) – операция this & (~х) ;

· divide (x) – операция this / х;

· divideAndRemainder(х) – возвращает массив из двух объектов класса BigInteger, содержащих частное и остаток от деления this на х;

· gcd(x) – наибольший общий делитель, абсолютных, значений объекта this и аргумента х;

· mах(х) – наибольшее из значений объектаthis и аргумента х;

· min(x) – наименьшее из значений объекта this и аргумента х;

· mod(x)– остаток от деления объекта this на аргумент метода х;

· modinverse(x) – остаток от деления числа, обратного объекту this, на аргумент х;

· modPow(n, m) – остаток от деления объекта this, возведенного в степень n, на m;

· multiply (х) –операция this * х;

· negate() – перемена знака числа, хранящегося в объекте;

· not() – операция ~this;

· оr(х) – операция this | х;

· pow(n) – операция возведения числа, хранящегося в объекте, в степень n;

· remainder(х) –операция this % х;

· shiftLeft (n) – операция this « n ;

· shiftRight (n) – операция this » n;

· signum() – функция sign (x);

· subtract (x) – операция this - x;

· xor(x) – операция this ^ x.

В листинге 1.14 приведены примеры использования данных методов

Листинг 1.14

import Java.math.BigInteger;

class BigIntegerTest{

public static void main(String[] args){

BigInteger a = new BigInteger("99999999999999999");

BigInteger b = new BigInteger("88888888888888888888");

System.out.println("bits in a = " + a.bitLength());

System.out.println("bits in b = " + b.bitLength());

System.out.println("a + b = " + a.add(b));

System.out.println("a & b = " + a.and(b));

System.out.println("a & ~b = " + a.andNot(b));

System.out.println("a / b = " + a.divide(b));

BigInteger[] r = a.divideAndRemainder(b);

System.out.println("a / b: q = " + r[0] + ", r = " + r[1]);

System.out.println("gcd(a, b) = " + a.gcd(b));

System.out.println("max(a, b) = " + a.max(b));

System.out.println("min(a, b) = " + a.min(b));

System.out.println("a mod b = " + a.mod(b));

System.out.println("I/a mod b = " + a.modInverse(b));

System.out.println("а^ a mod b = " + a.modPow(a, b));

System.out.println("a * b = " + a.multiply(b));

System.out.println("-a = " + a.negate());

System.out.println("~a = " + a.not());

System.out.println("a | b = " + a.or(b));

System.out.println("а ^ 3 = " + a.pow(3));

System.out.println("a % b = " + a.remainder(b));

System.out.println("a « 3 = " + a.shiftLeft(3));

System.out.println("a » 3 = " + a.shiftRight(3));

System.out.println("sign(a) = " + a.signum());

System.out.println("a - b = " + a.subtract(b));

System.out.println("а ^ b = " + a.xor(b));

}

}

Обратите внимание на то, что в программу листинга 1.14 надо импортировать пакет java.math.

Класс BigDecimal расположен в пакете java.math.

Каждый объект этого класса хранит два целочисленных значения: мантиссу вещественного числа в виде объекта класса BigInteger, и неотрицательный десятичный порядок числа типа int.

Например, для числа 76.34862 будет храниться мантисса 7 634 862 в объекте класса BigInteger, и порядок 5 как целое число типа int. Таким образом, мантисcа может содержать любое количество цифр, а порядок ограничен значением константы Integer.MAX_VALUE. Результат операции над объектами класса BigDecimal округляется по одному из восьми правил, определяемых следующими статическими целыми константами:

· ROUND_CEILING – округление в сторону большего целого;

· ROUND_DOWN – округление к нулю, к меньшему по модулю целому значению;

· ROUND_FLOOR – округление к меньшему целому;

· ROUND_HALF_DOWN – округление к ближайшему целому, среднее значение округляется к меньшему целому;

· ROUND_HALF_EVEN – округление к ближайшему целому, среднее значение округляется к четному числу;

· ROOND_HALF_UP – округление к ближайшему целому, среднее значение округляется к большему целому;

· ROUND_UNNECESSARY – предполагается, что результат будет целым, и округление не понадобится;

· ROUND_UP – округление от нуля, к большему по модулю целому значению.

В классе BigDecimal четыре конструктора:

· BigDecimal (BigInteger bi) – объект будет хранить большое целое bi, порядок равен нулю;

· BigDecimal (BigInteger mantissa, int scale) – задается мантисcа mantissa и неотрицательный порядок scale объекта; если порядок scale отрицателен, возникает исключительная ситуация;

· BigDecimal (double d) – объект будет содержать вещественное число удвоенной точности d; если значение d бесконечно или NaN, то возникает исключительная ситуация;

· BigDecimal (String val) число задается строкой символов val, которая должна содержать запись числа по правилам языка Java.

При использовании третьего из перечисленных конструкторов возникает неприятная особенность, отмеченная в документации. Поскольку вещественное число при переводе в двоичную форму представляется, как правило, бесконечной двоичной дробью, то при создании объекта, например, BigDecimal(0.1), мантисса, хранящаяся в объекте, окажется очень большой. Но при создании такого же объекта четвертым конструктором, BigDecimal ("0.1"), мантисса будет равна просто 1.

ВКлассепереопределеныметоды doubleValue(), floatValue(), intValue(), longValue().

Большинство методов этого класса моделируют операции с вещественными числами. Они возвращают объект класса BigDecimal. Здесь буква х обозначает объект класса BigDecimal, буква n – целое значение типа int, буква r – способ округления, одну из восьми перечисленных выше констант:

abs() – абсолютное значение объекта this;

add(x) – операция this + х;

divide(х, r) – операция this / х с округлением по способу r;

divide(х, n, r) – операция this / х с изменением порядка и округлением по способу r;

mах(х) – наибольшее из this и х;

min(x) – наименьшее из this и х;

movePointLeft(n) – сдвиг влево на n разрядов;

movePointRight(n) – сдвиг вправо на nразрядов;

multiply(х) – операция this * х;

negate() – возврзщает объект с обратным знаком;

scale() – возвращает порядок числз;

setscaie(n) – устзнавливает новый порядок n ;

setscaie(n, r) – устанавливает новый порядок п и округляет число при необходимости по способу r;

signumo – знак числа, хранящегося в объекте;

subtract(х) – операция this - х;

toBiginteger() – округление числа, хранящегося в объекте;

unscaiedvalue()–возвращает мантиссу числа.

Листинг 1.15 показывает примеры использования этих методов

Листинг 1.15

import java.math.*;

class BigDecimalTest{

public static void main(String[] args) {

BigDecimal x = new BigDecimal("-12345.67890123456789");

BigDecimal y = new BigDecimal("345.7896e-4");

BigDecimal z = new BigDecimal(new BigInteger("123456789"), 8);

System.out.println("|x| = " + x.abs());

System.out.println("x + у = " + x.add(y));

System.out.println("x / у = " + x.divide(y, BigDecimal.ROUND_DOWN));

System.out.println("х / у = "

+ x.divide(y, 6, BigDecimal.ROUND_HALF_EVEN));

System.out.println("max(x, y) = " + x.max(y));

System.out.println("min(x, y) = " + x.min(y));

System.out.println("x « 3 = " + x.movePointLeft(3));

System.out.println("x » 3 = " + x.movePointRight(3));

System.out.println("x * у = " + x.multiply(y));

System.out.println("-x = " + x.negate());

System.out.println("scale of x = " + x.scale());

System.out.println("increase scale of x to 20 = " + x.setScale(20));

System.out.println("decrease scale of x to 10 = "

+ x.setScale(10, BigDecimal.ROUND_HALF_UP));

System.out.println("sign(x) = " + x.signum());

System.out.println("x - у = " + x.subtract(y));

System.out.println("round x = " + x.toBigInteger());

System.out.println("mantissa of x = " + x.unscaledValue());

System.out.println("mantissa of 0.1 =\n= "

+ new BigDecimal(0.1).unscaledValue());

}

}

 

Приведемещеодинпример. Напишем простенький калькулятор, выполняющий четыре арифметических действий с числами любой величины. Он работает из командной строки. Программа представлена в листинге 1.16.

Листинг 1.16

import Java.math.*;

class Calc{

public static void main(String[] args) {

if (args.length < 3) {

System.err.println("Usage: Java Calc operand operator operand");

return;

}

BigDecimal a = new BigDecimal(args[0]);

BigDecimal b = new BigDecimal(args[2]);

switch (args[1].charAt(0)) {

case '+':

System.out.println(a.add(b));

break;

case '-':

System.out.println(a.subtract(b));

break;

case '*':

System.out.println(a.multiply(b));

break;

case '/':

System.out.println(a.divide(b,

BigDecimal.ROUND_HALF_EVEN));

break;

default:

System.out.println("Invalid operator");

}

}

}

 

 





Рекомендуемые страницы:


Читайте также:



Последнее изменение этой страницы: 2016-05-30; Просмотров: 427; Нарушение авторского права страницы


lektsia.com 2007 - 2021 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.046 с.) Главная | Обратная связь