Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
 Аватар для Freeze_Breeze
278 / 272 / 106
Регистрация: 12.01.2016
Сообщений: 1,666

Создайте функцию, которая будет запрашивать ввод числового значения до тех пор, пока посетитель его не введёт.

06.06.2022, 12:05. Показов 1233. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Есть условие: Создайте функцию readNumber, которая будет запрашивать ввод числового значения до тех пор, пока посетитель его не введёт. Функция должна возвращать числовое значение. Также надо разрешить пользователю остановить процесс ввода, отправив пустую строку или нажав «Отмена». В этом случае функция должна вернуть null.
На сайте learn.js дают такое решение:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
function readNumber() {
  let num;
 
  do {
    num = prompt("Введите число", 0);
  } while ( !isFinite(num) );
 
  if (num === null || num === '') return null;
 
  return +num;
}
 
alert(`Число: ${readNumber()}`);
Моё решение такое:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
let numRead;
 
function readNumber() {
   while (!isFinite(numRead)) {
      numRead = +prompt();
      if (numRead == '' || numRead == null) return null;
      
   };
   return numRead;
};
 
console.log(readNumber());
Так вот в чём вопрос. Если какое то принципиальное различие между этими решениями?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.06.2022, 12:05
Ответы с готовыми решениями:

Запрашивать у пользователя числовые значения, до тех пор, пока не будет введено значение 0
Запрашивать у пользователя числовые значения, до тех пор, пока не будет введено значение 0. При этом определить сумму положительтных чисел.

Запрашивать ввод до тех пор, пока не будет введена заданная фраза, после чего вывести её 100 раз
Всем привет! Пожалуйста, помогите написать программу на Pascal, можно с циклом. Условие: пользователь спрашивает какую-нибудь фразу,...

При помощи функции InputBox запрашивать у пользователя слова до тех пор, пока он не введет точку
Написать программу, которая при помощи функции InputBox запрашивает у пользователя слова до тех пор, пока он не введет точку. Все введенные...

19
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3827 / 1664 / 429
Регистрация: 14.03.2022
Сообщений: 4,191
06.06.2022, 14:43
Цитата Сообщение от Freeze_Breeze Посмотреть сообщение
Если какое то принципиальное различие между этими решениями?
Твой вариант работает не "автономно"...
Помимо функции у тебя еще есть переменная.
0
 Аватар для Freeze_Breeze
278 / 272 / 106
Регистрация: 12.01.2016
Сообщений: 1,666
06.06.2022, 14:55  [ТС]
Цитата Сообщение от krvsa Посмотреть сообщение
Помимо функции у тебя еще есть переменная.
То есть, лучше когда функция сама создаёт локальную переменную, а не ищет её глобально?
А цикл do...while чем отличается их решение от моего, кроме того, что их реализация do...while гарантированно один раз выполнит num = prompt("Введите число", 0); (но в работе этого когда не заметно).
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3827 / 1664 / 429
Регистрация: 14.03.2022
Сообщений: 4,191
06.06.2022, 15:00
Цитата Сообщение от Freeze_Breeze Посмотреть сообщение
То есть, лучше когда функция сама создаёт локальную переменную, а не ищет её глобально?
Задача ведь стояла
Цитата Сообщение от Freeze_Breeze Посмотреть сообщение
Создайте функцию readNumber, которая будет запрашивать ввод числового значения до тех пор, пока посетитель его не введёт. Функция должна возвращать числовое значение.
И про какую-то еще переменную нет ни слова...

Добавлено через 4 минуты
Цитата Сообщение от Freeze_Breeze Посмотреть сообщение
А цикл
Применение цикла тут не особо "влияет"...
Чисто "идеологически" авторы явно показывают что "действие будет выполнено в любом случае". А зацикливание будет или нет - решит условие.

Твой вариант сразу "ставит условие", де может и не выполнится тело цикла... Нужно анализировать данные и смотреть условие...
Т.е. семантика у тебя так же "проигрывает".
1
Модератор
Эксперт HTML/CSS
 Аватар для AlexZaw
2379 / 1739 / 677
Регистрация: 07.08.2016
Сообщений: 4,093
06.06.2022, 15:04
Цитата Сообщение от krvsa Посмотреть сообщение
Твой вариант работает не "автономно"
Freeze_Breeze, более того он одноразовый, так как после первого завершения в переменной numRead будет храниться число и условие в while всегда будет возвращать false.
Ну и плюс при вводе 0 ваша функция возвращает null так как
JavaScript
1
0=='' // true
1
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3827 / 1664 / 429
Регистрация: 14.03.2022
Сообщений: 4,191
06.06.2022, 15:10
Цитата Сообщение от Freeze_Breeze Посмотреть сообщение
То есть, лучше когда функция сама создаёт локальную переменную, а не ищет её глобально?
При "модульном" программировании первый вариант будет работать как нужно, а твой "раз, через раз"...

Вот пример
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<!--
<script src="https://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
-->
<style>
</style>
<script>
document.addEventListener('DOMContentLoaded', _ => {
})
</script>
</head>
<body>
<script type='module'>
import {readNumber} from './tmp.js'
 
alert(readNumber())
alert(readNumber())
</script>
</body>
</html>
tmp.js
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
let numRead;
 
function readNumber() {
   while (!isFinite(numRead)) {
      numRead = +prompt();
      if (numRead == '' || numRead == null) return null;
      
   };
   return numRead;
};
 
export {readNumber}
0
Модератор
Эксперт HTML/CSS
 Аватар для AlexZaw
2379 / 1739 / 677
Регистрация: 07.08.2016
Сообщений: 4,093
06.06.2022, 15:10
ну и до кучи условие numRead == null никогда не будет проверяться, так как prompt при нажатии отмены вернет null, а +prompt превратит его в 0
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3827 / 1664 / 429
Регистрация: 14.03.2022
Сообщений: 4,191
06.06.2022, 15:11
Цитата Сообщение от AlexZaw Посмотреть сообщение
более того он одноразовый
Опередил ты меня...
0
06.06.2022, 15:13

Не по теме:

Цитата Сообщение от krvsa Посмотреть сообщение
Опередил ты меня...
Бывает, сам часто так же попадаюсь :)

0
 Аватар для Freeze_Breeze
278 / 272 / 106
Регистрация: 12.01.2016
Сообщений: 1,666
06.06.2022, 15:27  [ТС]
Цитата Сообщение от AlexZaw Посмотреть сообщение
ну и до кучи условие numRead == null никогда не будет проверяться, так как prompt при нажатии отмены вернет null, а +prompt превратит его в 0
Цитата Сообщение от krvsa Посмотреть сообщение
И про какую-то еще переменную нет ни слова...
Неее, в топку всё. Вы что то слишком умное рассказываете. У меня сейчас эпилепсия случится. Я по этой книжке learn.javascript.ru дошёл только до типов данных, а Вы мне тут пытаетесь объяснить про "бесконечную кривую". И вообще, у меня мозгов как у хлебушка...
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3827 / 1664 / 429
Регистрация: 14.03.2022
Сообщений: 4,191
06.06.2022, 15:58
Цитата Сообщение от Freeze_Breeze Посмотреть сообщение
Вы что то слишком умное рассказываете.
Ты первый спросил... Мы хотели как лучше...
0
 Аватар для Freeze_Breeze
278 / 272 / 106
Регистрация: 12.01.2016
Сообщений: 1,666
06.06.2022, 17:47  [ТС]
Цитата Сообщение от krvsa Посмотреть сообщение
При "модульном" программировании первый вариант будет работать как нужно, а твой "раз, через раз"...
Почему раз, через раз?
Цитата Сообщение от krvsa Посмотреть сообщение
Твой вариант работает не "автономно"...
В каком плане не автономно?
Цитата Сообщение от krvsa Посмотреть сообщение
А зацикливание будет или нет - решит условие.
Я правильно понял? В моем варианте сначала проверяется условие while (!isFinite(numRead)), а уже потом мы вводим значение numRead = +prompt(); (то есть у нас появляется одно лишнее выполнение цикла), после выполняется блок if() и если в нём звёзды сошлись, то возвращаем numRead. А в варианте автора, сначала вводим значение, а потом уже идёт проверка...
Цитата Сообщение от AlexZaw Посмотреть сообщение
ну и до кучи условие numRead == null никогда не будет проверяться, так как prompt при нажатии отмены вернет null, а +prompt превратит его в 0
Я просто не знал, что можно return +num делать такие конструкции, я думал, если мы хотим из прообразовывать из строки в число, то лучше это делать сразу в +prompt().
krvsa, AlexZaw,
Подскажите, я правильно понимаю эту строку (если переводить её на человеческий язык)
while (!isFinite(numRead)) - Пока numRead НЕ является числом, то выполняем блок if(), как только numRead будет равно числу, то возвращаем return numRead;
Цитата Сообщение от AlexZaw Посмотреть сообщение
ну и до кучи условие numRead == null никогда не будет проверяться, так как prompt при нажатии отмены вернет null, а +prompt превратит его в 0
А вот проверку на ноль я не делал. Даже не допускал и мысли такой. Спасибо. А избавится от такого казуса нужно просто введённую строку приводить к числу уже при return +numRead;, а не во время того как мы вводим это самое число numRead = prompt(); (Суть я понял, но каша в голове и не могу нормально сформулировать, да и с определениями туговато).

Добавлено через 2 минуты
Цитата Сообщение от Freeze_Breeze Посмотреть сообщение
Почему раз, через раз?
Из модульного программирования я только знаю, что это независимые блоки которые составляют одну большую программу.
0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3827 / 1664 / 429
Регистрация: 14.03.2022
Сообщений: 4,191
06.06.2022, 18:50
Цитата Сообщение от Freeze_Breeze Посмотреть сообщение
Почему раз, через раз?
Цитата Сообщение от AlexZaw Посмотреть сообщение
после первого завершения в переменной numRead будет храниться число и условие в while всегда будет возвращать false

Цитата Сообщение от Freeze_Breeze Посмотреть сообщение
В каком плане не автономно?
Собственно функцией пользоваться не получится. Придется как-то еще менять ту переменную.
Цитата Сообщение от Freeze_Breeze Посмотреть сообщение
то есть у нас появляется одно лишнее выполнение цикла
Дело не в количестве итераций, а в самой семантике циклов. У цикла с пост условием она одна, а у цикла с пред условие она другая.

Но реализация их работы может быть какой угодно. Чисто фантазия автора.

Цитата Сообщение от Freeze_Breeze Посмотреть сообщение
while (!isFinite(numRead)) - Пока numRead НЕ является числом
Описания этого метода довольно интересные...
Возвращает false, если аргумент является NaN, положительной или отрицательной бесконечностью. Иначе возвращает true.
https://javascript.ru/isFinite
Глобальная isFinite() функция определяет, является ли переданное значение конечным числом. Если необходимо, параметр сначала преобразуется в число.
https://developer.mozilla.org/... s/isFinite
Метод Number.isFinite позволяет проверить, является ли переданное в аргументе число конечным. Конечным числом можно считать любое число, кроме бесконечности и NaN. В JavaScript бесконечность можно выразить только с помощью глобального Infinity или полей Number.POSITIVE_INFINITY и Number.NEGATIVE_INFINITY.

В JavaScript есть так же глобальная функция isFinite, которая работает аналогичным образом, но преобразует переданный аргумент в число.
https://basicweb.ru/javascript... finite.php

В нашем случае в промт вернет строку. Вот если эта строка "конечное число" у нас будет "истина".

Цитата Сообщение от Freeze_Breeze Посмотреть сообщение
Из модульного программирования я только знаю, что это независимые блоки которые составляют одну большую программу.
Значит будет еще к чему стремиться.
1
Модератор
Эксперт HTML/CSS
 Аватар для AlexZaw
2379 / 1739 / 677
Регистрация: 07.08.2016
Сообщений: 4,093
06.06.2022, 18:58
Цитата Сообщение от Freeze_Breeze Посмотреть сообщение
то есть у нас появляется одно лишнее выполнение цикла
Вернее будет сказать что в вашем варианте появляется одна лишняя проверка, а не выполнение цикла.
Пусть "a" это количество проверок, а "b" это количество выполнений цикла.
Тогда в первом случае:
выполняется тело
do { num = prompt("Введите число", 0); } приплюсовываем b (1)
выполняется проверка
while ( !isFinite(num) ); приплюсовываем а (1)
Если ввели число то isFinite(num) дает true, отрицание "!" дает false, завершаем цикл и идем дальше, итого a=1, b=1
Если ввели пустую строку или нажали отмену, то isFinite(num) преобразует их в 0, из-за "!" опять же получаем false и завершаем цикл.

В вашем варианте:
делаем проверку
while (!isFinite(numRead)) приплюсовываем a (1)
так как у нас в самом начале переменная numRead объявлена, но не инициализирована (не присвоено значение) то ее значением является undefined isFinite(undefined) дает false, отрицание "!" дает true и условие while выполняется
Выполняем тело цикла
JavaScript
1
2
3
{numRead = +prompt();
      if (numRead == '' || numRead == null) return null;
   };
Приплюсовываем b (1) и далее у нас есть варианты. Если выполняется if то выполняем return и завершаем цикл. Итого a=1, b=1
если же мы ввели число (в данном случае кроме 0) то условие в if не срабатывает и цикл возвращается к условию, приплюсовываем a(2)
Условие в итоге дает false, цикл завершается итого a=2, b=1. Т.е. одна лишняя проверка.

уфф

Цитата Сообщение от Freeze_Breeze Посмотреть сообщение
Пока numRead НЕ является числом, то выполняем блок if()
все правильно.
Цитата Сообщение от Freeze_Breeze Посмотреть сообщение
Суть я понял, но каша в голове
По началу всегда так Правда потом вы дойдете до всякой фильтрации массивов, прототипов, промисов и станет еще веселее
1
 Аватар для Freeze_Breeze
278 / 272 / 106
Регистрация: 12.01.2016
Сообщений: 1,666
06.06.2022, 21:44  [ТС]
AlexZaw, krvsa, Уважаемые, а сколько у Вас опыта работы в программировании, и где Вы работаете(ли)? (И что мне нужно, для того что бы достичь Вашего уровня?) И если Вас не затруднит, напишите, про весь Ваш путь от самого начала и до сегодня.
0
Модератор
Эксперт HTML/CSS
 Аватар для AlexZaw
2379 / 1739 / 677
Регистрация: 07.08.2016
Сообщений: 4,093
06.06.2022, 22:16
Freeze_Breeze, у меня путь краткий и простой до банальности - сначала учил html и css по разным самоучителям, в основном по htmlbook. Потом наткнулся на этот форум и стал читать вопросы других пользователей и пытаться решить поставленную задачу, когда сам, когда с помощью гугла.
Потом помаленьку начал учить js на ютубе, learnjs и опять же по этому форуму. После чего выиграл обучение в htmlacademy по профе frontend-разработчик, но почти все что там преподавали я к тому моменту уже и так знал благодаря поиску ответов на вопросы других Что-то новое конечно узнал и во время обучения, но это в основном была инфа по доступности, БЭМ и гиту, ну и по js научился модулям, промисам, и так, по мелочи. Т.е. опять же тому, что можно спокойно изучить самостоятельно.
Умных книжек никаких не читал, хотя в свое время накачал их довольно много, но руки до сих пор так и не дошли
Что касается моего уровня, хотя самого себя оценивать трудно, так я его оцениваю как недоджун
2
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3827 / 1664 / 429
Регистрация: 14.03.2022
Сообщений: 4,191
06.06.2022, 22:19
Цитата Сообщение от Freeze_Breeze Посмотреть сообщение
а сколько у Вас опыта работы в программировании, и где Вы работаете(ли)?
Подцепил эту заразу с 1986-го... Так вот и не проходит.
Руководитель отдела разработки...

Цитата Сообщение от AlexZaw Посмотреть сообщение
Умных книжек никаких не читал
А вот это зря... Хорошие книги придают знаниям некую академичность.
1
06.06.2022, 22:21

Не по теме:

Цитата Сообщение от krvsa Посмотреть сообщение
А вот это зря...
Да я понимаю, но как-то всегда находятся другие "неотложные" дела :)

0
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3827 / 1664 / 429
Регистрация: 14.03.2022
Сообщений: 4,191
06.06.2022, 22:22
Цитата Сообщение от Freeze_Breeze Посмотреть сообщение
И что мне нужно, для того что бы достичь Вашего уровня?
Мочить программки не переставая!
1
 Аватар для Freeze_Breeze
278 / 272 / 106
Регистрация: 12.01.2016
Сообщений: 1,666
06.06.2022, 22:25  [ТС]
AlexZaw, Благодарю Вас. Вы мне очень помогли. Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.06.2022, 22:25
Помогаю со студенческими работами здесь

Программа должна запрашивать ввести возраст до тех пор, пока пользователь не введет число. как зациклить можно?
try: m=int(input(&quot;введите ваш возраст &quot;)) except ValueError: m=int(input(&quot;введите ваш возраст &quot;)) print(m)

Запрашивать у пользователя строки до тех пор, пока он не введет строку "Все"
Помогите пожалуйста решить задачу на С++ на строки. Запрашивать у пользователя строки до тех пор, пока он не введет строку &quot;Все&quot;

Запрашивать пароль до тех пор, пока он не будет правильно введен.
Написать программу, которая запрашивает пароль (целое число) до тех пор, пока он не будет правильно введен.

Запрашивать пароль до тех пор, пока он не будет правильно введен
Составить программу, которая запрашивает пароль (например, четырехзначное число) до тех пор, пока он не будет правильно введен.

Запрашивать пароль до тех пор, пока он не будет правильно введен
Составит программу , которая запрашивает пароль(например, четырехзначное число) до тех пор, пока он не будет правильно введен.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru