有趣的c好玩的程序设计cc++.pdf
《有趣的c好玩的程序设计cc++.pdf》由会员分享,可在线阅读,更多相关《有趣的c好玩的程序设计cc++.pdf(35页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1.功能:求三个整数的平均值。程序如下:include /*载入头文件 stdio.h*/void main。/*主函数 main*/(int a,b,c,d;/*定义 a,b,c,d 为整型变量*/a=105;b=75;c=85;d=(a+b+c)/3;primf(d=%dn”,d);/*显示”d=某数”并换行,某数是d 的值*/getchar。;/*等待用户,按任意键退出*/return 0;)2.功能:由键盘输入多边形的边数,求其内角和。程序如下:#include void main()(/*辨别多边形是否成立,不成立重新执行do-while语句间的命令*/do(int x;printf
2、(nn=n);scanf(n%dn,&x);/*由键盘输入x 的值*/printf(dn”,(x 2)*180);/*显示内角和,公式为(x-2)*1807/*辨别多边形是否成立,不成立显示“Error”,成立显示“Right”*/if(x=2)printfCErrorNn*);elseprintf(Rightn);)while(x=2);/*do-while 语句*/getchar();return 0;)3,功能:由键盘输入两个数,显示器上显示较大数。程序如#include int big(intjnt);/*创建整型变量函数big*/void main()(int x,y;scanf(%
3、d,%d,&x,&y);printf(big is%dn,big(x,y);/*输出big函数的值,因为main函数与用户自定义函数big无关系,所以printf后的输出项表是 big(x,y),而不是 big(n1,n2)7getchar();return 0;)int big(int n1,int n2)/*用户自定义函数 big*/(if(n1n2)return n1;/*返回 n1 值*/elsereturn n2;/*返回 n2 值*/)4.功能:由键盘输入一个等腰三角形的层数,画一个这样的三角形。程序如下:#include void main()(intij.n;printf(n:
4、);scanf(%d,&n);for(i=1;i=n;i+)/*循环n 次,每 次 输 出 一 行*/(for(j=1;j=n-i;j+)/*输出该行前面的空格*/printf();for(j=1;j=2*i-1;j+)/*输出该行中的星号*/printf(*);printf(n);)getchar();return 0;)注释:不能输入太多的行数,如10000。5.功能:由键盘输入一个最大值,求 2 到这个最大值中的所有质数(素数)。程序如下:#include#include /*数学文件*/void main()(int n,m,flag,i,j,num=1;printf(n:);scan
5、f(%d,&n);printf(2-%d:n,n);for(i=2;i=n;i+)/*循环查找质数*/(flag=1;m=(int)sqrt(i);for(j=2;j=m;j+)if(i%j=0)/*条件为真时表示不是质数,退出for循环*/(flag=0;break;)if(flag=1)/*条件为真时表示i 是质数*/(printf(%4d,i);if(num+%10=0)/*每行最多输出10个数*/printf(n);)printf(n);getchar();return 0;)6.功能:显示保护屏幕。程序如下:#include /*综合库*/#include /*绘图库*/int ma
6、in()int gdriver=DETECT;/*定义图象驱动器为 DETECT*/int gmode=DETECT;/*定义图象模式为 DETECT*/long n;/*定义长型变量n7initgraph(&gd river,&gmode,E:TCbgi);/*进入图象状态(警告:之间的是图象驱动器的路径,建议网友们设置为空,即只有叱或设为编程系统的路径,例路径是C:TC,那么就是输入C:TCbgi)7sleep。);/*暂停一秒,以保证无误差进入图象状态*/for(n=1;n=40000000;n+)/*画 40000000 个圆7(setcolor(rand();/*作图颜色随机*/ci
7、rcle(random(639),random(639),25);/*画圆,位置随机,半径为 25*/)getchar();return 0;)一段有趣的C程序最近在一个论坛发现了一段简单的C程序很有意思,其中蕴含着不少技巧,在此与大家分享一下。原程序如下:S i n c l u d e m a i n ()c h a r*x=*b#*0 0 0*#*2*0*#_.*5.*-#-.*54.#*2*6#*0 0*0.#”;w h i l e(_=*x/4)-=8,p r i n t f(n%*s +!,+,/+*x+%4*2);表面看起来很奇怪的代码,我把它放到VC+6下面编译,发现不能通过,提
8、 示 .”未声明,对以上代码稍加修改,如下:Si n c l u d e m a i n (i n t _)c h a r*x=/,*b#*000*I#*2*0*#-.*5.*-#-.*54.#*2*6#*00*0.w h i l e(_=*x/4)_-=8,p r i n t f(n%*s +!,+,/+*x+%4*2):)细心的人已经看出来了,就是在m a i n 函数的参数“.”前面加上了变量的类型:i n t。此时,以上代码在VC6中就能够正常的编译和连接了。运行的结果如下:是用 _/”组成的单词“k n o c k e r”。下面我们来分析这个小小的程序,不过为了看起来直观,我把这个
9、程序稍加改动:Si n c l u d e m a i n(i n t _)c h a r*x=*b#*000*I#*2*0*#-*5*一#一.*54.#*2*6#*00*0.#;w h i l e(_=*x/4)_-=8;p r i n t f(n%*s +!,+,/+*x+%4*2);首先来看看m a i n 函数参数,这个参数的名称比较奇怪 _,我们看着有些不习惯,但它确实是合法的变量名称。另外,本来我们常见的m a i n 函数一般都不带参数,如果有参数是因为程序希望处理命令行格式下运行这个程序所需要的参数,一般是这样的:m a i n (i n t a r g c,c h a r *
10、a r g v),第一 个参数a r g c表示参数表中参数的个数,a r g c 是一个c h a r 型二维数组,保存着参数字符串。举个例子,如果我们在命令行下输入命令:d i r -s c:此时,a r g c 的值为3(包括命令本身),a r g v 此 指向字符串:d i r,a r g l 指向字符串:-s,a r g 2 指向字符串c:。那么既然m a i n 函数的参数通常要不没有,要不就是两个,而这个程序只有一个,这样做是否合法呢?答案是肯定的!我 在 关于C 语言中的变量中提到过,函数中的参数是保存在堆栈中的,所以这就涉及到一个谁来平衡堆栈的问题,是调用者还是被调用者。在使
11、用 VC6编译器的时候,如果函数没有特别的声明,默认是调用者清理堆栈。换句话说,运行时库(r u n t i m e)调用m ai n 函数的时候,只传递一个参数给m ai n 函数,这一点它自己是知道的,当m ai n 函数调用结束以后,它在平衡堆栈的时候,只清除掉一个函数,因此不会出现任何问题。我们接着往下看,下面定义了一个c h ar 型指针变量x,指向一个字符串。接下来是w h i l e 语句,w h 下来_=(*x)/4),但表达式_=(*x)/4 的值不为0的时候就执行w h i l e 的循环体,然而表达式_=(*x)/4 是一个赋值语句,它的值又是多少呢?在这种情况下,通常赋
12、值号右面的表达式的值就是整个表达式的值。第一次执行这个语句的时候,x 指向字符,对应的值为4 2,以此类推,当x=0 时,也就是字符串结束的时候,循环结束。接下来在原来的程序中是:=8,printf(n%*s +”_/_/_/+*x+%4*2);这里的逗号作用有些类似分号,但是逗号两侧组成的是一条语句,而分号则是两条语句。我们仔细看printf这条语句,它的格式字符串为:”n%*s,其中期s很少见,很多人不知道这是什么格式,不过我们可以在MSDN中找到这样的描述:If the width specification is an asterisk(*),an int argumentfrom t
13、he argument list supplies the value.The width argument mustprecede the value being formatted in the argument list.意思是说如果宽度用星号(*)来指定,则应该在参数列表中提供一个int型参数作为宽度的值。这样就清楚了,原来这个printf语句是用表达式_+_ 来控制字符串“外*s”的宽度,也就是替换其中的(*)。在仔细一看,原来格式字符串还没有完!完整的应该是:n*s+!_。这就奇怪了,字符串怎么和!_ 相加呢?其实也不奇怪,在这里!一是对变量一作了两 次“非”的操作,结果应该是。或
14、 1。要明确的是,字符串作为参数传递给函数的时候,只是把字符串的首地址传递给了函数,所以字符串 n96*s的首地址就是字符n的地址,当这个地址加1 的时候,传递给printf函数的格式字符串就变成了组*s,所以这个+!一的奥妙就在于控制换行!是不是很有创后!当然了,下面的代码同样有创意,就是printf语句要打印的字符串参数:_/_/_/+*x+/4*2。经过刚才的分析,我 们 不 难 理 解 加 上 后 面 的 表 达式的用意了,同样是控制输出字符的个数,是一个“_/,两个,还是三个。那么关键就是后面这个表达式了:*x+%4*2。其实慢慢的分析也不困难,先执行*x%4*2,然后执行x+。所以
15、,当在执行while语句的时候,x 会指向下一个字符!综上所述,这个小程序就是利用一个字符串来控制输出的例子,里面运用了很多技巧,对于初学者需要很好的理解,对今后的编程是很有帮助的!#include int main()(const short int c1=49920;const int c2=1073742008;int(*pf)()=(int(*)()&c2;printf(%c%cn,*(char*)pf()-19,*(char*)pf()+1)-49);return 0;)运行这个程序,屏幕上会出现一个:)很多人不懂其中的道理,在这里我给大家分析下代码。先看这两句:const shor
16、t int d =49920;const int c2=1073742008;定义了两个局部变量,数值转换成16进制为:const short int c1=0 xc300;const int c2=0 x400000b8;其中变量C1的地址为:0X0012FF7C,占两个字节,C2的地址为:0 x0012FF78,占四个字节。这两个变量占据了连续的空间。变量赋值后,从0 x12ff78开始的内存单元存储的字节码为:B8 00 00 40 00 C3 o对应的汇编码是:moveax,4OOOOOhret接下来的这句:in t(*p f)()=(int(*)()&c2;分析如下:定义了一个函数指
17、针,参数为N U L L,返回值为in t类型。这个函数指针,指向上面的汇编码。这样,后面执行p f(),就执行了这段汇编码。继续分析下面这句代码:printf(%c%cn,*(char*)pf()-19,*(char*)p f()+1)-49);先看*(char*)pf()-19这个表达式,执行了 了 p f指向的汇编代码,从汇编代码看,这个函数调用后的返回值是0 x400000,p f()前面的char*是把函数的返回值转换成一个char*型指针,这个指针指向0 x 4 0 0 0 0 0,前面再加个*号,表示取0 x400000地址的内容,由于是c h a r*型指针,因此从这个地址取一
18、个字节。*(c h a r*)p f()-1 9表示的是从0 x400000取出的字节内容再减去19。接下来:*(char*)pf()+1)-49代表的意思是从0 x400000+1的地址取出一个字节内容在减去49。熟悉PE文件结构的朋友一定知道,对于exe文件0 x400000是内存加载的基地址。也就是说,0 x400000字节的内容对应的是0 x4D,0 x400001字节的内容对应的是0 x5A.这是我们常说的p e文件起始的两个字节JMZ这样,表达式*(char*)pf()-19的结果是0 x3A,表达式*(char*)pf()+1)-49的结果是0 x29察看ascii码表,输出就是
19、我们看到的样子。总结:别看一个这么小的程序,但是其中涉及的知识面比较广不过在F8我用gcc编译通过,运行的时候出现的提示是:Segmentation fault原因我认为是编译器的ASCII不兼容,是吗?一个有趣的C程序关键词:C程序最近总做些无聊的事,迷迷糊糊。在论坛上看到一个有趣的C程序,有点意思,写下来。main(_)for(putchar(_+J!MpwfIZpv 1-1););输出的是:I Love You可以写成如下形式:#include main(int argc)(int i;char*s=J!Mpwf!Zpv1;for(i=O;putchar(si-1);i+)或者用指针形式
20、:main()(int i;char*s=J!Mpwf!Zpv1;while(putchar(*s-1)s+;return 0;)解释:一是变量名,c语言默认类型为intmain(int argc)(for(-argc;putchar(argc+J!Mpwf!Zpv)J)main(int argc)(for(-argc;putchar(argcJ!Mpwf!Zpv 1-1);argc+)J)程序执行时,不带参数,argc=1,所以main()int i;for(i=O;putchar(iJ!Mpwf!Zpv1-1);i+)J)main()(int i;char*s=J!Mpwf!Zpv1;fo
21、r(i=0;putchar(is-1);i+)一个用数组和下标实现的表达式可以等价地用指针和偏移量实现。即,如果pa是一个指针,则pai和*(pa+i)的含义一样。is=*(i+s)=*(s+i)=simain()(int i;char*s=J!Mpwf!Zpv1;for(i=0;putchar(si-1);i+)J)下面的这一段程序是我见过的最有趣的程序之一,如果和你编译运行的话,他能过计算p i的前800位数值。到现在还没有见过多懂这个这段程序的人#intclude stdio.hInt a=10000,b,c=2800,de,e f28001,g;Main()(F(;b-c;)Fb+=a
22、/5;For(;d=0,g=c*2;c-=14,printf(“.4d”,e+d/a),e=d%a)For(b=c;d+=fb*a,fb=d%-g,d/=g-,-b;d*=b);)而结果是这样的:3141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964
23、4288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861 1 7381 93261 1 7931 051 1854807446237996274956735188575272489122793818301
24、194912983367336244065664308602139494639522473719070217986094370277053921717629317675238467481846766940513200056812714526356082778577134275778960917363717872146844090122495343014654958537105079227968925892354201995611212902196086403441815981362977477130996051870721134999999837297804995105973173281609
25、63185#include main(int k)float i,j,r,x,y=-16;while(puts(H,),y+15)for(x=0;x+)I&IH%*#,fk&15)for(i=k=r=O;j=r*r-i*i-2+x/25,i=2*r*i+y/10,j*j+i*i 11&k+111;r=j);return 0;)#i n cl u d e i n t m a i n()i n t j,k,i;d o co u t z,I n p u t t h e w i d e:;ci n i;i f(i 2 0)co u t 2 0);f o r(j=l;j=i;j+)i f(j=l|j=i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 有趣 好玩 程序设计 cc
限制150内