作者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
1F:推 CaptainWill:大神,未看先推 03/15 22:16
2F:推 CaptainWill:抢到前三推,你这学期物件导向绝对HIGH趴 03/15 22:17
3F:推 CaptainWill:掰~ 03/15 22:17
4F:推 suan710:楼上楼楼上楼楼楼上自HIGH 03/15 22:21
5F:推 CaptainWill:楼上会被当、凼 03/15 22:22
6F:推 gcobc12632:完蛋了 没上课真的完全看不懂 void set get 的用途是啥 03/15 22:25
7F:推 Arashinoon:非常复杂 决不虎烂 (认真 03/15 22:25
8F:推 suan710:有没有都给楼楼上讲就好的八卦? 03/15 22:25
9F:→ suan710: 楼 03/15 22:26
10F:推 Arashinoon:当然没有 还有另外两个版主呢 一切照版规走 03/15 22:27
11F:→ game0416:改版规记得再发文公告才是真的hmm 03/15 22:27
12F:推 Arashinoon:楼上说的极是(_ _)m 小的没注意 马上补上一份公告 03/15 22:31
13F:推 pk873:连void 都看不懂 阿泰下一年度跟学弟一起重修看看巴!! 03/15 22:47
14F:→ CaptainWill:说不定还会找到春天(前提是阿牧过了,不能跟你抢 03/15 22:48
15F:推 gcobc12632:老实说我连return是什麽都不知道 所以我根本不用这个 03/15 23:00
16F:推 pk873:阿牧表示: (>,,,<) 我有留胡子 我很有礼貌 03/15 23:04
17F:推 j2612280: , 03/15 23:07
18F:嘘 CaptainWill:安邦你很脏... 03/15 23:10
19F:→ yantchen:那不是是山羊胡吗? 花花的山羊胡很脏喔XD(笔记 03/15 23:20
20F:推 CaptainWill:学长不要被安邦骗了,那不是山羊胡呀!!! 03/15 23:21
21F:→ j2612280:阿花思想邪恶= =..话说你今天早上都G了= =.. 03/15 23:39
22F:→ CaptainWill:你G了一个我,还有千千万万个我 03/15 23:40
23F:→ gcobc12632:楼上是在宣示重修宣言吗 03/15 23:42
24F:→ yantchen:资科系都第五年了 总是要有人修一下大六嘛 03/15 23:45
25F:推 CaptainWill:囧 03/15 23:45
26F:推 s86186654418:推阿泰:楼上是在宣示重修宣言吗 03/16 01:17