Q1: 追蹤程式: 印出結果? 搶答 while (i<=n) { p=p*i; i=i+2; } int p=0, i=1, n=9; while (i<=n) { p=p*i; i=i+2; } System.out.println(“p=“+p+”n=“+n);
臺北市立大學 資訊科學系(含碩士班) 賴阿福 陣列(array)基本概念 臺北市立大學 資訊科學系(含碩士班) 賴阿福
利用大量變數,處理大量資料? 有何缺點及問題??
例子:輸入100筆整數資料,要求出平均數,如何做?若找最大值、要求變異數,如何做? 討論: (1)需100行讀取資料之敘述 (2)須很長的累加運算敘述,需很長運算 式解平均數,需100行找最大值、處理變 異數之敘述。 (3)極為暴力方式(brute force) (4)沒有彈性,例如要處理1000筆?Big Data? 問題剖析:資料記錄存放問題! 不可以只用大量變數而已。 input.nextInt(x1); input.nextInt(x2); … input.nextInt(x100); avg=(x1+x2+…+x100)/100; Var= (x1-avg)* (x1-avg); Var=(x2-avg) (x2-avg); Var=(x100-avg) (x100-avg); //最後變異數結果敘述
利用多個變數,處理資料(未使用陣列) 任何時候,若再多一筆資 料,需再增加程式碼,求 max、mean敘述都須修改 程式。 皆是序列(Sequence),無 法使用迴圈,缺乏自動化 機制。 屬於暴力法。 x1 x2 x3 . X9 x10 mean max
陣列(array):物以類聚 相同型態(ex. int, double…)的元素所形成有序的有限集合 陣列的元素被存放在連續的記憶體
陣列 以一名稱代表一序列資料的集合,陣列命名與變數命 名相同 以索引(index)/註標(subscript) 來控制某一元素存取 宣告 索引可用變數,因此可用迴圈控制變數,再控制陣列存取 索引由0開始。 宣告 Int [] x=new int[100]; //索引:0~99,長度: 100 陣列長度(陣列的屬性);x.length 可在宣告時給予初值(不用指定長度) int [] sc={20,30,40}; String [] diagres={"體重過輕Underweight","正常Normal","過重Overweight"}; x[0] x[1] x[2] . x[8] x[9] mean max
陣列的特性 定義:相同型態(ex. int, double…)的元素所形成有序的有 限集合 以索引值(index) 與 值(value) 來表示其對應關係。 通常陣列的元素被存放在連續的記憶體上,可以支援直 接存取。 陣列元素存取時,將元素的索引/註標(Index/Subscript) 以位址函數(Address Function)計算出(對應)記憶體位址, 再存取記憶體中的內容(元素的值)。 以索引存取陣列元素之值(value) i=8; x[i]=100; 存: x[8]=100; //將100存入x[8] 取: System.out.print (x[8]); //取x[8] y=x[8]+x[9]; //取x[8]、x[9] x[7]=x[8]+x[9]; x[0] x[1] x[2] . x[8] x[9] mean max
陣列存取 SC[0] SC[1] SC[6] SC[7] SC[8] SC[9] 8 30 12 取出 存入 SC[1]=30; x 12 x=SC[8]; 結果 SC[1] 30 12
陣列存取 SC[6] … 30 取出、運算、再存入 SC[6]=SC[6]+20; 結果 SC[6] … 50
陣列應用:處理10筆資料
應用陣列存放10筆資料,then處理 未提供輸入資料 public class Tendata_array0{ public static void main(String[] args){ int [] x={70,90,55,66,12,27,34,47,80,100}; int mean=0,max=0,i=0, sum=0, flunk=0; for(i=0;i<x.length;i++) { System.out.println("x["+i+"] :"+x[i]); sum=sum+x[i]; max=(max<x[i])?x[i]:max; if (x[i]<60) flunk++;//不及格人數 } mean=sum/10;//平均數 System.out.println("陣列長度: "+x.length); System.out.println("mean = "+mean); System.out.println("max = "+max); System.out.println("不及格人數: "+flunk); }//main }//class x[0] x[1] x[2] . x[8] x[9] mean max 70 90 55 80 100 未提供輸入資料
import java.util.Scanner; public class Tendata_array1{ public static void main(String[] args){ Scanner input = new Scanner(System.in); int [] x=new int[10]; int mean=0,max=0,i=0, sum=0, flunk=0; while (i<=9) { System.out.print("input data for x["+i+"] :"); x[i]=input.nextInt(); i++;} System.out.print("\n"); for(i=0;i<x.length;i++) { System.out.println("x["+i+"] :"+x[i]); sum=sum+x[i]; max=(max<x[i])?x[i]:max; if (x[i]<60) flunk++; } mean=sum/10; System.out.println("mean = "+mean); System.out.println("max = "+max); System.out.println("不及格人數: "+flunk); }//main }//class
宣告陣列 輸入10筆資料: i=0:第1筆放入x[0] i=1:第2筆放入x[1] i=9:第10筆放入x[9] 分析10筆資料: import java.util.Scanner; public class Tendata_array1{ public static void main(String[] args){ Scanner input = new Scanner(System.in); int [] x=new int[10]; int mean=0,max=0,i=0, sum=0, flunk=0; while (i<=9) { System.out.print("input data for x["+i+"] :"); x[i]=input.nextInt(); i++;} System.out.print("\n"); for(i=0;i<x.length;i++) { System.out.println("x["+i+"] :"+x[i]); sum=sum+x[i]; max=(max<x[i])?x[i]:max; if (x[i]<60) flunk++; } mean=sum/10; System.out.println("mean = "+mean); System.out.println("max = "+max); System.out.println("不及格人數: "+flunk); }//main }//class 宣告陣列 輸入10筆資料: i=0:第1筆放入x[0] i=1:第2筆放入x[1] i=9:第10筆放入x[9] 分析10筆資料: 印出10筆資料 加總 找最大值 算出不及格人數
運用陣列存放BMI狀態 運用陣列存放weekname
運用陣列存放BMI狀態 diagres [0] diagres [1] diagres [2] 體重過輕Underweight import java.util.Scanner; public class BMI_array { public static void main(String[] args) { String ok="Y"; System.out.println("==========歡迎量測體位=========="); Scanner input = new Scanner(System.in); double height, weight; String [] diagres={"體重過輕Underweight","正常Normal","過重Overweight"}; int status; while (ok.toUpperCase().equals("Y")) { System.out.print("輸入身高:"); height = input.nextDouble(); System.out.print("輸入體重:"); weight = input.nextDouble(); double bmi = Math.round((weight/(height*height) )*100)/100.0; if (bmi < 18.5) status = 0; else if (bmi < 24) status = 1; //(bmi>=18.5 && bmi < 24) else status = 2; System.out.println("BMI:"+bmi+",狀態: "+diagres[status]); System.out.print("(繼續(Y/N):"); ok= input.next().toUpperCase(); }//while System.out.println("==========bye bye=========="); }//main }//class 運用陣列存放BMI狀態 String [] diagres={"體重過輕Underweight","正常Normal","過重Overweight"}; int status; if (bmi < 18.5) status = 0; else if (bmi < 24) status = 1; //(bmi>=18.5 && bmi < 24) else status = 2; System.out.println("BMI:"+bmi+",狀態: "+diagres[status]); 體重過輕Underweight 正常Normal 過重Overweight diagres [0] diagres [1] diagres [2] RAM
運用陣列存放 weekname,看步 道好處? Sunday Monday Tuesday weekname[0] weekname[1] weekname[2] weekname[6]
import java.util.Scanner; public class weekname_3 { public static void main(String[] args) { Scanner input = new Scanner(System.in); String [] weekname= {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"}; int week = 0; while (week>=0) { System.out.print("輸入星期幾?"); week = input.nextInt(); if (week >= 0 && week <=7) { System.out.println(weekname[week]); } //if else System.out.println("無法判讀\n"); }//while }//main }//class
平行陣列(Parallel Arrays)
陣列應用:求等第
陣列應用:求等第i import java.util.Scanner; public class scorerank_array { public static void main(String[] args) { Scanner input = new Scanner(System.in); int score = 0; String [] rank= {"壬","辛","庚","己","戊","丁","丙","乙","甲","優","優"}; while (score>=0) { System.out.print("輸入分數(整數, -1:end):"); score = input.nextInt(); //100~90優 89~80甲 79~70乙 69~60丙 59~50丁 49~40戊 39~30己 29~20庚 19~10辛 9~0壬 if (score >= 0) System.out.println("等第:"+rank[score/10]); else System.out.println("無法判讀, bye!\n"); }//while }//main }//class
陣列應用:求等第(1) Score = 0 0/10 == 0 Score = 9 9 / 10 = 0 Rank[0] 1 2 3 4 5 6 7 8 9 10 壬 辛 庚 己 戊 丁 丙 乙 甲 優 Score = 0 0/10 == 0 Score = 9 9 / 10 = 0 Score = 15 15 / 10 = 1 Score = 89 89 / 10 = 8 Score = 95 95 / 10 = 9 Score = 100 100 / 10 = 10 …… *透過Score/10取得對應等第陣列索引,及Score/10計算結果為整數,作為索引(index) *以空間換取時間,if 之selection 分支結構幾乎可忽略
陣列應用:求等第ii import java.util.Scanner; public class scorerank_array_2 { public static void main(String[] args) { Scanner input = new Scanner(System.in); int score = 0; String [] rank= {"優","優","甲","乙","丙","丁","戊","己","庚","辛","壬"}; while (score>=0) { System.out.print("輸入分數(整數, -1:end):"); score = input.nextInt(); //100~90優 89~80甲 79~70乙 69~60丙 59~50丁 49~40戊 39~30己 29~20庚 19~10辛 9~0壬 if (score<=100 && score >= 0) System.out.println("等第:"+rank[10-(int)Math.floor(score/10)]); else if (score>100) System.out.println("無法判讀!\n"); else System.out.println("bye!\n"); }//while }//main }//class
陣列應用:求等第(2) Score = 100 10 - (100/10) == 0 1 2 3 4 5 6 7 8 9 10 優 甲 乙 丙 丁 戊 己 庚 辛 壬 Score = 100 10 - (100/10) == 0 Score = 95 10 – (int)Math.floor(95 / 10) = 1 Score = 89 10 - Math. floor(89 / 10) = 2 Score = 9 10 - Math. floor(9 / 10) = 10 Score = 0 10 - Math. floor(0/10) = 10 …… *不同運算式,產生不同索引值,因此等第在陣列排列不同 *(int)Math.floor(95 / 10) Math.floor(95 / 10) : double type (int): type casting, convert double to int
第周習題 (任選一題,亦可全做):將陣列加入第四周程式 習題A:輸入個人淨所得,求其應繳稅額 (陣列存放”稅率”) 說明: (1)先上網搜尋個人淨所得之稅率資訊(須呈現於設計歷程檔 中); (2)請繳交.java及設計歷程檔(.DOCX)。 習題B:輸入個人生日,求其星座及個性(陣列存放”星座資訊”) 說明: (1)先上網搜尋12星座資訊(須呈現於設計歷程檔中); (2)例如: 假設處女座日期:8月23日~9月22日 輸入生日月份:9 輸入生日日期:1 結果:你的生日是9月1日,屬於處女座,個性:為人仔細,作 事認真,對於是非善惡,判斷分明。 習題C:將BMI診斷分成六層次(陣列存放”六診斷層次”)
例子:輸入100筆整數資料,要求出平均數,如何做?若要求變異數,如何做? (c) scanf(“%d\n”, &x1); scanf(“%d”, &x2); … scanf(“%d”, &x100); avg=(x1+x2+…+x100)/100; Var+=(x1-avg)^2; Var+=(x2-avg)^2; Var+=(x100-avg)^2; //最後變異數結果敘 述 int x[100], i, avg=0; for(i=0;i<100;i++) scanf(“%d”, x[i]); avg=avg+x[i]; avg=avg/100;
Review switch case
改為5等第
改變運算式 (score-50)/10
質數: 不用boolean時 int prime; import java.util.Scanner; public class prime_0 { static Scanner input = new Scanner(System.in); public static void main(String[] args) { System.out.println("====輸入>=2整數,判斷是否為質數?====="); int n=3, i; String dif; //boolean prime; int prime; System.out.print("輸入>=2整數:"); n = input.nextInt(); i=2; //prime=true; prime=0; while (i<=n-1) { if (n%i==0) {prime=1; //prime=false; System.out.println(n+"可被"+i+"整除。"); break;} else System.out.println(n+"不可被"+i+"整除。"); ++i; } if (prime==0) dif="是質數!"; else dif="不是質數!"; System.out.println(n+dif); }//main }//class 質數: 不用boolean時
Debug :輸入奇數n,求S=1+3+5+.........+n 處理輸入錯誤 import java.util.Scanner; public class loop_debug_1 { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n=7,i=0, s=0; System.out.println("輸入奇數n,求S=1+3+5+.........+n\n"); while (n>=1) { System.out.print("輸入奇數(-1:end):"); n = input.nextInt(); if (n%2==0) { System.out.println("輸入錯誤,須為奇數!"); continue;} for(i=1;i<=n;++i) s=s+i; System.out.println("1+3+5+...+"+n+"="+s); }//while }//main }//class 處理輸入錯誤