Pytanie początkujacego. Pętla if, else if

0

Witam,

Dla większości z Was pytanie pewnie banalnie proste, ale nie daje mi spokoju. Dla wprawy wykonuję proste zadania z netu. Znalazłem między innymi zadnie, w którym trzeba stworzyć prosty system ratalny wyliczający wysokość rat. Danymi wejściowymi są:

  • cena towaru (od 100 zł do 10000 zł),
  • liczba rat (od 6 do 48),
    Oprocentowanie w zależności od liczby rat:
  • 6 - 12 wynosi 2.5%
  • 13 - 24 wynosi 5%
  • 25 - 48 wynosi 10%
    Program sprawdza, czy podane dane mieszczą się w powyższych zakresach.

Niby nic trudnego. Napisałem prosty kod, który znajdziecie poniżej:

import java.util.*;

public class obliczanieRat 
{
	public static void main(String[] args)
	{
		Scanner in = new Scanner(System.in);
		System.out.print("Podaj kwotę zakupu:");
		int kwota = in.nextInt();
		System.out.print("Podaj ilość rat:");
		int raty = in.nextInt();
				
		//Sprawdzenie kwoty
		while (kwota < 100 || kwota > 10000)
		{
			System.out.print("Podaj kwotę zakupu w przedziale 100zł - 10000zł: ");
			kwota = in.nextInt();
		}
		//Sprawdzenie rat
		while (raty < 6 || raty > 48)
		{
			System.out.print("Podaj poprawną liczbę rat z przedziału 6 - 48:");
			raty = in.nextInt();
		}
	
		// Obliczanie wyskości rat
		if (raty <= 12)
		{
			double rata = (kwota + (kwota * 0.025)) / raty;
			System.out.println("Przy kwocie: " + kwota + " i liczbie rat: " + raty + ". Kwota jednej raty wyniesie: " + rata + "zł");
		}
		else if (raty > 12 && raty <= 24)
		{
			double rata = (kwota + (kwota * 0.05)) / raty;
			System.out.println("Przy kwocie: " + kwota + " i liczbie rat: " + raty + ". Kwota jednej raty wyniesie: " + rata + "zł");
		}
		else if (raty > 24 && raty <= 48)			
		{
			double rata = (kwota + (kwota * 0.1)) / raty;
			System.out.println("Przy kwocie: " + kwota + " i liczbie rat: " + raty + ". Kwota jednej raty wyniesie: " + rata + "zł");
		}
		
	}
}

Program działa, ale chcąc go uprościć postanowiłem wynik podawać w ostatniej linii poza pętlą warunkową, tak jak poniżej:


import java.util.*;

public class obliczanieRat 
{
	public static void main(String[] args)
	{
		Scanner in = new Scanner(System.in);
		System.out.print("Podaj kwotę zakupu:");
		int kwota = in.nextInt();
		System.out.print("Podaj ilość rat:");
		int raty = in.nextInt();
				
		//Sprawdzenie kwoty
		while (kwota < 100 || kwota > 10000)
		{
			System.out.print("Podaj kwotę zakupu w przedziale 100zł - 10000zł: ");
			kwota = in.nextInt();
		}
		//Sprawdzenie rat
		while (raty < 6 || raty > 48)
		{
			System.out.print("Podaj poprawną liczbę rat z przedziału 6 - 48:");
			raty = in.nextInt();
		}
	
		// Obliczanie wyskości rat
		if (raty <= 12)
		{
			double rata = (kwota + (kwota * 0.025)) / raty;
			
		}
		else if (raty > 12 && raty <= 24)
		{
			double rata = (kwota + (kwota * 0.05)) / raty;
			
		}
		else if (raty > 24 && raty <= 48)			
		{
			double rata = (kwota + (kwota * 0.1)) / raty;
			
		}
		System.out.println("Przy kwocie: " + kwota + " i liczbie rat: " + raty + ". Kwota jednej raty wyniesie: " + rata + "zł");
	}
}

Jednak otrzymuję informację w Eclipse, że kompilator nie może odnaleźć zmiennej "rata" (rata can not be resolved to a variable). Wytłumaczycie mi, na czym polega problem? I jak go można rozwiązać, jeśli chciałbym wyświetlić wyniki własnie w ten sposób?

0

Zmienna rata istnieje tylko pomiędzy nawiasami klamrowymi, w których została zadeklarowana. Dlatego gdy tylko opuszczasz ifa, to zmienna rata przestaje istnieć.

Rozwiązanie nietrudne:

import java.util.*;
 
public class obliczanieRat 
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        System.out.print("Podaj kwotę zakupu:");
        int kwota = in.nextInt();
        System.out.print("Podaj ilość rat:");
        int raty = in.nextInt();
 
        //Sprawdzenie kwoty
        while (kwota < 100 || kwota > 10000)
        {
            System.out.print("Podaj kwotę zakupu w przedziale 100zł - 10000zł: ");
            kwota = in.nextInt();
        }
        //Sprawdzenie rat
        while (raty < 6 || raty > 48)
        {
            System.out.print("Podaj poprawną liczbę rat z przedziału 6 - 48:");
            raty = in.nextInt();
        }
        

        double rata;
        // Obliczanie wyskości rat
        if (raty <= 12)
        {
            rata = (kwota + (kwota * 0.025)) / raty;
 
        }
        else if (raty > 12 && raty <= 24)
        {
            rata = (kwota + (kwota * 0.05)) / raty;
 
        }
        else if (raty > 24 && raty <= 48)           
        {
            rata = (kwota + (kwota * 0.1)) / raty;
 
        }
        System.out.println("Przy kwocie: " + kwota + " i liczbie rat: " + raty + ". Kwota jednej raty wyniesie: " + rata + "zł");
    }
}

PS. Świetnie, że po napisaniu programu kombinujesz, jak go uprościć! Rzeczywiście upraszczanie idzie w dobrym kierunku :)

0

Po prostu zakres każdej zmiennej kończy się razem z blokiem kodu, czyli Twoimi klamrami {} i poza nimi ta zmienna nie istnieje.

Edit: Kolega mnie uprzedził :)

0

Wielkie dzięki. Wszystko jasne ! :)

0

Po "dopieszczeniu" mój listing wygląda następująco:


import java.util.*;

public class obliczanieRat 
{
	public static void main(String[] args)
	{
		Scanner in = new Scanner(System.in);
		System.out.print("Podaj kwotę zakupu:");
		int kwota = in.nextInt();
		System.out.print("Podaj ilość rat:");
		int raty = in.nextInt();
				
		//Sprawdzenie kwoty
		while (kwota < 100 || kwota > 10000)
		{
			System.out.print("Podaj kwotę zakupu w przedziale 100zł - 10000zł: ");
			kwota = in.nextInt();
		}
		//Sprawdzenie rat
		while (raty < 6 || raty > 48)
		{
			System.out.print("Podaj poprawną liczbę rat z przedziału 6 - 48:");
			raty = in.nextInt();
		}
		
		double rata = 0;
		// Obliczanie wyskości rat
		if (raty <= 12)
		{
			rata = (kwota + (kwota * 0.025)) / raty;
		}
		else if (raty > 12 && raty <= 24)
		{
			rata = (kwota + (kwota * 0.05)) / raty;
		}
		else if (raty > 24 && raty <= 48)			
		{
			rata = (kwota + (kwota * 0.1)) / raty;
		}
		System.out.printf("Przy kwocie: " + kwota + "zł i liczbie rat: " + raty + ". Kwota jednej raty wyniesie: %,.2f zł", rata );
	}
}

0

Ostatnie 3 ify można uprościć do

if(raty <= 12)
{
	// Kod
}
else if(raty <= 24) // Tu już wiadomo, że raty muszą być > 12 bo inaczej wykonałby się 1 if
{
	// Kod
}
else
{
	// Kod
}

Ostatni else nie musi mieć już if bo wiadomo że liczba jest większa niż 24 i również wiadomo że jest mniejsza niż lub równa 48 bo jest to zapewnione przez while() gdzie masz sprawdzanie rat.

0

Program byłby znacznie bardziej user friendly gdybyś od razu wyświetlał ograniczenia na kwotę zakupu i liczbę rat.

0

Dzięki za wszystkie podpowiedzi. Udało mi się uprościć do takiej postaci, jak w listingu poniżej. Będę wdzięczny za sugestie, czy można jeszcze bardziej uprościć:


import java.util.*;

public class obliczanieRat 
{
	public static void main(String[] args)
	{
		Scanner in = new Scanner(System.in);
		
		int kwota = 0;		
		//Sprawdzenie kwoty
		while (kwota < 100 || kwota > 10000)
		{
			System.out.print("Podaj kwotę zakupu w przedziale 100zł - 10000zł: ");
			kwota = in.nextInt();
		}
		int raty = 0;
		//Sprawdzenie rat
		while (raty < 6 || raty > 48)
		{
			System.out.print("Podaj poprawną liczbę rat z przedziału 6 - 48:");
			raty = in.nextInt();
		}
		
		double rata = 0;
		// Obliczanie wyskości rat
		if (raty <= 12)
		{
			rata = (kwota + (kwota * 0.025)) / raty;
		}
		else if (raty <= 24)
		{
			rata = (kwota + (kwota * 0.05)) / raty;
		}
		else			
		{
			rata = (kwota + (kwota * 0.1)) / raty;
		}
		System.out.printf("Przy kwocie: " + kwota + "zł i liczbie rat: " + raty + ". Kwota jednej raty wyniesie: %,.2f zł", rata );
	}
}


1
System.out.printf("Przy kwocie: " + kwota + "zł i liczbie rat: " + raty + ". Kwota jednej raty wyniesie: %,.2f zł", rata );

jeżeli używasz printf to używaj go zgodnie z zastosowaniem. Ogólnie funkcja jest bardzo przydatna bo ładnie nam może sformatować tekst z danymi nie znanymi podczas kompilacji.

System.out.printf("Przy kwocie: %d zł i liczbie rat: %d. Kwota jednej raty wyniesie: %,.2f zł",kwota, raty, rata);
0

Wydaje mi się, że dobrą praktyką jest zrobienie klasy dla Twoich obliczeń z metodami takimi jak: czyKwotaJestPoprawna, czyLiczbaRataJestPoprawna, obliczanieWysokosciRaty, informacjeORacie i wywołać je odpowiednio w klasie np. TestRaty. Oprócz tego używaj angielskich nazw bo po prostu i tak jest to nieuniknione, więc im wcześniej się przestawisz tym lepiej (ja jak widzisz jeszcze nad tym pracuję ;p i musiałbym zastanowić się nad angielskimi odpowiednikami).

0

Dzięki za wszelkie uwagi i sugestie.

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