Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   if и else условие (https://javascript.ru/forum/misc/26851-if-i-else-uslovie.html)

مراد 25.03.2012 10:51

if и else условие
 
Не знаю как написать условие(if, else) для скрипта.
if (h === 8 && minutes === 0) {b = 'Пары еще не начались ';  sebastian.children[0].innerHTML = b;}
	else 
    if ((h === 9 && minutes > 0) && (h===9 && minutes <45)) {b = 'Первый час, первой пары ';  sebastian.children[0].innerHTML = b;}
	else 
	if ((h === 9 && minutes > 45) && (h === 9 && minutes < 50)) { b = 'Перемена 5 минут ';  sebastian.children[0].innerHTML = b;}
	else 
	if ((h === 9 && minutes > 50) && (h === 10 && minutes < 35)) { b = 'Второй час, первой пары ';  sebastian.children[0].innerHTML = b;}
	else
	if ((h === 10 && minutes > 35) && (h === 10 && minutes < 45)) {b = 'Конец первой пары. Перемена на 10 минут '; sebastian.children[0].innerHTML = b;}
	else
	if ((h === 10 && minutes > 45) && (h === 11 && minutes < 30)) {b = 'Первый час, второй пары '; sebastian.children[0].innerHTML = b;}
	else
	if ((h === 11 && minutes > 30) && (h === 11 && minutes < 35)) {b = 'Перемена 5 минут  '; sebastian.children[0].innerHTML = b;}
	else
	if ((h === 11 && minutes > 35) && (h === 12 && minutes < 20)) {b = 'Второй час, второй пары '; sebastian.children[0].innerHTML = b;}
	else
	if ((h === 12 && minutes > 20) && (h === 12 && minutes < 40)) {b = 'Большая перемена '; sebastian.children[0].innerHTML = b;}
	else
	if ((h === 12 && minutes > 40) && (h === 13 && minutes < 25)) {b = 'Первый час, третьей пары. Перемена на 10 минут '; sebastian.children[0].innerHTML = b;}
	else
	if ((h === 13 && minutes > 25) && (h === 13 && minutes < 30)) {b = 'Перемена 5 минут '; sebastian.children[0].innerHTML = b;}
	else
	if ((h === 13 && minutes > 30)&&(h===14 && minutes ===15)) {b = 'Второй час, третьей пары '; sebastian.children[0].innerHTML = b;}

	else { b = 'Наконец то закончились эти пары '; sebastian.children[0].innerHTML = b;}


подправьте пожалуйста :(

bes 25.03.2012 15:39

Насколько я понял (не знаю как звучит ваше имя), вы хотите получить более читабельный и легко модернизируемый код (это и увеличивает вероятность его работоспособности), так как в нём наблюдаются некоторые одинаковые части, а также много операторов if-else.
Если это так, то
1) используйте оператор switch вместе с оператором if (switch более читабельный, но выражение в нём
должно возвращать конкретное значение, таким значение в вашем случае будут часы, для проверки неравенств придётся использовать if);
2) повторяющиеся конструкции обозначьте более короткими именами;
3) попробуйте в принципе сократить условия.

Комментирую.
Если вы понимаете, что h - это часы, то зачем обозначать минуты длинным словом minutes, логичнее использовать обозначение просто m.
Зачем использовать лишнюю переменную b, если она нужна лишь для того, чтобы установить значение всего лишь одного элемента (в вашем случае этот элемент sebastian.children[0].innerHTML), логичнее сразу присваивать это значение.
Элемент sebastian.children[0].innerHTML необходимо сократить в написании, например, так g = sebastian.children[0]; (ссылка на ваш элемент children), а далее g.innerHTML.
Зачем делать проверки подобные m>0, если m итак заведомо больше нуля.

Так как я не знаю, что вы имели ввиду под элементом sebastian.children[0], то привожу пример, для простого div, в который по нажатию кнопки "Сейчас", будет выводиться ответ.
В данном коде я использую разбивку по часам, что довольно удобно, а так как вариантов у вас много, привожу для примера несколько первых из них.
Итак, вот он код:

Код:

<div id=s style="background: yellow">Нажми на кнопку, что понять, что сейчас</div>

<button
  onclick = "
    data = new Date();
    h = data.getHours();
    m = data.getMinutes();
    g = document.getElementById('s');

    switch (h)
    {
    case 8: {g.innerHTML = 'Пары еще не начались'; break}
    case 9:
      {
      if (m<45) {g.innerHTML = 'Первый час, первой пары'; break}
      else
        if (m<50) {g.innerHTML = 'Перемена 5 минут'; break}
        else
          {g.innerHTML = 'Второй час, первой пары'; break}
      }
    case 10:
      { 
      if (m<35) {g.innerHTML = 'Второй час, первой пары'; break}
      else
        if (m<45) {g.innerHTML = 'Конец первой пары. Перемена на 10 минут'; break} 
        else
          {g.innerHTML = 'Первый час, второй пары'; break}         
      }
    default: g.innerHTML='Отдыхаем!!'
    }
">Сейчас
</button>


GuardCat 25.03.2012 15:42

Найдите все отличия:
if (h === 8) {
  b = 'Пары еще не начались ';
} else if(h === 9 && minutes > 0 && minutes < 45) {
  b = 'Первый час, первой пары ';
} else if(h === 9 && minutes >= 45 && minutes < 50) {
  b = 'Перемена 5 минут ';
} else if((h === 9 && minutes >= 50) || (h === 10 && minutes < 35)) {
  b = 'Второй час, первой пары ';
} else if (h === 10 && minutes >= 35 && minutes < 45) {
  b = 'Конец первой пары. Перемена на 10 минут ';
} else if ((h === 10 && minutes >= 45) || (h === 11 && minutes < 30)) {
  b = 'Первый час, второй пары ';
} else if (h === 11 && minutes >= 30 && minutes < 35) {
  b = 'Перемена 5 минут  ';
} else if ((h === 11 && minutes >= 35) || (h === 12 && minutes < 20)) {
  b = 'Второй час, второй пары ';
} else if (h === 12 && minutes >= 20 && minutes < 40) {
  b = 'Большая перемена ';
} else if ((h === 12 && minutes >= 40) && (h === 13 && minutes < 25)) {
  b = 'Первый час, третьей пары. Перемена на 10 минут '; 
} else if (h === 13 && minutes >= 25 && minutes < 30) {
  b = 'Перемена 5 минут ';
} else if ((h === 13 && minutes >= 30) || (h === 14 && minutes <= 15)) {
  b = 'Второй час, третьей пары ';
} else {
  b = 'Наконец то закончились эти пары ';
}
sebastian.children[0].innerHTML = b;

bes 25.03.2012 16:19

Хорошее, сокращающее код, решение, GuardCat, также в данном решении код обработки данных отделяется от кода вывода этих данных, что очень удобно при различных модификациях (а вот коду можно придать и более читабельную форму, так как читабельность - основа безошибочности).
В применении к представленному мною коду вместо g.innerHTML можно записать ту же b, а потом в конце, присвоить её в выражении document.getElementById('s').innerHTML = b.

GuardCat 25.03.2012 21:13

Maxmaxmахimus, с простым условием понятно как так сделать. Как быть со сложными условиями? Эвалить? Если есть время, скажу спасибо за код.

bes 25.03.2012 21:20

Приведи детишкам, отец Maxmaxmахimus, реализацию твоего варианта для данной ситуации

مراد 25.03.2012 22:33

вывести полный скрипт? я просто только часть написал где условия...
Цитата:

Сообщение от bes
Насколько я понял (не знаю как звучит ваше имя)

это звучит Мурад.
Ув. besиGuardCat спасибо вам за помощь...
А дядюшка Maxmaxmахimus, я еще раз говорю, не все такими умными родились, как вы.

مراد 26.03.2012 22:10

спасибо папаша:victory:

bes 27.03.2012 00:04

Неплохая идея, Maxmaxmахimus, для реализации её опытными программистами, которые понимают как использовать регулярные выражения и как работают фнукции forEach и match, явно не для новичков (хотя разобраться можно).

Кроме того, следует понимать, что данный код не кроссбраузерный, так как функция forEach работает не во всех браузерах, в качестве альтернативы (со своими демонами) можно для обхода всех элементов массива использовать цикл for (например, вида for (var key in arr) {var val = arr[key]} ).

Также оптимизация требуется предпринять некоторые действия для прекращения выполнения forEach при нахождении требуемого значения, так как внутренняя функция в forEach выполняется для всех элементов массива (лично мне при помощи break) в Google Chrome этого сделать не удалось).

Кроме того, я так понимаю, вы сознательно, захотели, чтобы при выводе всё время выводилось сообщение "приступ".
С выводом значения при использовании forEach также не всё так просто, даже если убрать ваш return 'приступ', alert выведет underfined, так как return time[1] возвращает значение в никуда (а точнее только во внутреннюю функцию), решением может быть присвоение этого значения некоторой переменной (например, а = time[1]), а потом возвращение этого значения (вместо return 'приступ'; - return a;).

PS: Свою гениальность или манию величия, Maxmaxmахimus, можешь проверить на моём вопросе http://javascript.ru/forum/misc/2678...avascript.html

FINoM 27.03.2012 00:17

Цитата:

Сообщение от Maxmaxmахimus
return time[1];

Откуда ты это возвращаешь?


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