Помогите с массивом! - страница 2

 
Maksim Neimerik:   Большое спасибо, первый вариант это как раз то что я и хотел узнать.

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

 
Maksim Neimerik:
Нет, не туго. Неумесное замечание с Вашей стороны, и совсем не дружественное...

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

 

Примерно вот так происходит довольно часто:

Проблема XY
Проблема XY
  • 2017.04.12
  • Vitaly Muzichenko
  • www.mql5.com
Что за «Проблема XY»?Это ошибка, которая зачастую приводит к бессмысленной трате времени как просящего о помощи, так и тех, кто пытается ему отвечать. Её ещё называют «Проблемой Молотка». Суть её,...
 
к чему нужно стремиться.
1 краткость кода, короче код быстрее выполнение.
2 меньшее количество переменных в работе, меньше переменных меньше памяти занимает программа в озу.
3 заменять "дорогие" функции "дешевыми", в данном случае цена это машинное время, если функция выполняется дольше, чем ее аналог по времени, замените ее аналогичной функцией.
4 рекурсивный вызов, если это необходимо, вместо написания дополнительной функции, вызов функции самой себя с новыми параметрами вместо написания дополнительной функции которая делает то же самое что и первая.

а еще говорят краткость сестра таланта.

double zz(int w)//получаем номер фрактала который нужно найти
  {
   int sch=0,q=-1;double pr=0;
   while(sch<w)
     {      
      q++;
      pr=Ind(q);
      if(pr!=0)sch++;
     }
   //return(pr);//если нужно вернуть цену, снять комментарий с этой строки
   return(q);//если нужно вернуть номер бара
  }


с уважением.

P.S. таже функция без лишних слов. )))

double zz(int w){int sch=0,q=-1;double pr=0;while(sch<w){q++;pr=Ind(q);if(pr!=0)sch++;}return(q);}
 
Andrey Kisselyov:
к чему нужно стремиться.
1 краткость кода, короче код быстрее выполнение.
2 меньшее количество переменных в работе, меньше переменных меньше памяти занимает программа в озу.
3 заменять "дорогие" функции "дешевыми", в данном случае цена это машинное время, если функция выполняется дольше, чем ее аналог по времени, замените ее аналогичной функцией.
4 рекурсивный вызов, если это необходимо, вместо написания дополнительной функции, вызов функции самой себя с новыми параметрами вместо написания дополнительной функции которая делает то же самое что и первая.

а еще говорят краткость сестра таланта.
с уважением.
P.S. таже функция без лишних слов. )))

Насчет короче код быстрее выполнение хочу Вас разочаровать. Вот два примера, результат одинаков. Длинный выполняется быстрее

  Alert("Сумма=",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+86+87+88+89+90+
        91+92+93+94+95+96+97+98+99+100);

  int s=0;
  for(int i=1; i<=100; i++)
  {
    s=s+i;
  }
  Alert("s=",s);

Какой-то любитель краткости может записать так

int t=0; for(int k=1; k<101; k++) t+=k; Alert("t=",t);

А вот такой вариант дает тот же результат, но у кого-то вызовет недоумение

int y,n; for(y=0, n=1; n<101; y+=n, ++n); Alert("y=",y);
Согласно легенде, школьный учитель математики юного Гаусса, чтобы занять детей на долгое время, предложил им сосчитать сумму чисел от 1 до 100. Гаусс заметил, что попарные суммы с противоположных концов одинаковы: 1+100=101, 2+99=101 и т. д. Как только учитель закончил, он сказал: Готово, 5050. Программист-математик, знающий прогрессии написал бы короче и быстродействующе.
Alert("Сумма прогрессии = ",100*(1+100)/2);  // При перестановке округляет при делении (1+100)/2*100 = 5000 вместо 5050
Файлы:
-v-08amx.mq4  2 kb
 
STARIJ:

Насчет короче код быстрее выполнение хочу Вас разочаровать. Вот два примера, результат одинаков. Длинный выполняется быстрее

Какой-то любитель краткости может записать так

А вот такой вариант вполне допустим, но у кого-то вызовет недоумение

Согласно легенде, школьный учитель математики юного Гаусса, чтобы занять детей на долгое время, предложил им сосчитать сумму чисел от 1 до 100. Гаусс заметил, что попарные суммы с противоположных концов одинаковы: 1+100=101, 2+99=101 и т. д. Как только учитель закончил, он сказал: Готово, 5050. Программист-математик, знающий прогрессии написал бы короче и быстродействующе.
добрый день.
меня вы не разочаруете, смотрите пункт 3.
и вам станет понятно почему математическая операция, приведенная вами, выполняется быстрее. в теле цикла мы тратим машинное время не только на математику(она там присутствует по любому как и в примере 1), но и на 1 запоминание переменной 2 ее приращение 3 сравнение с условием и это на каждом сложении. получаем что самым скоростным из всех ваших примеров будет последний.
Alert((int)100*(1+100)/2);
с уважением.
 

Спасибо за солидарность и развернутое пояснение. Потом проверил исправил выбросил (int). Компьютер выполняет все действия поочередно. И после каждого сложения результат запоминается. В зависимости от оптимизации транслятором запоминать может в регистре (что быстрее), а может в оперативной памяти. В варианте с циклом также могут использоваться регистровые переменные

 
STARIJ:

Спасибо за солидарность и развернутое пояснение. Потом проверил исправил выбросил (int). Компьютер выполняет все действия поочередно. И после каждого сложения результат запоминается. В зависимости от оптимизации транслятором запоминать может в регистре (что быстрее), а может в оперативной памяти. В варианте с циклом также могут использоваться регистровые переменные

пожалуйста.

с уважением.
 
Alert("Сумма прогрессии = ",100*(1+100)/2);  // При перестановке округляет при делении (1+100)/2*100 = 5000 вместо 5050

почему считает так и выдает ошибку.
(1+100)результат101
101/2 результат 50 (почему 50 скажете вы да потому что здесь по умолчанию применяются числа INT что в результате дает округление до целых)
50*100=5000
как написать чтоб получить верный ответ в таком порядке?
можно так (1.0+100.0)/2.0*100.0, тут мы сразу все числа приводим к формату DOUBLE
а можно привести только первое число к этому формату и все выражение будет считаться в этом формате(не проверял, но по идее должно работать.)
(1.0+100)/2*100

с уважением.

 
Andrey Kisselyov:   почему считает так и выдает ошибку.

Вы глубокий аналитик. Желаю больших достижений

Причина обращения: