# Taschenrechner



## javanick (2. Jun 2010)

Hallo an alle,
ich bin ein Java-ME Anfänger und würde gerne ein Taschenrechner auf meinem Handy haben, der (das ist das wichtigste), wenn man das Programm verlässt den aktuellen Wert lokal speichert und ihn bei Programmstart wieder einliest. Hat jemand so ein Programm?

Danke schon im vorraus.

javanick


----------



## U2nt (3. Jun 2010)

Du schreibst du bist Java ME Anfänger und fragst ob jemand soein Programm hat? Durch den Satz das du ein Afnänger bist, dacht ich eher du willst dir ein selber programmieren, oder willst du das, indem du dir das anguckst?


----------



## javanick (3. Jun 2010)

Ich wollte mir es dann angucken und für ein anderes Programm benutzen.


----------



## The_S (4. Jun 2010)

Versuchs doch mal selbst, so schwer ist das nicht. Ist gleichzeitig ne gute Übung und wenn dabei Fragen auftreten helfen wir dir gerne.

Alternativ kann ich dir für einen dreistelligen Betrag auch einen kleinen Taschenrechner nach deinen Wünschen bauen  .


----------



## Chéfkóch (4. Jun 2010)

Stimmt so schwer ist das nicht.

Abspeichern kannst du den zuletzt errechneten Wert beispielsweise 
in einem Record Store (-> Thema: RMS)


----------



## javanick (14. Sep 2010)

Hi Leute,
Sorry dass ich so lange nicht hier war, aber die Schule fordert viel Zeit.
Ich habe versucht einen Taschenrechner zu programmieren, aber es ist mir nicht gelungen.
Ich wäre euch sehr dankbar wenn ihr es mir abnehmen würdet.

LG javanick


----------



## XHelp (14. Sep 2010)

Du kannst ja eher Fragen stellen, die man die beantwortet. Ansonsten wäre der Vorschlag eher in der Jobbörse besser aufgehoben.


----------



## dvid85 (16. Sep 2010)

Also das hört sich ja so an, also wenn du gar nichts lernen willst, sondern einfach nur so einen Rechner brauchst. Wahrscheinlich für die Schule.. und wenn ein Lehrer kommt beendest du schnell das Programm, wenn er wieder weg ist, startest du es wieder beim aktuellen stand. Richtig?


----------



## Blakh (17. Sep 2010)

Dann zeig doch mal dein Programm, welches du erstellt hast.

Asnonsten: Dreist :noe: .... Programmierer sind leider nicht dumm genug, auf sowas reinzufallen. Es sei denn du bist weiblich. :applaus:


----------



## Atze (17. Sep 2010)

Blakh hat gesagt.:


> Programmierer sind leider nicht dumm genug, auf sowas reinzufallen. Es sei denn du bist weiblich. :applaus:



das reicht aber nicht, du musst uns auch ranlassen!


----------



## javanick (26. Okt 2010)

dvid85 hat gesagt.:
			
		

> Also das hört sich ja so an, also wenn du gar nichts lernen willst, sondern einfach nur so einen Rechner brauchst. Wahrscheinlich für die Schule.. und wenn ein Lehrer kommt beendest du schnell das Programm, wenn er wieder weg ist, startest du es wieder beim aktuellen stand. Richtig?


Nein es ist nicht für die Schule, sondern ich möchte einfach nur einen Taschenrechner als Übung.


----------



## timbeau (28. Okt 2010)

Überlies die oberen Beiträge nicht. Entweder selber machen und bei einzelnen(!) Problemen hier anfragen oder es als Job anbieten. Angebot haste ja schon bekommen.


----------



## ARadauer (28. Okt 2010)

javanick hat gesagt.:


> Hi Leute,
> Sorry dass ich so lange nicht hier war, aber die Schule fordert viel Zeit.
> Ich habe versucht einen Taschenrechner zu programmieren, aber es ist mir nicht gelungen.
> Ich wäre euch sehr dankbar wenn ihr es mir abnehmen würdet.
> ...





javanick hat gesagt.:


> Nein es ist nicht für die Schule, sondern ich möchte einfach nur einen Taschenrechner als Übung.


Du willst das wir zur Übung für dich einen Taschenrechner schreiben? :lol:


----------



## javanick (5. Nov 2010)

Nein ich programmiere ihn selber.
Hab schon mal angefangen:

```
package projekte.taschenrechner;

import javax.microedition.lcdui.Command;
import javax.microedition.lcdui.CommandListener;
import javax.microedition.lcdui.Display;
import javax.microedition.lcdui.Displayable;
import javax.microedition.lcdui.Form;
import javax.microedition.lcdui.TextField;
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;

public class Taschenrechner extends MIDlet implements CommandListener {

	Display display;
	Form form;
	Command rechnen;
	Command exit;
	Command loeschen;
	TextField tf;

	public Taschenrechner() {
		// TODO Auto-generated constructor stub
		rechnen = new Command("Text ausrechnen", Command.SCREEN, 1);
		loeschen = new Command("Löschen", Command.SCREEN, 1);
		exit = new Command("Beenden", Command.EXIT, 1);
		tf = new TextField("Hier Text Eingeben:", "", 100, TextField.ANY);
		form = new Form("Taschenrechner");
		display = Display.getDisplay(this);
		form.addCommand(exit);
		form.addCommand(rechnen);
		form.addCommand(loeschen);
		form.append(tf);
		form.setCommandListener(this);
	}

	protected void destroyApp(boolean unconditional) throws MIDletStateChangeException {
	}

	protected void pauseApp() {
	}

	protected void startApp() throws MIDletStateChangeException {
		// TODO Auto-generated method stub
		display.setCurrent(form);
	}

	public static String berechneAusdruck(String in) {
		String ausdruck = "";
		char operator;
		int indexOperator;
		int indexOperandLinksAnfang;
		int indexOperandRechtsEnde;
		String stringOperandLinks;
		String stringOperandRechts;
		String stringAusdruckLinks;
		String stringAusdruckRechts;

		for (int i = 0; i < in.length(); i++) {
			if (in.charAt(i) == ',') {
				ausdruck += ".";
			} else {
				if (in.charAt(i) == '-') {
					ausdruck += "+-";
				} else {
					ausdruck += in.charAt(i);
				}
			}
		}
		while ((indexOperator = ausdruck
				.indexOf(operator = naesterOperator(ausdruck))) > 0) {
			indexOperandLinksAnfang = indexOperandLinksAnfang(ausdruck,
					indexOperator);
			indexOperandRechtsEnde = indexOperandRechtsEnde(ausdruck,
					indexOperator);
			stringOperandLinks = ausdruck.substring(indexOperandLinksAnfang,
					indexOperator);
			stringOperandRechts = ausdruck.substring(indexOperator + 1,
					indexOperandRechtsEnde);
			stringAusdruckLinks = ausdruck
					.substring(0, indexOperandLinksAnfang);
			stringAusdruckRechts = ausdruck.substring(indexOperandRechtsEnde);
			ausdruck = stringAusdruckLinks
					+ rechne(stringOperandLinks, operator, stringOperandRechts)
					+ stringAusdruckRechts;
		}
		return ausdruck;
	}

	private static int indexOperandLinksAnfang(String ausdruck,
			int indexOperator) {
		int ret = indexOperator - 1;

		while (ret > 0
				&& (Character.isDigit(ausdruck.charAt(ret - 1)) || ausdruck
						.charAt(ret - 1) == '.')) {
			ret--;
		}
		if (ret > 0 && ausdruck.charAt(ret - 1) == '-') {
			ret--;
		}
		return ret;
	}

	private static int indexOperandRechtsEnde(String ausdruck, int indexOperator) {
		int ret = indexOperator + 1;

		if (ret < ausdruck.length() && ausdruck.charAt(ret) == '-') {
			ret++;
		}
		while (ret < ausdruck.length()
				&& Character.isDigit(ausdruck.charAt(ret))) {
			ret++;
		}
		return ret;
	}

	private static String rechne(String operandLinks, char operator,
			String operandRechts) {
		switch (operator) {
		case '+':
			return Double.toString(Double.parseDouble(operandLinks)
					+ Double.parseDouble(operandRechts));
		case '-':
			return Double.toString(Double.parseDouble(operandLinks)
					- Double.parseDouble(operandRechts));
		case '*':
			return Double.toString(Double.parseDouble(operandLinks)
					* Double.parseDouble(operandRechts));
		case '/':
			return Double.toString(Double.parseDouble(operandLinks)
					/ Double.parseDouble(operandRechts));
		default:
			return null;
		}
	}

	private static char naesterOperator(String a) {
		int div = a.indexOf('/');
		int mul = a.indexOf('*');
		if (div > 0 && mul > 0) { // wenn es beide Operanten gibt
			if (div < mul) {
				return '/';
			} else {
				return '*';
			}
		} else {
			if (div > 0)
				return '/';
			if (mul > 0)
				return '*';
		}
		// es gibt keinen '/' oder '*' Operanten mehr
		if (a.indexOf('+') > 0) {
			return '+';
		} else {
			return '-';
		}
	}

	public void commandAction(Command c, Displayable d) {
		if (c == rechnen) {
			String in = tf.getString();
			String out = berechneAusdruck(in);
			form.append(out + "\n");
		}
		if (c == loeschen) {
			form.deleteAll();
			form.append(tf + "\n");
		}
		if (c == exit) {
			try {
				destroyApp(true);
			} catch (MIDletStateChangeException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

}
```
Funzt soweit, aber wieso funktioniert das mit destroyApp nicht?


----------



## The_S (8. Nov 2010)

weil ein notifyDestroyed() fehlt.


----------



## javanick (15. Nov 2010)

OK.
Funktioniert, aber ich würde gern ein icon für den rechner haben.
Wie geht das?

P.S.: ich benutze eclipse pulsar.

LG und Danke
javanick


----------



## The_S (16. Nov 2010)

Und wo hättest du das Icon gerne? Generell: Let me google that for you


----------



## javanick (27. Nov 2010)

habs wie hier beschrieben gemacht, funktioniert aber nicht.
Wie muss ich den Pfad komplett(C:\...) angeben oder nur so(.\res\Rechner.ico)?
Oder muss das icon eine bestimmte Größe haben(ich habs mit 32*32 und 16*16 versucht)?


----------



## The_S (29. Nov 2010)

Das Icon muss natürlich mit im JAR liegen und dann musst du den Pfad angeben, wo das Icon im Pfad liegt. Je nach Handy wird eine andere Auflösung benötigt. Je nach Handy gibt man das Icon auch manchmal mit dem Icon-Tag im JAD an, manchmal aber auch als Parameter im MIDlet-1-Tag. Am Besten an beiden Stellen angeben. Handys können am Besten mit PNG umgehen, von daher würde ich dieses Format wählen - ist aber auch keine Garantie, dass es dann überall funktioniert.


----------



## javanick (11. Dez 2010)

Hab´s als PNG mit 16*16 und 32*32 Pixel versucht, ging aber nicht.
Hab´ den Pfad ./res/Rechner.png angegeben, liegt es daran?

Nutze übrigens ein Sony Ericsson F305.


----------



## The_S (13. Dez 2010)

Den Punkt kannst du dir sparen. Ist in deinem JAR auch wirklich ein res Ordner?


----------



## javanick (15. Dez 2010)

Ich glaube Eclipse legt automatisch einen "res" Ordner an.

Habe es ohne Punkt und ohne Ordner mit 16*16 Pixeln Versucht, geht aber nicht.
Mach ich was falsch???


----------



## XHelp (15. Dez 2010)

Entpack doch mal die Jar, wie sieht es da aus?


----------



## javanick (17. Dez 2010)

Danke!
Habe die JAR entpackt, es gibt in der JAR keinen RES Ordner. Eclipse tut den Inhalt des RES Ordners in den Root der JAR.
Funktioniert jetzt einwandfrei.


----------



## javanick (17. Dez 2010)

Bei mir ist es egal ob man das Icon im MIDlet-1-Tag oder im MIDlet-Icon-Tag angibt funtzt sowohl mit 16*16 als auch mit 32*32 Pixeln.


----------

