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;
+}
+