【问题标题】:Can I do a for loop after two consecutive if statements? [duplicate]我可以在两个连续的 if 语句之后执行 for 循环吗? [复制]
【发布时间】:2018-04-19 09:44:39
【问题描述】:

我正在开发一个程序,该程序必须在执行两个 for 循环(一个用于输入的成绩总和,一个用于最高和最低成绩)之前检查某些条件(如果未执行则发出错误消息)而且我不确定如何对它们进行排序。

我的代码也让我收到此错误 -->线程“main”java.lang.ArrayIndexOutOfBoundsException 中的异常:0,我不确定如何修复该错误

如果有人可以帮助我制作正确序列的骨架,我将不胜感激!

这是我的代码(我知道它看起来很疯狂,抱歉我正在学习!):

import java.util.Scanner;

public class Homework {

    public static void main (String[] args) {
        Scanner input = new Scanner(System.in);
        int numberOfMarks, average, sum, total, mark;
        numberOfMarks = 0;
        int [] marks = new int[numberOfMarks];
        int smallest, largest;
        //System.out.println("Enter number of marks: ");
        numberOfMarks = input.nextInt();
        if(numberOfMarks<0) {
        System.out.println("Number of marks must be greater than 0!!");
        }
        //System.out.println("Enter "+numberOfMarks+"marks: ");
        mark = input.nextInt();
        if(mark<0) {
            System.out.println("Negative marks not allowed!!!");
        } else if(mark>100) {
            System.out.println("Marks above 100% not allowed!!!");
        }  
        sum = 0;
        for(int i = 0; i < marks.length; i++) {
            sum += marks[i];
        }
        smallest=marks[0];
        largest=marks[0];
        for(int i=1;i<marks.length;i++) {       
            if(marks[i]>largest) {
                largest=marks[i];
            } else if(marks[i]<smallest) {
                smallest=marks[i];
            }
            average = sum/numberOfMarks;
            System.out.println("Highest Mark = "+largest);
            System.out.println("Lowest Mark = "+smallest);
            System.out.println("Average = "+average);
        }
    }
}

【问题讨论】:

  • 在要求人们尝试阅读之前,您应该正确缩进代码。
  • 1.正确格式化您的代码。 2.minimal reproducible example 3.当时一个问题,不然太宽泛了。 4.stackoverflow.com/questions/5554734/…
  • 您的数组大小为 0marks[0] 尝试访问第一个条目,所以它崩溃了。
  • numberOfMarks = 0; int [] marks = new int[numberOfMarks]; 将创建一个 empty 数组。您必须在创建之前获取用户输入
  • int [] marks = new int[numberOfMarks];

标签: java for-loop if-statement


【解决方案1】:

你可以试试这个:

import java.util.Arrays;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);
        int numberOfSubjects, sum;
        numberOfSubjects = 0;

        System.out.print("Enter the total number of subjects: ");
        numberOfSubjects = in.nextInt();

        if(numberOfSubjects < 0){
        System.out.println("Number of marks must be greater than 0!!");
        }
        else {
            int []marks = new int[numberOfSubjects];
            sum = 0;

            System.out.print("Enter the marks: ");
            // add condition inside for loop for marks not less than 1 or greater than 100 
            for(int i=0; i<marks.length; i++) {
                    marks[i] = in.nextInt();
            }

            // calculate total
            for(int i = 0; i < marks.length; i++){
                sum += marks[i];
            }

            // sort marks
            Arrays.sort(marks);

            System.out.println("Total: " + sum);
            System.out.println("Average: " + sum/numberOfSubjects);
            System.out.println("Minimum: " + marks[0]);
            System.out.println("Maximum: " + marks[marks.length-1]);
        }
    }
}

代码流应该是这样的。甚至您可以在阅读分数时添加分数条件(不小于1或大于100)。

【讨论】:

  • 谢谢!这对我有很大帮助
【解决方案2】:

问题出在逻辑上,见下面的 cmets

import java.util.Scanner;

public class Homework {

 public static void main(String[] args) {

  Scanner input = new Scanner(System.in);

  int numberOfMarks, average, sum, total, mark;
  numberOfMarks = 0;
  /*there you are creating empty array
    you told marks should have length of value numberOfMarks, but 
    numberOfMarks is equal to zero at this time
  */
  int[] marks = new int[numberOfMarks]; 
  int smallest, largest;

  //System.out.println("Enter number of marks: ");
  numberOfMarks = input.nextInt();

 /*
   not interesting conditions checking... 
 */

  for (int i = 0; i < marks.length; i++) {
   /*
     There you are trying to access 1st element of marks
       - indexing from zero, as usual
     But there is no first element, array has zero length, zero elements
      Ok, you told array should have length of numberOfMarks, but it was 
       when value was zero, so if you will change numberOfMarks later, it 
        has no impact on the length of array
   */
   sum += marks[i];
  }

  /*
    stats computing, not important
  */

 }

}

所以,一旦你得到用户输入的标记数,你就可以“重新创建”——重新分配/重新定义数组,就像以前一样 marks = new int[numberOfMarks];

你的情况如下

//System.out.println("Enter number of marks: ");
numberOfMarks = input.nextInt();

使用数组长度变量并不意味着它会是有界的,所以如果数组长度变量(在这种情况下numberOfMarks)在使用后会发生变化,那么数组长度将保持不变

【讨论】:

  • 感谢您的反馈!
  • 在访问数组之前放置断点,并使用调试器检查变量的值;)
猜你喜欢
  • 2018-02-01
  • 1970-01-01
  • 2021-04-25
  • 2018-03-11
  • 1970-01-01
  • 1970-01-01
  • 2021-12-19
  • 2021-12-24
相关资源
最近更新 更多