我正在尝试为用户输入书籍信息(名称,作者,出版年份和价格)创建一个程序。然后我希望能够得到一本书的清单' 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
它甚至没有显示名字。我很困惑,我不知道这是否是我想做的最佳方式。我将不胜感激。
答案 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
。您可以使用该值来计算平均值。