Задачка для новичков

sadman41
Offline
Зарегистрирован: 19.10.2016

Ну, если рассуждать логически, то конструкция if (!i--) эквивалентно такой:

if(!i){

   i=i-1;
  ...
  Serial.print(i);
  ...
} else {
  i=i-1;
}

Обратите внимание на то, что в данном случае мы не можем сократить это до:

if(!i){
 ...
  Serial.print(i);
  ...
}
i=i-1;

Так как декремент должен производиться в обоих вариантах условия, но строго до исполнения блока true, так как в ином случае Serial.print(i) покажет неверное значение.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

конструкции вида - почти равнозначны, в первой переменная i периодически принимает отрицательное значение:
 

void ledInvert(void)
{
  static int i= 490/Freq;
  if(!i--)
  {
    digitalWrite(pinLed, ! digitalRead(pinLed));
    i=490/Freq; 
       }
   }


void ledInvert(void)
{
  static int i= 490/Freq;
  if(i==0)
  {
    digitalWrite(pinLed, ! digitalRead(pinLed));
     i=490/Freq; 
      } else{
  i--;}
 }

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Почти - это только с float и госдумой бывает. А данном случае эти блоки работают по-разному:


void func1(int8_t _i)
{
  if (!_i--) {
    Serial.print("Function #1, i="); Serial.println(_i);
  }
}

void func2(int8_t _i)
{
  if (_i == 0) {
    Serial.print("Function #2, i="); Serial.println(_i);
  } else {
    _i--;
  }
}

void setup() {
  Serial.begin(115200);
  Serial.println("Go!");
  func1(0);
  func2(0);
}

void loop() {}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ну так вы выводите значение  в первой функции после декремента )))
Почти,  подразумевается что декремент после проверки if а не до...

логически, функция 2 написана более правильно, i хотя бы и временно не выходит за диапазон положительных значений

sadman41
Offline
Зарегистрирован: 19.10.2016

Я не знаю, что там у кого подразумевается и зачем начинать опять водить поляков по лесу.

Конструкции неравнозначны, это единственное, что я хочу проиллюстрировать. А что там логически более правильно в разрезе алгоритма - не является предметом обсуждения эквивалентных аналогов выражения if(!i--).

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

так я о чем тут с #30 поста твержу: аналога функции 1 - нет

sadman41
Offline
Зарегистрирован: 19.10.2016

До исправления в вашем посте #52 было написано, что функции равнозначны. На это я и отвечал. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

sadman41 пишет:

Ну, если рассуждать логически, то конструкция if (!i--) эквивалентно такой:

if(!i){

   i=i-1;
  ...
  Serial.print(i);
  ...
} else {
  i=i-1;
}

Обратите внимание на то, что в данном случае мы не можем сократить это до:

if(!i){
 ...
  Serial.print(i);
  ...
}
i=i-1;

Так как декремент должен производиться в обоих вариантах условия, но строго до исполнения блока true, так как в ином случае Serial.print(i) покажет неверное значение.

А если так:

if(!i){
 ...
  Serial.print(i-1);
  ...
}
i=i-1;
 
sadman41
Offline
Зарегистрирован: 19.10.2016

Тогда внутри блок if() придется утыкать (i-1) , в местах, где оперируют переменной i.

Я сам не особо люблю эти ++/-- в составе других операторов, потому как легко запутаться, но в (!i--) он смотрится изящно. Надо посмотреть, как оно на выходе в ассемблер трансформируется и так же ли там красиво стоит.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

sadman41 пишет:

Тогда внутри блок if() придется утыкать (i-1) , в местах, где оперируют переменной i.

Да, не скрою: когда писал, был у меня соблазн убрать многоточие из второй строки. Дабы не вводить в искушение. )))))

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

пишите панятно 

if (--i>0) ...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

пишите панятно 

if (--i>0) ...

нам же надо делитель - то-есть каждый n отрабатывать и видимо i должна быть на 1 больше

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

DetSimen пишет:

пишите панятно 

if (--i>0) ...

Пешите исчо панятнее:

if((--i>0)>0)...

Пешите исчо, исчо, исчо панятнее:

if((((--i>0)>0)>0)>0)...

 

PS. Не думаю, что if(-1)... и if(-1>0)... это одно и то же.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Что-то новых задач для новичков не наблюдается ...

Да, и первое приведённое решение имеет сильное ограничение по частоте вызова функции, лучше так ))):
 

#define pinLed  13
#define pinINT0 2
#define Freq    1000
#define Scetchik 500

void ledInvert(void)
{
  static unsigned long j = Scetchik;
  if(!j--){ 
    digitalWrite(pinLed, ! digitalRead(pinLed));
   j=Scetchik;
    }
}

void setup() {
  pinMode(pinLed,OUTPUT);
  attachInterrupt(0, ledInvert, RISING );
  tone(pinINT0,Freq);
}

void loop() {
  while(1);
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

Да, и первое приведённое решение имеет сильное ограничение по частоте вызова функции, лучше так ))):

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

ua6em пишет:

Что-то новых задач для новичков не наблюдается ...

А что, кто-то обещал? :) Эта задача появилась из занятий с внуком. Когда и если что-нить забавное ещё появится, выложу.

Кстати, о ребёнке. Он тут намылился поступать в ЗФТШ (кто не знает, - это заочная школа при Физтехе). Посмотрел я на его задачи и прибалдел. То ли, с тех пор как я там учился, задачи сильно просели в сложности, то ли я как-то изменился, но меня поразила лёгкость вступительных задач.

Вот, например, одна задачка. Моему ребёнку её не нужно было, решать - она от восьмого класса, а он в седьмом, но он едва прочитав её, решил устно, чем вызвал ахрененный прилив гордости у деда :-))
Задача №7 по физике - стр.10 в самом низу.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Вот, например, одна задачка. Моему ребёнку её не нужно было, решать - она от восьмого класса, а он в седьмом, но он едва прочитав её, решил устно, чем вызвал ахрененный прилив гордости у деда :-))
Задача №7 по физике - стр.10 в самом низу.

Мне от Касперыча задача понравилась (может потому, что решил её влёт, за пару секунд, в уме и не привлекая Гаусса)...
есть запись чисел в строке...1234567891011..20182019 
Делится ли сумма всех чисел без остатка на 9...

То-есть 1+2+3..+9+1+0+1+1...+2+0+1+9

)))

 

PS особо не искал, но сходу не нашёл ограничения по частоте на функцию tone() а знать хотелось бы, tone(1) точно не работает )))

PPS меня внучки радуют пока только словарным запасом )))

 

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

[Вот, например, одна задачка. Моему ребёнку её не нужно было, решать - она от восьмого класса, а он в седьмом, но он едва прочитав её, решил устно, чем вызвал ахрененный прилив гордости у деда :-))
Задача №7 по физике - стр.10 в самом низу.

я тоже решил устно :) и это. прямо скажем, показатель :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:
сходу не нашёл ограничения по частоте на функцию tone()
Так прямо здесь и написано - 31Гц.

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

PS особо не искал, но сходу не нашёл ограничения по частоте на функцию tone()

 

built-in tone() function frequency range is 31 Hz - 65.5kHz

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

b707 пишет:

я тоже решил устно :) и это. прямо скажем, показатель :)

Видимо, Ваш дед тоже Вами гордится :)

sadman41
Offline
Зарегистрирован: 19.10.2016

ua6em пишет:

PS особо не искал, но сходу не нашёл ограничения по частоте на функцию tone() а знать хотелось бы, tone(1) точно не работает )))

Раз за разом Вы меня просто уби... поражаете до глубины души.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

ua6em пишет:

PS особо не искал, но сходу не нашёл ограничения по частоте на функцию tone() а знать хотелось бы, tone(1) точно не работает )))

Раз за разом Вы меня просто уби... поражаете до глубины души.

Видимо бегло смотрел, у меня с английским не важно, только поговорить )))
PS но знал, что ограничения есть, в цифирьках не запомнилось

PPS Вы задачку от Касперского решили, устно? Нет - тоже удивите )))

 

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

[

PPS Вы задачку от Касперского решили, устно? Нет - тоже удивите )))

 

ни делитца

sadman41
Offline
Зарегистрирован: 19.10.2016

ua6em пишет:

PPS Вы задачку от Касперского решили, устно? Нет - тоже удивите )))

Вы меня извините, но после истории с виртуалкой на 9MHz я Ваших словах логики не ищу. Зачем терять время на бессмыслицу?

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

Вы меня извините, но после истории с виртуалкой на 9MHz я Ваших словах логики не ищу. Зачем терять время на бессмыслицу?

да лан, я вот сейчас на работе сижу, мозги свободны :) - посчитал в уме - сумма всех цмифр чисел от 0 до 2019 = 28140 - на 9 неделится :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

sadman41 пишет:

Вы меня извините, но после истории с виртуалкой на 9MHz я Ваших словах логики не ищу. Зачем терять время на бессмыслицу?

да лан, я вот сейчас на работе сижу, мозги свободны :) - посчитал в уме - сумма всех цмифр чисел от 0 до 2019 = 28140 - на 9 неделится :)

Как говаривал Евгений Петрович - а на хрена??? Да и за две секунды ...сильно сомневаюсь...здесь надо вспомнить арифметику 4 класса )))

PS Гоги, сколько будет дважды два - сорок учитель... )))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

ua6em пишет:

PPS Вы задачку от Касперского решили, устно? Нет - тоже удивите )))

Вы меня извините, но после истории с виртуалкой на 9MHz я Ваших словах логики не ищу. Зачем терять время на бессмыслицу?

Позавчера созерцали с приятелем ЛУНУ, облака на высоте 5 километров проплывали за ней, наверное тоже логики нет, до облаков 7 километров, до Луны 380тыщ, ни какой логики... )))

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:
Цитата:

да лан, я вот сейчас на работе сижу, мозги свободны :) - посчитал в уме - сумма всех цмифр чисел от 0 до 2019 = 28140 - на 9 неделится :)

Как говаривал Евгений Петрович - а на хрена??? Да и за две секунды ...сильно сомневаюсь...здесь надо вспомнить арифметику 4 класса )))

всякие признаки деления использовать - это читерство :). Счет полной суммы занял минуты полторы... я не слишком быстр мозгами. Больше всего промучился с числами от 2000 до 2019 :)

sadman41
Offline
Зарегистрирован: 19.10.2016

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

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

Да какие приемнички, я же сказал, всё в 4 классе преподавали, в нашей, церковно-приходской )))
1. Если один из сомножителей делится на цело, без остатка, то и произведение двух чисел делится без остатка
2. Имеем сомножители 1+ 2 0 1 9 = 1+2+0+1+9 = 13 нацело не делится (2 + 2 0 1 8) = 13...
3. Таких пар 1009 - нацело не делится )))

sadman41
Offline
Зарегистрирован: 19.10.2016

Давайте теперь размышлять логически: у вас был учитель, который знал это правило и решил его объяснить ученикам. В другой школе учитель не знал этого правила или посчитал ненужным донести его до учеников. Виноват ли в этом ученик, который не узнал данное правило? Справедливо ли утверждение о том, что не будь у вас учителя, который хотел и вдолбил в головы учеников данный приём, вы бы выглядели так же глупо на фоне остальных?

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

Да какие приемнички, я же сказал, всё в 4 классе преподавали, в нашей, церковно-приходской )))
1. Если один из сомножителей делится на цело, без остатка, то и произведение двух чисел делится без остатка
2. Имеем сомножители 1+ 2 0 1 9 = 1+2+0+1+9 = 13 нацело не делится (2 + 2 0 1 8) = 13...
3. Таких пар 1009 - нацело не делится )))

глупость написана - и доказать очень легко.

Из того, что (1+ 2 0 1 9) =  13 и (2 + 2 0 1 8) = 13 вовсе не следует, что сумма цифр любой пары из 1009 - тоже 13. Возьми число 999 - в нем одном сумма цифо УЖЕ 27...

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:

Давайте теперь размышлять логически: у вас был учитель, который знал это правило и решил его объяснить ученикам. В другой школе учитель не знал этого правила или посчитал ненужным донести его до учеников.

да нет тут никакого правила. Ошибка логики - вот и вся "ценность" этого решения "за пару секунд в уме"

sadman41
Offline
Зарегистрирован: 19.10.2016

b707 пишет:

sadman41 пишет:

Давайте теперь размышлять логически: у вас был учитель, который знал это правило и решил его объяснить ученикам. В другой школе учитель не знал этого правила или посчитал ненужным донести его до учеников.

да нет тут никакого правила. Ошибка логики - вот и вся "ценность" этого решения "за пару секунд в уме"

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

 

b707
Offline
Зарегистрирован: 26.05.2017

очень полезное свойство - уметь хотя бы примерно прикидывать порядок результата

Среднее число цифр в таких парах - порядка 6. Среднее значение цифры(от 0 до 9) - 4.5.  При таком раскладе ну никак не может средняя сумма 6 цифр со средним 4.5 иметь значение 13 :)

 

b707
Offline
Зарегистрирован: 26.05.2017

Еще немного подумал, пока домой ехал - мозги опять свободны :)

Правило такое и правда есть. Только у него четкие границы применения, о которых наш друг ua6em забыл. Как говорили в моей "церковно-приходской" - "слышал звон, да не знает где он".

Правило подсчет сумм цифр в ряду парами работает при двух условиях:

 - первая цифра ряда должна быть 0 (на сумму цифр ряда - начинать с 0 или 1 - конечно не влияет, но вот сумма цифр в паре - меняется)
- ряд должен заканчиваться числом, у которого во всех разрядах, кроме старшего - стоят девятки

То есть для ряда от 0 до 9 - правило работает, (0 +9) +  (1+8) + (2+7) .... = 45

А вот от 0 до 11 - нет :)

Так же правило работает для 0-29, 0-99 или 0-3999.

Но вполне ожидаемо лажает для ряда 0-2019, я уж не говорю про ряд 1-2019 :)

Кстати, вполне возможно, что в той одиозной задачке про бочку имеем что-то подобное - товарищ когда-то знал правильное красивое решение, но условия давно стерлись из памяти, а логические допуски перепутались :)

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ахренеть!

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ЕвгенийП пишет:

Ахренеть!

Ты тоже следишь? Я уже давно в ахуе! Куда там Э.С.Гарднер или Р.Чандлер ;)))) Тут и страсти и интрига...

Может стоит попробовать это издать? Только с владельцем сайта о копирайте договориться...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

Кстати, вполне возможно, что в той одиозной задачке про бочку имеем что-то подобное - товарищ когда-то знал правильное красивое решение, но условия давно стерлись из памяти, а логические допуски перепутались :)

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

гипотенузы (радиус) равен сумме квадратов катетов (радиус минус приращение в мм),
найти площадь прямоугольника далее какие сложности, естественно все площади потом суммируются
PS у Касперского как одно из решений разбивать на пары делящиеся без остатка на 9

b707
Offline
Зарегистрирован: 26.05.2017

ua6em пишет:

Вот я лажанулся...почти...ответ то правильный..

:))))))

В вопросе "делится ли на 9" - всегда говори не делится -  вероятность правильного ответа 88% :)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

Ахренеть!

А что поделать, если у старожилов данного ресурса снобизм и чувство собственного превосходства лезут со всех щелей, ну и как говорил по моему Бисмарк, "если не можешь уничтожить - возглавь"!!!

ЗЫ не вивисекция, меру взаимодействия, описанную в трудах Литвака не переходил )))