Udfordring.?

Tags:    c++

Nu har jeg jo lavet den her lommeregner (med div. log o.s.v)
Så mit spørgsmål er: hvad nu?
Et lidt svære program at lave. (fx. noget der køre over nettet eller noget.)
Har selv IGEN idé om hvad keg skal lave. :|

Takker på forhånd :D



Lave en link bog, adresse bog eller andet som tager indput, behandler det og laver en html fil, xml fil eller andet. Gemmer det i en database, så man kan få det hevet ud i konsollen igen. Søge i det osv.



kan din lommeregner håndtere uktryk som:
5 + 4 * 2
eller:
7*2 + 6/2

og håndtere dem korrekt
?

hvis ikke, så er det ihvertfald en god udfordring.

skriv hvis du have et par hints, den er lidt tricky.

//Troels



Ja, kunne være en idé, MEN! Tror ikke man kan lave den her om:

Fold kodeboks ind/udKode 


Så skal man jo lave
"+, /"
"-, /"
"/,/"
"*, /".......... O.S.V



Indlæg senest redigeret d. 04.07.2006 02:12 af Bruger #10179
Vil også anbefale dig at lave sådan en lommeregner. Lavede en for ca. ½ år siden. Og den kan altid udvides;). Når du har regnet udtryk som 5*5-15/2, så prøv med 3^2+5!, derefter kan du prøve funktioner, konstanter og målenheder, som f.eks. 4*sin(62), eller (2cm)^2*PI.



hele ideen i en sådan lommeregner er at om formulerer regnestykket fra infix (almindelig notation, f.eks. 3 + 5*2) til postfix( her vil regnestykket se således ud: 5 2 * 3 +), prefix notation kan også bruges, du har således en liste med tal og operatorer, denne løber du så bare igennem, og hver gang du støder på et tal, så tilføjer du det til en liste (stak), og når du så støder på en operator tager du de 2 sidst tilføjede (de skal også fjernes fra listen), udfører operationen på disse, og tilføjer resultatet til listen. Når regnestykket er løbet er der, hvis regne er korrekt formateret, kun et tal i listen, nemlig facit.

hele problemet ligger så i at konvertere en infix notation til postfix.

kigger vi på regne hierakiet (kun de 4 regnearter) så har vi at:
+ og - //lag1
* og / //lag2

da vi skal gange og dividere før + og -, og både før og efter et + eller - må være * og /, så laver 3 funktioner:

void behandelLag1()
void behandelLag2()
void bahandelTal()

den sidste benyttes til at smide tallene ind.
jeg læser her regnestykket bagfra, bare så du ved det :)

bahandelLag1 virker således:
behandelLag2();//vi behandler da alt inden første
sålænge vi ikke har behandlet regnestykket færdigt, og det vi behandler ikke er en startparentes, så gør vi følgende:
hvis vi i regnestykket er kommet til enten plus eller
minus,gør vi følgende:
gem den operator vi var kommet til.
gør så det er det næste element i vores regnestykke vi
skal til at bearbejde.
behandelLag2();
tilføj den gemte operator til vores postfix liste.

det behandelLag1.

så kommer behandelLag2:
behandelTal();
hvis regnestykket ikke er tomt og det enten en * eller / operator vi er kommet til, gør:
gem den operator vi var kommet til.
gør så det er det næste element i vores regnestykke vi
skal til at bearbejde.
behandelTal();
tilføj den gemte operator til vores postfix liste.

det behandelLag2.

så kommer vi til den sidste, behandelTal:
hvis elementet i regnestykket vi er kommet til er et tal, tilføj det da til postfixlisten.
hvis elementet er en slutparantes, gør da:
gå videre til næste element i regnestykket.
behandelLag1();
gå videre til næste element i regnestykket (så vi ikke får start parentesen med, og det hele går i stå)


det var algoritmen, den kan nemt udvides til potensopløftning, BehandelLag2 kopieres da bare, og kaldes behandelLag3, og operatorerne udskiftes, og kaldene til behandelTal i funktionen behandelLag2 udskiftes med kald til behandelLag3 istedet.

det er en fed algoritme, her er et eksempel på en kørsel hos mig:
3*6+144/(15-3)
3 15 - 144 / 6 3 * +
30
først kommer mit regnestykke, så kommer maskinens omskrivning til postfix, og endeligt facit.

Jeg håber det kan give lidt inspiration, du skal være velkommen til at spørge igen.

mvh.
//Troels



t