作者yantchen (球童Yanting)
看板NTUE-CS102
標題[課業] 前三個作業
時間Mon Mar 15 22:15:31 2010
看完鳳狼大的文 還寫不出來就看這吧
先解釋三個作業的要求
作業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