Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы. Мобильные устройства.doc
Скачиваний:
2
Добавлен:
01.05.2019
Размер:
1.8 Mб
Скачать

Операции ввода/вывода

Если Вам уже приходилось работать с GCF, то вы хорошо знакомы с операциями чтения и записи в файл. Для записи необходимо получить OutputStream с помощью объекта FileConnection, указывающего на необходимый файл:

OutputStream os = fc.openOutputStream()

os.write(new String("hello").getBytes());

os.close();

Если вы хотите писать в файлы данные в форме какого-нибудь Java типа, можете воспользоваться объектом DataOutputStream:

int i = 1234;

DataOutputStream ds = fc. openDataOutputStream();

ds.writeInt(i);

ds.close();

Для чтения из файла необходимо получить InputStream или DataInputStream.

byte[] b = new byte[1024];

InputStream is = fc.openInputStream();

is.read(b);

is.close();

Получение информации о файлах и каталогах

Класс FileConnection имеет несколько методов, которые используются для получения информации о файле и каталоге:

  • boolean canRead() — доступен ли файл для чтения;

  • boolean canWrite() — доступен ли файл для записи;

  • long directorySize(boolean includeSubDirs) — возвращает размер всех файлов находящихся в папке (в байтах);

  • long fileSize() — возвращает размер файла в байтах;

  • long lastModified() — возвращает дату последней модификации файла или каталога.

Завдання

Проробити практичний матеріал, розглянутий в лабораторній роботі.

Розробити власну программу що зберігає довільний файл в телефоні у вибранний каталог.

Відповісти на питання:

1) Як можна переконатися, що система підтримує FileConnection API?

2) Який метод дозволяє переконатися в існуванні вибраного файлу?

3) Як можна отримати перелік файлів будь-якого формату (наприклад, mp3) у вібраному каталозі?

Лабораторная работа №6

Вычисление математических функций в j2me (exp, ln, log, arcsin, arccos, arctn, power, root)

Конфигурация CDLC 1.1 позволяет работать с вещественными числами, поддерживая тип double. Однако стандартная библиотека Math включает в себя очень скудный набор математических функций: sin, cos, tan, sqrt. Существует несколько сторонних математических классов (например, Real.java, которую можно скачать по адресу http://sourceforge.net/projects/real-java). В этой лабораторной работе я предлагаю написать собственную реализацию нескольких популярных математических функций.

В основе компьютерной математики лежит использование разложений функций в математические ряды. Подробно этот вопрос рассматривается в курсе Математического анализа любого Вуза. Если вкратце, то математическую функцию можно представить в виде бесконечной суммы слагаемых, причем каждое следующее слагаемое по модулю меньше предыдущего. Поэтому для вычисления функции с заданной точностью нужно выполнять сложение до тех пор, пока следующее слагаемое не станет меньше, чем требуемая точность вычисления.

Вычисление Экспоненты

Из курса математического анализа известно, что экспоненту можно представить в виде бесконечного ряда

При этом, чем больше аргумент x, тем больше слагаемых требуется брать для удовлетворения требуемой точности. При x>706 exp(x) не умещается в переменную типа double, поэтому перед вычислением экспоненты целесообразно проверить значение x на превышение порогового предела. Для реализации эффективного алгоритма вычисления экспоненты, нужно воспользоваться известным из курса школьной алгебры фактом:

Очевидно, число x<706 можно представить в виде суммы:

где коэффициенты a могут принимать значения 0 или 1, а b<1.

Величины можно вычислить заранее и записать в массив. Затем вычленить из x целую(b) и дробную часть. Для дробной части вычислить экспоненту как сумму ряда Тейлора. Найти ai можно, переведя целую часть числа x в двоичную систему. Тогда самому правому символу в двоичном представлении числа соответствует a0, второму справа числу – a0, и так далее. Ниже приведен код функции, вычисляющей экспоненту числа:

private double MExp(double x0){

double x=x0;

if (x0<0){x=-x0;}

//Массив со степенями экспоненты.

double ExpConst[]={

2.718281828459045, //e^1

7.389056098930649, //e^2

54.59815003314422, //e^4

2980.957987041726, //e^8

8886110.520507860, //e^16

78962960182680.61, //e^32

6.235149080811582e27, //e^64

3.887708405994552e55, //e^128

1.511427665004070e111, //e^256

2.284413586539655e222 //e^512

};

int x1=(int)x; //Выделяем целую часть числа

//Вычисляем экспоненту как сумму ряда Тейлора

int long n=1;

double b=1;

double sn=1;

while (sn>1E-16){

sn=sn*(x-x1)/n;

b=b+sn;

n=n++;

}

//Переводим показатель экспоненты в двоичную систему.

StringBuffer s1=new StringBuffer(10);

s1.append(Integer.toBinaryString(x1));

int len=s1.length();

for (int i=s1.length(); i>0;i--)

{

if (s1.charAt(i-1)=='1'){b=b*ExpConst[len-i];}

}

if (x0<0){b=1/b;}

return b;

}