2012-04-03 308 views
0

好吧,我非常接近解決方案,但我無法弄清楚這一點。出於某種原因,我的代碼不會產生隨機年齡,高度,重量等。此外,我收到一個錯誤「非靜態方法getBodyMassIndex()不能從靜態上下文行中引用43我做了研究並閱讀錯誤是因爲我需要創建一個實例來應用這個,但我迷路了,我以爲我已經做到了,我無法得到任何工作,這基本上是一門自學java課程,我真的很掙扎。任何幫助,不勝感激!!代碼如下:需要Java幫助

package classlab3b; 

import classlab3B.BodyMassIndex; 
import java.text.DecimalFormat; 
import java.util.Random; 
import java.util.Scanner; 

/** 
* 
* @author ccity 
*/ 
public class ClassLab3B { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     System.out.println("Please enter the number of people:"); 
     //asks user to input number of people 
     int numberOfPeople; 
     //declares integer variable for number of people 
     Scanner input = new Scanner(System.in); 
     //creates system input scanner 
     numberOfPeople = input.nextInt(); 
     //captures user input for number of people 
     BodyMassIndex[] a = new BodyMassIndex[numberOfPeople]; 
     //creates an array of BodyMassIndex the size of numberOfPeople 
     String name = loadRandomNames(a); 
     //loads object with random name 
     int age = loadRandomAges(a, numberOfPeople); 
     //loads object with random age 
     double weight = loadRandomWeights(a); 
     //loads object with random weight 
     double height = loadRandomHeights(a); 
     //loads object with random height 
     createObjectsToFillArray(a, name, age, weight, height, numberOfPeople); 
     //creates "x" objects to fill the array 
     double BMI = BodyMassIndex.getBodyMassIndex(); 
     //gets BMI from getBodyMassIndex method in BodyMassIndex.java 
     String status = BodyMassIndex.getStatus(); 
     //gets status from getStatus method in BodyMassIndex.java 
     //double BMI = BodyMassIndex.bmix.getBodyMassIndex(); 
     //String status = BodyMassIndex.bmix.getStatus(); 
     printArray(a, name, age, weight, height, BMI, status); 
     //prints array 


     System.out.println(" "); 
     System.out.println("Current Population"); 
     System.out.println(" "); 
     System.out.println("Obese: " + BodyMassIndex.numberOfObese); 
     System.out.println("Overweight: " + BodyMassIndex.numberOfOverweight); 
     System.out.println("Normal: " + BodyMassIndex.numberOfNormal); 
     System.out.println("Underweight: " + BodyMassIndex.numberOfUnderweight); 
     System.out.println("================"); 
     System.out.println("Total: " + BodyMassIndex.totalNumberOfPeople); 


    } 

    public static void createObjectsToFillArray(BodyMassIndex[] data, String name, int age, double weight, double height, int numberOfPeople) { 
     for (int i = 0; i < numberOfPeople; i++) { 
      data[i] = new BodyMassIndex(name, age, weight, height); 
     } 


     //creates new BodyMassIndex objects with generated variables from methods within 
    } 

    public static String loadRandomNames(BodyMassIndex[] data) { 

     String[] arrayOfFirstNames = {"Joe", "Donna", "Ronald", "Sarah", "David", "Courtney", "Irwin", "Linda", "Michael", "Cindy", "Tom", "Rebekah", "Todd", "Tracy", "Peter", "Nicole", "Marcelo", "Jennifer", "Rick", "Andrea", "Bruce", "Jaclyn", "Doug", "Shirley", "Steve", "Liz", "Waldo", "Theresa", "Scott", "Colby", "Beth", "Larry", "Emily", "Paul", "Kate", "Sam", "Dianne", "Dustin", "Alethea", "Wayne", "Kristina", "Christian", "Danny", "Breya", "Andrew", "Alison", "Tim", "Mary", "Chris", "Susie", "Jeremy", "Willy", "Jessica", "Marcus", "Kelly", "Kyle", "Stephanie", "Isaiah", "Hillary", "Eric", "Julia", "Donald", "Meredith", "Kevin", "Leslie", "Blake", "Angela", "Cliff", "Debbie", "Dylan", "Erin", "Alex", "Monica", "Nathan", "Wendy", "Josh", "Megan", "Adam", "Michelle", "Carey", "Ashley", "Brian", "Jason", "Melanie", "Jim", "Monica", "Jamie", "Rhonda", "Steven", "Perry", "Byron", "Laura", "Harry", "Brooke", "Drew", "Vicki", "Gary", "Anita", "Felipe", "Josie"}; 
     String[] arrayOfLastNames = {"Smith", "Johnson", "Williams", "Jones", "Brown", "Davis", "Miller", "Wilson", "Moore", "Taylor", "Washington", "Jefferson", "Lincoln", "Hamilton", "Jackson", "Grant", "Franklin", "McKinley", "Cleveland", "Madison", "Chase", "Nicholson", "Fauver", "Doe", "Southard", "Schmidt", "Hodson", "McDonald", "Stickley", "Miller", "Combs", "Bohus", "Krippner", "Amtower", "Banks", "Wallace", "Bannister", "Dehaven", "Yost", "Still", "Timbrook", "Peters", "Vaught", "Shellhammer", "Andrews", "Krippner", "McAlister", "Wright", "Kensinger", "McClellan", "Ganoe", "Shiley", "Layman", "Gearhart", "Yost", "Kushnir", "Bush", "Lowder", "Connolly", "Lowman", "Terveen", "Staton", "Settle", "Tinsman", "Nichols", "Baker", "Walters", "Dawe", "Renner", "Michaels", "Faircloth", "Looker", "Hastings", "Vaughan", "Anderson", "Zimmerman", "Deere", "Daher", "Lauck", "Stottlemyer", "Clinton", "Obama", "Reagan", "Montgomery", "Pugh", "Gavis", "Clark", "Bowers"}; 

     String first = get(arrayOfFirstNames); 
     String last = get(arrayOfLastNames); 
     String name = first + " " + last; 

     return name; 
    } 

    public static String get(String[] array) { 
     Random generator = new Random(); 
     int rnd = generator.nextInt(array.length); 
     return array[rnd]; 
    } 

    public static int loadRandomAges(BodyMassIndex[] data, int numberOfPeople) { 
     double min = 13; 
     double max = 99; 
     int age = 0; 
     for (int i = 0; i < numberOfPeople; i++) { 
      age = (int) randomInt(min, max); 
     } 

     return age; 
    } 

    public static double randomInt(double min, double max) { 

     double random = (double) ((max - min + 1) * Math.random() + min); 
     return random; 

    } 

    public static double loadRandomWeights(BodyMassIndex[] data) { 
     double min = 100; 
     double max = 300; 
     double weight = randomInt(min, max); 
     for (int row = 0; row < data.length; row++) { 
     } 
     return weight; 
    } 

    public static double loadRandomHeights(BodyMassIndex[] data) { 
     double min = 55; 
     double max = 80; 
     double height = randomInt(min, max); 
     for (int row = 0; row < data.length; row++) { 
     } 
     return height; 
    } 

    public static void printArray(BodyMassIndex[] data, String name, int age, double weight, double height, double BMI, String status) { 
     System.out.println(" Name   " + "Age " + "Height " + "Weight " + "BMI " + "Status"); 
     for (int i = 0; i < data.length; i++) { 

      DecimalFormat format = new DecimalFormat(); 
      format.setMinimumFractionDigits(2); 
      format.setMaximumFractionDigits(2); 


      System.out.println(name + "  " + age + "  " + format.format(height) + " " + format.format(weight) + format.format(BMI) + " " + status); 
     } 
    } 
} 

而這裏的BodyMassIndex.java代碼:

package classlab3B; 

/** 
* 
* @author Liz 
*/ 
public class BodyMassIndex { 

    private String name; 
    private int age; 
    private double weight; 
    private double height; 
    public static final double OBESE_BMI = 30.0; 
    public static final double OVERWEIGHT_BMI = 25.0; 
    public static final double NORMAL_BMI = 18.5; 
    public static int numberOfObese; 
    public static int numberOfOverweight; 
    public static int numberOfNormal; 
    public static int numberOfUnderweight; 
    public static int totalNumberOfPeople; 

    public static void main(String[] args) { 


     BodyMassIndex bmi1 = new BodyMassIndex("John Doe", 18, 145, 70); 
     //BodyMassIndex bmix = new BodyMassIndex(ClassLab3B.name, ClassLab3B.age, ClassLab3B.weight, ClassLab3B.height); 


     System.out.println("The BMI for " + bmi1.getName() + " is " + bmi1.getBodyMassIndex() + " " + bmi1.getStatus()); 

     System.out.println(" "); 
     System.out.println(" "); 
     System.out.println("Current Population"); 
     System.out.println(" "); 
     System.out.println("Obese: " + numberOfObese); 
     System.out.println("Overweight: " + numberOfOverweight); 
     System.out.println("Normal: " + numberOfNormal); 
     System.out.println("Underweight: " + numberOfUnderweight); 
     System.out.println("================"); 
     System.out.println("Total: " + totalNumberOfPeople); 
    } 

    public BodyMassIndex(String name, int age, double weight, double height) { 
     this.name = name; 
     this.age = age; 
     this.weight = weight; 
     this.height = height; 
     totalNumberOfPeople++; 
    } 

    public double getBodyMassIndex() { 
     double bmi = ((weight * 703)/(height * height)); 
     return Math.round(bmi * 100)/100.0; 
    } 

    public String getStatus() { 
     double bmi = getBodyMassIndex(); 
     if (bmi < 16) { 
      numberOfUnderweight++; 
      return "seriously underweight"; 
     } else if (bmi < 18) { 
      numberOfUnderweight++; 
      return "underweight"; 
     } else if (bmi < 24) { 
      numberOfNormal++; 
      return "normal weight"; 
     } else if (bmi < 29) { 
      numberOfOverweight++; 
      return "overweight"; 
     } else if (bmi < 35) { 
      numberOfObese++; 
      return "grossly overweight"; 
     } else { 
      numberOfObese++; 
      return "gravely overweight"; 
     } 
    } 

    @Override 
    public String toString() { 
     return "BodyMassIndex{" + "name=" + name + ", age=" + age + ", weight=" + weight + ", height=" + height + '}'; 
    } 

    public String getName() { 
     return name; 
    } 
} 
+0

您需要突出發生錯誤的行(我不打算手動計算) - loadRandomAges()也不執行任何已選擇年齡的事件。 – John3136 2012-04-03 06:00:22

回答

0
  • 您需要標記public double getBodyMassIndex()static - 你並不真正需要的BodyMassIndex實例調用該方法,因爲你不使用內部的任何成員數據。

所以,這種方法的簽名應該是:

public static double getBodyMassIndex() {...} 
  • 的標準模式得到整數內部的一些範圍是:

    敏+(INT)(的Math.random ()*((Max-Min)+ 1))

java Math libra ry函數Math.random()在[0,1)範圍內生成一個double值。請注意這個範圍不包括1

爲了得到價值首先你需要通過值的你想要覆蓋的範圍的大小相乘的特定範圍。

Math.random() * (Max - Min) 

這將返回[0,Max-Min)範圍內的值。 如果你想[5,10]你需要支付5個整數值,所以你使用:

Math.random() * 5 

這範圍內的返回值[0,5)

現在你需要轉移這個範圍內,對您的目標範圍內。您可以通過添加最小值來完成此操作。

Min + (Math.random() * (Max - Min)) 

現在,您將在範圍[Min,Max)得到的值。在我們的例子,這意味着[5,10)

5 + (Math.random() * (10 - 5)) 

但是,這還不包括Max和你得到的雙重價值。爲了獲得最大值,你需要在範圍參數(Max - Min)中加1,然後通過強制轉換爲整數來截斷小數部分。這是通過:

Min + (int)(Math.random() * ((Max - Min) + 1)) 

而你有它。範圍[Min,Max]隨機整數值,或每例子[5,10]

5 + (int)(Math.random() * ((10 - 5) + 1)) 

here

好運被偷了!

+0

謝謝soooo多!我修正了這一點。一件如此簡單的事情令人沮喪。現在有什麼想法,爲什麼我得到每個條目相同的名稱,年齡,體重等? – user1309594 2012-04-03 06:11:40

+0

@ user1309594,請參閱我的編輯 – aviad 2012-04-03 06:24:57

-1

您需要BodyMassIndex的一個實例:

BodyMassIndex bmi = new BodyMassIndex(...) 
double BMI = bmi.getBodyMassIndex(); 

你使用它,方式意味着,方法聲明爲BMI類靜態的。像:

public static double getBodyMassIndex() {...} 

但是這不會是一個偉大的設計。

+0

調用靜態方法時不需要'BodyMassIndex'的實例。 – aviad 2012-04-03 06:03:42

+0

是的,我的意思是有兩種方法調用getBodyMassIndex()。作爲一個實例 - 具有顯式實例的方法或者像他已經嘗試過的靜態方法,但是該方法必須是靜態的。 – boskop 2012-04-03 06:36:37

+0

順便說一句,如果方法是'靜態','bmi'甚至不需要實例化:'BodyMassIndex bmi = null;'稍後調用到'bmi.getBodyMassIndex()'仍然可以工作(檢查這個:) – aviad 2012-04-03 06:59:42

0

是的,你不能訪問從您的課BodyMassIndex.getBodyMassIndex();BodyMassIndex.getStatus();稱爲ClassLab3B,因爲這兩種方法不是靜態的..

如果你讓他們靜,U將無法訪問烏爾班BodyMassIndex的非靜態成員..

,這樣你們可以返回BodyMassIndex []從createObjectsToFillArray(),然後訪問每個實例在一個for循環並調用printArray()

像這樣

BodyMassIndex[] x= createObjectsToFillArray(a, name, age, weight, height, numberOfPeople); 
    //creates "x" objects to fill the array 

    for(int i=0;i<x.length;i++) 
     { 
     double BMI = x[i].getBodyMassIndex(); 
     //gets BMI from getBodyMassIndex method in BodyMassIndex.java 
     String status = x[i].getStatus(); 
     //gets status from getStatus method in BodyMassIndex.java 
     //double BMI = BodyMassIndex.bmix.getBodyMassIndex(); 
     //String status = BodyMassIndex.bmix.getStatus(); 
     printArray(a, name, age, weight, height, BMI, status); 
     } 

public static BodyMassIndex[] createObjectsToFillArray(BodyMassIndex[] data, String name, int age, double weight, double height, int numberOfPeople) { 
    for (int i = 0; i < numberOfPeople; i++) { 
     data[i] = new BodyMassIndex(name, age, weight, height); 
    } 
return data; 

    //creates new BodyMassIndex objects with generated variables from methods within 
} 
1

雙BMI = BodyMassIndex。 getBodyMassIndex(); String status = BodyMassIndex。 getStatus();

在這2種方法中做了什麼 你已經創建了2種方法作爲非靜態,但使用類名稱調用。如果你將這兩個方法創建爲靜態,那麼在這2個方法中你也使用了非靜態變量。

double [] BMI = new double [numberOfPeople];
String [] status = new String [numberOfPeople];

對(INT I = 0;我< = numberOfPeople-1; i ++在){

BMI [I] = A [1] .getBodyMassIndex();

status [i] = a [i] .getStatus();

}

公共靜態無效printArray(BodyMassIndex []數據,字符串名稱,詮釋年齡,雙體重,雙高,雙[] BMI,字符串[]狀態)