From e6c5b0e50e05124ba5ea3838f03d71b214390103 Mon Sep 17 00:00:00 2001 From: ViktorKiselev98 <77990767+ViktorKiselev98@users.noreply.github.com> Date: Tue, 23 Mar 2021 22:59:35 +0300 Subject: [PATCH 1/3] dz3 --- README.md | 403 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 236 insertions(+), 167 deletions(-) diff --git a/README.md b/README.md index 0ee3577..6925059 100644 --- a/README.md +++ b/README.md @@ -1,191 +1,260 @@ -# Задача к лекции «HTML, I часть» - -:warning: При создании PullRequest'а не забудьте указать ваши имя и фамилию. -:warning: [Codestyle для HTML](https://github.com/urfu-2015/guides/blob/master/html-codestyle.md) -:sos: [Как создать Pull Request](https://github.com/urfu-2015/guides/blob/master/how-to-pull-request.md) - -У нас есть интересный текст из блога Яндекса с комментариями. -Предлагается превратить его в HTML документ в файле index.html. - -Постарайтесь использовать как можно больше различных элементов. - -В тексте упоминается алгоритм Флетчера. -Будет плюсом, если вы его тоже добавите в документ c помощью **текстовой разметки**: - - -```text -Блог компании Яндекс. - -ЯНДЕКС.ПОЧТА: КАК МЫ ИЗМЕРЯЕМ СКОРОСТЬ ЗАГРУЗКИ И УЛУЧШАЕМ ЕЁ - -Если ваш сайт медленно грузится, вы рискуете тем, что люди не оценят ни то, -какой он красивый, ни то, какой он удобный. Никому не понравится, когда все -тормозит. Мы регулярно добавляем в Яндекс.Почту новую функциональность, -иногда — исправляем ошибки, а это значит, у нас постоянно появляются новый код -и новая логика. Всё это напрямую влияет на скорость работы интерфейса. - -Что мы измеряем - -Этапы первой загрузки: -* подготовка; -* загрузка статики (HTTP-запрос и парсинг); -* исполнение модулей; -* инициализация базовых объектов; -* отрисовка. - -Этапы отрисовки любой страницы: -* подготовка к запросу на сервер; -* запрос данных с сервера; -* шаблонизация; -* обновление DOM. - -— «Ок, теперь у нас есть метрики, мы можем отправить их на сервер» - говорим мы -— «Что же дальше?» - вопрошаете вы -— «А давай построим график!» - отвечаем мы -— «А что будем считать?» - уточняете вы - -Как вы знаете, медиана – это серединное, а не среднее значение в выборке. -Если у нас имеются числа 1, 2, 2, 3, 8, 10, 20, то медиана – 3, а среднее – 6,5. -В общем случае медиана отлично показывает, сколько грузится средний пользователь. - -В случае ускорения или замедления медиана, конечно, изменится. Но она не может -рассказать, сколько пользователей ускорилось, а сколько замедлилось. - -APDEX – метрика, которая сразу говорит: хорошо или плохо. Метрика -работает очень просто. Мы выбираем временной интервал [0; t], такой, что если -время показа страницы попало в него, то пользователь счастлив. Берем еще один -интервал, (t; 4t] (в четыре раза больше первого), и считаем, что если страница -показана за это время, то пользователь в целом удовлетворен скоростью работы, -но уже не настолько счастлив. И применяем формулу: - -(кол-во счастливых пользователей + кол-во удовлетворенных / 2) / (кол-во всех). -Получается значение от нуля до единицы, которое, видимо, лучше всего показывает, -хорошо или плохо работает почта. - -Как мы измеряем - -Сейчас модуль обновления сам логирует все свои стадии, и можно легко понять -причину замедления: медленнее стал отвечать сервер либо слишком долго -выполняется JavaScript. Выглядит это примерно так: - -this.timings['look-ma-im-start'] = Date.now(); -this.timings['look-ma-finish'] = Date.now(); - -C помощью Date.now() мы получаем текущее время. Все тайминги собираются и при -отправке рассчитываются. На этапах разница между “end” и “start” не считается, -а все вычисления производятся в конце: - -var totalTime = this.timings['look-ma-finish'] - this.timings['look-ma-im-start']; - -И на сервер прилетают подобные записи: +#include +//================================================================== 1 задание ================================================================================= +using namespace std; + +class Figure +{ +public: + virtual void area() = 0; +}; + +class Parallelogram : public Figure +{ +protected: + int base; + int height; +public: + + Parallelogram(int value_base, int value_height) :base(value_base), height(value_height) + { -serverResponse=50&domUpdate=60 + } + void area() override + { + cout << "The parallelogram area is " << base * height << endl; + } +}; + +class Circle : public Figure +{ + double radius; + double P; +public: + Circle(double value_radius) : radius(value_radius) + { + P = 3.1415; -Как мы ускоряем + } + void area() override + { + cout << "The area of the circle is " << 3.1415 * (radius * radius) << endl; + } +}; -Чтобы снизить время загрузки почты при выходе новых версий, -мы уже делаем следующее: +class Rectangle : public Parallelogram +{ +public: + Rectangle(int value_base, int value_height) : Parallelogram(value_base, value_height) + { -* включаем gzip; -* выставляем заголовки кэширования; -* фризим CSS, JS, шаблоны и картинки; -* используем CDN; + } + void area() override + { + cout << "The area of the triangle is " << base * height << endl; + } +}; -Мы подумали: «А что если хранить где-то старую версию файлов, а при выходе новой -передавать только diff между ней и той, которая сохранена у пользователя?» -В браузере же останется просто наложить патч на клиенте. +class Square : public Parallelogram +{ +public: -На самое деле эта идея не нова. Уже существуют стандарты для HTTP — например, -RFC 3229 «Delta encoding in HTTP» и «Google SDHC», — но по разным причинам они -не получили должного распространения в браузерах и на серверах. + Square(int value_base, int value_height) : Parallelogram(value_base, value_height) + { -Мы же решили сделать свой аналог на JS. Чтобы реализовать этот метод обновления, -начали искать реализации diff на JS. На популярных хостингах кода нашли -библиотеки: -- VCDiff -- google-diff-patch-match + } -Для окончательного выбора библиотеки нам нужно сравнить: + void area() override + { + cout << "The square area is " << base * height << endl; + } +}; -Библиотека | IE 9 | Opera 12 ----------- | ---- | -------- -vcdiff | 8 | 5 -google diff | 1363 | 76 +class Rhombus : public Parallelogram +{ +public: + Rhombus(int value_base, int value_height) : Parallelogram(value_base, value_height) + { -После того как мы определились с библиотекой для диффа, нужно определиться с тем, -где и как хранить статику на клиенте. + } + void area() override + { + cout << "The area of the rhombus is " << base * height << endl; + } +}; +//====================================================================== 2 задание =================================================================================== +class Car +{ +protected: + string company; + string model; +public: + Car() { -Формат файла с патчами для проекта выглядит так: -[ + } + Car(string c, string m) :company(c), model(m) { - "k": "jane.css", - "p": [patch], - "s": 4554 - }, + + } + string getcompany() + { + return company; + } + string getmodel() + { + return model; + } +}; + +class PassengerCar : virtual public Car +{ +public: + PassengerCar(string c, string m) : Car(c, m) { - "k": "jane.css", - "p": [patch], - "s": 4554 + } -] - -То есть это обычный массив из объектов. Каждый объект — отдельный ресурс. У -каждого объекта есть три свойства. k — названия ключа в localStorage для этого -ресурса. p — патч для ресурса, который сгенерировал vcdiff. s — чексумма для -ресурса актуальной версии, чтобы потом можно было проверить правильность -наложения патча на клиенте. Чексумма вычисляется по алгоритму Флетчера. - -Алгоритм Бройдена — Флетчера — Гольдфарба — Шанно (BFGS) -— итерационный метод численной оптимизации, предназначенный для -нахождения локального максимума/минимума нелинейного функционала -без ограничений. - -Почему именно алгоритм Флетчера, а не другие популярные алгоритмы вроде: -CRC16/32 - алгоритм нахождения контрольной суммы, предназначенный для проверки -целостности данных -md5 - 128-битный алгоритм хеширования. Предназначен для создания «отпечатков» -или дайджестов сообщения произвольной длины и последующей проверки -их подлинности. - -Потому что он быстрый, компактный и легок в реализации. - -Итог - -Фактически мы экономим 80-90% трафика. Размер загружаемой статитки в байтах: - -Релиз | С патчем | Без патча -7.7.20 | 397 | 174 549 -7.7.21 | 383 | 53 995 -7.7.22 | 483 | 3 995 - -Автор: @doochik -С++ разработик -Электронная почта: (doochik@yandex-team.ru) -Компания: Яндекс - -Комментарии (3): + string getcompany() + { + return company; + } + string getmodel() + { + return model; + } +}; -- Mogaika (mogaika@yandex-team.ru) 30 ноября 2014 в 17:05 +class Bus : virtual public Car +{ +public: + Bus(string c, string m) : Car(c, m) + { + + } + string getcompany() + { + return company; + } + string getmodel() + { + return model; + } +}; +class Minivan : public PassengerCar, public Bus +{ +public: + Minivan(string c, string m) : PassengerCar(c, m), Bus(c, m) + { + + } + string getcompany() + { + return company; + } + string getmodel() + { + return model; + } +}; +//=============================================================== 3 задание ================================================================================= + +class Fraction +{ +private: + int numerator; + int denominator; +public: + Fraction() :numerator(0), denominator(1) + { - А можете привести сравнение, на сколько быстрее грузится lite версия? + } + Fraction(int numerator, int denominator) + { + this->numerator = numerator; + this->denominator = denominator; + } + double getValue() const + { + return (double)numerator / denominator; + } + friend Fraction operator+ (const Fraction& f1, const Fraction& f2); +}; + +Fraction operator+ (const Fraction& f1, const Fraction& f2) +{ + int a = f2.denominator * f1.numerator; + int b = f1.denominator * f2.numerator; + int c = f1.denominator * f2.denominator; + return Fraction(a + b, c); +} +//========================================================= 4 задание ============================================================================== +class Card +{ + + friend ostream& operator<< (ostream& os, const Card& aCard); + +public: + enum rank + { + ACE = 1, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, + JACK, QUEEN, KING + }; + enum suit { CLUBS, DIAMONDS, HEARTS, SPADES }; -- JIguse (mrawesome@yandex.ru) 29 ноября 2014 в 21:30 + Card(rank r = ACE, suit s = SPADES, bool ifu = true); - Спасибо за статью, познавательно. Здорово, что Яндекс делится некоторыми - подробностями о внутренней работе сервисов. + + int GetValue() const; -- Brister (brist89@yandex-team.ru) 24 ноября 2014 в 13:13 + void Flip(); - (кол-во счастливых пользователей + кол-во удовлетворенных / 2) / (кол-во всех). - Получается значение от нуля до единицы, которое, видимо, лучше всего показывает, - хорошо или плохо работает почта. +private: + rank m_Rank; + suit m_Suit; + bool m_IsFaceUp; +}; - наверное все-таки от 0.5 до 1 +Card::Card(rank r, suit s, bool ifu) : m_Rank(r), m_Suit(s), m_IsFaceUp(ifu) +{ -- alexeimois (test@yandex.ru) 22 ноября 2014 в 17:35 +} - Мы измеряем скорость загрузки с помощью Яндекс.Метрики: - help.yandex.ru/metrika/reports/monitoring_timing.xml +int Card::GetValue() const +{ + + int value = 0; + if (m_IsFaceUp) + { + + value = m_Rank; + + if (value > 10) + { + value = 10; + } + } -© Яндекс, help@yandex.ru, Хохрякова, 10 -``` + return value; +} + +void Card::Flip() +{ + m_IsFaceUp = !(m_IsFaceUp); +} +int main() +{ + Rhombus rhombus(10, 15); + rhombus.area(); + Circle circle(3.1415); + circle.area(); + Car car("mercedes", "Maybach"); + PassengerCar pcar("bmw", "x5"); + Bus bus("Mercedes-Benz", "Sprinter"); + Minivan minivan("Volkswagen", "Multivan T5"); + cout << car.getcompany() << endl; + cout << pcar.getcompany() << endl; + Fraction f1(3, 7); + Fraction f2(9, 2); + Fraction f3 = f1 + f2; + cout << f3.getValue() << endl; + + +} From dde420d42c19b3ee7beac9af00504459486c4c5d Mon Sep 17 00:00:00 2001 From: ViktorKiselev98 <77990767+ViktorKiselev98@users.noreply.github.com> Date: Tue, 23 Mar 2021 23:15:35 +0300 Subject: [PATCH 2/3] add dz3 --- README.md => dz3 c++ | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename README.md => dz3 c++ (100%) diff --git a/README.md b/dz3 c++ similarity index 100% rename from README.md rename to dz3 c++ From 5838e09505ef90e23730585d867e9d52c285b874 Mon Sep 17 00:00:00 2001 From: ViktorKiselev98 <77990767+ViktorKiselev98@users.noreply.github.com> Date: Sun, 28 Mar 2021 20:36:00 +0300 Subject: [PATCH 3/3] add dz4 --- index.html | 269 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 266 insertions(+), 3 deletions(-) diff --git a/index.html b/index.html index 2d780b6..db8ca02 100644 --- a/index.html +++ b/index.html @@ -1,3 +1,266 @@ - - - + + +#include +#include +#include +#include +#include +#include +#include +//============================================================================================= 1 задание ========================================================= +using namespace std; +class ArrayInt +{ +private: + int m_length; + int* m_data; + +public: + ArrayInt() : m_length(0), m_data(nullptr) + { + + } + + ArrayInt(int length) : m_length(length) + { + assert(length >= 0); + if (length > 0) + m_data = new int[length]; + else + m_data = nullptr; + } + + ~ArrayInt() + { + delete[] m_data; + } + + void erase() + { + delete[] m_data; + + m_data = nullptr; + m_length = 0; + } + + int& operator[](int index) + { + assert(index >= 0 && index < m_length); + return m_data[index]; + } + + + void reallocate(int newLength) + { + + erase(); + + + if (newLength <= 0) + return; + + + m_data = new int[newLength]; + m_length = newLength; + } + + + void resize(int newLength) + { + + if (newLength == m_length) + return; + + + if (newLength <= 0) + { + erase(); + return; + } + + + int* data = new int[newLength]; + + + if (m_length > 0) + { + int elementsToCopy = (newLength > m_length) ? m_length : newLength; + + + for (int index = 0; index < elementsToCopy; ++index) + data[index] = m_data[index]; + } + + + delete[] m_data; + + + m_data = data; + m_length = newLength; + } + + void insertBefore(int value, int index) + { + + assert(index >= 0 && index <= m_length); + + int* data = new int[m_length + 1]; + + + for (int before = 0; before < index; ++before) + data[before] = m_data[before]; + + + data[index] = value; + + for (int after = index; after < m_length; ++after) + data[after + 1] = m_data[after]; + + + delete[] m_data; + m_data = data; + ++m_length; + } + + void remove(int index) + { + + assert(index >= 0 && index < m_length); + + + if (m_length == 1) + { + erase(); + return; + } + + + int* data = new int[m_length - 1]; + + + for (int before = 0; before < index; ++before) + data[before] = m_data[before]; + + + for (int after = index + 1; after < m_length; ++after) + data[after - 1] = m_data[after]; + + delete[] m_data; + m_data = data; + --m_length; + } + + void insertAtBeginning(int value) + { + insertBefore(value, 0); + + } + void insertAtEnd(int value) + { + insertBefore(value, m_length); + + } + + int getLength() + { + return m_length; + } +}; +//============================================================================ 2 задание ========================================================================== + +int main() +{ + + std::vector v = { 1,1,2,5 }; + std::set s(v.begin(), v.end()); + std::cout << s.size() << std::endl; +} +// ============================================================================ 3 задание =============================================================================== +class Hand +{ +public: + Hand(); + + virtual ~Hand(); + + + void Add(Card* pCard); + + void Clear(); + + int GetTotal() const; + +protected: + vector m_Cards; +}; + +Hand::Hand() +{ + m_Cards.reserve(7); +} + +Hand::~Hand() +{ + Clear(); +} + +void Hand::Add(Card* pCard) +{ + m_Cards.push_back(pCard); +} + +void Hand::Clear() +{ + + vector::iterator iter; + for (iter = m_Cards.begin(); iter != m_Cards.end(); ++iter) + { + delete* iter; + *iter = 0; + } + + m_Cards.clear(); +} + +int Hand::GetTotal() const +{ + + if (m_Cards.empty()) + { + return 0; + } + + + if (m_Cards[0]->GetValue() == 0) + { + return 0; + } + + + int total = 0; + vector::const_iterator iter; + for (iter = m_Cards.begin(); iter != m_Cards.end(); ++iter) + { + total += (*iter)->GetValue(); + } + + + bool containsAce = false; + for (iter = m_Cards.begin(); iter != m_Cards.end(); ++iter) + { + if ((*iter)->GetValue() == Card::ACE) + { + containsAce = true; + } + } + + + if (containsAce && total <= 11) + { + + total += 10; + } + + return total; +} +