Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.10.2015, 12:38
Интересующийся
Отправить личное сообщение для batcave Посмотреть профиль Найти все сообщения от batcave
 
Регистрация: 19.10.2015
Сообщений: 14

Вопрос по циклам
Здравствуйте. Задание было таким:
"Запросите количество строк и выведите соответствующий треугольник
$
$$
$$$
$$$$
$$$$$"
Решение оказалось таким:
var rows = +prompt('Введите количество строк', 5);
   for(var i = 1; i <= rows; i++){
      for(var n = 0; n < i; n++){ 
         document.write('$');
      }
   document.write('</br>');
   }

Собственно, в чем загвоздка. На каждой строке выводится +1 символ '$'. Т.е. на каждой новой строке document.write повторяется на 1 больше раз. Ок. Но почему-то тогда </br> из внешнего цикла повторяется только 1 раз на каждой итерации? Конструкция циклов фактически одинаковая, но почему во внешнем цикле переменная i отвечает за количество строк, а не за вывод document.write, в то время как во внутреннем цикле переменная n отвечает как раз таки за количество повторений document.write за одну итерацию?

Последний раз редактировалось batcave, 19.10.2015 в 12:40.
Ответить с цитированием
  #2 (permalink)  
Старый 19.10.2015, 14:07
Аватар для EmperioAf
Профессор
Отправить личное сообщение для EmperioAf Посмотреть профиль Найти все сообщения от EmperioAf
 
Регистрация: 15.01.2015
Сообщений: 622

Сообщение от batcave
Т.е. на каждой новой строке document.write повторяется на 1 больше раз. Ок. Но почему-то тогда </br> из внешнего цикла повторяется только 1 раз на каждой итерации? Конструкция циклов фактически одинаковая, но почему во внешнем цикле переменная i отвечает за количество строк, а не за вывод document.write, в то время как во внутреннем цикле переменная n отвечает как раз таки за количество повторений document.write за одну итерацию?
а вам не всё равно, если этот код работает и он практически оптимален?
Попробуйте написать этот код на бумаге и попробуйте "прочитать" и осознать что делает каждая часть кода. И когда вы поймёте как он работает, попробуйте решить похожую задачу (чтобы треугольник был по другую сторону от диагонали)
Ответить с цитированием
  #3 (permalink)  
Старый 19.10.2015, 16:12
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

Сообщение от EmperioAf
он практически оптимален
Неа...
Одним циклом все делается...

batcave, это букварская задачка. Предполагается, что даже новичок ее сможет сделать, прочитав учебник по JS...
Но ты даже по готовому примеру так и не понял как все это работает.
Ответить с цитированием
  #4 (permalink)  
Старый 19.10.2015, 16:21
Аватар для EmperioAf
Профессор
Отправить личное сообщение для EmperioAf Посмотреть профиль Найти все сообщения от EmperioAf
 
Регистрация: 15.01.2015
Сообщений: 622

Сообщение от ksa
Неа...
ну вообще то первое что приходит на ум, это пройти двумя циклами от 0 до n и поставить условие if (i>=j).
Т.ч. то, что предлагается это не худший вариант
Ответить с цитированием
  #5 (permalink)  
Старый 19.10.2015, 16:23
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,215

Сообщение от EmperioAf
первое что приходит на ум
Просто приклеивать символ в цикле приходит только после 100г?

<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251' />
<!--
<script src='http://code.jquery.com/jquery-latest.js'></script>
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
var rows = +prompt('Введите количество строк', 5);
var str='';
for(var i = 1; i <= rows; i++){
	str+='$'
	document.write(str+'</br>');
}
</script>
</head>
<body>
</body>
</html>

Сообщение от EmperioAf
то, что предлагается это не худший вариант
Дык я с этим не спорю...

Последний раз редактировалось ksa, 19.10.2015 в 16:28.
Ответить с цитированием
  #6 (permalink)  
Старый 19.10.2015, 16:31
Интересующийся
Отправить личное сообщение для batcave Посмотреть профиль Найти все сообщения от batcave
 
Регистрация: 19.10.2015
Сообщений: 14

Если не затруднит, подскажите что дальше.
1) Пользователь вводит значение в prompt, например 3.
2) Начинает работу внешний цикл. i=1. 1 < 3. Условие верно, выполняем тело.
3) В теле внутренний цикл. В нем n=0. 0<1. Условие верно. Выполняем тело.
4) Выполняет document.write('$'). На странице выводится символ $.
5) Выполняется шаг n++. n = 1.
6) Внутренняя итерация завершена. Теперь происходит внешняя. Document.write добавляет на страницу </br>, делая тем самым переход на новую строку.
7) Выполняется шаг. i = 2.

Полный цикл завершен. Теперь начинается второй:
8) Проверяем условие. i = 2. 2 < 3. Условие верно. Переходим к внутренней функции.
9) n = 1. 1 < 2. верно. выполним тело.
10) document.write срабатывает дважды. Почему? Почему он просто не повторит его один раз, как делает внешний цикл с <br>? он считает 0 и 1 как "сработай на этой строке 2 раза"?
Ответить с цитированием
  #7 (permalink)  
Старый 19.10.2015, 17:38
Аватар для EmperioAf
Профессор
Отправить личное сообщение для EmperioAf Посмотреть профиль Найти все сообщения от EmperioAf
 
Регистрация: 15.01.2015
Сообщений: 622

Сообщение от batcave
10) document.write срабатывает дважды. Почему? Почему он просто не повторит его один раз, как делает внешний цикл с <br>? он считает 0 и 1 как "сработай на этой строке 2 раза"?
серьёзно?
попробуйте перечитать:
https://learn.javascript.ru/while-for#цикл-for
Ответить с цитированием
  #8 (permalink)  
Старый 19.10.2015, 23:50
Интересующийся
Отправить личное сообщение для batcave Посмотреть профиль Найти все сообщения от batcave
 
Регистрация: 19.10.2015
Сообщений: 14

Окей, я понял, что внутренний цикл повторяется i количество раз. Но почему это происходит - нет. И по ссылке там нет никакого подобия объяснения. Можно провести аналогию с электронными часами. Часы слева увеличиваются на 1 после того, как минуты справа увеличатся на 60. Вопрос теперь приобретает другую форму - почему внутренний цикл повторяется i количество раз?
----------
Значение n не имеет отношения к количеству символов. Это просто проверка условия. А вот i - это количество повторения внутреннего цикла. Ура. Похоже это оно.
----------
ААААА. Кажется понял. Во внутреннем цикле на каждой новой строке n обнуляется, а i увеличивается, оттого то все так и работает.

Последний раз редактировалось batcave, 20.10.2015 в 01:24.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопрос по toDataURL() GodZiLA Общие вопросы Javascript 0 03.06.2014 17:21
Всплытие событий или что то не так... Кирюха =) jQuery 6 30.03.2013 12:56
Вопрос по циклам a1exei Общие вопросы Javascript 4 22.03.2012 22:02
вопрос про возможности JS для рисования и анимации macdack Библиотеки/Тулкиты/Фреймворки 3 15.07.2011 00:13
Теоретический вопрос. gods33 (X)HTML/CSS 10 16.12.2010 23:49