我目前正在完成一项家庭作业,并且一直很顺利,直到我在表格上达到第4步。在移动到数组中的下一个元素时,我不明白如何使代码运行。我们正在将Eclipse IDE用于Java开发人员。这是作业,这样你就可以看到我在做什么(请不要帮助我解决我的问题)。 (哎呀似乎我无法发布图片。会尝试提高我的声誉)
所有评论和建议欢迎,但请不要过去第4步!
到目前为止,这是我的代码(我知道不允许使用数组类,但我用它来检查我的数组):
import java.util.Scanner;
import java.util.Arrays;
public class ArrayPractice {
public static void main(String []args)
{
System.out.println("How many food items do the gerbils eat?");
Scanner keyboard = new Scanner(System.in);
String diffFoods = keyboard.nextLine();
int foodNum = Integer.parseInt(diffFoods);
String foodNames[] = new String[foodNum];
int foodMax[] = new int[foodNum];
int j = 1;
for (int i = 0; i < foodNum; i++)
{
System.out.println("Name of food item " +j +":");
foodNames[i] = keyboard.nextLine();
System.out.println("Maximum consumed per gerbil:");
String maxCons = keyboard.nextLine();
foodMax[i] = Integer.parseInt(maxCons);
j++;
}
System.out.println("How many gerbils are in the lab?");
String gerbs = keyboard.nextLine();
int numGerbs = Integer.parseInt(gerbs);
String gerbIDs[] = new String[numGerbs];
String gerbNNs[] = new String[numGerbs];
int gerbEat[] = new int[numGerbs];
int k = 1;
int arraycount = 0;
int l = 0;
for (int i = 0; i < numGerbs; i++)
{
System.out.println("Gerbil " +k +"'s lab id:");
gerbIDs[i] = keyboard.nextLine();
System.out.println("What name did the undergrads give to " +gerbIDs[i] +"?");
gerbNNs[i] = keyboard.nextLine();
System.out.println(gerbIDs[arraycount] +" eats how many " +foodNames[arraycount] +" per day?");
String gerbConsump = keyboard.nextLine();
int gerbEat1 = Integer.parseInt(gerbConsump);
gerbEat[l] = gerbEat1;
System.out.println(gerbIDs[arraycount] +" eats how many " +foodNames[arraycount + 1] +" per day?");
String gerbConsump2 = keyboard.nextLine();
int gerbEat2 = Integer.parseInt(gerbConsump2);
gerbEat[l+1] = gerbEat2;
k++;
}
//ONLY PROBLEM IS THE PROGRAM DOESN'T CHANGE GERBIL NAME WHEN LOOPING
System.out.println(Arrays.toString(foodNames));
System.out.println(Arrays.toString(foodMax));
System.out.println(Arrays.toString(gerbIDs));
System.out.println(Arrays.toString(gerbNNs));
System.out.println(Arrays.toString(gerbEat));
}
}
答案 0 :(得分:0)
问题在于以下几点:
System.out.println(gerbIDs[arraycount] +" eats how many " +
foodNames[arraycount] +" per day?");
String gerbConsump = keyboard.nextLine();
int gerbEat1 = Integer.parseInt(gerbConsump);
gerbEat[l] = gerbEat1;
System.out.println(gerbIDs[arraycount] +" eats how many " +
foodNames[arraycount + 1] +" per day?");
将arrayCount
中的gerbIDs
替换为i
。
如果您可能在foodNames
范围内出界,可能会或可能不会出现其他一些问题。您使用arraycount + 1
,这可能会导致您超出数组的末尾。您似乎也没有增加l
。
答案 1 :(得分:0)
你是以非常程序的方式处理作业。我不知道老师对你的期望,但你应该创建代表FoodType
和Gerbil
的课程。
话虽如此,这里有一些见解。
第一个问题是你没有使用关于沙鼠吃的食物的嵌套循环。 由于食物类型的数量是动态的(由用户给出),因此您需要输入的次数与不同类型的数量一样多。
您目前正在重复两次提示代码:仅在有两种食物时才有效。
相反,使用迭代食物类型的for
循环。
j
,k
,l
和arrayCount
不需要请记住您在迭代的内容:
gerbNNs
和gerbIDs
)foodNames
和foodMax
)因此,只需要2个指数:例如g
(沙鼠)和ft
(食物类型)。
此外,j
和k
仅用于提供循环索引{1}的基于1的版本,您应该使用i
。
绝对不需要这些变量,它们使代码变得更加难以阅读。
这一行错了:
i+1
您要存储的是 一只沙鼠 每日消费 一种食物 。这意味着您需要一个二维数组,由我在上一节中讨论过的两个索引编制索引:
int gerbEat[] = new int[numGerbs];
然后您可以通过表达式int[][] gerbEat = new int[numGerbs][foodNum];
访问沙鼠ft
的每日食物消耗量g
。
gerbEat[g][ft]
以下是您在上一部分中讨论的修改代码:
String diffFoods = keyboard.nextLine();
int foodNum = Integer.parseInt(diffFoods);
String foodNames[] = new String[foodNum];
int foodMax[] = new int[foodNum];
for (int ft = 0; ft < foodNum; ft++) {
System.out.println("Name of food item " + (ft+1) +":");
foodNames[ft] = keyboard.nextLine();
System.out.println("Maximum consumed per gerbil:");
String maxCons = keyboard.nextLine();
foodMax[ft] = Integer.parseInt(maxCons);
}
System.out.println("How many gerbils are in the lab?");
String gerbs = keyboard.nextLine();
int numGerbs = Integer.parseInt(gerbs);
String gerbIDs[] = new String[numGerbs];
String gerbNNs[] = new String[numGerbs];
int[][] gerbEat = new int[numGerbs][foodNum];
for (int g = 0; g < numGerbs; g++) {
System.out.println("Gerbil " + (g+1) +"'s lab id:");
gerbIDs[g] = keyboard.nextLine();
System.out.println("What name did the undergrads give to " +gerbIDs[g] +"?");
gerbNNs[g] = keyboard.nextLine();
for (int ft = 0; ft < foodNum; ft++) {
System.out.println(gerbIDs[g] +" eats how many " + foodNames[ft] +" per day?");
String gerbConsump = keyboard.nextLine();
int gerbEat1 = Integer.parseInt(gerbConsump);
gerbEat[g][ft] = gerbEat1;
}
}
更新:以回复您的评论
我在帖子的第一行中的意思是,您应该使用代表这些实体的单个对象数组,而不是让几个全局数组限定实体的不同方面(例如沙鼠)。
例如,你需要几个关于沙鼠的元素:
所以你应该为它创建一个类:
class Gerbil {
String id;
String nickname;
boolean bites;
boolean escapes;
int[] dailyFoodQuantity;
}
你为什么要这样做?因为收集有关实体的信息并将其抽象化是有意义的。如果您需要返回一些Gerbil的信息,只需返回Gerbil
对象,一切都在那里。要求沙鼠的使用代码不需要使用它的每个方面。
此外,如果某个方面被遗忘了某个实体,您只需添加一个字段即可创建没有问题(无需向任何方法或任何方法添加参数)。
答案 2 :(得分:-1)
我不确定你到底想要什么,但我想你的问题是你忘了增加arraycount,因为你在整个程序中定义为零是没有意义的。你似乎也没有增加l。如果这些是常量,则通过在声明中添加final来定义它们。
你似乎也有一些困惑,没有必要在for循环中有计数器,你可以使用for循环中定义的int。 e.g。
for(int i=0; i<10; i++){
System.out.println(i);
}
将打印0,1,2,3等。它还使您的代码更具可读性。 for循环中对循环计数器具有可预测依赖性的任何计数器都应该用i递增。这使得阅读更容易。另外,考虑一下你的代码的布局:没有注释的大块,没有新行使得很难理解发生了什么,在这个简单的例子中没有这样的问题,但是良好的实践很重要。将代码组织成具有单一逻辑目标的块,并在其上方添加注释,说明目标是什么。
此外,在您定义随机整数的情况下,要么使用自解释名称,要么发表评论,这样您就可以确切地看到,例如: k,应该用于。