程序行为不正确

时间:2016-06-25 17:30:18

标签: java arrays class

我正在尝试为用户输入书籍信息(名称,作者,出版年份和价格)创建一个程序。然后我希望能够得到一本书的清单' 2000年后公布的名称及其平均价格。 起初,我想过在数组中使用数组,但在经过类似的问题之后我选择了Book类:

public class Books {
 public static String name;
 public static String author;
 public static int year;
 public static float price;
 public static float sum = 0.0F;
 public static float avrg = 0.0F;   

我不知道以下是否有必要,但我是按照我在很多例子中看到的那样做的:

public String getName () {
            return name;
        }
        public String getAuthor () {
            return author;
        }
        public int getYear () {
            return year;
        }
        public float getPrice () {
            return price;
        }

然后,我试图获取用户输入并将我的新对象存储在一个数组中。

public static void main(String[] args) {
    System.out.println("Please enter details for five books!");     
    Scanner in = new Scanner (System.in);
    Books [] book = new Books[5];
    int i = 0;
    int j = 0;
    int count = 0;

    for (i=0; i < book.length; i++) {
        System.out.println("Enter Book Title, Author Last Name, Year and Price:");
        String name = in.next();
        String author = in.next();
        int year = in.nextInt();
        float price = in.nextFloat();
        }

在这里,我想找到确切的书籍并计算它们的平均价格:

for (j=0; j<book.length; j++){
        if (Books.year >= 2000) {
            System.out.println("Books published after 2000:"+ Books.name);
            sum = sum + Books.price;
            count = count + 1;
        }       
}
    avrg = sum/count;
    System.out.println("Average price of books published after 2000:"+avrg);

在我想要出版书籍(和平均价格)的部分之前,一切似乎都在顺利进行。我得到了这个结果:

Please enter details for five books!
Enter Book Title, Author Last Name, Year and Price:
...
Average price of books published after 2000:NaN

它甚至没有显示名字。我很困惑,我不知道这是否是我想做的最佳方式。我将不胜感激。

4 个答案:

答案 0 :(得分:2)

NaN表示&#34;不是数字&#34;这是一个错误的数学运算,如零除以零,这就是你的情况:如果没有一本书符合条件count = 0和sum = 0.0F,你就有了它。

答案 1 :(得分:0)

NaN表示&#34;不是数字&#34; 。 如果在这种情况下没有任何书籍(Books.year&gt; = 2000),则会导致除零错误。因为您的计数变量为0。 在 avrg = sum / count;没有检查你的计数超过0的天气。 放置if条件来检查,

    if(count>=0){ 
      avrg = sum/count;
      System.out.println("Average price of books published after 2000:"+avrg);
}

对于书名,使用Books.name中的getName方法 举个例子:

Books books = new Books();
System.out.println(books.getName());

并查看2000年以上的图书

if(book[j].year >= 2000)  

而不是

if(Books.year >= 2000)

因为您正在使用和数组类型对象,您需要指定要查看的索引

答案 2 :(得分:0)

也许您没有共享代码的这一部分,但实际上是将输入存储在Book对象中,然后将其存储在数组中?创建数组时,它会创建5个具有所有空值的Book对象。

当你找到这些年份时,它们都没有资格,因为它们都是空的。这意味着计数也保持为0.除以0表示NaN错误。该错误未显示在

sum = sum + Books.price;

因为它永远不会到达那个州。

另外,

if (Books.year >= 2000) 

正在检查班级是否有年份> = 2000且未检查特定对象。

尝试类似:

if(book[j].year >= 2000)

答案 3 :(得分:0)

1)遵循Java命名约定。该类应为Book,因为它是单个对象。

public class Book {

你的数组应该是复数。

Book [] books = new Book[5];

2)对于属于单个书籍的属性,使用实例变量而不是类变量。这需要您从名称,作者,年份和价格中删除static

3)“我正在尝试接受用户输入并将我的新对象存储在数组中。”您发布的代码不会在数组中存储新对象。这解释了为什么没有打印名称以及NaN在输出中的原因,因为数组是空的。

尝试将new Book()存储到数组中。

    System.out.println("Enter Book Title, Author Last Name, Year and Price:");
    Book b = new Book();
    b.name = in.next();
   ... 
   books[i] = b; // stored 

4)您需要遍历数组中的Book对象以访问其属性。您可以使用增强的for循环,因为您无论如何都不需要索引变量。

double sum = 0;
for (Book b : books){
    if (b.year >= 2000) {} 
    sum += b.price;
} 
System.out.println(sum);
if (books.length > 0) {
    System.out.println(sum / books.length);
} 

5)采取该循环并使其成为一种方法。例如,public static double totalPriceOfBooksAfterYear(Book[] books, int year)并拥有return sum。您可以使用该值来计算平均值。

相关问题