作者game0416 (鳳狼)
看板NTUE-CS102
標題Re: [閒聊] 程設作業
時間Sun Jan 3 22:17:49 2010
拖稿中(?)
因為那作業沒要交,所以想說慢慢來就拖到現在了(思)
先來複習一下上了什麼...
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