Sida 1 av 1
Jag behöver lite Java hjälp? [LÖST]
Postat: 06 jan 2008, 04:32
av lennart
Hej jag är i akut behov av hjälp!
Skriver en miniräknare med tillhörande gui, har fastnat lite på logiken?
Jag har fastnat på räknedelen, alltså hur man räknar med
n antal siffror!
Har hitills lyckats med att ta en sträng ifrån en textarea och delat upp den i en array med matematiska tecken (+ - * /) och en array med BigDecimal tal, sen när jag skall räkna ihop talen så blir det problem?
Håller på att få väldigt ont i huvudet av det här så jag skulle vara jättetacksam om någon kunde hjälpa mig.
Bifogar ett utdrag av koden.
Kod: Markera allt
public static String Calculate (String res) {
Scanner scanner = new Scanner (res);
Scanner scanner2 = new Scanner (res);
int n = res.length();
int LengthOfTokens = 0;
scanner.useDelimiter("[0123456789]");
scanner2.useDelimiter("[+-/*.]");
/* Determines the math symbols and how many symbols */
for (int i = 0; i < n; i++) {
if (scanner.hasNext ()) {
tokens[i] = scanner.next();
LengthOfTokens = LengthOfTokens + tokens[i].length(); // get length of mathsymbols
}
}
/* Determines the numbers to calculate */
for (int i = 0; i < n; i++) {
if (scanner2.hasNextBigDecimal()) {
calc[i] = scanner2.nextBigDecimal();
}
}
/* Det är denna loopen som inte funkar som det är tänkt, snälla hjälp mig, vill kunna plussa ihop n antal tal */
for (int i = 0; i < LengthOfTokens; i++) {
if (tokens[i].equals("+")) {
result = (calc[i].add (calc[i+1])); // calc[i] är en BigDecimal
}
}
res = result.toString();
return res;
}
SV: Jag behöver lite Java hjälp?
Postat: 06 jan 2008, 14:35
av Zhaozhou
Vad ger koden?
Det ser ut som att 1+2+3 kommer bli (1+2) + (2+3).
Kanske är det jag som är blind...
SV: Jag behöver lite Java hjälp?
Postat: 06 jan 2008, 14:36
av mcNisse
Du lägger inte ihop talen

Du borde få svaret av den sista additionen.
Kod: Markera allt
result = 0; //Lite osäker om denna konstrukion är korrekt för en bigint. Hoppas att du greppar vad jag menar.
for (int i = 0; i < LengthOfTokens; i++) {
if (tokens[i].equals("+")) {
result += (calc[i].add (calc[i+1])); // calc[i] är en BigDecimal
}
}
Finns det någon bra anledning till att result, calc och tokens är medlemsvariabler?
Dina får loopar är konstiga. Du behöver inte loopa upp till antal tecken i strängen.
Kod: Markera allt
for (LengthOfTokens = 0; scanner.hasNext(); ++LengthOfTokens) {
tokens[i] = scanner.next();
}
int numberOfNumbers;
for (numberOfNumbers = 0; scanner2.hasNextBigDecimal(); ++numberOfNumber) {
calc[numberOfNumbers] = scanner2.nextBigDecimal();
}
Tänk på att 2+2*6=14

Dvs att du måste beräkna multiplikation/division innan additon/subtraktion.
En sak till. Tänk på javas kodstandard, använd liten bokstav i början av variabelnamn och metodnamn.
Edit: Missade missen som Zhaozhou hittade. Min lösning implementerar den...

SV: Jag behöver lite Java hjälp?
Postat: 06 jan 2008, 18:08
av lennart
Finns det någon bra anledning till att result, calc och tokens är medlemsvariabler?
Nej, lathet bara började skriva koden i en innre lyssnar klass och kom på att det ser trevligare ut att flyta koden till en egen metod, glömde flytta variablerna till metoden, men det är åtgärdat nu.
Vad ger koden?
Det ser ut som att 1+2+3 kommer bli (1+2) + (2+3).
Kanske är det jag som är blind...
Nej du är inte blind och det är just här problemet ligger, vill att det skall bli 1+2+3 = 6. Det är första gången jag använder BigDecimal så jag är lite ovan med hur man utför beräkningar t.ex result += (calc
.add (calc[i+1])); ger komplileringsfel eftersom man inte kan göra +=. Tack för tipsen för övrigt skall försöka implementera dom i koden. Skulle bli tacksam ifall någon kunde lösa beräkningsproblemet åt mig.
SV: Jag behöver lite Java hjälp?
Postat: 06 jan 2008, 18:19
av Zhaozhou
lennart skrev:
Finns det någon bra anledning till att result, calc och tokens är medlemsvariabler?
Nej, lathet bara började skriva koden i en innre lyssnar klass och kom på att det ser trevligare ut att flyta koden till en egen metod, glömde flytta variablerna till metoden, men det är åtgärdat nu.
Vad ger koden?
Det ser ut som att 1+2+3 kommer bli (1+2) + (2+3).
Kanske är det jag som är blind...
Nej du är inte blind och det är just här problemet ligger, vill att det skall bli 1+2+3 = 6. Det är första gången jag använder BigDecimal så jag är lite ovan med hur man utför beräkningar t.ex result += (calc
.add (calc[i+1])); ger komplileringsfel eftersom man inte kan göra +=. Tack för tipsen för övrigt skall försöka implementera dom i koden. Skulle bli tacksam ifall någon kunde lösa beräkningsproblemet åt mig.
En enkel fix (temporär(!)) skulle vara att byta ut "i++" mot "i = i+2".
Men som mcNisse säger finns det mer att ändra, vilket förbättrar koden en del.
Dessutom har jag aldrig i hela mitt liv använt Java, överhuvudtaget, men ".add()" verkar rätt logiskt.
SV: Jag behöver lite Java hjälp?
Postat: 06 jan 2008, 18:26
av svartberg
Jag vet inte om jag förstått det hela rätt vad du vill göra, men räcker inte detta?
Kod: Markera allt
/* Det är denna loopen som inte funkar som det är tänkt, snälla hjälp mig, vill kunna plussa ihop n antal tal */
for (int i = 0; i < LengthOfTokens; i++) {
if (tokens[i].equals("+")) {
result += calc[i];
}
}
SV: Jag behöver lite Java hjälp?
Postat: 06 jan 2008, 18:51
av lennart
ag vet inte om jag förstått det hela rätt vad du vill göra, men räcker inte detta?
Kodstycke:
/* Det är denna loopen som inte funkar som det är tänkt, snälla hjälp mig, vill kunna plussa ihop n antal tal */
for (int i = 0; i < LengthOfTokens; i++) {
if (tokens.equals("+")) {
result += calc;
}
}
Jo om den tilldelningen (result += calc
hadde funkat så ser det ut som att det skulle kunna funka, men eftersom jag vill använda mig utav BigDecimal som är ett objekt och inte en datatyp som t.ex int så klagar kompilatorn på den tilldelningen? Vet ingen hur man skriver motsvarande sats fast för BigDecimal?
SV: Jag behöver lite Java hjälp?
Postat: 06 jan 2008, 19:08
av mcNisse
SV: Jag behöver lite Java hjälp?
Postat: 06 jan 2008, 19:21
av svartberg
Jaha nu så förstår jag bättre.
Jag vet en lösning fast kanske inte den finaste men tror den kan fungera i alla fall.
Kod: Markera allt
/* Det är denna loopen som inte funkar som det är tänkt, snälla hjälp mig, vill kunna plussa ihop n antal tal */
int usedNumber = -2; // Får inte vara ett positivt tal från början.
for (int i = 0; i < LengthOfTokens; i++) {
if (tokens[i].equals("+") && usedNumber != i) { // Kolla att talet som redan använts inte används igen
result += ( calc[i].add( calc[i+1] ) ) ;
usedNumber = i+1; // markera att talet inte ska användas igen
}
}
SV: Jag behöver lite Java hjälp?
Postat: 06 jan 2008, 20:01
av lennart
result.add(calc);
Naturligtvis.... ibland har man inte huvudet på skaft. Tack för all hjälp nu funkar det som det ska, tack för tipset med looparna de var mycket snyggare än mina lösningar.
Orkar inte testa sista kodstycket nu med tanke på att det har löst sig, men tack för hjälpen ivarjefall.