Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите упростить скрипт

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): [1] 2 3 »   

> Описание: Счётчик
Эдвард
Отправлено: 25 Сентября, 2014 - 19:37:14
Post Id


Новичок


Покинул форум
Сообщений всего: 44
Дата рег-ции: Июль 2014  


Помог: 0 раз(а)




Погряз в формулах и никак не могу придумать, как их упростить. Здесь показано, как работает скрипт: http://med-75[dot]hol[dot]es/4/1.php . Основная задача – реализовать счётчик игр для каждого из игроков (по команде "Калькуляция"). Если ограничиться тремя днями, моя реализация терпима, но при составлении таблицы игр на месяц код раздуется до невероятных размеров (например, для последнего числа месяца в каждом из условий придётся прописывать формулы из тридцати элементов).

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

Вот мой вариант скрипта, отвечающего за математическую часть кода:

CODE (javascript):
скопировать код в буфер обмена
  1. function calculator(form) {
  2.  
  3. k1 = form.k1.value;
  4. k2 = form.k2.value;
  5. k3 = form.k3.value;
  6.  
  7. x1 = k1;
  8.          
  9. switch (x1)
  10. {      
  11. case "Игра 1 " : a1=1 , a2=1 , a3=""; break;
  12. case "Игра 2 " : a1=1 , a2="" , a3=1; break;
  13. case "Игра 3 " : a1="" , a2=1 , a3=1; break;
  14. case "Резерв " : a1=0 , a2=0 , a3=0; break;
  15. default:  a1="" , a2="" , a3="";
  16. }
  17.  
  18. x2 = k2;
  19.          
  20. switch (x2)
  21. {      
  22. case "Игра 1 " : b1=1+a1 , b2=1+a2 , b3=""; break;
  23. case "Игра 2 " : b1=1+a1 , b2="" , b3=1+a3; break;
  24. case "Игра 3 " : b1="" , b2=1+a2 , b3=1+a3; break;
  25. case "Резерв " : b1=0 , b2=0 , b3=0; break;
  26. default:  b1="" , b2="" , b3="";
  27. }
  28.  
  29. x3 = k3;
  30.          
  31. switch (x3)
  32. {      
  33. case "Игра 1 " : c1=1+Math.ceil(a1/100)+Math.ceil(b1/100) , c2=1+Math.ceil(a2/100)+Math.ceil(b2/100) , c3=""; break;
  34. case "Игра 2 " : c1=1+Math.ceil(a1/100)+Math.ceil(b1/100) , c2="" , c3=1+Math.ceil(a3/100)+Math.ceil(b3/100); break;
  35. case "Игра 3 " : c1="" , c2=1+Math.ceil(a2/100)+Math.ceil(b2/100) , c3=1+Math.ceil(a3/100)+Math.ceil(b3/100); break;
  36. case "Резерв " : c1=0 , c2=0 , c3=0; break;
  37. default:  c1="" , c2="" , c3="";
  38. }
  39.  
  40. d1 = Math.ceil(a1/100)+Math.ceil(b1/100)+Math.ceil(c1/100);
  41. d2 = Math.ceil(a2/100)+Math.ceil(b2/100)+Math.ceil(c2/100);
  42. d3 = Math.ceil(a3/100)+Math.ceil(b3/100)+Math.ceil(c3/100);
  43.  
  44. if (a1=="0") {
  45. var a1 = "Р";
  46. }
  47.  
  48. if (a2=="0") {
  49. var a2 = "Р";
  50. }
  51.  
  52. if (a3=="0") {
  53. var a3 = "Р";
  54. }
  55.  
  56. if (b1=="0") {
  57. var b1 = "Р";
  58. }
  59.  
  60. if (b2=="0") {
  61. var b2 = "Р";
  62. }
  63.  
  64. if (b3=="0") {
  65. var b3 = "Р";
  66. }
  67.  
  68. if (c1=="0") {
  69. var c1 = "Р";
  70. }
  71.  
  72. if (c2=="0") {
  73. var c2 = "Р";
  74. }
  75.  
  76. if (c3=="0") {
  77. var c3 = "Р";
  78. }
  79.  
  80. form.total1.value = a1;
  81. form.total2.value = a2;
  82. form.total3.value = a3;
  83. form.total4.value = b1;
  84. form.total5.value = b2;
  85. form.total6.value = b3;
  86. form.total7.value = c1;
  87. form.total8.value = c2;
  88. form.total9.value = c3;
  89. form.total10.value = d1;
  90. form.total11.value = d2;
  91. form.total12.value = d3;
  92.  
  93. }
 
 Top
tato
Отправлено: 26 Сентября, 2014 - 01:37:17
Post Id



Посетитель


Покинул форум
Сообщений всего: 468
Дата рег-ции: Сент. 2011  
Откуда: Владивосток


Помог: 8 раз(а)




Эдвард, Вам срочно надо почитать про циклы.


-----
просто ?: сложно
 
 Top
Эдвард
Отправлено: 26 Сентября, 2014 - 04:58:11
Post Id


Новичок


Покинул форум
Сообщений всего: 44
Дата рег-ции: Июль 2014  


Помог: 0 раз(а)




tato пишет:
Эдвард, Вам срочно надо почитать про циклы.


Почитал. Но как применить конкретно к моему случаю, не понимаю.
 
 Top
Эдвард
Отправлено: 26 Сентября, 2014 - 11:26:52
Post Id


Новичок


Покинул форум
Сообщений всего: 44
Дата рег-ции: Июль 2014  


Помог: 0 раз(а)




Дайте хотя бы какую-нибудь зацепку. Прошерстил весь Интернет – всюду даны одни и те же примеры с выводом на страницу (либо всплывающие окна) цифр от 1 до ∞ или других перечней. К сожалению, нигде пока не нашёл примеры циклов с несколькими условиями и сложными формулами, хоть чем-то и отдалённо напоминающими мой скрипт.
 
 Top
RickMan
Отправлено: 26 Сентября, 2014 - 11:29:16
Post Id


Участник


Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012  


Помог: 30 раз(а)




Для начала сделай вместо d1, d2, d3 и так дале массив с названием d, а цифры 1, 2 и 3 - индексы массива... тоесть d1 станет d[1]... и в таком формате переменных будет меньше, и такое закинуть в цикл легче намного.
(Добавление)
Ну и так со всеми подобными переменными.
 
 Top
Эдвард
Отправлено: 26 Сентября, 2014 - 12:58:23
Post Id


Новичок


Покинул форум
Сообщений всего: 44
Дата рег-ции: Июль 2014  


Помог: 0 раз(а)




RickMan пишет:
Для начала сделай вместо d1, d2, d3 и так дале массив с названием d, а цифры 1, 2 и 3 - индексы массива... тоесть d1 станет d[1]... и в таком формате переменных будет меньше, и такое закинуть в цикл легче намного.
(Добавление)
Ну и так со всеми подобными переменными.


Допустим, сделаю так:

CODE (javascript):
скопировать код в буфер обмена
  1. var d = new Array()
  2.  
  3. d[0] = Math.ceil(a1/100)+Math.ceil(b1/100)+Math.ceil(c1/100);
  4. d[1] = Math.ceil(a2/100)+Math.ceil(b2/100)+Math.ceil(c2/100);
  5. d[2] = Math.ceil(a3/100)+Math.ceil(b3/100)+Math.ceil(c3/100);
  6.  
  7. form.total10.value = d[0];
  8. form.total11.value = d[1];
  9. form.total12.value = d[2];


Но что от этого изменится в плане упрощения скрипта? Формулы-то для каждой переменной всё равно разные.
 
 Top
RickMan
Отправлено: 26 Сентября, 2014 - 13:04:45
Post Id


Участник


Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012  


Помог: 30 раз(а)




А переменные a1, a2 и a3? Так же с b и с.
И с итоге получится
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. for (i = 0; i < 3; i++)
  3.          d[i] = Math.ceil(a[i]/100)+Math.ceil(b[i]/100)+Math.ceil(c[i]/100);

(Отредактировано автором: 26 Сентября, 2014 - 13:05:04)

 
 Top
Мелкий Супермодератор
Отправлено: 26 Сентября, 2014 - 13:05:13
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Эдвард пишет:
Формулы-то для каждой переменной всё равно разные.

Эдвард пишет:
d[0] = Math.ceil(a1/100)+Math.ceil(b1/100)+Math.ceil(c1/100);
d[1] = Math.ceil(a2/100)+Math.ceil(b2/100)+Math.ceil(c2/100);
d[2] = Math.ceil(a3/100)+Math.ceil(b3/100)+Math.ceil(c3/100);

И чем же они различаются? Приведённые формулы идентичны.


-----
PostgreSQL DBA
 
 Top
Эдвард
Отправлено: 26 Сентября, 2014 - 13:43:35
Post Id


Новичок


Покинул форум
Сообщений всего: 44
Дата рег-ции: Июль 2014  


Помог: 0 раз(а)




RickMan пишет:
А переменные a1, a2 и a3? Так же с b и с.
И с итоге получится
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. for (i = 0; i < 3; i++)
  3.          d[i] = Math.ceil(a[i]/100)+Math.ceil(b[i]/100)+Math.ceil(c[i]/100);


Записал так:

CODE (javascript):
скопировать код в буфер обмена
  1. var d = new Array()
  2.  
  3. for (i = 0; i < 3; i++)
  4.  
  5. d[i] = Math.ceil(a[i]/100)+Math.ceil(b[i]/100)+Math.ceil(c[i]/100);
  6.  
  7. form.total10.value = d[i];
  8. form.total11.value = d[i];
  9. form.total12.value = d[i];


В итоге калькуляция вообще перестала работать. Где-то допущено ошибка.
 
 Top
RickMan
Отправлено: 26 Сентября, 2014 - 13:47:04
Post Id


Участник


Покинул форум
Сообщений всего: 1033
Дата рег-ции: Май 2012  


Помог: 30 раз(а)




1) Вы массивы a, b, c создали?
2) Вы логи браузера смотрели? Чтобы не гадать что за ошибка там
3) Вы в курсе как вообще работает и пишется for? Зачем вы строку после for поставили черти где?
 
 Top
Эдвард
Отправлено: 26 Сентября, 2014 - 15:17:46
Post Id


Новичок


Покинул форум
Сообщений всего: 44
Дата рег-ции: Июль 2014  


Помог: 0 раз(а)




RickMan пишет:
1) Вы массивы a, b, c создали?


Всё перепробовал. Не знаю, как это сделать правильно. Если, например, так:

CODE (javascript):
скопировать код в буфер обмена
  1. a = 0;
  2. b = 0;
  3. c = 0;


то в total(10, 11, 12) всплывает ошибка undefined .

RickMan пишет:
Вы логи браузера смотрели? Чтобы не гадать что за ошибка там


Проверял на ошибки здесь: http://www[dot]javascriptlint[dot]com/online_lint.php . Ничего вразумительного: у строки for якобы не хватает точки с запятой; а у строки d[i] – фигурных скобок.

RickMan пишет:
Вы в курсе как вообще работает и пишется for?


Нет. Первый раз сталкиваюсь на практике.

RickMan пишет:
Зачем вы строку после for поставили черти где?


Скопировал точь-в-точь как у Вас – всё равно криво работает.
 
 Top
Эдвард
Отправлено: 27 Сентября, 2014 - 16:45:08
Post Id


Новичок


Покинул форум
Сообщений всего: 44
Дата рег-ции: Июль 2014  


Помог: 0 раз(а)




Блин, весь мозг сломал – ничего не выходит.

Последний мой вариант:

CODE (javascript):
скопировать код в буфер обмена
  1. var d = new Array();
  2.  
  3. var a = new Array();
  4. var b = new Array();
  5. var c = new Array();
  6.  
  7. for (var i = 0; i < 3; i++)
  8.           d[i] = Math.ceil(a[i]/100)+Math.ceil(b[i]/100)+Math.ceil(c[i]/100);
  9.  
  10. form.total10.value = d[0];
  11. form.total11.value = d[1];
  12. form.total12.value = d[2];


Теперь результат для total (10, 11, 12) – NaN, NaN, NaN. Подозреваю, что проблема в переменных a, b, c. Но как их правильно оформить, ума не приложу.
 
 Top
Эдвард
Отправлено: 30 Сентября, 2014 - 13:18:07
Post Id


Новичок


Покинул форум
Сообщений всего: 44
Дата рег-ции: Июль 2014  


Помог: 0 раз(а)




Что-то приумолкли все. Помогите кто-нибудь хотя бы ошибку исправить. Ведь для людей с знаниями это не так сложно, а я уже несколько дней мучаюсь над задачей.

(Отредактировано автором: 30 Сентября, 2014 - 13:18:33)

 
 Top
IllusionMH
Отправлено: 30 Сентября, 2014 - 13:31:38
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




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

(Отредактировано автором: 30 Сентября, 2014 - 13:52:38)

 
 Top
dcc0
Отправлено: 30 Сентября, 2014 - 13:38:55
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




Я почему-то думаю, что с циклом так:
CODE (htmlphp):
скопировать код в буфер обмена
  1. for (var i = 0; i < 3; i++) {
  2. d[i] = Math.ceil(a[i]/100)+Math.ceil(b[i]/100)+Math.ceil(c[i]/100);
  3. }
  4.  


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

(Отредактировано автором: 30 Сентября, 2014 - 13:40:40)



-----
Март 2021. Бросил программирование
 
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« JavaScript & VBScript »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB