Presentation is loading. Please wait.

Presentation is loading. Please wait.

本周不辦理實作輔導 happy mother day!

Similar presentations


Presentation on theme: "本周不辦理實作輔導 happy mother day!"— Presentation transcript:

1 本周不辦理實作輔導 happy mother day!

2 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);

3 Q2: 追蹤程式: 印出結果? 搶答 for(p=100;p>50;p--) i++; for(;q<p;q++) s++;
int p=0, i=1, q=9, s=0; for(p=100;p>50;p--) i++; for(;q<p;q++) s++; s=p+q; System.out.println(“s=“+s);

4 再談字元金字塔: nested loop 應用

5 主題:字元金字塔 – 正金字塔 問題分析: 7個空白,印1個* 6個空白,印3個* 5個空白,印5個* 4個空白,印7個*
3個空白,印9個* 2個空白,印11個* 1個空白,印13個* +2 執行結果 +2 7個空白 +2 6個空白 +2 +2 +2

6 主題:字元金字塔 – 正金字塔 利用迴圈印出 「 * 」,逐行增 加印出個數,直到印出7層金 字塔。
本題承接上次巢狀(nested)迴圈 的概念外,尚還利用到2個迴 圈概念 由於金字塔每行更為增加2顆 「 * 」,還有每行開頭空白數減 少1的問題。因此在迴圈外都 要考慮兩個更改的問題。 執行結果

7 主題:字元金字塔 – 正金字塔 執行結果 7個空白 6個空白

8 字元金字塔 – 正金字塔II :減少變數使用 (找出空白、*個數與i層關係)
public class Charstar4_1b { public static void main(String[] args) { int level =7; for (int i = 0; i < level; i++) { for (int j = 0; j <= 7-i-1; j++) System.out.print(" "); for (int k = 0; k <= 2*i; k++) System.out.print("*"); System.out.println(""); }

9 主題:字元金字塔 – 正金字塔 II(找出空白、*個數與i層關係)
i=? j=0~7-i-1 k=0~2*i 問題分析: 7個空白,印1個* : i=0 j=0~ k=0~2*0 6個空白,印3個* : i=1 j=0~ k=0~2*1 5個空白,印5個* : i=2 j=0~ k=0~2*2 4個空白,印7個* : i=3 j=0~ k=0~2*3 3個空白,印9個* : i=4 j=0~ k=0~2*4 2個空白,印11個* : i=5 j=0~ k=0~2*5 1個空白,印13個* : i=6 j=0~ k=0~2*6 +2 執行結果 +2 7個空白 +2 6個空白 +2 +2 +2

10 主題:字元金字塔 III– 使用者自訂”字元”及”層數”金字塔
執行結果

11 第12周習題: * # ** ## *** ### **** 主題:輸入n層(n須為奇數)及”字元” , 印出n層三角形 (如下)
使用者自訂”字元”及”層數” 須能重複執行,直至輸入0層 繳交”設計歷程”檔及.java 輸入n層: 7 輸入字元: * 輸入n層: 5 輸入字元: # * ** *** **** # ## ###

12 第12周習題: * # ** ## *** ### **** 主題:輸入n層(n須為奇數)及”字元” , 印出n層三角形 (如下)
使用者自訂”字元”及”層數” 須能重複執行,直至輸入0層 繳交”設計歷程”檔及.java 輸入n層: 7 輸入字元: * 輸入n層: 5 輸入字元: # * ** *** **** # ## ###

13 臺北市立大學 資訊科學系(含碩士班) 賴阿福
陣列(array)基本概念 臺北市立大學 資訊科學系(含碩士班) 賴阿福

14 利用大量變數,處理大量資料? 有何缺點及問題??

15 例子:輸入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); //最後變異數結果敘述

16 體驗處理10筆資料 如果輸入100筆整數資 料? code長度? 彈性?效率? 如何改善? if (max<x2) max=x2;
else max=max; if (max<x2) max=x2; else max=max; max= (max<x2) ? x2:max;

17 輸入10筆整數資料(改用迴圈,求出平均數及最大值(未用陣列)
import java.util.Scanner; public class without_array { public static void main(String[] args) { Scanner input = new Scanner(System.in); int sc = 0, n=1, total=0, max=0; float mean; while (n<=10) { System.out.print("輸入第"+n+"筆分數:"); sc=input.nextInt(); total=total+sc; max=(max<sc)?sc:max; n++; } mean=total/10; System.out.println("最大值: "+max); System.out.println("平均數: "+mean); }//main }//class 輸入10筆整數資料,求出平均數及最大值! 若要再求變異數,如何做?(impossible) 之後再求min ,如何做?(impossible) 後續印出10筆整數資料,如何做?(String)

18 用字串存放輸入資料:字串連結 import java.util.Scanner; public class without_array2 {
public static void main(String[] args) { Scanner input = new Scanner(System.in); int sc = 0, n=1, total=0, max=0; float mean; String data=""; while (n<=10) { System.out.print("輸入第"+n+"筆分數:"); sc=input.nextInt(); data=data+"第"+n+"筆分數:"+sc+"\n"; total=total+sc; max=(max<sc)?sc:max; n++; } mean=total/10; System.out.println("\n最大值: "+max); System.out.println("平均數: "+mean); System.out.println(data); }//main }//class

19 利用多個變數,處理資料(未使用陣列) 任何時候,若再多一筆資 料,需再增加程式碼,求 max、mean敘述都須修改 程式。
皆是序列(Sequence),無 法使用迴圈,缺乏自動化 機制。 屬於暴力法。 x1 x2 x3 . X9 x10 mean max

20 陣列(array):物以類聚 相同型態(ex. int, double…)的元素所形成有序的有限集合 陣列的元素被存放在連續的記憶體

21 陣列 以一名稱代表一序列資料的集合,陣列命名與變數命 名相同 以索引(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

22 陣列的特性 定義:相同型態(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

23 陣列存取 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

24 陣列存取 SC[6] 30 取出、運算、再存入 SC[6]=SC[6]+20; 結果 SC[6] 50

25 陣列應用:處理10筆資料

26 應用陣列存放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 未提供輸入資料

27 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

28 宣告陣列 輸入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筆資料 加總 找最大值 算出不及格人數

29 運用陣列存放BMI狀態 運用陣列存放weekname

30 運用陣列存放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

31 運用陣列存放 weekname,看步 道好處?
Sunday Monday Tuesday weekname[0] weekname[1] weekname[2] weekname[6]

32 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

33 平行陣列(Parallel Arrays)

34 陣列應用:求等第

35 陣列應用:求等第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

36 陣列應用:求等第(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 分支結構幾乎可忽略

37 陣列應用:求等第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

38 陣列應用:求等第(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  Math. floor(89 / 10) = 2 Score = 9  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

39

40 第周習題 (任選一題,亦可全做):將陣列加入第四周程式
習題A:輸入個人淨所得,求其應繳稅額 (陣列存放”稅率”) 說明: (1)先上網搜尋個人淨所得之稅率資訊(須呈現於設計歷程檔 中); (2)請繳交.java及設計歷程檔(.DOCX)。 習題B:輸入個人生日,求其星座及個性(陣列存放”星座資訊”) 說明: (1)先上網搜尋12星座資訊(須呈現於設計歷程檔中); (2)例如: 假設處女座日期:8月23日~9月22日 輸入生日月份:9 輸入生日日期:1 結果:你的生日是9月1日,屬於處女座,個性:為人仔細,作 事認真,對於是非善惡,判斷分明。 習題C:將BMI診斷分成六層次(陣列存放”六診斷層次”)

41 例子:輸入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;

42 Review switch case

43 改為5等第

44 改變運算式 (score-50)/10

45 質數: 不用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時

46 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= 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(" "+n+"="+s); }//while }//main }//class 處理輸入錯誤


Download ppt "本周不辦理實作輔導 happy mother day!"

Similar presentations


Ads by Google