Avatar billede simondid Nybegynder
13. februar 2011 - 15:24 Der er 36 kommentarer og
1 løsning

infix postfix hvad er det og hvordan kan jeg læse op på det

hey


så jeg er ved at lave en lomme regner og gerne skulle kunne lave de mest normale udregninger men kom ind i et problem så skrev jeg på et forum og fik at hvide jeg skulle bruge noget postfix infix noget nogle der kan fortælle mig hvordan jeg kan læse op på dette / lære at bruge det
Avatar billede heinzdmx Nybegynder
13. februar 2011 - 16:03 #1
Det er egentlig mere matematisk end det er java så vidt jeg kan se:
http://www.cs.man.ac.uk/~pjj/cs212/fix.html
Avatar billede simondid Nybegynder
13. februar 2011 - 16:08 #2
takker for svare vil lige prøve at kikke på det link du skrev

hvis der er nogle flere den kender nogle links et eller andet skrev pleas
Avatar billede simondid Nybegynder
13. februar 2011 - 16:20 #3
har så lige kikket lidt på link fint link til lige at forklar de basis i det nogle der kender nogle steder hvor man sådan lige lære at bruge dem sammen og sådan noget
Avatar billede arne_v Ekspert
13. februar 2011 - 17:50 #4
Pointen er at det er nemmere at udregne postfix end infix.

"(1+2)*(3+4)" er ikke nem at udregne.

"1 2 + 3 4 + *" er rimeligt nem at udregne.

vi tager 1 og smider på stakken - stakken ser ud som:

1

vi tager 2 og smider på stakken - stakken ser ud som:

2
1

vi tager + og tager de 2 øverste tal fra stakken og plusser og lægger resultatet på:

3

vi tager 3 og smider på stakken:

3
1

vi tager 4 og smider på stakken:

4
3
1

vi tager + og tager de 2 øverste tal fra stakken og plusser og lægger resultatet på:

7
3

vi tager * og tager de 2 øverste tal fra stakken og ganger og lægger resultatet på:

21
Avatar billede arne_v Ekspert
13. februar 2011 - 17:51 #5
Hvis du skal lære om den slags, så skal du igang med det.

Hvis du bare skal bruge det, så kan du finde noget færdigt og bruge.
Avatar billede simondid Nybegynder
13. februar 2011 - 18:13 #6
tak for svarene har endelig fået en til at skrive det til mig men vil også gerne selv lære de. men da han ikke gider lave mere for mig så må jeg selv skrive rasten


hans kode ser sådan her up





// ========================================= calculation handling start=======================
  private void init() {
          precedenceMap = new HashMap<Character, Integer>();
          precedenceMap.put('+', 1);
          precedenceMap.put('-', 1);
          precedenceMap.put('*', 2);
          precedenceMap.put('/', 2);
          precedenceMap.put('^', 3);
          precedenceMap.put('(', 0);
          precedenceMap.put(')', 0);
      }

      private boolean isOperator(char ch) {
          return precedenceMap.containsKey(ch);
      }

      private float parse(String aString) {

          StringBuilder operand = new StringBuilder();
          for (int i = 0; i < aString.length(); i++) {
            if (aString.charAt(i) >= '0' && aString.charAt(i) <= '9')
                operand.append(aString.charAt(i));
            else if (aString.charAt(i) == '.' && operand.length() == 0) {
                Toast.makeText(Calculator.this, "Error in Expression",
                      Toast.LENGTH_SHORT).show();
                return -1;
            } else if (aString.charAt(i) == '.' && operand.length() != 0)
                operand.append(aString.charAt(i));
            else if (isOperator(aString.charAt(i))) {
                if (operand.length() != 0) {
                  operandStack.push(Float.parseFloat(operand.toString()));
                  operand.delete(0, operand.length());
                }
                if (!operatorStack.empty())
                  precedence(aString.charAt(i));
                else
                  operatorStack.push(new Character(aString.charAt(i)));

            }
          }
          if (operand.length() > 0)
            operandStack.push(Float.parseFloat(operand.toString()));

          float value = evaluate();
          return value;
      }

      private void precedence(char operator) {
          Character nextOp = new Character(operator);
          Character currentOp = operatorStack.peek();
          if (precedenceMap.get(nextOp) < precedenceMap.get(currentOp)
                && nextOp != '(') {
            if (nextOp == ')') {
                while ((currentOp = operatorStack.pop()) != '(') {
                  evalHigher(currentOp);
                  nextOp = '~';
                }
            } else {
                currentOp = operatorStack.pop();
                evalHigher(currentOp);
            }

          }
          if (nextOp != '~')
            operatorStack.push(nextOp);
      }

      private void evalHigher(char currentOp) {
          float operand2 = operandStack.pop();
          float operand1 = operandStack.pop();

          if (currentOp == '*')
            operandStack.push(operand1 * operand2);
          else if (currentOp == '/')
            operandStack.push(operand1 / operand2);
          else if (currentOp == '^')
            operandStack.push((float) Math.pow(operand1, operand2));
          else if (currentOp == '+')
            operandStack.push(operand1 + operand2);
          else if (currentOp == '-')
            operandStack.push(operand1 - operand2);
      }

      private float evaluate() {

          float operand1, operand2;
          while (!operatorStack.empty()) {
            operand2 = operandStack.pop();
            operand1 = operandStack.pop();
            char op = operatorStack.pop();
            if (op == '+')
                operandStack.push(operand1 + operand2);
            else if (op == '-')
                operandStack.push(operand1 - operand2);
            else if (op == '*')
                operandStack.push(operand1 * operand2);
            else if (op == '/')
                operandStack.push(operand1 / operand2);
            else if (op == '^')
                operandStack.push((float) Math.pow(operand1, operand2));
          }
          if (operandStack.empty())
            return -1;
          return operandStack.pop();
      }

// ========================================= calculation handling slut=======================


og så sker det hele når en knap bliver trykket på
men denne kode i

operandStack = new Stack<Float>();
              operatorStack = new Stack<Character>();
              float value = parse(input.getText().toString().trim());
              Toast.makeText(Calculator.this, "Value = " + value,
                    Toast.LENGTH_SHORT).show();


men da der mangler en del ting så som support til -2+3 alsår minus tal og kvadrat rod er jeg selv nød til at lære det

så hvis i ænden gider lave det for mig eller hjælpe mig med at finde steder hvor jeg kan lære det
har selv været ved at google længe på enme men har ikke rigtig kunne finde noget desvære
Avatar billede Druesukker Nybegynder
13. februar 2011 - 19:03 #7
prøv at se på:
http://javabog.dk/OOP/kapitel7.jsp

Her forklarer jakob nordfalk hvordan man kan gøre med rekursion i afsnit 7.5.2 .

Men du skal erklære at du har tænkt dig at købe bogen før du må se afsnittet! Ps. det kan godt tage et stykke tid at forstå hvad der foregår, men sådan er det jo tit med algoritmer.
Avatar billede simondid Nybegynder
13. februar 2011 - 19:37 #8
tak for svaret vil lige kikke på det
Avatar billede simondid Nybegynder
14. februar 2011 - 16:25 #9
druesukker takker for svaret har kikket hele stykke 7 igemmen og har faktisk valgt at bruge det i min kode dog med lidt ændringer i nogle der ved hvordan man add support til ^ og kvadrat rod ?? kan godt find ud af at tildele supper for sin tan cos





      /**
      * Finder første position af en operator, f.eks +, -, * eller /.
      * Går uden om de operatorer, der er inde i en parentes.
      * Simplel løsning, der ikke tager højde for parenteser: udtryk.indexOf(tegn)
      */
      public static int findUdenforParenteser(char tegn, String udtryk)
      {
        int par = 0;
        for (int i = 0; i<udtryk.length(); i++)
        {
          char t = udtryk.charAt(i);
          if (t == tegn && par==0) return i; // tegn fundet udenfor parenteser!
          else if (t == '(') par++;          // vi går ind i en parentes
          else if (t == ')') par--;          // vi går ud af en parentes
        }
        return -1; // tegn ikke fundet udenfor parenteser
      }

      public static double beregn(String udtryk)
      {
        udtryk = udtryk.trim();                  // fjern overflødige blanktegn
        for (int opNr = 0; opNr < 4; opNr++)    // løb gennem de fire regnearter
        {
          char op = "+-*/".charAt(opNr);        // op er nu '+', '-', '*' eller '/'
          int pos = findUdenforParenteser(op,udtryk);
          if (pos > 0)                          // findes op i udtrykket?
          {
            String vs = udtryk.substring(0,pos); // ja, find venstresiden
            String hs = udtryk.substring(pos+1); // find højresiden

            double vsr = beregn(vs);            // beregn højresidens værdi
            System.out.println("beregn("+vs+") = "+vsr);

            double hsr = beregn(hs);            // beregn venstresidens værdi
            System.out.println("beregn("+hs+") = "+hsr);

            if (op == '+') return vsr + hsr;    // beregn resultat og returnér
            if (op == '-') return vsr - hsr;
            if (op == '*') return vsr * hsr;
            return vsr / hsr;
          }
        }
        // Hvis vi kommer herned kunne der ikkes dele op i flere operatorer
        if (udtryk.startsWith("(") && udtryk.endsWith(")"))  // parenteser omkring?
        {
          udtryk = udtryk.substring(1,udtryk.length()-1);    // fjern dem
          return beregn(udtryk);                              // beregn indmad
        }
        if (udtryk.startsWith("sin(") && udtryk.endsWith(")"))// sinus-funktion
        {
          udtryk = udtryk.substring(4,udtryk.length()-1);    // fjern 'sin(' og ')'
          double resultat = beregn(udtryk);                  // beregn parameteren
          System.out.println("beregn("+udtryk+") = "+resultat);
          return Math.sin(resultat);
        }
        if (udtryk.startsWith("tan(") && udtryk.endsWith(")"))// sinus-funktion
        {
          udtryk = udtryk.substring(4,udtryk.length()-1);    // fjern 'sin(' og ')'
          double resultat = beregn(udtryk);                  // beregn parameteren
          System.out.println("beregn("+udtryk+") = "+resultat);
          return Math.tan(resultat);
        }
        if (udtryk.startsWith("cos(") && udtryk.endsWith(")"))// sinus-funktion
        {
          udtryk = udtryk.substring(4,udtryk.length()-1);    // fjern 'sin(' og ')'
          double resultat = beregn(udtryk);                  // beregn parameteren
          System.out.println("beregn("+udtryk+") = "+resultat);
          return Math.cos(resultat);
        }
        // intet andet fundet - så må det være et tal!
        return Double.parseDouble(udtryk);
      }



det er den kode jeg bruger
en der mangler supper for kvadrat rod og ^
Avatar billede Druesukker Nybegynder
15. februar 2011 - 02:59 #10
Nu lavede jeg eksponenten ^ til dig fordi det var en god udfordring for mig. Gider ikke mere, jeg har allrede brugt alt for meget tid på det hehe. Det kan godt være at koden ikke er særligt pæn. Men jeg vil dog undskylde mig selv med at jeg kun har programmeret i 3 måneder...

// klasse der kan udregne formler med eksponent = ^, sin, +, - , * // og /
// kvadratrodden af x er det samme som x^0.5 og den tredje rod af // x er det samem som x^(1/3)
// du kan også bruge Math.sqrt(x) til kvadratRod pi får du med
// math.PI og euiters tal e
// får du med Math.E, ps jeg aner ikke hvordan man staver til
// euiters tal hehe
// du kan selv inføre cos, tan. Og alt andet du vil have med fx pi // osv.

public class Klasse1
{
  public static int findUdenforParenteser(char tegn, String udtryk)
  {
     
    int par = 0;
    for (int i = 0; i<udtryk.length(); i++)
    {
      char t = udtryk.charAt(i);
      if (t == tegn && par==0) return i;// tegn fundet udenfor
      else if (t == '(') par++;    // vi går ind i en parentes
      else if (t == ')') par--;  // vi går ud af en parentes
    }
    return -1; // tegn ikke fundet udenfor parenteser
  }

  public static double beregn(String udtryk)
  {
    udtryk = udtryk.trim();    // fjern overflødige blanktegn
   
    for (int opNr = 0; opNr < 5; opNr++)// løb gennem operatorerne
    {
      char op = "+-*/^".charAt(opNr); // op er nu '+', '-', '*'
// eller '/' eller '^'
      int pos = findUdenforParenteser(op,udtryk);
      if (pos > 0 && op != '^')  // findes op i udtrykket?
      {
        String vs = udtryk.substring(0,pos); //find venstresiden
        String hs = udtryk.substring(pos+1); // find højresiden
       
        double vsr = beregn(vs);           
        System.out.println("beregn("+vs+") = "+vsr);
       
        double hsr = beregn(hs);           
        System.out.println("beregn("+hs+") = "+hsr);

        if (op == '+') return vsr + hsr;// beregn og returner
        if (op == '-') return vsr - hsr;
        if (op == '*') return vsr * hsr;
        return vsr / hsr;
      }
      // hvis op er '^' skal dette udføres
      else if (pos > 0 && op == '^'){
        // dette er midlertidigt venstresiden, men bliver til
        // basen/grundtallet/roden senere
          String base = udtryk.substring(0,pos);
          String vs;    // dette bliver til venstresiden senere
          double baseTal;
         
          base.trim();
         
          if (base.endsWith(")")){
             
              int højrePar = 0;
              int startPar = 0;
             
              outerLoop:
    for(int counter = base.length(); counter > 0; --counter){
    if (base.substring(counter-1, counter).equals(")")){
                      højrePar++;
        }else if(base.substring(counter-1, counter).equals("(")){
                      højrePar--;
                      if (højrePar == 0){
                          startPar = counter - 1;
                          break outerLoop;
                      }
                  }
              }
             
              try{   
    if (base.substring(startPar - 3, startPar).equals("sin") ||
        base.substring(startPar - 3, startPar).equals("tan")){
    // tilføj evt flere med .equals fx sqrt (for kvadratrod)
        vs = base.substring(0, startPar - 3);
        base = base.substring(startPar - 3);
                 
    }else{
              vs = base.substring(0, startPar);
              base = base.substring(startPar);
            }
              }catch (StringIndexOutOfBoundsException ex){
                  vs = vs = base.substring(0, startPar);
                  base = base.substring(startPar);
                  ex.printStackTrace();
              }
             
              baseTal = beregn(base);
    System.out.println("beregn("+base+") = "+baseTal);
             
          }else{
              int plus = base.lastIndexOf("+");
              int minus = base.lastIndexOf("-");
              int gange = base.lastIndexOf("*");
              int divider = base.lastIndexOf("/");
             
            int sidsteOperator = Math.max(plus, Math.max(minus, Math.max(gange, divider)));
             
              if (sidsteOperator != -1){
                  vs = base.substring(0, sidsteOperator+1);
                  base = base.substring(sidsteOperator+1);
                  baseTal = Double.parseDouble(base);
            System.out.println("Base fundet: "+baseTal);
              }else{
                  vs = "";
                  baseTal = Double.parseDouble(base);
        System.out.println("Base fundet: "+baseTal);
              }
             
          }
         
        // her har vi venstresiden med en operator til sidst
// og jeg vi basen til eksponenten som jeg finder nu
         
  String eksponent = udtryk.substring(pos+1); // find højresiden
          eksponent.trim();
          String hs; // bliver til højresiden senere
          double eksponentTal;
         
         
         
          if (eksponent.startsWith("(") || eksponent.startsWith("sin") || eksponent.startsWith("tan")){
             
              int venstrePar = 0;
              int slutPar = 0;
             
              outerLoop:
  for(int counter = 0; counter < eksponent.length(); ++counter){
  if (eksponent.substring(counter, counter+1).equals("(")){
            venstrePar++;
  }else if(eksponent.substring(counter, counter+1).equals(")")){
                      venstrePar--;
                      if (venstrePar == 0){
                          slutPar = counter;
                          break outerLoop;
                      }
                  }
              }
             
              hs = eksponent.substring(slutPar+1);
              eksponent = eksponent.substring(0, slutPar+1);
             
              System.out.println("Eksponenten er: "+eksponent);
             
              eksponentTal = beregn(eksponent);
              System.out.println("beregn("+eksponent+") = "+eksponentTal);
             
          }else{
              int plus = base.lastIndexOf("+");
              int minus = base.lastIndexOf("-");
              int gange = base.lastIndexOf("*");
              int divider = base.lastIndexOf("/");
             
              int sidsteOperator = Math.max(plus, Math.max(minus, Math.max(gange, divider)));
             
              if (sidsteOperator != -1){
                  hs = eksponent.substring(sidsteOperator);
        eksponent = eksponent.substring(0, sidsteOperator);
        eksponentTal = Double.parseDouble(eksponent);
  System.out.println("eksponent fundet: "+eksponentTal);
            }else{
                  hs = "";
                  eksponentTal = Double.parseDouble(eksponent);
        System.out.println("eksponent fundet: "+eksponentTal);
              }

          }
 
  // her kændes base og eksponent samt højreside og venstreside
          // det hele lægges sammen
         
          double sum = Math.pow(baseTal, eksponentTal);

          String nytUdtryk = String.format("%s%f%s", vs,sum,hs);
         
          return beregn(nytUdtryk.replace(",","."));
      }
    }
// Hvis vi kommer herned kunne der ikkes dele op i flere operatorer
    if (udtryk.startsWith("(") && udtryk.endsWith(")")) 
// parenteser omkring?
    {
      udtryk = udtryk.substring(1,udtryk.length()-1);   
// fjern dem
      return beregn(udtryk);                             
// beregn indmad
    }
    if (udtryk.startsWith("sin(") && udtryk.endsWith(")"))
// sinus-funktion
    {
      udtryk = udtryk.substring(4,udtryk.length()-1);   
// fjern 'sin(' og ')'
      double resultat = beregn(udtryk);                 
// beregn parameteren
      System.out.println("beregn("+udtryk+") = "+resultat);
      return Math.sin(resultat);
    }
    // intet andet fundet - så må det være et tal!
    return Double.parseDouble(udtryk);
  }

  public static void main(String[] arg)
  {
// formel her:

    String formel = "1.1*(2+sin(0.22341*4-4+    (2/4)-2*14)+sin(1))^sin(1+sin(2))*1.2356";
   
    double værdi = beregn(formel);
  System.out.println("Formlen "+formel+" er beregnet til "+værdi);
  }
}
Avatar billede simondid Nybegynder
15. februar 2011 - 08:34 #11
hey kan ikke rigtig få din kode til at virke har du testet den??

error er

Exception in thread "main" java.lang.NoClassDefFoundError: main$Formelberegning
Caused by: java.lang.ClassNotFoundException: main$Formelberegning
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Avatar billede heinzdmx Nybegynder
15. februar 2011 - 11:39 #12
@simondid
Din fejl lyder som en typisk Eclipse fejl.

Hvis du bruger Eclipse så vælg Project -> Clean project

Hvis ikke, så er det vist noget med din classpath.
Avatar billede simondid Nybegynder
15. februar 2011 - 11:43 #13
tror sku også der er fejl i koden da exlipse ser nogle fejl omkring static og sådan noget

når jeg bare kopi paster den ind
Avatar billede heinzdmx Nybegynder
15. februar 2011 - 12:25 #14
Så skal du fjerne static ud fra de metoder der er static på.
Avatar billede simondid Nybegynder
15. februar 2011 - 12:36 #15
ved ikke om koden kan køre ved dig men stadig samme fejl ved mig
Avatar billede Druesukker Nybegynder
15. februar 2011 - 13:03 #16
Har du husket at ændre navnet på public class Klasse1 til samme navn som din .java fil? Jeg bruger også eclipse..
Avatar billede simondid Nybegynder
15. februar 2011 - 13:25 #17
jep

stadig den samme fejl

Exception in thread "main" java.lang.NoClassDefFoundError: main$Formelberegning
Caused by: java.lang.ClassNotFoundException: main$Formelberegning
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Avatar billede heinzdmx Nybegynder
15. februar 2011 - 13:31 #18
Hvad med at lave et nyt projekt og prøve i det?

Har løst problemer jeg har haft af den slags.
Avatar billede simondid Nybegynder
15. februar 2011 - 15:16 #19
okay det løste så mit problem mange tak nogle der kan gemme sku hvordan man så add cos og tan kan ikke lige selv regne det ud.

men fik da goden til at virke dog med en fejl meling i


java.lang.StringIndexOutOfBoundsException: String index out of range: -3
    at java.lang.String.substring(String.java:1931)
    at klasse1.beregn(klasse1.java:80)
    at klasse1.beregn(klasse1.java:40)
    at klasse1.beregn(klasse1.java:43)
    at klasse1.main(klasse1.java:216)
beregn(1.1) = 1.1
beregn(2) = 2.0
beregn(0.22341) = 0.22341
beregn(4) = 4.0
beregn(0.22341*4) = 0.89364
beregn(4) = 4.0
beregn(0.22341*4-4) = -3.10636
beregn(2) = 2.0
beregn(4) = 4.0
beregn((2/4)) = 0.5
beregn(2) = 2.0
beregn(14) = 14.0
beregn(2*14) = 28.0
beregn((2/4)-2*14) = -27.5
beregn(0.22341*4-4+(2/4)-2*14) = -30.60636
beregn(sin(0.22341*4-4+(2/4)-2*14)) = 0.7239882335168203
beregn(1) = 1.0
beregn(sin(1)) = 0.8414709848078965
beregn(sin(0.22341*4-4+(2/4)-2*14)+sin(1)) = 1.5654592183247167
beregn((2+sin(0.22341*4-4+(2/4)-2*14)+sin(1))) = 3.5654592183247167
Eksponenten er: sin(1+sin(2))
beregn(1) = 1.0
beregn(2) = 2.0
beregn(sin(2)) = 0.9092974268256817
beregn(1+sin(2)) = 1.9092974268256817
beregn(sin(1+sin(2))) = 0.9432534700895335
beregn((2+sin(0.22341*4-4+(2/4)-2*14)+sin(1))^sin(1+sin(2))) = 3.317301
beregn(1.2356) = 1.2356
beregn((2+sin(0.22341*4-4+(2/4)-2*14)+sin(1))^sin(1+sin(2))*1.2356) = 4.0988571156
Formlen 1.1*(2+sin(0.22341*4-4+(2/4)-2*14)+sin(1))^sin(1+sin(2))*1.2356 er beregnet til 4.508742827160001



men resultatet er rigtig nok
Avatar billede Druesukker Nybegynder
15. februar 2011 - 15:20 #20
Jeg satte den til at lave fejlmeldingen så du kunne se hvad der skete hele vejen igennem koden..

Du kan fjerne meldingen ved at fjerne ex.printStackTrace() i blokken catch.
Avatar billede simondid Nybegynder
15. februar 2011 - 15:31 #21
haha nice nok :-) :-)

fik også ligge ligt sin cos tan ind tog rimlig lang tid at forstå din kode men kunne til sidst med lidt meget copy past lagt dem ind
Avatar billede heinzdmx Nybegynder
15. februar 2011 - 15:39 #22
Så ville det jo være dejligt hvis du kunne dele den kode du fandt frem til .. :)
Avatar billede simondid Nybegynder
15. februar 2011 - 15:39 #23
beklager double post

men pi sage du jeg også kunne ligge ind nu sker pi udregning jo ikke på samme måde som tan cos sin ?? kan ikke lige regne det ud
Avatar billede Druesukker Nybegynder
15. februar 2011 - 15:40 #24
Det var da godt. Har du husket at tilføje cos til

if (eksponent.startsWith("(") || eksponent.startsWith("sin") || eksponent.startsWith("tan"))

Der er et andet sted hvor du også skal gøre det for at koden kommer til at virke korrekt.

men det er jo bare på samme måde som ved tan og sin
Avatar billede simondid Nybegynder
15. februar 2011 - 15:42 #25
beklager double post


her er den kode med sin cos tan support


// klasse der kan udregne formler med eksponent = ^, sin, +, - , * // og /
// kvadratrodden af x er det samme som x^0.5 og den tredje rod af // x er det samem som x^(1/3)
// du kan også bruge Math.sqrt(x) til kvadratRod pi får du med
// math.PI og euiters tal e
// får du med Math.E, ps jeg aner ikke hvordan man staver til
// euiters tal hehe
// du kan selv inføre cos, tan. Og alt andet du vil have med fx pi // osv.

public class klasse1
{
  public static int findUdenforParenteser(char tegn, String udtryk)
  {
     
    int par = 0;
    for (int i = 0; i<udtryk.length(); i++)
    {
      char t = udtryk.charAt(i);
      if (t == tegn && par==0) return i;// tegn fundet udenfor
      else if (t == '(') par++;    // vi går ind i en parentes
      else if (t == ')') par--;  // vi går ud af en parentes
    }
    return -1; // tegn ikke fundet udenfor parenteser
  }

  public static double beregn(String udtryk)
  {
    udtryk = udtryk.trim();    // fjern overflødige blanktegn
   
    for (int opNr = 0; opNr < 5; opNr++)// løb gennem operatorerne
    {
      char op = "+-*/^".charAt(opNr); // op er nu '+', '-', '*'
// eller '/' eller '^'
      int pos = findUdenforParenteser(op,udtryk);
      if (pos > 0 && op != '^')  // findes op i udtrykket?
      {
        String vs = udtryk.substring(0,pos); //find venstresiden
        String hs = udtryk.substring(pos+1); // find højresiden
       
        double vsr = beregn(vs);           
        System.out.println("beregn("+vs+") = "+vsr);
       
        double hsr = beregn(hs);           
        System.out.println("beregn("+hs+") = "+hsr);

        if (op == '+') return vsr + hsr;// beregn og returner
        if (op == '-') return vsr - hsr;
        if (op == '*') return vsr * hsr;
        return vsr / hsr;
      }
      // hvis op er '^' skal dette udføres
      else if (pos > 0 && op == '^'){
        // dette er midlertidigt venstresiden, men bliver til
        // basen/grundtallet/roden senere
          String base = udtryk.substring(0,pos);
          String vs;    // dette bliver til venstresiden senere
          double baseTal;
         
          base.trim();
         
          if (base.endsWith(")")){
             
              int højrePar = 0;
              int startPar = 0;
             
              outerLoop:
    for(int counter = base.length(); counter > 0; --counter){
    if (base.substring(counter-1, counter).equals(")")){
                      højrePar++;
        }else if(base.substring(counter-1, counter).equals("(")){
                      højrePar--;
                      if (højrePar == 0){
                          startPar = counter - 1;
                          break outerLoop;
                      }
                  }
              }
             
              try{   
    if (base.substring(startPar - 3, startPar).equals("sin") ||
        base.substring(startPar - 3, startPar).equals("cos")||
        base.substring(startPar - 3, startPar).equals("tan")||
        base.substring(startPar - 3, startPar).equals("&#960;")){
    // tilføj evt flere med .equals fx sqrt (for kvadratrod)
        vs = base.substring(0, startPar - 3);
        base = base.substring(startPar - 3);
                 
    }else{
              vs = base.substring(0, startPar);
              base = base.substring(startPar);
            }
              }catch (StringIndexOutOfBoundsException ex){
                  vs = vs = base.substring(0, startPar);
                  base = base.substring(startPar);
                  ex.printStackTrace();
              }
             
              baseTal = beregn(base);
    System.out.println("beregn("+base+") = "+baseTal);
             
          }else{
              int plus = base.lastIndexOf("+");
              int minus = base.lastIndexOf("-");
              int gange = base.lastIndexOf("*");
              int divider = base.lastIndexOf("/");
             
            int sidsteOperator = Math.max(plus, Math.max(minus, Math.max(gange, divider)));
             
              if (sidsteOperator != -1){
                  vs = base.substring(0, sidsteOperator+1);
                  base = base.substring(sidsteOperator+1);
                  baseTal = Double.parseDouble(base);
            System.out.println("Base fundet: "+baseTal);
              }else{
                  vs = "";
                  baseTal = Double.parseDouble(base);
        System.out.println("Base fundet: "+baseTal);
              }
             
          }
         
        // her har vi venstresiden med en operator til sidst
// og jeg vi basen til eksponenten som jeg finder nu
         
  String eksponent = udtryk.substring(pos+1); // find højresiden
          eksponent.trim();
          String hs; // bliver til højresiden senere
          double eksponentTal;
         
         
         
          if (eksponent.startsWith("(") || eksponent.startsWith("sin") || eksponent.startsWith("tan")|| eksponent.startsWith("cos")){
             
              int venstrePar = 0;
              int slutPar = 0;
             
              outerLoop:
  for(int counter = 0; counter < eksponent.length(); ++counter){
  if (eksponent.substring(counter, counter+1).equals("(")){
            venstrePar++;
  }else if(eksponent.substring(counter, counter+1).equals(")")){
                      venstrePar--;
                      if (venstrePar == 0){
                          slutPar = counter;
                          break outerLoop;
                      }
                  }
              }
             
              hs = eksponent.substring(slutPar+1);
              eksponent = eksponent.substring(0, slutPar+1);
             
              System.out.println("Eksponenten er: "+eksponent);
             
              eksponentTal = beregn(eksponent);
              System.out.println("beregn("+eksponent+") = "+eksponentTal);
             
          }else{
              int plus = base.lastIndexOf("+");
              int minus = base.lastIndexOf("-");
              int gange = base.lastIndexOf("*");
              int divider = base.lastIndexOf("/");
             
              int sidsteOperator = Math.max(plus, Math.max(minus, Math.max(gange, divider)));
             
              if (sidsteOperator != -1){
                  hs = eksponent.substring(sidsteOperator);
        eksponent = eksponent.substring(0, sidsteOperator);
        eksponentTal = Double.parseDouble(eksponent);
  System.out.println("eksponent fundet: "+eksponentTal);
            }else{
                  hs = "";
                  eksponentTal = Double.parseDouble(eksponent);
        System.out.println("eksponent fundet: "+eksponentTal);
              }

          }
 
  // her kændes base og eksponent samt højreside og venstreside
          // det hele lægges sammen
         
          double sum = Math.pow(baseTal, eksponentTal);

          String nytUdtryk = String.format("%s%f%s", vs,sum,hs);
         
          return beregn(nytUdtryk.replace(",","."));
      }
    }
// Hvis vi kommer herned kunne der ikkes dele op i flere operatorer
    if (udtryk.startsWith("(") && udtryk.endsWith(")")) 
// parenteser omkring?
    {
      udtryk = udtryk.substring(1,udtryk.length()-1);   
// fjern dem
      return beregn(udtryk);                             
// beregn indmad
    }
    if (udtryk.startsWith("sin(") && udtryk.endsWith(")"))
// sinus-funktion
    {
      udtryk = udtryk.substring(4,udtryk.length()-1);   
// fjern 'sin(' og ')'
      double resultat = beregn(udtryk);                 
// beregn parameteren
      System.out.println("beregn("+udtryk+") = "+resultat);
      return Math.sin(resultat);
    }
    if (udtryk.startsWith("cos(") && udtryk.endsWith(")"))
        // sinus-funktion
            {
              udtryk = udtryk.substring(4,udtryk.length()-1);   
        // fjern 'sin(' og ')'
              double resultat = beregn(udtryk);                 
        // beregn parameteren
              System.out.println("beregn("+udtryk+") = "+resultat);
              return Math.cos(resultat);
            }
   
    if (udtryk.startsWith("tan(") && udtryk.endsWith(")"))
        // sinus-funktion
            {
              udtryk = udtryk.substring(4,udtryk.length()-1);   
        // fjern 'sin(' og ')'
              double resultat = beregn(udtryk);                 
        // beregn parameteren
              System.out.println("beregn("+udtryk+") = "+resultat);
              return Math.tan(resultat);
            }

    // intet andet fundet - så må det være et tal!
    return Double.parseDouble(udtryk);
  }

  public static void main(String[] arg)
  {
// formel her:

    String formel = "1.1*(2+cos(0.22341*4-4+(2/4)-2*14)+tan(1))^sin(1+sin(2))*1.2356^5";
   
    double værdi = beregn(formel);
  System.out.println("Formlen "+formel+" er beregnet til "+værdi);
  }
}



hvorfor er der ikke code block i det her forum :-(
Avatar billede Druesukker Nybegynder
15. februar 2011 - 15:46 #26
pi kan du fx skrive ved pi() og gøre på præcist samme måde som med tan og cos
Avatar billede Druesukker Nybegynder
15. februar 2011 - 15:51 #27
base.substring(startPar - 2, startPar).equals("pi"))

Husk at det skal være minus 2 ellers skal du skrive

base.substring(startPar - 3, startPar).equals("pi("))
Avatar billede Druesukker Nybegynder
15. februar 2011 - 16:01 #28
nej nummer 2 med "pi(" kan du ikke bruge den skal være

base.substring(startPar - 2, startPar+1).equals("pi("))
hvis det skal virke.
Avatar billede simondid Nybegynder
15. februar 2011 - 16:01 #29
fuck tråden går hurtigt lig pt skal nok sørge for at alle der har hjulpet skal få nogle flere points


har lige et lille problem med pi funktionen


if (udtryk.startsWith("pi(") && udtryk.endsWith(")"))
        // sinus-funktion
            {
              udtryk = udtryk.substring(4,udtryk.length()-1);   
        // fjern 'sin(' og ')'
              double resultat = beregn(udtryk);                 
        // beregn parameteren
              System.out.println("beregn("+udtryk+") = "+resultat);
              return Math.pi(resultat);
            }


få en fejl på              return Math.pi(resultat);
som siger at the method pi(double) is undefined  for the math type

men skulle ellers mene har jeg fået indført det
Avatar billede simondid Nybegynder
15. februar 2011 - 16:21 #30
hey


har så lige kikket på det er math.pi noget og tror jeg fandt en løsning  med at sige

              return Math.PI * resultat;


men nu får jeg en number formath exception
Exception in thread "main" java.lang.NumberFormatException: empty String
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:994)
    at java.lang.Double.parseDouble(Double.java:510)
    at klasse1.beregn(klasse1.java:242)
    at klasse1.beregn(klasse1.java:234)
    at klasse1.main(klasse1.java:251)

her er min kode

// klasse der kan udregne formler med eksponent = ^, sin, +, - , * // og /
// kvadratrodden af x er det samme som x^0.5 og den tredje rod af // x er det samem som x^(1/3)
// du kan også bruge Math.sqrt(x) til kvadratRod pi får du med
// math.PI og euiters tal e
// får du med Math.E, ps jeg aner ikke hvordan man staver til
// euiters tal hehe
// du kan selv inføre cos, tan. Og alt andet du vil have med fx pi // osv.

public class klasse1
{
  public static int findUdenforParenteser(char tegn, String udtryk)
  {
     
    int par = 0;
    for (int i = 0; i<udtryk.length(); i++)
    {
      char t = udtryk.charAt(i);
      if (t == tegn && par==0) return i;// tegn fundet udenfor
      else if (t == '(') par++;    // vi går ind i en parentes
      else if (t == ')') par--;  // vi går ud af en parentes
    }
    return -1; // tegn ikke fundet udenfor parenteser
  }

  public static double beregn(String udtryk)
  {
    udtryk = udtryk.trim();    // fjern overflødige blanktegn
   
    for (int opNr = 0; opNr < 5; opNr++)// løb gennem operatorerne
    {
      char op = "+-*/^".charAt(opNr); // op er nu '+', '-', '*'
// eller '/' eller '^'
      int pos = findUdenforParenteser(op,udtryk);
      if (pos > 0 && op != '^')  // findes op i udtrykket?
      {
        String vs = udtryk.substring(0,pos); //find venstresiden
        String hs = udtryk.substring(pos+1); // find højresiden
       
        double vsr = beregn(vs);           
        System.out.println("beregn("+vs+") = "+vsr);
       
        double hsr = beregn(hs);           
        System.out.println("beregn("+hs+") = "+hsr);

        if (op == '+') return vsr + hsr;// beregn og returner
        if (op == '-') return vsr - hsr;
        if (op == '*') return vsr * hsr;
        return vsr / hsr;
      }
      // hvis op er '^' skal dette udføres
      else if (pos > 0 && op == '^'){
        // dette er midlertidigt venstresiden, men bliver til
        // basen/grundtallet/roden senere
          String base = udtryk.substring(0,pos);
          String vs;    // dette bliver til venstresiden senere
          double baseTal;
         
          base.trim();
         
          if (base.endsWith(")")){
             
              int højrePar = 0;
              int startPar = 0;
             
              outerLoop:
    for(int counter = base.length(); counter > 0; --counter){
    if (base.substring(counter-1, counter).equals(")")){
                      højrePar++;
        }else if(base.substring(counter-1, counter).equals("(")){
                      højrePar--;
                      if (højrePar == 0){
                          startPar = counter - 1;
                          break outerLoop;
                      }
                  }
              }
             
              try{   
    if (base.substring(startPar - 3, startPar).equals("sin") ||
        base.substring(startPar - 3, startPar).equals("cos")||
        base.substring(startPar - 3, startPar).equals("tan")||
        base.substring(startPar - 2, startPar+1).equals("pi(")){
    // tilføj evt flere med .equals fx sqrt (for kvadratrod)
        vs = base.substring(0, startPar - 3);
        base = base.substring(startPar - 3);
                 
    }else{
              vs = base.substring(0, startPar);
              base = base.substring(startPar);
            }
              }catch (StringIndexOutOfBoundsException ex){
                  vs = vs = base.substring(0, startPar);
                  base = base.substring(startPar);
                  ex.printStackTrace();
              }
             
              baseTal = beregn(base);
    System.out.println("beregn("+base+") = "+baseTal);
             
          }else{
              int plus = base.lastIndexOf("+");
              int minus = base.lastIndexOf("-");
              int gange = base.lastIndexOf("*");
              int divider = base.lastIndexOf("/");
             
            int sidsteOperator = Math.max(plus, Math.max(minus, Math.max(gange, divider)));
             
              if (sidsteOperator != -1){
                  vs = base.substring(0, sidsteOperator+1);
                  base = base.substring(sidsteOperator+1);
                  baseTal = Double.parseDouble(base);
            System.out.println("Base fundet: "+baseTal);
              }else{
                  vs = "";
                  baseTal = Double.parseDouble(base);
        System.out.println("Base fundet: "+baseTal);
              }
             
          }
         
        // her har vi venstresiden med en operator til sidst
// og jeg vi basen til eksponenten som jeg finder nu
         
  String eksponent = udtryk.substring(pos+1); // find højresiden
          eksponent.trim();
          String hs; // bliver til højresiden senere
          double eksponentTal;
         
         
         
          if (eksponent.startsWith("(") || eksponent.startsWith("sin") || eksponent.startsWith("tan")|| eksponent.startsWith("cos")|| eksponent.startsWith("pi")){
             
              int venstrePar = 0;
              int slutPar = 0;
             
              outerLoop:
  for(int counter = 0; counter < eksponent.length(); ++counter){
  if (eksponent.substring(counter, counter+1).equals("(")){
            venstrePar++;
  }else if(eksponent.substring(counter, counter+1).equals(")")){
                      venstrePar--;
                      if (venstrePar == 0){
                          slutPar = counter;
                          break outerLoop;
                      }
                  }
              }
             
              hs = eksponent.substring(slutPar+1);
              eksponent = eksponent.substring(0, slutPar+1);
             
              System.out.println("Eksponenten er: "+eksponent);
             
              eksponentTal = beregn(eksponent);
              System.out.println("beregn("+eksponent+") = "+eksponentTal);
             
          }else{
              int plus = base.lastIndexOf("+");
              int minus = base.lastIndexOf("-");
              int gange = base.lastIndexOf("*");
              int divider = base.lastIndexOf("/");
             
              int sidsteOperator = Math.max(plus, Math.max(minus, Math.max(gange, divider)));
             
              if (sidsteOperator != -1){
                  hs = eksponent.substring(sidsteOperator);
        eksponent = eksponent.substring(0, sidsteOperator);
        eksponentTal = Double.parseDouble(eksponent);
  System.out.println("eksponent fundet: "+eksponentTal);
            }else{
                  hs = "";
                  eksponentTal = Double.parseDouble(eksponent);
        System.out.println("eksponent fundet: "+eksponentTal);
              }

          }
 
  // her kændes base og eksponent samt højreside og venstreside
          // det hele lægges sammen
         
          double sum = Math.pow(baseTal, eksponentTal);

          String nytUdtryk = String.format("%s%f%s", vs,sum,hs);
         
          return beregn(nytUdtryk.replace(",","."));
      }
    }
// Hvis vi kommer herned kunne der ikkes dele op i flere operatorer
    if (udtryk.startsWith("(") && udtryk.endsWith(")")) 
// parenteser omkring?
    {
      udtryk = udtryk.substring(1,udtryk.length()-1);   
// fjern dem
      return beregn(udtryk);                             
// beregn indmad
    }
    if (udtryk.startsWith("sin(") && udtryk.endsWith(")"))
// sinus-funktion
    {
      udtryk = udtryk.substring(4,udtryk.length()-1);   
// fjern 'sin(' og ')'
      double resultat = beregn(udtryk);                 
// beregn parameteren
      System.out.println("beregn("+udtryk+") = "+resultat);
      return Math.sin(resultat);
    }
    if (udtryk.startsWith("cos(") && udtryk.endsWith(")"))
        // sinus-funktion
            {
              udtryk = udtryk.substring(4,udtryk.length()-1);   
        // fjern 'sin(' og ')'
              double resultat = beregn(udtryk);                 
        // beregn parameteren
              System.out.println("beregn("+udtryk+") = "+resultat);
              return Math.cos(resultat);
            }
   
    if (udtryk.startsWith("tan(") && udtryk.endsWith(")"))
        // sinus-funktion
            {
              udtryk = udtryk.substring(4,udtryk.length()-1);   
        // fjern 'sin(' og ')'
              double resultat = beregn(udtryk);                 
        // beregn parameteren
              System.out.println("beregn("+udtryk+") = "+resultat);
              return Math.tan(resultat);
            }
    if (udtryk.startsWith("pi(") && udtryk.endsWith(")"))
        // sinus-funktion
            {
              udtryk = udtryk.substring(4,udtryk.length()-1);   
        // fjern 'sin(' og ')'
              double resultat = beregn(udtryk);                 
        // beregn parameteren
              System.out.println("beregn("+udtryk+") = "+resultat);
              return Math.PI * resultat;
            }


    // intet andet fundet - så må det være et tal!
    return Double.parseDouble(udtryk);
  }

  public static void main(String[] arg)
  {
// formel her:

    String formel = "pi(3)";
    // 1.1*(2+cos(0.22341*4-4+(2/4)-2*14)+tan(1))^sin(1+sin(2))*1.2356^5
    double værdi = beregn(formel);
  System.out.println("Formlen "+formel+" er beregnet til "+værdi);
  }
}

kan ikke rigtig gemmenskue hvad fejlen er lige pt
Avatar billede Druesukker Nybegynder
15. februar 2011 - 16:34 #31
Hvis du skriver "pi()" i stedet for "pi" kan min kode lettere genkende den uden meget ny kode derfor er det smart at bruge pi() som pi.

pi() er jo en konstant og du bør skrive pi()+3 eller pi()*3.

når pi() kommer frem skal du have den til at lave en double der hedder fx double pi = beregn("pi()")

Så når pi() bliver sendt igennem skal metoden beregn returnere Math.PI

og dermed er double pi = Math.PI

Nu kan du sammen sætte det hele igen med String.format

Men det lyder altså som om at du burde vente med dette projekt til du har fået lidt mere programmeringserfaring.
Avatar billede simondid Nybegynder
15. februar 2011 - 16:49 #32
ja ved godt at projektet er efter hånden steget mig lidt over evne da jeg ikke vista hvor meget avanceret kode der skal til. men vil rigtig gerne lige have pi sin tan og cos på så tror jeg også jeg forlader projektet da det så heller ikke rigtig mangler noget druesukker hvis du har løst hvordan man gør gider du så ikke lige smide din kode??
Avatar billede Druesukker Nybegynder
15. februar 2011 - 20:31 #33
Brug det her som pi
3.14159265358979
Avatar billede simondid Nybegynder
15. februar 2011 - 20:45 #34
gør også  bruger det her som pi funktionen

  if (udtryk.startsWith("pi(") && udtryk.endsWith(")"))
        // sinus-funktion
            {
              udtryk = udtryk.substring(4,udtryk.length()-1);   
        // fjern 'sin(' og ')'
              double resultat = beregn(udtryk);                 
        // beregn parameteren
              System.out.println("beregn("+udtryk+") = "+resultat);
              double pi;
              pi = Math.PI;
              return pi * resultat;
             
            }

men har også problemer med at den ikke gendkender pi og bruger pi funktionen

har er alt kode der har noget at køre med pi funktionen

if (base.substring(startPar - 3, startPar).equals("sin") ||
        base.substring(startPar - 3, startPar).equals("cos")||
        base.substring(startPar - 3, startPar).equals("tan")||
        base.substring(startPar - 2, startPar+1).equals("pi")){




          if (eksponent.startsWith("(") || eksponent.startsWith("sin") || eksponent.startsWith("tan")|| eksponent.startsWith("cos")|| eksponent.startsWith("pi")){



    if (udtryk.startsWith("pi(") && udtryk.endsWith(")"))
        // sinus-funktion
            {
              udtryk = udtryk.substring(4,udtryk.length()-1);   
        // fjern 'sin(' og ')'
              double resultat = beregn(udtryk);                 
        // beregn parameteren
              System.out.println("beregn("+udtryk+") = "+resultat);
              double pi;
              pi = Math.PI;
              return pi * resultat;
             
            }



public static void main(String[] arg)
  {
// formel her:

    String formel = "pi(3)";
    // 1.1*(2+cos(0.22341*4-4+(2/4)-2*14)+tan(1))^sin(1+sin(2))*1.2356^5
    double værdi = beregn(formel);
  System.out.println("Formlen "+formel+" er beregnet til "+værdi);
  }
Avatar billede simondid Nybegynder
16. februar 2011 - 21:02 #35
hey


heinzdmx
druesukker
arne_v

vil gerne lige give lidt ekstere point for jeres store arbejde så hvis i vil have dem så skriv lige i en pm til mig så laver jeg en tråd med point til jer 150 pr mand druesukker du får bare de 30 der er i tråden da du har smidt det eneste svar
Avatar billede heinzdmx Nybegynder
16. februar 2011 - 21:20 #36
Vil mee druesukker klart har fortjent pointene.

Husk på at man ifølge Ekspertens regler ikke må give mere end 200 point pr. spørgsmål ;)

Så du kan jo lave et spørgsmål til 170 point og så fordele det ud fra det.

Vil dog mene at Druesukker har fortjent min. 90 % af de point du vil udlove. Han har trods alt været den der har fremskaffet koden du har nu.
Avatar billede simondid Nybegynder
17. februar 2011 - 08:11 #37
her er tåden smid lige et svar http://www.eksperten.dk/spm/931842
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester