weixin_51573847 2022-10-03 15:09 采纳率: 77.3%
浏览 47
已结题

java如何修改,从而不需要补全

问题遇到的现象和发生背景
import java.util.Scanner;

public class Histogram{ 
    
    private static final int SENTINAL = -999;          // sentinal value to signal endo of input
    private static final int MAX_NUMBERS = 20;         // maximum number of numbers to input
    private static final double UPPER_BOUND = 100.0;   // largest numbers accepted as data
    private static final double LOWER_BOUND = 0.0;     // smallest numbers accepted as adata
    private static final int NUM_BINS = 10;            // number of bins in range [0..100]

    private static final int BIN_SIZE = 100/NUM_BINS;           // size of each bin
   
    /*
     * Method to show an example of using StringBuilder.
     *
     * You will also notice that this method is called from the 
     * main function. 
     *
     */
    public static String getHeaderAsString( String me ) {

    // Create an instance of the StringBuilder class
    // which allows us to create an object of 
    // a series of strings that can then be converted 
    // into one large string via the toString method.
    //
        StringBuilder sb=new StringBuilder();

        sb.append( System.getProperty("line.separator") );
        sb.append( "Welcome to the Histogram Program " + me + "!" );
        me = getFirstName(me);
        sb.append( System.getProperty("line.separator") );
        sb.append( System.getProperty("line.separator") );
        sb.append( "This program will print out a histogram of the numbers" );
        sb.append( System.getProperty("line.separator") );
        sb.append( "input by you " + getFirstName(me) + "." );
        sb.append( System.getProperty("line.separator") );
        sb.append( System.getProperty("line.separator") );
        sb.append( "Please enter up to " + MAX_NUMBERS + " doubles or " + SENTINAL + " to stop input!" );
        sb.append( System.getProperty("line.separator") );

        return sb.toString();
    }

    /* 
     * Method to return the first name of the user in case
     * the full name was entered. 
     */
    public static String getFirstName(String name ) {
        // Note that add the " " to string to be sure
        // there is something to split
    return (name+" ").split(" ")[0]; 
    }

    /* 
     * local main test driver
     *
     */
    public static void main(String[] args) {  

    // Connect to the keyboard as the input stream
        Scanner userInput = new Scanner( System.in );

        System.out.print( "And who am I working with today? " );
        String user = userInput.nextLine();

        String heading = getHeaderAsString( user );

        // Print out welcome message
        System.out.println( heading ); 
        
        // Call the method which prompts the user
        // to input the numbers that will be used
        // to build the histogram.
        double[] numbers = inputNumbers( userInput );

    // Call the method to reate the array histogram
        int[] histogram = calculateHistogram( numbers );

    // Print the historgram
        System.out.println( toString( histogram ) );
    }
    public static int[] calculateHistogram(double []numbers){
        int histogram[] = new int[NUM_BINS];

//looping through numbers array

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

//incrementing the appropriate bins counter based on value

        if (numbers[i]<=LOWER_BOUND+BIN_SIZE&& LOWER_BOUND+BIN_SIZE<UPPER_BOUND) {
            histogram[NUM_BINS-NUM_BINS]+=1;

        }else if (numbers[i]<=LOWER_BOUND+(2*BIN_SIZE)&& LOWER_BOUND+(2*BIN_SIZE)<=UPPER_BOUND){
            histogram[NUM_BINS-(NUM_BINS-1)]+=1;

        }else if (numbers[i]<=LOWER_BOUND+(3*BIN_SIZE)&& LOWER_BOUND+(3*BIN_SIZE)<=UPPER_BOUND) {
            histogram[NUM_BINS-(NUM_BINS-2)]+=1;
    
        }else if (numbers[i]<=LOWER_BOUND+(4*BIN_SIZE)&& LOWER_BOUND+(4*BIN_SIZE)<=UPPER_BOUND){
            histogram[NUM_BINS-(NUM_BINS-3)]+=1;

        }else if (numbers[i]<=LOWER_BOUND+(5*BIN_SIZE)&& LOWER_BOUND+(5*BIN_SIZE)<=UPPER_BOUND) {
            histogram[NUM_BINS-(NUM_BINS-4)]+=1;

        } else if (numbers[i]<=LOWER_BOUND+(6*BIN_SIZE)&& LOWER_BOUND+(6*BIN_SIZE)<=UPPER_BOUND) {

            histogram[NUM_BINS-(NUM_BINS-5)]+=1;

        } else if (numbers[i]<=LOWER_BOUND+(7*BIN_SIZE)&& LOWER_BOUND+(7*BIN_SIZE)<=UPPER_BOUND) {

            histogram[NUM_BINS-(NUM_BINS-6)]+=1;

        } else if (numbers[i]<=LOWER_BOUND+(8*BIN_SIZE)&& LOWER_BOUND+(8*BIN_SIZE)<=UPPER_BOUND) {

            histogram[NUM_BINS-(NUM_BINS-7)]+=1;

        } else if (numbers[i]<=LOWER_BOUND+(9*BIN_SIZE)&& LOWER_BOUND+(9*BIN_SIZE)<=UPPER_BOUND) {

            histogram[NUM_BINS-(NUM_BINS-8)]+=1;

        } else if (numbers[i]<=LOWER_BOUND+(10*BIN_SIZE)&& LOWER_BOUND+(10*BIN_SIZE)<=UPPER_BOUND) {

            histogram[NUM_BINS-(NUM_BINS-9)]+=1;

        }

    }

    return histogram;

}

    public static int findBin( double num ) {
        int result=(int) (num/10);
        return result;
    }

    public static String toString( int [] histogram ) {
        StringBuilder sb=new StringBuilder();

        int BIN_SIZE=(int) ((UPPER_BOUND-LOWER_BOUND)/NUM_BINS);
        
        int temp=(int) ((UPPER_BOUND-LOWER_BOUND)/NUM_BINS);
        
        int tem=(int) LOWER_BOUND;

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

            sb.append("["+tem+".."+BIN_SIZE+"]: "+"       ");
            
            for(int j=0;j<histogram[i];j++) {
            
            sb.append('*');
            
        }
            
        sb.append( System.getProperty("line.separator") );
            
        tem=BIN_SIZE;
            
        BIN_SIZE+=temp;
    }
        return sb.toString();
    }




    public static boolean validInput( double num ) {

        if(num<LOWER_BOUND|| num>UPPER_BOUND) {
        return false;
    }
        
        return true;
    }

    public static double[] inputNumbers( Scanner scan ) {
        double[] input=new double[MAX_NUMBERS]; 
        int i=0;
        while(i<MAX_NUMBERS) {
        double num=scan.nextDouble();
        if(num!=SENTINAL) {
            if(validInput(num)) {
            input[i]=num;
            i++;
                }
        }
        else { 
        break;
            }
        }
        return input;
    }
}

这一串代码在输出的数组不足20个的时候也会自动补全,如何修改从而只显示输入的数组个数的星号.

这个是我的代码运行的

img

这个是要实现的效果,不需要补全没有到达20的数组.

img

用代码块功能插入代码,请勿粘贴截图
  • 写回答

3条回答 默认 最新

  • 快乐鹦鹉 2022-10-03 15:21
    关注

    那你需要有个变量记录数组中实际有效的元素数量才行。不能按数组的大小来计算啊
    如下,增加一个有效数据数量的变量NUMS
    然后在图表统计函数中,将for循环修改如下:
    for (int i = 0; i < numbers.length; i++) {
    改为
    for (int i = 0; i < NUMS; i++) {

    import java.util.Scanner;
     
    public class Histogram{ 
        
        private static final int SENTINAL = -999;          // sentinal value to signal endo of input
        private static final int MAX_NUMBERS = 20;         // maximum number of numbers to input
        private static final double UPPER_BOUND = 100.0;   // largest numbers accepted as data
        private static final double LOWER_BOUND = 0.0;     // smallest numbers accepted as adata
        private static final int NUM_BINS = 10;            // number of bins in range [0..100]
        private static final int NUMS = 0;
        private static final int BIN_SIZE = 100/NUM_BINS;           // size of each bin
       
        /*
         * Method to show an example of using StringBuilder.
         *
         * You will also notice that this method is called from the 
         * main function. 
         *
         */
        public static String getHeaderAsString( String me ) {
     
        // Create an instance of the StringBuilder class
        // which allows us to create an object of 
        // a series of strings that can then be converted 
        // into one large string via the toString method.
        //
            StringBuilder sb=new StringBuilder();
     
            sb.append( System.getProperty("line.separator") );
            sb.append( "Welcome to the Histogram Program " + me + "!" );
            me = getFirstName(me);
            sb.append( System.getProperty("line.separator") );
            sb.append( System.getProperty("line.separator") );
            sb.append( "This program will print out a histogram of the numbers" );
            sb.append( System.getProperty("line.separator") );
            sb.append( "input by you " + getFirstName(me) + "." );
            sb.append( System.getProperty("line.separator") );
            sb.append( System.getProperty("line.separator") );
            sb.append( "Please enter up to " + MAX_NUMBERS + " doubles or " + SENTINAL + " to stop input!" );
            sb.append( System.getProperty("line.separator") );
     
            return sb.toString();
        }
     
        /* 
         * Method to return the first name of the user in case
         * the full name was entered. 
         */
        public static String getFirstName(String name ) {
            // Note that add the " " to string to be sure
            // there is something to split
        return (name+" ").split(" ")[0]; 
        }
     
        /* 
         * local main test driver
         *
         */
        public static void main(String[] args) {  
     
        // Connect to the keyboard as the input stream
            Scanner userInput = new Scanner( System.in );
     
            System.out.print( "And who am I working with today? " );
            String user = userInput.nextLine();
     
            String heading = getHeaderAsString( user );
     
            // Print out welcome message
            System.out.println( heading ); 
            
            // Call the method which prompts the user
            // to input the numbers that will be used
            // to build the histogram.
            double[] numbers = inputNumbers( userInput );
     
        // Call the method to reate the array histogram
            int[] histogram = calculateHistogram( numbers );
     
        // Print the historgram
            System.out.println( toString( histogram ) );
        }
        public static int[] calculateHistogram(double []numbers){
            int histogram[] = new int[NUM_BINS];
     
    //looping through numbers array
     
            for (int i = 0; i < NUMS; i++) {
     
    //incrementing the appropriate bins counter based on value
     
            if (numbers[i]<=LOWER_BOUND+BIN_SIZE&& LOWER_BOUND+BIN_SIZE<UPPER_BOUND) {
                histogram[NUM_BINS-NUM_BINS]+=1;
     
            }else if (numbers[i]<=LOWER_BOUND+(2*BIN_SIZE)&& LOWER_BOUND+(2*BIN_SIZE)<=UPPER_BOUND){
                histogram[NUM_BINS-(NUM_BINS-1)]+=1;
     
            }else if (numbers[i]<=LOWER_BOUND+(3*BIN_SIZE)&& LOWER_BOUND+(3*BIN_SIZE)<=UPPER_BOUND) {
                histogram[NUM_BINS-(NUM_BINS-2)]+=1;
        
            }else if (numbers[i]<=LOWER_BOUND+(4*BIN_SIZE)&& LOWER_BOUND+(4*BIN_SIZE)<=UPPER_BOUND){
                histogram[NUM_BINS-(NUM_BINS-3)]+=1;
     
            }else if (numbers[i]<=LOWER_BOUND+(5*BIN_SIZE)&& LOWER_BOUND+(5*BIN_SIZE)<=UPPER_BOUND) {
                histogram[NUM_BINS-(NUM_BINS-4)]+=1;
     
            } else if (numbers[i]<=LOWER_BOUND+(6*BIN_SIZE)&& LOWER_BOUND+(6*BIN_SIZE)<=UPPER_BOUND) {
     
                histogram[NUM_BINS-(NUM_BINS-5)]+=1;
     
            } else if (numbers[i]<=LOWER_BOUND+(7*BIN_SIZE)&& LOWER_BOUND+(7*BIN_SIZE)<=UPPER_BOUND) {
     
                histogram[NUM_BINS-(NUM_BINS-6)]+=1;
     
            } else if (numbers[i]<=LOWER_BOUND+(8*BIN_SIZE)&& LOWER_BOUND+(8*BIN_SIZE)<=UPPER_BOUND) {
     
                histogram[NUM_BINS-(NUM_BINS-7)]+=1;
     
            } else if (numbers[i]<=LOWER_BOUND+(9*BIN_SIZE)&& LOWER_BOUND+(9*BIN_SIZE)<=UPPER_BOUND) {
     
                histogram[NUM_BINS-(NUM_BINS-8)]+=1;
     
            } else if (numbers[i]<=LOWER_BOUND+(10*BIN_SIZE)&& LOWER_BOUND+(10*BIN_SIZE)<=UPPER_BOUND) {
     
                histogram[NUM_BINS-(NUM_BINS-9)]+=1;
     
            }
     
        }
     
        return histogram;
     
    }
     
        public static int findBin( double num ) {
            int result=(int) (num/10);
            return result;
        }
     
        public static String toString( int [] histogram ) {
            StringBuilder sb=new StringBuilder();
     
            int BIN_SIZE=(int) ((UPPER_BOUND-LOWER_BOUND)/NUM_BINS);
            
            int temp=(int) ((UPPER_BOUND-LOWER_BOUND)/NUM_BINS);
            
            int tem=(int) LOWER_BOUND;
     
            for(int i=0;i<histogram.length;i++) {
     
                sb.append("["+tem+".."+BIN_SIZE+"]: "+"       ");
                
                for(int j=0;j<histogram[i];j++) {
                
                sb.append('*');
                
            }
                
            sb.append( System.getProperty("line.separator") );
                
            tem=BIN_SIZE;
                
            BIN_SIZE+=temp;
        }
            return sb.toString();
        }
     
     
     
     
        public static boolean validInput( double num ) {
     
            if(num<LOWER_BOUND|| num>UPPER_BOUND) {
            return false;
        }
            
            return true;
        }
     
        public static double[] inputNumbers( Scanner scan ) {
            double[] input=new double[MAX_NUMBERS]; 
            while(NUMS<MAX_NUMBERS) {
            double num=scan.nextDouble();
            if(num!=SENTINAL) {
                if(validInput(num)) {
                input[i]=num;
                NUMS++;
                    }
            }
            else { 
            break;
                }
            }
            return input;
        }
    }
     
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月11日
  • 已采纳回答 10月3日
  • 创建了问题 10月3日

悬赏问题

  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示