Gå til innhold

Kalkulator med mer/mindre vektig


Anbefalte innlegg

Skrevet

God dag.

 

Har fått en oppgave på skolen om å lage en kalkulator som skal regne riktig med at 2+3*5 = 17 og ikke 25.

 

sliter litt med oppstarten her så lurte egentlig bare om noen har noen forslag til hvordan jeg kan gjøre dette!? :)

Å lage en kalkulator i seg selv er ikke noe problem, men det med at gang og dele, ifølge reglementet, skal gjøres først gjør ting litt vanskeligere. Man skal også ha mulighet til å gange og dele flere ganger forresten :)

 

Er altså ikke på jakt etter en ferdig løsning bare et lite "spark bak" ;)

 

Mvh. Sindre

Videoannonse
Annonse
Skrevet (endret)
Hint: Operatorprioritet. :whistle:

9295329[/snapback]

 

Hvordan er dette et spark bak?

 

EDIT: Trådstarter er jo klar over problemet, han sier det til og med indirekte når han sier "... skal regne riktig med at 2+3*5 = 17 og ikke 25." Han lurer vel på hvordan det kan gjøres.

Endret av Jaffe
Skrevet

I topicen skriver jeg også det med vektighet, så jeg er klar over det ja ;)

 

Lurer altså på hvordan jeg skal gjøre dette med å få kalkulatoren til FØRST regne ut 3*5 og DERETTER svar+2 :)

En kammerat vurderte noe sånnt som å putte alt inn i et array og deretter lese ut av dette og sette sammen regnestykket på riktig måte. Men jeg syntes det hørest forferdelig tungvindt ut og ikke at det blir helt riktig heller.. :(

Jah.. Et tips i riktig retning eller et forslag på hvordan løse problemt hadde vært kjekt :)

Skrevet

Hvis du bare leser inn all input først og så regner det på vanlig måte bør da dette gå fint..? Multiplikasjon og divisjon har jo høyere prioritet enn addisjon og subtraksjon i C++ også.

 

.. Mulig jeg misforstod litt.

Skrevet

Han skal jo skrive en kalkulator selv. Jeg ser ikke helt hvordan operatørpresedensen i C++ har noe å si da (med mindre C++ på mystisk vis kan kjøre noe som er list inn i et array? ...)

Skrevet

Jeg ser fortsatt ikke hvordan det skal gå. Hvordan skal dataene ligge i arrayet, og hvordan hjelper egentlig transform? Inndataene må fortsatt gjennomgås for å finne hva som skal gjøres først (* og /) osv., som egentlig bringer oss tilbake til utgangspunktet.

 

transform hadde kanskje egnet seg bedre om det bare var én operasjon som skulle utføres på en rekke tall.

Skrevet

Jeg tenkte at det kunne vært fint for meg å prøve dette også, for å lære litt, men for meg funker det med en gang.

 

Hvis du fortsatt sliter kan må du jo bare se på problemet rent matematisk da.

 

y = a+(b*c)

 

Bruk det formatet på formlen din og du får, med a = 2, b = 3 og c = 5, 17 som svar.

Skrevet

Jaffe: Jeg vet ikke helt hva du venter at jeg skal svare, men transform var et forslag -- ikke et svar. Trådstarter har gitt uttrykk for at han ønsker å løse oppgaven selv, så det var bare et tips til noe han muligens kunne bruke hvis han valgte å prøve å løse det med arrays.

Skrevet

Jeg mener den absolutt beste løsningen på et slikt problem er å opprette et binært tre over utregningen. Jeg mener dette er kjappest, og det "riktigste" måten å løse det på.

 

Wrestling? Binære trær er da ingen heksekunst. Red/black og slikt er værre, men de binære er da ikke noe hokus pokus.

Skrevet
Jeg mener den absolutt beste løsningen på et slikt problem er å opprette et binært tre over utregningen.
Javel, jeg mener ikke det.

 

Jeg mener dette er kjappest, og det "riktigste" måten å løse det på.

9313190[/snapback]

Det vel ikke noen "riktig" måte? Og mener du at det er kjappest og skrive, eller at programmet blir kjappest?

 

Dette virker ihvertfall, og hvis du klarer og lage et program der du bruker et tre som er både kortere og raskere blir jeg mektig imponert.

#include <iostream>

using namespace std;

string  input;
char    look;
int     pos;

void next_char() {
   look = input[pos];
   pos += 1;
}

double number() {
   double value = 0;
   while (look >= '0' && look <= '9') {
       value = 10*value + (look-'0');
       next_char();
   }
   return value;
}

double muldiv() {
   double value = number();
   while ('*' == look) {
       next_char();
       value *= muldiv();
   }
   while ('/' == look) {
       next_char();
       value /= muldiv();
   }
   return value;
}

double addsub() {
   double value = muldiv();
   while ('+' == look) {
       next_char();
       value += addsub();
   }
   while ('-' == look) {
       next_char();
       value -= addsub();
   }
   return value;
}

double eval(string expr) {
   input = expr;
   pos   = 0;
   next_char();
   return addsub();
}

int main() {
   cout << eval("2+3*5") << endl;
   cout << eval("3*5+2") << endl;
   system("pause");
   return EXIT_SUCCESS;
}

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...