【问题标题】:My array is only remembering last last element entered and histogram is not printing right我的数组只记住最后输入的最后一个元素,直方图打印不正确
【发布时间】:2021-06-27 01:20:28
【问题描述】:
import java.util.Scanner;

public class RainRecording {

    private int choice;
    private Scanner input;
    private String site;
    private int days;
    private int daysCounter;
    private int[] rainRecorded;
    private int[] rainEntered;
    private float lattitude;
    private float longitude;
    private String message1;
    private String message2;
    private String message3;
    private String message4;
    private String message5;
    private String message6;

    // declare name of variable

    public RainRecording() {

        // declare value of variable

        this.message1 = "Site";
        this.message2 = "lattitude";
        this.message3 = "longitude";
        this.message4 = "Window";
        this.message5 = "days";
        this.message6 = ":";
        this.daysCounter = 0;
        this.input = new Scanner(System.in);
        mainMenu();

    }

    private void mainMenu() {
        System.out.println("");
        System.out.println("*** Rain Gauge Menu ***");
        System.out.println("  1: Create rain gauge");
        System.out.println("  2: Display rain gauge details");
        System.out.println("  3: Add daily rainfall measurement");
        System.out.println("  4: Display rainfall histogram");
        System.out.println("  5: Get maximum rainfall");
        System.out.println("  6: Check rainfall is below threshold");
        System.out.println("  7: Display anaylsis");
        System.out.println("  8: Exit");
        System.out.print("Please enter your selection: ");

        Chosen();

    }

    private void Chosen() {

        this.choice = Integer.parseInt(input.nextLine());
        switch (choice) {
        case 1:
            createGauge();
            break;

        case 2:

            gaugeDetails();
            break;
        case 3:
            
            int i = 0;

            while( i < this.days || this.daysCounter == this.days) {
            
            if (this.daysCounter == this.days) {

                System.out.printf("Error - system full\n");
                mainMenu();

            }
            if (this.days < 1) {

                mainMenu();

            } else {        
                

                this.rainRecorded = new int[this.days];
                System.out.printf("Please enter rainfall for the current day:  ");
                rainRecorded[this.daysCounter] = Integer.parseInt(input.nextLine());
                this.daysCounter++;
                this.rainEntered = new int[this.daysCounter];
                mainMenu();
            }
            
            i++;
            }
            break;
        case 4:
            System.out.printf("\n");
            displayHistogram();
            break;
        case 5:
            break;
        case 6:
            break;
        case 7:
            break;
        case 8:
            break;

        default:
            System.out.println("Invalid input, try again");
            mainMenu();
        }

        while (choice != 8)
            ;

    }

    

    private void createGauge() {

        System.out.printf("\nPlease enter the name of the site :");
        this.site = input.nextLine();
        System.out.printf("Please enter the number of days to record :");
        this.days = Integer.parseInt(input.nextLine());
        System.out.printf("Please enter the lattitute :");
        this.lattitude = Float.parseFloat(input.nextLine());
        System.out.printf("Please enter the longitude :");
        this.longitude = Float.parseFloat(input.nextLine());
        mainMenu();

    }

    private void gaugeDetails() {

        if (this.days > 0) {

            System.out.printf("%-9s %-3s %s \n", this.message1, this.message6, this.site);
            System.out.printf("%s %-3s % 09.4f\n", this.message2, this.message6, this.lattitude);
            System.out.printf("%s %-3s %9.4f\n", this.message3, this.message6, this.longitude);
            System.out.printf("%-9s %-3s %-2d%s \n", this.message4, this.message6, this.days, this.message5);

            mainMenu();

        } else {

            mainMenu();

        }

    }

    private void displayHistogram() {

        for (int i = 0; i < this.rainEntered.length; i++) {

            for (int j = 0; j < this.rainRecorded[i] - 1; j++) {

                System.out.print("*");

            }

            System.out.println(i);

        }

        System.out.print("");
        mainMenu();

    }

    public static void main(String[] args) {

        @SuppressWarnings("unused")
        RainRecording objName;
        objName = new RainRecording();

    }

}

伙计们,我在我的 switch 语句中被打了几天,以防万一 3 是我创建要输入数组的元素的地方,但似乎只记得当我打印直方图时输入的最后一个数组情况 4 displayHistogram();这也是我的直方图打印错误的地方。 所以问题是我的数组没有记录属性并且直方图打印错误。 例如用户选择输入 3 天,值为 10,20,30,当我打印直方图时,它会打印这个。

0    
1  
*****************************2

下面是我想要的,一个 * 永远有十天的雨,首先打印索引。

0 *              
1 **  
2 **  

【问题讨论】:

  • 您正在while-loop 中创建this.rainRecorded = new int[this.days]; 的新实例,因此只会分配最后一个实例

标签: java arrays histogram


【解决方案1】:

您需要将this.rainRecorded 的初始化移动到createGauge 方法并根据需要更新displayHistogram 以打印。您可以尝试以下方法:

import java.util.Scanner;

public class RainRecording {

  private int choice;
  private Scanner input;
  private String site;
  private int days;
  private int daysCounter;
  private int[] rainRecorded;
  private int[] rainEntered;
  private float lattitude;
  private float longitude;
  private String message1;
  private String message2;
  private String message3;
  private String message4;
  private String message5;
  private String message6;

  // declare name of variable

  public RainRecording() {

    // declare value of variable
    
    this.message1 = "Site";
    this.message2 = "lattitude";
    this.message3 = "longitude";
    this.message4 = "Window";
    this.message5 = "days";
    this.message6 = ":";
    this.daysCounter = 0;
    this.input = new Scanner(System.in);
    mainMenu();
  }

  private void mainMenu() {
    System.out.println("");
    System.out.println("*** Rain Gauge Menu ***");
    System.out.println("  1: Create rain gauge");
    System.out.println("  2: Display rain gauge details");
    System.out.println("  3: Add daily rainfall measurement");
    System.out.println("  4: Display rainfall histogram");
    System.out.println("  5: Get maximum rainfall");
    System.out.println("  6: Check rainfall is below threshold");
    System.out.println("  7: Display anaylsis");
    System.out.println("  8: Exit");
    System.out.print("Please enter your selection: ");
    Chosen();
  }

  private void Chosen() {
    this.choice = Integer.parseInt(input.nextLine());
    switch (choice) {
      case 1:
        createGauge();
        break;
      case 2:
        gaugeDetails();
        break;
      case 3:
        int i = 0;
        while( i < this.days || this.daysCounter == this.days) {
          if (this.daysCounter == this.days) {
            System.out.printf("Error - system full\n");
            mainMenu();
          }
          if (this.days < 1) {

            mainMenu();

          } else {
            System.out.printf("Please enter rainfall for the current day:  ");
            rainRecorded[this.daysCounter] = Integer.parseInt(input.nextLine());
            this.daysCounter++;
            this.rainEntered = new int[this.daysCounter];
            mainMenu();
          }

          i++;
        }
        break;
      case 4:
        System.out.printf("\n");
        displayHistogram();
        break;
      case 5:
        break;
      case 6:
        break;
      case 7:
        break;
      case 8:
        break;
      default:
        System.out.println("Invalid input, try again");
        mainMenu();
    }
    while (choice != 8)
      ;
  }



  private void createGauge() {
    System.out.printf("\nPlease enter the name of the site :");
    this.site = input.nextLine();
    System.out.printf("Please enter the number of days to record :");
    this.days = Integer.parseInt(input.nextLine());
    this.rainRecorded = new int[this.days]; // move the array initialization here
    System.out.printf("Please enter the lattitute :");
    this.lattitude = Float.parseFloat(input.nextLine());
    System.out.printf("Please enter the longitude :");
    this.longitude = Float.parseFloat(input.nextLine());
    mainMenu();
  }

  private void gaugeDetails() {
    if (this.days > 0) {
      System.out.printf("%-9s %-3s %s \n", this.message1, this.message6, this.site);
      System.out.printf("%s %-3s % 09.4f\n", this.message2, this.message6, this.lattitude);
      System.out.printf("%s %-3s %9.4f\n", this.message3, this.message6, this.longitude);
      System.out.printf("%-9s %-3s %-2d%s \n", this.message4, this.message6, this.days, this.message5);
      mainMenu();
    } else {
      mainMenu();
    }
  }

  private void displayHistogram() {
    for (int i = 0; i < this.rainEntered.length; i++) {
      System.out.print(i + " ");
      for (int j = 0; j < this.rainRecorded[i] - 1; j += 10 ) {
        System.out.print("*");
      }
      System.out.println();
    }
    mainMenu();
  }

  public static void main(String[] args) {
    @SuppressWarnings("unused")
    RainRecording objName;
    objName = new RainRecording();
  }

}

【讨论】:

    【解决方案2】:

    所以,你的代码有点过头了,我在试图理解基本意图时遇到了一些问题,例如

    private int[] rainRecorded;
    private int[] rainEntered;
    

    我不确定这两个变量的意图是什么。所以在我的例子中,我暂时放弃了rainEntered

    所以,你的第一个问题从这里开始......

    while( i < this.days || this.daysCounter == this.days) {
    
        if (this.daysCounter == this.days) {
    
            System.out.printf("Error - system full\n");
            mainMenu();
    
        }
        if (this.days < 1) {
    
            mainMenu();
    
        } else {        
            
    
            this.rainRecorded = new int[this.days];
            System.out.printf("Please enter rainfall for the current day:  ");
            rainRecorded[this.daysCounter] = Integer.parseInt(input.nextLine());
            this.daysCounter++;
            this.rainEntered = new int[this.daysCounter];
            mainMenu();
        }
        
        i++;
    }
    

    首先,我将删除两个退出条件的需要,因为这会使推理变得更加困难

    接下来,数据有效性的检查应该在循环之外进行,我还要避免在循环中调用mainMenu,这会让你很快陷入一个陌生的境地。

    但是,我的主要问题是

    this.rainRecorded = new int[this.days];
    System.out.printf("Please enter rainfall for the current day:  ");
    rainRecorded[this.daysCounter] = Integer.parseInt(input.nextLine());
    this.daysCounter++;
    this.rainEntered = new int[this.daysCounter];
    

    您不断创建this.rainRecordedthis.rainEntered 的新实例,这意味着每次循环运行时,您都会丢失之前输入的任何内容。

    因此,在我的“简化”版本中,我将其修改为...

    if (this.days < 1) {
        System.out.println("Invalid number of days");
        return;
    }
    if (this.daysCounter == this.days) {
        System.out.printf("Error - system full\n");
        return;
    }
    
    while (this.daysCounter < this.days) {
        System.out.printf("Please enter rainfall for the day " + (daysCounter + 1) + ":  ");
        rainRecorded[this.daysCounter] = Integer.parseInt(input.nextLine());
        this.daysCounter++;
    }
    

    然后我也简化了直方图工作流程,但我仍在努力了解rainEntered 应该做什么......

    private void displayHistogram() {
        for (int amount : rainRecorded) {
            for (int count = 0; count < amount; count++) {
                System.out.print("*");
            }
            System.out.println(" " + amount);
        }
    }
    

    我还做的最后一件事是删除所有对 mainMenu 的调用,而是依靠一个简单的 do-while 循环在每次从 Chosen 方法返回时重新打印菜单

    private void mainMenu() {
        do {
            System.out.println("");
            System.out.println("*** Rain Gauge Menu ***");
            System.out.println("  1: Create rain gauge");
            System.out.println("  2: Display rain gauge details");
            System.out.println("  3: Add daily rainfall measurement");
            System.out.println("  4: Display rainfall histogram");
            System.out.println("  5: Get maximum rainfall");
            System.out.println("  6: Check rainfall is below threshold");
            System.out.println("  7: Display anaylsis");
            System.out.println("  8: Exit");
            System.out.print("Please enter your selection: ");
    
            Chosen();
        } while (shouldContinue);
    }
    

    这简化了工作流程,因为在程序执行的任何时候都更容易推断出你在哪里,而不是想知道为什么在某些情况下,当你从菜单中选择某些东西时,你最终会进入某个代替程序的其他部分。

    示例

    import java.util.Scanner;
    
    public class RainRecording {
    
        private int choice;
        private Scanner input;
        private String site;
        private int days;
        private int daysCounter;
        private int[] rainRecorded;
        //private int[] rainEntered;
        private float lattitude;
        private float longitude;
        private String message1;
        private String message2;
        private String message3;
        private String message4;
        private String message5;
        private String message6;
    
        private boolean shouldContinue = true;
    
        // declare name of variable
    
        public RainRecording() {
    
            // declare value of variable
    
            this.message1 = "Site";
            this.message2 = "lattitude";
            this.message3 = "longitude";
            this.message4 = "Window";
            this.message5 = "days";
            this.message6 = ":";
            this.daysCounter = 0;
            this.input = new Scanner(System.in);
            mainMenu();
    
        }
    
        private void mainMenu() {
            do {
                System.out.println("");
                System.out.println("*** Rain Gauge Menu ***");
                System.out.println("  1: Create rain gauge");
                System.out.println("  2: Display rain gauge details");
                System.out.println("  3: Add daily rainfall measurement");
                System.out.println("  4: Display rainfall histogram");
                System.out.println("  5: Get maximum rainfall");
                System.out.println("  6: Check rainfall is below threshold");
                System.out.println("  7: Display anaylsis");
                System.out.println("  8: Exit");
                System.out.print("Please enter your selection: ");
    
                Chosen();
            } while (shouldContinue);
        }
    
        private void Chosen() {
    
            this.choice = Integer.parseInt(input.nextLine());
            switch (choice) {
                case 1:
                    createGauge();
                    break;
    
                case 2:
                    gaugeDetails();
                    break;
                case 3:
    
        if (this.days < 1) {
            System.out.println("Invalid number of days");
            return;
        }
        if (this.daysCounter == this.days) {
            System.out.printf("Error - system full\n");
            return;
        }
    
        while (this.daysCounter < this.days) {
            System.out.printf("Please enter rainfall for the day " + (daysCounter + 1) + ":  ");
            rainRecorded[this.daysCounter] = Integer.parseInt(input.nextLine());
            this.daysCounter++;
        }
                    break;
                case 4:
                    System.out.printf("\n");
                    displayHistogram();
                    break;
                case 5:
                    break;
                case 6:
                    break;
                case 7:
                    break;
                case 8: shouldContinue = false;
                    break;
    
                default:
                    System.out.println("Invalid input, try again");
            }
    
        }
    
    
    
        private void createGauge() {
            System.out.printf("\nPlease enter the name of the site :");
            this.site = input.nextLine();
            System.out.printf("Please enter the number of days to record :");
            this.days = Integer.parseInt(input.nextLine());
            System.out.printf("Please enter the lattitute :");
            this.lattitude = Float.parseFloat(input.nextLine());
            System.out.printf("Please enter the longitude :");
            this.longitude = Float.parseFloat(input.nextLine());
    
            if (days > 0) {
                this.rainRecorded = new int[this.days];
            }
        }
    
        private void gaugeDetails() {
    
            if (this.days > 0) {
    
                System.out.printf("%-9s %-3s %s \n", this.message1, this.message6, this.site);
                System.out.printf("%s %-3s % 09.4f\n", this.message2, this.message6, this.lattitude);
                System.out.printf("%s %-3s %9.4f\n", this.message3, this.message6, this.longitude);
                System.out.printf("%-9s %-3s %-2d%s \n", this.message4, this.message6, this.days, this.message5);
    
            }
    
        }
    
        private void displayHistogram() {
            for (int amount : rainRecorded) {
                for (int count = 0; count < amount; count++) {
                    System.out.print("*");
                }
                System.out.println(" " + amount);
            }
        }
    
        public static void main(String[] args) {
            @SuppressWarnings("unused")
            RainRecording objName;
            objName = new RainRecording();
        }
    }
    

    现在,如果rainEntered 是某种复合数组,它允许您记录不同时期的多天降雨,您可以考虑使用多维数组,这样您就可以n期间和每个期间可能有n 下雨天......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 1970-01-01
      • 2019-02-26
      相关资源
      最近更新 更多