【问题标题】:Program not behaving correctly程序运行不正确
【发布时间】:2016-10-28 02:53:06
【问题描述】:

我正在尝试为用户输入书籍信息(姓名、作者、出版年份和价格)创建一个程序。然后我希望能够获得 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

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

【问题讨论】:

  • “并将我的新对象存储在一个数组中”这在您的代码中没有发生
  • 你了解Book类中静态变量的用途吗?提示:你很可能不需要它们是静态的
  • 好吧,好吧,我该如何实现呢? @cricket_007 如果它们不是静态的,我会遇到一些错误。这里完全没有头绪。 ://
  • 你在哪里声明 sum 变量,如果你声明它,请用 0 初始化它
  • 类变量和实例变量有明显的区别。您当前有类变量(所有 Book 实例共享一个价格、作者、名称等)。删除静态变量,您就有了实例变量(每本书都有自己的价格、作者、名称)。总和和平均值不属于 Book 对象的实例。

标签: java arrays class


【解决方案1】:

NaN 的意思是“不是一个数字”,它表示一个糟糕的数学运算,比如零除以零,这就是你的情况:如果没有一本书符合条件 count=0 和 sum=0.0F,那么你就有了。

【讨论】:

  • 很高兴知道,但是我的书名呢?有什么想法吗?
  • 整数除法会触发异常,但您没有显示变量 sum 的类型,错误给出的价格是浮点数我假设我们在这里有浮点除法
  • 嗯,你需要一个0.0F 来获得NaN 的股息。另一个数字将导致Infinity。但是,由于您对 “如果没有书符合条件” 是正确的,sum 变量可能也是 0.0F
【解决方案2】:

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。您可以使用该值来计算平均值。

【讨论】:

  • 谢谢,所有这些都比我想从中学习的这本书解释得更多!!!我已经完成了您建议的所有操作,并且效果很好,除了我输出所有书籍的部分(而不仅仅是 2000 年之后的那些)。我想我会在阅读更多文章后弄清楚。你很有帮助:)
【解决方案3】:

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

当您查找年份时,它们都不符合条件,因为它们都是空的。这意味着计数也保持为 0。除以 0 会产生 NaN 错误。该错误未显示在

sum = sum + Books.price;

行,因为它永远不会达到那个状态。

还有,

if (Books.year >= 2000) 

正在检查该类是否具有 >= 2000 的年份,而不是检查特定对象。

尝试类似:

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

【讨论】:

  • 不。这就是我的全部代码。我以为我用这一行将值存储在一个数组中:Books [] book = new Books[5];但我显然错了。
  • "它永远不会达到那种状态" 是的。该数组有 5 个空值。 Books.price 为 0,book[j].property 只有在变量不是静态的情况下才能正常工作
  • @Tanya100,行 Books[] book = new Books[5] 仅初始化变量,因为它告诉编译器变量 book 是大小为 5 的 Books 对象数组。您需要存储具有类似 book[i] = ... 的值,但我看到您已经从其他人那里找到了该解决方案。
  • @cricket_007 我的意思是它永远不会达到那种状态,因为 if 语句总是像 if(null >= 2000) 一样工作,这显然是错误的,所以它不起作用
  • 但是Books.year是一个int,不是Integer对象,所以它只是0,不是null
【解决方案4】:

NaN 表示“不是数字”。 如果在这种情况下没有任何书籍(Books.year >= 2000),则会导致除以零错误。因为您的计数变量正在变为 0 。 在 avrg =总和/计数;不检查天气,您的计数超过 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)

因为您使用的是数组类型的对象,所以您需要指定要查看的索引

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多