• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem ze skanowaniem danych do kalkulatora

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
161 wizyt
pytanie zadane 21 lutego 2017 w Java przez Wojo7 Nowicjusz (160 p.)

Witam, oto treść zadania którę usiłuje napisać:

Napisz kalkulator interpretujący wpisany tekst, tzn. użytkownik wpisuje liczby naturalne od -999 do 999, następnie znak mnożenia, dzielenia, dodawania lub odejmowania i znowu cyfry -999 do 999. Program drukuje wynik, a użytkownik wpisuje następne działanie. Zabezpiecz się przed największą możliwą ilością błędów użytkownika. Tekst END kończy wpisywanie danych.

Mój kod:

package kalkulator;

import java.util.*;

/**
 * Kalkulator
 */
public class Main
{	
	public static void main(String[] args)
	{
		int a = 0, b = 0, wynik = 0;
		char znak = 0;
		a = readInt();
		while(true)
		{
			if(wynik != 0)
				a = wynik;
			znak = readChar();
			b = readInt();
			if(b == 1000)
				break;
			wynik = calculate(a, znak, b);
			System.out.println("Wynik to: " + wynik);
		}
	}
	
	/**
	 * Metoda czytająca liczbę
	 */
	public static int readInt()
	{
		Scanner INT = new Scanner(System.in);
		System.out.print("Podaj liczbę: ");
		String buffer = INT.next();
		INT.close();
		if(buffer.equals("END"))
			return 1000;
		int a = 0;
		try
		{
		a = Integer.valueOf(buffer);
		}
		catch(NumberFormatException e)
		{
			System.out.println("To nie jest liczba.");
			readInt();
		}
		if(a < -999 || a > 999)
		{
			System.out.println("Podałeś liczbę spoza przedziału.");
			readInt();
		}
		return a;
	}
	
	/**
	 * Metoda czytająca znak
	 */
	public static char readChar()
	{
		Scanner CHAR = new Scanner(System.in);
		System.out.print("Podaj znak: ");
		String buffer = CHAR.nextLine();
		CHAR.close();
		char c = 0;
		if(buffer.length() != 1)
		{
			System.out.println("Wpisałeś za dużo znaków.");
			readChar();
		}
		if(buffer.equals(" "))
		{
			System.out.println("Wpisałeś spacje.");
			readChar();
		}
		switch(c = buffer.charAt(0))
		{
		case '+': c = '+';
			break;
		case '-': c = '-';
			break;
		case '*': c = '*';
			break;
		case '/': c = '/';
			break;
		default:
			buffer = "";
			System.out.println("Podałeś zły znak.");
			readChar();
			break;
		}
		return c;
	}
	
	/**
	 * Metoda licząca wynik
	 */
	public static int calculate(int a, char znak, int b)
	{
		int wynik = 0;
		switch(znak)
		{
		case '+': wynik = a + b;
			break;
		case '-': wynik = a - b;
			break;
		case '*': wynik = a * b;
			break;
		case '/': wynik = a / b;
			break;
		}
		return wynik;
	}
}

A problem jaki występuję to problem ze skanowanie danych próbowałem już przeróżnych sposobów i w rezulltacie nie umiem sobie z tym poradzić :/Również chciałbym się zapytać czy w ogóle dobrze podchodzę do rozwiązywania tego czy też tekst nie powinnien np. być skanowany w jednej lini, a jeśli tak to również prosiłbym o jakąś podpowiedź.

1 odpowiedź

0 głosów
odpowiedź 21 lutego 2017 przez Mateusz51 Nałogowiec (28,180 p.)
edycja 21 lutego 2017 przez Mateusz51
linika 90,70,52,47 wywołujesz metody które coś zwracają i zależy Ci na ich wyniku. A nigdzie nie przypisujesz ani nie zwracasz ich wyniku.

linijka 14. Dlaczego a czytasz tylko jeden raz?

Nie lepiej używać metod nextInt() i nextChar() w skanerze? Bo teraz masz troche pomieszane i rodzą Ci się problemy z niewyczyszczonym bufforem. Ale tak czy siak uważam że powinienes brać od użytkownika jedną linijke reprezentujacą dzialanie a nie rozbijac ja na trzy kroki. Tzn bierzesz od użytkownika linijke dzialania. Sprawdzasz czy equals END, nastepnie robisz split(" ") <-spacja i masz 3 stringi. Każdy parsujesz jako Integer.parse() albo String.charAt() jeśli wyskoczy Ci podrodze jakiś wyjątek prosisz użtkownika o ponowne przesłanie danych

PS. Tak mi się przypominało. Nie musisz pobierać znaku działanai jako znak. Switch case działa również na stringach.
komentarz 21 lutego 2017 przez Wojo7 Nowicjusz (160 p.)
Na czym dokładnie polega ten split?
komentarz 21 lutego 2017 przez Mateusz51 Nałogowiec (28,180 p.)

Jak sama nazwa wskazuje dzieli string na miejsze czesci.

http://docs.oracle.com/javase/8/docs/api/java/lang/String.html

String line = "Ala ma dużego kota"
String[] words = line.split(" ");

System.out.println(words[1]); // Wypisze Ci "ma"

 

Podobne pytania

0 głosów
2 odpowiedzi 168 wizyt
pytanie zadane 8 września 2017 w Java przez niezalogowany
0 głosów
0 odpowiedzi 130 wizyt
0 głosów
0 odpowiedzi 172 wizyt
pytanie zadane 30 września 2017 w Java przez olgak96 Nowicjusz (200 p.)

93,096 zapytań

142,060 odpowiedzi

321,510 komentarzy

62,439 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...