作者game0416 (凤狼)
看板NTUE-CS102
标题Re: [闲聊] 程设作业
时间Fri Apr 16 23:56:00 2010
原来这麽久没写串了(?)
中间应该是只有建构、解构函式跟这礼拜突然就过去的字串处理
有缺什麽提醒一下...我总觉得周二我都睡很大(死)
: 对了,字串处理略...除非有谁有好点子可以拿来玩
以及一个半作业
分别是练习建构函式的小作业、模拟发牌的作业这样
: 前者一样略
maaa
虽然号称能解决问题的都是好写法
不过以我接触过的两三次历史纪录,期中考一定指定作法的-_____-
--
: 节俭空间,一次说明建、解构函式算了(被打)
如果把一个class视做是一个小型的函式
比如说
int main()
{
int a;
cin >>a;
cout <<a <<endl;
return 0;
}
这样的程式内容,目的是输入、输出a
那麽,我们设计时会让程式
1.在开始时建立(建构)出变数a
2.对a进行处理
3.结束(解构)程式
--
用同样的观点来看建、解构函式
那就是说,当我建立起某个物件时
电脑会主动作的事情就是建构函式内定义的内容
(类似於上面那个小程式的
int a)
而当我删除、某个物件的生命结束时
电脑则会主动去做解构函式内定义的事情
(
return 0,我知道解构这边这样解释差很大(死))
大概先抱持这样的感觉就好
再来知道建解构预设函式名称为 类别名称 、 ~类别名称
还有只要没宣告,编译器都会设定建解构函式内容是空的就好
: 近似於这样的空程式
int main()
{ ;
}
--
面对期中考的话,就拿这个类别当再来的范例
class stack{
public:
void setnum(
int NUM) {num=NUM;};
void setptr(stack* PTR) {ptr=PTR;};
int getnum() {
return num;};
stack* getptr(){
return ptr;};
private:
stack* ptr;
int num;
};
应该有相当比例的都是用串列去写这个题目
在其中会遇到很多,要把初始没有内容的ptr指向NULL,避免出现错误的情况
如果说,这个类别宣告成物件时,里面的指标就可以预设为NULL的话
这程式就可以写的比较顺畅了
希望物件建构初始时的动作,就是建构函式了
--
先把这个类别加点东西,变成它的完整样貌
class stack{
public:
stack () {;}; //这是建构函式
void setnum(
int NUM) {num=NUM;};
void setptr(stack* PTR) {ptr=PTR;};
int getnum() {
return num;};
stack* getptr(){
return ptr;};
~stack() {;}; //这是解构函式
private:
stack* ptr;
int num;
};
也就是说,不管怎样这个建解构都存在
然後呢...我们期待预设ptr指向NULL --> 创建时物件会自己去设定ptr
因此,修改建构函式为
--
stack () {ptr=NULL;};
就能做到创立後,ptr会自己指向NULL这点了...在後面也可以拿掉很多特例内容
再来,我们又想setnum其实只在程式开始时设定那一次
那能不能像
int a=10;这样直接输入,就能减少函式的宣告、简化程式码?
所以说呢...我们又把建构函式作了些变化
让他能输入一个参数进去,方便处理、简化函式与使用时的程式码
stack (
int NUM=
0) {ptr=NULL; num=NUM;};
於是乎,宣告时就能直接使用
stack iamstack(
1);
来让stack这个物件的两个变数设在 num == 1 跟 ptr==NULL了
下页放个改完的样貌
--
class stack{
public:
stack (
int NUM=
0) {ptr=NULL; num=NUM;};
void setnum(
int NUM) {num=NUM;};
void setptr(stack* PTR) {ptr=PTR;};
int getnum() {
return num;};
stack* getptr(){
return ptr;};
~stack() {;};
private:
stack* ptr;
int num;
};
再来一页延伸使用...虽然我现在想不到什麽好用法
--
在建构函式处,因为是"函式",所以也可以做些其他事情
比如写成
stack (int NUM=
0)
{
ptr=NULL; num=NUM;
cout <<num <<"We are the world, We are the children.";
num=num*
10+
5-
6;
};
这样子另外输出些什麽、做些处理一类的做法也是建解构函式能做的事情
不过一下我还真的想不到什麽(死)
再来稍微讲一下解构函式...
因为跟建构雷同处很多,所以应该不会用太多篇幅
--
与之相反,解构函式即物件被删除时做的行为
像是
delete或程式结束时进行记忆体释放作业时都算
大概有一点像是物件留下遗言这种感觉(?)
嗯...以当初做那作业时我遇到能用在解构函式的问题....
大概就是在想怎样可以很简单的把全部串列delete而已
像是说一整个串列接在一起,我能不能砍掉head,就能把全串砍掉这样的事情
所以说...我可以把解构写成
~stack() {
delete ptr;};
这样子去产生一个连锁效应,当我delete某个物件时
让电脑自己帮我把其後整个串列delete这样
当然,一样可以写成
~stack() { cout << "I don't want to die"};
这种鬼东西就是了(殴)
--
(中略)
最後是模拟发牌,也就是乱数的应用题..
: 我觉得写这段时脑袋有点问题...作法有多少种一直没想通差异性
函式库 相关函式库
#include <stdlib.h> #include <time.h>
函式 函式
srand(); time();
rand();
srand -> 设定乱数种子,种子是用来生成一系列不同乱数的初始值,接受
unsigned int
rand -> 预设应该生成一个0~32767(?) 范围的数
time -> 回传现在时间,输入格式是一个time_t的指标,输出从指定时间起至今过几秒
: 预设为1970/1/1,也就是给予NULL显示的时间
--
题目是模拟发牌
从发牌大概有这样两种
1.发牌时才产生还没有出现过的某张卡
2.先有一叠卡片、洗完牌後从最上头开始抽
然後,判断是不是发过的卡片应该都是一个表格配置
0 1 2 3 4 5 6 7 8 9 10 11 12
0 : 0 0 0 0 0 0 0 0 0 0 0 0 0
1 : 0 0 0 0 0 0 0 0 0 0 0 0 0
2 : 0 0 0 0 0 0 0 0 0 0 0 0 0
3 : 0 0 0 0 0 0 0 0 0 0 0 0 0
发过的0变1,或发过的1变0...发出来之前确定一下有没有发过
有发过就重新再挑一张
--
先看第一种写法...
其中,不论何者都是要先决定卡片花色
所以说....我直觉想到是分别处理
先决定花色,再决定数值
也就是...
pattern=rand()%4;
number=rand()%13;
这样乱数两个数值的作法
: 在优良的乱数情况下,这种产生法不会影响乱度..虽然这个内建的rand不是优良的(跑)
比较好、也比较快的方式是
tmp=rand();
pattern=tmp/4;
number=tmp/13;
这样去决定花色与数值
至於说为什麽是取4跟13的余数...只是单纯容易使用在阵列里面
--
好啦...有花色有数值
再来就是你要在发出每张牌时才决定那张是什麽
还是先发出五张後,再逐个输出的差别而已了
: 即使我总觉得好像还有几种发法...(抓头)
至於数值与花色、AKQJ的转换
那就看你想写成if或switch都可以,指定特定部分转换就好
另外一个作法应该不会看到人做
作法是建一个大小为52的int阵列装1~52,然後连续用乱数将其中任意两数位置两两互换
换到最後再从[0]开始一张一张抽出
因为觉得没什麽好写的...所以就不在过程间放code了
下页放个没什麽优化、上课刻出来的53行
就见笑了
--
#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
int main()
{
bool poker[4][13];
for (
int i=
0;i<
4;i++)
for (
int j=
0;j<
13;j++)
poker[i][j]=
false;
//seed set
srand(time(NULL));
//deal
for (
int i=
0;i<
4;i++){
cout <<"The " <<i+
1 <<" person\n";
for (
int j=
0;j<
5;j++){
int color=rand()%
4;
int num=rand()%
13;
while (poker[color][num]){
color=rand()%
4;
num=rand()%
13;
}
poker[color][num]=
true;
switch (color){
case 0:
cout <<"Club";
break;
case 1:
cout <<"Diamond";
break;
case 2:
cout <<"Heart";
break;
case 3:
cout <<"Spade";
break;
}
if (num ==
12)
cout <<'K';
else if (num ==
11)
cout <<'Q';
else if (num ==
10)
cout <<'J';
else if (num ==
0)
cout <<'A';
else
cout <<num+1;
cout <<"\t";
}
cout <<"\n";
}
}
乱写一气的lol
--
至於说泄出来的题目内容嘛...
第一步是想到随机生成方块来做串列,不过这似乎不够让人有考试的感觉
所以说有可能像是扑克牌第二种写法一样要求随机移动方块
也就是...做出一个堆方块的雏形,然後随机生成一堆移动方法丢进去跑
: 虽然我也有一种陪NPC打牌的错觉...去年好像当一般作业hmmmmm
然後呢..又因为指定要带课本,所以会让人想到
1.考字串处理的函式库
2.指定课本习题
1看命...有可能冒出来11-31页..感觉意外的有可能(?)
2的部份就先做看看7-62 1.2.4.9,9会出也是随机生成10个数作排序啦
另外是8-43 1
--
红白本命
○楽园の巫女
博丽 霊梦 职业:博丽神社の巫女さん
Hakurei Reimu 能力:主に空を飞ぶ程度の能力
@东方project系列
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 115.43.42.173
1F:推 yantchen:噗噗 绝对没有你想的那麽难XD 04/16 23:59
2F:→ yantchen:其实没有限定要带课本啦 只是上机考都可以带课本我提醒一 04/17 00:00
3F:→ game0416:hmmmmmmm 可是我觉得都不难说(殴 04/17 00:00
4F:推 Arashinoon:凤郎你12345忘了删=ˇ= 04/17 00:24
5F:推 ip3311:未看先推 04/17 00:25
6F:推 CaptainWill:未看先推 04/17 00:29
※ 编辑: game0416 来自: 115.43.42.173 (04/17 00:34)
7F:推 Arashinoon:看完给推 考试大概也就那样了吧 04/17 00:42
8F:推 CaptainWill:王老大表示: 04/17 00:43
9F:推 yantchen: 你觉得你们猜的中吗XD 04/17 00:46
10F:推 Arashinoon: 科科 04/17 00:46
11F:推 CaptainWill: 我也会科科笑 04/17 00:47
12F:推 yantchen: +1 04/17 00:49
13F:推 pk873: 推 04/17 01:43
14F:推 gcobc12632: ? 04/17 02:25