Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Решить с помощью цикла FOR... (https://javascript.ru/forum/misc/24630-reshit-s-pomoshhyu-cikla.html)

Mike_Kharkov 08.01.2012 11:20

Решить с помощью цикла FOR...
 
Здравствуйте!
Я очень поверхностно знаком с Javascript и недавно решил повторить для себя уроки Попова по этой теме.
Задание в его уроке следующее:
Вам надо спросить сначала, сколько человеку лет, затем - какой сейчас год.
После этого нужно создать цикл и вывести на экран список,
сколько человеку было лет год назад, 2 года назад и т.д.

Например, человек ввел что ему 30 лет, и сейчас 2010 год.
Вам в итоге надо вывести наэкран
В 2009 году Вам было 29 лет
В 2008 году Вам было 28 лет
и т.д.
*/

// решение:

var age = window.prompt("Сколько вам лет?");
var year = window.prompt("Какой сейчас год?");

while(age > 0){
document.write("В "+ year + " году Вам было лет: " + age + "<br/>");
age--;
year--;
}
P.S. Вышеописанное решение было взято из его урока - но хотелось осуществить это с помощью цикла FOR и у меня вышло следующее:

var age = window.prompt("Сколько вам лет?");
var year = window.prompt("Какой сейчас год?");
for ( age>=0;age-- ; year--)
{
document.write(" В" + year + " году Вам было " + age + " лет" + "<br/>");
}

В результате применения именно этого варианта получается, что возраст возвращается на экран на 1-ну единицу меньще от той которую я ввожу изначально...(хотя с годом все в порядке..)
вопрос:
В чем моя ошибка и как это осуществить с помощью цикла FOR?
P.S. Я новичёк на форуме по этому извиняюсь если создал свою тему не по адресу...
Заранее Всем благодарен за ответ!

nerv_ 08.01.2012 11:25

Цитата:

Сообщение от Mike_Kharkov
В чем моя ошибка и как это осуществить с помощью цикла FOR?

Для форматирования кода на форуме существуют специальные теги. Циклы while, for.

Mike_Kharkov 08.01.2012 11:38

На приведенной вами ссылке я не заметил аналогичной ситуации...
P.S. Не подскажите как именно форматируется код?

Saqsess 08.01.2012 12:16

В первом алгоритме age-- и year-- выполняются после document.write().
Во втором алгоритме в начале выполняется age--, потом document.write() и в конце уже year--. По приведенной выше ссылке это написано.
Работающее решение:
for ( i = 0; age !== i ; year--, age--)

nerv_ 08.01.2012 12:25

Цитата:

Сообщение от Mike_Kharkov
На приведенной вами ссылке я не заметил аналогичной ситуации...

Очень даже может быть. Потому, что там основы, усвоив которые, подобные вопросы перестанут возникать :)

Mike_Kharkov 08.01.2012 13:05

Большое спасибо за подсказку!
Правда я не совсем понял что означаем символ "!" ?
В гугле найти не удалось... :)
P.S. Но все равно спасибо...

Saqsess 08.01.2012 13:13

«Не равно». В школе он пишется как ≠

nerv_ 08.01.2012 13:19

Mike_Kharkov, специально для вас сидел набирал:
<html>
    <head>
        <meta charset="utf-8">
		<script type="text/javascript">
			var x = prompt('Сколько вам лет?', 0); // Запрос пользователю.
			// Если ввод отменен, то prompt возвращает null. Иначе то, что ввел пользователь в строковом представлении (строку).
			// Т.е., если пользователь ввел, к примеру,	"1", то эта единица будет строкой (не числом).
			
			// isNaN - глобальный метод. Пытается преобразовать переданный параметр в число.
			// Если параметр не может быть преобразован, возвращает true, иначе возвращает false.
			
			// ! - Логическое НЕ (!).
			// Оператор инвертирует значение своего (одиночного) операнда.

			// Логика.
			// isNaN пытается преобразовать то, что мы получили от пользователя в число.
			// Если ему это удается, он возвращает False, но поскольку инструкция if() выполняется только в том случае,
			// когда выражение истинно (или может быть преобразовано к истине),
			// обращаем False в True с помощью логического оператора НЕ (!).
			
			if(!isNaN(x)) {
				
				// new Date() - Создание объекта, в котором хранятся текущие дата и время.
				// С помощью метода getFullYear() объекта Date, получаем полное представление текущего года.
				var z = new Date().getFullYear();
				
				// Важно: в данный момент в переменной x содержится строка, а не число.
				// Но поскольку javascript автоматически преобразовывает к нужному типу данныx в зависимости от контекста,
				// то на первой итерации (проходе) цикла, оно будет преобразовано в число, и дальнейшие операции
				// уже будут выполняться с ним, как с числом.
				
				/* Цитата из Фленегана: 
					если значение одного типа используется в контексте, требующем значение некоего другого типа,
					интерпретатор JavaScript автоматически пытается преобразовать это значение.
				*/
				
				// Инструкция for/Цикл for. Ее шаблон выглядит примерно так:
				//	for (инициализация; проверка; шаг) {
				//	 ... тело цикла ...
				//	}
				
				// В строке ниже инициализация пропущена, поскольку значение нужной нам переменной (x) было присвоено раньше.
				for(; x > 0; x--, z--) {
					document.write(z + " - " + x + "<br>");
				}
				
				// Заметка. Если тело цикла состоит из одной строки, то можно обойтись без фигурных скобок, т.е. записать, например, так:
				// for(; x > 0; x--, z--) document.write(z + " - " + x + "<br>");
			}
		</script>
    </head>
    <body>
    </body>
</html>

// без комментариев скрипт выглядит так:
var x = prompt('Сколько вам лет?', 0);
if(!isNaN(x)) {
	var z = new Date().getFullYear();
	for(; x > 0; x--, z--) {
		document.write(z + " - " + x + "<br>");
	}
}

p.s.: если где ошибся, надеюсь, меня поправят.

Mike_Kharkov 08.01.2012 13:33

Большое спасибо Вам за потраченное время!
Даже не знаю как вас и отблагодарить...
P.S. Постараюсь разобраться в том что вы написали!:)

nerv_ 08.01.2012 13:35

Цитата:

Сообщение от Mike_Kharkov
Правда я не совсем понял что означаем символ "!" ?

Смотря в каком контексте он используется. В том, о, кот. шла речь "не идентично".

// проверяем соответствие число - строка (равны, но не идентичны)
if(1 != "1") alert("не равно"); // false
if(1 !== "1") alert("не идентично"); // true


Часовой пояс GMT +3, время: 08:19.