c语言趣味题.docx
《c语言趣味题.docx》由会员分享,可在线阅读,更多相关《c语言趣味题.docx(15页珍藏版)》请在冰豆网上搜索。
c语言趣味题
一、九九乘法表
1*1=1
1*2=22*2=4
1*3=32*3=63*3=9
1*4=42*4=83*4=124*4=16
1*5=52*5=103*5=154*5=205*5=25
1*6=62*6=123*6=184*6=245*6=306*6=36
1*7=72*7=143*7=214*7=285*7=356*7=427*7=49
1*8=82*8=163*8=244*8=325*8=406*8=487*8=568*8=64
1*9=92*9=183*9=274*9=365*9=456*9=547*9=638*9=729*9=81
分析:
①这需要编写一个循环结构的程序。
②需要循环嵌套。
外循环控制打印第几行,内循环控制打印某一行的若干个等式。
程序如下:
main()
{intm,n;
for(m=1;m<=9;m++)
{for(n=1;n<=m;n++)
printf("%1d*%1d=%-4d",m,n,m*n);
printf("\n");
}
}
请思考:
请你用别的编程方法再解此题。
二、说谎
有甲、乙、丙三人,每人或者说真话,或者说假话。
甲说:
“乙说假话。
”
乙说:
“甲和丙是同一种人。
”
问甲、乙、丙三人谁说真话,谁说假话?
分析:
①本题看似漫无边际,无法入手,不知道怎么与C语言程序设计挂钩。
但只要和“真”、“假”、逻辑表达式联系起来,脉络就清晰起来。
②这里用整型变量a、b、c表示甲、乙、丙三人说话的真假,当变量值为1时表示此人说真话,变量值为0时表示此人说假话。
甲说:
“乙说假话。
”这有两种可能:
甲说的是真话,而乙确实说假话,即:
a==1&&b==0等价于a&&!
b
或者甲说的是假话,而乙说真话,即:
a==0&&b==1等价于!
a&&b
由此可得逻辑表达式:
a&&!
b||!
a&&b
乙说:
“甲和丙是同一种人。
”这有两种可能:
乙说真话,而甲和丙确是同一种人,即:
b==1&&a==c等价于b&&a==c
或者乙说的是假话,而甲和丙不是同一种人,即:
b==0&&a!
=c等价于!
b&&a!
=c
由此可得逻辑表达式:
b&&a==c||!
b&&a!
=c
上述两个逻辑表达式是“与”的关系(因为该满足的条件都要满足,所以是“与”的关系),最终得到确定谁说真话的逻辑表达式 (a&&!
b||!
a&&b)&&(b&&a==c||!
b&&a!
=c)
③穷举每个人说真话或说假话的各种情况,用上述表达式测试,使上述表达式的值为1(真)的情况就是正确的结果。
程序如下:
main()
{
inta,b,c;
for(a=0;a<=1;a++)
for(b=0;b<=1;b++)
for(c=0;c<=1;c++)
{if((a&&!
b||!
a&&b)&&(b&&a==c||!
b&&a!
=c))
printf("a=%d,b=%d,c=%d\n",a,b,c);
}
}
运行结果为:
a=0,b=1,c=0
a=1,b=0,c=0
请思考:
如果题目中加入“丙说:
‘甲说假话。
’”,则程序如何编写?
运行结果又是什么?
三、兔子繁殖问题
求Fibonacci数列:
1,1,2,3,5,8,13,…的前40项。
本题来自于一个有趣的古典数学问题:
有一对兔子,从出生后的第3个月起每个月都生一对兔子。
小兔子长到第3个月又生一对兔子。
如果生下的所有兔子都能成活,且所有的兔子都不会因年龄大而老死,问每个月的兔子总数为多少?
分析:
①此数列的规律是第1、2项都是1,从第3项开始,都是其前两项之和,并且有固定循环次数,因此可以用for循环实现。
②这里用到的是什么算法呢?
是迭代算法。
迭代算法的基本思想是:
不断地用新值取代变量的旧值,或由旧值递推出变量的新值。
程序如下:
main()
{
longintf1,f2;
inti;
f1=1;f2=1;
for(i=1;i<=20;i++)
{
printf("%12ld%12ld",f1,f2);/*每次输出两项*/
if(i%2==0)printf("\n");
f1=f1+f2;
f2=f2+f1;/*求出两项*/
}
}
四、百钱与百鸡
我国古代数学家张丘建在《算经》中提出了著名的“百钱百鸡问题”:
“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何?
”意思是说:
一只公鸡卖5枚钱,一只母鸡卖3枚钱,三只小鸡卖1枚钱,用100枚钱买100只鸡,能买到公鸡、母鸡、小鸡各多少只?
分析:
①这是一个不定方程问题。
有3个未知数,2个方程:
设公鸡、母鸡、小鸡数分别为i、j、k,则有i+j+k=100,i*5+j*3+k/3=100。
需要让计算机去一一测试是否符合条件,找出所有可能的答案。
由于价格的限制,如果只是一种鸡,则公鸡最多为19只(由于共100只鸡的限制,不能等于20只),母鸡最多33只,小鸡最多99只。
②这里用到的是穷举算法。
穷举算法的基本思想是:
对问题的所有可能答案一一测试,直到找到正确答案或测试完全部可能的答案。
程序如下:
main()
{
inti,j,k;
for(i=1;i<=19;i++)
for(j=1;j<=33;j++)
for(k=3;k<=99;k=k+3)
{if((i+j+k==100)&&(i*5+j*3+k/3==100))
printf("i=%d,j=%d,k=%d\n",i,j,k);
}
}
运行结果为:
i=4,j=18,k=78
i=8,j=11,k=81
i=12,j=4,k=84
请思考:
还有没有别的编程方法?
五、该程序在TC3.0环境下编译通过,共有9个函数。
分别是printScreen,start,leave,levelChoice,newWord,moving,wordHit,result和main。
其功能分别是:
printScreen:
刷新屏幕输出的图像。
Start:
用户进入程序时选择开始,退出和求助。
Leave:
用户离开程序事提示感谢使用
levelChoice:
用户开始之前选择等级
newWord:
生成一个新的字母并将其置于首行。
moving:
将屏幕上的所有字母向下移动一行
wordHit:
判断用户是否输入字母,如果输入,且屏幕上有该字母则将该字母所在位置置空。
result:
判断该用户的得分,提示其是否进入下一等级。
main:
总体控制以上各函数,判断其是否运行。
压缩包下载:
打字游戏
-------------------------------------------------------------以下是程序源码----------------------------------------------------
#include"stdio.h"
#include"time.h"
#include"stdlib.h"
#include"conio.h"
#include"dos.h"
#definexLine70
#defineyLine20
#definefull100
#definetrue1
#definefalse0
/*---------------------------------------------------------------------*/
voidprintScreen(intlevel,intright,intsum,charp[yLine][xLine])/*刷新屏幕的输出图像*/
{
inti,j;
clrscr();
printf("level:
%d Press0toexit;1topause score:
%d/%d\n",level,right,sum);/*输出现在的等级,击中数和现在已下落总数*/
printf("----------------------------------------------------------------------\n");
for(i=0;i {
for(j=0;j printf("%c",p[i][j]);
printf("\n");
}/*for(i)*/
printf("----------------------------------------------------------------------\n");
}/*printScreen*/
/*---------------------------------------------------------------------*/
voidleave()/*离开程序时,调用该函数结束程序。
*/
{
clrscr();
printf("\n\n\n\nThankyouforplaying.");
delay(2500);
exit(0);
}
/*----------------------------------------------------------------------*/
intlevelChoice(intlevel)/*进入游戏时选择游戏等级*/
{
while(true)/*void*/
{
clrscr();
printf("pleaseinput1-9tochoicelevel.choice0toreturn.\n");
level=getch();
level=level-48;
if(level>0&&level<10)return(level);
elseif(level==0)
leave();
else
printf("Pleaseinputacorrectnumber!
\n");
}/*while(true)*/
}/*levelChoice*/
/*---------------------------------------------------------------------*/
intnewWord(intsum,charp[yLine][xLine])/*随生成一个新的字符并将其加入数组的首行*/
{
intj,w;
if(sum!
=full)
{
j=(rand()%(xLine-2))+1;
w=(rand()%26)+65;
p[0][j]=w;
return(++sum);
}/*if*/
return(sum);
}/*newWord*/
/*---------------------------------------------------------------------*/
intmoving(intmiss,charp[yLine][xLine])/*将最后一行置空,并使所有在数组中其他行的字符下降一行*/
{
inti,j;
charw;
for(j=1,i=yLine-1;j {
if(p[i][j]!
='')
{
miss++;
p[i][j]='';
}
}
for(i=yLine-2;i>=0;i--)/*从倒数第二行的最后一个字符开始开始向前遍历该数组内的元素,如果该位置非空则将该字符移动至下一行*/
{
for(j=xLine-2;j>0;j--)
{
if(p[i][j]!
='')
{
w=p[i][j];
p[i][j]='';
p[i+1][j]=w;
}/*if*/
}/*for(j)*/
}/*for(i)*/
return(miss);
}/*moving*/
/*---------------------------------------------------------------------*/
intwordHit(charp[yLine][xLine])
/*判断是否有字符从键盘键入。
如果有,则从最后一行的最后一个元素开始遍历该数组,找出该字符,并把对应位置置空,且返回1。
如果有输入,但屏幕上无对应项,或无输入则返回0*/
{
inti,j;
charkey;
if(kbhit())/*判断用户是否从键盘键入字符。
如果kbhit返回值为*/
key=getch();
if(key)
{
if(key=='0')leave();
if(key=='1')
{
clrscr();
printf("Pressanykeytocontinue.");
getch();
}
for(i=yLine;i>0;i--)
{
for(j=xLine;j>0;j--)
{
if(key-32==p[i-1][j-1])
{
p[i-1][j-1]='';
return(true);
}/*if*/
}/*for(j)*/
}/*for(i)*/
sound(300);
}/*if(key)*/
return(false);
}/*wordHit*/
/*---------------------------------------------------------------------*/
intresult(intright)
/*判断该次的成绩并输出对应的结果,询问用户是否继续,若继续,判断是否可以进入下一级别。
*/
{
intscore;
charyn;
score=right*100/full;
nosound();
clrscr();
if(score==100)
printf("perfect!
\n");
elseif(score>=85)
printf("good!
\n");
elseif(score>=70)
printf("That'sOK!
\n");
else
printf("youneedtoplayagain.\n");
printf("doyouwanttocontinue?
Y/N\n");
for(;;)/*void*/
{
yn=getch();
switch(yn)
{
case'y':
{
if(score>=70) return(true);
else return(false);
}/*case*/
case'n':
leave();
default:
printf("Pleaseinputacorrectchoice:
");
}/*switch*/
}/*for*/
}/*result*/
/*---------------------------------------------------------------------*/
intstart()/*进入程序时调用该函数,提示其操作。
*/
{
charc;
while(true)
{
clrscr();
printf("\n\n\n\n\n Welcometotypegame!
\n\n\n 1.start\n 2.Howtoplay\n 0.Exit");
c=getch();
switch(c)
{
case'0':
leave();/*用户选择退出,退出主程序*/
case'2':
{
clrscr();
printf("\n\n\n\n\n Hitthetypewhenyouseeitonthescreen.\n Press0toexit.\n Press1topause\n 1.start\n 0.exit");
while(true)
{
c=getch();
if(c=='0')leave();
if(c=='1')return(true);
}
}
case'1':
return(true);
}
}
}
/*----------------------------------------------------------------------*/
voidmain()
{
/*---------------------------------------------------------------------*/
/*函数声明*/
voidprintScreen(intlevel,intright,intsum,charp[yLine][xLine]);
voidleave();
intlevelChoice(intlevel);
intnewWord(intsum,charp[yLine][xLine]);
intmoving(intmiss,charp[yLine][xLine]);
intwordHit(charp[yLine][xLine]);
intresult(intright);
intstart();
/*---------------------------------------------------------------------*/
charp[yLine][xLine];
inti,j,level,right,sum,n,m,miss;
srand(time(NULL));
start();
for(i=0;i {
for(j=0;j if(j==0||j==xLine-1)
p[i][j]=140;
else
p[i][j]='';
}/*for(i)*/
level=levelChoice(level);
for(;;)/*开始运行主程序*/
{ sum=0;
right=0;
miss=0;