Определение наличия (и степени) зависимости академической успеваемости студентов от количества времени, проведенного ими в соцсети "ВКонтакте"
Коэффициент ранговой корреляции Спирмена. Приложения для получения информации с сайта, описание функционала и интерфейса. Описание классов и используемых библиотек. Подготовка и первичный анализ данных. Тестирование 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