精華區beta NTUE-CS102 關於我們 聯絡資訊
拖稿中(?) 因為那作業沒要交,所以想說慢慢來就拖到現在了(思) 先來複習一下上了什麼... 1.二維陣列 2.字串處理 3.泡沫排序法 先來看看這個二維陣列...先從一維開始講好了 首先,我會解釋一維陣列是 "宣告複數個同樣類型的變數" 從同樣的角度看待二維陣列,可以解釋成"宣告複數個同樣大小、類型的陣列" 比如下面這頁..... -- 這是int a ┌—┐ | | └—┘ 這是int a[10] ┌—┬—┬—┬—┬—┬—┬—┬—┬—┬—┐ |0|1|2|3|4|5|6|7|8|9| ├—┼—┼—┼—┼—┼—┼—┼—┼—┼—┤ |?|?|?|?|?|?|?|?|?|?| └—┴—┴—┴—┴—┴—┴—┴—┴—┴—┘ 這是int a[2][10] ┌—┬—┬—┬—┬—┬—┬—┬—┬—┬—┐ |0|1|2|3|4|5|6|7|8|9| ├—┼—┼—┼—┼—┼—┼—┼—┼—┼—┤ |?|?|?|?|?|?|?|?|?|?| └—┴—┴—┴—┴—┴—┴—┴—┴—┴—┘ ┌—┬—┬—┬—┬—┬—┬—┬—┬—┬—┐ |0|1|2|3|4|5|6|7|8|9| ├—┼—┼—┼—┼—┼—┼—┼—┼—┼—┤ |?|?|?|?|?|?|?|?|?|?| └—┴—┴—┴—┴—┴—┴—┴—┴—┴—┘ -- 大概是這樣的感覺跟用法,多維可以用同樣的方式去擴張解釋 我自己看待、處理二維陣列大概有種XY平面的感覺就是了 只是前面是Y值、後面是X值,不然概念會亂掉(死) 再來是字串處理,所謂的字串就只是一個字元陣列(擺字元的陣列) 用char a[10]; 像這樣的陣列,就能夠用來擺字串 輸入字串時大概用cin或cin.getline() 比如說 cin >> a; 輸入ABCDEFG(enter) 陣列內容就會裝進這樣的內容 ┌—┬—┬—┬—┬—┬—┬—┬—┬—┬—┐ |0|1|2|3|4|5|6|7|8|9| ├—┼—┼—┼—┼—┼—┼—┼—┼—┼—┤ | A| B| C| D| E| F| G|\0|?|?| └—┴—┴—┴—┴—┴—┴—┴—┴—┴—┘ -- 如果是用cin.getline(a,10,'\n')也會是一樣的結果 : 嗯..cin.getline標準用法上,好像是不加最後一個標示字串結束在哪個字元就是 cin.getline函式內引用值分別是(陣列名稱,最大字串範圍,結束字元) 換行的enter同時帶有蠻多東西...不過先用\n就可以了 最後是個泡排 這樣去解釋泡排...有N個未經排序的數值 把最大(或最小)丟到最末端(最首) 然後把次大(次小),擺到次末(次首),然後不斷重複這樣行為N-1次 就能讓這些數值變成一個經過排序的數值,稱為泡沫排序法 如同泡沫會往上浮一樣,讓你的數值(泡沫)往上浮到最頂端(陣列最末端) 這裡可以拿出課本7-11、7-12頁的地方有圖例 它的四個loop內容就是一次一次把陣列中的最大值、次大值由大而小排序 -- 範例code的部份.. 大概是 int a[10]; for (int i=0;i<10;i++) cin >>a[i]; for (int i=0;i<10;i++) for (int j=i;j<10;j++) if (a[i]<a[j]) { int tmp=a[i]; a[i]=a[j]; a[j]=tmp; } 好,我決定就這樣草草帶過(咦) -- 再來看這個作業目標... 1.輸入姓名、成績 2.照成績排序 3.輸出名次、姓名、成績 同樣不論沒意義的介面... 首先是輸入姓名、成績 如果都用cin來寫應該沒什麼問題,反正分隔就很直觀的判斷 這部份用cin寫的問題,大多是不知道二維陣列怎麼用 回顧一下如何使用cin輸入字串 char a[10]; cin >>a; 再來看二維...就像前面說過的,二維就是宣告複數個陣列而已 所以用法很單純只是 -- char a[10][10]; cin >>a[0]; 像這樣,cin>>陣列名稱 就好,不要想太多變成cin >> a[0][0]; 另外一方面,使用cin.getline(a[0],10)又有另外一個問題... 照題目要求,所以用getline一定是分行輸入,假設有另外一個grade[10]來裝成績 cin.getline (a[0],10); cin >> grade[0]; cin.getline (a[1],10); cin >> grade[1]; 通常會寫成這樣,或與之等價的for迴圈等 而輸入 aaa 99 bbb 98 就會發現到 輸入完的a[1]會是空的或是根本就亂碼化、執行錯誤...為什麼呢? -- 理由是這樣的... 雖然看不到,可是系統中,我們輸入這段的實際內容是 aaa\n 99\n bbb\n 98\n 回頭跟code比較,一開始aaa\n可以正常輸入進a[0] 然後99也進去了...可是cin不會把99後面這個\n吃掉,也不會擺進grade[0]裏面 所以這個\n自然被下一行指令處理 由a[1]接受,後面的bbb被硬塞進grade[1]裏面...當然就造成執行錯誤了 解決方式很簡單...另外宣告一個char變數,多使用一個cin.getline將那個\n吸收掉 如下頁 -- char b[5]; cin.getline (a[0],10); cin >> grade[0]; cin.getline (b,5); cin.getline (a[1],10); cin >> grade[1]; 像這樣,就能夠正常輸入了,那個沒有被接受的\n也會被使用掉 再來是排序...單單排序我想不會是太大問題 這有問題我也不知道怎麼救了(囧a) 這裡有問題的大概就是不知道怎樣把分數、名字一起排 其實就只是分數要交換時,名字在一起交換就是了 記得善用strcpy去做交換就可以了 -- 亂寫的範例... char a[10][10]; int grade[10]; for (int i=0;i<10;i++) cin >>a[i] >>grade[i]; for (int i=0;i<10;i++) for (int j=i;j<10;j++) if (grade[i]<grade[j]) { int tmp=grade[i]; char tmpa[10]; strcpy (tmpa,a[i]) grade[i]=grade[j]; strcpy (a[i],a[j]); grade[j]=tmp; strcpy (a[j],tmpa); } 有點噁心,不過大概就是這樣 -- 最後的輸出.. 排名跟排序方向不同的話兩種作法 以範例來說倒是沒這種問題,有的人把最大值擺到最後面就會有這樣的問題 1.反過來排,這個最直觀... 2.輸出做處理 什麼意思呢...比如說,今天10個人,排第一的放在a[9]、排第二的放在a[8] 相反的,第一名的名次=10-9,第二名=10-8 像這樣就能形成一個規律,所以我可以 for (int i=9;i>=0;i--) cout <<10-i <<' ' <<a[i] <<' ' <<grade[i]; 像是這樣去做列出名次這樣 類似的用法會用在旁邊風娘出的基本練習題裡面 大家就加油吧(遠目) -- 本命 ○楽園の巫女  博麗 霊夢 職業:博麗神社の巫女さん  Hakurei Reimu   能力:主に空を飛ぶ程度の能力 @東方project系列 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 58.114.76.199
CaptainWill:強大推(CDing 囧 01/03 22:21
pk873:說好了不想打 結果還是打了 矛盾可愛的鳳狼大大-ˇ- 01/03 22:44
Arashinoon:鳳郎越來越專業了...連PAGEDOWN都那麼完美 01/03 22:46
game0416:那個明明一直都有在做編排QQ 01/03 22:55
gcobc12632:我記得這只是練習不算作業不是嗎= =? 01/03 23:20
gingkoginkgo:二樓 那個叫傲嬌= W= 01/03 23:59
Genya0:是男的,所以叫驕傲!(挺~ 01/04 00:53