Browse Source

03 HW alpha, 03 fixes, program

Ivan Asmer 8 years ago
parent
commit
917c4b84e5

+ 4 - 0
02OperationsTypesComparisonConditionLogic.md

@@ -229,6 +229,10 @@ var a; //значение a - undefined
 `null` - в целом аналогичен `undefined`, но предназначен для использования его программистом. Т. е. если вы хотите пометить переменную как *пустую* -
 используйте `null`
 
+## `typeof`
+
+позволяет узнать тип в виде строки
+
 ## Операции сравнения
 
 Каждое выражение можно сравнивать с другим выражением:

+ 3 - 1
03StructuresAndEvaluationsLoops.md

@@ -95,7 +95,9 @@ alert(b != a ? "b - не a" : "b - это a");
 В определенных ситуациях (обычно когда вы хотите что-то поменять в объекте, но хотите сохранить "оригинальный" объект) это мешает. Но, с другой стороны, это позволяет делать циклические ссылки в объектах.
 
 > Укажите у человека его гаджеты в отдельных полях. Задайте гаджетам владельца. Как это сделать?
+
 > Можно ли задать циклические ссылки при декларативном описании массивов или объектов?
+
 > Сделайте объект или массив с единственным элементом со ссылкой на самого себя.
 
 ## Императивный подход к созданию сложных структур данных
@@ -112,7 +114,6 @@ arr[2] = 15;
 ```
 
 Обратите внимание, что индекс в `[]` является **выражением**, то есть вы вольны в использовании любых переменных, математических операций, функций и всего того, что можно использовать в выражениях.
-> asdf
 
 ### Объекты
 
@@ -136,6 +137,7 @@ arr.third  = 15;
 однако в последнем случае вы не можете использовать выражения в качестве ключей.
 
 > Сделайте добавление нескольких элементов массива императивно, занося в массив значения, полученные с помощью `prompt`
+
 > Сделайте добавление нескольких элементов массива императивно с помощью **синтаксически одинакового кода** для каждого элемента.
 
 

+ 281 - 0
03StructuresAndEvaluationsLoopsHomeWork.md

@@ -0,0 +1,281 @@
+# ДЗ: Вложенные декларативные структуры и код в них. Отображение циклических и древовидных структур. Циклы.
+
+## html tree
+
+```html
+    <body>
+        <div>
+            <span>Enter a data please:</span><br/>
+            <input type='text' id='name'>
+            <input type='text' id='surname'>
+        </div>
+        <div>
+            <button id='ok'>OK</button>
+            <button id='cancel'>Cancel</button>
+        </div>
+    </body>
+```
+
+Сделайте декларативную JSON-структуру для тэгов выше, в которой:
+- каждый тэг будет объектом
+- имя тэга будет полем `tagName`
+- вложенные тэги будут в поле `subTags`
+- текст в тэге будет в поле `text`
+- набор аттрибутов тэга будет в поле `attrs`.
+
+Например для обычной таблицы 2x2 это будет выглядеть следующим образом:
+```html
+<table border='1'>
+    <tr>
+        <td>
+            1x1
+        </td>
+        <td>
+            1x2
+        </td>
+    </tr>
+    <tr>
+        <td>
+            2x1
+        </td>
+        <td>
+            2x2
+        </td>
+    </tr>
+</table>
+```
+```javascript
+var table = {
+    tagName: 'table',
+    attrs: {
+        border: "1",
+    }
+    subTags: [
+        {
+            tagName: 'tr',
+            subTags: [
+                {
+                    tagName: "td",
+                    text: "1x1",
+                },
+                {
+                    tagName: "td",
+                    text: "1x2",
+                },
+            ]
+        },
+        {
+            tagName: 'tr',
+            subTags: [
+                {
+                    tagName: "td",
+                    text: "2x1",
+                },
+                {
+                    tagName: "td",
+                    text: "2x2",
+                },
+            ]
+        }
+    ]
+}
+```
+
+Выведите значения текста во второй кнопке, используя `.` и `[]`.
+Выведите значение атрибута `id` во втором `input`, используя `.` и `[]`.
+
+## declarative fields
+
+Как известно, элемент массива и объекта может быть любого типа данных **JS**, т. е. в коде может быть любое выражение, которое вычисляется в то или иное значение типа данных. А значит, мы можем применять функции для ввода данных типа `confirm` или `prompt`:
+
+```javascript
+var text = "Enter a number";
+var arr3 = [+prompt(text), +prompt(text), +prompt(text)]; //вводим числа.
+```
+
+Организуйте таким способом заполнение полей в объектах:
+
+```javascript
+var notebook = {
+    brand: "HP",
+    type:  "440 G4",
+    model: "Y7Z75EA",
+    ram: 4,
+    size: "14",
+    weight: 1.8,
+    resolution: {
+        width: 1920,
+        height: 1080,
+    },
+};
+
+var phone = {
+    brand: "meizu",
+    model: "m2",
+    ram: 2,
+    color: "black",
+};
+
+var person = {
+    name: "Donald",
+    surname: "Trump",
+    married: true,
+}
+```
+Например:
+
+```javascript
+var person = {
+    name: prompt("Enter a name"),
+    surname: prompt("Enter a surname"),
+}
+```
+Используйте приведение к числу, `prompt` и `confirm` в зависимости от типов данных.
+
+## imperative array fill 3
+
+Создайте пустой массив и добавьте в него три элемента, введенные пользователем (`prompt`), используя императивный подход (несколько операторов подряд)
+
+## while confirm
+
+Сделайте цикл с `confirm`, который продолжается по **Отмена** и заканчивается по **ОК**.
+
+## array fill
+
+Создайте пустой массив и добавляйте в него элементы, пока пользователь не нажмет `Отмена` в очередном `prompt`. Используйте `push` для удобства: [push](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/push)
+
+## array fill nopush
+
+Сделайте предыдущее задание, не используя `push`, а обращаясь к элементам по индексу.
+
+## infinite probability
+
+Создайте бесконечный цикл, который прерывается с помощью конструкции `break`, когда Math.random() > 0.9. Код должен подсчитывать количество итераций и вывести это число с помощью `alert`.
+
+## empty loop
+
+Сделайте цикл с `prompt`, который прерывается по нажатию **OK** и продолжается по нажатию **Отмена** **c пустым телом цикла**.
+
+## progression sum
+Подсчитать сумму арифметической прогрессии от 1 до N c шагом 3 (1,4,7....) используя цикл `for`.
+
+## chess one line
+Сформировать строку `" # # # # # "` с помощью цикла `for`. Длина строки может быть четной и нечетной, и указывается в одном месте в коде.
+
+## numbers 
+Сформировать строку c помощью вложенных циклов. Для перевода строки используйте **\n**.
+<pre>
+0123456789
+0123456789
+0123456789
+0123456789
+0123456789
+0123456789
+0123456789
+0123456789
+0123456789
+0123456789
+</pre>
+
+## chess
+Сформируйте строку с шахматной доской из вложенных циклов. Для перевода строки используйте `\n`. Код должен поддерживать легкое изменение размеров
+доски.
+<pre>
+.#.#.#.#.#.#
+#.#.#.#.#.#.
+.#.#.#.#.#.#
+#.#.#.#.#.#.
+.#.#.#.#.#.#
+#.#.#.#.#.#.
+.#.#.#.#.#.#
+#.#.#.#.#.#.
+.#.#.#.#.#.#
+#.#.#.#.#.#.
+</pre>
+
+## cubes
+Сформируйте массив из N элементов, содержащий в себе кубы индексов, т. е:
+```javascript
+[0,1,8,27,64...]
+```
+
+## multiply table
+C помощью вложенного цикла сформируйте массив массивов "таблица умножения". Для инициализации вложенных массивов используйте
+```javascript
+arr[i] = [] //в i-тый элемент массива заносится новый пустой массив
+```
+`arr[5][6]` должен быть равен, соответственно, 30, `arr[7][2]` == 14 и так далее.
+
+## matrix to html table
+Сделайте вложенный цикл, который формирует HTML-таблицу в переменной строкового типа из любого двумерного массива. Т. е. если в нём использовать результат работы 
+предыдущего задания, то получится таблица умножения в HTML.
+
+## jQ person
+
+Создайте форму с полями "Фамилия", "Имя", "Возраст" и кнопкой "Сохранить". Используя jQuery при нажатии на кнопку создайте объект с этими полями. Используйте jQuery `click` и `val`.
+
+## jQ collect
+
+Задайте массив с селекторами, например такой:
+
+```javascript
+var selectors = ["#surname", "#name", "#age", "select#sex"];
+```
+
+В цикле прочтите значения всех полей ввода из селекторов и сохраните в объект с ключами-селекторами из массива. То есть для примера выше:
+```javascript
+{
+    "#surname": "<текст, который ввел пользователь в поле ввода с id=surname>",
+    "#name": "<текст, который ввел пользователь в поле ввода с id=name>",
+    "#age": "<текст, который ввел пользователь в поле ввода с id=age>",
+    "select#sex": "<текст, который ввел пользователь в поле ввода <select id=sex>",
+}
+```
+
+## **Задание на синий пояс**: Треугольник
+
+Сформировать следующую строку - треугольник:
+<pre>
+.....#.....
+....###....
+...#####...
+..#######..
+.#########.
+###########
+</pre>
+
+## **Задание на черный пояс**: Электронная гадалка
+
+Пользователь вводит 0 или 1. Гадалка пытается угадать, что введет пользователь (естественно **перед** его вводом), но не показывает пользователю,
+что бы пользователь не выбрал противоположный вариант, а выводит предполагаемый вариант в консоль, скрытую от пользователя.
+
+### Как это работает?
+
+Гадалка хранит историю ввода (4 последних числа) пользователя в массиве history. Каждое следующее число добавляется с помощью `push` в конец массива,
+при этом первое число из массива (самое старое) удаляется с помощью `shift`.
+
+Гадалка запоминает что пользователь ввёл в предыдущий раз после такой истории. То есть, если пользователь вводил 0,1,0,1,0, то логично предположить,
+что с историей 0,1,0,1 следующим вариантом будет 0. Для хранения используется 4х мерный массив, индексами которого является история:
+
+predictArray[history[0]][history[1]][history[2]][history[3]] равно тому, что пользователь ввёл после истории в предыдущий раз.
+
+### Алгоритм:
+
+Изначально predictArray содержит, например, -1, или иные значения, которые отличаются от пользовательского ввода. История пусть состоит из единиц:
+`history = [1,1,1,1];`, Т. е. считается что пользователь нажимал 1 четыре ряда подряд. Пока мы не можем предсказать, так как в массиве еще не сохранилось
+то, что вводил пользователь, мы используем Math.random в качестве предсказания, и записываем ввод пользователя в массив predictArray, добавляя новые значения в history, и 
+сдвигая его. Т. е. если пользователь ввел 0, то:
+```javascript
+predictArray[1,1,1,1] = 0; //1,1,1,1 - история, 0 - новое значение
+history = [1,1,1,0]        //удаляем старую единицу из истории и добавляем введенный только что 0
+```
+
+Для предсказания следующего достаем значение массива predictArray[1,1,1,0], а после ввода опять записываем туда то, что ввёл пользователь (пусть 1):
+
+```javascript
+predictArray[1,1,1,0] = 1; //1,1,1,0 - история, 1 - новое значение
+history = [1,1,0,1]        //удаляем старую единицу из истории и добавляем введенный только что 1
+```
+
+Таким образом в predictArray накапливаются знания о том, что вводит пользователь после определенной истории чисел.
+

+ 13 - 3
README.md

@@ -13,6 +13,16 @@
     - не, и, или, и как они работают
     - Разделяй и властвуй
     - Пунктуация в коде (отступы и феншуй)
-4. Вложенные декларативные структуры и код в них. Отображение циклических и древовидных структур. Циклы.
-
-
+4. Вложенные декларативные структуры и код в них.  Отображение циклических и древовидных структур. Циклы.
+5. Ассоциативные массивы, `in`, `JSON`, ООП, jQ
+6. Функции1, ООП, jQ
+7. Функции2, jQ
+8. Модуль
+9. DOM.
+10. ООП + DOM + Canvas
+11. ООП, замыкания
+12. ООП прототипное
+13. jQ
+14. jQ plugins
+15. jQ plugin Dev
+16. Модуль.