Розробка програмного забезпечення для аналізу сучасного стану соціальних медіа

Соціальні медіа, їх функціональні особливості та напрямки вивчення. Вибір мови програмування та загальна структура програми, вимоги до неї, аналіз і зберігання отриманих даних. Розробка моделі поведінки у соціальних медіа, оцінка кількості користувачів.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык украинский
Дата добавления 18.04.2015
Размер файла 2,0 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

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

Під час попереднього вивчення теми аналізу було відзначено, що в межах дослідження мережі Інтернет, та її аудиторії, зустрічалися певні опитування користувачів, та дослідження, що певної мірою стосувалися соціальних медіа. Проте аналізу саме соціальних медіа невідомо.

Розвиток досліджень соціальних медіа має широкі перспективи. Дослідження будуть продовженні, як з використання створеного в рамках роботи ПЗ, так і із створенням нового, з додатковою функціональністю, із розміщенням у інших популярних соціальних медіа, зокрема, у соціальних мережах, що додають певних переваг у дослідженні.

За матеріалами дипломної роботи була зроблена доповідь на науково-практичній конференції «Спецпроект: анализ научных исследований», та надруковано тези доповіді[1].

Список використаної літератури

1. Короїд О. «Дослідження інформаційного простору соціальних медіа за допомогою сучасних комп'ютерних технологій» // Матеріали IV Міжнародної науково-практичної конференції «Спецпроект: анализ научных исследований» Том 2. Дніпропетровськ, 30-31 травня 2011 року - 2011 - 104 с.

2. Manovich, Lev. The Language of New Media // Cambridge: MIT Press/Leonardo Books - 2001 - 233 р.

3. Kaplan, Andreas M.; Michael Haenlein. Users of the world, unite! The challenges and opportunities of Social Media // Business Horizons - 2010 - 505 p.

4. Журнал ТОП 10 Сити-гайд по Киеву [Електронний ресурс]; Украина идет в Facebook // Палий П. 2010. Режим доступу: http://top10.ua/gadgets/2010/08/10/ukraina-idet-v-facebook

5. Майк Далворт. Социальные сети. Руководство по эксплуатации // Добрая книга - 2010 г. - 248 с.

6. Клара Ших. Эра Facebook. Как использовать возможности социальных сетей. // Манн, Иванов и Фербер - 2010, 304 с.

7. «В Контакте» [Електронний ресурс]; Опис сайту. // Дуров. П., 2012. Режим доступу: http://vkontakte.ru/help.php? page=about

8. WebNote [Електронний ресурс]; Количество украинских пользователей ВКонтакте и Facebook // Стастика за даними TNS Ukraine, 2011. Режим доступу: http://webnote.com.ua/note/short/292-vk-fb-ukr

9. Колін Мук. ActionScript 3.0 для Flash. Подробное руководство // Питер - 2009 - 992 с.

10. BIGMIR-Internet [Електронний ресурс]; Глобальная статистика интернета // Дані компанії Bigmir, 2012 Режим доступу: Режим доступу: http://index.bigmir.net/

11. Глобальная статистика украинского интернета. BIGMIR-Internet // Новий друк - 2012 - 12 с.

12. «В Контакте» [Електронний ресурс]; Розробникам // 2011 Режим доступу: /http://vkontakte.ru/developers.php/

13. Р.Л. Агабекян, М.М. Кириченко, С.В. Усатиков Математические методы в социологии. Анализ данных и логика вывода в эмпирическом исследовании. Учебное пособие для вузов Серия: Высшее // Феникс - 2005 - 192 с.

14. Справочные материалы Adobe [Електронний ресурс]; Adobe Flash Professional CS5 & CS5.5 // Электронный справичник Adobe, 2011, Режим доступу: http://help.adobe.com/ru_RU/flash/cs/using/index.html

15. Использование ADOBE FLASH PROFESSIONAL // Adobe. Технічна документація - 2011 - 574 с.

16. Укрстат [Електронний ресурс]; Статистичны дані населення України // Державна служба статистики України, 2012. Режим доступу: http://www.ukrstat.gov.ua/738826res/

17. КМІС [Електронний ресурс]; Динаміка проникнення Інтернету в Україні // Київський міжнародний інститут соціології - 2012, Режим доступу: http://kiis.com.ua/ua/news/view-153.html

Додаток А

Лістинг коду програми.

package friends {

import flash.net.*;

import flash.display.*;

import flash.events.*;

import flash.text.*;

import flash.system. LoaderContext;

import fl.controls. Label;

import fl.controls. ComboBox;

import flash.text.*;

import flash.external. ExternalInterface;

import fl.data. DataProvider;

import fl.livepreview. LivePreviewParent;

public class Main extends MovieClip {

private var api_id: Number = 2322684 // id приложения

private var sid: String = '162f079c1df94bbb87c91e8cf77c5e4efa1cc1c863e4aab8424ac4d2e6bde3'; private var secret: String;

private var api_url: String = 'http://api.vk.com/api.php';

private var serverURL: String = «http://grety.fvds.ru/»// Путь к серверу

private var id_viewer: Number = 3901759;

private var auth_key: String;

private var photo_url: String;

private var player_name: String;

private var first_name: String;

private var last_name: String;

private var xmlloader:URLLoader = new URLLoader();

private var stat_loader:URLLoader = new URLLoader();

private var listFriendsLoader:URLLoader = new URLLoader();

private var listCityLoader:URLLoader = new URLLoader();

private var listGroupLoader:URLLoader = new URLLoader();

private var appData: Data;

private var changeList: ChangeList;

private var statistica: Statistica;

private var fullTable: FullTable;

private var map: Map;

private var friendsStatistica: FriendsStatistica;

private var loadBar: LoadBar;

public function Main()

{

this.addEventListener (Event.ADDED_TO_STAGE, onAddedToStage);

 // Загружаем id

id_viewer = parseInt (LoaderInfo (root.loaderInfo).parameters.viewer_id);

auth_key = LoaderInfo (root.loaderInfo).parameters.auth_key;

if (int (LoaderInfo (root.loaderInfo).parameters.viewer_id)>0)

 // secret для генерации сигнатуры

secret = LoaderInfo (root.loaderInfo).parameters.secret;

 // id сессии

sid = LoaderInfo (root.loaderInfo).parameters.sid;

 // адрес API-сервиса

api_url = LoaderInfo (root.loaderInfo).parameters.api_url;

api_id = LoaderInfo (root.loaderInfo).parameters.api_id;

};

var xmlNames:XML;

xmlNames = new XML (LoaderInfo (root.loaderInfo).parameters.api_result);

if (isNaN (id_viewer))

{

id_viewer = 1000; // Для тестирования

first_name = 'Локальный';

last_name = 'Локальный';

}

else

{

player_name = xmlNames..first_name.toString() + «»

first_name = xmlNames..first_name.toString();

last_name = xmlNames..last_name.toString();

}

appData = new Data (id_viewer, auth_key, secret, sid, String (api_id), api_url, player_name, testMode);

changeList = new ChangeList(appData);

statistica = new Statistica(appData);

fullTable = new FullTable(appData);

friendsStatistica = new FriendsStatistica(appData);

appData.addEventListener (Data.NOT_LOAD, onNotLoad);

appData.addEventListener (Data.BEGIN_LOAD_CHANGES_DATA, onBeginLoad);

appData.addEventListener (Data.END_LOAD_CHANGES_DATA, onEndLoad);

changeList.x = 30;

changeList.y = 50;

statistica.x = 30;

statistica.y = 50;

fullTable.x = 30;

fullTable.y = 50;

friendsStatistica.x = 565;

friendsStatistica.y = 50;

 // Определяем был ли раньше такой пользователь, если нужно, то создаем, фиксируем заходы в приложение

var stat_vars:URLVariables = new URLVariables();

var stat_request:URLRequest = new URLRequest (

serverURL + «new_friends.php»); // Скрипт при загрузке приложения

stat_request.method = URLRequestMethod.POST;

stat_vars ['id_player'] = id_viewer;

stat_vars ['first_name'] = first_name;

stat_vars ['last_name'] = last_name;

stat_vars['bdate'] = xmlNames..bdate.toString();

stat_vars['city'] = xmlNames..city.toString();

stat_vars['country'] = xmlNames..country.toString();

stat_vars ['auth_key'] = auth_key;

stat_request.data = stat_vars;

stat_loader.load (stat_request);

stat_loader.addEventListener (Event.COMPLETE, onCompleteLoad);

stat_loader.addEventListener (IOErrorEvent.IO_ERROR, onErrorConnectToServer);

private function loadFriends():void

 // Загружаем список друзей

{

if (int (LoaderInfo (root.loaderInfo).parameters.viewer_id)>0)

{

 // id просматривающего приложение

 //id_viewer = LoaderInfo (root.loaderInfo).parameters.viewer_id;

 // secret для генерации сигнатуры

secret = LoaderInfo (root.loaderInfo).parameters.secret;

 // id сессии

sid = LoaderInfo (root.loaderInfo).parameters.sid;

 // адрес API-сервиса

api_url = LoaderInfo (root.loaderInfo).parameters.api_url;

api_id = LoaderInfo (root.loaderInfo).parameters.api_id;

};

 // параметры для отправки запроса

var request_params: Object = new Object();

request_params.api_id = api_id;

request_params.method = 'friends.get';

request_params.fields = 'uid, first_name, last_name, sex, bdate, city, contacts, education'// , domain

request_params.format = 'XML';

request_params.v = '3.0';

 //request_params.uids = uid;

var variables:URLVariables = new URLVariables();

 // часть параметров берем из request_params

for (var j: String in request_params)

{

variables[j] = request_params[j];

}

variables['sid'] = sid; // параметр sid нужно передавать в запросе, но он не используются при создании сигнатуры

variables['sig'] = generate_signature (request_params); // генерируем сигнатуру. Функция generate_signature описана ниже.

 //variables['secret'] = secret;

 // подготавливаем запрос

var url_request = new URLRequest (api_url);

 // данные будем отправлять POST запросом

url_request.method = URLRequestMethod.POST;

 // добавляем параметры в запрос

url_request.data = variables;

 // отправляем запрос

listFriendsLoader = new URLLoader;

listFriendsLoader.addEventListener (Event.COMPLETE, friendsLoaded);

listFriendsLoader.load (url_request);

}

 // После ответа от сервера на первый запрос;

private function onCompleteLoad (event: Event):void

{

trace («Получен первый ответ от сервера. Main.onCompleteLoad»);

stat_loader.removeEventListener (Event.COMPLETE, onCompleteLoad);

stat_loader.removeEventListener (IOErrorEvent.IO_ERROR, onErrorConnectToServer);

var response:XML = new XML (stat_loader.data);

if (Number (response.update) == 1)

{

appData.updateFriendsData = 1;

}

else {appData.updateFriendsData = 0;}

}

 // Ошибка

private function onErrorConnectToServer (e:IOErrorEvent):void {

trace ('Ошибка обращения к серверу. Ошибка: ' + e.text + «Main.onCompleteLoad»);

stat_loader.removeEventListener (Event.COMPLETE, onCompleteLoad);

stat_loader.removeEventListener (IOErrorEvent.IO_ERROR, onErrorConnectToServer);

appData.logThis ('Ошибка обращения к серверу, отметка о заходе в пользователя в приложение. Main.onCompleteLoad. Ошибка: ' + e.text);

}

 // Получен список друзей нового пользователя

private function friendsLoaded (event: Event):void

{

trace («Получен подробный список друзей из контакта. Main.friendsLoaded»);

 // обрабатываем полученный ответ

listFriendsLoader.removeEventListener (Event.COMPLETE, friendsLoaded);

 //trace (listFriendsLoader.data);

var responseFriends:XML = new XML (listFriendsLoader.data);

if ((responseFriends.error_code >= 1) && (responseFriends.error_code < 7))

// В приложении нет

trace ('Ошибка доступа к друзьям');

appData.logThis ('Ошибка доступа к друзьям. error_code ' + responseFriends.error_code, 2);

if (responseFriends.error_code == 7)

{

trace ('Нет доступа к друзьям');

appData.logThis ('Нет доступа к друзьям. error_code ' + responseFriends.error_code, 2);

if (loadBar!= null && this.contains(loadBar)) {removeChild(loadBar);}

loadBar = new LoadBar («Контакт не дает доступ к друзьям.»);

loadBar.y = 50;

addChild(loadBar);

}

else

// если доступ к списку друзей разрешен в настройках приложения

 // создаём массив ID друзей

 //appData.xmlFullFriendsData = responseFriends; //stat_loader.data;

appData.setXmlFullFriendsData(responseFriends);

 //appData.sendFriends (listFriendsLoader.data);

if (appData.updateFriendsData == 1) {appData.sendFriends (auth_key);}

btChange.enabled = true;

btGraph.enabled = true;

};

}

public function onAddedToStage (e: Event):void

{

trace ('Приложение видимо. Main.onAddedToStage');

btTabel.addEventListener (MouseEvent.CLICK, onBtTabelClick);

btChange.addEventListener (MouseEvent.CLICK, onBtChangeClick);

btStatistica.addEventListener (MouseEvent.CLICK, onBtStatisticaClick);

btFriendsStatistica.addEventListener (MouseEvent.CLICK, onBtFriendsStatisticaClick);

btGraph.addEventListener (MouseEvent.CLICK, onBtGraphClick);

addEventListener (KeyboardEvent.KEY_DOWN, onBtMapClick);

addChild(statistica);

filterClearBt.addEventListener (MouseEvent.CLICK, onFilterClearBtClick);

sexCb.rowCount = 4;

sexCb.addEventListener (Event.CHANGE, sexCbChange);

ageUpCb.rowCount = 15;

ageUpCb.addItem({label: «Будь-який», data:0});

for (var i: Number=10; i<100; i++)

{

ageUpCb.addItem({label: «до» + i, data:i});

}

ageUpCb.addEventListener (Event.CHANGE, ageUpCbChange);

ageDownCb.rowCount = 15;

ageDownCb.addItem({label: «», data:0});

for (var j: Number=10; j<100; j++)

{

ageDownCb.addItem({label: «от» + j, data:j});

}

ageDownCb.addEventListener (Event.CHANGE, ageDownCbChange);

cityCb.rowCount = 10;

cityCb.addEventListener (Event.CHANGE, cityCbChange);

cityCb.addEventListener (Event.OPEN, cityCbOpen);

universityCb.rowCount = 10;

universityCb.addEventListener (Event.CHANGE, universityCbChange);

universityCb.addEventListener (Event.OPEN, universityCbOpen);

groupCb.rowCount = 8;

groupCb.addEventListener (Event.CHANGE, groupCbChange);

groupCb.addEventListener (Event.OPEN, groupCbOpen);

if (testMode== «Test»)

{

btChange.enabled = true;

btGraph.enabled = true;

}

appData.putButton(0);

 // }

public function onBtTabelClick (e: MouseEvent):void

{

 // Показать список друзей

trace («Показать список друзей. Main.onBtTabelClick»);

if (loadBar!= null && this.contains(loadBar)) {removeChild(loadBar);}

if (! appData.haveCityList)

{

LoadCityNames();

}

if (this.contains(fullTable))

{

}

else

{

addChild(fullTable);

if (this.contains(changeList)) {removeChild(changeList);};

if (this.contains(statistica)) {removeChild(statistica);};

if (this.contains(map)) {removeChild(map);};

}

appData.putButton(5);

}

public function onBtStatisticaClick (e: MouseEvent):void

{

 // Показать статистики

trace («Показать статистики. Main.onBtStatisticaClick»);

if (loadBar!= null && this.contains(loadBar)) {removeChild(loadBar);}

if (this.contains(statistica))

{

}

else

{

addChild(statistica);

if (this.contains(changeList)) {removeChild(changeList);};

if (this.contains(fullTable)) {removeChild(fullTable);};

if (this.contains(map)) {removeChild(map);};

}

appData.putButton(1);

}

public function onBtFriendsStatisticaClick (e: MouseEvent):void

{

 // Показать статистики

trace («Показать статистики. Main.onBtStatistica1Click»);

if (this.contains(friendsStatistica))

{

removeChild(friendsStatistica);

 // Button(btFriendsStatistica).text =

(getChildByName («btFriendsStatistica») as Button).label = 'Статистика друзей';

if (loadBar!= null && this.contains(loadBar)) {removeChild(loadBar);}

appData.showFriends = false;

appData.haveCityList = false;

appData.cityListCount = 0;

appData.setCityList (null, true);

appData.setXmlFullFriendsData (appData.getXmlFullFriendsData (false, true));

appData.refreshData();

}

else

{

addChild(friendsStatistica);

(getChildByName («btFriendsStatistica») as Button).label = 'Своя статистика';

if (this.contains(map)) {removeChild(map); addChild(statistica);};

if (this.contains(changeList)) {removeChild(changeList); addChild(statistica);};

appData.nNameList = 0;

/* if (this.contains(changeList)) {removeChild(changeList);};

if (this.contains(fullTable)) {removeChild(fullTable);};

if (this.contains(map)) {removeChild(map);};

if (this.contains(statistica)) {removeChild(statistica);};*/

}

appData.putButton(4);

}

public function onBtChangeClick (e: MouseEvent):void

{

 // Показать изменений в списке друзей

if (loadBar!= null && this.contains(loadBar)) {removeChild(loadBar);}

appData.sendFriends (auth_key);

if (this.contains(changeList))

{

}

else

{

addChild(changeList);

if (this.contains(statistica)) {removeChild(statistica);};

if (this.contains(fullTable)) {removeChild(fullTable);};

if (this.contains(map)) {removeChild(map);};

}

appData.putButton(2);

}

public function onFilterClearBtClick (e: MouseEvent):void

{

 // Обнулить фильтры

sexCb.selectedIndex = 0;

appData.filter.sex = -1;

ageUpCb.removeAll();

ageUpCb.addItem({label: «Будь-який», data:0});

for (var i: Number=10; i<100; i++)

{

ageUpCb.addItem({label: «до» + i, data:i});

}

appData.filter.ageUp = 0;

ageDownCb.removeAll();

ageDownCb.addItem({label: «», data:0});

for (var j: Number=10; j<100; j++)

{

ageDownCb.addItem({label: «от» + j, data:j});

}

appData.filter.ageDown = 0;

cityCb.selectedIndex = 0;

appData.filter.city = -1;

universityCb.selectedIndex = 0;

appData.filter.university = -1;

groupCb.selectedIndex = 0;

appData.filter.group = -1;

appData.refreshData();

appData.putButton(61);

}

function sexCbChange (event: Event):void

{

trace («Установлен фильтр по полу. Main.sexCbChange»);

appData.filter.sex = event.target.selectedItem.data;

appData.refreshData();

appData.putButton(62);

};

function ageDownCbChange (event: Event):void

{

trace («Установлен фильтр по полу. Main.sexCbChange»);

var newData: Number = event.target.selectedItem.data;

appData.filter.ageDown = newData;

 // Ограничиваем доступные значения в другом фильтре

var nIndex: Number = ageUpCb.selectedItem.data;

if (newData==0) {newData=10;}

ageUpCb.removeAll();

ageUpCb.addItem({label: «Будь-який», data:0});

for (var j: Number=newData; j<100; j++)

{

ageUpCb.addItem({label: «до» + j, data:j});

}

if (nIndex>0)

{

trace (nIndex - ageDownCb.selectedItem.data);

ageUpCb.selectedIndex = nIndex - newData + 1;

}

appData.refreshData();

appData.putButton(63);

};

function ageUpCbChange (event: Event):void

{

trace («Установлен фильтр по полу. Main.sexCbChange»);

var newData: Number = event.target.selectedItem.data;

appData.filter.ageUp = newData;

 // Ограничиваем доступные значения в другом фильтре

var nIndex: Number = ageDownCb.selectedItem.data;

if (newData==0) {newData=98;}

ageDownCb.removeAll();

ageDownCb.addItem({label: «Будь-який», data:0});

for (var j: Number=10; j<newData+1; j++)

{

ageDownCb.addItem({label: «от» + j, data:j});

}

if (nIndex>0)

{

trace (nIndex - 10);

ageDownCb.selectedIndex = nIndex - 9;

}

appData.refreshData();

appData.putButton(64);

};

function universityCbChange (event: Event):void

{

trace («Установлен фильтр по вузу. Main.universityCbChange»);

appData.filter.university = event.target.selectedItem.data;

appData.refreshData();

appData.putButton(65);

};

function universityCbOpen (event: Event):void

{

trace («Раскрыт список университетов. Main.universityCbOpen»);

trace (appData.universityList);

if (! appData.haveUniversityList && appData.universityList!= null)

{

trace («заполняем»);

for (var j:int=0; j<appData.universityList.length; j++)

{

universityCb.addItem({label: appData.universityList[j].name, data:appData.universityList[j].id});

}

appData.haveUniversityList = true;

}

appData.putButton(66);

};

function cityCbChange (event: Event):void

{

trace («Установлен фильтр по городу. Main.cityCbChange»);

appData.filter.city = event.target.selectedItem.data;

appData.refreshData();

appData.putButton(67);

};

function cityCbOpen (event: Event):void

{

trace («Раскрыт список городов. Main.cityCbOpen»);

if (! appData.haveCityList)

{

LoadCityNames();

}

appData.putButton(68);

};

public function LoadCityNames():void

// Первоначальная загрузка списка городов

try

{

if (appData.haveCityList || appData.cityListCount>3) {return;}

var tempArray: Array = appData.cityList;

 //var xml:XML = appData.getXmlFullFriendsData(false);

var s: String = «»;

if (appData.cityListCount==0) // Первый вызов

{

cityCb.removeAll();

cityCb.addItem({label: «будь-яке місто», data: - 1});

}

for (var i: Number=0; i<tempArray.length; i++)

{

if (appData.cityListCount==0)

{cityCb.addItem({label:tempArray[i].name, data:tempArray[i].id});}

if (i==0) {s = String (tempArray[i].id);}

else {s = s + ', '+ String (tempArray[i].id);}

};

if (s.length == 0)

// Если нет списка для запроса на сервер

appData.logThis («Список id городов для загрузки пуст»

+ String (appData.getXmlFullFriendsData())

+ «AllData:» + appData. StringData(), 1);

return;

}

 // Параметры для отправки запроса

var request_params: Object = new Object();

request_params.api_id = api_id;

request_params.method = 'places.getCityById';

request_params.cids = s;

request_params.format = 'XML';

request_params.v = '3.0';

var variables:URLVariables = new URLVariables();

 // часть параметров берем из request_params

for (var j: String in request_params)

{

variables[j] = request_params[j];

}

variables['sid'] = sid; // параметр sid нужно передавать в запросе, но он не используются при создании сигнатуры

variables['sig'] = generate_signature (request_params); // генерируем сигнатуру. Функция generate_signature описана ниже.

 // подготавливаем запрос

var url_request = new URLRequest (api_url);

 // данные будем отправлять POST запросом

url_request.method = URLRequestMethod.POST;

 // добавляем параметры в запрос

url_request.data = variables;

 // отправляем запрос

listCityLoader = new URLLoader;

listCityLoader.addEventListener (Event.COMPLETE, cityNamesLoaded);

listCityLoader.load (url_request);

appData.cityListCount = appData.cityListCount + 1;

if (fullLog) {appData.logThis («Запрос списка городов. Main. LoadCityNames.», 1)};

}

catch (e: Error)

{

appData.logThis («Ошибка в Main. LoadCityNames» + e.message, 2);

}

}

 // Получен список друзей нового пользователя

private function cityNamesLoaded (event: Event):void

{

trace («Получен список городов из контакта. Main.cityNamesLoaded»);

try

{

listCityLoader.removeEventListener (Event.COMPLETE, cityNamesLoaded);

var response:XML = new XML (listCityLoader.data);

if ((response.error_code >= 1) && (response.error_code < 200))

// В приложении нет

trace ('Нет доступа к городам');

appData.logThis ('Нет доступа к городам. Main.cityNamesLoaded. Код ошибки: ' + response.error_code + '.'

+ ' Текст из контакта: ' + String (listCityLoader.data), 2);

}

else

// если получен список городов

if (String(response)==»»)

{

appData.logThis («Получен пустой список. Main.cityNamesLoaded. Полученные данные» + listCityLoader.data

+ «haveFullFriendsData=» + String (appData.haveFullFriendsData), 2);

fullLog = true;

return;

}

else

{

appData.setCityList(response);

appData.haveCityList = true;

}

 // Заполняем выпадающий список

cityCb.removeAll();

cityCb.addItem({label: «будь-яке місто», data: - 1});

 //cityCb.addItem({label: «не указали город», data:0});

for (var j: Number=0; j<appData.cityList.length; j++)

{

cityCb.addItem({label:appData.cityList[j].name, data:appData.cityList[j].id});

}

 // Отмечаем данные

appData.refreshData();

if (fullLog) {appData.logThis («Cписок городов загружен. Main.cityNamesLoaded.», 1)};

}

}

catch (e: Error)

{

appData.logThis («Ошибка при обработке списока городов из контакта. Main.cityNamesLoaded» + e.message

+ «Данные:» + String (listCityLoader.data), 2);

}

}

function groupCbChange (event: Event):void

{

trace («Установлен фильтр по группам. Main.groupCbChange»);

 //appData.logThis ('Выбран город. номер ' + event.target.selectedItem.data);

appData.filter.group = event.target.selectedItem.data;

appData.refreshData();

appData.putButton(69);

};

function groupCbOpen (event: Event):void

{

trace («Раскрыт список групп. Main.groupCbOpen»);

if (! appData.haveGroupList)

{

loadGroupNames();

}

};

public function loadGroupNames():void

{

trace («Первоначальная загрузка списка групп. Main.loadGroupNames»);

var dp: DataProvider = new DataProvider();

var tempArray: Array = new Array();

var xml:XML = appData.getXmlFullFriendsData(false);

 //trace(xml);

 // Формируем список id городов

for (var i: Number=0; i<xml.user.length(); i++)

{

if (! (String (xml.user[i].lists)==»»))

{

for each (var group1:XML in xml.user[i].lists.list.item)

{

tempArray.push (String(group1));

/* if (dp.length>xml.user.lists.list.length() - 2)

{

dp.merge (new Array (String(group1)));

}

else

{

dp.addItem({label: String(group1)});

}*/

}

};

}

tempArray.sort (Array.NUMERIC);

i = 0;

while (i<tempArray.length-1)

{

if (tempArray[i]==tempArray [i+1])

{tempArray.splice (i+1, 1);}

else {i++};

}

var s: String = «»;

groupCb.removeAll();

groupCb.addItem({label: «будь-який список друзів», data: - 1});

for (i=0; i<tempArray.length; i++)

{

groupCb.addItem({label: String (tempArray[i]), data: String (tempArray[i])});

if (i==0) {s = String (tempArray[i]);}

else {s = s + ', '+ String (tempArray[i]);}

};

appData.haveGroupList = true;

}

 // Получен список друзей нового пользователя

private function groupNamesLoaded (event: Event):void

{

listGroupLoader.removeEventListener (Event.COMPLETE, groupNamesLoaded);

 //trace (listFriendsLoader.data);

var response:XML = new XML (listGroupLoader.data);

if ((response.error_code >= 1) && (response.error_code < 200))

// В приложении нет

trace ('Нет доступа к городам');

appData.logThis ('Нет доступа к группам. error_code ' + response.error_code);

}

else

// если получен список городов

 // Заполняем выпадающий список

groupCb.removeAll();

groupCb.addItem({label: «будь-який список друзів», data:0});

for (var j: Number=0; j<response.*.length(); j++)

{

groupCb.addItem({label:response.list[j].name, data:response.list[j].lid});

}

 // Отмечаем данные

appData.haveGroupList = true;

};

}

 // функция генерации сигнатуры

private function generate_signature (request_params):String

{

var signature = «;

 // сортируем параметры в алфавитном порядке

var sorted_array: Array = new Array();

for (var key in request_params)

{

sorted_array.push (key + «=» + request_params[key]);

}

sorted_array.sort();

 // создаем строку параметров;

for (key in sorted_array)

{

signature += sorted_array[key];

}

signature = id_viewer + signature + secret;

return MD5.encrypt(signature);

}

}

}

public class Statistica extends MovieClip {

private var appData: Data;

private var statisticTitle: TextField;

private var btSex: Button;

private var btCity: Button;

private var btName: Button;

private var sexTitle: TextField;

private var sexText: TextField;

private var ageTitle: TextField;

private var ageText: TextField;

private var sexBar: Bar;

private var tTitle: TextField;

private var cityText: TextField;

private var cityBar: Bar;

private var facultyTitle: TextField;

private var facultyText: TextField;

private var facultyBar: Bar;

private var universityTitle: TextField;

private var tText: TextField;

private var universityBar: Bar;

private var viewBar:int=1;

private var colorList: Array = new Array (0x0000FF, 0xFF0000,0x00FF00,0xFF00FF, 0x00FFFF, 0xFFFF00,0xAA00AA, 0x00AAAA, 0xFFFF99,0xAAAAAA, 0xFFFF99,0x0000FF, 0xFF0000,0x00FF00,0xFF00FF, 0x00FFFF, 0xFFFF00,0xAA00AA, 0x00AAAA, 0xFFFF99,0xAAAAAA, 0xFFFF99,0x0000FF, 0xFF0000,0x00FF00,0xFF00FF, 0x00FFFF, 0xFFFF00,0xAA00AA, 0x00AAAA, 0xFFFF99,0xAAAAAA, 0xFFFF99,0x0000FF, 0xFF0000,0x00FF00,0xFF00FF, 0x00FFFF, 0xFFFF00,0xAA00AA, 0x00AAAA, 0xFFFF99,0xAAAAAA, 0xFFFF99);

public function Statistica (linkToAppData: Data) {

trace ('Создание блока статистики. Statistica()');

appData = linkToAppData;

appData.addEventListener (Data.NEW_FULL_DATA, onRefreshData);

btSex = new Button();

btSex.x = -10;

btSex.y = 0;

btSex.width = 130;

btSex.label= «Стать і вік»;

addChild(btSex);

btCity = new Button();

btCity.x = 130;

btCity.y = 0;

btCity.width = 130;

btCity.label= «Місто та ВНЗ»;

addChild(btCity);

btSex.addEventListener (MouseEvent.CLICK, onBtSexClick);

btCity.addEventListener (MouseEvent.CLICK, onBtCityClick);

btName.addEventListener (MouseEvent.CLICK, onBtNameClick);

}

 // Получен или обновлен текущий список друзей

public function onRefreshData (event: Event):void

{

trace ('Расчет статистических графиков. Statistica.onRefreshData');

var xmlFull:XML;

xmlFull = appData.getXmlFullFriendsData();

var nAll: Number = xmlFull.user.length();

 // Очистка блока

while (this.numChildren>3)

{

removeChildAt (this.numChildren-1);

};

statisticTitle = new TextField();

statisticTitle.x = 20; statisticTitle.y = 35;

statisticTitle.width = 400;

statisticTitle.height = 23;

addChild(statisticTitle);

if (viewBar==1)

{

drawSexBlock (xmlFull, 0,40);

drawAgeBlock (xmlFull, 200,40);

}

else if (viewBar==2)

{

var f1Date: Date = new Date();

drawCityBlock (xmlFull, 0,40);

drawUniversityBlock (xmlFull, 200,40);

var f2Date: Date = new Date();

appData.logThis («Города» + String (f2Date.time - f1Date.time), 1,'Statistica');

}

else if (viewBar==3)

{

var f1Date: Date = new Date();

drawNameBlock (xmlFull, 0,40);

var f2Date: Date = new Date();

appData.logThis («Имена» + String (f2Date.time - f1Date.time), 1,'Statistica');

}

}

public function setViewBlock (n:int):void

{

if (n!=viewBar)

{

viewBar=n;

onRefreshData(null);

}

}

private function drawSexBlock (xmlFull:XML, x0:int, y0:int):void

// Распределение по полу

try

{

var nAll: Number = xmlFull.user.length();

var dataList: Array = new Array();

var nGroup: Number = 3;

var angleList: Array = new Array(nGroup);

sexTitle = new TextField();

sexTitle.x = x0 + 0; sexTitle.y = y0 + 30;

sexTitle.width = 200;

sexTitle.htmlText = '<P ALIGN= «CENTER»> <FONT SIZE= «+2» >За статтю</FONT></P>\n';

addChild(sexTitle);

if (nAll == 0)

// Нет выбранных данных

 // Рисуем диаграмму

sexBar = new Bar (angleList, colorList, true);

sexBar.x = 100 + x0;

sexBar.y = 140 + y0;

addChild(sexBar);

return;

}

 // Заполняем значениями

dataList.push({id: 0, name: «Чоловіків: \t\t», n:0});

dataList.push({id: 1, name: «Жінок:\t\t», n:0});

dataList.push({id: 2, name: «Не вказано:\t», n:0});

for (var j=0; j<nAll; j++)

{

if (xmlFull.user[j].sex==2) {dataList[0].n = dataList[0].n+1;}

else if (xmlFull.user[j].sex==1) {dataList[1].n = dataList[1].n+1;}

else {dataList[2].n = dataList[2].n+1;}

};

 // Выводим таблицу

var s: String;

var tBlock: Sprite;

for (var k:int = 0; k < nGroup; k++)

{

tBlock = new Sprite();

tBlock.x = x0+20; tBlock.y = y0 + 240 + 14*k;

tBlock.graphics.beginFill (colorList[k], 1);

tBlock.graphics.drawRect (0,0,9,9);

tBlock.graphics.endFill();

addChild(tBlock);

tText = new TextField();

tText.x = 20; tText.y = -5;

tText.width = 170;

tBlock.addChild(tText);

s = dataList[k].name;

/*if (s.length<6) {s = s + '\t\t\t';}

else if (s.length<10) {s = s + '\t\t';}

else if (s.length<17) {s = s + '\t';}

else {s = s.substr (0,16) +»…\t»;}*/

tText.appendText (s+ Math.round (100*Number (dataList[k].n)/nAll) + «% (» + dataList[k].n +»)\n»);

if (nAll>0) {

if (k==0) {angleList[k] = 360*Number (dataList[k].n)/nAll;}

else {angleList[k] = angleList [k-1] + 360*Number (dataList[k].n)/nAll;};

}

else if (k<nGroup) {angleList[k]=0;}

else {angleList[k]=360};

};

sexBar = new Bar (angleList, colorList);

sexBar.x = 100 + x0;

sexBar.y = 140 + y0;

addChild(sexBar);

}

catch (e: Error)

{

appData.logThis («Ошибка при выводе статистики по полу в Statistica.drawSexBlock.» + e.message

+ «Данные:» + String(xmlFull), 2);

}

}

private function drawAgeBlock (xmlFull:XML, x0:int, y0:int):void

// Статистика по возрасту

var nAll: Number = xmlFull.user.length();

var nGroup: Number = 10;

var angleList: Array = new Array(nGroup);

var dataList: Array = new Array();

ageTitle = new TextField();

ageTitle.x = x0 + 0; ageTitle.y = y0 + 30;

ageTitle.width = 200;

ageTitle.htmlText = '<P ALIGN= «CENTER»> <FONT SIZE= «+2» >За віком</FONT></P>\n';

addChild(ageTitle);

if (nAll == 0)

// Нет выбранных данных

 // Рисуем диаграмму

sexBar = new Bar (angleList, colorList, true);

sexBar.x = 100 + x0;

sexBar.y = 140 + y0;

addChild(sexBar);

return;

}

var i:int;

var m:int;

dataList.push({id: 0, name: «Не вказано\t\t», n:0});

dataList.push({id: 1, name: «<16 \t\t», n:0});

dataList.push({id: 2, name: «16-20\t\t», n:0});

dataList.push({id: 3, name: «21-25\t\t», n:0});

dataList.push({id: 4, name: «26-30\t\t», n:0});

dataList.push({id: 5, name: «31-35\t\t», n:0});

dataList.push({id: 6, name: «36-45\t\t», n:0});

dataList.push({id: 7, name: «41-45\t\t», n:0});

dataList.push({id: 8, name: «46-50\t\t», n:0});

dataList.push({id: 9, name: «>51 \t\t», n:0});

var nYear:int;

for (i=0; i<nAll; i++)

{

if (String (xmlFull.user[i].bdate)==»») {dataList[0].n=int (dataList[0].n)+1;}

else if (String (xmlFull.user[i].bdate).length<8) {dataList[0].n=int (dataList[0].n)+1;}

else

{

var er: Array = String (xmlFull.user[i].bdate).split(».»);

var dDate: Date = new Date();

dDate.setTime((new Date()).getTime() - (new Date (int (er[2]), int (er[1]), int (er[0]), 0,0,0,0)).getTime());

nYear = dDate.fullYear - 1970;

trace («nYear «+ nYear);

if (nYear<=15) {dataList[1].n=int (dataList[1].n)+1;}

else if (nYear<=20) {dataList[2].n=int (dataList[2].n)+1;}

else if (nYear<=25) {dataList[3].n=int (dataList[3].n)+1;}

else if (nYear<=30) {dataList[4].n=int (dataList[4].n)+1;}

else if (nYear<=35) {dataList[5].n=int (dataList[5].n)+1;}

else if (nYear<=40) {dataList[6].n=int (dataList[6].n)+1;}

else if (nYear<=45) {dataList[7].n=int (dataList[7].n)+1;}

else if (nYear<=50) {dataList[8].n=int (dataList[8].n)+1;}

else {dataList[9].n=int (dataList[9].n)+1;};

};

 //ageText.appendText («-» + String (xmlFull.user[i].bdate) + «-» + «\n»);

};

 // Сортируем по числу

 //dataList.sortOn («n», Array.NUMERIC | Array.DESCENDING);

 //for (var j=0; j<dataList.length; j++) {trace («2: «+ dataList[j].name +»: «+ dataList[j].n);}

var s: String;

var tBlock: Sprite;

for (var k:int = 0; k < nGroup; k++)

{

tBlock = new Sprite();

tBlock.x = x0+20; tBlock.y = y0 + 240 + 14*k;

tBlock.graphics.beginFill (colorList[k], 1);

tBlock.graphics.drawRect (0,0,9,9);

tBlock.graphics.endFill();

addChild(tBlock);

tText = new TextField();

tText.x = 20; tText.y = -5;

tText.width = 170;

tBlock.addChild(tText);

s = dataList[k].name;

/*if (s.length<6) {s = s + '\t\t\t';}

else if (s.length<10) {s = s + '\t\t';}

else if (s.length<17) {s = s + '\t';}

else {s = s.substr (0,16) +»…\t»;}*/

tText.appendText (s+ Math.round (100*Number (dataList[k].n)/nAll) + «% (» + dataList[k].n +»)\n»);

if (nAll>0) {

if (k==0) {angleList[k] = 360*Number (dataList[k].n)/nAll;}

else {angleList[k] = angleList [k-1] + 360*Number (dataList[k].n)/nAll;};

}

else if (k<nGroup) {angleList[k]=0;}

else {angleList[k]=360};

};

 // Рисуем диаграмму

sexBar = new Bar (angleList, colorList);

sexBar.x = 100 + x0;

sexBar.y = 140 + y0;

addChild(sexBar);

}

private function drawCityBlock (xmlFull:XML, x0:int, y0:int):void

{

trace («Выводим статистику по городу. Statistica.drawCityBlock»);

if (! appData.haveCityList) {Main(parent).LoadCityNames();}

var dataList: Array = appData.cityList;

for (var j=0; j<dataList.length; j++) {dataList[j].n=0;}

var ss: String = «;

for (j=0; j<dataList.length; j++) {ss = ss + ' ' + j +»: «+ dataList[j].name;}

 //appData.logThis (ss, 1);

var nAll: Number = xmlFull.user.length();

 //var nCity: Number = xmlCityData.city.length();

tTitle = new TextField();

tTitle.x = x0 + 0; tTitle.y = y0 + 30;

tTitle.width = 200;

tTitle.htmlText = '<P ALIGN= «CENTER»> <FONT SIZE= «+2» >За містами</FONT></P>\n';

addChild(tTitle);

if (nAll == 0)

// Нет выбранных данных

 // Рисуем диаграмму

cityBar = new Bar (null, colorList, true);

cityBar.x = 100 + x0;

cityBar.y = 140 + y0;

addChild(cityBar);

return;

}

var nGroup: Number = dataList.length;

var angleList: Array = new Array(nGroup);

var i:int;

var m:int;

for (i=0; i<nAll; i++)

{

if (String (xmlFull.user[i].city)==»») {m = 0;}

else {m = xmlFull.user[i].city;}

for (j=0; j<dataList.length; j++)

{

if (dataList[j].id==m) {dataList[j].n ++;};

}

};

 // Формируем сжатый массив

if (nGroup>10)

{

dataList[9].name = «Інші»;

for (i=10; i<nGroup; i++)

{

dataList[9].n = dataList[9].n + dataList[i].n;

}

nGroup=10;

}

for (j=0; j<dataList.length; j++) {trace («3: «+ dataList[j].name);}

 // Выводим таблицу

var s: String;

var tBlock: Sprite;

for (var k:int = 0; k < nGroup; k++)

{

tBlock = new Sprite();

tBlock.x = x0+20; tBlock.y = y0 + 240 + 14*k;

tBlock.graphics.beginFill (colorList[k], 1);

tBlock.graphics.drawRect (0,0,9,9);

tBlock.graphics.endFill();

addChild(tBlock);

tText = new TextField();

tText.x = 20; tText.y = -5;

tText.width = 170;

tBlock.addChild(tText);

s = dataList[k].name;

if (s.length>18) {s = s.substr (0,18) +»…»;}

tText.appendText(s);

 //trace («Номер «+k+» Ширина» + tText.textWidth);

s = «;

if (tText.textWidth<28) {s = '\t\t\t\t\t';}

else if (tText.textWidth<48) {s = '\t\t\t\t';}

else if (tText.textWidth<61) {s = '\t\t\t';}

else if (tText.textWidth<85) {s = '\t\t';}

else if (tText.textWidth<99) {s = '\t';}

tText.appendText (s + Math.round (100*Number (dataList[k].n)/nAll) + «% (» + dataList[k].n +»)\n»);

if (nAll>0) {

if (k==0) {angleList[k] = 360*Number (dataList[k].n)/nAll;}

else {angleList[k] = angleList [k-1] + 360*Number (dataList[k].n)/nAll;};

}

else if (k<nGroup) {angleList[k]=0;}

else {angleList[k]=360};

};

 // Рисуем диаграмму

cityBar = new Bar (angleList, colorList);

cityBar.x = 100 + x0;

cityBar.y = 140 + y0;

addChild(cityBar);

}

private function drawFacultyBlock (xmlFull:XML, x0:int, y0:int):void

{

trace («Выводим статистику по факультетам. Statistica.drawFacultyBlock»);

var facultyList: Array = appData.facultyList;

for (var j=0; j<facultyList.length; j++) {facultyList[j].n=0;}

var nAll: Number = xmlFull.user.length();

var nFaculty: Number = facultyList.length;

var angleList: Array = new Array(nFaculty);

var i:int;

 // Заполняем значениями

var m:int;

for (i=0; i<nAll; i++)

{

if (String (xmlFull.user[i].faculty)==»») {m = 0;}

else {m = xmlFull.user[i].faculty;}

for (j=0; j<facultyList.length; j++)

{

if (facultyList[j].faculty==m) {facultyList[j].n ++;};

}

};

 // Сортируем по числу

facultyList.sortOn («n», Array.NUMERIC | Array.DESCENDING);

for (j=0; j<facultyList.length; j++) {trace («2: «+ facultyList[j].faculty_name);}

 // Формируем сжатый массив

if (nFaculty>10)

{

facultyList[9].faculty_name = «Інші»;

for (i=10; i<nFaculty; i++)

{

facultyList[9].n = facultyList[9].n + facultyList[i].n;

}

nFaculty=10;

}

for (j=0; j<facultyList.length; j++) {trace («3: «+ facultyList[j].faculty_name);}

 // Выводим таблицу

facultyTitle = new TextField();

facultyTitle.x = x0 + 40; facultyTitle.y = y0 + 30;

facultyTitle.width = 150;

facultyTitle.htmlText = '<FONT SIZE= «+2» >За ВНЗ</FONT>\n';

 //cityTitle.appendText(xmlCityData);

addChild(facultyTitle);

var tBlock: Sprite;

for (var k:int = 0; k < nFaculty; k++)

{

facultyText = new TextField();

facultyText.x = x0+5; facultyText.y = y0 + 234 + 14*k;

facultyText.width = 170;

addChild(facultyText);

facultyText.appendText (facultyList[k].faculty_name +'\t'+ Math.round (100*Number (facultyList[k].n)/nAll) + «% (» + facultyList[k].n +»)\n»);

tBlock = new Sprite();

tBlock.x = tText.x - 10; tBlock.y = tText.y+5;

tBlock.graphics.beginFill (colorList[k], 1);

tBlock.graphics.drawRect (0,0,9,9);

tBlock.graphics.endFill();

addChild(tBlock);

if (nAll>0) {

if (k==0) {angleList[k] = 360*Number (facultyList[k].n)/nAll;}

else {angleList[k] = angleList [k-1] + 360*Number (facultyList[k].n)/nAll;};

}

else if (k<nFaculty) {angleList[k]=0;}

else {angleList[k]=360};

};

 // Рисуем диаграмму

facultyBar = new Bar (angleList, colorList);

facultyBar.x = 80 + x0;

facultyBar.y = 140 + y0;

addChild(facultyBar);

}

private function drawUniversityBlock (xmlFull:XML, x0:int, y0:int):void

{

trace («Выводим статистику по вузам. Statistica.drawUniversityBlock»);

var dataList: Array = appData.universityList;

for (var j=0; j<dataList.length; j++) {dataList[j].n=0;}

universityTitle = new TextField();

universityTitle.x = x0 + 0; universityTitle.y = y0 + 30;

universityTitle.width = 200;

universityTitle.htmlText = '<P ALIGN= «CENTER»> <FONT SIZE= «+2» >За ВНЗ</FONT></P>\n';

addChild(universityTitle);

var nAll: Number = xmlFull.user.length();

if (nAll == 0)

// Нет выбранных данных

 // Рисуем диаграмму

universityBar = new Bar (angleList, colorList, true);

universityBar.x = 100 + x0;

universityBar.y = 140 + y0;


Подобные документы

  • Аналіз особливостей мови програмування Java та середовища Android Studio. Розробка програмного забезпечення для якісного та ефективного вивчення іноземних слів. Побудова базових алгоритмів і структури даних. Вибір мови програмування, реалізація програми.

    курсовая работа [335,3 K], добавлен 11.01.2015

  • Аналіз навігаційних технологій у сучасних AVL системах. Структура системи і вимоги до апаратного забезпечення, розробка алгоритмів функціонування окремих програмних модулів. Вибір мови програмування і СУБД. Тестовий варіант програмного забезпечення.

    дипломная работа [1,8 M], добавлен 17.12.2015

  • Дослідження та аналіз об’єкту програмування. Основні архітектурні риси JavaScript. Переваги CSS розмітки. Структура HTML-документа. Вимоги до апаратного та програмного забезпечення. Опис програми та її алгоритмів. Оцінка вартості програмного продукту.

    дипломная работа [1,0 M], добавлен 01.09.2016

  • Розробка та схема алгоритму проектованої гри. Особливості мови програмування та середовища "Microsoft Visual Studio C++ 2008 Express Edition". Лістинг програми та загальний опис її роботи, аналіз отриманих результатів та оцінка практичної ефективності.

    курсовая работа [762,8 K], добавлен 03.05.2015

  • Модель аналізу-синтезу компіляції. Формальний опис вхідної мови програмування. Вибір технології програмування, проектування таблиць транслятора та вибір структур даних. Опис програми реалізації лексичного аналізатора. Розробка дерев граматичного розбору.

    курсовая работа [75,8 K], добавлен 26.12.2009

  • Розробка бази даних для меблевої фірми. Обстеження і аналіз предметної області та побудова концептуальної, логічної та фізичної моделі цієї бази даних. Використання мови програмування Visual Basic при написанні програмного коду, що обслуговує базу даних.

    курсовая работа [1,4 M], добавлен 24.10.2010

  • Аналіз сучасного стану технологій програмування. Засоби реалізації об'єктів в мові C++, структура даних і функцій. Розробка програмного продукту - гри "трикутники", з використовуванням моделей, класів і функцій об’єктно-орієнтованого програмування.

    курсовая работа [117,8 K], добавлен 14.03.2013

  • Проектування архітектури гри "Тетріс". Аналіз вимог до неї. Вивчення особливостей реалізації, кодування та тестування програми. Алгоритм побудови робочого поля. Вибір мови програмування. Розробка і налагодження тексту програми. Інструкції з експлуатації.

    курсовая работа [460,9 K], добавлен 04.03.2014

  • Реєстр ОС Windows 7 та оцінка його ролі, структура та елементи. Структура та функціональні особливості Windows-додатку. Розробка програмного додатку зчитування даних з реєстру: вибір середовища програмування та алгоритм, а також інструкція користувача.

    курсовая работа [228,3 K], добавлен 29.05.2015

  • Етапи розробки проекту. Вимоги до апаратного і програмного забезпечення, до користувача. Специфікація та структура даних, які мають бути розміщеними в системі. Вигляд інтерфейсу системи програмного забезпечення. Розробка бази даних косметичного салону.

    дипломная работа [1,8 M], добавлен 21.02.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.