Gå till innehåll
Just nu i M3-nätverket

BufferedReader java problem


Machol07

Rekommendera Poster

Hej

Håller på att göra en enkel miniräknare i java men har fastnat lite. Det skall vara två metoder som läser in data på två olika sätt. Den ena metoden läser in strängar och den andra som ska vara en överlagrad metod läser in två double. Den sista inläsningen avgör räknesätt som gör med .equal i main metoden. Hur ska jag få double inläst på ett korrekt sätt?



public static void calculate(String op, String op1)throws IOException{

     BufferedReader input = new BufferedReader(new
     InputStreamReader(System.in));


     System.out.println("Ange tal");//   tal och tal2 är en klassvariablar
     op = input.readLine();
     tal =Integer.parseInt(op);


     System.out.println("Ange tal");
     op1 = input.readLine();
     tal2 =Integer.parseInt(op1);

     System.out.println("Räknesätt ange + - / x eller *");//op2 är en klassvariabel
     op2 = input.readLine();



 }

 public static void calculate(double op,  double op1)throws IOException{

     BufferedReader input = new BufferedReader(new
     InputStreamReader(System.in));

     System.out.println("Ange tal");
     op1 = input.read();
     op1=tal; 	// Problem här....tal variabeln är av typen int hur får jag den att ta värdet op1?


     System.out.println("Ange tal");
     op = input.read();
     tal2 =Double.parseDouble(op); // Och här en anna variant som är fel 



     System.out.println("Räknesätt ange + - / x eller *");
     op2 = input.readLine();
 }

Länk till kommentar
Dela på andra webbplatser

Ja, det var en del år sedan jag höll på med Java, men här kommer ett litet förslag kring hur man kan tänka. Detta är en uppmaning att tänka till lite då jag ser att det är en hel del blandade begrepp du använder på ett något förvirrat sätt.

 

1. Vi börjar med en liknande idé. Vi börjar att hämta data utifrån då jag ser att du använt buffertar och kanske någon gång tänkt på filer här. Ok, vi hoppar också första exemplet (som jag visserligen kodade men nu finner för enkelt).

 

2. Vi går på nästa direkt där vi hämtar in en lista av tal (siffror) skrivna i en separat textfil:

 


import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public class Test2 {
public static void main(String[] args) throws IOException {
	Scanner s = null;
	try {
		s = new Scanner(new BufferedReader(new FileReader("test.txt")));
		while (s.hasNext()) {
			System.out.println(s.next());
		}
	} finally {
		if (s != null) {
			s.close();
		}
	}
}
}

 

Vi hämtar varje tal och tolkar det inte speciellt utan det flyter igenom programmet som strängar. Det är endast text än så länge. Vi anänder något som är en "skanner". Den hämtar tecken och så kan vi manipulera dessa. Mycket användbart vi konsolen (som kommer att visas senare).

 

3. Vi läser samma textfil men nu börjar vi låta programmet begripa lite av de tecken som finns i filen:

 


import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;
import java.util.Locale;

public class Test3 {
public static void main(String[] args) throws IOException {
	Scanner s = null;
	double sum = 0;
	try {
		s = new Scanner(new BufferedReader(new FileReader("test.txt")));
		Locale swedishLocale = new Locale("sv", "SE");
		s.useLocale(swedishLocale);
		while (s.hasNext()) {
			if (s.hasNextDouble()) {
				sum += s.nextDouble();
			} else {
				s.next();
			}
		}
	} finally {
		s.close();
	}
	System.out.println(sum);
}
}

 

Här hämtar vi siffror skrivna på svenska t.ex. "23,34" där komma används för att separera decimaldelen av talet. Dessutom summeras alla tal som är separerade med radmatning i filen. Summan av alla tal skrivs slutligen ut.

 

4. Nu släpper vi filhanteringen och går till konsolen istället:

 


import java.io.IOException;
import java.util.Scanner;
import java.util.Locale;

public class Test4 {
public static void main(String[] args) throws IOException {
	Scanner s = null;
	double sum = 0;
	try {
		s = new Scanner(System.in);
		Locale swedishLocale = new Locale("sv", "SE");
		s.useLocale(swedishLocale);
		while (s.hasNext()) {
			if (s.hasNextDouble()) {
				sum += s.nextDouble();
			} else {
				String str = s.next();
				if (str.equals("+"))
					break;
			}
		}
	} finally {
		s.close();
	}
	System.out.println(sum);
}
}

 

Vi kan nu när vi kör programmet mata in talen direkt och sedan för att avsluta skriver vi ett plustecken och så skrivs summan av tidigare inmatade tal ut.

 

5. Vi gör det nu lite mer avancerat och samlar ihop alla tal som vi tolkat i en "array". Sedan använder vi denna "array" mot slutet för summeringen:

 


import java.io.IOException;
import java.util.Scanner;
import java.util.Locale;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Collections;

public class Test5 {
public static void main(String[] args) throws IOException {
	Scanner s = null;
	ArrayList<String> a = new ArrayList<String>();
	double sum = 0;
	try {
		s = new Scanner(System.in);
		Locale swedishLocale = new Locale("sv", "SE");
		s.useLocale(swedishLocale);
		while (s.hasNext()) {
			if (s.hasNextDouble()) {
				a.add(Double.toString(s.nextDouble()));
			} else {
				String str = s.next();
				if (str.equals("+"))
					break;
			}
		}
	} finally {
		s.close();
	}
	Enumeration e = Collections.enumeration(a);
	while(e.hasMoreElements()) {
		sum += Double.parseDouble((String) e.nextElement());
	}
	System.out.println(sum);
}
}

 

6. Vi kan nu separera ut en metod som adderar de tecken som kommer in:

 


import java.io.IOException;
import java.util.Scanner;
import java.util.Locale;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Collections;

public class Test6 {
public static void main(String[] args) throws IOException {
	Scanner s = null;
	ArrayList<String> a = new ArrayList<String>();
	try {
		s = new Scanner(System.in);
		Locale swedishLocale = new Locale("sv", "SE");
		s.useLocale(swedishLocale);
		while (s.hasNext()) {
			if (s.hasNextDouble()) {
				a.add(Double.toString(s.nextDouble()));
			} else {
				String str = s.next();
				if (str.equals("+"))
					break;
			}
		}
	} finally {
		s.close();
	}
	double answer = sum(a);
	System.out.println(answer);
}

public static double sum(ArrayList<String> a) {
	double sum = 0.0;
	Enumeration e = Collections.enumeration(a);
	while (e.hasMoreElements()) {
		sum += Double.parseDouble((String) e.nextElement());
	}
	return sum;
}
}

 

7. Slutligen ett förslag på att lägga till en ny beräkning: multiplikation:

 


import java.io.IOException;
import java.util.Scanner;
import java.util.Locale;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.Collections;

public class Test7 {
public static void main(String[] args) throws IOException {
	Scanner s = null;
	ArrayList<String> a = new ArrayList<String>();
	double answer = 0.0;
	try {
		s = new Scanner(System.in);
		Locale swedishLocale = new Locale("sv", "SE");
		s.useLocale(swedishLocale);
		while (s.hasNext()) {
			if (s.hasNextDouble()) {
				a.add(Double.toString(s.nextDouble()));
			} else {
				String str = s.next();
				if (str.equals("+")) {
					answer = sum(a);
					break;
				} else if (str.equals("*")) {
					answer = multiply(a);
					break;
				}
			}
		}
	} finally {
		s.close();
	}
	System.out.println(answer);
}

public static double sum(ArrayList<String> a) {
	double sum = 0.0;
	Enumeration e = Collections.enumeration(a);
	while (e.hasMoreElements()) {
		sum += Double.parseDouble((String) e.nextElement());
	}
	return sum;
}

public static double multiply(ArrayList<String> a) {
	double multi = 1.0;
	Enumeration e = Collections.enumeration(a);
	while (e.hasMoreElements()) {
		multi *= Double.parseDouble((String) e.nextElement());
	}
	return multi;
}
}

 

 

Här först separeras metoderna upp så att de sker i skilda funktioner av addition eller alternativt multiplikation. Typ så kan man resonera när man bryter upp saker i mindre beståndsdelar ...

Länk till kommentar
Dela på andra webbplatser

Hej

Håller på att göra en enkel miniräknare i java men har fastnat lite. Det skall vara två metoder som läser in data på två olika sätt. Den ena metoden läser in strängar och den andra som ska vara en överlagrad metod läser in två double. Den sista inläsningen avgör räknesätt som gör med .equal i main metoden. Hur ska jag få double inläst på ett korrekt sätt?



public static void calculate(String op, String op1)throws IOException{

     BufferedReader input = new BufferedReader(new
     InputStreamReader(System.in));


     System.out.println("Ange tal");//   tal och tal2 är en klassvariablar
     op = input.readLine();
     tal =Integer.parseInt(op);


     System.out.println("Ange tal");
     op1 = input.readLine();
     tal2 =Integer.parseInt(op1);

     System.out.println("Räknesätt ange + - / x eller *");//op2 är en klassvariabel
     op2 = input.readLine();



 }

 public static void calculate(double op,  double op1)throws IOException{

     BufferedReader input = new BufferedReader(new
     InputStreamReader(System.in));

     System.out.println("Ange tal");
     op1 = input.read();
     op1=tal; 	// Problem här....tal variabeln är av typen int hur får jag den att ta värdet op1?


     System.out.println("Ange tal");
     op = input.read();
     tal2 =Double.parseDouble(op); // Och här en anna variant som är fel 



     System.out.println("Räknesätt ange + - / x eller *");
     op2 = input.readLine();
 }

 

En double är alltid ett flyttal och inte ett + - * eller / tecken. Så du borde inte tilldela detta till op2 som i ditt nedersta försök

 

så antigen kallar du på en metod med (sträng, sträng) eller överlagrat med (double, double) i den sista berhöver du inte köra någon parse om du inte vill men för att välja räkne sätt bör du kanske kolla på hur man kan nyttja en case-sats eller privat variabel som du inte skickar med vid metodanropet.. Hoppas du hängde med på vad jag menar...

Länk till kommentar
Dela på andra webbplatser

Tack för svar! Jag löste det med att anropa metoder liknande det du beskriver Lars.

Indata tas emot i main i form av args[0],args[1],args[2]

metod calculate (string,string,string) lät jag typkonvertera till double för in talen och skickad resultatet vidare till

calculate (double,string,double) som sköter uträkning med if-satser

 

 

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.



×
×
  • Skapa nytt...