к оглавлению Flash   Алгоритмизация   4GL - визуальные среды мультимедийные технологии  

Мультимедийный скриптовый язык ActionScript

Переменные и типы данных ActionScript

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

Понятие переменной

Понятие переменной (variable) во многих отношениях является одним из краеугольных камней программирования. В полном соответствии с названием основная характеристика переменных — это их способность изменяться. Пожалуй, переменную проще всего представить себе в виде ящика, в котором могут находиться разные предметы. В программировании переменные способны содержать различного вида данные, обладающие разными значениями. При этом переменная похожа на магазин, на полках которого одни товары приходят на смену другим. Допустим, сначала наш магазин торговал только макаронными изделиями. Затем хозяин решил, что торговлю следует расширить, и включил в ассортимент товаров мясо, рыбу и овощи. Магазин остался тем же самым, возможно, над его дверями даже сохранилась старая вывеска, но теперь его полки заполнены совершенно новыми товарами. Следовательно, изменилось его содержимое.

С точки зрения программиста одной из важных характеристик языка Action-Script является контекстно-зависимая природа переменных. В таких языках, как C++, существуют жесткие правила, требующие, чтобы при объявлении переменной был обязательно указан ее тип — строковый, целочисленный, вещественный и т. п. В ActionScript, как и в других языках сценариев, такие объявления не нужны. При исполнении сценариев ActionScript система автоматически распознает тип данных, хранящихся в той или иной переменной.

Имена переменных

Имя, которое вы даете переменной, должно служить указанием на ее назначение. Такие имена, как VariableA, Variables и им подобные, фактически бесполезны. В отличие от них осмысленные имена переменных, например ItemCost (цена за штуку) или Tax (налог), подсказывают программисту, какая информация хранится в той или иной переменной — такую переменную легко найти, запомнить и использовать в соответствии с ее назначением. Краткие имена переменных, такие как а, Ь, с, хороши при написании очень коротких сценариев, однако при работе над большими и сложными фильмами следует, закончив очередной сценарий, подвергнуть ревизии все использованные идеитификаторы, чтобы переменные получили значимые, «говорящие» имена. Применение осмысленных имен переменных в фильмах Flash важно еще и потому, что сценарии ActionScript обычно невелики по объему и разбросаны по всему фильму. Допустим, вам захотелось изменить значение переменной, которая используется в некоем кадре, входящем в клип, в свою очередь являющийся частью другого клипа. Думаете, вам легко будет вспомнить, что означает в таком контексте переменная k? Определенно нет.

Имя переменной должно представлять собой цепочку символов, в которой нет пробелов между словами. Такие имена, как Pet Store или John Smith, недопустимы. Следует использовать имена вида petstore, Pet_Store или PetStore. Следует также учитывать, что регистр в именах переменных ActionScript не учитывается. Если вы уже назвали какую-то переменную PetStore, то вы не сможете завести другую — с именем PETSTORE или petstore. Однако имя Pet_Store не будет рассматриваться как имя той же самой переменной, поскольку здесь присутствует «лишний» символ — знак подчеркивания. С одной стороны, тот факт, что в именах переменных регистр не имеет значения, облегчает жизнь, поскольку программисту не нужно помнить о том, как именно он назвал некую переменную, BIGSTORE или bigstore, но, с другой стороны, при этом появляется риск случайно использовать идентификаторы BIGSTORE и bigstore как имена разных переменных, каковыми они никак не могут быть. Вы, конечно, вольны считать их разными переменными, но ActionScript с вами никогда не согласится.

Еще одно условие, которое необходимо соблюдать при выборе имен переменных, — это ограничение на использование зарезервированных, или ключевых, слов. Ключевые слова в ActionScript не могут служить именами меток, переменных и функций. Всего в ActionScript существует 16 ключевых слов: break, continue, delete, else, for, function, if, in, new, return, this, typeof, var, void, while, with.

Существуют также два особых литерала (literals) — true и fal se, — которые обозначают логические значения и не могут употребляться как имена переменных. Кроме того, следует избегать использования имен операций, встроенных функций и идентификаторов, которые легко перепутать с «грамматическими» словами языка сценариев ActionScript.

Массивы

В версии Flash 5 появился новый тип переменных — массивы (arrays). В языках сценариев, таких как JavaScript, применяются встроенные массивы, на основе которых создается значительная часть структуры Web-страниц, включая графические изображения и формы. Строго говоря, массивами называются переменные с индексами, которые могут изменяться по одному или нескольким измерениям. Массивы рассматриваются как разновидность объектов (objects). Объектами называются структуры данных, представляющие собой объединение свойств; в данном случае свойствами являются элементы массива. Рассмотрим пример массива Fruits (фрукты), состоящего из четырех элементов:

Fruit[0] = "яблоки"

Frint[l] = "апельсины"

Fruit[2] = "персики"

Fruit[3] = "сливы"

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

Таблица 2.1. Двухмерный массив


Столбец 1

Столбец 2

Строка 1

Var (1,1)

Var (1,2)

Строка 2 Var (2,1) Var (2,2)

Переменная с индексами Var (2,1) позволяет легко и наглядно адресовать ячейку, находящуюся на пересечении первого столбца и второй строки. Именно поэтому массивы пользуются столь большой популярностью у программистов. В дальнейшем вы узнаете, как создавать массивы, — эта тема будет рассмотрена в разделе, посвященном объектам.

Типы данных в языке ActionScript

Строки

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

Airplane = "Фарман"

Именем переменной, представляющей тип самолета, здесь является Ai rpl ane, а строковым литералом (literal) — "Фарман". Строковыми литералами называются данные, которые могут использоваться в качестве значения строковой переменной. В отличие от переменных (тип самолета может измениться в любой момент), литералы всегда остаются сами собой — «Фарман» всегда останется «Фарманом». Иногда в виде строк записывают числа:

StreetNumber = "250"

Значением переменной StreetNumber является строковый литерал, который состоит из десятичных цифр. Вообще говоря, в виде строки можно представить практически любую цепочку алфавитно-цифровых символов. Кроме букв и цифр такая цепочка символов может включать в себя знаки препинания и пробелы. Буквы и цифры могут присутствовать в строковом литерале в любой последовательности. Приведенная ниже строка скорее всего будет иметь смысл лишь для разработчика фильма в формате Flash и для самой системы Flash; подобные строки не демонстрируются пользователям:

MixUp = "Juan2Tree4"

Учтите, что строки — это не числа. Строковый литерал всегда заключается в кавычки. В приведенном выше примере со строкой StreetNumber литерал "250" заключен в кавычки. Если мы сложим "250" и "250", то получим "250250", а не "500".

Выражения

О выражениях принято говорить как о составных (compound) конструкциях, потому что они состоят из двух или нескольких элементов. Приведем пример простого выражения в языке ActionScript: [ Под выражением автор здесь имеет в виду 7+5, а не всю приводимую им строку сценария. — Примеч. перев.]

Total =7 + 5:

Значение переменной Total после выполнения этой инструкции будет равно 12. Рассматриваемое выражение является составным (здесь два слагаемых — 7 и 5), однако значение переменной Total целостно и равно 12, поскольку значение переменной не разбивается на какие бы то ни было поля свойств. Возможно, вы спросите, зачем нужно писать в тексте сценария 7+5, когда можно просто написать 12. Действительно, программисты редко используют настолько простые выражения. Смысл понятия выражения станет для вас более очевидным, если вы взглянете на следующий пример:

Total = ItemCost + Tax;

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

ItemCost =12:

Tax = ItemCost * .08;

sum = ItemCost + Tax;

Сначала мы определяем переменную ItemCost — присваиваем ей значение числовой константы 12. Другая переменная — Tax — получает значение выражения, в котором используется переменная ItemCost, — ее значение умножается на 0,08 (что соответствует 8-процентной ставке торгового налога). Наконец, переменная sum принимает значение еще одного выражения, представляющее собой сумму значений двух упомянутых выше переменных.

До сих пор мы имели дело с довольно простыми выражениями, призванными продемонстрировать лишь общий принцип использования выражений в сценариях. В то же время выражения могут быть и очень сложными, особенно если в них имеется несколько взаимосвязанных переменных. Однако, каким бы сложным ни было то или иное выражение, о том, чтобы правильно вычислить его значение, во всех случаях позаботится компьютер — вам не понадобится ничего высчитывать вручную. Тем не менее при использовании сложных выражений рекомендуется всегда четко и ясно оформлять в тексте сценария все составляющие эти выражения части. Редактор сценариев Action-Script в версии Flash 5 всячески помогает программисту создавать «допустимые», то есть корректные, выражения. Средства создания сложных выражений в ActionScript более подробно рассматриваются в уроке 4.

Конкатенация строк

Операция соединения, или склейки, двух или нескольких строк носит название конкатенации (concatenation). Конкатенация всегда записывается в виде выражения. Для соединения строк в языке ActionScript используется оператор сложения + или строковый оператор add. Рассмотрим пример.

Both = "Джонни" + "Салли"; Both = "Джонни" add "Салли":

В обоих случаях при выполнении конкатенации получается строка "Джонни -Салли". Именно эта строка будет значением переменной Both. Конкатенация часто используется при необходимости соединить строки, связанные в смысловом отношении, например имя и фамилию человека. Вам наверняка не раз доводилось заполнять анкеты, где имя вписывается в одну графу, а фамилия — в другую. Чтобы получить полное имя, при обработке анкеты содержимое соответствующих граф следует объединить. Поскольку между именем и фамилией обычно ставится пробел, необходимо учесть его в конкатенации, как показано ниже:

WholeName = "Джон" + " " + "Дэвис":

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

Другие операции над строками мы рассмотрим в уроке 4.

Логические выражения

В ActionScript используются также логические, или булевы, выражения. Логическое выражение может принимать значения 0 (нет, ложь) и 1 (да, истина). Булевы выражения названы так в честь Джорджа Буля (George Boole), блестящего британского математика. Логические выражения обладают особым статусом в современной науке и программировании. (Краткую биографическую справку о Буле можно найти в Интернете по ссылке http:// encarta.msn.com/find/Condse.asp?ti=058D1000.)

В следующем примере в переменную Bi ддег помещается логическое значение высказывания «10 больше 15». Поскольку это высказывание неверно, переменная Bigger получает значение «ложь». Bigger = 10 > 15

Логическое значение здесь выражается в форме 10 > 15, а не в виде константы (0 или 1). Любому программисту хорошо известно, какую важную роль булевы выражения играют в самых разных алгоритмах. Если у вас совсем нет опыта программирования, поначалу это утверждение может показаться вам сомнительным, однако со временем вы наверняка по достоинству оцените значение логических выражений.

Логические объекты

Применение логических значений весьма разнообразно. Вы можете, например, присвоить логическое значение какой-либо переменной:

BooVar= 9 < 10;

В результате получается значение «истина», однако его можно интерпретировать и как число 1. Предположим, в некоем сценарии используется следующая последовательность команд:

BooVar= 9 < 10;

Total=BooVar + 20;

После выполнения этих инструкций присваивания переменная Total получит значение 21. Чтобы явным образом указывать, какое именно значение имеется в виду в том или ином случае — логическое или какое-то иное, — следует применять логические объекты. Логические объекты служат контейнерами свойств логического типа. В ActionScript предусмотрены три логических объекта:

  • new Boolean () — действует в качестве контейнера логического свойства;
  • toString() — преобразует логическое выражение в строку "true" или "false";
  • valueOf() — возвращает значение логического типа.

В следующем сценарии используются все три вида объектов.

  1. Создается переменная bool Var, которая являет собой имя логического объекта со значением "true", то есть 1, поскольку 8 больше 7.
  2. В переменную s помещается строковое значение переменной bool Var, то есть "true".
  3. В переменной v также сохраняется значение переменной bool Var, то есть логическая константа "true", или 1.
  4. В инструкции присваивания для переменной textVal используется символ + (плюс), который в данном случае обеспечивает конкатенацию, то есть эквивалентен ключевому слову add. Поскольку при конкатенации строки с любым другим (нестроковым) значением возвращается исходная строка с приписанным сзади числом, мы получаем строку true2.
  5. Когда логическое выражение интерпретируется как число, символ + (плюс) трактуется как знак сложения. Получаем 3 (1 + 2 = 3). Именно это число сохраняется в переменной realVal.

booVar = new BooleanC 8 > 7);

s=booVar.toString();

v=booVar.valueOf();

textVal=s + 2;

realVal=v + 2;

output=textVal + newline + realVal;

Переменная output представляет здесь текстовое поле, и результат вычислений будет выведен на экран. Функция newline автоматически позаботится о «возврате каретки»; поэтому результаты предъявляются пользователю в текстовом поле в ясной и четкой форме:

true2

3

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

Числа

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

Числа бывают положительными и отрицательными. Эти разновидности чисел арифметически совместимы. Вы можете создать переменную, в значении которой используются как положительные, так и отрицательные величины. Примеры:

Nuts = -5 + 15;

ReallyNuts = -5 + -15 + 3;

Целые числа

Целые числа в языке ActionScript — это обычные математические целые числа. У них отсутствует дробная часть. При создании числовой переменной вы не обязаны указывать, какой именно числовой тип вам нужен — целочисленный или вещественный. Но если вы хотите создать именно целочисленную переменную, то должны сообщить системе ActionScript о том, что эту переменную необходимо трактовать как целочисленную. Объявление целых чисел осуществляется с помощью функции int. Пример: whole = int(AllStuff / Parts):

Выражение All Stuff / Parts здесь означает, что значение переменной All Stuff делится на значение переменной Parts. Вне зависимости от результата деления функция int обеспечивает на выходе целое число, отбрасывая дробную часть. Например, число 17,9 будет округлено до 17. (Если вы возьмете значение 17,84563, все равно получите 17. Количество десятичных цифр в дробной части здесь не играет никакой роли.)

В фильмах Flash числа часто используются при организации цикла. (Всестороннее рассмотрение проблем, связанных с циклами, вы найдете в уроке 5.) Поскольку каждый шаг любого цикла обычно выполняется целиком как единый шаг программы, некоторые создатели фильмов в формате Flash считают, что все шаги цикла должны обозначаться только целыми числами. Сходным образом, если вы вычисляете номер кадра, следует позаботиться об округлении результата вычислений, поскольку в качестве номеров кадров также используются целые числа (не может быть кадра 7,5).

СОВЕТ

ОКРУГЛЕНИЕ. Если вам нужно, чтобы числа округлялись до ближайшего целого (то есть в большую сторону, когда дробная часть числа больше или равна 0,5, и в меньшую сторону в противном случае), следует применить логическое выражение. Как именно должно выглядеть такое выражение и где его надо использовать, вы увидите в примере, приведенном в конце этого урока. Имейте в виду, что лучше всего ваш компьютер умеет обращаться именно с числами. Вы должны максимально задействовать его вычислительный потенциал.

Вещественные числа

Чтобы предотвратить потерю дробной части числа и добиться большей точности, большинство программистов применяют в работе вещественные числа (real numbers), или числа с плавающей точкой (floating point numbers). По умолчанию все числа в сценариях ActionScript рассматриваются именно как числа с плавающей точкой. Более того, все целые числа в составе различных выражений представляются в форме чисел с плавающей точкой, если отсутствует явное обращение к функции int. Рассмотрим следующий пример.

whole = int(All Stuff / Parts);

SplitWhole = whole / 7;

Если в результате деления значения переменной whole на 7 получится дробное число, переменная SplitWhole также получит дробное значение, несмотря на то что как whol e, так и 7 — числа целые.

Объекты

В ActionScript объектом (object) называется любая коллекция свойств (properties). Вы можете создавать собственные и использовать готовые, предопределенные объекты. Каждое поле свойства обладает именем (name) и значением (value). Например, у объекта может быть свойство с именем _rotation, обозначающее угол поворота и способное принимать значения в интервале от О до 360. Кроме свойств объекты могут располагать методами (methods), или действиями, выполняющими те или иные вычисления или производящими определенные преобразования. К примеру, у логических объектов существует метод, преобразующий логическую константу в строку. Все вопросы, связанные с применением объектов, будут рассмотрены в уроке 8. Кроме того, целый ряд различных типов объектов будет появляться в других уроках. Здесь мы рассмотрим лишь объекты-массивы.

Массивы

Массивом (array) называется объект, содержащий несколько свойств. В общем случае массивы можно считать коллекциями переменных — элементов массива, — снабженных числовыми индексами. Каждый элемент представляет собой отдельное свойство; значением элемента массива является строка, логическая константа или число, соответствующее индексу этого элемента. Элементы массива нумеруются, начиная с нуля; индекс последнего элемента на единицу меньше длины массива. Приведем пример массива из шести элементов.

Friends[0]="Делия":

Friends[l]="Pn4apfl";

Friends[2]="Билл";

Friends[3]="Мелани";

Fnends[4]="Дэвид";

Friends[5]="Патрик";

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

Friends=new Аrrау('Делия". "Ричард". "Билл",

"Мелани", "Дэвид", "Патрик");

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

Friends=new Аггау(6);

Friends[0]="Делия";

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

Таблица 2.2. Методы объекта Array

Метод

concat()

Описание

Конкатенация двух или нескольких массивов

Пример

Group = friends, concat(neighbours)

Результат

Новый массив group будет состоять из всех элементов массивов friends и neighbors

join()

Элементы массива преобразуются в строки и конкатенируются с заданным разделителем

pair= new Array ("Джо" , "Мэй"); together» pair.join(" * ");

Переменная together будет содержать строку Joe * Мае

length

Возвращает длину массива без аргументов

trio=new Array ("Король" , "Королева", "Принц"); royaWength.trio;

Переменная royal получает значение 3

 

Метод

Описание

Пример

Результат

рор()

Удаляет последний элемент из массива; используется без аргументов

Landers=new Array ("Спок", "Боунс", "Сулу", "Смит"); Zapped=landers.pop();

Переменная Zapped будет иметь значение "Смит", а в массиве lenders остаются только три элемента: "Спок", "Боунс" и "Сулу"

push()

Добавляет к концу массива новый элемент и возвращает новое значение длины массива

usTwo= new Array ("Мэй", "Ларри"); опеМоге=usTwo.рush("Керли");

Переменная опеМоге получает значение 3, а массив usTwo будет содержать три элемента: "Мэй", "Ларри" и "Керли"

reverse()

Инвертирует порядок следования элементов массива

right= new Array ("Хуан", "Чуи","Тереза"); rightreverse();

В массиве right будут содержаться три элемента, причем порядок их следования таков: "Тереза", "Чуй", "Хуан"

shift()

Удаляет первый элемент массива и возвращает этот элемент

adios=new Array ("рэп", "свинг", "опера"); diglt=adios.shift();

После выполнения метода shift в массиве adios будут два элемента: "свинг" и "опера", а переменная digit будет иметь значение "рэп"

slice (start, end)

Исходный массив не меняется, но из него берется подмассив с элемента с индексом start до элемента с индексом end (исключая последний). Для получения всех элементов массива, начиная с элемента с индексом start, значение параметра end следует опустить

Pizza=new Array ("грибы", "килька", "маслины"); piece=pizza.slice(0,2);

Массив piece будет состоять из двух элементов: "грибы" и "килька". Содержимое массива pizza не меняется

sort()

Сортировка элементов массива

bakeArray=new Array ("M", "B", "D","P"); chooseEm=bakeArray.sort();

Массив chooseEm содержит элементы исходного массива в алфавитном порядке: "В", "D", "М" и "Р"

 

Метод

Описание

Пример

Результат

splice (start, deleteN, v0 vl...vN)

Удаляет заданное параметром deleteN число элементов массива, начиная с элемента с индексом start, а также добавляет к массиву элементы v0 — vN на место удаленного

weather=new Array ("дождь", "снег", "мокрый снег", "град"); weather.splice(3, 1, "хорошая погода");

В результате вызова метода splice четвертый элемент массива weather — строка "град" (не забудьте, что нумерация начинается с 0) — удаляется, а строка "хорошая погода" добавляется к массиву. В результате он будет состоять из четырех элементов: "дождь", "снег", "мокрый снег" и "хорошая погода"

unshift (v0)

Ничего не удаляя, размещает в начале массива новый элемент и возвращает новое значение длины

pigHouse=new Array ("солома", "древесина", "кирпич"); a=pigHouse. unshift ("сталь");

Массив pigHouse будет состоять из элементов "сталь", "солома", "древесина" и "кирпич". Переменная а получает значение 4

 

Клипы

В языке ActionScript существует особый тип данных для представления клипов. Это единственный тип данных, который обеспечивает ссылку на графическую информацию. Так же как у массивов, у объекта клипа MovieClip есть особые методы. В последующих уроках вы будете периодически сталкиваться с объектами MovieClip; подробные сведения о работе с ними будут предоставляться по мере необходимости. В целом можно сказать, что клипы чаще выступают объектами, на которые направлено воздействие со стороны других объектов, нежели источниками команд для иных объектов. Клипы способны лишь отдавать команды другим клипам и переходить к определенным кадрам. Ниже приводится несколько примеров, связанных с использованием объектов MovieClip. В этих примерах экземпляр flame представляет собой ссылку на некоторый клип.

f1ame.gotoAndStop( 8 );

flame.gotoAndPlay(6);

flame.play();

flame.stop():

flame.nextFrame();

Один из важнейших элементов клипа — это имя его экземпляра. Множество оши-бок в сценариях ActionScript связано с тем, что разработчики забывают включить в текст сценария имя экземпляра. Это имя не обязано совпадать с меткой клипа. Чтобы поставить в соответствие всем клипам определенные имена экземпляров, следует воспользоваться средствами панели Instance (Экземпляр). Рекомендуется позаботиться о назначении имени экземпляра сразу по завершении работы над клипом.


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

НОВОСТИ ФОРУМА

Форум Рыцари теории эфира


Рыцари теории эфира
 10.11.2021 - 12:37: ПЕРСОНАЛИИ - Personalias -> WHO IS WHO - КТО ЕСТЬ КТО - Карим_Хайдаров.
10.11.2021 - 12:36: СОВЕСТЬ - Conscience -> РАСЧЕЛОВЕЧИВАНИЕ ЧЕЛОВЕКА. КОМУ ЭТО НАДО? - Карим_Хайдаров.
10.11.2021 - 12:36: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от д.м.н. Александра Алексеевича Редько - Карим_Хайдаров.
10.11.2021 - 12:35: ЭКОЛОГИЯ - Ecology -> Биологическая безопасность населения - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> Проблема государственного терроризма - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ПРАВОСУДИЯ.НЕТ - Карим_Хайдаров.
10.11.2021 - 12:34: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вадима Глогера, США - Карим_Хайдаров.
10.11.2021 - 09:18: НОВЫЕ ТЕХНОЛОГИИ - New Technologies -> Волновая генетика Петра Гаряева, 5G-контроль и управление - Карим_Хайдаров.
10.11.2021 - 09:18: ЭКОЛОГИЯ - Ecology -> ЭКОЛОГИЯ ДЛЯ ВСЕХ - Карим_Хайдаров.
10.11.2021 - 09:16: ЭКОЛОГИЯ - Ecology -> ПРОБЛЕМЫ МЕДИЦИНЫ - Карим_Хайдаров.
10.11.2021 - 09:15: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Екатерины Коваленко - Карим_Хайдаров.
10.11.2021 - 09:13: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вильгельма Варкентина - Карим_Хайдаров.
Bourabai Research - Технологии XXI века Bourabai Research Institution