Rozbudowanie programu do obliczania BMI

0

Witam wszystkich użytkowników!
Zakładam ten temat z jednego prostego powodu, zawsze chciałem spróbować swoich sił w programowaniu lecz nie zawsze starczało mi na to odwagi. Ostatecznie zmobilizowany i pełen nadziei myślę że uda mi się osiągnąć ten cel, jednak w pojedynkę niczego nie zwojuję, dlatego wspólnie z waszą pomocą (taką mam nadzieję :) ) zdołam poradzić sobie z tą trudną dziedziną jaką jest programowanie.

W temacie tym chciałbym powoli rozszerzać swoje horyzonty, na wstępie zaznaczam że z programowaniem miałem styczność w szkole średniej, deczko na studiach i przy okazji pisania jakiś prostych skryptów do serwerów jednej z popularnych gier mmorpg.

Na początek chcę zacząć od podstaw javy, html, by potem powoli przejść na pisanie apek na androida - taki jest ambitny cel.
Na początek bazuję na:

oraz książeczka:
"Android w praktyce" Charlie Collins, Michael Galpin, Matthias Kaeppler

Wykonałem już kilka lekcji i oto pojawia się pierwszy problem:

Pracuje na kodzie do obliczania BMI, próbuje go na własny sposób rozbudowywać bo słyszałem że w taki sposób najlepiej się uczyć, także proszę oto kod, a zagadnienie do niego pod nim.

package poczatek;

import java.util.Scanner;

public class BMIrozbudowane {

	public static void main(String[] args) 
	{
		Scanner input = new Scanner(System.in);
		System.out.println("Witaj użytkowniku, w tym programie obliczysz swoje BMI, na początek proszę podaj mi swoje imię...");
		String imie = input.nextLine();
		System.out.println("Witaj " + imie);
		
		System.out.println(imie + " proszę podaj mi swój wiek...");
		int wiek = input.nextInt();
//		System.out.println("Twoj wiek to " + wiek);
		
		if (wiek<10)
		{
			System.out.println("Przykro mi jesteś zbyt młody/a, wynik badania będzie niewiarygodny");
		}
		
		else if (wiek>100)
		
		{
			System.out.println("Maksymalny wiek do wykonania badanie nie możę być większy niż 100");
		}
		
		else 
		{
			System.out.println("Twoj wiek to " + wiek);
		}
		
		System.out.println(imie + " teraz proszę podaj swój wzrost w cm...");
		double wzrost = input.nextDouble();
		System.out.println("Podaj teraz swoją wagę w kg...");
		double waga = input.nextDouble();
		
		wzrost = wzrost / 100;
		double bmi = (waga/Math.pow(wzrost, 2));
		
		if (bmi<18.5)
		{
			System.out.println("Jesteś zbyt szczupły, Twój indkes BMI wynosi: " + bmi);	
		}
		
		else if (bmi>25.0)
		{
			System.out.println("Twój indeks BMI wynosi " + bmi + " i nie mieści się w normie, czas na odchudzanie!");
		}
		
		else
		{
			System.out.println("Twój indeks BMI wynosi " + bmi + " i jest on prawidłowy, gratulacje!");
		}
	}

}

Jakie polecenie zastosować żeby po podaniu zbyt małego lub zbyt dużego wieku, program zawrócił i od początku przeszedł do kwestii podania poprawnego wieku ?
Bo aktualnie to on idzie dalej i nie patrzy na to co się wpisuje :/

P.S Mam nadzieję że dział "Newbie" jest odpowiednim miejscem do założenia tego tematu.

2

Co kto lubi, może być while/ do while

1
    private int getAge(Scanner input) {
        while (true) {
            int wiek = input.nextInt();
            if (wiek < 10) {
                System.out.println("Przykro mi jesteś zbyt młody/a, wynik badania będzie niewiarygodny");
            }
            else if (wiek > 100)
            {
                System.out.println("Maksymalny wiek do wykonania badanie nie możę być większy niż 100");
            }
            else{
                return wiek;
            }
        }
    }

PS. o ile dział dobry, to temat nic nie mówi o problemie.

0
package poczatek;

import java.util.Scanner;

public class BMIrozbudowane {

	public static void main(String[] args) 
	{
		Scanner input = new Scanner(System.in);
		System.out.println("Witaj użytkowniku, w tym programie obliczysz swoje BMI, na początek proszę podaj mi swoje imię...");
		String imie = input.nextLine();
		System.out.println("Witaj " + imie);
		
		System.out.println("Podaj swój wiek...");
		int wiek = input.nextInt();
		System.out.println(imie + "Twoj wiek to " + wiek);
		
	    private int getAge(Scanner input) //LINE 18 - MULTIPLE MARKERS AT THIS LINE 
	    {
	        while (true) {
	            int wiek = input.nextInt();
	            if (wiek < 10) { //LINE 21 - DUPLICATE LOCAL VARIABLE WIEK
	                System.out.println("Przykro mi jesteś zbyt młody/a, wynik badania będzie niewiarygodny");
	            }
	            else if (wiek > 100)
	            {
	                System.out.println("Maksymalny wiek do wykonania badanie nie możę być większy niż 100");
	            }
	            else{
	                return wiek; //LINE 31 - VOID METHOTDS CANNOT RETURN A VAULE
	            }
	        }
	    }
		
		
		System.out.println(" teraz proszę podaj swój wzrost w cm...");
		double wzrost = input.nextDouble();
		System.out.println("Podaj teraz swoją wagę w kg...");
		double waga = input.nextDouble();
		
		wzrost = wzrost / 100;
		double bmi = (waga/Math.pow(wzrost, 2));
		
		if (bmi<18.5)
		{
			System.out.println("Jesteś zbyt szczupły, Twój indkes BMI wynosi: " + bmi);	
		}
		
		else if (bmi>25.0)
		{
			System.out.println("Twój indeks BMI wynosi " + bmi + " i nie mieści się w normie, czas na odchudzanie!");
		}
		
		else
		{
			System.out.println("Twój indeks BMI wynosi " + bmi + " i jest on prawidłowy, gratulacje!");
		}
	}

}

Zastosowałem Twój kod i męczę się od 15 minut z 3 błędami, czy ktoś z was może mi powiedzieć dlaczego nie chce banglać?
line 18,21,30

0

@Adii69 - skoro jesteś tutaj nowy i masz zamiar chwilę posiedzieć w tym serwisie, to zapamiętaj, że:

  • wątki należy tytułować sensownie i opisowo,
  • w tagach umieszczaj jedynie nazwy języków, technologii itd., bez śmieci typu pomoc czy programowanie,
  • używaj znaczników do kolorowania składni kodu, odpowiednich dla danego języka,
  • używaj znaczników do formatowania treści postów, aby problem przedstawić ładnie i czytelnie,
  • przeznaczaj jeden wątek na jeden problem;
    Jeżeli nie będziesz się do tego stosował, to Twoje wątki mogą być przenoszone do Kosza, gdzie zakończą swój żywot; Dlatego też Twój pierwszy post nieco poprawiłem, bo źle użyłeś znacznika pogrubienia (który zadziałał jako wypunktowanie) oraz poprawiłem tytuł wątku; To w sumie tyle.
0

Po przeredagowaniu kilkunastu stron doszedłem gdzie był mój błąd, już wiem że zrobiłem karygodny błąd poprzez wrzucenie metody do main'a - proszę o wyrozumiałość, dopiero się uczę.

I teraz mam taki problem że nie za bardzo wiem jak mam to opisać żeby to uruchomić (tzn. żeby po wpisaniu nieprawidłowego wieku cofało program do stanu w którym znów możemy to zrobić) Jeżeli znalazła by się osoba która chciała by mi to na tym przykładzie wytłumaczyć byłbym bardzo wdzięczny, a oto twór który powstał w moim eclipse:

package poczatek;

import java.util.Scanner;

public class BMIrozbudowane {
	
    private int getAge(Scanner input) 
    {
        while (true) 
        {
            int wiek = input.nextInt();
            if (wiek < 10) 
            {
                System.out.println("Przykro mi jesteś zbyt młody/a, wynik badania będzie niewiarygodny");
            }
            else if (wiek > 100)
            {
                System.out.println("Maksymalny wiek do wykonania badanie nie możę być większy niż 100");
            }
            else{
                return wiek;
            }
        }
    }

	public static void main(String[] args) 
	{
		Scanner input = new Scanner(System.in);
		System.out.println("Witaj użytkowniku, w tym programie obliczysz swoje BMI, na początek proszę podaj mi swoje imię...");
		String imie = input.nextLine();
		System.out.println("Witaj " + imie);
		
		System.out.println("Podaj swój wiek...");
		int wiek = input.nextInt();
		
//		if (wiek<10)
//		{
//			System.out.println("Przykro mi jesteś zbyt młody/a, wynik badania będzie niewiarygodny");
//			while (wiek<8);
//		}
//		
//		else if (wiek>100)
//		
//		{
//			System.out.println("Maksymalny wiek do wykonania badanie nie możę być większy niż 100");
//			while (wiek>100);
//		}
//		
//		else 
//		{
//			System.out.println("Twoj wiek to " + wiek);
//		}
		
		
		System.out.println(imie + " teraz proszę podaj swój wzrost w cm...");
		double wzrost = input.nextDouble();
		System.out.println("Podaj teraz swoją wagę w kg...");
		double waga = input.nextDouble();
		
		wzrost = wzrost / 100;
		double bmi = (waga/Math.pow(wzrost, 2));
		
		if (bmi<18.5)
		{
			System.out.println("Jesteś zbyt szczupły, Twój indkes BMI wynosi: " + bmi);	
		}
		
		else if (bmi>25.0)
		{
			System.out.println("Twój indeks BMI wynosi " + bmi + " i nie mieści się w normie, czas na odchudzanie!");
		}
		
		else
		{
			System.out.println("Twój indeks BMI wynosi " + bmi + " i jest on prawidłowy, gratulacje!");
		}
	}

}

kawałek starego skryptu wziąłem za //

1

Serio?

int wiek = getAge(new Scanner(System.in));

albo input ten Twój tam przekazać;

0

tutaj masz pętle :

Scanner scan = new Scanner(System.in);
		
		System.out.println("Ile masz lat?");
		int i = scan.nextInt();
		
		while(i < 10 || i > 100)
		{
			System.out.println("Zle dane, podaj jeszcze raz");
			i = scan.nextInt();
		}

Tylko zwróc uwage, że nie sprawdzana jest poprawność danych podawanych przez użytkownika - jeśli poda sie tam cośczego nie da się przekształcić na liczbę całkowitą to program się sypnie.

0

Także po ciężkich bojach wygląda mniej więcej tak:

package poczatek;

import java.util.Scanner;

public class BMIrozbudowane {
	
    private static int getAge(Scanner input) 
    {
        while (true) 
        {
            int wiek = input.nextInt();
            if (wiek < 8) 
            {
                System.out.println("Przykro mi ale jesteś za młody/a by obliczyć Twoje BMI, minimalny wiek badanego to 8 lat. Jeżeli chcesz kontynuwać badanie wprowadź poprawny wiek.");
            }
            else if (wiek > 100)
            {
                System.out.println("Przykro mi ale maksymalny wiek do wykonania badania to 100 lat. Jeżeli chcesz kontynuwać badanie wprowadź wiek z zakresu od 8 do 100 lat.");
            }
            else{
                return wiek;
            }
        }
    }
    
    private static int getWeight(Scanner input) 
    {
        while (true) 
        {
            int Weight = input.nextInt();
            if (Weight < 20) 
            {
                System.out.println("Zbyt niska waga, wprowadź prawidłową wartość.");
            }
            else if (Weight > 200)
            {
                System.out.println("Zbyt wysoka waga, wprowadź prawidłową wartość.");
            }
            else{
                return Weight;
            }
        }
    }

	public static void main(String[] args) 
	{
		Scanner input = new Scanner(System.in);
		System.out.println("Witaj użytkowniku, w tym programie obliczysz swoje BMI, na początek proszę podaj mi swoje imię...");
		String imie = input.nextLine();
		System.out.println("Witaj " + imie);
		
		System.out.println("Podaj swój wiek...");
		int wiek = getAge(new Scanner(System.in));
		System.out.println("Zadeklarowałeś/aś że masz " + wiek + " lat.");
		
			if (wiek<15)
			{
			System.out.println("Jesteś jeszcze bardzo młody/a, wartość Twojego BMI ulega szybkiej zmianie.");
			}
			else if (wiek>15 || wiek<80)
			{
				System.out.println("W tym wieku wartość Twojego BMI ulega standardowej zmianie.");
			}
			else if (wiek>80)
			{
				System.out.println("W tym wieku wartość Twojego BMI ulega powolnej zmianie.");
			}
			
		System.out.println(imie + " teraz proszę podaj swój wzrost w cm...");
		double wzrost = input.nextDouble();
		System.out.println("Podaj teraz swoją wagę w kg...");
		int waga = getWeight(new Scanner(System.in));
		
		wzrost = wzrost / 100;
		double bmi = (waga/Math.pow(wzrost, 2));
		
		
		if (bmi<18.5)
		{
			System.out.println("Jesteś zbyt szczupły, Twój indkes BMI wynosi: " + bmi);	
		}
		
		else if (bmi>25.0)
		{
			System.out.println("Twój indeks BMI wynosi " + bmi + " i nie mieści się w normie, czas na odchudzanie!");
		}
		
		else
		{
			System.out.println("Twój indeks BMI wynosi " + bmi + " i jest on prawidłowy, gratulacje!");
		}
		input.close();
	}

}

W praktyce wygląda to tak:

Witaj użytkowniku, w tym programie obliczysz swoje BMI, na początek proszę podaj mi swoje imię...
Adrian
Witaj Adrian
Podaj swój wiek...
6
Przykro mi ale jesteś za młody/a by obliczyć Twoje BMI, minimalny wiek badanego to 8 lat. Jeżeli chcesz kontynuwać badanie wprowadź poprawny wiek.
120
Przykro mi ale maksymalny wiek do wykonania badania to 100 lat. Jeżeli chcesz kontynuwać badanie wprowadź wiek z zakresu od 8 do 100 lat.
25
Zadeklarowałeś/aś że masz 25 lat.
W tym wieku wartość Twojego BMI ulega standardowej zmianie.
Adrian teraz proszę podaj swój wzrost w cm...
175
Podaj teraz swoją wagę w kg...
4
Zbyt niska waga, wprowadź prawidłową wartość.
5
Zbyt niska waga, wprowadź prawidłową wartość.
1200
Zbyt wysoka waga, wprowadź prawidłową wartość.
75
Twój indeks BMI wynosi 24.489795918367346 i jest on prawidłowy, gratulacje!

Do poprawienia/rozbudowania jeszcze wiele rzeczy m.in poprawność danych podawanych przez użytkownika, bo na tym się program wysypuje, ale to już w następnych "odcinkach" :D

Dziękuję wszystkim za wkład, mam nadzieję również że tym temat pomogłem innym "newbie" w nauce javy od podstaw, pozdrawiam ;)

Acha, i jeżeli macie jakieś propozycje odnośnie, co poprawić, jak skracać kod by był bardziej czytelny i przejrzysty to czekam na propozycje i podpowiedzi.

zamiana znacznika <quote> na <code class="none"> - @furious programming

0

@up jakimś cudem napisałem z niezalogowanego konta :P, proszę o usunięcie tego wpisu powyżej (ja nie mogłem)

Witam, po kilku lekcjach z powrotem powróciłem do mojego programu od BMI, jednak po 2 godzinach szukania sposobu poddaję się - jeszcze jestem za słaby w te klocki, żeby samemu do takich rzeczy dochodzić :P

Może ktoś mi powiedzieć w jaki sposób zablokować wpisywanie liter (lub cyfr)?

Np. kiedy program prosi mnie o podanie wieku, a ja wpisuję np. "absa" to wyrzuca błąd i całość się crashuje ;/

0

w Klasie Integer masz statyczną metode parseInt(String) która parsuje podany napis na liczbę całkowitą - jeśli jest to nie możliwe(bo użytkownik podał coś czego nie da się na ten int przekształcić to rzuci wyjątek - można ten wyjątek obsłużyć.

0

@Adii69, w klasie Scanner masz metodę nextInt(), która rzuci wyjątek gdy użytkownik jest nieodpowiedzialny.

        boolean ok = false;
        int wiek = 0;
        while (!ok)
        {
            try
            {
                System.out.print("Podaj wiek ");  
                wiek = sc.nextInt();
                ok = true;
            }
            catch(Exception e)
            {
                sc.next();
            }
        }
0
bogdans napisał(a):

@Adii69, w klasie Scanner masz metodę nextInt(), która rzuci wyjątek gdy użytkownik jest nieodpowiedzialny.

        boolean ok = false;
        int wiek = 0;
        while (!ok)
        {
            try
            {
                System.out.print("Podaj wiek ");  
                wiek = sc.nextInt();
                ok = true;
            }
            catch(Exception e)
            {
                sc.next();
            }
        }

A po co ta zmienna ok? Nie lepiej zrobić po prostu tak? :

while(scan.hasNextInt())
    wiek = sc.nextInt();
0

Ja tak tylko przypomnę że jestem na prawdę jeszcze dużym newbie w tej dziedzinie, i jeżeli mogli byście Panowie mi to jasno przedstawić dlaczego tak a nie inaczej?
Dopiero zbieram wiedzę, no mam nadzieję że sami rozumiecie ;)

1

Bardzo nie lepiej. Jak użytkownik nie wpisze liczby, to czytanie wiek = sc.nextInt() nie wykona się ani razu, a program pójdzie dalej.
Zmienną ok można wykorzystać do kontroli zakresu:

        boolean ok = false;
        int wiek = 0;
        while (!ok)
        {
            try
            {
                System.out.print("Podaj wiek (liczbę całkowitą z zakresu 8-100) ");  
                wiek = sc.nextInt();
                ok = (wiek>=8 && wiek<=100);
            }
            catch(Exception e)
            {
                sc.next();
            }
        }
0

@Adii69, czego nie rozumiesz w moim kodzie?

0

Która część kodu odpowiedzialna jest ze blokowanie wpisywania liter, oraz przede wszystkim w którym miejscu kodu, Twój kod wstawić ?

1

Np. tu

private static int getAge(Scanner sc)
{
        boolean ok = false;
        int wiek = 0;
        while (!ok)
        {
            try
            {
                System.out.print("Podaj wiek (liczbę całkowitą z zakresu 8-100) ");  
                wiek = sc.nextInt();
                ok = (wiek>=8 && wiek<=100);
            }
            catch(Exception e)
            {
                sc.next();
            }
        }
        return wiek;
}

Mój kod nie blokuje wpisywania liter, ale jeśli użytkownik wpisze litery, to sc.nextInt() wygeneruje wyjątek, kolejna instrukcja ok = .. nie zostanie wykonana, sterowanie przejdzie do bloku catch. Instrukcja sc.next wyczyści bufor klawiatury i (ponieważ ok jest nadal false) kod pętli wykona się ponownie.

0
private static int getAge(Scanner sc)
	{
	        boolean ok = false;
	        int wiek = 0;
	        while (!ok)
	        {
	            try
	            {
	                System.out.print("Podaj wiek (liczbę całkowitą z zakresu 8-100) ");  
	                wiek = sc.nextInt();
	                ok = (wiek>=8 && wiek<=100);
	                if (wiek<8)
	                {
	                	System.out.print("Jesteś za młody "); 
	                }
	                else if (wiek>100)
	                {
	                	System.out.print("Jesteś za sa stary "); 
	                }
	                else
	                {
	                	System.out.print(""); 
	                }
	            }	       
	            catch(Exception e)
	            {
	                sc.next();
	            }
	        }
	        return wiek;
	}

Dodałem zmienne "else" i "else if" ale nadal wyskakuje mi ten pierwszy println a mianowicie

Witaj Adi
Podaj wiek (liczbę całkowitą z zakresu 8-100) 5
Jesteś za młody Podaj wiek (liczbę całkowitą z zakresu 8-100) 120
Jesteś za sa stary Podaj wiek (liczbę całkowitą z zakresu 8-100) 25
Adi Zadeklarowałeś/aś że masz 25 lat.
W tym wieku wartość Twojego BMI ulega standardowej zmianie.
Adi teraz proszę podaj swój wzrost w cm...

w jaki sposób zablokować ten pierwszy println żeby za każdym razem nie wyskakiwał ?

0

Witam, po krótkiej przerwie powróciłem do mojego programu, udało mi się uporać z kolejnym problemem, a mianowicie wpisywaniem innych znaków niż litery w polu z imieniem, zastosowałem taki o to kod:

    private static String getName(Scanner input) 
    {
        while (true) 
        {
        	String imie = input.next();
            if(Pattern.matches("[a-zA-Z]+", imie))
            	
            {
            return imie;
            }
            
            else
            
            {
            System.out.println("Wprowadziłeś niedozwolone znaki!");
            }
        }
    }

Mam teraz do was 2 pytania, czy można dodać jeszcze jakiś wyjątek który dopuści wpisywanie polskich znaków?
Bo póki co niemożliwe jest wpisanie imienia np. Łucja

I czy metoda którą zastosowałem jest w miarę dobrze napisana?

0

Źle jest. Użyj tego wyrażenia regularnego: \\p{L}+ i dodaj jakiś warunek zakończenia pętli do else bo inaczej Ci się zapętli w nieskończoność przy złych danych

i wyrzuć to

 String imie = input.next();

przed pętle

Może coś takiego? Pod warunkiem, że w input przekazujesz tylko 1 wyraz

 private static String getName(Scanner input) 
  {
	String imie = "";
	while(input.hasNext())
	{
		String s = input.next();
		if(Pattern.matches("\\p{L}+", s))
			imie = s;
		else 
			imie = "Wprowadziłeś niedozwolone znaki!";		
			
	}

	return imie;
	 	  
  }
0

Wyrzuciłem String, ale reszty nie bardzo rozumiem, mógłbyś mi to jaśniej opisać ?
W ogóle to dzięki za zainteresowanie tematem :)

edit.

    private static String getName(Scanner input) 
    {
      String imie = "";
      while(input.hasNext())
      {
          String s = input.next();
          if(Pattern.matches("\\p{L}+", s))
              imie = s;
          else 
              imie = "Wprowadziłeś niedozwolone znaki!";        
   
      }
   
      return imie;
   
    }

Ten kodzik nie trybi, nic się nie dzieje po wpisaniu imienia

edit2. Na Twoim kodzie jest tak:

Witaj użytkowniku, w tym programie obliczysz swoje BMI, na początek proszę podaj mi swoje imię...
Adrian
@#$@#$@#

i nic się nie dzieje a na moim to działa tak i wygląda że niby dobrze, ale wiadomo ja się słabo znam :P

Witaj użytkowniku, w tym programie obliczysz swoje BMI, na początek proszę podaj mi swoje imię...
@#$@#$
Wprowadziłeś niedozwolone znaki!123131
Wprowadziłeś niedozwolone znaki!Adrian
Witaj Adrian, jest mi niezmiernie miło że korzystasz z mojego programu!
Proszę podaj swój wiek, pamiętaj o tym że minimalny wiek do obliczenia BMI to 8 lat a maksymalny to 100 lat.
1

Pisałeś, że masz problem z polskimi znakami.
Chodzi o to, że zakres [a-zA-Z] nie zawiera polskich znaków. Jeśli chcesz je uzyskać to możesz użyć w wyrażeniu "\\p{L}+" - jedna lub więcej dowolnych LITER UNICODU które te polskie znaki już zawierają :P

0
    private static String getName(Scanner input) 
    {
        while (true) 
        {
        	String imie = input.next();
            if(Pattern.matches("[\\p{L}+]+", imie))
            	
            {
            return imie;
            }
            
            else
            
            {
            System.out.println("Wprowadziłeś niedozwolone znaki!"); 
            }
        }
    }

Tak wygląda końcowa wersja, kiedy wrzuciłem Stringa przed while to program zapętlał mi się w nieskończoność, nie doszedłem jeszcze jak to zamknąć :P
Może jak ktoś mądrzejszy przyjdzie to wytłumaczy, i tak wielkie dzięki za dotychczasową pomoc ;)

0

Witam, mój program do obliczania Indesku BMI jest już dość dobrze zabezpieczony i rozbudowany, teraz chciałbym go uruchomić w oknie, tak żeby program był już pełnoprawnym programem a nie uruchamianym w konsoli programikiem.

I teraz zastanawiam się czy ten kod umieścić w jednym okienku dialogowym (nie wiem czy tak się da) czy zrobić to na zasadzie kilku okienek w które wpisuje się wartości i program oblicza nam BMI ale do tego musiał bym chyba lekko przerobić program. Jak jest możliwe chciałbym poznać 2 sposoby, czy mógłby ktoś mi w tym deko pomóc ?

Jakieś propozycje ?

oto kod programu:

package rozbudowaneBMI;
 
import java.util.Scanner;
import java.util.regex.Pattern;
 
public class rozbudowaneBMI {
	
	private static int getAge(Scanner sc)
	{
	        boolean ok = false;
	        int wiek = 0;
	        while (!ok)
	        {
	            try
	            {
	                wiek = sc.nextInt();
	                ok = (wiek>=8 && wiek<=100);
	                if (wiek<8) 
	                	
	                {
	                	System.out.println("Wiek który podałeś jest za mały. "); 
	                }
	                else if (wiek>100)
	                {
	                	System.out.println("Wiek który podałeś jest za duży. "); 
	                }
	                else
	                {
	                	System.out.print(""); 
	                }
	            }	       
	            catch(Exception e) 
	            {
	            	System.out.println("Wpisz wiek w postaci liczb całkowitych!");
	                sc.next();
	            }
	        }
	        return wiek;
	}
	
	private static int getWeight(Scanner sc)
	{
	        boolean ok = false;
	        int waga = 0;
	        while (!ok)
	        {
	            try
	            { 
	                waga = sc.nextInt();
	                ok = (waga>=30 && waga<=200);
	                if (waga<30)
	                {
	                	System.out.println("Wartość którą wprowadziłeś jest nierealna."); 
	                }
	                else if (waga>200)
	                {
	                	System.out.println("Wartość którą wprowadziłeś jest nierealna."); 
	                }
	                else
	                {
	                	System.out.print(""); 
	                }
	            }	       
	            catch(Exception e)
	            {
	            	System.out.println("Wpisz wage w postaci liczb całkowitych!");
	                sc.next();
	            }
	        }
	        return waga;
	}
	
	private static int getHeight(Scanner sc)
	{
	        boolean ok = false;
	        int wzrost = 0;
	        while (!ok)
	        {
	            try
	            {
 
	                wzrost = sc.nextInt();
	                ok = (wzrost>=100 && wzrost<=250);
	                if (wzrost<100)
	                {
	                	System.out.println("Wartość którą wprowadziłeś jest nierealna. "); 
	                }
	                else if (wzrost>250)
	                {
	                	System.out.println("Wartość którą wprowadziłeś jest nierealna. "); 
	                }
	                else
	                {
	                	System.out.print(""); 
	                }
	            }	       
	            catch(Exception e)
	            {
	            	System.out.println("Wpisz wzrost w postaci liczb całkowitych!");
	                sc.next();
	            }
	        }
	        return wzrost;
	}
 
    private static String getName(Scanner input) 
    {
        while (true) 
        {
        	String imie = input.next();
            if(Pattern.matches("[\\p{L}+]+", imie))
            	
            {
            return imie;
            }
            
            else
            
            {
            System.out.println("Wprowadziłeś niedozwolone znaki!"); 
            }
        }
    }
    
    
    public static void main(String[] args) 
    {
        Scanner input = new Scanner(System.in);
        System.out.println("Witaj użytkowniku, w tym programie obliczysz swoje BMI, na początek proszę podaj mi swoje imię...");
        String imie = getName(new Scanner(System.in));
        System.out.println("Witaj " + imie + ", jest mi niezmiernie miło że korzystasz z mojego programu!");
        System.out.println("Proszę podaj swój wiek, pamiętaj o tym że minimalny wiek do obliczenia BMI to 8 lat a maksymalny to 100 lat.");  
 
        int wiek = getAge(new Scanner(System.in));
        System.out.println(imie + " Zadeklarowałeś/aś że masz " + wiek + " lat.");
 
            if (wiek<15)
            {
            System.out.print("Jesteś jeszcze bardzo młody/a, wartość Twojego BMI ulega szybkiej zmianie.");
            }
            else if (wiek>15 || wiek<80)
            {
                System.out.print("W tym wieku wartość Twojego BMI ulega standardowej zmianie.");
            }
            else if (wiek>80)
            {
                System.out.print("W tym wieku wartość Twojego BMI ulega powolnej zmianie.");
            }
 
        System.out.println(" Proszę podaj mi swój aktualny wzrost."); 
        double wzrost = getHeight(new Scanner(System.in));
        System.out.println("Teraz proszę podaj mi swoją aktualną wagę, prawdziwą - inaczej wynik badania będzie niewiarygodny."); 
        double waga = getWeight(new Scanner(System.in));
 
        wzrost = wzrost / 100;
        double bmi = (waga/Math.pow(wzrost, 2));
 
 
        if (bmi<14.0)
        {
            System.out.print("Twój indeks BMI wynosi: " + bmi + " a to oznacza że jego wartość osiągneła stan krytyczny, koniecznie skonsultuj się z lekarzem!");    
        }
        
        else if (bmi<18.5)
        {
            System.out.print("Twój indkes BMI wynosi: " + bmi + " i niestety jego wartość nie mieści się w normie, musisz przybrać na wadze"); 
        }
 
        else if (bmi>25.0)
        {
            System.out.print("Twój indeks BMI wynosi " + bmi + " a to oznacza że jego wartość nie mieści się w normie, prościej mówiąc czas na odchudzanie!");
        }
        
        else if (bmi>30.0)
        {
            System.out.print("Twój indeks BMI wynosi " + bmi + " a to oznacza że jego wartość znacznie przewyższa normę, musisz natychmiastowo zmienić swój tryb życia!");
        }
 
        else
        {
            System.out.print("Twój indeks BMI wynosi " + bmi + " a to oznacza że jego wartosć mieści się w przyjętej normie, której zakres wynosi od 18.5 do 25 pkt. Gratulacje!");
        }
        
        System.out.println("");
        System.out.println("Twoj indeks BMI został obliczony, dzięki za pracę w moim programie!");
        
        input.close();
    }
 
}
0

Zdecyduj się na początek, co ten program liczy indesk, indeks czy może indkes?
Jak ma być pełnoprawny program, to w oknie (klasa dziedzicząca) po JFrame umieść dwa pola tekstowe (JTextField) do wpisywania danych, jedno nieedytowalne pole pole tekstowe do wyświetlenia wyników. Obliczenia zaczynaj po kliknięciu przez użytkownika w przycisk (też go musisz umieścić w oknie), albo po naciśnięciu klawisza ENTER. Ja wolę drugie rozwiązanie - skoro wprowadzałam dane, to mam ręce na klawiaturze, a nie na myszy.

0

@Adii69 czemu za każdym razem tworzysz Scanner(System.in); ?

jakbyś oddzielił logikę od interfejsu to byłoby Ci prościej. tak żeby przerobić to na okienkowy program będziesz musiał i tak pisać od początku.

0
  1. setEditable(false)
  2. addActionListener(...)
    @Adii69, masz przykład
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class BMI extends JFrame
{
    private JTextField tf_imie = new JTextField(12);
    private JTextField tf_wiek = new JTextField(12);
    private JTextField tf_wzrost = new JTextField(12);
    private JTextField tf_waga = new JTextField(12);
    private JTextArea output = new JTextArea(6,30);
    public static void main(String[] args)
    {
        new BMI();
    }
    public BMI()
    {        

        setTitle("Obliczanie BMI");
        output.setEditable(false);
        add(output,BorderLayout.CENTER);
        add(new InputPanel(),BorderLayout.WEST);
        
        pack();
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);         
    }
    class InputPanel extends JPanel
    { 
        public InputPanel() 
        { 
            setLayout(new GridLayout(4,2,3,3));
            add(new JLabel("Twoje imię:"));
            add(tf_imie);
            add(new JLabel("Twój wiek:"));
            add(tf_wiek);
            add(new JLabel("Twoje wzrost:"));
            add(tf_wzrost);
            add(new JLabel("Twoja waga:"));
            tf_waga.addActionListener(new Liczydlo());
            add(tf_waga);        
       }
   }
   class Liczydlo implements ActionListener
   {
       public void actionPerformed(ActionEvent ae)
       {
           output.setText("");
           String answer = "";
           int wiek = 0;
           double wzrost = 0.0;
           double waga = 0.0;
           boolean ok = true;
           try
           {
               wiek = Integer.parseInt(tf_wiek.getText().trim());
               waga = Double.parseDouble(tf_waga.getText());
               wzrost = Double.parseDouble(tf_wzrost.getText());
           }
           catch(Exception e)
           {
               ok = false;
           }
           if(ok)
           {
               double bmi = (waga/Math.pow(wzrost/100,2));
               output.setText("Twój indeks BMI = "+bmi);
           }
           else
           {
               output.setText(tf_imie.getText()+" głupoty piszesz");
           }
       }
   }       
}
0

Super, wielkie dzięki bogdans, jutro z samego rana trochę się z tym pobawię :)
A w jaki sposób mogę dodać jakieś obrazki/ikonki itp. np żeby było je widać w okienku głównym ?

0

Taka jest moja wizja, wpisujemy w wybrane pola wymagane dane i po kliknięciu oblicz BMI dostajemy nasz wynik.

Mam także 3 pytanka, czyli takie pisanie kodu jak robiłem to na początku, nie ma sensu prawda?
Bo jeżeli z takiego kodu chcemy zrobić program to i tak trzeba będzie go dostosować pod te okienka itp. itd. tak ?
Ogólnie jak to się robi w praktyce?

oto kod, z gotowymi polami, jedynie brakuje bebechów, próbowałem jakoś wkręcić kod do obliczania z Twojego skryptu ale coś nie hasało, myślę że jest to związane z " Double.parseDouble(tWzrost.getText()); " w razie czego wrzuciłem moją próbę za //

oto kodzik:

package rozbudowaneBMI;
import javax.swing.*;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JTextField;

public class menuGlowne extends JFrame implements ActionListener
{
	private JTextField tImie, tWiek, tWzrost, tWaga, tWynik;
	private JLabel lImie, lWiek, lWzrost, lWaga, lWynik, lCm, lKg, loutput;
	private JButton bWyjście, bOblicz;
	private JTextArea output = new JTextArea(6,30);
	
	
	public menuGlowne()
	{
		setSize(800,500);
		setTitle("Kalkulator indeksu BMI");
		setLayout(null);
		
		lImie = new JLabel("Podaj swoje imię", JLabel.RIGHT);
		lImie.setBounds(30, 60, 100, 50);
		tImie = new JTextField();
		tImie.setBounds(200, 70, 150, 30);
			
		lWiek = new JLabel("Podaj swój wiek ", JLabel.RIGHT);
		lWiek.setBounds(30, 110, 100, 50);
		tWiek = new JTextField();
		tWiek.setBounds(200, 120, 150, 30);
		
		lWzrost = new JLabel("Podaj swój wzrost    ", JLabel.RIGHT);
		lWzrost.setBounds(30, 160, 120, 50);
		tWzrost = new JTextField();
		tWzrost.setBounds(200, 170, 150, 30);
		
		lWaga = new JLabel("Podaj swoją wagę    ", JLabel.RIGHT);
		lWaga.setBounds(30, 220, 120, 50);
		tWaga = new JTextField();
		tWaga.setBounds(200, 230, 150, 30);
		
		loutput = new JLabel("Wynik:", JLabel.RIGHT);
		loutput.setBounds(339, 10, 100, 100);
		output = new JTextArea();
		output.setEditable(false);
		output.setBounds(400, 80, 300, 200);
		
		
		lCm = new JLabel("cm", JLabel.RIGHT);
		lCm.setBounds(30, 160, 340, 50);
		lKg = new JLabel("kg", JLabel.RIGHT);
		lKg.setBounds(30, 220, 336, 50);
		
		
		add(lImie);
		add(tImie);
		add(tWiek);
		add(lWiek);
		add(tWzrost);
		add(lWzrost);
		add(lCm);
		add(lKg);
		add(lWaga);
		add(tWaga);
		add(output);
		add(loutput);
	
		bOblicz = new JButton("Oblicz BMI");
		bOblicz.setBounds(250, 300, 100, 50);
		bOblicz.addActionListener(this);
		
		bWyjście = new JButton("Wyjście z programu");
		bWyjście.setBounds(550, 380, 200, 60);
		bWyjście.addActionListener(this);
		
		
		add(bOblicz);
		add(bWyjście);
		
	}

	@Override
	public void actionPerformed(ActionEvent e) 
	{
		Object źródło = e.getSource();
		if (źródło==bWyjście)
		{
			dispose();
		}
		else if (źródło==bOblicz)
		{
			String a = bOblicz.getText();
						
		}
	}
	
	
	
	public static void main(String[] args) 
	
	{
		
		menuGlowne app = new menuGlowne();
		app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		app.setVisible(true);          	   				
	}
	
//	class Liczydlo implements ActionListener
//	   {
//	       public void actionPerformed(ActionEvent ae)
//	       {
//	           output.setText("");
//	           String answer = "";
//	           int wiek = 0;
//	           double wzrost = 0.0;
//	           double waga = 0.0;
//	           boolean ok = true;
//	           try
//	           {
//	               tWiek = Integer.parseInt(tWiek.getText().trim());
//	               tWaga = Double.parseDouble(tWaga.getText());
//	               tWzrost = Double.parseDouble(tWzrost.getText());
//	           }
//	           catch(Exception e)
//	           {
//	               ok = false;
//	           }
//	           if(ok)
//	           {
//	               double bmi = (waga/Math.pow(wzrost/100,2));
//	               output.setText("Twój indeks BMI = "+bmi);
//	           }
//	           else
//	           {
//	               output.setText(tImie.getText()+" głupoty piszesz");
//	           }
//	       }
//	   }       
	}	

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