05.03.2017, 19:31
|
#1
|
Прописка
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
алгоритм корректировки числа на СИ
Всем привет!
На СИ под микроконтроллер.
Задача:
есть целое число в 16 разрядной переменной типа uint16_t. Оно равно году = 2317. Год может быть любой из 4 чисел максимум.
Представьте, что это число отобразилось на дисплее, после набора его на клавиатуре. Параллельно в переменную записывались сами целые числа.Но юзер ошибся, ведь сейчас 2017. И он нажимает backspace и курсор послушно двигаясь назад выводит на эран 231, потом нажимает ещё и 23, ещё раз и 2. Потом печатает уже 2017. Задача состоит в том, что бы когда юзер нажал первый раз на стирание, то в переменной бы стало 2310, ещё нажал - 2300, ещё - 2000, и наконец - 0. Задача скорее математическая. И надо учесть, что цифры могут быть абсолютно любые, нет привязки к тысячилетию и т.д. И работаем не со строкой, а с числом. Например может быть 5448 год. И тогда получится 5440 - 5400 - 5000 - 0
Помогите пожалуйста придумать как это сделать)
|
|
|
|
05.03.2017, 20:18
|
#2
|
Гражданин KAZUS.RU
Регистрация: 16.02.2012
Сообщений: 441
Сказал спасибо: 89
Сказали Спасибо 735 раз(а) в 149 сообщении(ях)
|
Re: алгоритм корректировки числа на СИ
x - (x % 10); x - (x % 100); x - (x % 1000)
или
x = (x / 10) * 10; (x / 100) * 100; (x / 1000) * 1000
|
|
|
|
05.03.2017, 20:49
|
#3
|
Прописка
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
|
Re: алгоритм корректировки числа на СИ
Сообщение от zöner
|
x - (x % 10); x - (x % 100); x - (x % 1000)
или
x = (x / 10) * 10; (x / 100) * 100; (x / 1000) * 1000
|
спасибо, так и вышло)
Код:
|
switch(count_symbol){
case 3:
year = (year / 10) * 10;
break;
case 2:
year = (year / 100) * 100;
break;
case 1:
year = (year / 1000) * 1000;
break;
case 0:
year = 0;
break;
} |
|
|
|
|
05.03.2017, 21:00
|
#4
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,258
Сказал спасибо: 11,170
Сказали Спасибо 3,859 раз(а) в 2,929 сообщении(ях)
|
Re: алгоритм корректировки числа на СИ
Если год 4 цифры, то использовать стек на 4 цифры (8 бит).
Осторожно - потенциальная проблема 9999 года !
Преобразовывание внешнего числа делением на 10 и накоплением остатка в стеке с конца (3-1). В нулевой элемент частное.
При вводе идёт обработка того же стека с начала.
Вывод числа идёт обратным путём - с начала стека (0-2) умножением на 10 и суммированием со следующим.
При этом в стеке всегда значение для побайтного отображения на дисплее.
Текущая позиция стека - позиция набираемой цифры.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
Последний раз редактировалось mike-y-k; 05.03.2017 в 21:06.
|
|
|
|
05.03.2017, 21:06
|
#5
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,381
Сказал спасибо: 1,962
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Re: алгоритм корректировки числа на СИ
Как по мне, я бы сделал так
если нажата цифра, результат *= 10 и + цифра
если нажата отмена, результат /=10
Вот и все.
__________________
[ жизнь приятна и красива, если выпить литр пива ]
|
|
|
|
05.03.2017, 21:11
|
#6
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: алгоритм корректировки числа на СИ
Сообщение от nml
|
Как по мне, я бы сделал так
если нажата цифра, результат *= 10 и + цифра
если нажата отмена, результат /=10
Вот и все.
|
Не соответствует условию. В переменной должно быть при вводе "0 - 2000 - 2300 -2310 - 2317", а при нажатиях отмены "2317 - 2310 - 2300 - 2000 - 0"
А у вас получится "0 - 2 - 23 - 231 - 2317" и "2317 - 231 - 23- 2 -0"
ЗЫ никогда так не извращался (правда, у меня и клавиатуры никогда не бывает, только кнопки типа "плюс, минус, отмена, ввод"))). Для ввода - массив чаров. И хочешь - последняя цифра стирается, хочешь - просто курсор перемещается под корректируемую цифру... А по окончании ввода уже можно и в переменную из массива сосчитать, если надо (а иногда бывает удобнее так массивом и использовать)))
|
|
|
|
05.03.2017, 21:47
|
#7
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,381
Сказал спасибо: 1,962
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
|
Re: алгоритм корректировки числа на СИ
Сообщение от AR_Favorit
|
Не соответствует условию.
|
Блин, точно. Я просто по инерции мыслил. Ввод "по условию", как по мне - нелогичен как-то. А если надо ввести 2017, ввел 2 - на дисплее 2000, потом отвлекся - и - что нажимать - 0 или уже 1?
Хотя, конечно, раз заказчик требует так...
__________________
[ жизнь приятна и красива, если выпить литр пива ]
|
|
|
|
05.03.2017, 22:36
|
#8
|
Гражданин KAZUS.RU
Регистрация: 16.02.2012
Сообщений: 441
Сказал спасибо: 89
Сказали Спасибо 735 раз(а) в 149 сообщении(ях)
|
Re: алгоритм корректировки числа на СИ
Сообщение от AR_Favorit
|
А у вас получится "0 - 2 - 23 - 231 - 2317" и "2317 - 231 - 23- 2 -0"
|
имхо такой сдвиг/деление удобнее и очевиднее. непонятно зачем ТСу обнулять цифры
|
|
|
|
05.03.2017, 23:04
|
#9
|
Модератор
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,258
Сказал спасибо: 11,170
Сказали Спасибо 3,859 раз(а) в 2,929 сообщении(ях)
|
Re: алгоритм корректировки числа на СИ
Формально предложенный мной алгоритм это вариация очень подходящего тут по смыслу bcd, только с хранением цифры не в 4, а в 8 битах.
В этом варианте нужны будут всего 3 функции
I2BCD для преобразования уже готового числа (при отсутствии необходимости можно опустить).
BCD2I для преобразования в число.
BCD_Del для выполнения операции Delete.
Стек и позицию курсора держать в структуре.
Кода на все получится примерно как в приведённом примере с select-case .
nml Для этого позицию ввода выделяют - подчеркивание/моргание/инверсия/… иначе это уже не алгоритм по теме, а просчёты в основах разработки HMI, usability,…
zöner Ну ТС так в ТЗ написали
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
Последний раз редактировалось mike-y-k; 05.03.2017 в 23:09.
|
|
|
|
05.03.2017, 23:08
|
#10
|
Почётный гражданин KAZUS.RU
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 8,003
Сказал спасибо: 0
Сказали Спасибо 4,946 раз(а) в 2,374 сообщении(ях)
|
Re: алгоритм корректировки числа на СИ
Сообщение от nml
|
потом отвлекся - и - что нажимать - 0 или уже 1?
|
а мигающее/инверсное текущее знакоместо некошерно?
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 19:33.
|
|