精華區beta NTUE-CS102 關於我們 聯絡資訊
看完鳳狼大的文 還寫不出來就看這吧 先解釋三個作業的要求 作業1 用st物件陣列來存學號跟分數 作業2 同1,但是要封裝 作業3 用st物件串列來存學號跟分數 上學期最後的成績單 是用多個陣列來存分數跟成績 例如 int ID[10], chinese[10], english[10] ... 這樣就可以寫出來想要的功能 但就是排序的時候 兩兩比較 然後交換有幾個陣列就要一起交換 例如 if(sum[i]<sum[i+1]) { int t=ID[i]; ID[i]=ID[i+1]; ID[i+1]=t; t=chinese[i]; chinese[i]=chinese[i+1]; chinese[i+1=t; ... } 這樣很麻煩 所以 我們可以定義一個東西 把需要的資料 包成一捆 class st{ public: int ID; int grade; }; 這樣我們只要建立一個 st 的陣列 就可以存每一筆包含ID跟grade的資料了 st a[5]; for(i=0;i<5;i++) { cin>>a[i].ID; cin>>a[i].grade; } 比較也很簡單 因為綁成一捆了 所以直接整個交換 if(a[i].grade<a[i+1].grade) { st t=a[i]; a[i]=a[i+1]; a[i+1]=t; } 這樣就是全部作業1需要的東西了 下面是作業1的參考答案 #include<iostream> using namespace std; class st{ public: int ID; int grade; }; int main(){ int i,j; st a[10], t; // 輸入 for(i=0;i<10;i++) { cin>>a[i].ID>>a[i].grade; } // 排序 for(i=0;i<10;i++) { for(j=0;j<9;j++) { if(a[j].grade<a[j+1].grade) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } } // 輸出 for(i=0;i<10;i++) { cout<<"第"<<i+1<<"名:"<<a[i].ID<<" "<<a[i].grade<<"分\n"; } } 接下來是 作業2 如果把 st 想成是一個 ID跟grade 就是你口袋裡面的財產 作業1用的方法 直接對ID跟grade 做 cin 跟 cout 就好像 cin 跟 cout 直接去你口袋 把錢放進去拿出來 這樣是很危險的 所以 我們稍作修改 class st{ private: //這行可以省略 int ID; int grade; public: void setID(int i) { ID=i; } void setgrade(int g) { grade=g; } int getID() { return ID; } int getgrade() { return grade; } }; 增加了ID跟grade對應的 get 跟 set 當然不一定要get跟set 你可以自己取 但是要記得誰是誰就OK 然後輸入的地方 就變成 int x,y; st a[5],t; ... for(i=0;i<5;i++) { cin>>x>>y; a[i].setID(x); a[i].setgrade(y); } 比較就變成 if(a[i].getgrade()<a[i+1].getgrade()) { t=a[i]; a[i]=a[i+1]; a[i+1]=t; } 輸出就變成 for(i=0;i<5;i++) { cout<<"第"<<i+1<<"名:"<<a[i].getID()<<" "<<a[i].getgrade()<<"分\n"; } 作業1到作業2只是小改 原本作業1的 ID跟grade是 公開的 所以可以直接cin/cout跟改變值(a[i].grade=59;類似這樣) 這樣程式比較簡單 但是比較危險 改成作業2的方法有幾個好處 像是把值丟進去的時候 例如改座號 改分數 可以設定 例如 座號一定>0, 分數一定在0~100之類的 void setID(int i) { if(i<0) { cout<<"座號沒有負的喔"; } else { ID=i; } } 類似這樣 如果把 st 看作是的話 這些set跟get等於是經過你的同意 只是現在的作業2 直接就 什麼=什麼 跟 return 看起來是多此一舉 其實他是有意義的 如果你以後要增加一些檢查功能之類的話 這些都OK的話 就要進入作業3囉.. 請看下一篇 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 120.127.36.183
CaptainWill:大神,未看先推 03/15 22:16
CaptainWill:搶到前三推,你這學期物件導向絕對HIGH趴 03/15 22:17
CaptainWill:掰~ 03/15 22:17
suan710:樓上樓樓上樓樓樓上自HIGH 03/15 22:21
CaptainWill:樓上會被當、凼 03/15 22:22
gcobc12632:完蛋了 沒上課真的完全看不懂 void set get 的用途是啥 03/15 22:25
Arashinoon:非常複雜 決不虎爛 (認真 03/15 22:25
suan710:有沒有都給樓樓上講就好的八卦? 03/15 22:25
suan710: 樓 03/15 22:26
Arashinoon:當然沒有 還有另外兩個版主呢 一切照版規走 03/15 22:27
game0416:改版規記得再發文公告才是真的hmm 03/15 22:27
Arashinoon:樓上說的極是(_ _)m 小的沒注意 馬上補上一份公告 03/15 22:31
pk873:連void 都看不懂 阿泰下一年度跟學弟一起重修看看巴!! 03/15 22:47
CaptainWill:說不定還會找到春天(前提是阿牧過了,不能跟你搶 03/15 22:48
gcobc12632:老實說我連return是什麼都不知道 所以我根本不用這個 03/15 23:00
pk873:阿牧表示: (>,,,<) 我有留鬍子 我很有禮貌 03/15 23:04
j2612280: , 03/15 23:07
CaptainWill:安邦你很髒... 03/15 23:10
yantchen:那不是是山羊鬍嗎? 花花的山羊鬍很髒喔XD(筆記 03/15 23:20
CaptainWill:學長不要被安邦騙了,那不是山羊鬍呀!!! 03/15 23:21
j2612280:阿花思想邪惡= =..話說你今天早上都G了= =.. 03/15 23:39
CaptainWill:你G了一個我,還有千千萬萬個我 03/15 23:40
gcobc12632:樓上是在宣示重修宣言嗎 03/15 23:42
yantchen:資科系都第五年了 總是要有人修一下大六嘛 03/15 23:45
CaptainWill:囧 03/15 23:45
s86186654418:推阿泰:樓上是在宣示重修宣言嗎 03/16 01:17