Новичёк :) Непонятки с кодом.

Тема в разделе "Arduino & Shields", создана пользователем Defender, 16 дек 2014.

  1. Defender

    Defender Нерд

    Здравствуйте. Я только начал разбираться в Ардуино. Помогите пожалуйста разобраться в следующем. Вот здесь http://wiki.amperka.ru/программирование:константы-переменные-арифметика есть формула (пункт "Зацикленная змейка") для расчета номера последующего пина к которому подключён светодиод:

    ledPin = (ledPin - FIRST_LED + 1) % TOTAL_LEDS + FIRST_LED;

    Вот мне не совсем понятно как она работает, а именно "оператор остатка от деления" - %.
    Методом использования различного количества светодиодов я понял что формула универсальная, НО хотел бы до конца разобраться в её работе так как если я по ней считаю, почему то не сходится ничего. Допустим у меня не 10 как в примере а 8 светодиодов (TOTAL_LEDS=8), первый светодиод подключён к 4 пину и далее по порядку, что тогда получается, как я понимаю при расчёте:
    (4 - 4 + 1) % 8 + 4 =
    (1) % 8 + 4 =1 + 4 = (так как 1/8=0,125, а остаток % берёт только первую цифру после запятой, так?)
    5

    далее
    (5 - 4 + 1) % 8 + 4 =
    (2) % 8 + 4 =2 + 4 = (так как 2/8 =0 ,25)
    6

    (6 - 4 + 1) % 8 + 4 =
    (3) % 8 + 4 =3 + 4 = (так как 3/8=0,375)
    7

    (7 - 4 + 1) % 8 + 4 =
    (4) % 8 + 4 = И вот здесь возникает у меня ступор, потому что 4/8 = 0,5
    То есть ответ 9 пин, но никак не 8 по порядку.

    Как так?

    Извините, если вопрос покажется глупым, я понимаю что где-то в логике сам ошибся, но хоть убей никак не разберусь. Формула правильная и программы с разным количеством светодиодов работают правильно, но я бы хотел досконально разобраться, так как если не понимаю столь элементарных вещей, дальше будет сложнее.
    Спасибо.
     
    Последнее редактирование: 16 дек 2014
  2. Druids91

    Druids91 Нерд

    Я так понимаю, что пины не обязательно должны у вас идти по порядку. Тем более у вас есть в расчетах ошибки - вы не используете округление, а просто выдергиваете последнюю цифру после запятой.
    P.S. Могу ошибаться т.к. сам новичек - это только предположение
     
  3. Defender

    Defender Нерд

    Вроде бы разобрался. В примере на приведённой в первом сообщении ссылке, можно войти в заблуждение, так как там делится всё на 10 светодиодов и я подумал, что берётся первая цифра после нуля, но оказывается оператор % работает не так, он считает по следующей формуле х1 % х2 = х1 - (х1 / х2) * х2, к примеру:
    4%8 = 4 - (4/8)*8
    А так как у нас тип данных int, то в скобках всегда будет 0.
     
  4. Vivan755

    Vivan755 Нерд

    И в названии темы тоже ошибка, ибо "новичОк" ;)
    Модератор исправит?
     
  5. Defender

    Defender Нерд

    Согласно тем допущениям, что я принял, в моих расчётах нет ошибки. А в слове новичОк, да, действительно ошибся. Но я рад, что Вы это заметили. К сожалению так никто и не подтвердил мои предположения насчёт всего остального. И на том спасибо.
     
  6. rav_75

    rav_75 Гик

    А что подтверждать? Погуглите деление с остатком если забыли, Вы это в начальной школе проходили. Оператор % возвращает как раз тот самый остаток.
     
  7. Megakoteyka

    Megakoteyka Оракул Модератор

    Операция % целочисленная.
    1 % 8 = 1
    2 % 8 = 2
    3 % 8 = 3
    4 % 8 = 4
    5 % 8 = 5
    6 % 8 = 6
    7 % 8 = 7
    8 % 8 = 0
    9 % 8 = 1
     
    Defender нравится это.
  8. Defender

    Defender Нерд

    Спасибо, БОЛЬШОЕ!:) Теперь точно во всём разобрался.