Avatar billede sonzi Nybegynder
09. juni 2002 - 17:22 Der 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???
Avatar billede spike. Nybegynder
09. juni 2002 - 17:25 #1
du tager nogle inputs og siger
($a+$b)/$c = $d
echo $d ?
i php
Avatar billede sonzi Nybegynder
09. juni 2002 - 17:27 #2
jeg må indrømme at jeg ikke forstår ret meget af det du siger
Avatar billede sonzi Nybegynder
09. juni 2002 - 17:28 #3
kan det ikke lade sig gøre kun vha, flash
Avatar billede Slettet bruger
09. juni 2002 - 17:34 #4
har du husket at klikke i "expression" checkboxen?
Avatar billede sonzi Nybegynder
09. juni 2002 - 17:37 #5
ja, det har jeg husket
Avatar billede Slettet bruger
09. juni 2002 - 17:38 #6
jeg lavede en knap:

on (release){

minvariabel = minvariabel2 / 4;

}
Avatar billede sonzi Nybegynder
09. juni 2002 - 17:41 #7
der skal kun være en variabel, teksten  ((34)*18)+5    skal stå i et tekstfelt
Avatar billede 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.

Der findes dog en workaround hvis du har mod på det ;-)
http://www.flashfaq.dk/spg.asp?faq=103
Avatar billede sonzi Nybegynder
09. juni 2002 - 18:44 #9
Nahhh, det ser lidt for indviklet ud, men hvis du lavre et "svar" skal du få de 30 point fordi du forstod mit spørgsmål...lol
Avatar billede baitianlong Nybegynder
09. juni 2002 - 19:07 #10
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;
Avatar billede Slettet bruger
09. juni 2002 - 19:08 #11
Behold du bare dine point :)
Avatar billede sonzi Nybegynder
09. juni 2002 - 19:12 #12
Okay, tak for det...
Avatar billede Slettet bruger
09. juni 2002 - 19:14 #13
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 ;-)
Avatar billede baitianlong Nybegynder
09. juni 2002 - 19:15 #14
mon ikke ?
Avatar billede barklund Nybegynder
10. juni 2002 - 13:54 #15
Tjaa... hvor meget skal den kunne klare? Kun:

+, -, *, /, (, )

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
Avatar billede 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 ;-)
Avatar billede sonzi Nybegynder
10. juni 2002 - 15:37 #17
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
Avatar billede baitianlong Nybegynder
10. juni 2002 - 15:59 #18
Den funktion vil jeg også se ((o; - Jeg "smider 50 i kassen"
Avatar billede barklund Nybegynder
10. juni 2002 - 17:07 #19
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)
Avatar billede barklund Nybegynder
10. juni 2002 - 17:35 #20
Det tog en lille times tid, så det er ikke så svært... :o)

Jeg går nu og forventer, at der er absolut INGEN bug-rapporter her i morgen :o)

Hav et godt liv så længe... (og kom endelig med positive kommentarer)
Avatar billede baitianlong Nybegynder
10. juni 2002 - 19:00 #21
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.

RESPEKT
Avatar billede Slettet bruger
11. juni 2002 - 09:04 #22
points og en lille bugrapport :0)
http://www.eksperten.dk/spm/222831
Avatar billede sonzi Nybegynder
11. juni 2002 - 10:54 #23
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
Avatar billede barklund Nybegynder
11. juni 2002 - 21:29 #24
Hov... prøver lige igen:

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)!

/Barklund
Avatar billede barklund Nybegynder
12. juni 2002 - 12:53 #25
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...
Avatar billede sonzi Nybegynder
12. juni 2002 - 19:38 #26
OK, godt så
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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