Separera Hundratal, Tiotal och Ental.
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Separera Hundratal, Tiotal och Ental.
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
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
Re: Separera Hundratal, Tiotal och Ental.
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.
Re: Separera Hundratal, Tiotal och Ental.
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 ?
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 ?
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: Separera Hundratal, Tiotal och Ental.
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

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
Re: Separera Hundratal, Tiotal och Ental.
> 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...
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...
Re: Separera Hundratal, Tiotal och Ental.
Såhär gör jag:PopUnoNkoK skrev:så nu är det att splitta talet som är problemet.
Kod: Markera allt
char hundreds = tens = ones = 0;
while (number >= 100) {
number -= 100;
hundreds++;
}
while (number >= 10) {
number -= 10;
tens++;
}
ones = number;
Re: Separera Hundratal, Tiotal och Ental.
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.
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.
Re: Separera Hundratal, Tiotal och Ental.
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.
Re: Separera Hundratal, Tiotal och Ental.
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...
Re: Separera Hundratal, Tiotal och Ental.
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;
}
Re: Separera Hundratal, Tiotal och Ental.
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)
(EDIT: angav först fel länk, nu rättad)
Re: Separera Hundratal, Tiotal och Ental.
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.
-
- Inlägg: 36
- Blev medlem: 30 december 2008, 11:38:08
- Ort: Halmstad
Re: Separera Hundratal, Tiotal och Ental.
Det bra exempel hur man inte skall göra i en pic för att spara tid.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; }
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
Re: Separera Hundratal, Tiotal och Ental.
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)
OBS: att siffrorna kommer att stå i omvänd ordning, alltså mest betydande sist.
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;
}
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: Separera Hundratal, Tiotal och Ental.
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.

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.