Java calculatrice avec de multiples activités
J'ai la suite de la mesure qui fonctionne très bien. Im sûr il y a probablement un moyen plus facile de faire cela, mais ce que je devrai modifier/modifier le sommet de la méthode de Matheq. Les Mathématiques de la méthode ne l'unique des opérations mathématiques.
La il fonctionne avec n'importe quel seule opération avec +, -, * et /.
Mon problème de résolution d'un plus grand équation comme 10 - 10 /5 + 3.
Il n'est toutefois résoudre 10 /5 + 65 * 2 correctement.
La raison en est que chaque partie, les nombres et les opérations, sont divisés en un tableau de chaînes. Après chaque opération est terminée, le nombre et l'opération est remplacée par le résultat de l'équation. Peut sembler confus, mais je ne pouvais pas penser à une meilleure façon. La raison pour laquelle elle ne peut pas résoudre les autres équation est parce que de la façon dont j'ai mappé les cordes de retour en tableau de chaînes.
Exemple de tableaux de chaîne
Ex. avec 10 - 10 /5 + 3
Chaîne = { 10, -, 10, /, 5, +, 3 }
après les opérations d'ne division de première puis de gauche à droite soustraction puis plus
Chaîne = { 8, 8, 2, 2, 2, 5, 5 }
Voici mon code et quelqu'un s'il vous plaît aidez-moi:
RÉVISÉ
révisé, maintenant, il fonctionne avec ci-dessus, mais a encore du mal avec les LONGUES équations.
Un court exemple, c'est qu'elle n'en résout 2 * 2 * 2 * 2 divisé par 5 très bien, mais si changement il sorte
10 - 2 * 2 * 2 * 2 divisé par 5, je reçois une réponse incorrecte.
public class Matheq {
String fnum = null;
String lnum = null;
String total = null;
public String Matheq(String mathoperation) {
String mathoperation= "6 * 3 - 4 * 2";
mathoperation = mathoperation.replaceAll(",", "");
mathoperation = mathoperation.replaceAll("plus", "+");
mathoperation = mathoperation.replaceAll("minus", "-");
mathoperation = mathoperation.replaceAll("times", "*");
mathoperation = mathoperation.replaceAll("divided by", "dividedby");
mathoperation = mathoperation.replaceAll("percent of", "percentof");
String[] splitstr = mathoperation.split(" ");
while(splitstr.length>1){
for(int i=0; i<splitstr.length; i++) {
System.out.println("Get value: " + splitstr[i]);
if(splitstr[i].indexOf("percentof") >= 0) {
String buildit = splitstr[i-1] + " percent of " + splitstr[i+1];
String done = math(buildit);
System.out.println("Percentage operation: " + splitstr[i-1] + " percent of " + splitstr[i+1] + "=" + done);
splitstr[i] = done;
splitstr[i-1] = "";
splitstr[i+1] = "";
ArrayList<String> list = new ArrayList<String>();
for(String s : splitstr){
if(!s.equals("")){
list.add(s);
}
}
splitstr = list.toArray(new String[list.size()]);
}
}
for(int i=0; i<splitstr.length; i++) {
System.out.println("Get value: " + splitstr[i]);
if(splitstr[i].indexOf("dividedby") >= 0) {
String buildit = splitstr[i-1] + " divided by " + splitstr[i+1];
String done = math(buildit);
System.out.println("Division operation: " + splitstr[i-1] + " divided by " + splitstr[i+1] + "=" + done);
splitstr[i] = done;
splitstr[i-1] = "";
splitstr[i+1] = "";
ArrayList<String> list = new ArrayList<String>();
for(String s : splitstr){
if(!s.equals("")){
list.add(s);
}
}
splitstr = list.toArray(new String[list.size()]);
}
}
for(int i=0; i<splitstr.length; i++) {
System.out.println("Get value: " + splitstr[i]);
if(splitstr[i].indexOf("*") >= 0) {
String buildit = splitstr[i-1] + " * " + splitstr[i+1];
String done = math(buildit);
System.out.println("Multiplication operation: "+ splitstr[i-1] + " * " + splitstr[i+1] + "=" + done);
splitstr[i] = done;
splitstr[i-1] = "";
splitstr[i+1] = "";
ArrayList<String> list = new ArrayList<String>();
for(String s : splitstr){
if(!s.equals("")){
list.add(s);
}
}
splitstr = list.toArray(new String[list.size()]);
}
}
for(int i=0; i<splitstr.length; i++) {
System.out.println("Get value: " + splitstr[i]);
if(splitstr[i].indexOf("+") >= 0) {
String buildit = splitstr[i-1] + " + " + splitstr[i+1];
String done = math(buildit);
System.out.println("Addition operation: " + splitstr[i-1] + " + " + splitstr[i+1] + "=" + done);
splitstr[i] = done;
splitstr[i-1] = "";
splitstr[i+1] = "";
ArrayList<String> list = new ArrayList<String>();
for(String s : splitstr){
if(!s.equals("")){
list.add(s);
}
}
splitstr = list.toArray(new String[list.size()]);
}
}
for(int i=0; i<splitstr.length; i++) {
System.out.println("Get value: " + splitstr[i]);
if(splitstr[i].indexOf("-") >= 0) {
String buildit = splitstr[i-1] + " - " + splitstr[i+1];
String done = math(buildit);
System.out.println("Subtraction operation: " + splitstr[i-1] + " - " + splitstr[i+1] + "=" + done);
splitstr[i] = done;
splitstr[i-1] = "";
splitstr[i+1] = "";
ArrayList<String> list = new ArrayList<String>();
for(String s : splitstr){
if(!s.equals("")){
list.add(s);
}
}
splitstr = list.toArray(new String[list.size()]);
}
}
for(int i=0; i<splitstr.length; i++) {
System.out.println("Final operation: " + total + " " + splitstr[i]);
}
}
return total;
}
private String math(String mathoperation) {
//TODO Auto-generated method stub
if(mathoperation.contains("percent of")){
mathoperation = mathoperation.replaceAll("percent of", "%");
int str = mathoperation.indexOf("%");
System.out.println(str);
fnum = mathoperation.substring(0, str-1);
fnum = fnum.replaceAll(" ", "");
fnum = "." + fnum;
System.out.println(fnum);
double intfnum = Double.parseDouble(fnum);
System.out.println(intfnum);
int lastind = mathoperation.length();
System.out.println(lastind);
lnum = mathoperation.substring(str+1, lastind);
lnum = lnum.replaceAll(" ", "");
System.out.println(lnum);
double intlnum = Double.parseDouble(lnum);
System.out.println(intlnum);
double tot = intlnum * intfnum;
System.out.println(tot);
total = Double.toString(tot);
if(total.length() == 3){
total = total + "0";
}
if(total.length() > 5){
total = total.substring(0, 4);
}
total = total.replace("0.", "");
System.out.println("Total:" + total);
} else
if(mathoperation.contains("-")){
int str = mathoperation.indexOf("-");
System.out.println(str);
fnum = mathoperation.substring(0, str-1);
fnum = fnum.replaceAll(" ", "");
System.out.println(fnum);
double intfnum = Double.parseDouble(fnum);
System.out.println(intfnum);
int lastind = mathoperation.length();
System.out.println(lastind);
lnum = mathoperation.substring(str+1, lastind);
lnum = lnum.replaceAll(" ", "");
System.out.println(lnum);
double intlnum = Double.parseDouble(lnum);
System.out.println(intlnum);
double tot = intfnum - intlnum;
System.out.println(tot);
total = Double.toString(tot);
System.out.println(total);
} else
if(mathoperation.contains("+")){
int str = mathoperation.indexOf("+");
System.out.println(str);
fnum = mathoperation.substring(0, str-1);
fnum = fnum.replaceAll(" ", "");
System.out.println(fnum);
double intfnum = Double.parseDouble(fnum);
System.out.println(intfnum);
int lastind = mathoperation.length();
System.out.println(lastind);
lnum = mathoperation.substring(str+1, lastind);
lnum = lnum.replaceAll(" ", "");
System.out.println(lnum);
double intlnum = Double.parseDouble(lnum);
System.out.println(intlnum);
double tot = intfnum + intlnum;
System.out.println(tot);
total = Double.toString(tot);
System.out.println(total);
} else
if(mathoperation.contains("*")){
int str = mathoperation.indexOf("*");
System.out.println(str);
fnum = mathoperation.substring(0, str-1);
fnum = fnum.replaceAll(" ", "");
System.out.println(fnum);
double intfnum = Double.parseDouble(fnum);
System.out.println(intfnum);
int lastind = mathoperation.length();
System.out.println(lastind);
lnum = mathoperation.substring(str+1, lastind);
lnum = lnum.replaceAll(" ", "");
System.out.println(lnum);
double intlnum = Double.parseDouble(lnum);
System.out.println(intlnum);
double tot = intfnum * intlnum;
System.out.println(tot);
total = Double.toString(tot);
System.out.println(total);
} else
if(mathoperation.contains("divided by")){
mathoperation = mathoperation.replaceAll("divided by", "/");
int str = mathoperation.indexOf("/");
System.out.println(str);
fnum = mathoperation.substring(0, str-1);
fnum = fnum.replaceAll(" ", "");
System.out.println(fnum);
double intfnum = Double.parseDouble(fnum);
System.out.println(intfnum);
int lastind = mathoperation.length();
System.out.println(lastind);
lnum = mathoperation.substring(str+1, lastind);
lnum = lnum.replaceAll(" ", "");
System.out.println(lnum);
double intlnum = Double.parseDouble(lnum);
System.out.println(intlnum);
double tot = intfnum / intlnum;
System.out.println(tot);
total = Double.toString(tot);
System.out.println(total);
} else {
total = null;
}
return total;
}
}
Ohhh homme. Tout d'abord, les devoirs questions les devoirs de la balise. Deuxième de tous, votre approche est sous-optimale, c'est un euphémisme. Envisagez l'utilisation d'une expression symbolique de l'arbre (pas dur à faire avec l'héritage).
Est-ce devoirs? Si oui, ajoutez la balise. Si non, utilisez
ScriptEngine
.pas de devoirs, c'est une petite partie pour l'application android, je suis bâtiment. J'ai révisé et a ajouté thi à la fin de chaque opération: splitstr[i-1] = "";splitstr[i+1] = "";ArrayList<String> liste = new ArrayList<String>();for(String s : splitstr){if(!s.equals("")){liste.add(s);}}splitstr = liste.toArray(new String[liste.size()]);
OriginalL'auteur itgeek25 | 2012-09-16
Vous devez vous connecter pour publier un commentaire.
Un tableau est la mauvaise structure pour représenter l'analyse de l'équation. Vous avez besoin d'avoir une structure qui peut représenter la priorité de l'opérateur. Le mécanisme standard pour la manipulation de ce type de problème est un arbre de syntaxe abstraite. Pour votre 10 - 10 /5 + 3 exemple, vous auriez probablement eu envie de construire un arbre qui ressemble à ceci:
Avec ce type de structure avec la haute précédence des opérateurs en bas de l'arbre, vous pouvez effectuer une évaluation pour obtenir le résultat correct.
OriginalL'auteur Michael Barker
Tout ce que vous avez à faire est de convertir le préfixe d'entrée dans postfix format. Ensuite, vous pouvez facilement faire de la magie à l'aide d'une pile. J'ai utilisé le modèle de commande d'écriture d'une solution complète.
Méthode pour convertir infix à postfix
Puis j'ai une autre méthode qui utilise la Calculatrice de l'instance et de passer le postfix chaîne.
Mise En Œuvre Complète De
Interface de commande
De commande de la mise en œuvre
Calculateur De Classe( Récepteur)
Invocateur Classe
Classe Client
OriginalL'auteur Sanjaya Athukorala
Je n'ai pas fait le point de travail, c'est pour un autre jour.
dans le
main
oulaunch
laisser les boutons envoyer leur texte à notre buttonHandler.Dans la méthode:
Le code:
si vous souhaitez calculer une chaîne de mettre quelque chose comme cela dans la "le lancement de la" mehtod:
OriginalL'auteur Halfacht