iT邦幫忙

0

新手求助,我的min為何一直是0,是被break阻礙的嗎?

  • 分享至 

  • xImage
public class max{
    public static void main(String [] args){
        double sum = 0;
        Scanner input = new Scanner(System.in);
        double x[] = new double[10];
        double mean = 0;
        double min =x[0];
        double max =x[0];
        
        
        System.out.println("Enter no more than 10 numbers");

        for(int i = 1; i < x.length; i++)
        {   
            
            x[i] = input.nextDouble();
            if(x[i] <=0) 
            break;
        
            if (x[i]< min)
            min = x[i];
            if(x[i] > max ) 
            max = x[i];
            sum = sum + x[i];  
            mean = sum / i; 
        }
        
        
            System.out.println("Sum =" + Math.round(sum * 100.0) / 100.0);
            System.out.println("mean =" +Math.round(mean * 100.0) / 100.0);
            System.out.print("min =" + min);
            System.out.print("max =" + max);
 
 
}
}
tryit iT邦研究生 4 級 ‧ 2022-10-17 17:55:56 檢舉
我幫你修改了程式碼,你參考一下,我猜你mean是要算平均值,所以寫在外面。
tryit iT邦研究生 4 級 ‧ 2022-10-17 21:21:43 檢舉
如果是要讓使用者輸入,依然可以用我那寫法,你只要加在輸入的後面,讀取值的前面即可。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
0
tryit
iT邦研究生 4 級 ‧ 2022-10-17 02:10:30

請仔細看你的程式碼

double x[] = new double[10];
double min =x[0];//這時候存的是0.0

你一開始這樣寫

for(int i = 1; i < x.length; i++)

你在跑for迴圈的時候從x[1]開始存

if(x[i] <=0) 
break;

當你後面輸入值的時候,輸入小於等於0的數字就必須停下來。
所以無論如何最小值一定是0阿.....


我稍微幫你更改程式碼然後做上解釋,你參考看看

import java.util.Scanner;
public class max{
    public static void main(String [] args){
        double sum = 0;
        Scanner input = new Scanner(System.in);
        double x[] = new double[10];
        double mean;//計算平均
        Double min = Double.NaN;//存最小值,一開始沒值存,存Nan
        Double max = Double.NaN;//存最大值
        
        
        System.out.println("Enter no more than 10 numbers");
        //平均值不應該在迴圈裡面計算
        //你應該在迴圈裡面計算玩總和後再算平均
        for(int i = 0; i < x.length; i++)//從0開始儲存
        {   
            
            x[i] = input.nextDouble();
            // if(x[i] <=0) 
            // break;
            // 不需要,沒有要在迴圈裡面算平均,不必在乎0不0的問題
        
            if (i==0){//為空時自動儲存,只會發生在第一次輸入
                min = x[i];
                max = x[i];
            }else if(x[i]<min){//如果新輸入的東西小於min
                min = x[i];
            }else if(x[i]>max){//如果新輸入的東西大於max
                max = x[i];
            }
            // if(x[i] > max ) 
            // max = x[i];
            //用不到
            sum = sum + x[i];  
            // mean = sum / i; 
            // 用不到
        }
            mean = sum/x.length;
        
            System.out.println("Sum =" + Math.round(sum * 100.0) / 100.0);
            System.out.println("mean =" +Math.round(mean * 100.0) / 100.0);
            System.out.println("min =" + min);//你這邊怎麼沒換下一排
            System.out.print("max =" + max);
 
 
}
}
ppleee520 iT邦新手 5 級 ‧ 2022-10-17 16:01:39 檢舉

對,可是我int i不=1,我的mean就會變成除以n-1 造成另一個問題/images/emoticon/emoticon02.gif

ppleee520 iT邦新手 5 級 ‧ 2022-10-17 19:20:43 檢舉

我看到了謝謝.
不過我想做的是user輸入了一些數值(不能是負數/0,不然就馬上暫停并計算,所以這邊我一定要用break;)

0

簡單來說,你的猜想是對的。
被break阻礙。

只是我不會用這樣的說詞就是了。

因為這你得思考為何需要這樣做的原因。
而不是只會照COPY過來。

一般理論上來說,想取得最大值。

            if(x[i] <=0) 
            break;

這個運算式理論上是對這個函數沒用處才對,且又會甘擾計算運行。
那為何會有此一判斷?

基本上來說,這有可能是有所謂的0值不判斷的因素存在。
可能是將0值當關閉或是無限值。還是預設值。

如果你是COPY的,你得先去了解其用處。如果你自已根本沒我上面說的意思。
那就將這一段拿掉就好了。

ppleee520 iT邦新手 5 級 ‧ 2022-10-17 16:03:04 檢舉

我在這加了break是因為我不想讓 user input 0/負數,所以加上了brek.

1
海綿寶寶
iT邦大神 1 級 ‧ 2022-10-17 08:53:17

看看下圖的執行結果是否比較能理解原因
(輸入值 2,4,6,8,1,3,5,7,9)
https://ithelp.ithome.com.tw/upload/images/20221017/20001787xCy466d0z8.png

import java.util.*;
import java.lang.*;
import java.io.*;

// The main method must be in a class named "Main".
class Main {
public static void main(String [] args){
        double sum = 0;
        Scanner input = new Scanner(System.in);
        double x[] = new double[10];
        double mean = 0;
        double min =x[0];
        double max =x[0];
        
        System.out.println("Enter no more than 10 numbers");

        System.out.println("Begin:"+" min =" + min+" max =" + max+" Sum="+Math.round(sum * 100.0) / 100.0+" mean =" +Math.round(mean * 100.0) / 100.0);

        for(int i = 1; i < x.length; i++)
        {   
            
            x[i] = input.nextDouble();
            if(x[i] <=0) 
            break;
        
            if (x[i]< min)
            min = x[i];
            if(x[i] > max ) 
            max = x[i];
            sum = sum + x[i];  
            mean = sum / i; 
            System.out.println("i="+i+" x[i]="+x[i]+" min =" + min+" max =" + max+" Sum="+Math.round(sum * 100.0) / 100.0+" mean =" +Math.round(mean * 100.0) / 100.0);
        }
            System.out.println("Sum =" + Math.round(sum * 100.0) / 100.0);
            System.out.println("mean =" +Math.round(mean * 100.0) / 100.0);
            System.out.print("min =" + min);
            System.out.print("max =" + max);
 
 
}
}
看更多先前的回應...收起先前的回應...
ppleee520 iT邦新手 5 級 ‧ 2022-10-17 16:07:19 檢舉

為何 min一開始就是0,到最後也是0?

我新手,感謝賜教

因為
一開始double min =x[0];之後 min=0
之後

if (x[i]< min)
min = x[i];

這兩列寫的是「當輸入的數字比 min 小,把 min 設為該數字」
輸入的9個數字是 2,4,6,8,1,3,5,7,9
沒有任何一個數字比 min (0) 小
所以一直到最後 min 也是0

可以把一開始那列改成double min = 99999;
再看看 min 的結果

ppleee520 iT邦新手 5 級 ‧ 2022-10-17 19:15:42 檢舉

那如果我一開始的double min =x[0]; 是想宣告 min = x[]第一個輸入的數值,那應該如果宣告?

一般不會寫在宣告的地方
而是類似以下的寫法

    if (i==1) {
        min = x[i];
    } else {
        if (x[i]< min)
            min = x[i];
    }

我要發表回答

立即登入回答