КлассыBufferedReader, BufferedWriter, PrintWriter

Примерыобьявления:

FileReaderinputStream = null;

FileWriteroutputStream = null;

inputStream = new FileReader ( "input.txt" );

outputStream = new FileWriter ( "output.txt" );

2. Потоки строк: свойства, связь потока с файлом, чтение, запись, закрытие:

Текстовые потоки в java это буферизированные потоки символов с именами BufferdReader, PrintWriter. Содержат кроме обычных методов операции readLine (ввод строки) и println (вывод строки). Текстовые потоки используются для работы с данными, которые состоят из символов.

Связь потока с файлами:

Объявление вводного потока input типа BufferedReader:

Input= new BufferedReader(newFileReader(“..txt ”));

Конструктор класса BufferedReader требует в качестве параметра символьный файловый поток, который связан с файлом обычном образом.

Объявление выводного потока output типа PrintWriter

Output =newPrintWriter(“….txt”);

Обработка строк текстового файла, не представляющих числовые данные, обычно состоит из следующих действий:

-ввод строки из файла при помощи метода readLine

-разделение строки на слова

-обработка слов строки

Обработка числовых данных в свободном формате отличается от обработки текстовых строк только тем, что после разделения строки на слова слово преобразуется в число подходящим методом. Методы находятся в классах-оболочках стандартных типов. Например метод parseDouble(word) класса double. Возвращает double значение для строки word.

3. Исключения при работе с потоками:

Исключения в языке java- это объект, который описывает исключительную ситуацию, произошедшую в некоторой части кода. Когда создается исключительная ситуация, создается обьект, представляющий это исключение, и «вбрасываются» в метод, вызвавший ошибку. В свою очередь, метод может выбрать, обрабатывать ли исключение самому или передать его куда то еще. В любом случае, в некоторой точке исключения «захватываются» и обрабатываются.

Обработка исключений в java управляется с помощью 5 ключевыхслов - try, catch, throw, throws, finally.

Программные операторы, которые нужно контролировать относительно исключений, содержаться в блоке try. Если в блоке try происходит исключение, то говорят, что оно выброшено (thrown) этим блоком. Оператор catch перехватывает исключение и обрабатывает его.

Общая форма блока обработки исключений:

Try{//блок кода для контроля над ошибками

}

Catch(ExceptionType1 e){

//обработчикисключенийдля ExceptionType1

}

Catch(ExceptionType2 e){

//обработчикисключенийдля ExceptionType2

}

Finally{

//блок кода для обработки перед возвратом из Try блока

}

При чтении из файлов возможны следующие исключения:

-поток пуст

-не открытый/закрытый поток и т.д.

4. Понятие рекурсии, рекурсивное вычисление факториала:

Рекурсия – прием, при котором нечто выражается через такое же. Рекурсия как прием часто применяется : в математике, в дискретной математике, в программировании. Применяется для построения и описания данных, для формулирования методов решения задач, для построения алгоритмов и программ. Наиболее успешные результаты получаются, если рекурсия применяется как для определения данных, так и для решения задач с этими данными.

N!=N*(N-1)!

При рекурсии должен быть предусмотрен вариант, в котором рекурсия не нужна: 1!=1.

Факториал:

public class Factorials {//рекурсия

public static long factR (int n) {

if (n<2) return 1L;

else return n*factR (n-1) ;

////////////второй вариант рекурсии////

другой вариант функции

public static long factR (int n) {

long r = 1L;

if (n >1) r = n * factR (n-1);

return r;

}

//////////////////////////////////////////////////

}

public static long factNr ( int n ){ //нерекурсивный

long r = 1L;

for(int i = 2; i <= n; i++) r *= i;

return r;

}

public static void main (String[ ] args) { //проверкафункций

longfr, fnr;

for(int i=5; i<22; i++) { fr = factR(i); fnr = factNr ( i );

System.out.println(" “ + i + "! =“ +fr + " “ + fnr);

}

}

5. Понятие рекурсии, рекурсивное вычисление суммы элементов массива:

Рекурсия – прием, при котором нечто выражается через такое же. Рекурсия как прием часто применяется : в математике, в дискретной математике, в программировании. Применяется для построения и описания данных, для формулирования методов решения задач, для построения алгоритмов и программ. Наиболее успешные результаты получаются, если рекурсия применяется как для определения данных, так и для решения задач с этими данными.

При рекурсии должен быть предусмотрен вариант, в котором рекурсия не нужна: 1!=1.

Public class RecSum{

Public static intarSum(int [] B, intsart, int end){

Int res=0;

If(start<=end){

If(start==end)res=B[start]; // нерекурсивнаячасть

Else res=B[start]+arSum(B,start+1,end);//рекурсивнаячасть

}

Return res;

}

Public static void (){

Intn,sum;

Int[]A= new int[]{1,2,3,4,5};

n=A.length;

sum=arSum(A,0,n-1);

}

}

6. Понятие рекурсии, рекурсивное вычисление максимального элемента массива:

Рекурсия – прием, при котором нечто выражается через такое же. Рекурсия как прием часто применяется : в математике, в дискретной математике, в программировании. Применяется для построения и описания данных, для формулирования методов решения задач, для построения алгоритмов и программ. Наиболее успешные результаты получаются, если рекурсия применяется как для определения данных, так и для решения задач с этими данными.

При рекурсии должен быть предусмотрен вариант, в котором рекурсия не нужна: 1!=1.

Public class Max{

public static intarMin( int[ ] B, int start, int end) {

intres=0;

if (start<=end) { res = B[start];

if (start<end) {

int min = arMin (B,start+1,end);

if (res<min) res=min;

};

};

return res;

}

public static void main ( String[ ] args ) {

int[ ] A = { 10, 3, 5, 1, 6, 4, 2, 8 }; //созданиемассива

intamin = arMin (A,0,A.length-1);

System.out.println (amin); //вызов метода и печать результата

}

}

7. Формулировка задачи о ханойских башнях:

Есть три стержня A, B, и C. На стержень A надето N дисков, наверху самый маленький, каждый следующий диск больше предыдущего, а внизу самый большой. На другие стержни дисков не надето.

Hеобходимо перенести диски со стержня A на стержень C, пользуясь стержнем B, как вспомогательным, так, чтобы диски на стержне C располагались в том же порядке, в каком они располагаются на диске A перед перемещением.

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

8. Применение рекурсии при определении связного списка:

Рекурсивное определение списка элементов (пусть элементами будут числа)

(Список) ::= (элемент) | //нерекурсивная часть,

(Список)(запятая)(элемент) | //рекурсивная часть

(элемент)(запятая)(Список) //рекурсивная часть

Если есть некоторый список, то можно получить новый список,

приписав элемент слева или справа

Пример:

Список 23, 35, 74, 2, 11 - это

элемент 23 запятая Список 35, 74, 2, 11

Список 35, 74, 2, 11 – это

элемент 35 запятая Список 74, 2, 11

Список 74, 2, 11 – это

Элемент 74 запятая Список 2, 11

Список 2, 11 - это

элемент 2 запятая Список 11

Список 11 – это элемент, т.е. частный случай списка

9. Понятие списка. Объявление элемента списка:

Рекурсивные данные: связный список

Список -упорядоченная совокупность, состоящая из элементов.

КлассыBufferedReader, BufferedWriter, PrintWriter - student2.ru

Длина списка - число элементов, содержащихся в списке, список нулевой длины называется пустым списком. К списку применимы операции включения, исключения. Основные операции (методы) для списков: добавить элемент (новый элемент становится первым в списке)удалить элемент (удаляется первый элемент списка, второй станет первым)дополнительные методы удалить все элементы копировать список проверить равенство списков добавить элемент в конец списка; удалить элемент из конца списка добавить или удалить элемент получить элемент по его номеру изменить порядок элементов на упорядочить элементы обратный найти позицию данного элемента в упорядоченном списке

Добавление элемента

1. Создается новый элемент, задается ссылка на него, и заполняется

информационная часть. Поле связи (next) пустое, т.е. = null

2. Ссылка из головы копируется в поле next нового элемента (стрелка 3).

Теперь на первый элемент списка указывают два элемента: голова списка

и новый элемент (стрелки 1 и 3).

3. Ссылка на новый элемент копируется в поле next головы, так что next начинает "указывать" на новый элемент (появляется стрелка

2, стрелка 1 исчезает).

После этого новый элемент становится первым элементом списка:

Голова указывает на новый элемент, новый элемент – на старый первый,

далее – как было в исходном списке.

Текст программы:

Определяемкласс – Элементсписка. Дляуниверсальностиполеinf –

типаObject(Object – базовый тип длявсехобъектныхтипов)

publicclassListEl { //ListElement – элементсписка

Objectinf; //информационнаячасть

ListElnext; //ссылка на следующийэлемент

ListEl( ) { next = null; inf = null; } //конструктор

ListEl (Object ob) { inf = ob; next = null; } //конструктор

Первыйконструкторсоздает "пустой" элемент – обессылки == null

Второйконструктор в ссылкуinfкопируетссылкунаобъект,

заданныйкакаргументконструктора

//добавить элемент ob к списку hd

public static void printMyList ( ListEl a ) { //печатьсписка

ListElc = a.next; //с – текущийэлементсписка

while( c != null ) { // покаестьэлементы,

System.out.print(c.inf + " "); // напечататьинфо-часть с

c = c.next; // и перейти к следующему

}; System.out.println( ); // когдавсеэлементы

// напечатаны, перейти к новой

// строке

}//print

//классObjectсодержитметодtoString, благодаря

//которомуprintlnможетвывестиобъект. При

//необходимостиtoStringпереопределяется

public static void main(String[ ] args){

ListEl list=new ListEl (); //создали≪голову≫списка

for (int i=0; i<10; i++) //10 раздобавляем к списку

// поодномуэлементу,

addToList (list, Integer.toString( i * i ) ) ; //помещаявinf-часть

//квадратыцелыхчисел

printMyList( list ); //печатаемсозданныйсписок

}

}

10. Структура объявления двусвязного списка:

Функциональность Очереди соответствует действиям с двусвязным списком:"голова" показывает на последний добавленный элемент, а "хвост" – на элемент, который должен быть удален первым. (В очереди с течением времени элементы перемещаются от "головы" к «хвосту»).

15. Типовые операции для односвязных списков:

Список - упорядоченная совокупность, состоящая из элементов.

Список называется упорядоченным, если имеется отношение предыдущего элемента к следующему. Список с таким отношением порядка называется односвязным. Здесь ссылка в каждом узле указывает на следующий узел в списке. В односвязном списке можно передвигаться только в сторону конца списка. Узнать адрес предыдущего элемента, опираясь на содержимое текущего узла невозможно. Длина списка – это число элементов, содержащихся в списке. Список нулевой длины называется пустым списком. К списку применимы операции: включения, исключения. Списки являются простейшими динамическими типами данных.

Односвязный список:

КлассыBufferedReader, BufferedWriter, PrintWriter - student2.ru

Основные операции (методы) для списков:

добавить элемент (новый элемент становится первым в списке)

удалить элемент (удаляется первый элемент списка, второй станет первым)

Дополнительные методы:

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

16. Кольцевой и двусвязный списки: отличия от односвязного списка:

Двусвязный список:

КлассыBufferedReader, BufferedWriter, PrintWriter - student2.ru

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

Кольцевой список:

КлассыBufferedReader, BufferedWriter, PrintWriter - student2.ru

Разновидностью связных списков является кольцевой (циклический, замкнутый) список. Он тоже может быть односвязным или двусвязным.Последний элемент кольцевого списка содержит указатель на первый, а первый (в случае двусвязного списка) — на последний. Реализация такой структуры происходит на базе линейного списка. В каждом кольцевом списке есть указатель на первый элемент. В этом списке константы NULL не существует.

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

Все операции и методы для односвязного списка применимы и к двусвязным спискам и кольцевым спискам!!!

17. Порядок добавления элемента в односвязный список:

1. Создается новый элемент, задается ссылка на него, и заполняется информационная часть. Поле связи (next) пустое, т.е. = null

2. Ссылка из головы копируется в поле next нового элемента (стрелка 3). /Теперь на первый элемент списка указывают два элемента: голова списка и новый элемент (стрелки 1 и 3)/

3. Ссылка на новый элемент копируется в поле nextголовы / так что next начинает "указывать" на новый элемент (появляется стрелка 2, стрелка 1 исчезает)/ После этого новый элемент становится первым элементом списка: голова указывает на новый элемент, новый элемент – на старый первый, далее – как было в исходном списке.

КлассыBufferedReader, BufferedWriter, PrintWriter - student2.ru

При удалении элемента действия проводятся в обратном порядке.

public class ListEl { //ListElement – элементсписка

Objectinf; //информационная часть

ListElnext; //ссылка на следующий элемент

ListEl( ) { next = null; inf = null; } //конструктор

ListEl (Object ob) { inf = ob; next = null; } //конструктор

public static void addToList (ListElhd, Object ob) {

ListEl e=new ListEl (ob );

if(hd.next!= null) { // если список не пуст,

ListElold= hd.next; // сохранить ссылку

hd.next =e; // голову связать с новым

e.next =old;

}

elsehd.next =e; // или сделать элемент первым

}

public static void printMyList ( ListEl a ) { //печатьсписка

ListElc= a.next; //с – текущий элемент списка

while( c != null ) { // пока есть элементы,

System.out.print(c.inf+ " "); // напечатать инфо-часть с

c= c.next; // и перейти к следующему

}; System.out.println( ); // когда все элементы

}//print

public static void main(String[ ] args){

ListEl list=new ListEl(); //создали «голову» списка

for (int i=0; i<10; i++)

addToList (list, Integer.toString(i *i ) ) ; //помещая в inf-часть

printMyList ( list ); //печатаем созданный список

}

}

Результат в терминале:

81 64 49 36 25 16 9 4 1 0

18. Основные типы коллекций, имеющиеся в JavaCollectionFramework:

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

· добавление нового элемента в коллекцию;

· удаление элемента из коллекции;

· изменение элемента в коллекции.

Наши рекомендации