Separera Hundratal, Tiotal och Ental.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Separera Hundratal, Tiotal och Ental.

Inlägg av PopUnoNkoK »

Jag behöver lite hjälp att bli pekad i rätt riktning.

Jag är på jakt efter att dela upp Hundratal, Tiotal och Ental för att sedan visa på 3 7 Segments leddisplayer.

Jag har tänkt att börja sätta samman en fil med macron som jag kan inkludera i mina projekt och där vore förstås denna funktion suverän.

Jag tror att jag har koll på Lookup tables, så nu är det att splitta talet som är problemet.

MVH Peter F
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Re: Separera Hundratal, Tiotal och Ental.

Inlägg av vfr »

Du dividerar med 10 eller 100. Antingen med intern divisionsinstruktion om det finns, eller med handjobb på samma sätt som man skulle gjort "för hand". T.ex bit för bit. Man också när det gäller så få antal som 10 (resultatet), subtrahera 10 eller hundra tills det inte går längre. Det kan ju då bli max 10 ggr och blir inte någon jätteloop.
sodjan
EF Sponsor
Inlägg: 43245
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Separera Hundratal, Tiotal och Ental.

Inlägg av sodjan »

Precis som vfr säger, du gör i stort sätt så som du skulle göra med papper och penna.
1. Hur många gånger kan du dra 100 från talet utan att det blir < 0 ?
2. Hur många gånger kan du dra 10 från resten från punkt 1 ?
3. Hur mycket har du kvar efter punkt 2 ?
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: Separera Hundratal, Tiotal och Ental.

Inlägg av PopUnoNkoK »

Nu fick jag saker att tänka på... :) Det låter juh verkligen som ett toppen jobb för ett macro.
Får testa att skriva ihop en kodsnutt, lägger säkert upp den här så ni får granska.

Tack för svaren

MVH Peter F
sodjan
EF Sponsor
Inlägg: 43245
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Separera Hundratal, Tiotal och Ental.

Inlägg av sodjan »

> Det låter juh verkligen som ett toppen jobb för ett macro.

Nja, jag skule nog säga att det är så pass mycket kod så att det är
lämpligare att lägga det som en subrutin. Däremot kan man ha ett macro
för själva anropet (som fixar till parametetrar i rätt register o.s.v) om
det underlättar. Eller, om det enbart är ett enda ställa i koden som
denna konvertering behövs, så kan man lägga det in-line, ett macro
eller en subrutin sparar då ingen kod. Å andra sidan så blir det då lite
knökigare att få till kod som lätt återanvänds...
bos
Inlägg: 2310
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: Separera Hundratal, Tiotal och Ental.

Inlägg av bos »

PopUnoNkoK skrev:så nu är det att splitta talet som är problemet.
Såhär gör jag:

Kod: Markera allt

char hundreds = tens = ones = 0;

while (number >= 100) {
    number -= 100;
    hundreds++;
}

while (number >= 10) {
    number -= 10;
    tens++;
}

ones = number;
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7443
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Separera Hundratal, Tiotal och Ental.

Inlägg av Marta »

Dela med tio och iterera tills kvoten blir noll.

Resten vid dessa divisioner är de eftersökta siffrorna, den minst signifikanta kommer först.

Denna metod lämpar sig bäst för större tal och om Du redan har en rutin för att utföra division.


Skall Du endast hantera 0..255 finns det snabba och instruktionssnålare algoritmer för detta. Leta på t.ex. piclist.
Senast redigerad av Marta 17 april 2009, 21:02:11, redigerad totalt 2 gånger.
bos
Inlägg: 2310
Blev medlem: 24 februari 2007, 23:29:15
Kontakt:

Re: Separera Hundratal, Tiotal och Ental.

Inlägg av bos »

Division med annat än tvåpotenser är dyrt på 8-bitarskretsar, men vi vet ju inte vilken artitektur författaren pular med så det kanske är en vettigare lösning än subtraktion.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7443
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Separera Hundratal, Tiotal och Ental.

Inlägg av Marta »

Sådär väldigt stökigt är det inte och seriesubtraktion är ju också ett slags division om än i förenklad form. Lika bra att ta steget först som sist och lära sig hantera lite beräkningar på processorn. Det öppnar upp för många intressanta projekt att ta sig över den tröskeln. Nybörjare är allt för ofta lite väl rädda för beräkningar, det är inte sååå svårt trots allt...
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: Separera Hundratal, Tiotal och Ental.

Inlägg av blueint »

Exempel:

Kod: Markera allt

int main(int ac, char *av[]) {
int     val=8265, n1000, n100, n10, n1;

n1000 = (val                           ) / 1000;  
n100  = (val-n1000*1000                ) /  100;
n10   = (val-n1000*1000-n100*100       ) /   10;
n1    = (val-n1000*1000-n100*100-n10*10) /    1;

printf("%d => %d %d %d %d\n", val, n1000, n100, n10, n1 );

return 0;
}
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Separera Hundratal, Tiotal och Ental.

Inlägg av jesse »

Om man använder högnivåspråk blir det ju inte något problem då man kan har massor av bra matematiska funktioner till hands och kan skriva formlerna direkt (som i exemplen ovan). Nackdelen med det är väl att det tar mycket utrymme i programminnet. Använder man assembler blir det mer "bitmanipulerande" och man får tänka lite grann när man använder ALU:n (arithmetic logic unit) i processorn. Det finns massor av kodexempel i assembler också, bara att googla - allt från enkla lösningar för två eller tre siffror till uttolkning av n-bitar långa heltal... T.ex. denna sidan. Ska man använda decimaler finns det många smarta trick. Ska jag presentera t.ex. en spänning i volt så representerar jag den som ett 16-bitars heltal i millivolt t.ex. då är 25500 = 25.5 volt. Då är det bara att sätta en punkt på rätt ställe så har du svaret (när du har omvandlat till BCD/ASCII/7segm-kod)

(EDIT: angav först fel länk, nu rättad)
bearing
Inlägg: 11670
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Separera Hundratal, Tiotal och Ental.

Inlägg av bearing »

Jag har mätt och jämfört divisionsmetoden med subtraktionsmetoed på en PIC16. Fick fram att subtraktionsmetoden går snabbast. Vilken som tog upp minst kodutrymme minns jag inte. Jag brukar använda subtraktionsmetoden, fast till hundratalet på 8bits-tal använder jag några If-satser bara, finns ju bara tre fall.
TotteBasicPic
Inlägg: 36
Blev medlem: 30 december 2008, 11:38:08
Ort: Halmstad

Re: Separera Hundratal, Tiotal och Ental.

Inlägg av TotteBasicPic »

blueint skrev:Exempel:

Kod: Markera allt

int main(int ac, char *av[]) {
int     val=8265, n1000, n100, n10, n1;

n1000 = (val                           ) / 1000;  
n100  = (val-n1000*1000                ) /  100;
n10   = (val-n1000*1000-n100*100       ) /   10;
n1    = (val-n1000*1000-n100*100-n10*10) /    1;

printf("%d => %d %d %d %d\n", val, n1000, n100, n10, n1 );

return 0;
}
Det bra exempel hur man inte skall göra i en pic för att spara tid.

I Basic kan det se ut så här.

Kod: Markera allt


Dim WALCAL AS WORD

DIM TUSETAL AS BIT.4

DIM HUNDTAL AS BIT.4

DIM HUNDTAL AS BIT.4

DIM TIOTAL AS BIT.4

DIM ENTAL AS BIT.4	

WALCAL = 3678
	
TUSETAL = WALCAL / 1000
	
WALCAL = WALCAL - TUSETAL * 1000
	
HUNDTAL = WALCAL / 100
	
WALCAL = WALCAL - HUNDTAL * 100
	
TIOTAL = WALCAL / 10 
	
ENTAL = WALCAL - TIOTAL * 10

Thomas
Användarvisningsbild
Icecap
Inlägg: 26628
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Separera Hundratal, Tiotal och Ental.

Inlägg av Icecap »

Egentligen är det ganska enkelt att omvandla vilket tal som helst till skrivbara tecken. Om man inte har ganska hårda hastighets- eller minneskrav fungerar det utmärkt i C att helt enkelt skriva ut "som vanligt" men ibland vill man ju slippa ta in stdio.h.

Då brukar jag göra såhär: (saxat direkt från ett PIC16F628A projekt)

Kod: Markera allt

  Length  = 0;
  while(Biggie > 0L) // Biggie är i detta fall en 32-bitars variabel
    {
    X1 = (byte)(Biggie % 10L) + '0'; // X1 är en arbetsbyte
    Buffer[Length++] = X1; // Buffer är en buffer som har plats till alla tecknen som kan behövas
    Biggie /= 10L;
    }
OBS: att siffrorna kommer att stå i omvänd ordning, alltså mest betydande sist.
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Re: Separera Hundratal, Tiotal och Ental.

Inlägg av PopUnoNkoK »

Skiit åxå att det bara kom en massa kodexempel i Högnivå språk. :)
Jag har fått tipset att börja med Assembler och det håller jag stenhårt fast vid. Det lockar dock att titta på C men det har jag beslutat att skjuta på framtiden.

I detta fall är det verkligen ingen tidskritisk applikation, en bastutermometer hade jag närmast i åtanke.

Tack för alla svar.
Skriv svar