主题:[原创]发个有趣的程序
黑色剑士
[专家分:80] 发布于 2005-06-16 10:36:00
运行后注意看输出结果和源代码
#include<stdio.h>
main()
{
char s1[]=";| char s2[]=~#include<stdio.h>$main()${$ char s1[]=~;| char *p;| for(p=s2;*p;p++)if(*p=='$')*p=10;| printf(s2);putchar(34);printf(s1);putchar(34);| for(p=s1;*p;p++)| {| if(*p==124)*p=10;| if(*p==126)*p=34;| }| printf(s1);|}| ";
char s2[]="#include<stdio.h>$main()${$ char s1[]=";
char *p;
for(p=s2;*p;p++)if(*p=='$')*p=10;
printf(s2);putchar(34);printf(s1);putchar(34);
for(p=s1;*p;p++)
{
if(*p==124)*p=10;
if(*p==126)*p=34;
}
printf(s1);
}
回复列表 (共12个回复)
沙发
TSCZZ [专家分:290] 发布于 2005-06-16 10:48:00
有什么用呢???
板凳
黑色剑士 [专家分:80] 发布于 2005-06-16 10:53:00
看不出来吗?这是个打印自身的程序
3 楼
飞鸟12 [专家分:2830] 发布于 2005-06-16 12:56:00
在程序中储存自身的源代码 也许并不很高明吧
4 楼
黑色剑士 [专家分:80] 发布于 2005-06-16 13:02:00
呵呵,想从源代码文件中读出来吗?这当然是最简单的方法,但是就没什么挑战了
这是计算理论中的打印自身问题;认为很简单的话可以自己试试
5 楼
黑色剑士 [专家分:80] 发布于 2005-06-16 14:11:00
干脆我再给个解释吧:直接printf是不可能实现的
证明:
如果程序A打印程序B
A源代码:
main()
{
printf("....(B源代码)");
}
这时A要比B复杂,因为A不仅包含了B的全部代码,还有main(),printf等代码。
代码长度也是A>B。
如果A要打印A呢?A比自身还复杂?A的代码比自身的代码还长?
[em1]
6 楼
liang0200551 [专家分:40] 发布于 2005-09-09 19:18:00
楼上大哥说的好,楼主的程序并不高明!!
7 楼
yyqyyq [专家分:130] 发布于 2005-09-11 23:22:00
比较有趣,请教思路!!
8 楼
YJFOX [专家分:4430] 发布于 2005-09-11 23:32:00
char*s="char*s=%c%s%c;main(){printf();}";
main(){printf(s,34,s,34);}
这才叫打印程序自身代码
9 楼
YJFOX [专家分:4430] 发布于 2005-09-12 09:23:00
顶~~~~~
10 楼
knocker [专家分:3380] 发布于 2005-09-12 16:27:00
楼主处理得不错,两个难点都解决了。^_^
8楼的程序是不对的。^_^
下面是本论坛对这个问题的讨论部分贴子。
http://www.programfan.com/club/showbbs.asp?id=67332
http://www.programfan.com/club/showbbs.asp?id=59867
这个“游戏”还有更精彩的玩法
试试这个程序
#include "stdafx.h"
#include "stdio.h"
/* -----------------------dhyang.c------------------------- */
#define/**/X
char*d="X0[!4cM,!"
"4cK`*!4cJc(!4cHg&!4c$j"
"8f'!&~]9e)!'|:d+!)rAc-!*m*"
":d/!4c(b4e0!1r2e2!/t0e4!-y-c6!"
"+|,c6!)f$b(h*c6!(d'b(i)d5!(b*a'`&c"
")c5!'b+`&b'c)c4!&b-_$c'd*c3!&a.h'd+"
"d1!%a/g'e+e0!%b-g(d.d/!&c*h'd1d-!(d%g)"
"d4d+!*l,d7d)!,h-d;c'!.b0c>d%!A`Dc$![7)35E"
"!'1cA,,!2kE`*!-s@d(!(k(f//g&!)f.e5'f(!+a+)"
"f%2g*!?f5f,!=f-*e/!<d6e1!9e0'f3!6f)-g5!4d*b"
"+e6!0f%k)d7!+~^'c7!)z/d-+!'n%a0(d5!%c1a+/d4"
"!2)c9e2!9b;e1!8b>e/! 7cAd-!5fAe+!7fBe(!"
"8hBd&!:iAd$![7S,Q0!1 bF 7!1b?'_6!1c,8b4"
"!2b*a,*d3!2n4f2!${4 f. '!%y4e5!&f%"
"d-^-d7!4c+b)d9!4c-a 'd :!/i('`&d"
";!+l'a+d<!)l*b(d=!' m- a &d>!&d'"
"`0_&c?!$dAc@!$cBc@!$ b < ^&d$`"
":!$d9_&l++^$!%f3a' n1 _ $ !&"
"f/c(o/_%!(f+c)q*c %! * f &d+"
"f$s&!-n,d)n(!0i- c- k) ! 3d"
"/b0h*!H`7a,![7* i] 5 4 71"
"[=ohr&o*t*q*`*d *v *r ; 02"
"7*~=h./}tcrsth &t : r 9b"
"].,b-725-.t--// #r [ < t8-"
"752793? <.~;b ].t--+r / # 53"
"7-r[/9~X .v90 <6/<.v;-52/={ k goh"
"./}q; u vto hr `.i*$engt$ $ ,b"
";$/ =t ;v; 6 =`it.`;7=` : ,b-"
"725 = / o`. .d ;b]`--[/+ 55/ }o"
"`.d : - ?5 / }o`.' v/i]q - "
"-[; 5 2 =` it . o;53- . "
"v96 <7 / =o : d =o"
"--/i ]q-- [; h. / = "
"i]q--[ ;v 9h ./ < - "
"52={cj u c&` i t . o ; "
"?4=o:d= o-- / i ]q - "
"-[;54={ cj uc& i]q - -"
"[;76=i]q[;6 =vsr u.i / ={"
"=),BihY_gha ,)\0 " , o [
3217];int i, r,w,f , b ,x ,
p;n(){return r <X X X X X
768?d[X(143+ X r++ + *d ) %
768]:r>2659 ? 59: ( x = d
[(r++-768)% X 947 + 768] ) ?
x^(p?6:0):(p = 34 X X X )
;}s(){for(x= n (); ( x^ ( p
?6:0))==32;x= n () ) ;return x ; }
void/**/main X () { r = p
=0;w=sprintf (X X X X X X o
,"char*d="); for ( f=1;f < * d
+143;)if(33-( b=d [ f++ X ] )
){if(b<93){if X(! p ) o
[w++]=34;for X(i = 35 +
(p?0:1);i<b; i++ ) o
[w++]=s();o[ w++ ]
=p?s():34;} else X
{for(i=92; i<b; i
++)o[w++]= 32;} }
else o [w++ ]
=10;o [
w]=0 ;
puts(o);}
注意,这是从网页上直接copy的,含有不可见的非法字符,在编辑器中删去原来的空白,并原样加上即可。如果用的是TC去掉#include "stdafx.h".
此程序每运行后的结果,可直接copy到编译器中再编译运行,周而复始......
我来回复