Zit een klein beetje vast

Status
Niet open voor verdere reacties.

Stelselare

Gebruiker
Lid geworden
22 nov 2007
Berichten
6
Hoi
Ik probeer hier een rekenmacientje te schrijven maar het lukt niet al te goed.
mijn kennis van java is redelijk goed, maar ik heb geen idee hoe ik verder moet.
Mijn probleem is het volgende.
ja ingave-string is bijvoorbeeld 1 + 2 - 3 / 4 * 6
en ik heb dus geen idee hoe ik dit moet omzetten naar een volledige bewerking
ik heb al gedacht aan een while-lus waar ik dan altijd een substring neem van 0 tot spatie.
ma kweet ook niet hoe ik die spatie tussen de getallen en bewerkingstekens werk.

ik hoop dat jullie mij een oplossing kunnen geven of me toch op de goede weg zetten.

alvast bedankt:thumb:
 
Ik zou iets doen op deze manier:
- elk karakter apart inlezen (in for/while-lus), dus ook spaties etc
- de ingevoerde string (infix) converteren naar prefix
- elk karakter van de prefix string op een stack plaatsen (operators en getallen apart)
- elke operator uitlezen en daarbij 2 getallen van de stack uitlezen
- bewerking doen (adhv de operator) en uitkomst weer op de getalstack plaatsen

Laatste 2 bewerkingen in een lusje :)


Edit: of zoiets.. in ieder geval van infix naar prefix en iets met een stack :p
 
Laatst bewerkt:
String ingave;
int extract;

ingave = Stream.readString()
while (ingave.lenght() != 0){

//hier moet het splitsen van string komen

if(extract == '+'){
}
else if(extract == '-'){
}
else if(extract == '*'){
}
else if(extract == '/'){
}
else if(extract == '%'){
}
else {
}

denk ik.
dus ben er niet zeker van
 
Ik zou iets doen op deze manier:
- elk karakter apart inlezen (in for/while-lus), dus ook spaties etc
- de ingevoerde string (infix) converteren naar prefix
- elk karakter van de prefix string op een stack plaatsen (operators en getallen apart)
- elke operator uitlezen en daarbij 2 getallen van de stack uitlezen
- bewerking doen (adhv de operator) en uitkomst weer op de getalstack plaatsen

Laatste 2 bewerkingen in een lusje :)


Edit: of zoiets.. in ieder geval van infix naar prefix en iets met een stack :p

zijn dat arrays?
want dat kan ik nog niet.
versta daar niets van.
Alles tot nu is zelf-interesse.
Arrays zal wel beter gaan als ik avondschool begin.
 
Een stack is een 'stapel'. Stel je een stapel papier voor.
Je kan (zonder de stapel aan te passen) alleen het bovenste papier van de stapel (stack) afhalen.
Ook kun je alleen bovenop de stapel iets leggen.

Het is een soort van array, maar je kan bij een stack alleen maar bij het bovenste 'item'.
 
achzo
ik heb hier zojuist mijn probleem uitgeschreven.
ik ben dus van plan van het eerste getal een substring te nemen.(subtotaal)
daarna van de bewerking(teken) en dan van het tweede getal(getal).
deze in subtotaal. dan als het + is subtotaal1 += getal.
zo in een lus.
maar vor het teken te nemen zit ik vast
en het in code zetten weet ik ook niet.
kan er mij iemand helpen aub :)
 
Ik heb wel een PHP functie gevonden die doet wat jij wil:
PHP:
function matheval($equation){ 
	$equation = preg_replace("/[^0-9+\-.*\/()%]/","",$equation); 
	$equation = preg_replace("/([+-])([0-9]+)(%)/","*(1\$1.\$2)",$equation); 
	// you could use str_replace on this next line 
	// if you really, really want to fine-tune this equation 
	$equation = preg_replace("/([0-9]+)(%)/",".\$1",$equation); 
	if ($equation == "") { 
		$return = 0; 
	} else { 
		eval("\$return=" . $equation . ";"); 
	} 
	return $return; 
}

Misschien dat jij / iemand anders dit om kan zetten naar java :)
 
Laatst bewerkt:
Ik heb wel een PHP functie gevonden die doet wat jij wil:
PHP:
function matheval($equation){ 
	$equation = preg_replace("/[^0-9+\-.*\/()%]/","",$equation); 
	$equation = preg_replace("/([+-])([0-9]+)(%)/","*(1\$1.\$2)",$equation); 
	// you could use str_replace on this next line 
	// if you really, really want to fine-tune this equation 
	$equation = preg_replace("/([0-9]+)(%)/",".\$1",$equation); 
	if ($equation == "") { 
		$return = 0; 
	} else { 
		eval("\$return=" . $equation . ";"); 
	} 
	return $return; 
}



Misschien dat jij / iemand anders dit om kan zetten naar java :)


das zeer vriendelijk
maar ik ken nix van php :p
het enige dat ik kan is een beetje java en xhtml
maar toch bedankt ;)
 
Laatst bewerkt:
Als ik vanavond thuis ben, ik heb de tijd en ik ben het niet vergeten dan wil ik er wel even een blik op werpen, mits niemand anders een werkende oplossing heeft aangedragen :)
 
Ik ben bezig met een (redelijk lange) oplossing.
Ik ga eerst de rekensom in een ArrayList zetten.
Vervolgens die ArrayList doorlopen en daardoor de som oplossen.

Ik doe het zonder de infix eerst om te zetten naar prefix of postfix.
Ik laat het wel even zien als ik er mee klaar ben.
 
dit is de uitschrijving van mijn probleem als de ingave bijvoorbeeld 1 + 2 / 3 + 4 * 5 + 6 - 7 is :
while(ingave.length != 0) {
geheugen = 1
operator = +
getal = 2
if (operator.equals("+")){
geheugen = geheugen + getal;
}
else if(operator.equals("-")) {
geheugen = geheugen - getal;
}
else if(operator.equals("*")) {
geheugen = geheugen * getal;
}
else if(operator.equals("/")) {
geheugen = geheugen / getal;
}
}

dan trekt hij dat gebruikte stuk van die string af en dan herhaald hij zich tot de string af is
maar ik kan het niet helemaal in code zetten
plz help
 
Dit is wat ik nu voor elkaar heb:

Code:
import java.util.ArrayList;

public class NewJFrame extends javax.swing.JFrame {
    
    private String[] operator = { "+", "-", "/", "*" };
    private ArrayList<String> _rekenSomArray = new ArrayList<String>();
    
    /** Creates new form NewJFrame */
    public NewJFrame() {
        initComponents();
        [COLOR="Red"]System.out.println(bereken("1+2+3/3*2-1"));[/COLOR] //hier roep je     de berekening aan
        
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">                          
    private void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );
        pack();
    }// </editor-fold>                        
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
    }
    
    public String bereken(String rekenSom){
        int eersteGedeelte = 0;
        int laatsteGedeelte = 0;
        String operator = "";
        
        rekenSom.trim();
        if(rekenSom.length() > 2 && !IsOperator(String.valueOf(rekenSom.charAt(rekenSom.length()-1)))){
            zetInArray(rekenSom);
            while(_rekenSomArray.size() > 0){
                if(eersteGedeelte == 0){
                    System.out.println(_rekenSomArray.get(0));
                    eersteGedeelte = Integer.valueOf(_rekenSomArray.get(0));
                    _rekenSomArray.remove(0);
                }
                operator = _rekenSomArray.get(0);
                _rekenSomArray.remove(0);
                laatsteGedeelte = Integer.valueOf(_rekenSomArray.get(0));
                _rekenSomArray.remove(0);
                eersteGedeelte = rekenuit(eersteGedeelte, operator, laatsteGedeelte);
            }
        }
        return String.valueOf(eersteGedeelte);
    }
    
    
    private void zetInArray(String rekenSom) {
        String gedeelte = "";
        for (int i = 0; i < rekenSom.length()-1; i++) {
            if(IsOperator(String.valueOf(rekenSom.charAt(i)))){
                _rekenSomArray.add(gedeelte);
                _rekenSomArray.add(String.valueOf(rekenSom.charAt(i)));
                gedeelte = "";
                
            } else {
                gedeelte += rekenSom.charAt(i);
            }
            
        }
        _rekenSomArray.add(String.valueOf(rekenSom.charAt(rekenSom.length()-1)));
    }
    
    private boolean IsOperator(String s) {
        for (int i = 0; i < operator.length; i++) {
            if(s.equals( operator[i])){
                return true;
            }
        }
        return false;
    }
    
    private int rekenuit(int eersteGedeelte, String operator, int laatsteGedeelte) {
        if( operator.equals( "+" )){
            return eersteGedeelte + laatsteGedeelte;
        } else if( operator.equals( "-" )){
            return  eersteGedeelte - laatsteGedeelte;
        } else if( operator.equals( "/" )){
            if(eersteGedeelte > 0 && laatsteGedeelte > 0){
                return eersteGedeelte / laatsteGedeelte;
            } else {
                throw new Error(" Niet deelbaar door 0 ");
            }
        } else if( operator.equals( "*" )){
            return eersteGedeelte * laatsteGedeelte;
        }
        return 0;
    }  
}

Als je een gedeelte niet begrijpt moet je het zeggen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan