用C写一个程序,打印出所有的源程序,要求不能用文件。

方法一:

#include <stdio.h>
#define Q(x) #x
#define P(x) char * s = Q(x);
#define M main(){printf("#include <stdio.h>\n#define Q(x) #x\n#define P(x) char * s = Q(x);\n#define M %s\np(M)M", s);}
P(M)M 

 

方法二:

此种方法是本人第一次看到这个题目时候的做法,想了将近三个小时才做出来,而且还比较复杂,不过很好理解。说明:main函数里的函数调用要在一行,与case19中打印的内容要一致。

#include <stdio.h>
void p(int i, int j = 0)
{
 switch(i)
 {
  case 0: printf("case %d: printf(", j); break;
  case 1: printf("\n"); break;
  case 2: printf("\""); break;
  case 3: printf("); break;"); break;
  case 4: printf("\\"); break;
  case 5: printf(", j"); break;
  case 6: printf("{"); break;
  case 7: printf("}"); break;
  case 8: printf("%%"); break;
  case 9: printf(": printf("); break;
  case 10: printf("case "); break;
  case 11: printf(": printf("); break;
  case 12: printf("d"); break;
  case 13: printf("n"); break;
  case 14: printf("void p(int i, int j = 0)"); break;
  case 15: printf("switch(i)"); break;
  case 16: printf("int main()"); break;
  case 17: printf("return 0;"); break;
  case 18: printf("#include <stdio.h>"); break;
  case 19: printf("p(18);p(1);p(14);p(1);p(6);p(1);p(15);p(1);p(6);p(1);p(0,0);p(2);p(10);p(8);p(12);p(11);p(2);p(5);p(3);p(1);p(0,1);p(2);p(4);p(13);p(2);p(3);p(1);p(0,2);p(2);p(4);p(2);p(2);p(3);p(1);p(0,3);p(2);p(3);p(2);p(3);p(1);p(0,4);p(2);p(4);p(4);p(2);p(3);(1);p(0,5);p(2);p(5);p(2);p(3);p(1);p(0,6);p(2);p(6);p(2);p(3);p(1);p(0,7);p(2);p(7);p(2);p(3);p(1);p(0,8);p(2);p(8);p(8);p(2);p(3);(1);p(0,9);p(2);p(9);p(2);p(3);p(1);p(0,10);p(2);p(10);p(2);p(3);p(1);p(0,11);p(2);p(11);p(2);p(3);p(1);p(0,12);p(2);p(12);p(2);p(3);p(1);p(0,13);p(2);p(13);p(2);p(3);p(1);p(0,14);p(2);p(14);p(2);p(3);p(1);p(0,15);p(2);p(15);p(2);p(3);p(1);p(0,16);p(2);p(16);p(2);p(3);p(1);p(0,17);p(2);p(17);p(2);p(3);p(1);p(0,18);p(2);p(18);p(2);p(3);p(1);p(0,19);p(2);p(19);p(2);p(3);p(1);p(7);p(1);p(7);p(1);p(16);p(1);p(6);p(1);p(19);p(1);p(17);p(1);p(7);p(1);"); break;
 }
}
int main()
{
 p(18);p(1);p(14);p(1);p(6);p(1); p(15);p(1); p(6);p(1); p(0,0);p(2);p(10);p(8);p(12);p(11);p(2);p(5);p(3);p(1); p(0,1);p(2);p(4);p(13);p(2);p(3);p(1); p(0,2);p(2);p(4);p(2);p(2);p(3);p(1); p(0,3);p(2);p(3);p(2);p(3);p(1); p(0,4);p(2);p(4);p(4);p(2);p(3);p(1); p(0,5);p(2);p(5);p(2);p(3);p(1); p(0,6);p(2);p(6);p(2);p(3);p(1); p(0,7);p(2);p(7);p(2);p(3);p(1); p(0,8);p(2);p(8);p(8);p(2);p(3);p(1); p(0,9);p(2);p(9);p(2);p(3);p(1); p(0,10);p(2);p(10);p(2);p(3);p(1); p(0,11);p(2);p(11);p(2);p(3);p(1); p(0,12);p(2);p(12);p(2);p(3);p(1); p(0,13);p(2);p(13);p(2);p(3);p(1); p(0,14);p(2);p(14);p(2);p(3);p(1); p(0,15);p(2);p(15);p(2);p(3);p(1); p(0,16);p(2);p(16);p(2);p(3);p(1); p(0,17);p(2);p(17);p(2);p(3);p(1); p(0,18);p(2);p(18);p(2);p(3);p(1); p(0,19);p(2);p(19);p(2);p(3);p(1); p(7);p(1); p(7);p(1); p(16);p(1); p(6);p(1); p(19);p(1); p(17);p(1); p(7);p(1);
 return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值