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


Тема 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; Просмотров: 693; Нарушение авторского права страницы


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