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 :: Помогите упростить скрипт [3]

 PHP.SU

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


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

> Описание: Счётчик
IllusionMH
Отправлено: 06 Октября, 2014 - 20:29:28
Post Id



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


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


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




Эдвард пишет:
В том-то и вопрос, почему переменные a, b, c не участвуют в математической операции. Сколько не пытался добиться ответа по ошибке, пока только издевательское молчание.

Эдвард, у вас проблема не только с массивами.
Огругление вверх Math.ceil для любого числа в диапазоне 0 < x <=1 выдаст 1. Math.ceil(1/100), Math.ceil(2/100), Math.ceil(99/100), Math.ceil(100/100) все равны 1. так что переменные учавствую, только результат одинаковый.

Эдвард пишет:
Наоборот: если значение переменной = 0, в окне должна проявиться буква «Р».

в примере кода элементы массивов принимают только 3 значения: 1, 2, 3. Какое из этих значений равно нулю?
 
 Top
Эдвард
Отправлено: 06 Октября, 2014 - 20:37:20
Post Id


Новичок


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


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




IllusionMH пишет:
Огругление вверх Math.ceil для любого числа в диапазоне 0 < x <=1 выдаст 1


Так в том и заключается задумка счётчика, чтобы любое число (кроме 0) было преобразовано в 1.

IllusionMH пишет:
в примере кода элементы массивов принимают только 3 значения: 1, 2, 3. Какое из этих значений равно нулю?


Это ведь не буквальные значения, а значения индексов переменных.
 
 Top
IllusionMH
Отправлено: 06 Октября, 2014 - 20:46:19
Post Id



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


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


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




Эдвард пишет:
Так в том и заключается задумка счётчика, чтобы любое число (кроме 0) было преобразовано в 1.

Эдвард, ну так из 1,2,3 всегда будут три единицы которые потом суммируются.

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

Эдвард, i - индекс, a[i] - элемент массива. В данном случае значения 1,2,3.

На всякий случай уточню. Рассматриваю только код из поста http://forum.php.su/topic.php?fo...48069#1412248069

(Отредактировано автором: 06 Октября, 2014 - 20:48:16)

 
 Top
Эдвард
Отправлено: 06 Октября, 2014 - 20:55:45
Post Id


Новичок


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


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




IllusionMH пишет:
Эдвард, ну так из 1,2,3 всегда будут три единицы.

Эдвард, i - индекс,
- элемент массива. В данном случае значения 1,2,3


Ок. Учитывая, что значения переменных могут меняться (в т. ч. отсутствовать вовсе), как сделать работающими массивы без значений?

Такая конструкция тоже не работала:

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

(Добавление)
IllusionMH пишет:
На всякий случай уточню. Рассматриваю только код из поста http://forum.php.su/topic.php?fo...48069#1412248069


Так и понял. Но на примере упрощённой задачи ( http://med-75[dot]hol[dot]es/1/8[dot]html ) разобраться, наверное, было бы легче.

(Отредактировано автором: 06 Октября, 2014 - 21:10:06)

 
 Top
IllusionMH
Отправлено: 06 Октября, 2014 - 23:28:08
Post Id



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


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


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




Эдвард, и в чем смысл верхнего ряда с селектами?

вообще - даёте строкам(или столбцам) одинаковый класс r1(первая строка инпутов) r2(вторая) (все это можно генерить в цикле).
Потом
CODE (javascript):
скопировать код в буфер обмена
  1. var a = [];
  2. var inputs = document.querySelectorAll('.r1');
  3. var n = inputs.length;
  4. var i;
  5.  
  6. for(i = 0; i< n; i += 1) {
  7.   a[i] = parseInt(inputs[i].value, 10) || 0;
  8. }
  9.  
  10. console.log(a);


Все, в массиве a находятся все значения из инпутов в первой строке.
По такому же принципу можно считать остальные массивы.

Или сделать двумерный массив var a=[]; в цикле делать a[i] = []; и потом заполнять a[i][j] = value

(Отредактировано автором: 07 Октября, 2014 - 03:39:46)

 
 Top
Эдвард
Отправлено: 07 Октября, 2014 - 13:56:57
Post Id


Новичок


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


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




IllusionMH пишет:
Эдвард, и в чем смысл верхнего ряда с селектами?


Они задают условия для ячеек столбца. На данном принципе построены графики и расписания.

IllusionMH пишет:
CODE (javascript):
скопировать код в буфер обмена
  1. var a = [];var inputs = document.querySelectorAll('.r1');var n = inputs.length;var i; for(i = 0; i< n; i += 1) {  a[i] = parseInt(inputs[i].value, 10) || 0;} console.log(a);


Честно говоря, не понял, как эта конструкция должна работать с оператором switch и как выводить данные на экран.
 
 Top
IllusionMH
Отправлено: 07 Октября, 2014 - 19:53:42
Post Id



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


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


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




Эдвард, вывод реализуется
CODE (javascript):
скопировать код в буфер обмена
  1. inputs[i].value = a[i];


Значения свичей считываются аналогично. Только вот три массива, меняются на матрицу(двумерный массив)
все a -> m[0], b -> m[1], c -> m[2], индексы у переменной превратятся в второй индекс a1 ->m[0][0]

А дальше вы должны придумать как имея номер игрока i и индекс чекбокса о заполнять нужный элемент m[i][j], т.к. только вы знаете что ж там за логика должна быть реализована и за вас никто эьтого делать не будет.

(Отредактировано автором: 07 Октября, 2014 - 19:54:21)

 
 Top
Эдвард
Отправлено: 08 Октября, 2014 - 09:45:47
Post Id


Новичок


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


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




IllusionMH пишет:
только вы знаете что ж там за логика должна быть реализована


В задаче с игроками ничего сложного нет. Вся суть – в заполнении обычного графика средствами javascript. Но чтобы не напрягать людей вниканием в логику и чтением объёмного кода, специально создал упрощённую задачку с тремя условиями заполнения графика (ab, ac, bc). Единственное, что там требуется – это вместо трёх switch сделать один. К сожалению, как ни встраивал предложенную Вами конструкцию, ничего не работает. Неужели не найдётся более простого цикла для этой задачи: http://forum.php.su/topic.php?fo...12618#1412612618 ?..

(Отредактировано автором: 08 Октября, 2014 - 09:47:43)

 
 Top
Sail
Отправлено: 08 Октября, 2014 - 11:04:39
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


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




IllusionMH пишет:
В идеале вместо трёх switch-ей должен быть один – например, такой:
....
Но опять же встаёт вопрос, как грамотно заполнить массивы для переменных e, a, b, c и создать для них соответствующий цикл.

Например, так (раз уж речь идёт о простом):
CODE (javascript):
скопировать код в буфер обмена
  1. function calculator(form) {
  2.     var ae = new Array(form.e1.value, form.e2.value, form.e3.value);
  3.     var a = new Array("", "", "");
  4.     var b = new Array("", "", "");
  5.     var c = new Array("", "", "");
  6.  
  7.     for(var i = 0; i < ae.length; i++) {
  8.         switch(ae[i]) {
  9.             case "ab" : a[i]=1 , b[i]=1 , c[i]=""; break;
  10.             case "ac" : a[i]=1 , b[i]="" , c[i]=1; break;
  11.             case "bc" : a[i]="" , b[i]=1 , c[i]=1; break;
  12.             default:  a[i]="" , b[i]="" , c[i]="";
  13.         }
  14.     }
  15.  
  16.     form.a1.value = a[0];
  17.     form.a2.value = a[1];
  18.     form.a3.value = a[2];
  19.  
  20.     form.b1.value = b[0];
  21.     form.b2.value = b[1];
  22.     form.b3.value = b[2];
  23.  
  24.     form.c1.value = c[0];
  25.     form.c2.value = c[1];
  26.     form.c3.value = c[2];
  27. }
 
 Top
Эдвард
Отправлено: 08 Октября, 2014 - 11:24:02
Post Id


Новичок


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


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




[quote=Sail][/quote]

Это как раз то, что мне нужно. Огромное спасибо!
 
 Top
Эдвард
Отправлено: 08 Октября, 2014 - 16:29:08
Post Id


Новичок


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


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




Попробовал немного усложнить задачу, добавив ещё один ряд селектов с условиями: http://med-75[dot]hol[dot]es/1/9[dot]html :

CODE (html):
скопировать код в буфер обмена
  1. <html>
  2. <meta charset="utf-8">
  3.  
  4. <head>
  5. <script type="text/javascript">
  6.  
  7. function calculator(form) {
  8.  
  9.     var e = new Array(form.e1.value, form.e2.value, form.e3.value);
  10.     var f = new Array(form.f1.value, form.f2.value, form.f3.value);
  11.  
  12.     var a = new Array("", "", "");
  13.     var b = new Array("", "", "");
  14.     var c = new Array("", "", "");
  15.  
  16.     for(var i = 0; i < e.length; i++) {
  17. var x = e[i]+f[i];
  18.        switch(x) {
  19.            case "ab1" : a[i]=1 , b[i]=1 , c[i]=""; break;
  20.            case "ab2" : a[i]=2 , b[i]=2 , c[i]=""; break;
  21.            case "ab3" : a[i]=3 , b[i]=3 , c[i]=""; break;
  22.  
  23.            case "ac1" : a[i]=1 , b[i]="" , c[i]=1; break;
  24.            case "ac2" : a[i]=2 , b[i]="" , c[i]=2; break;
  25.            case "ac3" : a[i]=3 , b[i]="" , c[i]=3; break;
  26.  
  27.            case "bc1" : a[i]="" , b[i]=1 , c[i]=1; break;
  28.            case "bc2" : a[i]="" , b[i]=2 , c[i]=2; break;
  29.            case "bc3" : a[i]="" , b[i]=3 , c[i]=3; break;
  30.  
  31.            default:  a[i]="" , b[i]="" , c[i]="";
  32.        }
  33.    }
  34.  
  35.    form.a1.value = a[0];
  36.    form.a2.value = a[1];
  37.    form.a3.value = a[2];
  38.  
  39.    form.b1.value = b[0];
  40.    form.b2.value = b[1];
  41.    form.b3.value = b[2];
  42.  
  43.    form.c1.value = c[0];
  44.    form.c2.value = c[1];
  45.    form.c3.value = c[2];
  46. }
  47.  
  48. </script>
  49. </head>
  50.  
  51. <style type="text/css">
  52.     .s1 {
  53.       text-align: center;
  54.       font-weight: bold;
  55.       width: 100px;
  56.     }
  57. </style>
  58.  
  59. <form name="f1">
  60.  
  61. <select name="e1" class="s1">
  62.  <option>ab</option>
  63.  <option>ac</option>
  64.  <option>bc</option>
  65. </select>
  66. <select name="e2" class="s1">
  67.  <option>ab</option>
  68.  <option>ac</option>
  69.  <option>bc</option>
  70. </select>
  71. <select name="e3" class="s1">
  72.  <option>ab</option>
  73.  <option>ac</option>
  74.  <option>bc</option>
  75.  </select>
  76.  
  77. <br>
  78.  
  79. <select name="f1" class="s1">
  80.  <option>1</option>
  81.  <option>2</option>
  82.  <option>3</option>
  83. </select>
  84. <select name="f2" class="s1">
  85.  <option>1</option>
  86.  <option>2</option>
  87.  <option>3</option>
  88. </select>
  89. <select name="f3" class="s1">
  90.  <option>1</option>
  91.  <option>2</option>
  92.  <option>3</option>
  93.  </select>
  94.  
  95. <br>
  96.  
  97. <input name="a1" type="text" class="s1"> <input name="a2" type="text" class="s1"> <input name="a3" type="text" class="s1">
  98.  
  99. <br>
  100.  
  101. <input name="b1" type="text" class="s1"> <input name="b2" type="text" class="s1"> <input name="b3" type="text" class="s1">
  102.  
  103. <br>
  104.  
  105. <input name="c1" type="text" class="s1"> <input name="c2" type="text" class="s1"> <input name="c3" type="text" class="s1">
  106.  
  107. <br><br>
  108.  
  109. <input type="button" value="Калькуляция" onClick="calculator(this.form)">
  110. <input type="reset" value="Сброс">
  111.  
  112. </form>
  113. </html>


Работает, как надо. Но возможно, связку цикл + switch записал не совсем грамотно (по крайней мере, не понятно, почему e.length распространяется также и на f).

(Отредактировано автором: 08 Октября, 2014 - 16:36:12)

 
 Top
Sail
Отправлено: 08 Октября, 2014 - 16:38:30
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


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




Эдвард пишет:
(по крайней мере, не понятно, почему e.length распространяется также и на f)

Потому что "по условию задачи" они одинаковой длины (с одинаковым количеством элементов).
К тому-же в данном случае можно на этапе определения массива е заполнять его значением "form.e1.value + form.f1.value".

(Отредактировано автором: 08 Октября, 2014 - 16:47:38)

 
 Top
Эдвард
Отправлено: 08 Октября, 2014 - 16:45:38
Post Id


Новичок


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


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




Sail пишет:
Потому что "по условию задачи" они одинаковой длинны (с одинаковым количеством элементов).
К тому-же в данном случае можно на этапе определения массива е заполнять его значением "form.e1.value + form.f1.value"


Ясно. Спасибо. Теперь ломаю голову над тем, как менять все значения в каждом последующем столбце по заданному алгоритму (например, для значений первого столбца = +10, второго = +20, третьего = +30). Пока ничего вразумительного не приходит на ум.

(Отредактировано автором: 08 Октября, 2014 - 16:54:31)

 
 Top
Эдвард
Отправлено: 09 Октября, 2014 - 10:50:31
Post Id


Новичок


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


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




Возвращаясь к первоначальной задаче ( http://med-75[dot]hol[dot]es/4/1.php ), решил её следующим способом (благодаря подсказке Sail):

CODE (javascript):
скопировать код в буфер обмена
  1. function calculator(form) {
  2.  
  3. var k = new Array(form.k1.value, form.k2.value, form.k3.value);
  4. var a = new Array("", "", "");
  5. var b = new Array("", "", "");
  6. var c = new Array("", "", "");
  7.  
  8. for(var i = 0; i < k.length; i++) {
  9.         switch(k[i]) {
  10.             case "Игра 1 " : a[i]=1 , b[i]=1 , c[i]=""; break;
  11.             case "Игра 2 " : a[i]=1 , b[i]="" , c[i]=1; break;
  12.             case "Игра 3 " : a[i]="" , b[i]=1 , c[i]=1; break;
  13.             case "Резерв " : a[i]=0 , b[i]=0 , c[i]=0; break;
  14.             default:  a[i]="" , b[i]="" , c[i]="";
  15.         }
  16.     }
  17.  
  18. var a4 = (a[0]*1)+(a[1]*1)+(a[2]*1);
  19. var b4 = (b[0]*1)+(b[1]*1)+(b[2]*1);
  20. var c4 = (c[0]*1)+(c[1]*1)+(c[2]*1);
  21.  
  22.    if (a[1] == 1){a[1] = 1+a[0]; }
  23.    if (a[2] == 1){a[2] = 1+(Math.ceil(a[0]/100)+Math.ceil(a[1]/100)); }
  24.  
  25.    if (b[1] == 1){b[1] = 1+b[0]; }
  26.    if (b[2] == 1){b[2] = 1+(Math.ceil(b[0]/100)+Math.ceil(b[1]/100)); }
  27.  
  28.    if (c[1] == 1){c[1] = 1+c[0]; }
  29.    if (c[2] == 1){c[2] = 1+(Math.ceil(c[0]/100)+Math.ceil(c[1]/100)); }
  30.  
  31.    if (a[0] == "0"){a[0] = "P"; }
  32.    if (a[1] == "0"){a[1] = "P"; }
  33.    if (a[2] == "0"){a[2] = "P"; }
  34.  
  35.    if (b[0] == "0"){b[0] = "P"; }
  36.    if (b[1] == "0"){b[1] = "P"; }
  37.    if (b[2] == "0"){b[2] = "P"; }
  38.  
  39.    if (c[0] == "0"){c[0] = "P"; }
  40.    if (c[1] == "0"){c[1] = "P"; }
  41.    if (c[2] == "0"){c[2] = "P"; }
  42.  
  43. form.a1.value = a[0];
  44. form.a2.value = a[1];
  45. form.a3.value = a[2];
  46. form.a4.value = a4;
  47.  
  48. form.b1.value = b[0];
  49. form.b2.value = b[1];
  50. form.b3.value = b[2];
  51. form.b4.value = b4;
  52.  
  53. form.c1.value = c[0];
  54. form.c2.value = c[1];
  55. form.c3.value = c[2];
  56. form.c4.value = c4;
  57. }


Наверное, можно ещё более компактно сделать, но там, вероятно, пришлось бы прибегнуть к двумерным массивам, что для меня пока недосягаемо.

(Отредактировано автором: 09 Октября, 2014 - 11:21:37)

 
 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