作者game0416 (凤狼)
看板NTUE-CS102
标题Re: [闲聊] 程设作业
时间Wed Mar 10 00:05:49 2010
首先我要更正一下上次最後一页的code
没注意到用指标动态宣告时要用
->,那整页都是
.当成员存取运算子
非常抱歉<(_ _)>
今天的内容是
封装、链结串列
然後因为我中间好像不小心睡掉一段说明
所以我不知道王老大用了些什麽说明hmm
一样是尽量写简单看看Orz
这边提醒一下,作业内容如作业1的意思应该是
作业1 建立类别(阵列) -> 输入资料 -> 排序 -> 输出
变成作业3 建立类别(链结串列) -> 输入资料 -> 输出
--
封装这部份上次第七第八页大概提过一点用法
最主要是说,变数不由
类别之外直接存取
原始用意是避免设计上的疏失、容易debug两点为多
: 嗯...讲是这样讲,不过也有
: 「会写错的人就是会错,不会写错的人就是不会写错」by 强者我朋友 这样的说法hmm
回顾一下上周写的
类别有分
public跟
private两部份
前者就像是全域变数,在任何一个有宣告该类别的函式都可以修改
後者就像区域变数,只能在类别之内修改
简单写一小段code比较
class C{
public:
int a;
private:
int b;
};
--
如果我们宣告了一个C test;
并且试着编译以下两行程式码
test.a=
5;
test.b=
6;
编译器将不会通过,并告知b是private
: 警告讯息如右: 'int C::b' is private
这就是不能从类别外部直接改变的意思
所以我们要在类别
内宣告函式,藉由函式去改变类别内的数值
以上面的范例做修改,应该就是写成这样
class C{
public:
void setb(
int B) {b=B};
private:
int b;
};
--
函式内使用类别,要修改类别C里头,b的内容时
就改成这样写
C.setb(
6);
像这样,以类别里面的函式setb()去设定类别中
int b的内容
就是将变数"封装"在类别中,不让外面的人可以直接碰
: 突然有种哪家精品店的感觉...「架上商品请勿触碰,如有需要请洽柜台人员」(?)
感觉很像当初在讲函式怎麽用一样,会有种多此一举的感觉
不过类别这种东西一多还是会乱,保守还是请用函式修改这样
这边顺便提一下,宣告类别内的函式一行可以像范例那样缩在一起就算了
如果不是只有一行,那最好是像下页这样写在类别之外会好一些
凑 个 字 在 这 里 比 较 好 看
--
class aclass{
public:
void seta_and_couta(
int A);
private:
int a;
};
// 此之上是类别,此之下是叙述类别内函式内容
void C::seta_and_couta (
intA){
a=A;
cout <<a;
}
int main(){
int a;
aclass ex;
cin >>a;
ex.seta_and_couta(a);
}
完整写一串大概是长这样子,顺便附上前面说明中的完整范例一套於下页QQ
--
class aclass{
public:
int a;
void setb(
int B) {b=B;};
int getb() {
return b;};
private:
int b;
};
int main(){
aclass test;
test.a=
5;
test.setb(
6);
cout <<test.a <<' '<<test.getb();
}
这边可以回忆一下我最後这个cout是怎麽做到的
再来链结串列会用到。
--
被我忘记的作业二...
要写成封装,所以多加两个函式小改就好
因为前面说明很多了,只写一部份Q 总之就是拿函式去动变数
class aclass{
public:
void setid(
int ID) {b=ID;};
int getid() {
return id;};
private:
int id;
};
int main(){
aclass students[
10];
for (
int i=
0;i<
10;i++){
int id;
cin >> id;
students[i].setid(id);
}
for (
int i=
0;i<
10;i++)
cout <<students[i].getid() <<endl;
}
--
hmm
封装这样讲好像很乱,不过好像也只能这样讲Orz
概念性质东西很讨厌是要知道当事人问题在哪
所以概括性的说明不容易解释
有问题真的请多问QQ
再来是意味不明的链结串列
: 欸,资结不是二年级的课吗...
这边要再提醒一下作业内容不用排序
可以少思考很多很多东西(远目)
链结串列(linked list)
近似於一种铁链式的方法去把数个独立的物件(铁环)接串在一起
在思绪中如同一串链子的构造....
: 他妈的谁看的懂上面这两句!
以我自己的理解观来说
我会把链结串列想成是火车那样的关系
车厢是物件,连结器是指标
--
大概会像是
███ ←这是车厢 _↙这东西是连结器
███__███__███__███__███__
藉由一个连结器,让我可以从第一节车厢,移动到第二节车厢这样
以此做出两个物件之间的"关系"
: 概念上是这样...在记忆体位址上有点虫洞的感觉
嗯...我是code派,有点概念就硬凹code出来
或是看完code就能搞懂构造,所以我在这之後就直接code说明了Orz
要做出连结的构造,使用的是指标去指向下一节车厢的位址
然後呢,这个部份要内嵌在车厢里面的一部分
下页这段
class会有比较完整的说明
然後一边去做这次的作业内容
--
先假设我们只要输入id就好,一次要求多了我怕太花版面
所以我们先建立一个能输出入id的类别内容
class aclass{
public:
void setid(
int ID) {id=ID;};
int getid() {
return id;};
private:
int id;
};
在这之後,加入指标部分的输出入
class aclass{
public:
void setid(
int ID) {id=ID;};
int getid() {
return id;};
void setptr(aclass *PTR) {ptr=PTR;};
aclass
* getptr(){
return ptr;};
private:
int id;
aclass *ptr;
};
--
请特别注意那个*
因为我们要回传的是一个指标,而不是物件
所以那个*绝对不能遗漏了,不然後面会出问题的
写完类别的构造...再来进入main里头去实做、宣告类别开始运作
这里我会写成正常的伫列...把先宣告的视为头去运作
而不是像老师的范例写成视为尾端(堆叠)
: 伫列与堆叠就是先进先出与先进後出...详细以後再谈,不然就拿这两个名词去google
首先,使用动态宣告去产生一个物件
然後,用"两个"指标去储存这第一个物件的位址
一个用来当在车厢间穿梭的"人",一个用来记录第一个车厢的位置
就像这里这两行一样的宣告
int main(){
aclass *node,*head; //node当人,head当第一节车厢
head = node =
new aclass;
}
--
再来,再加入输入与创造的部份
这里我选择在输入完之後,同时创造下一个链结的位址
并让人走到下一间车厢
int main(){
aclass *node,*head; //node当人,head当第一节车厢
head = node =
new aclass;
for (
int i=
0;i<
10;i++){
int id;
cin >>id;
node->setid(id);
if (i!=
9){
node->setptr(
new aclass);
node = node->getptr();
}
else {
delete node->getptr();
node->setptr(NULL);
}
}
}
--
其中
node->setptr(
new aclass);
node = node->setptr(
new aclass);
两行,是制造下一节车厢(下一个物件),并且将这一个位址放在这节车厢的指标上引导
至於那个if,只是单纯我没想到好方法
所以用土法炼钢的方法写遇到最後一个的时候怎样处理..
就只是砍掉多生出来的那个,然後把NULL塞进去指标当串列结尾
写到这边应该是串列形成、输入资料过程写完
再来只要输出就好
: 我会建议自己重写一份形成、输入分开的,多练习是好事QQ
输出部分,首先要把node归零,回到第一节车厢,再逐个输出内容..
所以开头第一句是
node = head
--
先来写个输出,因为有串列第一项,与最末尾的记号,因此使用whlie会好一点
输出应该不是问题
node = head;
while (
1){
cout <<node->getid <<endl;
}
问题来自於往下走要怎麽写...还有思维有没有乱(殴)
node = head;
while (
1){
cout <<node->getid() <<endl;
if (node->getptr() != NULL)
node = node->getptr();
else break;
}
这里就是只要分辨是不是最末项就ok了
输出应该不是太大的问题hmm
--
最後,出於习惯,还是要记得
delete掉生出来的东西
node = head;
while (
1){
if (node->getptr() != NULL){
aclass *tmp=node;
node = node->getptr();
delete tmp;
}
else{
delete node;
break;
}
}
--
...整个内容大概是这样吧
这次在发文前有记得编一次,应该没有太大的bug(死)
有问题多问看看,比较能找到方法去解释问题(倒)
另外,根据惯用的写法,就算是class内建private属性
还是会逐行由public开始定义,然後是private、protected
--
红白本命
○楽园の巫女
博丽 霊梦 职业:博丽神社の巫女さん
Hakurei Reimu 能力:主に空を飞ぶ程度の能力
@东方project系列
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 58.114.76.199
1F:推 dosomethnig:头推 03/10 00:06
2F:推 Arashinoon:肩推 03/10 00:07
※ 编辑: game0416 来自: 58.114.76.199 (03/10 00:16)
3F:推 CaptainWill:屌推 03/10 00:07
4F:推 godhand0629:穴推 03/10 00:09
5F:推 j2612280:推他x的= =链结明明就是大二的课= = 03/10 00:11
6F:推 Tuko: 弓推 03/10 00:11
7F:推 CaptainWill:囧 03/10 00:11
8F:推 godhand0629:老师交太简单就说人家笑话 太难就说大二的客 安邦不是 03/10 00:12
9F:→ godhand0629:我要讲你... 03/10 00:12
10F:推 joe989879:用力推.....推倒__ 03/10 00:13
11F:推 j2612280:靠= =服部...你自己说..明天你要死几次!!!! 03/10 00:14
12F:推 pig456654:= = 安邦 不要欺负人0.0 03/10 00:14
13F:→ pig456654:难道你只有肉吗? 03/10 00:15
14F:推 Arashinoon:安邦什麽人你们还不知道 我就不多说了 凤狼大必推 03/10 00:15
15F:推 pk873:这学期就靠你了 (误) 03/10 00:26
16F:嘘 dosomethnig:纯嘘安邦无能 当公关没联谊! 楼下帮我推回来 03/10 00:27
17F:推 Arashinoon:我帮你 03/10 00:28
18F:→ j2612280:靠= =峻毅狗!! 03/10 00:34
19F:推 CaptainWill:你看看阿干做得多好 03/10 00:35
20F:推 t60702:推- - 03/15 20:41