Lamerski kalkulator w Javie - jak uprościć kod?

0

Cześć,
napisałem taki kod w Javie:

package treningi;
import java.util.*;
public class Cw 
{
	public static void main(String[] args) 
	{
		System.out.println("Co chesz zrobić? \n1 -> dodawanie \n2 -> odejmowanie "
				+ "\n3 -> mnożenie \n4 -> dzielenie \n5 -> dzielenie modulo \n6 -> silnia\n");
		Scanner decyzja = new Scanner(System.in);
		int d = decyzja.nextInt();
		
		if (d == 1)
		{
			System.out.print("Podaj pierwszą liczbę: ");
			Scanner wejscie = new Scanner(System.in);
			int pierwsza_liczba = wejscie.nextInt();
			
			System.out.print("Podaj drugą liczbę: ");
			Scanner wejscie2 = new Scanner(System.in);
			int druga_liczba = wejscie2.nextInt();
			
			System.out.print("Wynik wynosi: " + dodawanie(pierwsza_liczba, druga_liczba));
			
		}
		else if (d == 2)
		{
			System.out.print("Podaj pierwszą liczbę: ");
			Scanner wejscie = new Scanner(System.in);
			int pierwsza_liczba = wejscie.nextInt();
			
			System.out.print("Podaj drugą liczbę: ");
			Scanner wejscie2 = new Scanner(System.in);
			int druga_liczba = wejscie2.nextInt();
			
			System.out.print("Wynik wynosi: " + odejmowanie(pierwsza_liczba, druga_liczba));
			
		}
		else if (d == 3)
		{
			System.out.print("Podaj pierwszą liczbę: ");
			Scanner wejscie = new Scanner(System.in);
			int pierwsza_liczba = wejscie.nextInt();
			
			System.out.print("Podaj drugą liczbę: ");
			Scanner wejscie2 = new Scanner(System.in);
			int druga_liczba = wejscie2.nextInt();
			
			System.out.print("Wynik wynosi: " + mnozenie(pierwsza_liczba, druga_liczba));
			
		}
		else if (d == 4)
		{
			System.out.print("Podaj pierwszą liczbę: ");
			Scanner wejscie = new Scanner(System.in);
			int pierwsza_liczba = wejscie.nextInt();
			
			System.out.print("Podaj drugą liczbę: ");
			Scanner wejscie2 = new Scanner(System.in);
			int druga_liczba = wejscie2.nextInt();
			
			System.out.print("Wynik wynosi: " + dzielenie(pierwsza_liczba, druga_liczba));
		}
		else if (d == 5)
		{
			System.out.print("Podaj pierwszą liczbę: ");
			Scanner wejscie = new Scanner(System.in);
			int pierwsza_liczba = wejscie.nextInt();
			
			System.out.print("Podaj drugą liczbę: ");
			Scanner wejscie2 = new Scanner(System.in);
			int druga_liczba = wejscie2.nextInt();
			
			System.out.print("Wynik wynosi: " + dzielenie_modulo(pierwsza_liczba, druga_liczba));
			
		}
		else if (d == 6)
		{
			System.out.print("Podaj liczbę: ");
			Scanner wejscie = new Scanner(System.in);
			int liczba_silnia = wejscie.nextInt();
			
			System.out.print("Wynik wynosi: " + silnia(liczba_silnia));
			
		}
		else 
		{
			System.out.print("BŁAD");		
		}

	}
	
	public static int dodawanie(int a, int b)
	{
		int wynik;
		wynik = a + b;
		return wynik;
	}
	
	public static int odejmowanie(int a, int b)
	{
		int wynik;
		wynik = a - b;
		return wynik;
	}
	
	public static int mnozenie(int a, int b)
	{
		int wynik;
		wynik = a * b;
		return wynik;
	}
	
	public static int dzielenie(int a, int b)
	{
		int wynik;
		wynik = a / b;
		return wynik;
	}
	public static int dzielenie_modulo(int a, int b)
	{
		int wynik;
		wynik = a % b;
		return wynik;
	}
	public static int silnia(int a)
	{
		int wynik = 1;
				
		for(int i = 1; i <= a; i++)
		{
			wynik = i * wynik;
		}
		return wynik;		
	}	
}

Moje pytania:

  1. jak uprosić ten kod aby nie powielać tych samych fragmentów kodu?
  2. o co chodzi eclipsowi z tym: Resource leak: [nazwa zmiennej] is never closed

Chodzi mi o to aby jak najbardziej wykorzystać ten sam kod wiele razy.

Na razie beż użycia klas i programowania obiektowego.

Napiszcie też swoje inne uwagi żebym już na początku nauki nie załapał złych nawyków...

2
  1. Scanner starczy tworzyć raz.
  2. Funkcje (poza silnia) są zupełnie niepotrzebne.
  3. Powinieneś przewidzieć sensowną reakcję na wpisanie czegoś co nie jest liczbą.
  4. Wynik działań (mnożenie, dodawanie, silnia) na liczbach typu int może nie być typu int, zmieniłem typ zwracanej wartości dla funkcji silnia. Twoja liczyła poprawnie tylko dla liczb <=12, moja do 20.
import java.util.*;
public class Cw 
{
    public static void main(String[] args) 
    {
        
        System.out.println("Co chesz zrobić? \n1 -> dodawanie \n2 -> odejmowanie "
                + "\n3 -> mnożenie \n4 -> dzielenie \n5 -> dzielenie modulo \n6 -> silnia\n");
        Scanner sc = new Scanner(System.in);
        int d = sc.nextInt();
        int pierwsza_liczba = 0;
        int druga_liczba = 0;
        if(d<6)
        {
            System.out.print("Podaj pierwszą liczbę: ");
            pierwsza_liczba = sc.nextInt();
 
            System.out.print("Podaj drugą liczbę: ");
            druga_liczba = sc.nextInt();        
        }
        else
        {
            System.out.print("Podaj liczbę: ");
            pierwsza_liczba = sc.nextInt();        
        }
        switch(d)
        {
            case 1:
                System.out.print("Wynik wynosi: " + dodawanie(pierwsza_liczba, druga_liczba));
                break;
            case 2:
                System.out.print("Wynik wynosi: " + odejmowanie(pierwsza_liczba, druga_liczba));
                break;
            case 3: 
                System.out.print("Wynik wynosi: " + mnozenie(pierwsza_liczba, druga_liczba));
                break;
            case 4: 
                System.out.print("Wynik wynosi: " + dzielenie(pierwsza_liczba, druga_liczba));
                break;
            case 5: 
                System.out.print("Wynik wynosi: " + dzielenie_modulo(pierwsza_liczba, druga_liczba));
                break;
            case 6:  
                System.out.print("Wynik wynosi: " + silnia(pierwsza_liczba));
                break;
            default:
                System.out.print("BŁAD");        
        }
 
    }
 
    public static int dodawanie(int a, int b)
    {
        return a+b;
    }
 
    public static int odejmowanie(int a, int b)
    {
        return a-b;
    }
 
    public static int mnozenie(int a, int b)
    {

        return a*b;
    }
 
    public static int dzielenie(int a, int b)
    {
        return a/b;
    }
    public static int dzielenie_modulo(int a, int b)
    {

        return a % b;
    }
    public static long silnia(int a)
    {
        long wynik = 1;
 
        for(int i = 1; i <= a; i++)
        {
            wynik = i * wynik;
        }
        return wynik;        
    }    
}
0

Ok, teraz program wygląda tak:

package treningi;
import java.util.*;
public class Cw 
{
	public static void main(String[] args) 
	{
		System.out.println("Co chesz zrobić? \n1 -> dodawanie \n2 -> odejmowanie "
				+ "\n3 -> mnożenie \n4 -> dzielenie \n5 -> dzielenie modulo \n6 -> silnia\n");
		Scanner decyzja = new Scanner(System.in);
		int d = decyzja.nextInt();
		
		int pierwsza_liczba;
		int druga_liczba;
		
		if (d < 6)
		{
			System.out.print("Podaj pierwszą liczbę: ");
			pierwsza_liczba = decyzja.nextInt();
			
			System.out.print("Podaj drugą liczbę: ");
			druga_liczba = decyzja.nextInt();
						
		}
		else
		{
			System.out.print("Podaj liczbę: ");
			pierwsza_liczba = decyzja.nextInt();
		}
		
		switch(d)
		{
			case 1: 
				System.out.print("Wynik wynosi: " + (pierwsza_liczba + druga_liczba)); break;
			case 2: 
				System.out.print("Wynik wynosi: " + (pierwsza_liczba - druga_liczba)); break;
			case 3: 
				System.out.print("Wynik wynosi: " + (pierwsza_liczba * druga_liczba)); break;
			case 4: 
				System.out.print("Wynik wynosi: " + (pierwsza_liczba / druga_liczba)); break;
			case 5: 
				System.out.print("Wynik wynosi: " + (pierwsza_liczba % druga_liczba)); break;
			case 6: 
				System.out.print("Wynik wynosi: " + silnia(pierwsza_liczba)); break;
			default:
				System.out.print("BŁAD");		
		}

	}
	public static long silnia(int a)
	{
		long wynik = 1;
				
		for(int i = 1; i <= a; i++)
		{
			wynik = i * wynik;
		}
		return wynik;		
	}	
}

I mam z nim takie problemy:
1. Nie chce się kompilować. Dostaję komunikat:
The local variable druga_liczba may not have been initialized. Co on oznacza i o co chodzi?
2. Jak nie powielać tego System.out.print?
3. O co chodzi z tym:
Resource leak: 'decyzja' is never closed?

Dzięki 100krotne za pomoc! :)

2
  1. Porównaj swój kod
int pierwsza_liczba;
int druga_liczba;
//z moim
int pierwsza_liczba = 0;
int druga_liczba = 0;
  1. Np. tak:
String msg = "Wynik wynosi: ";
        switch(d)
        {
            case 1: 
                msg+=(pierwsza_liczba + druga_liczba); break;
            case 2: 
                msg+=(pierwsza_liczba - druga_liczba); break;
            case 3: 
                msg+=(pierwsza_liczba * druga_liczba); break;
            case 4: 
                msg+=(pierwsza_liczba / druga_liczba); break;
            case 5: 
                msg+=(pierwsza_liczba % druga_liczba); break;
            case 6: 
                msg+=silnia(pierwsza_liczba); break;
            default:
                msg = "BŁAD";        
        }
System.out.print(msg);
  1. Jak cię to razi, to dopisz na końcu
decyzja.close();

1 użytkowników online, w tym zalogowanych: 0, gości: 1