русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Занятие 4. Основы объектно-ориентированного программирования


Дата добавления: 2015-06-12; просмотров: 1447; Нарушение авторских прав


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

После создания проекта появится заготовка нашей будущей программы. Закомментированные фрагменты при создании программы можно удалить. В самом верху можно создать наш комментарий:

// Урок №4

Прежде,чем приступить к изучению объектно-ориентированного программирования, нам нужно познакомиться ещё с одним типом данных, который называется логическим типом переменных. Переменная логического типа Boolean изначально может принимать только два значения: либо true (чтоозначает истина),либо false(чтоозначает ложь).Такой тип данных используется, если нужно иметь два варианта значения:например: да – это true, а нет – это false (или: включеноtrue, а выключеноfalse). Этот тип переменной очень часто используется в языке Java.

Объявляются переменные данного типа следующим образом:

Boolean val = true;

Переменнаяvalможет принимать только два значения. Сейчас она имеет значение true, можем присвоить ей другое значение:

val = false;

А сейчас приступим к изучению объектно-ориентированного программирования.

Для начала следует познакомиться с такими понятиями как объект и класс.

Давайте представим такую картину: есть некий зоопарк, в нём живёт множество разнообразных животных. У директора зоопарка есть описание всех животных, в котором указаны характеристики, присутствующие у всех животных, живущих в зоопарке. Сделано оно в виде таблицы. Например:

Таблица №1

Животное Масса, кг Подводное Сухопутное Умеет летать
Слон нет да нет
Тигр нет да нет
Орел нет да да

Так вот, в понятиях объектно-ориентированного программирования, любое животное зоопарка является объектом, а описание, характеризующее это животное,называется классом. Класс – это инструкция, шаблон, описание. Объектже – это нечто реальное,объект обладает конкретными характеристиками, свойствами. Какой может быть объект в нашем случае? В нашем случае "Слон", "Тигр", "Орел" - это объекты. Они обладают характеристиками, описанными в нашем классе. Т. е., класс один – "животные", и на основании этого класса можно подобрать любое количество животных разного типа.



Можно рассмотреть в качестве примера образование еще одного класса - "автомобили". Создадим для этого класса определенные характеристики, например: масса автомобиля, его максимальная скорость, цвет,марка. А когда на заводе по этим характеристикам будет создан конкретный автомобиль: определённого цвета, марки, имеющий определённую массу, – это будет уже конкретный объект. Если создать другой автомобиль: другого цвета, другой марки, имеющий другую массу – получится ещё один объект. Получается, на основании одного класса, на основании одного описания, шаблона, можно создавать любое количество объектов: сотни, тысячи и даже миллионы.

Класс сам по себе не является объектом, класс – инструкция по созданию объектов. При создании программы на языке программирования Java можно создавать подобные классы. Попробуем это сделать. Необходимо опуститься в самый низ программного кода. Для создания класса используется специальное слово - class. Оно выделяется таким же цветом, как и все служебные специальные слова. После этого слова пишется имя класса. Назовём наш класс givotn (от слова животное).Имя класса формируется точно так же, как имя переменной. По вашему усмотрению,оно может содержать буквы, цифры, символы нижнего подчеркивания. Цифра не может стоять самой первой. Желательно в наименовании класса хотя бы приблизительно отражать его смысл, чтобы было понятно, зачем он создан. После объявления класса следует записать открывающую фигурную скобку и закрывающую фигурную скобку:

// Урок №4

public class prog4 {

public static void main(String[] args) {

}

}

class givotn

{

}

Теперь следует создать в нашем классе поле целого типа,которое назовем mas (от слова масса,которая определяется в цифрах). Следующее поле, которое нам необходимо создать- признак, является ли животное подводным. Этот признак пусть называется podvod. Переменная,обозначающая этот признак, может принимать всего два значения – "да"и "нет", поэтому данная переменная будет логического типа Аналогично можно ввести еще две характеристики - является ли животное сухопутным и является ли оно летающим, назовем их suhoputиlet:

class givotn

{

int mas;

boolean podvod;

boolean suhoput;

boolean let;

}

Таким образом, было создано несколько характеристик,описывающих животное, другими словами мы создали в программе класс. Теперь можно приступить к созданию объекта. Как только был создан class, в этот момент появился новый типс названием этого класса. Этот тип сложнее типов, рассмотренных нами ранее. Можно создать переменную с именем slon типа givotn,и мы создадим тем самым сразу новый, реальный объект.

// Урок №4

public class prog4 {

public static void main(String[] args) {

givotn slon = new givotn();

}

}

class givotn

{

int mas;

boolean podvod;

boolean suhoput;

boolean let;

}

Можно сделать вывод - для того чтобы создать реальный объект, сначала нужно создать переменную с именем, соответствующим этому объекту (в данном случае givotn slon) так же, как мы создавали переменныецелого типа, типа строка или типа символ.Тип новой переменной точно совпадает с именем класса. Конструкция new givotn() создаёт новый объект:реальный объект, который называется slon. После создания объекта следует определить его характеристики. Характеристики объекта указываются через точку(точка в этом случае будет являться оператором). После того как после имени объекта, в данном случае после переменной slon, будет поставлена точка, воткрывшемся окне появившиеся верхние 4 поля – это поля, созданные ранее характеристики объектов нашего класса (cм. рисунок 35):

Рисунок 35

Можно ввести характеристики нашего объекта. Начнем с массы –следует выбрать характеристику mass. Массу можно взять из таблицы №1,у слона указана масса - 5400 кг. Зададим следующую характеристику - является ли слон подводным животным. Для указания этого признака служит переменная podvod, она была определена как переменная логического типа, принимающая лишь два значения – "да"/"нет" ("истина"/"ложь" - "true"/"false"). Поскольку, очевидно, слон не является подводным животным, указываем у этой характеристики значение "false"("нет"). Аналогично можно задать характеристики suhoput (является ли слон сухопутным животным) и let (летает ли слон). Очевидно, значение характеристики suhoput будет "true"("да"). А значение характеристики let будет "false"("нет"). В итоге получим следующий программный код:

// Урок №4

public class prog4 {

public static void main(String[] args) {

givotn slon = new givotn(); // В этой строке создается объект Слон

slon.mas = 5000; // Указываем массу Слона

slon.podvod = false; // Указываем признак Подводного животного - Ложь

slon.suhoput = true; // Указываем признак Сухопутного животного - Ложь

slon.let = false; // Указываем признак Летающего животного - Ложь

}

}

class givotn

{

int mas;

boolean podvod;

boolean suhoput;

boolean let;

}

Переименуем переменнуюslon впеременную slon1.Тогда программный код приобретет следующий вид:

givotn slon1 = new givotn(); // В этой строке создается объект Слон

slon1.mas = 5000; // Указываем массу Слона

slon1.podvod = false; // Указываем признак Подводного животного - Ложь

slon1.suhoput = true; // Указываем признак Сухопутного животного - Ложь

slon1.let = false; // Указываем признак Летающего животного - Ложь

Скопируйте эти строчки, вставьте их ниже и переименуйте в скопированных строчках переменную slon1 в переменную slon2.Предположим, слон под номером 2 весит 6000 кг. Остальные характеристики, как вы догадываетесь, у него те же самые, программный код приобретет следующий вид:

givotn slon1 = new givotn();

slon1.mas = 5000;

slon1.podvod = false;

slon1.suhoput = true;

slon1.let = false;

givotn slon2 = new givotn();

slon2.mas = 6000;

slon2.podvod = false;

slon2.suhoput = true;

slon2.let = false;

Итак, мы создали один класс под названием givotn. Класс – это шаблон, описание и по нему, как по инструкции, можно создавать любое количество разных объектов с разными характеристиками. Вот в данном случае мы создали два объекта, можно создать ещё сколько угодно таких объектов.

Описание класса находится вне зависимости от числа объектов класса в самой нижней части программы. Тело класса открывают и закрывают фигурные скобки (cм. рисунок 36).

Рисунок 36

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

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

§ ширина;

§ высота;

§ расположение – координаты (x,y) левой верхней угловой точки по отношению к экрану (т.к. если окно передвинуть, эта характеристика изменится).

Можно убрать созданный нами класс животных и объекты данного класса, а вместо этого создать класс под названием okno(с указанными выше характеристиками),и на основании этого класса создать объект под названием myOkno1,получится такой код:

// Урок №4

public class prog4 {

public static void main(String[] args) {

okno myOkno1 = new okno(); // Создание объекта

}

}

// Создание класса

class okno

{

int shirina; // Ширина окна

int visota; // Высота окна

int pX; // Отступ верхнего левого угла от левой части экрана

int pY; // Отступ верхнего левого угла от верхней части экрана

}

Мы создали класс okno.Указали нужные характеристики этого класса:

§ ширина;

§ высота;

§ координата верхней левой угловой точки окна по Х;

§ координата верхней левой угловой точки окна по Y.

Класс okno является описанием всех окон, которые мы будем создавать. Для этого класса определены четыре поля - характеристики окна. После этого был создан новый объект myOkno1, обладающий характеристиками класса okno (создана переменная типаokno). Зададим характеристики нашего объекта. Пусть ширина окна будет 300 пикселей, высота – 200 пикселей. Допустим, координата по Хбудет 10, координата по Y – 20:

okno myOkno1 = newokno();

myOkno1.shirina = 300;

myOkno1.visota = 200;

myOkno1.pX = 10;

myOkno1.pY= 20;

Зададим еще одно окно с другими характеристиками. Для этого нам нужно будет создать еще один объект, назовем переменную, определяющую этот объект - myOkno2.Т. к. характеристики у объектов myOkno1 и myOkno2 одни и те же, меняются только их значения,можно скопировать код, определяющий объект myOkno1и изменить его для объекта myOkno2. Получится следующий программный код:

okno myOkno1 = newokno();

myOkno1.shirina = 300;

myOkno1.visota = 200;

myOkno1.pX = 10;

myOkno1.pY = 20;

okno myOkno2 = new okno();

myOkno2.shirina = 600;

myOkno2.visota = 700;

myOkno2.pX = 50;

myOkno2.pY = 90;

Класс характеризуется тем, что все признаки определены внутри класса. Т.е., принадлежат этому классу. Мы имеем целостную структуру,содержащую несколько характеристик – некий "контейнер" с характеристиками. Напишем следующую программу:

// Урок №4

import javax.swing.*; // Подключение библиотеки для работы с окнами

public class prog4 {

public static void main(String[] args) {

// Создаем объект на основании класса JFrame

JFrame nf = new JFrame();

// Устанавливаем параметры его расположения, ширину,высоту

nf.setBounds(100, 50, 500, 300);

// Показываем окно на экране

nf.setVisible(true);

}

}

Строка importjavax.swing.*подключает к нашей программе библиотеку для работы с окнами.

Строка JFramenf = new JFrame()создает объект типа JFrameэто класс окон, класс, который уже создан для нас с вами, чтобы на основании этого класса могли создавать конкретные объекты - окна. Т.к. сейчас мы пользуемся готовым классом, то внизу программы мы не создаем новый класс. Другими словами мы можем создавать свои классы, а можем использовать уже существующие.

Итак, мы воспользовались классом JFrame,объявили переменную nfтипаJFrame, и создали новый объект. Запись new JFrame()- это создание нового объекта. Имя переменной может быть любым в соответствии с правилами объявления переменных.

В строке кода

nf.setVisible(true);

используется тип – boolean.В данном случае указано одно из двух его значений, которое означает истина– true: ("Показать окно?", "Да,показать"). Если сейчас запустить программу, мы увидим реальное окно –объект, созданный нами на основании класса окон. Этот класс изначально предоставляется средой разработки Java, т.е.он уже создан для пользователей, чтобы на его сновании можно было создавать свои окна. Класс у нас один – JFrame, но на его сновании можно создать сколько угодно объектов, т.е. окон.

Рассмотрим еще одну очень важную тему – понятие наследования.Это понятие очень тесно связанно с объектно-ориентированным программированием.Понятие наследования нам понадобится для создания программ с элементами компьютерной графики. Вспомните – мы создавали класс под названием животныеgivotn с несколькими характеристиками.Предположим, теперь нам нужно создать класс слоновslon. Мы создадим этот класс слонов при помощи наследования - наследования от класса животных. Слон – разновидность животного.Все характеристики, которыми обладают животные, присущи и слонуслона тоже есть масса, есть признаки – является ли он подводным,летающим или сухопутным. Следовательно, класс слонможно создать на основаниидругого класса – животные.Все свойства класса животные при этом автоматически перетекают в класс слон. Это и есть принцип наследования: слон сразу же,автоматически получил свойства животных, т.е., массу и 3 признака, т.е.,в данном случае, класс слон является потомком класса животные. (cм. рисунок 37).

Рисунок 37

Класс животные является родительским классом класса слон.Класс слон произошел от класса животные. Предположим, нам важно знать скорость передвижения слонов. Значит, в класс слон нужно добавить ещё одну дополнительную, пятую, характеристику – скорость передвижения.Остальные признаки, характеризующие всех животных, в классе слонуже есть. Это удобно, т. к. при создании нового класса не приходится заново прописывать уже обозначенные в существующем классе свойства. Кроме того,программный код получается менее громоздким. При помощи принципа наследования мы освобождаем себя от рутинной работы: прописав сначала свойства, присущие всем животным, - мы эту работу выполнили раз и навсегда. Классу слон мы только добавляем свойства, характеризующие конкретно слонов, т.е. дополняем признаки, присущие слонам и необходимые в нашей задаче.

Добавим новый класс под названием орёл. Этот класс тоже наследуется от класса животные и является его дочерним классом.Класс животные – родительский класс. Класс орёл тоже приобрел свойства класса животные: масса и 3 характеристики, прописанные в программном коде. В случае орла, нам интересно знать высоту его полёта.Значит, к свойствам, присущим всем животным, в класс орлов нужно добавить новую характеристику (cм. рис 37).Программный код будет в этом случае выглядеть так:

// Урок №4

public class prog4 {

public static void main(String[] args) {

}

}

// Класс животных

class givotn

{

int mas;

boolean podvod;

boolean suhoput;

boolean let;

}

//Класс слонов, наследуется от класса животных

class slon extends givotn

{

int skorost; // Скорость передвижения

}

//Класс орлов, наследуется от класса животных

class orel extends givotn

{

int visota; // Высота полета

}

Класс givotnмы уже создавали ранее. Теперь у этого класса у нас добавились еще два подкласса. Первый класс под названием slon.Слово extends означает: класс slon наследуетсяот класса givotn, т.е.наследует,копирует все характеристики этого класса.Это действие и прописано в строке:

class slon extends givotn

После объявления этого класса внутри фигурных скобок указали одну характеристику, которая присуща только классу слонов:

{

int skorost; // Скорость передвижения

}

Остальные четыре поля в классе slonуже существуют, они прописаны в классе givotn. Как только была создана строка

class slon extends givotn

эти четыре поля автоматически появились в классе slonнаследовались.

Теперь рассмотрим другой класс под названием orel. Он также наследуется от класса givotn.И мы также указываем только одну характеристику, присущую только этому классу,а остальные прописаны в классе givotn:

{

int visota; // Высота полета

}

Таким образом, был создан базовый класс –основной (родительский)класс под названием givotn, имеющий 4 поля – 4признака, характеристики. А потом путём наследования от класса givotn был создан класс slon,затем класс orel. В каждый их этих классов было добавлено по одному новому полю – их индивидуальные характеристики: для класса slon - скорость передвижения, для класса orel – высота полёта. Таким образом, была создана структура, иерархия классов. Попробуем создать два объекта – слона и орла:

// Урок №4

public class prog4 {

public static void main(String[] args) {

slon mySlon = new slon(); // Создан объект слон

mySlon.mas = 5000;

mySlon.let = false;

mySlon.podvod = false;

mySlon.suhoput = true;

mySlon.skorost = 15; // Задана скорость передвижения слона

orel myOrel = new orel(); // Создан объект орел

myOrel.mas = 5;

myOrel.let = true;

myOrel.podvod = false;

myOrel.suhoput = true;

myOrel.visota = 1000; // Задана высота полета орла

}

}

// Класс животных

class givotn

{

int mas;

boolean podvod;

boolean suhoput;

boolean let;

}

//Класс слонов, наследуется от класса животных

class slon extends givotn

{

int skorost; // Скорость передвижения

}

//Класс орлов, наследуется от класса животных

class orel extends givotn

{

int visota; // Высота полета

}

Таким образом, мы создали два объекта: первый на основании класса slon, а второй на основании класса orel. Объекты созданы по все по той же схеме: первоначально объявляется переменная с типом нужного класса - создается объект. Далее, вводим имя объекта, в данном случае mySlon и myOrel в самом конце ставим оператор точка .и выбираем из списка нужную характеристику объекта. Главное, на что стоит обратить внимание – это то, что у объектов mySlonи myOrelчетыре характеристики совпадают, потому что они унаследованы от класса givotn.

А одна характеристика у каждого объекта своя, у mySlon– это skorost,а у myOrel– это visota(cм. рисунок 38).

Рисунок38

Если посмотреть на описание наших трех классов, то вы увидите, что в классах slonиorel определено всего по одному полю, но при задании характеристик объектам используются и четыре поля из класса givotn. Это происходит благодаря наследованию!

// Класс животных

class givotn

{

int mas;

boolean podvod;

boolean suhoput;

boolean let;

}

//Класс слонов,наследуется от класса животных

class slon extends givotn

{

int skorost; // Скорость передвижения

}

//Класс орлов,наследуется от класса животных

class orel extends givotn

{

int visota; // Высота полета

}

Слово extendsпри описании класса – это и есть признак наследования от другого класса, в данном случае от класса givotn.Как только вы указали наследование – вы можете считать, что скопировали в этот класс все, что было в классе, от которого вы наследуете свой новый класс. Так работает принцип наследования в объектно-проектированном программировании.

Без создания классов, объектов невозможно написать полноценное компьютерное приложение.

В качестве примера давайте создадим программу, которая выведет окно на экран, внутри которого нарисован зеленый прямоугольник (cм. рисунок 40).

Рисунок 40

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

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

Перед началом работы следует удалить из программы код, описывающий классы и объекты, оставив только начальную заготовку программы:

// Урок №4

public class prog4 {

public static void main(String[] args) {

}

}

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

// Урок №4

// В этих двух строках подключаются библиотеки для работы с окнами и графикой

import java.awt.*;

import javax.swing.*;

public class prog4 {

public static void main(String[] args) {

// Создание объекта на основании класса myFrame

myFrame okno = new myFrame();

}

}

// Создается новый класс, который наследуется от класса JFrame -класса окон

class myFrame extends JFrame

{

// Метод, который производит начальную настройку окна

public myFrame()

{

// Создаем объект на основании класса myPanel

myPanel panel = new myPanel();

Container cont = getContentPane(); // Обращаемся к содержимому окна

cont.add(panel); // Подключаем (вкладываем) созданную панель в окно

setBounds(10, 10, 300, 400); // Устанавливаем положение и размеры окна

setVisible(true); // Делаем окно видимым

}

}

//Создается новый класс, который наследуется от класса JPanel -класса панелей

// окна

class myPanel extends JPanel

{

// Метод, который рисует содержимое панели окна

public void paintComponent(Graphics gr)

{

super.paintComponent(gr); // Выполняем перерисовку самой панели окна

gr.setColor(Color.GREEN); // Устанавливаем ЗЕЛЕНЫЙ ЦВЕТ

gr.fillRect(10, 10, 200, 300); // Рисуем закрашенный прямоугольник

}

}

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

Проанализируем программный код.В самом верху этой программы есть главный класс, который был у нас с самого начала, а ниже созданы два новых класса: первый из них – это класс окна,который наследуется от класса всех окон, второй из них – это класс панели,который наследуется от класса всех панелей (cм.рисунок 41).

Рисунок 41

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

myPanel panel = new myPanel(); // Создаем объект на основании класса myPanel

Container cont = getContentPane(); // Обращаемся к содержимому окна

cont.add(panel); // Подключаем (вкладываем) созданную панель в окно

В первой строчке создается объект – панель, во второй строке используется переменная cont,она отвечает за содержимое окна. В третьей строке панель прикрепляется к окну.

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

Рисование прямоугольника происходит в этой части кода:

// Метод,который рисует содержимое панели окна

public void paintComponent(Graphics gr)

{

super.paintComponent(gr); // Выполняем перерисовкусамой панели окна

gr.setColor(Color.GREEN); // УстанавливаемЗЕЛЕНЫЙ ЦВЕТ

gr.fillRect(10, 10, 200, 300); // Рисуем закрашенный прямоугольник

}

Методpublic void paintComponent(Graphics gr)отвечает за рисование содержимого панели, которая вложена в окно.

Строка:

super.paintComponent(gr);

выполняет рисование самой панели. Следующая строка устанавливает цвет, которым будет происходить рисование:

gr.setColor(Color.GREEN);

а следующая за ней строка выводит на панель закрашенный указанным цветом прямоугольник:

gr.fillRect(10, 10, 200, 300);

В круглых скобках указаны четыре параметра, первый – это отступ в пикселях от левой стороны окна до верхнего левого угла прямоугольника; второй – это отступ в пикселях от верхней стороны окна до верхнего левого угла прямоугольника; третий – ширина прямоугольника;четвертый – высота прямоугольника. Попробуйте по очереди изменять значения этих параметров, запуская программу на выполнение после изменения значения и проанализировать результат наших изменений.



<== предыдущая лекция | следующая лекция ==>
Занятие 3. Основные алгоритмические конструкции | 


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.864 сек.