Калорий Tracker


Я маленькая я взял из моих дней обучения код для выполнения этой простой код, который принимает имя пользователя, возраст, цель калорий и текущее потребление калорий. Это не впечатляет, я был кодирования в течение 3 дней, но я хотел бы знать способов, чтобы написать эту программу в более оптимальной форме, надеюсь, это разрешено.

Я буду размещать код как основной класс и класс сведения. Я ищу любые советы, которые могут сделать такие проекты более оптимальным в будущем, как я предполагаю, 160+ линии мы не нужны были для этого простую программу. Я включал защитный механизм для таких ситуаций, как нецелым числом входов.

import java.util.Scanner;
import java.util.*;
 // THIS IS PART OF Main.java
public class ClassOne {




public static void main(String[] args) {
    // TODO Auto-generated method stub
    System.out.println("Please tell me your name.");
    Scanner NI = new Scanner(System.in);
    String NameInput = NI.nextLine();
    Info user = new Info();
    user.name = NameInput;


    // Name is printed below
    System.out.println("Hello there " + NameInput + "!");
    String AgeVerification = "no";
    do {
        System.out.println("How old are you?");
        Scanner UA = new Scanner(System.in);
        // Starts asking for age
        while (!UA.hasNextInt()) {  

              System.out.println("This is not a number. Please type your age - Ex: 12, 28, 52, etc");
         String INVALIDUA = UA.next();
        }
        // If Age is a number - Continue
        int UserAge = UA.nextInt();

    System.out.println("So," + NameInput + " you are " + UserAge + ". Is that correct?");
    System.out.println("Type Yes or No.");
    // Confirms age
    Scanner AV = new Scanner(System.in);
    AgeVerification = AV.nextLine();
    if ( AgeVerification.equalsIgnoreCase("yes") ) {
        System.out.println("Thank you for confirming your age!");
        // If user says yes. Continue.
    }
    else if (AgeVerification.isEmpty() || AgeVerification == null) {
        System.out.println("You did not answer the question.. Let's try again.");
        //If User does comment. Re-enter age
        continue;
    }
    else if (AgeVerification.equalsIgnoreCase("no"))
     System.out.println("My bad! What is your age then?");
    else {
        System.out.println("That wasn't an option..was it? Let's try again!");
        // If user doesn't enter yes or no. Take as no and retry.
        continue;
    }
    user.age = UserAge;


    }while( !AgeVerification.equalsIgnoreCase("yes") || AgeVerification == null);

    // Defining CGCHECK1 as global Variable 
    String CGCheck1 = "no";
    do {
    System.out.println("How many calories do you aim to intake?");
    Scanner CG = new Scanner(System.in);

    while(!CG.hasNextInt()) {
        System.out.println("Please Enter the goal in numbers only. EX: '4000'");
        String InvalidCG = CG.next();
        //Checks Calorie Goal Input. If not an interger, Retry!
    }
    int CalG = CG.nextInt();
    user.goal = CalG;
    System.out.println("Your Goal is " + CalG + " . Is that Correct? Yes or No?");
    Scanner CgCheck = new Scanner(System.in);
    CGCheck1 = CgCheck.nextLine();
    if (CGCheck1.equalsIgnoreCase("yes")) {
        System.out.println("Great! You may now begin your daily log!");
    }

    else if (CGCheck1.isEmpty() || CGCheck1 == null) {
        System.out.println("You did not answer the question.. Let's try again.");
        //If User does comment. Re-enter age
        continue;
    }
    else if (CGCheck1.equalsIgnoreCase("no")){
        System.out.println("Okay, My bad!");
    }
    else {
        System.out.println("That wasn't an option..was it? Let's try again!");
        // If user doesn't enter yes or no. Take as no and retry.
        continue;



    }
    int CaloGoal = CalG;
    }while (!CGCheck1.equalsIgnoreCase("yes")); 

// Goal - FirstIntake = RemainingGoal then Remaining goal - NextIntake = Remaining Goal 
    int Run = 1;
    user.CR = 0;
    int start = 1;
    do {

        System.out.println("Enter each calorie intake. This will subtract from your daily goal.");
    System.out.println("Ex: 250, then later 300, then later 500. This will take 1000 from your current goal.");
    Scanner II = new Scanner(System.in);

    while(!II.hasNextInt()) {
        System.out.println("Please Enter the Intake in numbers only. EX: '350'");
        String InvalidII = II.next();
        // Checks if Initial Intake is a Interger. 
}
    int InitialIntake = II.nextInt();
    user.current = user.current + InitialIntake;
    int CR = InitialIntake - user.goal;

    if (start == 1) {
        // Checks if Intake is less than goal or If user has reached goal.
    user.CR =user.goal - InitialIntake;

    System.out.println("You have taken in  " + InitialIntake + " calories!");
    System.out.println(" You have " + user.CR + " calories left!");
     System.out.println("You have taken in " + user.current + " calories!");
    start++;
        // After this code runs. The if statement is nolonger true, It will now move to else if. 
    }
    else if (user.CR > 0) {
        user.CR = user.CR - InitialIntake;
        System.out.println("You have taken in  " + InitialIntake + " calories!");
        System.out.println(" You have " + user.CR + " calories left!");
         System.out.println("You have taken in " + user.current + " calories!");
        }

    else if (user.CR <= 0) {
     System.out.println("You have reached your goal! Congratulations!");
     System.out.println("You have taken in " + user.current + " calories!");
    }
    } while ( Run == 1);



}

 }

Ниже Info.java

       //this is Info.java
public class Info{
    int age;
    String name;
    int goal;
    int current;
    int CR;
}


246
2
задан 1 февраля 2018 в 03:02 Источник Поделиться
Комментарии
1 ответ

поздравляю с первых дней кодирования. Проблема каждого человека начинает код писать слишком много вещей, в основном - как одну большую миску все. Или спагетти ;)

Итак, шаг 1 - если класс, то есть инкапсуляция - частная полей и геттеров/сеттеров.

public class Info{
int age;
String name;
int goal;
int current;
int CR;
}

Становится:

public class Info {
private int age;
private String name;
private int goal;
private int current;
private int CR;

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getGoal() {
return goal;
}

public void setGoal(int goal) {
this.goal = goal;
}

public int getCurrent() {
return current;
}

public void setCurrent(int current) {
this.current = current;
}

public int getCR() {
return CR;
}

public void setCR(int CR) {
this.CR = CR;
}
}

Следующий именования. В Java мы пришли случае именования, так что переменные не

String NI

Но
Строки Н;

Но это другая проблема. Имена переменных должны быть четкими и осмысленными.
А1, Б2, smgxxx не так уж много значит. Лучше потратить время и имя его правильно

Чтобы избежать "Волшебные струны" означает наличие случайных строк здесь и там, есть смысл определиться частная статические заключительные названия констант в верхнем регистре. Поэтому код начинает выглядеть так.

        private static final String ASK_USERS_NAME = "Please tell me your name.";
private static final String WELCOME_USER_TEMPLATE = "Hello there %s!%n";
private static final String ASK_USERS_AGE = "How old are you?";
private static final String CALORIES_AIM_INTAKE = "How many calories do you aim to intake?";
private static final String GOAL_IN_NUMBERS_PROMPT = "Please Enter the goal in numbers only. EX: '4000'";
private static final String YES = "yes";
private static final String NO = "no";
private static final String VALID_AGE_PROMPT = "This is not a number. Please type your age - Ex: 12, 28, 52, etc";
private static final String DAILY_LOG_BEGIN_CONGRATS = "Great! You may now begin your daily log!";
private static final String YES_NO_PROMPT = "Type Yes or No.";

public static void main(String[] args) {
System.out.println(ASK_USERS_NAME);
Scanner NI = new Scanner(System.in);
String NameInput = NI.nextLine();
Info user = new Info();
user.name = NameInput;

// Name is printed below
System.out.printf(WELCOME_USER_TEMPLATE, NameInput);
String AgeVerification = NO;
do {
System.out.println(ASK_USERS_AGE);
Scanner UA = new Scanner(System.in);
// Starts asking for age
while (!UA.hasNextInt()) {

System.out.println(VALID_AGE_PROMPT);
String INVALIDUA = UA.next();
}
// If Age is a number - Continue
int UserAge = UA.nextInt();

System.out.println("So," + NameInput + " you are " + UserAge + ". Is that correct?");
System.out.println(YES_NO_PROMPT);

Я надеюсь, что это достаточно для стартера. Мой совет - сделать в объектно-ориентированное проектирование, увидеть, что твердый. Это поможет ваш путешествие кодирования. ТПХ!

0
ответ дан 5 февраля 2018 в 12:02 Источник Поделиться