webForumDet fria alternativet

simpel miniräknare

47 svar · 1 467 visningar · startad av jenicpunktnu

jenicpunktnuMedlem sedan juni 200343 inlägg
#1

Koden följer här under.
Har lyckas gjort klart med allt utom hur man räknar ut summan...
Av nån anledning så vill de olika testerna jag gjort ej fungera.

Jag förstår att jag skall omvandla strängarna tal1 och tal2 till ett flyttal igenom klassmetoden: public static double parseDouble(String s). Och sedan Hämta det första tecknet i strängen tecken genom instansmetoden
public char[] toCharArray() och tilldela det till en array av char.
Sedan kan jag jämföra tecknen med det första tecknet i arrayen i if satser eller i switch satser.
Men somsagt detta vill ej funka för mig.
(fråga mig ej varför miniräknaren är i popup fönster bara...ej jag som bestämt)

import java.awt.GridLayout;
import java.awt.event.*;
import javax.swing.*;

public class Projekt extends JFrame {
private JTextField forsta;
private JTextField andra;
private JTextField operator;

public static double parseDouble(String s)


public Projekt() {

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // Välkommen
    JOptionPane.showMessageDialog(null,
    	"Välkommen till min miniräknare");

    // första talet
    String tal1 = JOptionPane.showInputDialog(null,
        "Skriv in det första talet:");
    forsta = new JTextField(tal1, 20);

    // Andra talet
    String tal2 = JOptionPane.showInputDialog(null,
        "Skriv in det andra talet:");
    andra = new JTextField(tal2, 20);

    // tecknet
	String tecken = JOptionPane.showInputDialog(null,
		"Skriv in vilken operator ni vill använda\\n + - \* / %");
    operator = new JTextField(tecken, 20);

	// Summan
	JOptionPane.showMessageDialog(null,
		tal1 + " " + tecken + " " + tal2 + " = " + summa);

}

public static void main(String\[\] arguments) {
    Projekt frame = new Projekt();
}

}

jmeMedlem sedan maj 20012 237 inlägg
#2

hmm, det ser lite lustigt ut :)
Varför du ahr allt i popup fönster är att du använder JOptionPane.showMessage();

Använd inte JOptionPane utan klassen JFrame för att visa text samt textrutor(JTextField) på skärmen.

Ditt program är heller inte helt komplett vad det gäller att visa komponenterna på skärmen.

Sedan för att du skall kunna beräkna summan av dina tal så måste du använda en s k lyssnare som lyssnar efter händelser såsom knapptryckning osv. Genom att bara fylla i tal i textfälten räcker inte.

Sedan använder du dig av följande sats för att räkna summan:

tal1 + " " + tecken + " " + tal2 + " = " + summa

Det fungerar inte. Du kan inte räkna med att summa ihop talen sådär. Kom ihåg att tal1 och tal2 är String object.

Låt oss säga att tal1 = "12" och tal2 = "13"

tal1 + tal2 blir inte 25 utan det blir "1213".

Sedan så har du variabeln summa men den har du inte deklarerat nånstans.

Följande kod hjälper dig rätt så långt men du måste nu ta reda på vilken operator som användaren har skrivit in i operator textfältet.

public class Projekt extends JFrame implements ActionListener
{
	private JTextField forsta;
	private JTextField andra;
	private JTextField operator;
	
	private JLabel resultat;
	
	private double summa;
	
	private JButton rakna;
	
	public Projekt()
	{
		super("miniräknare");
		
		getContentPane().setLayout(new FlowLayout() );
		forsta = new JTextField(10);
		andra = new JTextField(10);
		operator = new JTextField(2);
		resultat = new JLabel("0");
		
		rakna = new JButton("Räkna");
		rakna.addActionListener(this);
		
		
		getContentPane().add(forsta);
		getContentPane().add(operator);
		getContentPane().add(andra);
		getContentPane().add(resultat);
		getContentPane().add(rakna);
		
		
		setBounds(0,0,400,200);
		setVisible(true);
		
		
		
	}
	
	public void actionPerformed(ActionEvent e)
	{
		double a = Double.parseDouble(forsta.getText() );
		double b = Double.parseDouble(andra.getText() );
		
		// sedan så måste du även ta reda på vilken operator som man använder
		
		//baserad på det så kan du då göra en if-else sats
		
		
	}
	
	public static void main(String[] args)
	{
		new Projekt();
	}

Har du fler frågor så fråga gärna men försök ett tag först. Det är alltid roligare att *själv* hitta en fungerande lösning. Hittar du inte så hjälper vi nog gärna. :)

ViktorMedlem sedan aug. 20021 752 inlägg
#3

Re: simpel miniräknare

jme, tror du missed en del av inlägget :)

(fråga mig ej varför miniräknaren är i popup fönster bara...ej jag som bestämt)

jenicpunktnu skrev:

Jag förstår att jag skall omvandla strängarna tal1 och tal2 till ett flyttal igenom klassmetoden: public static double parseDouble(String s). Och sedan Hämta det första tecknet i strängen tecken genom instansmetoden public char[] toCharArray() och tilldela det till en array av char.
Sedan kan jag jämföra tecknen med det första tecknet i arrayen i if satser eller i switch satser.
Men somsagt detta vill ej funka för mig.

Men var är den koden som inte fungerar? Den koden som du visar här är väll bara till för att få input från användaren och visa resultatet.
Det låter som en bra ide att använda en switch sats i t.ex. en while som går igenom hela teckan arrayen, om det nu ska kunna vara flera tel och tecken.
Skriv ihopp en summerings funktion och om du fortfarande har problem lägg ut koden till den och säg vad som inte fungerar så är det lättare att peka på vad som är fel.

Tänk även på att använda kod taggarna när du postar kod, lär mer om det här, Kodtaggar.

/Viktor

jenicpunktnuMedlem sedan juni 200343 inlägg
#4

tack för svaren! skall kolla upp detta direkt!

jenicpunktnuMedlem sedan juni 200343 inlägg
#5

Tack för tipsen, har provat fram och tillbaka just nu men...
Som du kan läsa nedan så vill de sig ej, vad är det med denna lösningen på "summan" som ej vill funka som de skall?

På förhand tack
-------------------
import java.awt.GridLayout;
import java.awt.event.*;
import javax.swing.*;

public class Projekt extends JFrame
{
private JTextField forsta;
private JTextField andra;
private JTextField operator;

public Projekt()
{

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    // Välkommen
    JOptionPane.showMessageDialog(null,
    	"Välkommen till min miniräknare");

    // första talet
    String tal1 = JOptionPane.showInputDialog(null,
        "Skriv in det första talet:");
    forsta = new JTextField(tal1, 20);

    // Andra talet
    String tal2 = JOptionPane.showInputDialog(null,
        "Skriv in det andra talet:");
    andra = new JTextField(tal2, 20);

    // tecknet
	String tecken = JOptionPane.showInputDialog(null,
		"Skriv in vilken operator ni vill använda\\n + - \* / %");
    operator = new JTextField(tecken, 20);

	// Summan
	JOptionPane.showMessageDialog(null,
		tal1 + " " + tecken + " " + tal2 + " = " + summan);
}
public static double parseDouble(String s)
	{
		int forstaTalet, andraTalet, summan;
		char Operatorn;

		forstaTalet = tal1;
		andraTalet = tal2;

switch(tecken)
		{
	case 43:
	summan = forstaTalet++andraTalet;
	break;

	case 45:
	summan = forstaTalet-andraTalet;
	break;

	case 42:
	summan = forstaTalet\*andraTalet;
	break;

	case 47:
	summan = forstaTalet/andraTalet;
	break;

	case 37:
	summan = forstaTalet%andraTalet;
	break;

	default:
	JOptionPane.showMessageDialog(null,
		"Skriv in vilken operator ni vill använda\\n + - \* / %");
		}

	}
public static void main(String\[\] arguments)
	{
    Projekt frame = new Projekt();
	}

}
--------------------
Projekt.java:50: ';' expected
summan = forstaTalet++andraTalet;
^
Projekt.java:37: cannot resolve symbol
symbol : variable summan
location: class Projekt
tal1 + " " + tecken + " " + tal2 + " = " + summan);
^
Projekt.java:44: cannot resolve symbol
symbol : variable tal1
location: class Projekt
forstaTalet = tal1;
^
Projekt.java:45: cannot resolve symbol
symbol : variable tal2
location: class Projekt
andraTalet = tal2;
^
Projekt.java:47: cannot resolve symbol
symbol : variable tecken
location: class Projekt
switch(tecken)
^
5 errors

jmeMedlem sedan maj 20012 237 inlägg
#6

Kan direkt säga att switch() kan endast användas med int och du kör med en String inuti switch satsen. Varaibeln tecken är ju en String.


String tecken = JOptionPane.showInputDialog(null, 
"Skriv in vilken operator ni vill använda\n + - * / %"); 
operator = new JTextField(tecken, 20);

tecken skall då förhoppningsvis enbart innehålla ett tecken.
Men tro inte att det är så alltid. Folk kan skriva dit vadsomhelst.
Så du bör ha nån slags kontroll över vad som skrivs in.

t ex för att kontrollera att tecken endast innehåller ett tecken:
Kontrollera också att tecken inte är null för då kommer nästa rad att kasta ett undantag .

if(tecken.length() == 1)
{
// allt är OK
}

För att kontrollera om tecken innehåller en operator så kan du göra såhär:

if(tecken.equals("+") )
{

}
else if(tecken.equals("-") )
{

}
osv...

vill du verkligen använda en switch sats för att göra samma sak som ovan så måste du konvertera tecken till en int:

int val = tecken.hashCode();

men då måste du vara säker på att Stringen tecken enbart innehåller ett tecken.

Sedan så måste du även veta ascii-koden till varje operator.
Det blir lite onödigt jobb men du får bestämma själv. Jag tycker att switch pass bäst när man jobbar med int.

Sen

summan = forstaTalet++andraTalet;

du har nog råkat skriva ett '+' tecken för mycket

jmeMedlem sedan maj 20012 237 inlägg
#7

Kan tillägga detta:

du har:


Projekt.java:50: ';' expected 
summan = forstaTalet++andraTalet;

Som jag sa redan i mitt föraa inlägg så kommer summan inte bli vad du vill för att när man arbetar med Strings och + operatorn så blir dresultatet inte det samma som vid beräkning av variablar av typen int.

int a = 1;
int b = 3;

int c = a + b; // c = 4

String a = "1";
String b = "2";
String c = a + b; // c = "12" och inte "3";
ovanstående rad konkatenerar, dvs slår ihop två Stringar rakt av.

Därfär bör du antigen använda dig utav int om du vill beräkna hel tal och om du vill att resultatet ska vara heltal.
Men när du dividerar så kan resultatet vara ett bråktal och då kan du inte använda int, utan double eller float.

jenicpunktnuMedlem sedan juni 200343 inlägg
#8

public static double parseDouble(String s)
{
int forstaTalet, andraTalet, summan;
char Operatorn;

forstaTalet = tal1;
andraTalet = tal2;

int val = tecken.hashCode();

switch(val)
{
case 43:
summan = forstaTalet+andraTalet;
break;

case 45:
summan = forstaTalet-andraTalet;
break;

case 42:
summan = forstaTalet*andraTalet;
break;

case 47:
summan = forstaTalet/andraTalet;
break;

case 37:
summan = forstaTalet%andraTalet;
break;

default:
JOptionPane.showMessageDialog(null,
"Skriv in vilken operator ni vill använda\n + - * / %");
}

Projekt.java:37: cannot resolve symbol
symbol : variable summan
location: class Projekt
tal1 + " " + tecken + " " + tal2 + " = " + summan);
^
Projekt.java:44: cannot resolve symbol
symbol : variable tal1
location: class Projekt
forstaTalet = tal1;
^
Projekt.java:45: cannot resolve symbol
symbol : variable tal2
location: class Projekt
andraTalet = tal2;
^
Projekt.java:47: cannot resolve symbol
symbol : variable tecken
location: class Projekt
int val = tecken.hashCode();
^
4 errors

jenicpunktnuMedlem sedan juni 200343 inlägg
#9

public static double parseDouble(String s)
{
int forstaTalet, andraTalet, summan;
char Operatorn;

forstaTalet = tal1;
andraTalet = tal2;

Operatorn = tecken;

if (Operatorn = "+")
summan = forstaTalet+andraTalet;
else if (Operatorn = "-")
summan = forstaTalet-andraTalet;
else if (Operatorn = "*")
summan = forstaTalet*andraTalet;
else if (Operatorn = "/")
summan = forstaTalet/andraTalet;
else if (Operatorn = "%")
summan = forstaTalet%andraTalet;
}
Testade detta, men nej inte de hellet.
Grejjen är den att jag måste använda ytterliggare
"public static " va? och sedan köra kontrollen av texten där va?

ViktorMedlem sedan aug. 20021 752 inlägg
#10

Jag har inte läst hela tråden men ett fel ser jag

if (Operatorn = "+")

Du måste ha dubbel =,

if (Operatorn == "+")

det gäller på alla jämförelser.

== lika med,
= tilldelning.

/Viktor

jmeMedlem sedan maj 20012 237 inlägg
#11

om du ska jämföra två tal så måste du använda == och inte =

if (Operatorn = "+")
blir alltid true

det skall vara

if(Operatorn == "+")

Sen ett råd, variabeln ska aldrig börja med en stor bokstav.

Ett undantag är konstanta variablar, men de skrivs oftast helt och hållet med stora bokstäver.

När du jämför char så måste du använda ' och inte "

dvs

if(operatorn == '+')

jämför du Strings så kör du med "

ViktorMedlem sedan aug. 20021 752 inlägg
#12

Lite fler saker :)

skriv inte "+", utan du måste skriva '+' och '-' osv. Om du använder " så betyder det att det är en sträng, och då jämför du om minnes adressen för Operator är samma som minnes adressen för "+", och det är ju inte det som du vill göra.

Sen finns inte % heller utan du får köra med annan matte, om du ska ha 10% av 100 så skriver du 100*0,1 t.ex.

EDIT, EXTRA :)
Om du i framtiden ska jämföra strängar så finns det en funktion som heter equals, då skriver du såhär

String s="Kalle Anka";
if(s.equals("KalleAnka"))
     System.out.println("String s innehåller texten KalleAnka");
else
     System.out.println("String s innehåller INTE texten KalleAnka");

/Viktor

jenicpunktnuMedlem sedan juni 200343 inlägg
#13

import java.awt.GridLayout;
import java.awt.event.*;
import javax.swing.*;

public class Projekt extends JFrame
{
private JTextField forsta;
private JTextField andra;
private JTextField operator;

public Projekt()
{

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// Välkommen
JOptionPane.showMessageDialog(null,
"Välkommen till min miniräknare");

// första talet
String tal1 = JOptionPane.showInputDialog(null,
"Skriv in det första talet:");
forsta = new JTextField(tal1, 20);

// Andra talet
String tal2 = JOptionPane.showInputDialog(null,
"Skriv in det andra talet:");
andra = new JTextField(tal2, 20);

// tecknet
String tecken = JOptionPane.showInputDialog(null,
"Skriv in vilken operator ni vill använda\n + - * /");
operator = new JTextField(tecken, 20);

// Summan
JOptionPane.showMessageDialog(null,
tal1 + " " + tecken + " " + tal2 + " = " + summan);
}
public static double parseDouble(String s)
{
int forstaTalet, andraTalet, summan;
char operatorn;

forstaTalet = tal1;
andraTalet = tal2;

operatorn = tecken;

if (operatorn == '+')
summan = forstaTalet+andraTalet;
else if (operatorn == '-')
summan = forstaTalet-andraTalet;
else if (operatorn == '*')
summan = forstaTalet*andraTalet;
else if (operatorn == '/')
summan = forstaTalet/andraTalet;

}
public static void main(String[] arguments)
{
Projekt frame = new Projekt();
}
}
--------
Projekt.java:37: cannot resolve symbol
symbol : variable summan
location: class Projekt
tal1 + " " + tecken + " " + tal2 + " = " + summan);

Projekt.java:44: cannot resolve symbol
symbol : variable tal1
location: class Projekt
forstaTalet = tal1;

Projekt.java:45: cannot resolve symbol
symbol : variable tal2
location: class Projekt
andraTalet = tal2;

Projekt.java:47: cannot resolve symbol
symbol : variable tecken
location: class Projekt
operatorn = tecken;
4 errors

ViktorMedlem sedan aug. 20021 752 inlägg
#14

tal1, tal2 och teckan finns bara deklarerade i konstruktorn, inte i någon annan funktion. Flytta upp dem till samma ställe där du har deklarerat dina textfields. Samma sak gäller för summa, fast den är bara deklarerad i funktionen parseDouble.

Så vill jag åter igen påminna om att använda kod taggarna när du postar kod, Kodtaggar.

/Viktor

jmeMedlem sedan maj 20012 237 inlägg
#15

Vi tar första felet:

Projekt.java:37: cannot resolve symbol
symbol : variable summan
location: class Projekt
tal1 + " " + tecken + " " + tal2 + " = " + summan);

Det får du för att variabeln summan kan inte hittas.
Visst har du deklarerat variabeln summan men det har du gjort inuti metoden parseDouble() och då ses den variabeln endast inuti just den metod. För att ge hela klassen samt alla dess metoder åtkomst åt variabeln summan så måste du deklarera den i början av klassen, dvs t ex där du har deklarerat
JTextField variablerna.

kika på detta:


public class Test
{
	// här är ett bra ställe för att skriva in variablerna

	private int tal = 2;	// denna variabel är synlig för hela klassen
	
	
	public Test()
	{
		metod2();
	}
	
	public void metod()
	{
		int tal2 = 12; // denna variabel kan endast användas inuti denna metod
	}
	
	public void metod2()
	{
		int tal = 13;	// detta är inte samma variabel som variabeln tal som jag skapade på rad 6
		
		System.out.println(tal);	// skriver ut 13 och inte 2
		
		System.out.println(this.tal); // skriver ut 2 och inte 13
		
	}
	
	public static void main(String[] args)
	{
		new Test();
	}
}
jenicpunktnuMedlem sedan juni 200343 inlägg
#16

TACK SÅ MYCKE ATT DU TAR DIG TIDEN ATT SVARA!
Men jag tror fan att jag fäller en tår eller liknande här hemma strax... :r
fattar ej varför den ej vill funka (kan kanske bero delvis på sömnbrist...)

import java.awt.GridLayout;
import java.awt.event.*;
import javax.swing.*;

public class Projekt extends JFrame
{
private JTextField forsta;
private JTextField andra;
private JTextField operator;
private String tal1;
private String tal2;
private String tecken;
private int summan;

public Projekt()
{

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// Välkommen
JOptionPane.showMessageDialog(null,
"Välkommen till min miniräknare");

// första talet
tal1 = JOptionPane.showInputDialog(null,
"Skriv in det första talet:");
forsta = new JTextField(tal1, 20);

// Andra talet
tal2 = JOptionPane.showInputDialog(null,
"Skriv in det andra talet:");
andra = new JTextField(tal2, 20);

// tecknet
tecken = JOptionPane.showInputDialog(null,
"Skriv in vilken operator ni vill använda\n + - * /");
operator = new JTextField(tecken, 20);

// Summan
JOptionPane.showMessageDialog(null,
tal1 + " " + tecken + " " + tal2 + " = " + summan);
}
public static double parseDouble(String s)
{
int forstaTalet, andraTalet;
char operatorn;

forstaTalet = tal1;
andraTalet = tal2;

operatorn = tecken;

if (operatorn == '+')
summan = forstaTalet+andraTalet;
else if (operatorn == '-')
summan = forstaTalet-andraTalet;
else if (operatorn == '*')
summan = forstaTalet*andraTalet;
else if (operatorn == '/')
summan = forstaTalet/andraTalet;

}
public static void main(String[] arguments)
{
Projekt frame = new Projekt();
}
}

Projekt.java:48: non-static variable tal1 cannot be referenced from a static con
text
forstaTalet = tal1;
^
Projekt.java:49: non-static variable tal2 cannot be referenced from a static con
text
andraTalet = tal2;
^
Projekt.java:51: non-static variable tecken cannot be referenced from a static c
ontext
operatorn = tecken;
^
Projekt.java:54: non-static variable summan cannot be referenced from a static c
ontext
summan = forstaTalet+andraTalet;
^
Projekt.java:56: non-static variable summan cannot be referenced from a static c
ontext
summan = forstaTalet-andraTalet;
^
Projekt.java:58: non-static variable summan cannot be referenced from a static c
ontext
summan = forstaTalet*andraTalet;
^
Projekt.java:60: non-static variable summan cannot be referenced from a static c
ontext
summan = forstaTalet/andraTalet;
^
7 errors
--------------

String s="Kalle Anka";
if(s.equals("KalleAnka"))
System.out.println("String s innehåller texten KalleAnka");
else
System.out.println("String s innehåller INTE texten KalleAnka");

Angående denna koden, jämför den alltså texten man skriver efter = (dvs "Kalle Anka") i ditt exempel, eller kan den gå in i en variabel och hitta tecknet/tecknen som finns där?

Dvs hade denna funkat här?

String s= tecken;
if(s.equals("+"))
System.out.println("String s innehåller tecknet +");

osv?

ViktorMedlem sedan aug. 20021 752 inlägg
#17

Ändra,

public static double parseDouble(String s)

till

public double parseDouble(String s)

så fungerar det.

equals används för att jämföra en sträng med en annan sträng

String s= tecken; 
if(s.equals("+")) 
System.out.println("String s innehåller tecknet +");

Japp, det fungera, "+" är en sträng och s är en sträng.
Du kan läsa mer om funktionen i Javas API doc, Java API, där hittar du mycket information.

/Viktor

PeWMedlem sedan juni 200010 432 inlägg
#18

Sen är det så mycket lättare att läsa koden om den är postad med kod-taggar ([ kod]...[ /kod]) :)

jenicpunktnuMedlem sedan juni 200343 inlägg
#19
public double parseDouble(String s)
{
int forstaTalet, andraTalet;
char operatorn;

forstaTalet = tal1;
andraTalet = tal2;

operatorn = tecken;

if (operatorn == '+')
summan = forstaTalet+andraTalet;
else if (operatorn == '-')
summan = forstaTalet-andraTalet;
else if (operatorn == '*')
summan = forstaTalet*andraTalet;
else if (operatorn == '/')
summan = forstaTalet/andraTalet;

}

Projekt.java:48: incompatible types
found : java.lang.String
required: int
forstaTalet = tal1;
^
Projekt.java:49: incompatible types
found : java.lang.String
required: int
andraTalet = tal2;
^
Projekt.java:51: incompatible types
found : java.lang.String
required: char
operatorn = tecken;
^
3 errors

Vad är det som gör att det ej går att deklarera dessa?

jenicpunktnuMedlem sedan juni 200343 inlägg
#20

ursäkta att jag ej använt mig av kod-taggar, håller med om att det blev MYCKE enklare.
Var dessvärre ej medveten om det, dessvärre.

216 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
213 ms — hämta tråd, inlägg och bilagor (db)