• 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

Object Storage Arubacloud
0 głosów
119 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 149 wizyt
pytanie zadane 8 września 2017 w Java przez niezalogowany
0 głosów
0 odpowiedzi 119 wizyt
0 głosów
0 odpowiedzi 162 wizyt
pytanie zadane 30 września 2017 w Java przez olgak96 Nowicjusz (200 p.)

92,655 zapytań

141,545 odpowiedzi

319,979 komentarzy

62,024 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...