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

Pytanie początkujacego. Pętla if, else if
RoughBoy
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Lokalizacja:Płock
  • Postów:34
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:

Kopiuj
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:

Kopiuj

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?

zyxist
if to nie pętla.
KM
  • Rejestracja:ponad 10 lat
  • Ostatnio:prawie 4 lata
  • Postów:473
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:

Kopiuj
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 :)

edytowany 1x, ostatnio: kmph
mic1996
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 2 lata
  • Postów:52
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ł :)

edytowany 1x, ostatnio: mic1996
RoughBoy
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Lokalizacja:Płock
  • Postów:34
0

Wielkie dzięki. Wszystko jasne ! :)

RoughBoy
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Lokalizacja:Płock
  • Postów:34
0

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

Kopiuj

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 );
	}
}

atmal
  • Rejestracja:około 8 lat
  • Ostatnio:17 dni
  • Postów:913
0

Ostatnie 3 ify można uprościć do

Kopiuj
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.


Failure of one test is a tragedy, failure of fifty is a statistic.
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

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


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
RoughBoy
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Lokalizacja:Płock
  • Postów:34
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ć:

Kopiuj

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 );
	}
}


elslawko
  • Rejestracja:prawie 8 lat
  • Ostatnio:ponad 5 lat
  • Postów:10
1
Kopiuj
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.

Kopiuj
System.out.printf("Przy kwocie: %d zł i liczbie rat: %d. Kwota jednej raty wyniesie: %,.2f zł",kwota, raty, rata);
mic1996
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 2 lata
  • Postów:52
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).

edytowany 1x, ostatnio: mic1996
RoughBoy
  • Rejestracja:ponad 7 lat
  • Ostatnio:ponad 7 lat
  • Lokalizacja:Płock
  • Postów:34
0

Dzięki za wszelkie uwagi i sugestie.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.