Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Зачем нужно? Чтобы экономит силы и использовать объектный код, сочиненный другими людьми. Сама Java -программа - это некий объект. Главное понятие в ООП - понятие класса. Это структура (сложный тип данных), объединяющая переменные и функции для работы с ними.
Класс "мыша"
Mouse{
x // переменные внутри класса - "поля" или
y // "свойства"
draw() // функция внутри класса = "метод"
}
Формальное описание синтаксиса класса:
class Name {
int x, y;
тело класса;
int Sum (int a, int b){} // описание функций
float z; // в любом порядке описание переменных и функций..
// хотя для читабельности все лучше по порядку
}
Класс не похож на функцию, не возвращает никакого значения.
Тут используют описания доступа к переменным (полям то есть) класса и к его функциям (методам то есть). По умолчанию переменные и функции доступны для своего класса и всех его соседей в той же папке.
По сути класс - что это? Это сложная структура в памяти. Выделяем 4 байта для целого, 4 байта для вещественного, и описываем структуру функции для работы с ними. Но это лишь описание - реально память не выделена. Память выделяется реально - создается объект. То есть конкретный экземпляр класса. Я месяца три после процедурного программирования не мог привыкнуть к терминологии и не мог понять, зачем же это нужно! Попытаюсь вам объяснить все же побыстрее :-)
Класс "люди"
голова
руки
метод_думать (увеличивает значение голова на 1)
метод хватать (увеличивает значение рук на 1)
все
Мы все - объекты=экземпляры этого класса. Нам выделено место на земле чтобы жить, хватать и думать.
Внутри класса помимо всего прочего существует специальная функция - "конструктор" - называется функция тем же именем, что и класс (в этом примере - "люди"). Она может существовать или не существовать. Она не возвращает никакого результата и void к конструктору не надо приписывать. Она - функция-конструктор - нужна для некоторых начальных (инициализирующих) действий при создании объекта. Какие действия? Разные..
В нашем примере: конструктор присвоит головам и рукам значение "десять". Это я придумываю сам. Пусть будет так. Или пример с мышой: пусть мыша будет при инициализации располагаться в центре экрана. Кто-то должен вычислить координаты центра экрана и вызвать функцию рисования чтобы там мыша была нарисована.
Когда объект создается (человек рождается), то вызывается один-единственный раз конструктор. Если я не описал спец. конструктор, то что по умолчанию? Обычно ничего. Но если и ничего, все же по умолчанию конструктор есть. Хотя по умолчанию он ничего не совершает, ничего не возвращает, никаких аргументов не получает.
Вернемся к примеру Люди: создаем объект Миша класса Люди -
1) объявили переменную сложного типа "Люди" (так как мы писали int a;
при объявлении переменной простого типа)
Люди Миша; // никакая память не выделилась, переменной
// спец_типа Люди - нет, ее "значение" - null
// в отличие от случая простой переменной - она то
// "инициализируется" автоматически
2) выделили оперативную память для объекта Миша:
Миша=new Люди();
Теперь возник кусок выделенной памяти - конструктор там создал структуру для хранения переменных руки, голова, функций-методов.
Разница с обычным программированием: функция делается менее универсальной. Она может работать только над данными данного объекта! Нельзя заставить функцию-метод объекта взять переменную другого объекта. (можно ей передать извне эти переменные-поля как аргументы). Зато (выигрыш) все это дело увязано в одну взаимосвязанную структуру. Еще раз: даже если метод-функцию вызвать снаружи, она чужие данные не сможет взять. А как же передают данные внутрь переменных-полей объекта? Прямой записью в поле или передачей данных внутрь через функцию-метод, ему эти данные дают в качестве аргумента.
Уничтожение объектов. В отличие от Си++ в Java нет Деструктора. Я пишу
Миша = null;
Объект "Миша" не сразу убивается-освобождает память. Он просто лежит тут, ненужный Миша. А потом, в момент регулярной чистки памяти, его уберут. Java -машина чистит память регулярно.
Приложение 3
Листинг программы SearchEngein.java
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.net.*;
import java.util.*;
import java.lang.*;
// Класс Интерфейс
public class SearchEngein extends HttpServlet {
// Объявление глобальных переменных
Properties INIProperties = new Properties();
String query = null, // Запрос
value = null; // Запрос в нужной кодировке
String dbname, // Имя базы
dbpath; // Путь к базе
String dbselect; //
byte MD = 30, // Код разделителя
MD2 = 31; // Код разделителя
String RusDos = new String("Cp866"); // Кодировка дос
String RusWin = new String("windows-1251"); // Кодировка Виндовс
String iso = new String("8859_1"); // Кодировка Сервлета
String RusIso = new String("8859-5"); // Кодировка Исо
// конвертор кодировки из ИСО В Виндовс
private String ConvertISO(String Str) {
try {
Str = new String( Str.getBytes(iso),RusWin);}
catch( java.io.UnsupportedEncodingException e ) { return Str;}
return Str;
}
public String getServletInfo() {
return "Поиск в базе данных ";
}
private String RemoveTrash(String str){
return new String(str);
}
// преобразование в нижний регистр
public String toLow(String str){
char old[] = str.toCharArray();
char news[] = new char[str.length()];
char c;
for (int i =0; i<str.length(); i++){
c = old[i];
switch (c) {
case 'А' : {c = 'а';break;}
case 'Б' : {c = 'б';break;}
case 'В' : {c = 'в';break;}
case 'Г' : {c = 'г';break;}
case 'Д' : {c = 'д';break;}
case 'Е' : {c = 'е';break;}
case 'Ё' : {c = 'ё';break;}
case 'Ж' : {c = 'ж';break;}
case 'З' : {c = 'з';break;}
case 'И' : {c = 'и';break;}
case 'Й' : {c = 'й';break;}
case 'К' : {c = 'к';break;}
case 'Л' : {c = 'л';break;}
case 'М' : {c = 'м';break;}
case 'Н' : {c = 'н';break;}
case 'О' : {c = 'о';break;}
case 'П' : {c = 'п';break;}
case 'Р' : {c = 'р';break;}
case 'С' : {c = 'с';break;}
case 'Т' : {c = 'т';break;}
case 'У' : {c = 'у';break;}
case 'Ф' : {c = 'ф';break;}
case 'Х' : {c = 'х';break;}
case 'Ц' : {c = 'ц';break;}
case 'Ч' : {c = 'ч';break;}
case 'Ш' : {c = 'ш';break;}
case 'Щ' : {c = 'щ';break;}
case 'Ъ' : {c = 'ъ';break;}
case 'Ы' : {c = 'ы';break;}
case 'Ь' : {c = 'ь';break;}
case 'Э' : {c = 'э';break;}
case 'Ю' : {c = 'ю';break;}
case 'Я' : {c = 'я';break;}
default : {news[i]=c;}
}// switch
news[i] = c;
}
return new String(news);
}
//
private String TagRemove(String s){
boolean inTag = false;
boolean tag = false;
int sn = 0;
char c;
int m = s.length();
char[] cd = new char[m];
char[] old = s.toCharArray();
char cMD = (char) MD2;
for (int i=0; i<m; i++)
{c=old[i];
if (tag) { c=' '; tag = false; }
else if ( c == cMD ) { c=' '; tag = true;}
cd[i] = c;
}
return new String(cd);
}
//
public void dbFileRead(String dbNamePath, PrintStream out, String query) {
String mAvtor = null; // 100
String msAvtor = null; // 700
String mName = null; // 245
String mPrinter = null; // 260
String mSize = null; // 300
String mKey = null; // 653
String mSeria = null; // 490
String mBBK = null; // 91
String mKaIndex = null; // 90
long fPosMarker = 0, // Позиция относительно начала
fPosData = 0; //
boolean done = false,
Avtor = false;
int mC =0,
mE =0; // Счетчик
byte Jumper[] = new byte[5]; // Размер запяси - символьный
int JIndex = 0, // Размер запяси - числовой
JTemp = 0, // Размер данных + словарь
MIndex = 0, // Счетчик для массива
MTemp = 0; // Счетчик полей
if (query != null){
try { RandomAccessFile dbfile = new RandomAccessFile(dbNamePath,"r");
// Цикл чтения файла по маркерам
while (fPosMarker != dbfile.length()) {
try { mC++;
dbfile.seek(fPosMarker);
dbfile.read(Jumper);
String jBuf = new String(Jumper);
JIndex = Integer.parseInt(jBuf,10);
int b = 0;
// Поиск конца словаря
while ( b != MD){
dbfile.seek(fPosMarker+24+MIndex);
b = dbfile.read();
MTemp++;
MIndex = MTemp;
}
MTemp= MTemp - 1;
// чтение Словаря из файла в отдельный массив
byte Dic[] = new byte[MTemp];
dbfile.seek(fPosMarker+24);
dbfile.read(Dic);
// чтение полей данных из файла в массив
fPosData = fPosMarker+24+MTemp;
String sDic = new String(Dic);
byte MarcRec[] = new byte[JIndex-24-MTemp];
dbfile.seek(fPosData);
dbfile.read(MarcRec);
int DI2 = 0,
DI3 = 0,
DI4 = 0,
DI5 = 0,
PNum = 0, // Номер поля числовой
PLength = 0, // Длинна поля числовая
PStart = 0; // Начальная позиция поля чиловая
// сканирование номеров полей
while ( DI2 != MTemp){
DI3=DI2+3;
String DStr = sDic.substring(DI2,DI3);// Номер поля
DI4=DI3+5;
String DStr2 = sDic.substring(DI3,DI4);// Начальная позиция
DI5=DI4+4;
String DStr3 = sDic.substring(DI4,DI5);// Длинна поля
DI2=DI2+12;
PLength = Integer.parseInt(DStr3,10);// Узнаем длинну поля
PStart = Integer.parseInt(DStr2,10);// Узнаем начало поля
PNum = Integer.parseInt(DStr,10);// Код
byte Pole[] = new byte[PLength];
// Чтение поля из файла
for (int PIndex = 0; PIndex < PLength; PIndex++) {
Pole[PIndex] = MarcRec[PStart+PIndex];
}
String Pol = new String(Pole);
if (Pol == null) Pol=" ";
switch (PNum) {
case 100 : { mAvtor = TagRemove(Pol.substring(5));break;}
case 700 : { msAvtor = TagRemove(Pol.substring(5));break;}
case 245 : { mName = TagRemove(Pol.substring(5));break;}
case 490 : { mSeria = TagRemove(Pol.substring(5));break;}
case 91 : { mBBK = TagRemove(Pol.substring(5));break;}
case 90 : { mKaIndex = TagRemove(Pol.substring(5));break;}
case 260 : { mPrinter = TagRemove(Pol.substring(5));break;}
case 300 : { mSize = TagRemove(Pol.substring(5));break;}
case 653 : { mKey = TagRemove(Pol.substring(5));break;}
default : {}
}// switch
}// конец проверки полей
if ( mAvtor == null) mAvtor=" ";
if ( msAvtor == null) msAvtor=" ";
if ( mName == null) mName=" ";
if ( mPrinter == null) mPrinter=" ";
if ( mSize == null) mSize=" ";
if ( mKey == null) mKey=" ";
MarcRecord Rec = new MarcRecord( mAvtor,
msAvtor,
mName,
mPrinter,
mSize,
mKey,
mSeria,
mBBK,
mKaIndex);
if ( Rec.rAvtor.indexOf(query) != -1 ||
Rec.rsAvtor.indexOf(query) != -1 ||
Rec.rName.indexOf(query) != -1 ||
Rec.rKey.indexOf(query) != -1)
{ mE++;
out.println("<table width=\"461\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">"+
"<tr bgcolor=\"#3399FF\">"+
"<td colspan=\"3\" class=\"text\"> Автор: "+
"<font color=\"#000000\">"+
Rec.rAvtor+" "+
Rec.rsAvtor+
"</font></td></tr><tr>"+
"<td colspan=\"3\" valign=\"top\" class=\"bodytext\">"+mE+". "+mC+
" <b>Название:</b> "+
Rec.rName+"<br>"+
Rec.rPrinter+" "+
Rec.rSize+"<br>"+
Rec.rBBK+" "+
Rec.rKaIndex+" "+
Rec.rSeria+
"</td></tr></table>");
}
fPosMarker = fPosMarker+JIndex;
MTemp = 0;
MIndex = 0;
}
catch (IOException e) {
out.println("Ошибка!!!"+"<br>");
done=true; }
}
}
catch (IOException e) { out.println("Ошибка доступа к "+dbNamePath); }
if (mE == 0) {
out.println("Запос: "+query+" не найден");
}
} // end If
}
// Ридер файла настройки
public void INIFile(String filename, String directory, PrintStream out) {
DataInputStream inifile = null;
String path = null,
iniRecord = null,
section = null,
vname = null,
vvalue = null;
boolean done = false;
int equalIndex = 0;
//
if (filename.length() == 0) {
out.println("IOError ");
System.exit(0);
}
if (directory.length() == 0) { directory = new String("c:\\www\\db"); }
if (filename.indexOf(".") < 0) { filename = new String(filename+".ini"); }
path = new String(directory+System.getProperty("file.separator")+filename);
// открытие файла
try { inifile = new DataInputStream(new FileInputStream(path)); }
catch(FileNotFoundException e) {
out.println(filename+"not found");
System.exit(0);
}
// чтение файла
try { iniRecord = inifile.readLine(); }
catch (IOException e) { done=true; }
while (!done && iniRecord != null)
{ if (iniRecord.startsWith("["))
{ section = iniRecord.substring(1,iniRecord.lastIndexOf("]"));}
else if (!iniRecord.startsWith(";"))
{ equalIndex = iniRecord.indexOf("=");
if (equalIndex > 0)
{ //Имя ключа => Раздел.ключ
vname = new String(section+"."+iniRecord.substring(0,equalIndex));
vvalue = new String(iniRecord.substring(equalIndex+1));
INIProperties.put(vname, vvalue);
}
}
try { iniRecord = inifile.readLine(); }
catch (IOException e) { done=true; }
}
}
// извлечь значение
public String getINIVar(String key, String defValue) {
return INIProperties.getProperty(key, defValue);
}
// извлечь значение
public String getINIVar(String key) {
return INIProperties.getProperty(key);
}
public void init(ServletConfig conf) throws ServletException {
super.init(conf);
}
public void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException
{
PrintStream out;
out = new PrintStream(res.getOutputStream());
res.setContentType("text/html; charset=Cp866");
// Печать заголовка
printPageHeader(out);
INIFile("db.ini","c:\\www\\db",out);
// Определяем кодировку
String requestEnc = req.getCharacterEncoding();
String clientEnc = requestEnc;
if ( requestEnc==null ) requestEnc=iso;
requestEnc=iso;
// Тело
out.println("<body bgcolor=\"#FFFFFF\">");
out.println("<form method=\"get\" action=\"/serv/SearchEngein\">");
out.println(" <table width=\"461\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">");
out.println(" <tr bgcolor=\"#3399FF\"> ");
out.println(" <td width=\"266\" class=\"text\"> Запрос</td>");
out.println(" <td width=\"135\" class=\"text\"> Каталог</td> ");
out.println(" <td width=\"207\"> </td>");
out.println(" </tr>");
out.println(" <tr>");
out.println(" <td width=\"266\" valign=\"top\"> ");
out.println(" <input type=\"text\" name=\"Query\" maxlength=\"100\" size=\"38\" value=\"\">");
out.println(" </td>");
out.println(" <td width=\"135\" valign=\"top\"> ");
out.println(" <select name=\"select\" size=\"1\">");
out.println(" <option value=\"MARCFILE.Book\" selected>"+ConvertISO(getINIVar("KATALOG.Book"))+"</option>");
out.println(" <option value=\"MARCFILE.Stat\">"+ConvertISO(getINIVar("KATALOG.Stat"))+"</option>");
out.println(" <option value=\"MARCFILE.Periud\">"+ConvertISO(getINIVar("KATALOG.Periud"))+"</option>");
out.println(" <option value=\"MARCFILE.Podpis\">"+ConvertISO(getINIVar("KATALOG.Podpis"))+"</option>");
out.println(" <option value=\"MARCFILE.Ucheb\">"+ConvertISO(getINIVar("KATALOG.Ucheb"))+"</option>");
out.println(" </select>");
out.println(" </td>");
out.println(" <td width=\"207\" valign=\"top\"> ");
out.println(" <input type=\"submit\" name=\"Start\" value=\"Поиск\">");
out.println(" </td>");
out.println(" </tr>");
out.println(" </table>");
out.println(" </form>");
// Конец тела
// Взять текст из строки
query = req.getParameter("Query");
if (query == null || query.length()<1)
{
printPageFooter(out);
return;
}
dbselect = req.getParameter("select");
value = new String(ConvertISO(query));
// Чтение файла
dbFileRead(getINIVar(dbselect), out, value);
// Распечатка результата
printPageFooter(out);
query = null;
value = null;
}
// Вывод заголовка документа
private void printPageHeader(PrintStream out) {
out.println("<html>");
out.println("<head>");
out.println("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=Cp866\">");
out.println("<style type=\"text/css\">");
out.println("<!--");
out.println(".text { font: bold 12px Arial, Helvetica, sans-serif; color: #0000FF; text-decoration: none; text-align: left; }");
out.println(".bodytext { font: 12px Arial, Helvetica, sans-serif; color: #000000; text-decoration: none; text-align: left; }");
out.println("-->");
out.println("</style>");
out.println("</head>");
}
private void printPageFooter(PrintStream out) {
out.println("</body>");
out.println("</html>");
out.flush();
}
}
// Класс Запясь для хранения данных считаных из запяси
class MarcRecord {
protected String rAvtor; // Поле автор
protected String rsAvtor; // Поле соавтор
protected String rName; // Поле название произведения
protected String rPrinter; // Поле издатель
protected String rSize; // Поле Объем издания
protected String rKey; // Поле ключевые слова
protected String rSeria;
protected String rBBK;
protected String rKaIndex;
MarcRecord( String r1,
String r2,
String r3,
String r4,
String r5,
String r6,
String r8,
String r11,
String r12) {
rAvtor = r1;
rsAvtor = r2;
rName = r3;
rPrinter = r4;
rSize = r5;
rKey = r6;
rSeria = r8;
rBBK = r11;
rKaIndex = r12;
}
}
Приложение 4
Результаты тестирования программы
Тестирование программы проводилось на 4 массивах данных размером 1000, 5000, 8366, 10000 записей. Метод тестирования заключался в поиске последней записи массива по уникальному названию, чтобы определить время поиска по всему массиву. Полученные данные приведены в таблице и на основе данных построен график (см. график).
График