13. februar 2011 - 15:24Der 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
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
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
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
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.
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
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 }
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
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;
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(); }
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:
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)
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)
// 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 }
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
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;
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("π")){ // 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(); }
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 }
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
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;
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(); }
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??
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
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.