Страница 1 из 1
Деление с остатком. CodeVision AVR с выводом на ЖКИ дробного
Добавлено: Чт июл 19, 2012 14:10:19
Garin
Доброго времени суток!
Помогите правильно сделать функцию деления с остатком в CodeVision AVR, и чтобы результат вывести на ЖКИ функцией
lcd_putchar
Моя задача, числа 1200 : 47 = 25.531 , с целым числом проблем нет , а вот остаток никак "не соответствует" математике.
Проект с протеусом приложил в архиве...
Вот моя попытка сделать вычисление таким способом
Код: Выделить всё
Numeric=((1200/47)*1000)+(1200%47); // 1200 / 47 должно= 25.531
NumericA=1200/47; //Получение целого
NumericB=1200%47; // остаток
остаток определяю неправильно, прошу подсказать, как это нужно сделать....//radiokot
Re: Деление с остатком. CodeVision AVR с выводом на ЖКИ.
Добавлено: Чт июл 19, 2012 14:19:54
Flasher
остаток равен 25
Дробная часть частного 0, 531...........
Надо определиться что надо и подковать свои знания.
Re: Деление с остатком. CodeVision AVR с выводом на ЖКИ.
Добавлено: Чт июл 19, 2012 14:51:44
BCluster
Numeric=((1200/47)*1000)+(1200%47);
а это еще че такое? оО
Вам нужно выводить именно это число? Почему бы просто его не выводить?
Или вместо 1200 и 47 будут переменные? Предполагаю что под "остатком" вы имели ввиду дробную часть...
Re: Деление с остатком. CodeVision AVR с выводом на ЖКИ.
Добавлено: Чт июл 19, 2012 14:58:34
Garin
BCluster писал(а):
Вам нужно выводить именно это число? Почему бы просто его не выводить?
Или вместо 1200 и 47 будут переменные? Предполагаю что под "остатком" вы имели ввиду дробную часть...
Это я для простоты обьяснения. Да вместо 1200 и 47
будут переменные.
Возможно словами мои пояснения не очень, а мой вариант кода вообще ни в красную армию....
и всё же , на калькуляторе 1200 : 47 это = 25.531.
А в моем коде это 1200 : 47 = 25.025 ????
Re: Деление с остатком. CodeVision AVR с выводом на ЖКИ.
Добавлено: Чт июл 19, 2012 15:31:42
КРАМ
А с чего Вы взяли, что остаток - это и есть дробная часть???
Остаток еще и поделить нужно, что бы получить дробную часть.
25/47=0,5319...
Re: Деление с остатком. CodeVision AVR с выводом на ЖКИ.
Добавлено: Чт июл 19, 2012 15:43:46
a_skr
1200 / 47 = 25.5319
long a = 1200 / 47; // целая часть = 25
long b = 1200 % 47; // остаток = 25
long c = b*1000 / 47; // дробная часть*1000 = 531
prinf("1200/47 = %d.%d", a, c); // "1200/47 = 25.531" конечно, с отбрасываем остальных знаков, а не с правильным округлением
Re: Деление с остатком. CodeVision AVR с выводом на ЖКИ.
Добавлено: Чт июл 19, 2012 16:04:24
BCluster
Эмс...
Код: Выделить всё
char string[20];
float a = 1200;
float b = 47;
float c = a / b;
sprintf( string, "a/b=%.3f", c );
lcd_puts ( string );
-- подправил в связи с реалиями кодвижна
оффтоп: почему в lcd_puts не сделали 2 аргумента, один из которых длина мне не ведомо... было бы удобнее
Re: Деление с остатком. CodeVision AVR с выводом на ЖКИ.
Добавлено: Чт июл 19, 2012 16:12:58
Garin
Огромное спасибо, с вашей помощью решено, освежил что дробная что остаток.
a_skr ваш конкретный пример , это то что я и спрашивал, спасибо.
Теперь мой код в любом виде отображает то что мне и требуется.
Код: Выделить всё
#include <mega8.h>
#asm
.equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>
unsigned long int Numeric, NumericA, NumericB, a=1200, b=47;
void main(void)
{
ACSR=0x80;
SFIOR=0x00;
lcd_init(16);
while (1)
{
Numeric=((a/b)*1000)+(((a%b)*1000)/b); // 1200 / 47 = 25.531
NumericA=a/b; //целая часть
NumericB=((a%b)*1000)/b; // дробная часть
lcd_gotoxy(0,0);
lcd_putchar((Numeric/10000000)%10+0x30);
lcd_putchar((Numeric/1000000)%10+0x30);
lcd_putchar((Numeric/100000)%10+0x30);
lcd_putchar((Numeric/10000)%10+0x30);
lcd_putchar((Numeric/1000)%10+0x30);
lcd_putsf(".");
lcd_putchar((Numeric/100)%10+0x30);
lcd_putchar((Numeric/10)%10+0x30);
lcd_putchar(Numeric%10+0x30);
lcd_gotoxy(0,1);
lcd_putsf(" celoe=");
lcd_putchar((NumericA/10000)%10+0x30);
lcd_putchar((NumericA/1000)%10+0x30);
lcd_putchar((NumericA/100)%10+0x30);
lcd_putchar((NumericA/10)%10+0x30);
lcd_putchar(NumericA%10+0x30);
lcd_gotoxy(0,2);
lcd_putsf("drobnaja =");
lcd_putchar((NumericB/10000)%10+0x30);
lcd_putchar((NumericB/1000)%10+0x30);
lcd_putchar((NumericB/100)%10+0x30);
lcd_putchar((NumericB/10)%10+0x30);
lcd_putchar(NumericB%10+0x30);
lcd_gotoxy(0,3);
lcd_putsf("1200/47=25.531");
};
}

Re: Деление с остатком. CodeVision AVR с выводом на ЖКИ.
Добавлено: Чт июл 19, 2012 16:18:33
BCluster
Я рад конечно что получилось )) На sprintf памяти не хватает?) Получше бы выглядело )
Либо сделайте какой-то свой аналог и вынесите в отдельную функцию в которую будете передавать указатель на строку и ваше число, а потом выводить lcd_puts()
Re: Деление с остатком. CodeVision AVR с выводом на ЖКИ.
Добавлено: Чт июл 19, 2012 17:23:54
Garin
BCluster для моей задумки этого пока хватает (день умножения и деления, не прошел зря

)
спасибо

Re: Деление с остатком. CodeVision AVR с выводом на ЖКИ дроб
Добавлено: Пт июл 20, 2012 07:51:56
BCluster
Дело хозяйское - но я бы рекомендовал сразу приучаться делать правильно))
Re: Деление с остатком. CodeVision AVR с выводом на ЖКИ дроб
Добавлено: Пт июл 20, 2012 09:47:11
avreal
А если для printf-овской компании мало места, то я бы порекомендовал взять за основу
itoa, только заполнял бы буфер заведомо достаточного размера с конца и не ставил бы reverse в конце подпрограммы.
Перед преобразованием заполнить буфер пробелами, функция преобразования остановится, когда будет 0 и начало останется пробелами. Эта функция может возвращать индеск буфера, который она заполнила последним, это будет первый знак числа. Если нужно выводить без фиксированной ширині поля, то начинать с этого индекса.
После чего при выводе целого числа уже всё в порядке, а при выводе числа с фикс. точкой нужно отсчитать от конца буфера заданное число символов (три для данного примера) и в предыдущий символ вставить точку, а все перед ним сдвинуть ближе к началу буфера.
Получится довольно компактно и универсально.