09. juni 2002 - 17:22Der er
25 kommentarer og 1 løsning
var = "2+2" hvordan???
Hej eksperter....
Jeg har et lille problem som sikkert kan løses på en eller anden måde, og garanteret meget nemt:
jeg har en input variabel som er tom.. under kørslen skal man kunne skrive et regneudtryk i tekstfeltet, feks.: (25+18)/5 derefter skal et tryk på enter skrive resultatet af regnestykket i enten en anden, eller selv samme tekstfelt. hvordan skal jeg gøre???
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
der skal kun være en variabel, teksten ((34)*18)+5 skal stå i et tekstfelt
Synes godt om
Slettet bruger
09. juni 2002 - 18:24#8
Et lille problem der sikkert kan løses meget nemt ;-) Svaret er desværre NEJ, det er ikke lige til at lave en dynmisk operator i Flash, da eval() kommandoen ikke understøttes på dette punkt. Spørgsmålet har været opppe at runde eksperten et par gange, så du kan finde mere info omkring dette ved at søge efter 'eval' eller 'operator' etc.
d!ktator, kan man ikke bare splitte udtrykket omkring regnetegnet, og arbejde videre derfra... Det bliver selvfølgelig lidt mere tricky, når der er flere regneudtryk, paranteser osv. (o;
legende.dk >> Du kan selvfølgelig evaluere på din inputstring, splitte den op i mindre bider og lade den loope gennem en masse if-then kommandoer, men det bliver vist for omfattende hvis den skal holde vand ;-)
For så skulle jeg da nok kunne forfatte en "lille" funktion, der kunne klare det... Det vil nok tage lidt mere end den forventede tid for et 30p-spm, men det kan da forholdsvist nemt lade sig gøre...
/Barklund
Synes godt om
Slettet bruger
10. juni 2002 - 14:02#16
Barklund >> Hvis du virkelig har tid, mod og lyst til at komme med et alternativ til Bokels bud på en dynamic operator, så vil jeg da gerne spytte 200 p i kassen ;-)
Haj barklund, det lyder som om du skal have 200 point!!!
den skal kunne klare den skal lige akkurat kunne klare de 4 regnearter, plus alle mulige former for parenteser, jeg gir alså glædelig 200 point for dit bud
function parseExpr (expr, exprArr, toparse) { var temp; if (expr != "" && typeof (expr) == "string") { if (expr.charAt(0) == "(" && expr.charAt(expr.length-1) == ")") { toparse.push(expr.substring(1, expr.length-1)); } else if ((temp=splitable(expr, "+")) != 0) { exprArr.push("+"); toparse.push(temp[0]); toparse.push(temp[1]); } else if ((temp=splitable(expr, "-")) != 0) { exprArr.push("-"); toparse.push(temp[0]); toparse.push(temp[1]); } else if ((temp=splitable(expr, "*")) != 0) { exprArr.push("*"); toparse.push(temp[0]); toparse.push(temp[1]); } else if ((temp=splitable(expr, "/")) != 0) { exprArr.push("/"); toparse.push(temp[0]); toparse.push(temp[1]); } else { exprArr.push(expr); } } } function splitable (str, char) { var str0, str1, pos, lastpos = 0; while ((pos=str.indexOf(char, lastpos)) != -1) { lastpos = pos+1; str0 = str.substr(0, pos); str1 = str.substr(pos+1); if (str0.count("(") == str0.count(")") && str1.count("(") == str1.count(")")) { return [str0, str1]; } } return 0; } function _count(key) { var i = this.length, c = 0; while (i--) { if (this.charAt(i) == key) c++; } return c; } String.prototype.count = _count; function _find(key) { var i = this.length; while (i--) { if (this[i] == key) return i; } return -1; } Array.prototype.find = _find; function evaluate(op, exp1,exp2) { return (op == "+") ? Number(exp2) + Number(exp1) : (op == "-") ? Number(exp2) - Number(exp1) : (op == "*") ? Number(exp2) * Number(exp1) : (op == "/") ? Number(exp2) / Number(exp1) : 0; } function parse (expr) { var exprs = new Array(); var toparse = new Array(); var i, temp; parseExpr(expr, exprs, toparse); while (toparse.length) { parseExpr(toparse.pop(), exprs, toparse); } var ops = ["+","-","*","/"]; while(exprs.length > 1) { i = exprs.length-2; while(ops.find(exprs[--i]) == -1) ; exprs.splice(i,3,evaluate(exprs[i],exprs[i+1],exprs[i+2])); } trace("parsing: "+expr+" = "+exprs[0]); return exprs[0]; }
Der er et par hjælpefunktioner ind imellem...
Jeg har kun debugget en smule, men følgende parser ok:
parse("3+((5/2*2)-2*1)");
Til de "6", som de gerne skal give...
/Barklund :o)
PS: Nu tænker du sikkert: "Hvorfor har han ikke lavet den ægte rekursiv?". Det skyldes, at den ikke tog den rekursive stak i den rigtige rækkefølge... :o) I stedet bygges dette venstre-træ-agtige objekt op :o)
Det lader til at virke. Ganske blæret programmeret, Barklund. -Men jeg havde heller ikke forventet mindre (o; - Lad os se hvad spørgeren siger til det.
Jeg har oprettet et nyt spørgsmål med titlen "point til BARKLUND" prøv den barklund... Hvis du også har interesse i de 30. point som ligger her, så er du velkommen til at oprette et svar
function parseExpr (expr, exprArr, toparse) { var temp; if (expr != "" && typeof (expr) == "string") { if (expr.charAt(0) == "(" && expr.charAt(expr.length-1) == ")" && expr.substring(1, expr.length-1).isBalanced()) { toparse.push(expr.substring(1, expr.length-1)); } else if ((temp=splitable(expr, "+")) != 0) { exprArr.push("+"); if (temp[0] == "") temp[0] = "0"; toparse.push(temp[0]); toparse.push(temp[1]); } else if ((temp=splitable(expr, "-")) != 0) { exprArr.push("-"); if (temp[0] == "") temp[0] = "0"; toparse.push(temp[0]); toparse.push(temp[1]); } else if ((temp=splitable(expr, "*")) != 0) { exprArr.push("*"); toparse.push(temp[0]); toparse.push(temp[1]); } else if ((temp=splitable(expr, "/")) != 0) { exprArr.push("/"); toparse.push(temp[0]); toparse.push(temp[1]); } else { exprArr.push(expr); } } } function splitable (str, char) { var str0, str1, pos, lastpos = 0; while ((pos=str.indexOf(char, lastpos)) != -1) { lastpos = pos+1; str0 = str.substr(0, pos); str1 = str.substr(pos+1); if (str0.count("(") == str0.count(")") && str1.count("(") == str1.count(")")) { return [str0, str1]; } } return 0; } function _count (key) { var i = this.length, c = 0; while (i--) { if (this.charAt(i) == key) { c++; } } return c; } String.prototype.count = _count; function _isBalanced () { var i = -1, c = 0, len = this.length; while (++i < len) { if (this.charAt(i) == "(") { c++; } else if (this.charAt(i) == ")") { c--; if (c<0) return 0; } } return !c; } String.prototype.isBalanced = _isBalanced; function _find (key) { var i = this.length; while (i--) { if (this[i] == key) { return i; } } return -1; } Array.prototype.find = _find; function evaluate (op, exp1, exp2) { return (op == "+") ? Number(exp2)+Number(exp1) : (op == "-") ? Number(exp2)-Number(exp1) : (op == "*") ? Number(exp2)*Number(exp1) : (op == "/") ? Number(exp2)/Number(exp1) : 0; } function parse (expr) { var exprs = new Array(); var toparse = new Array(); var i, temp; if (expr.isBalanced()) { parseExpr(expr, exprs, toparse); while (toparse.length) { parseExpr(toparse.pop(), exprs, toparse); } var ops = ["+", "-", "*", "/"]; while (exprs.length>1) { i = exprs.length-2; while (ops.find(exprs[--i]) == -1) { ; } exprs.splice(i, 3, evaluate(exprs[i], exprs[i+1], exprs[i+2])); } trace ("parsing: "+expr+" = "+exprs[0]); return exprs[0]; } else { trace ("Unbalanced parentheses: "+expr); return 0; } } Nu kan den også klare:
parse("(1+2)*(0-3)"); parse("-2*5+(-3)");
Og hvis dine parenteser ikke passer (ex "(2+3)*)1+2("), får du også fejl-meddelelse...
Jeg skal nok lige nævne, at den før kun kunne klare binære operatorer... Altså ikke "-1+2" men i stedet "2-1", som jo betyder det samme... Nu virker det dog!! Meget nemt at implementere endda (som du kan se i koden :o)!
Husk at lukke her ved selv at lave et svar og tage alle pointene...
jeg har fået de 200p, som er det maksimale for en enkelt opgave, derfor skal du selv tage disse... Jeg har heller ikke brug for pointene, så tag dem bare selv...
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.