神奇C++问题(4)

HaoGeGe 2001-05-16 03:47:00
试解释这段程序.

#include <cstdio>
class C {
void (C::*s)();
void a(){x(a,"%c",b,"",c,""); }
void b(){x(a," %c",b,"",c,""); }
void c(){x(a,"\n%c",d,"",c,""); }
void d(){x(a,"\n %c",d,"",c,""); }
void x(void(C::*a)(),char*as,void(C::*b)(),
char*bs,void(C::*c)(),char*cs){
switch(int l=getchar()) {
case -1: s=0; return;
case ' ': case '\t': printf(bs,l); s=b; break;
case '\n': printf(cs,l); s= c; return;
default: printf(as,l); s= a; break;
}
}
public:
C():s(a){while(s)(this->*s)();}
};
int main(int,char*[]) {
C a;
return 0;
}
...全文
162 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
holyfire 2001-05-16
  • 打赏
  • 举报
回复
呵呵,真的很考验人的哦。
HaoGeGe 2001-05-16
  • 打赏
  • 举报
回复
不愧为斑竹处乱不惊,事实上,易于理解的版本如下.

class C {
void (C::*currentState)();
void startState(){
changeState(startState,"%c",sawSpace,"",sawNewline,"");
}
void sawSpace(){
changeState(startState," %c",sawSpace,"",sawNewline,"");
}
void sawNewline(){
changeState(startState,"\n%c",sawNewlineSpace,"",
sawNewline,"");
}
void sawNewlineSpace(){
changeState(startState,"\n %c",sawNewlineSpace,"",
sawNewline,"");
}
void changeState(void(C::*nextStateIfNormal)(),
char*normalFmt,
void(C::*nextStateIfSpace)(), char*spaceFmt,
void(C::*nextStateIfNewline)(), char*newlineFmt){
switch(int charRead=getchar()) {
case -1:
currentState=0;
return;
case ' ': case '\t':
printf(spaceFmt,charRead);
currentState = nextStateIfSpace;
break;
case '\n':
printf(newlineFmt,charRead);
currentState = nextStateIfNewline;
return;
default:
printf(normalFmt,charRead);
currentState = nextStateIfNormal;
break;
}
}
public:
C():currentState(startState){
while(currentState)
(this->*currentState)();
}
};

int main(int,char*[]) {
C a;
return 0;
}
holyfire 2001-05-16
  • 打赏
  • 举报
回复
a->a
a->b
a->c

b->a
b->b
b->c

c->a
c->d
c->c

d->a
d->d
d->c
Ferchis 2001-05-16
  • 打赏
  • 举报
回复
在c状态输入空格就到d了啊
holyfire 2001-05-16
  • 打赏
  • 举报
回复
起始状态 a 输入普通字符转到a
输入空格和跳格转到b
输入回车转到c
输入组合键退出
奇怪的是d为什么没有用到
Ferchis 2001-05-16
  • 打赏
  • 举报
回复
好像能把多个连续的空格合并为一个
HaoGeGe 2001-05-16
  • 打赏
  • 举报
回复
提醒一下.
这个程序实际上实现了一个拥有4种状态的FSM(finite state machine).
Ferchis 2001-05-16
  • 打赏
  • 举报
回复
-1是不是esc啊
Sodar 2001-05-16
  • 打赏
  • 举报
回复
不知怎么回事,我看着看着就摔了交。。。
holyfire 2001-05-16
  • 打赏
  • 举报
回复
-1是那个键呢?
swat 2001-05-16
  • 打赏
  • 举报
回复
我玩了一年的c++,才发现我太菜了!没看明白!
Ferchis 2001-05-16
  • 打赏
  • 举报
回复
我决定-- 等着正确答案了
babysloth 2001-05-16
  • 打赏
  • 举报
回复
不会是我打什么进去它就跟着来吧???
Ferchis 2001-05-16
  • 打赏
  • 举报
回复
晕倒~
holyfire 2001-05-16
  • 打赏
  • 举报
回复
哈哈,越来越麻烦了哦,不会冒出带汇编题目吧。
HaoGeGe 2001-05-16
  • 打赏
  • 举报
回复
不好意思用了stdio.您就将就着看看吧.哈哈.
babysloth 2001-05-16
  • 打赏
  • 举报
回复
这段代码不符合C++的标准:-)

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧