Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Деление на 1000 и премахване на задните нули, как?
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=2782
Страница 1 от 1

Автор:  milenjs [ Нед Авг 20, 2006 11:26 am ]
Заглавие:  Деление на 1000 и премахване на задните нули, как?

Колеги наложи ми се да правя такова нещо от един масив с число в аски да направя друг масив но разделен на хиляда и премахнати задните нули, т.е - 1010 - 1,01; 455000 - 455; 34567 - 34,567. Направих го, но програмирането не ми е силна черта и ми изглежда много хамалски. Ако някой се сеща за по елегантен начин?

Код:
Dim Help As Byte
Dim i As Byte
Dim j As Byte
Dim Result_String[10] As Byte
Dim LcdStr[10] As Byte
Dim Result As DWord


here:
HRSin Dec Result
    StrN Result_String = Str$ (Dec Result)   
    Help = 0
    While Result_String[Help] <> 0  : Help = Help + 1 : Wend
    j = Help - 3   
     For i = 0 To Help
       If j = i Then
          LcdStr[i] = 44
       Else
          If j > i Then
             LcdStr[i] = Result_String[i]
          Else
             LcdStr[i] = Result_String[i-1]
          EndIf
       EndIf
     Next
    LcdStr[i]=0
    For i = Help To 0 Step -1
      If LcdStr[i] = 48 Then
         LcdStr[i] = 0
      Else
         If LcdStr[i] = 44 Then
            LcdStr[i] = 0
         EndIf
         Break
      EndIf
    Next
    Print At 1,1, Str LcdStr
GoTo here

Автор:  Nikola Kirov [ Нед Авг 20, 2006 12:02 pm ]
Заглавие: 

Ами то в някои други теми си говорихме и за тоя недостатък да ползваш подобията на език за програмиране.
Като ти потрябва помощ няма кой да помага.
Иначе като гледам дъжината на кода не е чак хамалско решението.

Сега Rumen сигурно ще се набере и ще ти напише сигурно друго решение да ме опровергае но това няма да промени ситуацията :)

Автор:  milenjs [ Нед Авг 20, 2006 3:01 pm ]
Заглавие: 

Не е чак най-подходящия език за сложни неща но за аматьори като мен върши работа, а и не остава време да се впусна в нещо по сериозно. То за това и програмите ми са някаква смесица 50/50 протон/асемблер...
Интересува ме подходящ алгоритъм без значение езика, важна е идеята, щот като гледам по някога елементарни хватки вършат работата на сумати писани ама въпроса е да се сетиш навреме...
Между другото тази задачка да си я напиша на асм ми е в пъти по лесно може би немога да се отуча да мисля на асм когато пиша нещо :(

Автор:  Реконструктор [ Пон Авг 21, 2006 10:18 am ]
Заглавие: 

Това не го разбрах. На примерите е просто делене на 1000.

Автор:  milenjs [ Пон Авг 21, 2006 10:45 am ]
Заглавие: 

Рек, така си е - просто деление на 1000 и премахване след това на задните нули + премахване на запетайката в стринга ако е последна, т.е. да не се получи примерно 12, .Не искам да ползвам обаче плаваща запетайка. Идеята ми в общи линии е следната - преброявам цифрите в стринга, от тях изваждам 3 и това число ми дава след коя цифра е запетайката. След това прехвърлям от началния стринг цифрите в изходния като поставям запетайката на вече известното и място. Накрая обшождам изходния стринг отзад напред и следя и премахвам нулите до първото число. При намирането му или намирането на запетая излизам и съм готов.
Работи си перфектно, но както казах ми се вижда хамалско решение... Нека някой програмист да предложи нещо по елегантно /най-вече с по-малко код/ че като гледам как заплашително ми свършва програмната памет :(

Автор:  Реконструктор [ Пон Авг 21, 2006 11:12 am ]
Заглавие: 

Ами по начало деленето на цели числа си дава пак цяло число?! :? Продължавам да не разбирам. Дай някакъв пример как би следвало да работи ф-ята.

Автор:  milenjs [ Пон Авг 21, 2006 11:28 am ]
Заглавие: 

22/7 не е цяло число. 123450 / 1000 = 123,450 на мен ми трябва като стринг "123,45". Това е идея обаче - да деля целочисленно на 1000 и да ползвам резултата и остатъка от делението. Дали обаче ще стане по компактно - трябва да се пробва.

Автор:  Реконструктор [ Пон Авг 21, 2006 11:40 am ]
Заглавие: 

В този бейсик няма ли ф-ята Format?

Автор:  milenjs [ Пон Авг 21, 2006 11:59 am ]
Заглавие: 

Цъ, няма нищо подходящо, търся принципно решение без готови функции

Автор:  logi [ Пет Авг 25, 2006 5:35 pm ]
Заглавие: 

А втория цикъл прави това за което е предназначен, щото аз като го гледам ми се струва че винаги дава само цялата част.

Автор:  milenjs [ Пет Авг 25, 2006 8:58 pm ]
Заглавие: 

Втория цикъл премахва излишните нули (аски 48) от дясно като терминира стринга с /0 докато стигне до първото число или ако поледното е запетайка (аски 44). Както казах кода си работи, върши работа и май ще остана на принципа че нещо което работи не се пипа /засега :D /

Автор:  logi [ Пет Авг 25, 2006 10:53 pm ]
Заглавие: 

Вярно, не бях обърнал внимание къде точно е break-а.
Аз бих го реализирал като при претърсването за края на низа намирам и къде е последната различна от 0 цифра. После цикъл за копиране на цифрите преди запетаята. Проверка дали позицията на последната различна от 0 цифра е по-голяма от позицията на запетаята, и ако е така добавяна на запетая и цикъл за копиране до позицията на последната различна от 0 цифра.
Това решение не е принципно по-просто, само подредбата е по-различна.

Автор:  milenjs [ Пет Авг 25, 2006 11:10 pm ]
Заглавие: 

Благодаря за идеята logi, и така става. Искаше ми се да видя такова решение че като го видеш да се плеснеш по главата и да кажеш брех мама му как лесно ставало а аз какво правя, но май за някои неща просто такова няма.... с тези изразни средства де.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/