Определение наличия (и степени) зависимости академической успеваемости студентов от количества времени, проведенного ими в соцсети "ВКонтакте"

Коэффициент ранговой корреляции Спирмена. Приложения для получения информации с сайта, описание функционала и интерфейса. Описание классов и используемых библиотек. Подготовка и первичный анализ данных. Тестирование logit-регрессии и линейной регрессии.

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

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

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

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

Кроме регрессии с использованием абсолютного количества минут, проведенных в социальной сети (в разбивке по 4-ем типам) в качестве зависимых переменных, была также построена регрессия с использованием «процента учебного времени, проведенного онлайн». Результаты такой регрессии представлены ниже (рис. 26, рис. 27).

Рис 26. Сводка для регрессионной модели (2).

Рис 27. Коэффициенты для регрессионной модели (2).

Как и в первой регрессии, все независимые переменные оказались значимы, и «Курс» имеет гораздо большее влияние на успеваемость, нежели «процент учебного времени, проведенного онлайн». Формула для данной регрессии такова:

В итоге, можно заключить, что первоначальный интуитивно ожидаемый результат не подтвердился. Несмотря на то, что удалось определить формулу, по которой возможно рассчитать успеваемость студента, его активность в социальной сети «ВКонтакте» играет достаточно малую роль в формировании оценки.

Выводы по третьей главе

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

Заключение

Подводя итог выполненной работе, стоит отметить, что все поставленные задачи были выполнены:

Ш Была определена выборка из 7108-ми студентов, которая сократилась более, чем в три раза, в следствии подготовки и первичного анализа данных, однако по-прежнему осталась достаточно репрезентативной;

Ш Было разработано два приложения (одно - на языке C#, другое - на языке Python) для автоматизации сбора данных;

Ш Все собранные данные были структурированы, объединены и полностью подготовлены для проведения основных анализов;

Ш Были построены логистическая и линейная регрессии, а также проверен коэффициент ранговой корреляции Спирмена

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

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

Список использованной литературы

1. Melissa Zwart, David Lindsay, Michael Henderson, Michael Phillips. Teenagers, Legal Risks and Social Networking Sites, 2011.

2. Jason Tham. The Sage and Implications of Social Networking Sites: A Survey of College Students, Journal of Interpersonal, Intercultural and Mass Communication, 2011.

3. Abdulsalam K Alhazmi. Facebook in Higher Education: Students' Use and Perceptions, Advances in Information Sciences and Service Sciences, 2013.

4. Adam Mahamat Helou. The Influence of Social Networking Sites on Students' Academic Performance in Malaysia, International Journal of Electronic Commerce Studies, 2014.

5. Mark Salvation. The Influence of Social Network Sites (SNS) upon Academic Performance of Malaysian Students, International Journal of Humanities and Social Science, 2014.

6. Abraham, Ajith. Computational Social Networks, 2012.

7. Joseph Albahari, Ben Albahari. C# 5.0 in a Nutshell: The Definitive Reference by, 2012.

8. Carmen Batanero, Manfred Borovcnik. Statistics and Probability in High School, 2016.

9. Stephen P Borgatti, Martin G. Everett, Jeffrey C. Johnson. Analyzing Social Networks, 2013.

10. Jamie Chan. C#: Learn C# in One Day and Learn It Well. C# for Beginners with Hands-on Project, 2016.

11. Samprit Chatterjee, Ali S. Hadi. Regression Analysis by Example, 2012.

12. Jacob Cohen. Statistical Power Analysis for the Behavioral Sciences (2nd Edition), 1988.

13. Cyberpunk University. C# Programming: The No-Nonsense Guide: Learn C# Programming Within 12 Hours, 2017.

14. Andrew Gelman, Jennifer Hill. Data Analysis Using Regression and Multilevel/Hierarchical Models, 2007.

15. Frank E. Harrell Junior. Regression Modeling Strategies: With Applications to Linear Models, Logistic Regression, and Survival Analysis, 2001.

16. David W. Hosmer Junior, Stanley Lemeshow, Rodney X. Sturdivant. Applied Logistic Regression, 2013.

17. iCode Academy. Python: Programming: Your Step by Step Guide to Easily Learn Python in 7 Days, 2016.

18. Charles Kadushin. Understanding Social Networks: Theories, Concepts, and Findings, 2012.

19. Eric J. Krieg. Statistics and Data Analysis for Social Science, 2012.

20. Robert O. Kuehl. Design of Experiments: Statistical Principles of Research Design and Analysis, 2000.

21. Mark Lutz. Learning Python, 5th Edition, 2013.

22. Eric Matthes. Python Crash Course: A Hands-On, Project-Based Introduction to Programming, 2016.

23. Douglas C. Montgomery, Elizabeth A. Peck, G. Geoffrey Vining. Introduction to Linear Regression Analysis, 2012.

24. Luciano Ramalho. Fluent Python: Clear, Concise, and Effective Programming, 2015.

25. John Sharp. Microsoft Visual C# 2013 Step by Step (Step by Step Developer), 2013.

26. John Sharp. Microsoft Visual C# Step by Step (8th Edition) (Developer Reference), 2015.

27. Richard C. Sprinthall. Basic Statistical Analysis (9th Edition), 2011.

28. Andrew Stellman, Jennifer Greene. Head First C#: A Learner's Guide to Real-World Programming with C#, XAML, and .NET, 2014.

29. Al Sweigart. Automate the Boring Stuff with Python: Practical Programming for Total Beginners, 2015.

30. Andrew Troelsen. Pro C# 5.0 and the .NET 4.5 Framework (Expert's Voice in .NET), 2012.

31. Andrew Troelsen, Philip Japikse. C# 6.0 and the .NET 4.6 Framework, 2015.

32. The Code Academy. Python Programming: An In-Depth Guide into The Essentials of Python Programming, 2017.

33. Stanley Wasserman, Katherine Faust. Social Network Analysis: Methods and Applications (Structural Analysis in the Social Sciences), 1999.

34. R.B. Whitaker. The C# Player's Guide (3rd Edition), 2012.

Приложение 1

Код приложения для получения информации с сайта «ВКонтакте»

Класс User.cs

using System.Windows.Media;

namespace Grades_Analysis

{

public class User

{

#region Свойства для API

public string id { get; set; }

public string first_name { get; set; }

public string last_name { get; set; }

public string photo_100 { get; set; }

public string university { get; set; }

public string university_name { get; set; }

public string faculty { get; set; }

public string faculty_name { get; set; }

public string graduation { get; set; }

public string online { get; set; }

public string online_mobile { get; set; }

public string online_app { get; set; }

public string sex { get; set; }

#endregion

#region Дополнительные свойства

public ImageSource Photo { get; set; }

public string Token { get; set; }

public string UserID { get; set; }

public string Scope { get; set; }

#endregion

}

}

Класс University.cs

namespace Grades_Analysis

{

class University

{

public string id { get; set; }

public string title { get; set; }

}

}

Класс Faculty.cs

namespace Grades_Analysis

{

class Faculty

{

public string id { get; set; }

public string title { get; set; }

}

}

Класс Country.cs

namespace Grades_Analysis

{

class Country

{

public string id { get; set; }

public string title { get; set; }

}

}

Класс City.cs

namespace Grades_Analysis

{

class City

{

public string id { get; set; }

public string title { get; set; }

}

}

Класс MyActions.cs

using Newtonsoft.Json;

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

using xNet;

using Microsoft.Office.Interop.Excel;

using System.Windows.Media.Imaging;

using System.Runtime.InteropServices;

using System.Threading;

using SimpleWifi;

namespace Grades_Analysis

{

class MyActions

{

#region Методы работы с API ВКонтакте

public User GetCurrentUserInfo(string url, string scope)

{

#region Объявление переменных и присвоение значений

string token = url.Split(new char[] { '=', '&' }, StringSplitOptions.RemoveEmptyEntries)[1];

string userID = url.Split(new char[] { '=', '&' }, StringSplitOptions.RemoveEmptyEntries)[5];

string additionalField = "photo_100";

const string _ApiURL = "https://api.vk.com/method/";

HttpRequest request = new HttpRequest();

#endregion

#region Создание запроса

request.AddUrlParam("user_ids", userID);

request.AddUrlParam("fields", additionalField);

request.AddUrlParam("access_token", token);

request.AddUrlParam("v", "5.8");

#endregion

#region Получение информации от сервера ВКонтакте

string requestResult = request.Get(_ApiURL + "users.get").ToString();

int substringStart = requestResult.IndexOf(":[{") + 2;

int substringLenght = requestResult.IndexOf("}]") - substringStart + 1;

requestResult = requestResult.Substring(substringStart, substringLenght);

User currUser = JsonConvert.DeserializeObject<User>(requestResult);

currUser.Photo = new BitmapImage(new Uri(currUser.photo_100, UriKind.RelativeOrAbsolute));

currUser.Token = token;

currUser.UserID = userID;

currUser.Scope = scope;

#endregion

return currUser;

}

public List<Country> GetAllCounties(string token)

{

#region Объявление переменных и присвоение значений

const string _ApiURL = "https://api.vk.com/method/";

HttpRequest request = new HttpRequest();

List<Country> allCountries = new List<Country>();

#endregion

#region Создание запроса

request.AddUrlParam("need_all", 1);

request.AddUrlParam("count", 1000);

request.AddUrlParam("access_token", token);

request.AddUrlParam("v", "5.8");

#endregion

#region Получение информации от сервера ВКонтакте

string requestResult = request.Get(_ApiURL + "database.getCountries").ToString();

if (requestResult.IndexOf(":[{") != -1)

{

int substringStart = requestResult.IndexOf(":[{") + 2;

int substringLenght = requestResult.IndexOf("}]") - substringStart + 1;

requestResult = requestResult.Substring(substringStart, substringLenght);

string[] splitResults = requestResult.Split(new string[] { "},{" }, StringSplitOptions.RemoveEmptyEntries);

for (int i = 0; i < splitResults.Length; i++)

{

if (splitResults[i][0] != '{')

splitResults[i] = "{" + splitResults[i];

if (splitResults[i][splitResults[i].Length - 1] != '}')

splitResults[i] += "}";

allCountries.Add(JsonConvert.DeserializeObject<Country>(splitResults[i]));

}

allCountries = allCountries.OrderBy(t => t.title).ToList();

}

#endregion

return allCountries;

}

public List<City> GetAllCities(string token, string countryID)

{

#region Объявление переменных и присвоение значений

const string _ApiURL = "https://api.vk.com/method/";

HttpRequest request = new HttpRequest();

List<City> allCities = new List<City>();

#endregion

#region Создание запроса

request.AddUrlParam("country_id", countryID);

request.AddUrlParam("need_all", 0);

request.AddUrlParam("count", 1000);

request.AddUrlParam("access_token", token);

request.AddUrlParam("v", "5.8");

#endregion

#region Получение информации от сервера ВКонтакте

string requestResult = request.Get(_ApiURL + "database.getCities").ToString();

if (requestResult.IndexOf(":[{") != -1)

{

int substringStart = requestResult.IndexOf(":[{") + 2;

int substringLenght = requestResult.IndexOf("}]") - substringStart + 1;

requestResult = requestResult.Substring(substringStart, substringLenght);

string[] splitResults = requestResult.Split(new string[] { "},{" }, StringSplitOptions.RemoveEmptyEntries);

for (int i = 0; i < splitResults.Length; i++)

{

if (splitResults[i][0] != '{')

splitResults[i] = "{" + splitResults[i];

if (splitResults[i][splitResults[i].Length - 1] != '}')

splitResults[i] += "}";

allCities.Add(JsonConvert.DeserializeObject<City>(splitResults[i]));

}

allCities = allCities.OrderBy(t => t.title).ToList();

}

#endregion

return allCities;

}

public List<University> GetAllUniversities(string token, string countryID, string cityID)

{

#region Объявление переменных и присвоение значений

const string _ApiURL = "https://api.vk.com/method/";

HttpRequest request = new HttpRequest();

List<University> allUniversities = new List<University>();

#endregion

#region Создание запроса

request.AddUrlParam("country_id", countryID);

request.AddUrlParam("city_id", cityID);

request.AddUrlParam("count", 10000);

request.AddUrlParam("access_token", token);

request.AddUrlParam("v", "5.8");

#endregion

#region Получение информации от сервера ВКонтакте

string requestResult = request.Get(_ApiURL + "database.getUniversities").ToString();

if (requestResult.IndexOf(":[{") != -1)

{

int substringStart = requestResult.IndexOf(":[{") + 2;

int substringLenght = requestResult.IndexOf("}]") - substringStart + 1;

requestResult = requestResult.Substring(substringStart, substringLenght);

string[] splitResults = requestResult.Split(new string[] { "},{" }, StringSplitOptions.RemoveEmptyEntries);

for (int i = 0; i < splitResults.Length; i++)

{

if (splitResults[i][0] != '{')

splitResults[i] = "{" + splitResults[i];

if (splitResults[i][splitResults[i].Length - 1] != '}')

splitResults[i] += "}";

allUniversities.Add(JsonConvert.DeserializeObject<University>(splitResults[i]));

}

allUniversities = allUniversities.OrderBy(t => t.title).ToList();

}

#endregion

return allUniversities;

}

public List<Faculty> GetAllFaculties(string token, string universityID)

{

#region Объявление переменных и присвоение значений

const string _ApiURL = "https://api.vk.com/method/";

HttpRequest request = new HttpRequest();

List<Faculty> allFaculties = new List<Faculty>();

#endregion

#region Создание запроса

request.AddUrlParam("university_id", universityID);

request.AddUrlParam("count", 10000);

request.AddUrlParam("access_token", token);

request.AddUrlParam("v", "5.8");

#endregion

#region Получение информации от сервера ВКонтакте

string requestResult = request.Get(_ApiURL + "database.getFaculties").ToString();

if (requestResult.IndexOf(":[{") != -1)

{

int substringStart = requestResult.IndexOf(":[{") + 2;

int substringLenght = requestResult.IndexOf("}]") - substringStart + 1;

requestResult = requestResult.Substring(substringStart, substringLenght);

string[] splitResults = requestResult.Split(new string[] { "},{" }, StringSplitOptions.RemoveEmptyEntries);

for (int i = 0; i < splitResults.Length; i++)

{

if (splitResults[i][0] != '{')

splitResults[i] = "{" + splitResults[i];

if (splitResults[i][splitResults[i].Length - 1] != '}')

splitResults[i] += "}";

allFaculties.Add(JsonConvert.DeserializeObject<Faculty>(splitResults[i]));

}

allFaculties = allFaculties.OrderBy(t => t.title).ToList();

}

#endregion

return allFaculties;

}

public List<User> SearchUsers(string token, string universityID, string universityName, string facultyID, string facultyName, string graduationYear, string additionalField)

{

#region Объявление переменных и присвоение значений

const string _ApiURL = "https://api.vk.com/method/";

HttpRequest request = new HttpRequest();

List<User> foundUsersPerFaculty = new List<User>();

#endregion

#region Создание запроса

request.AddUrlParam("fields", additionalField);

request.AddUrlParam("university", universityID);

request.AddUrlParam("university_faculty", facultyID);

request.AddUrlParam("university_year", graduationYear);

request.AddUrlParam("count", 1000);

request.AddUrlParam("access_token", token);

request.AddUrlParam("v", "5.8");

#endregion

#region Получение информации от сервера ВКонтакте

string requestResult = request.Get(_ApiURL + "users.search").ToString();

if (requestResult.IndexOf(":[{") != -1)

{

int substringStart = requestResult.IndexOf(":[{") + 2;

int substringLenght = requestResult.IndexOf("}]") - substringStart + 1;

requestResult = requestResult.Substring(substringStart, substringLenght);

string[] splitResults = requestResult.Split(new string[] { "},{" }, StringSplitOptions.RemoveEmptyEntries);

for (int i = 0; i < splitResults.Length; i++)

{

if (splitResults[i][0] != '{')

splitResults[i] = "{" + splitResults[i];

if (splitResults[i][splitResults[i].Length - 1] != '}')

splitResults[i] += "}";

foundUsersPerFaculty.Add(JsonConvert.DeserializeObject<User>(splitResults[i]));

foundUsersPerFaculty[foundUsersPerFaculty.Count - 1].university = universityID;

foundUsersPerFaculty[foundUsersPerFaculty.Count - 1].university_name = universityName;

foundUsersPerFaculty[foundUsersPerFaculty.Count - 1].faculty = facultyID;

foundUsersPerFaculty[foundUsersPerFaculty.Count - 1].faculty_name = facultyName;

foundUsersPerFaculty[foundUsersPerFaculty.Count - 1].graduation = graduationYear;

}

}

#endregion

return foundUsersPerFaculty;

}

public List<User> GetOnlineStatus(string token, List<User> allUsers, Action<long, long> onOneOlineStatusChecked, System.Action onAllOlineStatusesChecked)

{

#region Объявление переменных и присвоение значений

const string _ApiURL = "https://api.vk.com/method/";

List<User> allOnlineStatuses = new List<User>();

string oneHundredIDs = "";

string additionalField = "online";

#endregion

#region Цикл по каждым 100 пользователям

for (int i = 0; i < allUsers.Count; i++)

{

oneHundredIDs = oneHundredIDs + allUsers[i].id + ",";

if ((i + 1) % 100 == 0 || (i + 1) == allUsers.Count)

{

oneHundredIDs = oneHundredIDs.Remove(oneHundredIDs.Length - 1);

#region Создание запроса

HttpRequest request = new HttpRequest();

request.AddUrlParam("user_ids", oneHundredIDs);

request.AddUrlParam("fields", additionalField);

request.AddUrlParam("access_token", token);

request.AddUrlParam("v", "5.8");

#endregion

#region Получение информации от сервера ВКонтакте

try

{

string requestResult = null;

while (requestResult == null)

requestResult = request.Get(_ApiURL + "users.get").ToString();

if (requestResult.IndexOf(":[{") != -1)

{

int substringStart = requestResult.IndexOf(":[{") + 2;

int substringLenght = requestResult.IndexOf("}]") - substringStart + 1;

requestResult = requestResult.Substring(substringStart, substringLenght);

string[] splitResults = requestResult.Split(new string[] { "},{" }, StringSplitOptions.RemoveEmptyEntries);

for (int j = 0; j < splitResults.Length; j++)

{

if (splitResults[j][0] != '{')

splitResults[j] = "{" + splitResults[j];

if (splitResults[j][splitResults[j].Length - 1] != '}')

splitResults[j] += "}";

allOnlineStatuses.Add(JsonConvert.DeserializeObject<User>(splitResults[j]));

onOneOlineStatusChecked(((int)(i / 100) * 100) + (j + 1), allUsers.Count);

}

}

}

catch (xNet.HttpException ex)

{

if (ex.Status == HttpExceptionStatus.ConnectFailure)

ConectToWifi();

i -= 100;

File.AppendAllText("Log File.txt", DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToLongTimeString() + ": "+ ex.Message + Environment.NewLine);

}

#endregion

oneHundredIDs = "";

Thread.Sleep(500);

}

}

#endregion

onAllOlineStatusesChecked();

return allOnlineStatuses;

}

#endregion

#region Методы работы с данными

public string WriteUserInfoToExcel(List<User> allUsersFromUniversity, Action<long, long> onExcelOneStringWritten)

{

#region Объявление переменных и присвоение значений

Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();

_Workbook workbook = (_Workbook)(excelApp.Workbooks.Add(Type.Missing));

_Worksheet worksheet = (_Worksheet)workbook.ActiveSheet;

string fileName = "Excel Data (" + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString() + ")";

fileName = fileName.Replace(':', '.');

#endregion

#region Запись заголовков

worksheet.Cells[1, 1] = "ID ВКонтакте";

worksheet.Cells[1, 2] = "Имя";

worksheet.Cells[1, 3] = "Фамилия";

worksheet.Cells[1, 4] = "Пол";

worksheet.Cells[1, 5] = "ID Университета";

worksheet.Cells[1, 6] = "Название Университета";

worksheet.Cells[1, 7] = "ID Факультета";

worksheet.Cells[1, 8] = "Название Факультета";

worksheet.Cells[1, 9] = "Год выпуска";

#endregion

#region Запись данных

for (int i = 0; i < allUsersFromUniversity.Count; i++)

{

try

{

worksheet.Cells[i + 2, 1] = "'" + allUsersFromUniversity[i].id;

worksheet.Cells[i + 2, 2] = allUsersFromUniversity[i].first_name;

worksheet.Cells[i + 2, 3] = allUsersFromUniversity[i].last_name;

if (allUsersFromUniversity[i].sex == "1")

worksheet.Cells[i + 2, 4] = "Ж";

else if (allUsersFromUniversity[i].sex == "2")

worksheet.Cells[i + 2, 4] = "М";

else

worksheet.Cells[i + 2, 4] = "Не указано";

worksheet.Cells[i + 2, 5] = "'" + allUsersFromUniversity[i].university;

worksheet.Cells[i + 2, 6] = allUsersFromUniversity[i].university_name;

worksheet.Cells[i + 2, 7] = "'" + allUsersFromUniversity[i].faculty;

worksheet.Cells[i + 2, 8] = allUsersFromUniversity[i].faculty_name;

worksheet.Cells[i + 2, 9] = "'" + allUsersFromUniversity[i].graduation;

onExcelOneStringWritten(i + 1, allUsersFromUniversity.Count);

}

catch { continue; }

}

#endregion

#region Сохранение и закрытие файла

workbook.SaveAs(AppDomain.CurrentDomain.BaseDirectory + fileName + ".xlsx");

fileName = AppDomain.CurrentDomain.BaseDirectory + fileName + ".xlsx";

workbook.Close();

excelApp.Quit();

Marshal.ReleaseComObject(worksheet);

Marshal.ReleaseComObject(workbook);

Marshal.ReleaseComObject(excelApp);

GC.Collect();

#endregion

return fileName;

}

public string WriteUserInfoToText(List<User> allUsersFromUniversity, Action<long, long> onExcelOneStringWritten)

{

#region Объявление переменных и присвоение значений

string fileName = "Text Data (" + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString() + ")";

fileName = fileName.Replace(':', '.');

FileStream fs = new FileStream(fileName + ".txt", FileMode.Create);

StreamWriter sw = new StreamWriter(fs);

#endregion

#region Запись заголовков

sw.WriteLine("ID ВКонтакте|Имя|Фамилия|ID Университета|Название Университета|ID Факультета|Название Факультета|Год выпуска");

#endregion

#region Запись данных

foreach (User user in allUsersFromUniversity)

{

sw.WriteLine(user.id + "|" + user.first_name + "|" + user.last_name + "|" + user.university + "|" + user.university_name + "|" + user.faculty + "|" + user.faculty_name + "|" + user.graduation);

onExcelOneStringWritten(allUsersFromUniversity.IndexOf(user) + 1, allUsersFromUniversity.Count);

}

#endregion

#region Сохранение и закрытие файла

sw.Close();

fs.Close();

fileName = Path.GetFullPath(fileName + ".txt");

#endregion

return fileName;

}

public List<User> ReadIDsFromExcel(string path, long columnNumber, Action<long, long> onTextOneRowRead)

{

#region Объявление переменных и присвоение значений

Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();

_Workbook workbook = excelApp.Workbooks.Open(path);

_Worksheet worksheet = (_Worksheet)workbook.ActiveSheet;

long lastRow = worksheet.Cells[worksheet.Rows.Count, columnNumber].End(Microsoft.Office.Interop.Excel.XlDirection.xlUp).Row;

List<User> allUsers = new List<User>();

#endregion

#region Чтение данных

for (int i = 2; i <= lastRow; i++)

{

allUsers.Add(new User() { id = worksheet.Cells[i, 1].Value2 });

onTextOneRowRead(lastRow - 1, i);

}

#endregion

#region Закрытие файла

workbook.Close();

excelApp.Quit();

#endregion

return allUsers;

}

public void WriteOnlineStatusToExcel(List<User> allOnlineStatuses, string fileName, DateTime startTime, bool firstTime, Action<long, long> onOneOnlineStatusWritten, System.Action onAllOnlineStatusesWritten)

{

#region Объявление переменных и присвоение значений

Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();

_Workbook workbook = (_Workbook)(excelApp.Workbooks.Open(AppDomain.CurrentDomain.BaseDirectory + fileName + ".xlsx"));

_Worksheet worksheet = (_Worksheet)workbook.ActiveSheet;

long lastColumn = worksheet.Cells[1, worksheet.Columns.Count].End(Microsoft.Office.Interop.Excel.XlDirection.xlToLeft).Column;

#endregion

#region Запись заголовков

if (firstTime)

worksheet.Cells[1, 1] = "ID ВКонтакте";

worksheet.Cells[1, lastColumn + 1] = startTime.ToShortDateString() + " " + startTime.ToShortTimeString();

#endregion

#region Запись данных

for (int i = 0; i < allOnlineStatuses.Count; i++)

{

if (firstTime)

worksheet.Cells[i + 2, 1] = "'" + allOnlineStatuses[i].id;

if (allOnlineStatuses[i].online == "0")

worksheet.Cells[i + 2, lastColumn + 1] = "Offline";

else if (allOnlineStatuses[i].online == "1" && allOnlineStatuses[i].online_app == null && allOnlineStatuses[i].online_mobile == null)

worksheet.Cells[i + 2, lastColumn + 1] = "Desktop";

else if (allOnlineStatuses[i].online == "1" && allOnlineStatuses[i].online_mobile != null && allOnlineStatuses[i].online_app == null)

worksheet.Cells[i + 2, lastColumn + 1] = "Mobile";

else if (allOnlineStatuses[i].online == "1" && allOnlineStatuses[i].online_app != null)

worksheet.Cells[i + 2, lastColumn + 1] = "Application";

else

worksheet.Cells[i + 2, lastColumn + 1] = allOnlineStatuses[i].online;

onOneOnlineStatusWritten(i + 1, allOnlineStatuses.Count);

}

#endregion

#region Сохранение и закрытие файла

workbook.Save();

workbook.Close();

excelApp.Quit();

Marshal.ReleaseComObject(worksheet);

Marshal.ReleaseComObject(workbook);

Marshal.ReleaseComObject(excelApp);

GC.Collect();

#endregion

onAllOnlineStatusesWritten();

}

public void CreateExcelWorkbook(string fileName)

{

#region Объявление переменных и присвоение значений

Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();

_Workbook workbook = (_Workbook)(excelApp.Workbooks.Add(Type.Missing));

_Worksheet worksheet = (_Worksheet)workbook.ActiveSheet;

#endregion

#region Сохранение и закрытие файла

workbook.SaveAs(AppDomain.CurrentDomain.BaseDirectory + fileName + ".xlsx");

workbook.Close();

excelApp.Quit();

Marshal.ReleaseComObject(worksheet);

Marshal.ReleaseComObject(workbook);

Marshal.ReleaseComObject(excelApp);

GC.Collect();

#endregion

}

#endregion

#region Остальные методы

public List<string> CreateYears(bool currentStudents)

{

List<string> years = new List<string>();

if (currentStudents)

for (int i = DateTime.Now.Year; i < DateTime.Now.Year + 4; i++)

years.Add(i.ToString());

else

for (int i = 1990; i < DateTime.Now.Year + 7; i++)

years.Add(i.ToString());

return years;

}

public void DeleteCookies()

{

string[] theCookies = System.IO.Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.Cookies));

foreach (string currentFile in theCookies)

try { System.IO.File.Delete(currentFile); }

catch { continue; }

}

public void ConectToWifi()

{

Wifi wifi = new Wifi();

IEnumerable<AccessPoint> accessPoints = wifi.GetAccessPoints().OrderByDescending(ap => ap.SignalStrength);

foreach (AccessPoint ap in accessPoints)

if (ap.Name.ToLower() == "netgear")

{

AuthRequest authRequest = new AuthRequest(ap);

ap.Connect(authRequest, false);

break;

}

}

#endregion

}

}

Класс MainWindow.xaml.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Threading;

using System.Threading.Tasks;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Forms;

namespace Grades_Analysis

{

public partial class MainWindow : Window

{

public MainWindow()

{

InitializeComponent();

findUsersGroupBox.IsEnabled = false;

cityComboBox.IsEnabled = false;

universityComboBox.IsEnabled = false;

findUsersButton.IsEnabled = false;

saveExcelCheckBox.IsEnabled = false;

saveTextCheckBox.IsEnabled = false;

saveUsersButton.IsEnabled = false;

settingsGroupBox.IsEnabled = false;

intervalComboBox.IsEnabled = false;

intervalComboBox.SelectedIndex = 0;

FinishHourComboBox.IsEnabled = false;

FinishHourComboBox.SelectedIndex = DateTime.Now.Hour + 1;

FinishMinuteComboBox.IsEnabled = false;

FinishMinuteComboBox.SelectedIndex = 0;

fileNameSaveTextBox.IsEnabled = false;

fileNameSaveTextBox.Text = "Online Statistics_" + DateTime.Now.ToShortDateString();

startCollectingButton.IsEnabled = false;

checkOnlineStatusGroupBox.IsEnabled = false;

overallProgressTextBlock.Text = "Собрано данных за " + DateTime.Now.ToShortDateString() + ": 0 из N/A. Следующая итерация через: N/A";

}

#region Объявление глобальных переменных

MyActions myAction = new MyActions();

User currUser;

List<User> allUsersFromUniversity = new List<User>();

int iterationsDone = 0;

int totalIterations = 0;

System.Windows.Threading.DispatcherTimer dispatcherTimerEverySecond;

System.Windows.Threading.DispatcherTimer dispatcherTimerCheckOnlineStatuses;

TimeSpan timeLeft;

#endregion

#region Методы нажатия на кнопки

private void LogInButton_Click(object sender, RoutedEventArgs e)

{

#region Объявление переменных и присвоение значений

AuthorisationForm authForm = new AuthorisationForm();

authForm.ShowDialog();

currUser = authForm.CurrUser;

#endregion

#region Авторизация в Вконтакте

if (currUser != null)

{

nameLabel.Content = "Имя пользователя: " + currUser.first_name + " " + currUser.last_name;

IDLabel.Content = "ID пользователя: " + currUser.UserID;

scopeLabel.Content = "Права доступа: " + currUser.Scope;

profilePictureImage.Source = currUser.Photo;

LogInButton.IsEnabled = false;

findUsersGroupBox.IsEnabled = true;

currentlyStudyingRadioButton.IsChecked = true;

countryComboBox.ItemsSource = myAction.GetAllCounties(currUser.Token);

countryComboBox.DisplayMemberPath = "title";

disclaimerTextBlock.Text = "Вход в ВКонтакте выполнен. Теперь вы можете пользоваться всем функционалом приложения.";

settingsGroupBox.IsEnabled = true;

chooseFileButton.IsEnabled = true;

}

#endregion

}

private void findUsersButton_Click(object sender, RoutedEventArgs e)

{

#region Изменение доступности элементов

settingsGroupBox.IsEnabled = false;

saveExcelCheckBox.IsEnabled = false;

saveTextCheckBox.IsEnabled = false;

saveUsersButton.IsEnabled = false;

findUsersButton.IsEnabled = false;

countryComboBox.IsEnabled = false;

cityComboBox.IsEnabled = false;

universityComboBox.IsEnabled = false;

allStudentsRadioButton.IsEnabled = false;

currentlyStudyingRadioButton.IsEnabled = false;

#endregion

#region Multi-метод

Task.Factory.StartNew(() =>

{

List<Faculty> faculties = myAction.GetAllFaculties(currUser.Token, ((University)universityComboBox.Dispatcher.Invoke(() => universityComboBox.SelectedItem)).id);

List<string> years = myAction.CreateYears(currentlyStudyingRadioButton.Dispatcher.Invoke(() => currentlyStudyingRadioButton.IsChecked.Value));

findUsersProgressBar.Dispatcher.Invoke(() => findUsersProgressBar.Value = 0);

findUsersProgressBar.Dispatcher.Invoke(() => findUsersProgressBar.Maximum = faculties.Count * years.Count);

progressBarTextBlock.Dispatcher.Invoke(() => progressBarTextBlock.Text = "Найдено факультетов: " + faculties.Count + ". Проверено факультетов: 0 из " + faculties.Count + ".");

foreach (Faculty faculty in faculties)

{

foreach (string year in years)

{

foreach (User oneUser in myAction.SearchUsers(currUser.Token, ((University)universityComboBox.Dispatcher.Invoke(() => universityComboBox.SelectedItem)).id, ((University)universityComboBox.Dispatcher.Invoke(() => universityComboBox.SelectedItem)).title, faculty.id, faculty.title, year, "sex"))

{

allUsersFromUniversity.Add(oneUser);

}

onOneYearFacultyChecked();

Thread.Sleep(500);

}

onOneFacultyChecked(faculties.IndexOf(faculty) + 1, faculties.Count);

}

onAllFacultiesChecked(faculties.Count, allUsersFromUniversity.Count);

});

#endregion

}

private void saveUsersButton_Click(object sender, RoutedEventArgs e)

{

#region Объявление переменных и присвоение значений

string excelPath = "";

string textPath = "";

#endregion

#region Измение характеристик ProgressBar'ов

findUsersProgressBar.Value = 0;

findUsersProgressBar.Maximum = allUsersFromUniversity.Count;

#endregion

#region Изменение доступности элементов

saveExcelCheckBox.IsEnabled = false;

saveTextCheckBox.IsEnabled = false;

saveUsersButton.IsEnabled = false;

findUsersButton.IsEnabled = false;

countryComboBox.IsEnabled = false;

cityComboBox.IsEnabled = false;

universityComboBox.IsEnabled = false;

allStudentsRadioButton.IsEnabled = false;

currentlyStudyingRadioButton.IsEnabled = false;

#endregion

#region Multi-метод

Task.Factory.StartNew(() =>

{

if (saveExcelCheckBox.Dispatcher.Invoke(() => saveExcelCheckBox.IsChecked.Value))

{

progressBarTextBlock.Dispatcher.Invoke(() => progressBarTextBlock.Text = "Производится запись в Excel-файл. Записано файлов: 0 из " + allUsersFromUniversity.Count + ".");

excelPath = myAction.WriteUserInfoToExcel(allUsersFromUniversity, onExcelOneStringWritten);

}

if (saveTextCheckBox.Dispatcher.Invoke(() => saveTextCheckBox.IsChecked.Value))

{

progressBarTextBlock.Dispatcher.Invoke(() => progressBarTextBlock.Text = "Производится запись в текстовый файл. Записано файлов: 0 из " + allUsersFromUniversity.Count + ".");

textPath = myAction.WriteUserInfoToText(allUsersFromUniversity, onTextOneStringWritten);

}

onFileFullyWritten(excelPath, textPath);

});

#endregion

}

private void chooseFileButton_Click(object sender, RoutedEventArgs e)

{

chooseFileButton.IsEnabled = false;

#region Объявление переменных и присвоение значений

string fileName;

var chooseFileDialog = new OpenFileDialog();

chooseFileDialog.DefaultExt = ".xlsx";

chooseFileDialog.Filter = "Excel Files|*.xlsx;.xls";

chooseFileDialog.InitialDirectory = System.Windows.Forms.Application.StartupPath;

#endregion

#region Диалог выбора файла

var result = chooseFileDialog.ShowDialog();

if (result == System.Windows.Forms.DialogResult.OK)

{

fileName = chooseFileDialog.FileName;

fileNameTextBox.Text = fileName.Split('\\').Last();

findUsersGroupBox.IsEnabled = false;

#region Multi-метод

Task.Factory.StartNew(() =>

{

allUsersFromUniversity = myAction.ReadIDsFromExcel(fileName, 1, onExcelOneRowRead);

intervalComboBox.Dispatcher.Invoke(() => intervalComboBox.IsEnabled = true);

FinishHourComboBox.Dispatcher.Invoke(() => FinishHourComboBox.IsEnabled = true);

FinishMinuteComboBox.Dispatcher.Invoke(() => FinishMinuteComboBox.IsEnabled = true);

fileNameSaveTextBox.Dispatcher.Invoke(() => fileNameSaveTextBox.IsEnabled = true);

startCollectingButton.Dispatcher.Invoke(() => startCollectingButton.IsEnabled = true);

});

#endregion

}

#endregion

}

private void startCollectingButton_Click(object sender, RoutedEventArgs e)

{

#region Объявление переменных и присвоение значений

DateTime startTime = new DateTime(((DateTime.Now.Ticks + TimeSpan.FromMinutes(int.Parse(intervalComboBox.Text)).Ticks - 1) / TimeSpan.FromMinutes(int.Parse(intervalComboBox.Text)).Ticks) * TimeSpan.FromMinutes(int.Parse(intervalComboBox.Text)).Ticks - TimeSpan.FromMinutes(int.Parse(intervalComboBox.Text)).Ticks);

int minutesNow = int.Parse(DateTime.Now.ToShortTimeString().Split(':')[0]) * 60 + int.Parse(DateTime.Now.ToShortTimeString().Split(':')[1]);

int minutesStop = int.Parse(FinishHourComboBox.Text) * 60 + int.Parse(FinishMinuteComboBox.Text);

totalIterations = (minutesStop - minutesNow) / int.Parse(intervalComboBox.Text);

timeLeft = new TimeSpan(0, int.Parse(intervalComboBox.Text), 0);

#endregion

#region Создание счетчиков

dispatcherTimerEverySecond = new System.Windows.Threading.DispatcherTimer();

dispatcherTimerEverySecond.Tick += dispatcherTimerEverySecond_Tick;

dispatcherTimerEverySecond.Interval = new TimeSpan(0, 0, 1);

dispatcherTimerCheckOnlineStatuses = new System.Windows.Threading.DispatcherTimer();

dispatcherTimerCheckOnlineStatuses.Tick += dispatcherTimerCheckOnlineStatuses_Tick;

dispatcherTimerCheckOnlineStatuses.Interval = new TimeSpan(0, int.Parse(intervalComboBox.Text), 0);

#endregion

#region Измение характеристик ProgressBar'ов

overallProgressProgressBar.Maximum = totalIterations;

eachIterationProgressBar.Maximum = allUsersFromUniversity.Count;

eachIterationProgressBar.Value = 0;

#endregion

settingsGroupBox.IsEnabled = false;

myAction.CreateExcelWorkbook(fileNameSaveTextBox.Text);

#region Multi-метод

Task.Factory.StartNew(() =>

{

allUsersFromUniversity = myAction.GetOnlineStatus(currUser.Token, allUsersFromUniversity, onOneOlineStatusChecked, onAllOlineStatusesChecked);

eachIterationProgressBar.Dispatcher.Invoke(() => eachIterationProgressBar.Maximum = allUsersFromUniversity.Count);

eachIterationProgressBar.Dispatcher.Invoke(() => eachIterationProgressBar.Value = 0);

myAction.WriteOnlineStatusToExcel(allUsersFromUniversity, fileNameSaveTextBox.Dispatcher.Invoke(() => fileNameSaveTextBox.Text), startTime, true, onOneOnlineStatusWritten, onAllOnlineStatusesWritten);

iterationsDone += 1;

overallProgressProgressBar.Dispatcher.Invoke(() => overallProgressProgressBar.Value = iterationsDone);

if (totalIterations == iterationsDone)

onOnlineStatusesCheckFinished();

});

#endregion

dispatcherTimerEverySecond.Start();

dispatcherTimerCheckOnlineStatuses.Start();

}

#endregion

#region Методы изменения ComboBox'ов

private void countryComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)

{

if (countryComboBox.SelectedValue != null)

{

cityComboBox.ItemsSource = myAction.GetAllCities(currUser.Token, ((Country)countryComboBox.SelectedItem).id);

cityComboBox.DisplayMemberPath = "title";

cityComboBox.IsEnabled = true;

universityComboBox.ItemsSource = null;

progressBarTextBlock.Text = "Найдено факультетов: N/A.";

}

if (countryComboBox.SelectedValue != null && cityComboBox.SelectedValue != null && universityComboBox.SelectedValue != null)

findUsersButton.IsEnabled = true;

else

findUsersButton.IsEnabled = false;

}

private void cityComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)

{

if (countryComboBox.SelectedValue != null && cityComboBox.SelectedValue != null)

{

universityComboBox.ItemsSource = myAction.GetAllUniversities(currUser.Token, ((Country)countryComboBox.SelectedItem).id, ((City)cityComboBox.SelectedItem).id);

universityComboBox.DisplayMemberPath = "title";

universityComboBox.IsEnabled = true;

progressBarTextBlock.Text = "Найдено факультетов: N/A.";

}

if (countryComboBox.SelectedValue != null && cityComboBox.SelectedValue != null && universityComboBox.SelectedValue != null)

findUsersButton.IsEnabled = true;

else

findUsersButton.IsEnabled = false;

}

private void universityComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)

{

if (countryComboBox.SelectedValue != null && cityComboBox.SelectedValue != null && universityComboBox.SelectedValue != null)

{

List<Faculty> faculties = myAction.GetAllFaculties(currUser.Token, ((University)universityComboBox.SelectedItem).id);

progressBarTextBlock.Text = "Найдено факультетов: " + faculties.Count + ".";

findUsersButton.IsEnabled = true;

}

}

#endregion

#region Методы изменения Checkbox'ов

private void saveExcelCheckBox_Checked(object sender, RoutedEventArgs e)

{

if (saveExcelCheckBox.IsChecked.Value || saveTextCheckBox.IsChecked.Value)

saveUsersButton.IsEnabled = true;

else

saveUsersButton.IsEnabled = false;

}

private void saveTextCheckBox_Checked(object sender, RoutedEventArgs e)

{

if (saveExcelCheckBox.IsChecked.Value || saveTextCheckBox.IsChecked.Value)

saveUsersButton.IsEnabled = true;

else

saveUsersButton.IsEnabled = false;

}

private void saveExcelCheckBox_Unchecked(object sender, RoutedEventArgs e)

{

if (saveExcelCheckBox.IsChecked.Value || saveTextCheckBox.IsChecked.Value)

saveUsersButton.IsEnabled = true;

else

saveUsersButton.IsEnabled = false;

}

private void saveTextCheckBox_Unchecked(object sender, RoutedEventArgs e)

{

if (saveExcelCheckBox.IsChecked.Value || saveTextCheckBox.IsChecked.Value)

saveUsersButton.IsEnabled = true;

else

saveUsersButton.IsEnabled = false;

}

#endregion

#region Методы для динамического обновления элементов (для мультизадачности)

public void onOneYearFacultyChecked()

{

double currentValue = findUsersProgressBar.Dispatcher.Invoke(() => findUsersProgressBar.Value);

for (double i = currentValue; i <= currentValue + 1; i += 0.0005)

findUsersProgressBar.Dispatcher.Invoke(() => findUsersProgressBar.Value = i);

}

public void onOneFacultyChecked(int checkedFaculties, int allFaculties)

{

progressBarTextBlock.Dispatcher.Invoke(() => progressBarTextBlock.Text = "Найдено факультетов: " + allFaculties + ". Проверено факультетов: " + checkedFaculties + " из " + allFaculties + ".");

}

public void onAllFacultiesChecked(int allFaculties, long allFoundUsers)

{

progressBarTextBlock.Dispatcher.Invoke(() => progressBarTextBlock.Text = "Проверены все факультеты выбранного ВУЗа. Найдено пользователей: " + allFoundUsers + ".");

saveExcelCheckBox.Dispatcher.Invoke(() => saveExcelCheckBox.IsEnabled = true);

saveTextCheckBox.Dispatcher.Invoke(() => saveTextCheckBox.IsEnabled = true);

findUsersButton.Dispatcher.Invoke(() => findUsersButton.IsEnabled = true);

countryComboBox.Dispatcher.Invoke(() => countryComboBox.IsEnabled = true);

cityComboBox.Dispatcher.Invoke(() => cityComboBox.IsEnabled = true);

universityComboBox.Dispatcher.Invoke(() => universityComboBox.IsEnabled = true);

allStudentsRadioButton.Dispatcher.Invoke(() => allStudentsRadioButton.IsEnabled = true);

currentlyStudyingRadioButton.Dispatcher.Invoke(() => currentlyStudyingRadioButton.IsEnabled = true);

}

public void onExcelOneStringWritten(long counter, long allStrings)

{

progressBarTextBlock.Dispatcher.Invoke(() => progressBarTextBlock.Text = "Производится запись в Excel-файл. Записано файлов: " + counter + " из " + allStrings + ".");

findUsersProgressBar.Dispatcher.Invoke(() => findUsersProgressBar.Value = counter);

}

public void onTextOneStringWritten(long counter, long allStrings)

{

progressBarTextBlock.Dispatcher.Invoke(() => progressBarTextBlock.Text = "Производится запись в текстовый файл. Записано файлов: " + counter + " из " + allStrings + ".");

findUsersProgressBar.Dispatcher.Invoke(() => findUsersProgressBar.Value = counter);

}

public void onFileFullyWritten(string excelPath, string textPath)

{

saveExcelCheckBox.Dispatcher.Invoke(() => saveExcelCheckBox.IsEnabled = true);

saveTextCheckBox.Dispatcher.Invoke(() => saveTextCheckBox.IsEnabled = true);

findUsersButton.Dispatcher.Invoke(() => findUsersButton.IsEnabled = true);

countryComboBox.Dispatcher.Invoke(() => countryComboBox.IsEnabled = true);

cityComboBox.Dispatcher.Invoke(() => cityComboBox.IsEnabled = true);

universityComboBox.Dispatcher.Invoke(() => universityComboBox.IsEnabled = true);

allStudentsRadioButton.Dispatcher.Invoke(() => allStudentsRadioButton.IsEnabled = true);

currentlyStudyingRadioButton.Dispatcher.Invoke(() => currentlyStudyingRadioButton.IsEnabled = true);

saveUsersButton.Dispatcher.Invoke(() => saveUsersButton.IsEnabled = true);

settingsGroupBox.Dispatcher.Invoke(() => settingsGroupBox.IsEnabled = true);

System.Windows.MessageBox.Show("Данные были записаны в файл(ы):" + Environment.NewLine + excelPath + Environment.NewLine + textPath, "Данные записаны");

}

public void onExcelOneRowRead(long allRows, long counter)

{

loadIDsProgressBar.Dispatcher.Invoke(() => loadIDsProgressBar.Maximum = allRows);

loadIDsProgressBar.Dispatcher.Invoke(() => loadIDsProgressBar.Value = counter);

}

public void onOneOlineStatusChecked(long counter, long allUsers)

{

eachInerationTextBlock.Dispatcher.Invoke(() => eachInerationTextBlock.Text = "Проверено пользователей: " + counter + " из " + allUsers);

eachIterationProgressBar.Dispatcher.Invoke(() => eachIterationProgressBar.Value = counter);

}

public void onAllOlineStatusesChecked()

{

eachInerationTextBlock.Dispatcher.Invoke(() => eachInerationTextBlock.Text = "Все пользователи проверены. Подготовка к записи");

eachIterationProgressBar.Dispatcher.Invoke(() => eachIterationProgressBar.Maximum = 10);

eachIterationProgressBar.Dispatcher.Invoke(() => eachIterationProgressBar.IsIndeterminate = true);

}

public void onOneOnlineStatusWritten(long counter, long allUsers)

{

eachIterationProgressBar.Dispatcher.Invoke(() => eachIterationProgressBar.IsIndeterminate = false);

eachInerationTextBlock.Dispatcher.Invoke(() => eachInerationTextBlock.Text = "Записано данных в Excel: " + counter + " из " + allUsers);

eachIterationProgressBar.Dispatcher.Invoke(() => eachIterationProgressBar.Value = counter);

}

public void onAllOnlineStatusesWritten()

{

eachInerationTextBlock.Dispatcher.Invoke(() => eachInerationTextBlock.Text = "Все данные записаны в Excel");

}

public void onOnlineStatusesCheckFinished()

{

dispatcherTimerCheckOnlineStatuses.Stop();

dispatcherTimerEverySecond.Stop();

overallProgressTextBlock.Dispatcher.Invoke(() => overallProgressTextBlock.Text = "Все данные за " + DateTime.Now.ToShortDateString() + " собраны.");

settingsGroupBox.Dispatcher.Invoke(() => settingsGroupBox.IsEnabled = false);

checkOnlineStatusGroupBox.Dispatcher.Invoke(() => checkOnlineStatusGroupBox.IsEnabled = false);

}

#endregion

#region Остальные методы

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)

{

myAction.DeleteCookies();

}

private void dispatcherTimerEverySecond_Tick(object sender, EventArgs e)

{

timeLeft = timeLeft.Subtract(new TimeSpan(0, 0, 1));

overallProgressTextBlock.Text = "Собрано данных за " + DateTime.Now.ToShortDateString() + ": " + iterationsDone + " из " + totalIterations + ". Следующая итерация через: " + timeLeft.Minutes.ToString("00") + ":" + timeLeft.Seconds.ToString("00");

if (timeLeft == new TimeSpan(0,0,0))

timeLeft = new TimeSpan(0, int.Parse(intervalComboBox.Text), 0);

}

private void dispatcherTimerCheckOnlineStatuses_Tick(object sender, EventArgs e)

{

#region Объявление переменных и присвоение значений

DateTime startTime = new DateTime(((DateTime.Now.Ticks + TimeSpan.FromMinutes(int.Parse(intervalComboBox.Text)).Ticks - 1) / TimeSpan.FromMinutes(int.Parse(intervalComboBox.Text)).Ticks) * TimeSpan.FromMinutes(int.Parse(intervalComboBox.Text)).Ticks - TimeSpan.FromMinutes(int.Parse(intervalComboBox.Text)).Ticks);

eachIterationProgressBar.Maximum = allUsersFromUniversity.Count;

eachIterationProgressBar.Value = 0;

#endregion

#region Multi-метод

Task.Factory.StartNew(() =>

{

allUsersFromUniversity = myAction.GetOnlineStatus(currUser.Token, allUsersFromUniversity, onOneOlineStatusChecked, onAllOlineStatusesChecked);

eachIterationProgressBar.Dispatcher.Invoke(() => eachIterationProgressBar.Maximum = allUsersFromUniversity.Count);

eachIterationProgressBar.Dispatcher.Invoke(() => eachIterationProgressBar.Value = 0);

myAction.WriteOnlineStatusToExcel(allUsersFromUniversity, fileNameSaveTextBox.Dispatcher.Invoke(() => fileNameSaveTextBox.Text), startTime, true, onOneOnlineStatusWritten, onAllOnlineStatusesWritten);

iterationsDone += 1;

overallProgressProgressBar.Dispatcher.Invoke(() => overallProgressProgressBar.Value = iterationsDone);

if (totalIterations == iterationsDone)

onOnlineStatusesCheckFinished();

});

#endregion

}

#endregion

}

}

Приложение 2

Код приложения для получения расписания с сайта ВШЭ

from bs4 import BeautifulSoup

from openpyxl import Workbook

import os

from datetime import datetime

from selenium import webdriver

from urllib import request

#region Объявление переменных

faculties = []

allLessons = []

desktopPath = os.path.expanduser('~') + '/Desktop/'

wb = Workbook()

ws = wb.active

#endregion

driver = webdriver.Firefox()

#region Сбор списка факультетов

print(datetime.now().strftime('%H:%M:%S') + '. Собираю список факультетов')

driver.get('https://ba.hse.ru/')

soup = BeautifulSoup(driver.page_source, 'html.parser')

for faculty in soup.find('div', class_='msk events').find_all('p', class_='text'):

facultyName = faculty.find('a').text.strip()

facultyLink = faculty.find('a')['href']

faculties.append({

'facultyName': facultyName,

'facultyLink': facultyLink

})

#endregion

#region Сбор расписания

for faculty in faculties:

try:

driver.get(faculty['facultyLink'] + 'timetable')

soup = BeautifulSoup(driver.page_source, 'html.parser')

courses = soup.find('div', class_='main').find('div', class_='extra-left').find_all('p', class_='with-indent')[-1].find('select').find_all('option')

for course in courses:

courseNumber = course.text.split(' ')[0]

courseGroups = []

#region Сбор ID всех групп на курсу

for group in course['data-groups'].strip().split('\n'):

if len(group.strip()) > 1:

courseGroups.append({

'groupName': group.strip().split(',')[0].split('"')[1],

'groupID': group.strip().split(',')[1].split('"')[1]

})

#endregion

#region Сбор расписания для группы


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

  • Комбинированный тип данных для хранения входных данных о студентах и информация, содержащаяся в полях. Пример структуры входных и выходных данных. Алгоритм работы и программный код программы по успеваемости студентов, описание используемых функций.

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

  • Рассмотрение основ проведения корреляционного анализа по исходным данным группы студентов. Построение теоретической и эмпирической линий регрессии; проведение анализа с помощью программы "regres.exe". Представление копий экрана зависимости показателей.

    контрольная работа [2,8 M], добавлен 07.06.2014

  • Построение корреляционного поля, гипотеза связи исследуемых факторов. Определение коэффициента корреляции. Оценка статистической значимости вычисленных коэффициентов корреляции. Параметры уравнения линейной парной регрессии, коэффициента эластичности.

    реферат [526,7 K], добавлен 10.11.2010

  • Описание технологии asp.net. Страницы веб-приложения, тестирование системы. Описание функциональной, динамической модели системы. Диаграммы вариантов использования, последовательности, база данных приложения. Реализация программы, интерфейс, тестирование.

    курсовая работа [3,2 M], добавлен 30.01.2013

  • Описание основных используемых функций: логическая функция "если", "срзнач", "мин", "макс", "впр". Алгоритм расчета оценок и успеваемости, их анализ. Связанная и внедренная диаграмма, отражающая количество студентов в каждой исследуемой категории.

    реферат [61,7 K], добавлен 22.12.2011

  • Основные функции, требования и характеристики системы тестирования. Создание современной модели WEB-сервиса тестирования знаний студентов с помощью средств WEB-разработки. Описание пользовательского интерфейса сайта, этапы прохождения тестовых заданий.

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

  • Проектирование сайта: сбор и компоновка информации, разработка технического задания; дизайн интерфейса, создание шаблонов и программных компонентов, интеграция сайта с системой управления, тестирование и отладка; сдача. Описание среды программирования.

    курсовая работа [60,2 K], добавлен 30.06.2014

  • Проектирование программного модуля: сбор исходных материалов; описание входных и выходных данных; выбор программного обеспечения. Описание типов данных и реализация интерфейса программы. Тестирование программного модуля и разработка справочной системы.

    курсовая работа [81,7 K], добавлен 18.08.2014

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

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

  • Разработка программы построения графика экспериментальных точек и полинома регрессии второй степени в среде Turbo Pascal. Блок-схемы алгоритмов используемых процедур. Листинг программы. Составление вектора свободных членов и матрицы коэффициентов.

    курсовая работа [46,6 K], добавлен 24.11.2013

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