Rozbudowanie programu do obliczania BMI

2015-02-19 13:58
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:
https://www.youtube.com/watch[...]list=UUBmjr_qvB6fDl8EA2kWYKFQ
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.

edytowany 3x, ostatnio: furious programming, 2015-02-19 15:10
Znak gwiazdki jako pierwszy w linii służy do wypunktowania; Dlatego też najpierw zapoznaj się z obsługiwanymi znacznikami (artykuł Formatowanie treści postów na forum), żebym nie musiał łazić za Tobą i poprawiać rozwalonych postów... :) - furious programming 2015-02-19 15:11

Pozostało 580 znaków

2015-02-19 14:01
2

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

edytowany 1x, ostatnio: fourfour, 2015-02-19 14:02

Pozostało 580 znaków

2015-02-19 14:11
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.

o ile to możliwe powinno się omijać takie pętle. - spartanPAGE 2015-02-19 14:13
Mogłem to zrobić z flagę i returnem za pętlą, ale miałoby to sens gdyby było jeszcze inne wyjście z pętli. Dla tego przypadku to jest ok. - krzysiek050 2015-02-19 14:21
Nie mieszaj angielskiego z polskim w kodzie bo wyglada to po prostu smiesznie :P - krwq 2015-02-19 19:41

Pozostało 580 znaków

2015-02-19 14:45
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

edytowany 1x, ostatnio: Adii69, 2015-02-19 14:54
Pokaż pozostałe 2 komentarze
edit. dodałem miejsca w których występują błędy oraz ich opisy po // - Adii69 2015-02-19 14:55
uhh może weź jakiś kurs z podstawami chociaż - uczenie się na cudzych kodach jest w porządku pod warunkiem, że znamy chociaż te podstawowe podstawy podstaw :P http://edu.pjwstk.edu.pl/wyklady/ppj/scb/ - ja się z tego uczyłem :) - pedegie 2015-02-19 14:58
wywal tą metodę z maina, jak nie wiesz co jest metodą to niestety znajdź lepszy kurs :) - EroSanin 2015-02-19 15:00
poza tym - w Javie nie wolno przesłaniać zmiennych lokalnych w blokach wewnętrznych - pedegie 2015-02-19 15:04
W takim razie biorę się za wypełnianie luk w głowie, nikt nie mówił że będzie łatwo, efektami pochwalę się jak mi w końcu wyjdzie ;) - Adii69 2015-02-19 15:05

Pozostało 580 znaków

2015-02-19 15:18
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.

Pokaż pozostałe 4 komentarze
Musiałem napisać - gdyby nie to, to miałbym sprzątania po pytaczu ;P - furious programming 2015-02-19 21:49
PS: Ja nie mam javofobii - po prostu nie używam tego języka; - furious programming 2015-02-19 21:49
A to jest javofobia ? :D C++fobia też? :D - lightinside 2015-02-19 22:00
@furious programming Ty to raczej masz pascalofilie :P - babubabu 2015-02-20 10:03
@babubabu - wiele się nie pomyliłeś ;P - furious programming 2015-02-20 21:29

Pozostało 580 znaków

2015-02-19 18:16
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 //

edytowany 1x, ostatnio: Adii69, 2015-02-19 18:16

Pozostało 580 znaków

2015-02-19 18:22
1

Serio?

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

albo input ten Twój tam przekazać;

edytowany 2x, ostatnio: zadroozyn, 2015-02-19 18:23
Wszystko ładnie poszło :) - Dzięki. Mam jeszcze małe pytanie, przy Scanner input = new Scanner(System.in); mam wykrzyknik informujący "resource leak is never closed" czy konieczne jest dodawanie na końcu input.close(); ? - po dodaniu tego błąd znika, i jeżeli ktoś by mógł mi powiedzieć o czym ten błąd informuje? - Adii69 2015-02-19 18:36
to ostrzeżenie, że nie zamknąłeś strumienia. Prawdę mówiąc nigdy nie zamykałem scannera podłączonego do System.in (do jakiegokolwiek innego zawsze), i prawdę mówiąc nie sądzę żeby to był dobry pomysł. - zadroozyn 2015-02-19 18:40
czyli lepiej jest zostawiać otwarty pomimo wyskakującego ostrzeżenia ? - Adii69 2015-02-19 18:42
nie znam powodu aby go zamykać - zadroozyn 2015-02-19 18:47
Zamykanie scannera podłączonego do System.in jest bardzo złym pomysłem. - bogdans 2015-02-22 15:30

Pozostało 580 znaków

2015-02-19 18:29
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.

edytowany 1x, ostatnio: pedegie, 2015-02-19 18:31
nah, przeczy zasadzie DRY - spartanPAGE 2015-02-19 18:40
Dzięki wielkie. Właśnie teraz zauważyłem że program się sypie przy wpisywaniu niepasujących danych, czyli mam kolejny cel w ulepszeniu mojego programu do sprawdzania BMI. Może jakieś wskazówki na temat tego jak to zrobić? - nie proszę o kompletne rozwiązania :) - Adii69 2015-02-19 18:41
jak nie prosisz o gotowca to mogę Ci tylko napisać coś co sam już pewnie wiesz - musisz sprawdzić czy dane które podał użytkownik jest liczbą całkowitą. Scanner posiada różne metody dzięki którym da się to zrobić. Poczytaj http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html - pedegie 2015-02-19 18:53

Pozostało 580 znaków

2015-02-19 19:26
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

edytowany 3x, ostatnio: furious programming, 2015-02-19 20:57
Znaczników &lt;quote&gt; używaj do cytowania czyichś słów, nie zawartości konsoli; - furious programming 2015-02-19 20:57

Pozostało 580 znaków

2015-02-22 15:20
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 ;/

edytowany 2x, ostatnio: Adii69, 2015-02-22 15:24

Pozostało 580 znaków

2015-02-22 15:28
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ć.

edytowany 1x, ostatnio: furious programming, 2015-02-22 15:40
btw : w czym umieszczać takie wstawki jak wyżej, żeby nie zaczynało od nowej linii ale żeby tekst był formatowany? - pedegie 2015-02-22 15:28
Pomiędzy dwoma backtickami - ```` (w komentarzach też są parsowane, więc podaję cztery); Znaczniki <code> zawsze tworzą blok w nowej linii; - furious programming 2015-02-22 15:38
Poprawiłem - edytuj sobie ten post, żeby zobaczyć jak to wygląda; - furious programming 2015-02-22 15:40
własnie poprawiłem, nie wiem czy byłeś pierwszy czy ja :D podziękował :) - pedegie 2015-02-22 15:41

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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