Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


Закрытая тема
Опции темы
Непрочитано 05.03.2017, 19:31   #1
supercelt
Прописка
 
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
supercelt на пути к лучшему
По умолчанию алгоритм корректировки числа на СИ

Всем привет!

На СИ под микроконтроллер.

Задача:

есть целое число в 16 разрядной переменной типа uint16_t. Оно равно году = 2317. Год может быть любой из 4 чисел максимум.

Представьте, что это число отобразилось на дисплее, после набора его на клавиатуре. Параллельно в переменную записывались сами целые числа.Но юзер ошибся, ведь сейчас 2017. И он нажимает backspace и курсор послушно двигаясь назад выводит на эран 231, потом нажимает ещё и 23, ещё раз и 2. Потом печатает уже 2017. Задача состоит в том, что бы когда юзер нажал первый раз на стирание, то в переменной бы стало 2310, ещё нажал - 2300, ещё - 2000, и наконец - 0. Задача скорее математическая. И надо учесть, что цифры могут быть абсолютно любые, нет привязки к тысячилетию и т.д. И работаем не со строкой, а с числом. Например может быть 5448 год. И тогда получится 5440 - 5400 - 5000 - 0
Помогите пожалуйста придумать как это сделать)
Реклама:
supercelt вне форума  
Непрочитано 05.03.2017, 20:18   #2
zöner
Гражданин KAZUS.RU
 
Регистрация: 16.02.2012
Сообщений: 441
Сказал спасибо: 89
Сказали Спасибо 735 раз(а) в 149 сообщении(ях)
zöner на пути к лучшему
По умолчанию Re: алгоритм корректировки числа на СИ

x - (x % 10); x - (x % 100); x - (x % 1000)
или
x = (x / 10) * 10; (x / 100) * 100; (x / 1000) * 1000
zöner вне форума  
Сказали "Спасибо" zöner
supercelt (05.03.2017)
Непрочитано 05.03.2017, 20:49   #3
supercelt
Прописка
 
Регистрация: 29.03.2007
Сообщений: 185
Сказал спасибо: 11
Сказали Спасибо 1 раз в 1 сообщении
supercelt на пути к лучшему
По умолчанию 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;
}
supercelt вне форума  
Непрочитано 05.03.2017, 21:00   #4
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,258
Сказал спасибо: 11,170
Сказали Спасибо 3,859 раз(а) в 2,929 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: алгоритм корректировки числа на СИ

Если год 4 цифры, то использовать стек на 4 цифры (8 бит).
Осторожно - потенциальная проблема 9999 года !

Преобразовывание внешнего числа делением на 10 и накоплением остатка в стеке с конца (3-1). В нулевой элемент частное.

При вводе идёт обработка того же стека с начала.

Вывод числа идёт обратным путём - с начала стека (0-2) умножением на 10 и суммированием со следующим.

При этом в стеке всегда значение для побайтного отображения на дисплее.
Текущая позиция стека - позиция набираемой цифры.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…

Последний раз редактировалось mike-y-k; 05.03.2017 в 21:06.
mike-y-k вне форума  
Непрочитано 05.03.2017, 21:06   #5
nml
Супер-модератор
 
Аватар для nml
 
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,381
Сказал спасибо: 1,962
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
nml на пути к лучшему
По умолчанию Re: алгоритм корректировки числа на СИ

Как по мне, я бы сделал так
если нажата цифра, результат *= 10 и + цифра
если нажата отмена, результат /=10

Вот и все.
__________________
[ жизнь приятна и красива, если выпить литр пива ]
nml вне форума  
Непрочитано 05.03.2017, 21:11   #6
AR_Favorit
Почётный гражданин KAZUS.RU
 
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: алгоритм корректировки числа на СИ

Сообщение от nml Посмотреть сообщение
Как по мне, я бы сделал так
если нажата цифра, результат *= 10 и + цифра
если нажата отмена, результат /=10

Вот и все.
Не соответствует условию. В переменной должно быть при вводе "0 - 2000 - 2300 -2310 - 2317", а при нажатиях отмены "2317 - 2310 - 2300 - 2000 - 0"

А у вас получится "0 - 2 - 23 - 231 - 2317" и "2317 - 231 - 23- 2 -0"


ЗЫ никогда так не извращался (правда, у меня и клавиатуры никогда не бывает, только кнопки типа "плюс, минус, отмена, ввод"))). Для ввода - массив чаров. И хочешь - последняя цифра стирается, хочешь - просто курсор перемещается под корректируемую цифру... А по окончании ввода уже можно и в переменную из массива сосчитать, если надо (а иногда бывает удобнее так массивом и использовать)))
AR_Favorit вне форума  
Непрочитано 05.03.2017, 21:47   #7
nml
Супер-модератор
 
Аватар для nml
 
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,381
Сказал спасибо: 1,962
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
nml на пути к лучшему
По умолчанию Re: алгоритм корректировки числа на СИ

Сообщение от AR_Favorit Посмотреть сообщение
Не соответствует условию.
Блин, точно. Я просто по инерции мыслил. Ввод "по условию", как по мне - нелогичен как-то. А если надо ввести 2017, ввел 2 - на дисплее 2000, потом отвлекся - и - что нажимать - 0 или уже 1?

Хотя, конечно, раз заказчик требует так...
__________________
[ жизнь приятна и красива, если выпить литр пива ]
nml вне форума  
Непрочитано 05.03.2017, 22:36   #8
zöner
Гражданин KAZUS.RU
 
Регистрация: 16.02.2012
Сообщений: 441
Сказал спасибо: 89
Сказали Спасибо 735 раз(а) в 149 сообщении(ях)
zöner на пути к лучшему
По умолчанию Re: алгоритм корректировки числа на СИ

Сообщение от AR_Favorit Посмотреть сообщение
А у вас получится "0 - 2 - 23 - 231 - 2317" и "2317 - 231 - 23- 2 -0"
имхо такой сдвиг/деление удобнее и очевиднее. непонятно зачем ТСу обнулять цифры
zöner вне форума  
Непрочитано 05.03.2017, 23:04   #9
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,258
Сказал спасибо: 11,170
Сказали Спасибо 3,859 раз(а) в 2,929 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию 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.
mike-y-k вне форума  
Непрочитано 05.03.2017, 23:08   #10
jump
Почётный гражданин KAZUS.RU
 
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 8,003
Сказал спасибо: 0
Сказали Спасибо 4,946 раз(а) в 2,374 сообщении(ях)
jump на пути к лучшему
По умолчанию Re: алгоритм корректировки числа на СИ

Сообщение от nml Посмотреть сообщение
потом отвлекся - и - что нажимать - 0 или уже 1?
а мигающее/инверсное текущее знакоместо некошерно?
jump вне форума  
Закрытая тема

Закладки


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразование двоичного числа в двоично-десятичное: от К580 к AVR Mega16 analitik33 AVR 25 27.06.2018 18:36
алгоритм опережения зажигания artyomugr Микроконтроллеры, АЦП, память и т.д 18 02.03.2012 11:40
Большие отрицательные числа и АВР ua_gruzin Микроконтроллеры, АЦП, память и т.д 7 31.01.2009 11:41
32-разрядные числа в 8-битном PIC dimmich Микроконтроллеры, АЦП, память и т.д 17 28.10.2007 04:27
преобразование числа для занесения его в регистр на PIC16F84 CERGEI1982 Микроконтроллеры, АЦП, память и т.д 9 11.01.2007 17:47


Часовой пояс GMT +4, время: 19:33.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot