hw03_loops.js 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587
  1. let taskList = (`
  2. 1 html tree
  3. 2 declarative fields
  4. 3 object links
  5. 4 imperative array fill 3
  6. 5 while confirm (confirm наоборот)
  7. 6 array fill
  8. 7 array fill nopush
  9. 8 infinite probability (бесконечный rundom)
  10. 9 empty loop (prompt наоборот)
  11. 10 progression sum
  12. 11 chess one line (Шахматы в линию)
  13. 12 numbers (Башня из цифр 0123456789)
  14. 13 chess (Шахматная доска)
  15. 14 cubes (Возведение в степень)
  16. 15 multiply table (табл умножения)
  17. 16 matrix to html table
  18. 17 Задание на синий пояс: Треугольник
  19. 18 Задание на черный пояс: Электронная гадалка
  20. `)
  21. function hw03_loops() {
  22. var task = +(prompt("Что? Новый хозяин! надо??? Введите номер задания:\n" + taskList, "Напечь за меня пирогов!").toLowerCase());
  23. switch (task) {
  24. case 1: {
  25. // <body>
  26. // <div>
  27. // <span>Enter a data please:</span><br />
  28. // <input type='text' id='name'>
  29. // <input type='text' id='surname'>
  30. // </div>
  31. // <div>
  32. // <button id='ok'>OK</button>
  33. // <button id='cancel'>Cancel</button>
  34. // </div>
  35. // </body>
  36. // Сделайте декларативную JSON-структуру для тэгов выше, в которой:;
  37. let tree = {
  38. tagName: "body",
  39. attrs: {},
  40. subTags: [
  41. {
  42. tagName: "div",
  43. attrs: {},
  44. subTags: [
  45. {
  46. tagName: "span",
  47. attrs: {},
  48. subTags: [],
  49. text: "Enter a data please:",
  50. },
  51. {
  52. tagName: "br/",
  53. attrs: {},
  54. subTags: [],
  55. text: "",
  56. },
  57. {
  58. tagName: "input",
  59. attrs:
  60. {
  61. "type": "text",
  62. "id": "name",
  63. },
  64. subTags: [],
  65. text: "",
  66. },
  67. {
  68. tagName: "input",
  69. attrs:
  70. {
  71. "type": "text",
  72. "id": "surname",
  73. },
  74. subTags: [],
  75. text: "",
  76. },
  77. ],
  78. text: "",
  79. },
  80. {
  81. tagName: "div",
  82. attrs: {},
  83. subTags: [
  84. {
  85. tagName: "button",
  86. attrs:
  87. {
  88. "id": "ok",
  89. },
  90. subTags: [],
  91. text: "OK",
  92. },
  93. {
  94. tagName: "button",
  95. attrs:
  96. {
  97. "id": "cansel"
  98. },
  99. subTags: [],
  100. text: "Cansel",
  101. }
  102. ],
  103. text: "",
  104. },
  105. ],
  106. text: "",
  107. };
  108. console.log(tree);
  109. // Выведите значения текста во второй кнопке, используя.и[].
  110. console.log(tree.subTags[1].subTags[1].text);
  111. // Выведите значение атрибута id во втором input, используя.и[].
  112. console.log(tree.subTags[0].subTags[3].attrs.id)
  113. };
  114. break;
  115. case 2: {
  116. // Как известно, элемент массива и объекта может быть любого типа данных JS, т.е.в коде может быть любое выражение, которое вычисляется в то или иное значение типа данных.А значит, мы можем применять функции для ввода данных типа confirm или prompt:
  117. // var text = "Enter a number";
  118. // var arr3 = [+prompt(text), +prompt(text), +prompt(text)]; //вводим числа.
  119. // Организуйте таким способом заполнение полей в объектах:
  120. let notebook = {
  121. brand: prompt("Введите бренд:", "HP"),
  122. type: prompt("Введите тип:", "440 G4"),
  123. model: prompt("Введите модель:", "Y7Z75EA"),
  124. ram: +prompt("Введите объем ОЗУ:", "4"),
  125. size: prompt("Введите диагональ:", "14"),
  126. weight: +prompt("Вес:", "1.8"),
  127. resolution: {
  128. width: +prompt("Разрешение по горизонтали:", "1920"),
  129. height: +prompt("Разрешение по вертикали:", "1080"),
  130. },
  131. };
  132. let phone = {
  133. brand: prompt("Введите бренд", "meizu"),
  134. model: prompt("Введите модель", "m2"),
  135. ram: +prompt("Введите объем ОЗУ", 2),
  136. color: prompt("Введите цвет", "black"),
  137. };
  138. let person = {
  139. name: prompt("Введите имя", "Donald"),
  140. surname: prompt("Введите фамилию", "Trump"),
  141. married: confirm("Вы женаты?"),
  142. }
  143. };
  144. break;
  145. case 3: {
  146. // Добавьте персоне гаджеты, используя новые поля smartphone и laptop в объекте персоны
  147. // Добавьте владельца в гаджеты, используя новое поле owner в объектах телефона и ноутбука.
  148. // обратите внимание на цикличность ссылок в объектах, если вы все сделали правильно, то
  149. // person.smartphone.owner.laptop.owner.smartphone == person.smartphone
  150. let person = {
  151. name: prompt("Введите имя", "Donald"),
  152. surname: prompt("Введите фамилию", "Trump"),
  153. married: confirm("Вы женаты?"),
  154. }
  155. if (confirm("Ноутбук есть?")) {
  156. person["laptop"] = {
  157. owner: person,
  158. brand: prompt("Введите бренд:", "HP"),
  159. type: prompt("Введите тип:", "440 G4"),
  160. model: prompt("Введите модель:", "Y7Z75EA"),
  161. ram: +prompt("Введите объем ОЗУ:", "4"),
  162. size: prompt("Введите диагональ:", "14"),
  163. weight: +prompt("Вес:", "1.8"),
  164. resolution: {
  165. width: +prompt("Разрешение по горизонтали:", "1920"),
  166. height: +prompt("Разрешение по вертикали:", "1080"),
  167. }
  168. }
  169. }
  170. if (confirm("Смартфон есть?")) {
  171. person["smartphone"] = {
  172. owner: person,
  173. brand: prompt("Введите бренд", "meizu"),
  174. model: prompt("Введите модель", "m2"),
  175. ram: +prompt("Введите объем ОЗУ", 2),
  176. color: prompt("Введите цвет", "black"),
  177. };
  178. }
  179. alert(`person.smartphone.owner.laptop.owner.smartphone == person.smartphone\n${person.smartphone.owner.laptop.owner.smartphone == person.smartphone}`)
  180. };
  181. break;
  182. case 4: {
  183. // Создайте пустой массив и добавьте в него три элемента, введенные пользователем(prompt),
  184. // используя императивный подход(несколько операторов подряд)
  185. let myArr = [];
  186. for (let i = 0; i < 3; i++) { myArr[i] = prompt(`Введите значение ${i}-го элемента массива:`) };
  187. alert(myArr);
  188. };
  189. break;
  190. case 5: {
  191. // Сделайте цикл с confirm, который продолжается по Отмена и заканчивается по ОК.
  192. while (!confirm("Еще разок?"));
  193. };
  194. break;
  195. case 6: {
  196. // Создайте пустой массив и добавляйте в него элементы, пока пользователь не нажмет Отмена в очередном prompt.
  197. // Используйте push для удобства: push
  198. let myArr = [];
  199. do {
  200. myArr.push(prompt(`Введите значение ${myArr.length}-го элемента массива:`));
  201. } while (myArr[myArr.length - 1] !== null);
  202. // myArr.length = myArr.length - 1; // тоже работает
  203. myArr.pop();
  204. alert(myArr);
  205. console.log(myArr);
  206. };
  207. break;
  208. case 7: {
  209. // Сделайте предыдущее задание, не используя push, а обращаясь к элементам по индексу.
  210. let myArr = [];
  211. do {
  212. myArr[myArr.length] = prompt(`Введите значение ${myArr.length}-го элемента массива:`);
  213. } while (myArr[myArr.length - 1] !== null);
  214. myArr.length = myArr.length - 1;
  215. // myArr.pop(); // тоже работает
  216. alert(myArr);
  217. console.log(myArr);
  218. };
  219. break;
  220. case 8: {
  221. // Создайте бесконечный цикл, который прерывается с помощью конструкции break, когда Math.random() > 0.9.
  222. // Код должен подсчитывать количество итераций и вывести это число с помощью alert.
  223. let i = k = 0;
  224. do {
  225. // debugger;
  226. k = Math.random();
  227. if (k > 0.9) break;
  228. i++;
  229. } while (true);
  230. alert(`Последнее число: ${k}\nЧисло итераций: ${i} +1 последняя`);
  231. };
  232. break;
  233. case 9: {
  234. // Сделайте цикл с prompt, который прерывается по нажатию OK и
  235. // продолжается по нажатию "Отмена" c пустым телом цикла.
  236. let a;
  237. while ((a = prompt("OK - выйдет из цикла\nCancel - продолжит цикл")) === null) { };
  238. };
  239. break;
  240. case 10: {
  241. // Подсчитать сумму арифметической прогрессии от 1 до N c шагом 3(1, 4, 7....) используя цикл for.
  242. let maxNumber = (+prompt("До какого числа подсчитывать арифметическую прогрессию?", 1)) + 1;
  243. let mySum = 0;
  244. let sequence = "";
  245. for (let i = 1; i < maxNumber; (i += 3)) {
  246. mySum = mySum + i;
  247. sequence = sequence + ", " + i;
  248. };
  249. alert(`Max = ${maxNumber - 1}\n${sequence.slice(2, sequence.length)}\nСумма = ${mySum}`);
  250. };
  251. break;
  252. case 11: {
  253. // Сформировать строку " # # # # # " с помощью цикла for.
  254. // Длина строки может быть четной и нечетной, и указывается в одном месте в коде.
  255. let leng;
  256. let str = str1 = "";
  257. leng = +prompt("Какую длину строки формировать?", 10);
  258. for (let i = 0; i < leng; i += 2) { // это явно избыточно в 2 раза, но нам же не жалко ;)
  259. str = str + " #"; // врядли пользователь введет что-то более 1000 (2Mb оперативки)
  260. }
  261. str1 = str.slice(0, leng);
  262. alert(`"${str1}"`);
  263. };
  264. break;
  265. case 12: {
  266. // Сформировать строку c помощью вложенных циклов.Для перевода строки используйте \n.
  267. // 0123456789
  268. // 0123456789
  269. // 0123456789
  270. // 0123456789
  271. // 0123456789
  272. // 0123456789
  273. // 0123456789
  274. // 0123456789
  275. // 0123456789
  276. // 0123456789
  277. let str = str1 = "";
  278. let hi;
  279. hi = +prompt("Какой высоты строить башню?", 5);
  280. for (let i = 0; i < hi; i++) {
  281. for (j = 0; j < 10; j++) { str = str + j; };
  282. str = str + `\n`
  283. }
  284. str1 = str.slice(0, -1);
  285. alert(str1);
  286. };
  287. break;
  288. case 13: {
  289. // Сформируйте строку с шахматной доской из вложенных циклов.
  290. // Для перевода строки используйте \n.Код должен поддерживать легкое изменение размеров доски.
  291. // .#.#.#.#.#.#
  292. // #.#.#.#.#.#.
  293. // .#.#.#.#.#.#
  294. // #.#.#.#.#.#.
  295. // .#.#.#.#.#.#
  296. // #.#.#.#.#.#.
  297. // .#.#.#.#.#.#
  298. // #.#.#.#.#.#.
  299. // .#.#.#.#.#.#
  300. // #.#.#.#.#.#.
  301. // ---------------ТОЖЕ РАБОЧИЙ ВАРИАНТ
  302. // let x = y = 0;
  303. // let str = strtemp = "";
  304. // x = +prompt("Ширина доски?", 5);
  305. // y = +prompt("Высота доски?", 5);
  306. // for (i = 0; i < y; i = i + 2) {
  307. // strtemp = "";
  308. // for (k = 0; k < x; k = k + 2) { strtemp = strtemp + "_#"; };
  309. // str = str + strtemp.slice(0, x) + "\n";
  310. // strtemp = "";
  311. // for (k = 0; k < x; k = k + 2) { strtemp = strtemp + "#_"; };
  312. // str = str + strtemp.slice(0, x) + "\n";
  313. // }
  314. // strtemp = str.slice(0, (x * y + y - 1));
  315. // alert(`${x} x ${y}\n${strtemp}`);
  316. let x = y = 0;
  317. let str = str2 = "";
  318. x = +prompt("Ширина доски?", 5);
  319. y = +prompt("Высота доски?", 5);
  320. for (let i = 1; i < x + 2; i = i + 2) { str = str + "_#" };
  321. for (let i = 0; i < y; i++) { str2 = str2 + str.slice((i % 2), (x + (i % 2))) + "\n"; }
  322. str = str2.slice(0, -1);
  323. alert(`${x} x ${y}\n${str}`);
  324. };
  325. break;
  326. case 14: {
  327. // Сформируйте массив из N элементов, содержащий в себе кубы индексов, т.е:
  328. // [0, 1, 8, 27, 64...]
  329. let cubes = [];
  330. let namOfItem = +prompt("Сколько элементов создать?", 5);
  331. let pow = +prompt("В какую степень возводить?", 3);
  332. for (let i = 0; i <= namOfItem; i++) {
  333. cubes[i] = Math.pow(i, pow);
  334. }
  335. alert(cubes);
  336. };
  337. break;
  338. case 15: {
  339. // C помощью вложенного цикла сформируйте массив массивов "таблица умножения".Для инициализации вложенных массивов используйте
  340. // arr[i] = [] //в i-тый элемент массива заносится новый пустой массив
  341. // arr[5][6] должен быть равен, соответственно, 30, arr[7][2] == 14 и так далее.
  342. let n = m = 10;
  343. let str = "";
  344. let masMultip = [];
  345. for (var i = 1; i <= m; i++) {
  346. masMultip[i] = [];
  347. str = "";
  348. for (var j = 1; j <= n; j++) {
  349. masMultip[i][j] = i * j;
  350. if (masMultip[i][j] < 10) { str = str + "0" }
  351. str = str + masMultip[i][j] + " ";
  352. }
  353. str = "<div>" + str + "</div>";
  354. document.write(str);
  355. }
  356. };
  357. break;
  358. case 16: {
  359. // Сделайте вложенный цикл, который формирует HTML - таблицу
  360. // в переменной строкового типа из любого двумерного массива.
  361. // Т.е.если в нём использовать результат работы предыдущего задания,
  362. // то получится таблица умножения в HTML(Таблица Пифагора)
  363. // --------- Не верный вариант - этот код на лету формирует 2мерный масив и
  364. // --------- параллельно строит HTML таблицу
  365. // let n = m = 10;
  366. // let str1 = str = `<table border="1" align="center">`;
  367. // var masMultip = [];
  368. // for (var i = 1; i <= m; i++) {
  369. // masMultip[i] = [];
  370. // str1 = ``;
  371. // for (var j = 1; j <= n; j++) {
  372. // masMultip[i][j] = i * j;
  373. // str1 = str1 + `<td align="center">` + masMultip[i][j] + `</td>`;
  374. // }
  375. // str = str + `<tr>` + str1 + `</tr>`;
  376. // }
  377. // str = str + `</table>`
  378. // document.write(str);
  379. let xRow = yRow = 10;
  380. let masMultip = [];
  381. for (let i = 0; i <= xRow; i++) {
  382. masMultip[i] = [];
  383. for (let j = 0; j <= yRow; j++) {
  384. masMultip[i][j] = i * j;
  385. }
  386. }
  387. debugger
  388. let str = `<table border="1" align="center">`;
  389. for (let i = 0; i < masMultip.length; i++) {
  390. str += `<tr>`;
  391. for (let k = 0; k < masMultip[i].length; k++) {
  392. str += `<td align="center">` + masMultip[i][k] + `</td>`;
  393. }
  394. str += `</tr>`;
  395. };
  396. str = str + `</table>`;
  397. console.log(str);
  398. document.write(str);
  399. };
  400. break;
  401. case 17: {
  402. // Сформировать следующую строку - треугольник:
  403. // .....#.....
  404. // ....###....
  405. // ...#####...
  406. // ..#######..
  407. // ###########
  408. let hi;
  409. hi = +prompt("Задайте высоту пирамиды:", 6);
  410. let str = "";
  411. for (let i = 1; i <= hi; i++) {
  412. for (k = 1; k <= hi - i; k++) { str = str + "."; }
  413. for (k = 1; k <= ((i - 1) * 2 + 1); k++) { str = str + "#"; }
  414. for (k = 1; k <= hi - i; k++) { str = str + "."; }
  415. str = str + "\n"
  416. }
  417. console.log(str);
  418. alert(str);
  419. };
  420. break;
  421. case 18: {
  422. // Пользователь вводит 0 или 1.
  423. // Гадалка пытается угадать, что введет пользователь(естественно перед его вводом),
  424. // но не показывает пользователю, что бы пользователь не выбрал противоположный вариант,
  425. // а выводит предполагаемый вариант в консоль, скрытую от пользователя.
  426. let predictArray = [];
  427. let history = Array(4).fill(1);
  428. let userAnswer = myAnswer = countOfTry = guess = trueGuess = 0;
  429. let alertStr = "";
  430. let isMyRandom = false;
  431. // for (i = 0; i < 2; i++) {
  432. // predictArray[i] = [];
  433. // for (j = 0; j < 2; j++) {
  434. // predictArray[i][j] = [];
  435. // for (k = 0; k < 2; k++) {
  436. // predictArray[i][j][k] = [];
  437. // for (l = 0; l < 2; l++) {
  438. // predictArray[i][j][k][l] = (-1);
  439. // }
  440. // }
  441. // }
  442. // }
  443. //Вместо этих 4-х вложенных циклов можно одной строкой
  444. predictArray = Array.from(Array(2), () => Array.from(Array(2), () => Array.from(Array(2), () => Array.from(Array(2), () => -1))));
  445. // если надо развернуть в линию многомерный массив
  446. // predictArray.reduce(function (a, b) {
  447. // return a.concat(b);
  448. // }).reduce(function (a, b) {
  449. // return a.concat(b);
  450. // }).reduce(function (a, b) {
  451. // return a.concat(b);
  452. // })
  453. debugger;
  454. while (((userAnswer = +prompt(`Задумай число "0" или "1":`)) === 0) || userAnswer === 1) {
  455. countOfTry++;
  456. alertStr = "";
  457. myAnswer = predictArray[history[0]][history[1]][history[2]][history[3]];
  458. if (myAnswer === -1) {
  459. myAnswer = Math.round(Math.random());
  460. isMyRandom = true;
  461. } else {
  462. isMyRandom = false;
  463. }
  464. if (myAnswer === userAnswer) {
  465. guess++;
  466. alertStr = ` ${alertStr} ${Math.round(trueGuess / countOfTry * 10000) / 100}% ${Math.round(guess / countOfTry * 10000) / 100}%`;
  467. if (isMyRandom) {
  468. alertStr = alertStr + "\n...почти ";
  469. } else {
  470. trueGuess++;
  471. }
  472. alert(`Я вижу тебя насквозь!!! ${alertStr}`)
  473. } else alert("Обманщик ((...");
  474. predictArray[history[0]][history[1]][history[2]][history[3]] = userAnswer;
  475. history.shift();
  476. history.push(userAnswer);
  477. }
  478. };
  479. break;
  480. default: { alert("Такого мы еще не умеем...!!!") };
  481. }
  482. }