Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 31.01.2019
Сообщений: 5

Эмулятор работы нагревательного прибора

01.02.2019, 02:11. Показов 1904. Ответов 6
Метки css, html (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Занимаюсь Javascript’ом недавно, но нашел интересную задачу, которая как по мне интересна. Буду очень благодарен если кто выручит.

Внимание: Задача предполагает графический интерфейс. Каждый элемент должен быть создан вручную в JS.
Реализовать функцию-конструктор Teapot. Которая строит и эмулирует работу нагревательного прибора (в дальнейшем НП).

10(l) - объем НП
20000(kW) - мощность НП
Бак НП. Здесь нужно правильно масштабировать уровень воды, то есть, если общий объем бака 10л, а объем налитой воды - 5л, то прямоугольник, выделенный голубым должен занимать 50% от серого.
1(l) - текущий объем воды в НП
НП может иметь 4 состояния:
ожидание, нагревание еще не началось, тогда текст в кнопке 5 должен быть “Start”
нагревание, сам, собственно, процесс нагревания воду. Текст в кнопке должен быть: “Pause”
пауза, после нажатия “Pause”. Текст во время паузы: “Continue”
нагревание окончено. Текст в кнопке - “Reset”
6. Индикатор температуры (должен обновляться каждую секунду)
7. Индикатор оставшегося времени (должен обновляться каждую секунду).
Принять КПД НП - 100%.
Напоминаю теорию по физике:
Q = c*m*() - количество теплоты (Дж), которое нужно отдать воде массой m, чтобы нагреть ее с температуры t1 до t2. Где c - теплоемкость воды (константа ~4200).
A = Pt - количество работы (Дж), производимое за 1 сек НП мощностью P.
Приравняв Q и A вы сможете вычислить величины (6) и (7).

Название: E8C3760F-89A9-4140-844E-7CB6AF8FF83E.png
Просмотров: 85

Размер: 19.8 Кб
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.02.2019, 02:11
Ответы с готовыми решениями:

Разработать программу - эмулятор работы бытового прибора
Необходимо разработать программу - эмулятор работы бытового прибора ( в моем случае духовка ) . Программа должна позволять выполнять через...

Эмулятор прибора для проверки КОП 814 в Labview
Как на Labview (>=8.5) написать эмулятор прибора 814 для работы с GPIB (NI488.1 / NI488.2/ IEC625/ ГОСТ26.003-80)?

Найти вероятность безотказной работы прибора
Прибор, работающий в течение 24 часов, состоит из 2 одинаковых блоков, в каждом из которых по 3 узла. каждый узел независимо от других...

6
 Аватар для prudkiy
181 / 149 / 55
Регистрация: 21.07.2013
Сообщений: 958
01.02.2019, 03:09
Цитата Сообщение от Groovg Посмотреть сообщение
нашел интересную задачу, которая как по мне интересна
Так что вы уже накидали?
А вообщем то пишите html разметку. Js - класс объекта и его методы.
0
0 / 0 / 0
Регистрация: 31.01.2019
Сообщений: 5
01.02.2019, 03:12  [ТС]
Ничего не накидал. До меня быстрее доходит когда я вижу решение. Если кто может - выручите.
0
 Аватар для prudkiy
181 / 149 / 55
Регистрация: 21.07.2013
Сообщений: 958
01.02.2019, 12:33
Цитата Сообщение от Groovg Посмотреть сообщение
До меня быстрее доходит когда я вижу решение
В данной задачи нет ничего сложного. Возьмите книгу (например фреймута) почитайте о объектах. Разберитесь что это такое и что они дают в js. Думаю потом вы сами, спокойно, будете реализовывать подобные задачи
0
0 / 0 / 0
Регистрация: 31.01.2019
Сообщений: 5
01.02.2019, 12:38  [ТС]
Я написал сюда с целью увидить решение, так как очевидно если бы я разбирался в таких задачах то я бы сюда не писал.
0
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
05.05.2020, 01:17
https://codepen.io/qwerty_wasd/pen/GzWqRB
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
class Teapot {
  constructor (options) {
    this.container = options.container instanceof HTMLElement ?
      options.container : undefined;
    
    this.volume = typeof options.volume === `number` &&
      options.volume !== NaN &&
      options.volume > 1 ?
      options.volume :
    (console.log(`Volume, l: incorrect or wasn't data; was set default value - 10 litre`), 10);
    
    this.power = typeof options.power === `number` &&
      options.power !== NaN &&
      options.power > 1 ?
      options.power :
    (console.log(`Power, kW: incorrect or wasn't data; was set default value - 20000 kilowatt`), 20000);
    
    this.water = typeof options.water === `number` &&
      options.water !== NaN &&
      options.water < this.volume &&
      options.water >= 1 ?
      options.water :
    (console.log(`Water, l: incorrect or wasn't data; was set default value - 1 litre`), 1);
    
    this.init_t = typeof options.init_t === `number` &&
      options.init_t !== NaN &&
      options.init_t < 100 &&
      options.init_t >= 0 ?
      options.init_t :
    (console.log(`Init temperature, C: incorrect or wasn't data; was set default value - 20 degrees`), 20);
    
  }
  
  init() {
    
    if (this.container === undefined) {
      console.log(`Container: ERROR !!!`);
      throw new Error(`Must be specified the parent element - instance of HTMLELement`);
    }
    
    if (this.volume <= this.water) {
      console.log(`Water: ERROR !!!`);
      throw new Error(`The volume of water is out of range !`);
    }
    
    let opHD = {
      boilingTime: Math.round((4200 * this.water * (100 - this.init_t)) / this.power),
      idTimer: null,
      flag: true,
      events: {
        mUp: e => {
          if (e.target.classList.contains(`control-button`)) {
            e.target.textContent = opHD.flag ? `pause` : `continue`;
            opHD.idTimer = opHD.flag ? window.setInterval(() => {
              e.target.nextElementSibling.lastElementChild.textContent = `Time to finish (sec): ${opHD.boilingTime--}`;
              e.target.nextElementSibling.firstElementChild.textContent = `Current temperature (C): ${Math.round(100 - ((this.power * opHD.boilingTime) / (this.water * 4200)))}`;
              if (opHD.boilingTime < 0) {
                clearInterval(opHD.idTimer);
                e.target.textContent = `start`;
                e.target.nextElementSibling.firstElementChild.textContent = `Current temperature (C): ${this.init_t}`;
                opHD.flag = !opHD.flag;
              }
            }, 1000) : clearInterval(opHD.idTimer);
            opHD.flag = !opHD.flag;
          }
        }
      }
    }
    
    document.documentElement.children[0].insertAdjacentHTML(`beforeend`,`<style>#module-heating-device {-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;-webkit-tap-highlight-color: rgba(0, 0, 0, 0);-webkit-tap-highlight-color: transparent;box-sizing: border-box;padding: 0;margin: 0;outline: 0;display: flex;flex-direction: column;justify-content: center;align-content: center;align-items: center;}#module-heating-device .features-device {font-weight: bolder;font-size: 20px;}#module-heating-device .cistern {position: relative;margin-top: 20px;border-radius: 20px;width: 300px;height: ${this.volume * 20}px;background: #9E9E9E;box-shadow: 0 0 20px rgba(0, 0, 0, 0.8);overflow: hidden;}#module-heating-device .cistern .water {position: absolute;left: 0;right: 0;bottom: 0;background: #42A5F5;font-weight: bold;text-align: center;line-height: ${this.water * 20}px;height: ${this.water * 20}px;transition: height 1s;}#module-heating-device .control-button {display: flex;justify-content: center;align-items: center;margin-top: 20px;border-radius: 20px;background: #9CCC65;box-shadow: 0 0 20px rgba(0, 0, 0, 0.6);height: 50px;width: 300px;text-transform: uppercase;font-weight: bold;cursor: pointer;transition: .5s;}#module-heating-device .control-button:hover {background: #8BC34A;box-shadow: 0 0 15px rgba(0, 0, 0, 0.8);}#module-heating-device .control-button:active {box-shadow: 0 0 5px black;}#module-heating-device .progrees-sensors {margin-top: 20px;cursor: text;font-weight: bold;text-align: center;}#module-heating-device .progrees-sensors .temperature {margin-bottom: 10px;}</style>`);
    
    this.container.insertAdjacentHTML(`beforeend`, `<div id="module-heating-device"><div class="features-device">${this.volume}(l) | ${this.power}(kW)</div><div class="cistern"><div class="water">${this.water}(l)</div></div><div class="control-button">start</div><div class="progrees-sensors"><div class="temperature">Current temperature (C): ${this.init_t}</div><div class="time-lap">Time to finish (sec): 0</div></div></div>`);
    
    this.container.addEventListener(`mouseup`, opHD.events.mUp);
  }
}
 
// create instance
new Teapot({
  container: document.body,
  power: 30000,
  init_t: 15,
  volume: 10,
  water: 5
}).init();
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
05.05.2020, 19:37
Здравствуйте.
У меня пока так получилось. Стили наверно не надо было динамически генерить.
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <style>
        .header {
            width: 220px;
            display: flex;
            justify-content: center;
        }
 
        .container {
            width: 220px;
            height: 100px;
            border: 1px solid black;
            margin-top: 10px;
            margin-bottom: 10px;
            display: flex;
            flex-direction: column;
            justify-content: flex-end;
        }
 
        .water {
            background-color: blue;
            display: flex;
            flex-direction: column-reverse;
            align-items: center;
        }
 
        .btn {
            width: 220px;
            background-color: limegreen;
        }
    </style>
</head>
<body>
    <script src="scripts/app.js"></script>
</body>
</html>
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
class Teapot {
    constructor(maxValue, value, power, startT) {
        this.maxValue = maxValue;
        this.value = value;
        this.power = power;
        this.startT = startT;
        this.currentT = startT;
        this.paused = false;
    }
    calcTime() {
        return 4200 * this.value * (100 - this.currentT) / this.power;
    }
    draw(parent) {
        this.parent = parent;
        let s = `
    <div class="header">
    <span class="maxvolume">${this.maxValue}</span>(l)&nbsp;|&nbsp;<span class="power">${this.power}</span>(W)
    </div>
    <div class="container">
        <div class="water" style="height: ${Math.round(this.value / this.maxValue * 100)}px;">
            <span>${this.value}(l)</span>
        </div>
 
    </div>
    <input type="button" class="btn" value="Start"><br />
    Current temperature (C): <span class="temperature">${this.currentT}</span><br />
    Time to finish (sec): <span class="time">${Math.ceil(this.calcTime())}</span>        
`;
        parent.insertAdjacentHTML("beforeend", s);
        this.button = this.parent.querySelector(".btn");
        let onStart = async () => {
            this.paused = false;
            this.button.value = "Pause";
            this.button.onclick = onPaused;
            while (this.currentT < 100 && !this.paused) {
                await delay(1000);
                this.currentT += this.power / 4200 / this.value;
                if (this.currentT > 100)
                    this.currentT = 100;
                this.redraw();
            }
            if (this.paused && this.currentT < 100) {
                this.button.value = "Continue";
                this.button.onclick = onStart;
                return;
            }
            this.button.value = "Reset";
            this.button.onclick = onReset;
        };
        let onReset = () => {
            this.button.value = "Start";
            this.button.onclick = onStart;
            this.currentT = this.startT;
            this.redraw();
        };
        let onPaused = () => {
            this.paused = true;
        };
        this.button.onclick = onStart;
    }
    redraw() {
        this.parent.querySelector(".temperature").textContent = this.currentT.toFixed(0);
        this.parent.querySelector(".time").textContent = Math.ceil(this.calcTime()).toString();
    }
}
new Teapot(10, 1, 20000, 15).draw(document.body);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.05.2020, 19:37
Помогаю со студенческими работами здесь

Найти вероятность безотказной работы прибора
Прибор состоит из двух дублирующих друг друга узлов и может работать в одном из двух режимов : нормальном и неблагоприятном ....

Найти полную вероятность безотказной работы прибора
Доброго времени суток! Помогите, пожалуйста, с задачкой: Прибор состоит из 2-х дублирующих друг друга узлов и может работать в одном...

Найдите вероятность безаварийной работы прибора в течение месяца
Здравствуйте, вот условие задач. Помогите пожалуйста. Сложение совместных событий Решите задачу. Электронный прибор состоит из...

Построить часовые диаграммы работы прибора оптимальной оценки неизвестной амплитуды радиоимпульса.
Помогите с задачей пожалуйста. вот задача: Построить часовые диаграммы работы прибора оптимальной оценки неизвестной амплитуды...

Можно ли считать, что время безотказной работы этого прибора имеет нормальное распределение?
здрасвуйте, как решит это задача?? следующая информация представляют собой время безотказной работы электронного прибора. выясните, можно...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru