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];

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

مراد 27.03.2012 17:41

а как вывести текст вертикально?

مراد 27.03.2012 18:18

вертикальный текст
 
Вложений: 1
да нет нагерное
вот как на рисунке ВЕРТИКАЛЬНО
Вложение 1199

bes 27.03.2012 19:29

Ирония, Maxmaxmахimus, это, конечно, хорошо (хочешь, чтобы регулярные выражения представлялись не литерально, создай среду, в которой они будут представляться, например, схематически).

Но к чему лирика, если сам заварил эту кашу, приведя пример, по которому возникают вопросы.

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

مراد 27.03.2012 21:25

ааа... что там на счет вертикального текста;)

bes 27.03.2012 21:44

Maxmaxmахimus, давай решать задачи по порядку:
сначала доразберёмся с твоим примером,
потом, если владеешь информацией, можешь помочь мне в вопросе http://javascript.ru/forum/misc/2678...avascript.html,
ну а потом можно будет поговорить, как я понял, о твоей любимой теме - регулярных выражениях (средство не спорю мощное).

melky 27.03.2012 22:36

Цитата:

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

Обычно массив обходят по переменной, хранящей ссылку на число, с каждой итерацией которую проверяют, не больше ли она длины массива.
Ваш способ применяется в большинстве случаев для обхода объектов.

Цитата:

Сообщение от bes (Сообщение 165244)
Для эффективного применения предложенного тобой варианта решения, на мой взгляд, осталось разобраться с тем как досрочно выйти из функции forEach и с тем какие существуют варианты для возвращения значений из внутренней функции для этой forEach (вдобавок к предложенному мной), если знаешь, просвети.

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

مراد 27.03.2012 22:49

Цитата:

Сообщение от مراد
ааа... что там на счет вертикального текста

люди!!!

можно ли переменной присвоить таблицу

Rootpassword 27.03.2012 23:04

Цитата:

Сообщение от مراد
можно ли переменной присвоить таблицу

переменной можно присвоить ссылку на таблицу

bes 27.03.2012 23:51

Спасибо, melky, за то, что подключился к нашей беседе.
Да, такой способ наверное наиболее подходит для данной ситуации (хотя и пробежаться по объектам-массивам можно), в цикл for и break можно вставить.

Не поленюсь, приведу, код подобного forEach работающего цикла для массива schedule (расчёт времени наверное логично вынести за пределы цикла).

Код:

for (i = 0; i < schedule.length; i++)
{
  var arrTimes = schedule[i][0].match( /\d+/g );

  if (hours >= arrTimes[0] &&
      hours <=  arrTimes[2] &&
      minutes >= arrTimes[1] &&                       
      minutes <  arrTimes[3])
  {alert(schedule[i][1]); break}
}

Что касается, функции forEach, если из неё точно не предусмотрен досрочный выход, то это печально (думается, что forEach, как раз и реализована таким циклом).
А результат работы внутренней функции в forEach можно вернуть через внешнюю переменную (я подумал может быть есть ещё какие-нибудь варианты).

рони 28.03.2012 16:19

مراد,
Вариант...
var schedule = [
	[900, 'Пары еще не начались '],
	[945, 'Первый час, первой пары '],
	[950, 'Перемена 5 минут '],
	[1035, 'Второй час, первой пары '],
    [1045, 'Конец первой пары. Перемена на 10 минут '],
    [1130, 'Первый час, второй пары '],
    [1135, 'Перемена 5 минут  '],
    [1220, 'Второй час, второй пары '],
    [1240, 'Большая перемена '],
    [1325, 'Первый час, третьей пары '],
    [1330, 'Перемена 5 минут '],
    [1415, 'Второй час, третьей пары '],
    [2359, 'Наконец то закончились эти пары ']
];


alert( testSchedule() );
function testSchedule() {
	var nowTime = new Date(), hours = nowTime.getHours(), minutes = nowTime.getMinutes();
	var def = '';
     for (var i=0; i<schedule.length; i++)  {
       def = schedule[i][1];
       if((hours*100)+minutes < schedule[i][0]) break;
         }
	return def;
}


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